diff --git a/src/Controller/TreeController.php b/src/Controller/TreeController.php index 4c340079..b79f6994 100644 --- a/src/Controller/TreeController.php +++ b/src/Controller/TreeController.php @@ -84,7 +84,7 @@ class TreeController extends AbstractController */ public function categoryTree(?Category $category = null): JsonResponse { - $tree = $this->treeGenerator->getTreeView(Category::class, $category); + $tree = $this->treeGenerator->getTreeView(Category::class, $category, 'list_parts_root'); return new JsonResponse($tree); } @@ -95,7 +95,7 @@ class TreeController extends AbstractController */ public function footprintTree(?Footprint $footprint = null): JsonResponse { - $tree = $this->treeGenerator->getTreeView(Footprint::class, $footprint); + $tree = $this->treeGenerator->getTreeView(Footprint::class, $footprint, 'list_parts_root'); return new JsonResponse($tree); } @@ -106,7 +106,7 @@ class TreeController extends AbstractController */ public function locationTree(?Storelocation $location = null): JsonResponse { - $tree = $this->treeGenerator->getTreeView(Storelocation::class, $location); + $tree = $this->treeGenerator->getTreeView(Storelocation::class, $location, 'list_parts_root'); return new JsonResponse($tree); } @@ -117,7 +117,7 @@ class TreeController extends AbstractController */ public function manufacturerTree(?Manufacturer $manufacturer = null): JsonResponse { - $tree = $this->treeGenerator->getTreeView(Manufacturer::class, $manufacturer); + $tree = $this->treeGenerator->getTreeView(Manufacturer::class, $manufacturer, 'list_parts_root'); return new JsonResponse($tree); } @@ -128,7 +128,7 @@ class TreeController extends AbstractController */ public function supplierTree(?Supplier $supplier = null): JsonResponse { - $tree = $this->treeGenerator->getTreeView(Supplier::class, $supplier); + $tree = $this->treeGenerator->getTreeView(Supplier::class, $supplier, 'list_parts_root'); return new JsonResponse($tree); } diff --git a/src/Helpers/Trees/TreeViewNode.php b/src/Helpers/Trees/TreeViewNode.php index a604e932..889eed97 100644 --- a/src/Helpers/Trees/TreeViewNode.php +++ b/src/Helpers/Trees/TreeViewNode.php @@ -204,6 +204,18 @@ final class TreeViewNode implements JsonSerializable return $this; } + public function setExpanded(?bool $selected): self + { + //Lazy loading of state, so it does not need to get serialized and transfered, when it is empty. + if (null === $this->state) { + $this->state = new TreeViewNodeState(); + } + + $this->state->setExpanded(true); + + return $this; + } + public function getTags(): ?array { return $this->tags; diff --git a/src/Helpers/Trees/TreeViewNodeState.php b/src/Helpers/Trees/TreeViewNodeState.php index e61ee692..3fa33758 100644 --- a/src/Helpers/Trees/TreeViewNodeState.php +++ b/src/Helpers/Trees/TreeViewNodeState.php @@ -66,9 +66,10 @@ final class TreeViewNodeState implements JsonSerializable return $this->disabled; } - public function setDisabled(?bool $disabled): void + public function setDisabled(?bool $disabled): self { $this->disabled = $disabled; + return $this; } public function getExpanded(): ?bool @@ -76,9 +77,10 @@ final class TreeViewNodeState implements JsonSerializable return $this->expanded; } - public function setExpanded(?bool $expanded): void + public function setExpanded(?bool $expanded): self { $this->expanded = $expanded; + return $this; } public function getSelected(): ?bool @@ -86,9 +88,10 @@ final class TreeViewNodeState implements JsonSerializable return $this->selected; } - public function setSelected(?bool $selected): void + public function setSelected(?bool $selected): self { $this->selected = $selected; + return $this; } public function jsonSerialize() diff --git a/src/Services/Trees/TreeViewGenerator.php b/src/Services/Trees/TreeViewGenerator.php index f44b0b98..5a25042a 100644 --- a/src/Services/Trees/TreeViewGenerator.php +++ b/src/Services/Trees/TreeViewGenerator.php @@ -47,6 +47,7 @@ use App\Entity\Base\AbstractNamedDBElement; use App\Entity\Base\AbstractStructuralDBElement; use App\Helpers\Trees\TreeViewNode; use App\Helpers\Trees\TreeViewNodeIterator; +use App\Helpers\Trees\TreeViewNodeState; use App\Repository\StructuralDBElementRepository; use App\Services\EntityURLGenerator; use App\Services\UserCacheKeyGenerator; @@ -84,12 +85,14 @@ class TreeViewGenerator * * @return TreeViewNode[] an array of TreeViewNode[] elements of the root elements */ - public function getTreeView(string $class, ?AbstractStructuralDBElement $parent = null, string $href_type = 'list_parts', ?AbstractDBElement $selectedElement = null): array + public function getTreeView(string $class, ?AbstractStructuralDBElement $parent = null, string $mode = 'list_parts', ?AbstractDBElement $selectedElement = null): array { $head = []; + $href_type = $mode; + //When we use the newEdit type, add the New Element node. - if ('newEdit' === $href_type) { + if ('newEdit' === $mode) { //Generate the url for the new node $href = $this->urlGenerator->createURL(new $class()); $new_node = new TreeViewNode($this->translator->trans('entity.tree.new'), $href); @@ -105,6 +108,10 @@ class TreeViewGenerator $href_type = 'edit'; } + if ($mode === 'list_parts_root') { + $href_type = 'list_parts'; + } + $generic = $this->getGenericTree($class, $parent); $treeIterator = new TreeViewNodeIterator($generic); $recursiveIterator = new \RecursiveIteratorIterator($treeIterator, \RecursiveIteratorIterator::SELF_FIRST); @@ -129,6 +136,12 @@ class TreeViewGenerator } } + if ($mode === 'list_parts_root') { + $root_node = new TreeViewNode($this->translator->trans('tree.root_node.text'), null, $generic); + $root_node->setExpanded(true); + $generic = [$root_node]; + } + return array_merge($head, $generic); } diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 9282133a..751ca180 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -9321,5 +9321,11 @@ Element 3 Your password needs to be changed! Please set a new password. + + + tree.root_node.text + Root node + +