Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

FilamentCompaniesServiceProvider.php 11KB

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