mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
ENHANCEMENT Allow submitting form data alongside TreeDropdownField ajax request, which can be used to retain state
This commit is contained in:
parent
99099e8838
commit
35100c3e11
@ -7,8 +7,6 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @todo Locale support/form serialization
|
|
||||||
* @todo Multiselect: Select items after tree load, serialize titles, override title on select but keep panel open
|
|
||||||
* @todo Error display
|
* @todo Error display
|
||||||
* @todo No results display for search
|
* @todo No results display for search
|
||||||
* @todo Automatic expansion of ajax children when multiselect is triggered
|
* @todo Automatic expansion of ajax children when multiselect is triggered
|
||||||
@ -58,7 +56,7 @@
|
|||||||
},
|
},
|
||||||
loadTree: function(params, callback) {
|
loadTree: function(params, callback) {
|
||||||
var self = this, panel = this.getPanel(), treeHolder = $(panel).find('.tree-holder');
|
var self = this, panel = this.getPanel(), treeHolder = $(panel).find('.tree-holder');
|
||||||
var params = params || {};
|
var params = (params) ? this.getRequestParams().concat(params) : this.getRequestParams();
|
||||||
panel.addClass('loading');
|
panel.addClass('loading');
|
||||||
treeHolder.load(this.attr('href'), params, function(html, status, xhr) {
|
treeHolder.load(this.attr('href'), params, function(html, status, xhr) {
|
||||||
var firstLoad = true;
|
var firstLoad = true;
|
||||||
@ -84,6 +82,7 @@
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
getTreeConfig: function() {
|
getTreeConfig: function() {
|
||||||
|
var self = this;
|
||||||
return {
|
return {
|
||||||
'core': {
|
'core': {
|
||||||
'initially_open': ['record-0'],
|
'initially_open': ['record-0'],
|
||||||
@ -95,7 +94,9 @@
|
|||||||
'ajax': {
|
'ajax': {
|
||||||
'url': this.attr('href'),
|
'url': this.attr('href'),
|
||||||
'data': function(node) {
|
'data': function(node) {
|
||||||
return { ID : $(node).data("id") ? $(node).data("id") : 0 , ajax: 1};
|
var id = $(node).data("id") ? $(node).data("id") : 0, params = self.getRequestParams();
|
||||||
|
params = params.concat([{name: 'ID', value: id}, {name: 'ajax', value: 1}]);
|
||||||
|
return params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -108,6 +109,16 @@
|
|||||||
},
|
},
|
||||||
'plugins': ['html_data', 'ui', 'themes']
|
'plugins': ['html_data', 'ui', 'themes']
|
||||||
};
|
};
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* If the field is contained in a form, submit all form parameters by default.
|
||||||
|
* This is useful to keep state like locale values which are typically
|
||||||
|
* encoded in hidden fields through the form.
|
||||||
|
*
|
||||||
|
* @return {array}
|
||||||
|
*/
|
||||||
|
getRequestParams: function() {
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('.TreeDropdownField *').entwine({
|
$('.TreeDropdownField *').entwine({
|
||||||
@ -173,7 +184,7 @@
|
|||||||
},
|
},
|
||||||
loadTree: function(params, callback) {
|
loadTree: function(params, callback) {
|
||||||
var self = this, panel = this.getPanel(), treeHolder = $(panel).find('.tree-holder');
|
var self = this, panel = this.getPanel(), treeHolder = $(panel).find('.tree-holder');
|
||||||
var params = params || {};
|
var params = (params) ? this.getRequestParams().concat(params) : this.getRequestParams();
|
||||||
panel.addClass('loading');
|
panel.addClass('loading');
|
||||||
treeHolder.load(this.attr('href'), params, function(html, status, xhr) {
|
treeHolder.load(this.attr('href'), params, function(html, status, xhr) {
|
||||||
var firstLoad = true;
|
var firstLoad = true;
|
||||||
|
@ -190,7 +190,7 @@
|
|||||||
|
|
||||||
it('it sets the selected titles', function() {
|
it('it sets the selected titles', function() {
|
||||||
var f = $('#testfield'), panel = f.entwine('ss').getPanel();
|
var f = $('#testfield'), panel = f.entwine('ss').getPanel();
|
||||||
loadTree(f);
|
var xhr = loadTree(f);
|
||||||
|
|
||||||
// TODO loaded.jstree event works with timeouts, so we have to wait before inspection
|
// TODO loaded.jstree event works with timeouts, so we have to wait before inspection
|
||||||
waits(200);
|
waits(200);
|
||||||
@ -201,6 +201,39 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when field is contained in a form', function() {
|
||||||
|
|
||||||
|
beforeEach(function() {
|
||||||
|
$('#myform .TreeDropdownField').entwine('ss', {
|
||||||
|
getRequestParams: function() {
|
||||||
|
return this.parents('form:first').serializeArray();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// load fixture
|
||||||
|
$('body').append(
|
||||||
|
'<form id="myform" url="/myform">' +
|
||||||
|
'<div id="testfield" class="TreeDropdownField" href="/myurl" data-title="Selected">' +
|
||||||
|
'<input type="hidden" name="testfield" value="1" />' +
|
||||||
|
'</div>' +
|
||||||
|
'<input type="hidden" name="MyFormValue" value="foo" />' +
|
||||||
|
'</form>'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function() {
|
||||||
|
$('#testfield').remove();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('sends all form values with ajax requests', function() {
|
||||||
|
var f = $('#testfield'), panel = f.entwine('ss').getPanel();
|
||||||
|
loadTree(f);
|
||||||
|
var xhr = mostRecentAjaxRequest();
|
||||||
|
expect(xhr.params).toContain('MyFormValue=foo');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}(jQuery));
|
}(jQuery));
|
Loading…
x
Reference in New Issue
Block a user