From cb46889e92872050280848b91fd364a8310496ae Mon Sep 17 00:00:00 2001
From: Eric Espie
Date: Wed, 6 May 2026 14:35:33 +0200
Subject: [PATCH] =?UTF-8?q?N=C2=B09412=20-=20Display=20Choices=20on=20exte?=
=?UTF-8?q?nsions=20in=20analysis=20results?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../DataFeatureRemovalController.php | 43 ++++++++++++++--
.../src/Service/ObjectServiceSummary.php | 4 +-
.../templates/AnalysisResult.html.twig | 49 +++++++++++--------
setup/wizardsteps/WizStepDataAudit.php | 21 ++++++--
4 files changed, 88 insertions(+), 29 deletions(-)
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 dfdd3d98c3..f7f32be0c8 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
@@ -11,7 +11,6 @@ require_once APPROOT.'setup/feature_removal/SetupAudit.php';
require_once APPROOT.'setup/feature_removal/DryRemovalRuntimeEnvironment.php';
use Combodo\iTop\Application\TwigBase\Controller\Controller;
-use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalConfig;
use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalException;
use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalHelper;
use Combodo\iTop\DataFeatureRemoval\Service\DataCleanupService;
@@ -39,7 +38,7 @@ class DataFeatureRemovalController extends Controller
$this->ReadRemovedExtensions();
$this->AddAnalyzeParams();
$aParams['sTransactionId'] = utils::GetNewTransactionId();
- $aParams['aExtensions'] = $this->GetExtensionsTable();
+ $aParams['aExtensions'] = $this->GetExtensionsTableToSelect();
$aParams['aAnalysisDataTable'] = $this->aAnalysisDataTable;
$aParams['aClasses'] = array_keys($this->aCountClassesToCleanup);
$aParams['DataFeatureRemovalErrorMessage'] = $sErrorMessage;
@@ -110,6 +109,12 @@ class DataFeatureRemovalController extends Controller
$this->ValidateTransactionId();
}
+ // Display changed extensions
+ $aAddedExtensions = utils::ReadPostedParam('aAddedExtensions', []);
+ $aRemovedExtensions = utils::ReadPostedParam('aRemovedExtensions', []);
+
+ IssueLog::Info(__METHOD__.' Extensions given in parameter', null, ['aAddedExtensions' => $aAddedExtensions, 'aRemovedExtensions' => $aRemovedExtensions]);
+
$sSourceEnv = MetaModel::GetEnvironment();
$oSetupAudit = new SetupAudit($sSourceEnv);
$aGetRemovedClasses = array_keys($oSetupAudit->RunDataAudit());
@@ -138,6 +143,9 @@ class DataFeatureRemovalController extends Controller
$aParams['aClasses'] = $aGetRemovedClasses;
$aParams['iQueryCount'] = $iQueryCount;
$aParams['bDeletionPossible'] = !$bHasIssues;
+ $aParams['aAddedExtensions'] = $aAddedExtensions;
+ $aParams['aRemovedExtensions'] = $aRemovedExtensions;
+ $aParams['aExtensions'] = $this->GetExtensionsTableDiff($aAddedExtensions, $aRemovedExtensions);
$this->DisplayPage($aParams);
}
@@ -201,12 +209,41 @@ class DataFeatureRemovalController extends Controller
$this->DisplayPage($aParams);
}
+ private function GetExtensionsTableDiff(array $aAddedExtensions, array $aRemovedExtensions): array
+ {
+ $aExtensions = [];
+ $aColumns = ['', 'Name', 'code', 'Badge' ];
+
+ foreach ($aAddedExtensions as $sAddedExtensionCode => $sAddedExtensionLabel) {
+ $aExtensions[] = [
+ <<
+HTML,
+ $sAddedExtensionLabel,
+ $sAddedExtensionCode,
+ Dict::S('UI:Layout:ExtensionsDetails:BadgeToBeInstalled'),
+ ];
+ }
+ foreach ($aRemovedExtensions as $sAddedExtensionCode => $sAddedExtensionLabel) {
+ $aExtensions[] = [
+ <<
+HTML,
+ $sAddedExtensionLabel,
+ $sAddedExtensionCode,
+ Dict::S('UI:Layout:ExtensionsDetails:BadgeToBeUninstalled'),
+ ];
+ }
+
+ return $this->GetTableData('Extensions', $aColumns, $aExtensions);
+ }
+
/**
* Get installed extensions from disk
*
* @return array structure for twig datatable
*/
- private function GetExtensionsTable(): array
+ private function GetExtensionsTableToSelect(): array
{
$aExtensions = [];
$aColumns = ['', 'Version', 'Name', 'Code'];
diff --git a/datamodels/2.x/combodo-data-feature-removal/src/Service/ObjectServiceSummary.php b/datamodels/2.x/combodo-data-feature-removal/src/Service/ObjectServiceSummary.php
index 0c4b53f1c4..73c428f296 100644
--- a/datamodels/2.x/combodo-data-feature-removal/src/Service/ObjectServiceSummary.php
+++ b/datamodels/2.x/combodo-data-feature-removal/src/Service/ObjectServiceSummary.php
@@ -23,7 +23,7 @@ class ObjectServiceSummary implements iObjectService
public function Update(DBObject $oToUpdate, string $sAttCode, $value): void
{
$sClass = get_class($oToUpdate);
- DataFeatureRemovalLog::Info('Update object', null, ['class' => $sClass, 'id' => $oToUpdate->GetKey(), 'code' => $sAttCode, 'value' => "$value"]);
+ DataFeatureRemovalLog::Info('Object to update', null, ['class' => $sClass, 'id' => $oToUpdate->GetKey(), 'code' => $sAttCode, 'value' => "$value"]);
if (! array_key_exists($sClass, $this->aSummary)) {
$this->aSummary[$sClass] = new DataCleanupSummaryEntity($sClass);
}
@@ -33,7 +33,7 @@ class ObjectServiceSummary implements iObjectService
public function Delete(string $sClass, string $sId): void
{
- DataFeatureRemovalLog::Info('Delete object', null, ['class' => $sClass, 'id' => $sId]);
+ DataFeatureRemovalLog::Info('Object to delete', null, ['class' => $sClass, 'id' => $sId]);
if (!array_key_exists($sClass, $this->aSummary)) {
$this->aSummary[$sClass] = new DataCleanupSummaryEntity($sClass);
}
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 c37bff85a6..053a805ed5 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
@@ -1,29 +1,38 @@
{# @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 %}
+
+{% UIPanel ForInformation { sTitle:'DataFeatureRemoval:Analysis:Title'|dict_s} %}
+
+ {% UIFieldSet Standard {sLegend:'DataFeatureRemoval:Features:Title'|dict_s} %}
+ {% UIDataTable ForForm { sRef:'aExtensions', aColumns:aExtensions.Columns, aData:aExtensions.Data} %}{% EndUIDataTable %}
+ {% EndUIFieldSet %}
+
+ {% 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 %}
+ {% 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:'DoDeletion'} %}
- {% for sKey, sClass in aClasses %}
- {% UIInput ForHidden { sName:"classes[" ~ sKey ~ "]", sValue:sClass } %}
- {% endfor %}
+ {% UIInput ForHidden { sName:'operation', sValue:'Main'} %}
{% UIToolbar ForButton {} %}
- {% UIButton ForPrimaryAction {sLabel:'UI:Button:DoDeletion'|dict_s, sName:'btn_deletion', sId:'btn_deletion', bIsSubmit:true} %}
+ {% UIButton ForPrimaryAction {sLabel:'UI:Button:BackToMain'|dict_s, sName:'btn_back', sId:'btn_back', 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
+{% EndUIPanel %}
diff --git a/setup/wizardsteps/WizStepDataAudit.php b/setup/wizardsteps/WizStepDataAudit.php
index 9ee68c2def..88c25080db 100644
--- a/setup/wizardsteps/WizStepDataAudit.php
+++ b/setup/wizardsteps/WizStepDataAudit.php
@@ -19,7 +19,6 @@
*/
use Combodo\iTop\Application\Helper\Session;
-use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'setup/sequencers/DataAuditSequencer.php');
@@ -101,8 +100,8 @@ JS);
{
$sApplicationUrl = utils::GetAbsoluteUrlModulePage('combodo-data-feature-removal', 'index.php');
- $aRemovedExtensions = json_decode($this->oWizard->GetParameter('removed_extensions', "[]"), true);
- $aHiddenRemovedExtensionInputs = "";
+ $aRemovedExtensions = json_decode($this->oWizard->GetParameter('removed_extensions', '[]'), true);
+ $aHiddenRemovedExtensionInputs = '';
if (!is_array($aRemovedExtensions)) {
IssueLog::Warning('Posted removed_extensions is not an array');
$aRemovedExtensions = [];
@@ -110,7 +109,20 @@ JS);
foreach ($aRemovedExtensions as $sExtCode => $sExtLabel) {
$sSafeExtCode = utils::HtmlEntities($sExtCode);
$aHiddenRemovedExtensionInputs .= <<
+
+INPUT;
+ }
+
+ $aAddedExtensions = json_decode($this->oWizard->GetParameter('extensions_added', "[]"), true);
+ $aHiddenAddedExtensionInputs = "";
+ if (!is_array($aAddedExtensions)) {
+ IssueLog::Warning('Posted extensions_added is not an array');
+ $aAddedExtensions = [];
+ }
+ foreach ($aAddedExtensions as $sExtCode => $sExtLabel) {
+ $sSafeExtCode = utils::HtmlEntities($sExtCode);
+ $aHiddenAddedExtensionInputs .= <<
INPUT;
}
$sUID = Session::Get('setup_token');
@@ -120,6 +132,7 @@ INPUT;
$aHiddenRemovedExtensionInputs
+ $aHiddenAddedExtensionInputs
HTML
);