From 022a19bee626d560e2ba2e2f498141907301cde3 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Thu, 7 Aug 2025 15:07:56 +0200 Subject: [PATCH] allow to create plugins via the frontend --- .../Admin/Resources/PluginResource.php | 67 +++++++++++++++++++ lang/en/admin/plugin.php | 2 + 2 files changed, 69 insertions(+) diff --git a/app/Filament/Admin/Resources/PluginResource.php b/app/Filament/Admin/Resources/PluginResource.php index 7b3b03cd6..21980f462 100644 --- a/app/Filament/Admin/Resources/PluginResource.php +++ b/app/Filament/Admin/Resources/PluginResource.php @@ -2,20 +2,26 @@ namespace App\Filament\Admin\Resources; +use App\Enums\PluginCategory; use App\Facades\Plugins; use App\Filament\Admin\Resources\PluginResource\Pages\ListPlugins; use App\Models\Plugin; use Exception; use Filament\Forms\Components\FileUpload; +use Filament\Forms\Components\Select; use Filament\Forms\Components\Tabs; use Filament\Forms\Components\Tabs\Tab; +use Filament\Forms\Components\TagsInput; use Filament\Forms\Components\TextInput; +use Filament\Forms\Form; use Filament\Notifications\Notification; use Filament\Resources\Resource; use Filament\Tables\Actions\Action; +use Filament\Tables\Actions\CreateAction; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; use Illuminate\Http\UploadedFile; +use Illuminate\Support\Facades\Artisan; class PluginResource extends Resource { @@ -161,6 +167,35 @@ class PluginResource extends Resource }), ]) ->headerActions([ + CreateAction::make() + ->createAnother(false) + ->visible(fn () => Plugins::isDevModeActive()) + ->action(function ($data) { + $exitCode = Artisan::call('p:plugin:make', [ + '--name' => $data['name'], + '--author' => $data['author'], + '--description' => $data['description'], + '--category' => $data['category'], + '--url' => $data['url'] ?? '', + '--updateUrl' => $data['update_url'] ?? '', + '--panels' => $data['panels'] ?? [], + '--composerPackages' => $data['composer_packages'] ?? [], + ]); + + if ($exitCode === 0) { + redirect(ListPlugins::getUrl()); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.created')) + ->send(); + } else { + Notification::make() + ->danger() + ->title(trans('admin/plugin.notifications.create_failed')) + ->send(); + } + }), Action::make('import') ->label(trans('admin/plugin.import')) ->authorize(fn (Plugin $plugin) => auth()->user()->can('create', $plugin)) @@ -219,6 +254,38 @@ class PluginResource extends Resource ->emptyStateHeading(trans('admin/plugin.no_plugins')); } + public static function form(Form $form): Form + { + return $form + ->schema([ + TextInput::make('name') + ->required(), + TextInput::make('author') + ->required() + ->default(fn () => auth()->user()->username), + TextInput::make('description') + ->columnSpanFull(), + Select::make('category') + ->selectablePlaceholder(false) + ->default(PluginCategory::Plugin->value) + ->options(PluginCategory::class), + Select::make('panels') + ->multiple() + ->options([ + 'admin' => 'Admin Area', + 'server' => 'Client Area', + 'app' => 'Server List', + ]), + TextInput::make('url') + ->url(), + TextInput::make('update_url') + ->url(), + TagsInput::make('composer_packages') + ->columnSpanFull() + ->placeholder('New Package'), + ]); + } + public static function getPages(): array { return [ diff --git a/lang/en/admin/plugin.php b/lang/en/admin/plugin.php index dbea9e27c..625ebae65 100644 --- a/lang/en/admin/plugin.php +++ b/lang/en/admin/plugin.php @@ -43,5 +43,7 @@ return [ 'disabled' => 'Plugin disabled', 'downloaded' => 'Plugin downloaded', 'download_failed' => 'Could not download plugin', + 'created' => 'Plugin created', + 'create_failed' => 'Could not create plugin', ], ];