From 793d264f7220624f0eed5c0753e03a8882064534 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 5 Aug 2025 14:43:16 +0200 Subject: [PATCH] add enum for plugin category and add tabs to list --- .../Commands/Plugin/MakePluginCommand.php | 15 +++++++---- app/Enums/PluginCategory.php | 27 +++++++++++++++++++ .../Admin/Resources/PluginResource.php | 3 ++- .../PluginResource/Pages/ListPlugins.php | 20 ++++++++++++++ app/Models/Plugin.php | 14 +++++----- lang/en/admin/plugin.php | 7 +++++ 6 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 app/Enums/PluginCategory.php diff --git a/app/Console/Commands/Plugin/MakePluginCommand.php b/app/Console/Commands/Plugin/MakePluginCommand.php index 9ee49abc4..7da393c6d 100644 --- a/app/Console/Commands/Plugin/MakePluginCommand.php +++ b/app/Console/Commands/Plugin/MakePluginCommand.php @@ -2,6 +2,7 @@ namespace App\Console\Commands\Plugin; +use App\Enums\PluginCategory; use App\Enums\PluginStatus; use Illuminate\Console\Command; use Illuminate\Filesystem\Filesystem; @@ -51,11 +52,15 @@ class MakePluginCommand extends Command $this->info('Creating Plugin "' . $name . '" (' . $id . ') by ' . $author); $description = $this->option('description') ?? $this->ask('Description'); - $category = $this->option('category') ?? $this->choice('Category', [ - 'plugin' => 'Plugin', - 'theme' => 'Theme', - 'language' => 'Language Pack', - ], 'plugin'); + + $category = $this->option('category') ?? $this->choice('Category', collect(PluginCategory::cases())->mapWithKeys(fn (PluginCategory $category) => [$category->value => $category->getLabel()])->toArray(), PluginCategory::Plugin->value); + + if (!PluginCategory::tryFrom($category)) { + $this->error('Unknown plugin category!'); + + return; + } + $url = $this->option('url') ?? $this->ask('URL', 'https://github.com/' . $author . '/' . $id); $updateUrl = $this->option('updateUrl') ?? $this->ask('Update URL'); $panels = $this->option('panels') ?? $this->choice('Panels', [ diff --git a/app/Enums/PluginCategory.php b/app/Enums/PluginCategory.php new file mode 100644 index 000000000..23e18b231 --- /dev/null +++ b/app/Enums/PluginCategory.php @@ -0,0 +1,27 @@ + 'tabler-package', + self::Theme => 'tabler-palette', + self::Language => 'tabler-language', + }; + } + + public function getLabel(): string + { + return trans('admin/plugin.category_enum.' . $this->value); + } +} diff --git a/app/Filament/Admin/Resources/PluginResource.php b/app/Filament/Admin/Resources/PluginResource.php index c1f4118cc..7b3b03cd6 100644 --- a/app/Filament/Admin/Resources/PluginResource.php +++ b/app/Filament/Admin/Resources/PluginResource.php @@ -68,7 +68,8 @@ class PluginResource extends Resource TextColumn::make('category') ->label(trans('admin/plugin.category')) ->badge() - ->sortable(), + ->sortable() + ->visible(fn ($livewire) => $livewire->activeTab === 'all'), TextColumn::make('status') ->label(trans('admin/plugin.status')) ->badge() diff --git a/app/Filament/Admin/Resources/PluginResource/Pages/ListPlugins.php b/app/Filament/Admin/Resources/PluginResource/Pages/ListPlugins.php index 322eec46e..9ad1e2f33 100644 --- a/app/Filament/Admin/Resources/PluginResource/Pages/ListPlugins.php +++ b/app/Filament/Admin/Resources/PluginResource/Pages/ListPlugins.php @@ -2,8 +2,11 @@ namespace App\Filament\Admin\Resources\PluginResource\Pages; +use App\Enums\PluginCategory; use App\Facades\Plugins; use App\Filament\Admin\Resources\PluginResource; +use App\Models\Plugin; +use Filament\Resources\Components\Tab; use Filament\Resources\Pages\ListRecords; class ListPlugins extends ListRecords @@ -14,4 +17,21 @@ class ListPlugins extends ListRecords { Plugins::updateLoadOrder($order); } + + public function getTabs(): array + { + $tabs = []; + + foreach (PluginCategory::cases() as $category) { + $tabs[$category->value] = Tab::make($category->getLabel()) + ->icon($category->getIcon()) + ->badge(Plugin::whereCategory($category->value)->count()) + ->modifyQueryUsing(fn ($query) => $query->whereCategory($category->value)); + } + + $tabs['all'] = Tab::make(trans('admin/plugin.all')) + ->badge(Plugin::count()); + + return $tabs; + } } diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php index af1f2cb59..49786dc55 100644 --- a/app/Models/Plugin.php +++ b/app/Models/Plugin.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Contracts\Plugins\HasPluginSettings; +use App\Enums\PluginCategory; use App\Enums\PluginStatus; use Exception; use Filament\Forms\Components\Component; @@ -19,7 +20,7 @@ use Sushi\Sushi; * @property string $author * @property string $version * @property string|null $description - * @property string $category + * @property PluginCategory $category * @property string|null $url * @property string|null $update_url * @property string $namespace @@ -73,7 +74,7 @@ class Plugin extends Model implements HasPluginSettings * author: string, * version: string, * description: ?string, - * category: ?string, + * category: string, * url: ?string, * update_url: ?string, * namespace: string, @@ -120,7 +121,7 @@ class Plugin extends Model implements HasPluginSettings 'author' => $data['author'], 'version' => Arr::get($data, 'version', '1.0.0'), 'description' => Arr::get($data, 'description', null), - 'category' => Arr::get($data, 'category', null), + 'category' => $data['category'], 'url' => Arr::get($data, 'url', null), 'update_url' => Arr::get($data, 'update_url', null), 'namespace' => $data['namespace'], @@ -145,7 +146,7 @@ class Plugin extends Model implements HasPluginSettings 'author' => $data['author'] ?? 'Unknown', 'version' => '0.0.0', 'description' => 'Plugin.json is invalid!', - 'category' => 'invalid', + 'category' => PluginCategory::Plugin->value, 'url' => null, 'update_url' => null, 'namespace' => 'Error', @@ -174,6 +175,7 @@ class Plugin extends Model implements HasPluginSettings { return [ 'status' => PluginStatus::class, + 'category' => PluginCategory::class, ]; } @@ -245,12 +247,12 @@ class Plugin extends Model implements HasPluginSettings public function isTheme(): bool { - return $this->category === 'theme'; + return $this->category === PluginCategory::Theme; } public function isLanguage(): bool { - return $this->category === 'language'; + return $this->category === PluginCategory::Language; } /** @return null|array */ diff --git a/lang/en/admin/plugin.php b/lang/en/admin/plugin.php index cbf633a51..dbea9e27c 100644 --- a/lang/en/admin/plugin.php +++ b/lang/en/admin/plugin.php @@ -20,6 +20,7 @@ return [ 'no_plugins' => 'No Plugins', 'from_file' => 'From File', 'from_url' => 'From URL', + 'all' => 'All', 'status_enum' => [ 'not_installed' => 'Not Installed', @@ -29,6 +30,12 @@ return [ 'incompatible' => 'Incompatible', ], + 'category_enum' => [ + 'plugin' => 'Plugin', + 'theme' => 'Theme', + 'language' => 'Language Pack', + ], + 'notifications' => [ 'installed' => 'Plugin installed', 'updated' => 'Plugin updated',