From 2d27703955d390bec9c9d282b7244082b6de13c7 Mon Sep 17 00:00:00 2001 From: Hugo Kiyodi Oshiro Date: Thu, 24 Oct 2024 09:38:38 +0200 Subject: [PATCH] Plugins: Disable plugin uninstall while plugin is installing (#95070) --- .../InstallControlsButton.test.tsx | 30 ++++++++++++++++++- .../InstallControls/InstallControlsButton.tsx | 14 ++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.test.tsx b/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.test.tsx index 68090c5ba54..554b9824193 100644 --- a/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.test.tsx +++ b/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.test.tsx @@ -230,12 +230,40 @@ describe('InstallControlsButton', () => { expect(button).toBeDisabled(); }); + it('should be disabled when isInstalling=false but isUpdatingFromInstance=true', () => { + store.dispatch({ type: 'plugins/uninstall/fulfilled', payload: { id: '', changes: {} } }); + render( + + + + ); + const button = screen.getByText('Uninstall').closest('button'); + expect(button).toBeDisabled(); + }); + + it('should be disabled when isInstalling=false but isFullyInstalled=false', () => { + store.dispatch({ type: 'plugins/uninstall/fulfilled', payload: { id: '', changes: {} } }); + render( + + + + ); + const button = screen.getByText('Uninstall').closest('button'); + expect(button).toBeDisabled(); + }); + it('should be enabled when isInstalling=false and isUninstallingFromInstance=false', () => { store.dispatch({ type: 'plugins/uninstall/fulfilled', payload: { id: '', changes: {} } }); render( diff --git a/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.tsx b/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.tsx index f438752afa6..fa82e9ce628 100644 --- a/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.tsx +++ b/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.tsx @@ -117,10 +117,8 @@ export function InstallControlsButton({ } }; - let disableUninstall = - config.pluginAdminExternalManageEnabled && configCore.featureToggles.managedPluginsInstall - ? plugin.isUninstallingFromInstance - : isUninstalling; + let disableUninstall = shouldDisableUninstall(isUninstalling, plugin); + let uninstallTitle = ''; if (plugin.isPreinstalled.found) { disableUninstall = true; @@ -179,3 +177,11 @@ export function InstallControlsButton({ ); } + +function shouldDisableUninstall(isUninstalling: boolean, plugin: CatalogPlugin) { + if (config.pluginAdminExternalManageEnabled && config.featureToggles.managedPluginsInstall) { + return plugin.isUninstallingFromInstance || !plugin.isFullyInstalled || plugin.isUpdatingFromInstance; + } + + return isUninstalling; +}