From 0c7f139cc9ee12139f9ab67098dc0e5cee7852cc Mon Sep 17 00:00:00 2001 From: Timmy38 Date: Mon, 18 May 2026 17:11:25 +0200 Subject: [PATCH] =?UTF-8?q?N=C2=B09167=20Remote=20extensions=20(from=20hub?= =?UTF-8?q?=20&=20designer)=20need=20a=20forced=20uninstallation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Controller/DataFeatureRemovalController.php | 3 ++- setup/itopextension.class.inc.php | 9 +++++++-- .../Layout/Extension/ExtensionDetailsUIBlockFactory.php | 3 ++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php b/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php index 22fc154545..0b2e2137cb 100644 --- a/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php +++ b/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php @@ -228,6 +228,7 @@ class DataFeatureRemovalController extends Controller 'installed' => $oExtension->bInstalled, 'extra_flags' => [ 'uninstallable' => $oExtension->CanBeUninstalled(), + 'remote' => $oExtension->IsRemote(), 'missing' => $oExtension->bRemovedFromDisk, ], @@ -319,7 +320,7 @@ class DataFeatureRemovalController extends Controller if ($aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] !== 'on') { $aExtensionData['extra_flags']['selected'] = false; $this->aExtensionsToCheck['to_be_removed'][] = $sCode; - if (!$aExtensionData['extra_flags']['uninstallable']) { + if (!$aExtensionData['extra_flags']['uninstallable'] || $aExtensionData['extra_flags']['remote']) { $this->bForcedUninstallation = true; } } elseif (!$aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] === 'on') { diff --git a/setup/itopextension.class.inc.php b/setup/itopextension.class.inc.php index d1e80217be..da8b8b1463 100644 --- a/setup/itopextension.class.inc.php +++ b/setup/itopextension.class.inc.php @@ -145,9 +145,14 @@ class iTopExtension public function GetExtensionSourceLabel(): string { return match ($this->sSource) { - iTopExtension::SOURCE_MANUAL => 'Local extensions folder', - iTopExtension::SOURCE_REMOTE => (ITOP_APPLICATION == 'iTop') ? 'iTop Hub' : 'ITSM Designer', + self::SOURCE_MANUAL => 'Local extensions folder', + self::SOURCE_REMOTE => (ITOP_APPLICATION == 'iTop') ? 'iTop Hub' : 'ITSM Designer', default => '', }; } + + public function IsRemote(): string + { + return $this->sSource === self::SOURCE_REMOTE; + } } diff --git a/sources/Application/UI/Base/Layout/Extension/ExtensionDetailsUIBlockFactory.php b/sources/Application/UI/Base/Layout/Extension/ExtensionDetailsUIBlockFactory.php index ccf2a0dbdc..7ab01cd07a 100644 --- a/sources/Application/UI/Base/Layout/Extension/ExtensionDetailsUIBlockFactory.php +++ b/sources/Application/UI/Base/Layout/Extension/ExtensionDetailsUIBlockFactory.php @@ -20,6 +20,7 @@ class ExtensionDetailsUIBlockFactory extends AbstractUIBlockFactory $bMissingFromDisk = $aExtraFlags['missing'] ?? false; $bSelected = $aExtraFlags['selected'] ?? true; $bDisabled = $aExtraFlags['disabled'] ?? false; + $bRemote = $aExtraFlags['remote'] ?? false; self::AddExtraBadges($aBadges, $bUninstallable, $bMissingFromDisk); $oBadgeInstalled = BadgeUIBlockFactory::MakeGreen(Dict::S('UI:Layout:ExtensionsDetails:BadgeInstalled')); $oBadgeInstalled->AddCSSClass('checked'); @@ -33,7 +34,7 @@ class ExtensionDetailsUIBlockFactory extends AbstractUIBlockFactory if ($bMissingFromDisk) { $oExtensionDetails->GetToggler()->SetIsToggled(false); $oExtensionDetails->GetToggler()->SetIsDisabled(true); - } elseif (!$bUninstallable) { + } elseif (!$bUninstallable || $bRemote) { $oExtensionDetails->AllowForceUninstall(); $oExtensionDetails->GetToggler()->SetIsDisabled(true); }