collapsed = session('sidebar_collapsed', false); } public function toggle(): void { $this->collapsed = !$this->collapsed; session(['sidebar_collapsed' => $this->collapsed]); } /** * @return DataCollection */ public function navItems(): DataCollection { $items = NavItemData::collect([ new NavItemData( label: 'Dashboard', icon: 'lucide.house', active_pattern: 'dashboard', route: 'dashboard', ), new NavItemData( label: 'Apps', icon: 'lucide.grid-2x2-plus', active_pattern: 'apps.*', sub_menu: NavSubItemData::collect([ new NavSubItemData( label: 'All Apps', route: 'apps.index', active_pattern: 'apps.index', permission: AppPermissionEnum::Access ), new NavSubItemData( label: 'Providers', route: 'apps.connectionProviders.index', active_pattern: 'apps.connectionProviders.*', permission: ConnectionProviderPermissionEnum::Access ) ], DataCollection::class) ), new NavItemData( label: 'Access Manager', icon: 'lucide.shield', active_pattern: 'access-manager.*', sub_menu: NavSubItemData::collect([ new NavSubItemData( label: 'Roles and Apps', route: 'access-manager.roles-and-apps.index', active_pattern: 'access-manager.roles-and-apps.*', permission: RoleAndAppsPermissionEnum::Access ), new NavSubItemData( label: 'Permission Manager', route: 'access-manager.permissions.index', active_pattern: 'access-manager.permissions.*', permission: PermissionPermissionEnum::Access ), new NavSubItemData( label: 'Users', route: 'access-manager.users.index', active_pattern: 'access-manager.users.*', permission: UserPermissionEnum::Access ), ], DataCollection::class) ), new NavItemData( label: 'Support Tickets', icon: 'lucide.life-buoy', active_pattern: 'tickets*', route: 'tickets.index', ), new NavItemData( label: 'Settings', icon: 'lucide.settings', active_pattern: 'settings.*', // Kept as fallback, but handled dynamically in view sub_menu: NavSubItemData::collect([ new NavSubItemData( label: 'Profile', route: 'profile.edit', active_pattern: 'profile.edit', permission: ProfilePermissionEnum::Access ), new NavSubItemData( label: 'Security', route: 'security.edit', active_pattern: 'security.edit', permission: SecurityPermissionEnum::Access ), ], DataCollection::class) ), ], DataCollection::class); // Filter out items the user shouldn't see return $this->filterNavMenu($items); } /** * Filter out menus that the current user does not have permission. * @param DataCollection $items * @returns DataCollection */ private function filterNavMenu(DataCollection $items): DataCollection { $filteredItems = $items->toCollection()->filter(function (NavItemData $item) { if ($item->sub_menu) { $allowedSubItems = $item->sub_menu->toCollection()->filter(function (NavSubItemData $subItem) { $permission = $subItem->permission instanceof UnitEnum ? $subItem->permission->value : $subItem->permission; return auth()->user()->can($permission); }); // If the user has NO access to any submenus, discard the parent menu item if ($allowedSubItems->isEmpty()) { return false; } // Update the DataCollection with authorized items $item->sub_menu = NavSubItemData::collect($allowedSubItems, DataCollection::class); } return true; }); return NavItemData::collect($filteredItems->values()->all(), DataCollection::class); } }; ?>