add child element ordering
This commit is contained in:
parent
7323925319
commit
62dc119b11
12 changed files with 554 additions and 11 deletions
|
|
@ -14,6 +14,11 @@ class FakeElementRepository implements ElementRepository
|
|||
*/
|
||||
private array $elementsById = [];
|
||||
|
||||
/**
|
||||
* @var array<int, int>
|
||||
*/
|
||||
private array $sortOrdersById = [];
|
||||
|
||||
public function create(CreateElementDto $dto): Element
|
||||
{
|
||||
$id = count($this->elementsById) + 1;
|
||||
|
|
@ -30,6 +35,9 @@ class FakeElementRepository implements ElementRepository
|
|||
parentElement: $dto->parentElement,
|
||||
);
|
||||
$this->elementsById[$id] = $element;
|
||||
$this->sortOrdersById[$id] = $this->nextSortOrder(
|
||||
$dto->parentElement,
|
||||
);
|
||||
|
||||
return $element;
|
||||
}
|
||||
|
|
@ -45,6 +53,7 @@ class FakeElementRepository implements ElementRepository
|
|||
public function delete(Element $element): void
|
||||
{
|
||||
unset($this->elementsById[$element->getId()]);
|
||||
unset($this->sortOrdersById[$element->getId()]);
|
||||
}
|
||||
|
||||
public function find(int $id): ?Element
|
||||
|
|
@ -100,10 +109,43 @@ class FakeElementRepository implements ElementRepository
|
|||
$elements[] = $this->cloneElement($element);
|
||||
}
|
||||
}
|
||||
usort($elements, function (
|
||||
Element $firstElement,
|
||||
Element $secondElement,
|
||||
): int {
|
||||
$firstSortOrder = $this->sortOrdersById[
|
||||
$firstElement->getId()
|
||||
] ?? $firstElement->getId();
|
||||
$secondSortOrder = $this->sortOrdersById[
|
||||
$secondElement->getId()
|
||||
] ?? $secondElement->getId();
|
||||
if ($firstSortOrder === $secondSortOrder) {
|
||||
return $firstElement->getId() <=> $secondElement->getId();
|
||||
}
|
||||
|
||||
return $firstSortOrder <=> $secondSortOrder;
|
||||
});
|
||||
|
||||
return $elements;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int[] $childElementIds
|
||||
* @return Element[]
|
||||
*/
|
||||
public function reorderChildren(
|
||||
Element $parentElement,
|
||||
array $childElementIds,
|
||||
): array {
|
||||
$sortOrder = 1;
|
||||
foreach ($childElementIds as $childElementId) {
|
||||
$this->sortOrdersById[$childElementId] = $sortOrder;
|
||||
$sortOrder++;
|
||||
}
|
||||
|
||||
return $this->findByParentElement($parentElement);
|
||||
}
|
||||
|
||||
private function cloneElement(Element $element): Element
|
||||
{
|
||||
$parentElement = $element->getParentElement();
|
||||
|
|
@ -124,4 +166,24 @@ class FakeElementRepository implements ElementRepository
|
|||
parentElement: $parentElement,
|
||||
);
|
||||
}
|
||||
|
||||
private function nextSortOrder(?Element $parentElement): int
|
||||
{
|
||||
$parentElementId = $parentElement?->getId();
|
||||
$nextSortOrder = 1;
|
||||
foreach ($this->elementsById as $element) {
|
||||
$currentParentElement = $element->getParentElement();
|
||||
$currentParentElementId = $currentParentElement?->getId();
|
||||
if ($currentParentElementId !== $parentElementId) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$currentSortOrder = $this->sortOrdersById[$element->getId()] ?? 0;
|
||||
if ($currentSortOrder >= $nextSortOrder) {
|
||||
$nextSortOrder = $currentSortOrder + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $nextSortOrder;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ use App\Element\Element;
|
|||
use App\Element\UseCases\CreateChildElement\CreateChildElement;
|
||||
use App\Element\UseCases\DeleteChildElement\DeleteChildElement;
|
||||
use App\Element\UseCases\GetElement\GetElement;
|
||||
use App\Element\UseCases\ReorderChildElements\ReorderChildElements;
|
||||
use App\Element\UseCases\UpdateElement\UpdateDescription;
|
||||
use App\Element\UseCases\UpdateElement\UpdateElement;
|
||||
use App\Element\UseCases\UpdateElement\UpdateIconImage;
|
||||
|
|
@ -65,6 +66,7 @@ class ElementControllerTest extends TestCase
|
|||
$getElement,
|
||||
new CreateChildElement($this->elementRepo),
|
||||
new DeleteChildElement($this->elementRepo, $this->fileUploader),
|
||||
new ReorderChildElements($this->elementRepo),
|
||||
$updateElement,
|
||||
$this->fileUploader,
|
||||
);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue