From b8c9d9b408937b1861c1a0deded757da02e413a0 Mon Sep 17 00:00:00 2001 From: zeeshan Date: Sun, 2 Feb 2025 00:13:38 +0500 Subject: [PATCH] [Feature Request] Add ability to control navigation groups order #15498 --- .../panels/src/Navigation/NavigationGroup.php | 12 ++++ .../src/Navigation/NavigationManager.php | 60 ++++++------------- 2 files changed, 30 insertions(+), 42 deletions(-) diff --git a/packages/panels/src/Navigation/NavigationGroup.php b/packages/panels/src/Navigation/NavigationGroup.php index 0a20d4e5666..0058f1f0b76 100644 --- a/packages/panels/src/Navigation/NavigationGroup.php +++ b/packages/panels/src/Navigation/NavigationGroup.php @@ -25,6 +25,7 @@ class NavigationGroup extends Component protected array | Arrayable $items = []; protected string | Closure | null $label = null; + protected int|Closure|null $order = null; // NEW ORDER PROPERTY final public function __construct(string | Closure | null $label = null) { @@ -119,4 +120,15 @@ public function isActive(): bool return false; } + + public function order(int|Closure|null $order = null): static + { + $this->order = $order; + return $this; + } + + public function getOrder(): ?int + { + return $this->evaluate($this->order); + } } diff --git a/packages/panels/src/Navigation/NavigationManager.php b/packages/panels/src/Navigation/NavigationManager.php index b2d63e3167e..4d2a9568652 100644 --- a/packages/panels/src/Navigation/NavigationManager.php +++ b/packages/panels/src/Navigation/NavigationManager.php @@ -46,24 +46,27 @@ public function get(): array return $this->panel->buildNavigation(); } - if (! $this->isNavigationMounted) { + if (!$this->isNavigationMounted) { $this->mountNavigation(); } - $groups = collect($this->getNavigationGroups()); + $groups = collect($this->getNavigationGroups()) + ->sortBy(fn(NavigationGroup $group) => $group->getOrder() ?? PHP_INT_MAX); // Sort groups by their order return collect($this->getNavigationItems()) ->filter(fn (NavigationItem $item): bool => $item->isVisible()) - ->sortBy(fn (NavigationItem $item): int => $item->getSort()) - ->groupBy(fn (NavigationItem $item): string => $item->getGroup() ?? '') + ->sortBy(fn(NavigationItem $item) => $item->getSort()) + ->groupBy(fn(NavigationItem $item) => $item->getGroup() ?? '') ->map(function (Collection $items, string $groupIndex) use ($groups): NavigationGroup { - $parentItems = $items->groupBy(fn (NavigationItem $item): string => $item->getParentItem() ?? ''); + + $parentItems = $items->groupBy(fn(NavigationItem $item) => $item->getParentItem() ?? ''); $items = $parentItems->get('') - ->keyBy(fn (NavigationItem $item): string => $item->getLabel()); + ->keyBy(fn(NavigationItem $item) => $item->getLabel()) + ->sortBy(fn(NavigationItem $item) => $item->getSort() ?? PHP_INT_MAX); // Sort items by their order $parentItems->except([''])->each(function (Collection $parentItemItems, string $parentItemLabel) use ($items) { - if (! $items->has($parentItemLabel)) { + if (!$items->has($parentItemLabel)) { return; } @@ -75,56 +78,29 @@ public function get(): array } $registeredGroup = $groups - ->first(function (NavigationGroup | string $registeredGroup, string | int $registeredGroupIndex) use ($groupIndex) { - if ($registeredGroupIndex === $groupIndex) { - return true; - } - - if ($registeredGroup === $groupIndex) { + ->first(function (NavigationGroup|string $registeredGroup) use ($groupIndex) { + if ($registeredGroup instanceof NavigationGroup && $registeredGroup->getLabel() === $groupIndex) { return true; } - - if (! $registeredGroup instanceof NavigationGroup) { - return false; - } - - return $registeredGroup->getLabel() === $groupIndex; + return false; }); if ($registeredGroup instanceof NavigationGroup) { return $registeredGroup->items($items); } - return NavigationGroup::make($registeredGroup ?? $groupIndex) - ->items($items); + return NavigationGroup::make($groupIndex)->items($items); }) - ->sortBy(function (NavigationGroup $group, ?string $groupIndex): int { + ->sortBy(function (NavigationGroup $group) { + if (blank($group->getLabel())) { return -1; } + return $group->getOrder() ?? PHP_INT_MAX; - $registeredGroups = $this->getNavigationGroups(); - - $groupsToSearch = $registeredGroups; - - if (Arr::first($registeredGroups) instanceof NavigationGroup) { - $groupsToSearch = [ - ...array_keys($registeredGroups), - ...array_map(fn (NavigationGroup $registeredGroup): string => $registeredGroup->getLabel(), array_values($registeredGroups)), - ]; - } - - $sort = array_search( - $groupIndex, - $groupsToSearch, - ); - - if ($sort === false) { - return count($registeredGroups); - } - return $sort; }) + ->values() ->all(); }