@php $user = auth()->user(); $groups = []; $activeKey = null; $navItemIsActive = static function (array $item): bool { if (empty($item['route'])) { return false; } // Exact route, or nested routes under this item only — never the whole module prefix // (e.g. admin.social.composer must NOT match via admin.social.*). $patterns = [$item['route'], $item['route'].'.*']; if (str_ends_with($item['route'], '.index')) { $resource = Str::beforeLast($item['route'], '.index'); $patterns[] = $resource; $patterns[] = $resource.'.*'; } return request()->routeIs(...$patterns); }; foreach (config('admin_nav') as $group) { if (! empty($group['module']) && ! config('admin_modules.'.$group['module'])) { continue; } $visible = collect($group['items'])->filter(function ($item) use ($user) { if (! empty($item['permission']) && $user && ! $user->hasPermission($item['permission'])) { return false; } return true; })->values(); if ($visible->isEmpty()) { continue; } $key = $group['key'] ?? Str::slug($group['label']); $isActive = $visible->contains(fn ($item) => $navItemIsActive($item)); if ($isActive) { $activeKey = $key; } $groups[] = [ 'key' => $key, 'label' => $group['label'], 'icon' => $group['icon'] ?? 'circle', 'items' => $visible, 'active' => $isActive, ]; } if ($activeKey === null && $groups !== []) { $activeKey = $groups[0]['key']; $groups[0]['active'] = true; } @endphp {{-- Primary icon rail --}}
TRA
@foreach($groups as $group) @endforeach
{{-- Secondary submodule panel --}}
Module
{{ collect($groups)->firstWhere('key', $activeKey)['label'] ?? 'Admin' }}
{{ config('app.env') }}