diff --git a/app/Enums/HeaderActionPosition.php b/app/Enums/HeaderActionPosition.php new file mode 100644 index 000000000..8fd2db593 --- /dev/null +++ b/app/Enums/HeaderActionPosition.php @@ -0,0 +1,9 @@ + */ + protected function getDefaultHeaderActions(): array { return [ Action::make('save') diff --git a/app/Filament/Admin/Resources/ApiKeyResource.php b/app/Filament/Admin/Resources/ApiKeyResource.php index 2e6646e48..6d62d1022 100644 --- a/app/Filament/Admin/Resources/ApiKeyResource.php +++ b/app/Filament/Admin/Resources/ApiKeyResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListApiKeys::route('/'), diff --git a/app/Filament/Admin/Resources/ApiKeyResource/Pages/CreateApiKey.php b/app/Filament/Admin/Resources/ApiKeyResource/Pages/CreateApiKey.php index 01a9fd4eb..351c577a2 100644 --- a/app/Filament/Admin/Resources/ApiKeyResource/Pages/CreateApiKey.php +++ b/app/Filament/Admin/Resources/ApiKeyResource/Pages/CreateApiKey.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ $this->getCreateFormAction()->formId('form'), diff --git a/app/Filament/Admin/Resources/ApiKeyResource/Pages/ListApiKeys.php b/app/Filament/Admin/Resources/ApiKeyResource/Pages/ListApiKeys.php index a6814419a..e8a996c5e 100644 --- a/app/Filament/Admin/Resources/ApiKeyResource/Pages/ListApiKeys.php +++ b/app/Filament/Admin/Resources/ApiKeyResource/Pages/ListApiKeys.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ CreateAction::make() diff --git a/app/Filament/Admin/Resources/DatabaseHostResource.php b/app/Filament/Admin/Resources/DatabaseHostResource.php index 084e1f72a..fa40ed959 100644 --- a/app/Filament/Admin/Resources/DatabaseHostResource.php +++ b/app/Filament/Admin/Resources/DatabaseHostResource.php @@ -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[] */ + public static function getDefaultRelations(): array + { + return [ + RelationManagers\DatabasesRelationManager::class, + ]; + } + + /** @return array */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListDatabaseHosts::route('/'), diff --git a/app/Filament/Admin/Resources/DatabaseHostResource/Pages/CreateDatabaseHost.php b/app/Filament/Admin/Resources/DatabaseHostResource/Pages/CreateDatabaseHost.php index ff876440f..e009b402f 100644 --- a/app/Filament/Admin/Resources/DatabaseHostResource/Pages/CreateDatabaseHost.php +++ b/app/Filament/Admin/Resources/DatabaseHostResource/Pages/CreateDatabaseHost.php @@ -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; diff --git a/app/Filament/Admin/Resources/DatabaseHostResource/Pages/EditDatabaseHost.php b/app/Filament/Admin/Resources/DatabaseHostResource/Pages/EditDatabaseHost.php index edc0b9b2b..2c5041ef5 100644 --- a/app/Filament/Admin/Resources/DatabaseHostResource/Pages/EditDatabaseHost.php +++ b/app/Filament/Admin/Resources/DatabaseHostResource/Pages/EditDatabaseHost.php @@ -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 */ + 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) { diff --git a/app/Filament/Admin/Resources/DatabaseHostResource/Pages/ListDatabaseHosts.php b/app/Filament/Admin/Resources/DatabaseHostResource/Pages/ListDatabaseHosts.php index 1c0f312d6..ccb1d3de6 100644 --- a/app/Filament/Admin/Resources/DatabaseHostResource/Pages/ListDatabaseHosts.php +++ b/app/Filament/Admin/Resources/DatabaseHostResource/Pages/ListDatabaseHosts.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ CreateAction::make() diff --git a/app/Filament/Admin/Resources/DatabaseHostResource/Pages/ViewDatabaseHost.php b/app/Filament/Admin/Resources/DatabaseHostResource/Pages/ViewDatabaseHost.php index a32a89438..dcd2a74cd 100644 --- a/app/Filament/Admin/Resources/DatabaseHostResource/Pages/ViewDatabaseHost.php +++ b/app/Filament/Admin/Resources/DatabaseHostResource/Pages/ViewDatabaseHost.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ EditAction::make(), ]; } - - public function getRelationManagers(): array - { - if (DatabasesRelationManager::canViewForRecord($this->getRecord(), static::class)) { - return [ - DatabasesRelationManager::class, - ]; - } - - return []; - } } diff --git a/app/Filament/Admin/Resources/EggResource.php b/app/Filament/Admin/Resources/EggResource.php index 2fe7d9d4e..b7743ba2e 100644 --- a/app/Filament/Admin/Resources/EggResource.php +++ b/app/Filament/Admin/Resources/EggResource.php @@ -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[] */ + public static function getDefaultRelations(): array + { + return [ + RelationManagers\ServersRelationManager::class, + ]; + } + + /** @return array */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListEggs::route('/'), diff --git a/app/Filament/Admin/Resources/EggResource/Pages/CreateEgg.php b/app/Filament/Admin/Resources/EggResource/Pages/CreateEgg.php index e10d5521b..2822c4ae4 100644 --- a/app/Filament/Admin/Resources/EggResource/Pages/CreateEgg.php +++ b/app/Filament/Admin/Resources/EggResource/Pages/CreateEgg.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ $this->getCreateFormAction()->formId('form'), diff --git a/app/Filament/Admin/Resources/EggResource/Pages/EditEgg.php b/app/Filament/Admin/Resources/EggResource/Pages/EditEgg.php index 39bd6b9e7..d5296c001 100644 --- a/app/Filament/Admin/Resources/EggResource/Pages/EditEgg.php +++ b/app/Filament/Admin/Resources/EggResource/Pages/EditEgg.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ DeleteAction::make() @@ -273,11 +280,4 @@ class EditEgg extends EditRecord { return []; } - - public function getRelationManagers(): array - { - return [ - ServersRelationManager::class, - ]; - } } diff --git a/app/Filament/Admin/Resources/EggResource/Pages/ListEggs.php b/app/Filament/Admin/Resources/EggResource/Pages/ListEggs.php index 308584d12..10b76f83d 100644 --- a/app/Filament/Admin/Resources/EggResource/Pages/ListEggs.php +++ b/app/Filament/Admin/Resources/EggResource/Pages/ListEggs.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ ImportEggHeaderAction::make() diff --git a/app/Filament/Admin/Resources/MountResource.php b/app/Filament/Admin/Resources/MountResource.php index 24b1a4c5c..67319e93c 100644 --- a/app/Filament/Admin/Resources/MountResource.php +++ b/app/Filament/Admin/Resources/MountResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListMounts::route('/'), diff --git a/app/Filament/Admin/Resources/MountResource/Pages/CreateMount.php b/app/Filament/Admin/Resources/MountResource/Pages/CreateMount.php index 67fb04b58..9ce6692f6 100644 --- a/app/Filament/Admin/Resources/MountResource/Pages/CreateMount.php +++ b/app/Filament/Admin/Resources/MountResource/Pages/CreateMount.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ $this->getCreateFormAction()->formId('form'), diff --git a/app/Filament/Admin/Resources/MountResource/Pages/EditMount.php b/app/Filament/Admin/Resources/MountResource/Pages/EditMount.php index d669bea59..428863085 100644 --- a/app/Filament/Admin/Resources/MountResource/Pages/EditMount.php +++ b/app/Filament/Admin/Resources/MountResource/Pages/EditMount.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ DeleteAction::make(), diff --git a/app/Filament/Admin/Resources/MountResource/Pages/ListMounts.php b/app/Filament/Admin/Resources/MountResource/Pages/ListMounts.php index 41b9e8b65..ee7dfe7fa 100644 --- a/app/Filament/Admin/Resources/MountResource/Pages/ListMounts.php +++ b/app/Filament/Admin/Resources/MountResource/Pages/ListMounts.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ CreateAction::make() diff --git a/app/Filament/Admin/Resources/MountResource/Pages/ViewMount.php b/app/Filament/Admin/Resources/MountResource/Pages/ViewMount.php index e7fe423c5..95b818f7a 100644 --- a/app/Filament/Admin/Resources/MountResource/Pages/ViewMount.php +++ b/app/Filament/Admin/Resources/MountResource/Pages/ViewMount.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ EditAction::make(), diff --git a/app/Filament/Admin/Resources/NodeResource.php b/app/Filament/Admin/Resources/NodeResource.php index 3c1169cfe..1b47ccdfe 100644 --- a/app/Filament/Admin/Resources/NodeResource.php +++ b/app/Filament/Admin/Resources/NodeResource.php @@ -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[] */ + public static function getDefaultRelations(): array { return [ RelationManagers\AllocationsRelationManager::class, @@ -49,7 +57,8 @@ class NodeResource extends Resource ]; } - public static function getPages(): array + /** @return array */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListNodes::route('/'), diff --git a/app/Filament/Admin/Resources/NodeResource/Pages/CreateNode.php b/app/Filament/Admin/Resources/NodeResource/Pages/CreateNode.php index 7d79e790d..729a09bdb 100644 --- a/app/Filament/Admin/Resources/NodeResource/Pages/CreateNode.php +++ b/app/Filament/Admin/Resources/NodeResource/Pages/CreateNode.php @@ -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; diff --git a/app/Filament/Admin/Resources/NodeResource/Pages/EditNode.php b/app/Filament/Admin/Resources/NodeResource/Pages/EditNode.php index 66b375016..bf511df87 100644 --- a/app/Filament/Admin/Resources/NodeResource/Pages/EditNode.php +++ b/app/Filament/Admin/Resources/NodeResource/Pages/EditNode.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ Actions\DeleteAction::make() diff --git a/app/Filament/Admin/Resources/NodeResource/Pages/ListNodes.php b/app/Filament/Admin/Resources/NodeResource/Pages/ListNodes.php index 7b0b57004..12ee2c4d1 100644 --- a/app/Filament/Admin/Resources/NodeResource/Pages/ListNodes.php +++ b/app/Filament/Admin/Resources/NodeResource/Pages/ListNodes.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ Actions\CreateAction::make() diff --git a/app/Filament/Admin/Resources/RoleResource.php b/app/Filament/Admin/Resources/RoleResource.php index ee4de9953..6f213f86b 100644 --- a/app/Filament/Admin/Resources/RoleResource.php +++ b/app/Filament/Admin/Resources/RoleResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListRoles::route('/'), diff --git a/app/Filament/Admin/Resources/RoleResource/Pages/CreateRole.php b/app/Filament/Admin/Resources/RoleResource/Pages/CreateRole.php index 7f908cfbc..63b1581b5 100644 --- a/app/Filament/Admin/Resources/RoleResource/Pages/CreateRole.php +++ b/app/Filament/Admin/Resources/RoleResource/Pages/CreateRole.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ $this->getCreateFormAction()->formId('form'), diff --git a/app/Filament/Admin/Resources/RoleResource/Pages/EditRole.php b/app/Filament/Admin/Resources/RoleResource/Pages/EditRole.php index 1bee1277a..fee7c7df2 100644 --- a/app/Filament/Admin/Resources/RoleResource/Pages/EditRole.php +++ b/app/Filament/Admin/Resources/RoleResource/Pages/EditRole.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ DeleteAction::make() diff --git a/app/Filament/Admin/Resources/RoleResource/Pages/ListRoles.php b/app/Filament/Admin/Resources/RoleResource/Pages/ListRoles.php index 5120509fa..7af5402a6 100644 --- a/app/Filament/Admin/Resources/RoleResource/Pages/ListRoles.php +++ b/app/Filament/Admin/Resources/RoleResource/Pages/ListRoles.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ CreateAction::make(), diff --git a/app/Filament/Admin/Resources/RoleResource/Pages/ViewRole.php b/app/Filament/Admin/Resources/RoleResource/Pages/ViewRole.php index d8a41e058..ab7e7e218 100644 --- a/app/Filament/Admin/Resources/RoleResource/Pages/ViewRole.php +++ b/app/Filament/Admin/Resources/RoleResource/Pages/ViewRole.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ EditAction::make(), diff --git a/app/Filament/Admin/Resources/ServerResource.php b/app/Filament/Admin/Resources/ServerResource.php index f8d0e4d6a..3be48e7b7 100644 --- a/app/Filament/Admin/Resources/ServerResource.php +++ b/app/Filament/Admin/Resources/ServerResource.php @@ -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[] */ + public static function getDefaultRelations(): array + { + return [ + RelationManagers\AllocationsRelationManager::class, + ]; + } + + /** @return array */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListServers::route('/'), diff --git a/app/Filament/Admin/Resources/ServerResource/Pages/CreateServer.php b/app/Filament/Admin/Resources/ServerResource/Pages/CreateServer.php index d49a0140e..c0a5b2efe 100644 --- a/app/Filament/Admin/Resources/ServerResource/Pages/CreateServer.php +++ b/app/Filament/Admin/Resources/ServerResource/Pages/CreateServer.php @@ -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; diff --git a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php index ecd788df5..18ba0d732 100644 --- a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php @@ -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 */ + 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); diff --git a/app/Filament/Admin/Resources/ServerResource/Pages/ListServers.php b/app/Filament/Admin/Resources/ServerResource/Pages/ListServers.php index 1ca2f66d8..14de8fc4b 100644 --- a/app/Filament/Admin/Resources/ServerResource/Pages/ListServers.php +++ b/app/Filament/Admin/Resources/ServerResource/Pages/ListServers.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ Actions\CreateAction::make() diff --git a/app/Filament/Admin/Resources/UserResource.php b/app/Filament/Admin/Resources/UserResource.php index 04bb45a43..f811749f8 100644 --- a/app/Filament/Admin/Resources/UserResource.php +++ b/app/Filament/Admin/Resources/UserResource.php @@ -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[] */ + public static function getDefaultRelations(): array { return [ RelationManagers\ServersRelationManager::class, ]; } - public static function getPages(): array + /** @return array */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListUsers::route('/'), diff --git a/app/Filament/Admin/Resources/UserResource/Pages/CreateUser.php b/app/Filament/Admin/Resources/UserResource/Pages/CreateUser.php index 8666d31a2..6bac7c970 100644 --- a/app/Filament/Admin/Resources/UserResource/Pages/CreateUser.php +++ b/app/Filament/Admin/Resources/UserResource/Pages/CreateUser.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ $this->getCreateFormAction()->formId('form'), diff --git a/app/Filament/Admin/Resources/UserResource/Pages/EditUser.php b/app/Filament/Admin/Resources/UserResource/Pages/EditUser.php index ea594ea55..f947be702 100644 --- a/app/Filament/Admin/Resources/UserResource/Pages/EditUser.php +++ b/app/Filament/Admin/Resources/UserResource/Pages/EditUser.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ DeleteAction::make() diff --git a/app/Filament/Admin/Resources/UserResource/Pages/ListUsers.php b/app/Filament/Admin/Resources/UserResource/Pages/ListUsers.php index 2ef32f2ab..fada451e0 100644 --- a/app/Filament/Admin/Resources/UserResource/Pages/ListUsers.php +++ b/app/Filament/Admin/Resources/UserResource/Pages/ListUsers.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ CreateAction::make(), diff --git a/app/Filament/Admin/Resources/UserResource/Pages/ViewUser.php b/app/Filament/Admin/Resources/UserResource/Pages/ViewUser.php index 0c5933cb9..73b8336b3 100644 --- a/app/Filament/Admin/Resources/UserResource/Pages/ViewUser.php +++ b/app/Filament/Admin/Resources/UserResource/Pages/ViewUser.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ EditAction::make(), diff --git a/app/Filament/Admin/Resources/WebhookResource.php b/app/Filament/Admin/Resources/WebhookResource.php index bf2b4df08..6ffe3d7aa 100644 --- a/app/Filament/Admin/Resources/WebhookResource.php +++ b/app/Filament/Admin/Resources/WebhookResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListWebhookConfigurations::route('/'), diff --git a/app/Filament/Admin/Resources/WebhookResource/Pages/CreateWebhookConfiguration.php b/app/Filament/Admin/Resources/WebhookResource/Pages/CreateWebhookConfiguration.php index f38ebb7de..7eccf101b 100644 --- a/app/Filament/Admin/Resources/WebhookResource/Pages/CreateWebhookConfiguration.php +++ b/app/Filament/Admin/Resources/WebhookResource/Pages/CreateWebhookConfiguration.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ $this->getCreateFormAction()->formId('form'), diff --git a/app/Filament/Admin/Resources/WebhookResource/Pages/EditWebhookConfiguration.php b/app/Filament/Admin/Resources/WebhookResource/Pages/EditWebhookConfiguration.php index bc9f69528..9e0313c5a 100644 --- a/app/Filament/Admin/Resources/WebhookResource/Pages/EditWebhookConfiguration.php +++ b/app/Filament/Admin/Resources/WebhookResource/Pages/EditWebhookConfiguration.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ DeleteAction::make(), diff --git a/app/Filament/Admin/Resources/WebhookResource/Pages/ListWebhookConfigurations.php b/app/Filament/Admin/Resources/WebhookResource/Pages/ListWebhookConfigurations.php index 722a0f167..ca418c886 100644 --- a/app/Filament/Admin/Resources/WebhookResource/Pages/ListWebhookConfigurations.php +++ b/app/Filament/Admin/Resources/WebhookResource/Pages/ListWebhookConfigurations.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ CreateAction::make() diff --git a/app/Filament/Admin/Resources/WebhookResource/Pages/ViewWebhookConfiguration.php b/app/Filament/Admin/Resources/WebhookResource/Pages/ViewWebhookConfiguration.php index cd7d32712..be738cfd8 100644 --- a/app/Filament/Admin/Resources/WebhookResource/Pages/ViewWebhookConfiguration.php +++ b/app/Filament/Admin/Resources/WebhookResource/Pages/ViewWebhookConfiguration.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ EditAction::make(), diff --git a/app/Filament/Admin/Widgets/CanaryWidget.php b/app/Filament/Admin/Widgets/CanaryWidget.php index 80e4c07f8..de3b8cc2c 100644 --- a/app/Filament/Admin/Widgets/CanaryWidget.php +++ b/app/Filament/Admin/Widgets/CanaryWidget.php @@ -2,15 +2,13 @@ namespace App\Filament\Admin\Widgets; -use Filament\Actions\CreateAction; -use Filament\Widgets\Widget; +use Filament\Forms\Components\Actions\Action; +use Filament\Forms\Components\Placeholder; +use Filament\Forms\Components\Section; +use Filament\Forms\Form; -class CanaryWidget extends Widget +class CanaryWidget extends FormWidget { - protected static string $view = 'filament.admin.widgets.canary-widget'; - - protected static bool $isLazy = false; - protected static ?int $sort = 1; public static function canView(): bool @@ -18,15 +16,28 @@ class CanaryWidget extends Widget return config('app.version') === 'canary'; } - public function getViewData(): array + public function form(Form $form): Form { - return [ - 'actions' => [ - CreateAction::make() - ->label(trans('admin/dashboard.sections.intro-developers.button_issues')) - ->icon('tabler-brand-github') - ->url('https://github.com/pelican-dev/panel/issues', true), - ], - ]; + return $form + ->schema([ + Section::make(trans('admin/dashboard.sections.intro-developers.heading')) + ->icon('tabler-code') + ->iconColor('primary') + ->collapsible() + ->collapsed() + ->persistCollapsed() + ->schema([ + Placeholder::make('') + ->content(trans('admin/dashboard.sections.intro-developers.content')), + Placeholder::make('') + ->content(trans('admin/dashboard.sections.intro-developers.extra_note')), + ]) + ->headerActions([ + Action::make('issues') + ->label(trans('admin/dashboard.sections.intro-developers.button_issues')) + ->icon('tabler-brand-github') + ->url('https://github.com/pelican-dev/panel/issues', true), + ]), + ]); } } diff --git a/app/Filament/Admin/Widgets/FormWidget.php b/app/Filament/Admin/Widgets/FormWidget.php new file mode 100644 index 000000000..844d37918 --- /dev/null +++ b/app/Filament/Admin/Widgets/FormWidget.php @@ -0,0 +1,16 @@ + [ - CreateAction::make() - ->label(trans('admin/dashboard.sections.intro-help.button_docs')) - ->icon('tabler-speedboat') - ->url('https://pelican.dev/docs', true), - ], - ]; + return $form + ->schema([ + Section::make(trans('admin/dashboard.sections.intro-help.heading')) + ->icon('tabler-question-mark') + ->iconColor('info') + ->collapsible() + ->persistCollapsed() + ->schema([ + Placeholder::make('') + ->content(trans('admin/dashboard.sections.intro-help.content')), + ]) + ->headerActions([ + Action::make('docs') + ->label(trans('admin/dashboard.sections.intro-help.button_docs')) + ->icon('tabler-speedboat') + ->url('https://pelican.dev/docs', true), + ]), + ]); } } diff --git a/app/Filament/Admin/Widgets/NoNodesWidget.php b/app/Filament/Admin/Widgets/NoNodesWidget.php index bf4e75dbc..40751870f 100644 --- a/app/Filament/Admin/Widgets/NoNodesWidget.php +++ b/app/Filament/Admin/Widgets/NoNodesWidget.php @@ -4,15 +4,13 @@ namespace App\Filament\Admin\Widgets; use App\Filament\Admin\Resources\NodeResource\Pages\CreateNode; use App\Models\Node; -use Filament\Actions\CreateAction; -use Filament\Widgets\Widget; +use Filament\Forms\Components\Actions\Action; +use Filament\Forms\Components\Placeholder; +use Filament\Forms\Components\Section; +use Filament\Forms\Form; -class NoNodesWidget extends Widget +class NoNodesWidget extends FormWidget { - protected static string $view = 'filament.admin.widgets.no-nodes-widget'; - - protected static bool $isLazy = false; - protected static ?int $sort = 2; public static function canView(): bool @@ -20,15 +18,25 @@ class NoNodesWidget extends Widget return Node::count() <= 0; } - public function getViewData(): array + public function form(Form $form): Form { - return [ - 'actions' => [ - CreateAction::make() - ->label(trans('admin/dashboard.sections.intro-first-node.button_label')) + return $form + ->schema([ + Section::make(trans('admin/dashboard.sections.intro-first-node.heading')) ->icon('tabler-server-2') - ->url(CreateNode::getUrl()), - ], - ]; + ->iconColor('primary') + ->collapsible() + ->persistCollapsed() + ->schema([ + Placeholder::make('') + ->content(trans('admin/dashboard.sections.intro-first-node.content')), + ]) + ->headerActions([ + Action::make('create-node') + ->label(trans('admin/dashboard.sections.intro-first-node.button_label')) + ->icon('tabler-server-2') + ->url(CreateNode::getUrl()), + ]), + ]); } } diff --git a/app/Filament/Admin/Widgets/SupportWidget.php b/app/Filament/Admin/Widgets/SupportWidget.php index c9eff0b7c..ce42762f7 100644 --- a/app/Filament/Admin/Widgets/SupportWidget.php +++ b/app/Filament/Admin/Widgets/SupportWidget.php @@ -2,27 +2,37 @@ namespace App\Filament\Admin\Widgets; -use Filament\Actions\CreateAction; -use Filament\Widgets\Widget; +use Filament\Forms\Components\Actions\Action; +use Filament\Forms\Components\Placeholder; +use Filament\Forms\Components\Section; +use Filament\Forms\Form; -class SupportWidget extends Widget +class SupportWidget extends FormWidget { - protected static string $view = 'filament.admin.widgets.support-widget'; - - protected static bool $isLazy = false; - protected static ?int $sort = 3; - public function getViewData(): array + public function form(Form $form): Form { - return [ - 'actions' => [ - CreateAction::make() - ->label(trans('admin/dashboard.sections.intro-support.button_donate')) - ->icon('tabler-cash') - ->url('https://pelican.dev/donate', true) - ->color('success'), - ], - ]; + return $form + ->schema([ + Section::make(trans('admin/dashboard.sections.intro-support.heading')) + ->icon('tabler-heart-filled') + ->iconColor('danger') + ->collapsible() + ->persistCollapsed() + ->schema([ + Placeholder::make('') + ->content(trans('admin/dashboard.sections.intro-support.content')), + Placeholder::make('') + ->content(trans('admin/dashboard.sections.intro-support.extra_note')), + ]) + ->headerActions([ + Action::make('donate') + ->label(trans('admin/dashboard.sections.intro-support.button_donate')) + ->icon('tabler-cash') + ->url('https://pelican.dev/donate', true) + ->color('success'), + ]), + ]); } } diff --git a/app/Filament/Admin/Widgets/UpdateWidget.php b/app/Filament/Admin/Widgets/UpdateWidget.php index 95ad87e61..95e7db4a9 100644 --- a/app/Filament/Admin/Widgets/UpdateWidget.php +++ b/app/Filament/Admin/Widgets/UpdateWidget.php @@ -3,15 +3,13 @@ namespace App\Filament\Admin\Widgets; use App\Services\Helpers\SoftwareVersionService; -use Filament\Actions\CreateAction; -use Filament\Widgets\Widget; +use Filament\Forms\Components\Actions\Action; +use Filament\Forms\Components\Placeholder; +use Filament\Forms\Components\Section; +use Filament\Forms\Form; -class UpdateWidget extends Widget +class UpdateWidget extends FormWidget { - protected static string $view = 'filament.admin.widgets.update-widget'; - - protected static bool $isLazy = false; - protected static ?int $sort = 0; private SoftwareVersionService $softwareVersionService; @@ -21,19 +19,34 @@ class UpdateWidget extends Widget $this->softwareVersionService = $softwareVersionService; } - public function getViewData(): array + public function form(Form $form): Form { - return [ - 'version' => $this->softwareVersionService->currentPanelVersion(), - 'latestVersion' => $this->softwareVersionService->latestPanelVersion(), - 'isLatest' => $this->softwareVersionService->isLatestPanel(), - 'actions' => [ - CreateAction::make() - ->label(trans('admin/dashboard.sections.intro-update-available.heading')) - ->icon('tabler-clipboard-text') - ->url('https://pelican.dev/docs/panel/update', true) - ->color('warning'), - ], - ]; + $isLatest = $this->softwareVersionService->isLatestPanel(); + + return $form + ->schema([ + $isLatest + ? Section::make(trans('admin/dashboard.sections.intro-no-update.heading')) + ->icon('tabler-checkbox') + ->iconColor('success') + ->schema([ + Placeholder::make('') + ->content(trans('admin/dashboard.sections.intro-no-update.content', ['version' => $this->softwareVersionService->currentPanelVersion()])), + ]) + : Section::make(trans('admin/dashboard.sections.intro-update-available.heading')) + ->icon('tabler-info-circle') + ->iconColor('warning') + ->schema([ + Placeholder::make('') + ->content(trans('admin/dashboard.sections.intro-update-available.content', ['latestVersion' => $this->softwareVersionService->latestPanelVersion()])), + ]) + ->headerActions([ + Action::make('update') + ->label(trans('admin/dashboard.sections.intro-update-available.heading')) + ->icon('tabler-clipboard-text') + ->url('https://pelican.dev/docs/panel/update', true) + ->color('warning'), + ]), + ]); } } diff --git a/app/Filament/App/Resources/ServerResource/Pages/ListServers.php b/app/Filament/App/Resources/ServerResource/Pages/ListServers.php index 87f083943..dd78433a3 100644 --- a/app/Filament/App/Resources/ServerResource/Pages/ListServers.php +++ b/app/Filament/App/Resources/ServerResource/Pages/ListServers.php @@ -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; diff --git a/app/Filament/Pages/Auth/EditProfile.php b/app/Filament/Pages/Auth/EditProfile.php index 945fd0b9f..b546c0e3e 100644 --- a/app/Filament/Pages/Auth/EditProfile.php +++ b/app/Filament/Pages/Auth/EditProfile.php @@ -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; protected OAuthService $oauthService; @@ -508,7 +515,8 @@ class EditProfile extends BaseEditProfile return []; } - protected function getHeaderActions(): array + /** @return array */ + protected function getDefaultHeaderActions(): array { return [ $this->getSaveFormAction()->formId('form'), diff --git a/app/Filament/Server/Pages/Console.php b/app/Filament/Server/Pages/Console.php index e902a564e..d9509b6cc 100644 --- a/app/Filament/Server/Pages/Console.php +++ b/app/Filament/Server/Pages/Console.php @@ -14,9 +14,11 @@ use App\Filament\Server\Widgets\ServerOverview; use App\Livewire\AlertBanner; use App\Models\Permission; use App\Models\Server; -use Filament\Actions\Action; +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'; @@ -147,7 +150,8 @@ class Console extends Page $this->cacheHeaderActions(); } - protected function getHeaderActions(): array + /** @return array */ + protected function getDefaultHeaderActions(): array { /** @var Server $server */ $server = Filament::getTenant(); diff --git a/app/Filament/Server/Pages/ServerFormPage.php b/app/Filament/Server/Pages/ServerFormPage.php index 5ae5acd12..039752b8d 100644 --- a/app/Filament/Server/Pages/ServerFormPage.php +++ b/app/Filament/Server/Pages/ServerFormPage.php @@ -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(); - } } diff --git a/app/Filament/Server/Resources/ActivityResource.php b/app/Filament/Server/Resources/ActivityResource.php index 51edbad3b..17d353867 100644 --- a/app/Filament/Server/Resources/ActivityResource.php +++ b/app/Filament/Server/Resources/ActivityResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListActivities::route('/'), diff --git a/app/Filament/Server/Resources/ActivityResource/Pages/ListActivities.php b/app/Filament/Server/Resources/ActivityResource/Pages/ListActivities.php index fca7f6207..e60a2127f 100644 --- a/app/Filament/Server/Resources/ActivityResource/Pages/ListActivities.php +++ b/app/Filament/Server/Resources/ActivityResource/Pages/ListActivities.php @@ -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 diff --git a/app/Filament/Server/Resources/AllocationResource.php b/app/Filament/Server/Resources/AllocationResource.php index 1e4a03275..26ae815ee 100644 --- a/app/Filament/Server/Resources/AllocationResource.php +++ b/app/Filament/Server/Resources/AllocationResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListAllocations::route('/'), diff --git a/app/Filament/Server/Resources/AllocationResource/Pages/ListAllocations.php b/app/Filament/Server/Resources/AllocationResource/Pages/ListAllocations.php index ad32aed40..83e5ab4c7 100644 --- a/app/Filament/Server/Resources/AllocationResource/Pages/ListAllocations.php +++ b/app/Filament/Server/Resources/AllocationResource/Pages/ListAllocations.php @@ -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 */ + protected function getDefaultHeaderActions(): array { /** @var Server $server */ $server = Filament::getTenant(); diff --git a/app/Filament/Server/Resources/BackupResource.php b/app/Filament/Server/Resources/BackupResource.php index dc0a11600..211cb0154 100644 --- a/app/Filament/Server/Resources/BackupResource.php +++ b/app/Filament/Server/Resources/BackupResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListBackups::route('/'), diff --git a/app/Filament/Server/Resources/BackupResource/Pages/ListBackups.php b/app/Filament/Server/Resources/BackupResource/Pages/ListBackups.php index abc5c70cc..59ff3b594 100644 --- a/app/Filament/Server/Resources/BackupResource/Pages/ListBackups.php +++ b/app/Filament/Server/Resources/BackupResource/Pages/ListBackups.php @@ -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 */ + protected function getDefaultHeaderActions(): array { /** @var Server $server */ $server = Filament::getTenant(); diff --git a/app/Filament/Server/Resources/DatabaseResource.php b/app/Filament/Server/Resources/DatabaseResource.php index 4a89a2598..9effd8c2c 100644 --- a/app/Filament/Server/Resources/DatabaseResource.php +++ b/app/Filament/Server/Resources/DatabaseResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListDatabases::route('/'), diff --git a/app/Filament/Server/Resources/DatabaseResource/Pages/ListDatabases.php b/app/Filament/Server/Resources/DatabaseResource/Pages/ListDatabases.php index fbb1bd42b..8e66174aa 100644 --- a/app/Filament/Server/Resources/DatabaseResource/Pages/ListDatabases.php +++ b/app/Filament/Server/Resources/DatabaseResource/Pages/ListDatabases.php @@ -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 */ + protected function getDefaultHeaderActions(): array { /** @var Server $server */ $server = Filament::getTenant(); diff --git a/app/Filament/Server/Resources/FileResource.php b/app/Filament/Server/Resources/FileResource.php index d94da981d..13f9d5d40 100644 --- a/app/Filament/Server/Resources/FileResource.php +++ b/app/Filament/Server/Resources/FileResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'edit' => Pages\EditFiles::route('/edit/{path}'), diff --git a/app/Filament/Server/Resources/FileResource/Pages/EditFiles.php b/app/Filament/Server/Resources/FileResource/Pages/EditFiles.php index f1c3abee7..faec69c34 100644 --- a/app/Filament/Server/Resources/FileResource/Pages/EditFiles.php +++ b/app/Filament/Server/Resources/FileResource/Pages/EditFiles.php @@ -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; diff --git a/app/Filament/Server/Resources/FileResource/Pages/ListFiles.php b/app/Filament/Server/Resources/FileResource/Pages/ListFiles.php index 54a4506ef..d490d1ee8 100644 --- a/app/Filament/Server/Resources/FileResource/Pages/ListFiles.php +++ b/app/Filament/Server/Resources/FileResource/Pages/ListFiles.php @@ -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 */ + protected function getDefaultHeaderActions(): array { /** @var Server $server */ $server = Filament::getTenant(); diff --git a/app/Filament/Server/Resources/FileResource/Pages/SearchFiles.php b/app/Filament/Server/Resources/FileResource/Pages/SearchFiles.php index 9df82baf5..6b0d9aadf 100644 --- a/app/Filament/Server/Resources/FileResource/Pages/SearchFiles.php +++ b/app/Filament/Server/Resources/FileResource/Pages/SearchFiles.php @@ -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'; diff --git a/app/Filament/Server/Resources/ScheduleResource.php b/app/Filament/Server/Resources/ScheduleResource.php index 53f7160ac..b22ec3c8d 100644 --- a/app/Filament/Server/Resources/ScheduleResource.php +++ b/app/Filament/Server/Resources/ScheduleResource.php @@ -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[] */ + public static function getDefaultRelations(): array { return [ TasksRelationManager::class, ]; } - public static function getPages(): array + /** @return array */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListSchedules::route('/'), diff --git a/app/Filament/Server/Resources/ScheduleResource/Pages/CreateSchedule.php b/app/Filament/Server/Resources/ScheduleResource/Pages/CreateSchedule.php index b85fe213f..ba3b60a9d 100644 --- a/app/Filament/Server/Resources/ScheduleResource/Pages/CreateSchedule.php +++ b/app/Filament/Server/Resources/ScheduleResource/Pages/CreateSchedule.php @@ -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; diff --git a/app/Filament/Server/Resources/ScheduleResource/Pages/EditSchedule.php b/app/Filament/Server/Resources/ScheduleResource/Pages/EditSchedule.php index 02957adcd..d18750ff8 100644 --- a/app/Filament/Server/Resources/ScheduleResource/Pages/EditSchedule.php +++ b/app/Filament/Server/Resources/ScheduleResource/Pages/EditSchedule.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ Actions\DeleteAction::make() diff --git a/app/Filament/Server/Resources/ScheduleResource/Pages/ListSchedules.php b/app/Filament/Server/Resources/ScheduleResource/Pages/ListSchedules.php index 398f5cd93..1d2f75f49 100644 --- a/app/Filament/Server/Resources/ScheduleResource/Pages/ListSchedules.php +++ b/app/Filament/Server/Resources/ScheduleResource/Pages/ListSchedules.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ CreateAction::make() diff --git a/app/Filament/Server/Resources/ScheduleResource/Pages/ViewSchedule.php b/app/Filament/Server/Resources/ScheduleResource/Pages/ViewSchedule.php index 2ce565da0..5147799e8 100644 --- a/app/Filament/Server/Resources/ScheduleResource/Pages/ViewSchedule.php +++ b/app/Filament/Server/Resources/ScheduleResource/Pages/ViewSchedule.php @@ -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 */ + protected function getDefaultHeaderActions(): array { return [ Action::make('runNow') diff --git a/app/Filament/Server/Resources/UserResource.php b/app/Filament/Server/Resources/UserResource.php index abad10e62..eb0e1a69d 100644 --- a/app/Filament/Server/Resources/UserResource.php +++ b/app/Filament/Server/Resources/UserResource.php @@ -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 */ + public static function getDefaultPages(): array { return [ 'index' => Pages\ListUsers::route('/'), diff --git a/app/Filament/Server/Resources/UserResource/Pages/ListUsers.php b/app/Filament/Server/Resources/UserResource/Pages/ListUsers.php index ce0201e32..0b2797154 100644 --- a/app/Filament/Server/Resources/UserResource/Pages/ListUsers.php +++ b/app/Filament/Server/Resources/UserResource/Pages/ListUsers.php @@ -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 */ + protected function getDefaultHeaderActions(): array { /** @var Server $server */ $server = Filament::getTenant(); diff --git a/app/Http/Controllers/Api/Client/Servers/SettingsController.php b/app/Http/Controllers/Api/Client/Servers/SettingsController.php index 6bc765a08..2a2577c80 100644 --- a/app/Http/Controllers/Api/Client/Servers/SettingsController.php +++ b/app/Http/Controllers/Api/Client/Servers/SettingsController.php @@ -34,13 +34,14 @@ class SettingsController extends ClientApiController */ public function rename(RenameServerRequest $request, Server $server): JsonResponse { + $originalName = $server->name; $name = $request->input('name'); $server->update(['name' => $name]); if ($server->wasChanged('name')) { Activity::event('server:settings.rename') - ->property(['old' => $server->getOriginal('name'), 'new' => $name]) + ->property(['old' => $originalName, 'new' => $name]) ->log(); } @@ -56,12 +57,13 @@ class SettingsController extends ClientApiController return new JsonResponse([], Response::HTTP_FORBIDDEN); } + $originalDescription = $server->description; $description = $request->input('description'); $server->update(['description' => $description ?? '']); if ($server->wasChanged('description')) { Activity::event('server:settings.description') - ->property(['old' => $server->getOriginal('description'), 'new' => $description]) + ->property(['old' => $originalDescription, 'new' => $description]) ->log(); } diff --git a/app/Traits/Filament/BlockAccessInConflict.php b/app/Traits/Filament/BlockAccessInConflict.php new file mode 100644 index 000000000..a45f72fd2 --- /dev/null +++ b/app/Traits/Filament/BlockAccessInConflict.php @@ -0,0 +1,21 @@ +isInConflictState()) { + return false; + } + + return parent::canAccess(); + } +} diff --git a/app/Traits/Filament/CanCustomizeHeaderActions.php b/app/Traits/Filament/CanCustomizeHeaderActions.php new file mode 100644 index 000000000..a8dd5ecfc --- /dev/null +++ b/app/Traits/Filament/CanCustomizeHeaderActions.php @@ -0,0 +1,34 @@ + */ + 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 */ + protected function getDefaultHeaderActions(): array + { + return []; + } + + /** @return array */ + protected function getHeaderActions(): array + { + return array_merge( + static::$customHeaderActions[HeaderActionPosition::Before->value] ?? [], + $this->getDefaultHeaderActions(), + static::$customHeaderActions[HeaderActionPosition::After->value] ?? [] + ); + } +} diff --git a/app/Traits/Filament/CanCustomizeHeaderWidgets.php b/app/Traits/Filament/CanCustomizeHeaderWidgets.php new file mode 100644 index 000000000..6972b22e8 --- /dev/null +++ b/app/Traits/Filament/CanCustomizeHeaderWidgets.php @@ -0,0 +1,34 @@ +|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|WidgetConfiguration> */ + protected function getDefaultHeaderWidgets(): array + { + return []; + } + + /** @return array|WidgetConfiguration> */ + protected function getHeaderWidgets(): array + { + return array_merge( + static::$customHeaderWidgets[HeaderWidgetPosition::Before->value] ?? [], + $this->getDefaultHeaderWidgets(), + static::$customHeaderWidgets[HeaderWidgetPosition::After->value] ?? [] + ); + } +} diff --git a/app/Traits/Filament/CanCustomizePages.php b/app/Traits/Filament/CanCustomizePages.php new file mode 100644 index 000000000..d962c51d8 --- /dev/null +++ b/app/Traits/Filament/CanCustomizePages.php @@ -0,0 +1,29 @@ + */ + protected static array $customPages = []; + + /** @param array $customPages */ + public static function registerCustomPages(array $customPages): void + { + static::$customPages = array_merge(static::$customPages, $customPages); + } + + /** @return array */ + public static function getDefaultPages(): array + { + return []; + } + + /** @return array */ + public static function getPages(): array + { + return array_unique(array_merge(static::getDefaultPages(), static::$customPages), SORT_REGULAR); + } +} diff --git a/app/Traits/Filament/CanCustomizeRelations.php b/app/Traits/Filament/CanCustomizeRelations.php new file mode 100644 index 000000000..13682a249 --- /dev/null +++ b/app/Traits/Filament/CanCustomizeRelations.php @@ -0,0 +1,28 @@ +> */ + protected static array $customRelations = []; + + public static function registerCustomRelations(string ...$customRelations): void + { + static::$customRelations = array_merge(static::$customRelations, $customRelations); + } + + /** @return class-string[] */ + public static function getDefaultRelations(): array + { + return []; + } + + /** @return class-string[] */ + public static function getRelations(): array + { + return array_unique(array_merge(static::getDefaultRelations(), static::$customRelations)); + } +} diff --git a/app/Traits/Filament/CanModifyForm.php b/app/Traits/Filament/CanModifyForm.php new file mode 100644 index 000000000..57f1a7db7 --- /dev/null +++ b/app/Traits/Filament/CanModifyForm.php @@ -0,0 +1,33 @@ + */ + 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; + } +} diff --git a/app/Traits/Filament/CanModifyTable.php b/app/Traits/Filament/CanModifyTable.php new file mode 100644 index 000000000..96968b13c --- /dev/null +++ b/app/Traits/Filament/CanModifyTable.php @@ -0,0 +1,33 @@ + */ + 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; + } +} diff --git a/app/Traits/Filament/HasLimitBadge.php b/app/Traits/Filament/HasLimitBadge.php new file mode 100644 index 000000000..c7d41a243 --- /dev/null +++ b/app/Traits/Filament/HasLimitBadge.php @@ -0,0 +1,38 @@ += $limit ? 'danger' : ($count >= $limit * self::WARNING_THRESHOLD ? 'warning' : 'success'); + } +} diff --git a/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json b/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json deleted file mode 100644 index f8c0fd0ad..000000000 --- a/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PLCN_v1", - "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-counter--strike--global-offensive.json" - }, - "exported_at": "2025-03-18T12:36:01+00:00", - "name": "Counter-Strike: Global Offensive", - "author": "panel@example.com", - "uuid": "437c367d-06be-498f-a604-fdad135504d7", - "description": "Counter-Strike: Global Offensive is a multiplayer first-person shooter video game developed by Hidden Path Entertainment and Valve Corporation.", - "tags": [ - "source", - "steamcmd" - ], - "features": [ - "gsl_token", - "steam_disk_space" - ], - "docker_images": { - "ghcr.io\/parkervcp\/games:source": "ghcr.io\/parkervcp\/games:source" - }, - "file_denylist": [], - "startup": ".\/srcds_run -game csgo -console -port {{SERVER_PORT}} +ip 0.0.0.0 +map {{SRCDS_MAP}} -strictportbind -norestart +sv_setsteamaccount {{STEAM_ACC}}", - "config": { - "files": "{}", - "startup": "{\r\n \"done\": \"Connection to Steam servers successful\"\r\n}", - "logs": "{}", - "stop": "quit" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\n## just in case someone removed the defaults.\r\nif [ \"${STEAM_USER}\" == \"\" ]; then\r\n STEAM_USER=anonymous\r\n STEAM_PASS=\"\"\r\n STEAM_AUTH=\"\"\r\nfi\r\n\r\n## download and install steamcmd\r\ncd \/tmp\r\nmkdir -p \/mnt\/server\/steamcmd\r\ncurl -sSL -o steamcmd.tar.gz https:\/\/steamcdn-a.akamaihd.net\/client\/installer\/steamcmd_linux.tar.gz\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\nmkdir -p \/mnt\/server\/steamapps # Fix steamcmd disk write error when this folder is missing\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n## install game using steamcmd\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n\r\n## set up 32 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n## set up 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk64\r\ncp -v linux64\/steamclient.so ..\/.steam\/sdk64\/steamclient.so", - "container": "ghcr.io\/parkervcp\/installers:debian", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "Map", - "description": "The default map for the server.", - "env_variable": "SRCDS_MAP", - "default_value": "de_dust2", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "alpha_dash" - ], - "sort": 1 - }, - { - "name": "Steam Account Token", - "description": "The Steam Account Token required for the server to be displayed publicly.", - "env_variable": "STEAM_ACC", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": [ - "required", - "string", - "alpha_num", - "size:32" - ], - "sort": 2 - }, - { - "name": "Source AppID", - "description": "Required for game to update on server restart. Do not modify this.", - "env_variable": "SRCDS_APPID", - "default_value": "740", - "user_viewable": false, - "user_editable": false, - "rules": [ - "required", - "string", - "max:20" - ], - "sort": 3 - } - ] -} \ No newline at end of file diff --git a/resources/views/filament/admin/widgets/canary-widget.blade.php b/resources/views/filament/admin/widgets/canary-widget.blade.php deleted file mode 100644 index d05fc589c..000000000 --- a/resources/views/filament/admin/widgets/canary-widget.blade.php +++ /dev/null @@ -1,19 +0,0 @@ - - - {{ trans('admin/dashboard.sections.intro-developers.heading') }} - -

{{ trans('admin/dashboard.sections.intro-developers.content') }}

- -


- -

{{ trans('admin/dashboard.sections.intro-developers.extra_note') }}

-
-
diff --git a/resources/views/filament/admin/widgets/form-widget.blade.php b/resources/views/filament/admin/widgets/form-widget.blade.php new file mode 100644 index 000000000..642f88749 --- /dev/null +++ b/resources/views/filament/admin/widgets/form-widget.blade.php @@ -0,0 +1,3 @@ + + {{ $this->form }} + diff --git a/resources/views/filament/admin/widgets/help-widget.blade.php b/resources/views/filament/admin/widgets/help-widget.blade.php deleted file mode 100644 index 3b33b0b7d..000000000 --- a/resources/views/filament/admin/widgets/help-widget.blade.php +++ /dev/null @@ -1,14 +0,0 @@ - - - {{ trans('admin/dashboard.sections.intro-help.heading') }} - -

{{ trans('admin/dashboard.sections.intro-help.content') }}

-
-
diff --git a/resources/views/filament/admin/widgets/no-nodes-widget.blade.php b/resources/views/filament/admin/widgets/no-nodes-widget.blade.php deleted file mode 100644 index 47904b891..000000000 --- a/resources/views/filament/admin/widgets/no-nodes-widget.blade.php +++ /dev/null @@ -1,14 +0,0 @@ - - - {{ trans('admin/dashboard.sections.intro-first-node.heading') }} - -

{{ trans('admin/dashboard.sections.intro-first-node.content') }}

-
-
diff --git a/resources/views/filament/admin/widgets/support-widget.blade.php b/resources/views/filament/admin/widgets/support-widget.blade.php deleted file mode 100644 index a45f0849c..000000000 --- a/resources/views/filament/admin/widgets/support-widget.blade.php +++ /dev/null @@ -1,18 +0,0 @@ - - - {{ trans('admin/dashboard.sections.intro-support.heading') }} - -

{{ trans('admin/dashboard.sections.intro-support.content') }}

- -


- -

{{ trans('admin/dashboard.sections.intro-support.extra_note') }}

-
-
diff --git a/resources/views/filament/admin/widgets/update-widget.blade.php b/resources/views/filament/admin/widgets/update-widget.blade.php deleted file mode 100644 index 9dd757514..000000000 --- a/resources/views/filament/admin/widgets/update-widget.blade.php +++ /dev/null @@ -1,25 +0,0 @@ - - @if (!$isLatest) - - {{ trans('admin/dashboard.sections.intro-update-available.heading') }} - -

{{ trans('admin/dashboard.sections.intro-update-available.content', ['latestVersion' => $latestVersion]) }}

- -
- @else - - {{ trans('admin/dashboard.sections.intro-no-update.heading') }} - -

{{ trans('admin/dashboard.sections.intro-no-update.content', ['version' => $version]) }}

-
- @endif -
diff --git a/tests/Feature/SettingsControllerTest.php b/tests/Feature/SettingsControllerTest.php index c1850489e..769ffa18f 100644 --- a/tests/Feature/SettingsControllerTest.php +++ b/tests/Feature/SettingsControllerTest.php @@ -41,7 +41,7 @@ it('server description can be changed', function () { expect()->toLogActivities(1) ->and($logged->properties['old'])->toBe($originalDescription) ->and($logged->properties['new'])->toBe($newDescription) - ->and($server->description)->not()->toBe($originalDescription); + ->and($server->description)->toBe($newDescription); }); it('server description cannot be changed', function () { @@ -53,7 +53,7 @@ it('server description cannot be changed', function () { ->post("/api/client/servers/$server->uuid/settings/description", [ 'description' => 'Test Description', ]) - ->assertStatus(Response::HTTP_NO_CONTENT); + ->assertStatus(Response::HTTP_FORBIDDEN); $server = $server->refresh(); expect()->toLogActivities(0)