silverstripe-cms/javascript/AssetTableField.js
Sam Minnee b14404922d ENHANCEMENT: Files and images section warns if you are deleting a file that is linked to
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/cms/branches/2.4@96778 467b73ca-7a2a-4603-9d3b-597d59a354a9
2011-02-02 17:52:11 +13:00

153 lines
4.5 KiB
JavaScript

AssetTableField = Class.create();
AssetTableField.applyTo('#Form_EditForm_Files');
AssetTableField.prototype = {
initialize: function() {
Behaviour.register({
'#Form_EditForm div.FileFilter input' : {
onkeypress : this.prepareSearch.bind(this)
},
'#Form_EditForm' : {
changeDetection_fieldsToIgnore : {
'ctf[start]' : true,
'ctf[ID]' : true,
'FileFilterButton' : true,
'FileFieldName' : true,
'FileSearch' : true
}
}
});
var rules = {};
// Assume that the delete link uses the deleteRecord method
rules['#'+this.id+' table.data a.deletelink'] = {onclick: this.deleteRecord.bind(this)};
Behaviour.register('ComplexTableField_'+this.id,rules);
},
// prevent submission of wrong form-button (FileFilterButton)
prepareSearch: function(e) {
// IE6 doesnt send an event-object with onkeypress
var event = (e) ? e : window.event;
var keyCode = (event.keyCode) ? event.keyCode : event.which;
if(keyCode == Event.KEY_RETURN) {
var el = Event.element(event);
$('FileFilterButton').onclick(event);
Event.stop(event);
return false;
}
},
// Override deleteRecord function, so that we can give warning if there are
// links to this file. This is mostly a copy paste from TableField.js
deleteRecord: function(e) {
var img = Event.element(e);
var link = Event.findElement(e,"a");
var row = Event.findElement(e,"tr");
var linkCount = row.getElementsByClassName('linkCount')[0];
if(linkCount) linkCount = linkCount.innerHTML;
var confirmMessage = ss.i18n._t('TABLEFIELD.DELETECONFIRMMESSAGE', 'Are you sure you want to delete this record?');
if(linkCount) confirmMessage += '\nThere are ' + linkCount + ' page(s) that use this file, please review the list of pages on the Links tab of the file before continuing.';
// TODO ajaxErrorHandler and loading-image are dependent on cms, but formfield is in sapphire
var confirmed = confirm(confirmMessage);
if(confirmed)
{
img.setAttribute("src",'cms/images/network-save.gif'); // TODO doesn't work
new Ajax.Request(
link.getAttribute("href"),
{
method: 'post',
postBody: 'forceajax=1' + ($('SecurityID') ? '&SecurityID=' + $('SecurityID').value : ''),
onComplete: function(){
Effect.Fade(
row,
{
afterFinish: function(obj) {
// remove row from DOM
obj.element.parentNode.removeChild(obj.element);
// recalculate summary if needed (assumes that TableListField.js is present)
// TODO Proper inheritance
if(this._summarise) this._summarise();
// custom callback
if(this.callback_deleteRecord) this.callback_deleteRecord(e);
}.bind(this)
}
);
}.bind(this),
onFailure: this.ajaxErrorHandler
}
);
}
Event.stop(e);
}
}
FileFilterButton = Class.create();
FileFilterButton.applyTo('#FileFilterButton');
FileFilterButton.prototype = {
initialize: function() {
this.inputFields = new Array();
var childNodes = this.parentNode.parentNode.getElementsByTagName('input');
for( var index = 0; index < childNodes.length; index++ ) {
if( childNodes[index].tagName ) {
childNodes[index].resetChanged = function() { return false; }
childNodes[index].isChanged = function() { return false; }
this.inputFields.push( childNodes[index] );
}
}
childNodes = this.parentNode.getElementsByTagName('select');
for( var index = 0; index < childNodes.length; index++ ) {
if( childNodes[index].tagName ) {
childNodes[index].resetChanged = function() { return false; }
childNodes[index].field_changed = function() { return false; }
this.inputFields.push( childNodes[index] );
}
}
},
isChanged: function() {
return false;
},
onclick: function(e) {
if(!$('ctf-ID') || !$('FileFieldName')) {
return false;
}
try {
var form = Event.findElement(e, 'form');
var fieldName = $('FileFieldName').value;
// build url
var updateURL = form.action + '/field/' + fieldName + '?';
for(var index = 0; index < this.inputFields.length; index++) {
if(this.inputFields[index].tagName) {
updateURL += '&' + this.inputFields[index].name + '=' + encodeURIComponent(this.inputFields[index].value);
}
}
updateURL += ($('SecurityID') ? '&SecurityID=' + $('SecurityID').value : '');
// update the field
var field = document.getElementsByClassName('AssetTableField')[0];
field.setAttribute('href', updateURL);
field.refresh();
} catch(er) {
errorMessage('Error searching');
}
return false;
}
}