add child element ordering

This commit is contained in:
Yisroel Baum 2026-06-22 09:51:21 +03:00
parent 7323925319
commit 62dc119b11
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
12 changed files with 554 additions and 11 deletions

View file

@ -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;
}
}