diff --git a/src/GridFieldOrderableRows.php b/src/GridFieldOrderableRows.php index 310dcee..2d25109 100755 --- a/src/GridFieldOrderableRows.php +++ b/src/GridFieldOrderableRows.php @@ -534,8 +534,20 @@ class GridFieldOrderableRows extends RequestHandler implements $isVersioned = false; $class = $list->dataClass(); - if (DataObject::getSchema()->tableName($class) == $this->getSortTable($list)) { - $isVersioned = $class::has_extension(Versioned::class); + // check if sort column is present on the model provided by dataClass() and if it's versioned + // cases: + // Model has sort column and is versioned - handle as versioned + // Model has sort column and is NOT versioned - handle as NOT versioned + // Model doesn't have sort column because sort column is on ManyManyList - handle as NOT versioned + + // try to match table name, note that we have to cover the case where the table which has the sort column + // belongs to ancestor of the object which is populating the list + $classes = ClassInfo::ancestry($class, true); + foreach ($classes as $currentClass) { + if (DataObject::getSchema()->tableName($currentClass) == $this->getSortTable($list)) { + $isVersioned = $class::has_extension(Versioned::class); + break; + } } // Loop through each item, and update the sort values which do not diff --git a/tests/GridFieldOrderableRowsTest.php b/tests/GridFieldOrderableRowsTest.php index d49674d..487d601 100644 --- a/tests/GridFieldOrderableRowsTest.php +++ b/tests/GridFieldOrderableRowsTest.php @@ -9,8 +9,10 @@ use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor; use Symbiote\GridFieldExtensions\GridFieldOrderableRows; use Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild; use Symbiote\GridFieldExtensions\Tests\Stub\StubOrdered; +use Symbiote\GridFieldExtensions\Tests\Stub\StubOrderedVersioned; use Symbiote\GridFieldExtensions\Tests\Stub\StubParent; use Symbiote\GridFieldExtensions\Tests\Stub\StubSubclass; +use Symbiote\GridFieldExtensions\Tests\Stub\StubSubclassOrderedVersioned; use Symbiote\GridFieldExtensions\Tests\Stub\StubUnorderable; /** @@ -18,17 +20,22 @@ use Symbiote\GridFieldExtensions\Tests\Stub\StubUnorderable; */ class GridFieldOrderableRowsTest extends SapphireTest { - - protected $usesDatabase = true; - + /** + * @var string + */ protected static $fixture_file = 'GridFieldOrderableRowsTest.yml'; + /** + * @var array + */ protected static $extra_dataobjects = [ StubParent::class, StubOrdered::class, StubSubclass::class, StubUnorderable::class, StubOrderableChild::class, + StubOrderedVersioned::class, + StubSubclassOrderedVersioned::class, ]; public function testReorderItems() @@ -125,5 +132,77 @@ class GridFieldOrderableRowsTest extends SapphireTest 'StubParent_MyManyMany', $orderable->setSortField('ManyManySort')->getSortTable($parent->MyManyMany()) ); + + $this->assertEquals( + 'StubOrderedVersioned', + $orderable->setSortField('Sort')->getSortTable($parent->MyHasManySubclassOrderedVersioned()) + ); + } + + public function testReorderItemsSubclassVersioned() + { + $orderable = new GridFieldOrderableRows('Sort'); + $reflection = new ReflectionMethod($orderable, 'executeReorder'); + $reflection->setAccessible(true); + + $parent = $this->objFromFixture(StubParent::class, 'parent-subclass-ordered-versioned'); + + // make sure all items are published + foreach ($parent->MyHasManySubclassOrderedVersioned() as $item) { + $item->publishRecursive(); + } + + // there should be no difference between stages at this point + $differenceFound = false; + foreach ($parent->MyHasManySubclassOrderedVersioned() as $item) { + /** @var StubSubclassOrderedVersioned|Versioned $item */ + if ($item->stagesDiffer()) { + $this->fail('Unexpected diference found on stages'); + } + } + + // reorder items + $config = new GridFieldConfig_RelationEditor(); + $config->addComponent($orderable); + + $grid = new GridField( + 'TestField', + 'TestField', + $parent->MyHasManySubclassOrderedVersioned()->sort('Sort', 'ASC'), + $config + ); + + $originalOrder = $parent->MyHasManySubclassOrderedVersioned() + ->sort('Sort', 'ASC') + ->column('ID'); + + $desiredOrder = []; + + // Make order non-contiguous, and 1-based + foreach (array_reverse($originalOrder) as $index => $id) { + $desiredOrder[$index * 2 + 1] = $id; + } + + $this->assertNotEquals($originalOrder, $desiredOrder); + + $reflection->invoke($orderable, $grid, $desiredOrder); + + $newOrder = $parent->MyHasManySubclassOrderedVersioned() + ->sort('Sort', 'ASC') + ->map('Sort', 'ID') + ->toArray(); + + $this->assertEquals($desiredOrder, $newOrder); + + // reorder should have been handled as versioned - there should be a difference between stages now + $differenceFound = false; + foreach ($parent->MyHasManySubclassOrderedVersioned() as $item) { + if ($item->stagesDiffer()) { + $differenceFound = true; + break; + } + } + + $this->assertTrue($differenceFound); } } diff --git a/tests/GridFieldOrderableRowsTest.yml b/tests/GridFieldOrderableRowsTest.yml index 20d5c34..8efc5ec 100644 --- a/tests/GridFieldOrderableRowsTest.yml +++ b/tests/GridFieldOrderableRowsTest.yml @@ -21,7 +21,26 @@ Symbiote\GridFieldExtensions\Tests\Stub\StubOrdered: item6: Sort: 6 nestedtest: - Children: =>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item1,=>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item2,=>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item3,=>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item4 + Children: + - =>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item1 + - =>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item2 + - =>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item3 + - =>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item4 + +Symbiote\GridFieldExtensions\Tests\Stub\StubSubclassOrderedVersioned: + item1: + ExtraField: 1 + Sort: 1 + item2: + ExtraField: 2 + Sort: 2 + item3: + ExtraField: 3 + Sort: 3 + item4: + ExtraField: 4 + Sort: 4 + Symbiote\GridFieldExtensions\Tests\Stub\StubParent: parent: MyManyMany: @@ -37,3 +56,9 @@ Symbiote\GridFieldExtensions\Tests\Stub\StubParent: ManyManySort: 108 - =>Symbiote\GridFieldExtensions\Tests\Stub\StubOrdered.item6: ManyManySort: 108 + parent-subclass-ordered-versioned: + MyHasManySubclassOrderedVersioned: + - =>Symbiote\GridFieldExtensions\Tests\Stub\StubSubclassOrderedVersioned.item1 + - =>Symbiote\GridFieldExtensions\Tests\Stub\StubSubclassOrderedVersioned.item2 + - =>Symbiote\GridFieldExtensions\Tests\Stub\StubSubclassOrderedVersioned.item3 + - =>Symbiote\GridFieldExtensions\Tests\Stub\StubSubclassOrderedVersioned.item4 diff --git a/tests/Stub/StubOrderedVersioned.php b/tests/Stub/StubOrderedVersioned.php new file mode 100644 index 0000000..83bc009 --- /dev/null +++ b/tests/Stub/StubOrderedVersioned.php @@ -0,0 +1,33 @@ + 'Int', + ]; +} diff --git a/tests/Stub/StubParent.php b/tests/Stub/StubParent.php index 7d60a11..4193c1c 100644 --- a/tests/Stub/StubParent.php +++ b/tests/Stub/StubParent.php @@ -9,7 +9,8 @@ class StubParent extends DataObject implements TestOnly { private static $has_many = array( 'MyHasMany' => StubOrdered::class, - 'MyHasManySubclass' => StubSubclass::class + 'MyHasManySubclass' => StubSubclass::class, + 'MyHasManySubclassOrderedVersioned' => StubSubclassOrderedVersioned::class, ); private static $many_many = array( diff --git a/tests/Stub/StubSubclassOrderedVersioned.php b/tests/Stub/StubSubclassOrderedVersioned.php new file mode 100644 index 0000000..e0e112d --- /dev/null +++ b/tests/Stub/StubSubclassOrderedVersioned.php @@ -0,0 +1,33 @@ + 'Int', + ]; + + /** + * @var array + */ + private static $has_one = [ + 'Parent' => StubParent::class, + ]; +}