mirror of
https://github.com/silverstripe/silverstripe-subsites
synced 2024-10-22 11:05:55 +02:00
37843f447e
* Hide admins without subsite support from subsites menu * Add subsite support to default site areas * Enable reloading of subsites switcher dropdown when navigating the site, and when editing subsite areas API Fix parallel pjax menu fetching for subsites. - thanks Mateusz! Delint LeftAndMain_Subsites.js
186 lines
4.8 KiB
JavaScript
186 lines
4.8 KiB
JavaScript
/*jslint browser: true, nomen: true*/
|
|
/*global $, window, jQuery*/
|
|
|
|
(function($) {
|
|
'use strict';
|
|
$.entwine('ss', function($) {
|
|
|
|
$('#SubsitesSelect').entwine({
|
|
onadd:function(){
|
|
this.on('change', function(){
|
|
window.location.search=$.query.set('SubsiteID', $(this).val());
|
|
});
|
|
}
|
|
});
|
|
|
|
$('.cms-container').entwine({
|
|
|
|
SubsiteCurrentXHR: null,
|
|
|
|
/**
|
|
* LeftAndMain does not give us possibility to parallel-fetch a PJAX fragment.
|
|
* We provide our own fetcher that bypasses the history - that's because we
|
|
* don't want to load a panel, but rather just a subsite dropdown.
|
|
*/
|
|
subsiteFetchPjaxFragment: function(url, pjaxFragment) {
|
|
|
|
// Make sure only one subsite XHR request is ongoing.
|
|
if(this.getSubsiteCurrentXHR()){
|
|
this.getSubsiteCurrentXHR().abort();
|
|
}
|
|
|
|
var self = this,
|
|
xhr,
|
|
headers = {},
|
|
baseUrl = $('base').attr('href');
|
|
|
|
url = $.path.isAbsoluteUrl(url) ? url : $.path.makeUrlAbsolute(url, baseUrl);
|
|
headers['X-Pjax'] = pjaxFragment;
|
|
|
|
xhr = $.ajax({
|
|
headers: headers,
|
|
url: url,
|
|
complete: function() {
|
|
self.setSubsiteCurrentXHR(null);
|
|
},
|
|
success: function(data, status, xhr) {
|
|
self.handleAjaxResponse(data, status, xhr, null);
|
|
}
|
|
});
|
|
|
|
this.setSubsiteCurrentXHR(xhr);
|
|
}
|
|
|
|
});
|
|
|
|
/*
|
|
* Reload subsites dropdown when links are processed
|
|
*/
|
|
$('.cms-container .cms-menu-list li a').entwine({
|
|
onclick: function(e) {
|
|
$('.cms-container').subsiteFetchPjaxFragment('admin/subsites/', 'SubsiteList');
|
|
this._super(e);
|
|
}
|
|
});
|
|
|
|
/*
|
|
* Reload subsites dropdown when the admin area reloads (for deleting sites)
|
|
*/
|
|
$('.cms-container .SubsiteAdmin .cms-edit-form fieldset.ss-gridfield').entwine({
|
|
onreload: function(e) {
|
|
$('.cms-container').subsiteFetchPjaxFragment('admin/subsites/', 'SubsiteList');
|
|
this._super(e);
|
|
}
|
|
});
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Reload subsites dropdown when subsites are added or names are modified
|
|
*/
|
|
$('.cms-container .cms-content-fields .subsite-model').entwine({
|
|
onadd: function(e) {
|
|
$('.cms-container').subsiteFetchPjaxFragment('admin/subsites/', 'SubsiteList');
|
|
this._super(e);
|
|
}
|
|
});
|
|
|
|
// Subsite tab of Group editor
|
|
$('#Form_ItemEditForm_AccessAllSubsites').entwine({
|
|
/**
|
|
* Constructor: onmatch
|
|
*/
|
|
onmatch: function () {
|
|
this.showHideSubsiteList();
|
|
|
|
var ref=this;
|
|
$('#Form_ItemEditForm_AccessAllSubsites input').change(function() {
|
|
ref.showHideSubsiteList();
|
|
});
|
|
},
|
|
|
|
showHideSubsiteList: function () {
|
|
$('#Form_ItemEditForm_Subsites').parent().parent().css('display', ($('#Form_ItemEditForm_AccessAllSubsites_1').is(':checked') ? 'none':''));
|
|
}
|
|
});
|
|
|
|
$('.cms-edit-form').entwine({
|
|
getChangeTrackerOptions: function() {
|
|
this.ChangeTrackerOptions.ignoreFieldSelector+=', input[name=IsSubsite]';
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Binding a visibility toggle anchor to a longer list of checkboxes.
|
|
* Hidden by default, unless either the toggle checkbox, or any of the
|
|
* actual value checkboxes are selected.
|
|
*/
|
|
$('#PageTypeBlacklist').entwine({
|
|
onmatch: function() {
|
|
var hasLimits=Boolean($('#PageTypeBlacklist').find('input:checked').length);
|
|
jQuery('#PageTypeBlacklist').toggle(hasLimits);
|
|
|
|
|
|
//Bind listener
|
|
$('a#PageTypeBlacklistToggle').click(function(e) {
|
|
jQuery('#PageTypeBlacklist').toggle();
|
|
e.stopPropagation();
|
|
return false;
|
|
});
|
|
}
|
|
});
|
|
|
|
$('.cms-edit-form input[name=action_copytosubsite]').entwine({
|
|
onclick: function(e) {
|
|
var form = this.closest('form');
|
|
form.trigger('submit', [this]);
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
$.entwine('ss.preview', function($){
|
|
|
|
$('.cms-preview').entwine({
|
|
|
|
/**
|
|
* Update links and forms with GET/POST SubsiteID param, so we remaing on the current subsite.
|
|
* The initial link for the iframe comes from SiteTreeSubsites::alternatePreviewLink.
|
|
*
|
|
* This is done so we can use the CMS domain for displaying previews so we prevent single-origin
|
|
* violations and SSL cert problems that come up when iframing content from a different URL.
|
|
*/
|
|
onafterIframeAdjustedForPreview: function(event, doc) {
|
|
var subsiteId = $(doc).find('meta[name=x-subsite-id]').attr('content');
|
|
|
|
if (!subsiteId) {
|
|
return;
|
|
}
|
|
|
|
// Inject the SubsiteID into internal links.
|
|
$(doc).find('a').each(function() {
|
|
var href = $(this).attr('href');
|
|
|
|
if (!href.match(/^http:\/\//)) {
|
|
|
|
$(this).attr('href', $.path.addSearchParams(href, {
|
|
'SubsiteID': subsiteId
|
|
}));
|
|
|
|
}
|
|
});
|
|
|
|
// Inject the SubsiteID as a hidden input into all forms submitting to the local site.
|
|
$(doc).find('form').each(function() {
|
|
|
|
if (!$(this).attr('action').match(/^http:\/\//)) {
|
|
$(doc).find('form').append('<input type=hidden name="SubsiteID" value="' + subsiteId + '" >');
|
|
}
|
|
|
|
});
|
|
}
|
|
});
|
|
});
|
|
}(jQuery));
|