diff --git a/data/.compilation-symlinks b/data/.compilation-symlinks
deleted file mode 100644
index e69de29bb2..0000000000
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 04b6c9c2a3..9be23183f1 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
@@ -21,16 +21,16 @@ use Combodo\iTop\DataFeatureRemoval\Service\DataFeatureRemoverExtensionService;
use Combodo\iTop\Setup\FeatureRemoval\DryRemovalRuntimeEnvironment;
use Combodo\iTop\Setup\FeatureRemoval\SetupAudit;
use ContextTag;
+use CoreException;
use Dict;
use Exception;
-use IssueLog;
use MetaModel;
+use MissingDependencyException;
use SetupUtils;
use utils;
class DataFeatureRemovalController extends Controller
{
- private array $aRemovedExtensionsForCheck = [];
private ?array $aExtensionsToCheck = null;
private bool $bForcedUninstallation = false;
private array $aCountClassesToCleanup = [];
@@ -55,6 +55,7 @@ class DataFeatureRemovalController extends Controller
$aParams['sSetupUrl'] = utils::GetAbsoluteUrlAppRoot().'setup';
$aParams['iCount'] = $this->iCount;
+ Session::Set('bForceCompilation', true);
$this->AddLinkedStylesheet(utils::GetAbsoluteUrlModulesRoot().DataFeatureRemovalHelper::MODULE_NAME.'/assets/css/DataFeatureRemoval.css');
$this->AddLinkedScript(utils::GetAbsoluteUrlModulesRoot().DataFeatureRemovalHelper::MODULE_NAME.'/assets/js/DataFeatureRemoval.js');
$this->DisplayPage($aParams);
@@ -77,33 +78,6 @@ class DataFeatureRemovalController extends Controller
$this->aAnalysisDataTable = $this->GetTableData('Analysis', $aColumns, $aData);
}
- public function OperationAnalyze(): void
- {
- $iCount = $this->ReadExtensionsDiff();
-
- $this->m_sOperation = 'Main';
- try {
- if ($iCount > 0) {
- $this->Analyze();
- }
- $this->OperationMain();
- } catch (Exception $e) {
- IssueLog::Error(__METHOD__, null, ['stack' => $e->getTraceAsString(), 'exception' => $e->getMessage()]);
- $this->OperationMain($e->getMessage());
- }
- }
-
- private function Analyze(): void
- {
- //TODO : Run data audit with added extension too, not just removed ones
- $this->Compile($this->aExtensionsToCheck['to_be_removed']);
- $sSourceEnv = MetaModel::GetEnvironment();
- $oSetupAudit = new SetupAudit($sSourceEnv);
- $aGetRemovedClasses = $oSetupAudit->RunDataAudit();
- IssueLog::Debug(__METHOD__, null, ['aGetRemovedClasses' => $aGetRemovedClasses]);
- $this->aCountClassesToCleanup = $aGetRemovedClasses;
- }
-
public function OperationAnalysisResult(): void
{
$aParams = [];
@@ -133,26 +107,48 @@ class DataFeatureRemovalController extends Controller
$aParams['aHiddenInputs'] = $aHiddenInputs;
$aAddedExtensions = json_decode($aHiddenInputs['added_extensions'], true);
+
$aRemovedExtensions = json_decode($aHiddenInputs['removed_extensions'], true);
+ if (count($aRemovedExtensions) == 0) {
+ $this->ReadExtensionsDiff();
+ $aAddedExtensions = $this->aExtensionsToCheck['to_be_installed'];
+ $aHiddenInputs['added_extensions'] = utils::HtmlEntities(json_encode($aAddedExtensions));
+ $aRemovedExtensions = $this->aExtensionsToCheck['to_be_removed'];
+ $aHiddenInputs['removed_extensions'] = utils::HtmlEntities(json_encode($aRemovedExtensions));
+ }
+
+ $aRemoveExtensionCodes = array_keys($aRemovedExtensions);
$aParams['aAddedExtensions'] = $aAddedExtensions;
$aParams['aRemovedExtensions'] = $aRemovedExtensions;
- IssueLog::Debug(__METHOD__.' Extensions given in parameter', null, [
+ DataFeatureRemovalLog::Debug(__METHOD__.' Extensions given in parameter', null, [
'added_extensions' => $aAddedExtensions,
'removed_extensions' => $aRemovedExtensions]);
- $this->Compile(array_keys($aRemovedExtensions), false);
+ $aParams['sTransactionId'] = utils::GetNewTransactionId();
+ $aParams['iColumnCount'] = $this->iColumnCount;
+ $aParams['aAvailableExtensions'] = $this->SplitArrayIntoColumns($this->GetExtensionsDiff($aAddedExtensions, $aRemovedExtensions), $this->iColumnCount);
+
+ $bForceCompilation = Session::Get('bForceCompilation', false);
+ try {
+ $this->Compile($aRemoveExtensionCodes, $bForceCompilation);
+ } catch (CoreException $e) {
+ $aParams['DataFeatureRemovalErrorMessage'] = $e->getHtmlDesc();
+ $this->DisplayPage($aParams, 'AnalysisResult');
+ return;
+ } catch (Exception $e) {
+ $aParams['DataFeatureRemovalErrorMessage'] = $e->getMessage();
+ $this->DisplayPage($aParams, 'AnalysisResult');
+ return;
+ }
$sSourceEnv = MetaModel::GetEnvironment();
$oSetupAudit = new SetupAudit($sSourceEnv);
$aGetRemovedClasses = array_keys($oSetupAudit->RunDataAudit());
- IssueLog::Debug(__METHOD__, null, ['aGetRemovedClasses' => $aGetRemovedClasses]);
+ DataFeatureRemovalLog::Debug(__METHOD__, null, ['aGetRemovedClasses' => $aGetRemovedClasses]);
- $aParams['sTransactionId'] = utils::GetNewTransactionId();
$aParams['aClasses'] = $aGetRemovedClasses;
- $aParams['iColumnCount'] = $this->iColumnCount;
- $aParams['aAvailableExtensions'] = $this->SplitArrayIntoColumns($this->GetExtensionsDiff($aAddedExtensions, $aRemovedExtensions), $this->iColumnCount);
new ContextTag(ContextTag::TAG_SETUP);
$aParams['sLaunchSetupUrl'] = utils::GetAbsoluteUrlAppRoot().'setup/wizard.php';
@@ -170,6 +166,13 @@ class DataFeatureRemovalController extends Controller
$this->DisplayPage($aParams, 'AnalysisResult');
}
+ /**
+* @param array $aRemovedExtensions
+* @param bool $bForceCompilation
+* @return void
+* @throws \ConfigException
+* @throws \CoreException
+ */
private function Compile(array $aRemovedExtensions, bool $bForceCompilation = true): void
{
$sSourceEnv = MetaModel::GetEnvironment();
@@ -346,7 +349,7 @@ class DataFeatureRemovalController extends Controller
}
$sTransactionId = utils::ReadPostedParam('transaction_id', null, utils::ENUM_SANITIZATION_FILTER_TRANSACTION_ID);
- IssueLog::Debug(__FUNCTION__.": Transaction [$sTransactionId]");
+ DataFeatureRemovalLog::Debug(__FUNCTION__.": Transaction [$sTransactionId]");
if (empty($sTransactionId) || !utils::IsTransactionValid($sTransactionId, false)) {
throw new DataFeatureRemovalException(Dict::S("iTopUpdate:Error:InvalidToken"));
}
@@ -375,13 +378,13 @@ class DataFeatureRemovalController extends Controller
if ($aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] !== 'on') {
$aExtensionData['extra_flags']['selected'] = false;
- $this->aExtensionsToCheck['to_be_removed'][] = $sCode;
+ $this->aExtensionsToCheck['to_be_removed'][$sCode] = $sCode;
if (!$aExtensionData['extra_flags']['uninstallable'] || $aExtensionData['extra_flags']['remote']) {
$this->bForcedUninstallation = true;
}
} elseif (!$aExtensionData['installed'] && $aSelectedExtensionsFromUI[$sCode] === 'on') {
$aExtensionData['extra_flags']['selected'] = true;
- $this->aExtensionsToCheck['to_be_installed'][] = $sCode;
+ $this->aExtensionsToCheck['to_be_installed'][$sCode] = $sCode;
}
}
return count($this->aExtensionsToCheck['to_be_installed']) + count($this->aExtensionsToCheck['to_be_removed']);
diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/AnalysisResult.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/AnalysisResult.html.twig
index 2ce1f409f1..8bebc67108 100644
--- a/datamodels/2.x/combodo-data-feature-removal/templates/AnalysisResult.html.twig
+++ b/datamodels/2.x/combodo-data-feature-removal/templates/AnalysisResult.html.twig
@@ -4,64 +4,87 @@
{% UIPanel ForInformation { sTitle:'DataFeatureRemoval:Analysis:Title'|dict_s} %}
- {% UIPanel Neutral { sTitle:'DataFeatureRemoval:Features:Title'|dict_s, sSubTitle: '' } %}
- {% UIMultiColumn Standard {} %}
- {% for iColumnIndex in 0..iColumnCount-1 %}
- {% UIColumn Standard {} %}
- {% for aExtension in aAvailableExtensions[iColumnIndex] %}
- {% if aExtension['installed'] %}
- {% UIExtensionDetails Installed { sCode : aExtension['code'], sLabel : aExtension['label'], sDescription : aExtension['description'], aMetaData : [aExtension['version'], aExtension['source']], aExtraFlags : aExtension['extra_flags']} %}{% EndUIExtensionDetails %}
- {% else %}
- {% UIExtensionDetails NotInstalled { sCode : aExtension['code'], sLabel : aExtension['label'], sDescription : aExtension['description'], aMetaData : [aExtension['version'], aExtension['source']], aExtraFlags : aExtension['extra_flags']} %}{% EndUIExtensionDetails %}
- {% endif %}
- {% endfor %}
- {% EndUIColumn %}
- {% endfor %}
- {% EndUIMultiColumn %}
- {% EndUIPanel %}
+ {% if null != DataFeatureRemovalErrorMessage %}
+
+ {% UIAlert ForFailure { sTitle:'DataFeatureRemoval:Failure:Title'|dict_s, sId: 'feature_removal_error_msg', sContent:DataFeatureRemovalErrorMessage } %}
+ {% EndUIAlert %}
+
- {% if bDeletionNeeded %}
- {% UIFieldSet Standard {sLegend:'DataFeatureRemoval:DeletionPlan:Title'|dict_s} %}
- {% UIDataTable ForForm { sRef:'aDeletionPlanSummary', aColumns:aDeletionPlanSummary.Columns, aData:aDeletionPlanSummary.Data} %}{% EndUIDataTable %}
- {% EndUIFieldSet %}
- {% if bDeletionPossible %}
- {% UIForm Standard {} %}
- {% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
- {% UIInput ForHidden { sName:'operation', sValue:'DoDeletion'} %}
- {% for sKey, sClass in aClasses %}
- {% UIInput ForHidden { sName:"classes[" ~ sKey ~ "]", sValue:sClass } %}
+ {% UIPanel Neutral { sTitle:'DataFeatureRemoval:Features:Title'|dict_s, sSubTitle: '' } %}
+ {% UIMultiColumn Standard {} %}
+ {% for iColumnIndex in 0..iColumnCount-1 %}
+ {% UIColumn Standard {} %}
+ {% for aExtension in aAvailableExtensions[iColumnIndex] %}
+ {% if aExtension['installed'] %}
+ {% UIExtensionDetails Installed { sCode : aExtension['code'], sLabel : aExtension['label'], sDescription : aExtension['description'], aMetaData : [aExtension['version'], aExtension['source']], aExtraFlags : aExtension['extra_flags']} %}{% EndUIExtensionDetails %}
+ {% else %}
+ {% UIExtensionDetails NotInstalled { sCode : aExtension['code'], sLabel : aExtension['label'], sDescription : aExtension['description'], aMetaData : [aExtension['version'], aExtension['source']], aExtraFlags : aExtension['extra_flags']} %}{% EndUIExtensionDetails %}
+ {% endif %}
+ {% endfor %}
+ {% EndUIColumn %}
{% endfor %}
- {% for sCode, sLabel in aAddedExtensions %}
- {% UIInput ForHidden { sName:"aAddedExtensions[" ~ sCode ~ "]", sValue:sLabel } %}
- {% endfor %}
- {% for sCode, sLabel in aRemovedExtensions %}
- {% UIInput ForHidden { sName:"aRemovedExtensions[" ~ sCode ~ "]", sValue:sLabel } %}
- {% endfor %}
- {% for sInputName, sValue in aHiddenInputs %}
- {% UIInput ForHidden { sName:sInputName, sValue:sValue } %}
- {% endfor %}
- {% UIToolbar ForButton {} %}
- {% UIButton ForPrimaryAction {sLabel:'UI:Button:DoDeletion'|dict_s, sName:'btn_deletion', sId:'btn_deletion', bIsSubmit:true} %}
- {% EndUIToolbar %}
- {% EndUIForm %}
- {% else %}
- {% UIAlert ForFailure { sContent: 'DataFeatureRemoval:DeletionPlan:Error:Issues'|dict_s } %}{% EndUIAlert %}
- {% endif %}
+ {% EndUIMultiColumn %}
+ {% EndUIPanel %}
{% else %}
- {% UIAlert ForSuccess { sTitle:'DataFeatureRemoval:CleanupComplete:Title'|dict_s, sContent:'DataFeatureRemoval:CompilComplete'|dict_s, sId:value } %}{% EndUIAlert %}
+ {% UIPanel Neutral { sTitle:'DataFeatureRemoval:Features:Title'|dict_s, sSubTitle: '' } %}
+ {% UIMultiColumn Standard {} %}
+ {% for iColumnIndex in 0..iColumnCount-1 %}
+ {% UIColumn Standard {} %}
+ {% for aExtension in aAvailableExtensions[iColumnIndex] %}
+ {% if aExtension['installed'] %}
+ {% UIExtensionDetails Installed { sCode : aExtension['code'], sLabel : aExtension['label'], sDescription : aExtension['description'], aMetaData : [aExtension['version'], aExtension['source']], aExtraFlags : aExtension['extra_flags']} %}{% EndUIExtensionDetails %}
+ {% else %}
+ {% UIExtensionDetails NotInstalled { sCode : aExtension['code'], sLabel : aExtension['label'], sDescription : aExtension['description'], aMetaData : [aExtension['version'], aExtension['source']], aExtraFlags : aExtension['extra_flags']} %}{% EndUIExtensionDetails %}
+ {% endif %}
+ {% endfor %}
+ {% EndUIColumn %}
+ {% endfor %}
+ {% EndUIMultiColumn %}
+ {% EndUIPanel %}
- {% UIForm Standard {'sId':'launch-setup-form', Action:sLaunchSetupUrl, 'EncType': 'application/x-www-form-urlencoded'} %}
- {% for sKey, sValue in aSetupParams %}
- {% UIInput ForHidden { sName:sKey, sValue:sValue } %}
- {% endfor %}
- {% UIButton ForPrimaryAction {sLabel:'UI:Button:Setup'|dict_s, sName:'btn_setup', sId:'btn_setup', bIsSubmit:true} %}
- {% EndUIForm %}
- {% endif %}
+ {% if bDeletionNeeded %}
+ {% UIFieldSet Standard {sLegend:'DataFeatureRemoval:DeletionPlan:Title'|dict_s} %}
+ {% UIDataTable ForForm { sRef:'aDeletionPlanSummary', aColumns:aDeletionPlanSummary.Columns, aData:aDeletionPlanSummary.Data} %}{% EndUIDataTable %}
+ {% EndUIFieldSet %}
+ {% if bDeletionPossible %}
+ {% UIForm Standard {} %}
+ {% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
+ {% UIInput ForHidden { sName:'operation', sValue:'DoDeletion'} %}
+ {% for sKey, sClass in aClasses %}
+ {% UIInput ForHidden { sName:"classes[" ~ sKey ~ "]", sValue:sClass } %}
+ {% endfor %}
+ {% for sCode, sLabel in aAddedExtensions %}
+ {% UIInput ForHidden { sName:"aAddedExtensions[" ~ sCode ~ "]", sValue:sLabel } %}
+ {% endfor %}
+ {% for sCode, sLabel in aRemovedExtensions %}
+ {% UIInput ForHidden { sName:"aRemovedExtensions[" ~ sCode ~ "]", sValue:sLabel } %}
+ {% endfor %}
+ {% for sInputName, sValue in aHiddenInputs %}
+ {% UIInput ForHidden { sName:sInputName, sValue:sValue } %}
+ {% endfor %}
+ {% UIToolbar ForButton {} %}
+ {% UIButton ForPrimaryAction {sLabel:'UI:Button:DoDeletion'|dict_s, sName:'btn_deletion', sId:'btn_deletion', bIsSubmit:true} %}
+ {% EndUIToolbar %}
+ {% EndUIForm %}
+ {% else %}
+ {% UIAlert ForFailure { sContent: 'DataFeatureRemoval:DeletionPlan:Error:Issues'|dict_s } %}{% EndUIAlert %}
+ {% endif %}
+ {% else %}
+ {% UIAlert ForSuccess { sTitle:'DataFeatureRemoval:CleanupComplete:Title'|dict_s, sContent:'DataFeatureRemoval:CompilComplete'|dict_s, sId:value } %}{% EndUIAlert %}
- {% if bHasDeletionExecution %}
- {% UIFieldSet Standard {sLegend:'DataFeatureRemoval:Execution:Title'|dict_s} %}
- {% UIDataTable ForForm { sRef:'aDeletionExecutionSummary', aColumns:aDeletionExecutionSummary.Columns, aData:aDeletionExecutionSummary.Data} %}{% EndUIDataTable %}
- {% EndUIFieldSet %}
+ {% UIForm Standard {'sId':'launch-setup-form', Action:sLaunchSetupUrl, 'EncType': 'application/x-www-form-urlencoded'} %}
+ {% for sKey, sValue in aSetupParams %}
+ {% UIInput ForHidden { sName:sKey, sValue:sValue } %}
+ {% endfor %}
+ {% UIButton ForPrimaryAction {sLabel:'UI:Button:Setup'|dict_s, sName:'btn_setup', sId:'btn_setup', bIsSubmit:true} %}
+ {% EndUIForm %}
+ {% endif %}
+
+ {% if bHasDeletionExecution %}
+ {% UIFieldSet Standard {sLegend:'DataFeatureRemoval:Execution:Title'|dict_s} %}
+ {% UIDataTable ForForm { sRef:'aDeletionExecutionSummary', aColumns:aDeletionExecutionSummary.Columns, aData:aDeletionExecutionSummary.Data} %}{% EndUIDataTable %}
+ {% EndUIFieldSet %}
+ {% endif %}
{% endif %}
{% UIForm Standard {} %}
diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/DeletionPlan.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/DeletionPlan.html.twig
deleted file mode 100644
index c37bff85a6..0000000000
--- a/datamodels/2.x/combodo-data-feature-removal/templates/DeletionPlan.html.twig
+++ /dev/null
@@ -1,29 +0,0 @@
-{# @copyright Copyright (C) 2010-2026 Combodo SARL #}
-{# @license http://opensource.org/licenses/AGPL-3.0 #}
-
-{% UIPanel ForInformation { sTitle:'DataFeatureRemoval:DeletionPlan:Title'|dict_s, sSubTitle: 'DataFeatureRemoval:DeletionPlan:SubTitle'|dict_format(iQueryCount) } %}
- {% UIDataTable ForForm { sRef:'aDeletionPlanSummary', aColumns:aDeletionPlanSummary.Columns, aData:aDeletionPlanSummary.Data} %}{% EndUIDataTable %}
-{% EndUIPanel %}
-
-{% if bDeletionPossible %}
- {% UIForm Standard {} %}
- {% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
- {% UIInput ForHidden { sName:'operation', sValue:'DoDeletion'} %}
- {% for sKey, sClass in aClasses %}
- {% UIInput ForHidden { sName:"classes[" ~ sKey ~ "]", sValue:sClass } %}
- {% endfor %}
- {% UIToolbar ForButton {} %}
- {% UIButton ForPrimaryAction {sLabel:'UI:Button:DoDeletion'|dict_s, sName:'btn_deletion', sId:'btn_deletion', bIsSubmit:true} %}
- {% EndUIToolbar %}
- {% EndUIForm %}
-{% else %}
- {{ 'DataFeatureRemoval:DeletionPlan:Error:Issues'|dict_s }}
-{% endif %}
-
-{% UIForm Standard {} %}
- {% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
- {% UIInput ForHidden { sName:'operation', sValue:'Main'} %}
- {% UIToolbar ForButton {} %}
- {% UIButton ForPrimaryAction {sLabel:'UI:Button:BackToMain'|dict_s, sName:'btn_back', sId:'btn_back', bIsSubmit:true} %}
- {% EndUIToolbar %}
-{% EndUIForm %}
\ No newline at end of file
diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalData.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalData.html.twig
deleted file mode 100644
index 2cce0e9ff4..0000000000
--- a/datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalData.html.twig
+++ /dev/null
@@ -1,19 +0,0 @@
-{# @copyright Copyright (C) 2010-2024 Combodo SAS #}
-{# @license http://opensource.org/licenses/AGPL-3.0 #}
-
-{% if bHasData %}
- {% UIPanel Neutral { sTitle:'DataFeatureRemoval:Analysis:Title'|dict_s, sSubTitle: 'DataFeatureRemoval:Analysis:SubTitle'|dict_format(iCount) } %}
- {% UIDataTable ForForm { sRef:'aAnalysisDataTable', aColumns:aAnalysisDataTable.Columns, aData:aAnalysisDataTable.Data} %}{% EndUIDataTable %}
- {% EndUIPanel %}
-
- {% UIForm Standard {} %}
- {% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
- {% UIInput ForHidden { sName:'operation', sValue:'DeletionPlan'} %}
- {% for sKey, sClass in aClasses %}
- {% UIInput ForHidden { sName:"classes[" ~ sKey ~ "]", sValue:sClass } %}
- {% endfor %}
- {% UIToolbar ForButton {} %}
- {% UIButton ForPrimaryAction {sLabel:'UI:Button:PlanDeletion'|dict_s, sName:'btn_plandeletion', sId:'btn_plandeletion', bIsSubmit:true} %}
- {% EndUIToolbar %}
- {% EndUIForm %}
-{% endif %}
diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/Features.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/Features.html.twig
index 71b06b6b64..a2c2c84f18 100644
--- a/datamodels/2.x/combodo-data-feature-removal/templates/Features.html.twig
+++ b/datamodels/2.x/combodo-data-feature-removal/templates/Features.html.twig
@@ -3,7 +3,7 @@
{% UIForm Standard {} %}
- {% UIInput ForHidden {sName:'operation', sValue:'Analyze'} %}
+ {% UIInput ForHidden {sName:'operation', sValue:'AnalysisResult'} %}
{% UIInput ForHidden {sName:'transaction_id', sValue:sTransactionId} %}
{% UIPanel Neutral { sTitle:'DataFeatureRemoval:Features:Title'|dict_s, sSubTitle: '' } %}
diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/Main.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/Main.html.twig
index 89c6fa5798..04ae95101c 100644
--- a/datamodels/2.x/combodo-data-feature-removal/templates/Main.html.twig
+++ b/datamodels/2.x/combodo-data-feature-removal/templates/Main.html.twig
@@ -15,21 +15,5 @@
{{ 'DataFeatureRemoval:Helper:Desc2'|dict_s }}
{% EndUIAlert %}
- {% if null != DataFeatureRemovalErrorMessage %}
-
- {% UIAlert ForFailure { sTitle:'DataFeatureRemoval:Failure:Title'|dict_s, sId: 'feature_removal_error_msg', sContent:DataFeatureRemovalErrorMessage } %}
- {% EndUIAlert %}
-
- {% endif %}
-
{% include 'Features.html.twig' %}
- {% include 'ExtensionRemovalData.html.twig' %}
-
- {% if not bHasData %}
- {% UIToolbar ForButton {} %}
-
- {% UIButton ForPrimaryAction {sLabel:'UI:Button:Setup'|dict_s, sName:'btn_setup', sId:'btn_setup', bIsSubmit:false} %}
-
- {% EndUIToolbar %}
- {% endif %}
{% EndUIPanel %}
diff --git a/setup/runtimeenv.class.inc.php b/setup/runtimeenv.class.inc.php
index 25974efb9a..0b592eb81a 100644
--- a/setup/runtimeenv.class.inc.php
+++ b/setup/runtimeenv.class.inc.php
@@ -477,7 +477,7 @@ class RunTimeEnvironment
}
$aModulesToLoad = $this->GetModulesToLoad($this->sFinalEnv, $aDirsToCompile);
- $aAvailableModules = $this->AnalyzeInstallation($oSourceConfig, $aDirsToCompile, false, $aModulesToLoad);
+ $aAvailableModules = $this->AnalyzeInstallation($oSourceConfig, $aDirsToCompile, true, $aModulesToLoad);
// Do load the required modules
//
diff --git a/setup/wizardsteps/WizStepModulesChoice.php b/setup/wizardsteps/WizStepModulesChoice.php
index 08f0a2327d..03bc4cddb3 100644
--- a/setup/wizardsteps/WizStepModulesChoice.php
+++ b/setup/wizardsteps/WizStepModulesChoice.php
@@ -175,11 +175,12 @@ class WizStepModulesChoice extends AbstractWizStepInstall
["class" => "WizStepUpgradeMiscParams","state" => ""],
];
$i = 0;
+ $this->aSteps = null;
while (null != $this->GetStepInfo($i)) {
+ $this->aSteps = null;
$aSteps [] = ["class" => "WizStepModulesChoice","state" => "$i"];
$i++;
}
- $aSteps [] = ["class" => "WizStepModulesChoice","state" => "$i"];
return $aSteps;
}
@@ -709,7 +710,6 @@ EOF
// Found an "installation.xml" file, let's use this definition for the wizard
$aParams = new XMLParameters($this->GetSourceFilePath());
$this->aSteps = $aParams->Get('steps', []);
-
if ($index + 1 >= count($this->aSteps)) {
//make sure we also cache next step as well
$aOptions = $this->oExtensionsMap->GetAllExtensionsOptionInfo($bRemoteExtensionsShouldBeMandatory);
diff --git a/tests/php-unit-tests/unitary-tests/datamodels/2.x/combodo-data-feature-removal/simulate-audit-from-setup.php b/tests/php-unit-tests/unitary-tests/datamodels/2.x/combodo-data-feature-removal/simulate-audit-from-setup.php
index 179bea189c..34d0c7e181 100644
--- a/tests/php-unit-tests/unitary-tests/datamodels/2.x/combodo-data-feature-removal/simulate-audit-from-setup.php
+++ b/tests/php-unit-tests/unitary-tests/datamodels/2.x/combodo-data-feature-removal/simulate-audit-from-setup.php
@@ -15,78 +15,42 @@ $aParams = [
new ContextTag(ContextTag::TAG_SETUP);
$sToken = SetupUtils::CreateSetupToken();
-$aSelectedModules = [
- 'authent-cas',
- 'authent-external',
- 'authent-ldap',
- 'authent-local',
- 'combodo-backoffice-darkmoon-theme',
- 'combodo-backoffice-fullmoon-high-contrast-theme',
- 'combodo-backoffice-fullmoon-protanopia-deuteranopia-theme',
- 'combodo-backoffice-fullmoon-tritanopia-theme',
- 'combodo-data-feature-removal',
- 'itop-backup',
- 'itop-config',
- 'itop-files-information',
- 'itop-portal-base',
- 'itop-profiles-itil',
- 'itop-sla-computation',
- 'itop-structure',
- 'itop-welcome-itil',
- 'itop-config-mgmt',
- 'itop-attachments',
- 'itop-tickets',
- 'combodo-db-tools',
- 'itop-core-update',
- 'itop-hub-connector',
- 'itop-oauth-client',
- 'itop-themes-compat',
- 'combodo-my-account',
- 'combodo-my-account-user-info',
- 'combodo-oauth2-client',
- 'itop-attribute-class-set',
- 'itop-attribute-encrypted-password',
- 'itop-ui-copypaste',
- 'itop-datacenter-mgmt',
- 'itop-endusers-devices',
- 'itop-storage-mgmt',
- 'itop-virtualization-mgmt',
- 'itop-bridge-cmdb-ticket',
- 'itop-bridge-virtualization-storage',
- 'itop-service-mgmt',
- 'itop-bridge-cmdb-services',
- 'itop-bridge-datacenter-mgmt-services',
- 'itop-bridge-endusers-devices-services',
- 'itop-bridge-storage-mgmt-services',
- 'itop-bridge-virtualization-mgmt-services',
- 'itop-request-mgmt',
- 'itop-portal',
- 'itop-change-mgmt',
- 'itop-faq-light',
- 'itop-knownerror-mgmt',
- 'itop-problem-mgmt',
- 'itop-system-information',
- 'itop-log-mgmt',
-];
+function GetLastestInstallFile(): ?string
+{
+ $aFiles = glob(APPROOT.'/log/install-*.xml');
+ rsort($aFiles);
+ $iLatestCtime = 0;
+ $sLastFilePath = null;
+ foreach ($aFiles as $sFilePath) {
+ if (is_file($sFilePath)) {
+ $iCurrentCtime = filemtime($sFilePath);
+ if ($iCurrentCtime > $iLatestCtime) {
+ $iLatestCtime = $iCurrentCtime;
+ $sLastFilePath = $sFilePath;
+ }
+ }
+ }
-$aSelectedExtensions = [
- 'itop-config-mgmt-core',
- 'itop-config-mgmt-datacenter',
- 'itop-config-mgmt-end-user',
- 'itop-config-mgmt-storage',
- 'itop-config-mgmt-virtualization',
- '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',
- 'itop-system-information',
- 'itop-log-mgmt',
-];
+ return $sLastFilePath;
+}
$aRemovedExtensions = ['itop-container-mgmt' => 'Containerization'];
+$sPath = GetLastestInstallFile();
+if (is_null($sPath)) {
+ throw new Exception("$sPath no installation XM. Launch a setup....");
+}
+$aParams = new XMLParameters($sPath);
+$aSelectedModules = array_filter($aParams->Get('selected_modules', []), static function ($element) {
+ global $aRemovedExtensions;
+ return ! array_key_exists($element, $aRemovedExtensions);
+});
+
+$aSelectedExtensions = array_filter($aParams->Get('selected_extensions', []), static function ($element) {
+ global $aRemovedExtensions;
+ return ! array_key_exists($element, $aRemovedExtensions);
+});
+
$aPostParams = [
"auth_user" => 'admin',
"auth_pwd" => 'admin',
diff --git a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php
index 51b8d0f3b5..45ef05f7a6 100644
--- a/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php
+++ b/tests/php-unit-tests/unitary-tests/setup/WizStepModulesChoiceTest.php
@@ -6,7 +6,6 @@ use Combodo\iTop\Test\UnitTest\ItopTestCase;
use iTopExtensionsMap;
use iTopExtensionsMapFake;
use ModuleDiscovery;
-use WepPageFake;
use WizardController;
use WizStepModulesChoiceFake;
use XMLParameters;
@@ -1431,4 +1430,25 @@ HTML,
}
$this->assertEquals($expected, $this->oWizStepModulesChoiceFake->GetWizardSteps());
}
+
+ public function testGetWizardStepsWithoutAnyExtension()
+ {
+ $this->oWizard->SetParameter('source_dir', __DIR__.'/ressources');
+ $oExtensionMap = $this->createMock(iTopExtensionsMap::class);
+ $oExtensionMap->expects(self::any())->method('GetAllExtensionsOptionInfo')->willReturn([]);
+
+ $this->oWizStepModulesChoiceFake->setExtensionMap($oExtensionMap);
+
+ $expected = [
+ ["class" => "WizStepWelcome","state" => ""],
+ ["class" => "WizStepInstallOrUpgrade","state" => ""],
+ ["class" => "WizStepDetectedInfo","state" => ""],
+ ["class" => "WizStepUpgradeMiscParams","state" => ""],
+ ];
+
+ for ($i = 0;$i <= 4; $i++) {
+ $expected [] = ["class" => "WizStepModulesChoice","state" => "".$i];
+ }
+ $this->assertEquals($expected, $this->oWizStepModulesChoiceFake->GetWizardSteps());
+ }
}