| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 | 
							- <?php
 - 
 - namespace App\Filament\Components;
 - 
 - use Filament\Contracts\Plugin;
 - use Filament\Panel;
 - use Filament\Panel\Concerns\HasNavigation;
 - use Filament\View\PanelsRenderHook;
 - 
 - class PanelShiftDropdown implements Plugin
 - {
 -     use HasNavigation;
 - 
 -     protected string $view = 'components.panel-shift-dropdown';
 - 
 -     protected string $renderHook = PanelsRenderHook::USER_MENU_BEFORE;
 - 
 -     protected bool $hasDisplayAndAccessibility = true;
 - 
 -     protected bool $hasCompanySettings = true;
 - 
 -     protected bool $hasLogoutItem = true;
 - 
 -     protected int $groupIndex = 0;
 - 
 -     public function displayAndAccessibility(bool $condition = true): static
 -     {
 -         $this->hasDisplayAndAccessibility = $condition;
 - 
 -         return $this;
 -     }
 - 
 -     public function hasDisplayAndAccessibility(): bool
 -     {
 -         return $this->hasDisplayAndAccessibility;
 -     }
 - 
 -     public function companySettings(bool $condition = true): static
 -     {
 -         $this->hasCompanySettings = $condition;
 - 
 -         return $this;
 -     }
 - 
 -     public function hasCompanySettings(): bool
 -     {
 -         return $this->hasCompanySettings;
 -     }
 - 
 -     public function logoutItem(bool $condition = true): static
 -     {
 -         $this->hasLogoutItem = $condition;
 - 
 -         return $this;
 -     }
 - 
 -     public function hasLogoutItem(): bool
 -     {
 -         return $this->hasLogoutItem;
 -     }
 - 
 -     public function getNavigation(): array
 -     {
 -         if ($this->hasNavigationBuilder()) {
 -             return $this->buildNavigation();
 -         }
 - 
 -         return [];
 -     }
 - 
 -     public static function make(): static
 -     {
 -         return app(static::class);
 -     }
 - 
 -     public function getId(): string
 -     {
 -         return 'panel-shift-dropdown';
 -     }
 - 
 -     public function register(Panel $panel): void
 -     {
 -         if ($this->hasNavigation()) {
 -             $panel->renderHook($this->getRenderHook(), function () {
 -                 return view($this->view, [
 -                     'component' => $this,
 -                 ]);
 -             });
 -         }
 -     }
 - 
 -     public function getNavigationAsHierarchyArray(): array
 -     {
 -         $navigation = $this->getNavigation();
 - 
 -         $panels = $this->initializePanels();
 - 
 -         foreach ($navigation as $item) {
 -             $this->processItem($item, $panels);
 -         }
 - 
 -         $this->addCompanySettingsItems($panels);
 -         $this->addAccessibilityItems($panels);
 - 
 -         return $panels;
 -     }
 - 
 -     protected function initializePanels(): array
 -     {
 -         return [
 -             'main' => [
 -                 'panelId' => 'main',
 -                 'label' => 'Main',
 -                 'items' => [],
 -                 'renderItems' => true,
 -             ],
 -         ];
 -     }
 - 
 -     protected function processItem($item, array &$panels, $parentId = 'main'): void
 -     {
 -         if (method_exists($item, 'getItems') && ! empty($item->getLabel())) {
 -             $this->processGroupItem($item, $panels, $parentId);
 -         } elseif (method_exists($item, 'getItems') && empty($item->getLabel())) {
 -             foreach ($item->getItems() as $groupItem) {
 -                 $this->processItem($groupItem, $panels, $parentId);
 -             }
 -         } elseif (method_exists($item, 'getChildItems') && ! empty($item->getChildItems())) {
 -             $this->processNavigationItem($item, $panels, $parentId);
 -         } else {
 -             $this->addStandaloneItem($item, $panels, $parentId);
 -         }
 -     }
 - 
 -     protected function processGroupItem($item, array &$panels, $parentId): void
 -     {
 -         $uniqueId = 'group-' . ++$this->groupIndex;
 - 
 -         $panels[$uniqueId] = $this->createPanel($uniqueId, $item);
 - 
 -         $panels[$parentId]['items'][] = $this->createPanelReference($uniqueId, $item);
 - 
 -         foreach ($item->getItems() as $groupItem) {
 -             $this->processItem($groupItem, $panels, $uniqueId);
 -         }
 -     }
 - 
 -     protected function processNavigationItem($item, array &$panels, $parentId): void
 -     {
 -         $uniqueId = 'group-' . ++$this->groupIndex;
 - 
 -         $panels[$uniqueId] = $this->createPanel($uniqueId, $item);
 - 
 -         $panels[$parentId]['items'][] = $this->createPanelReference($uniqueId, $item);
 - 
 -         foreach ($item->getChildItems() as $childItem) {
 -             $this->processItem($childItem, $panels, $uniqueId);
 -         }
 -     }
 - 
 -     protected function addStandaloneItem($item, array &$panels, $parentId): void
 -     {
 -         $panels[$parentId]['items'][] = [
 -             'url' => $item->getUrl(),
 -             'label' => $item->getLabel(),
 -             'icon' => $item->getIcon(),
 -         ];
 -     }
 - 
 -     protected function addAccessibilityItems(array &$panels): void
 -     {
 -         if ($this->hasDisplayAndAccessibility()) {
 -             $displayAndAccessibilityId = 'display-and-accessibility';
 -             $panels['main']['items'][] = [
 -                 'panelId' => $displayAndAccessibilityId,
 -                 'label' => 'Display & Accessibility',
 -                 'icon' => 'heroicon-s-moon',
 -             ];
 - 
 -             $panels[$displayAndAccessibilityId] = [
 -                 'panelId' => $displayAndAccessibilityId,
 -                 'label' => 'Display & Accessibility',
 -                 'items' => [],
 -                 'renderItems' => false,
 -             ];
 -         }
 -     }
 - 
 -     protected function addCompanySettingsItems(array &$panels): void
 -     {
 -         if ($this->hasCompanySettings()) {
 -             $companySettingsId = 'company-settings';
 -             $panels['main']['items'][] = [
 -                 'panelId' => $companySettingsId,
 -                 'label' => 'Company Settings',
 -                 'icon' => 'heroicon-m-building-office-2',
 -             ];
 - 
 -             $panels[$companySettingsId] = [
 -                 'panelId' => $companySettingsId,
 -                 'label' => 'Company Settings',
 -                 'items' => [],
 -                 'renderItems' => false,
 -             ];
 - 
 -             $switchCompanyPanelId = 'company-switcher';
 -             $panels[$companySettingsId]['items'][] = [
 -                 'panelId' => $switchCompanyPanelId,
 -                 'label' => 'Switch Company',
 -                 'icon' => '',
 -             ];
 - 
 -             $panels[$switchCompanyPanelId] = [
 -                 'panelId' => $switchCompanyPanelId,
 -                 'label' => 'Switch Company',
 -                 'items' => [],
 -                 'renderItems' => false,
 -             ];
 -         }
 -     }
 - 
 -     protected function createPanel($uniqueId, $item, $renderItems = true): array
 -     {
 -         return [
 -             'panelId' => $uniqueId,
 -             'label' => $item->getLabel(),
 -             'icon' => $item->getIcon(),
 -             'items' => [],
 -             'renderItems' => $renderItems,
 -         ];
 -     }
 - 
 -     protected function createPanelReference($uniqueId, $item): array
 -     {
 -         return [
 -             'panelId' => $uniqueId,
 -             'label' => $item->getLabel(),
 -             'icon' => $item->getIcon(),
 -         ];
 -     }
 - 
 -     public function boot(Panel $panel): void
 -     {
 -         // TODO: Implement boot() method.
 -     }
 - 
 -     public function renderHook(string $hook): static
 -     {
 -         $this->renderHook = $hook;
 - 
 -         return $this;
 -     }
 - 
 -     public function getRenderHook(): string
 -     {
 -         return $this->renderHook;
 -     }
 - }
 
 
  |