dynamicweb/static/cms/js/modules/cms.base.js

242 lines
6.6 KiB
JavaScript
Raw Normal View History

/*##################################################|*/
/* #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.$);