default() ->id('admin') ->path('admin') ->login(Login::class) ->authenticatedRoutes(function (Panel $panel): void { ChooseWorkspace::registerRoutes($panel); ChooseTenant::registerRoutes($panel); NoAccess::registerRoutes($panel); WorkspaceResource::registerRoutes($panel); }) ->tenant(Tenant::class, slugAttribute: 'external_id') ->tenantRoutePrefix('t') ->tenantMenu(fn (): bool => filled(Filament::getTenant())) ->searchableTenantMenu() ->colors([ 'primary' => Color::Amber, ]) ->navigationItems([ NavigationItem::make('Switch workspace') ->url(fn (): string => ChooseWorkspace::getUrl()) ->icon('heroicon-o-squares-2x2') ->group('Settings') ->sort(10), NavigationItem::make('Manage workspaces') ->url(function (): string { return route('filament.admin.resources.workspaces.index'); }) ->icon('heroicon-o-squares-2x2') ->group('Settings') ->sort(20) ->visible(function (): bool { $user = auth()->user(); if (! $user instanceof User) { return false; } $roles = WorkspaceRoleCapabilityMap::rolesWithCapability(Capabilities::WORKSPACE_MEMBERSHIP_MANAGE); return WorkspaceMembership::query() ->where('user_id', (int) $user->getKey()) ->whereIn('role', $roles) ->exists(); }), NavigationItem::make('Operations') ->url(fn (): string => route('admin.operations.index')) ->icon('heroicon-o-queue-list') ->group('Monitoring') ->sort(10), NavigationItem::make('Alerts') ->url(fn (): string => route('admin.monitoring.alerts')) ->icon('heroicon-o-bell-alert') ->group('Monitoring') ->sort(20), NavigationItem::make('Audit Log') ->url(fn (): string => route('admin.monitoring.audit-log')) ->icon('heroicon-o-clipboard-document-list') ->group('Monitoring') ->sort(30), ]) ->renderHook( PanelsRenderHook::HEAD_END, fn () => view('filament.partials.livewire-intercept-shim')->render() ) ->renderHook( PanelsRenderHook::TOPBAR_START, fn () => view('filament.partials.context-bar')->render() ) ->renderHook( PanelsRenderHook::USER_MENU_PROFILE_AFTER, fn () => view('filament.partials.workspace-switcher')->render() ) ->renderHook( PanelsRenderHook::BODY_END, fn () => (bool) config('tenantpilot.bulk_operations.progress_widget_enabled', true) ? view('livewire.bulk-operation-progress-wrapper')->render() : '' ) ->discoverClusters(in: app_path('Filament/Clusters'), for: 'App\Filament\Clusters') ->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources') ->discoverPages(in: app_path('Filament/Pages'), for: 'App\Filament\Pages') ->pages([ TenantDashboard::class, ]) ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\Filament\Widgets') ->widgets([ AccountWidget::class, FilamentInfoWidget::class, ]) ->databaseNotifications() ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, AuthenticateSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, 'ensure-correct-guard:web', 'ensure-workspace-selected', 'ensure-filament-tenant-selected', DenyNonMemberTenantAccess::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, ]) ->authMiddleware([ Authenticate::class, ]); if (! app()->runningUnitTests()) { $panel->viteTheme('resources/css/filament/admin/theme.css'); } return $panel; } }