default() ->id('company') ->path('company') ->login(Login::class) ->when(! $isDemoEnvironment, function (Panel $panel) { return $panel ->registration(Register::class) ->passwordReset(); }) ->tenantMenu(false) ->plugins([ FilamentCompanies::make() ->userPanel('user') ->switchCurrentCompany() ->updateProfileInformation(component: UpdateProfileInformation::class) ->updatePasswords(component: UpdatePassword::class) ->setPasswords() ->connectedAccounts() ->manageBrowserSessions() ->accountDeletion() ->profilePhotos() ->api() ->companies(invitations: true) ->autoAcceptInvitations() ->termsAndPrivacyPolicy() ->notifications() ->modals() ->socialite( condition: ! $isDemoEnvironment, providers: [Provider::Github], features: [Feature::RememberSession, Feature::ProviderAvatars], ), PanelShiftDropdown::make() ->logoutItem() ->companySettings() ->navigation(function (NavigationBuilder $builder): NavigationBuilder { return $builder ->items(Account::getNavigationItems()); }), ]) ->colors([ 'primary' => Color::Indigo, ]) ->navigation(function (NavigationBuilder $builder): NavigationBuilder { return $builder ->items([ ...Reports::getNavigationItems(), ...Settings::getNavigationItems(), ...OfferingResource::getNavigationItems(), ]) ->groups([ NavigationGroup::make('Sales') ->label('Sales') ->icon('heroicon-o-currency-dollar') ->items([ ...ClientResource::getNavigationItems(), ...EstimateResource::getNavigationItems(), ...InvoiceResource::getNavigationItems(), ...RecurringInvoiceResource::getNavigationItems(), ]), NavigationGroup::make('Purchases') ->label('Purchases') ->icon('heroicon-o-shopping-cart') ->items([ ...BillResource::getNavigationItems(), ...VendorResource::getNavigationItems(), ]), NavigationGroup::make('Accounting') ->localizeLabel() ->icon('heroicon-o-clipboard-document-list') ->extraSidebarAttributes(['class' => 'es-sidebar-group']) ->items([ // ...BudgetResource::getNavigationItems(), ...AccountChart::getNavigationItems(), ...TransactionResource::getNavigationItems(), ]), NavigationGroup::make('Banking') ->localizeLabel() ->icon('heroicon-o-building-library') ->items(AccountResource::getNavigationItems()), NavigationGroup::make('Services') ->localizeLabel() ->icon('heroicon-o-wrench-screwdriver') ->items([ ...ConnectedAccount::getNavigationItems(), ...LiveCurrency::getNavigationItems(), ]), ]); }) ->globalSearch(false) ->sidebarCollapsibleOnDesktop() ->databaseNotifications() ->viteTheme('resources/css/filament/company/theme.css') ->brandLogo(static fn () => view('components.icons.logo')) ->tenant(Company::class) ->tenantProfile(ManageCompany::class) ->tenantRegistration(CreateCompany::class) ->discoverResources(in: app_path('Filament/Company/Resources'), for: 'App\\Filament\\Company\\Resources') ->discoverPages(in: app_path('Filament/Company/Pages'), for: 'App\\Filament\\Company\\Pages') ->discoverClusters(in: app_path('Filament/Company/Clusters'), for: 'App\\Filament\\Company\\Clusters') ->pages([ // Pages\Dashboard::class, ]) ->authGuard('web') ->discoverWidgets(in: app_path('Filament/Company/Widgets'), for: 'App\\Filament\\Company\\Widgets') ->widgets([ // Widgets\AccountWidget::class, // Widgets\FilamentInfoWidget::class, ]) ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, AuthenticateSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, ]) ->tenantMiddleware([ ConfigureCurrentCompany::class, ], isPersistent: true) ->authMiddleware([ Authenticate::class, ]); } /** * Bootstrap any application services. */ public function boot(): void { $this->configurePermissions(); $this->configureDefaults(); FilamentCompanies::createUsersUsing(CreateNewUser::class); FilamentCompanies::updateUserProfileInformationUsing(UpdateUserProfileInformation::class); FilamentCompanies::updateUserPasswordsUsing(UpdateUserPassword::class); FilamentCompanies::createCompaniesUsing(CreateCompany::class); FilamentCompanies::updateCompanyNamesUsing(UpdateCompanyName::class); FilamentCompanies::addCompanyEmployeesUsing(AddCompanyEmployee::class); FilamentCompanies::inviteCompanyEmployeesUsing(InviteCompanyEmployee::class); FilamentCompanies::removeCompanyEmployeesUsing(RemoveCompanyEmployee::class); FilamentCompanies::deleteCompaniesUsing(DeleteCompany::class); FilamentCompanies::deleteUsersUsing(DeleteUser::class); FilamentCompanies::resolvesSocialiteUsersUsing(ResolveSocialiteUser::class); FilamentCompanies::createUsersFromProviderUsing(CreateUserFromProvider::class); FilamentCompanies::createConnectedAccountsUsing(CreateConnectedAccount::class); FilamentCompanies::updateConnectedAccountsUsing(UpdateConnectedAccount::class); FilamentCompanies::setUserPasswordsUsing(SetUserPassword::class); FilamentCompanies::handlesInvalidStateUsing(HandleInvalidState::class); FilamentCompanies::generatesProvidersRedirectsUsing(GenerateRedirectForProvider::class); } /** * Configure the roles and permissions that are available within the application. */ protected function configurePermissions(): void { FilamentCompanies::defaultApiTokenPermissions(['read']); FilamentCompanies::role('admin', 'Administrator', [ 'create', 'read', 'update', 'delete', ])->description('Administrator users can perform any action.'); FilamentCompanies::role('editor', 'Editor', [ 'read', 'create', 'update', ])->description('Editor users have the ability to read, create, and update.'); } /** * Configure the default settings for Filament. */ protected function configureDefaults(): void { $this->configureSelect(); Actions\CreateAction::configureUsing(static fn (Actions\CreateAction $action) => FilamentComponentConfigurator::configureActionModals($action)); Actions\EditAction::configureUsing(static fn (Actions\EditAction $action) => FilamentComponentConfigurator::configureActionModals($action)); Actions\DeleteAction::configureUsing(static fn (Actions\DeleteAction $action) => FilamentComponentConfigurator::configureDeleteAction($action)); Tables\Actions\EditAction::configureUsing(static fn (Tables\Actions\EditAction $action) => FilamentComponentConfigurator::configureActionModals($action)); Tables\Actions\CreateAction::configureUsing(static fn (Tables\Actions\CreateAction $action) => FilamentComponentConfigurator::configureActionModals($action)); Tables\Actions\DeleteAction::configureUsing(static fn (Tables\Actions\DeleteAction $action) => FilamentComponentConfigurator::configureDeleteAction($action)); Tables\Actions\DeleteBulkAction::configureUsing(static fn (Tables\Actions\DeleteBulkAction $action) => FilamentComponentConfigurator::configureDeleteAction($action)); Forms\Components\DateTimePicker::configureUsing(static function (Forms\Components\DateTimePicker $component) { $component->native(false); }); Tables\Table::configureUsing(static function (Tables\Table $table): void { $table::$defaultDateDisplayFormat = CompanySettingsService::getDefaultDateFormat(session('current_company_id') ?? auth()->user()->current_company_id); $table ->paginationPageOptions([5, 10, 25, 50, 100]) ->filtersFormWidth(MaxWidth::Small) ->filtersTriggerAction( fn (Tables\Actions\Action $action) => $action ->button() ->label('Filters') ->slideOver() ); }); Tables\Columns\TextColumn::configureUsing(function (Tables\Columns\TextColumn $column): void { $column->placeholder('–'); }); TextEntry::configureUsing(function (TextEntry $component): void { $component->placeholder('–'); }); Tables\Actions\ExportAction::configureUsing(function (Tables\Actions\ExportAction $action) { $action ->color('primary') ->slideOver(); }); } /** * Configure the default settings for the Select component. */ protected function configureSelect(): void { Select::configureUsing(function (Select $select): void { $select ->native(false) ->selectablePlaceholder(fn (Select $component) => ! $component->isRequired()); }); } }