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

CompanyPanelProvider.php 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <?php
  2. namespace App\Providers\Filament;
  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\CreateCompany;
  21. use App\Filament\Company\Pages\ManageCompany;
  22. use App\Filament\Company\Pages\Reports;
  23. use App\Filament\Company\Pages\Service\ConnectedAccount;
  24. use App\Filament\Company\Pages\Service\LiveCurrency;
  25. use App\Filament\Company\Resources\Accounting\BudgetResource;
  26. use App\Filament\Company\Resources\Accounting\TransactionResource;
  27. use App\Filament\Company\Resources\Banking\AccountResource;
  28. use App\Filament\Company\Resources\Common\OfferingResource;
  29. use App\Filament\Company\Resources\Purchases\BillResource;
  30. use App\Filament\Company\Resources\Purchases\VendorResource;
  31. use App\Filament\Company\Resources\Sales\ClientResource;
  32. use App\Filament\Company\Resources\Sales\EstimateResource;
  33. use App\Filament\Company\Resources\Sales\InvoiceResource;
  34. use App\Filament\Company\Resources\Sales\RecurringInvoiceResource;
  35. use App\Filament\Components\PanelShiftDropdown;
  36. use App\Filament\Pages\Auth\Login;
  37. use App\Filament\User\Clusters\Account;
  38. use App\Http\Middleware\ConfigureCurrentCompany;
  39. use App\Livewire\UpdatePassword;
  40. use App\Livewire\UpdateProfileInformation;
  41. use App\Models\Company;
  42. use App\Services\CompanySettingsService;
  43. use App\Support\FilamentComponentConfigurator;
  44. use Exception;
  45. use Filament\Actions;
  46. use Filament\Forms;
  47. use Filament\Forms\Components\Select;
  48. use Filament\Http\Middleware\Authenticate;
  49. use Filament\Http\Middleware\DisableBladeIconComponents;
  50. use Filament\Http\Middleware\DispatchServingFilamentEvent;
  51. use Filament\Infolists\Components\TextEntry;
  52. use Filament\Navigation\NavigationBuilder;
  53. use Filament\Navigation\NavigationGroup;
  54. use Filament\Pages;
  55. use Filament\Panel;
  56. use Filament\PanelProvider;
  57. use Filament\Support\Colors\Color;
  58. use Filament\Support\Enums\MaxWidth;
  59. use Filament\Tables;
  60. use Filament\Widgets;
  61. use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
  62. use Illuminate\Cookie\Middleware\EncryptCookies;
  63. use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
  64. use Illuminate\Routing\Middleware\SubstituteBindings;
  65. use Illuminate\Session\Middleware\AuthenticateSession;
  66. use Illuminate\Session\Middleware\StartSession;
  67. use Illuminate\View\Middleware\ShareErrorsFromSession;
  68. use Wallo\FilamentCompanies\Actions\GenerateRedirectForProvider;
  69. use Wallo\FilamentCompanies\Enums\Feature;
  70. use Wallo\FilamentCompanies\Enums\Provider;
  71. use Wallo\FilamentCompanies\FilamentCompanies;
  72. use Wallo\FilamentCompanies\Pages\Auth\Register;
  73. class CompanyPanelProvider extends PanelProvider
  74. {
  75. /**
  76. * @throws Exception
  77. */
  78. public function panel(Panel $panel): Panel
  79. {
  80. $isDemoEnvironment = is_demo_environment();
  81. return $panel
  82. ->default()
  83. ->id('company')
  84. ->path('company')
  85. ->login(Login::class)
  86. ->when(! $isDemoEnvironment, function (Panel $panel) {
  87. return $panel
  88. ->registration(Register::class)
  89. ->passwordReset();
  90. })
  91. ->tenantMenu(false)
  92. ->plugins([
  93. FilamentCompanies::make()
  94. ->userPanel('user')
  95. ->switchCurrentCompany()
  96. ->updateProfileInformation(component: UpdateProfileInformation::class)
  97. ->updatePasswords(component: UpdatePassword::class)
  98. ->setPasswords()
  99. ->connectedAccounts()
  100. ->manageBrowserSessions()
  101. ->accountDeletion()
  102. ->profilePhotos()
  103. ->api()
  104. ->companies(invitations: true)
  105. ->autoAcceptInvitations()
  106. ->termsAndPrivacyPolicy()
  107. ->notifications()
  108. ->modals()
  109. ->socialite(
  110. condition: ! $isDemoEnvironment,
  111. providers: [Provider::Github],
  112. features: [Feature::RememberSession, Feature::ProviderAvatars],
  113. ),
  114. PanelShiftDropdown::make()
  115. ->logoutItem()
  116. ->companySettings()
  117. ->navigation(function (NavigationBuilder $builder): NavigationBuilder {
  118. return $builder
  119. ->items(Account::getNavigationItems());
  120. }),
  121. ])
  122. ->colors([
  123. 'primary' => Color::Indigo,
  124. ])
  125. ->navigation(function (NavigationBuilder $builder): NavigationBuilder {
  126. return $builder
  127. ->items([
  128. ...Reports::getNavigationItems(),
  129. ...Settings::getNavigationItems(),
  130. ...OfferingResource::getNavigationItems(),
  131. ])
  132. ->groups([
  133. NavigationGroup::make('Sales')
  134. ->label('Sales')
  135. ->icon('heroicon-o-currency-dollar')
  136. ->items([
  137. ...ClientResource::getNavigationItems(),
  138. ...EstimateResource::getNavigationItems(),
  139. ...InvoiceResource::getNavigationItems(),
  140. ...RecurringInvoiceResource::getNavigationItems(),
  141. ]),
  142. NavigationGroup::make('Purchases')
  143. ->label('Purchases')
  144. ->icon('heroicon-o-shopping-cart')
  145. ->items([
  146. ...BillResource::getNavigationItems(),
  147. ...VendorResource::getNavigationItems(),
  148. ]),
  149. NavigationGroup::make('Accounting')
  150. ->localizeLabel()
  151. ->icon('heroicon-o-clipboard-document-list')
  152. ->extraSidebarAttributes(['class' => 'es-sidebar-group'])
  153. ->items([
  154. // ...BudgetResource::getNavigationItems(),
  155. ...AccountChart::getNavigationItems(),
  156. ...TransactionResource::getNavigationItems(),
  157. ]),
  158. NavigationGroup::make('Banking')
  159. ->localizeLabel()
  160. ->icon('heroicon-o-building-library')
  161. ->items(AccountResource::getNavigationItems()),
  162. NavigationGroup::make('Services')
  163. ->localizeLabel()
  164. ->icon('heroicon-o-wrench-screwdriver')
  165. ->items([
  166. ...ConnectedAccount::getNavigationItems(),
  167. ...LiveCurrency::getNavigationItems(),
  168. ]),
  169. ]);
  170. })
  171. ->globalSearch(false)
  172. ->sidebarCollapsibleOnDesktop()
  173. ->databaseNotifications(isLazy: false)
  174. ->viteTheme('resources/css/filament/company/theme.css')
  175. ->brandLogo(static fn () => view('components.icons.logo'))
  176. ->tenant(Company::class)
  177. ->tenantProfile(ManageCompany::class)
  178. ->tenantRegistration(CreateCompany::class)
  179. ->discoverResources(in: app_path('Filament/Company/Resources'), for: 'App\\Filament\\Company\\Resources')
  180. ->discoverPages(in: app_path('Filament/Company/Pages'), for: 'App\\Filament\\Company\\Pages')
  181. ->discoverClusters(in: app_path('Filament/Company/Clusters'), for: 'App\\Filament\\Company\\Clusters')
  182. ->pages([
  183. // Pages\Dashboard::class,
  184. ])
  185. ->authGuard('web')
  186. ->discoverWidgets(in: app_path('Filament/Company/Widgets'), for: 'App\\Filament\\Company\\Widgets')
  187. ->widgets([
  188. // Widgets\AccountWidget::class,
  189. // Widgets\FilamentInfoWidget::class,
  190. ])
  191. ->middleware([
  192. EncryptCookies::class,
  193. AddQueuedCookiesToResponse::class,
  194. StartSession::class,
  195. AuthenticateSession::class,
  196. ShareErrorsFromSession::class,
  197. VerifyCsrfToken::class,
  198. SubstituteBindings::class,
  199. DisableBladeIconComponents::class,
  200. DispatchServingFilamentEvent::class,
  201. ])
  202. ->tenantMiddleware([
  203. ConfigureCurrentCompany::class,
  204. ], isPersistent: true)
  205. ->authMiddleware([
  206. Authenticate::class,
  207. ]);
  208. }
  209. /**
  210. * Bootstrap any application services.
  211. */
  212. public function boot(): void
  213. {
  214. $this->configurePermissions();
  215. $this->configureDefaults();
  216. FilamentCompanies::createUsersUsing(CreateNewUser::class);
  217. FilamentCompanies::updateUserProfileInformationUsing(UpdateUserProfileInformation::class);
  218. FilamentCompanies::updateUserPasswordsUsing(UpdateUserPassword::class);
  219. FilamentCompanies::createCompaniesUsing(CreateCompany::class);
  220. FilamentCompanies::updateCompanyNamesUsing(UpdateCompanyName::class);
  221. FilamentCompanies::addCompanyEmployeesUsing(AddCompanyEmployee::class);
  222. FilamentCompanies::inviteCompanyEmployeesUsing(InviteCompanyEmployee::class);
  223. FilamentCompanies::removeCompanyEmployeesUsing(RemoveCompanyEmployee::class);
  224. FilamentCompanies::deleteCompaniesUsing(DeleteCompany::class);
  225. FilamentCompanies::deleteUsersUsing(DeleteUser::class);
  226. FilamentCompanies::resolvesSocialiteUsersUsing(ResolveSocialiteUser::class);
  227. FilamentCompanies::createUsersFromProviderUsing(CreateUserFromProvider::class);
  228. FilamentCompanies::createConnectedAccountsUsing(CreateConnectedAccount::class);
  229. FilamentCompanies::updateConnectedAccountsUsing(UpdateConnectedAccount::class);
  230. FilamentCompanies::setUserPasswordsUsing(SetUserPassword::class);
  231. FilamentCompanies::handlesInvalidStateUsing(HandleInvalidState::class);
  232. FilamentCompanies::generatesProvidersRedirectsUsing(GenerateRedirectForProvider::class);
  233. }
  234. /**
  235. * Configure the roles and permissions that are available within the application.
  236. */
  237. protected function configurePermissions(): void
  238. {
  239. FilamentCompanies::defaultApiTokenPermissions(['read']);
  240. FilamentCompanies::role('admin', 'Administrator', [
  241. 'create',
  242. 'read',
  243. 'update',
  244. 'delete',
  245. ])->description('Administrator users can perform any action.');
  246. FilamentCompanies::role('editor', 'Editor', [
  247. 'read',
  248. 'create',
  249. 'update',
  250. ])->description('Editor users have the ability to read, create, and update.');
  251. }
  252. /**
  253. * Configure the default settings for Filament.
  254. */
  255. protected function configureDefaults(): void
  256. {
  257. $this->configureSelect();
  258. Forms\Components\FileUpload::configureUsing(function (Forms\Components\FileUpload $component): void {
  259. $component
  260. ->hidden(is_demo_environment());
  261. });
  262. Actions\CreateAction::configureUsing(static fn (Actions\CreateAction $action) => FilamentComponentConfigurator::configureActionModals($action));
  263. Actions\EditAction::configureUsing(static fn (Actions\EditAction $action) => FilamentComponentConfigurator::configureActionModals($action));
  264. Actions\DeleteAction::configureUsing(static fn (Actions\DeleteAction $action) => FilamentComponentConfigurator::configureDeleteAction($action));
  265. Tables\Actions\EditAction::configureUsing(static fn (Tables\Actions\EditAction $action) => FilamentComponentConfigurator::configureActionModals($action));
  266. Tables\Actions\CreateAction::configureUsing(static fn (Tables\Actions\CreateAction $action) => FilamentComponentConfigurator::configureActionModals($action));
  267. Tables\Actions\DeleteAction::configureUsing(static fn (Tables\Actions\DeleteAction $action) => FilamentComponentConfigurator::configureDeleteAction($action));
  268. Tables\Actions\DeleteBulkAction::configureUsing(static fn (Tables\Actions\DeleteBulkAction $action) => FilamentComponentConfigurator::configureDeleteAction($action));
  269. Forms\Components\DateTimePicker::configureUsing(static function (Forms\Components\DateTimePicker $component) {
  270. $component->native(false);
  271. });
  272. Tables\Table::configureUsing(static function (Tables\Table $table): void {
  273. $table::$defaultDateDisplayFormat = CompanySettingsService::getDefaultDateFormat(session('current_company_id') ?? auth()->user()->current_company_id);
  274. $table
  275. ->paginationPageOptions([5, 10, 25, 50, 100])
  276. ->filtersFormWidth(MaxWidth::Small)
  277. ->filtersTriggerAction(
  278. fn (Tables\Actions\Action $action) => $action
  279. ->button()
  280. ->label('Filters')
  281. ->slideOver()
  282. );
  283. });
  284. Tables\Columns\TextColumn::configureUsing(function (Tables\Columns\TextColumn $column): void {
  285. $column->placeholder('–');
  286. });
  287. TextEntry::configureUsing(function (TextEntry $component): void {
  288. $component->placeholder('–');
  289. });
  290. Tables\Actions\ExportAction::configureUsing(function (Tables\Actions\ExportAction $action) {
  291. $action
  292. ->color('primary')
  293. ->slideOver();
  294. });
  295. }
  296. /**
  297. * Configure the default settings for the Select component.
  298. */
  299. protected function configureSelect(): void
  300. {
  301. Select::configureUsing(function (Select $select): void {
  302. $select
  303. ->native(false)
  304. ->selectablePlaceholder(fn (Select $component) => ! $component->isRequired());
  305. });
  306. }
  307. }