123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- <?php
-
- namespace App\Providers;
-
- use App\Actions\FilamentCompanies\AddCompanyEmployee;
- use App\Actions\FilamentCompanies\CreateConnectedAccount;
- use App\Actions\FilamentCompanies\CreateNewUser;
- use App\Actions\FilamentCompanies\CreateUserFromProvider;
- use App\Actions\FilamentCompanies\DeleteCompany;
- use App\Actions\FilamentCompanies\DeleteUser;
- use App\Actions\FilamentCompanies\HandleInvalidState;
- use App\Actions\FilamentCompanies\InviteCompanyEmployee;
- use App\Actions\FilamentCompanies\RemoveCompanyEmployee;
- use App\Actions\FilamentCompanies\ResolveSocialiteUser;
- use App\Actions\FilamentCompanies\SetUserPassword;
- use App\Actions\FilamentCompanies\UpdateCompanyName;
- use App\Actions\FilamentCompanies\UpdateConnectedAccount;
- use App\Actions\FilamentCompanies\UpdateUserPassword;
- use App\Actions\FilamentCompanies\UpdateUserProfileInformation;
- use App\Filament\Company\Clusters\Settings;
- use App\Filament\Company\Pages\Accounting\AccountChart;
- use App\Filament\Company\Pages\Accounting\Transactions;
- use App\Filament\Company\Pages\CreateCompany;
- use App\Filament\Company\Pages\ManageCompany;
- use App\Filament\Company\Pages\Reports;
- use App\Filament\Company\Pages\Service\ConnectedAccount;
- use App\Filament\Company\Pages\Service\LiveCurrency;
- use App\Filament\Company\Resources\Banking\AccountResource;
- use App\Filament\Company\Resources\Common\OfferingResource;
- use App\Filament\Company\Resources\Purchases\BillResource;
- use App\Filament\Company\Resources\Purchases\VendorResource;
- use App\Filament\Company\Resources\Sales\ClientResource;
- use App\Filament\Company\Resources\Sales\EstimateResource;
- use App\Filament\Company\Resources\Sales\InvoiceResource;
- use App\Filament\Company\Resources\Sales\RecurringInvoiceResource;
- use App\Filament\Components\PanelShiftDropdown;
- use App\Filament\User\Clusters\Account;
- use App\Http\Middleware\ConfigureCurrentCompany;
- use App\Livewire\UpdatePassword;
- use App\Livewire\UpdateProfileInformation;
- use App\Models\Company;
- use App\Support\FilamentComponentConfigurator;
- use Exception;
- use Filament\Actions;
- use Filament\Forms;
- use Filament\Forms\Components\Select;
- use Filament\Http\Middleware\Authenticate;
- use Filament\Http\Middleware\DisableBladeIconComponents;
- use Filament\Http\Middleware\DispatchServingFilamentEvent;
- use Filament\Navigation\NavigationBuilder;
- use Filament\Navigation\NavigationGroup;
- use Filament\Pages;
- use Filament\Pages\Dashboard;
- use Filament\Panel;
- use Filament\PanelProvider;
- use Filament\Support\Colors\Color;
- use Filament\Support\Enums\MaxWidth;
- use Filament\Tables;
- use Filament\Widgets;
- use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
- use Illuminate\Cookie\Middleware\EncryptCookies;
- use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
- use Illuminate\Routing\Middleware\SubstituteBindings;
- use Illuminate\Session\Middleware\AuthenticateSession;
- use Illuminate\Session\Middleware\StartSession;
- use Illuminate\View\Middleware\ShareErrorsFromSession;
- use Wallo\FilamentCompanies\Actions\GenerateRedirectForProvider;
- use Wallo\FilamentCompanies\Enums\Feature;
- use Wallo\FilamentCompanies\Enums\Provider;
- use Wallo\FilamentCompanies\FilamentCompanies;
- use Wallo\FilamentCompanies\Pages\Auth\Login;
- use Wallo\FilamentCompanies\Pages\Auth\Register;
-
- class FilamentCompaniesServiceProvider extends PanelProvider
- {
- /**
- * @throws Exception
- */
- public function panel(Panel $panel): Panel
- {
- return $panel
- ->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);
-
- Tables\Columns\TextColumn::configureUsing(function (Tables\Columns\TextColumn $column): void {
- $column->placeholder('–');
- });
- }
-
- /**
- * 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);
- }
- }
|