mirror of
https://github.com/UndefinedOffset/SortableGridField.git
synced 2024-10-22 17:05:38 +02:00
Merge branch '2.0.x'
This commit is contained in:
commit
c0c0518ae9
@ -66,4 +66,4 @@ checks:
|
|||||||
argument_type_checks: true
|
argument_type_checks: true
|
||||||
|
|
||||||
filter:
|
filter:
|
||||||
paths: [code/*, tests/*]
|
paths: [src/*, tests/*]
|
||||||
|
23
.travis.yml
23
.travis.yml
@ -1,23 +1,22 @@
|
|||||||
language: php
|
language: php
|
||||||
|
|
||||||
sudo: false
|
php:
|
||||||
|
- 5.6
|
||||||
|
- 7.0
|
||||||
|
- 7.1
|
||||||
|
|
||||||
|
env:
|
||||||
|
- DB=MYSQL CORE_RELEASE=4.0
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- php: 5.6
|
- php: 7.1
|
||||||
env: DB=PGSQL CORE_RELEASE=3.6
|
env: DB=PGSQL CORE_RELEASE=4.0
|
||||||
- php: 5.6
|
|
||||||
env: DB=SQLITE3 CORE_RELEASE=3.6
|
|
||||||
- php: 5.6
|
|
||||||
env: DB=MYSQL CORE_RELEASE=3.6
|
|
||||||
- php: 5.6
|
|
||||||
env: DB=MYSQL CORE_RELEASE=3.5
|
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- phpenv rehash
|
- git clone git://github.com/silverstripe/silverstripe-travis-support.git ~/travis-support
|
||||||
- git clone git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support
|
|
||||||
- php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss
|
- php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss
|
||||||
- cd ~/builds/ss
|
- cd ~/builds/ss
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- phpunit sortablegridfield/tests/
|
- vendor/bin/phpunit sortablegridfield/tests
|
35
README.md
35
README.md
@ -2,20 +2,19 @@ SortableGridField
|
|||||||
=================
|
=================
|
||||||
[![Build Status](https://travis-ci.org/UndefinedOffset/SortableGridField.png)](https://travis-ci.org/UndefinedOffset/SortableGridField) ![helpfulrobot](https://helpfulrobot.io/undefinedoffset/sortablegridfield/badge)
|
[![Build Status](https://travis-ci.org/UndefinedOffset/SortableGridField.png)](https://travis-ci.org/UndefinedOffset/SortableGridField) ![helpfulrobot](https://helpfulrobot.io/undefinedoffset/sortablegridfield/badge)
|
||||||
|
|
||||||
Adds drag and drop functionality to SilverStripe 3's GridField
|
Adds drag and drop functionality to SilverStripe 4's GridField
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
* SilverStripe 3.x
|
* SilverStripe 4.x
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
__Composer (recommended):__
|
|
||||||
```
|
Installation is supported via composer only
|
||||||
|
|
||||||
|
```sh
|
||||||
composer require undefinedoffset/sortablegridfield
|
composer require undefinedoffset/sortablegridfield
|
||||||
```
|
```
|
||||||
|
|
||||||
If you prefer you may also install manually:
|
|
||||||
* Download the module from here https://github.com/UndefinedOffset/SortableGridField/archive/master.zip
|
|
||||||
* Extract the downloaded archive into your site root so that the destination folder is called SortableGridField, opening the extracted folder should contain _config.php in the root along with other files/folders
|
|
||||||
* Run dev/build?flush=all to regenerate the manifest
|
* Run dev/build?flush=all to regenerate the manifest
|
||||||
* Upon entering the cms and using GridFieldSortableRows component for the first time you make need to add ?flush=all to the end of the address to force the templates to regenerate
|
* Upon entering the cms and using GridFieldSortableRows component for the first time you make need to add ?flush=all to the end of the address to force the templates to regenerate
|
||||||
|
|
||||||
@ -30,10 +29,11 @@ public function getMyManyManyRelationship() {
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
To enable drag and drop sorting on the grid field add the following to your grid field's config
|
To enable drag and drop sorting on the grid field add the following to your grid field's config, also make sure you add the namespace ``UndefinedOffset\SortableGridField\Forms`` to your file.
|
||||||
*Grid Field Config*
|
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows; //Namespaces should be added to the top of your file
|
||||||
|
|
||||||
$myGridConfig->addComponent(new GridFieldSortableRows('{Column to store sort}'));
|
$myGridConfig->addComponent(new GridFieldSortableRows('{Column to store sort}'));
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -50,6 +50,8 @@ GridFieldSortableRows provides 4 "events" onBeforeGridFieldRowSort(), onAfterGri
|
|||||||
#### Appending to the top instead of the bottom
|
#### Appending to the top instead of the bottom
|
||||||
By default GridFieldSortableRows appends to the bottom of the list for performance on large data sets, however you can set new records to append new records to the top by calling setAppendToTop(true) on your GridFieldSortableRows instance.
|
By default GridFieldSortableRows appends to the bottom of the list for performance on large data sets, however you can set new records to append new records to the top by calling setAppendToTop(true) on your GridFieldSortableRows instance.
|
||||||
```php
|
```php
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows; //Namespaces should be added to the top of your file
|
||||||
|
|
||||||
$myGridConfig->addComponent($sortable=new GridFieldSortableRows('SortOrder'));
|
$myGridConfig->addComponent($sortable=new GridFieldSortableRows('SortOrder'));
|
||||||
$sortable->setAppendToTop(true);
|
$sortable->setAppendToTop(true);
|
||||||
```
|
```
|
||||||
@ -57,6 +59,8 @@ $sortable->setAppendToTop(true);
|
|||||||
#### Working with versioned records
|
#### Working with versioned records
|
||||||
By default GridFieldSortableRows does not update any other stage for versioned than the base stage. However you can enable this by calling setUpdateVersionedStage() and passing in the name of the stage you want to update along with the base stage. For example passing in "Live" will also update the "Live" stage when any sort happens.
|
By default GridFieldSortableRows does not update any other stage for versioned than the base stage. However you can enable this by calling setUpdateVersionedStage() and passing in the name of the stage you want to update along with the base stage. For example passing in "Live" will also update the "Live" stage when any sort happens.
|
||||||
```php
|
```php
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows; //Namespaces should be added to the top of your file
|
||||||
|
|
||||||
$myGridConfig->addComponent($sortable=new GridFieldSortableRows('SortOrder'));
|
$myGridConfig->addComponent($sortable=new GridFieldSortableRows('SortOrder'));
|
||||||
$sortable->setUpdateVersionedStage('Live');
|
$sortable->setUpdateVersionedStage('Live');
|
||||||
```
|
```
|
||||||
@ -64,26 +68,21 @@ $sortable->setUpdateVersionedStage('Live');
|
|||||||
#### Overriding the default relationship name
|
#### Overriding the default relationship name
|
||||||
By default the relationship name comes from the name of the GridField, however you can override this lookup by calling setCustomRelationName() and passing in the name of the relationship. This allows for you to have multiple GridFields on the same form interacting with the same many_many list maybe filtered slightly differently.
|
By default the relationship name comes from the name of the GridField, however you can override this lookup by calling setCustomRelationName() and passing in the name of the relationship. This allows for you to have multiple GridFields on the same form interacting with the same many_many list maybe filtered slightly differently.
|
||||||
```php
|
```php
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows; //Namespaces should be added to the top of your file
|
||||||
|
|
||||||
$myGridConfig->addComponent($sortable=new GridFieldSortableRows('SortOrder'));
|
$myGridConfig->addComponent($sortable=new GridFieldSortableRows('SortOrder'));
|
||||||
$sortable->setCustomRelationName('MyRelationship');
|
$sortable->setCustomRelationName('MyRelationship');
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Migrating from SilverStripe 2.4 and Data Object Manager's SortableDataObject
|
|
||||||
SortableGridField is not the same as SortableDataObject, since it is only a component of GridField it does not have the ability to catch the object when it is saved for the first time. So SortableGridField uses 1 as the first sort index because 0 is the default for an integer field/column in the database. For migrations from 2.4 with SortableDataObject you need to setup your DataObject based on the instructions above however you must name your sort column "SortOrder" to maintain your sort indexes defined by SortableDataObject. Then you need to run the following query on the table containing your sort field, for many_many relationships this will be something like {RelationshipClass}_{RelationshipName}. This query will maintain your sort order from SortableDataObject but increment the index by 1 giving it a starting number of 1.
|
|
||||||
|
|
||||||
```sql
|
|
||||||
UPDATE YourTable SET SortOrder=SortOrder+1;
|
|
||||||
```
|
|
||||||
|
|
||||||
## Reporting an issue
|
## Reporting an issue
|
||||||
When you're reporting an issue please ensure you specify what version of SilverStripe you are using i.e. 3.0.5, 3.1beta3, 3.0-master etc. Also be sure to include any JavaScript or PHP errors you receive, for PHP errors please ensure you include the full stack trace. Also please include your implementation code (where your setting up your grid field) as well as how you produced the issue. You may also be asked to provide some of the classes to aid in re-producing the issue. Stick with the issue, remember that you seen the issue not the maintainer of the module so it may take allot of questions to arrive at a fix or answer.
|
When you're reporting an issue please ensure you specify what version of SilverStripe you are using i.e. 3.0.5, 3.1beta3, 3.0-master etc. Also be sure to include any JavaScript or PHP errors you receive, for PHP errors please ensure you include the full stack trace. Also please include your implementation code (where your setting up your grid field) as well as how you produced the issue. You may also be asked to provide some of the classes to aid in re-producing the issue. Stick with the issue, remember that you seen the issue not the maintainer of the module so it may take allot of questions to arrive at a fix or answer.
|
||||||
|
|
||||||
### Notes
|
### Notes
|
||||||
* When using with GridFieldManyRelationHandler make sure that you add GridFieldSortableRows to your config before for example GridFieldManyRelationHandler:
|
* When using with GridFieldManyRelationHandler make sure that you add GridFieldSortableRows to your config before for example GridFieldManyRelationHandler:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows; //Namespaces should be added to the top of your file
|
||||||
|
|
||||||
$config->addComponent(new GridFieldSortableRows('SortOrder'), 'GridFieldManyRelationHandler');
|
$config->addComponent(new GridFieldSortableRows('SortOrder'), 'GridFieldManyRelationHandler');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1,3 +1,2 @@
|
|||||||
<?php
|
<?php
|
||||||
define('SORTABLE_GRIDFIELD_BASE', basename(dirname(__FILE__)));
|
define('SORTABLE_GRIDFIELD_BASE', basename(dirname(__FILE__)));
|
||||||
?>
|
|
@ -1,680 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* This component provides a checkbox which when checked enables drag-and-drop re-ordering of elements displayed in a {@link GridField}
|
|
||||||
*
|
|
||||||
* @package forms
|
|
||||||
*/
|
|
||||||
class GridFieldSortableRows implements GridField_HTMLProvider, GridField_ActionProvider, GridField_DataManipulator {
|
|
||||||
protected $sortColumn;
|
|
||||||
protected $disable_selection=true;
|
|
||||||
protected $append_to_top=false;
|
|
||||||
protected $update_versioned_stage=null;
|
|
||||||
protected $custom_relation_name=null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $sortColumn Column that should be used to update the sort information
|
|
||||||
* @param bool $disableSelection Disable selection on the GridField when dragging
|
|
||||||
* @param string $updateVersionStage Name of the versioned stage to update this disabled by default unless this is set
|
|
||||||
* @param string $customRelationName Name of the relationship to use, if left null the name is determined from the GridField's name
|
|
||||||
*/
|
|
||||||
public function __construct($sortColumn, $disableSelection = true, $updateVersionStage = null, $customRelationName = null) {
|
|
||||||
$this->sortColumn = $sortColumn;
|
|
||||||
$this->disable_selection = $disableSelection;
|
|
||||||
$this->update_versioned_stage = $updateVersionStage;
|
|
||||||
$this->custom_relation_name = $customRelationName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a map where the keys are fragment names and the values are pieces of HTML to add to these fragments.
|
|
||||||
* @param GridField $gridField Grid Field Reference
|
|
||||||
* @return Array Map where the keys are fragment names and the values are pieces of HTML to add to these fragments.
|
|
||||||
*/
|
|
||||||
public function getHTMLFragments($gridField) {
|
|
||||||
$dataList = $gridField->getList();
|
|
||||||
|
|
||||||
if(class_exists('UnsavedRelationList') && $dataList instanceof UnsavedRelationList) {
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
$state = $gridField->State->GridFieldSortableRows;
|
|
||||||
if(!is_bool($state->sortableToggle)) {
|
|
||||||
$state->sortableToggle = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Ensure user can edit
|
|
||||||
if(!singleton($gridField->getModelClass())->canEdit()){
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Sort order toggle
|
|
||||||
$sortOrderToggle = GridField_FormAction::create(
|
|
||||||
$gridField,
|
|
||||||
'sortablerows-toggle',
|
|
||||||
'sorttoggle',
|
|
||||||
'sortableRowsToggle',
|
|
||||||
null
|
|
||||||
)->addExtraClass('sortablerows-toggle');
|
|
||||||
|
|
||||||
|
|
||||||
$sortOrderSave = GridField_FormAction::create(
|
|
||||||
$gridField,
|
|
||||||
'sortablerows-savesort',
|
|
||||||
'savesort',
|
|
||||||
'saveGridRowSort',
|
|
||||||
null
|
|
||||||
)->addExtraClass('sortablerows-savesort');
|
|
||||||
|
|
||||||
|
|
||||||
//Sort to Page Action
|
|
||||||
$sortToPage = GridField_FormAction::create(
|
|
||||||
$gridField,
|
|
||||||
'sortablerows-sorttopage',
|
|
||||||
'sorttopage',
|
|
||||||
'sortToPage',
|
|
||||||
null
|
|
||||||
)->addExtraClass('sortablerows-sorttopage');
|
|
||||||
|
|
||||||
|
|
||||||
$data = array('SortableToggle' => $sortOrderToggle,
|
|
||||||
'SortOrderSave' => $sortOrderSave,
|
|
||||||
'SortToPage' => $sortToPage,
|
|
||||||
'Checked' => ($state->sortableToggle == true ? ' checked = "checked"':''),
|
|
||||||
'List' => $dataList);
|
|
||||||
|
|
||||||
$forTemplate = new ArrayData($data);
|
|
||||||
|
|
||||||
|
|
||||||
//Inject Requirements
|
|
||||||
$custom = Config::inst()->get('GridFieldSortableRows', 'Base');
|
|
||||||
$base = $custom ?: SORTABLE_GRIDFIELD_BASE;
|
|
||||||
|
|
||||||
Requirements::css($base . '/css/GridFieldSortableRows.css');
|
|
||||||
Requirements::javascript($base . '/javascript/GridFieldSortableRows.js');
|
|
||||||
|
|
||||||
|
|
||||||
$args = array('Colspan' => count($gridField->getColumns()), 'ID' => $gridField->ID(), 'DisableSelection' => $this->disable_selection);
|
|
||||||
|
|
||||||
|
|
||||||
$fragments=array('header' => $forTemplate->renderWith('GridFieldSortableRows', $args));
|
|
||||||
|
|
||||||
if($gridField->getConfig()->getComponentByType('GridFieldPaginator')) {
|
|
||||||
$fragments['after']=$forTemplate->renderWith('GridFieldSortableRows_paginator');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $fragments;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Manipulate the datalist as needed by this grid modifier.
|
|
||||||
* @param GridField $gridField Grid Field Reference
|
|
||||||
* @param SS_List $dataList Data List to adjust
|
|
||||||
* @return DataList Modified Data List
|
|
||||||
*/
|
|
||||||
public function getManipulatedData(GridField $gridField, SS_List $dataList) {
|
|
||||||
//Detect and correct items with a sort column value of 0 (push to bottom)
|
|
||||||
$this->fixSortColumn($gridField, $dataList);
|
|
||||||
|
|
||||||
|
|
||||||
$headerState = $gridField->State->GridFieldSortableHeader;
|
|
||||||
$state = $gridField->State->GridFieldSortableRows;
|
|
||||||
if ((!is_bool($state->sortableToggle) || $state->sortableToggle===false) && $headerState && is_string($headerState->SortColumn) && is_string($headerState->SortDirection)) {
|
|
||||||
return $dataList->sort($headerState->SortColumn, $headerState->SortDirection);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($state->sortableToggle === true) {
|
|
||||||
$gridField->getConfig()->removeComponentsByType('GridFieldFilterHeader');
|
|
||||||
$gridField->getConfig()->removeComponentsByType('GridFieldSortableHeader');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $dataList->sort($this->sortColumn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets if new records should be appended to the top or the bottom of the list
|
|
||||||
* @param bool $value Boolean true to append to the top false to append to the bottom
|
|
||||||
* @return GridFieldSortableRows Returns the current instance
|
|
||||||
*/
|
|
||||||
public function setAppendToTop($value) {
|
|
||||||
$this->append_to_top=$value;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param bool $value Boolean true to disable selection of table contents false to enable selection
|
|
||||||
* @return GridFieldSortableRows Returns the current instance
|
|
||||||
*/
|
|
||||||
public function setDisableSelection($value){
|
|
||||||
$this->disable_selection = $value;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the suffix of the versioned stage that should be updated along side the default stage
|
|
||||||
* @param string $value Versioned Stage to update this is disabled by default unless this is set
|
|
||||||
* @return GridFieldSortableRows Returns the current instance
|
|
||||||
*/
|
|
||||||
public function setUpdateVersionedStage($value) {
|
|
||||||
$this->update_versioned_stage=$value;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the name of the relationship to use, by default the name is determined from the GridField's name
|
|
||||||
* @param string $value Name of the relationship to use, by default the name is determined from the GridField's name
|
|
||||||
* @return GridFieldSortableRows Returns the current instance
|
|
||||||
*/
|
|
||||||
public function setCustomRelationName($value) {
|
|
||||||
$this->custom_relation_name=$value;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detects and corrects items with a sort column value of 0, by appending them to the bottom of the list
|
|
||||||
* @param GridField $gridField Grid Field Reference
|
|
||||||
* @param SS_List $dataList Data List of items to be checked
|
|
||||||
*/
|
|
||||||
protected function fixSortColumn($gridField, SS_List $dataList) {
|
|
||||||
if(class_exists('UnsavedRelationList') && $dataList instanceof UnsavedRelationList) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$list=clone $dataList;
|
|
||||||
$list=$list->alterDataQuery(function($query, SS_List $tmplist) {
|
|
||||||
$query->limit(array());
|
|
||||||
return $query;
|
|
||||||
});
|
|
||||||
|
|
||||||
$many_many = ($list instanceof ManyManyList);
|
|
||||||
if (!$many_many) {
|
|
||||||
$sng=singleton($gridField->getModelClass());
|
|
||||||
$fieldType=$sng->db($this->sortColumn);
|
|
||||||
if(!$fieldType || !(strtolower($fieldType) == 'int' || is_subclass_of($fieldType, 'Int'))) {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$max = $list->Max($this->sortColumn);
|
|
||||||
$list=$list->filter($this->sortColumn, 0)->sort("Created,ID");
|
|
||||||
if($list->Count()>0) {
|
|
||||||
$owner = $gridField->Form->getRecord();
|
|
||||||
$sortColumn = $this->sortColumn;
|
|
||||||
$i = 1;
|
|
||||||
|
|
||||||
if ($many_many) {
|
|
||||||
list($parentClass, $componentClass, $parentField, $componentField, $table) = $owner->many_many((!empty($this->custom_relation_name) ? $this->custom_relation_name:$gridField->getName()));
|
|
||||||
$extraFields=$owner->many_many_extraFields((!empty($this->custom_relation_name) ? $this->custom_relation_name:$gridField->getName()));
|
|
||||||
|
|
||||||
if(!$extraFields || !array_key_exists($this->sortColumn, $extraFields) || !($extraFields[$this->sortColumn]=='Int' || is_subclass_of('Int', $extraFields[$this->sortColumn]))) {
|
|
||||||
user_error('Sort column '.$this->sortColumn.' must be an Int, column is of type '.$extraFields[$this->sortColumn], E_USER_ERROR);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
//Find table containing the sort column
|
|
||||||
$table=false;
|
|
||||||
$class=$gridField->getModelClass();
|
|
||||||
|
|
||||||
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
|
||||||
if(!empty($db) && array_key_exists($sortColumn, $db)) {
|
|
||||||
$table=$class;
|
|
||||||
}else {
|
|
||||||
$classes=ClassInfo::ancestry($class, true);
|
|
||||||
foreach($classes as $class) {
|
|
||||||
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
|
||||||
if(!empty($db) && array_key_exists($sortColumn, $db)) {
|
|
||||||
$table=$class;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if($table===false) {
|
|
||||||
user_error('Sort column '.$this->sortColumn.' could not be found in '.$gridField->getModelClass().'\'s ancestry', E_USER_ERROR);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$baseDataClass=ClassInfo::baseDataClass($gridField->getModelClass());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Start transaction if supported
|
|
||||||
if(DB::getConn()->supportsTransactions()) {
|
|
||||||
DB::getConn()->transactionStart();
|
|
||||||
}
|
|
||||||
|
|
||||||
$idCondition=null;
|
|
||||||
if($this->append_to_top && !($list instanceof RelationList)) {
|
|
||||||
$idCondition='"ID" IN(\''.implode("','", $dataList->getIDList()).'\')';
|
|
||||||
}
|
|
||||||
|
|
||||||
if($this->append_to_top) {
|
|
||||||
$topIncremented=array();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($list as $obj) {
|
|
||||||
if($many_many) {
|
|
||||||
if($this->append_to_top) {
|
|
||||||
//Upgrade all the records (including the last inserted from 0 to 1)
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn . '" = "' . $sortColumn .'"+1'
|
|
||||||
. ' WHERE "' . $parentField . '" = ' . $owner->ID . (!empty($topIncremented) ? ' AND "' . $componentField . '" NOT IN(\''.implode('\',\'', $topIncremented).'\')':''));
|
|
||||||
|
|
||||||
$topIncremented[]=$obj->ID;
|
|
||||||
}else {
|
|
||||||
//Append the last record to the bottom
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn .'" = ' . ($max + $i)
|
|
||||||
. ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
|
||||||
}
|
|
||||||
}else if($this->append_to_top) {
|
|
||||||
//Upgrade all the records (including the last inserted from 0 to 1)
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn . '" = "' . $sortColumn .'"+1'
|
|
||||||
. ' WHERE '.($list instanceof RelationList ? '"' . $list->foreignKey . '" = '. $owner->ID:$idCondition) . (!empty($topIncremented) ? ' AND "ID" NOT IN(\''.implode('\',\'', $topIncremented).'\')':''));
|
|
||||||
|
|
||||||
if($this->update_versioned_stage && class_exists($table) && Object::has_extension($table, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "' . $sortColumn . '" = "' . $sortColumn .'"+1'
|
|
||||||
. ' WHERE '. ($list instanceof RelationList ? '"' . $list->foreignKey . '" = '. $owner->ID:$idCondition) . (!empty($topIncremented) ? ' AND "ID" NOT IN(\''.implode('\',\'', $topIncremented).'\')':''));
|
|
||||||
}
|
|
||||||
|
|
||||||
$topIncremented[]=$obj->ID;
|
|
||||||
}else {
|
|
||||||
//Append the last record to the bottom
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn . '" = ' . ($max + $i)
|
|
||||||
. ' WHERE "ID" = '. $obj->ID);
|
|
||||||
//LastEdited
|
|
||||||
DB::query('UPDATE "' . $baseDataClass
|
|
||||||
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
|
||||||
. ' WHERE "ID" = '. $obj->ID);
|
|
||||||
|
|
||||||
if($this->update_versioned_stage && class_exists($table) && Object::has_extension($table, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "' . $sortColumn . '" = ' . ($max + $i)
|
|
||||||
. ' WHERE "ID" = '. $obj->ID);
|
|
||||||
|
|
||||||
if(Object::has_extension($baseDataClass, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $baseDataClass . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
|
||||||
. ' WHERE "ID" = '. $obj->ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Update LastEdited for affected records when using append to top on a many_many relationship
|
|
||||||
if(!$many_many && $this->append_to_top && count($topIncremented)>0) {
|
|
||||||
DB::query('UPDATE "' . $baseDataClass
|
|
||||||
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
|
||||||
. ' WHERE "ID" IN(\''.implode('\',\'', $topIncremented).'\')');
|
|
||||||
|
|
||||||
if($this->update_versioned_stage && class_exists($table) && Object::has_extension($table, 'Versioned') && Object::has_extension($baseDataClass, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $baseDataClass . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
|
||||||
. ' WHERE "ID" IN(\''.implode('\',\'', $topIncremented).'\')');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//End transaction if supported
|
|
||||||
if(DB::getConn()->supportsTransactions()) {
|
|
||||||
DB::getConn()->transactionEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a list of the actions handled by this action provider.
|
|
||||||
* @param GridField $gridField Grid Field Reference
|
|
||||||
* @return Array Array with action identifier strings.
|
|
||||||
*/
|
|
||||||
public function getActions($gridField) {
|
|
||||||
return array('saveGridRowSort', 'sortableRowsToggle', 'sortToPage');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an action on the given grid field.
|
|
||||||
* @param GridField $gridField Grid Field Reference
|
|
||||||
* @param String $actionName Action identifier, see {@link getActions()}.
|
|
||||||
* @param Array $arguments Arguments relevant for this
|
|
||||||
* @param Array $data All form data
|
|
||||||
*/
|
|
||||||
public function handleAction(GridField $gridField, $actionName, $arguments, $data) {
|
|
||||||
$state = $gridField->State->GridFieldSortableRows;
|
|
||||||
if (!is_bool($state->sortableToggle)) {
|
|
||||||
$state->sortableToggle = false;
|
|
||||||
} else if ($state->sortableToggle == true) {
|
|
||||||
$gridField->getConfig()->removeComponentsByType('GridFieldFilterHeader');
|
|
||||||
$gridField->getConfig()->removeComponentsByType('GridFieldSortableHeader');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($actionName == 'savegridrowsort') {
|
|
||||||
return $this->saveGridRowSort($gridField, $data);
|
|
||||||
} else if ($actionName == 'sorttopage') {
|
|
||||||
return $this->sortToPage($gridField, $data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles saving of the row sort order
|
|
||||||
* @param GridField $gridField Grid Field Reference
|
|
||||||
* @param Array $data Data submitted in the request
|
|
||||||
*/
|
|
||||||
protected function saveGridRowSort(GridField $gridField, $data) {
|
|
||||||
$dataList = $gridField->getList();
|
|
||||||
|
|
||||||
if(class_exists('UnsavedRelationList') && $dataList instanceof UnsavedRelationList) {
|
|
||||||
user_error('Cannot sort an UnsavedRelationList', E_USER_ERROR);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!singleton($gridField->getModelClass())->canEdit()){
|
|
||||||
throw new ValidationException(_t('GridFieldSortableRows.EditPermissionsFailure', "No edit permissions"),0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($data['ItemIDs'])) {
|
|
||||||
user_error('No items to sort', E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
$className = $gridField->getModelClass();
|
|
||||||
$owner = $gridField->Form->getRecord();
|
|
||||||
$items = clone $gridField->getList();
|
|
||||||
$many_many = ($items instanceof ManyManyList);
|
|
||||||
$sortColumn = $this->sortColumn;
|
|
||||||
$pageOffset = 0;
|
|
||||||
|
|
||||||
if ($paginator = $gridField->getConfig()->getComponentsByType('GridFieldPaginator')->First()) {
|
|
||||||
$pageState = $gridField->State->GridFieldPaginator;
|
|
||||||
|
|
||||||
if($pageState->currentPage && is_int($pageState->currentPage) && $pageState->currentPage>1) {
|
|
||||||
$pageOffset = $paginator->getItemsPerPage() * ($pageState->currentPage - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($many_many) {
|
|
||||||
list($parentClass, $componentClass, $parentField, $componentField, $table) = $owner->many_many((!empty($this->custom_relation_name) ? $this->custom_relation_name:$gridField->getName()));
|
|
||||||
}else {
|
|
||||||
//Find table containing the sort column
|
|
||||||
$table=false;
|
|
||||||
$class=$gridField->getModelClass();
|
|
||||||
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
|
||||||
if(!empty($db) && array_key_exists($sortColumn, $db)) {
|
|
||||||
$table=$class;
|
|
||||||
}else {
|
|
||||||
$classes=ClassInfo::ancestry($class, true);
|
|
||||||
foreach($classes as $class) {
|
|
||||||
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
|
||||||
if(!empty($db) && array_key_exists($sortColumn, $db)) {
|
|
||||||
$table=$class;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if($table===false) {
|
|
||||||
user_error('Sort column '.$this->sortColumn.' could not be found in '.$gridField->getModelClass().'\'s ancestry', E_USER_ERROR);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$baseDataClass=ClassInfo::baseDataClass($gridField->getModelClass());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Event to notify the Controller or owner DataObject before list sort
|
|
||||||
if($owner && $owner instanceof DataObject && method_exists($owner, 'onBeforeGridFieldRowSort')) {
|
|
||||||
$owner->onBeforeGridFieldRowSort(clone $items);
|
|
||||||
}else if(Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onBeforeGridFieldRowSort')) {
|
|
||||||
Controller::curr()->onBeforeGridFieldRowSort(clone $items);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Start transaction if supported
|
|
||||||
if(DB::getConn()->supportsTransactions()) {
|
|
||||||
DB::getConn()->transactionStart();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Perform sorting
|
|
||||||
$ids = explode(',', $data['ItemIDs']);
|
|
||||||
for($sort = 0;$sort<count($ids);$sort++) {
|
|
||||||
$id = intval($ids[$sort]);
|
|
||||||
if ($many_many) {
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn.'" = ' . (($sort + 1) + $pageOffset)
|
|
||||||
. ' WHERE "' . $componentField . '" = ' . $id . ' AND "' . $parentField . '" = ' . $owner->ID);
|
|
||||||
} else {
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
|
||||||
. ' WHERE "ID" = '. $id);
|
|
||||||
|
|
||||||
DB::query('UPDATE "' . $baseDataClass
|
|
||||||
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
|
||||||
. ' WHERE "ID" = '. $id);
|
|
||||||
|
|
||||||
if($this->update_versioned_stage && class_exists($table) && Object::has_extension($table, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
|
||||||
. ' WHERE "ID" = '. $id);
|
|
||||||
|
|
||||||
if(Object::has_extension($baseDataClass, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $baseDataClass . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
|
||||||
. ' WHERE "ID" = '. $id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//End transaction if supported
|
|
||||||
if(DB::getConn()->supportsTransactions()) {
|
|
||||||
DB::getConn()->transactionEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Event to notify the Controller or owner DataObject after list sort
|
|
||||||
if($owner && $owner instanceof DataObject && method_exists($owner, 'onAfterGridFieldRowSort')) {
|
|
||||||
$owner->onAfterGridFieldRowSort(clone $items);
|
|
||||||
}else if(Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onAfterGridFieldRowSort')) {
|
|
||||||
Controller::curr()->onAfterGridFieldRowSort(clone $items);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles sorting across pages
|
|
||||||
* @param GridField $gridField Grid Field Reference
|
|
||||||
* @param Array $data Data submitted in the request
|
|
||||||
*/
|
|
||||||
protected function sortToPage(GridField $gridField, $data) {
|
|
||||||
if (!$paginator = $gridField->getConfig()->getComponentsByType('GridFieldPaginator')->First()) {
|
|
||||||
user_error('Paginator not detected', E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($data['ItemID'])) {
|
|
||||||
user_error('No item to sort', E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($data['Target'])) {
|
|
||||||
user_error('No target page', E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$className = $gridField->getModelClass();
|
|
||||||
$owner = $gridField->Form->getRecord();
|
|
||||||
$items = clone $gridField->getList();
|
|
||||||
$many_many = ($items instanceof ManyManyList);
|
|
||||||
$sortColumn = $this->sortColumn;
|
|
||||||
$targetItem = $items->byID(intval($data['ItemID']));
|
|
||||||
|
|
||||||
if (!$targetItem) {
|
|
||||||
user_error('Target item not found', E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
$currentPage = 1;
|
|
||||||
|
|
||||||
|
|
||||||
$pageState = $gridField->State->GridFieldPaginator;
|
|
||||||
if($pageState->currentPage && $pageState->currentPage>1) {
|
|
||||||
$currentPage = $pageState->currentPage;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($many_many) {
|
|
||||||
list($parentClass, $componentClass, $parentField, $componentField, $table) = $owner->many_many((!empty($this->custom_relation_name) ? $this->custom_relation_name:$gridField->getName()));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($data['Target'] == 'previouspage') {
|
|
||||||
$items = $items->limit($paginator->getItemsPerPage() + 1, ($paginator->getItemsPerPage() * ($currentPage - 1)) - 1);
|
|
||||||
} else if ($data['Target'] == 'nextpage') {
|
|
||||||
$items = $items->limit($paginator->getItemsPerPage() + 1, $paginator->getItemsPerPage() * ($currentPage - 1));
|
|
||||||
} else {
|
|
||||||
user_error('Not implemented: '.$data['Target'], E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
$sortPositions = $items->column($sortColumn);
|
|
||||||
|
|
||||||
|
|
||||||
//Event to notify the Controller or owner DataObject before list sort
|
|
||||||
if($owner && $owner instanceof DataObject && method_exists($owner, 'onBeforeGridFieldPageSort')) {
|
|
||||||
$owner->onBeforeGridFieldPageSort(clone $items);
|
|
||||||
}else if(Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onBeforeGridFieldPageSort')) {
|
|
||||||
Controller::curr()->onBeforeGridFieldPageSort(clone $items);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Find the sort column
|
|
||||||
if($this->update_versioned_stage && Object::has_extension($className, 'Versioned')) {
|
|
||||||
$table=false;
|
|
||||||
$classes=ClassInfo::ancestry($className, true);
|
|
||||||
foreach($classes as $class) {
|
|
||||||
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
|
||||||
if(!empty($db) && array_key_exists($sortColumn, $db)) {
|
|
||||||
$table=$class;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if($table===false) {
|
|
||||||
user_error('Sort column '.$this->sortColumn.' could not be found in '.$gridField->getModelClass().'\'s ancestry', E_USER_ERROR);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Start transaction if supported
|
|
||||||
if(DB::getConn()->supportsTransactions()) {
|
|
||||||
DB::getConn()->transactionStart();
|
|
||||||
}
|
|
||||||
|
|
||||||
if($data['Target']=='previouspage') {
|
|
||||||
if ($many_many) {
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn.'" = ' . $sortPositions[0]
|
|
||||||
. ' WHERE "' . $componentField . '" = ' . $targetItem->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
|
||||||
} else {
|
|
||||||
$targetItem->$sortColumn = $sortPositions[0];
|
|
||||||
$targetItem->write();
|
|
||||||
|
|
||||||
if($this->update_versioned_stage && Object::has_extension($className, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "' . $sortColumn.'" = ' . $sortPositions[0]
|
|
||||||
. ' WHERE "ID" = ' . $targetItem->ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$i = 1;
|
|
||||||
foreach ($items as $obj) {
|
|
||||||
if ($obj->ID == $targetItem->ID) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($many_many) {
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn.'" = ' . $sortPositions[$i]
|
|
||||||
. ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
|
||||||
} else {
|
|
||||||
$obj->$sortColumn = $sortPositions[$i];
|
|
||||||
$obj->write();
|
|
||||||
|
|
||||||
if($this->update_versioned_stage && Object::has_extension($className, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "' . $sortColumn.'" = ' . $sortPositions[$i]
|
|
||||||
. ' WHERE "ID" = ' . $obj->ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($many_many) {
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn.'" = ' . $sortPositions[count($sortPositions) - 1]
|
|
||||||
. ' WHERE "' . $componentField . '" = ' . $targetItem->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
|
||||||
} else {
|
|
||||||
$targetItem->$sortColumn = $sortPositions[count($sortPositions) - 1];
|
|
||||||
$targetItem->write();
|
|
||||||
|
|
||||||
if($this->update_versioned_stage && Object::has_extension($className, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "' . $sortColumn.'" = ' . $sortPositions[count($sortPositions) - 1]
|
|
||||||
. ' WHERE "ID" = ' . $targetItem->ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$i = 0;
|
|
||||||
foreach ($items as $obj) {
|
|
||||||
if ($obj->ID == $targetItem->ID) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($many_many) {
|
|
||||||
DB::query('UPDATE "' . $table
|
|
||||||
. '" SET "' . $sortColumn.'" = ' . $sortPositions[$i]
|
|
||||||
. ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
|
||||||
} else {
|
|
||||||
$obj->$sortColumn = $sortPositions[$i];
|
|
||||||
$obj->write();
|
|
||||||
|
|
||||||
if($this->update_versioned_stage && Object::has_extension($className, 'Versioned')) {
|
|
||||||
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
|
||||||
. '" SET "' . $sortColumn.'" = ' . $sortPositions[$i]
|
|
||||||
. ' WHERE "ID" = ' . $obj->ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//End transaction if supported
|
|
||||||
if(DB::getConn()->supportsTransactions()) {
|
|
||||||
DB::getConn()->transactionEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Event to notify the Controller or owner DataObject after list sort
|
|
||||||
if($owner && $owner instanceof DataObject && method_exists($owner, 'onAfterGridFieldPageSort')) {
|
|
||||||
$owner->onAfterGridFieldPageSort(clone $items);
|
|
||||||
}else if(Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onAfterGridFieldPageSort')) {
|
|
||||||
Controller::curr()->onAfterGridFieldPageSort(clone $items);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "undefinedoffset/sortablegridfield",
|
"name": "undefinedoffset/sortablegridfield",
|
||||||
"description": "Adds drag and drop functionality to SilverStripe 3.0's GridField",
|
"description": "Adds drag and drop functionality to SilverStripe 4.x's GridField",
|
||||||
"type": "silverstripe-module",
|
"type": "silverstripe-module",
|
||||||
"keywords": ["silverstripe", "gridfield"],
|
"keywords": ["silverstripe", "gridfield"],
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
@ -11,15 +11,23 @@
|
|||||||
"role": "Developer"
|
"role": "Developer"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require":
|
"require": {
|
||||||
{
|
"silverstripe/framework": "~4.0",
|
||||||
"silverstripe/framework": ">=3.0.1 <4.0.0",
|
"silverstripe/versioned": "^1.0"
|
||||||
"composer/installers": "*"
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"UndefinedOffset\\SortableGridField\\": "src/",
|
||||||
|
"UndefinedOffset\\SortableGridField\\Tests\\": "tests/"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/undefinedoffset/SortableGridField/issues"
|
"issues": "https://github.com/undefinedoffset/SortableGridField/issues"
|
||||||
},
|
},
|
||||||
"extra": {
|
"extra": {
|
||||||
"installer-name": "sortablegridfield"
|
"installer-name": "sortablegridfield",
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,22 @@
|
|||||||
form table.ss-gridfield-table thead tr th.sortablerowsheading {
|
form table.grid-field__table thead tr th.sortablerowsheading {
|
||||||
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
form table.ss-gridfield-table thead tr th.sortablerowsheading .gridfield-sortablerows input[type=checkbox] {
|
form table.grid-field__table thead tr td.sortablerowsheading label {
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
form table.grid-field__table thead tr td.sortablerowsheading .gridfield-sortablerows input[type=checkbox] {
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
form table.ss-gridfield-table thead tr th.sortablerowsheading .gridfield-sortablerows {
|
form table.grid-field__table thead tr td.sortablerowsheading .gridfield-sortablerows {
|
||||||
line-height: 28px;
|
line-height: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
form table.ss-gridfield-table thead tr th.sortablerowsheading .gridfield-sortablerows button {
|
form table.grid-field__table thead tr td.sortablerowsheading .gridfield-sortablerows button {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,7 +25,7 @@ form .ss-gridfield {
|
|||||||
}
|
}
|
||||||
|
|
||||||
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-psort-arrow {
|
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-psort-arrow {
|
||||||
background: #98AAB6;
|
background: #5589A7;
|
||||||
|
|
||||||
display: none;
|
display: none;
|
||||||
|
|
||||||
@ -30,7 +36,7 @@ form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-psort-arrow {
|
|||||||
|
|
||||||
width: 40px;
|
width: 40px;
|
||||||
|
|
||||||
opacity: 0.4;
|
opacity: 0.6;
|
||||||
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
@ -46,6 +52,8 @@ form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-psort-arrow i
|
|||||||
|
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
|
font-style: normal;
|
||||||
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
|
|
||||||
@ -72,13 +80,13 @@ form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-psort-arrow i:
|
|||||||
}
|
}
|
||||||
|
|
||||||
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-psort-arrow:hover {
|
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-psort-arrow:hover {
|
||||||
opacity: 0.7;
|
opacity: 0.8;
|
||||||
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-prev-page {
|
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-prev-page {
|
||||||
left: 0;
|
left: -20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-prev-page i {
|
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-prev-page i {
|
||||||
@ -98,7 +106,7 @@ form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-prev-page i {
|
|||||||
}
|
}
|
||||||
|
|
||||||
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-next-page {
|
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-next-page {
|
||||||
right: 0;
|
right: -20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-next-page i {
|
form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-next-page i {
|
||||||
@ -117,10 +125,10 @@ form .ss-gridfield .gridfield-sortablerows-movepage .sortablerows-next-page i {
|
|||||||
transform-origin: bottom right;
|
transform-origin: bottom right;
|
||||||
}
|
}
|
||||||
|
|
||||||
form table.ss-gridfield-table.dragSorting tbody tr td {
|
form table.grid-field__table.dragSorting tbody tr td {
|
||||||
cursor: move;
|
cursor: move;
|
||||||
}
|
}
|
||||||
|
|
||||||
form table.ss-gridfield-table.dragSorting .ui-sortable-helper {
|
form table.grid-field__table.dragSorting .ui-sortable-helper {
|
||||||
display: table;
|
display: table;
|
||||||
}
|
}
|
@ -1,17 +1,20 @@
|
|||||||
has_many Example
|
has_many Example
|
||||||
=================
|
=================
|
||||||
Please note this example is written with 3.0.x in mind, if you are using 3.1.x make sure you scope all static properties to private not public.
|
|
||||||
```php
|
```php
|
||||||
/*** TestPage.php ***/
|
/*** TestPage.php ***/
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
class TestPage extends Page {
|
class TestPage extends Page {
|
||||||
public static $has_many=array(
|
private static $has_many=array(
|
||||||
'TestObjects'=>'TestObject'
|
'TestObjects'=>'TestObject'
|
||||||
);
|
);
|
||||||
|
|
||||||
public function getCMSFields() {
|
public function getCMSFields() {
|
||||||
$fields=parent::getCMSFields();
|
$fields=parent::getCMSFields();
|
||||||
|
|
||||||
$conf=GridFieldConfig_RelationEditor::create(10);
|
$conf=GridFieldConfig_RecordEditor::create(10);
|
||||||
$conf->addComponent(new GridFieldSortableRows('SortOrder'));
|
$conf->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
|
|
||||||
$fields->addFieldToTab('Root.TestObjects', new GridField('TestObjects', 'TestObjects', $this->TestObjects(), $conf));
|
$fields->addFieldToTab('Root.TestObjects', new GridField('TestObjects', 'TestObjects', $this->TestObjects(), $conf));
|
||||||
@ -22,16 +25,18 @@ class TestPage extends Page {
|
|||||||
|
|
||||||
|
|
||||||
/*** TestObject.php ***/
|
/*** TestObject.php ***/
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
|
||||||
class TestObject extends DataObject {
|
class TestObject extends DataObject {
|
||||||
public static $db=array(
|
private static $db=array(
|
||||||
'Title'=>'Text',
|
'Title'=>'Text',
|
||||||
'SortOrder'=>'Int'
|
'SortOrder'=>'Int'
|
||||||
);
|
);
|
||||||
|
|
||||||
public static $has_one=array(
|
private static $has_one=array(
|
||||||
'Parent'=>'TestPage'
|
'Parent'=>'TestPage'
|
||||||
);
|
);
|
||||||
|
|
||||||
public static $default_sort='SortOrder';
|
private static $default_sort='SortOrder';
|
||||||
}
|
}
|
||||||
```
|
```
|
@ -1,14 +1,17 @@
|
|||||||
many_many Example
|
many_many Example
|
||||||
=================
|
=================
|
||||||
Please note this example is written with 3.0.x in mind, if you are using 3.1.x make sure you scope all static properties to private not public.
|
|
||||||
```php
|
```php
|
||||||
/*** TestPage.php ***/
|
/*** TestPage.php ***/
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
class TestPage extends Page {
|
class TestPage extends Page {
|
||||||
public static $many_many=array(
|
private static $many_many=array(
|
||||||
'TestObjects'=>'TestObject'
|
'TestObjects'=>'TestObject'
|
||||||
);
|
);
|
||||||
|
|
||||||
public static $many_many_extraFields=array(
|
private static $many_many_extraFields=array(
|
||||||
'TestObjects'=>array(
|
'TestObjects'=>array(
|
||||||
'SortOrder'=>'Int'
|
'SortOrder'=>'Int'
|
||||||
)
|
)
|
||||||
@ -33,12 +36,14 @@ class TestPage extends Page {
|
|||||||
|
|
||||||
|
|
||||||
/*** TestObject.php ***/
|
/*** TestObject.php ***/
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
|
||||||
class TestObject extends DataObject {
|
class TestObject extends DataObject {
|
||||||
public static $db=array(
|
private static $db=array(
|
||||||
'Title'=>'Text'
|
'Title'=>'Text'
|
||||||
);
|
);
|
||||||
|
|
||||||
public static $belongs_many_many=array(
|
private static $belongs_many_many=array(
|
||||||
'TestPages'=>'TestPage'
|
'TestPages'=>'TestPage'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
ModelAdmin implementation Example
|
ModelAdmin implementation Example
|
||||||
=================
|
=================
|
||||||
Please note this example is written with 3.0.x in mind, if you are using 3.1.x make sure you scope all static properties to private not public.
|
|
||||||
```php
|
```php
|
||||||
/**** MyModelAdmin.php ****/
|
/**** MyModelAdmin.php ****/
|
||||||
class MyModelAdmin extends ModelAdmin {
|
use SilverStripe\Admin\ModelAdmin;
|
||||||
public static $menu_title='My Model Admin';
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
public static $url_segment='my-model-admin';
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
public static $managed_models=array(
|
class MyModelAdmin extends ModelAdmin {
|
||||||
|
private static $menu_title='My Model Admin';
|
||||||
|
private static $url_segment='my-model-admin';
|
||||||
|
|
||||||
|
private static $managed_models=array(
|
||||||
'MATestObject'
|
'MATestObject'
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -27,12 +30,14 @@ class MyModelAdmin extends ModelAdmin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**** MATestObject.php ****/
|
/**** MATestObject.php ****/
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
|
||||||
class MATestObject extends DataObject {
|
class MATestObject extends DataObject {
|
||||||
public static $db=array(
|
private static $db=array(
|
||||||
'Title'=>'Varchar',
|
'Title'=>'Varchar',
|
||||||
'SortOrder'=>'Int'
|
'SortOrder'=>'Int'
|
||||||
);
|
);
|
||||||
|
|
||||||
public static $default_sort='SortOrder';
|
private static $default_sort='SortOrder';
|
||||||
}
|
}
|
||||||
```
|
```
|
@ -54,7 +54,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
self._makeRequest({data: [
|
self._makeRequest({
|
||||||
|
data: [
|
||||||
{
|
{
|
||||||
name: button.attr('name'),
|
name: button.attr('name'),
|
||||||
value: button.val()
|
value: button.val()
|
||||||
@ -63,7 +64,8 @@
|
|||||||
name: 'ItemIDs',
|
name: 'ItemIDs',
|
||||||
value: dataRows
|
value: dataRows
|
||||||
}
|
}
|
||||||
]},function() {
|
]
|
||||||
|
}, function () {
|
||||||
form.removeClass('loading');
|
form.removeClass('loading');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -149,7 +151,8 @@
|
|||||||
|
|
||||||
|
|
||||||
//Move and Reload the grid
|
//Move and Reload the grid
|
||||||
gridField.reload({data: [
|
gridField.reload({
|
||||||
|
data: [
|
||||||
{
|
{
|
||||||
name: button.attr('name'),
|
name: button.attr('name'),
|
||||||
value: button.val()
|
value: button.val()
|
||||||
@ -162,7 +165,8 @@
|
|||||||
name: 'Target',
|
name: 'Target',
|
||||||
value: target
|
value: target
|
||||||
}
|
}
|
||||||
]});
|
]
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
766
src/Forms/GridFieldSortableRows.php
Normal file
766
src/Forms/GridFieldSortableRows.php
Normal file
@ -0,0 +1,766 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace UndefinedOffset\SortableGridField\Forms;
|
||||||
|
|
||||||
|
use SilverStripe\Admin\ModelAdmin;
|
||||||
|
use SilverStripe\Control\Controller;
|
||||||
|
use SilverStripe\Core\ClassInfo;
|
||||||
|
use SilverStripe\Core\Config\Config;
|
||||||
|
use SilverStripe\Core\Extensible;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridField_ActionProvider;
|
||||||
|
use SilverStripe\Forms\GridField\GridField_DataManipulator;
|
||||||
|
use SilverStripe\Forms\GridField\GridField_FormAction;
|
||||||
|
use SilverStripe\Forms\GridField\GridField_HTMLProvider;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldFilterHeader;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldPaginator;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldSortableHeader;
|
||||||
|
use SilverStripe\ORM\DataList;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\ORM\DataQuery;
|
||||||
|
use SilverStripe\ORM\DB;
|
||||||
|
use SilverStripe\ORM\ManyManyList;
|
||||||
|
use SilverStripe\ORM\RelationList;
|
||||||
|
use SilverStripe\ORM\SS_List;
|
||||||
|
use SilverStripe\ORM\UnsavedRelationList;
|
||||||
|
use SilverStripe\ORM\ValidationException;
|
||||||
|
use SilverStripe\Versioned\Versioned;
|
||||||
|
use SilverStripe\View\arrayData;
|
||||||
|
use SilverStripe\View\Requirements;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This component provides a checkbox which when checked enables drag-and-drop re-ordering of elements displayed in a {@link GridField}
|
||||||
|
*
|
||||||
|
* @package forms
|
||||||
|
*/
|
||||||
|
class GridFieldSortableRows implements GridField_HTMLProvider, GridField_ActionProvider, GridField_DataManipulator
|
||||||
|
{
|
||||||
|
/** @var string */
|
||||||
|
protected $sortColumn;
|
||||||
|
|
||||||
|
/** @var bool */
|
||||||
|
protected $disable_selection = true;
|
||||||
|
|
||||||
|
/** @var bool */
|
||||||
|
protected $append_to_top = false;
|
||||||
|
|
||||||
|
/** @var null|string */
|
||||||
|
protected $update_versioned_stage = null;
|
||||||
|
|
||||||
|
/** @var null|string */
|
||||||
|
protected $custom_relation_name = null;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
protected $tableMap = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $sortColumn Column that should be used to update the sort information
|
||||||
|
* @param bool $disableSelection Disable selection on the GridField when dragging
|
||||||
|
* @param string $updateVersionStage Name of the versioned stage to update this disabled by default unless this is set
|
||||||
|
* @param string $customRelationName Name of the relationship to use, if left null the name is determined from the GridField's name
|
||||||
|
*/
|
||||||
|
public function __construct($sortColumn, $disableSelection = true, $updateVersionStage = null, $customRelationName = null)
|
||||||
|
{
|
||||||
|
$this->sortColumn = $sortColumn;
|
||||||
|
$this->disable_selection = $disableSelection;
|
||||||
|
$this->update_versioned_stage = $updateVersionStage;
|
||||||
|
$this->custom_relation_name = $customRelationName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a map where the keys are fragment names and the values are pieces of HTML to add to these fragments.
|
||||||
|
* @param GridField $gridField Grid Field Reference
|
||||||
|
* @return array Map where the keys are fragment names and the values are pieces of HTML to add to these fragments.
|
||||||
|
*/
|
||||||
|
public function getHTMLFragments($gridField)
|
||||||
|
{
|
||||||
|
$dataList = $gridField->getList();
|
||||||
|
|
||||||
|
if (class_exists('UnsavedRelationList') && $dataList instanceof UnsavedRelationList) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$state = $gridField->State->GridFieldSortableRows;
|
||||||
|
if (!is_bool($state->sortableToggle)) {
|
||||||
|
$state->sortableToggle = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Ensure user can edit
|
||||||
|
if (!singleton($gridField->getModelClass())->canEdit()) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Sort order toggle
|
||||||
|
$sortOrderToggle = GridField_FormAction::create(
|
||||||
|
$gridField,
|
||||||
|
'sortablerows-toggle',
|
||||||
|
'sorttoggle',
|
||||||
|
'sortableRowsToggle',
|
||||||
|
null
|
||||||
|
)->addExtraClass('sortablerows-toggle');
|
||||||
|
|
||||||
|
|
||||||
|
$sortOrderSave = GridField_FormAction::create(
|
||||||
|
$gridField,
|
||||||
|
'sortablerows-savesort',
|
||||||
|
'savesort',
|
||||||
|
'saveGridRowSort',
|
||||||
|
null
|
||||||
|
)->addExtraClass('sortablerows-savesort');
|
||||||
|
|
||||||
|
|
||||||
|
//Sort to Page Action
|
||||||
|
$sortToPage = GridField_FormAction::create(
|
||||||
|
$gridField,
|
||||||
|
'sortablerows-sorttopage',
|
||||||
|
'sorttopage',
|
||||||
|
'sortToPage',
|
||||||
|
null
|
||||||
|
)->addExtraClass('sortablerows-sorttopage');
|
||||||
|
|
||||||
|
|
||||||
|
$data = array('SortableToggle' => $sortOrderToggle,
|
||||||
|
'SortOrderSave' => $sortOrderSave,
|
||||||
|
'SortToPage' => $sortToPage,
|
||||||
|
'Checked' => ($state->sortableToggle == true ? ' checked = "checked"' : ''),
|
||||||
|
'List' => $dataList);
|
||||||
|
|
||||||
|
$forTemplate = new arrayData($data);
|
||||||
|
|
||||||
|
//Inject Requirements
|
||||||
|
$custom = Config::inst()->get(GridFieldSortableRows::class, 'Base');
|
||||||
|
$base = $custom ?: SORTABLE_GRIDFIELD_BASE;
|
||||||
|
|
||||||
|
Requirements::css($base . '/css/GridFieldSortableRows.css');
|
||||||
|
Requirements::javascript($base . '/javascript/GridFieldSortableRows.js');
|
||||||
|
|
||||||
|
$args = array('Colspan' => count($gridField->getColumns()), 'ID' => $gridField->ID(), 'DisableSelection' => $this->disable_selection);
|
||||||
|
|
||||||
|
$fragments = array('header' => $forTemplate->renderWith('SortableGridField\Forms\Includes\GridFieldSortableRows', $args));
|
||||||
|
|
||||||
|
if ($gridField->getConfig()->getComponentByType(GridFieldPaginator::class)) {
|
||||||
|
$fragments['after'] = $forTemplate->renderWith('SortableGridField\Forms\Includes\GridFieldSortableRows_paginator');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $fragments;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manipulate the datalist as needed by this grid modifier.
|
||||||
|
* @param GridField $gridField Grid Field Reference
|
||||||
|
* @param SS_List|DataList $dataList Data List to adjust
|
||||||
|
* @return DataList Modified Data List
|
||||||
|
*/
|
||||||
|
public function getManipulatedData(GridField $gridField, SS_List $dataList)
|
||||||
|
{
|
||||||
|
//Detect and correct items with a sort column value of 0 (push to bottom)
|
||||||
|
$this->fixSortColumn($gridField, $dataList);
|
||||||
|
|
||||||
|
|
||||||
|
$headerState = $gridField->State->GridFieldSortableHeader;
|
||||||
|
$state = $gridField->State->GridFieldSortableRows;
|
||||||
|
if ((!is_bool($state->sortableToggle) || $state->sortableToggle === false) && $headerState && is_string($headerState->SortColumn) && is_string($headerState->SortDirection)) {
|
||||||
|
return $dataList->sort($headerState->SortColumn, $headerState->SortDirection);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($state->sortableToggle === true) {
|
||||||
|
$gridField->getConfig()->removeComponentsByType(GridFieldFilterHeader::class);
|
||||||
|
$gridField->getConfig()->removeComponentsByType(GridFieldSortableHeader::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dataList->sort($this->sortColumn);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets if new records should be appended to the top or the bottom of the list
|
||||||
|
* @param bool $value Boolean true to append to the top false to append to the bottom
|
||||||
|
* @return GridFieldSortableRows Returns the current instance
|
||||||
|
*/
|
||||||
|
public function setAppendToTop($value)
|
||||||
|
{
|
||||||
|
$this->append_to_top = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool $value Boolean true to disable selection of table contents false to enable selection
|
||||||
|
* @return GridFieldSortableRows Returns the current instance
|
||||||
|
*/
|
||||||
|
public function setDisableSelection($value)
|
||||||
|
{
|
||||||
|
$this->disable_selection = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the suffix of the versioned stage that should be updated along side the default stage
|
||||||
|
* @param string $value Versioned Stage to update this is disabled by default unless this is set
|
||||||
|
* @return GridFieldSortableRows Returns the current instance
|
||||||
|
*/
|
||||||
|
public function setUpdateVersionedStage($value)
|
||||||
|
{
|
||||||
|
$this->update_versioned_stage = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the name of the relationship to use, by default the name is determined from the GridField's name
|
||||||
|
* @param string $value Name of the relationship to use, by default the name is determined from the GridField's name
|
||||||
|
* @return GridFieldSortableRows Returns the current instance
|
||||||
|
*/
|
||||||
|
public function setCustomRelationName($value)
|
||||||
|
{
|
||||||
|
$this->custom_relation_name = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects and corrects items with a sort column value of 0, by appending them to the bottom of the list
|
||||||
|
* @param GridField $gridField Grid Field Reference
|
||||||
|
* @param SS_List|DataList $dataList Data List of items to be checked
|
||||||
|
*/
|
||||||
|
protected function fixSortColumn($gridField, SS_List $dataList)
|
||||||
|
{
|
||||||
|
if ($dataList instanceof UnsavedRelationList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var SS_List|DataList $list */
|
||||||
|
$list = clone $dataList;
|
||||||
|
$list = $list->alterDataQuery(function ($query, SS_List $tmplist) {
|
||||||
|
/** @var DataQuery $query */
|
||||||
|
$query->limit(array());
|
||||||
|
return $query;
|
||||||
|
});
|
||||||
|
|
||||||
|
$many_many = ($list instanceof ManyManyList);
|
||||||
|
if (!$many_many) {
|
||||||
|
$sng = singleton($gridField->getModelClass());
|
||||||
|
$fieldType = $sng->config()->db[$this->sortColumn];
|
||||||
|
|
||||||
|
if (!$fieldType || !(strtolower($fieldType) == 'int' || is_subclass_of($fieldType, 'Int'))) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$max = $list->Max($this->sortColumn);
|
||||||
|
$list = $list->filter($this->sortColumn, 0)->sort("Created,ID");
|
||||||
|
if ($list->Count() > 0) {
|
||||||
|
$owner = $gridField->getForm()->getRecord();
|
||||||
|
$sortColumn = $this->sortColumn;
|
||||||
|
$i = 1;
|
||||||
|
|
||||||
|
if ($many_many) {
|
||||||
|
list($parentClass, $componentClass, $parentField, $componentField, $table) = $owner->many_many((!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
||||||
|
|
||||||
|
/** @var DataObject $table */
|
||||||
|
$table = $this->mapTableNameAndReturn($table);
|
||||||
|
|
||||||
|
$extraFields = $owner->many_many_extraFields((!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
||||||
|
|
||||||
|
if (!$extraFields || !array_key_exists($this->sortColumn, $extraFields) || !($extraFields[$this->sortColumn] == 'Int' || is_subclass_of('Int', $extraFields[$this->sortColumn]))) {
|
||||||
|
user_error('Sort column ' . $this->sortColumn . ' must be an Int, column is of type ' . $extraFields[$this->sortColumn], E_USER_ERROR);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//Find table containing the sort column
|
||||||
|
$table = false;
|
||||||
|
$class = $gridField->getModelClass();
|
||||||
|
|
||||||
|
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
||||||
|
if (!empty($db) && array_key_exists($sortColumn, $db)) {
|
||||||
|
$table = $this->mapTableNameAndReturn($class);
|
||||||
|
} else {
|
||||||
|
$classes = ClassInfo::ancestry($class, true);
|
||||||
|
foreach ($classes as $class) {
|
||||||
|
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
||||||
|
if (!empty($db) && array_key_exists($sortColumn, $db)) {
|
||||||
|
$table = $this->mapTableNameAndReturn($class);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($table === false) {
|
||||||
|
user_error('Sort column ' . $this->sortColumn . ' could not be found in ' . $gridField->getModelClass() . '\'s ancestry', E_USER_ERROR);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$baseDataClass = DataObject::getSchema()->baseDataClass($gridField->getModelClass());
|
||||||
|
$baseDataClass = $this->mapTableNameAndReturn($baseDataClass);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Start transaction if supported
|
||||||
|
if (DB::get_conn()->supportsTransactions()) {
|
||||||
|
DB::get_conn()->transactionStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
$idCondition = null;
|
||||||
|
if ($this->append_to_top && !($list instanceof RelationList)) {
|
||||||
|
$idCondition = '"ID" IN(\'' . implode("','", $dataList->getIDList()) . '\')';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->append_to_top) {
|
||||||
|
$topIncremented = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($list as $obj) {
|
||||||
|
if ($many_many) {
|
||||||
|
if ($this->append_to_top) {
|
||||||
|
//Upgrade all the records (including the last inserted from 0 to 1)
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = "' . $sortColumn . '"+1'
|
||||||
|
. ' WHERE "' . $parentField . '" = ' . $owner->ID . (!empty($topIncremented) ? ' AND "' . $componentField . '" NOT IN(\'' . implode('\',\'', $topIncremented) . '\')' : ''));
|
||||||
|
|
||||||
|
$topIncremented[] = $obj->ID;
|
||||||
|
} else {
|
||||||
|
//Append the last record to the bottom
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . ($max + $i)
|
||||||
|
. ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
||||||
|
}
|
||||||
|
} else if ($this->append_to_top) {
|
||||||
|
//Upgrade all the records (including the last inserted from 0 to 1)
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = "' . $sortColumn . '"+1'
|
||||||
|
. ' WHERE ' . ($list instanceof RelationList ? '"' . $list->foreignKey . '" = ' . $owner->ID : $idCondition) . (!empty($topIncremented) ? ' AND "ID" NOT IN(\'' . implode('\',\'', $topIncremented) . '\')' : ''));
|
||||||
|
|
||||||
|
if ($this->update_versioned_stage && class_exists($this->tableMap[$table]) && $this->hasVersionedExtension($this->tableMap[$table])) {
|
||||||
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "' . $sortColumn . '" = "' . $sortColumn . '"+1'
|
||||||
|
. ' WHERE ' . ($list instanceof RelationList ? '"' . $list->foreignKey . '" = ' . $owner->ID : $idCondition) . (!empty($topIncremented) ? ' AND "ID" NOT IN(\'' . implode('\',\'', $topIncremented) . '\')' : ''));
|
||||||
|
}
|
||||||
|
|
||||||
|
$topIncremented[] = $obj->ID;
|
||||||
|
} else {
|
||||||
|
//Append the last record to the bottom
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . ($max + $i)
|
||||||
|
. ' WHERE "ID" = ' . $obj->ID);
|
||||||
|
//LastEdited
|
||||||
|
DB::query('UPDATE "' . $baseDataClass
|
||||||
|
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
||||||
|
. ' WHERE "ID" = ' . $obj->ID);
|
||||||
|
|
||||||
|
if ($this->update_versioned_stage && class_exists($this->tableMap[$table]) && $this->hasVersionedExtension($this->tableMap[$table])) {
|
||||||
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . ($max + $i)
|
||||||
|
. ' WHERE "ID" = ' . $obj->ID);
|
||||||
|
|
||||||
|
if ($this->hasVersionedExtension($this->tableMap[$baseDataClass])) {
|
||||||
|
DB::query('UPDATE "' . $baseDataClass . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
||||||
|
. ' WHERE "ID" = ' . $obj->ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Update LastEdited for affected records when using append to top on a many_many relationship
|
||||||
|
if (!$many_many && $this->append_to_top && count($topIncremented) > 0) {
|
||||||
|
DB::query('UPDATE "' . $baseDataClass
|
||||||
|
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
||||||
|
. ' WHERE "ID" IN(\'' . implode('\',\'', $topIncremented) . '\')');
|
||||||
|
|
||||||
|
if ($this->update_versioned_stage && class_exists($this->tableMap[$table]) && $this->hasVersionedExtension($this->tableMap[$table]) && $this->hasVersionedExtension($this->tableMap[$baseDataClass])) {
|
||||||
|
DB::query('UPDATE "' . $baseDataClass . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
||||||
|
. ' WHERE "ID" IN(\'' . implode('\',\'', $topIncremented) . '\')');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//End transaction if supported
|
||||||
|
if (DB::get_conn()->supportsTransactions()) {
|
||||||
|
DB::get_conn()->transactionEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a list of the actions handled by this action provider.
|
||||||
|
* @param GridField $gridField Grid Field Reference
|
||||||
|
* @return array array with action identifier strings.
|
||||||
|
*/
|
||||||
|
public function getActions($gridField)
|
||||||
|
{
|
||||||
|
return array('saveGridRowSort', 'sortableRowsToggle', 'sortToPage');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle an action on the given grid field.
|
||||||
|
* @param GridField $gridField Grid Field Reference
|
||||||
|
* @param String $actionName Action identifier, see {@link getActions()}.
|
||||||
|
* @param array $arguments Arguments relevant for this
|
||||||
|
* @param array $data All form data
|
||||||
|
*/
|
||||||
|
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
|
||||||
|
{
|
||||||
|
$state = $gridField->State->GridFieldSortableRows;
|
||||||
|
if (!is_bool($state->sortableToggle)) {
|
||||||
|
$state->sortableToggle = false;
|
||||||
|
} else if ($state->sortableToggle == true) {
|
||||||
|
$gridField->getConfig()->removeComponentsByType(GridFieldFilterHeader::class);
|
||||||
|
$gridField->getConfig()->removeComponentsByType(GridFieldSortableHeader::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($actionName == 'savegridrowsort') {
|
||||||
|
return $this->saveGridRowSort($gridField, $data);
|
||||||
|
} else if ($actionName == 'sorttopage') {
|
||||||
|
return $this->sortToPage($gridField, $data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles saving of the row sort order
|
||||||
|
* @param GridField $gridField Grid Field Reference
|
||||||
|
* @param array $data Data submitted in the request
|
||||||
|
* @throws ValidationException If user has no edit permissions
|
||||||
|
*/
|
||||||
|
protected function saveGridRowSort(GridField $gridField, $data)
|
||||||
|
{
|
||||||
|
$dataList = $gridField->getList();
|
||||||
|
|
||||||
|
if ($dataList instanceof UnsavedRelationList) {
|
||||||
|
user_error('Cannot sort an UnsavedRelationList', E_USER_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!singleton($gridField->getModelClass())->canEdit()) {
|
||||||
|
throw new ValidationException(_t('GridFieldSortableRows.EditPermissionsFailure', "No edit permissions"), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($data['ItemIDs'])) {
|
||||||
|
user_error('No items to sort', E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
$className = $gridField->getModelClass();
|
||||||
|
$owner = $gridField->Form->getRecord();
|
||||||
|
$items = clone $gridField->getList();
|
||||||
|
$many_many = ($items instanceof ManyManyList);
|
||||||
|
$sortColumn = $this->sortColumn;
|
||||||
|
$pageOffset = 0;
|
||||||
|
|
||||||
|
if ($paginator = $gridField->getConfig()->getComponentsByType(GridFieldPaginator::class)->First()) {
|
||||||
|
$pageState = $gridField->State->GridFieldPaginator;
|
||||||
|
|
||||||
|
if ($pageState->currentPage && is_int($pageState->currentPage) && $pageState->currentPage > 1) {
|
||||||
|
$pageOffset = $paginator->getItemsPerPage() * ($pageState->currentPage - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($many_many) {
|
||||||
|
list($parentClass, $componentClass, $parentField, $componentField, $table) = $owner->many_many((!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
||||||
|
|
||||||
|
/** @var DataObject $table */
|
||||||
|
$table = $this->mapTableNameAndReturn($table);
|
||||||
|
} else {
|
||||||
|
//Find table containing the sort column
|
||||||
|
$table = false;
|
||||||
|
$class = $gridField->getModelClass();
|
||||||
|
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
||||||
|
if (!empty($db) && array_key_exists($sortColumn, $db)) {
|
||||||
|
$table = $this->mapTableNameAndReturn($class);
|
||||||
|
} else {
|
||||||
|
$classes = ClassInfo::ancestry($class, true);
|
||||||
|
foreach ($classes as $class) {
|
||||||
|
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
||||||
|
if (!empty($db) && array_key_exists($sortColumn, $db)) {
|
||||||
|
$table = $this->mapTableNameAndReturn($class);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($table === false) {
|
||||||
|
user_error('Sort column ' . $this->sortColumn . ' could not be found in ' . $gridField->getModelClass() . '\'s ancestry', E_USER_ERROR);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$baseDataClass = DataObject::getSchema()->baseDataClass($gridField->getModelClass());
|
||||||
|
$baseDataClass = $this->mapTableNameAndReturn($baseDataClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Event to notify the Controller or owner DataObject before list sort
|
||||||
|
if ($owner && $owner instanceof DataObject && method_exists($owner, 'onBeforeGridFieldRowSort')) {
|
||||||
|
$owner->onBeforeGridFieldRowSort(clone $items);
|
||||||
|
} else if (Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onBeforeGridFieldRowSort')) {
|
||||||
|
Controller::curr()->onBeforeGridFieldRowSort(clone $items);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Start transaction if supported
|
||||||
|
if (DB::get_conn()->supportsTransactions()) {
|
||||||
|
DB::get_conn()->transactionStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Perform sorting
|
||||||
|
$ids = explode(',', $data['ItemIDs']);
|
||||||
|
for ($sort = 0; $sort < count($ids); $sort++) {
|
||||||
|
$id = intval($ids[$sort]);
|
||||||
|
if ($many_many) {
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
||||||
|
. ' WHERE "' . $componentField . '" = ' . $id . ' AND "' . $parentField . '" = ' . $owner->ID);
|
||||||
|
} else {
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
||||||
|
. ' WHERE "ID" = ' . $id);
|
||||||
|
|
||||||
|
DB::query('UPDATE "' . $baseDataClass
|
||||||
|
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
||||||
|
. ' WHERE "ID" = ' . $id);
|
||||||
|
|
||||||
|
if ($this->update_versioned_stage && class_exists($this->tableMap[$table]) && $this->hasVersionedExtension($this->tableMap[$table])) {
|
||||||
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . (($sort + 1) + $pageOffset)
|
||||||
|
. ' WHERE "ID" = ' . $id);
|
||||||
|
|
||||||
|
if ($this->hasVersionedExtension($this->tableMap[$baseDataClass])) {
|
||||||
|
DB::query('UPDATE "' . $baseDataClass . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "LastEdited" = \'' . date('Y-m-d H:i:s') . '\''
|
||||||
|
. ' WHERE "ID" = ' . $id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//End transaction if supported
|
||||||
|
if (DB::get_conn()->supportsTransactions()) {
|
||||||
|
DB::get_conn()->transactionEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Event to notify the Controller or owner DataObject after list sort
|
||||||
|
if ($owner && $owner instanceof DataObject && method_exists($owner, 'onAfterGridFieldRowSort')) {
|
||||||
|
$owner->onAfterGridFieldRowSort(clone $items);
|
||||||
|
} else if (Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onAfterGridFieldRowSort')) {
|
||||||
|
Controller::curr()->onAfterGridFieldRowSort(clone $items);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles sorting across pages
|
||||||
|
* @param GridField $gridField Grid Field Reference
|
||||||
|
* @param array $data Data submitted in the request
|
||||||
|
*/
|
||||||
|
protected function sortToPage(GridField $gridField, $data)
|
||||||
|
{
|
||||||
|
if (!$paginator = $gridField->getConfig()->getComponentsByType(GridFieldPaginator::class)->First()) {
|
||||||
|
user_error('Paginator not detected', E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($data['ItemID'])) {
|
||||||
|
user_error('No item to sort', E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($data['Target'])) {
|
||||||
|
user_error('No target page', E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var Extensible $className */
|
||||||
|
$className = $gridField->getModelClass();
|
||||||
|
$owner = $gridField->Form->getRecord();
|
||||||
|
|
||||||
|
/** @var DataList $items */
|
||||||
|
$items = clone $gridField->getList();
|
||||||
|
|
||||||
|
$many_many = ($items instanceof ManyManyList);
|
||||||
|
$sortColumn = $this->sortColumn;
|
||||||
|
$targetItem = $items->byID(intval($data['ItemID']));
|
||||||
|
|
||||||
|
if (!$targetItem) {
|
||||||
|
user_error('Target item not found', E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentPage = 1;
|
||||||
|
|
||||||
|
$pageState = $gridField->State->GridFieldPaginator;
|
||||||
|
if ($pageState->currentPage && $pageState->currentPage > 1) {
|
||||||
|
$currentPage = $pageState->currentPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($many_many) {
|
||||||
|
list($parentClass, $componentClass, $parentField, $componentField, $table) = $owner->many_many((!empty($this->custom_relation_name) ? $this->custom_relation_name : $gridField->getName()));
|
||||||
|
$table = $this->mapTableNameAndReturn($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($data['Target'] == 'previouspage') {
|
||||||
|
$items = $items->limit($paginator->getItemsPerPage() + 1, ($paginator->getItemsPerPage() * ($currentPage - 1)) - 1);
|
||||||
|
} else if ($data['Target'] == 'nextpage') {
|
||||||
|
$items = $items->limit($paginator->getItemsPerPage() + 1, $paginator->getItemsPerPage() * ($currentPage - 1));
|
||||||
|
} else {
|
||||||
|
user_error('Not implemented: ' . $data['Target'], E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sortPositions = $items->column($sortColumn);
|
||||||
|
|
||||||
|
//Event to notify the Controller or owner DataObject before list sort
|
||||||
|
if ($owner && $owner instanceof DataObject && method_exists($owner, 'onBeforeGridFieldPageSort')) {
|
||||||
|
$owner->onBeforeGridFieldPageSort(clone $items);
|
||||||
|
} else if (Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onBeforeGridFieldPageSort')) {
|
||||||
|
Controller::curr()->onBeforeGridFieldPageSort(clone $items);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Find the sort column
|
||||||
|
if ($this->update_versioned_stage && $this->hasVersionedExtension($className)) {
|
||||||
|
$table = false;
|
||||||
|
$classes = ClassInfo::ancestry($className, true);
|
||||||
|
foreach ($classes as $class) {
|
||||||
|
$db = Config::inst()->get($class, "db", CONFIG::UNINHERITED);
|
||||||
|
if (!empty($db) && array_key_exists($sortColumn, $db)) {
|
||||||
|
$table = $this->mapTableNameAndReturn($class);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($table === false) {
|
||||||
|
user_error('Sort column ' . $this->sortColumn . ' could not be found in ' . $gridField->getModelClass() . '\'s ancestry', E_USER_ERROR);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Start transaction if supported
|
||||||
|
if (DB::get_conn()->supportsTransactions()) {
|
||||||
|
DB::get_conn()->transactionStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($data['Target'] == 'previouspage') {
|
||||||
|
if ($many_many) {
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . $sortPositions[0]
|
||||||
|
. ' WHERE "' . $componentField . '" = ' . $targetItem->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
||||||
|
} else {
|
||||||
|
$targetItem->$sortColumn = $sortPositions[0];
|
||||||
|
$targetItem->write();
|
||||||
|
|
||||||
|
if ($this->update_versioned_stage && $this->hasVersionedExtension($className)) {
|
||||||
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . $sortPositions[0]
|
||||||
|
. ' WHERE "ID" = ' . $targetItem->ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$i = 1;
|
||||||
|
foreach ($items as $obj) {
|
||||||
|
if ($obj->ID == $targetItem->ID) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($many_many) {
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . $sortPositions[$i]
|
||||||
|
. ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
||||||
|
} else {
|
||||||
|
$obj->$sortColumn = $sortPositions[$i];
|
||||||
|
$obj->write();
|
||||||
|
|
||||||
|
if ($this->update_versioned_stage && $this->hasVersionedExtension($className)) {
|
||||||
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . $sortPositions[$i]
|
||||||
|
. ' WHERE "ID" = ' . $obj->ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($many_many) {
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . $sortPositions[count($sortPositions) - 1]
|
||||||
|
. ' WHERE "' . $componentField . '" = ' . $targetItem->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
||||||
|
} else {
|
||||||
|
$targetItem->$sortColumn = $sortPositions[count($sortPositions) - 1];
|
||||||
|
$targetItem->write();
|
||||||
|
|
||||||
|
if ($this->update_versioned_stage && $this->hasVersionedExtension($className)) {
|
||||||
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . $sortPositions[count($sortPositions) - 1]
|
||||||
|
. ' WHERE "ID" = ' . $targetItem->ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
foreach ($items as $obj) {
|
||||||
|
if ($obj->ID == $targetItem->ID) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($many_many) {
|
||||||
|
DB::query('UPDATE "' . $table
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . $sortPositions[$i]
|
||||||
|
. ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
|
||||||
|
} else {
|
||||||
|
$obj->$sortColumn = $sortPositions[$i];
|
||||||
|
$obj->write();
|
||||||
|
|
||||||
|
if ($this->update_versioned_stage && $this->hasVersionedExtension($className)) {
|
||||||
|
DB::query('UPDATE "' . $table . '_' . $this->update_versioned_stage
|
||||||
|
. '" SET "' . $sortColumn . '" = ' . $sortPositions[$i]
|
||||||
|
. ' WHERE "ID" = ' . $obj->ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//End transaction if supported
|
||||||
|
if (DB::get_conn()->supportsTransactions()) {
|
||||||
|
DB::get_conn()->transactionEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Event to notify the Controller or owner DataObject after list sort
|
||||||
|
if ($owner && $owner instanceof DataObject && method_exists($owner, 'onAfterGridFieldPageSort')) {
|
||||||
|
$owner->onAfterGridFieldPageSort(clone $items);
|
||||||
|
} else if (Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onAfterGridFieldPageSort')) {
|
||||||
|
Controller::curr()->onAfterGridFieldPageSort(clone $items);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check to see if the given class name has the Versioned extension
|
||||||
|
*
|
||||||
|
* @param Extensible|string $className
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function hasVersionedExtension($className)
|
||||||
|
{
|
||||||
|
return $className::has_extension(Versioned::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks to see if $table_name is declared on the DataObject, if not returns string as given
|
||||||
|
*
|
||||||
|
* @param $tableName
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function mapTableNameAndReturn($tableName)
|
||||||
|
{
|
||||||
|
if (array_key_exists($tableName, $this->tableMap)) {
|
||||||
|
return $this->tableMap[$tableName];
|
||||||
|
}
|
||||||
|
|
||||||
|
$realName = (Config::inst()->get($tableName, 'table_name', CONFIG::UNINHERITED)) ? Config::inst()->get($tableName, 'table_name', CONFIG::UNINHERITED) : $tableName;
|
||||||
|
|
||||||
|
$this->tableMap[$realName] = $tableName;
|
||||||
|
|
||||||
|
return $realName;
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th class="extra sortablerowsheading" colspan="$Colspan">
|
<td class="sortablerowsheading" colspan="$Colspan">
|
||||||
<div class="gridfield-sortablerows">
|
<div class="gridfield-sortablerows">
|
||||||
<input type="checkbox" id="{$ID}_AllowDragDropCheck" value="1" autocomplete="off" class="no-change-track<% if $DisableSelection %> gridfield-sortablerows-noselection<% end_if %>"$Checked/>
|
<input type="checkbox" id="{$ID}_AllowDragDropCheck" value="1" autocomplete="off" class="no-change-track<% if $DisableSelection %> gridfield-sortablerows-noselection<% end_if %>"$Checked/>
|
||||||
<label for="{$ID}_AllowDragDropCheck"><%t GridFieldSortableRows.ALLOW_DRAG_DROP "Allow drag and drop re-ordering" %></label>
|
<label for="{$ID}_AllowDragDropCheck"><%t GridFieldSortableRows.ALLOW_DRAG_DROP "Allow drag and drop re-ordering" %></label>
|
||||||
@ -7,5 +7,5 @@
|
|||||||
$SortOrderSave
|
$SortOrderSave
|
||||||
$SortToPage
|
$SortToPage
|
||||||
</div>
|
</div>
|
||||||
</th>
|
</td>
|
||||||
</tr>
|
</tr>
|
@ -1,28 +1,61 @@
|
|||||||
<?php
|
<?php
|
||||||
class GridFieldSortableRowsAutoSortTest extends SapphireTest {
|
|
||||||
|
namespace UndefinedOffset\SortableGridField\Tests;
|
||||||
|
|
||||||
|
use SilverStripe\Control\Controller;
|
||||||
|
use SilverStripe\Control\HTTPRequest;
|
||||||
|
use SilverStripe\Control\Session;
|
||||||
|
use SilverStripe\Core\Injector\Injector;
|
||||||
|
use SilverStripe\Dev\SapphireTest;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\Form;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig;
|
||||||
|
use SilverStripe\ORM\DataList;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\ORM\DB;
|
||||||
|
use SilverStripe\Security\Member;
|
||||||
|
use SilverStripe\Versioned\Versioned;
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldSortableRowsAutoSortTest
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
*/
|
||||||
|
class GridFieldSortableRowsAutoSortTest extends SapphireTest
|
||||||
|
{
|
||||||
/** @var string */
|
/** @var string */
|
||||||
public static $fixture_file = 'GridFieldSortableRowsAutoSortTest.yml';
|
public static $fixture_file = 'GridFieldSortableRowsAutoSortTest.yml';
|
||||||
|
|
||||||
/** @var array */
|
/** @var array */
|
||||||
protected $extraDataObjects = array(
|
protected static $extra_dataobjects = array(
|
||||||
'GridFieldAction_SortOrder_Player',
|
GridFieldAction_SortOrder_Player::class,
|
||||||
'GridFieldAction_SortOrder_VPlayer',
|
GridFieldAction_SortOrder_VPlayer::class,
|
||||||
'GridFieldAction_SortOrder_TestParent',
|
GridFieldAction_SortOrder_TestParent::class,
|
||||||
'GridFieldAction_SortOrder_BaseObject',
|
GridFieldAction_SortOrder_BaseObject::class,
|
||||||
'GridFieldAction_SortOrder_ChildObject'
|
GridFieldAction_SortOrder_ChildObject::class
|
||||||
);
|
);
|
||||||
|
|
||||||
public function testAutoSort() {
|
public function testAutoSort()
|
||||||
if(Member::currentUser()) { Member::currentUser()->logOut(); }
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
$list = GridFieldAction_SortOrder_Player::get();
|
$list = GridFieldAction_SortOrder_Player::get();
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
$form = new Form(new Controller(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'sortableRowsToggle', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true))));
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $form->getSecurityToken()->getName()=>$form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
|
|
||||||
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
//Insure sort ran
|
//Insure sort ran
|
||||||
@ -35,21 +68,29 @@ class GridFieldSortableRowsAutoSortTest extends SapphireTest {
|
|||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAppendToTopAutoSort() {
|
public function testAppendToTopAutoSort()
|
||||||
if(Member::currentUser()) { Member::currentUser()->logOut(); }
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
$list = GridFieldAction_SortOrder_Player::get();
|
$list = GridFieldAction_SortOrder_Player::get();
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
$form = new Form(new Controller(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
|
||||||
$gridField->getConfig()->getComponentByType('GridFieldSortableRows')->setAppendToTop(true);
|
/** @var GridFieldSortableRows $sortableRows */
|
||||||
|
$sortableRows = $gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableRows->setAppendToTop(true);
|
||||||
|
|
||||||
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run');
|
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run');
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'sortableRowsToggle', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true))));
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $form->getSecurityToken()->getName()=>$form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
//Insure sort ran
|
//Insure sort ran
|
||||||
@ -62,8 +103,11 @@ class GridFieldSortableRowsAutoSortTest extends SapphireTest {
|
|||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAutoSortVersioned() {
|
public function testAutoSortVersioned()
|
||||||
if(Member::currentUser()) { Member::currentUser()->logOut(); }
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
//Force versioned to reset
|
//Force versioned to reset
|
||||||
Versioned::reset();
|
Versioned::reset();
|
||||||
@ -78,11 +122,14 @@ class GridFieldSortableRowsAutoSortTest extends SapphireTest {
|
|||||||
|
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder', true, 'Live'));
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder', true, 'Live'));
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
$form = new Form(new Controller(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'sortableRowsToggle', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true))));
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $form->getSecurityToken()->getName()=>$form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
|
|
||||||
@ -97,24 +144,27 @@ class GridFieldSortableRowsAutoSortTest extends SapphireTest {
|
|||||||
|
|
||||||
|
|
||||||
//Force versioned over to Live stage
|
//Force versioned over to Live stage
|
||||||
Versioned::reading_stage('Live');
|
Versioned::set_reading_mode('Live');
|
||||||
|
|
||||||
//Get live instance
|
//Get live instance
|
||||||
$obj=Versioned::get_one_by_stage('GridFieldAction_SortOrder_VPlayer', 'Live', '"ID"='.$list->last()->ID);
|
$obj = Versioned::get_one_by_stage(GridFieldAction_SortOrder_VPlayer::class, 'Live', '"ID"=' . $list->last()->ID);
|
||||||
|
|
||||||
//Insure sort ran
|
//Insure sort ran
|
||||||
$this->assertEquals(3, $obj->SortOrder, 'Auto sort should have run on Versioned stage "Live"');
|
$this->assertEquals(3, $obj->SortOrder, 'Auto sort should have run on Versioned stage "Live"');
|
||||||
|
|
||||||
|
|
||||||
//Check for duplicates (there shouldn't be any)
|
//Check for duplicates (there shouldn't be any)
|
||||||
$list=Versioned::get_by_stage('GridFieldAction_SortOrder_VPlayer', 'Live');
|
$list = Versioned::get_by_stage(GridFieldAction_SortOrder_VPlayer::class, 'Live');
|
||||||
$count = $list->Count();
|
$count = $list->Count();
|
||||||
$indexes = count(array_unique($list->column('SortOrder')));
|
$indexes = count(array_unique($list->column('SortOrder')));
|
||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Live"');
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Live"');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAppendToTopAutoSortVersioned() {
|
public function testAppendToTopAutoSortVersioned()
|
||||||
if(Member::currentUser()) { Member::currentUser()->logOut(); }
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
//Force versioned to reset
|
//Force versioned to reset
|
||||||
Versioned::reset();
|
Versioned::reset();
|
||||||
@ -129,15 +179,20 @@ class GridFieldSortableRowsAutoSortTest extends SapphireTest {
|
|||||||
|
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder', true, 'Live'));
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder', true, 'Live'));
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
$form = new Form(new Controller(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
|
|
||||||
$gridField->getConfig()->getComponentByType('GridFieldSortableRows')->setAppendToTop(true);
|
/** @var GridFieldSortableRows $sortableRows */
|
||||||
|
$sortableRows = $gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableRows->setAppendToTop(true);
|
||||||
|
|
||||||
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run on Versioned stage "Stage"');
|
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run on Versioned stage "Stage"');
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'sortableRowsToggle', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true))));
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $form->getSecurityToken()->getName()=>$form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
|
|
||||||
@ -152,7 +207,7 @@ class GridFieldSortableRowsAutoSortTest extends SapphireTest {
|
|||||||
|
|
||||||
|
|
||||||
//Force versioned over to Live stage
|
//Force versioned over to Live stage
|
||||||
Versioned::reading_stage('Live');
|
Versioned::set_reading_mode('Live');
|
||||||
|
|
||||||
//Insure sort ran
|
//Insure sort ran
|
||||||
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run on Versioned stage "Live"');
|
$this->assertEquals(3, $list->last()->SortOrder, 'Auto sort should have run on Versioned stage "Live"');
|
||||||
@ -164,26 +219,38 @@ class GridFieldSortableRowsAutoSortTest extends SapphireTest {
|
|||||||
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Live"');
|
$this->assertEquals(0, $count - $indexes, 'Duplicate indexes detected on Versioned stage "Live"');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAppendToTopAutoSortChild() {
|
public function testAppendToTopAutoSortChild()
|
||||||
if(Member::currentUser()) { Member::currentUser()->logOut(); }
|
{
|
||||||
|
if (Member::currentUser()) {
|
||||||
|
Member::currentUser()->logOut();
|
||||||
|
}
|
||||||
|
|
||||||
//Push the edit date into the past, we're checking this later
|
//Push the edit date into the past, we're checking this later
|
||||||
DB::query('UPDATE "GridFieldAction_SortOrder_BaseObject" SET "LastEdited"=\'' . date('Y-m-d 00:00:00', strtotime('yesterday')) . '\'');
|
DB::query('UPDATE "GridFieldAction_SortOrder_BaseObject" SET "LastEdited"=\'' . date('Y-m-d 00:00:00', strtotime('yesterday')) . '\'');
|
||||||
|
|
||||||
|
/** @var GridFieldAction_SortOrder_TestParent $parent */
|
||||||
$parent = GridFieldAction_SortOrder_TestParent::get()->first();
|
$parent = GridFieldAction_SortOrder_TestParent::get()->first();
|
||||||
|
|
||||||
|
/** @var DataList $list */
|
||||||
$list = $parent->TestRelation();
|
$list = $parent->TestRelation();
|
||||||
|
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
$gridField = new GridField('testfield', 'testfield', $list, $config);
|
||||||
$form = new Form(new Controller(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
$form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($gridField)), new FieldList());
|
||||||
$form->loadDataFrom($parent);
|
$form->loadDataFrom($parent);
|
||||||
|
|
||||||
$gridField->getConfig()->getComponentByType('GridFieldSortableRows')->setAppendToTop(true);
|
/** @var GridFieldSortableRows $sortableRows */
|
||||||
|
$sortableRows = $gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableRows->setAppendToTop(true);
|
||||||
|
|
||||||
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run');
|
$this->assertEquals(0, $list->last()->SortOrder, 'Auto sort should not have run');
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'sortableRowsToggle', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true))));
|
$request = new HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $form->getSecurityToken()->getName() => $form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array(), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $form->getSecurityToken()->getName()=>$form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortableRowsToggle', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
$gridField->gridFieldAlterAction(array('StateID' => $stateID), $form, $request);
|
||||||
|
|
||||||
//Insure sort ran
|
//Insure sort ran
|
||||||
@ -201,53 +268,111 @@ class GridFieldSortableRowsAutoSortTest extends SapphireTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class GridFieldAction_SortOrder_Player extends DataObject implements TestOnly {
|
/**
|
||||||
static $db = array(
|
* Class GridFieldAction_SortOrder_Player
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_Player extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_Player';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
'Name' => 'Varchar',
|
'Name' => 'Varchar',
|
||||||
'SortOrder' => 'Int'
|
'SortOrder' => 'Int'
|
||||||
);
|
);
|
||||||
|
|
||||||
static $default_sort='SortOrder';
|
private static $default_sort = 'SortOrder';
|
||||||
}
|
}
|
||||||
|
|
||||||
class GridFieldAction_SortOrder_VPlayer extends DataObject implements TestOnly {
|
/**
|
||||||
static $db = array(
|
* Class GridFieldAction_SortOrder_VPlayer
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_VPlayer extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_VPlayer';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
'Name' => 'Varchar',
|
'Name' => 'Varchar',
|
||||||
'SortOrder' => 'Int'
|
'SortOrder' => 'Int'
|
||||||
);
|
);
|
||||||
|
|
||||||
static $default_sort = 'SortOrder';
|
private static $default_sort = 'SortOrder';
|
||||||
|
|
||||||
static $extensions=array(
|
private static $extensions = array(
|
||||||
"Versioned('Stage', 'Live')"
|
"SilverStripe\\Versioned\\Versioned('Stage', 'Live')"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
class GridFieldAction_SortOrder_TestParent extends DataObject implements TestOnly {
|
/**
|
||||||
static $db = array(
|
* Class GridFieldAction_SortOrder_TestParent
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @method GridFieldAction_SortOrder_ChildObject TestRelation
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_TestParent extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_TestParent';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
'Name' => 'Varchar'
|
'Name' => 'Varchar'
|
||||||
);
|
);
|
||||||
|
|
||||||
static $has_many = array(
|
private static $has_many = array(
|
||||||
'TestRelation' => 'GridFieldAction_SortOrder_ChildObject'
|
'TestRelation' => GridFieldAction_SortOrder_ChildObject::class
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
class GridFieldAction_SortOrder_BaseObject extends DataObject implements TestOnly {
|
/**
|
||||||
static $db = array(
|
* Class GridFieldAction_SortOrder_BaseObject
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_BaseObject extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_BaseObject';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
'Name' => 'Varchar'
|
'Name' => 'Varchar'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
class GridFieldAction_SortOrder_ChildObject extends GridFieldAction_SortOrder_BaseObject implements TestOnly {
|
/**
|
||||||
static $db = array(
|
* Class GridFieldAction_SortOrder_ChildObject
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property int SortOrder
|
||||||
|
* @method GridFieldAction_SortOrder_TestParent Parent
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_ChildObject extends GridFieldAction_SortOrder_BaseObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_ChildObject';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
'SortOrder' => 'Int'
|
'SortOrder' => 'Int'
|
||||||
);
|
);
|
||||||
|
|
||||||
static $has_one = array(
|
private static $has_one = array(
|
||||||
'Parent'=>'GridFieldAction_SortOrder_TestParent'
|
'Parent' => GridFieldAction_SortOrder_TestParent::class
|
||||||
);
|
);
|
||||||
|
|
||||||
static $default_sort='SortOrder';
|
private static $default_sort = 'SortOrder';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class SortableGridField_DummyController
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
*/
|
||||||
|
class SortableGridField_DummyController extends Controller
|
||||||
|
{
|
||||||
|
private static $url_segment = 'sortable-grid-field';
|
||||||
}
|
}
|
||||||
?>
|
|
@ -1,4 +1,4 @@
|
|||||||
GridFieldAction_SortOrder_Player:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Player:
|
||||||
player1:
|
player1:
|
||||||
Name: Player 1
|
Name: Player 1
|
||||||
SortOrder: 0
|
SortOrder: 0
|
||||||
@ -9,7 +9,7 @@ GridFieldAction_SortOrder_Player:
|
|||||||
Name: Player 3
|
Name: Player 3
|
||||||
SortOrder: 0
|
SortOrder: 0
|
||||||
|
|
||||||
GridFieldAction_SortOrder_VPlayer:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VPlayer:
|
||||||
player1:
|
player1:
|
||||||
Name: Player 1
|
Name: Player 1
|
||||||
SortOrder: 0
|
SortOrder: 0
|
||||||
@ -20,20 +20,20 @@ GridFieldAction_SortOrder_VPlayer:
|
|||||||
Name: Player 3
|
Name: Player 3
|
||||||
SortOrder: 0
|
SortOrder: 0
|
||||||
|
|
||||||
GridFieldAction_SortOrder_TestParent:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_TestParent:
|
||||||
testparent:
|
testparent:
|
||||||
Name: Test
|
Name: Test
|
||||||
|
|
||||||
GridFieldAction_SortOrder_ChildObject:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_ChildObject:
|
||||||
testitem1:
|
testitem1:
|
||||||
Name: Test 1
|
Name: Test 1
|
||||||
SortOrder: 0
|
SortOrder: 0
|
||||||
Parent: =>GridFieldAction_SortOrder_TestParent.testparent
|
Parent: =>UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_TestParent.testparent
|
||||||
testitem2:
|
testitem2:
|
||||||
Name: Test 2
|
Name: Test 2
|
||||||
SortOrder: 0
|
SortOrder: 0
|
||||||
Parent: =>GridFieldAction_SortOrder_TestParent.testparent
|
Parent: =>UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_TestParent.testparent
|
||||||
testitem3:
|
testitem3:
|
||||||
Name: Test 3
|
Name: Test 3
|
||||||
SortOrder: 0
|
SortOrder: 0
|
||||||
Parent: =>GridFieldAction_SortOrder_TestParent.testparent
|
Parent: =>UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_TestParent.testparent
|
@ -1,6 +1,29 @@
|
|||||||
<?php
|
<?php
|
||||||
class GridFieldSortableRowsPageTest extends SapphireTest {
|
|
||||||
|
|
||||||
|
namespace UndefinedOffset\SortableGridField\Tests;
|
||||||
|
|
||||||
|
use SilverStripe\Control\Controller;
|
||||||
|
use SilverStripe\Control\HTTPRequest;
|
||||||
|
use SilverStripe\Control\Session;
|
||||||
|
use SilverStripe\Core\Injector\Injector;
|
||||||
|
use SilverStripe\Dev\SapphireTest;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\Form;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig_Base;
|
||||||
|
use SilverStripe\ORM\ArrayList;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\Versioned\Versioned;
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GridFieldSortableRowsPageTest
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
*/
|
||||||
|
class GridFieldSortableRowsPageTest extends SapphireTest
|
||||||
|
{
|
||||||
/** @var ArrayList */
|
/** @var ArrayList */
|
||||||
protected $list;
|
protected $list;
|
||||||
|
|
||||||
@ -14,63 +37,76 @@ class GridFieldSortableRowsPageTest extends SapphireTest {
|
|||||||
public static $fixture_file = 'GridFieldSortableRowsPageTest.yml';
|
public static $fixture_file = 'GridFieldSortableRowsPageTest.yml';
|
||||||
|
|
||||||
/** @var array */
|
/** @var array */
|
||||||
protected $extraDataObjects = array('GridFieldAction_PageSortOrder_Team', 'GridFieldAction_PageSortOrder_VTeam');
|
protected static $extra_dataobjects = array(
|
||||||
|
GridFieldAction_PageSortOrder_Team::class,
|
||||||
|
GridFieldAction_PageSortOrder_VTeam::class
|
||||||
|
);
|
||||||
|
|
||||||
public function setUp() {
|
public function setUp()
|
||||||
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
$this->list = GridFieldAction_PageSortOrder_Team::get();
|
$this->list = GridFieldAction_PageSortOrder_Team::get();
|
||||||
$config = GridFieldConfig_Base::create(5)->addComponent(new GridFieldSortableRows('SortOrder'));
|
$config = GridFieldConfig_Base::create(5)->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
$this->gridField = new GridField('testfield', 'testfield', $this->list, $config);
|
$this->gridField = new GridField('testfield', 'testfield', $this->list, $config);
|
||||||
$this->form = new Form(new Controller(), 'mockform', new FieldList(array($this->gridField)), new FieldList());
|
$this->form = new Form(new SortableGridField_DummyController(), 'mockform', FieldList::create(array($this->gridField)), FieldList::create());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSortToNextPage() {
|
public function testSortToNextPage()
|
||||||
|
{
|
||||||
$this->gridField->State->GridFieldPaginator->currentPage = 1;
|
$this->gridField->State->GridFieldPaginator->currentPage = 1;
|
||||||
|
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team3');
|
||||||
$team3 = $this->objFromFixture('GridFieldAction_PageSortOrder_Team', 'team3');
|
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
$this->logInWithPermission('ADMIN');
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'sortToPage', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true), 'GridFieldPaginator'=>array('currentPage'=>1))));
|
$request = new HTTPRequest('POST', 'url', array('ItemID' => $team3->ID, 'Target' => 'nextpage'), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array('ItemID'=>$team3->ID, 'Target'=>'nextpage'), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $this->form->getSecurityToken()->getName()=>$this->form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortToPage', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true), 'GridFieldPaginator' => array('currentPage' => 1))));
|
||||||
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
|
$team6 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team6');
|
||||||
$team6 = $this->objFromFixture('GridFieldAction_PageSortOrder_Team', 'team6');
|
|
||||||
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page');
|
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page');
|
||||||
|
|
||||||
$team3 = $this->objFromFixture('GridFieldAction_PageSortOrder_Team', 'team3');
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team3');
|
||||||
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page');
|
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSortToPrevPage() {
|
public function testSortToPrevPage()
|
||||||
|
{
|
||||||
$this->gridField->State->GridFieldPaginator->currentPage = 2;
|
$this->gridField->State->GridFieldPaginator->currentPage = 2;
|
||||||
|
|
||||||
|
$team7 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team7');
|
||||||
$team7 = $this->objFromFixture('GridFieldAction_PageSortOrder_Team', 'team7');
|
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
$this->logInWithPermission('ADMIN');
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'sortToPage', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true), 'GridFieldPaginator'=>array('currentPage'=>1))));
|
$request = new HTTPRequest('POST', 'url', array('ItemID' => $team7->ID, 'Target' => 'previouspage'), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array('ItemID'=>$team7->ID, 'Target'=>'previouspage'), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $this->form->getSecurityToken()->getName()=>$this->form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortToPage', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true), 'GridFieldPaginator' => array('currentPage' => 1))));
|
||||||
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
|
|
||||||
$team7 = $this->objFromFixture('GridFieldAction_PageSortOrder_Team', 'team7');
|
$team7 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team7');
|
||||||
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page');
|
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page');
|
||||||
|
|
||||||
$team5 = $this->objFromFixture('GridFieldAction_PageSortOrder_Team', 'team5');
|
$team5 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team', 'team5');
|
||||||
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page');
|
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSortToNextPageVersioned() {
|
public function testSortToNextPageVersioned()
|
||||||
|
{
|
||||||
//Force versioned to reset
|
//Force versioned to reset
|
||||||
Versioned::reset();
|
Versioned::reset();
|
||||||
|
|
||||||
$list = GridFieldAction_PageSortOrder_VTeam::get();
|
$list = GridFieldAction_PageSortOrder_VTeam::get();
|
||||||
$this->gridField->setList($list);
|
$this->gridField->setList($list);
|
||||||
$this->gridField->getConfig()->getComponentByType('GridFieldSortableRows')->setUpdateVersionedStage('Live');
|
|
||||||
|
/** @var GridFieldSortableRows $sortableGrid */
|
||||||
|
$sortableGrid = $this->gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableGrid->setUpdateVersionedStage('Live');
|
||||||
$this->gridField->State->GridFieldPaginator->currentPage = 1;
|
$this->gridField->State->GridFieldPaginator->currentPage = 1;
|
||||||
|
|
||||||
//Publish all records
|
//Publish all records
|
||||||
@ -79,23 +115,26 @@ class GridFieldSortableRowsPageTest extends SapphireTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$team3 = $this->objFromFixture('GridFieldAction_PageSortOrder_VTeam', 'team3');
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team3');
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
$this->logInWithPermission('ADMIN');
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'sortToPage', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true), 'GridFieldPaginator'=>array('currentPage'=>1))));
|
$request = new HTTPRequest('POST', 'url', array('ItemID' => $team3->ID, 'Target' => 'nextpage'), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array('ItemID'=>$team3->ID, 'Target'=>'nextpage'), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $this->form->getSecurityToken()->getName()=>$this->form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortToPage', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true), 'GridFieldPaginator' => array('currentPage' => 1))));
|
||||||
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
|
|
||||||
$team6 = $this->objFromFixture('GridFieldAction_PageSortOrder_VTeam', 'team6');
|
$team6 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team6');
|
||||||
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page on Versioned stage "Stage"');
|
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page on Versioned stage "Stage"');
|
||||||
|
|
||||||
$team3 = $this->objFromFixture('GridFieldAction_PageSortOrder_VTeam', 'team3');
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team3');
|
||||||
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page on Versioned stage "Stage"');
|
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
|
||||||
$list=Versioned::get_by_stage('GridFieldAction_PageSortOrder_VTeam', 'Live');
|
$list = Versioned::get_by_stage(GridFieldAction_PageSortOrder_VTeam::class, 'Live');
|
||||||
|
|
||||||
$team6 = $list->byID($team6->ID);
|
$team6 = $list->byID($team6->ID);
|
||||||
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page on Versioned stage "Live"');
|
$this->assertEquals(5, $team6->SortOrder, 'Team 6 Should have moved to the bottom of the first page on Versioned stage "Live"');
|
||||||
@ -104,13 +143,17 @@ class GridFieldSortableRowsPageTest extends SapphireTest {
|
|||||||
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page on Versioned stage "Live"');
|
$this->assertEquals(6, $team3->SortOrder, 'Team 3 Should have moved to the top of the second page on Versioned stage "Live"');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSortToPrevPageVersioned() {
|
public function testSortToPrevPageVersioned()
|
||||||
|
{
|
||||||
//Force versioned to reset
|
//Force versioned to reset
|
||||||
Versioned::reset();
|
Versioned::reset();
|
||||||
|
|
||||||
$list = GridFieldAction_PageSortOrder_VTeam::get();
|
$list = GridFieldAction_PageSortOrder_VTeam::get();
|
||||||
$this->gridField->setList($list);
|
$this->gridField->setList($list);
|
||||||
$this->gridField->getConfig()->getComponentByType('GridFieldSortableRows')->setUpdateVersionedStage('Live');
|
|
||||||
|
/** @var GridFieldSortableRows $sortableGrid */
|
||||||
|
$sortableGrid = $this->gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableGrid->setUpdateVersionedStage('Live');
|
||||||
$this->gridField->State->GridFieldPaginator->currentPage = 2;
|
$this->gridField->State->GridFieldPaginator->currentPage = 2;
|
||||||
|
|
||||||
//Publish all records
|
//Publish all records
|
||||||
@ -119,23 +162,26 @@ class GridFieldSortableRowsPageTest extends SapphireTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$team7 = $this->objFromFixture('GridFieldAction_PageSortOrder_VTeam', 'team7');
|
$team7 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team7');
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
$this->logInWithPermission('ADMIN');
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'sortToPage', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true), 'GridFieldPaginator'=>array('currentPage'=>1))));
|
$request = new HTTPRequest('POST', 'url', array('ItemID' => $team7->ID, 'Target' => 'previouspage'), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array('ItemID'=>$team7->ID, 'Target'=>'previouspage'), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $this->form->getSecurityToken()->getName()=>$this->form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'sortToPage', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true), 'GridFieldPaginator' => array('currentPage' => 1))));
|
||||||
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
|
|
||||||
$team7 = $this->objFromFixture('GridFieldAction_PageSortOrder_VTeam', 'team7');
|
$team7 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team7');
|
||||||
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page on Versioned stage "Stage"');
|
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page on Versioned stage "Stage"');
|
||||||
|
|
||||||
$team5 = $this->objFromFixture('GridFieldAction_PageSortOrder_VTeam', 'team5');
|
$team5 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam', 'team5');
|
||||||
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page on Versioned stage "Stage"');
|
$this->assertEquals(6, $team5->SortOrder, 'Team 5 Should have moved to the top of the second page on Versioned stage "Stage"');
|
||||||
|
|
||||||
|
|
||||||
$list=Versioned::get_by_stage('GridFieldAction_PageSortOrder_VTeam', 'Live');
|
$list = Versioned::get_by_stage(GridFieldAction_PageSortOrder_VTeam::class, 'Live');
|
||||||
|
|
||||||
$team7 = $list->byID($team7->ID);
|
$team7 = $list->byID($team7->ID);
|
||||||
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page on Versioned stage "Live"');
|
$this->assertEquals(5, $team7->SortOrder, 'Team 7 Should have moved to the bottom of the first page on Versioned stage "Live"');
|
||||||
@ -145,27 +191,48 @@ class GridFieldSortableRowsPageTest extends SapphireTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class GridFieldAction_PageSortOrder_Team extends DataObject implements TestOnly {
|
/**
|
||||||
static $db = array(
|
* Class GridFieldAction_PageSortOrder_Team
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property string City
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_PageSortOrder_Team extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_PageSortOrder_Team';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
'Name' => 'Varchar',
|
'Name' => 'Varchar',
|
||||||
'City' => 'Varchar',
|
'City' => 'Varchar',
|
||||||
'SortOrder' => 'Int'
|
'SortOrder' => 'Int'
|
||||||
);
|
);
|
||||||
|
|
||||||
static $default_sort='SortOrder';
|
private static $default_sort = 'SortOrder';
|
||||||
}
|
}
|
||||||
|
|
||||||
class GridFieldAction_PageSortOrder_VTeam extends DataObject implements TestOnly {
|
/**
|
||||||
static $db = array(
|
* Class GridFieldAction_PageSortOrder_VTeam
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property string City
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_PageSortOrder_VTeam extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_PageSortOrder_VTeam';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
'Name' => 'Varchar',
|
'Name' => 'Varchar',
|
||||||
'City' => 'Varchar',
|
'City' => 'Varchar',
|
||||||
'SortOrder' => 'Int'
|
'SortOrder' => 'Int'
|
||||||
);
|
);
|
||||||
|
|
||||||
static $default_sort='SortOrder';
|
private static $default_sort = 'SortOrder';
|
||||||
|
|
||||||
static $extensions=array(
|
private static $extensions = array(
|
||||||
"Versioned('Stage', 'Live')"
|
"SilverStripe\\Versioned\\Versioned('Stage', 'Live')"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
?>
|
|
@ -1,4 +1,4 @@
|
|||||||
GridFieldAction_PageSortOrder_Team:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_Team:
|
||||||
team1:
|
team1:
|
||||||
Name: Team 1
|
Name: Team 1
|
||||||
City: Cologne
|
City: Cologne
|
||||||
@ -36,7 +36,7 @@ GridFieldAction_PageSortOrder_Team:
|
|||||||
City: Auckland
|
City: Auckland
|
||||||
SortOrder: 9
|
SortOrder: 9
|
||||||
|
|
||||||
GridFieldAction_PageSortOrder_VTeam:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_PageSortOrder_VTeam:
|
||||||
team1:
|
team1:
|
||||||
Name: Team 1
|
Name: Team 1
|
||||||
City: Cologne
|
City: Cologne
|
||||||
|
@ -1,6 +1,25 @@
|
|||||||
<?php
|
<?php
|
||||||
class GridFieldSortableRowsTest extends SapphireTest {
|
|
||||||
|
|
||||||
|
namespace UndefinedOffset\SortableGridField\Tests;
|
||||||
|
|
||||||
|
use SilverStripe\Control\HTTPRequest;
|
||||||
|
use SilverStripe\Control\Session;
|
||||||
|
use SilverStripe\Core\Injector\Injector;
|
||||||
|
use SilverStripe\Dev\SapphireTest;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\Form;
|
||||||
|
use SilverStripe\Forms\GridField\GridField;
|
||||||
|
use SilverStripe\Forms\GridField\GridFieldConfig;
|
||||||
|
use SilverStripe\ORM\ArrayList;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\ORM\ValidationException;
|
||||||
|
use SilverStripe\Security\Member;
|
||||||
|
use SilverStripe\Versioned\Versioned;
|
||||||
|
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
|
||||||
|
|
||||||
|
class GridFieldSortableRowsTest extends SapphireTest
|
||||||
|
{
|
||||||
/** @var ArrayList */
|
/** @var ArrayList */
|
||||||
protected $list;
|
protected $list;
|
||||||
|
|
||||||
@ -14,93 +33,134 @@ class GridFieldSortableRowsTest extends SapphireTest {
|
|||||||
public static $fixture_file = 'GridFieldSortableRowsTest.yml';
|
public static $fixture_file = 'GridFieldSortableRowsTest.yml';
|
||||||
|
|
||||||
/** @var array */
|
/** @var array */
|
||||||
protected $extraDataObjects = array('GridFieldAction_SortOrder_Team', 'GridFieldAction_SortOrder_VTeam');
|
protected static $extra_dataobjects = array(
|
||||||
|
GridFieldAction_SortOrder_Team::class,
|
||||||
|
GridFieldAction_SortOrder_VTeam::class
|
||||||
|
);
|
||||||
|
|
||||||
public function setUp() {
|
public function setUp()
|
||||||
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
$this->list = GridFieldAction_SortOrder_Team::get();
|
$this->list = GridFieldAction_SortOrder_Team::get();
|
||||||
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
$config = GridFieldConfig::create()->addComponent(new GridFieldSortableRows('SortOrder'));
|
||||||
$this->gridField = new GridField('testfield', 'testfield', $this->list, $config);
|
$this->gridField = new GridField('testfield', 'testfield', $this->list, $config);
|
||||||
$this->form = new Form(new Controller(), 'mockform', new FieldList(array($this->gridField)), new FieldList());
|
$this->form = new Form(new SortableGridField_DummyController(), 'mockform', new FieldList(array($this->gridField)), new FieldList());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSortActionWithoutCorrectPermission() {
|
public function testSortActionWithoutCorrectPermission()
|
||||||
if(Member::currentUser()) { Member::currentUser()->logOut(); }
|
{
|
||||||
$this->setExpectedException('ValidationException');
|
if (Member::currentUser()) {
|
||||||
$team1 = $this->objFromFixture('GridFieldAction_SortOrder_Team', 'team1');
|
Member::currentUser()->logOut();
|
||||||
$team2 = $this->objFromFixture('GridFieldAction_SortOrder_Team', 'team2');
|
}
|
||||||
$team3 = $this->objFromFixture('GridFieldAction_SortOrder_Team', 'team3');
|
$this->setExpectedException(ValidationException::class);
|
||||||
|
$team1 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team1');
|
||||||
|
$team2 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team2');
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team3');
|
||||||
|
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'saveGridRowSort', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true))));
|
$request = new HTTPRequest('POST', 'url', array('ItemIDs' => "$team1->ID, $team3->ID, $team2->ID"), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array('ItemIDs'=>"$team1->ID, $team3->ID, $team2->ID"), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $this->form->getSecurityToken()->getName()=>$this->form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'saveGridRowSort', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
$this->assertEquals($team3->ID, $this->list->last()->ID, 'User should\'t be able to sort records without correct permissions.');
|
$this->assertEquals($team3->ID, $this->list->last()->ID, 'User should\'t be able to sort records without correct permissions.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSortActionWithAdminPermission() {
|
public function testSortActionWithAdminPermission()
|
||||||
$team1 = $this->objFromFixture('GridFieldAction_SortOrder_Team', 'team1');
|
{
|
||||||
$team2 = $this->objFromFixture('GridFieldAction_SortOrder_Team', 'team2');
|
$team1 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team1');
|
||||||
$team3 = $this->objFromFixture('GridFieldAction_SortOrder_Team', 'team3');
|
$team2 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team2');
|
||||||
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team', 'team3');
|
||||||
$this->logInWithPermission('ADMIN');
|
$this->logInWithPermission('ADMIN');
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'saveGridRowSort', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true))));
|
$request = new HTTPRequest('POST', 'url', array('ItemIDs' => "$team1->ID, $team3->ID, $team2->ID"), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array('ItemIDs'=>"$team1->ID, $team3->ID, $team2->ID"), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $this->form->getSecurityToken()->getName()=>$this->form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'saveGridRowSort', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
$this->assertEquals($team2->ID, $this->list->last()->ID, 'User should be able to sort records with ADMIN permission.');
|
$this->assertEquals($team2->ID, $this->list->last()->ID, 'User should be able to sort records with ADMIN permission.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSortActionVersioned() {
|
public function testSortActionVersioned()
|
||||||
|
{
|
||||||
//Force versioned to reset
|
//Force versioned to reset
|
||||||
Versioned::reset();
|
Versioned::reset();
|
||||||
|
|
||||||
$list = GridFieldAction_SortOrder_VTeam::get();
|
$list = GridFieldAction_SortOrder_VTeam::get();
|
||||||
$this->gridField->setList($list);
|
$this->gridField->setList($list);
|
||||||
$this->gridField->getConfig()->getComponentByType('GridFieldSortableRows')->setUpdateVersionedStage('Live');
|
|
||||||
|
/** @var GridFieldSortableRows $sortableGrid */
|
||||||
|
$sortableGrid = $this->gridField->getConfig()->getComponentByType(GridFieldSortableRows::class);
|
||||||
|
$sortableGrid->setUpdateVersionedStage('Live');
|
||||||
|
|
||||||
//Publish all records
|
//Publish all records
|
||||||
foreach ($list as $item) {
|
foreach ($list as $item) {
|
||||||
$item->publish('Stage', 'Live');
|
$item->publish('Stage', 'Live');
|
||||||
}
|
}
|
||||||
|
|
||||||
$team1 = $this->objFromFixture('GridFieldAction_SortOrder_VTeam', 'team1');
|
$team1 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VTeam', 'team1');
|
||||||
$team2 = $this->objFromFixture('GridFieldAction_SortOrder_VTeam', 'team2');
|
$team2 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VTeam', 'team2');
|
||||||
$team3 = $this->objFromFixture('GridFieldAction_SortOrder_VTeam', 'team3');
|
$team3 = $this->objFromFixture('UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VTeam', 'team3');
|
||||||
|
|
||||||
$this->logInWithPermission('ADMIN');
|
$this->logInWithPermission('ADMIN');
|
||||||
$stateID = 'testGridStateActionField';
|
$stateID = 'testGridStateActionField';
|
||||||
Session::set($stateID, array('grid'=>'', 'actionName'=>'saveGridRowSort', 'args'=>array('GridFieldSortableRows'=>array('sortableToggle'=>true))));
|
$request = new HTTPRequest('POST', 'url', array('ItemIDs' => "$team1->ID, $team3->ID, $team2->ID"), array('action_gridFieldAlterAction?StateID=' . $stateID => true, $this->form->getSecurityToken()->getName() => $this->form->getSecurityToken()->getValue()));
|
||||||
$request = new SS_HTTPRequest('POST', 'url', array('ItemIDs'=>"$team1->ID, $team3->ID, $team2->ID"), array('action_gridFieldAlterAction?StateID='.$stateID=>true, $this->form->getSecurityToken()->getName()=>$this->form->getSecurityToken()->getValue()));
|
$session = Injector::inst()->create(Session::class, []);
|
||||||
|
$request->setSession($session);
|
||||||
|
$session->init($request);
|
||||||
|
$session->set($stateID, array('grid' => '', 'actionName' => 'saveGridRowSort', 'args' => array('GridFieldSortableRows' => array('sortableToggle' => true))));
|
||||||
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
$this->gridField->gridFieldAlterAction(array('StateID' => $stateID), $this->form, $request);
|
||||||
|
|
||||||
$this->assertEquals($team2->ID, $list->last()->ID, 'Sort should have happened on Versioned stage "Stage"');
|
$this->assertEquals($team2->ID, $list->last()->ID, 'Sort should have happened on Versioned stage "Stage"');
|
||||||
|
|
||||||
$list=Versioned::get_by_stage('GridFieldAction_SortOrder_VTeam', 'Live');
|
$list = Versioned::get_by_stage(GridFieldAction_SortOrder_VTeam::class, 'Live');
|
||||||
$this->assertEquals($team2->ID, $list->last()->ID, 'Sort should have happened on Versioned stage "Live"');
|
$this->assertEquals($team2->ID, $list->last()->ID, 'Sort should have happened on Versioned stage "Live"');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class GridFieldAction_SortOrder_Team extends DataObject implements TestOnly {
|
/**
|
||||||
static $db = array(
|
* Class GridFieldAction_SortOrder_Team
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property string City
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_Team extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_Team';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
'Name' => 'Varchar',
|
'Name' => 'Varchar',
|
||||||
'City' => 'Varchar',
|
'City' => 'Varchar',
|
||||||
'SortOrder' => 'Int'
|
'SortOrder' => 'Int'
|
||||||
);
|
);
|
||||||
|
|
||||||
static $default_sort='SortOrder';
|
private static $default_sort = 'SortOrder';
|
||||||
}
|
}
|
||||||
|
|
||||||
class GridFieldAction_SortOrder_VTeam extends DataObject implements TestOnly {
|
/**
|
||||||
static $db = array(
|
* Class GridFieldAction_SortOrder_VTeam
|
||||||
|
*
|
||||||
|
* @package SortableGridField\Tests
|
||||||
|
* @property string Name
|
||||||
|
* @property string City
|
||||||
|
* @property int SortOrder
|
||||||
|
*/
|
||||||
|
class GridFieldAction_SortOrder_VTeam extends DataObject implements TestOnly
|
||||||
|
{
|
||||||
|
private static $table_name = 'GridFieldAction_SortOrder_VTeam';
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
'Name' => 'Varchar',
|
'Name' => 'Varchar',
|
||||||
'City' => 'Varchar',
|
'City' => 'Varchar',
|
||||||
'SortOrder' => 'Int'
|
'SortOrder' => 'Int'
|
||||||
);
|
);
|
||||||
|
private static $default_sort = 'SortOrder';
|
||||||
|
|
||||||
static $default_sort='SortOrder';
|
private static $extensions = array(
|
||||||
|
"SilverStripe\\Versioned\\Versioned('Stage', 'Live')"
|
||||||
static $extensions=array(
|
|
||||||
"Versioned('Stage', 'Live')"
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
?>
|
|
@ -1,4 +1,4 @@
|
|||||||
GridFieldAction_SortOrder_Team:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_Team:
|
||||||
team1:
|
team1:
|
||||||
Name: Team 1
|
Name: Team 1
|
||||||
City: Cologne
|
City: Cologne
|
||||||
@ -12,7 +12,7 @@ GridFieldAction_SortOrder_Team:
|
|||||||
City: Auckland
|
City: Auckland
|
||||||
SortOrder: 3
|
SortOrder: 3
|
||||||
|
|
||||||
GridFieldAction_SortOrder_VTeam:
|
UndefinedOffset\SortableGridField\Tests\GridFieldAction_SortOrder_VTeam:
|
||||||
team1:
|
team1:
|
||||||
Name: Team 1
|
Name: Team 1
|
||||||
City: Cologne
|
City: Cologne
|
||||||
|
Loading…
Reference in New Issue
Block a user