default() ->id('admin') ->path('admin') ->login(Login::class) ->authenticatedRoutes(function (Panel $panel): void { ChooseTenant::registerRoutes($panel); ChooseWorkspace::registerRoutes($panel); NoAccess::registerRoutes($panel); TenantOnboardingWizard::registerRoutes($panel); if ($panel->hasTenantRegistration()) { $tenantRegistrationPage = $panel->getTenantRegistrationPage(); Route::get($tenantRegistrationPage::getRoutePath($panel), $tenantRegistrationPage) ->middleware($tenantRegistrationPage::getRouteMiddleware($panel)) ->withoutMiddleware($tenantRegistrationPage::getWithoutRouteMiddleware($panel)) ->name('tenant.registration'); } ManagedTenantsIndex::registerRoutes($panel); Onboarding::registerRoutes($panel); Current::registerRoutes($panel); ArchivedStatus::registerRoutes($panel); ViewManagedTenant::registerRoutes($panel); EditManagedTenant::registerRoutes($panel); Route::get('managed-tenants/{managedTenant}/open', function (string $managedTenant) { $user = auth()->user(); if (! $user instanceof User) { abort(403); } if (! $user->tenantMemberships()->exists()) { abort(404); } $managedTenant = Tenant::withTrashed()->findOrFail($managedTenant); /** @var CapabilityResolver $resolver */ $resolver = app(CapabilityResolver::class); if (! $resolver->isMember($user, $managedTenant)) { abort(404); } if (! $resolver->can($user, $managedTenant, Capabilities::TENANT_MANAGED_TENANTS_VIEW)) { abort(403); } if ($managedTenant->isActive()) { ManagedTenantContext::setCurrentTenant($managedTenant); ManagedTenantContext::clearArchivedTenant(); return redirect('/admin/managed-tenants/current'); } ManagedTenantContext::setArchivedTenant($managedTenant); return redirect('/admin/managed-tenants/archived'); }); }) ->tenant(Tenant::class, slugAttribute: 'external_id') ->tenantRoutePrefix('t') ->tenantMenu(fn (): bool => filled(Filament::getTenant())) ->searchableTenantMenu() ->colors([ 'primary' => Color::Amber, ]) ->renderHook( PanelsRenderHook::HEAD_END, fn () => view('filament.partials.livewire-intercept-shim')->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() ->userMenuItems([ Action::make('switch-workspace') ->label('Switch workspace') ->icon('heroicon-o-squares-2x2') ->url('/admin/choose-workspace') ->visible(function (): bool { $user = auth()->user(); if (! $user instanceof User) { return false; } return WorkspaceMembership::query() ->where('user_id', $user->getKey()) ->count() > 1; }) ->sort(0), ]) ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, AuthenticateSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, 'ensure-correct-guard:web', EnsureFilamentTenantSelected::class, DenyNonMemberTenantAccess::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, ]) ->authMiddleware([ Authenticate::class, 'ensure-workspace-selected', ]); if (! app()->runningUnitTests()) { $panel->viteTheme('resources/css/filament/admin/theme.css'); } return $panel; } }