mirror of
https://github.com/silverstripe/silverstripe-cms
synced 2024-10-22 08:05:56 +02:00
ENHANCEMENT Better response handling in LeftAndMain.EditForm
BUGFIX Fixed event cancellation in LeftAndMain.EditForm javascript buttons git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/cms/trunk@92672 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
b99ee16d88
commit
41c1c49dfe
@ -57,20 +57,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// get all data from the form
|
// get all data from the form
|
||||||
var data = this.serializeArray();
|
var formData = this.serializeArray();
|
||||||
// add button action
|
// add button action
|
||||||
data.push({name: $(button).attr('name'), value:'1'});
|
formData.push({name: $(button).attr('name'), value:'1'});
|
||||||
$.post(
|
|
||||||
this.attr('action'),
|
$.ajax({
|
||||||
data,
|
url: this.attr('action'),
|
||||||
function(response) {
|
data: formData,
|
||||||
|
type: 'POST',
|
||||||
|
complete: function(xmlhttp, status) {
|
||||||
$(button).removeClass('loading');
|
$(button).removeClass('loading');
|
||||||
|
// pass along original form data to enable old/new comparisons
|
||||||
self._loadResponse(response);
|
self._loadResponse(xmlhttp.responseText, status, xmlhttp, formData);
|
||||||
},
|
},
|
||||||
// @todo Currently all responses are assumed to be evaluated
|
dataType: 'html'
|
||||||
'script'
|
});
|
||||||
);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
@ -96,15 +97,14 @@
|
|||||||
*/
|
*/
|
||||||
load: function(url, callback) {
|
load: function(url, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
$.get(
|
$.ajax({
|
||||||
url,
|
url: url,
|
||||||
function(response) {
|
complete: function(xmlhttp, status) {
|
||||||
self._loadResponse(response);
|
self._loadResponse(xmlhttp.responseText, status, xmlhttp);
|
||||||
if(callback) callback.apply(self, [response]);
|
if(callback) callback.apply(self, arguments);
|
||||||
},
|
},
|
||||||
// @todo Currently all responses are assumed to be evaluated
|
dataType: 'html'
|
||||||
'script'
|
});
|
||||||
);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -114,7 +114,8 @@
|
|||||||
* @param {String} removeText Short note why the form has been removed, displayed in <p> tags.
|
* @param {String} removeText Short note why the form has been removed, displayed in <p> tags.
|
||||||
* Falls back to the default RemoveText() option (Optional)
|
* Falls back to the default RemoveText() option (Optional)
|
||||||
*/
|
*/
|
||||||
remove: function(removeText) {
|
removeForm: function(removeText) {
|
||||||
|
if(!removeText) removeText = this.RemoveText();
|
||||||
this.html('<p>' + removeText + '</p>');
|
this.html('<p>' + removeText + '</p>');
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -133,49 +134,65 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {String} result Either HTML for straight insertion, or eval'ed JavaScript.
|
* @param {String} data Either HTML for straight insertion, or eval'ed JavaScript.
|
||||||
* If passed as HTML, it is assumed that everying inside the <form> tag is replaced,
|
* If passed as HTML, it is assumed that everying inside the <form> tag is replaced,
|
||||||
* but the old <form> tag itself stays intact.
|
* but the old <form> tag itself stays intact.
|
||||||
|
* @param {String} status
|
||||||
|
* @param {XMLHTTPRequest} xmlhttp
|
||||||
|
* @param {Array} origData The original submitted data, useful to do comparisons of changed
|
||||||
|
* values in new form output, e.g. to detect a URLSegment being changed on the serverside.
|
||||||
|
* Array in jQuery serializeArray() notation.
|
||||||
*/
|
*/
|
||||||
_loadResponse: function(response) {
|
_loadResponse: function(data, status, xmlhttp, origData) {
|
||||||
this.cleanup();
|
if(status == 'success') {
|
||||||
|
this.cleanup();
|
||||||
var html = response;
|
|
||||||
|
var html = data;
|
||||||
|
|
||||||
// Rewrite # links
|
// Rewrite # links
|
||||||
html = html.replace(/(<a[^>]+href *= *")#/g, '$1' + window.location.href.replace(/#.*$/,'') + '#');
|
html = html.replace(/(<a[^>]+href *= *")#/g, '$1' + window.location.href.replace(/#.*$/,'') + '#');
|
||||||
|
|
||||||
// Rewrite iframe links (for IE)
|
// Rewrite iframe links (for IE)
|
||||||
html = html.replace(/(<iframe[^>]*src=")([^"]+)("[^>]*>)/g, '$1' + $('base').attr('href') + '$2$3');
|
html = html.replace(/(<iframe[^>]*src=")([^"]+)("[^>]*>)/g, '$1' + $('base').attr('href') + '$2$3');
|
||||||
|
|
||||||
// Prepare iframes for removal, otherwise we get loading bugs
|
// Prepare iframes for removal, otherwise we get loading bugs
|
||||||
this.find('iframe').each(function() {
|
this.find('iframe').each(function() {
|
||||||
this.contentWindow.location.href = 'about:blank';
|
this.contentWindow.location.href = 'about:blank';
|
||||||
this.remove();
|
this.remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.html(html);
|
// update form content
|
||||||
// Optionally get the form attributes from embedded fields, see Form->formHtmlContent()
|
if(html) {
|
||||||
for(var overrideAttr in {'action':true,'method':true,'enctype':true,'name':true}) {
|
this.html(html);
|
||||||
var el = this.find(':input[name='+ '_form_' + overrideAttr + ']');
|
} else {
|
||||||
if(el) {
|
this.removeForm();
|
||||||
this.attr(overrideAttr, el.val());
|
|
||||||
el.remove();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Optionally get the form attributes from embedded fields, see Form->formHtmlContent()
|
||||||
|
for(var overrideAttr in {'action':true,'method':true,'enctype':true,'name':true}) {
|
||||||
|
var el = this.find(':input[name='+ '_form_' + overrideAttr + ']');
|
||||||
|
if(el) {
|
||||||
|
this.attr(overrideAttr, el.val());
|
||||||
|
el.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Behaviour.apply(); // refreshes ComplexTableField
|
||||||
|
|
||||||
|
// focus input on first form element
|
||||||
|
this.find(':input:visible:first').focus();
|
||||||
|
|
||||||
|
this.trigger('loadnewpage', {data: data, origData: origData});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set status message based on response
|
||||||
|
var _statusMessage = (xmlhttp.getResponseHeader('X-Status')) ? xmlhttp.getResponseHeader('X-Status') : xmlhttp.statusText;
|
||||||
if(this.hasClass('validationerror')) {
|
if(this.hasClass('validationerror')) {
|
||||||
|
// TODO validation shouldnt need a special case
|
||||||
statusMessage(ss.i18n._t('ModelAdmin.VALIDATIONERROR', 'Validation Error'), 'bad');
|
statusMessage(ss.i18n._t('ModelAdmin.VALIDATIONERROR', 'Validation Error'), 'bad');
|
||||||
} else {
|
} else {
|
||||||
statusMessage(ss.i18n._t('ModelAdmin.SAVED', 'Saved'), 'good');
|
statusMessage(_statusMessage, (xmlhttp.status >= 400) ? 'bad' : 'good');
|
||||||
}
|
}
|
||||||
|
|
||||||
Behaviour.apply(); // refreshes ComplexTableField
|
|
||||||
|
|
||||||
// focus input on first form element
|
|
||||||
this.find(':input:visible:first').focus();
|
|
||||||
|
|
||||||
this.trigger('loadnewpage', {response: response});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@ -191,7 +208,7 @@
|
|||||||
onmatch: function() {
|
onmatch: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
// TODO Fix once concrete library is updated
|
// TODO Fix once concrete library is updated
|
||||||
this.bind('click', function(e) {self.clickFake(e);});
|
this.bind('click', function(e) {return self.clickFake(e);});
|
||||||
},
|
},
|
||||||
clickFake: function(e) {
|
clickFake: function(e) {
|
||||||
$(this[0].form).concrete('ss').ajaxSubmit(this);
|
$(this[0].form).concrete('ss').ajaxSubmit(this);
|
||||||
|
Loading…
Reference in New Issue
Block a user