您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

FilamentCompaniesServiceProvider.php 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <?php
  2. namespace App\Providers;
  3. use App\Actions\FilamentCompanies\AddCompanyEmployee;
  4. use App\Actions\FilamentCompanies\CreateConnectedAccount;
  5. use App\Actions\FilamentCompanies\CreateNewUser;
  6. use App\Actions\FilamentCompanies\CreateUserFromProvider;
  7. use App\Actions\FilamentCompanies\DeleteCompany;
  8. use App\Actions\FilamentCompanies\DeleteUser;
  9. use App\Actions\FilamentCompanies\HandleInvalidState;
  10. use App\Actions\FilamentCompanies\InviteCompanyEmployee;
  11. use App\Actions\FilamentCompanies\RemoveCompanyEmployee;
  12. use App\Actions\FilamentCompanies\ResolveSocialiteUser;
  13. use App\Actions\FilamentCompanies\SetUserPassword;
  14. use App\Actions\FilamentCompanies\UpdateCompanyName;
  15. use App\Actions\FilamentCompanies\UpdateConnectedAccount;
  16. use App\Actions\FilamentCompanies\UpdateUserPassword;
  17. use App\Actions\FilamentCompanies\UpdateUserProfileInformation;
  18. use App\Filament\Company\Pages\CreateCompany;
  19. use App\Http\Middleware\ConfigureCurrentCompany;
  20. use App\Livewire\UpdatePassword;
  21. use App\Livewire\UpdateProfileInformation;
  22. use App\Models\Company;
  23. use Exception;
  24. use Filament\Actions\CreateAction;
  25. use Filament\Actions\EditAction;
  26. use Filament\Forms\Components\DatePicker;
  27. use Filament\Forms\Components\DateTimePicker;
  28. use Filament\Forms\Components\Select;
  29. use Filament\Http\Middleware\Authenticate;
  30. use Filament\Http\Middleware\DisableBladeIconComponents;
  31. use Filament\Http\Middleware\DispatchServingFilamentEvent;
  32. use Filament\Pages;
  33. use Filament\Panel;
  34. use Filament\PanelProvider;
  35. use Filament\Support\Colors\Color;
  36. use Filament\Support\Enums\Alignment;
  37. use Filament\Widgets;
  38. use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
  39. use Illuminate\Cookie\Middleware\EncryptCookies;
  40. use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
  41. use Illuminate\Routing\Middleware\SubstituteBindings;
  42. use Illuminate\Session\Middleware\AuthenticateSession;
  43. use Illuminate\Session\Middleware\StartSession;
  44. use Illuminate\View\Middleware\ShareErrorsFromSession;
  45. use Wallo\FilamentCompanies\Actions\GenerateRedirectForProvider;
  46. use Wallo\FilamentCompanies\Enums\Feature;
  47. use Wallo\FilamentCompanies\Enums\Provider;
  48. use Wallo\FilamentCompanies\FilamentCompanies;
  49. use Wallo\FilamentCompanies\Pages\Auth\Login;
  50. use Wallo\FilamentCompanies\Pages\Auth\Register;
  51. use Wallo\FilamentCompanies\Pages\Company\CompanySettings;
  52. class FilamentCompaniesServiceProvider extends PanelProvider
  53. {
  54. /**
  55. * @throws Exception
  56. */
  57. public function panel(Panel $panel): Panel
  58. {
  59. return $panel
  60. ->default()
  61. ->id('company')
  62. ->path('company')
  63. ->login(Login::class)
  64. ->registration(Register::class)
  65. ->passwordReset()
  66. ->plugin(
  67. FilamentCompanies::make()
  68. ->userPanel('user')
  69. ->switchCurrentCompany()
  70. ->updateProfileInformation(component: UpdateProfileInformation::class)
  71. ->updatePasswords(component: UpdatePassword::class)
  72. ->setPasswords()
  73. ->connectedAccounts()
  74. ->manageBrowserSessions()
  75. ->accountDeletion()
  76. ->profilePhotos()
  77. ->api()
  78. ->companies(invitations: true)
  79. ->termsAndPrivacyPolicy()
  80. ->notifications()
  81. ->modals()
  82. ->socialite(
  83. providers: [Provider::Github],
  84. features: [Feature::RememberSession, Feature::ProviderAvatars],
  85. ),
  86. )
  87. ->colors([
  88. 'primary' => Color::Indigo,
  89. 'gray' => Color::Gray,
  90. ])
  91. ->viteTheme('resources/css/filament/company/theme.css')
  92. ->brandLogo(static fn () => view('components.icons.logo'))
  93. ->tenant(Company::class)
  94. ->tenantProfile(CompanySettings::class)
  95. ->tenantRegistration(CreateCompany::class)
  96. ->discoverResources(in: app_path('Filament/Company/Resources'), for: 'App\\Filament\\Company\\Resources')
  97. ->discoverPages(in: app_path('Filament/Company/Pages'), for: 'App\\Filament\\Company\\Pages')
  98. ->pages([
  99. Pages\Dashboard::class,
  100. ])
  101. ->authGuard('web')
  102. ->discoverWidgets(in: app_path('Filament/Company/Widgets'), for: 'App\\Filament\\Company\\Widgets')
  103. ->widgets([
  104. Widgets\AccountWidget::class,
  105. Widgets\FilamentInfoWidget::class,
  106. ])
  107. ->middleware([
  108. EncryptCookies::class,
  109. AddQueuedCookiesToResponse::class,
  110. StartSession::class,
  111. AuthenticateSession::class,
  112. ShareErrorsFromSession::class,
  113. VerifyCsrfToken::class,
  114. SubstituteBindings::class,
  115. DisableBladeIconComponents::class,
  116. DispatchServingFilamentEvent::class,
  117. ])
  118. ->tenantMiddleware([
  119. ConfigureCurrentCompany::class,
  120. ], isPersistent: true)
  121. ->authMiddleware([
  122. Authenticate::class,
  123. ]);
  124. }
  125. /**
  126. * Bootstrap any application services.
  127. */
  128. public function boot(): void
  129. {
  130. $this->configurePermissions();
  131. $this->configureDefaults();
  132. FilamentCompanies::createUsersUsing(CreateNewUser::class);
  133. FilamentCompanies::updateUserProfileInformationUsing(UpdateUserProfileInformation::class);
  134. FilamentCompanies::updateUserPasswordsUsing(UpdateUserPassword::class);
  135. FilamentCompanies::createCompaniesUsing(CreateCompany::class);
  136. FilamentCompanies::updateCompanyNamesUsing(UpdateCompanyName::class);
  137. FilamentCompanies::addCompanyEmployeesUsing(AddCompanyEmployee::class);
  138. FilamentCompanies::inviteCompanyEmployeesUsing(InviteCompanyEmployee::class);
  139. FilamentCompanies::removeCompanyEmployeesUsing(RemoveCompanyEmployee::class);
  140. FilamentCompanies::deleteCompaniesUsing(DeleteCompany::class);
  141. FilamentCompanies::deleteUsersUsing(DeleteUser::class);
  142. FilamentCompanies::resolvesSocialiteUsersUsing(ResolveSocialiteUser::class);
  143. FilamentCompanies::createUsersFromProviderUsing(CreateUserFromProvider::class);
  144. FilamentCompanies::createConnectedAccountsUsing(CreateConnectedAccount::class);
  145. FilamentCompanies::updateConnectedAccountsUsing(UpdateConnectedAccount::class);
  146. FilamentCompanies::setUserPasswordsUsing(SetUserPassword::class);
  147. FilamentCompanies::handlesInvalidStateUsing(HandleInvalidState::class);
  148. FilamentCompanies::generatesProvidersRedirectsUsing(GenerateRedirectForProvider::class);
  149. }
  150. /**
  151. * Configure the roles and permissions that are available within the application.
  152. */
  153. protected function configurePermissions(): void
  154. {
  155. FilamentCompanies::defaultApiTokenPermissions(['read']);
  156. FilamentCompanies::role('admin', 'Administrator', [
  157. 'create',
  158. 'read',
  159. 'update',
  160. 'delete',
  161. ])->description('Administrator users can perform any action.');
  162. FilamentCompanies::role('editor', 'Editor', [
  163. 'read',
  164. 'create',
  165. 'update',
  166. ])->description('Editor users have the ability to read, create, and update.');
  167. }
  168. /**
  169. * Configure the default settings for Filament.
  170. */
  171. protected function configureDefaults(): void
  172. {
  173. $this->configureSelect();
  174. CreateAction::configureUsing(static function (CreateAction $action) {
  175. $action
  176. ->createAnother(false)
  177. ->stickyModalHeader()
  178. ->stickyModalFooter()
  179. ->modalFooterActionsAlignment(Alignment::End);
  180. });
  181. DatePicker::configureUsing(static function (DatePicker $component) {
  182. $component->native(false);
  183. });
  184. DateTimePicker::configureUsing(static function (DateTimePicker $component) {
  185. $component->native(false);
  186. });
  187. EditAction::configureUsing(static function (EditAction $action) {
  188. $action
  189. ->stickyModalHeader()
  190. ->stickyModalFooter()
  191. ->modalFooterActionsAlignment(Alignment::End);
  192. });
  193. \Filament\Tables\Actions\EditAction::configureUsing(static function (\Filament\Tables\Actions\EditAction $action) {
  194. $action
  195. ->stickyModalHeader()
  196. ->stickyModalFooter()
  197. ->modalFooterActionsAlignment(Alignment::End);
  198. });
  199. \Filament\Tables\Actions\CreateAction::configureUsing(static function (\Filament\Tables\Actions\CreateAction $action) {
  200. $action
  201. ->stickyModalHeader()
  202. ->stickyModalFooter()
  203. ->modalFooterActionsAlignment(Alignment::End);
  204. });
  205. }
  206. /**
  207. * Configure the default settings for the Select component.
  208. */
  209. protected function configureSelect(): void
  210. {
  211. Select::configureUsing(function (Select $select): void {
  212. $isSelectable = fn (): bool => ! $this->hasRequiredRule($select);
  213. $select
  214. ->native(false)
  215. ->selectablePlaceholder($isSelectable);
  216. }, isImportant: true);
  217. }
  218. protected function hasRequiredRule(Select $component): bool
  219. {
  220. $rules = $component->getValidationRules();
  221. return in_array('required', $rules, true);
  222. }
  223. }