Merge commit '4de269e53f5d3c313142d5d21c5c7ada314fa5ca'
Conflicts: javascript/GridFieldSortableRows.js - used theirs
This commit is contained in:
commit
e58bf81706
|
@ -0,0 +1,25 @@
|
|||
language: php
|
||||
php:
|
||||
- 5.3
|
||||
|
||||
env:
|
||||
- DB=MYSQL CORE_RELEASE=3.0
|
||||
- DB=MYSQL CORE_RELEASE=3.1
|
||||
- DB=PGSQL CORE_RELEASE=3.0
|
||||
- DB=PGSQL CORE_RELEASE=3.1
|
||||
- DB=SQLITE3 CORE_RELEASE=3.0
|
||||
- DB=SQLITE3 CORE_RELEASE=3.1
|
||||
|
||||
matrix:
|
||||
allow_failures:
|
||||
- env: DB=PGSQL CORE_RELEASE=3.1
|
||||
- env: DB=SQLITE3 CORE_RELEASE=3.1
|
||||
|
||||
before_script:
|
||||
- phpenv rehash
|
||||
- git clone git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support
|
||||
- php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss
|
||||
- cd ~/builds/ss
|
||||
|
||||
script:
|
||||
- phpunit sortablegridfield/tests/
|
|
@ -1,5 +1,6 @@
|
|||
SortableGridField
|
||||
=================
|
||||
[![Build Status](https://travis-ci.org/UndefinedOffset/SortableGridField.png)](https://travis-ci.org/UndefinedOffset/SortableGridField)
|
||||
|
||||
Adds drag and drop functionality to SilverStripe 3's GridField
|
||||
|
||||
|
@ -41,6 +42,3 @@ SortableGridField is not the same as SortableDataObject, since it is only a comp
|
|||
```sql
|
||||
UPDATE YourTable SET SortOrder=SortOrder+1;
|
||||
```
|
||||
|
||||
## @TODO
|
||||
* Optimize re-ordering of a has_many relationship when sorting on a single page
|
||||
|
|
|
@ -134,7 +134,12 @@ class GridFieldSortableRows implements GridField_HTMLProvider, GridField_ActionP
|
|||
$sng=singleton($gridField->getModelClass());
|
||||
$fieldType=$sng->db($this->sortColumn);
|
||||
if(!$fieldType || !($fieldType=='Int' || is_subclass_of('Int', $fieldType))) {
|
||||
user_error('Sort column '.$this->sortColumn.' must be an Int, column is of type '.$fieldType, E_USER_ERROR);
|
||||
if(is_array($fieldType)) {
|
||||
user_error('Sort column '.$this->sortColumn.' could not be found in '.$gridField->getModelClass().'\'s ancestry', E_USER_ERROR);
|
||||
}else {
|
||||
user_error('Sort column '.$this->sortColumn.' must be an Int, column is of type '.$fieldType, E_USER_ERROR);
|
||||
}
|
||||
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,10 +10,15 @@
|
|||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
|
||||
"require":
|
||||
{
|
||||
"silverstripe/framework": "3.*",
|
||||
"composer/installers": "*"
|
||||
},
|
||||
"support": {
|
||||
"issues": "https://github.com/undefinedoffset/SortableGridField/issues"
|
||||
},
|
||||
"extra": {
|
||||
"installer-name": "sortablegridfield"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,133 +1,133 @@
|
|||
(function ($) {
|
||||
$.entwine('ss', function ($) {
|
||||
$('.ss-gridfield .gridfield-sortablerows input').entwine({
|
||||
onmatch:function () {
|
||||
var self = this;
|
||||
var refCheckbox = $(this);
|
||||
|
||||
var gridField = this.getGridField();
|
||||
|
||||
if ($(this).is(':checked')) {
|
||||
gridField.find('table').addClass('dragSorting');
|
||||
} else {
|
||||
gridField.find('table').removeClass('dragSorting');
|
||||
}
|
||||
|
||||
gridField.find('tbody').sortable({
|
||||
opacity:0.6,
|
||||
disabled:($(this).is(':checked') == false),
|
||||
helper:function (e, ui) {
|
||||
//Maintains width of the columns
|
||||
ui.children().each(function () {
|
||||
$(this).width($(this).width());
|
||||
});
|
||||
|
||||
return ui;
|
||||
},
|
||||
update:function (event, ui) {
|
||||
var dataRows = [];
|
||||
var gridItems = gridField.getItems();
|
||||
var button = refCheckbox.parent().find('.sortablerows-toggle');
|
||||
|
||||
|
||||
for (var i = 0; i < gridItems.length; i++) {
|
||||
dataRows[i] = $(gridItems[i]).data('id');
|
||||
}
|
||||
|
||||
|
||||
self._makeRequest({data:[
|
||||
{
|
||||
name:button.attr('name'),
|
||||
value:button.val()
|
||||
},
|
||||
{
|
||||
name:'ItemIDs',
|
||||
value:dataRows
|
||||
}
|
||||
]});
|
||||
}
|
||||
}).disableSelection();
|
||||
|
||||
gridField.find('.datagrid-pagination .ss-gridfield-previouspage, .datagrid-pagination .ss-gridfield-nextpage').each(function () {
|
||||
$(this).droppable({
|
||||
disabled:$(this).is(':disabled'),
|
||||
accept:'tr.ss-gridfield-item',
|
||||
activeClass:'sortablerows-droptarget',
|
||||
tolerance:'pointer',
|
||||
drop:function (event, ui) {
|
||||
gridField.find('tbody').sortable('cancel');
|
||||
|
||||
var button = refCheckbox.parent().find('.sortablerows-sorttopage');
|
||||
var itemID = $(ui.draggable).data('id');
|
||||
var target = '';
|
||||
|
||||
|
||||
if ($(this).hasClass('ss-gridfield-previouspage')) {
|
||||
target = 'previouspage';
|
||||
} else if ($(this).hasClass('ss-gridfield-nextpage')) {
|
||||
target = 'nextpage';
|
||||
}
|
||||
|
||||
|
||||
//Move and Reload the grid
|
||||
gridField.reload({data:[
|
||||
{
|
||||
name:button.attr('name'),
|
||||
value:button.val()
|
||||
},
|
||||
{
|
||||
name:'ItemID',
|
||||
value:itemID
|
||||
},
|
||||
{
|
||||
name:'Target',
|
||||
value:target
|
||||
}
|
||||
]});
|
||||
|
||||
event.stopPropagation();
|
||||
event.stopImmediatePropagation();
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
onchange:function (e) {
|
||||
var gridField = this.getGridField();
|
||||
gridField.find('tbody').sortable('option', 'disabled', ($(this).is(':checked') == false));
|
||||
gridField.setState('GridFieldSortableRows', {sortableToggle:$(this).is(':checked')});
|
||||
|
||||
|
||||
var button = $(this).parent().find('.sortablerows-disablepagenator');
|
||||
gridField.reload({data:[
|
||||
{name:button.attr('name'), value:button.val()}
|
||||
]});
|
||||
},
|
||||
|
||||
_makeRequest:function (ajaxOpts, callback) {
|
||||
var gridField = this.getGridField();
|
||||
var form = gridField.closest('form'),
|
||||
focusedElName = gridField.find(':input:focus').attr('name'); // Save focused element for restoring after refresh
|
||||
|
||||
ajaxOpts.data = ajaxOpts.data.concat(form.find(':input').serializeArray());
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
$.ajax($.extend({}, {
|
||||
headers:{"X-Pjax":'CurrentField'},
|
||||
type:"POST",
|
||||
url:gridField.data('url'),
|
||||
dataType:'html',
|
||||
success:callback,
|
||||
error:function (e) {
|
||||
alert(ss.i18n._t('GRIDFIELD.ERRORINTRANSACTION'));
|
||||
}
|
||||
}, ajaxOpts));
|
||||
}
|
||||
});
|
||||
});
|
||||
(function($) {
|
||||
$.entwine('ss', function($) {
|
||||
$('.ss-gridfield .gridfield-sortablerows input').entwine({
|
||||
onmatch: function() {
|
||||
var self=this;
|
||||
var refCheckbox=$(this);
|
||||
var gridField=this.getGridField();
|
||||
var pageSort=false;
|
||||
|
||||
if($(this).is(':checked')) {
|
||||
gridField.find('table').addClass('dragSorting');
|
||||
}else {
|
||||
gridField.find('table').removeClass('dragSorting');
|
||||
}
|
||||
|
||||
gridField.find('tbody').sortable({
|
||||
opacity: 0.6,
|
||||
disabled: ($(this).is(':checked')==false),
|
||||
helper: function(e, ui) {
|
||||
//Maintains width of the columns
|
||||
ui.children().each(function() {
|
||||
$(this).width($(this).width());
|
||||
});
|
||||
|
||||
return ui;
|
||||
},
|
||||
update: function(event, ui) {
|
||||
if(pageSort) {
|
||||
pageSort=false;
|
||||
return;
|
||||
}
|
||||
|
||||
var dataRows=[];
|
||||
var gridItems=gridField.getItems();
|
||||
var button=refCheckbox.parent().find('.sortablerows-toggle');
|
||||
|
||||
|
||||
for(var i=0;i<gridItems.length;i++) {
|
||||
dataRows[i]=$(gridItems[i]).data('id');
|
||||
}
|
||||
|
||||
|
||||
self._makeRequest({data: [
|
||||
{
|
||||
name: button.attr('name'),
|
||||
value: button.val()
|
||||
},
|
||||
{
|
||||
name: 'ItemIDs',
|
||||
value: dataRows
|
||||
}
|
||||
]});
|
||||
}
|
||||
}).disableSelection();
|
||||
|
||||
gridField.find('.datagrid-pagination .ss-gridfield-previouspage, .datagrid-pagination .ss-gridfield-nextpage').each(function() {
|
||||
$(this).droppable({
|
||||
disabled: $(this).is(':disabled'),
|
||||
accept: 'tr.ss-gridfield-item',
|
||||
activeClass: 'sortablerows-droptarget',
|
||||
tolerance: 'pointer',
|
||||
drop: function(event, ui) {
|
||||
pageSort=true;
|
||||
|
||||
var button=refCheckbox.parent().find('.sortablerows-sorttopage');
|
||||
var itemID=$(ui.draggable).data('id');
|
||||
var target='';
|
||||
|
||||
|
||||
if($(this).hasClass('ss-gridfield-previouspage')) {
|
||||
target='previouspage';
|
||||
}else if($(this).hasClass('ss-gridfield-nextpage')) {
|
||||
target='nextpage';
|
||||
}
|
||||
|
||||
|
||||
//Move and Reload the grid
|
||||
gridField.reload({data: [
|
||||
{
|
||||
name: button.attr('name'),
|
||||
value: button.val()
|
||||
},
|
||||
{
|
||||
name: 'ItemID',
|
||||
value: itemID
|
||||
},
|
||||
{
|
||||
name: 'Target',
|
||||
value: target
|
||||
}
|
||||
]});
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
onchange: function(e) {
|
||||
var gridField=this.getGridField();
|
||||
gridField.find('tbody').sortable('option', 'disabled', ($(this).is(':checked')==false));
|
||||
gridField.setState('GridFieldSortableRows', {sortableToggle: $(this).is(':checked')});
|
||||
|
||||
|
||||
var button=$(this).parent().find('.sortablerows-disablepagenator');
|
||||
gridField.reload({data: [{name: button.attr('name'), value: button.val()}]});
|
||||
},
|
||||
|
||||
_makeRequest: function(ajaxOpts, callback) {
|
||||
var gridField=this.getGridField();
|
||||
var form = gridField.closest('form'),
|
||||
focusedElName = gridField.find(':input:focus').attr('name'); // Save focused element for restoring after refresh
|
||||
|
||||
ajaxOpts.data = ajaxOpts.data.concat(form.find(':input').serializeArray());
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
$.ajax($.extend({}, {
|
||||
headers: {"X-Pjax" : 'CurrentField'},
|
||||
type: "POST",
|
||||
url: gridField.data('url'),
|
||||
dataType: 'html',
|
||||
success: callback,
|
||||
error: function(e) {
|
||||
alert(ss.i18n._t('GRIDFIELD.ERRORINTRANSACTION'));
|
||||
}
|
||||
}, ajaxOpts));
|
||||
}
|
||||
});
|
||||
});
|
||||
})(jQuery);
|
Loading…
Reference in New Issue