Compare commits

..

4 Commits

Author SHA1 Message Date
Timmy38
42380f7a7a N°3789 Fix missing import 2026-08-27 11:46:03 +02:00
Vincent Dumas
8b384498e3 Fix FR typo 2026-08-27 09:43:24 +02:00
Timmy38
04f1eaff1f N°9989 Do not show "check compatibility" button at all when it should not be available 2026-08-27 09:33:37 +02:00
Molkobain
175b88de30 N°9144 - Fix typo in English sentence 2026-08-26 19:24:25 +02:00
11 changed files with 51 additions and 73 deletions

View File

@@ -205,7 +205,7 @@ class DataFeatureRemovalController extends Controller
$oExtensionsMap = \iTopExtensionsMap::GetExtensionsMap($oRuntimeEnvironment->GetBuildEnv());
// Removed modules are stored as static for FindModules()
$oExtensionsMap->DeclareExtensionAsRemoved($aRemovedExtensions);
$aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions);
$aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions);
}
DataFeatureRemovalLog::Debug(
@@ -217,7 +217,7 @@ class DataFeatureRemovalController extends Controller
Session::Unset('bForceCompilation');
} else {
if (count($aSelectedModules) === 0) {
$aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions);
$aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions);
}
}
DataFeatureRemovalLog::Debug(__METHOD__.": modules", null, ['selected_modules' => $aSelectedModules]);

View File

@@ -521,7 +521,7 @@ Par exemple : disques durs externes, scanners, dispositifs d\'entrée (trackball
Dict::Add('FR FR', 'French', 'Français', [
'Class:Enclosure' => 'Châssis',
'Class:Enclosure+' => 'Un châssis montée à l\'intérieur d\'une Baie qui permet d\'installer des équipements informatiques, comme des Serveurs lames ou des équipements réseau.',
'Class:Enclosure+' => 'Un châssis monté à l\'intérieur d\'une Baie qui permet d\'installer des équipements informatiques, comme des Serveurs lames ou des équipements réseau.',
'Class:Enclosure/ComplementaryName' => '%1$s - %2$s - %3$s',
'Class:Enclosure/Attribute:rack_id' => 'Baie',
'Class:Enclosure/Attribute:rack_id+' => '',

View File

@@ -12,6 +12,7 @@ use Combodo\iTop\Application\Helper\SynchroReplicaHelper;
use Combodo\iTop\Application\TwigBase\Twig\TwigHelper;
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Form\Form;
use Combodo\iTop\Application\UI\Base\Component\GlobalSearch\GlobalSearchHelper;
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;

View File

@@ -34,7 +34,7 @@ class InstallationChoicesToModuleConverter
}
/**
* @param array<string> $aSelectedExtensions
* @param array<string> $aInstallationChoices
* @param array<string> $aSearchDirs
* @param string|null $sInstallationFilePath
* @param array|null $aExtensionDirs : module/extension dirs to load if they are compliant with choices
@@ -42,7 +42,7 @@ class InstallationChoicesToModuleConverter
* @return array<string>
* @throws \ModuleInstallationException
*/
public function GetModules(array $aSelectedExtensions, array $aSearchDirs, ?string $sInstallationFilePath = null, ?array $aExtensionDirs = null): array
public function GetModules(array $aInstallationChoices, array $aSearchDirs, ?string $sInstallationFilePath = null, ?array $aExtensionDirs = null): array
{
$aPackageModules = $this->GetAllModules($aSearchDirs);
@@ -54,9 +54,9 @@ class InstallationChoicesToModuleConverter
if (!is_array($aSteps)) {
return [];
}
$aInstalledModuleNames = $this->FindInstalledPackageModules($aPackageModules, $aSelectedExtensions, $aSteps);
$aInstalledModuleNames = $this->FindInstalledPackageModules($aPackageModules, $aInstallationChoices, $aSteps);
} else {
$aInstalledModuleNames = $this->FindInstalledPackageModules($aPackageModules, $aSelectedExtensions);
$aInstalledModuleNames = $this->FindInstalledPackageModules($aPackageModules, $aInstallationChoices);
}
$aInstalledModules = [];
@@ -68,39 +68,20 @@ class InstallationChoicesToModuleConverter
}
if (!is_null($aExtensionDirs)) {
foreach ($this->GetAllModules($aExtensionDirs) as $sModuleId => $aModule) {
if (!isset($aModule['auto_select'])) {
$oModule = new Module($sModuleId);
foreach (array_keys($this->GetAllModules($aExtensionDirs)) as $sModuleId) {
$oModule = new Module($sModuleId);
$sPreviousModuleId = $aInstalledModules[$oModule->GetModuleName()] ?? null;
if (is_null($sPreviousModuleId)) {
$aInstalledModules[$oModule->GetModuleName()] = $sModuleId;
continue;
}
$sPreviousModuleId = $aInstalledModules[$oModule->GetModuleName()] ?? null;
if (is_null($sPreviousModuleId)) {
$aInstalledModules[$oModule->GetModuleName()] = $sModuleId;
continue;
}
$oPreviousModule = new Module($sPreviousModuleId);
if (version_compare($oModule->GetVersion(), $oPreviousModule->GetVersion(), '>')) {
$aInstalledModules[$oModule->GetModuleName()] = $sModuleId;
}
$oPreviousModule = new Module($sPreviousModuleId);
if (version_compare($oModule->GetVersion(), $oPreviousModule->GetVersion(), '>')) {
$aInstalledModules[$oModule->GetModuleName()] = $sModuleId;
}
}
foreach ($this->GetAllModules($aExtensionDirs) as $sModuleId => $aModule) {
if ($this->IsAutoSelectedModule($aInstalledModules, $sModuleId, $aModule)) {
$oModule = new Module($sModuleId);
$sPreviousModuleId = $aInstalledModules[$oModule->GetModuleName()] ?? null;
if (is_null($sPreviousModuleId)) {
$aInstalledModules[$oModule->GetModuleName()] = $sModuleId;
continue;
}
$oPreviousModule = new Module($sPreviousModuleId);
if (version_compare($oModule->GetVersion(), $oPreviousModule->GetVersion(), '>')) {
$aInstalledModules[$oModule->GetModuleName()] = $sModuleId;
}
}
}
}
return array_values($aInstalledModules);

View File

@@ -1288,7 +1288,7 @@ class RunTimeEnvironment
$oConfig = new Config(utils::GetConfigFilePath($sSourceEnv));
$this->InitExtensionMap($oConfig);
$aSelectedExtensions = $this->GetExtensionMap()->GetSelectedExtensions($oConfig, $aAddedExtensions, []);
$aSelectedModules = $this->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions);
$aSelectedModules = $this->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions);
return $this->DoCompile($aSelectedExtensions, [], $aSelectedModules, $bUseSymLinks ?? false);
}
@@ -1494,14 +1494,14 @@ class RunTimeEnvironment
* Return modules based on installation choices+package
*
* @param \Config $oConfig
* @param array|bool $aSelectedExtensions
* @param array|bool $aChoices
*
* @return array|null
* @throws \ModuleInstallationException
*/
public function GetModulesToLoadFromSelectedExtensions(Config $oConfig, array|bool $aSelectedExtensions): ?array
public function GetModulesToLoadFromChoices(Config $oConfig, array|bool $aChoices): ?array
{
if (false === $aSelectedExtensions) {
if (false === $aChoices) {
return null;
}
@@ -1515,14 +1515,16 @@ class RunTimeEnvironment
}
$aExtensionDirs = [];
$aFromSelectedExtensionModules = [];
foreach ($this->GetExtensionMap()->GetAllExtensions() as $oExtension) {
if (in_array($oExtension->sCode, $aSelectedExtensions) && is_dir($oExtension->sSourceDir)) {
if (in_array($oExtension->sCode, $aChoices) && is_dir($oExtension->sSourceDir)) {
$aExtensionDirs [] = $oExtension->sSourceDir;
$aFromSelectedExtensionModules = array_merge($aFromSelectedExtensionModules, $oExtension->aModules);
}
}
SetupLog::Info(__METHOD__, null, ['ext_dirs' => $aExtensionDirs]);
$aModuleIdsToLoad = InstallationChoicesToModuleConverter::GetInstance()->GetModules($aSelectedExtensions, $aSearchDirs, $sInstallFilePath, $aExtensionDirs);
$aModuleIdsToLoad = InstallationChoicesToModuleConverter::GetInstance()->GetModules($aChoices, $aSearchDirs, $sInstallFilePath, $aExtensionDirs);
$aModulesToLoad = [];
foreach ($aModuleIdsToLoad as $sModuleId) {

View File

@@ -70,7 +70,7 @@ $("[data-role=\"setup-collapsable-options--toggler\"").on('click', function() {
$("#force-uninstall").on("click", function() {
let $this = $(this);
let bForceUninstall = $this.prop("checked");
if( bForceUninstall && !confirm('Beware, uninstalling extensions flagged as non uninstallable may result in data corruption and application crashes. Are you sure you want to continue ?')){
if( bForceUninstall && !confirm('Beware, uninstalling extensions flagged as non uninstallable may result in data corruption and application crashes. Are you sure you want to continue?')){
$this.prop("checked",false);
}
});

View File

@@ -97,23 +97,17 @@ class WizStepLandingBeforeAudit extends WizStepModulesChoice
}
}
}
} else {
$this->GetWizardSteps();
$aSelectedComponents = $this->GetSelectedComponents($this->aSteps, $this->oWizard->GetParameter('selected_extensions', '[]'));
}
// Save the choices for the summary step
$sDisplayChoices = '<ul>';
$aModules = [];
$aExtensions = [];
$i = 0;
foreach ($this->aSteps as $aStepInfo) {
$sDisplayChoices .= $this->GetSelectedModules($aStepInfo, $aSelectedComponents[$i], $aModules, '', '', $aExtensions);
$i++;
// Save the choices for the summary step
$sDisplayChoices = '<ul>';
$i = 0;
foreach ($this->aSteps as $aStepInfo) {
$sDisplayChoices .= $this->GetSelectedModules($aStepInfo, $aSelectedComponents[$i], $aModules, '', '', $aExtensions);
$i++;
}
$sDisplayChoices .= '</ul>';
$this->oWizard->SetParameter('display_choices', $sDisplayChoices);
}
$sDisplayChoices .= '</ul>';
$this->oWizard->SetParameter('display_choices', $sDisplayChoices);
$this->oWizard->SetParameter('selected_modules', json_encode(array_keys($aModules)));
return new WizardState(WizStepDataAudit::class);
}

View File

@@ -229,14 +229,14 @@ class WizStepModulesChoice extends AbstractWizStepInstall
$sExtensionCode = $aAlternativeInfo["extension_code"] ?? null;
if (in_array($sExtensionCode, $aExtensions)) {
$aStepRes = $this->ProcessSelectedOption($sCurrentIndex, $i, $aStepRes, $aAlternativeInfo, $aExtensions, true);
$aStepRes = $this->ProcessSelectedOption($sCurrentIndex, $i, $aStepRes, $aAlternativeInfo, $aExtensions);
break;
}
}
}
/**
* @param string $sCurrentId
* @param string $sCurrentIndex
* @param int|string $i
* @param array $aStepRes
* @param mixed $aOptionsInfo
@@ -244,19 +244,18 @@ class WizStepModulesChoice extends AbstractWizStepInstall
*
* @return array
*/
public function ProcessSelectedOption(string $sCurrentId, int|string $i, array $aStepRes, mixed $aOptionsInfo, array $aExtensions, bool $bIsAlternative = false): array
public function ProcessSelectedOption(string $sCurrentIndex, int|string $i, array $aStepRes, mixed $aOptionsInfo, array $aExtensions): array
{
$sNextId = "{$sCurrentId}_{$i}";
$sNextName = $bIsAlternative ? "{$sCurrentId}_0" : $sNextId;
$aStepRes[$sNextName] = $sNextId;
$sNextIndex = "{$sCurrentIndex}_{$i}";
$aStepRes[$sNextIndex] = $sNextIndex;
$aSubOptions = $aOptionsInfo['sub_options'] ?? null;
if (!is_null($aSubOptions) && is_array($aSubOptions)) {
$this->ProcessOptions($sNextId, $aSubOptions, $aExtensions, $aStepRes);
$this->ProcessAlternatives($sNextId, $aSubOptions, $aExtensions, $aStepRes);
$this->ProcessOptions($sNextIndex, $aSubOptions, $aExtensions, $aStepRes);
$this->ProcessAlternatives($sNextIndex, $aSubOptions, $aExtensions, $aStepRes);
}
$this->ProcessAlternatives($sNextId, $aOptionsInfo, $aExtensions, $aStepRes);
$this->ProcessAlternatives($sNextIndex, $aOptionsInfo, $aExtensions, $aStepRes);
return $aStepRes;
}
@@ -793,7 +792,7 @@ EOF
// If the extension has a dependency issue, it cannot be checked and must be unchecked using the "force-uninstall" option
$bDisabled = !$bInstalled || !$bDisableUninstallCheck;
} elseif ($bInstalled && $bDoNotUninstall) {
// If the extension is uninstallable, it must be unchecked using the "force-uninstall" option
// If the extension is not uninstallable, it must be unchecked using the "force-uninstall" option
$bDisabled = !$bDisableUninstallCheck;
}
@@ -988,7 +987,7 @@ EOF
public function CanMoveForward()
{
return true;
return $this->bCanMoveForward;
}
public function JSCanMoveForward()

View File

@@ -73,7 +73,7 @@ class UnitTestRunTimeEnvironment extends RunTimeEnvironment
$oConfig = new Config(utils::GetConfigFilePath($sSourceEnv));
$this->InitExtensionMap($oConfig);
$aSelectedExtensions = $this->GetExtensionMap()->GetSelectedExtensions($oConfig, $aAddedExtensions, []);
$aSelectedModules = $this->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions);
$aSelectedModules = $this->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions);
return $this->DoCompile(array_keys($aSelectedExtensions), [], $aSelectedModules, $bUseSymLinks ?? false);
} catch (DOMFormatException $e) {
$sFileName = $sSourceEnv.'.delta.xml';

View File

@@ -1639,10 +1639,10 @@ HTML,
$aParams = new XMLParameters(__DIR__.'/ressources/installation_330.xml');
$aSteps = $aParams->Get('steps', []);
$aSelectedExtensions = ["itop-config-mgmt-core","itop-config-mgmt-datacenter","itop-config-mgmt-end-user","itop-config-mgmt-storage","itop-config-mgmt-virtualization","itop-container-mgmt","itop-service-mgmt-service-provider","itop-ticket-mgmt-itil","itop-ticket-mgmt-itil-user-request","itop-ticket-mgmt-itil-incident", "itop-ticket-mgmt-itil-enhanced-portal","itop-change-mgmt-simple","itop-kown-error-mgmt","itop-problem-mgmt","combodo-oauth2-client","combodo-mfa-extended","combodo-data-replication","combodo-api-playground","combodo-snapshot"];
$aSelectedExtensions = ["itop-config-mgmt-core","itop-config-mgmt-datacenter","itop-config-mgmt-end-user","itop-config-mgmt-storage","itop-config-mgmt-virtualization","itop-container-mgmt","itop-service-mgmt-enterprise","itop-ticket-mgmt-simple-ticket","itop-ticket-mgmt-simple-ticket-enhanced-portal","itop-change-mgmt-simple","itop-kown-error-mgmt","itop-problem-mgmt","combodo-oauth2-client","combodo-mfa-extended","combodo-data-replication","combodo-api-playground","combodo-snapshot"];
$aRes = $this->oWizStepModulesChoiceFake->GetSelectedComponents($aSteps, json_encode($aSelectedExtensions));
$aExpected = json_decode('[{"_0":"_0","_1":"_1","_2":"_2","_3":"_3","_4":"_4","_4_0":"_4_0"},{"_0":"_1"},{"_0":"_1","_1_0":"_1_0", "_1_1": "_1_1", "_1_2": "_1_2"},{"_0":"_0"},{"_0":"_0","_1":"_1"}]', true);
$aExpected = json_decode('[{"_0":"_0","_1":"_1","_2":"_2","_3":"_3","_4":"_4","_4_0":"_4_0"},{"_0":"_0"},{"_0":"_0","_0_0":"_0_0"},{"_0":"_0"},{"_0":"_0","_1":"_1"}]', true);
$this->assertEquals($aExpected, $aRes);
}

View File

@@ -8,6 +8,7 @@ use Combodo\iTop\Setup\FeatureRemoval\SetupAudit;
use Combodo\iTop\Test\UnitTest\ItopCustomDatamodelTestCase;
use Combodo\iTop\Test\UnitTest\Service\UnitTestRunTimeEnvironment;
use Config;
use MetaModel;
use RunTimeEnvironment;
use SetupUtils;
use utils;
@@ -68,7 +69,7 @@ class SetupAuditTest extends ItopCustomDatamodelTestCase
$oConfig = new Config(utils::GetConfigFilePath($this->GetTestEnvironment()));
$aRemovedExtensions = ['nominal_ext1', 'finalclass_ext2'];
$aSelectedExtensions = DataFeatureRemoverExtensionService::GetInstance()->GetExtensionMap()->GetSelectedExtensions($oConfig, ['finalclass_ext1', 'finalclass_ext3'], $aRemovedExtensions);
$aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromSelectedExtensions($oConfig, $aSelectedExtensions);
$aSelectedModules = $oRuntimeEnvironment->GetModulesToLoadFromChoices($oConfig, $aSelectedExtensions);
$oRuntimeEnvironment->DoCompile($aSelectedExtensions, $aRemovedExtensions, $aSelectedModules);