mirror of
https://github.com/symbiote/silverstripe-gridfieldextensions.git
synced 2024-10-22 17:05:39 +02:00
Merge pull request #233 from silverstripe-terraformers/feature/SS4_upgrade_fixes
This commit is contained in:
commit
509abf1532
@ -273,6 +273,82 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
$(".ss-gridfield-orderable tbody").entwine({
|
$(".ss-gridfield-orderable tbody").entwine({
|
||||||
|
// reload the gridfield without triggering the change event
|
||||||
|
// this is because the change has already been saved by reorder action
|
||||||
|
reload: function (ajaxOpts, successCallback) {
|
||||||
|
var self = this.getGridField(), form = this.closest('form'),
|
||||||
|
focusedElName = this.find(':input:focus').attr('name'), // Save focused element for restoring after refresh
|
||||||
|
data = form.find(':input').serializeArray();
|
||||||
|
|
||||||
|
if (!ajaxOpts) {
|
||||||
|
ajaxOpts = {};
|
||||||
|
}
|
||||||
|
if (!ajaxOpts.data) {
|
||||||
|
ajaxOpts.data = [];
|
||||||
|
}
|
||||||
|
ajaxOpts.data = ajaxOpts.data.concat(data);
|
||||||
|
|
||||||
|
// Include any GET parameters from the current URL, as the view state might depend on it.
|
||||||
|
// For example, a list prefiltered through external search criteria might be passed to GridField.
|
||||||
|
if (window.location.search) {
|
||||||
|
ajaxOpts.data = window.location.search.replace(/^\?/, '') + '&' + $.param(ajaxOpts.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
form.addClass('loading');
|
||||||
|
|
||||||
|
$.ajax($.extend({}, {
|
||||||
|
headers: {"X-Pjax": 'CurrentField'},
|
||||||
|
type: "POST",
|
||||||
|
url: this.data('url'),
|
||||||
|
dataType: 'html',
|
||||||
|
success: function (data) {
|
||||||
|
// Replace the grid field with response, not the form.
|
||||||
|
// TODO Only replaces all its children, to avoid replacing the current scope
|
||||||
|
// of the executing method. Means that it doesn't retrigger the onmatch() on the main container.
|
||||||
|
self.empty().append($(data).children());
|
||||||
|
|
||||||
|
// Refocus previously focused element. Useful e.g. for finding+adding
|
||||||
|
// multiple relationships via keyboard.
|
||||||
|
if (focusedElName) self.find(':input[name="' + focusedElName + '"]').focus();
|
||||||
|
|
||||||
|
// Update filter
|
||||||
|
if (self.find('.grid-field__filter-header').length) {
|
||||||
|
var content;
|
||||||
|
if (ajaxOpts.data[0].filter == "show") {
|
||||||
|
content = '<span class="non-sortable"></span>';
|
||||||
|
self.addClass('show-filter').find('.grid-field__filter-header').show();
|
||||||
|
} else {
|
||||||
|
content = '<button type="button" title="Open search and filter" name="showFilter" class="btn btn-secondary font-icon-search btn--no-text btn--icon-large grid-field__filter-open"></button>';
|
||||||
|
self.removeClass('show-filter').find('.grid-field__filter-header').hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
self.find('.sortable-header th:last').html(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
form.removeClass('loading');
|
||||||
|
if (successCallback) {
|
||||||
|
successCallback.apply(this, arguments);
|
||||||
|
}
|
||||||
|
self.trigger('reload', self);
|
||||||
|
|
||||||
|
// update publish button if necessary
|
||||||
|
const publish = $('#Form_EditForm_action_publish');
|
||||||
|
|
||||||
|
// button needs to be updated only if it's in published state
|
||||||
|
if (publish.length > 0 && publish.hasClass('btn-outline-primary')) {
|
||||||
|
publish.removeClass('btn-outline-primary');
|
||||||
|
publish.removeClass('font-icon-tick');
|
||||||
|
publish.addClass('btn-primary');
|
||||||
|
publish.addClass('font-icon-rocket');
|
||||||
|
publish.find('.btn__title').html('Save & publish');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function (e) {
|
||||||
|
alert(i18n._t('Admin.ERRORINTRANSACTION'));
|
||||||
|
form.removeClass('loading');
|
||||||
|
}
|
||||||
|
}, ajaxOpts));
|
||||||
|
},
|
||||||
rebuildSort: function() {
|
rebuildSort: function() {
|
||||||
var grid = this.getGridField();
|
var grid = this.getGridField();
|
||||||
|
|
||||||
@ -329,7 +405,7 @@
|
|||||||
var grid = self.getGridField();
|
var grid = self.getGridField();
|
||||||
if (grid.data("immediate-update") && postback)
|
if (grid.data("immediate-update") && postback)
|
||||||
{
|
{
|
||||||
grid.reload({
|
self.reload({
|
||||||
url: grid.data("url-reorder")
|
url: grid.data("url-reorder")
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ use SilverStripe\ORM\DB;
|
|||||||
use SilverStripe\ORM\ManyManyList;
|
use SilverStripe\ORM\ManyManyList;
|
||||||
use SilverStripe\ORM\SS_List;
|
use SilverStripe\ORM\SS_List;
|
||||||
use SilverStripe\ORM\SS_Map;
|
use SilverStripe\ORM\SS_Map;
|
||||||
|
use SilverStripe\Versioned\Versioned;
|
||||||
use SilverStripe\View\ViewableData;
|
use SilverStripe\View\ViewableData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -171,6 +172,35 @@ class GridFieldOrderableRows extends RequestHandler implements
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates sortable list
|
||||||
|
*
|
||||||
|
* @param SS_List $list
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function validateSortField(SS_List $list)
|
||||||
|
{
|
||||||
|
$field = $this->getSortField();
|
||||||
|
|
||||||
|
if ($list instanceof ManyManyList) {
|
||||||
|
$extra = $list->getExtraFields();
|
||||||
|
|
||||||
|
if ($extra && array_key_exists($field, $extra)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$classes = ClassInfo::dataClassesFor($list->dataClass());
|
||||||
|
|
||||||
|
foreach ($classes as $class) {
|
||||||
|
if (singleton($class)->hasDataBaseField($field)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \Exception("Couldn't find the sort field '" . $field . "'");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the table which contains the sort field.
|
* Gets the table which contains the sort field.
|
||||||
*
|
*
|
||||||
@ -504,11 +534,9 @@ class GridFieldOrderableRows extends RequestHandler implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If not a ManyManyList and using versioning, detect it.
|
// If not a ManyManyList and using versioning, detect it.
|
||||||
$isVersioned = false;
|
$this->validateSortField($list);
|
||||||
$class = $list->dataClass();
|
$class = $list->dataClass();
|
||||||
if ($class == $this->getSortTable($list)) {
|
$isVersioned = $class::has_extension(Versioned::class);
|
||||||
$isVersioned = $class::has_extension('SilverStripe\\ORM\\Versioning\\Versioned');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loop through each item, and update the sort values which do not
|
// Loop through each item, and update the sort values which do not
|
||||||
// match to order the objects.
|
// match to order the objects.
|
||||||
|
Loading…
Reference in New Issue
Block a user