N°9167 Remote extensions (from hub & designer) need a forced uninstallation

This commit is contained in:
Timmy38
2026-05-18 17:11:25 +02:00
parent e2c09c92d5
commit 0c7f139cc9
3 changed files with 11 additions and 4 deletions

View File

@@ -228,6 +228,7 @@ class DataFeatureRemovalController extends Controller
'installed' => $oExtension->bInstalled, 'installed' => $oExtension->bInstalled,
'extra_flags' => [ 'extra_flags' => [
'uninstallable' => $oExtension->CanBeUninstalled(), 'uninstallable' => $oExtension->CanBeUninstalled(),
'remote' => $oExtension->IsRemote(),
'missing' => $oExtension->bRemovedFromDisk, 'missing' => $oExtension->bRemovedFromDisk,
], ],
@@ -319,7 +320,7 @@ class DataFeatureRemovalController extends Controller
if ($aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] !== 'on') { if ($aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] !== 'on') {
$aExtensionData['extra_flags']['selected'] = false; $aExtensionData['extra_flags']['selected'] = false;
$this->aExtensionsToCheck['to_be_removed'][] = $sCode; $this->aExtensionsToCheck['to_be_removed'][] = $sCode;
if (!$aExtensionData['extra_flags']['uninstallable']) { if (!$aExtensionData['extra_flags']['uninstallable'] || $aExtensionData['extra_flags']['remote']) {
$this->bForcedUninstallation = true; $this->bForcedUninstallation = true;
} }
} elseif (!$aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] === 'on') { } elseif (!$aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] === 'on') {

View File

@@ -145,9 +145,14 @@ class iTopExtension
public function GetExtensionSourceLabel(): string public function GetExtensionSourceLabel(): string
{ {
return match ($this->sSource) { return match ($this->sSource) {
iTopExtension::SOURCE_MANUAL => 'Local extensions folder', self::SOURCE_MANUAL => 'Local extensions folder',
iTopExtension::SOURCE_REMOTE => (ITOP_APPLICATION == 'iTop') ? 'iTop Hub' : 'ITSM Designer', self::SOURCE_REMOTE => (ITOP_APPLICATION == 'iTop') ? 'iTop Hub' : 'ITSM Designer',
default => '', default => '',
}; };
} }
public function IsRemote(): string
{
return $this->sSource === self::SOURCE_REMOTE;
}
} }

View File

@@ -20,6 +20,7 @@ class ExtensionDetailsUIBlockFactory extends AbstractUIBlockFactory
$bMissingFromDisk = $aExtraFlags['missing'] ?? false; $bMissingFromDisk = $aExtraFlags['missing'] ?? false;
$bSelected = $aExtraFlags['selected'] ?? true; $bSelected = $aExtraFlags['selected'] ?? true;
$bDisabled = $aExtraFlags['disabled'] ?? false; $bDisabled = $aExtraFlags['disabled'] ?? false;
$bRemote = $aExtraFlags['remote'] ?? false;
self::AddExtraBadges($aBadges, $bUninstallable, $bMissingFromDisk); self::AddExtraBadges($aBadges, $bUninstallable, $bMissingFromDisk);
$oBadgeInstalled = BadgeUIBlockFactory::MakeGreen(Dict::S('UI:Layout:ExtensionsDetails:BadgeInstalled')); $oBadgeInstalled = BadgeUIBlockFactory::MakeGreen(Dict::S('UI:Layout:ExtensionsDetails:BadgeInstalled'));
$oBadgeInstalled->AddCSSClass('checked'); $oBadgeInstalled->AddCSSClass('checked');
@@ -33,7 +34,7 @@ class ExtensionDetailsUIBlockFactory extends AbstractUIBlockFactory
if ($bMissingFromDisk) { if ($bMissingFromDisk) {
$oExtensionDetails->GetToggler()->SetIsToggled(false); $oExtensionDetails->GetToggler()->SetIsToggled(false);
$oExtensionDetails->GetToggler()->SetIsDisabled(true); $oExtensionDetails->GetToggler()->SetIsDisabled(true);
} elseif (!$bUninstallable) { } elseif (!$bUninstallable || $bRemote) {
$oExtensionDetails->AllowForceUninstall(); $oExtensionDetails->AllowForceUninstall();
$oExtensionDetails->GetToggler()->SetIsDisabled(true); $oExtensionDetails->GetToggler()->SetIsDisabled(true);
} }