From 64bcdb514b19435011a3bc322b6c500b59ba5668 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 17 Mar 2026 09:08:28 +0100 Subject: [PATCH] Add jobs for plugin install, update and uninstall (#2267) --- .../Resources/Plugins/PluginResource.php | 30 +++++----- app/Jobs/Plugin/InstallPlugin.php | 55 +++++++++++++++++++ app/Jobs/Plugin/UninstallPlugin.php | 55 +++++++++++++++++++ app/Jobs/Plugin/UpdatePlugin.php | 55 +++++++++++++++++++ lang/en/admin/plugin.php | 12 +++- 5 files changed, 191 insertions(+), 16 deletions(-) create mode 100644 app/Jobs/Plugin/InstallPlugin.php create mode 100644 app/Jobs/Plugin/UninstallPlugin.php create mode 100644 app/Jobs/Plugin/UpdatePlugin.php diff --git a/app/Filament/Admin/Resources/Plugins/PluginResource.php b/app/Filament/Admin/Resources/Plugins/PluginResource.php index 6076d796d..b34bd31f2 100644 --- a/app/Filament/Admin/Resources/Plugins/PluginResource.php +++ b/app/Filament/Admin/Resources/Plugins/PluginResource.php @@ -5,6 +5,9 @@ namespace App\Filament\Admin\Resources\Plugins; use App\Enums\PluginStatus; use App\Enums\TablerIcon; use App\Filament\Admin\Resources\Plugins\Pages\ListPlugins; +use App\Jobs\Plugin\InstallPlugin; +use App\Jobs\Plugin\UninstallPlugin; +use App\Jobs\Plugin\UpdatePlugin; use App\Models\Plugin; use App\Services\Helpers\PluginService; use BackedEnum; @@ -119,15 +122,14 @@ class PluginResource extends Resource ->icon(TablerIcon::Terminal) ->color('success') ->hidden(fn (Plugin $plugin) => $plugin->status !== PluginStatus::NotInstalled) - ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { + ->action(function (Plugin $plugin) { try { - $pluginService->installPlugin($plugin, !$plugin->isTheme() || !$pluginService->hasThemePluginEnabled()); - - redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + InstallPlugin::dispatch(user(), $plugin); Notification::make() ->success() - ->title(trans('admin/plugin.notifications.installed')) + ->title(trans('admin/plugin.notifications.install_started')) + ->body(trans('admin/plugin.notifications.background_info')) ->send(); } catch (Exception $exception) { Notification::make() @@ -143,15 +145,14 @@ class PluginResource extends Resource ->icon(TablerIcon::Download) ->color('success') ->visible(fn (Plugin $plugin) => $plugin->status !== PluginStatus::NotInstalled && $plugin->isUpdateAvailable()) - ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { + ->action(function (Plugin $plugin) { try { - $pluginService->updatePlugin($plugin); - - redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + UpdatePlugin::dispatch(user(), $plugin); Notification::make() ->success() - ->title(trans('admin/plugin.notifications.updated')) + ->title(trans('admin/plugin.notifications.update_started')) + ->body(trans('admin/plugin.notifications.background_info')) ->send(); } catch (Exception $exception) { Notification::make() @@ -220,15 +221,14 @@ class PluginResource extends Resource ->color('danger') ->requiresConfirmation() ->hidden(fn (Plugin $plugin) => $plugin->status === PluginStatus::NotInstalled || $plugin->status === PluginStatus::Errored) - ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { + ->action(function (Plugin $plugin) { try { - $pluginService->uninstallPlugin($plugin); - - redirect(ListPlugins::getUrl(['tab' => $livewire->activeTab])); + UninstallPlugin::dispatch(user(), $plugin); Notification::make() ->success() - ->title(trans('admin/plugin.notifications.uninstalled')) + ->title(trans('admin/plugin.notifications.uninstall_started')) + ->body(trans('admin/plugin.notifications.background_info')) ->send(); } catch (Exception $exception) { Notification::make() diff --git a/app/Jobs/Plugin/InstallPlugin.php b/app/Jobs/Plugin/InstallPlugin.php new file mode 100644 index 000000000..50555ea9c --- /dev/null +++ b/app/Jobs/Plugin/InstallPlugin.php @@ -0,0 +1,55 @@ +installPlugin($this->plugin, !$this->plugin->isTheme() || !$pluginService->hasThemePluginEnabled()); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.installed')) + ->body($this->plugin->name) + ->actions([ + Action::make('goto_plugins') + ->label(trans('admin/plugin.notifications.goto_plugins')) + ->url(ListPlugins::getUrl(panel: 'admin')), + ]) + ->sendToDatabase($this->user); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->danger() + ->title(trans('admin/plugin.notifications.install_error')) + ->body($exception->getMessage()) + ->sendToDatabase($this->user); + } + } + + public function uniqueId(): string + { + return 'plugin:install:' . $this->plugin->id; + } +} diff --git a/app/Jobs/Plugin/UninstallPlugin.php b/app/Jobs/Plugin/UninstallPlugin.php new file mode 100644 index 000000000..106f87822 --- /dev/null +++ b/app/Jobs/Plugin/UninstallPlugin.php @@ -0,0 +1,55 @@ +uninstallPlugin($this->plugin); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.uninstalled')) + ->body($this->plugin->name) + ->actions([ + Action::make('goto_plugins') + ->label(trans('admin/plugin.notifications.goto_plugins')) + ->url(ListPlugins::getUrl(panel: 'admin')), + ]) + ->sendToDatabase($this->user); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->danger() + ->title(trans('admin/plugin.notifications.uninstall_error')) + ->body($exception->getMessage()) + ->sendToDatabase($this->user); + } + } + + public function uniqueId(): string + { + return 'plugin:uninstall:' . $this->plugin->id; + } +} diff --git a/app/Jobs/Plugin/UpdatePlugin.php b/app/Jobs/Plugin/UpdatePlugin.php new file mode 100644 index 000000000..defe79f6f --- /dev/null +++ b/app/Jobs/Plugin/UpdatePlugin.php @@ -0,0 +1,55 @@ +updatePlugin($this->plugin); + + Notification::make() + ->success() + ->title(trans('admin/plugin.notifications.updated')) + ->body($this->plugin->name) + ->actions([ + Action::make('goto_plugins') + ->label(trans('admin/plugin.notifications.goto_plugins')) + ->url(ListPlugins::getUrl(panel: 'admin')), + ]) + ->sendToDatabase($this->user); + } catch (Exception $exception) { + report($exception); + + Notification::make() + ->danger() + ->title(trans('admin/plugin.notifications.update_error')) + ->body($exception->getMessage()) + ->sendToDatabase($this->user); + } + } + + public function uniqueId(): string + { + return 'plugin:update:' . $this->plugin->id; + } +} diff --git a/lang/en/admin/plugin.php b/lang/en/admin/plugin.php index 489ed6a5a..2b8a13cb5 100644 --- a/lang/en/admin/plugin.php +++ b/lang/en/admin/plugin.php @@ -45,15 +45,25 @@ return [ ], 'notifications' => [ + 'goto_plugins' => 'Go to Plugins', + 'background_info' => 'This process can take a few seconds. You will be notified once it\'s finished.', + + 'install_started' => 'Plugin install started in the background', 'installed' => 'Plugin installed', 'install_error' => 'Could not install plugin', + + 'uninstall_started' => 'Plugin uninstall started in the background', 'uninstalled' => 'Plugin uninstalled', 'uninstall_error' => 'Could not uninstall plugin', - 'deleted' => 'Plugin deleted', + + 'update_started' => 'Plugin update started in the background', 'updated' => 'Plugin updated', 'update_error' => 'Could not update plugin', + 'enabled' => 'Plugin enabled', 'disabled' => 'Plugin disabled', + 'deleted' => 'Plugin deleted', + 'imported' => 'Plugin imported', 'import_exists' => 'A plugin with that id already exists', 'import_failed' => 'Could not import plugin',