default() ->id('company') ->path('company') ->login(Login::class) ->registration(Register::class) ->passwordReset() ->tenantMenu(false) ->plugin( FilamentCompanies::make() ->userPanel('user') ->switchCurrentCompany() ->updateProfileInformation(component: UpdateProfileInformation::class) ->updatePasswords(component: UpdatePassword::class) ->setPasswords() ->connectedAccounts() ->manageBrowserSessions() ->accountDeletion() ->profilePhotos() ->api() ->companies(invitations: true) ->termsAndPrivacyPolicy() ->notifications() ->modals() ->socialite( providers: [Provider::Github], features: [Feature::RememberSession, Feature::ProviderAvatars], ), ) ->plugin( 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([ ...Dashboard::getNavigationItems(), ...Reports::getNavigationItems(), ...Settings::getNavigationItems(), ...OfferingResource::getNavigationItems(), ]) ->groups([ NavigationGroup::make('Sales') ->label('Sales') ->icon('heroicon-o-currency-dollar') ->items([ ...InvoiceResource::getNavigationItems(), ...RecurringInvoiceResource::getNavigationItems(), ...EstimateResource::getNavigationItems(), ...ClientResource::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([ ...AccountChart::getNavigationItems(), ...Transactions::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(), ]), ]); }) ->sidebarCollapsibleOnDesktop() ->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 ->paginationPageOptions([5, 10, 25, 50, 100]) ->filtersFormWidth(MaxWidth::Small) ->filtersTriggerAction(fn (Tables\Actions\Action $action) => $action->slideOver()); }, isImportant: true); } /** * Configure the default settings for the Select component. */ protected function configureSelect(): void { Select::configureUsing(function (Select $select): void { $isSelectable = fn (): bool => ! $this->hasRequiredRule($select); $select ->native(false) ->selectablePlaceholder($isSelectable); }, isImportant: true); } protected function hasRequiredRule(Select $component): bool { $rules = $component->getValidationRules(); return in_array('required', $rules, true); } }