diff --git a/setup/extensionsmap.class.inc.php b/setup/extensionsmap.class.inc.php
index a541b7ac1..de53d11c4 100644
--- a/setup/extensionsmap.class.inc.php
+++ b/setup/extensionsmap.class.inc.php
@@ -369,6 +369,77 @@ class iTopExtensionsMap
return array_merge($this->aInstalledExtensions ?? [], $this->aExtensions);
}
+ /**
+ * @param bool $bKeepMissingDependencyExtensions
+ *
+ * @return array<\iTopExtension>>
+ */
+
+ public function GetAllExtensionsToDisplayInSetup(bool $bKeepMissingDependencyExtensions = false): array
+ {
+ $aRes = [];
+ foreach ($this->GetAllExtensionsWithPreviouslyInstalled() as $oExtension) {
+ \IssueLog::Error($oExtension->sCode.' '.__METHOD__.__LINE__);
+ /** @var \iTopExtension $oExtension */
+ if (($oExtension->sSource !== iTopExtension::SOURCE_WIZARD) && ($oExtension->bVisible)) {
+ if ($bKeepMissingDependencyExtensions || (count($oExtension->aMissingDependencies) == 0)) {
+
+ if (!$oExtension->bMandatory) {
+ $oExtension->bMandatory = ($oExtension->sSource === iTopExtension::SOURCE_REMOTE);
+ }
+ $aRes[$oExtension->sCode] = $oExtension;
+ }
+ }
+ }
+
+ return $aRes;
+ }
+
+ public function GetAllExtensionsOptionInfo(): array
+ {
+ $aRes = [];
+ foreach ($this->GetAllExtensionsToDisplayInSetup() as $sCode => $oExtension) {
+ $aRes[] = [
+ 'extension_code' => $oExtension->sCode,
+ 'title' => $oExtension->sLabel,
+ 'description' => $oExtension->sDescription,
+ 'more_info' => $oExtension->sMoreInfoUrl,
+ 'default' => true, // by default offer to install all modules
+ 'modules' => $oExtension->aModules,
+ 'mandatory' => $oExtension->bMandatory,
+ 'source_label' => $this->GetExtensionSourceLabel($oExtension->sSource),
+ 'uninstallable' => $oExtension->CanBeUninstalled(),
+ 'missing' => $oExtension->bRemovedFromDisk,
+ ];
+ }
+
+ return $aRes;
+ }
+
+ protected function GetExtensionSourceLabel($sSource)
+ {
+ $sDecorationClass = '';
+ switch ($sSource) {
+ case iTopExtension::SOURCE_MANUAL:
+ $sResult = 'Local extensions folder';
+ $sDecorationClass = 'fas fa-folder';
+ break;
+
+ case iTopExtension::SOURCE_REMOTE:
+ $sResult = (ITOP_APPLICATION == 'iTop') ? 'iTop Hub' : 'ITSM Designer';
+ $sDecorationClass = (ITOP_APPLICATION == 'iTop') ? 'fc fc-chameleon-icon' : 'fa pencil-ruler';
+ break;
+
+ default:
+ $sResult = '';
+ }
+ if ($sResult == '') {
+ return '';
+ }
+
+ return '';
+ }
+
/**
* Mark the given extension as chosen
* @param string $sExtensionCode The code of the extension (code without version number)
@@ -454,7 +525,7 @@ class iTopExtensionsMap
return true;
}
- protected function LoadInstalledExtensionsFromDatabase(Config $oConfig): array|false
+ public function LoadInstalledExtensionsFromDatabase(Config $oConfig): array|false
{
try {
if (CMDBSource::DBName() === null) {
diff --git a/setup/wizardsteps.class.inc.php b/setup/wizardsteps.class.inc.php
index 9b00345dc..491e11fe9 100644
--- a/setup/wizardsteps.class.inc.php
+++ b/setup/wizardsteps.class.inc.php
@@ -1903,6 +1903,7 @@ EOF
$aSteps = [];
$this->oWizard->SetParameter('additional_extensions_modules', json_encode([])); // Default value, no additional extensions
+ $aOptions = $this->oExtensionsMap->GetAllExtensionsOptionInfo();
if (@file_exists($this->GetSourceFilePath())) {
// Found an "installation.xml" file, let's use this definition for the wizard
$aParams = new XMLParameters($this->GetSourceFilePath());
@@ -1913,29 +1914,11 @@ EOF
'title' => 'Extensions',
'description' => '
Select additional extensions to install. You can launch the installation again to install new extensions or remove installed ones.
',
'banner' => '/images/icons/icons8-puzzle.svg',
- 'options' => [],
+ 'options' => $aOptions,
];
- foreach ($this->oExtensionsMap->GetAllExtensionsWithPreviouslyInstalled() as $oExtension) {
- if (($oExtension->sSource !== iTopExtension::SOURCE_WIZARD) && ($oExtension->bVisible) && (count($oExtension->aMissingDependencies) == 0)) {
- $aStepDefinition['options'][] = [
- 'extension_code' => $oExtension->sCode,
- 'title' => $oExtension->sLabel,
- 'description' => $oExtension->sDescription,
- 'more_info' => $oExtension->sMoreInfoUrl,
- 'default' => true, // by default offer to install all modules
- 'modules' => $oExtension->aModules,
- 'mandatory' => $oExtension->bMandatory || ($oExtension->sSource === iTopExtension::SOURCE_REMOTE),
- 'source_label' => $this->GetExtensionSourceLabel($oExtension->sSource),
- 'uninstallable' => $oExtension->CanBeUninstalled(),
- 'missing' => $oExtension->bRemovedFromDisk,
- ];
- }
- }
-
// Display this step of the wizard only if there is something to display
if (count($aStepDefinition['options']) !== 0) {
- $aSteps[] = $aStepDefinition;
$this->oWizard->SetParameter('additional_extensions_modules', json_encode($aStepDefinition['options']));
}
} else {
@@ -1944,25 +1927,12 @@ EOF
'title' => 'Modules Selection',
'description' => 'Select the modules to install. You can launch the installation again to install new modules, but you cannot remove already installed modules.
',
'banner' => '/images/icons/icons8-apps-tab.svg',
- 'options' => [],
+ 'options' => $aOptions,
];
- foreach ($this->oExtensionsMap->GetAllExtensions() as $oExtension) {
- if (($oExtension->bVisible) && (count($oExtension->aMissingDependencies) == 0)) {
- $aStepDefinition['options'][] = [
- 'extension_code' => $oExtension->sCode,
- 'title' => $oExtension->sLabel,
- 'description' => $oExtension->sDescription,
- 'more_info' => $oExtension->sMoreInfoUrl,
- 'default' => true, // by default offer to install all modules
- 'modules' => $oExtension->aModules,
- 'mandatory' => $oExtension->bMandatory || ($oExtension->sSource !== iTopExtension::SOURCE_REMOTE),
- 'source_label' => $this->GetExtensionSourceLabel($oExtension->sSource),
- ];
- }
- }
- $aSteps[] = $aStepDefinition;
}
+ $aSteps[] = $aStepDefinition;
+
if (array_key_exists($index, $aSteps)) {
$aStepInfo = $aSteps[$index];
}
@@ -1970,29 +1940,6 @@ EOF
return $aStepInfo;
}
- protected function GetExtensionSourceLabel($sSource)
- {
- $sDecorationClass = '';
- switch ($sSource) {
- case iTopExtension::SOURCE_MANUAL:
- $sResult = 'Local extensions folder';
- $sDecorationClass = 'fas fa-folder';
- break;
-
- case iTopExtension::SOURCE_REMOTE:
- $sResult = (ITOP_APPLICATION == 'iTop') ? 'iTop Hub' : 'ITSM Designer';
- $sDecorationClass = (ITOP_APPLICATION == 'iTop') ? 'fc fc-chameleon-icon' : 'fa pencil-ruler';
- break;
-
- default:
- $sResult = '';
- }
- if ($sResult == '') {
- return '';
- }
- return '';
- }
-
public function ComputeChoiceFlags(array $aChoice, string $sChoiceId, array $aSelectedComponents, bool $bAllDisabled, bool $bDisableUninstallCheck, bool $bUpgradeMode)
{
$oITopExtension = $this->oExtensionsMap->GetFromExtensionCode($aChoice['extension_code']);
@@ -2335,8 +2282,6 @@ class WizStepSummary extends WizardStep
}
- $aSelectedModules = $aInstallParams['selected_modules'];
-
if (isset($aMiscOptions['generate_config'])) {
$oDoc = new DOMDocument('1.0', 'UTF-8');
$oDoc->preserveWhiteSpace = false;