mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-10-31 09:46:51 +01:00 
			
		
		
		
	Trait-ify resources and add customizable options (#1396)
This commit is contained in:
		
							parent
							
								
									57a13a2701
								
							
						
					
					
						commit
						6107524522
					
				
							
								
								
									
										9
									
								
								app/Enums/HeaderActionPosition.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/Enums/HeaderActionPosition.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Enums; | ||||
| 
 | ||||
| enum HeaderActionPosition: string | ||||
| { | ||||
|     case Before = 'before'; | ||||
|     case After = 'after'; | ||||
| } | ||||
							
								
								
									
										9
									
								
								app/Enums/HeaderWidgetPosition.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/Enums/HeaderWidgetPosition.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Enums; | ||||
| 
 | ||||
| enum HeaderWidgetPosition: string | ||||
| { | ||||
|     case Before = 'before'; | ||||
|     case After = 'after'; | ||||
| } | ||||
| @ -8,8 +8,11 @@ use App\Extensions\OAuth\Providers\OAuthProvider; | ||||
| use App\Models\Backup; | ||||
| use App\Notifications\MailTested; | ||||
| use App\Traits\EnvironmentWriterTrait; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Exception; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Forms\Components\Actions; | ||||
| use Filament\Forms\Components\Actions\Action as FormAction; | ||||
| use Filament\Forms\Components\Component; | ||||
| @ -44,9 +47,12 @@ use Illuminate\Support\Str; | ||||
|  */ | ||||
| class Settings extends Page implements HasForms | ||||
| { | ||||
|     use CanCustomizeHeaderActions, InteractsWithHeaderActions { | ||||
|         CanCustomizeHeaderActions::getHeaderActions insteadof InteractsWithHeaderActions; | ||||
|     } | ||||
|     use CanCustomizeHeaderWidgets; | ||||
|     use EnvironmentWriterTrait; | ||||
|     use InteractsWithForms; | ||||
|     use InteractsWithHeaderActions; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-settings'; | ||||
| 
 | ||||
| @ -791,7 +797,8 @@ class Settings extends Page implements HasForms | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             Action::make('save') | ||||
|  | ||||
| @ -6,11 +6,16 @@ use App\Filament\Admin\Resources\ApiKeyResource\Pages; | ||||
| use App\Filament\Admin\Resources\UserResource\Pages\EditUser; | ||||
| use App\Filament\Components\Tables\Columns\DateTimeColumn; | ||||
| use App\Models\ApiKey; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyForm; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use Filament\Forms\Components\Fieldset; | ||||
| use Filament\Forms\Components\TagsInput; | ||||
| use Filament\Forms\Components\Textarea; | ||||
| use Filament\Forms\Components\ToggleButtons; | ||||
| use Filament\Forms\Form; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\CreateAction; | ||||
| use Filament\Tables\Actions\DeleteAction; | ||||
| @ -20,6 +25,11 @@ use Illuminate\Database\Eloquent\Builder; | ||||
| 
 | ||||
| class ApiKeyResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyForm; | ||||
|     use CanModifyTable; | ||||
| 
 | ||||
|     protected static ?string $model = ApiKey::class; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-key'; | ||||
| @ -56,7 +66,7 @@ class ApiKeyResource extends Resource | ||||
|         return trans('admin/dashboard.advanced'); | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         return $table | ||||
|             ->columns([ | ||||
| @ -92,7 +102,7 @@ class ApiKeyResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         return $form | ||||
|             ->schema([ | ||||
| @ -142,7 +152,8 @@ class ApiKeyResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListApiKeys::route('/'), | ||||
|  | ||||
| @ -4,16 +4,24 @@ namespace App\Filament\Admin\Resources\ApiKeyResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\ApiKeyResource; | ||||
| use App\Models\ApiKey; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Resources\Pages\CreateRecord; | ||||
| use Illuminate\Database\Eloquent\Model; | ||||
| 
 | ||||
| class CreateApiKey extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ApiKeyResource::class; | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             $this->getCreateFormAction()->formId('form'), | ||||
|  | ||||
| @ -4,14 +4,22 @@ namespace App\Filament\Admin\Resources\ApiKeyResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\ApiKeyResource; | ||||
| use App\Models\ApiKey; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListApiKeys extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ApiKeyResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             CreateAction::make() | ||||
|  | ||||
| @ -3,12 +3,19 @@ | ||||
| namespace App\Filament\Admin\Resources; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\DatabaseHostResource\Pages; | ||||
| use App\Filament\Admin\Resources\DatabaseHostResource\RelationManagers; | ||||
| use App\Models\DatabaseHost; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyForm; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use Filament\Forms\Components\Section; | ||||
| use Filament\Forms\Components\Select; | ||||
| use Filament\Forms\Components\TextInput; | ||||
| use Filament\Forms\Form; | ||||
| use Filament\Forms\Set; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\RelationManagers\RelationManager; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\CreateAction; | ||||
| use Filament\Tables\Actions\DeleteBulkAction; | ||||
| @ -20,6 +27,11 @@ use Illuminate\Database\Eloquent\Builder; | ||||
| 
 | ||||
| class DatabaseHostResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyForm; | ||||
|     use CanModifyTable; | ||||
| 
 | ||||
|     protected static ?string $model = DatabaseHost::class; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-database'; | ||||
| @ -51,7 +63,7 @@ class DatabaseHostResource extends Resource | ||||
|         return trans('admin/dashboard.advanced'); | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         return $table | ||||
|             ->columns([ | ||||
| @ -89,7 +101,7 @@ class DatabaseHostResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         return $form | ||||
|             ->schema([ | ||||
| @ -150,7 +162,16 @@ class DatabaseHostResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return class-string<RelationManager>[] */ | ||||
|     public static function getDefaultRelations(): array | ||||
|     { | ||||
|         return [ | ||||
|             RelationManagers\DatabasesRelationManager::class, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListDatabaseHosts::route('/'), | ||||
|  | ||||
| @ -4,6 +4,8 @@ namespace App\Filament\Admin\Resources\DatabaseHostResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\DatabaseHostResource; | ||||
| use App\Services\Databases\Hosts\HostCreationService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Forms\Components\Fieldset; | ||||
| use Filament\Forms\Components\Hidden; | ||||
| use Filament\Forms\Components\Placeholder; | ||||
| @ -26,6 +28,8 @@ use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction; | ||||
| 
 | ||||
| class CreateDatabaseHost extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
|     use HasWizard; | ||||
| 
 | ||||
|     protected static string $resource = DatabaseHostResource::class; | ||||
|  | ||||
| @ -3,9 +3,12 @@ | ||||
| namespace App\Filament\Admin\Resources\DatabaseHostResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\DatabaseHostResource; | ||||
| use App\Filament\Admin\Resources\DatabaseHostResource\RelationManagers\DatabasesRelationManager; | ||||
| use App\Models\DatabaseHost; | ||||
| use App\Services\Databases\Hosts\HostUpdateService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\DeleteAction; | ||||
| use Filament\Notifications\Notification; | ||||
| use Filament\Resources\Pages\EditRecord; | ||||
| @ -15,6 +18,9 @@ use PDOException; | ||||
| 
 | ||||
| class EditDatabaseHost extends EditRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = DatabaseHostResource::class; | ||||
| 
 | ||||
|     private HostUpdateService $hostUpdateService; | ||||
| @ -24,7 +30,8 @@ class EditDatabaseHost extends EditRecord | ||||
|         $this->hostUpdateService = $hostUpdateService; | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             DeleteAction::make() | ||||
| @ -39,17 +46,6 @@ class EditDatabaseHost extends EditRecord | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     public function getRelationManagers(): array | ||||
|     { | ||||
|         if (DatabasesRelationManager::canViewForRecord($this->getRecord(), static::class)) { | ||||
|             return [ | ||||
|                 DatabasesRelationManager::class, | ||||
|             ]; | ||||
|         } | ||||
| 
 | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     protected function handleRecordUpdate(Model $record, array $data): Model | ||||
|     { | ||||
|         if (!$record instanceof DatabaseHost) { | ||||
|  | ||||
| @ -4,14 +4,22 @@ namespace App\Filament\Admin\Resources\DatabaseHostResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\DatabaseHostResource; | ||||
| use App\Models\DatabaseHost; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListDatabaseHosts extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = DatabaseHostResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             CreateAction::make() | ||||
|  | ||||
| @ -3,29 +3,25 @@ | ||||
| namespace App\Filament\Admin\Resources\DatabaseHostResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\DatabaseHostResource; | ||||
| use App\Filament\Admin\Resources\DatabaseHostResource\RelationManagers\DatabasesRelationManager; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\EditAction; | ||||
| use Filament\Resources\Pages\ViewRecord; | ||||
| 
 | ||||
| class ViewDatabaseHost extends ViewRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = DatabaseHostResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             EditAction::make(), | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public function getRelationManagers(): array | ||||
|     { | ||||
|         if (DatabasesRelationManager::canViewForRecord($this->getRecord(), static::class)) { | ||||
|             return [ | ||||
|                 DatabasesRelationManager::class, | ||||
|             ]; | ||||
|         } | ||||
| 
 | ||||
|         return []; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -3,11 +3,19 @@ | ||||
| namespace App\Filament\Admin\Resources; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\EggResource\Pages; | ||||
| use App\Filament\Admin\Resources\EggResource\RelationManagers; | ||||
| use App\Models\Egg; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\RelationManagers\RelationManager; | ||||
| use Filament\Resources\Resource; | ||||
| 
 | ||||
| class EggResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
| 
 | ||||
|     protected static ?string $model = Egg::class; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-eggs'; | ||||
| @ -44,7 +52,16 @@ class EggResource extends Resource | ||||
|         return ['name', 'tags', 'uuid', 'id']; | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return class-string<RelationManager>[] */ | ||||
|     public static function getDefaultRelations(): array | ||||
|     { | ||||
|         return [ | ||||
|             RelationManagers\ServersRelationManager::class, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListEggs::route('/'), | ||||
|  | ||||
| @ -6,6 +6,10 @@ use AbdelhamidErrahmouni\FilamentMonacoEditor\MonacoEditor; | ||||
| use App\Filament\Admin\Resources\EggResource; | ||||
| use App\Filament\Components\Forms\Fields\CopyFrom; | ||||
| use App\Models\EggVariable; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Forms\Components\Checkbox; | ||||
| use Filament\Forms\Components\Fieldset; | ||||
| use Filament\Forms\Components\Hidden; | ||||
| @ -28,11 +32,15 @@ use Illuminate\Validation\Rules\Unique; | ||||
| 
 | ||||
| class CreateEgg extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = EggResource::class; | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             $this->getCreateFormAction()->formId('form'), | ||||
|  | ||||
| @ -4,12 +4,15 @@ namespace App\Filament\Admin\Resources\EggResource\Pages; | ||||
| 
 | ||||
| use AbdelhamidErrahmouni\FilamentMonacoEditor\MonacoEditor; | ||||
| use App\Filament\Admin\Resources\EggResource; | ||||
| use App\Filament\Admin\Resources\EggResource\RelationManagers\ServersRelationManager; | ||||
| use App\Filament\Components\Actions\ExportEggAction; | ||||
| use App\Filament\Components\Actions\ImportEggAction; | ||||
| use App\Filament\Components\Forms\Fields\CopyFrom; | ||||
| use App\Models\Egg; | ||||
| use App\Models\EggVariable; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\DeleteAction; | ||||
| use Filament\Forms\Components\Checkbox; | ||||
| use Filament\Forms\Components\Fieldset; | ||||
| @ -31,6 +34,9 @@ use Illuminate\Validation\Rules\Unique; | ||||
| 
 | ||||
| class EditEgg extends EditRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = EggResource::class; | ||||
| 
 | ||||
|     public function form(Form $form): Form | ||||
| @ -251,7 +257,8 @@ class EditEgg extends EditRecord | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             DeleteAction::make() | ||||
| @ -273,11 +280,4 @@ class EditEgg extends EditRecord | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     public function getRelationManagers(): array | ||||
|     { | ||||
|         return [ | ||||
|             ServersRelationManager::class, | ||||
|         ]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -10,6 +10,10 @@ use App\Filament\Components\Tables\Actions\UpdateEggAction; | ||||
| use App\Filament\Components\Tables\Actions\UpdateEggBulkAction; | ||||
| use App\Filament\Components\Tables\Filters\TagsFilter; | ||||
| use App\Models\Egg; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction as CreateHeaderAction; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| use Filament\Tables\Actions\CreateAction; | ||||
| @ -23,6 +27,9 @@ use Illuminate\Support\Str; | ||||
| 
 | ||||
| class ListEggs extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = EggResource::class; | ||||
| 
 | ||||
|     public function table(Table $table): Table | ||||
| @ -95,7 +102,8 @@ class ListEggs extends ListRecords | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             ImportEggHeaderAction::make() | ||||
|  | ||||
| @ -4,6 +4,10 @@ namespace App\Filament\Admin\Resources; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\MountResource\Pages; | ||||
| use App\Models\Mount; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyForm; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use Filament\Forms\Components\Group; | ||||
| use Filament\Forms\Components\Section; | ||||
| use Filament\Forms\Components\Select; | ||||
| @ -11,6 +15,7 @@ use Filament\Forms\Components\Textarea; | ||||
| use Filament\Forms\Components\TextInput; | ||||
| use Filament\Forms\Components\ToggleButtons; | ||||
| use Filament\Forms\Form; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\CreateAction; | ||||
| use Filament\Tables\Actions\DeleteBulkAction; | ||||
| @ -22,6 +27,11 @@ use Illuminate\Database\Eloquent\Builder; | ||||
| 
 | ||||
| class MountResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyForm; | ||||
|     use CanModifyTable; | ||||
| 
 | ||||
|     protected static ?string $model = Mount::class; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-layers-linked'; | ||||
| @ -53,7 +63,7 @@ class MountResource extends Resource | ||||
|         return trans('admin/dashboard.advanced'); | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         return $table | ||||
|             ->columns([ | ||||
| @ -94,7 +104,7 @@ class MountResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         return $form | ||||
|             ->schema([ | ||||
| @ -162,7 +172,8 @@ class MountResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListMounts::route('/'), | ||||
|  | ||||
| @ -3,17 +3,25 @@ | ||||
| namespace App\Filament\Admin\Resources\MountResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\MountResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Resources\Pages\CreateRecord; | ||||
| use Illuminate\Database\Eloquent\Model; | ||||
| use Illuminate\Support\Str; | ||||
| 
 | ||||
| class CreateMount extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = MountResource::class; | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             $this->getCreateFormAction()->formId('form'), | ||||
|  | ||||
| @ -3,14 +3,22 @@ | ||||
| namespace App\Filament\Admin\Resources\MountResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\MountResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\DeleteAction; | ||||
| use Filament\Resources\Pages\EditRecord; | ||||
| 
 | ||||
| class EditMount extends EditRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = MountResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             DeleteAction::make(), | ||||
|  | ||||
| @ -4,14 +4,22 @@ namespace App\Filament\Admin\Resources\MountResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\MountResource; | ||||
| use App\Models\Mount; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListMounts extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = MountResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             CreateAction::make() | ||||
|  | ||||
| @ -3,14 +3,22 @@ | ||||
| namespace App\Filament\Admin\Resources\MountResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\MountResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\EditAction; | ||||
| use Filament\Resources\Pages\ViewRecord; | ||||
| 
 | ||||
| class ViewMount extends ViewRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = MountResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             EditAction::make(), | ||||
|  | ||||
| @ -5,11 +5,18 @@ namespace App\Filament\Admin\Resources; | ||||
| use App\Filament\Admin\Resources\NodeResource\Pages; | ||||
| use App\Filament\Admin\Resources\NodeResource\RelationManagers; | ||||
| use App\Models\Node; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\RelationManagers\RelationManager; | ||||
| use Filament\Resources\Resource; | ||||
| use Illuminate\Database\Eloquent\Builder; | ||||
| 
 | ||||
| class NodeResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
| 
 | ||||
|     protected static ?string $model = Node::class; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-server-2'; | ||||
| @ -41,7 +48,8 @@ class NodeResource extends Resource | ||||
|         return (string) static::getEloquentQuery()->count() ?: null; | ||||
|     } | ||||
| 
 | ||||
|     public static function getRelations(): array | ||||
|     /** @return class-string<RelationManager>[] */ | ||||
|     public static function getDefaultRelations(): array | ||||
|     { | ||||
|         return [ | ||||
|             RelationManagers\AllocationsRelationManager::class, | ||||
| @ -49,7 +57,8 @@ class NodeResource extends Resource | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListNodes::route('/'), | ||||
|  | ||||
| @ -4,6 +4,8 @@ namespace App\Filament\Admin\Resources\NodeResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\NodeResource; | ||||
| use App\Models\Node; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Forms; | ||||
| use Filament\Forms\Components\Actions\Action; | ||||
| use Filament\Forms\Components\Grid; | ||||
| @ -21,6 +23,9 @@ use Illuminate\Support\HtmlString; | ||||
| 
 | ||||
| class CreateNode extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = NodeResource::class; | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
|  | ||||
| @ -8,6 +8,8 @@ use App\Repositories\Daemon\DaemonConfigurationRepository; | ||||
| use App\Services\Helpers\SoftwareVersionService; | ||||
| use App\Services\Nodes\NodeAutoDeployService; | ||||
| use App\Services\Nodes\NodeUpdateService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Exception; | ||||
| use Filament\Actions; | ||||
| use Filament\Forms; | ||||
| @ -34,6 +36,9 @@ use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction; | ||||
| 
 | ||||
| class EditNode extends EditRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = NodeResource::class; | ||||
| 
 | ||||
|     private DaemonConfigurationRepository $daemonConfigurationRepository; | ||||
| @ -630,7 +635,8 @@ class EditNode extends EditRecord | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Actions\Action|Actions\ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             Actions\DeleteAction::make() | ||||
|  | ||||
| @ -6,6 +6,8 @@ use App\Filament\Admin\Resources\NodeResource; | ||||
| use App\Filament\Components\Tables\Columns\NodeHealthColumn; | ||||
| use App\Filament\Components\Tables\Filters\TagsFilter; | ||||
| use App\Models\Node; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| use Filament\Tables\Actions\CreateAction; | ||||
| @ -16,6 +18,9 @@ use Filament\Tables\Table; | ||||
| 
 | ||||
| class ListNodes extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = NodeResource::class; | ||||
| 
 | ||||
|     public function table(Table $table): Table | ||||
| @ -73,7 +78,8 @@ class ListNodes extends ListRecords | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Actions\Action|Actions\ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             Actions\CreateAction::make() | ||||
|  | ||||
| @ -4,6 +4,10 @@ namespace App\Filament\Admin\Resources; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\RoleResource\Pages; | ||||
| use App\Models\Role; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyForm; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use Filament\Forms\Components\Actions\Action; | ||||
| use Filament\Forms\Components\CheckboxList; | ||||
| use Filament\Forms\Components\Component; | ||||
| @ -14,6 +18,7 @@ use Filament\Forms\Components\Select; | ||||
| use Filament\Forms\Components\TextInput; | ||||
| use Filament\Forms\Form; | ||||
| use Filament\Forms\Get; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\CreateAction; | ||||
| use Filament\Tables\Actions\DeleteBulkAction; | ||||
| @ -26,6 +31,11 @@ use Spatie\Permission\Contracts\Permission; | ||||
| 
 | ||||
| class RoleResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyForm; | ||||
|     use CanModifyTable; | ||||
| 
 | ||||
|     protected static ?string $model = Role::class; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-users-group'; | ||||
| @ -57,7 +67,7 @@ class RoleResource extends Resource | ||||
|         return static::getModel()::count() ?: null; | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         return $table | ||||
|             ->columns([ | ||||
| @ -97,7 +107,7 @@ class RoleResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         $permissionSections = []; | ||||
| 
 | ||||
| @ -200,7 +210,8 @@ class RoleResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListRoles::route('/'), | ||||
|  | ||||
| @ -4,6 +4,10 @@ namespace App\Filament\Admin\Resources\RoleResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\RoleResource; | ||||
| use App\Models\Role; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Resources\Pages\CreateRecord; | ||||
| use Illuminate\Support\Arr; | ||||
| use Illuminate\Support\Collection; | ||||
| @ -14,13 +18,17 @@ use Spatie\Permission\Models\Permission; | ||||
|  */ | ||||
| class CreateRole extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     public Collection $permissions; | ||||
| 
 | ||||
|     protected static string $resource = RoleResource::class; | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             $this->getCreateFormAction()->formId('form'), | ||||
|  | ||||
| @ -4,6 +4,10 @@ namespace App\Filament\Admin\Resources\RoleResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\RoleResource; | ||||
| use App\Models\Role; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\DeleteAction; | ||||
| use Filament\Resources\Pages\EditRecord; | ||||
| use Illuminate\Support\Arr; | ||||
| @ -15,6 +19,9 @@ use Spatie\Permission\Models\Permission; | ||||
|  */ | ||||
| class EditRole extends EditRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = RoleResource::class; | ||||
| 
 | ||||
|     public Collection $permissions; | ||||
| @ -45,7 +52,8 @@ class EditRole extends EditRecord | ||||
|         $this->record->syncPermissions($permissionModels); | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             DeleteAction::make() | ||||
|  | ||||
| @ -3,14 +3,22 @@ | ||||
| namespace App\Filament\Admin\Resources\RoleResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\RoleResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListRoles extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = RoleResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             CreateAction::make(), | ||||
|  | ||||
| @ -3,14 +3,22 @@ | ||||
| namespace App\Filament\Admin\Resources\RoleResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\RoleResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\EditAction; | ||||
| use Filament\Resources\Pages\ViewRecord; | ||||
| 
 | ||||
| class ViewRole extends ViewRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = RoleResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             EditAction::make(), | ||||
|  | ||||
| @ -3,15 +3,23 @@ | ||||
| namespace App\Filament\Admin\Resources; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\ServerResource\Pages; | ||||
| use App\Filament\Admin\Resources\ServerResource\RelationManagers; | ||||
| use App\Models\Mount; | ||||
| use App\Models\Server; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use Filament\Forms\Components\CheckboxList; | ||||
| use Filament\Forms\Get; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\RelationManagers\RelationManager; | ||||
| use Filament\Resources\Resource; | ||||
| use Illuminate\Database\Eloquent\Builder; | ||||
| 
 | ||||
| class ServerResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
| 
 | ||||
|     protected static ?string $model = Server::class; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-brand-docker'; | ||||
| @ -66,7 +74,16 @@ class ServerResource extends Resource | ||||
|             ->columnSpanFull(); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return class-string<RelationManager>[] */ | ||||
|     public static function getDefaultRelations(): array | ||||
|     { | ||||
|         return [ | ||||
|             RelationManagers\AllocationsRelationManager::class, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListServers::route('/'), | ||||
|  | ||||
| @ -11,6 +11,8 @@ use App\Services\Allocations\AssignmentService; | ||||
| use App\Services\Servers\RandomWordService; | ||||
| use App\Services\Servers\ServerCreationService; | ||||
| use App\Services\Users\UserCreationService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Closure; | ||||
| use Exception; | ||||
| use Filament\Forms; | ||||
| @ -45,6 +47,9 @@ use LogicException; | ||||
| 
 | ||||
| class CreateServer extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ServerResource::class; | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
|  | ||||
| @ -5,7 +5,6 @@ namespace App\Filament\Admin\Resources\ServerResource\Pages; | ||||
| use AbdelhamidErrahmouni\FilamentMonacoEditor\MonacoEditor; | ||||
| use App\Enums\SuspendAction; | ||||
| use App\Filament\Admin\Resources\ServerResource; | ||||
| use App\Filament\Admin\Resources\ServerResource\RelationManagers\AllocationsRelationManager; | ||||
| use App\Filament\Components\Forms\Actions\PreviewStartupAction; | ||||
| use App\Filament\Components\Forms\Actions\RotateDatabasePasswordAction; | ||||
| use App\Filament\Server\Pages\Console; | ||||
| @ -26,6 +25,8 @@ use App\Services\Servers\ServerDeletionService; | ||||
| use App\Services\Servers\SuspensionService; | ||||
| use App\Services\Servers\ToggleInstallService; | ||||
| use App\Services\Servers\TransferServerService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Closure; | ||||
| use Exception; | ||||
| use Filament\Actions; | ||||
| @ -62,6 +63,9 @@ use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction; | ||||
| 
 | ||||
| class EditServer extends EditRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ServerResource::class; | ||||
| 
 | ||||
|     private DaemonServerRepository $daemonServerRepository; | ||||
| @ -1033,7 +1037,8 @@ class EditServer extends EditRecord | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Actions\Action|Actions\ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = $this->getRecord(); | ||||
| @ -1136,13 +1141,6 @@ class EditServer extends EditRecord | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public function getRelationManagers(): array | ||||
|     { | ||||
|         return [ | ||||
|             AllocationsRelationManager::class, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     private function shouldHideComponent(ServerVariable $serverVariable, Forms\Components\Component $component): bool | ||||
|     { | ||||
|         $containsRuleIn = array_first($serverVariable->variable->rules, fn ($value) => str($value)->startsWith('in:'), false); | ||||
|  | ||||
| @ -5,6 +5,8 @@ namespace App\Filament\Admin\Resources\ServerResource\Pages; | ||||
| use App\Filament\Server\Pages\Console; | ||||
| use App\Filament\Admin\Resources\ServerResource; | ||||
| use App\Models\Server; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| use Filament\Tables\Actions\Action; | ||||
| @ -17,6 +19,9 @@ use Filament\Tables\Table; | ||||
| 
 | ||||
| class ListServers extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ServerResource::class; | ||||
| 
 | ||||
|     public function table(Table $table): Table | ||||
| @ -101,7 +106,8 @@ class ListServers extends ListRecords | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Actions\Action|Actions\ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             Actions\CreateAction::make() | ||||
|  | ||||
| @ -6,10 +6,16 @@ use App\Filament\Admin\Resources\UserResource\Pages; | ||||
| use App\Filament\Admin\Resources\UserResource\RelationManagers; | ||||
| use App\Models\Role; | ||||
| use App\Models\User; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyForm; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Forms\Components\CheckboxList; | ||||
| use Filament\Forms\Components\TextInput; | ||||
| use Filament\Forms\Form; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\RelationManagers\RelationManager; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\DeleteBulkAction; | ||||
| use Filament\Tables\Actions\EditAction; | ||||
| @ -22,6 +28,11 @@ use Illuminate\Database\Eloquent\Builder; | ||||
| 
 | ||||
| class UserResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyForm; | ||||
|     use CanModifyTable; | ||||
| 
 | ||||
|     protected static ?string $model = User::class; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-users'; | ||||
| @ -53,7 +64,7 @@ class UserResource extends Resource | ||||
|         return static::getModel()::count() ?: null; | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         return $table | ||||
|             ->columns([ | ||||
| @ -99,7 +110,7 @@ class UserResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         return $form | ||||
|             ->columns(['default' => 1, 'lg' => 3]) | ||||
| @ -146,14 +157,16 @@ class UserResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function getRelations(): array | ||||
|     /** @return class-string<RelationManager>[] */ | ||||
|     public static function getDefaultRelations(): array | ||||
|     { | ||||
|         return [ | ||||
|             RelationManagers\ServersRelationManager::class, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListUsers::route('/'), | ||||
|  | ||||
| @ -5,11 +5,18 @@ namespace App\Filament\Admin\Resources\UserResource\Pages; | ||||
| use App\Filament\Admin\Resources\UserResource; | ||||
| use App\Models\Role; | ||||
| use App\Services\Users\UserCreationService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Resources\Pages\CreateRecord; | ||||
| use Illuminate\Database\Eloquent\Model; | ||||
| 
 | ||||
| class CreateUser extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = UserResource::class; | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
| @ -21,7 +28,8 @@ class CreateUser extends CreateRecord | ||||
|         $this->service = $service; | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             $this->getCreateFormAction()->formId('form'), | ||||
|  | ||||
| @ -5,12 +5,19 @@ namespace App\Filament\Admin\Resources\UserResource\Pages; | ||||
| use App\Filament\Admin\Resources\UserResource; | ||||
| use App\Models\User; | ||||
| use App\Services\Users\UserUpdateService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\DeleteAction; | ||||
| use Filament\Resources\Pages\EditRecord; | ||||
| use Illuminate\Database\Eloquent\Model; | ||||
| 
 | ||||
| class EditUser extends EditRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = UserResource::class; | ||||
| 
 | ||||
|     private UserUpdateService $service; | ||||
| @ -20,7 +27,8 @@ class EditUser extends EditRecord | ||||
|         $this->service = $service; | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             DeleteAction::make() | ||||
|  | ||||
| @ -3,14 +3,22 @@ | ||||
| namespace App\Filament\Admin\Resources\UserResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\UserResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListUsers extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = UserResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             CreateAction::make(), | ||||
|  | ||||
| @ -3,14 +3,22 @@ | ||||
| namespace App\Filament\Admin\Resources\UserResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\UserResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\EditAction; | ||||
| use Filament\Resources\Pages\ViewRecord; | ||||
| 
 | ||||
| class ViewUser extends ViewRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = UserResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             EditAction::make(), | ||||
|  | ||||
| @ -4,9 +4,14 @@ namespace App\Filament\Admin\Resources; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\WebhookResource\Pages; | ||||
| use App\Models\WebhookConfiguration; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyForm; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use Filament\Forms\Components\CheckboxList; | ||||
| use Filament\Forms\Components\TextInput; | ||||
| use Filament\Forms\Form; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\CreateAction; | ||||
| use Filament\Tables\Actions\DeleteAction; | ||||
| @ -18,6 +23,11 @@ use Filament\Tables\Table; | ||||
| 
 | ||||
| class WebhookResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyForm; | ||||
|     use CanModifyTable; | ||||
| 
 | ||||
|     protected static ?string $model = WebhookConfiguration::class; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-webhook'; | ||||
| @ -49,7 +59,7 @@ class WebhookResource extends Resource | ||||
|         return trans('admin/dashboard.advanced'); | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         return $table | ||||
|             ->columns([ | ||||
| @ -75,7 +85,7 @@ class WebhookResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         return $form | ||||
|             ->schema([ | ||||
| @ -98,7 +108,8 @@ class WebhookResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListWebhookConfigurations::route('/'), | ||||
|  | ||||
| @ -3,15 +3,23 @@ | ||||
| namespace App\Filament\Admin\Resources\WebhookResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\WebhookResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Resources\Pages\CreateRecord; | ||||
| 
 | ||||
| class CreateWebhookConfiguration extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = WebhookResource::class; | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             $this->getCreateFormAction()->formId('form'), | ||||
|  | ||||
| @ -3,14 +3,22 @@ | ||||
| namespace App\Filament\Admin\Resources\WebhookResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\WebhookResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\DeleteAction; | ||||
| use Filament\Resources\Pages\EditRecord; | ||||
| 
 | ||||
| class EditWebhookConfiguration extends EditRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = WebhookResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             DeleteAction::make(), | ||||
|  | ||||
| @ -4,14 +4,22 @@ namespace App\Filament\Admin\Resources\WebhookResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\WebhookResource; | ||||
| use App\Models\WebhookConfiguration; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListWebhookConfigurations extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = WebhookResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             CreateAction::make() | ||||
|  | ||||
| @ -3,14 +3,22 @@ | ||||
| namespace App\Filament\Admin\Resources\WebhookResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Admin\Resources\WebhookResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\EditAction; | ||||
| use Filament\Resources\Pages\ViewRecord; | ||||
| 
 | ||||
| class ViewWebhookConfiguration extends ViewRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = WebhookResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             EditAction::make(), | ||||
|  | ||||
| @ -9,6 +9,8 @@ use App\Filament\Server\Pages\Console; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Server; | ||||
| use App\Repositories\Daemon\DaemonPowerRepository; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Notifications\Notification; | ||||
| use Filament\Resources\Components\Tab; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| @ -26,6 +28,9 @@ use Livewire\Attributes\On; | ||||
| 
 | ||||
| class ListServers extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ServerResource::class; | ||||
| 
 | ||||
|     public const DANGER_THRESHOLD = 0.9; | ||||
|  | ||||
| @ -12,11 +12,15 @@ use App\Services\Helpers\LanguageService; | ||||
| use App\Services\Users\ToggleTwoFactorService; | ||||
| use App\Services\Users\TwoFactorSetupService; | ||||
| use App\Services\Users\UserUpdateService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use chillerlan\QRCode\Common\EccLevel; | ||||
| use chillerlan\QRCode\Common\Version; | ||||
| use chillerlan\QRCode\QRCode; | ||||
| use chillerlan\QRCode\QROptions; | ||||
| use DateTimeZone; | ||||
| use Filament\Actions\Action as HeaderAction; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Forms\Components\Actions; | ||||
| use Filament\Forms\Components\Actions\Action; | ||||
| use Filament\Forms\Components\FileUpload; | ||||
| @ -51,6 +55,9 @@ use Laravel\Socialite\Facades\Socialite; | ||||
|  */ | ||||
| class EditProfile extends BaseEditProfile | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     private ToggleTwoFactorService $toggleTwoFactorService; | ||||
| 
 | ||||
|     public function boot(ToggleTwoFactorService $toggleTwoFactorService): void | ||||
| @ -505,7 +512,8 @@ class EditProfile extends BaseEditProfile | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<HeaderAction|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             $this->getSaveFormAction()->formId('form'), | ||||
|  | ||||
| @ -14,9 +14,11 @@ use App\Filament\Server\Widgets\ServerOverview; | ||||
| use App\Livewire\AlertBanner; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Server; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use Filament\Actions\Concerns\InteractsWithActions; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Pages\Page; | ||||
| use Filament\Support\Enums\ActionSize; | ||||
| use Filament\Widgets\Widget; | ||||
| @ -25,6 +27,7 @@ use Livewire\Attributes\On; | ||||
| 
 | ||||
| class Console extends Page | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use InteractsWithActions; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-brand-tabler'; | ||||
| @ -145,7 +148,8 @@ class Console extends Page | ||||
|         $this->cacheHeaderActions(); | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
|  | ||||
| @ -3,6 +3,9 @@ | ||||
| namespace App\Filament\Server\Pages; | ||||
| 
 | ||||
| use App\Models\Server; | ||||
| use App\Traits\Filament\BlockAccessInConflict; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Forms\Concerns\InteractsWithForms; | ||||
| use Filament\Forms\Form; | ||||
| @ -14,6 +17,9 @@ use Filament\Pages\Page; | ||||
|  */ | ||||
| abstract class ServerFormPage extends Page | ||||
| { | ||||
|     use BlockAccessInConflict; | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
|     use InteractsWithFormActions; | ||||
|     use InteractsWithForms; | ||||
| 
 | ||||
| @ -64,17 +70,4 @@ abstract class ServerFormPage extends Page | ||||
| 
 | ||||
|         return $server; | ||||
|     } | ||||
| 
 | ||||
|     // TODO: find better way handle server conflict state
 | ||||
|     public static function canAccess(): bool | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         if ($server->isInConflictState()) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return parent::canAccess(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -10,12 +10,16 @@ use App\Models\Permission; | ||||
| use App\Models\Role; | ||||
| use App\Models\Server; | ||||
| use App\Models\User; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Forms\Components\Actions\Action; | ||||
| use Filament\Forms\Components\DateTimePicker; | ||||
| use Filament\Forms\Components\KeyValue; | ||||
| use Filament\Forms\Components\Placeholder; | ||||
| use Filament\Forms\Components\TextInput; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\ViewAction; | ||||
| use Filament\Tables\Columns\TextColumn; | ||||
| @ -28,6 +32,10 @@ use Illuminate\Support\HtmlString; | ||||
| 
 | ||||
| class ActivityResource extends Resource | ||||
| { | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyTable; | ||||
| 
 | ||||
|     protected static ?string $model = ActivityLog::class; | ||||
| 
 | ||||
|     protected static ?string $modelLabel = 'Activity'; | ||||
| @ -38,7 +46,7 @@ class ActivityResource extends Resource | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-stack'; | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| @ -122,11 +130,6 @@ class ActivityResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function canViewAny(): bool | ||||
|     { | ||||
|         return auth()->user()->can(Permission::ACTION_ACTIVITY_READ, Filament::getTenant()); | ||||
|     } | ||||
| 
 | ||||
|     public static function getEloquentQuery(): Builder | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
| @ -153,7 +156,13 @@ class ActivityResource extends Resource | ||||
|             }); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     public static function canViewAny(): bool | ||||
|     { | ||||
|         return auth()->user()->can(Permission::ACTION_ACTIVITY_READ, Filament::getTenant()); | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListActivities::route('/'), | ||||
|  | ||||
| @ -3,10 +3,15 @@ | ||||
| namespace App\Filament\Server\Resources\ActivityResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Server\Resources\ActivityResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListActivities extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ActivityResource::class; | ||||
| 
 | ||||
|     public function getBreadcrumbs(): array | ||||
|  | ||||
| @ -7,7 +7,12 @@ use App\Filament\Server\Resources\AllocationResource\Pages; | ||||
| use App\Models\Allocation; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Server; | ||||
| use App\Traits\Filament\BlockAccessInConflict; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\DetachAction; | ||||
| use Filament\Tables\Columns\IconColumn; | ||||
| @ -18,6 +23,11 @@ use Illuminate\Database\Eloquent\Model; | ||||
| 
 | ||||
| class AllocationResource extends Resource | ||||
| { | ||||
|     use BlockAccessInConflict; | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyTable; | ||||
| 
 | ||||
|     protected static ?string $model = Allocation::class; | ||||
| 
 | ||||
|     protected static ?string $modelLabel = 'Network'; | ||||
| @ -28,7 +38,7 @@ class AllocationResource extends Resource | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-network'; | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| @ -83,19 +93,6 @@ class AllocationResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     // TODO: find better way handle server conflict state
 | ||||
|     public static function canAccess(): bool | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         if ($server->isInConflictState()) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return parent::canAccess(); | ||||
|     } | ||||
| 
 | ||||
|     public static function canViewAny(): bool | ||||
|     { | ||||
|         return auth()->user()->can(Permission::ACTION_ALLOCATION_READ, Filament::getTenant()); | ||||
| @ -116,7 +113,8 @@ class AllocationResource extends Resource | ||||
|         return auth()->user()->can(Permission::ACTION_ALLOCATION_DELETE, Filament::getTenant()); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListAllocations::route('/'), | ||||
|  | ||||
| @ -7,15 +7,22 @@ use App\Filament\Server\Resources\AllocationResource; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Server; | ||||
| use App\Services\Allocations\FindAssignableAllocationService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListAllocations extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = AllocationResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
|  | ||||
| @ -15,6 +15,12 @@ use App\Services\Backups\DownloadLinkService; | ||||
| use App\Filament\Components\Tables\Columns\BytesColumn; | ||||
| use App\Filament\Components\Tables\Columns\DateTimeColumn; | ||||
| use App\Services\Backups\DeleteBackupService; | ||||
| use App\Traits\Filament\BlockAccessInConflict; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyForm; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use App\Traits\Filament\HasLimitBadge; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Forms\Components\Checkbox; | ||||
| use Filament\Forms\Components\Placeholder; | ||||
| @ -23,6 +29,7 @@ use Filament\Forms\Components\TextInput; | ||||
| use Filament\Forms\Components\Toggle; | ||||
| use Filament\Forms\Form; | ||||
| use Filament\Notifications\Notification; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\Action; | ||||
| use Filament\Tables\Actions\ActionGroup; | ||||
| @ -36,6 +43,13 @@ use Illuminate\Http\Request; | ||||
| 
 | ||||
| class BackupResource extends Resource | ||||
| { | ||||
|     use BlockAccessInConflict; | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyForm; | ||||
|     use CanModifyTable; | ||||
|     use HasLimitBadge; | ||||
| 
 | ||||
|     protected static ?string $model = Backup::class; | ||||
| 
 | ||||
|     protected static ?int $navigationSort = 3; | ||||
| @ -44,34 +58,23 @@ class BackupResource extends Resource | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
| 
 | ||||
|     public const WARNING_THRESHOLD = 0.7; | ||||
| 
 | ||||
|     public static function getNavigationBadge(): string | ||||
|     protected static function getBadgeCount(): int | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         $limit = $server->backup_limit; | ||||
| 
 | ||||
|         return $server->backups->count() . ($limit === 0 ? '' : ' / ' . $limit); | ||||
|         return $server->backups->count(); | ||||
|     } | ||||
| 
 | ||||
|     public static function getNavigationBadgeColor(): ?string | ||||
|     protected static function getBadgeLimit(): int | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         $limit = $server->backup_limit; | ||||
|         $count = $server->backups->count(); | ||||
| 
 | ||||
|         if ($limit === 0) { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         return $count >= $limit ? 'danger' : ($count >= $limit * self::WARNING_THRESHOLD ? 'warning' : 'success'); | ||||
|         return $server->backup_limit; | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         return $form | ||||
|             ->schema([ | ||||
| @ -87,7 +90,7 @@ class BackupResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| @ -202,19 +205,6 @@ class BackupResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     // TODO: find better way handle server conflict state
 | ||||
|     public static function canAccess(): bool | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         if ($server->isInConflictState()) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return parent::canAccess(); | ||||
|     } | ||||
| 
 | ||||
|     public static function canViewAny(): bool | ||||
|     { | ||||
|         return auth()->user()->can(Permission::ACTION_BACKUP_READ, Filament::getTenant()); | ||||
| @ -230,7 +220,8 @@ class BackupResource extends Resource | ||||
|         return auth()->user()->can(Permission::ACTION_BACKUP_DELETE, Filament::getTenant()); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListBackups::route('/'), | ||||
|  | ||||
| @ -7,6 +7,10 @@ use App\Filament\Server\Resources\BackupResource; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Server; | ||||
| use App\Services\Backups\InitiateBackupService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Notifications\Notification; | ||||
| @ -15,9 +19,13 @@ use Symfony\Component\HttpKernel\Exception\HttpException; | ||||
| 
 | ||||
| class ListBackups extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = BackupResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
|  | ||||
| @ -9,9 +9,16 @@ use App\Models\Database; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Server; | ||||
| use App\Services\Databases\DatabaseManagementService; | ||||
| use App\Traits\Filament\BlockAccessInConflict; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyForm; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use App\Traits\Filament\HasLimitBadge; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Forms\Components\TextInput; | ||||
| use Filament\Forms\Form; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\DeleteAction; | ||||
| use Filament\Tables\Actions\ViewAction; | ||||
| @ -22,40 +29,36 @@ use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction; | ||||
| 
 | ||||
| class DatabaseResource extends Resource | ||||
| { | ||||
|     use BlockAccessInConflict; | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyForm; | ||||
|     use CanModifyTable; | ||||
|     use HasLimitBadge; | ||||
| 
 | ||||
|     protected static ?string $model = Database::class; | ||||
| 
 | ||||
|     protected static ?int $navigationSort = 6; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-database'; | ||||
| 
 | ||||
|     public const WARNING_THRESHOLD = 0.7; | ||||
| 
 | ||||
|     public static function getNavigationBadge(): string | ||||
|     protected static function getBadgeCount(): int | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         $limit = $server->database_limit; | ||||
| 
 | ||||
|         return $server->databases->count() . ($limit === 0 ? '' : ' / ' . $limit); | ||||
|         return $server->databases->count(); | ||||
|     } | ||||
| 
 | ||||
|     public static function getNavigationBadgeColor(): ?string | ||||
|     protected static function getBadgeLimit(): int | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         $limit = $server->database_limit; | ||||
|         $count = $server->databases->count(); | ||||
| 
 | ||||
|         if ($limit === 0) { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         return $count >= $limit ? 'danger' : ($count >= $limit * self::WARNING_THRESHOLD ? 'warning' : 'success'); | ||||
|         return $server->database_limit; | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| @ -92,7 +95,7 @@ class DatabaseResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         return $table | ||||
|             ->columns([ | ||||
| @ -113,19 +116,6 @@ class DatabaseResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     // TODO: find better way handle server conflict state
 | ||||
|     public static function canAccess(): bool | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         if ($server->isInConflictState()) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return parent::canAccess(); | ||||
|     } | ||||
| 
 | ||||
|     public static function canViewAny(): bool | ||||
|     { | ||||
|         return auth()->user()->can(Permission::ACTION_DATABASE_READ, Filament::getTenant()); | ||||
| @ -151,7 +141,8 @@ class DatabaseResource extends Resource | ||||
|         return auth()->user()->can(Permission::ACTION_DATABASE_DELETE, Filament::getTenant()); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListDatabases::route('/'), | ||||
|  | ||||
| @ -6,6 +6,10 @@ use App\Filament\Server\Resources\DatabaseResource; | ||||
| use App\Models\DatabaseHost; | ||||
| use App\Models\Server; | ||||
| use App\Services\Databases\DatabaseManagementService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Forms\Components\Grid; | ||||
| @ -15,9 +19,13 @@ use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListDatabases extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = DatabaseResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
|  | ||||
| @ -5,32 +5,26 @@ namespace App\Filament\Server\Resources; | ||||
| use App\Filament\Server\Resources\FileResource\Pages; | ||||
| use App\Models\File; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Server; | ||||
| use App\Traits\Filament\BlockAccessInConflict; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Illuminate\Database\Eloquent\Model; | ||||
| 
 | ||||
| class FileResource extends Resource | ||||
| { | ||||
|     use BlockAccessInConflict; | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
| 
 | ||||
|     protected static ?string $model = File::class; | ||||
| 
 | ||||
|     protected static ?int $navigationSort = 2; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-files'; | ||||
| 
 | ||||
|     // TODO: find better way handle server conflict state
 | ||||
|     public static function canAccess(): bool | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         if ($server->isInConflictState()) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return parent::canAccess(); | ||||
|     } | ||||
| 
 | ||||
|     public static function canViewAny(): bool | ||||
|     { | ||||
|         return auth()->user()->can(Permission::ACTION_FILE_READ, Filament::getTenant()); | ||||
| @ -51,7 +45,8 @@ class FileResource extends Resource | ||||
|         return auth()->user()->can(Permission::ACTION_FILE_DELETE, Filament::getTenant()); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'edit' => Pages\EditFiles::route('/edit/{path}'), | ||||
|  | ||||
| @ -12,6 +12,8 @@ use App\Livewire\AlertBanner; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Server; | ||||
| use App\Repositories\Daemon\DaemonFileRepository; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Forms\Components\Actions\Action; | ||||
| use Filament\Forms\Components\Section; | ||||
| @ -37,6 +39,8 @@ use Livewire\Attributes\Locked; | ||||
|  */ | ||||
| class EditFiles extends Page | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
|     use InteractsWithFormActions; | ||||
|     use InteractsWithForms; | ||||
| 
 | ||||
|  | ||||
| @ -12,7 +12,10 @@ use App\Models\Server; | ||||
| use App\Repositories\Daemon\DaemonFileRepository; | ||||
| use App\Filament\Components\Tables\Columns\BytesColumn; | ||||
| use App\Filament\Components\Tables\Columns\DateTimeColumn; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action as HeaderAction; | ||||
| use Filament\Actions\ActionGroup as HeaderActionGroup; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Forms\Components\CheckboxList; | ||||
| use Filament\Forms\Components\FileUpload; | ||||
| @ -43,6 +46,9 @@ use Livewire\Attributes\Locked; | ||||
| 
 | ||||
| class ListFiles extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = FileResource::class; | ||||
| 
 | ||||
|     #[Locked]
 | ||||
| @ -399,7 +405,8 @@ class ListFiles extends ListRecords | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<HeaderAction|HeaderActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
|  | ||||
| @ -7,6 +7,8 @@ use App\Models\File; | ||||
| use App\Models\Server; | ||||
| use App\Filament\Components\Tables\Columns\BytesColumn; | ||||
| use App\Filament\Components\Tables\Columns\DateTimeColumn; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| use Filament\Tables\Columns\TextColumn; | ||||
| @ -16,6 +18,9 @@ use Livewire\Attributes\Url; | ||||
| 
 | ||||
| class SearchFiles extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = FileResource::class; | ||||
| 
 | ||||
|     protected static ?string $title = 'Global Search'; | ||||
|  | ||||
| @ -9,7 +9,11 @@ use App\Filament\Server\Resources\ScheduleResource\RelationManagers\TasksRelatio | ||||
| use App\Helpers\Utilities; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Schedule; | ||||
| use App\Models\Server; | ||||
| use App\Traits\Filament\BlockAccessInConflict; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyForm; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use Carbon\Carbon; | ||||
| use Exception; | ||||
| use Filament\Facades\Filament; | ||||
| @ -23,6 +27,8 @@ use Filament\Forms\Components\ToggleButtons; | ||||
| use Filament\Forms\Form; | ||||
| use Filament\Forms\Set; | ||||
| use Filament\Notifications\Notification; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\RelationManagers\RelationManager; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Support\Exceptions\Halt; | ||||
| use Filament\Tables\Actions\DeleteAction; | ||||
| @ -35,25 +41,18 @@ use Illuminate\Database\Eloquent\Model; | ||||
| 
 | ||||
| class ScheduleResource extends Resource | ||||
| { | ||||
|     use BlockAccessInConflict; | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyForm; | ||||
|     use CanModifyTable; | ||||
| 
 | ||||
|     protected static ?string $model = Schedule::class; | ||||
| 
 | ||||
|     protected static ?int $navigationSort = 4; | ||||
| 
 | ||||
|     protected static ?string $navigationIcon = 'tabler-clock'; | ||||
| 
 | ||||
|     // TODO: find better way handle server conflict state
 | ||||
|     public static function canAccess(): bool | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         if ($server->isInConflictState()) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return parent::canAccess(); | ||||
|     } | ||||
| 
 | ||||
|     public static function canViewAny(): bool | ||||
|     { | ||||
|         return auth()->user()->can(Permission::ACTION_SCHEDULE_READ, Filament::getTenant()); | ||||
| @ -74,7 +73,7 @@ class ScheduleResource extends Resource | ||||
|         return auth()->user()->can(Permission::ACTION_SCHEDULE_DELETE, Filament::getTenant()); | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         return $form | ||||
|             ->columns([ | ||||
| @ -311,7 +310,7 @@ class ScheduleResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         return $table | ||||
|             ->columns([ | ||||
| @ -349,14 +348,16 @@ class ScheduleResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function getRelations(): array | ||||
|     /** @return class-string<RelationManager>[] */ | ||||
|     public static function getDefaultRelations(): array | ||||
|     { | ||||
|         return [ | ||||
|             TasksRelationManager::class, | ||||
|         ]; | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListSchedules::route('/'), | ||||
|  | ||||
| @ -6,11 +6,16 @@ use App\Facades\Activity; | ||||
| use App\Filament\Server\Resources\ScheduleResource; | ||||
| use App\Models\Schedule; | ||||
| use App\Models\Server; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Resources\Pages\CreateRecord; | ||||
| 
 | ||||
| class CreateSchedule extends CreateRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ScheduleResource::class; | ||||
| 
 | ||||
|     protected static bool $canCreateAnother = false; | ||||
|  | ||||
| @ -5,11 +5,16 @@ namespace App\Filament\Server\Resources\ScheduleResource\Pages; | ||||
| use App\Facades\Activity; | ||||
| use App\Filament\Server\Resources\ScheduleResource; | ||||
| use App\Models\Schedule; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions; | ||||
| use Filament\Resources\Pages\EditRecord; | ||||
| 
 | ||||
| class EditSchedule extends EditRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ScheduleResource::class; | ||||
| 
 | ||||
|     protected function afterSave(): void | ||||
| @ -35,7 +40,8 @@ class EditSchedule extends EditRecord | ||||
|         return $data; | ||||
|     } | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Actions\Action|Actions\ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             Actions\DeleteAction::make() | ||||
|  | ||||
| @ -3,14 +3,22 @@ | ||||
| namespace App\Filament\Server\Resources\ScheduleResource\Pages; | ||||
| 
 | ||||
| use App\Filament\Server\Resources\ScheduleResource; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\CreateAction; | ||||
| use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListSchedules extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ScheduleResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             CreateAction::make() | ||||
|  | ||||
| @ -7,16 +7,23 @@ use App\Filament\Server\Resources\ScheduleResource; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Schedule; | ||||
| use App\Services\Schedules\ProcessScheduleService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| use Filament\Actions\EditAction; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Resources\Pages\ViewRecord; | ||||
| 
 | ||||
| class ViewSchedule extends ViewRecord | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = ScheduleResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return [ | ||||
|             Action::make('runNow') | ||||
|  | ||||
| @ -8,6 +8,11 @@ use App\Models\Server; | ||||
| use App\Models\User; | ||||
| use App\Services\Subusers\SubuserDeletionService; | ||||
| use App\Services\Subusers\SubuserUpdateService; | ||||
| use App\Traits\Filament\BlockAccessInConflict; | ||||
| use App\Traits\Filament\CanCustomizePages; | ||||
| use App\Traits\Filament\CanCustomizeRelations; | ||||
| use App\Traits\Filament\CanModifyTable; | ||||
| use App\Traits\Filament\HasLimitBadge; | ||||
| use Filament\Facades\Filament; | ||||
| use Filament\Forms\Components\Actions; | ||||
| use Filament\Forms\Components\Actions\Action; | ||||
| @ -19,6 +24,7 @@ use Filament\Forms\Components\Tabs\Tab; | ||||
| use Filament\Forms\Components\TextInput; | ||||
| use Filament\Forms\Set; | ||||
| use Filament\Notifications\Notification; | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| use Filament\Resources\Resource; | ||||
| use Filament\Tables\Actions\DeleteAction; | ||||
| use Filament\Tables\Actions\EditAction; | ||||
| @ -29,6 +35,12 @@ use Illuminate\Database\Eloquent\Model; | ||||
| 
 | ||||
| class UserResource extends Resource | ||||
| { | ||||
|     use BlockAccessInConflict; | ||||
|     use CanCustomizePages; | ||||
|     use CanCustomizeRelations; | ||||
|     use CanModifyTable; | ||||
|     use HasLimitBadge; | ||||
| 
 | ||||
|     protected static ?string $model = User::class; | ||||
| 
 | ||||
|     protected static ?int $navigationSort = 5; | ||||
| @ -37,25 +49,12 @@ class UserResource extends Resource | ||||
| 
 | ||||
|     protected static ?string $tenantOwnershipRelationshipName = 'subServers'; | ||||
| 
 | ||||
|     public static function getNavigationBadge(): string | ||||
|     protected static function getBadgeCount(): int | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         return (string) $server->subusers->count(); | ||||
|     } | ||||
| 
 | ||||
|     // TODO: find better way handle server conflict state
 | ||||
|     public static function canAccess(): bool | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         if ($server->isInConflictState()) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return parent::canAccess(); | ||||
|         return $server->subusers->count(); | ||||
|     } | ||||
| 
 | ||||
|     public static function canViewAny(): bool | ||||
| @ -78,7 +77,7 @@ class UserResource extends Resource | ||||
|         return auth()->user()->can(Permission::ACTION_USER_DELETE, Filament::getTenant()); | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| @ -225,7 +224,8 @@ class UserResource extends Resource | ||||
|             ]); | ||||
|     } | ||||
| 
 | ||||
|     public static function getPages(): array | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return [ | ||||
|             'index' => Pages\ListUsers::route('/'), | ||||
|  | ||||
| @ -7,6 +7,8 @@ use App\Filament\Server\Resources\UserResource; | ||||
| use App\Models\Permission; | ||||
| use App\Models\Server; | ||||
| use App\Services\Subusers\SubuserCreationService; | ||||
| use App\Traits\Filament\CanCustomizeHeaderActions; | ||||
| use App\Traits\Filament\CanCustomizeHeaderWidgets; | ||||
| use Exception; | ||||
| use Filament\Actions; | ||||
| use Filament\Facades\Filament; | ||||
| @ -25,9 +27,13 @@ use Filament\Resources\Pages\ListRecords; | ||||
| 
 | ||||
| class ListUsers extends ListRecords | ||||
| { | ||||
|     use CanCustomizeHeaderActions; | ||||
|     use CanCustomizeHeaderWidgets; | ||||
| 
 | ||||
|     protected static string $resource = UserResource::class; | ||||
| 
 | ||||
|     protected function getHeaderActions(): array | ||||
|     /** @return array<Actions\Action|Actions\ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
|  | ||||
							
								
								
									
										21
									
								
								app/Traits/Filament/BlockAccessInConflict.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								app/Traits/Filament/BlockAccessInConflict.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Traits\Filament; | ||||
| 
 | ||||
| use App\Models\Server; | ||||
| use Filament\Facades\Filament; | ||||
| 
 | ||||
| trait BlockAccessInConflict | ||||
| { | ||||
|     public static function canAccess(): bool | ||||
|     { | ||||
|         /** @var Server $server */ | ||||
|         $server = Filament::getTenant(); | ||||
| 
 | ||||
|         if ($server->isInConflictState()) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         return parent::canAccess(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										34
									
								
								app/Traits/Filament/CanCustomizeHeaderActions.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/Traits/Filament/CanCustomizeHeaderActions.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Traits\Filament; | ||||
| 
 | ||||
| use App\Enums\HeaderActionPosition; | ||||
| use Filament\Actions\Action; | ||||
| use Filament\Actions\ActionGroup; | ||||
| 
 | ||||
| trait CanCustomizeHeaderActions | ||||
| { | ||||
|     /** @var array<string, Action|ActionGroup> */ | ||||
|     protected static array $customHeaderActions = []; | ||||
| 
 | ||||
|     public static function registerCustomHeaderActions(HeaderActionPosition $position, Action|ActionGroup ...$customHeaderActions): void | ||||
|     { | ||||
|         static::$customHeaderActions[$position->value] = array_merge(static::$customHeaderActions[$position->value] ?? [], $customHeaderActions); | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getDefaultHeaderActions(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<Action|ActionGroup> */ | ||||
|     protected function getHeaderActions(): array | ||||
|     { | ||||
|         return array_merge( | ||||
|             static::$customHeaderActions[HeaderActionPosition::Before->value] ?? [], | ||||
|             $this->getDefaultHeaderActions(), | ||||
|             static::$customHeaderActions[HeaderActionPosition::After->value] ?? [] | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										34
									
								
								app/Traits/Filament/CanCustomizeHeaderWidgets.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/Traits/Filament/CanCustomizeHeaderWidgets.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Traits\Filament; | ||||
| 
 | ||||
| use App\Enums\HeaderWidgetPosition; | ||||
| use Filament\Widgets\Widget; | ||||
| use Filament\Widgets\WidgetConfiguration; | ||||
| 
 | ||||
| trait CanCustomizeHeaderWidgets | ||||
| { | ||||
|     /** @var array<class-string<Widget>|WidgetConfiguration> */ | ||||
|     protected static array $customHeaderWidgets = []; | ||||
| 
 | ||||
|     public static function registerCustomHeaderWidgets(HeaderWidgetPosition $position, string|WidgetConfiguration ...$customHeaderWidgets): void | ||||
|     { | ||||
|         static::$customHeaderWidgets[$position->value] = array_merge(static::$customHeaderWidgets[$position->value] ?? [], $customHeaderWidgets); | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<class-string<Widget>|WidgetConfiguration> */ | ||||
|     protected function getDefaultHeaderWidgets(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<class-string<Widget>|WidgetConfiguration> */ | ||||
|     protected function getHeaderWidgets(): array | ||||
|     { | ||||
|         return array_merge( | ||||
|             static::$customHeaderWidgets[HeaderWidgetPosition::Before->value] ?? [], | ||||
|             $this->getDefaultHeaderWidgets(), | ||||
|             static::$customHeaderWidgets[HeaderWidgetPosition::After->value] ?? [] | ||||
|         ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								app/Traits/Filament/CanCustomizePages.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/Traits/Filament/CanCustomizePages.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Traits\Filament; | ||||
| 
 | ||||
| use Filament\Resources\Pages\PageRegistration; | ||||
| 
 | ||||
| trait CanCustomizePages | ||||
| { | ||||
|     /** @var array<string, PageRegistration> */ | ||||
|     protected static array $customPages = []; | ||||
| 
 | ||||
|     /** @param array<string, PageRegistration> $customPages */ | ||||
|     public static function registerCustomPages(array $customPages): void | ||||
|     { | ||||
|         static::$customPages = array_merge(static::$customPages, $customPages); | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getDefaultPages(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     /** @return array<string, PageRegistration> */ | ||||
|     public static function getPages(): array | ||||
|     { | ||||
|         return array_unique(array_merge(static::getDefaultPages(), static::$customPages), SORT_REGULAR); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										28
									
								
								app/Traits/Filament/CanCustomizeRelations.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/Traits/Filament/CanCustomizeRelations.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Traits\Filament; | ||||
| 
 | ||||
| use Filament\Resources\RelationManagers\RelationManager; | ||||
| 
 | ||||
| trait CanCustomizeRelations | ||||
| { | ||||
|     /** @var array<class-string<RelationManager>> */ | ||||
|     protected static array $customRelations = []; | ||||
| 
 | ||||
|     public static function registerCustomRelations(string ...$customRelations): void | ||||
|     { | ||||
|         static::$customRelations = array_merge(static::$customRelations, $customRelations); | ||||
|     } | ||||
| 
 | ||||
|     /** @return class-string<RelationManager>[] */ | ||||
|     public static function getDefaultRelations(): array | ||||
|     { | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     /** @return class-string<RelationManager>[] */ | ||||
|     public static function getRelations(): array | ||||
|     { | ||||
|         return array_unique(array_merge(static::getDefaultRelations(), static::$customRelations)); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										33
									
								
								app/Traits/Filament/CanModifyForm.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/Traits/Filament/CanModifyForm.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Traits\Filament; | ||||
| 
 | ||||
| use Closure; | ||||
| use Filament\Forms\Form; | ||||
| 
 | ||||
| trait CanModifyForm | ||||
| { | ||||
|     /** @var array<Closure> */ | ||||
|     protected static array $customFormModifications = []; | ||||
| 
 | ||||
|     public static function modifyForm(Closure $closure): void | ||||
|     { | ||||
|         static::$customFormModifications[] = $closure; | ||||
|     } | ||||
| 
 | ||||
|     public static function defaultForm(Form $form): Form | ||||
|     { | ||||
|         return $form; | ||||
|     } | ||||
| 
 | ||||
|     public static function form(Form $form): Form | ||||
|     { | ||||
|         $form = static::defaultForm($form); | ||||
| 
 | ||||
|         foreach (static::$customFormModifications as $closure) { | ||||
|             $form = $closure($form); | ||||
|         } | ||||
| 
 | ||||
|         return $form; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										33
									
								
								app/Traits/Filament/CanModifyTable.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/Traits/Filament/CanModifyTable.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Traits\Filament; | ||||
| 
 | ||||
| use Closure; | ||||
| use Filament\Tables\Table; | ||||
| 
 | ||||
| trait CanModifyTable | ||||
| { | ||||
|     /** @var array<Closure> */ | ||||
|     protected static array $customTableModifications = []; | ||||
| 
 | ||||
|     public static function modifyTable(Closure $closure): void | ||||
|     { | ||||
|         static::$customTableModifications[] = $closure; | ||||
|     } | ||||
| 
 | ||||
|     public static function defaultTable(Table $table): Table | ||||
|     { | ||||
|         return $table; | ||||
|     } | ||||
| 
 | ||||
|     public static function table(Table $table): Table | ||||
|     { | ||||
|         $table = static::defaultTable($table); | ||||
| 
 | ||||
|         foreach (static::$customTableModifications as $closure) { | ||||
|             $table = $closure($table); | ||||
|         } | ||||
| 
 | ||||
|         return $table; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										38
									
								
								app/Traits/Filament/HasLimitBadge.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								app/Traits/Filament/HasLimitBadge.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace App\Traits\Filament; | ||||
| 
 | ||||
| trait HasLimitBadge | ||||
| { | ||||
|     public const WARNING_THRESHOLD = 0.7; | ||||
| 
 | ||||
|     protected static function getBadgeCount(): int | ||||
|     { | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     protected static function getBadgeLimit(): int | ||||
|     { | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     public static function getNavigationBadge(): string | ||||
|     { | ||||
|         $limit = static::getBadgeLimit(); | ||||
|         $count = static::getBadgeCount(); | ||||
| 
 | ||||
|         return $count . ($limit === 0 ? '' : ' / ' . $limit); | ||||
|     } | ||||
| 
 | ||||
|     public static function getNavigationBadgeColor(): ?string | ||||
|     { | ||||
|         $limit = static::getBadgeLimit(); | ||||
|         $count = static::getBadgeCount(); | ||||
| 
 | ||||
|         if ($limit === 0) { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         return $count >= $limit ? 'danger' : ($count >= $limit * self::WARNING_THRESHOLD ? 'warning' : 'success'); | ||||
|     } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Boy132
						Boy132