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

ConfigureCompanyNavigation.php 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. namespace App\Listeners;
  3. use App\Events\CompanyConfigured;
  4. use App\Filament\Company\Pages\Accounting\AccountChart;
  5. use App\Filament\Company\Pages\Accounting\Transactions;
  6. use App\Filament\Company\Pages\Reports;
  7. use App\Filament\Company\Pages\Service\ConnectedAccount;
  8. use App\Filament\Company\Pages\Service\LiveCurrency;
  9. use App\Filament\Company\Pages\Setting\Appearance;
  10. use App\Filament\Company\Pages\Setting\CompanyDefault;
  11. use App\Filament\Company\Pages\Setting\CompanyProfile;
  12. use App\Filament\Company\Pages\Setting\Invoice;
  13. use App\Filament\Company\Pages\Setting\Localization;
  14. use App\Filament\Company\Resources\Banking\AccountResource;
  15. use App\Filament\Company\Resources\Core\DepartmentResource;
  16. use App\Filament\Company\Resources\Setting\CurrencyResource;
  17. use App\Filament\Company\Resources\Setting\DiscountResource;
  18. use App\Filament\Company\Resources\Setting\TaxResource;
  19. use Filament\Facades\Filament;
  20. use Filament\Navigation\NavigationBuilder;
  21. use Filament\Navigation\NavigationGroup;
  22. use Filament\Pages\Dashboard;
  23. class ConfigureCompanyNavigation
  24. {
  25. /**
  26. * Handle the event.
  27. */
  28. public function handle(CompanyConfigured $event): void
  29. {
  30. $company = $event->company;
  31. $hasTopNavigation = $company->appearance->has_top_navigation ?? false;
  32. Filament::getPanel('company')
  33. ->topNavigation($hasTopNavigation)
  34. ->sidebarCollapsibleOnDesktop(! $hasTopNavigation);
  35. if (Filament::getPanel('company')->hasTopNavigation()) {
  36. Filament::getPanel('company')->navigation(
  37. $this->buildCompanyNavigation()
  38. );
  39. } else {
  40. Filament::getPanel('company')->navigation(
  41. $this->buildCompanySidebarNavigation()
  42. );
  43. }
  44. NavigationGroup::configureUsing(static function (NavigationGroup $group): void {
  45. $group->localizeLabel();
  46. }, isImportant: true);
  47. }
  48. /**
  49. * Build the company navigation.
  50. */
  51. protected function buildCompanyNavigation(): callable
  52. {
  53. return function (NavigationBuilder $builder): NavigationBuilder {
  54. return $builder
  55. ->items(Dashboard::getNavigationItems())
  56. ->groups([
  57. $this->buildSettingsGroup(),
  58. $this->buildResourcesGroup(),
  59. ]);
  60. };
  61. }
  62. /**
  63. * Build the settings group.
  64. */
  65. protected function buildSettingsGroup(): NavigationGroup
  66. {
  67. return NavigationGroup::make('Settings')
  68. ->items([
  69. ...CurrencyResource::getNavigationItems(),
  70. ...DiscountResource::getNavigationItems(),
  71. ...TaxResource::getNavigationItems(),
  72. ...Appearance::getNavigationItems(),
  73. ...CompanyDefault::getNavigationItems(),
  74. ...Invoice::getNavigationItems(),
  75. ...CompanyProfile::getNavigationItems(),
  76. ...Localization::getNavigationItems(),
  77. ]);
  78. }
  79. /**
  80. * Build the resources group.
  81. */
  82. protected function buildResourcesGroup(): NavigationGroup
  83. {
  84. return NavigationGroup::make('Resources')
  85. ->items([
  86. ...AccountResource::getNavigationItems(),
  87. ...ConnectedAccount::getNavigationItems(),
  88. ...LiveCurrency::getNavigationItems(),
  89. ...DepartmentResource::getNavigationItems(),
  90. ]);
  91. }
  92. /**
  93. * Build the company sidebar navigation.
  94. */
  95. protected function buildCompanySidebarNavigation(): callable
  96. {
  97. return static function (NavigationBuilder $builder): NavigationBuilder {
  98. return $builder
  99. ->items(Dashboard::getNavigationItems())
  100. ->groups([
  101. NavigationGroup::make('Accounting')
  102. ->icon('heroicon-o-clipboard-document-list')
  103. ->extraSidebarAttributes(['class' => 'es-sidebar-group'])
  104. ->items([
  105. ...AccountChart::getNavigationItems(),
  106. ...Transactions::getNavigationItems(),
  107. ]),
  108. NavigationGroup::make('Banking')
  109. ->icon('heroicon-o-building-library')
  110. ->items(AccountResource::getNavigationItems()),
  111. NavigationGroup::make('HR')
  112. ->icon('heroicon-o-user-group')
  113. ->items(DepartmentResource::getNavigationItems()),
  114. NavigationGroup::make('Services')
  115. ->icon('heroicon-o-wrench-screwdriver')
  116. ->items([
  117. ...ConnectedAccount::getNavigationItems(),
  118. ...LiveCurrency::getNavigationItems(),
  119. ]),
  120. NavigationGroup::make('Settings')
  121. ->icon('heroicon-o-cog-8-tooth')
  122. ->items([
  123. ...Appearance::getNavigationItems(),
  124. ...CompanyProfile::getNavigationItems(),
  125. ...CurrencyResource::getNavigationItems(),
  126. ...CompanyDefault::getNavigationItems(),
  127. ...DiscountResource::getNavigationItems(),
  128. ...Invoice::getNavigationItems(),
  129. ...Localization::getNavigationItems(),
  130. ...TaxResource::getNavigationItems(),
  131. ]),
  132. ])
  133. ->items(Reports::getNavigationItems());
  134. };
  135. }
  136. }