silverstripe-framework/admin/javascript/ModelAdmin.js

219 lines
5.2 KiB
JavaScript
Executable File

/**
* File: ModelAdmin.js
*/
/**
* Javascript handlers for generic model admin.
*
* Most of the work being done here is intercepting clicks on form submits,
* and managing the loading and sequencing of data between the different panels of
* the CMS interface.
*
* @todo add live query to manage application of events to DOM refreshes
* @todo alias the $ function instead of literal jQuery
*/
(function($) {
$.entwine('ss', function($){
//////////////////////////////////////////////////////////////////
// Search form
//////////////////////////////////////////////////////////////////
/**
* Class: #ModelClassSelector select
*
* If a dropdown is used to choose between the classes, it is handled by this code
*/
$('#ModelClassSelector select').entwine({
onmatch: function() {
// Initialise the form by calling this onchange event straight away
this.change();
this._super();
},
/**
* Function: onchange
*
* Set up an onchange function to show the applicable form and hide all others
*/
onchange: function(e) {
this.find('option').each(function() {
var $form = $('#'+this.val());
if(this.val() == this.val()) $form.show();
else $form.hide();
});
}
});
/**
* Class: #SearchForm_holder form
*
* Submits a search filter query and attaches event handlers
* to the response table, excluding the import form because
* file ($_FILES) submission doesn't work using AJAX
*
* Note: This is used for Form_CreateForm and all Form_SearchForm_* variations
*/
$('#SearchForm_holder form').entwine({
/**
* Function: onsubmit
*/
onsubmit: function(e) {
// Import forms are processed without ajax
if(this.attr('id').match(/^Form_ImportForm/)) return true;
$('.cms-editor-dialogs').closeRightPanel();
this.trigger('beforeSubmit');
var btn = $(this[0].clickedButton);
btn.addClass('loading');
$('.cms-content').loadForm(
this.attr('action'),
null,
function() {
btn.removeClass('loading');
},
{data: this.serialize()}
);
return false;
}
});
/**
* Class: a.form_frontend_function.toggle_result_assembly
*
* Column selection in search form
*/
$('a.form_frontend_function.toggle_result_assembly').entwine({
/**
* Function: onclick
*/
onclick: function(e) {
var toggleElement = $(this).next();
toggleElement.toggle();
return false;
}
});
/**
* Class: a.form_frontend_function.tick_all_result_assembly
*/
$('a.form_frontend_function.tick_all_result_assembly').entwine({
/**
* Function: onclick
*/
onclick: function(e) {
var resultAssembly = $(this).prevAll('div#ResultAssembly').find('ul li input');
resultAssembly.attr('checked', 'checked');
return false;
}
});
$('a.form_frontend_function.untick_all_result_assembly').entwine({
onclick: function(e) {
var resultAssembly = $(this).prevAll('div#ResultAssembly').find('ul li input');
resultAssembly.removeAttr('checked');
return false;
}
});
/**
* Class: .resultsTable tbody td
*
* Table record handler for search result record
*/
$('.resultsTable tbody td').entwine({
/**
* Function: onclick
*/
onclick: function(e) {
var firstLink = this.find('a[href]');
if(!firstLink) return;
window.History.pushState({selector: '.cms-content-fields form:first'}, '', firstLink.attr('href'));
return false;
}
});
/**
* Class: #Form_ManagedModelsSelect
*
* Add object button
*/
$('#Form_ManagedModelsSelect').entwine({
/**
* Function: onsubmit
*/
onsubmit: function(e) {
className = $('select option:selected', this).val();
requestPath = this.attr('action').replace('ManagedModelsSelect', className + '/add');
var $button = $(':submit', this);
$('.cms-content').loadForm(
requestPath,
null,
function() {
$button.removeClass('loading');
$button = null;
}
);
return false;
}
});
/**
* Class: .cms-edit-form input[name=action_doDelete]
*
* RHS panel Delete button
*/
$('.cms-edit-form input[name=action_doDelete]').entwine({
// Function: onclick
onclick: function(e) {
if(!confirm(ss.i18n._t('ModelAdmin.REALLYDELETE', 'Really delete?'))) {
this.removeClass('loading');
return false;
}
}
});
/**
* Class: .importSpec
*
* Toggle import specifications
*/
$('.importSpec').entwine({
onmatch: function() {
this.hide();
this.find('a.detailsLink').click(function() {
$('#' + $(this).attr('href').replace(/.*#/,'')).toggle();
return false;
});
this._super();
}
});
$('.cms-editor-dialogs').entwine({
/**
* Close TinyMCE image, link or flash panel.
* this function is called everytime a new search, back or add new DataObject are clicked
**/
closeRightPanel: function(){
if($('.cms-editor-dialogs').is(':visible')) {
$('.cms-editor-dialogs').hide();
$('#Form_EditorToolbarImageForm').hide();
$('#Form_EditorToolbarFlashForm').hide();
$('#Form_EditorToolbarLinkForm').hide();
}
}
});
});
})(jQuery);