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;