242 lines
6.6 KiB
JavaScript
242 lines
6.6 KiB
JavaScript
|
/*##################################################|*/
|
||
|
/* #CMS# */
|
||
|
|
||
|
// ensuring django namespace is set correctly
|
||
|
window.django = window.django || undefined;
|
||
|
|
||
|
// ensuring jQuery namespace is set correctly
|
||
|
window.jQuery = (django && django.jQuery) ? django.jQuery : window.jQuery || undefined;
|
||
|
|
||
|
// ensuring Class namespace is set correctly
|
||
|
window.Class = window.Class || undefined;
|
||
|
|
||
|
// ensuring CMS namespace is set correctly
|
||
|
var CMS = {
|
||
|
'$': (typeof jQuery === 'function') ? jQuery : undefined,
|
||
|
'Class': (typeof Class === 'function') ? Class : undefined,
|
||
|
'API': {}
|
||
|
};
|
||
|
|
||
|
/*##################################################|*/
|
||
|
/* #CMS.API# */
|
||
|
(function($) {
|
||
|
// CMS.$ will be passed for $
|
||
|
$(document).ready(function () {
|
||
|
/*!
|
||
|
* CNS.API.Helpers
|
||
|
* Multiple helpers used accross all CMS features
|
||
|
*/
|
||
|
CMS.API.Helpers = {
|
||
|
|
||
|
// redirects to a specific url or reloads browser
|
||
|
reloadBrowser: function (url, timeout, ajax) {
|
||
|
var that = this;
|
||
|
// is there a parent window?
|
||
|
var parent = (window.parent) ? window.parent : window;
|
||
|
|
||
|
// if there is an ajax reload, prioritize
|
||
|
if(ajax) {
|
||
|
parent.CMS.API.locked = true;
|
||
|
// check if the url has changed, if true redirect to the new path
|
||
|
// this requires an ajax request
|
||
|
$.ajax({
|
||
|
'async': false,
|
||
|
'type': 'GET',
|
||
|
'url': parent.CMS.config.request.url,
|
||
|
'data': {
|
||
|
'model': parent.CMS.config.request.model,
|
||
|
'pk': parent.CMS.config.request.pk
|
||
|
},
|
||
|
'success': function (response) {
|
||
|
parent.CMS.API.locked = false;
|
||
|
|
||
|
if(response === '' && !url) {
|
||
|
// cancel if response is empty
|
||
|
return false;
|
||
|
} else if(parent.location.pathname !== response) {
|
||
|
// api call to the backend to check if the current path is still the same
|
||
|
that.reloadBrowser(response);
|
||
|
} else if(url === 'REFRESH_PAGE') {
|
||
|
// if on_close provides REFRESH_PAGE, only do a reload
|
||
|
that.reloadBrowser();
|
||
|
} else if(url) {
|
||
|
// on_close can also provide a url, reload to the new destination
|
||
|
that.reloadBrowser(url);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// cancel further operations
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// add timeout if provided
|
||
|
parent.setTimeout(function () {
|
||
|
if (url && url != parent.location.href) {
|
||
|
// location.reload() takes precedence over this, so we
|
||
|
// don't want to reload the page if we need a redirect
|
||
|
parent.location.href = url;
|
||
|
}
|
||
|
else {
|
||
|
// ensure page is always reloaded #3413
|
||
|
parent.location.reload()
|
||
|
}
|
||
|
}, timeout || 0);
|
||
|
},
|
||
|
|
||
|
// disable multiple form submissions
|
||
|
preventSubmit: function () {
|
||
|
var forms = $('#cms_toolbar').find('form');
|
||
|
forms.submit(function () {
|
||
|
// show loader
|
||
|
CMS.API.Toolbar._loader(true);
|
||
|
// we cannot use disabled as the name action will be ignored
|
||
|
$('input[type="submit"]').bind('click', function (e) {
|
||
|
e.preventDefault();
|
||
|
}).css('opacity', 0.5);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
// fixes csrf behaviour
|
||
|
csrf: function (csrf_token) {
|
||
|
$.ajaxSetup({
|
||
|
beforeSend: function (xhr) {
|
||
|
// set csrf_token
|
||
|
xhr.setRequestHeader("X-CSRFToken", csrf_token);
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
|
||
|
// handles the tooltip for the plugins
|
||
|
showTooltip: function (name, id) {
|
||
|
var tooltip = $('.cms_tooltip');
|
||
|
|
||
|
// change css and attributes
|
||
|
tooltip.css('visibility', 'visible')
|
||
|
.data('plugin_id', id || null)
|
||
|
.show()
|
||
|
.find('span').html(name);
|
||
|
|
||
|
// attaches move event
|
||
|
// this sets the correct position for the edit tooltip
|
||
|
$('body').bind('mousemove.cms', function (e) {
|
||
|
// so lets figure out where we are
|
||
|
var offset = 20;
|
||
|
var relX = e.pageX - $(tooltip).offsetParent().offset().left;
|
||
|
var relY = e.pageY - $(tooltip).offsetParent().offset().top;
|
||
|
var bound = $(tooltip).offsetParent().width();
|
||
|
var pos = relX + tooltip.outerWidth(true) + offset;
|
||
|
|
||
|
tooltip.css({
|
||
|
'left': (pos >= bound) ? relX - tooltip.outerWidth(true) - offset : relX + offset,
|
||
|
'top': relY - 12
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// attach tooltip event for touch devices
|
||
|
tooltip.bind('touchstart.cms', function () {
|
||
|
$('.cms_plugin-' + $(this).data('plugin_id')).trigger('dblclick');
|
||
|
});
|
||
|
},
|
||
|
|
||
|
hideTooltip: function () {
|
||
|
var tooltip = $('.cms_tooltip');
|
||
|
|
||
|
// change css
|
||
|
tooltip.css('visibility', 'hidden').hide();
|
||
|
|
||
|
// unbind events
|
||
|
$('body').unbind('mousemove.cms');
|
||
|
tooltip.unbind('touchstart.cms');
|
||
|
},
|
||
|
|
||
|
// sends or retrieves a JSON from localStorage or the session if local storage is not available
|
||
|
setSettings: function (settings) {
|
||
|
var that = this;
|
||
|
// merge settings
|
||
|
settings = JSON.stringify($.extend({}, CMS.config.settings, settings));
|
||
|
// set loader
|
||
|
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(true);
|
||
|
|
||
|
// use local storage or session
|
||
|
if(window.localStorage) {
|
||
|
// save within local storage
|
||
|
localStorage.setItem('cms_cookie', settings);
|
||
|
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(false);
|
||
|
} else {
|
||
|
// save within session
|
||
|
CMS.API.locked = true;
|
||
|
|
||
|
$.ajax({
|
||
|
'async': false,
|
||
|
'type': 'POST',
|
||
|
'url': CMS.config.urls.settings,
|
||
|
'data': {
|
||
|
'csrfmiddlewaretoken': this.config.csrf,
|
||
|
'settings': settings
|
||
|
},
|
||
|
'success': function (data) {
|
||
|
CMS.API.locked = false;
|
||
|
// determine if logged in or not
|
||
|
settings = (data) ? JSON.parse(data) : CMS.config.settings;
|
||
|
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(false);
|
||
|
},
|
||
|
'error': function (jqXHR) {
|
||
|
that.showError(jqXHR.response + ' | ' + jqXHR.status + ' ' + jqXHR.statusText);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// save settings
|
||
|
CMS.settings = JSON.parse(settings);
|
||
|
|
||
|
// ensure new settings are returned
|
||
|
return CMS.settings;
|
||
|
},
|
||
|
|
||
|
getSettings: function () {
|
||
|
var that = this;
|
||
|
var settings;
|
||
|
// set loader
|
||
|
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(true);
|
||
|
|
||
|
// use local storage or session
|
||
|
if(window.localStorage) {
|
||
|
// get from local storage
|
||
|
settings = JSON.parse(localStorage.getItem('cms_cookie'));
|
||
|
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(false);
|
||
|
} else {
|
||
|
CMS.API.locked = true;
|
||
|
// get from session
|
||
|
$.ajax({
|
||
|
'async': false,
|
||
|
'type': 'GET',
|
||
|
'url': CMS.config.urls.settings,
|
||
|
'success': function (data) {
|
||
|
CMS.API.locked = false;
|
||
|
// determine if logged in or not
|
||
|
settings = (data) ? JSON.parse(data) : CMS.config.settings;
|
||
|
if(CMS.API.Toolbar) CMS.API.Toolbar._loader(false);
|
||
|
},
|
||
|
'error': function (jqXHR) {
|
||
|
that.showError(jqXHR.response + ' | ' + jqXHR.status + ' ' + jqXHR.statusText);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if(settings === null) settings = this.setSettings(CMS.config.settings);
|
||
|
|
||
|
// save settings
|
||
|
CMS.settings = settings;
|
||
|
|
||
|
// ensure new settings are returned
|
||
|
return CMS.settings;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
// autoinits
|
||
|
CMS.API.Helpers.preventSubmit();
|
||
|
|
||
|
});
|
||
|
})(CMS.$);
|