mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
f4037fe319
* Swap out .Actions class for bootstrap .btn-toolbar * Converted all south toolbars to use new toolbar component styles, content and preview styles for scrollbars adjusted where required
1142 lines
35 KiB
JavaScript
1142 lines
35 KiB
JavaScript
(function (global, factory) {
|
|
if (typeof define === "function" && define.amd) {
|
|
define('ss.LeftAndMain', ['jQuery', 'lib/Router', 'lib/Config'], factory);
|
|
} else if (typeof exports !== "undefined") {
|
|
factory(require('jQuery'), require('lib/Router'), require('lib/Config'));
|
|
} else {
|
|
var mod = {
|
|
exports: {}
|
|
};
|
|
factory(global.jQuery, global.Router, global.Config);
|
|
global.ssLeftAndMain = mod.exports;
|
|
}
|
|
})(this, function (_jQuery, _Router, _Config) {
|
|
'use strict';
|
|
|
|
var _jQuery2 = _interopRequireDefault(_jQuery);
|
|
|
|
var _Router2 = _interopRequireDefault(_Router);
|
|
|
|
var _Config2 = _interopRequireDefault(_Config);
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : {
|
|
default: obj
|
|
};
|
|
}
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
|
|
return typeof obj;
|
|
} : function (obj) {
|
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
};
|
|
|
|
var windowWidth, windowHeight;
|
|
|
|
_jQuery2.default.noConflict();
|
|
|
|
window.ss = window.ss || {};
|
|
window.ss.router = _Router2.default;
|
|
|
|
window.ss.debounce = function (func, wait, immediate) {
|
|
var timeout, context, args;
|
|
|
|
var later = function later() {
|
|
timeout = null;
|
|
if (!immediate) func.apply(context, args);
|
|
};
|
|
|
|
return function () {
|
|
var callNow = immediate && !timeout;
|
|
|
|
context = this;
|
|
args = arguments;
|
|
|
|
clearTimeout(timeout);
|
|
timeout = setTimeout(later, wait);
|
|
|
|
if (callNow) {
|
|
func.apply(context, args);
|
|
}
|
|
};
|
|
};
|
|
|
|
function getUrlPath(url) {
|
|
var anchor = document.createElement('a');
|
|
anchor.href = url;
|
|
|
|
return anchor.pathname;
|
|
}
|
|
|
|
(0, _jQuery2.default)(window).bind('resize.leftandmain', function (e) {
|
|
(0, _jQuery2.default)('.cms-container').trigger('windowresize');
|
|
});
|
|
|
|
_jQuery2.default.entwine.warningLevel = _jQuery2.default.entwine.WARN_LEVEL_BESTPRACTISE;
|
|
|
|
_jQuery2.default.entwine('ss', function ($) {
|
|
$(window).on("message", function (e) {
|
|
var target,
|
|
event = e.originalEvent,
|
|
data = _typeof(event.data) === 'object' ? event.data : JSON.parse(event.data);
|
|
|
|
if ($.path.parseUrl(window.location.href).domain !== $.path.parseUrl(event.origin).domain) return;
|
|
|
|
target = typeof data.target === 'undefined' ? $(window) : $(data.target);
|
|
|
|
switch (data.type) {
|
|
case 'event':
|
|
target.trigger(data.event, data.data);
|
|
break;
|
|
case 'callback':
|
|
target[data.callback].call(target, data.data);
|
|
break;
|
|
}
|
|
});
|
|
|
|
var positionLoadingSpinner = function positionLoadingSpinner() {
|
|
var offset = 120;
|
|
var spinner = $('.ss-loading-screen .loading-animation');
|
|
var top = ($(window).height() - spinner.height()) / 2;
|
|
spinner.css('top', top + offset);
|
|
spinner.show();
|
|
};
|
|
|
|
var applyChosen = function applyChosen(el) {
|
|
if (el.is(':visible')) {
|
|
el.addClass('has-chosen').chosen({
|
|
allow_single_deselect: true,
|
|
disable_search_threshold: 20,
|
|
display_disabled_options: true
|
|
});
|
|
} else {
|
|
setTimeout(function () {
|
|
el.show();
|
|
applyChosen(el);
|
|
}, 500);
|
|
}
|
|
};
|
|
|
|
var isSameUrl = function isSameUrl(url1, url2) {
|
|
var baseUrl = $('base').attr('href');
|
|
url1 = $.path.isAbsoluteUrl(url1) ? url1 : $.path.makeUrlAbsolute(url1, baseUrl), url2 = $.path.isAbsoluteUrl(url2) ? url2 : $.path.makeUrlAbsolute(url2, baseUrl);
|
|
var url1parts = $.path.parseUrl(url1),
|
|
url2parts = $.path.parseUrl(url2);
|
|
return url1parts.pathname.replace(/\/*$/, '') == url2parts.pathname.replace(/\/*$/, '') && url1parts.search == url2parts.search;
|
|
};
|
|
|
|
var ajaxCompleteEvent = window.ss.debounce(function () {
|
|
$(window).trigger('ajaxComplete');
|
|
}, 1000, true);
|
|
|
|
$(window).bind('resize', positionLoadingSpinner).trigger('resize');
|
|
|
|
$(document).ajaxComplete(function (e, xhr, settings) {
|
|
var origUrl,
|
|
url = xhr.getResponseHeader('X-ControllerURL'),
|
|
destUrl = settings.url,
|
|
msg = xhr.getResponseHeader('X-Status') !== null ? xhr.getResponseHeader('X-Status') : xhr.statusText,
|
|
msgType = xhr.status < 200 || xhr.status > 399 ? 'bad' : 'good',
|
|
ignoredMessages = ['OK', 'success'];
|
|
if (window.history.state) {
|
|
origUrl = window.history.state.path;
|
|
} else {
|
|
origUrl = document.URL;
|
|
}
|
|
|
|
if (url !== null && (!isSameUrl(origUrl, url) || !isSameUrl(destUrl, url))) {
|
|
_Router2.default.show(url, {
|
|
id: new Date().getTime() + String(Math.random()).replace(/\D/g, ''),
|
|
pjax: xhr.getResponseHeader('X-Pjax') ? xhr.getResponseHeader('X-Pjax') : settings.headers['X-Pjax']
|
|
});
|
|
}
|
|
|
|
if (xhr.getResponseHeader('X-Reauthenticate')) {
|
|
$('.cms-container').showLoginDialog();
|
|
return;
|
|
}
|
|
|
|
if (xhr.status !== 0 && msg && $.inArray(msg, ignoredMessages) === -1) {
|
|
statusMessage(decodeURIComponent(msg), msgType);
|
|
}
|
|
|
|
ajaxCompleteEvent(this);
|
|
});
|
|
|
|
$('.cms-container').entwine({
|
|
StateChangeXHR: null,
|
|
|
|
FragmentXHR: {},
|
|
|
|
StateChangeCount: 0,
|
|
|
|
LayoutOptions: {
|
|
minContentWidth: 940,
|
|
minPreviewWidth: 400,
|
|
mode: 'content'
|
|
},
|
|
|
|
onadd: function onadd() {
|
|
var self = this,
|
|
basePath = getUrlPath($('base')[0].href);
|
|
|
|
basePath = basePath.replace(/\/$/, '');
|
|
if (basePath.match(/^[^\/]/)) {
|
|
basePath = '/' + basePath;
|
|
}
|
|
_Router2.default.base(basePath);
|
|
|
|
_Config2.default.getTopLevelRoutes().forEach(function (route) {
|
|
(0, _Router2.default)('/' + route + '(/*?)?', function (ctx, next) {
|
|
if (document.readyState !== 'complete') {
|
|
return next();
|
|
}
|
|
|
|
self.handleStateChange(null, ctx.state).done(next);
|
|
});
|
|
});
|
|
|
|
_Router2.default.start();
|
|
|
|
if ($.browser.msie && parseInt($.browser.version, 10) < 8) {
|
|
$('.ss-loading-screen').append('<p class="ss-loading-incompat-warning"><span class="notice">' + 'Your browser is not compatible with the CMS interface. Please use Internet Explorer 8+, Google Chrome or Mozilla Firefox.' + '</span></p>').css('z-index', $('.ss-loading-screen').css('z-index') + 1);
|
|
$('.loading-animation').remove();
|
|
|
|
this._super();
|
|
return;
|
|
}
|
|
|
|
this.redraw();
|
|
|
|
$('.ss-loading-screen').hide();
|
|
$('body').removeClass('loading');
|
|
$(window).unbind('resize', positionLoadingSpinner);
|
|
this.restoreTabState();
|
|
this._super();
|
|
},
|
|
|
|
fromWindow: {
|
|
onstatechange: function onstatechange(event, historyState) {
|
|
this.handleStateChange(event, historyState);
|
|
}
|
|
},
|
|
|
|
'onwindowresize': function onwindowresize() {
|
|
this.redraw();
|
|
},
|
|
|
|
'from .cms-panel': {
|
|
ontoggle: function ontoggle() {
|
|
this.redraw();
|
|
}
|
|
},
|
|
|
|
'from .cms-container': {
|
|
onaftersubmitform: function onaftersubmitform() {
|
|
this.redraw();
|
|
}
|
|
},
|
|
|
|
'from .cms-menu-list li a': {
|
|
onclick: function onclick(e) {
|
|
var href = $(e.target).attr('href');
|
|
if (e.which > 1 || href == this._tabStateUrl()) return;
|
|
this.splitViewMode();
|
|
}
|
|
},
|
|
|
|
updateLayoutOptions: function updateLayoutOptions(newSpec) {
|
|
var spec = this.getLayoutOptions();
|
|
|
|
var dirty = false;
|
|
|
|
for (var k in newSpec) {
|
|
if (spec[k] !== newSpec[k]) {
|
|
spec[k] = newSpec[k];
|
|
dirty = true;
|
|
}
|
|
}
|
|
|
|
if (dirty) this.redraw();
|
|
},
|
|
|
|
splitViewMode: function splitViewMode() {
|
|
this.updateLayoutOptions({
|
|
mode: 'split'
|
|
});
|
|
},
|
|
|
|
contentViewMode: function contentViewMode() {
|
|
this.updateLayoutOptions({
|
|
mode: 'content'
|
|
});
|
|
},
|
|
|
|
previewMode: function previewMode() {
|
|
this.updateLayoutOptions({
|
|
mode: 'preview'
|
|
});
|
|
},
|
|
|
|
RedrawSuppression: false,
|
|
|
|
redraw: function redraw() {
|
|
if (this.getRedrawSuppression()) return;
|
|
|
|
if (window.debug) console.log('redraw', this.attr('class'), this.get(0));
|
|
|
|
this.data('jlayout', jLayout.threeColumnCompressor({
|
|
menu: this.children('.cms-menu'),
|
|
content: this.children('.cms-content'),
|
|
preview: this.children('.cms-preview')
|
|
}, this.getLayoutOptions()));
|
|
|
|
this.layout();
|
|
|
|
this.find('.cms-panel-layout').redraw();
|
|
this.find('.cms-content-fields[data-layout-type]').redraw();
|
|
this.find('.cms-edit-form[data-layout-type]').redraw();
|
|
this.find('.cms-preview').redraw();
|
|
this.find('.cms-content').redraw();
|
|
},
|
|
|
|
checkCanNavigate: function checkCanNavigate(selectors) {
|
|
var contentEls = this._findFragments(selectors || ['Content']),
|
|
trackedEls = contentEls.find(':data(changetracker)').add(contentEls.filter(':data(changetracker)')),
|
|
safe = true;
|
|
|
|
if (!trackedEls.length) {
|
|
return true;
|
|
}
|
|
|
|
trackedEls.each(function () {
|
|
if (!$(this).confirmUnsavedChanges()) {
|
|
safe = false;
|
|
}
|
|
});
|
|
|
|
return safe;
|
|
},
|
|
|
|
loadPanel: function loadPanel(url) {
|
|
var title = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1];
|
|
var data = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
|
|
var forceReload = arguments[3];
|
|
var forceReferer = arguments.length <= 4 || arguments[4] === undefined ? window.history.state.path : arguments[4];
|
|
|
|
if (!this.checkCanNavigate(data.pjax ? data.pjax.split(',') : ['Content'])) {
|
|
return;
|
|
}
|
|
|
|
this.saveTabState();
|
|
|
|
data.__forceReferer = forceReferer;
|
|
|
|
if (forceReload) {
|
|
data.__forceReload = Math.random();
|
|
}
|
|
|
|
_Router2.default.show(url, data);
|
|
},
|
|
|
|
reloadCurrentPanel: function reloadCurrentPanel() {
|
|
this.loadPanel(window.history.state.path, null, null, true);
|
|
},
|
|
|
|
submitForm: function submitForm(form, button, callback, ajaxOptions) {
|
|
var self = this;
|
|
|
|
if (!button) button = this.find('.btn-toolbar :submit[name=action_save]');
|
|
|
|
if (!button) button = this.find('.btn-toolbar :submit:first');
|
|
|
|
form.trigger('beforesubmitform');
|
|
this.trigger('submitform', { form: form, button: button });
|
|
|
|
$(button).addClass('loading');
|
|
|
|
var validationResult = form.validate();
|
|
if (typeof validationResult !== 'undefined' && !validationResult) {
|
|
statusMessage("Validation failed.", "bad");
|
|
|
|
$(button).removeClass('loading');
|
|
|
|
return false;
|
|
}
|
|
|
|
var formData = form.serializeArray();
|
|
|
|
formData.push({ name: $(button).attr('name'), value: '1' });
|
|
|
|
formData.push({ name: 'BackURL', value: window.history.state.path.replace(/\/$/, '') });
|
|
|
|
this.saveTabState();
|
|
|
|
jQuery.ajax(jQuery.extend({
|
|
headers: { "X-Pjax": "CurrentForm,Breadcrumbs" },
|
|
url: form.attr('action'),
|
|
data: formData,
|
|
type: 'POST',
|
|
complete: function complete() {
|
|
$(button).removeClass('loading');
|
|
},
|
|
success: function success(data, status, xhr) {
|
|
form.removeClass('changed');
|
|
if (callback) callback(data, status, xhr);
|
|
|
|
var newContentEls = self.handleAjaxResponse(data, status, xhr);
|
|
if (!newContentEls) return;
|
|
|
|
newContentEls.filter('form').trigger('aftersubmitform', { status: status, xhr: xhr, formData: formData });
|
|
}
|
|
}, ajaxOptions));
|
|
|
|
return false;
|
|
},
|
|
|
|
LastState: null,
|
|
|
|
PauseState: false,
|
|
|
|
handleStateChange: function handleStateChange(event) {
|
|
var historyState = arguments.length <= 1 || arguments[1] === undefined ? window.history.state : arguments[1];
|
|
|
|
if (this.getPauseState()) {
|
|
return;
|
|
}
|
|
|
|
if (this.getStateChangeXHR()) {
|
|
this.getStateChangeXHR().abort();
|
|
}
|
|
|
|
var self = this,
|
|
fragments = historyState.pjax || 'Content',
|
|
headers = {},
|
|
fragmentsArr = fragments.split(','),
|
|
contentEls = this._findFragments(fragmentsArr);
|
|
|
|
this.setStateChangeCount(this.getStateChangeCount() + 1);
|
|
|
|
if (!this.checkCanNavigate()) {
|
|
var lastState = this.getLastState();
|
|
|
|
this.setPauseState(true);
|
|
|
|
if (lastState !== null) {
|
|
_Router2.default.show(lastState.url);
|
|
} else {
|
|
_Router2.default.back();
|
|
}
|
|
|
|
this.setPauseState(false);
|
|
|
|
return;
|
|
}
|
|
|
|
this.setLastState(historyState);
|
|
|
|
if (contentEls.length < fragmentsArr.length) {
|
|
fragments = 'Content', fragmentsArr = ['Content'];
|
|
contentEls = this._findFragments(fragmentsArr);
|
|
}
|
|
|
|
this.trigger('beforestatechange', { state: historyState, element: contentEls });
|
|
|
|
headers['X-Pjax'] = fragments;
|
|
|
|
if (typeof historyState.__forceReferer !== 'undefined') {
|
|
var url = historyState.__forceReferer;
|
|
|
|
try {
|
|
url = decodeURI(url);
|
|
} catch (e) {} finally {
|
|
headers['X-Backurl'] = encodeURI(url);
|
|
}
|
|
}
|
|
|
|
contentEls.addClass('loading');
|
|
|
|
var promise = $.ajax({
|
|
headers: headers,
|
|
url: historyState.path
|
|
}).done(function (data, status, xhr) {
|
|
var els = self.handleAjaxResponse(data, status, xhr, historyState);
|
|
self.trigger('afterstatechange', { data: data, status: status, xhr: xhr, element: els, state: historyState });
|
|
}).always(function () {
|
|
self.setStateChangeXHR(null);
|
|
|
|
contentEls.removeClass('loading');
|
|
});
|
|
|
|
this.setStateChangeXHR(promise);
|
|
|
|
return promise;
|
|
},
|
|
|
|
loadFragment: function loadFragment(url, pjaxFragments) {
|
|
|
|
var self = this,
|
|
xhr,
|
|
headers = {},
|
|
baseUrl = $('base').attr('href'),
|
|
fragmentXHR = this.getFragmentXHR();
|
|
|
|
if (typeof fragmentXHR[pjaxFragments] !== 'undefined' && fragmentXHR[pjaxFragments] !== null) {
|
|
fragmentXHR[pjaxFragments].abort();
|
|
fragmentXHR[pjaxFragments] = null;
|
|
}
|
|
|
|
url = $.path.isAbsoluteUrl(url) ? url : $.path.makeUrlAbsolute(url, baseUrl);
|
|
headers['X-Pjax'] = pjaxFragments;
|
|
|
|
xhr = $.ajax({
|
|
headers: headers,
|
|
url: url,
|
|
success: function success(data, status, xhr) {
|
|
var elements = self.handleAjaxResponse(data, status, xhr, null);
|
|
|
|
self.trigger('afterloadfragment', { data: data, status: status, xhr: xhr, elements: elements });
|
|
},
|
|
error: function error(xhr, status, _error) {
|
|
self.trigger('loadfragmenterror', { xhr: xhr, status: status, error: _error });
|
|
},
|
|
complete: function complete() {
|
|
var fragmentXHR = self.getFragmentXHR();
|
|
if (typeof fragmentXHR[pjaxFragments] !== 'undefined' && fragmentXHR[pjaxFragments] !== null) {
|
|
fragmentXHR[pjaxFragments] = null;
|
|
}
|
|
}
|
|
});
|
|
|
|
fragmentXHR[pjaxFragments] = xhr;
|
|
|
|
return xhr;
|
|
},
|
|
|
|
handleAjaxResponse: function handleAjaxResponse(data, status, xhr, state) {
|
|
var self = this,
|
|
url,
|
|
selectedTabs,
|
|
guessFragment,
|
|
fragment,
|
|
$data;
|
|
|
|
if (xhr.getResponseHeader('X-Reload') && xhr.getResponseHeader('X-ControllerURL')) {
|
|
var baseUrl = $('base').attr('href'),
|
|
rawURL = xhr.getResponseHeader('X-ControllerURL'),
|
|
url = $.path.isAbsoluteUrl(rawURL) ? rawURL : $.path.makeUrlAbsolute(rawURL, baseUrl);
|
|
|
|
document.location.href = url;
|
|
return;
|
|
}
|
|
|
|
if (!data) return;
|
|
|
|
var title = xhr.getResponseHeader('X-Title');
|
|
if (title) document.title = decodeURIComponent(title.replace(/\+/g, ' '));
|
|
|
|
var newFragments = {},
|
|
newContentEls;
|
|
|
|
if (xhr.getResponseHeader('Content-Type').match(/^((text)|(application))\/json[ \t]*;?/i)) {
|
|
newFragments = data;
|
|
} else {
|
|
fragment = document.createDocumentFragment();
|
|
|
|
jQuery.clean([data], document, fragment, []);
|
|
$data = $(jQuery.merge([], fragment.childNodes));
|
|
|
|
guessFragment = 'Content';
|
|
if ($data.is('form') && !$data.is('[data-pjax-fragment~=Content]')) guessFragment = 'CurrentForm';
|
|
|
|
newFragments[guessFragment] = $data;
|
|
}
|
|
|
|
this.setRedrawSuppression(true);
|
|
try {
|
|
$.each(newFragments, function (newFragment, html) {
|
|
var contentEl = $('[data-pjax-fragment]').filter(function () {
|
|
return $.inArray(newFragment, $(this).data('pjaxFragment').split(' ')) != -1;
|
|
}),
|
|
newContentEl = $(html);
|
|
|
|
if (newContentEls) newContentEls.add(newContentEl);else newContentEls = newContentEl;
|
|
|
|
if (newContentEl.find('.cms-container').length) {
|
|
throw 'Content loaded via ajax is not allowed to contain tags matching the ".cms-container" selector to avoid infinite loops';
|
|
}
|
|
|
|
var origStyle = contentEl.attr('style');
|
|
var origParent = contentEl.parent();
|
|
var origParentLayoutApplied = typeof origParent.data('jlayout') !== 'undefined';
|
|
var layoutClasses = ['east', 'west', 'center', 'north', 'south', 'column-hidden'];
|
|
var elemClasses = contentEl.attr('class');
|
|
var origLayoutClasses = [];
|
|
if (elemClasses) {
|
|
origLayoutClasses = $.grep(elemClasses.split(' '), function (val) {
|
|
return $.inArray(val, layoutClasses) >= 0;
|
|
});
|
|
}
|
|
|
|
newContentEl.removeClass(layoutClasses.join(' ')).addClass(origLayoutClasses.join(' '));
|
|
if (origStyle) newContentEl.attr('style', origStyle);
|
|
|
|
var styles = newContentEl.find('style').detach();
|
|
if (styles.length) $(document).find('head').append(styles);
|
|
|
|
contentEl.replaceWith(newContentEl);
|
|
|
|
if (!origParent.is('.cms-container') && origParentLayoutApplied) {
|
|
origParent.layout();
|
|
}
|
|
});
|
|
|
|
var newForm = newContentEls.filter('form');
|
|
if (newForm.hasClass('cms-tabset')) newForm.removeClass('cms-tabset').addClass('cms-tabset');
|
|
} finally {
|
|
this.setRedrawSuppression(false);
|
|
}
|
|
|
|
this.redraw();
|
|
this.restoreTabState(state && typeof state.tabState !== 'undefined' ? state.tabState : null);
|
|
|
|
return newContentEls;
|
|
},
|
|
|
|
_findFragments: function _findFragments(fragments) {
|
|
return $('[data-pjax-fragment]').filter(function () {
|
|
var i,
|
|
nodeFragments = $(this).data('pjaxFragment').split(' ');
|
|
for (i in fragments) {
|
|
if ($.inArray(fragments[i], nodeFragments) != -1) return true;
|
|
}
|
|
return false;
|
|
});
|
|
},
|
|
|
|
refresh: function refresh() {
|
|
$(window).trigger('statechange');
|
|
|
|
$(this).redraw();
|
|
},
|
|
|
|
saveTabState: function saveTabState() {
|
|
if (typeof window.sessionStorage == "undefined" || window.sessionStorage === null) return;
|
|
|
|
var selectedTabs = [],
|
|
url = this._tabStateUrl();
|
|
this.find('.cms-tabset,.ss-tabset').each(function (i, el) {
|
|
var id = $(el).attr('id');
|
|
if (!id) return;
|
|
if (!$(el).data('tabs')) return;
|
|
if ($(el).data('ignoreTabState') || $(el).getIgnoreTabState()) return;
|
|
|
|
selectedTabs.push({ id: id, selected: $(el).tabs('option', 'selected') });
|
|
});
|
|
|
|
if (selectedTabs) {
|
|
var tabsUrl = 'tabs-' + url;
|
|
try {
|
|
window.sessionStorage.setItem(tabsUrl, JSON.stringify(selectedTabs));
|
|
} catch (err) {
|
|
if (err.code === DOMException.QUOTA_EXCEEDED_ERR && window.sessionStorage.length === 0) {
|
|
return;
|
|
} else {
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
restoreTabState: function restoreTabState(overrideStates) {
|
|
var self = this,
|
|
url = this._tabStateUrl(),
|
|
hasSessionStorage = typeof window.sessionStorage !== "undefined" && window.sessionStorage,
|
|
sessionData = hasSessionStorage ? window.sessionStorage.getItem('tabs-' + url) : null,
|
|
sessionStates = sessionData ? JSON.parse(sessionData) : false;
|
|
|
|
this.find('.cms-tabset, .ss-tabset').each(function () {
|
|
var index,
|
|
tab,
|
|
tabset = $(this),
|
|
tabsetId = tabset.attr('id'),
|
|
forcedTab = tabset.children('ul').children('li.ss-tabs-force-active');
|
|
|
|
if (!tabset.data('tabs')) {
|
|
return;
|
|
}
|
|
|
|
tabset.tabs('refresh');
|
|
|
|
if (forcedTab.length) {
|
|
index = forcedTab.first().index();
|
|
} else if (overrideStates && overrideStates[tabsetId]) {
|
|
tab = tabset.find(overrideStates[tabsetId].tabSelector);
|
|
if (tab.length) {
|
|
index = tab.index();
|
|
}
|
|
} else if (sessionStates) {
|
|
$.each(sessionStates, function (i, state) {
|
|
if (tabsetId == state.id) {
|
|
index = state.selected;
|
|
}
|
|
});
|
|
}
|
|
if (index !== null) {
|
|
tabset.tabs('option', 'active', index);
|
|
self.trigger('tabstaterestored');
|
|
}
|
|
});
|
|
},
|
|
|
|
clearTabState: function clearTabState(url) {
|
|
if (typeof window.sessionStorage == "undefined") return;
|
|
|
|
var s = window.sessionStorage;
|
|
if (url) {
|
|
s.removeItem('tabs-' + url);
|
|
} else {
|
|
for (var i = 0; i < s.length; i++) {
|
|
if (s.key(i).match(/^tabs-/)) s.removeItem(s.key(i));
|
|
}
|
|
}
|
|
},
|
|
|
|
clearCurrentTabState: function clearCurrentTabState() {
|
|
this.clearTabState(this._tabStateUrl());
|
|
},
|
|
|
|
_tabStateUrl: function _tabStateUrl() {
|
|
return window.history.state.path.replace(/\?.*/, '').replace(/#.*/, '').replace($('base').attr('href'), '');
|
|
},
|
|
|
|
showLoginDialog: function showLoginDialog() {
|
|
var tempid = $('body').data('member-tempid'),
|
|
dialog = $('.leftandmain-logindialog'),
|
|
url = 'CMSSecurity/login';
|
|
|
|
if (dialog.length) dialog.remove();
|
|
|
|
url = $.path.addSearchParams(url, {
|
|
'tempid': tempid,
|
|
'BackURL': window.location.href
|
|
});
|
|
|
|
dialog = $('<div class="leftandmain-logindialog"></div>');
|
|
dialog.attr('id', new Date().getTime());
|
|
dialog.data('url', url);
|
|
$('body').append(dialog);
|
|
}
|
|
});
|
|
|
|
$('.leftandmain-logindialog').entwine({
|
|
onmatch: function onmatch() {
|
|
this._super();
|
|
|
|
this.ssdialog({
|
|
iframeUrl: this.data('url'),
|
|
dialogClass: "leftandmain-logindialog-dialog",
|
|
autoOpen: true,
|
|
minWidth: 500,
|
|
maxWidth: 500,
|
|
minHeight: 370,
|
|
maxHeight: 400,
|
|
closeOnEscape: false,
|
|
open: function open() {
|
|
$('.ui-widget-overlay').addClass('leftandmain-logindialog-overlay');
|
|
},
|
|
close: function close() {
|
|
$('.ui-widget-overlay').removeClass('leftandmain-logindialog-overlay');
|
|
}
|
|
});
|
|
},
|
|
onunmatch: function onunmatch() {
|
|
this._super();
|
|
},
|
|
open: function open() {
|
|
this.ssdialog('open');
|
|
},
|
|
close: function close() {
|
|
this.ssdialog('close');
|
|
},
|
|
toggle: function toggle(bool) {
|
|
if (this.is(':visible')) this.close();else this.open();
|
|
},
|
|
|
|
reauthenticate: function reauthenticate(data) {
|
|
if (typeof data.SecurityID !== 'undefined') {
|
|
$(':input[name=SecurityID]').val(data.SecurityID);
|
|
}
|
|
|
|
if (typeof data.TempID !== 'undefined') {
|
|
$('body').data('member-tempid', data.TempID);
|
|
}
|
|
this.close();
|
|
}
|
|
});
|
|
|
|
$('form.loading,.cms-content.loading,.cms-content-fields.loading,.cms-content-view.loading').entwine({
|
|
onmatch: function onmatch() {
|
|
this.append('<div class="cms-content-loading-overlay ui-widget-overlay-light"></div><div class="cms-content-loading-spinner"></div>');
|
|
this._super();
|
|
},
|
|
onunmatch: function onunmatch() {
|
|
this.find('.cms-content-loading-overlay,.cms-content-loading-spinner').remove();
|
|
this._super();
|
|
}
|
|
});
|
|
|
|
$('.cms input[type="submit"], .cms button, .cms input[type="reset"], .cms .ss-ui-button').entwine({
|
|
onadd: function onadd() {
|
|
this.addClass('ss-ui-button');
|
|
if (!this.data('button')) this.button();
|
|
this._super();
|
|
},
|
|
onremove: function onremove() {
|
|
if (this.data('button')) this.button('destroy');
|
|
this._super();
|
|
}
|
|
});
|
|
|
|
$('.cms .cms-panel-link').entwine({
|
|
onclick: function onclick(e) {
|
|
if ($(this).hasClass('external-link')) {
|
|
e.stopPropagation();
|
|
|
|
return;
|
|
}
|
|
|
|
var href = this.attr('href'),
|
|
url = href && !href.match(/^#/) ? href : this.data('href'),
|
|
data = { pjax: this.data('pjaxTarget') };
|
|
|
|
$('.cms-container').loadPanel(url, null, data);
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
|
|
$('.cms .ss-ui-button-ajax').entwine({
|
|
onclick: function onclick(e) {
|
|
$(this).removeClass('ui-button-text-only');
|
|
$(this).addClass('ss-ui-button-loading ui-button-text-icons');
|
|
|
|
var loading = $(this).find(".ss-ui-loading-icon");
|
|
|
|
if (loading.length < 1) {
|
|
loading = $("<span></span>").addClass('ss-ui-loading-icon ui-button-icon-primary ui-icon');
|
|
|
|
$(this).prepend(loading);
|
|
}
|
|
|
|
loading.show();
|
|
|
|
var href = this.attr('href'),
|
|
url = href ? href : this.data('href');
|
|
|
|
jQuery.ajax({
|
|
url: url,
|
|
|
|
complete: function complete(xmlhttp, status) {
|
|
var msg = xmlhttp.getResponseHeader('X-Status') ? xmlhttp.getResponseHeader('X-Status') : xmlhttp.responseText;
|
|
|
|
try {
|
|
if (typeof msg != "undefined" && msg !== null) eval(msg);
|
|
} catch (e) {}
|
|
|
|
loading.hide();
|
|
|
|
$(".cms-container").refresh();
|
|
|
|
$(this).removeClass('ss-ui-button-loading ui-button-text-icons');
|
|
$(this).addClass('ui-button-text-only');
|
|
},
|
|
dataType: 'html'
|
|
});
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
|
|
$('.cms .ss-ui-dialog-link').entwine({
|
|
UUID: null,
|
|
onmatch: function onmatch() {
|
|
this._super();
|
|
this.setUUID(new Date().getTime());
|
|
},
|
|
onunmatch: function onunmatch() {
|
|
this._super();
|
|
},
|
|
onclick: function onclick() {
|
|
this._super();
|
|
|
|
var self = this,
|
|
id = 'ss-ui-dialog-' + this.getUUID();
|
|
var dialog = $('#' + id);
|
|
if (!dialog.length) {
|
|
dialog = $('<div class="ss-ui-dialog" id="' + id + '" />');
|
|
$('body').append(dialog);
|
|
}
|
|
|
|
var extraClass = this.data('popupclass') ? this.data('popupclass') : '';
|
|
|
|
dialog.ssdialog({ iframeUrl: this.attr('href'), autoOpen: true, dialogExtraClass: extraClass });
|
|
return false;
|
|
}
|
|
});
|
|
|
|
$('.cms-content .btn-toolbar').entwine({
|
|
onmatch: function onmatch() {
|
|
this.find('.ss-ui-button').click(function () {
|
|
var form = this.form;
|
|
|
|
if (form) {
|
|
form.clickedButton = this;
|
|
|
|
setTimeout(function () {
|
|
form.clickedButton = null;
|
|
}, 10);
|
|
}
|
|
});
|
|
|
|
this.redraw();
|
|
this._super();
|
|
},
|
|
onunmatch: function onunmatch() {
|
|
this._super();
|
|
},
|
|
redraw: function redraw() {
|
|
if (window.debug) console.log('redraw', this.attr('class'), this.get(0));
|
|
|
|
this.contents().filter(function () {
|
|
return this.nodeType == 3 && !/\S/.test(this.nodeValue);
|
|
}).remove();
|
|
|
|
this.find('.ss-ui-button').each(function () {
|
|
if (!$(this).data('button')) $(this).button();
|
|
});
|
|
|
|
this.find('.ss-ui-buttonset').buttonset();
|
|
}
|
|
});
|
|
|
|
$('.cms .field.date input.text').entwine({
|
|
onmatch: function onmatch() {
|
|
var holder = $(this).parents('.field.date:first'),
|
|
config = holder.data();
|
|
if (!config.showcalendar) {
|
|
this._super();
|
|
return;
|
|
}
|
|
|
|
config.showOn = 'button';
|
|
if (config.locale && $.datepicker.regional[config.locale]) {
|
|
config = $.extend(config, $.datepicker.regional[config.locale], {});
|
|
}
|
|
|
|
$(this).datepicker(config);
|
|
|
|
|
|
this._super();
|
|
},
|
|
onunmatch: function onunmatch() {
|
|
this._super();
|
|
}
|
|
});
|
|
|
|
$('.cms .field.dropdown select, .cms .field select[multiple], .fieldholder-small select.dropdown').entwine({
|
|
onmatch: function onmatch() {
|
|
if (this.is('.no-chosen')) {
|
|
this._super();
|
|
return;
|
|
}
|
|
|
|
if (!this.data('placeholder')) this.data('placeholder', ' ');
|
|
|
|
this.removeClass('has-chosen').chosen("destroy");
|
|
this.siblings('.chosen-container').remove();
|
|
|
|
applyChosen(this);
|
|
|
|
this._super();
|
|
},
|
|
onunmatch: function onunmatch() {
|
|
this._super();
|
|
}
|
|
});
|
|
|
|
$(".cms-panel-layout").entwine({
|
|
redraw: function redraw() {
|
|
if (window.debug) console.log('redraw', this.attr('class'), this.get(0));
|
|
}
|
|
});
|
|
|
|
$('.cms .ss-gridfield').entwine({
|
|
showDetailView: function showDetailView(url) {
|
|
var params = window.location.search.replace(/^\?/, '');
|
|
if (params) url = $.path.addSearchParams(url, params);
|
|
$('.cms-container').loadPanel(url);
|
|
}
|
|
});
|
|
|
|
$('.cms-search-form').entwine({
|
|
onsubmit: function onsubmit(e) {
|
|
var nonEmptyInputs, url;
|
|
|
|
nonEmptyInputs = this.find(':input:not(:submit)').filter(function () {
|
|
var vals = $.grep($(this).fieldValue(), function (val) {
|
|
return val;
|
|
});
|
|
return vals.length;
|
|
});
|
|
|
|
url = this.attr('action');
|
|
|
|
if (nonEmptyInputs.length) {
|
|
url = $.path.addSearchParams(url, nonEmptyInputs.serialize().replace('+', '%20'));
|
|
}
|
|
|
|
var container = this.closest('.cms-container');
|
|
container.find('.cms-edit-form').tabs('select', 0);
|
|
container.loadPanel(url, "", {}, true);
|
|
|
|
return false;
|
|
}
|
|
});
|
|
|
|
$(".cms-search-form button[type=reset], .cms-search-form input[type=reset]").entwine({
|
|
onclick: function onclick(e) {
|
|
e.preventDefault();
|
|
|
|
var form = $(this).parents('form');
|
|
|
|
form.clearForm();
|
|
form.find(".dropdown select").prop('selectedIndex', 0).trigger("chosen:updated");
|
|
form.submit();
|
|
}
|
|
});
|
|
|
|
window._panelDeferredCache = {};
|
|
$('.cms-panel-deferred').entwine({
|
|
onadd: function onadd() {
|
|
this._super();
|
|
this.redraw();
|
|
},
|
|
onremove: function onremove() {
|
|
if (window.debug) console.log('saving', this.data('url'), this);
|
|
|
|
if (!this.data('deferredNoCache')) window._panelDeferredCache[this.data('url')] = this.html();
|
|
this._super();
|
|
},
|
|
redraw: function redraw() {
|
|
if (window.debug) console.log('redraw', this.attr('class'), this.get(0));
|
|
|
|
var self = this,
|
|
url = this.data('url');
|
|
if (!url) throw 'Elements of class .cms-panel-deferred need a "data-url" attribute';
|
|
|
|
this._super();
|
|
|
|
if (!this.children().length) {
|
|
if (!this.data('deferredNoCache') && typeof window._panelDeferredCache[url] !== 'undefined') {
|
|
this.html(window._panelDeferredCache[url]);
|
|
} else {
|
|
this.addClass('loading');
|
|
$.ajax({
|
|
url: url,
|
|
complete: function complete() {
|
|
self.removeClass('loading');
|
|
},
|
|
success: function success(data, status, xhr) {
|
|
self.html(data);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
$('.cms-tabset').entwine({
|
|
onadd: function onadd() {
|
|
this.redrawTabs();
|
|
this._super();
|
|
},
|
|
onremove: function onremove() {
|
|
if (this.data('tabs')) this.tabs('destroy');
|
|
this._super();
|
|
},
|
|
redrawTabs: function redrawTabs() {
|
|
this.rewriteHashlinks();
|
|
|
|
var id = this.attr('id'),
|
|
activeTab = this.find('ul:first .ui-tabs-active');
|
|
|
|
if (!this.data('uiTabs')) this.tabs({
|
|
active: activeTab.index() != -1 ? activeTab.index() : 0,
|
|
beforeLoad: function beforeLoad(e, ui) {
|
|
return false;
|
|
},
|
|
activate: function activate(e, ui) {
|
|
var actions = $(this).closest('form').find('.btn-toolbar');
|
|
if ($(ui.newTab).closest('li').hasClass('readonly')) {
|
|
actions.fadeOut();
|
|
} else {
|
|
actions.show();
|
|
}
|
|
}
|
|
});
|
|
this.trigger('afterredrawtabs');
|
|
},
|
|
|
|
rewriteHashlinks: function rewriteHashlinks() {
|
|
$(this).find('ul a').each(function () {
|
|
if (!$(this).attr('href')) return;
|
|
var matches = $(this).attr('href').match(/#.*/);
|
|
if (!matches) return;
|
|
$(this).attr('href', document.location.href.replace(/#.*/, '') + matches[0]);
|
|
});
|
|
}
|
|
});
|
|
|
|
$('#filters-button').entwine({
|
|
onmatch: function onmatch() {
|
|
this._super();
|
|
|
|
this.data('collapsed', true);
|
|
this.data('animating', false);
|
|
},
|
|
onunmatch: function onunmatch() {
|
|
this._super();
|
|
},
|
|
showHide: function showHide() {
|
|
var self = this,
|
|
$filters = $('.cms-content-filters').first(),
|
|
collapsed = this.data('collapsed');
|
|
|
|
if (this.data('animating')) {
|
|
return;
|
|
}
|
|
|
|
this.toggleClass('active');
|
|
this.data('animating', true);
|
|
|
|
$filters[collapsed ? 'slideDown' : 'slideUp']({
|
|
complete: function complete() {
|
|
self.data('collapsed', !collapsed);
|
|
self.data('animating', false);
|
|
}
|
|
});
|
|
},
|
|
onclick: function onclick() {
|
|
this.showHide();
|
|
}
|
|
});
|
|
});
|
|
|
|
var statusMessage = function statusMessage(text, type) {
|
|
text = jQuery('<div/>').text(text).html();
|
|
jQuery.noticeAdd({ text: text, type: type, stayTime: 5000, inEffect: { left: '0', opacity: 'show' } });
|
|
};
|
|
|
|
var errorMessage = function errorMessage(text) {
|
|
jQuery.noticeAdd({ text: text, type: 'error', stayTime: 5000, inEffect: { left: '0', opacity: 'show' } });
|
|
};
|
|
}); |