From 1694603d0a4e1ce4011b39fe377e07d2a05c1246 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 15 Oct 2025 11:10:08 +0200 Subject: [PATCH 01/27] launch, stop pcc min N-1 computation Signed-off-by: SOUISSI Maissa (Externe) --- .../use-all-computing-status.ts | 18 +++++++ src/components/parameters-tabs.tsx | 1 + src/components/run-button-container.jsx | 35 ++++++++++++-- src/components/study-container.jsx | 6 +++ src/components/utils/optional-services.ts | 1 + src/components/utils/running-status.ts | 13 +++++ src/redux/reducer.ts | 2 + src/services/study/pcc-min.ts | 47 +++++++++++++++++++ src/translations/en.json | 3 ++ src/translations/fr.json | 3 ++ src/types/notification-types.ts | 41 ++++++++++++++-- 11 files changed, 164 insertions(+), 6 deletions(-) create mode 100644 src/services/study/pcc-min.ts diff --git a/src/components/computing-status/use-all-computing-status.ts b/src/components/computing-status/use-all-computing-status.ts index 6bfab438bc..11e6bba8dc 100644 --- a/src/components/computing-status/use-all-computing-status.ts +++ b/src/components/computing-status/use-all-computing-status.ts @@ -10,6 +10,7 @@ import { getDynamicSecurityAnalysisRunningStatus, getDynamicSimulationRunningStatus, getLoadFlowRunningStatus, + getPccMinRunningStatus, getSecurityAnalysisRunningStatus, getSensitivityAnalysisRunningStatus, getShortCircuitAnalysisRunningStatus, @@ -33,6 +34,7 @@ import { useOptionalServiceStatus } from '../../hooks/use-optional-service-statu import { fetchStateEstimationStatus } from '../../services/study/state-estimation'; import { fetchDynamicSecurityAnalysisStatus } from '../../services/study/dynamic-security-analysis'; import { NotificationType } from 'types/notification-types'; +import { fetchPccMinStatus } from 'services/study/pcc-min'; // status invalidations const loadFlowStatusInvalidations = [NotificationType.LOADFLOW_STATUS, NotificationType.LOADFLOW_FAILED]; @@ -65,6 +67,7 @@ const stateEstimationStatusInvalidations = [ NotificationType.STATE_ESTIMATION_STATUS, NotificationType.STATE_ESTIMATION_FAILED, ]; +const pccMinStatusInvalidations = [NotificationType.PCC_MIN_STATUS, NotificationType.PCC_MIN_FAILED]; // status completions const loadFlowStatusCompletions = [NotificationType.LOADFLOW_RESULT, NotificationType.LOADFLOW_FAILED]; @@ -97,6 +100,7 @@ const stateEstimationStatusCompletions = [ NotificationType.STATE_ESTIMATION_RESULT, NotificationType.STATE_ESTIMATION_FAILED, ]; +const pccMinStatusCompletions = [NotificationType.PCC_MIN_RESULT, NotificationType.PCC_MIN_FAILED]; // result invalidations export const loadflowResultInvalidations = [NotificationType.LOADFLOW_RESULT]; @@ -115,6 +119,7 @@ export const useAllComputingStatus = (studyUuid: UUID, currentNodeUuid: UUID, cu const voltageInitAvailability = useOptionalServiceStatus(OptionalServicesNames.VoltageInit); const shortCircuitAvailability = useOptionalServiceStatus(OptionalServicesNames.ShortCircuit); const stateEstimationAvailability = useOptionalServiceStatus(OptionalServicesNames.StateEstimation); + const pccMinAvailability = useOptionalServiceStatus(OptionalServicesNames.PccMin); useComputingStatus( studyUuid, @@ -231,4 +236,17 @@ export const useAllComputingStatus = (studyUuid: UUID, currentNodeUuid: UUID, cu undefined, stateEstimationAvailability ); + + useComputingStatus( + studyUuid, + currentNodeUuid, + currentRootNetworkUuid, + fetchPccMinStatus, + pccMinStatusInvalidations, + pccMinStatusCompletions, + getPccMinRunningStatus, + ComputingType.PCC_MIN, + undefined, + pccMinAvailability + ); }; diff --git a/src/components/parameters-tabs.tsx b/src/components/parameters-tabs.tsx index 101ede918b..f657232081 100644 --- a/src/components/parameters-tabs.tsx +++ b/src/components/parameters-tabs.tsx @@ -71,6 +71,7 @@ enum TAB_VALUES { dynamicSecurityAnalysisParamsTabValue = 'DYNAMIC_SECURITY_ANALYSIS', voltageInitParamsTabValue = 'VOLTAGE_INITIALIZATION', stateEstimationTabValue = 'STATE_ESTIMATION', + pccMinTabValue = 'PCC_MIN', networkVisualizationsParams = 'networkVisualizationsParams', } diff --git a/src/components/run-button-container.jsx b/src/components/run-button-container.jsx index 3e6ced24ea..4e2fb58de6 100644 --- a/src/components/run-button-container.jsx +++ b/src/components/run-button-container.jsx @@ -48,6 +48,7 @@ import useComputationDebug from '../hooks/use-computation-debug'; import { PaginationType } from 'types/custom-aggrid-types'; import { usePaginationReset } from 'hooks/use-pagination-selector'; import { useLogsPaginationResetByType } from './report-viewer/use-logs-pagination'; +import { startPccMin, stopPccMin } from 'services/study/pcc-min'; const checkDynamicSimulationParameters = (studyUuid) => { return fetchDynamicSimulationParameters(studyUuid).then((params) => { @@ -94,6 +95,7 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU ); const voltageInitStatus = useSelector((state) => state.computingStatus[ComputingType.VOLTAGE_INITIALIZATION]); const stateEstimationStatus = useSelector((state) => state.computingStatus[ComputingType.STATE_ESTIMATION]); + const pccMinStatus = useSelector((state) => state.computingStatus[ComputingType.PCC_MIN]); const [showContingencyListSelector, setShowContingencyListSelector] = useState(false); @@ -120,6 +122,7 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU const voltageInitAvailability = useOptionalServiceStatus(OptionalServicesNames.VoltageInit); const shortCircuitAvailability = useOptionalServiceStatus(OptionalServicesNames.ShortCircuit); const stateEstimationAvailability = useOptionalServiceStatus(OptionalServicesNames.StateEstimation); + const pccMinAvailability = useOptionalServiceStatus(OptionalServicesNames.PccMin); const resetSecurityAnalysisPagination = usePaginationReset(PaginationType.SecurityAnalysis); const resetSensitivityAnalysisPagination = usePaginationReset(PaginationType.SensitivityAnalysis); @@ -489,6 +492,27 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU ); }, }, + + [ComputingType.PCC_MIN]: { + messageId: 'PccMin', + startComputation() { + startComputationAsync( + ComputingType.PCC_MIN, + null, + () => { + return startPccMin(studyUuid, currentNode?.id, currentRootNetworkUuid); + }, + () => {}, + null, + 'startPccMinError' + ); + }, + actionOnRunnable() { + actionOnRunnables(ComputingType.PCC_MIN, () => + stopPccMin(studyUuid, currentNode?.id, currentRootNetworkUuid) + ); + }, + }, }; }, [ dispatch, @@ -524,6 +548,8 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU return voltageInitStatus; case ComputingType.STATE_ESTIMATION: return stateEstimationStatus; + case ComputingType.PCC_MIN: + return pccMinStatus; default: return null; } @@ -538,6 +564,7 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU dynamicSecurityAnalysisStatus, voltageInitStatus, stateEstimationStatus, + pccMinStatus, ] ); @@ -561,16 +588,18 @@ export function RunButtonContainer({ studyUuid, currentNode, currentRootNetworkU ...(stateEstimationAvailability === OptionalServicesStatus.Up && enableDeveloperMode ? [ComputingType.STATE_ESTIMATION] : []), + ...(pccMinAvailability === OptionalServicesStatus.Up && enableDeveloperMode ? [ComputingType.PCC_MIN] : []), ]; }, [ - dynamicSimulationAvailability, - dynamicSecurityAnalysisAvailability, securityAnalysisAvailability, sensitivityAnalysisUnavailability, shortCircuitAvailability, + dynamicSimulationAvailability, + enableDeveloperMode, + dynamicSecurityAnalysisAvailability, voltageInitAvailability, stateEstimationAvailability, - enableDeveloperMode, + pccMinAvailability, ]); return ( diff --git a/src/components/study-container.jsx b/src/components/study-container.jsx index 5132abe61a..7fddad876f 100644 --- a/src/components/study-container.jsx +++ b/src/components/study-container.jsx @@ -218,6 +218,12 @@ export function StudyContainer({ view, onChangeTab }) { messageTxt: errorMessage, }); } + if (updateTypeHeader === NotificationType.PCC_MIN_FAILED) { + snackError({ + headerId: 'pccMinError', + messageTxt: errorMessage, + }); + } }, [snackError, userName] ); diff --git a/src/components/utils/optional-services.ts b/src/components/utils/optional-services.ts index da7c028d9c..e368f7df42 100644 --- a/src/components/utils/optional-services.ts +++ b/src/components/utils/optional-services.ts @@ -13,6 +13,7 @@ export enum OptionalServicesNames { ShortCircuit = 'ShortCircuit', VoltageInit = 'VoltageInit', StateEstimation = 'StateEstimation', + PccMin = 'PccMin', } export enum OptionalServicesStatus { Up = 'UP', diff --git a/src/components/utils/running-status.ts b/src/components/utils/running-status.ts index 41066508d8..35c8e0bde0 100644 --- a/src/components/utils/running-status.ts +++ b/src/components/utils/running-status.ts @@ -131,3 +131,16 @@ export function getStateEstimationRunningStatus(stateEstimationStatus: string | return RunningStatus.IDLE; } } + +export function getPccMinRunningStatus(pccMinStatus: string | null): RunningStatus { + switch (pccMinStatus) { + case 'COMPLETED': + return RunningStatus.SUCCEED; + case 'RUNNING': + return RunningStatus.RUNNING; + case 'NOT_DONE': + return RunningStatus.IDLE; + default: + return RunningStatus.IDLE; + } +} diff --git a/src/redux/reducer.ts b/src/redux/reducer.ts index 05bbc21363..fad83ca2cf 100644 --- a/src/redux/reducer.ts +++ b/src/redux/reducer.ts @@ -442,6 +442,7 @@ export interface ComputingStatus { [ComputingType.DYNAMIC_SECURITY_ANALYSIS]: RunningStatus; [ComputingType.VOLTAGE_INITIALIZATION]: RunningStatus; [ComputingType.STATE_ESTIMATION]: RunningStatus; + [ComputingType.PCC_MIN]: RunningStatus; } export interface LoadFlowStatusParameters { @@ -811,6 +812,7 @@ const initialState: AppState = { [ComputingType.DYNAMIC_SECURITY_ANALYSIS]: RunningStatus.IDLE, [ComputingType.VOLTAGE_INITIALIZATION]: RunningStatus.IDLE, [ComputingType.STATE_ESTIMATION]: RunningStatus.IDLE, + [ComputingType.PCC_MIN]: RunningStatus.IDLE, }, computingStatusParameters: { [ComputingType.LOAD_FLOW]: null, diff --git a/src/services/study/pcc-min.ts b/src/services/study/pcc-min.ts new file mode 100644 index 0000000000..39082ea68d --- /dev/null +++ b/src/services/study/pcc-min.ts @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { getStudyUrlWithNodeUuidAndRootNetworkUuid } from './index'; +import { backendFetch, backendFetchText } from '../utils'; +import type { UUID } from 'node:crypto'; + +export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID): Promise { + console.info( + `Running pccMin on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` + ); + const url = + getStudyUrlWithNodeUuidAndRootNetworkUuid(studyUuid, currentNodeUuid, currentRootNetworkUuid) + '/pcc-min/run'; + + console.debug(url); + return backendFetch(url, { method: 'post' }); +} + +export function stopPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID) { + console.info( + `Stopping pccMin on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` + ); + const url = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( + studyUuid, + currentNodeUuid, + currentRootNetworkUuid + )}/pcc-min/stop`; + console.debug(url); + return backendFetch(url, { method: 'put' }); +} + +export function fetchPccMinStatus(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID) { + console.info( + `Fetching pccMin status on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` + ); + const url = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( + studyUuid, + currentNodeUuid, + currentRootNetworkUuid + )}/pcc-min/status`; + console.debug(url); + return backendFetchText(url); +} diff --git a/src/translations/en.json b/src/translations/en.json index cd1264809c..89e84ba4c2 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1392,6 +1392,9 @@ "StateEstimation": "State estimation", "startStateEstmationError": "An error occurred while launching the state estimation", "stateEstimationError": "An error occurred when executing the state estimation", + "PccMin": "Pcc min N-1", + "startPccMinError": "An error occurred while launching the pcc min", + "pccMinError": "An error occurred when executing the pcc min", "NoFilter": "No filter", "searchPlaceholder": "Search", "searchPlaceholderLog": "Search in Logs", diff --git a/src/translations/fr.json b/src/translations/fr.json index 99944f20a0..10eb1f9a02 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -1392,6 +1392,9 @@ "StateEstimation": "Estimation d'état", "startStateEstimationError": "Une erreur est survenue lors du lancement de l'estimation d'état", "stateEstimationError": "Une erreur est survenue lors de l'exécution de l'estimation d'état", + "PccMin": "Pcc min N-1", + "startPccMinError": "Une erreur est survenue lors du lancement de pccMin", + "pccMinError": "Une erreur est survenue lors de l'exécution de pccMin", "NoFilter": "Aucun filtre", "searchPlaceholder": "Recherche", "searchPlaceholderLog": "Rechercher dans les Logs", diff --git a/src/types/notification-types.ts b/src/types/notification-types.ts index ed81c9ba7e..d0f157fd9f 100644 --- a/src/types/notification-types.ts +++ b/src/types/notification-types.ts @@ -79,6 +79,9 @@ export enum NotificationType { STATE_ESTIMATION_RESULT = 'stateEstimationResult', STATE_ESTIMATION_FAILED = 'stateEstimation_failed', STATE_ESTIMATION_STATUS = 'stateEstimation_status', + PCC_MIN_RESULT = 'pccMinResult', + PCC_MIN_FAILED = 'pccMin_failed', + PCC_MIN_STATUS = 'pccMin_status', // spreadsheets SPREADSHEET_NODE_ALIASES_UPDATED = 'nodeAliasesUpdated', @@ -126,7 +129,7 @@ export const MODIFYING_NODE_NOTIFICATION_TYPES = [ NotificationType.NODE_BUILD_FAILED, ] as NotificationType[]; -export const COMPUTATION_NOTIFIACTION_TYPES = [ +export const COMPUTATION_NOTIFICATION_TYPES = [ NotificationType.LOADFLOW_RESULT, NotificationType.LOADFLOW_FAILED, NotificationType.LOADFLOW_STATUS, @@ -155,6 +158,9 @@ export const COMPUTATION_NOTIFIACTION_TYPES = [ NotificationType.STATE_ESTIMATION_RESULT, NotificationType.STATE_ESTIMATION_FAILED, NotificationType.STATE_ESTIMATION_STATUS, + NotificationType.PCC_MIN_RESULT, + NotificationType.PCC_MIN_FAILED, + NotificationType.PCC_MIN_STATUS, ] as NotificationType[]; export enum RootNetworkIndexationStatus { @@ -494,7 +500,16 @@ interface StateEstimationFailedEventDataHeaders extends ComputationFailedEventDa interface StateEstimationStatusEventDataHeaders extends ComputationStatusEventDataHeaders { updateType: NotificationType.STATE_ESTIMATION_STATUS; } +interface PccMinStatusEventDataHeaders extends ComputationStatusEventDataHeaders { + updateType: NotificationType.PCC_MIN_STATUS; +} +interface PccMinResultEventDataHeaders extends ComputationResultEventDataHeaders { + updateType: NotificationType.PCC_MIN_RESULT; +} +interface PccMinFailedEventDataHeaders extends ComputationFailedEventDataHeaders { + updateType: NotificationType.PCC_MIN_FAILED; +} // Payloads export interface DeletedEquipment { equipmentId: string; @@ -820,6 +835,19 @@ export interface StateEstimationStatusEventData { payload: undefined; } +export interface PccMinResultEventData { + headers: PccMinResultEventDataHeaders; + payload: undefined; +} +export interface PccMinFailedEventData { + headers: PccMinFailedEventDataHeaders; + payload: undefined; +} + +export interface PccMinStatusEventData { + headers: PccMinStatusEventDataHeaders; + payload: undefined; +} export interface SpreadsheetParametersUpdatedEventData extends Omit { headers: SpreadsheetParametersUpdatedDataHeaders; /** @@ -850,6 +878,10 @@ export function isStateEstimationResultNotification(notif: unknown): notif is St return (notif as StateEstimationResultEventData).headers?.updateType === NotificationType.STATE_ESTIMATION_RESULT; } +export function isPccMinResultNotification(notif: unknown): notif is PccMinResultEventData { + return (notif as PccMinResultEventData).headers?.updateType === NotificationType.PCC_MIN_RESULT; +} + export function isRootNetworkDeletionStartedNotification(notif: unknown): notif is RootNetworkDeletionStartedEventData { return ( (notif as RootNetworkDeletionStartedEventData).headers?.updateType === @@ -1012,10 +1044,13 @@ export type ComputationEventData = | VoltageInitStatusEventData | StateEstimationResultEventData | StateEstimationFailedEventData - | StateEstimationStatusEventData; + | StateEstimationStatusEventData + | PccMinResultEventData + | PccMinFailedEventData + | PccMinStatusEventData; export function isComputationNotification(notif: unknown): notif is ComputationEventData { - return COMPUTATION_NOTIFIACTION_TYPES.includes((notif as CommonStudyEventData).headers?.updateType); + return COMPUTATION_NOTIFICATION_TYPES.includes((notif as CommonStudyEventData).headers?.updateType); } export function isIndexationStatusNotification(notif: unknown): notif is IndexationStatusEventData { From 514fff3cd2dfa1d3a2c005b9f7f8843f48460c0a Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Tue, 21 Oct 2025 16:52:59 +0200 Subject: [PATCH 02/27] fix Signed-off-by: SOUISSI Maissa (Externe) --- src/redux/reducer.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/redux/reducer.ts b/src/redux/reducer.ts index a00ac901d2..410e37906e 100644 --- a/src/redux/reducer.ts +++ b/src/redux/reducer.ts @@ -666,6 +666,7 @@ const initialLogsFilterState: LogsFilterState = { [COMPUTING_AND_NETWORK_MODIFICATION_TYPE.DYNAMIC_SECURITY_ANALYSIS]: [], [COMPUTING_AND_NETWORK_MODIFICATION_TYPE.VOLTAGE_INITIALIZATION]: [], [COMPUTING_AND_NETWORK_MODIFICATION_TYPE.STATE_ESTIMATION]: [], + [COMPUTING_AND_NETWORK_MODIFICATION_TYPE.PCC_MIN]: [], }; const initialLogsPaginationState: LogsPaginationState = { @@ -679,6 +680,7 @@ const initialLogsPaginationState: LogsPaginationState = { [COMPUTING_AND_NETWORK_MODIFICATION_TYPE.DYNAMIC_SECURITY_ANALYSIS]: { ...DEFAULT_LOGS_PAGINATION }, [COMPUTING_AND_NETWORK_MODIFICATION_TYPE.VOLTAGE_INITIALIZATION]: { ...DEFAULT_LOGS_PAGINATION }, [COMPUTING_AND_NETWORK_MODIFICATION_TYPE.STATE_ESTIMATION]: { ...DEFAULT_LOGS_PAGINATION }, + [COMPUTING_AND_NETWORK_MODIFICATION_TYPE.PCC_MIN]: { ...DEFAULT_LOGS_PAGINATION }, }; const emptySpreadsheetEquipmentsByNodes: SpreadsheetEquipmentsByNodes = { From b4cb57e5b8fdd40b4fa109517a905292d33c44ac Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 22 Oct 2025 15:01:37 +0200 Subject: [PATCH 03/27] asjust Signed-off-by: SOUISSI Maissa (Externe) --- src/components/utils/optional-services.ts | 2 ++ src/types/notification-types.ts | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/utils/optional-services.ts b/src/components/utils/optional-services.ts index e368f7df42..b990f60e1a 100644 --- a/src/components/utils/optional-services.ts +++ b/src/components/utils/optional-services.ts @@ -41,6 +41,8 @@ const getOptionalServiceByServerName = (serverName: string): OptionalServicesNam return OptionalServicesNames.VoltageInit; case 'state-estimation-server': return OptionalServicesNames.StateEstimation; + case 'pcc-min-server': + return OptionalServicesNames.PccMin; default: return; } diff --git a/src/types/notification-types.ts b/src/types/notification-types.ts index d0f157fd9f..d0d9909755 100644 --- a/src/types/notification-types.ts +++ b/src/types/notification-types.ts @@ -1135,7 +1135,10 @@ export type StudyUpdateEventData = | VoltageInitStatusEventData | StateEstimationResultEventData | StateEstimationFailedEventData - | StateEstimationStatusEventData; + | StateEstimationStatusEventData + | PccMinResultEventData + | PccMinFailedEventData + | PccMinStatusEventData; export type StudyUpdateNotification = { eventData: StudyUpdateEventData; From 958e9a7c015469c3cb70fa3692b6b1c480a6436f Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 22 Oct 2025 15:05:12 +0200 Subject: [PATCH 04/27] imports Signed-off-by: SOUISSI Maissa (Externe) --- src/services/study/pcc-min.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/services/study/pcc-min.ts b/src/services/study/pcc-min.ts index 39082ea68d..5121579dc9 100644 --- a/src/services/study/pcc-min.ts +++ b/src/services/study/pcc-min.ts @@ -6,12 +6,12 @@ */ import { getStudyUrlWithNodeUuidAndRootNetworkUuid } from './index'; -import { backendFetch, backendFetchText } from '../utils'; +import { backendFetch, backendFetchText } from '@gridsuite/commons-ui'; import type { UUID } from 'node:crypto'; -export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID): Promise { +export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID): Promise { console.info( - `Running pccMin on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` + `Running pcc min on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` ); const url = getStudyUrlWithNodeUuidAndRootNetworkUuid(studyUuid, currentNodeUuid, currentRootNetworkUuid) + '/pcc-min/run'; @@ -22,7 +22,7 @@ export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootN export function stopPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID) { console.info( - `Stopping pccMin on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` + `Stopping pcc min on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` ); const url = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( studyUuid, @@ -35,7 +35,7 @@ export function stopPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNe export function fetchPccMinStatus(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID) { console.info( - `Fetching pccMin status on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` + `Fetching pcc min status on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` ); const url = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( studyUuid, From 30b00a196a8db1469dc2eb3ada1c3dafe11e781d Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 22 Oct 2025 15:28:57 +0200 Subject: [PATCH 05/27] add pcc min results and logs Signed-off-by: SOUISSI Maissa (Externe) --- .../use-all-computing-status.ts | 1 + src/components/graph/tree-node.type.ts | 1 + src/components/result-view-tab.tsx | 40 ++++-- .../results/pccmin/pcc-min-result-tab.tsx | 107 ++++++++++++++++ .../results/pccmin/pcc-min-result-utils.ts | 49 ++++++++ .../results/pccmin/pcc-min-result.type.ts | 41 +++++++ .../results/pccmin/pcc-min-results.tsx | 115 ++++++++++++++++++ src/hooks/use-computation-results-count.ts | 5 + src/services/study/pcc-min.ts | 26 +++- src/translations/en.json | 6 +- src/translations/fr.json | 6 +- 11 files changed, 380 insertions(+), 17 deletions(-) create mode 100644 src/components/results/pccmin/pcc-min-result-tab.tsx create mode 100644 src/components/results/pccmin/pcc-min-result-utils.ts create mode 100644 src/components/results/pccmin/pcc-min-result.type.ts create mode 100644 src/components/results/pccmin/pcc-min-results.tsx diff --git a/src/components/computing-status/use-all-computing-status.ts b/src/components/computing-status/use-all-computing-status.ts index 11e6bba8dc..594e203977 100644 --- a/src/components/computing-status/use-all-computing-status.ts +++ b/src/components/computing-status/use-all-computing-status.ts @@ -109,6 +109,7 @@ export const dynamicSimulationResultInvalidations = [NotificationType.DYNAMIC_SI export const dynamicSecurityAnalysisResultInvalidations = [NotificationType.DYNAMIC_SECURITY_ANALYSIS_RESULT]; export const voltageInitResultInvalidations = [NotificationType.VOLTAGE_INIT_RESULT]; export const stateEstimationResultInvalidations = [NotificationType.STATE_ESTIMATION_RESULT]; +export const pccMinResultInvalidations = [NotificationType.PCC_MIN_RESULT]; // this hook loads all current computation status into redux then keeps them up to date according to notifications export const useAllComputingStatus = (studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID): void => { diff --git a/src/components/graph/tree-node.type.ts b/src/components/graph/tree-node.type.ts index 5780375424..c3245fdafb 100644 --- a/src/components/graph/tree-node.type.ts +++ b/src/components/graph/tree-node.type.ts @@ -60,6 +60,7 @@ export type NetworkModificationNodeData = AbstractNode & { sensitivityAnalysisResultUuid?: UUID; dynamicSimulationResultUuid?: UUID; stateEstimationResultUuid?: UUID; + pccMinResultUuid?: UUID; nodeBuildStatus?: NodeBuildStatus; nodeType?: NetworkModificationNodeType; }; diff --git a/src/components/result-view-tab.tsx b/src/components/result-view-tab.tsx index a99117dfde..4bab96d56a 100644 --- a/src/components/result-view-tab.tsx +++ b/src/components/result-view-tab.tsx @@ -29,6 +29,7 @@ import { ComputingType, type MuiStyles, usePrevious } from '@gridsuite/commons-u import { useParameterState } from './dialogs/parameters/use-parameters-state'; import { IService } from './result-view-tab.type'; import { CurrentTreeNode } from './graph/tree-node.type'; +import { PccMinResultTab } from './results/pccmin/pcc-min-result-tab'; const styles = { table: { @@ -85,6 +86,7 @@ export const ResultViewTab: FunctionComponent = ({ const voltageInitAvailability = useOptionalServiceStatus(OptionalServicesNames.VoltageInit); const shortCircuitAvailability = useOptionalServiceStatus(OptionalServicesNames.ShortCircuit); const stateEstimationAvailability = useOptionalServiceStatus(OptionalServicesNames.StateEstimation); + const pccMinAvailability = useOptionalServiceStatus(OptionalServicesNames.PccMin); const renderLoadFlowResult = useMemo(() => { return ( @@ -186,6 +188,18 @@ export const ResultViewTab: FunctionComponent = ({ ); }, [studyUuid, currentNode, currentRootNetworkUuid]); + const renderPccMinResult = useMemo(() => { + return ( + + + + ); + }, [currentNode?.id, currentRootNetworkUuid, studyUuid]); + const services: IService[] = useMemo(() => { return [ { @@ -236,24 +250,32 @@ export const ResultViewTab: FunctionComponent = ({ displayed: enableDeveloperMode && stateEstimationAvailability === OptionalServicesStatus.Up, renderResult: renderStateEstimationResult, }, + { + id: 'PccMin', + computingType: [ComputingType.PCC_MIN], + displayed: enableDeveloperMode && pccMinAvailability === OptionalServicesStatus.Up, + renderResult: renderPccMinResult, + }, ].filter(({ displayed }: IService) => displayed); }, [ - sensitivityAnalysisUnavailability, + renderLoadFlowResult, securityAnalysisAvailability, - dynamicSimulationAvailability, - dynamicSecurityAnalysisAvailability, - voltageInitAvailability, + renderSecurityAnalysisResult, + sensitivityAnalysisUnavailability, + renderSensitivityAnalysisResult, shortCircuitAvailability, - stateEstimationAvailability, + renderShortCircuitAnalysisResult, enableDeveloperMode, + dynamicSimulationAvailability, renderDynamicSimulationResult, + dynamicSecurityAnalysisAvailability, renderDynamicSecurityAnalysisResult, - renderSecurityAnalysisResult, - renderSensitivityAnalysisResult, - renderShortCircuitAnalysisResult, + voltageInitAvailability, renderVoltageInitResult, - renderLoadFlowResult, + stateEstimationAvailability, renderStateEstimationResult, + pccMinAvailability, + renderPccMinResult, ]); const resultTabIndexRedirection = useMemo( diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx new file mode 100644 index 0000000000..cd17353c62 --- /dev/null +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -0,0 +1,107 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { FunctionComponent, SyntheticEvent, useMemo, useState } from 'react'; +import Tabs from '@mui/material/Tabs'; +import Tab from '@mui/material/Tab'; +import Box from '@mui/material/Box'; +import { FormattedMessage, useIntl } from 'react-intl/lib'; +import RunningStatus from 'components/utils/running-status'; +import { AppState } from 'redux/reducer'; +import { ComputingType, type MuiStyles } from '@gridsuite/commons-ui'; +import { useSelector } from 'react-redux'; +import GlassPane from '../common/glass-pane'; + +import { ComputationReportViewer } from '../common/computation-report-viewer'; +import { useNodeData } from 'components/use-node-data'; +import { PccMinTabProps } from './pcc-min-result.type'; +import { fetchPccMinResult } from 'services/study/pcc-min'; +import { pccMinResultInvalidations } from 'components/computing-status/use-all-computing-status'; +import { pccMinResultColumnsDefinition } from './pcc-min-result-utils'; +import { PccMinResults } from './pcc-min-results'; + +const styles = { + flexWrapper: { + display: 'flex', + }, + flexElement: { + flexGrow: 0, + }, + show: { + display: 'inherit', + }, + hide: { + display: 'none', + }, + emptySpace: { + flexGrow: 1, + }, +} as const satisfies MuiStyles; + +export const PccMinResultTab: FunctionComponent = ({ studyUuid, nodeUuid, currentRootNetworkUuid }) => { + const intl = useIntl(); + + const [tabIndex, setTabIndex] = useState(0); + const PccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); + + const { result: PccMinResult, isLoading: isLoadingResult } = useNodeData({ + studyUuid, + nodeUuid, + rootNetworkUuid: currentRootNetworkUuid, + fetcher: fetchPccMinResult, + invalidations: pccMinResultInvalidations, + }); + + const pccMinColumns = useMemo(() => { + return pccMinResultColumnsDefinition(intl); + }, [intl]); + + const handleTabChange = (_event: SyntheticEvent, newTabIndex: number) => { + setTabIndex(newTabIndex); + }; + + const result = useMemo(() => { + if (PccMinStatus !== RunningStatus.SUCCEED || !PccMinResult) { + return {}; + } + return PccMinResult; + }, [PccMinStatus, PccMinResult]); + + const renderReportViewer = () => { + return ( + + {(PccMinStatus === RunningStatus.SUCCEED || PccMinStatus === RunningStatus.FAILED) && ( + + )} + + ); + }; + + return ( + <> + + + } /> + } /> + + + + + {tabIndex === 0 && ( + + + + )} + {tabIndex === 1 && renderReportViewer()} + + ); +}; diff --git a/src/components/results/pccmin/pcc-min-result-utils.ts b/src/components/results/pccmin/pcc-min-result-utils.ts new file mode 100644 index 0000000000..29104d3310 --- /dev/null +++ b/src/components/results/pccmin/pcc-min-result-utils.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { IntlShape } from 'react-intl'; +import { ColDef } from 'ag-grid-community'; +import { makeAgGridCustomHeaderColumn } from 'components/custom-aggrid/utils/custom-aggrid-header-utils'; + +export const pccMinResultColumnsDefinition = (intl: IntlShape): ColDef[] => { + return [ + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Bus' }), + colId: 'busId', + field: 'busId', + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'PccMinTri' }), + colId: 'pccMinTri', + field: 'pccMinTri', + context: { numeric: true, fractionDigits: 2 }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'IccMin' }), + colId: 'iccMinTri', + field: 'iccMinTri', + context: { numeric: true, fractionDigits: 2 }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Contingency' }), + colId: 'limitingEquipment', + field: 'limitingEquipment', + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'xOhm' }), + colId: 'x', + field: 'x', + context: { numeric: true, fractionDigits: 2 }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'rOhm' }), + colId: 'r', + field: 'r', + context: { numeric: true, fractionDigits: 2 }, + }), + ]; +}; diff --git a/src/components/results/pccmin/pcc-min-result.type.ts b/src/components/results/pccmin/pcc-min-result.type.ts new file mode 100644 index 0000000000..5062a50d06 --- /dev/null +++ b/src/components/results/pccmin/pcc-min-result.type.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { ColDef } from 'ag-grid-community'; +import type { UUID } from 'node:crypto'; + +export interface PccMinResult { + resultUuid: UUID; + writeTimeStamp: Date; + singlePccMinResultInfos: SinglePccMinResultInfos[]; +} +export interface SinglePccMinResultInfos { + singlePccMinResultUuid: string; + busId: String; + pccMinTri: number; + limitingEquipment: String; + x: number; + r: number; +} + +export interface PccMinTabProps { + studyUuid: UUID; + nodeUuid: UUID; + currentRootNetworkUuid: UUID; +} + +export interface PccMinResultTableProps { + isLoadingResult: boolean; + columnDefs: ColDef[]; + tableName: string; +} + +export interface PccMinResultStatusProps { + result: PccMinResult; +} + +export interface PccMinResultProps extends PccMinResultTableProps, PccMinResultStatusProps {} diff --git a/src/components/results/pccmin/pcc-min-results.tsx b/src/components/results/pccmin/pcc-min-results.tsx new file mode 100644 index 0000000000..df9a90f1fe --- /dev/null +++ b/src/components/results/pccmin/pcc-min-results.tsx @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +import { FunctionComponent, useCallback, useMemo, useRef } from 'react'; + +import { useIntl } from 'react-intl'; +import { useSelector } from 'react-redux'; +import { Box, useTheme } from '@mui/material'; +import { GridReadyEvent, RowClassParams } from 'ag-grid-community'; + +import { ComputingType } from '@gridsuite/commons-ui'; +import { AppState } from '../../../redux/reducer'; + +import { getNoRowsMessage, getRows, useIntlResultStatusMessages } from '../../utils/aggrid-rows-handler'; +import { DefaultCellRenderer } from '../../custom-aggrid/cell-renderers'; + +import LinearProgress from '@mui/material/LinearProgress'; +import { RunningStatus } from '../../utils/running-status'; +import { useOpenLoaderShortWait } from '../../dialogs/commons/handle-loader'; +import { RESULTS_LOADING_DELAY } from '../../network/constants'; +import { RenderTableAndExportCsv } from '../../utils/renderTable-ExportCsv'; +import { AgGridReact } from 'ag-grid-react'; +import { PccMinResultProps } from './pcc-min-result.type'; + +export const PccMinResults: FunctionComponent = ({ + result, + isLoadingResult, + columnDefs, + tableName, +}) => { + const theme = useTheme(); + const intl = useIntl(); + const gridRef = useRef(null); + + const tableNameFormatted = intl.formatMessage({ id: tableName }); + + const PccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); + + //We give each tab its own loader, so we don't have a loader spinning because another tab is still doing some work + const openLoaderTab = useOpenLoaderShortWait({ + isLoading: + // We want the loader to start when the state estimation begins + PccMinStatus === RunningStatus.RUNNING || + // We still want the loader to be displayed for the remaining time there is between "the state estimation is over" + // and "the data is post processed and can be displayed" + PccMinStatus === RunningStatus.SUCCEED || + isLoadingResult, + delay: RESULTS_LOADING_DELAY, + }); + + const getRowStyle = useCallback( + (params: RowClassParams) => { + if (params?.data?.elementId) { + return { + backgroundColor: theme.selectedRow.background, + }; + } + }, + [theme.selectedRow.background] + ); + + const onRowDataUpdated = useCallback((params: any) => { + if (params.api) { + params.api.sizeColumnsToFit(); + } + }, []); + + const onGridReady = useCallback(({ api }: GridReadyEvent) => { + api?.sizeColumnsToFit(); + }, []); + const messages = useIntlResultStatusMessages(intl, true); + + const defaultColDef = useMemo( + () => ({ + filter: false, + sortable: false, + resizable: true, + lockPinned: true, + suppressMovable: true, + wrapHeaderText: true, + autoHeaderHeight: true, + flex: 1, + cellRenderer: DefaultCellRenderer, + }), + [] + ); + + const renderPccMinResults = () => { + const message = getNoRowsMessage(messages, result.singlePccMinResultInfos, PccMinStatus, !isLoadingResult); + const rowsToShow = getRows(result.singlePccMinResultInfos, PccMinStatus); + + return ( + <> + {openLoaderTab && } + + + ); + }; + + return renderPccMinResults(); +}; diff --git a/src/hooks/use-computation-results-count.ts b/src/hooks/use-computation-results-count.ts index 3a36489787..6f6499f66a 100644 --- a/src/hooks/use-computation-results-count.ts +++ b/src/hooks/use-computation-results-count.ts @@ -50,6 +50,7 @@ export const useComputationResultsCount = () => { const stateEstimationStatus = useSelector( (state: AppState) => state.computingStatus[ComputingType.STATE_ESTIMATION] ); + const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); const [enableDeveloperMode] = useParameterState(PARAM_DEVELOPER_MODE); @@ -79,6 +80,9 @@ export const useComputationResultsCount = () => { enableDeveloperMode && (stateEstimationStatus === RunningStatus.SUCCEED || stateEstimationStatus === RunningStatus.FAILED); // Can be failed for technical reasons (e.g., server not responding or computation divergence) + const pccMinResultPresent = + enableDeveloperMode && (pccMinStatus === RunningStatus.SUCCEED || pccMinStatus === RunningStatus.FAILED); // Can be failed for technical reasons (e.g., server not responding or computation divergence) + return [ loadflowResultPresent, saResutPresent, @@ -89,5 +93,6 @@ export const useComputationResultsCount = () => { dynamicSimulationResultPresent, dynamicSecurityAnalysisResultPresent, stateEstimationResultPresent, + pccMinResultPresent, ].filter(Boolean).length; }; diff --git a/src/services/study/pcc-min.ts b/src/services/study/pcc-min.ts index 39082ea68d..714c8d2ee2 100644 --- a/src/services/study/pcc-min.ts +++ b/src/services/study/pcc-min.ts @@ -1,17 +1,17 @@ /** - * Copyright (c) 2025, RTE (http://www.rte-france.com) + * Copyright (c) 2024, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { getStudyUrlWithNodeUuidAndRootNetworkUuid } from './index'; -import { backendFetch, backendFetchText } from '../utils'; +import { backendFetch, backendFetchJson, backendFetchText } from '@gridsuite/commons-ui'; import type { UUID } from 'node:crypto'; -export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID): Promise { +export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID): Promise { console.info( - `Running pccMin on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` + `Running pcc min on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` ); const url = getStudyUrlWithNodeUuidAndRootNetworkUuid(studyUuid, currentNodeUuid, currentRootNetworkUuid) + '/pcc-min/run'; @@ -22,7 +22,7 @@ export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootN export function stopPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID) { console.info( - `Stopping pccMin on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` + `Stopping pcc min on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` ); const url = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( studyUuid, @@ -35,7 +35,7 @@ export function stopPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNe export function fetchPccMinStatus(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID) { console.info( - `Fetching pccMin status on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` + `Fetching pcc min status on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` ); const url = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( studyUuid, @@ -45,3 +45,17 @@ export function fetchPccMinStatus(studyUuid: UUID, currentNodeUuid: UUID, curren console.debug(url); return backendFetchText(url); } + +export function fetchPccMinResult(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID) { + console.info( + `Fetching pcc min result on ${studyUuid} on root network ${currentRootNetworkUuid} and node ${currentNodeUuid} ...` + ); + + const url = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( + studyUuid, + currentNodeUuid, + currentRootNetworkUuid + )}/pcc-min/result`; + console.debug(url); + return backendFetchJson(url); +} diff --git a/src/translations/en.json b/src/translations/en.json index 612201f924..5c07733ee1 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1641,5 +1641,9 @@ "MissingConnectionsInVoltageLevel": "Missing connections in voltage level (Connections removed from list on validation)", "moveFeederBaysSections": "Feeder bay will be connected onto the selected busbar section", "Length": "Amount of elements", - "equipmentID": "Equipment ID" + "equipmentID": "Equipment ID", + "PccMinTri": "Pcc min (MVA) ", + "IccMin": "Icc min (kA)", + "rOhm": "r (Ohm)", + "xOhm":"x (Ohm)" } diff --git a/src/translations/fr.json b/src/translations/fr.json index 0369f1e257..94323c836a 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -1637,5 +1637,9 @@ "MissingConnectionsInVoltageLevel": "Départs absents du poste (Départs supprimés de la liste à la validation)", "moveFeederBaysSections": "Les départs déplacés sont préparés sur la section de barre sélectionnée", "Length": "Nombre d'éléments", - "equipmentID": "ID de l'ouvrage" + "equipmentID": "ID de l'ouvrage", + "PccMinTri": "Pcc min (MVA) ", + "IccMin": "Icc min (kA)", + "rOhm": "r (Ohm)", + "xOhm":"x (Ohm)" } From faafade08d3f43820f97378873ca231c2b55da31 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 22 Oct 2025 15:34:41 +0200 Subject: [PATCH 06/27] add pcc min results and logs Signed-off-by: SOUISSI Maissa (Externe) --- src/services/study/pcc-min.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/study/pcc-min.ts b/src/services/study/pcc-min.ts index 2ccc225353..5a79d5fc17 100644 --- a/src/services/study/pcc-min.ts +++ b/src/services/study/pcc-min.ts @@ -7,7 +7,6 @@ import { getStudyUrlWithNodeUuidAndRootNetworkUuid } from './index'; import { backendFetch, backendFetchJson, backendFetchText } from '@gridsuite/commons-ui'; - import type { UUID } from 'node:crypto'; From c25880975757cba2b123269a3dec6adc3ccb3de3 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Thu, 30 Oct 2025 21:56:58 +0100 Subject: [PATCH 07/27] paginates filtred sorted results Signed-off-by: SOUISSI Maissa (Externe) --- .../results/pccmin/pcc-min-result-tab.tsx | 210 ++++++++++------- .../results/pccmin/pcc-min-result-table.tsx | 223 ++++++++++++++++++ .../results/pccmin/pcc-min-result-utils.ts | 49 ---- .../results/pccmin/pcc-min-result.tsx | 189 +++++++++++++++ .../results/pccmin/pcc-min-result.type.ts | 61 ++++- src/hooks/use-filter-selector.ts | 6 + src/hooks/use-pagination-selector.ts | 12 + src/redux/actions.ts | 46 ++++ src/redux/reducer.ts | 46 ++++ src/services/study/pcc-min.ts | 45 +++- src/translations/en.json | 2 +- src/translations/fr.json | 6 +- src/types/custom-aggrid-types.ts | 7 +- src/utils/store-sort-filter-fields.ts | 6 + 14 files changed, 767 insertions(+), 141 deletions(-) create mode 100644 src/components/results/pccmin/pcc-min-result-table.tsx delete mode 100644 src/components/results/pccmin/pcc-min-result-utils.ts create mode 100644 src/components/results/pccmin/pcc-min-result.tsx diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index cd17353c62..fac8571009 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -5,103 +5,147 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { FunctionComponent, SyntheticEvent, useMemo, useState } from 'react'; -import Tabs from '@mui/material/Tabs'; -import Tab from '@mui/material/Tab'; -import Box from '@mui/material/Box'; -import { FormattedMessage, useIntl } from 'react-intl/lib'; -import RunningStatus from 'components/utils/running-status'; -import { AppState } from 'redux/reducer'; -import { ComputingType, type MuiStyles } from '@gridsuite/commons-ui'; +import { Box, LinearProgress, Tab, Tabs } from '@mui/material'; +import { FunctionComponent, useCallback, useEffect, useMemo, useState } from 'react'; +import { FormattedMessage } from 'react-intl'; +import { ComputationReportViewer } from '../common/computation-report-viewer'; + import { useSelector } from 'react-redux'; -import GlassPane from '../common/glass-pane'; +import { AppState } from '../../../redux/reducer'; +import { ComputingType } from '@gridsuite/commons-ui'; +import { RunningStatus } from '../../utils/running-status'; +import { useOpenLoaderShortWait } from '../../dialogs/commons/handle-loader'; +import { RESULTS_LOADING_DELAY } from '../../network/constants'; +import { ColDef, GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; +import GlobalFilterSelector from '../common/global-filter/global-filter-selector'; +import { EQUIPMENT_TYPES } from '../../utils/equipment-types'; +import useGlobalFilters, { isGlobalFilterParameter } from '../common/global-filter/use-global-filters'; +import { useGlobalFilterOptions } from '../common/global-filter/use-global-filter-options'; +import { PccMinResultTabProps } from './pcc-min-result.type'; +import { PccMinResult } from './pcc-min-result'; +import { ShortCircuitExportButton } from '../shortcircuit/shortcircuit-analysis-export-button'; -import { ComputationReportViewer } from '../common/computation-report-viewer'; -import { useNodeData } from 'components/use-node-data'; -import { PccMinTabProps } from './pcc-min-result.type'; -import { fetchPccMinResult } from 'services/study/pcc-min'; -import { pccMinResultInvalidations } from 'components/computing-status/use-all-computing-status'; -import { pccMinResultColumnsDefinition } from './pcc-min-result-utils'; -import { PccMinResults } from './pcc-min-results'; - -const styles = { - flexWrapper: { - display: 'flex', - }, - flexElement: { - flexGrow: 0, - }, - show: { - display: 'inherit', - }, - hide: { - display: 'none', - }, - emptySpace: { - flexGrow: 1, - }, -} as const satisfies MuiStyles; - -export const PccMinResultTab: FunctionComponent = ({ studyUuid, nodeUuid, currentRootNetworkUuid }) => { - const intl = useIntl(); - - const [tabIndex, setTabIndex] = useState(0); - const PccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); - - const { result: PccMinResult, isLoading: isLoadingResult } = useNodeData({ - studyUuid, - nodeUuid, - rootNetworkUuid: currentRootNetworkUuid, - fetcher: fetchPccMinResult, - invalidations: pccMinResultInvalidations, - }); +const getDisplayedColumns = (params: GridReadyEvent) => { + return ( + (params.api + ?.getColumnDefs() + ?.filter((col: ColDef) => !col.hide) + ?.map((col) => col.headerName) as string[]) ?? [] + ); +}; + +export const PccMinResultTab: FunctionComponent = ({ + studyUuid, + nodeUuid, + currentRootNetworkUuid, +}) => { + const [csvHeaders, setCsvHeaders] = useState([]); + const [isCsvButtonDisabled, setIsCsvButtonDisabled] = useState(true); + + const [resultOrLogIndex, setResultOrLogIndex] = useState(0); + + const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); + + const RESULTS_TAB_INDEX = 0; + const LOGS_TAB_INDEX = 1; + + const { globalFilters, handleGlobalFilterChange } = useGlobalFilters(); + const { countriesFilter, voltageLevelsFilter, propertiesFilter } = useGlobalFilterOptions(); + + const handleSubTabChange = useCallback( + (event: React.SyntheticEvent, newIndex: number) => { + setResultOrLogIndex(newIndex); + }, + [setResultOrLogIndex] + ); - const pccMinColumns = useMemo(() => { - return pccMinResultColumnsDefinition(intl); - }, [intl]); + const openLoader = useOpenLoaderShortWait({ + isLoading: pccMinStatus === RunningStatus.RUNNING, + delay: RESULTS_LOADING_DELAY, + }); - const handleTabChange = (_event: SyntheticEvent, newTabIndex: number) => { - setTabIndex(newTabIndex); - }; + const handleGridColumnsChanged = useCallback((params: GridReadyEvent) => { + if (params?.api) { + setCsvHeaders(getDisplayedColumns(params)); + } + }, []); - const result = useMemo(() => { - if (PccMinStatus !== RunningStatus.SUCCEED || !PccMinResult) { - return {}; + const handleRowDataUpdated = useCallback((event: RowDataUpdatedEvent) => { + if (event?.api) { + setIsCsvButtonDisabled(event.api.getDisplayedRowCount() === 0); } - return PccMinResult; - }, [PccMinStatus, PccMinResult]); - - const renderReportViewer = () => { - return ( - - {(PccMinStatus === RunningStatus.SUCCEED || PccMinStatus === RunningStatus.FAILED) && ( - - )} - - ); - }; + }, []); + + const filterableEquipmentTypes: EQUIPMENT_TYPES[] = useMemo(() => { + return [EQUIPMENT_TYPES.VOLTAGE_LEVEL]; + }, []); + + useEffect(() => { + // Clear the globalfilter when tab changes + handleGlobalFilterChange([]); + }, [handleGlobalFilterChange]); + + const globalFilterOptions = useMemo( + () => [...voltageLevelsFilter, ...countriesFilter, ...propertiesFilter], + [voltageLevelsFilter, countriesFilter, propertiesFilter] + ); return ( <> - - + + } /> } /> - - + {resultOrLogIndex === RESULTS_TAB_INDEX && ( + <> + + + - {tabIndex === 0 && ( - - - + + + )} + + {resultOrLogIndex === RESULTS_TAB_INDEX && ( + + )} + {resultOrLogIndex === LOGS_TAB_INDEX && ( + <> + {openLoader && } + (loadFlowStatus === RunningStatus.SUCCEED || loadFlowStatus === RunningStatus.FAILED) && ( + + {pccMinStatus === RunningStatus.SUCCEED || + (pccMinStatus === RunningStatus.FAILED && ( + + ))} + )} - {tabIndex === 1 && renderReportViewer()} ); }; diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx new file mode 100644 index 0000000000..ba9d1db46e --- /dev/null +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -0,0 +1,223 @@ +/** + * Copyright (c) 2022, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { FunctionComponent, useCallback, useMemo } from 'react'; +import { useIntl } from 'react-intl'; +import { Box } from '@mui/material'; +import { GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; +import { getNoRowsMessage, getRows, useIntlResultStatusMessages } from '../../utils/aggrid-rows-handler'; +import { useSelector } from 'react-redux'; +import { AppState } from '../../../redux/reducer'; +import { DefaultCellRenderer } from '../../custom-aggrid/cell-renderers'; +import { makeAgGridCustomHeaderColumn } from '../../custom-aggrid/utils/custom-aggrid-header-utils'; +import { CustomAGGrid, ComputingType } from '@gridsuite/commons-ui'; +import { CustomAggridComparatorFilter } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter'; +import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from '../../../utils/store-sort-filter-fields'; +import { FilterType as AgGridFilterType, FilterConfig } from '../../../types/custom-aggrid-types'; +import { + ColumnContext, + FILTER_DATA_TYPES, + FILTER_NUMBER_COMPARATORS, + FILTER_TEXT_COMPARATORS, +} from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; +import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales'; +import { SinglePccMinResultInfos } from './pcc-min-result.type'; + +interface PccMinResultTableProps { + result: SinglePccMinResultInfos[]; + isFetching: boolean; + onGridColumnsChanged: (params: GridReadyEvent) => void; + onRowDataUpdated: (event: RowDataUpdatedEvent) => void; + onFilter: () => void; + filters: FilterConfig[]; + openVoltageLevelDiagram?: (id: string) => void; +} + +const PccMinResultTable: FunctionComponent = ({ + result, + isFetching, + onGridColumnsChanged, + onRowDataUpdated, + onFilter, + filters, +}) => { + const intl = useIntl(); + + const columns = useMemo(() => { + const data = (data: T, defaultData: T | undefined = {} as T) => data; + + const sortParams: ColumnContext['sortParams'] = { + table: PCCMIN_ANALYSIS_RESULT_SORT_STORE, + tab: PCCMIN_RESULT, + }; + + const filterParams = { + type: AgGridFilterType.PccMin, + tab: PCCMIN_RESULT, + updateFilterCallback: onFilter, + }; + + const textFilterParams = { + dataType: FILTER_DATA_TYPES.TEXT, + comparators: [FILTER_TEXT_COMPARATORS.STARTS_WITH, FILTER_TEXT_COMPARATORS.CONTAINS], + }; + + const numericFilterParams = { + dataType: FILTER_DATA_TYPES.NUMBER, + comparators: Object.values(FILTER_NUMBER_COMPARATORS), + }; + + const inputFilterParams = ( + filterDefinition: Pick< + Required['filterComponentParams']['filterParams'], + 'dataType' | 'comparators' + > + ) => { + return { + filterComponent: CustomAggridComparatorFilter, + filterComponentParams: { + filterParams: { + ...filterDefinition, + ...filterParams, + }, + }, + }; + }; + + return [ + { + ...makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Bus' }), + colId: 'busId', + field: 'busId', + context: { + ...data({ sortParams, ...inputFilterParams(textFilterParams) }), + }, + }), + minWidth: 180, + }, + { + ...makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Contingency' }), + colId: 'limitingEquipment', + field: 'limitingEquipment', + context: { + ...data({ sortParams, ...inputFilterParams(textFilterParams) }), + }, + }), + minWidth: 180, + }, + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'PccMinTri' }), + colId: 'pccMinTri', + field: 'pccMinTri', + context: { + numeric: true, + fractionDigits: 2, + sortParams, + ...inputFilterParams(numericFilterParams), + }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'IccMinTri' }), + colId: 'iccMinTri', + field: 'iccMinTri', + context: { + numeric: true, + fractionDigits: 2, + sortParams, + ...inputFilterParams(numericFilterParams), + }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'xOhm' }), + colId: 'x', + field: 'x', + context: { + numeric: true, + fractionDigits: 2, + sortParams, + ...inputFilterParams(numericFilterParams), + }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'rOhm' }), + colId: 'r', + field: 'r', + context: { + numeric: true, + fractionDigits: 2, + sortParams, + ...inputFilterParams(numericFilterParams), + }, + }), + ]; + }, [onFilter, intl]); + + const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); + + const messages = useIntlResultStatusMessages(intl, true, filters.length > 0); + + const defaultColDef = useMemo( + () => ({ + suppressMovable: true, + resizable: true, + flex: 1, + cellRenderer: DefaultCellRenderer, + }), + [] + ); + + const onGridReady = useCallback( + (params: GridReadyEvent) => { + if (params?.api) { + params.api.sizeColumnsToFit(); + onGridColumnsChanged && onGridColumnsChanged(params); + } + }, + [onGridColumnsChanged] + ); + + const handleRowDataUpdated = useCallback( + (event: RowDataUpdatedEvent) => { + if (event?.api) { + onRowDataUpdated(event); + } + }, + [onRowDataUpdated] + ); + + const rows: SinglePccMinResultInfos[] = useMemo(() => { + return result; + }, [result]); + + const message = getNoRowsMessage(messages, rows, pccMinStatus, !isFetching); + const rowsToShow = getRows(rows, pccMinStatus); + + return ( + + { + if (api.getDisplayedRowCount()) { + api.hideOverlay(); + } else { + api.showNoRowsOverlay(); + } + }} + /> + + ); +}; + +export default PccMinResultTable; diff --git a/src/components/results/pccmin/pcc-min-result-utils.ts b/src/components/results/pccmin/pcc-min-result-utils.ts deleted file mode 100644 index 29104d3310..0000000000 --- a/src/components/results/pccmin/pcc-min-result-utils.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -import { IntlShape } from 'react-intl'; -import { ColDef } from 'ag-grid-community'; -import { makeAgGridCustomHeaderColumn } from 'components/custom-aggrid/utils/custom-aggrid-header-utils'; - -export const pccMinResultColumnsDefinition = (intl: IntlShape): ColDef[] => { - return [ - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Bus' }), - colId: 'busId', - field: 'busId', - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'PccMinTri' }), - colId: 'pccMinTri', - field: 'pccMinTri', - context: { numeric: true, fractionDigits: 2 }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'IccMin' }), - colId: 'iccMinTri', - field: 'iccMinTri', - context: { numeric: true, fractionDigits: 2 }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Contingency' }), - colId: 'limitingEquipment', - field: 'limitingEquipment', - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'xOhm' }), - colId: 'x', - field: 'x', - context: { numeric: true, fractionDigits: 2 }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'rOhm' }), - colId: 'r', - field: 'r', - context: { numeric: true, fractionDigits: 2 }, - }), - ]; -}; diff --git a/src/components/results/pccmin/pcc-min-result.tsx b/src/components/results/pccmin/pcc-min-result.tsx new file mode 100644 index 0000000000..24a73c7deb --- /dev/null +++ b/src/components/results/pccmin/pcc-min-result.tsx @@ -0,0 +1,189 @@ +/** + * Copyright (c) 2023, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { useSelector } from 'react-redux'; +import { AppState } from 'redux/reducer'; +import { FunctionComponent, useCallback, useEffect, useState } from 'react'; +import { ComputingType, useSnackMessage } from '@gridsuite/commons-ui'; +import { GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; +import { GlobalFilters } from '../common/global-filter/global-filter-types'; +import { FROM_COLUMN_TO_FIELD_PCC_MIN, SCAPagedResults, SinglePccMinResultInfos } from './pcc-min-result.type'; +import { useIntl } from 'react-intl'; +import { useFilterSelector } from 'hooks/use-filter-selector'; +import { usePaginationSelector } from 'hooks/use-pagination-selector'; +import RunningStatus from 'components/utils/running-status'; +import { mapFieldsToColumnsFilter } from 'utils/aggrid-headers-utils'; +import { RESULTS_LOADING_DELAY } from 'components/network/constants'; +import { useOpenLoaderShortWait } from 'components/dialogs/commons/handle-loader'; +import { Box, LinearProgress } from '@mui/material'; +import { PAGE_OPTIONS } from '../securityanalysis/security-analysis-result-utils'; +import CustomTablePagination from 'components/utils/custom-table-pagination'; +import PccMinResultTable from './pcc-min-result-table'; +import { FilterType, PaginationType, PccminTab } from 'types/custom-aggrid-types'; +import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from 'utils/store-sort-filter-fields'; +import { fetchPccMinPagedResults } from 'services/study/pcc-min'; + +interface PccMinResultProps { + onGridColumnsChanged: (params: GridReadyEvent) => void; + onRowDataUpdated: (event: RowDataUpdatedEvent) => void; + globalFilters?: GlobalFilters; + customTablePaginationProps: any; + openVoltageLevelDiagram?: (id: string) => void; +} + +export const PccMinResult: FunctionComponent = ({ + onGridColumnsChanged, + onRowDataUpdated, + customTablePaginationProps, + globalFilters, +}) => { + const intl = useIntl(); + const { snackError } = useSnackMessage(); + + const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); + + const [result, setResult] = useState([]); + + const updateResult = useCallback((results: SinglePccMinResultInfos[] | null) => { + setResult(results ?? []); + }, []); + + const [count, setCount] = useState(0); + const [isFetching, setIsFetching] = useState(false); + + const studyUuid = useSelector((state: AppState) => state.studyUuid); + const currentNode = useSelector((state: AppState) => state.currentTreeNode); + const currentRootNetworkUuid = useSelector((state: AppState) => state.currentRootNetworkUuid); + + const sortConfig = useSelector( + (state: AppState) => state.tableSort[PCCMIN_ANALYSIS_RESULT_SORT_STORE][PCCMIN_RESULT] + ); + + const { filters } = useFilterSelector(FilterType.PccMin, PCCMIN_RESULT); + const { pagination, dispatchPagination } = usePaginationSelector(PaginationType.PccMin, PCCMIN_RESULT as PccminTab); + const { page, rowsPerPage } = pagination; + + const handleChangePage = useCallback( + (_: any, newPage: number) => { + dispatchPagination({ ...pagination, page: newPage }); + }, + [pagination, dispatchPagination] + ); + + const handleChangeRowsPerPage = useCallback( + (event: any) => { + const newRowsPerPage = parseInt(event.target.value, 10); + dispatchPagination({ page: 0, rowsPerPage: newRowsPerPage }); + }, + [dispatchPagination] + ); + + const memoizedSetPageCallback = useCallback(() => { + dispatchPagination({ ...pagination, page: 0 }); + }, [pagination, dispatchPagination]); + + // Effects + useEffect(() => { + if (pccMinStatus !== RunningStatus.SUCCEED) { + return; + } + if (!currentRootNetworkUuid) { + return; + } + let active = true; + setIsFetching(true); + updateResult(null); + + const updatedFilters = filters ? filters : null; + + const selector = { + page, + size: rowsPerPage as number, + filter: updatedFilters ? mapFieldsToColumnsFilter(updatedFilters, FROM_COLUMN_TO_FIELD_PCC_MIN) : null, + sort: sortConfig, + }; + + fetchPccMinPagedResults({ + studyUuid, + currentNodeUuid: currentNode?.id, + currentRootNetworkUuid, + selector, + globalFilters, + }) + .then((result: SCAPagedResults | null) => { + console.log('selector ', selector); + if (active) { + const { content = [], totalElements = 0 } = result || {}; + updateResult(content); + setCount(totalElements); + } + }) + .catch((error) => + snackError({ + messageTxt: error.message, + headerId: 'ShortCircuitAnalysisResultsError', + }) + ) + .finally(() => { + if (active) { + setIsFetching(false); + } + }); + + return () => { + active = false; + }; + }, [ + page, + rowsPerPage, + snackError, + pccMinStatus, + updateResult, + studyUuid, + currentNode?.id, + currentRootNetworkUuid, + intl, + filters, + sortConfig, + globalFilters, + ]); + + useEffect(() => { + if (pccMinStatus !== RunningStatus.SUCCEED || !studyUuid || !currentNode?.id || !currentRootNetworkUuid) { + return; + } + }, [pccMinStatus, intl, snackError, studyUuid, currentNode?.id, currentRootNetworkUuid]); + + const openLoader = useOpenLoaderShortWait({ + isLoading: pccMinStatus === RunningStatus.RUNNING || isFetching, + delay: RESULTS_LOADING_DELAY, + }); + + return ( + <> + {openLoader && } + + + + ); +}; diff --git a/src/components/results/pccmin/pcc-min-result.type.ts b/src/components/results/pccmin/pcc-min-result.type.ts index 5062a50d06..f24414bf20 100644 --- a/src/components/results/pccmin/pcc-min-result.type.ts +++ b/src/components/results/pccmin/pcc-min-result.type.ts @@ -7,6 +7,8 @@ import { ColDef } from 'ag-grid-community'; import type { UUID } from 'node:crypto'; +import { FilterConfig, SortConfig } from 'types/custom-aggrid-types'; +import { GlobalFilters } from '../common/global-filter/global-filter-types'; export interface PccMinResult { resultUuid: UUID; @@ -22,11 +24,43 @@ export interface SinglePccMinResultInfos { r: number; } -export interface PccMinTabProps { +type Pageable = { + sort: { + sorted: boolean; + empty: boolean; + unsorted: boolean; + }; + pageNumber: number; + pageSize: number; + offset: number; + paged: boolean; + unpaged: boolean; +}; + +interface Page { + content: ResultType[]; + pageable: Pageable; + last: boolean; + totalPages: number; + totalElements: number; + first: boolean; + size: number; + number: number; + sort: { + sorted: boolean; + empty: boolean; + unsorted: boolean; + }; + numberOfElements: number; + empty: boolean; +} + +export interface PccMinResultTabProps { studyUuid: UUID; nodeUuid: UUID; currentRootNetworkUuid: UUID; } +export type SCAPagedResults = Page; export interface PccMinResultTableProps { isLoadingResult: boolean; @@ -37,5 +71,28 @@ export interface PccMinResultTableProps { export interface PccMinResultStatusProps { result: PccMinResult; } - +interface PccMinResults { + studyUuid: UUID | null; + currentNodeUuid?: UUID; + currentRootNetworkUuid?: UUID; + globalFilters?: GlobalFilters; +} export interface PccMinResultProps extends PccMinResultTableProps, PccMinResultStatusProps {} +interface Selector { + page: number; + size: number; + filter: FilterConfig[] | null; + sort: SortConfig[]; +} +export interface PccMinPagedResults extends PccMinResults { + selector: Partial; +} + +export const FROM_COLUMN_TO_FIELD_PCC_MIN: Record = { + busId: 'busId', + pccMinTri: 'pccMinTri', + iccMinTri: 'iccMinTri', + limitingEquipment: 'limitingEquipment', + x: 'xOhm', + r: 'rOhm', +}; diff --git a/src/hooks/use-filter-selector.ts b/src/hooks/use-filter-selector.ts index a643275292..57af2891aa 100644 --- a/src/hooks/use-filter-selector.ts +++ b/src/hooks/use-filter-selector.ts @@ -9,6 +9,7 @@ import { DYNAMIC_SIMULATION_RESULT_STORE_FIELD, LOADFLOW_RESULT_STORE_FIELD, LOGS_STORE_FIELD, + PCCMIN_ANALYSIS_RESULT_STORE_FIELD, SECURITY_ANALYSIS_RESULT_STORE_FIELD, SENSITIVITY_ANALYSIS_RESULT_STORE_FIELD, SHORTCIRCUIT_ANALYSIS_RESULT_STORE_FIELD, @@ -19,6 +20,7 @@ import { setDynamicSimulationResultFilter, setLoadflowResultFilter, setLogsFilter, + setPccminAnalysisResultFilter, setSecurityAnalysisResultFilter, setSensitivityAnalysisResultFilter, setShortcircuitAnalysisResultFilter, @@ -65,6 +67,10 @@ const FILTER_PARAMS: Record< filterType: STATEESTIMATION_RESULT_STORE_FIELD, filterStoreAction: setStateEstimationResultFilter, }, + [FilterType.PccMin]: { + filterType: PCCMIN_ANALYSIS_RESULT_STORE_FIELD, + filterStoreAction: setPccminAnalysisResultFilter, + }, }; export const useFilterSelector = (filterType: FilterType, filterTab: string) => { diff --git a/src/hooks/use-pagination-selector.ts b/src/hooks/use-pagination-selector.ts index ad588e1a07..8cdf13769b 100644 --- a/src/hooks/use-pagination-selector.ts +++ b/src/hooks/use-pagination-selector.ts @@ -10,19 +10,23 @@ import { PaginationConfig, PaginationTab, PaginationType, + PccminTab, SecurityAnalysisTab, SensitivityAnalysisTab, ShortcircuitAnalysisTab, } from '../types/custom-aggrid-types'; import { + resetPccminAnalysisPagination, resetSecurityAnalysisPagination, resetSensitivityAnalysisPagination, resetShortcircuitAnalysisPagination, + setPccminAnalysisResultPagination, setSecurityAnalysisResultPagination, setSensitivityAnalysisResultPagination, setShortcircuitAnalysisResultPagination, } from '../redux/actions'; import { + PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD, SECURITY_ANALYSIS_PAGINATION_STORE_FIELD, SENSITIVITY_ANALYSIS_PAGINATION_STORE_FIELD, SHORTCIRCUIT_ANALYSIS_PAGINATION_STORE_FIELD, @@ -44,6 +48,10 @@ function createPaginationSelector(paginationType: PaginationType, paginationTab: const paginationState = state[SHORTCIRCUIT_ANALYSIS_PAGINATION_STORE_FIELD]; return paginationState[paginationTab as ShortcircuitAnalysisTab] || DEFAULT_PAGINATION; } + case PaginationType.PccMin: { + const paginationState = state[PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD]; + return paginationState[paginationTab as PccminTab] || DEFAULT_PAGINATION; + } default: return DEFAULT_PAGINATION; } @@ -61,6 +69,9 @@ function createPaginationDispatcher(paginationType: PaginationType, paginationTa case PaginationType.ShortcircuitAnalysis: return (pagination: PaginationConfig) => setShortcircuitAnalysisResultPagination(paginationTab as ShortcircuitAnalysisTab, pagination); + case PaginationType.PccMin: + return (pagination: PaginationConfig) => + setPccminAnalysisResultPagination(paginationTab as PccminTab, pagination); default: throw new Error(`Unknown pagination type: ${paginationType}`); } @@ -87,6 +98,7 @@ const PAGINATION_RESET_DISPATCHERS = { [PaginationType.SecurityAnalysis]: resetSecurityAnalysisPagination, [PaginationType.SensitivityAnalysis]: resetSensitivityAnalysisPagination, [PaginationType.ShortcircuitAnalysis]: resetShortcircuitAnalysisPagination, + [PaginationType.PccMin]: resetPccminAnalysisPagination, } as const; export const usePaginationReset = (paginationType: PaginationType) => { diff --git a/src/redux/actions.ts b/src/redux/actions.ts index 18433aa917..cfe98103ed 100644 --- a/src/redux/actions.ts +++ b/src/redux/actions.ts @@ -44,6 +44,8 @@ import { LOADFLOW_RESULT_STORE_FIELD, LOGS_PAGINATION_STORE_FIELD, LOGS_STORE_FIELD, + PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD, + PCCMIN_ANALYSIS_RESULT_STORE_FIELD, SECURITY_ANALYSIS_PAGINATION_STORE_FIELD, SECURITY_ANALYSIS_RESULT_STORE_FIELD, SENSITIVITY_ANALYSIS_PAGINATION_STORE_FIELD, @@ -67,6 +69,7 @@ import { FilterConfig, LogsPaginationConfig, PaginationConfig, + PccminTab, SecurityAnalysisTab, SensitivityAnalysisTab, ShortcircuitAnalysisTab, @@ -1084,6 +1087,23 @@ export function setShortcircuitAnalysisResultFilter( }; } +export const PCCMIN_ANALYSIS_RESULT_FILTER = 'PCCMIN_ANALYSIS_RESULT_FILTER'; +export type PccminAnalysisResultFilterAction = Readonly> & { + filterTab: keyof AppState[typeof PCCMIN_ANALYSIS_RESULT_STORE_FIELD]; + [PCCMIN_ANALYSIS_RESULT_STORE_FIELD]: FilterConfig[]; +}; + +export function setPccminAnalysisResultFilter( + filterTab: keyof AppState[typeof PCCMIN_ANALYSIS_RESULT_STORE_FIELD], + pccminAnalysisResultFilter: FilterConfig[] +): PccminAnalysisResultFilterAction { + return { + type: PCCMIN_ANALYSIS_RESULT_FILTER, + filterTab: filterTab, + [PCCMIN_ANALYSIS_RESULT_STORE_FIELD]: pccminAnalysisResultFilter, + }; +} + export const DYNAMIC_SIMULATION_RESULT_FILTER = 'DYNAMIC_SIMULATION_RESULT_FILTER'; export type DynamicSimulationResultFilterAction = Readonly> & { filterTab: keyof AppState[typeof DYNAMIC_SIMULATION_RESULT_STORE_FIELD]; @@ -1183,6 +1203,32 @@ export function resetShortcircuitAnalysisPagination(): ResetShortcircuitAnalysis }; } +export const RESET_PCCMIN_ANALYSIS_PAGINATION = 'RESET_PCCMIN_ANALYSIS_PAGINATION'; +export type ResetPccminAnalysisPaginationAction = Readonly>; + +export function resetPccminAnalysisPagination(): ResetPccminAnalysisPaginationAction { + return { + type: RESET_PCCMIN_ANALYSIS_PAGINATION, + }; +} + +export const PCCMIN_ANALYSIS_RESULT_PAGINATION = 'PCCMIN_ANALYSIS_RESULT_PAGINATION'; +export type PccminAnalysisResultPaginationAction = Readonly> & { + paginationTab: PccminTab; + [PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD]: PaginationConfig; +}; + +export function setPccminAnalysisResultPagination( + paginationTab: PccminTab, + pccminAnalysisPagination: PaginationConfig +): PccminAnalysisResultPaginationAction { + return { + type: PCCMIN_ANALYSIS_RESULT_PAGINATION, + paginationTab: paginationTab, + [PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD]: pccminAnalysisPagination, + }; +} + export const SPREADSHEET_FILTER = 'SPREADSHEET_FILTER'; export type SpreadsheetFilterAction = Readonly> & { filterTab: keyof AppState[typeof SPREADSHEET_STORE_FIELD]; diff --git a/src/redux/reducer.ts b/src/redux/reducer.ts index 410e37906e..9d2590ffc4 100644 --- a/src/redux/reducer.ts +++ b/src/redux/reducer.ts @@ -134,6 +134,7 @@ import { RESET_SECURITY_ANALYSIS_PAGINATION, RESET_SENSITIVITY_ANALYSIS_PAGINATION, RESET_SHORTCIRCUIT_ANALYSIS_PAGINATION, + RESET_PCCMIN_ANALYSIS_PAGINATION, type ResetAllSpreadsheetGlobalFiltersAction, type ResetDiagramEventAction, type ResetEquipmentsAction, @@ -145,6 +146,7 @@ import { ResetSecurityAnalysisPaginationAction, ResetSensitivityAnalysisPaginationAction, ResetShortcircuitAnalysisPaginationAction, + ResetPccminAnalysisPaginationAction, SAVE_SPREADSHEET_GS_FILTER, type SaveSpreadSheetGlobalFilterAction, SECURITY_ANALYSIS_RESULT_FILTER, @@ -211,6 +213,10 @@ import { SHORTCIRCUIT_ANALYSIS_RESULT_PAGINATION, type ShortcircuitAnalysisResultFilterAction, ShortcircuitAnalysisResultPaginationAction, + PCCMIN_ANALYSIS_RESULT_FILTER, + PCCMIN_ANALYSIS_RESULT_PAGINATION, + type PccminAnalysisResultFilterAction, + PccminAnalysisResultPaginationAction, SPREADSHEET_FILTER, type SpreadsheetFilterAction, STATEESTIMATION_RESULT_FILTER, @@ -276,6 +282,10 @@ import { LOGS_PAGINATION_STORE_FIELD, LOGS_STORE_FIELD, ONE_BUS, + PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD, + PCCMIN_ANALYSIS_RESULT_SORT_STORE, + PCCMIN_ANALYSIS_RESULT_STORE_FIELD, + PCCMIN_RESULT, SECURITY_ANALYSIS_PAGINATION_STORE_FIELD, SECURITY_ANALYSIS_RESULT_N, SECURITY_ANALYSIS_RESULT_N_K, @@ -326,6 +336,8 @@ import { FilterConfig, LogsPaginationConfig, PaginationConfig, + PCCMIN_ANALYSIS_TABS, + PccminTab, SECURITY_ANALYSIS_TABS, SecurityAnalysisTab, SENSITIVITY_ANALYSIS_TABS, @@ -462,6 +474,7 @@ export type TableSort = { [DYNAMIC_SIMULATION_RESULT_SORT_STORE]: TableSortConfig; [SHORTCIRCUIT_ANALYSIS_RESULT_SORT_STORE]: TableSortConfig; [STATEESTIMATION_RESULT_SORT_STORE]: TableSortConfig; + [PCCMIN_ANALYSIS_RESULT_SORT_STORE]: TableSortConfig; }; export type TableSortKeysType = keyof TableSort; @@ -632,6 +645,9 @@ export interface AppState extends CommonStoreState, AppConfigState { [ONE_BUS]: FilterConfig[]; [ALL_BUSES]: FilterConfig[]; }; + [PCCMIN_ANALYSIS_RESULT_STORE_FIELD]: { + [PCCMIN_RESULT]: FilterConfig[]; + }; [DYNAMIC_SIMULATION_RESULT_STORE_FIELD]: { [TIMELINE]: FilterConfig[]; }; @@ -642,6 +658,8 @@ export interface AppState extends CommonStoreState, AppConfigState { [SECURITY_ANALYSIS_PAGINATION_STORE_FIELD]: Record; [SENSITIVITY_ANALYSIS_PAGINATION_STORE_FIELD]: Record; [SHORTCIRCUIT_ANALYSIS_PAGINATION_STORE_FIELD]: Record; + [PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD]: Record; + [SPREADSHEET_STORE_FIELD]: SpreadsheetFilterState; [LOGS_STORE_FIELD]: LogsFilterState; @@ -861,6 +879,10 @@ const initialState: AppState = { [ONE_BUS]: [], [ALL_BUSES]: [], }, + + [PCCMIN_ANALYSIS_RESULT_STORE_FIELD]: { + [PCCMIN_RESULT]: [], + }, [DYNAMIC_SIMULATION_RESULT_STORE_FIELD]: { [TIMELINE]: [], }, @@ -880,6 +902,9 @@ const initialState: AppState = { [ONE_BUS]: { ...DEFAULT_PAGINATION }, [ALL_BUSES]: { ...DEFAULT_PAGINATION }, }, + [PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD]: { + [PCCMIN_RESULT]: { ...DEFAULT_PAGINATION }, + }, [STATEESTIMATION_RESULT_STORE_FIELD]: { [STATEESTIMATION_QUALITY_CRITERION]: [], [STATEESTIMATION_QUALITY_PER_REGION]: [], @@ -942,6 +967,9 @@ const initialState: AppState = { [ONE_BUS]: [{ colId: 'current', sort: SortWay.DESC }], [ALL_BUSES]: [{ colId: 'elementId', sort: SortWay.ASC }], }, + [PCCMIN_ANALYSIS_RESULT_SORT_STORE]: { + [PCCMIN_RESULT]: [{ colId: 'busId', sort: SortWay.ASC }], + }, [STATEESTIMATION_RESULT_SORT_STORE]: { [STATEESTIMATION_QUALITY_CRITERION]: [ { @@ -1791,6 +1819,9 @@ export const reducer = createReducer(initialState, (builder) => { action[SHORTCIRCUIT_ANALYSIS_RESULT_STORE_FIELD]; }); + builder.addCase(PCCMIN_ANALYSIS_RESULT_FILTER, (state, action: PccminAnalysisResultFilterAction) => { + state[PCCMIN_ANALYSIS_RESULT_STORE_FIELD][action.filterTab] = action[PCCMIN_ANALYSIS_RESULT_STORE_FIELD]; + }); builder.addCase(DYNAMIC_SIMULATION_RESULT_FILTER, (state, action: DynamicSimulationResultFilterAction) => { state[DYNAMIC_SIMULATION_RESULT_STORE_FIELD][action.filterTab] = action[DYNAMIC_SIMULATION_RESULT_STORE_FIELD]; }); @@ -1858,6 +1889,21 @@ export const reducer = createReducer(initialState, (builder) => { }); } ); + builder.addCase(PCCMIN_ANALYSIS_RESULT_PAGINATION, (state, action: PccminAnalysisResultPaginationAction) => { + state[PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD][action.paginationTab] = + action[PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD]; + }); + + builder.addCase(RESET_PCCMIN_ANALYSIS_PAGINATION, (state, _action: ResetPccminAnalysisPaginationAction) => { + // Reset all shortcircuit analysis tabs to page 0 but keep their rowsPerPage + PCCMIN_ANALYSIS_TABS.forEach((tab) => { + const currentPagination = state[PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD][tab]; + state[PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD][tab] = { + page: 0, + rowsPerPage: currentPagination.rowsPerPage, + }; + }); + }); builder.addCase(SPREADSHEET_FILTER, (state, action: SpreadsheetFilterAction) => { state[SPREADSHEET_STORE_FIELD][action.filterTab] = action[SPREADSHEET_STORE_FIELD]; diff --git a/src/services/study/pcc-min.ts b/src/services/study/pcc-min.ts index 5a79d5fc17..a70059a308 100644 --- a/src/services/study/pcc-min.ts +++ b/src/services/study/pcc-min.ts @@ -7,8 +7,8 @@ import { getStudyUrlWithNodeUuidAndRootNetworkUuid } from './index'; import { backendFetch, backendFetchJson, backendFetchText } from '@gridsuite/commons-ui'; - -import type { UUID } from 'node:crypto'; +import { PccMinPagedResults } from 'components/results/pccmin/pcc-min-result.type'; +import { UUID } from 'crypto'; export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID): Promise { console.info( @@ -60,3 +60,44 @@ export function fetchPccMinResult(studyUuid: UUID, currentNodeUuid: UUID, curren console.debug(url); return backendFetchJson(url); } + +export function fetchPccMinPagedResults({ + studyUuid, + currentNodeUuid, + currentRootNetworkUuid, + selector = {}, + globalFilters, +}: PccMinPagedResults) { + console.info( + `Fetching pcc min result on '${studyUuid}' , node '${currentNodeUuid}' and root network '${currentRootNetworkUuid}'...` + ); + + const urlSearchParams = new URLSearchParams(); + + urlSearchParams.append('paged', 'true'); + + const { page = 0, sort, size, filter } = selector; + + urlSearchParams.append('page', String(page)); + + sort?.map((value) => urlSearchParams.append('sort', `${value.colId},${value.sort}`)); + + if (size) { + urlSearchParams.append('size', String(size)); + } + + if (filter?.length) { + urlSearchParams.append('filters', JSON.stringify(filter)); + } + + if (globalFilters && Object.keys(globalFilters).length > 0) { + urlSearchParams.append('globalFilters', JSON.stringify(globalFilters)); + } + + const url = + getStudyUrlWithNodeUuidAndRootNetworkUuid(studyUuid, currentNodeUuid, currentRootNetworkUuid) + + '/pcc-min/result?' + + urlSearchParams.toString(); + console.debug(url); + return backendFetchJson(url); +} diff --git a/src/translations/en.json b/src/translations/en.json index 5c07733ee1..211f7d0eee 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1643,7 +1643,7 @@ "Length": "Amount of elements", "equipmentID": "Equipment ID", "PccMinTri": "Pcc min (MVA) ", - "IccMin": "Icc min (kA)", + "IccMinTri": "Icc min (kA)", "rOhm": "r (Ohm)", "xOhm":"x (Ohm)" } diff --git a/src/translations/fr.json b/src/translations/fr.json index 94323c836a..a6eda8bd0f 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -1639,7 +1639,7 @@ "Length": "Nombre d'éléments", "equipmentID": "ID de l'ouvrage", "PccMinTri": "Pcc min (MVA) ", - "IccMin": "Icc min (kA)", - "rOhm": "r (Ohm)", - "xOhm":"x (Ohm)" + "IccMinTri": "Icc min (kA)", + "rOhm": "r (Ω)", + "xOhm":"x (Ω)" } diff --git a/src/types/custom-aggrid-types.ts b/src/types/custom-aggrid-types.ts index 6ae4a896ea..a4119793f5 100644 --- a/src/types/custom-aggrid-types.ts +++ b/src/types/custom-aggrid-types.ts @@ -8,6 +8,7 @@ import { GridApi } from 'ag-grid-community'; import { ALL_BUSES, ONE_BUS, + PCCMIN_RESULT, SECURITY_ANALYSIS_RESULT_N, SECURITY_ANALYSIS_RESULT_N_K, SENSITIVITY_AT_NODE_N, @@ -38,6 +39,7 @@ export enum FilterType { Spreadsheet = 'Spreadsheet', Logs = 'Logs', StateEstimation = 'StateEstimation', + PccMin = 'PccMin', } export type FilterData = { @@ -75,6 +77,7 @@ export enum PaginationType { SecurityAnalysis = 'SecurityAnalysis', SensitivityAnalysis = 'SensitivityAnalysis', ShortcircuitAnalysis = 'ShortcircuitAnalysis', + PccMin = 'PccMin', } export const SECURITY_ANALYSIS_TABS = [SECURITY_ANALYSIS_RESULT_N, SECURITY_ANALYSIS_RESULT_N_K] as const; @@ -89,9 +92,11 @@ export const SENSITIVITY_ANALYSIS_TABS = [ ] as const; export const SHORTCIRCUIT_ANALYSIS_TABS = [ONE_BUS, ALL_BUSES] as const; +export const PCCMIN_ANALYSIS_TABS = [PCCMIN_RESULT] as const; export type SecurityAnalysisTab = (typeof SECURITY_ANALYSIS_TABS)[number]; export type SensitivityAnalysisTab = (typeof SENSITIVITY_ANALYSIS_TABS)[number]; export type ShortcircuitAnalysisTab = (typeof SHORTCIRCUIT_ANALYSIS_TABS)[number]; +export type PccminTab = (typeof PCCMIN_ANALYSIS_TABS)[number]; -export type PaginationTab = SecurityAnalysisTab | SensitivityAnalysisTab | ShortcircuitAnalysisTab; +export type PaginationTab = SecurityAnalysisTab | SensitivityAnalysisTab | ShortcircuitAnalysisTab | PccminTab; diff --git a/src/utils/store-sort-filter-fields.ts b/src/utils/store-sort-filter-fields.ts index df7fc8f2d9..14d05df798 100644 --- a/src/utils/store-sort-filter-fields.ts +++ b/src/utils/store-sort-filter-fields.ts @@ -59,3 +59,9 @@ export const STATEESTIMATION_RESULT_SORT_STORE = 'stateEstimationResult'; export const STATEESTIMATION_QUALITY_CRITERION = 'stateEstimationQualityCriterion'; export const STATEESTIMATION_QUALITY_PER_REGION = 'stateEstimationQualityPerRegion'; export const STATEESTIMATION_RESULT = 'stateEstimationResult'; + +//pccMin result store fields +export const PCCMIN_ANALYSIS_RESULT_STORE_FIELD = 'pccminAnalysisResultFilter'; +export const PCCMIN_ANALYSIS_RESULT_SORT_STORE = 'pccminAnalysisResult'; +export const PCCMIN_ANALYSIS_PAGINATION_STORE_FIELD = 'pccminAnalysisPagination'; +export const PCCMIN_RESULT = 'pccMinResults'; From bc6b5bbceae13291f3c18cea5ed32d83d5fd9ddd Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Fri, 31 Oct 2025 10:12:33 +0100 Subject: [PATCH 08/27] add download csv results Signed-off-by: SOUISSI Maissa (Externe) --- .../results/pccmin/pcc-min-result-tab.tsx | 39 ++++++------------- .../results/pccmin/pcc-min-result-table.tsx | 35 ++++++++--------- .../results/pccmin/pcc-min-result.tsx | 4 +- .../utils/renderTable-ExportCsv.tsx | 2 +- src/services/study/pcc-min.ts | 2 - src/translations/en.json | 1 + src/translations/fr.json | 5 ++- 7 files changed, 34 insertions(+), 54 deletions(-) diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index fac8571009..aa2d8d0f05 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -23,7 +23,6 @@ import useGlobalFilters, { isGlobalFilterParameter } from '../common/global-filt import { useGlobalFilterOptions } from '../common/global-filter/use-global-filter-options'; import { PccMinResultTabProps } from './pcc-min-result.type'; import { PccMinResult } from './pcc-min-result'; -import { ShortCircuitExportButton } from '../shortcircuit/shortcircuit-analysis-export-button'; const getDisplayedColumns = (params: GridReadyEvent) => { return ( @@ -95,8 +94,6 @@ export const PccMinResultTab: FunctionComponent = ({ @@ -105,23 +102,14 @@ export const PccMinResultTab: FunctionComponent = ({ {resultOrLogIndex === RESULTS_TAB_INDEX && ( <> - - - - - + + + )} @@ -131,19 +119,16 @@ export const PccMinResultTab: FunctionComponent = ({ onRowDataUpdated={handleRowDataUpdated} globalFilters={isGlobalFilterParameter(globalFilters) ? globalFilters : undefined} customTablePaginationProps={{ - labelRowsPerPageId: 'muiTablePaginationLabelRowsPerPageAllBusesSCA', + labelRowsPerPageId: 'muiTablePaginationLabelRowsPerPage', }} /> )} {resultOrLogIndex === LOGS_TAB_INDEX && ( <> {openLoader && } - (loadFlowStatus === RunningStatus.SUCCEED || loadFlowStatus === RunningStatus.FAILED) && ( - - {pccMinStatus === RunningStatus.SUCCEED || - (pccMinStatus === RunningStatus.FAILED && ( - - ))} + {(pccMinStatus === RunningStatus.SUCCEED || pccMinStatus === RunningStatus.FAILED) && ( + + )} )} diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx index ba9d1db46e..19543cfd2d 100644 --- a/src/components/results/pccmin/pcc-min-result-table.tsx +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { FunctionComponent, useCallback, useMemo } from 'react'; +import { FunctionComponent, useCallback, useMemo, useRef } from 'react'; import { useIntl } from 'react-intl'; import { Box } from '@mui/material'; import { GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; @@ -14,7 +14,7 @@ import { useSelector } from 'react-redux'; import { AppState } from '../../../redux/reducer'; import { DefaultCellRenderer } from '../../custom-aggrid/cell-renderers'; import { makeAgGridCustomHeaderColumn } from '../../custom-aggrid/utils/custom-aggrid-header-utils'; -import { CustomAGGrid, ComputingType } from '@gridsuite/commons-ui'; +import { ComputingType } from '@gridsuite/commons-ui'; import { CustomAggridComparatorFilter } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter'; import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from '../../../utils/store-sort-filter-fields'; import { FilterType as AgGridFilterType, FilterConfig } from '../../../types/custom-aggrid-types'; @@ -24,8 +24,9 @@ import { FILTER_NUMBER_COMPARATORS, FILTER_TEXT_COMPARATORS, } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; -import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales'; import { SinglePccMinResultInfos } from './pcc-min-result.type'; +import { AgGridReact } from 'ag-grid-react'; +import { RenderTableAndExportCsv } from 'components/utils/renderTable-ExportCsv'; interface PccMinResultTableProps { result: SinglePccMinResultInfos[]; @@ -46,6 +47,7 @@ const PccMinResultTable: FunctionComponent = ({ filters, }) => { const intl = useIntl(); + const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); const columns = useMemo(() => { const data = (data: T, defaultData: T | undefined = {} as T) => data; @@ -158,8 +160,6 @@ const PccMinResultTable: FunctionComponent = ({ ]; }, [onFilter, intl]); - const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); - const messages = useIntlResultStatusMessages(intl, true, filters.length > 0); const defaultColDef = useMemo( @@ -194,27 +194,24 @@ const PccMinResultTable: FunctionComponent = ({ const rows: SinglePccMinResultInfos[] = useMemo(() => { return result; }, [result]); - const message = getNoRowsMessage(messages, rows, pccMinStatus, !isFetching); const rowsToShow = getRows(rows, pccMinStatus); + const gridRef = useRef(null); return ( - - + { - if (api.getDisplayedRowCount()) { - api.hideOverlay(); - } else { - api.showNoRowsOverlay(); - } - }} + skipColumnHeaders={false} /> ); diff --git a/src/components/results/pccmin/pcc-min-result.tsx b/src/components/results/pccmin/pcc-min-result.tsx index 24a73c7deb..01baa2100d 100644 --- a/src/components/results/pccmin/pcc-min-result.tsx +++ b/src/components/results/pccmin/pcc-min-result.tsx @@ -115,7 +115,6 @@ export const PccMinResult: FunctionComponent = ({ globalFilters, }) .then((result: SCAPagedResults | null) => { - console.log('selector ', selector); if (active) { const { content = [], totalElements = 0 } = result || {}; updateResult(content); @@ -125,7 +124,7 @@ export const PccMinResult: FunctionComponent = ({ .catch((error) => snackError({ messageTxt: error.message, - headerId: 'ShortCircuitAnalysisResultsError', + headerId: 'PccMinResultsError', }) ) .finally(() => { @@ -173,7 +172,6 @@ export const PccMinResult: FunctionComponent = ({ onGridColumnsChanged={onGridColumnsChanged} onRowDataUpdated={onRowDataUpdated} filters={filters} - // openVoltageLevelDiagram={openVoltageLevelDiagram} /> void; onGridReady: ((event: GridReadyEvent) => void) | undefined; - getRowStyle: (params: RowClassParams) => RowStyle | undefined; + getRowStyle?: (params: RowClassParams) => RowStyle | undefined; overlayNoRowsTemplate: string | undefined; skipColumnHeaders: boolean; } diff --git a/src/services/study/pcc-min.ts b/src/services/study/pcc-min.ts index a5333a8d0b..9f6006e05f 100644 --- a/src/services/study/pcc-min.ts +++ b/src/services/study/pcc-min.ts @@ -60,8 +60,6 @@ export function fetchPccMinPagedResults({ const urlSearchParams = new URLSearchParams(); - urlSearchParams.append('paged', 'true'); - const { page = 0, sort, size, filter } = selector; urlSearchParams.append('page', String(page)); diff --git a/src/translations/en.json b/src/translations/en.json index bff5342d8b..35eb189ccb 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1398,6 +1398,7 @@ "PccMin": "Pcc min N-1", "startPccMinError": "An error occurred while launching the pcc min", "pccMinError": "An error occurred when executing the pcc min", + "PccMinResultsError": "An error occurred when exporting pcc min N-1 results", "NoFilter": "No filter", "searchPlaceholder": "Search", "searchPlaceholderLog": "Search in Logs", diff --git a/src/translations/fr.json b/src/translations/fr.json index baabdd9369..8abee6f3ef 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -1396,8 +1396,9 @@ "startStateEstimationError": "Une erreur est survenue lors du lancement de l'estimation d'état", "stateEstimationError": "Une erreur est survenue lors de l'exécution de l'estimation d'état", "PccMin": "Pcc min N-1", - "startPccMinError": "Une erreur est survenue lors du lancement de pccMin", - "pccMinError": "Une erreur est survenue lors de l'exécution de pccMin", + "startPccMinError": "Une erreur est survenue lors du lancement de pcc min N-1", + "pccMinError": "Une erreur est survenue lors de l'exécution de pcc min N-1", + "PccMinResultsError": "Une erreur s'est produite lors de la récupération du résultat de pcc min N-1", "NoFilter": "Aucun filtre", "searchPlaceholder": "Recherche", "searchPlaceholderLog": "Rechercher dans les Logs", From 64a113ecdf9be012fb004673f44564f889e3d956 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Fri, 31 Oct 2025 11:05:33 +0100 Subject: [PATCH 09/27] refactoring Signed-off-by: SOUISSI Maissa (Externe) --- .../results/pccmin/pcc-min-result-tab.tsx | 29 ++------------- .../results/pccmin/pcc-min-result-table.tsx | 37 +++++-------------- .../results/pccmin/pcc-min-result.tsx | 29 ++++++--------- 3 files changed, 24 insertions(+), 71 deletions(-) diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index aa2d8d0f05..b6f6875afb 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -24,23 +24,11 @@ import { useGlobalFilterOptions } from '../common/global-filter/use-global-filte import { PccMinResultTabProps } from './pcc-min-result.type'; import { PccMinResult } from './pcc-min-result'; -const getDisplayedColumns = (params: GridReadyEvent) => { - return ( - (params.api - ?.getColumnDefs() - ?.filter((col: ColDef) => !col.hide) - ?.map((col) => col.headerName) as string[]) ?? [] - ); -}; - export const PccMinResultTab: FunctionComponent = ({ studyUuid, nodeUuid, currentRootNetworkUuid, }) => { - const [csvHeaders, setCsvHeaders] = useState([]); - const [isCsvButtonDisabled, setIsCsvButtonDisabled] = useState(true); - const [resultOrLogIndex, setResultOrLogIndex] = useState(0); const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); @@ -63,18 +51,6 @@ export const PccMinResultTab: FunctionComponent = ({ delay: RESULTS_LOADING_DELAY, }); - const handleGridColumnsChanged = useCallback((params: GridReadyEvent) => { - if (params?.api) { - setCsvHeaders(getDisplayedColumns(params)); - } - }, []); - - const handleRowDataUpdated = useCallback((event: RowDataUpdatedEvent) => { - if (event?.api) { - setIsCsvButtonDisabled(event.api.getDisplayedRowCount() === 0); - } - }, []); - const filterableEquipmentTypes: EQUIPMENT_TYPES[] = useMemo(() => { return [EQUIPMENT_TYPES.VOLTAGE_LEVEL]; }, []); @@ -115,8 +91,9 @@ export const PccMinResultTab: FunctionComponent = ({ {resultOrLogIndex === RESULTS_TAB_INDEX && ( void; - onRowDataUpdated: (event: RowDataUpdatedEvent) => void; onFilter: () => void; filters: FilterConfig[]; - openVoltageLevelDiagram?: (id: string) => void; } -const PccMinResultTable: FunctionComponent = ({ - result, - isFetching, - onGridColumnsChanged, - onRowDataUpdated, - onFilter, - filters, -}) => { +const PccMinResultTable: FunctionComponent = ({ result, isFetching, onFilter, filters }) => { const intl = useIntl(); const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); @@ -172,24 +162,15 @@ const PccMinResultTable: FunctionComponent = ({ [] ); - const onGridReady = useCallback( - (params: GridReadyEvent) => { - if (params?.api) { - params.api.sizeColumnsToFit(); - onGridColumnsChanged && onGridColumnsChanged(params); - } - }, - [onGridColumnsChanged] - ); + const onGridReady = useCallback((params: GridReadyEvent) => { + if (params?.api) { + params.api.sizeColumnsToFit(); + } + }, []); - const handleRowDataUpdated = useCallback( - (event: RowDataUpdatedEvent) => { - if (event?.api) { - onRowDataUpdated(event); - } - }, - [onRowDataUpdated] - ); + const onRowDataUpdated = useCallback((params: RowDataUpdatedEvent) => { + params.api.sizeColumnsToFit(); + }, []); const rows: SinglePccMinResultInfos[] = useMemo(() => { return result; diff --git a/src/components/results/pccmin/pcc-min-result.tsx b/src/components/results/pccmin/pcc-min-result.tsx index 01baa2100d..15948d1d8a 100644 --- a/src/components/results/pccmin/pcc-min-result.tsx +++ b/src/components/results/pccmin/pcc-min-result.tsx @@ -9,7 +9,7 @@ import { useSelector } from 'react-redux'; import { AppState } from 'redux/reducer'; import { FunctionComponent, useCallback, useEffect, useState } from 'react'; import { ComputingType, useSnackMessage } from '@gridsuite/commons-ui'; -import { GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; +import { ColDef, GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; import { FROM_COLUMN_TO_FIELD_PCC_MIN, SCAPagedResults, SinglePccMinResultInfos } from './pcc-min-result.type'; import { useIntl } from 'react-intl'; @@ -26,18 +26,20 @@ import PccMinResultTable from './pcc-min-result-table'; import { FilterType, PaginationType, PccminTab } from 'types/custom-aggrid-types'; import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from 'utils/store-sort-filter-fields'; import { fetchPccMinPagedResults } from 'services/study/pcc-min'; +import { UUID } from 'crypto'; interface PccMinResultProps { - onGridColumnsChanged: (params: GridReadyEvent) => void; - onRowDataUpdated: (event: RowDataUpdatedEvent) => void; + studyUuid: UUID; + nodeUuid: UUID; + currentRootNetworkUuid: UUID; globalFilters?: GlobalFilters; customTablePaginationProps: any; - openVoltageLevelDiagram?: (id: string) => void; } export const PccMinResult: FunctionComponent = ({ - onGridColumnsChanged, - onRowDataUpdated, + studyUuid, + nodeUuid, + currentRootNetworkUuid, customTablePaginationProps, globalFilters, }) => { @@ -55,10 +57,6 @@ export const PccMinResult: FunctionComponent = ({ const [count, setCount] = useState(0); const [isFetching, setIsFetching] = useState(false); - const studyUuid = useSelector((state: AppState) => state.studyUuid); - const currentNode = useSelector((state: AppState) => state.currentTreeNode); - const currentRootNetworkUuid = useSelector((state: AppState) => state.currentRootNetworkUuid); - const sortConfig = useSelector( (state: AppState) => state.tableSort[PCCMIN_ANALYSIS_RESULT_SORT_STORE][PCCMIN_RESULT] ); @@ -86,7 +84,6 @@ export const PccMinResult: FunctionComponent = ({ dispatchPagination({ ...pagination, page: 0 }); }, [pagination, dispatchPagination]); - // Effects useEffect(() => { if (pccMinStatus !== RunningStatus.SUCCEED) { return; @@ -109,7 +106,7 @@ export const PccMinResult: FunctionComponent = ({ fetchPccMinPagedResults({ studyUuid, - currentNodeUuid: currentNode?.id, + currentNodeUuid: nodeUuid, currentRootNetworkUuid, selector, globalFilters, @@ -143,7 +140,7 @@ export const PccMinResult: FunctionComponent = ({ pccMinStatus, updateResult, studyUuid, - currentNode?.id, + nodeUuid, currentRootNetworkUuid, intl, filters, @@ -152,10 +149,10 @@ export const PccMinResult: FunctionComponent = ({ ]); useEffect(() => { - if (pccMinStatus !== RunningStatus.SUCCEED || !studyUuid || !currentNode?.id || !currentRootNetworkUuid) { + if (pccMinStatus !== RunningStatus.SUCCEED || !studyUuid || !nodeUuid || !currentRootNetworkUuid) { return; } - }, [pccMinStatus, intl, snackError, studyUuid, currentNode?.id, currentRootNetworkUuid]); + }, [pccMinStatus, intl, snackError, studyUuid, nodeUuid, currentRootNetworkUuid]); const openLoader = useOpenLoaderShortWait({ isLoading: pccMinStatus === RunningStatus.RUNNING || isFetching, @@ -169,8 +166,6 @@ export const PccMinResult: FunctionComponent = ({ result={result} isFetching={isFetching} onFilter={memoizedSetPageCallback} - onGridColumnsChanged={onGridColumnsChanged} - onRowDataUpdated={onRowDataUpdated} filters={filters} /> Date: Fri, 31 Oct 2025 12:49:09 +0100 Subject: [PATCH 10/27] refactoring .. Signed-off-by: SOUISSI Maissa (Externe) --- src/components/results/common/utils.ts | 41 +++++++ .../results/pccmin/pcc-min-result-tab.tsx | 84 +++++++------ .../results/pccmin/pcc-min-result-table.tsx | 47 +++---- .../results/pccmin/pcc-min-result.tsx | 17 +-- .../results/pccmin/pcc-min-result.type.ts | 58 ++------- .../results/pccmin/pcc-min-results.tsx | 115 ------------------ .../security-analysis.type.ts | 16 +-- .../shortcircuit-analysis-result.type.ts | 33 +---- .../utils/renderTable-ExportCsv.tsx | 7 +- src/services/study/short-circuit-analysis.ts | 7 +- 10 files changed, 133 insertions(+), 292 deletions(-) delete mode 100644 src/components/results/pccmin/pcc-min-results.tsx diff --git a/src/components/results/common/utils.ts b/src/components/results/common/utils.ts index 2a8492c2ff..9b7a6a31e0 100644 --- a/src/components/results/common/utils.ts +++ b/src/components/results/common/utils.ts @@ -7,6 +7,7 @@ import { NA_Value } from 'components/custom-aggrid/utils/format-values-utils'; import { IntlShape } from 'react-intl'; import type { MuiStyles } from '@gridsuite/commons-ui'; +import { FilterConfig, SortConfig } from 'types/custom-aggrid-types'; export const PERMANENT_LIMIT_NAME = 'permanent'; @@ -39,8 +40,48 @@ export enum FilterType { SUBSTATION_PROPERTY = 'substationProperty', } +export interface Selector { + page: number; + size: number; + filter: FilterConfig[] | null; + sort: SortConfig[]; +} + export const resultsStyles = { sldLink: { color: 'node.background', }, } as const satisfies MuiStyles; + +export type Pageable = { + offset?: number; + pageNumber?: number; + pageSize?: number; + paged?: boolean; + sort?: Sort; + unpaged?: boolean; +}; + +export type Sort = { + empty?: boolean; + sorted?: boolean; + unsorted?: boolean; +}; + +export interface Page { + content: ResultType[]; + pageable: Pageable; + last: boolean; + totalPages: number; + totalElements: number; + first: boolean; + size: number; + number: number; + sort: { + sorted: boolean; + empty: boolean; + unsorted: boolean; + }; + numberOfElements: number; + empty: boolean; +} diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index b6f6875afb..c6c56fff62 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -67,47 +67,55 @@ export const PccMinResultTab: FunctionComponent = ({ return ( <> - - - } /> - } /> - - {resultOrLogIndex === RESULTS_TAB_INDEX && ( - <> - - + + + } /> + } /> + + + {/* Global filter */} + + + + + + {/* Tab panel content */} + + {resultOrLogIndex === RESULTS_TAB_INDEX && ( + + - - )} - - {resultOrLogIndex === RESULTS_TAB_INDEX && ( - - )} - {resultOrLogIndex === LOGS_TAB_INDEX && ( - <> - {openLoader && } - {(pccMinStatus === RunningStatus.SUCCEED || pccMinStatus === RunningStatus.FAILED) && ( - )} - - )} + + {resultOrLogIndex === LOGS_TAB_INDEX && ( + <> + {/* Loader */} + {openLoader && } + + {/* Logs viewer */} + {(pccMinStatus === RunningStatus.SUCCEED || pccMinStatus === RunningStatus.FAILED) && ( + + + + )} + + )} + + ); }; diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx index 2b9c1d8f15..6948813693 100644 --- a/src/components/results/pccmin/pcc-min-result-table.tsx +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2022, RTE (http://www.rte-france.com) + * Copyright (c) 2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. @@ -24,16 +24,12 @@ import { FILTER_NUMBER_COMPARATORS, FILTER_TEXT_COMPARATORS, } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; -import { SinglePccMinResultInfos } from './pcc-min-result.type'; +import { PccMinResultTableProps, SinglePccMinResultInfos } from './pcc-min-result.type'; import { AgGridReact } from 'ag-grid-react'; import { RenderTableAndExportCsv } from 'components/utils/renderTable-ExportCsv'; - -interface PccMinResultTableProps { - result: SinglePccMinResultInfos[]; - isFetching: boolean; - onFilter: () => void; - filters: FilterConfig[]; -} +import { RESULTS_LOADING_DELAY } from 'components/network/constants'; +import RunningStatus from 'components/utils/running-status'; +import { useOpenLoaderShortWait } from 'components/dialogs/commons/handle-loader'; const PccMinResultTable: FunctionComponent = ({ result, isFetching, onFilter, filters }) => { const intl = useIntl(); @@ -179,21 +175,26 @@ const PccMinResultTable: FunctionComponent = ({ result, const rowsToShow = getRows(rows, pccMinStatus); const gridRef = useRef(null); + const openLoader = useOpenLoaderShortWait({ + isLoading: pccMinStatus === RunningStatus.RUNNING || isFetching, + delay: RESULTS_LOADING_DELAY, + }); return ( - - + + + + ); }; diff --git a/src/components/results/pccmin/pcc-min-result.tsx b/src/components/results/pccmin/pcc-min-result.tsx index 15948d1d8a..0d656554c9 100644 --- a/src/components/results/pccmin/pcc-min-result.tsx +++ b/src/components/results/pccmin/pcc-min-result.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2023, RTE (http://www.rte-france.com) + * Copyright (c) 2025, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. @@ -11,7 +11,7 @@ import { FunctionComponent, useCallback, useEffect, useState } from 'react'; import { ComputingType, useSnackMessage } from '@gridsuite/commons-ui'; import { ColDef, GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; -import { FROM_COLUMN_TO_FIELD_PCC_MIN, SCAPagedResults, SinglePccMinResultInfos } from './pcc-min-result.type'; +import { FROM_COLUMN_TO_FIELD_PCC_MIN, PagedPccMinResults, SinglePccMinResultInfos } from './pcc-min-result.type'; import { useIntl } from 'react-intl'; import { useFilterSelector } from 'hooks/use-filter-selector'; import { usePaginationSelector } from 'hooks/use-pagination-selector'; @@ -111,7 +111,7 @@ export const PccMinResult: FunctionComponent = ({ selector, globalFilters, }) - .then((result: SCAPagedResults | null) => { + .then((result: PagedPccMinResults | null) => { if (active) { const { content = [], totalElements = 0 } = result || {}; updateResult(content); @@ -153,15 +153,8 @@ export const PccMinResult: FunctionComponent = ({ return; } }, [pccMinStatus, intl, snackError, studyUuid, nodeUuid, currentRootNetworkUuid]); - - const openLoader = useOpenLoaderShortWait({ - isLoading: pccMinStatus === RunningStatus.RUNNING || isFetching, - delay: RESULTS_LOADING_DELAY, - }); - return ( - <> - {openLoader && } + = ({ onRowsPerPageChange={handleChangeRowsPerPage} {...customTablePaginationProps} /> - + ); }; diff --git a/src/components/results/pccmin/pcc-min-result.type.ts b/src/components/results/pccmin/pcc-min-result.type.ts index f24414bf20..9bb8fabbfd 100644 --- a/src/components/results/pccmin/pcc-min-result.type.ts +++ b/src/components/results/pccmin/pcc-min-result.type.ts @@ -5,16 +5,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { ColDef } from 'ag-grid-community'; import type { UUID } from 'node:crypto'; import { FilterConfig, SortConfig } from 'types/custom-aggrid-types'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; +import { Page, Selector } from '../common/utils'; -export interface PccMinResult { - resultUuid: UUID; - writeTimeStamp: Date; - singlePccMinResultInfos: SinglePccMinResultInfos[]; -} export interface SinglePccMinResultInfos { singlePccMinResultUuid: string; busId: String; @@ -24,66 +19,27 @@ export interface SinglePccMinResultInfos { r: number; } -type Pageable = { - sort: { - sorted: boolean; - empty: boolean; - unsorted: boolean; - }; - pageNumber: number; - pageSize: number; - offset: number; - paged: boolean; - unpaged: boolean; -}; - -interface Page { - content: ResultType[]; - pageable: Pageable; - last: boolean; - totalPages: number; - totalElements: number; - first: boolean; - size: number; - number: number; - sort: { - sorted: boolean; - empty: boolean; - unsorted: boolean; - }; - numberOfElements: number; - empty: boolean; -} - export interface PccMinResultTabProps { studyUuid: UUID; nodeUuid: UUID; currentRootNetworkUuid: UUID; } -export type SCAPagedResults = Page; +export type PagedPccMinResults = Page; export interface PccMinResultTableProps { - isLoadingResult: boolean; - columnDefs: ColDef[]; - tableName: string; + result: SinglePccMinResultInfos[]; + isFetching: boolean; + onFilter: () => void; + filters: FilterConfig[]; } -export interface PccMinResultStatusProps { - result: PccMinResult; -} interface PccMinResults { studyUuid: UUID | null; currentNodeUuid?: UUID; currentRootNetworkUuid?: UUID; globalFilters?: GlobalFilters; } -export interface PccMinResultProps extends PccMinResultTableProps, PccMinResultStatusProps {} -interface Selector { - page: number; - size: number; - filter: FilterConfig[] | null; - sort: SortConfig[]; -} + export interface PccMinPagedResults extends PccMinResults { selector: Partial; } diff --git a/src/components/results/pccmin/pcc-min-results.tsx b/src/components/results/pccmin/pcc-min-results.tsx deleted file mode 100644 index df9a90f1fe..0000000000 --- a/src/components/results/pccmin/pcc-min-results.tsx +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -import { FunctionComponent, useCallback, useMemo, useRef } from 'react'; - -import { useIntl } from 'react-intl'; -import { useSelector } from 'react-redux'; -import { Box, useTheme } from '@mui/material'; -import { GridReadyEvent, RowClassParams } from 'ag-grid-community'; - -import { ComputingType } from '@gridsuite/commons-ui'; -import { AppState } from '../../../redux/reducer'; - -import { getNoRowsMessage, getRows, useIntlResultStatusMessages } from '../../utils/aggrid-rows-handler'; -import { DefaultCellRenderer } from '../../custom-aggrid/cell-renderers'; - -import LinearProgress from '@mui/material/LinearProgress'; -import { RunningStatus } from '../../utils/running-status'; -import { useOpenLoaderShortWait } from '../../dialogs/commons/handle-loader'; -import { RESULTS_LOADING_DELAY } from '../../network/constants'; -import { RenderTableAndExportCsv } from '../../utils/renderTable-ExportCsv'; -import { AgGridReact } from 'ag-grid-react'; -import { PccMinResultProps } from './pcc-min-result.type'; - -export const PccMinResults: FunctionComponent = ({ - result, - isLoadingResult, - columnDefs, - tableName, -}) => { - const theme = useTheme(); - const intl = useIntl(); - const gridRef = useRef(null); - - const tableNameFormatted = intl.formatMessage({ id: tableName }); - - const PccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); - - //We give each tab its own loader, so we don't have a loader spinning because another tab is still doing some work - const openLoaderTab = useOpenLoaderShortWait({ - isLoading: - // We want the loader to start when the state estimation begins - PccMinStatus === RunningStatus.RUNNING || - // We still want the loader to be displayed for the remaining time there is between "the state estimation is over" - // and "the data is post processed and can be displayed" - PccMinStatus === RunningStatus.SUCCEED || - isLoadingResult, - delay: RESULTS_LOADING_DELAY, - }); - - const getRowStyle = useCallback( - (params: RowClassParams) => { - if (params?.data?.elementId) { - return { - backgroundColor: theme.selectedRow.background, - }; - } - }, - [theme.selectedRow.background] - ); - - const onRowDataUpdated = useCallback((params: any) => { - if (params.api) { - params.api.sizeColumnsToFit(); - } - }, []); - - const onGridReady = useCallback(({ api }: GridReadyEvent) => { - api?.sizeColumnsToFit(); - }, []); - const messages = useIntlResultStatusMessages(intl, true); - - const defaultColDef = useMemo( - () => ({ - filter: false, - sortable: false, - resizable: true, - lockPinned: true, - suppressMovable: true, - wrapHeaderText: true, - autoHeaderHeight: true, - flex: 1, - cellRenderer: DefaultCellRenderer, - }), - [] - ); - - const renderPccMinResults = () => { - const message = getNoRowsMessage(messages, result.singlePccMinResultInfos, PccMinStatus, !isLoadingResult); - const rowsToShow = getRows(result.singlePccMinResultInfos, PccMinStatus); - - return ( - <> - {openLoaderTab && } - - - ); - }; - - return renderPccMinResults(); -}; diff --git a/src/components/results/securityanalysis/security-analysis.type.ts b/src/components/results/securityanalysis/security-analysis.type.ts index d3f4ae8db3..985543b099 100644 --- a/src/components/results/securityanalysis/security-analysis.type.ts +++ b/src/components/results/securityanalysis/security-analysis.type.ts @@ -12,6 +12,7 @@ import type { UUID } from 'node:crypto'; import { FilterConfig, SortConfig } from '../../../types/custom-aggrid-types'; import { TablePaginationProps } from '@mui/material'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; +import { Pageable, Sort } from '../common/utils'; export interface LimitViolation { subjectId?: string; @@ -90,21 +91,6 @@ export interface PreContingencyResult { export type QueryParamsType = Record; -type Sort = { - empty?: boolean; - sorted?: boolean; - unsorted?: boolean; -}; - -type Pageable = { - offset?: number; - pageNumber?: number; - pageSize?: number; - paged?: boolean; - sort?: Sort; - unpaged?: boolean; -}; - export type SubjectIdRendererType = (cellData: ICellRendererParams) => React.JSX.Element | undefined; export interface SecurityAnalysisNmkResult { diff --git a/src/components/results/shortcircuit/shortcircuit-analysis-result.type.ts b/src/components/results/shortcircuit/shortcircuit-analysis-result.type.ts index 87559418f4..cc927870a1 100644 --- a/src/components/results/shortcircuit/shortcircuit-analysis-result.type.ts +++ b/src/components/results/shortcircuit/shortcircuit-analysis-result.type.ts @@ -5,6 +5,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import { Page, Pageable } from '../common/utils'; + export interface SCAFault { id: string; elementId: string; @@ -44,19 +46,6 @@ export interface SCAFaultResult { feederResults?: SCAFeederResult[]; } -type Pageable = { - sort: { - sorted: boolean; - empty: boolean; - unsorted: boolean; - }; - pageNumber: number; - pageSize: number; - offset: number; - paged: boolean; - unpaged: boolean; -}; - export type SCAResult = { resultUuid: string; writeTimeStamp: any; @@ -65,24 +54,6 @@ export type SCAResult = { export type SCAPagedResults = Page | Page; -interface Page { - content: ResultType[]; - pageable: Pageable; - last: boolean; - totalPages: number; - totalElements: number; - first: boolean; - size: number; - number: number; - sort: { - sorted: boolean; - empty: boolean; - unsorted: boolean; - }; - numberOfElements: number; - empty: boolean; -} - export enum ShortCircuitAnalysisResultTabs { ALL_BUSES = 0, ONE_BUS = 1, diff --git a/src/components/utils/renderTable-ExportCsv.tsx b/src/components/utils/renderTable-ExportCsv.tsx index 48bfce0fec..e372a9a8f6 100644 --- a/src/components/utils/renderTable-ExportCsv.tsx +++ b/src/components/utils/renderTable-ExportCsv.tsx @@ -9,7 +9,7 @@ import { FunctionComponent, RefObject } from 'react'; import { ColDef, GridReadyEvent, RowClassParams, RowDataUpdatedEvent, RowStyle } from 'ag-grid-community'; import { CustomAGGrid, CsvExport, type MuiStyles } from '@gridsuite/commons-ui'; import { AgGridReact } from 'ag-grid-react'; -import { Box } from '@mui/material'; +import { Box, LinearProgress } from '@mui/material'; import { AGGRID_LOCALES } from '../../translations/not-intl/aggrid-locales'; import { useSelector } from 'react-redux'; import { AppState } from '../../redux/reducer'; @@ -36,6 +36,7 @@ interface RenderTableAndExportCsvProps { defaultColDef: ColDef; tableName: string; rows: any[]; + showLinearProgress?: boolean; onRowDataUpdated: (event: RowDataUpdatedEvent) => void; onGridReady: ((event: GridReadyEvent) => void) | undefined; getRowStyle?: (params: RowClassParams) => RowStyle | undefined; @@ -54,6 +55,7 @@ export const RenderTableAndExportCsv: FunctionComponent { const isRowsEmpty = !rows || rows.length === 0; const language = useSelector((state: AppState) => state.computedLanguage); @@ -71,6 +73,9 @@ export const RenderTableAndExportCsv: FunctionComponent gridRef.current?.api?.exportDataAsCsv(params)} /> + + {showLinearProgress && } + {rows && ( ; } From dca14870be4a43022725c5b1a01568dab92b932f Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Sun, 2 Nov 2025 21:28:58 +0100 Subject: [PATCH 11/27] refactoring Signed-off-by: SOUISSI Maissa (Externe) --- src/components/results/common/utils.ts | 2 +- .../loadflow/load-flow-result-utils.ts | 17 ++++------ .../results/pccmin/pcc-min-result-table.tsx | 31 +++++++------------ .../shortcircuit-analysis-result-table.tsx | 19 ++++-------- src/services/study/pcc-min.ts | 31 +++++++++---------- src/types/custom-aggrid-types.ts | 15 +++++++++ 6 files changed, 54 insertions(+), 61 deletions(-) diff --git a/src/components/results/common/utils.ts b/src/components/results/common/utils.ts index 9b7a6a31e0..29c6d26b76 100644 --- a/src/components/results/common/utils.ts +++ b/src/components/results/common/utils.ts @@ -7,7 +7,7 @@ import { NA_Value } from 'components/custom-aggrid/utils/format-values-utils'; import { IntlShape } from 'react-intl'; import type { MuiStyles } from '@gridsuite/commons-ui'; -import { FilterConfig, SortConfig } from 'types/custom-aggrid-types'; +import { FilterType as AgGridFilterType, FilterConfig, SortConfig } from 'types/custom-aggrid-types'; export const PERMANENT_LIMIT_NAME = 'permanent'; diff --git a/src/components/results/loadflow/load-flow-result-utils.ts b/src/components/results/loadflow/load-flow-result-utils.ts index 37e1b3070c..5076562cca 100644 --- a/src/components/results/loadflow/load-flow-result-utils.ts +++ b/src/components/results/loadflow/load-flow-result-utils.ts @@ -26,7 +26,12 @@ import { AppState } from 'redux/reducer'; import RunningStatus from 'components/utils/running-status'; import { CustomAggridComparatorFilter } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter'; import CustomAggridDurationFilter from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-duration-filter'; -import { FilterConfig, FilterType as AgGridFilterType } from '../../../types/custom-aggrid-types'; +import { + FilterConfig, + FilterType as AgGridFilterType, + textFilterParams, + numericFilterParams, +} from '../../../types/custom-aggrid-types'; import { CustomAggridAutocompleteFilter } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-autocomplete-filter'; import { ColumnContext, @@ -74,21 +79,11 @@ export const FROM_COLUMN_TO_FIELD_LOADFLOW_RESULT: Record = { distributedActivePower: 'distributedActivePower', }; -const textFilterParams = { - dataType: FILTER_DATA_TYPES.TEXT, - comparators: [FILTER_TEXT_COMPARATORS.STARTS_WITH, FILTER_TEXT_COMPARATORS.CONTAINS], -}; - const translatedFilterParams = { dataType: FILTER_DATA_TYPES.TEXT, comparators: [FILTER_TEXT_COMPARATORS.EQUALS], }; -const numericFilterParams = { - dataType: FILTER_DATA_TYPES.NUMBER, - comparators: Object.values(FILTER_NUMBER_COMPARATORS), -}; - export const mappingFields = (index: number): Record => { switch (index) { case 0: diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx index 6948813693..8bfe6beaeb 100644 --- a/src/components/results/pccmin/pcc-min-result-table.tsx +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -17,13 +17,12 @@ import { makeAgGridCustomHeaderColumn } from '../../custom-aggrid/utils/custom-a import { ComputingType } from '@gridsuite/commons-ui'; import { CustomAggridComparatorFilter } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter'; import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from '../../../utils/store-sort-filter-fields'; -import { FilterType as AgGridFilterType, FilterConfig } from '../../../types/custom-aggrid-types'; import { - ColumnContext, - FILTER_DATA_TYPES, - FILTER_NUMBER_COMPARATORS, - FILTER_TEXT_COMPARATORS, -} from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; + FilterType as AgGridFilterType, + numericFilterParams, + textFilterParams, +} from '../../../types/custom-aggrid-types'; +import { ColumnContext } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; import { PccMinResultTableProps, SinglePccMinResultInfos } from './pcc-min-result.type'; import { AgGridReact } from 'ag-grid-react'; import { RenderTableAndExportCsv } from 'components/utils/renderTable-ExportCsv'; @@ -32,9 +31,11 @@ import RunningStatus from 'components/utils/running-status'; import { useOpenLoaderShortWait } from 'components/dialogs/commons/handle-loader'; const PccMinResultTable: FunctionComponent = ({ result, isFetching, onFilter, filters }) => { - const intl = useIntl(); const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); + const intl = useIntl(); + const gridRef = useRef(null); + const columns = useMemo(() => { const data = (data: T, defaultData: T | undefined = {} as T) => data; @@ -49,16 +50,6 @@ const PccMinResultTable: FunctionComponent = ({ result, updateFilterCallback: onFilter, }; - const textFilterParams = { - dataType: FILTER_DATA_TYPES.TEXT, - comparators: [FILTER_TEXT_COMPARATORS.STARTS_WITH, FILTER_TEXT_COMPARATORS.CONTAINS], - }; - - const numericFilterParams = { - dataType: FILTER_DATA_TYPES.NUMBER, - comparators: Object.values(FILTER_NUMBER_COMPARATORS), - }; - const inputFilterParams = ( filterDefinition: Pick< Required['filterComponentParams']['filterParams'], @@ -171,11 +162,11 @@ const PccMinResultTable: FunctionComponent = ({ result, const rows: SinglePccMinResultInfos[] = useMemo(() => { return result; }, [result]); + const message = getNoRowsMessage(messages, rows, pccMinStatus, !isFetching); const rowsToShow = getRows(rows, pccMinStatus); - const gridRef = useRef(null); - const openLoader = useOpenLoaderShortWait({ + const openPccMinLoader = useOpenLoaderShortWait({ isLoading: pccMinStatus === RunningStatus.RUNNING || isFetching, delay: RESULTS_LOADING_DELAY, }); @@ -192,7 +183,7 @@ const PccMinResultTable: FunctionComponent = ({ result, onGridReady={onGridReady} overlayNoRowsTemplate={message} skipColumnHeaders={false} - showLinearProgress={openLoader} + showLinearProgress={openPccMinLoader} /> diff --git a/src/components/results/shortcircuit/shortcircuit-analysis-result-table.tsx b/src/components/results/shortcircuit/shortcircuit-analysis-result-table.tsx index 0df2469284..9bf853f68f 100644 --- a/src/components/results/shortcircuit/shortcircuit-analysis-result-table.tsx +++ b/src/components/results/shortcircuit/shortcircuit-analysis-result-table.tsx @@ -26,14 +26,17 @@ import { convertSide } from '../loadflow/load-flow-result-utils'; import { CustomAggridComparatorFilter } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter'; import { CustomAggridAutocompleteFilter } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-autocomplete-filter'; import { SHORTCIRCUIT_ANALYSIS_RESULT_SORT_STORE } from '../../../utils/store-sort-filter-fields'; -import { FilterType as AgGridFilterType, FilterConfig } from '../../../types/custom-aggrid-types'; +import { + FilterType as AgGridFilterType, + FilterConfig, + numericFilterParams, + textFilterParams, +} from '../../../types/custom-aggrid-types'; import { mappingTabs } from './shortcircuit-analysis-result-content'; import { resultsStyles } from '../common/utils'; import { ColumnContext, FILTER_DATA_TYPES, - FILTER_NUMBER_COMPARATORS, - FILTER_TEXT_COMPARATORS, FilterEnumsType, } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales'; @@ -145,16 +148,6 @@ const ShortCircuitAnalysisResultTable: FunctionComponent['filterComponentParams']['filterParams'], diff --git a/src/services/study/pcc-min.ts b/src/services/study/pcc-min.ts index 9f6006e05f..f89f0d2b23 100644 --- a/src/services/study/pcc-min.ts +++ b/src/services/study/pcc-min.ts @@ -14,37 +14,37 @@ export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootN console.info( `Running pcc min on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` ); - const url = + const startPccminUrl = getStudyUrlWithNodeUuidAndRootNetworkUuid(studyUuid, currentNodeUuid, currentRootNetworkUuid) + '/pcc-min/run'; - console.debug(url); - return backendFetch(url, { method: 'post' }); + console.debug(startPccminUrl); + return backendFetch(startPccminUrl, { method: 'post' }); } export function stopPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID) { console.info( `Stopping pcc min on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` ); - const url = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( + const stopPccminUrl = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( studyUuid, currentNodeUuid, currentRootNetworkUuid )}/pcc-min/stop`; - console.debug(url); - return backendFetch(url, { method: 'put' }); + console.debug(stopPccminUrl); + return backendFetch(stopPccminUrl, { method: 'put' }); } export function fetchPccMinStatus(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID) { console.info( `Fetching pcc min status on ${studyUuid} on root network '${currentRootNetworkUuid}' and node ${currentNodeUuid} ...` ); - const url = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( + const statusUrl = `${getStudyUrlWithNodeUuidAndRootNetworkUuid( studyUuid, currentNodeUuid, currentRootNetworkUuid )}/pcc-min/status`; - console.debug(url); - return backendFetchText(url); + console.debug(statusUrl); + return backendFetchText(statusUrl); } export function fetchPccMinPagedResults({ @@ -69,19 +69,18 @@ export function fetchPccMinPagedResults({ if (size) { urlSearchParams.append('size', String(size)); } + if (globalFilters && Object.keys(globalFilters).length > 0) { + urlSearchParams.append('globalFilters', JSON.stringify(globalFilters)); + } if (filter?.length) { urlSearchParams.append('filters', JSON.stringify(filter)); } - if (globalFilters && Object.keys(globalFilters).length > 0) { - urlSearchParams.append('globalFilters', JSON.stringify(globalFilters)); - } - - const url = + const resultsUrl = getStudyUrlWithNodeUuidAndRootNetworkUuid(studyUuid, currentNodeUuid, currentRootNetworkUuid) + '/pcc-min/result?' + urlSearchParams.toString(); - console.debug(url); - return backendFetchJson(url); + console.debug(resultsUrl); + return backendFetchJson(resultsUrl); } diff --git a/src/types/custom-aggrid-types.ts b/src/types/custom-aggrid-types.ts index a4119793f5..af5890e19a 100644 --- a/src/types/custom-aggrid-types.ts +++ b/src/types/custom-aggrid-types.ts @@ -5,6 +5,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { GridApi } from 'ag-grid-community'; +import { + FILTER_DATA_TYPES, + FILTER_NUMBER_COMPARATORS, + FILTER_TEXT_COMPARATORS, +} from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; import { ALL_BUSES, ONE_BUS, @@ -73,6 +78,16 @@ export type LogsPaginationConfig = { rowsPerPage: number; }; +export const textFilterParams = { + dataType: FILTER_DATA_TYPES.TEXT, + comparators: [FILTER_TEXT_COMPARATORS.STARTS_WITH, FILTER_TEXT_COMPARATORS.CONTAINS], +}; + +export const numericFilterParams = { + dataType: FILTER_DATA_TYPES.NUMBER, + comparators: Object.values(FILTER_NUMBER_COMPARATORS), +}; + export enum PaginationType { SecurityAnalysis = 'SecurityAnalysis', SensitivityAnalysis = 'SensitivityAnalysis', From 55c7df00903843e51a8f8ed15c191c83e0e20cfb Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Sun, 2 Nov 2025 21:46:10 +0100 Subject: [PATCH 12/27] increase duplication code Signed-off-by: SOUISSI Maissa (Externe) --- .../results/pccmin/pcc-min-result-tab.tsx | 6 ------ .../results/pccmin/pcc-min-result-table.tsx | 8 +++----- src/components/results/pccmin/pcc-min-result.tsx | 15 +++------------ 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index c6c56fff62..9099b708fb 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -16,7 +16,6 @@ import { ComputingType } from '@gridsuite/commons-ui'; import { RunningStatus } from '../../utils/running-status'; import { useOpenLoaderShortWait } from '../../dialogs/commons/handle-loader'; import { RESULTS_LOADING_DELAY } from '../../network/constants'; -import { ColDef, GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; import GlobalFilterSelector from '../common/global-filter/global-filter-selector'; import { EQUIPMENT_TYPES } from '../../utils/equipment-types'; import useGlobalFilters, { isGlobalFilterParameter } from '../common/global-filter/use-global-filters'; @@ -74,7 +73,6 @@ export const PccMinResultTab: FunctionComponent = ({ } /> - {/* Global filter */} = ({ - {/* Tab panel content */} {resultOrLogIndex === RESULTS_TAB_INDEX && ( @@ -103,10 +100,7 @@ export const PccMinResultTab: FunctionComponent = ({ {resultOrLogIndex === LOGS_TAB_INDEX && ( <> - {/* Loader */} {openLoader && } - - {/* Logs viewer */} {(pccMinStatus === RunningStatus.SUCCEED || pccMinStatus === RunningStatus.FAILED) && ( diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx index 8bfe6beaeb..546ae1174b 100644 --- a/src/components/results/pccmin/pcc-min-result-table.tsx +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -31,13 +31,12 @@ import RunningStatus from 'components/utils/running-status'; import { useOpenLoaderShortWait } from 'components/dialogs/commons/handle-loader'; const PccMinResultTable: FunctionComponent = ({ result, isFetching, onFilter, filters }) => { - const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); - const intl = useIntl(); + const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); const gridRef = useRef(null); const columns = useMemo(() => { - const data = (data: T, defaultData: T | undefined = {} as T) => data; + const data = (value: T) => value; const sortParams: ColumnContext['sortParams'] = { table: PCCMIN_ANALYSIS_RESULT_SORT_STORE, @@ -162,9 +161,8 @@ const PccMinResultTable: FunctionComponent = ({ result, const rows: SinglePccMinResultInfos[] = useMemo(() => { return result; }, [result]); - - const message = getNoRowsMessage(messages, rows, pccMinStatus, !isFetching); const rowsToShow = getRows(rows, pccMinStatus); + const message = getNoRowsMessage(messages, rows, pccMinStatus, !isFetching); const openPccMinLoader = useOpenLoaderShortWait({ isLoading: pccMinStatus === RunningStatus.RUNNING || isFetching, diff --git a/src/components/results/pccmin/pcc-min-result.tsx b/src/components/results/pccmin/pcc-min-result.tsx index 0d656554c9..127ccdc63c 100644 --- a/src/components/results/pccmin/pcc-min-result.tsx +++ b/src/components/results/pccmin/pcc-min-result.tsx @@ -9,7 +9,6 @@ import { useSelector } from 'react-redux'; import { AppState } from 'redux/reducer'; import { FunctionComponent, useCallback, useEffect, useState } from 'react'; import { ComputingType, useSnackMessage } from '@gridsuite/commons-ui'; -import { ColDef, GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; import { FROM_COLUMN_TO_FIELD_PCC_MIN, PagedPccMinResults, SinglePccMinResultInfos } from './pcc-min-result.type'; import { useIntl } from 'react-intl'; @@ -17,9 +16,7 @@ import { useFilterSelector } from 'hooks/use-filter-selector'; import { usePaginationSelector } from 'hooks/use-pagination-selector'; import RunningStatus from 'components/utils/running-status'; import { mapFieldsToColumnsFilter } from 'utils/aggrid-headers-utils'; -import { RESULTS_LOADING_DELAY } from 'components/network/constants'; -import { useOpenLoaderShortWait } from 'components/dialogs/commons/handle-loader'; -import { Box, LinearProgress } from '@mui/material'; +import { Box } from '@mui/material'; import { PAGE_OPTIONS } from '../securityanalysis/security-analysis-result-utils'; import CustomTablePagination from 'components/utils/custom-table-pagination'; import PccMinResultTable from './pcc-min-result-table'; @@ -43,10 +40,9 @@ export const PccMinResult: FunctionComponent = ({ customTablePaginationProps, globalFilters, }) => { - const intl = useIntl(); - const { snackError } = useSnackMessage(); - const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); + const { snackError } = useSnackMessage(); + const intl = useIntl(); const [result, setResult] = useState([]); @@ -148,11 +144,6 @@ export const PccMinResult: FunctionComponent = ({ globalFilters, ]); - useEffect(() => { - if (pccMinStatus !== RunningStatus.SUCCEED || !studyUuid || !nodeUuid || !currentRootNetworkUuid) { - return; - } - }, [pccMinStatus, intl, snackError, studyUuid, nodeUuid, currentRootNetworkUuid]); return ( Date: Sun, 2 Nov 2025 22:02:47 +0100 Subject: [PATCH 13/27] fixes Signed-off-by: SOUISSI Maissa (Externe) --- src/components/results/common/utils.ts | 2 +- .../loadflow/load-flow-result-utils.ts | 1 - .../results/pccmin/pcc-min-result-tab.tsx | 80 +++++++++---------- .../results/pccmin/pcc-min-result.tsx | 8 +- .../results/pccmin/pcc-min-result.type.ts | 6 +- .../shortcircuit-analysis-result.type.ts | 2 +- src/services/study/pcc-min.ts | 2 +- src/services/study/short-circuit-analysis.ts | 1 - 8 files changed, 48 insertions(+), 54 deletions(-) diff --git a/src/components/results/common/utils.ts b/src/components/results/common/utils.ts index 29c6d26b76..9b7a6a31e0 100644 --- a/src/components/results/common/utils.ts +++ b/src/components/results/common/utils.ts @@ -7,7 +7,7 @@ import { NA_Value } from 'components/custom-aggrid/utils/format-values-utils'; import { IntlShape } from 'react-intl'; import type { MuiStyles } from '@gridsuite/commons-ui'; -import { FilterType as AgGridFilterType, FilterConfig, SortConfig } from 'types/custom-aggrid-types'; +import { FilterConfig, SortConfig } from 'types/custom-aggrid-types'; export const PERMANENT_LIMIT_NAME = 'permanent'; diff --git a/src/components/results/loadflow/load-flow-result-utils.ts b/src/components/results/loadflow/load-flow-result-utils.ts index 5076562cca..a53f867ca4 100644 --- a/src/components/results/loadflow/load-flow-result-utils.ts +++ b/src/components/results/loadflow/load-flow-result-utils.ts @@ -36,7 +36,6 @@ import { CustomAggridAutocompleteFilter } from '../../custom-aggrid/custom-aggri import { ColumnContext, FILTER_DATA_TYPES, - FILTER_NUMBER_COMPARATORS, FILTER_TEXT_COMPARATORS, FilterEnumsType, } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index 9099b708fb..073f1f4d19 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -65,51 +65,49 @@ export const PccMinResultTab: FunctionComponent = ({ ); return ( - <> - - - - } /> - } /> - + + + + } /> + } /> + - - - + + + - - {resultOrLogIndex === RESULTS_TAB_INDEX && ( - - - - )} + + {resultOrLogIndex === RESULTS_TAB_INDEX && ( + + + + )} - {resultOrLogIndex === LOGS_TAB_INDEX && ( - <> - {openLoader && } - {(pccMinStatus === RunningStatus.SUCCEED || pccMinStatus === RunningStatus.FAILED) && ( - - - - )} - - )} - + {resultOrLogIndex === LOGS_TAB_INDEX && ( + <> + {openLoader && } + {(pccMinStatus === RunningStatus.SUCCEED || pccMinStatus === RunningStatus.FAILED) && ( + + + + )} + + )} - + ); }; diff --git a/src/components/results/pccmin/pcc-min-result.tsx b/src/components/results/pccmin/pcc-min-result.tsx index 127ccdc63c..75696a6535 100644 --- a/src/components/results/pccmin/pcc-min-result.tsx +++ b/src/components/results/pccmin/pcc-min-result.tsx @@ -23,7 +23,7 @@ import PccMinResultTable from './pcc-min-result-table'; import { FilterType, PaginationType, PccminTab } from 'types/custom-aggrid-types'; import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from 'utils/store-sort-filter-fields'; import { fetchPccMinPagedResults } from 'services/study/pcc-min'; -import { UUID } from 'crypto'; +import { UUID } from 'node:crypto'; interface PccMinResultProps { studyUuid: UUID; @@ -70,7 +70,7 @@ export const PccMinResult: FunctionComponent = ({ const handleChangeRowsPerPage = useCallback( (event: any) => { - const newRowsPerPage = parseInt(event.target.value, 10); + const newRowsPerPage = Number.parseInt(event.target.value, 10); dispatchPagination({ page: 0, rowsPerPage: newRowsPerPage }); }, [dispatchPagination] @@ -91,12 +91,10 @@ export const PccMinResult: FunctionComponent = ({ setIsFetching(true); updateResult(null); - const updatedFilters = filters ? filters : null; - const selector = { page, size: rowsPerPage as number, - filter: updatedFilters ? mapFieldsToColumnsFilter(updatedFilters, FROM_COLUMN_TO_FIELD_PCC_MIN) : null, + filter: filters ? mapFieldsToColumnsFilter(filters, FROM_COLUMN_TO_FIELD_PCC_MIN) : null, sort: sortConfig, }; diff --git a/src/components/results/pccmin/pcc-min-result.type.ts b/src/components/results/pccmin/pcc-min-result.type.ts index 9bb8fabbfd..62b778a345 100644 --- a/src/components/results/pccmin/pcc-min-result.type.ts +++ b/src/components/results/pccmin/pcc-min-result.type.ts @@ -6,15 +6,15 @@ */ import type { UUID } from 'node:crypto'; -import { FilterConfig, SortConfig } from 'types/custom-aggrid-types'; +import { FilterConfig } from 'types/custom-aggrid-types'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; import { Page, Selector } from '../common/utils'; export interface SinglePccMinResultInfos { singlePccMinResultUuid: string; - busId: String; + busId: string; pccMinTri: number; - limitingEquipment: String; + limitingEquipment: string; x: number; r: number; } diff --git a/src/components/results/shortcircuit/shortcircuit-analysis-result.type.ts b/src/components/results/shortcircuit/shortcircuit-analysis-result.type.ts index cc927870a1..9861dfabf4 100644 --- a/src/components/results/shortcircuit/shortcircuit-analysis-result.type.ts +++ b/src/components/results/shortcircuit/shortcircuit-analysis-result.type.ts @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { Page, Pageable } from '../common/utils'; +import { Page } from '../common/utils'; export interface SCAFault { id: string; diff --git a/src/services/study/pcc-min.ts b/src/services/study/pcc-min.ts index f89f0d2b23..a057822ea6 100644 --- a/src/services/study/pcc-min.ts +++ b/src/services/study/pcc-min.ts @@ -8,7 +8,7 @@ import { getStudyUrlWithNodeUuidAndRootNetworkUuid } from './index'; import { backendFetch, backendFetchJson, backendFetchText } from '@gridsuite/commons-ui'; import { PccMinPagedResults } from 'components/results/pccmin/pcc-min-result.type'; -import { UUID } from 'crypto'; +import { UUID } from 'node:crypto'; export function startPccMin(studyUuid: UUID, currentNodeUuid: UUID, currentRootNetworkUuid: UUID): Promise { console.info( diff --git a/src/services/study/short-circuit-analysis.ts b/src/services/study/short-circuit-analysis.ts index e6ad8e748c..b293dcba63 100644 --- a/src/services/study/short-circuit-analysis.ts +++ b/src/services/study/short-circuit-analysis.ts @@ -12,7 +12,6 @@ import { } from '../../components/results/shortcircuit/shortcircuit-analysis-result.type'; import { GsLang, backendFetch, backendFetchJson, backendFetchText } from '@gridsuite/commons-ui'; import type { UUID } from 'node:crypto'; -import { FilterConfig, SortConfig } from '../../types/custom-aggrid-types'; import { GlobalFilters } from '../../components/results/common/global-filter/global-filter-types'; import { Selector } from 'components/results/common/utils'; From c0305c0c0befbdded3ff00e144618bbd845b0d25 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Mon, 3 Nov 2025 10:40:58 +0100 Subject: [PATCH 14/27] fix Signed-off-by: SOUISSI Maissa (Externe) --- .../results/pccmin/pcc-min-result-tab.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index 073f1f4d19..fa09189ef6 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -71,15 +71,16 @@ export const PccMinResultTab: FunctionComponent = ({ } /> } /> - - - - + {resultOrLogIndex === RESULTS_TAB_INDEX && ( + + + + )} From dca5a301c20ccd606e42ca81f33e6e82c414448d Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Mon, 3 Nov 2025 13:28:03 +0100 Subject: [PATCH 15/27] fix filter for x and r Signed-off-by: SOUISSI Maissa (Externe) --- src/components/results/pccmin/pcc-min-result.type.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/results/pccmin/pcc-min-result.type.ts b/src/components/results/pccmin/pcc-min-result.type.ts index 62b778a345..3483a97eaa 100644 --- a/src/components/results/pccmin/pcc-min-result.type.ts +++ b/src/components/results/pccmin/pcc-min-result.type.ts @@ -49,6 +49,6 @@ export const FROM_COLUMN_TO_FIELD_PCC_MIN: Record = { pccMinTri: 'pccMinTri', iccMinTri: 'iccMinTri', limitingEquipment: 'limitingEquipment', - x: 'xOhm', - r: 'rOhm', + x: 'x', + r: 'r', }; From b4c53d574708671f1796399e978b77e6c76e49f7 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Mon, 3 Nov 2025 13:47:01 +0100 Subject: [PATCH 16/27] adjust filterable equipment types Signed-off-by: SOUISSI Maissa (Externe) --- src/components/results/pccmin/pcc-min-result-tab.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index fa09189ef6..d5cf49596a 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -51,7 +51,7 @@ export const PccMinResultTab: FunctionComponent = ({ }); const filterableEquipmentTypes: EQUIPMENT_TYPES[] = useMemo(() => { - return [EQUIPMENT_TYPES.VOLTAGE_LEVEL]; + return [EQUIPMENT_TYPES.LINE, EQUIPMENT_TYPES.TWO_WINDINGS_TRANSFORMER, EQUIPMENT_TYPES.GENERATOR]; }, []); useEffect(() => { From 679da25f0a98403281a3d3713db78168603b5da7 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Mon, 3 Nov 2025 16:11:19 +0100 Subject: [PATCH 17/27] review changes Signed-off-by: SOUISSI Maissa (Externe) --- src/components/results/common/utils.ts | 26 +++++------ .../results/pccmin/pcc-min-result-table.tsx | 45 +++++++++---------- .../results/pccmin/pcc-min-result.tsx | 8 ++-- .../security-analysis.type.ts | 18 ++------ .../utils/renderTable-ExportCsv.tsx | 2 +- src/translations/en.json | 4 +- 6 files changed, 42 insertions(+), 61 deletions(-) diff --git a/src/components/results/common/utils.ts b/src/components/results/common/utils.ts index fc2e943b83..ed9eddb72d 100644 --- a/src/components/results/common/utils.ts +++ b/src/components/results/common/utils.ts @@ -70,19 +70,15 @@ export type Sort = { }; export interface Page { - content: ResultType[]; - pageable: Pageable; - last: boolean; - totalPages: number; - totalElements: number; - first: boolean; - size: number; - number: number; - sort: { - sorted: boolean; - empty: boolean; - unsorted: boolean; - }; - numberOfElements: number; - empty: boolean; + content?: ResultType[]; + pageable?: Pageable; + last?: boolean; + totalPages?: number; + totalElements?: number; + first?: boolean; + size?: number; + number?: number; + sort?: Sort; + numberOfElements?: number; + empty?: boolean; } diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx index 546ae1174b..5fc304ccc9 100644 --- a/src/components/results/pccmin/pcc-min-result-table.tsx +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -67,28 +67,26 @@ const PccMinResultTable: FunctionComponent = ({ result, }; return [ - { - ...makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Bus' }), - colId: 'busId', - field: 'busId', - context: { - ...data({ sortParams, ...inputFilterParams(textFilterParams) }), - }, - }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Bus' }), + colId: 'busId', + field: 'busId', + context: { + ...data({ sortParams, ...inputFilterParams(textFilterParams) }), + }, minWidth: 180, - }, - { - ...makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Contingency' }), - colId: 'limitingEquipment', - field: 'limitingEquipment', - context: { - ...data({ sortParams, ...inputFilterParams(textFilterParams) }), - }, - }), + }), + + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Contingency' }), + colId: 'limitingEquipment', + field: 'limitingEquipment', + context: { + ...data({ sortParams, ...inputFilterParams(textFilterParams) }), + }, + minWidth: 180, - }, + }), makeAgGridCustomHeaderColumn({ headerName: intl.formatMessage({ id: 'PccMinTri' }), colId: 'pccMinTri', @@ -158,11 +156,8 @@ const PccMinResultTable: FunctionComponent = ({ result, params.api.sizeColumnsToFit(); }, []); - const rows: SinglePccMinResultInfos[] = useMemo(() => { - return result; - }, [result]); - const rowsToShow = getRows(rows, pccMinStatus); - const message = getNoRowsMessage(messages, rows, pccMinStatus, !isFetching); + const rowsToShow = getRows(result, pccMinStatus); + const message = getNoRowsMessage(messages, result, pccMinStatus, !isFetching); const openPccMinLoader = useOpenLoaderShortWait({ isLoading: pccMinStatus === RunningStatus.RUNNING || isFetching, diff --git a/src/components/results/pccmin/pcc-min-result.tsx b/src/components/results/pccmin/pcc-min-result.tsx index 75696a6535..7006956bdf 100644 --- a/src/components/results/pccmin/pcc-min-result.tsx +++ b/src/components/results/pccmin/pcc-min-result.tsx @@ -87,7 +87,7 @@ export const PccMinResult: FunctionComponent = ({ if (!currentRootNetworkUuid) { return; } - let active = true; + let isMounted = true; // prevents state updates if the component has unmounted setIsFetching(true); updateResult(null); @@ -106,7 +106,7 @@ export const PccMinResult: FunctionComponent = ({ globalFilters, }) .then((result: PagedPccMinResults | null) => { - if (active) { + if (isMounted) { const { content = [], totalElements = 0 } = result || {}; updateResult(content); setCount(totalElements); @@ -119,13 +119,13 @@ export const PccMinResult: FunctionComponent = ({ }) ) .finally(() => { - if (active) { + if (isMounted) { setIsFetching(false); } }); return () => { - active = false; + isMounted = false; }; }, [ page, diff --git a/src/components/results/securityanalysis/security-analysis.type.ts b/src/components/results/securityanalysis/security-analysis.type.ts index 985543b099..57a3b38564 100644 --- a/src/components/results/securityanalysis/security-analysis.type.ts +++ b/src/components/results/securityanalysis/security-analysis.type.ts @@ -12,7 +12,7 @@ import type { UUID } from 'node:crypto'; import { FilterConfig, SortConfig } from '../../../types/custom-aggrid-types'; import { TablePaginationProps } from '@mui/material'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; -import { Pageable, Sort } from '../common/utils'; +import { Page } from '../common/utils'; export interface LimitViolation { subjectId?: string; @@ -93,19 +93,9 @@ export type QueryParamsType = Record React.JSX.Element | undefined; -export interface SecurityAnalysisNmkResult { - content?: ContingenciesFromConstraintItem[] | ConstraintsFromContingencyItem[] | null; - empty?: boolean; - first?: boolean; - last?: boolean; - number?: number; - numberOfElements?: number; - pageable?: Pageable; - size?: number; - sort?: Sort; - totalElements?: number; - totalPages?: number; -} +export type SecurityAnalysisNmkResult = Page< + ContingenciesFromConstraintItem[] | ConstraintsFromContingencyItem[] | null +>; // Components props interfaces export interface SecurityAnalysisTabProps { diff --git a/src/components/utils/renderTable-ExportCsv.tsx b/src/components/utils/renderTable-ExportCsv.tsx index e372a9a8f6..74e46a8e5f 100644 --- a/src/components/utils/renderTable-ExportCsv.tsx +++ b/src/components/utils/renderTable-ExportCsv.tsx @@ -39,7 +39,7 @@ interface RenderTableAndExportCsvProps { showLinearProgress?: boolean; onRowDataUpdated: (event: RowDataUpdatedEvent) => void; onGridReady: ((event: GridReadyEvent) => void) | undefined; - getRowStyle?: (params: RowClassParams) => RowStyle | undefined; + getRowStyle?: (params: RowClassParams) => RowStyle; overlayNoRowsTemplate: string | undefined; skipColumnHeaders: boolean; } diff --git a/src/translations/en.json b/src/translations/en.json index ba079508b4..86851da166 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1650,6 +1650,6 @@ "generatorMinimumActivePowerMaxValueError" : "Minimum active power must be inferior to maximum active power", "PccMinTri": "Pcc min (MVA) ", "IccMinTri": "Icc min (kA)", - "rOhm": "r (Ohm)", - "xOhm":"x (Ohm)" + "rOhm": "r ((Ω))", + "xOhm":"x ((Ω))" } From 9b4b052a9723a9792155df8dce131b76d587218d Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Mon, 3 Nov 2025 16:45:58 +0100 Subject: [PATCH 18/27] fix Signed-off-by: SOUISSI Maissa (Externe) --- src/components/utils/renderTable-ExportCsv.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/utils/renderTable-ExportCsv.tsx b/src/components/utils/renderTable-ExportCsv.tsx index 74e46a8e5f..e372a9a8f6 100644 --- a/src/components/utils/renderTable-ExportCsv.tsx +++ b/src/components/utils/renderTable-ExportCsv.tsx @@ -39,7 +39,7 @@ interface RenderTableAndExportCsvProps { showLinearProgress?: boolean; onRowDataUpdated: (event: RowDataUpdatedEvent) => void; onGridReady: ((event: GridReadyEvent) => void) | undefined; - getRowStyle?: (params: RowClassParams) => RowStyle; + getRowStyle?: (params: RowClassParams) => RowStyle | undefined; overlayNoRowsTemplate: string | undefined; skipColumnHeaders: boolean; } From e48ac68a852d6f6fb57cdba5bb1752a3583ed65f Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Mon, 3 Nov 2025 16:48:36 +0100 Subject: [PATCH 19/27] fix Signed-off-by: SOUISSI Maissa (Externe) --- src/components/utils/renderTable-ExportCsv.tsx | 2 +- src/components/voltage-init-result.tsx | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/components/utils/renderTable-ExportCsv.tsx b/src/components/utils/renderTable-ExportCsv.tsx index e372a9a8f6..74e46a8e5f 100644 --- a/src/components/utils/renderTable-ExportCsv.tsx +++ b/src/components/utils/renderTable-ExportCsv.tsx @@ -39,7 +39,7 @@ interface RenderTableAndExportCsvProps { showLinearProgress?: boolean; onRowDataUpdated: (event: RowDataUpdatedEvent) => void; onGridReady: ((event: GridReadyEvent) => void) | undefined; - getRowStyle?: (params: RowClassParams) => RowStyle | undefined; + getRowStyle?: (params: RowClassParams) => RowStyle; overlayNoRowsTemplate: string | undefined; skipColumnHeaders: boolean; } diff --git a/src/components/voltage-init-result.tsx b/src/components/voltage-init-result.tsx index aaf5df2f97..ab0e5a4576 100644 --- a/src/components/voltage-init-result.tsx +++ b/src/components/voltage-init-result.tsx @@ -292,9 +292,6 @@ export const VoltageInitResult: FunctionComponent = ({ onRowDataUpdated={onRowDataUpdated} onGridReady={onGridReady} skipColumnHeaders={false} - getRowStyle={function (_params: RowClassParams): RowStyle | undefined { - return undefined; - }} overlayNoRowsTemplate={undefined} /> @@ -333,9 +330,6 @@ export const VoltageInitResult: FunctionComponent = ({ onRowDataUpdated={onRowDataUpdated} onGridReady={onGridReady} skipColumnHeaders={false} - getRowStyle={function (_params: RowClassParams): RowStyle | undefined { - return undefined; - }} overlayNoRowsTemplate={undefined} /> @@ -384,9 +378,6 @@ export const VoltageInitResult: FunctionComponent = ({ onRowDataUpdated={onRowDataUpdated} onGridReady={onGridReady} skipColumnHeaders={false} - getRowStyle={function (_params: RowClassParams): RowStyle | undefined { - return undefined; - }} overlayNoRowsTemplate={undefined} /> ); From ca2c3c39d41f0223d3c5c1b84c202f39d4095dca Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Tue, 4 Nov 2025 10:22:59 +0100 Subject: [PATCH 20/27] revert Signed-off-by: SOUISSI Maissa (Externe) --- .../use-get-pcc-min-parameters.ts | 67 +++++++++++++++++++ .../results/pccmin/pcc-min-result-tab.tsx | 9 +-- .../utils/renderTable-ExportCsv.tsx | 2 +- src/components/voltage-init-result.tsx | 9 +++ 4 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 src/components/dialogs/parameters/state-estimation/use-get-pcc-min-parameters.ts diff --git a/src/components/dialogs/parameters/state-estimation/use-get-pcc-min-parameters.ts b/src/components/dialogs/parameters/state-estimation/use-get-pcc-min-parameters.ts new file mode 100644 index 0000000000..8c9697560a --- /dev/null +++ b/src/components/dialogs/parameters/state-estimation/use-get-pcc-min-parameters.ts @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { Dispatch, SetStateAction, useCallback, useEffect, useRef, useState } from 'react'; +import { useSelector } from 'react-redux'; +import { AppState } from '../../../../redux/reducer'; +import { useSnackMessage, ComputingType } from '@gridsuite/commons-ui'; +import { useOptionalServiceStatus } from '../../../../hooks/use-optional-service-status'; +import { OptionalServicesNames, OptionalServicesStatus } from '../../../utils/optional-services'; +import type { UUID } from 'node:crypto'; +import { StateEstimationParameters } from './state-estimation-parameters-utils'; +import { getStateEstimationStudyParameters } from '../../../../services/study/state-estimation'; +import { isComputationParametersUpdated } from '../use-parameters-notification'; + +export type UseGetStateEstimationParametersProps = [ + StateEstimationParameters | null, + Dispatch>, +]; + +export const useGetStateEstimationParameters = (): UseGetStateEstimationParametersProps => { + const studyUuid = useSelector((state: AppState) => state.studyUuid); + const studyUpdated = useSelector((state: AppState) => state.studyUpdated); + const { snackError } = useSnackMessage(); + const [stateEstimationParams, setStateEstimationParams] = useState(null); + + const stateEstimationAvailability = useOptionalServiceStatus(OptionalServicesNames.StateEstimation); + const stateEstimationAvailabilityRef = useRef(stateEstimationAvailability); + stateEstimationAvailabilityRef.current = stateEstimationAvailability; + + const fetchStateEstimationStudyParameters = useCallback( + (studyUuid: UUID) => { + getStateEstimationStudyParameters(studyUuid) + .then((params: StateEstimationParameters) => { + setStateEstimationParams(params); + }) + .catch((error) => { + snackError({ + messageTxt: error.message, + headerId: 'paramsRetrievingError', + }); + }); + }, + [snackError] + ); + useEffect(() => { + if (studyUuid && stateEstimationAvailability === OptionalServicesStatus.Up) { + fetchStateEstimationStudyParameters(studyUuid); + } + }, [stateEstimationAvailability, studyUuid, fetchStateEstimationStudyParameters]); + + // fetch the parameter if STATE_ESTIMATION notification type is received. + useEffect(() => { + if ( + studyUuid && + stateEstimationAvailabilityRef.current === OptionalServicesStatus.Up && + isComputationParametersUpdated(ComputingType.STATE_ESTIMATION, studyUpdated) + ) { + fetchStateEstimationStudyParameters(studyUuid); + } + }, [studyUuid, fetchStateEstimationStudyParameters, studyUpdated]); + + return [stateEstimationParams, setStateEstimationParams]; +}; diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index d5cf49596a..f5a50175dc 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -38,12 +38,9 @@ export const PccMinResultTab: FunctionComponent = ({ const { globalFilters, handleGlobalFilterChange } = useGlobalFilters(); const { countriesFilter, voltageLevelsFilter, propertiesFilter } = useGlobalFilterOptions(); - const handleSubTabChange = useCallback( - (event: React.SyntheticEvent, newIndex: number) => { - setResultOrLogIndex(newIndex); - }, - [setResultOrLogIndex] - ); + const handleSubTabChange = useCallback((event: React.SyntheticEvent, newIndex: number) => { + setResultOrLogIndex(newIndex); + }, []); const openLoader = useOpenLoaderShortWait({ isLoading: pccMinStatus === RunningStatus.RUNNING, diff --git a/src/components/utils/renderTable-ExportCsv.tsx b/src/components/utils/renderTable-ExportCsv.tsx index 74e46a8e5f..25ba656cb7 100644 --- a/src/components/utils/renderTable-ExportCsv.tsx +++ b/src/components/utils/renderTable-ExportCsv.tsx @@ -39,7 +39,7 @@ interface RenderTableAndExportCsvProps { showLinearProgress?: boolean; onRowDataUpdated: (event: RowDataUpdatedEvent) => void; onGridReady: ((event: GridReadyEvent) => void) | undefined; - getRowStyle?: (params: RowClassParams) => RowStyle; + getRowStyle?: (params: RowClassParams) => RowStyle | undefined; overlayNoRowsTemplate: string | undefined; skipColumnHeaders: boolean; } diff --git a/src/components/voltage-init-result.tsx b/src/components/voltage-init-result.tsx index ab0e5a4576..aaf5df2f97 100644 --- a/src/components/voltage-init-result.tsx +++ b/src/components/voltage-init-result.tsx @@ -292,6 +292,9 @@ export const VoltageInitResult: FunctionComponent = ({ onRowDataUpdated={onRowDataUpdated} onGridReady={onGridReady} skipColumnHeaders={false} + getRowStyle={function (_params: RowClassParams): RowStyle | undefined { + return undefined; + }} overlayNoRowsTemplate={undefined} /> @@ -330,6 +333,9 @@ export const VoltageInitResult: FunctionComponent = ({ onRowDataUpdated={onRowDataUpdated} onGridReady={onGridReady} skipColumnHeaders={false} + getRowStyle={function (_params: RowClassParams): RowStyle | undefined { + return undefined; + }} overlayNoRowsTemplate={undefined} /> @@ -378,6 +384,9 @@ export const VoltageInitResult: FunctionComponent = ({ onRowDataUpdated={onRowDataUpdated} onGridReady={onGridReady} skipColumnHeaders={false} + getRowStyle={function (_params: RowClassParams): RowStyle | undefined { + return undefined; + }} overlayNoRowsTemplate={undefined} /> ); From 5bb700e0b06a1d467afa6074e5444c31f2fae96d Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Tue, 4 Nov 2025 10:32:19 +0100 Subject: [PATCH 21/27] prettiers Signed-off-by: SOUISSI Maissa (Externe) --- src/components/utils/renderTable-ExportCsv.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/utils/renderTable-ExportCsv.tsx b/src/components/utils/renderTable-ExportCsv.tsx index 25ba656cb7..e372a9a8f6 100644 --- a/src/components/utils/renderTable-ExportCsv.tsx +++ b/src/components/utils/renderTable-ExportCsv.tsx @@ -39,7 +39,7 @@ interface RenderTableAndExportCsvProps { showLinearProgress?: boolean; onRowDataUpdated: (event: RowDataUpdatedEvent) => void; onGridReady: ((event: GridReadyEvent) => void) | undefined; - getRowStyle?: (params: RowClassParams) => RowStyle | undefined; + getRowStyle?: (params: RowClassParams) => RowStyle | undefined; overlayNoRowsTemplate: string | undefined; skipColumnHeaders: boolean; } From 63902d2f03ee8e5e23195889ea3fa4d0398e7087 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Tue, 4 Nov 2025 13:26:54 +0100 Subject: [PATCH 22/27] fix Signed-off-by: SOUISSI Maissa (Externe) --- .../use-get-pcc-min-parameters.ts | 67 ------------------- 1 file changed, 67 deletions(-) delete mode 100644 src/components/dialogs/parameters/state-estimation/use-get-pcc-min-parameters.ts diff --git a/src/components/dialogs/parameters/state-estimation/use-get-pcc-min-parameters.ts b/src/components/dialogs/parameters/state-estimation/use-get-pcc-min-parameters.ts deleted file mode 100644 index 8c9697560a..0000000000 --- a/src/components/dialogs/parameters/state-estimation/use-get-pcc-min-parameters.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -import { Dispatch, SetStateAction, useCallback, useEffect, useRef, useState } from 'react'; -import { useSelector } from 'react-redux'; -import { AppState } from '../../../../redux/reducer'; -import { useSnackMessage, ComputingType } from '@gridsuite/commons-ui'; -import { useOptionalServiceStatus } from '../../../../hooks/use-optional-service-status'; -import { OptionalServicesNames, OptionalServicesStatus } from '../../../utils/optional-services'; -import type { UUID } from 'node:crypto'; -import { StateEstimationParameters } from './state-estimation-parameters-utils'; -import { getStateEstimationStudyParameters } from '../../../../services/study/state-estimation'; -import { isComputationParametersUpdated } from '../use-parameters-notification'; - -export type UseGetStateEstimationParametersProps = [ - StateEstimationParameters | null, - Dispatch>, -]; - -export const useGetStateEstimationParameters = (): UseGetStateEstimationParametersProps => { - const studyUuid = useSelector((state: AppState) => state.studyUuid); - const studyUpdated = useSelector((state: AppState) => state.studyUpdated); - const { snackError } = useSnackMessage(); - const [stateEstimationParams, setStateEstimationParams] = useState(null); - - const stateEstimationAvailability = useOptionalServiceStatus(OptionalServicesNames.StateEstimation); - const stateEstimationAvailabilityRef = useRef(stateEstimationAvailability); - stateEstimationAvailabilityRef.current = stateEstimationAvailability; - - const fetchStateEstimationStudyParameters = useCallback( - (studyUuid: UUID) => { - getStateEstimationStudyParameters(studyUuid) - .then((params: StateEstimationParameters) => { - setStateEstimationParams(params); - }) - .catch((error) => { - snackError({ - messageTxt: error.message, - headerId: 'paramsRetrievingError', - }); - }); - }, - [snackError] - ); - useEffect(() => { - if (studyUuid && stateEstimationAvailability === OptionalServicesStatus.Up) { - fetchStateEstimationStudyParameters(studyUuid); - } - }, [stateEstimationAvailability, studyUuid, fetchStateEstimationStudyParameters]); - - // fetch the parameter if STATE_ESTIMATION notification type is received. - useEffect(() => { - if ( - studyUuid && - stateEstimationAvailabilityRef.current === OptionalServicesStatus.Up && - isComputationParametersUpdated(ComputingType.STATE_ESTIMATION, studyUpdated) - ) { - fetchStateEstimationStudyParameters(studyUuid); - } - }, [studyUuid, fetchStateEstimationStudyParameters, studyUpdated]); - - return [stateEstimationParams, setStateEstimationParams]; -}; From 106cc5090c1c862ac51ec80287dd22b3aec0cfc4 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 5 Nov 2025 14:45:21 +0100 Subject: [PATCH 23/27] refactoring Signed-off-by: SOUISSI Maissa (Externe) --- .../results/loadflow/limit-violation-result.tsx | 11 ----------- .../results/loadflow/load-flow-result.tsx | 12 ------------ .../results/pccmin/pcc-min-result-table.tsx | 12 ------------ .../state-estimation-quality-result.tsx | 2 -- src/components/utils/renderTable-ExportCsv.tsx | 15 +++++++++------ src/components/voltage-init-result.tsx | 15 --------------- 6 files changed, 9 insertions(+), 58 deletions(-) diff --git a/src/components/results/loadflow/limit-violation-result.tsx b/src/components/results/loadflow/limit-violation-result.tsx index 3f8bbb0ac6..06dc93e1ea 100644 --- a/src/components/results/loadflow/limit-violation-result.tsx +++ b/src/components/results/loadflow/limit-violation-result.tsx @@ -65,12 +65,6 @@ export const LimitViolationResult: FunctionComponent [] ); - const onRowDataUpdated = useCallback((params: any) => { - if (params.api) { - params.api.sizeColumnsToFit(); - } - }, []); - const getRowStyle = useCallback( (params: RowClassParams) => { if (params?.data?.elementId) { @@ -82,9 +76,6 @@ export const LimitViolationResult: FunctionComponent [theme.selectedRow.background] ); - const onGridReady = useCallback(({ api }: GridReadyEvent) => { - api?.sizeColumnsToFit(); - }, []); const messages = useIntlResultStatusMessages(intl); const renderLoadFlowLimitViolations = () => { @@ -100,8 +91,6 @@ export const LimitViolationResult: FunctionComponent defaultColDef={defaultColDef} tableName={tableName} rows={rowsToShow} - onRowDataUpdated={onRowDataUpdated} - onGridReady={onGridReady} getRowStyle={getRowStyle} overlayNoRowsTemplate={message} skipColumnHeaders={false} diff --git a/src/components/results/loadflow/load-flow-result.tsx b/src/components/results/loadflow/load-flow-result.tsx index 25557ab367..b718d733ab 100644 --- a/src/components/results/loadflow/load-flow-result.tsx +++ b/src/components/results/loadflow/load-flow-result.tsx @@ -54,12 +54,6 @@ export const LoadFlowResult: FunctionComponent = ({ result, [] ); - const onRowDataUpdated = useCallback((params: any) => { - if (params.api) { - params.api.sizeColumnsToFit(); - } - }, []); - const messages = useIntlResultStatusMessages(intl); const getRowStyle = useCallback( @@ -73,10 +67,6 @@ export const LoadFlowResult: FunctionComponent = ({ result, [theme.selectedRow.background] ); - const onGridReady = useCallback(({ api }: GridReadyEvent) => { - api?.sizeColumnsToFit(); - }, []); - const renderLoadFlowResult = () => { const message = getNoRowsMessage( messages, @@ -97,8 +87,6 @@ export const LoadFlowResult: FunctionComponent = ({ result, id: 'LoadFlowResultsStatus', })} rows={rowsToShow} - onRowDataUpdated={onRowDataUpdated} - onGridReady={onGridReady} getRowStyle={getRowStyle} overlayNoRowsTemplate={message} skipColumnHeaders={false} diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx index 5fc304ccc9..9c2475f917 100644 --- a/src/components/results/pccmin/pcc-min-result-table.tsx +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -146,16 +146,6 @@ const PccMinResultTable: FunctionComponent = ({ result, [] ); - const onGridReady = useCallback((params: GridReadyEvent) => { - if (params?.api) { - params.api.sizeColumnsToFit(); - } - }, []); - - const onRowDataUpdated = useCallback((params: RowDataUpdatedEvent) => { - params.api.sizeColumnsToFit(); - }, []); - const rowsToShow = getRows(result, pccMinStatus); const message = getNoRowsMessage(messages, result, pccMinStatus, !isFetching); @@ -172,8 +162,6 @@ const PccMinResultTable: FunctionComponent = ({ result, defaultColDef={defaultColDef} tableName={intl.formatMessage({ id: 'Results' })} rows={rowsToShow} - onRowDataUpdated={onRowDataUpdated} - onGridReady={onGridReady} overlayNoRowsTemplate={message} skipColumnHeaders={false} showLinearProgress={openPccMinLoader} diff --git a/src/components/results/stateestimation/state-estimation-quality-result.tsx b/src/components/results/stateestimation/state-estimation-quality-result.tsx index 1af445d926..44b5877059 100644 --- a/src/components/results/stateestimation/state-estimation-quality-result.tsx +++ b/src/components/results/stateestimation/state-estimation-quality-result.tsx @@ -111,8 +111,6 @@ export const StateEstimationQualityResult: FunctionComponent void; - onGridReady: ((event: GridReadyEvent) => void) | undefined; getRowStyle?: (params: RowClassParams) => RowStyle | undefined; overlayNoRowsTemplate: string | undefined; skipColumnHeaders: boolean; @@ -50,8 +48,6 @@ export const RenderTableAndExportCsv: FunctionComponent { const isRowsEmpty = !rows || rows.length === 0; const language = useSelector((state: AppState) => state.computedLanguage); - + const onRowDataUpdated = useCallback((params: any) => { + if (params.api) { + params.api.sizeColumnsToFit(); + } + }, []); + const onGridReady = useCallback(({ api }: GridReadyEvent) => { + api?.sizeColumnsToFit(); + }, []); return ( diff --git a/src/components/voltage-init-result.tsx b/src/components/voltage-init-result.tsx index aaf5df2f97..7b6fd66234 100644 --- a/src/components/voltage-init-result.tsx +++ b/src/components/voltage-init-result.tsx @@ -128,15 +128,6 @@ export const VoltageInitResult: FunctionComponent = ({ }), [] ); - const onRowDataUpdated = useCallback((params: any) => { - if (params.api) { - params.api.sizeColumnsToFit(); - } - }, []); - - const onGridReady = useCallback(({ api }: GridReadyEvent) => { - api?.sizeColumnsToFit(); - }, []); const applyModifications = () => { setApplyingModifications(true); @@ -289,8 +280,6 @@ export const VoltageInitResult: FunctionComponent = ({ defaultColDef={defaultColDef} tableName={intl.formatMessage({ id: 'Indicators' })} rows={rows as any[]} - onRowDataUpdated={onRowDataUpdated} - onGridReady={onGridReady} skipColumnHeaders={false} getRowStyle={function (_params: RowClassParams): RowStyle | undefined { return undefined; @@ -330,8 +319,6 @@ export const VoltageInitResult: FunctionComponent = ({ defaultColDef={defaultColDef} tableName={intl.formatMessage({ id: 'ReactiveSlacks' })} rows={result.reactiveSlacks} - onRowDataUpdated={onRowDataUpdated} - onGridReady={onGridReady} skipColumnHeaders={false} getRowStyle={function (_params: RowClassParams): RowStyle | undefined { return undefined; @@ -381,8 +368,6 @@ export const VoltageInitResult: FunctionComponent = ({ defaultColDef={defaultColDef} tableName={intl.formatMessage({ id: 'BusVoltages' })} rows={busVoltages} - onRowDataUpdated={onRowDataUpdated} - onGridReady={onGridReady} skipColumnHeaders={false} getRowStyle={function (_params: RowClassParams): RowStyle | undefined { return undefined; From a1f36a04921c5a53421bf3d30e58d1d8378a2e2b Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 5 Nov 2025 16:59:06 +0100 Subject: [PATCH 24/27] refactor code Signed-off-by: SOUISSI Maissa (Externe) --- .../results/pccmin/pcc-min-result-table.tsx | 120 ++---------------- .../results/pccmin/pcc-min-result.type.ts | 81 +++++++++++- 2 files changed, 88 insertions(+), 113 deletions(-) diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx index 9c2475f917..f1753aaedb 100644 --- a/src/components/results/pccmin/pcc-min-result-table.tsx +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -8,22 +8,15 @@ import { FunctionComponent, useCallback, useMemo, useRef } from 'react'; import { useIntl } from 'react-intl'; import { Box } from '@mui/material'; -import { GridReadyEvent, RowDataUpdatedEvent } from 'ag-grid-community'; import { getNoRowsMessage, getRows, useIntlResultStatusMessages } from '../../utils/aggrid-rows-handler'; import { useSelector } from 'react-redux'; import { AppState } from '../../../redux/reducer'; import { DefaultCellRenderer } from '../../custom-aggrid/cell-renderers'; import { makeAgGridCustomHeaderColumn } from '../../custom-aggrid/utils/custom-aggrid-header-utils'; import { ComputingType } from '@gridsuite/commons-ui'; -import { CustomAggridComparatorFilter } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter'; -import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from '../../../utils/store-sort-filter-fields'; -import { - FilterType as AgGridFilterType, - numericFilterParams, - textFilterParams, -} from '../../../types/custom-aggrid-types'; + import { ColumnContext } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; -import { PccMinResultTableProps, SinglePccMinResultInfos } from './pcc-min-result.type'; +import { getPccMinColumns, PccMinResultTableProps } from './pcc-min-result.type'; import { AgGridReact } from 'ag-grid-react'; import { RenderTableAndExportCsv } from 'components/utils/renderTable-ExportCsv'; import { RESULTS_LOADING_DELAY } from 'components/network/constants'; @@ -35,108 +28,11 @@ const PccMinResultTable: FunctionComponent = ({ result, const pccMinStatus = useSelector((state: AppState) => state.computingStatus[ComputingType.PCC_MIN]); const gridRef = useRef(null); - const columns = useMemo(() => { - const data = (value: T) => value; - - const sortParams: ColumnContext['sortParams'] = { - table: PCCMIN_ANALYSIS_RESULT_SORT_STORE, - tab: PCCMIN_RESULT, - }; - - const filterParams = { - type: AgGridFilterType.PccMin, - tab: PCCMIN_RESULT, - updateFilterCallback: onFilter, - }; - - const inputFilterParams = ( - filterDefinition: Pick< - Required['filterComponentParams']['filterParams'], - 'dataType' | 'comparators' - > - ) => { - return { - filterComponent: CustomAggridComparatorFilter, - filterComponentParams: { - filterParams: { - ...filterDefinition, - ...filterParams, - }, - }, - }; - }; - - return [ - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Bus' }), - colId: 'busId', - field: 'busId', - context: { - ...data({ sortParams, ...inputFilterParams(textFilterParams) }), - }, - minWidth: 180, - }), - - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Contingency' }), - colId: 'limitingEquipment', - field: 'limitingEquipment', - context: { - ...data({ sortParams, ...inputFilterParams(textFilterParams) }), - }, - - minWidth: 180, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'PccMinTri' }), - colId: 'pccMinTri', - field: 'pccMinTri', - context: { - numeric: true, - fractionDigits: 2, - sortParams, - ...inputFilterParams(numericFilterParams), - }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'IccMinTri' }), - colId: 'iccMinTri', - field: 'iccMinTri', - context: { - numeric: true, - fractionDigits: 2, - sortParams, - ...inputFilterParams(numericFilterParams), - }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'xOhm' }), - colId: 'x', - field: 'x', - context: { - numeric: true, - fractionDigits: 2, - sortParams, - ...inputFilterParams(numericFilterParams), - }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'rOhm' }), - colId: 'r', - field: 'r', - context: { - numeric: true, - fractionDigits: 2, - sortParams, - ...inputFilterParams(numericFilterParams), - }, - }), - ]; - }, [onFilter, intl]); + const columns = useMemo(() => getPccMinColumns(intl, onFilter), [intl, onFilter]); - const messages = useIntlResultStatusMessages(intl, true, filters.length > 0); + const statusMessage = useIntlResultStatusMessages(intl, true, filters.length > 0); - const defaultColDef = useMemo( + const pccMinDefaultColDef = useMemo( () => ({ suppressMovable: true, resizable: true, @@ -147,7 +43,7 @@ const PccMinResultTable: FunctionComponent = ({ result, ); const rowsToShow = getRows(result, pccMinStatus); - const message = getNoRowsMessage(messages, result, pccMinStatus, !isFetching); + const noRowMessage = getNoRowsMessage(statusMessage, result, pccMinStatus, !isFetching); const openPccMinLoader = useOpenLoaderShortWait({ isLoading: pccMinStatus === RunningStatus.RUNNING || isFetching, @@ -159,10 +55,10 @@ const PccMinResultTable: FunctionComponent = ({ result, diff --git a/src/components/results/pccmin/pcc-min-result.type.ts b/src/components/results/pccmin/pcc-min-result.type.ts index 3483a97eaa..9f371d9f29 100644 --- a/src/components/results/pccmin/pcc-min-result.type.ts +++ b/src/components/results/pccmin/pcc-min-result.type.ts @@ -6,9 +6,19 @@ */ import type { UUID } from 'node:crypto'; -import { FilterConfig } from 'types/custom-aggrid-types'; +import { + FilterConfig, + numericFilterParams, + textFilterParams, + FilterType as AgGridFilterType, +} from 'types/custom-aggrid-types'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; import { Page, Selector } from '../common/utils'; +import { makeAgGridCustomHeaderColumn } from 'components/custom-aggrid/utils/custom-aggrid-header-utils'; +import { ColumnContext } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; +import { CustomAggridComparatorFilter } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter'; +import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from 'utils/store-sort-filter-fields'; +import { IntlShape } from 'react-intl'; export interface SinglePccMinResultInfos { singlePccMinResultUuid: string; @@ -52,3 +62,72 @@ export const FROM_COLUMN_TO_FIELD_PCC_MIN: Record = { x: 'x', r: 'r', }; + +export const getPccMinColumns = (intl: IntlShape, onFilter: (filters: any) => void) => { + const sortParams: ColumnContext['sortParams'] = { + table: PCCMIN_ANALYSIS_RESULT_SORT_STORE, + tab: PCCMIN_RESULT, + }; + + const filterParams = { + type: AgGridFilterType.PccMin, + tab: PCCMIN_RESULT, + updateFilterCallback: onFilter, + }; + + const inputFilterParams = ( + filterDefinition: Pick< + Required['filterComponentParams']['filterParams'], + 'dataType' | 'comparators' + > + ) => ({ + filterComponent: CustomAggridComparatorFilter, + filterComponentParams: { + filterParams: { + ...filterDefinition, + ...filterParams, + }, + }, + }); + + return [ + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Bus' }), + colId: 'busId', + field: 'busId', + context: { sortParams, ...inputFilterParams(textFilterParams) }, + minWidth: 180, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Contingency' }), + colId: 'limitingEquipment', + field: 'limitingEquipment', + context: { sortParams, ...inputFilterParams(textFilterParams) }, + minWidth: 180, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'PccMinTri' }), + colId: 'pccMinTri', + field: 'pccMinTri', + context: { numeric: true, fractionDigits: 2, sortParams, ...inputFilterParams(numericFilterParams) }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'IccMinTri' }), + colId: 'iccMinTri', + field: 'iccMinTri', + context: { numeric: true, fractionDigits: 2, sortParams, ...inputFilterParams(numericFilterParams) }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'xOhm' }), + colId: 'x', + field: 'x', + context: { numeric: true, fractionDigits: 2, sortParams, ...inputFilterParams(numericFilterParams) }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'rOhm' }), + colId: 'r', + field: 'r', + context: { numeric: true, fractionDigits: 2, sortParams, ...inputFilterParams(numericFilterParams) }, + }), + ]; +}; From 3eaef38ab8886666d4a9ac1f1f82a2abf1382085 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 5 Nov 2025 17:13:25 +0100 Subject: [PATCH 25/27] refactor code Signed-off-by: SOUISSI Maissa (Externe) --- .../results/pccmin/pcc-min-result-table.tsx | 4 +--- .../results/pccmin/pcc-min-result.type.ts | 18 +++++++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx index f1753aaedb..e1a4d0365f 100644 --- a/src/components/results/pccmin/pcc-min-result-table.tsx +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -5,17 +5,15 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { FunctionComponent, useCallback, useMemo, useRef } from 'react'; +import { FunctionComponent, useMemo, useRef } from 'react'; import { useIntl } from 'react-intl'; import { Box } from '@mui/material'; import { getNoRowsMessage, getRows, useIntlResultStatusMessages } from '../../utils/aggrid-rows-handler'; import { useSelector } from 'react-redux'; import { AppState } from '../../../redux/reducer'; import { DefaultCellRenderer } from '../../custom-aggrid/cell-renderers'; -import { makeAgGridCustomHeaderColumn } from '../../custom-aggrid/utils/custom-aggrid-header-utils'; import { ComputingType } from '@gridsuite/commons-ui'; -import { ColumnContext } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; import { getPccMinColumns, PccMinResultTableProps } from './pcc-min-result.type'; import { AgGridReact } from 'ag-grid-react'; import { RenderTableAndExportCsv } from 'components/utils/renderTable-ExportCsv'; diff --git a/src/components/results/pccmin/pcc-min-result.type.ts b/src/components/results/pccmin/pcc-min-result.type.ts index 9f371d9f29..017d0b5942 100644 --- a/src/components/results/pccmin/pcc-min-result.type.ts +++ b/src/components/results/pccmin/pcc-min-result.type.ts @@ -69,13 +69,13 @@ export const getPccMinColumns = (intl: IntlShape, onFilter: (filters: any) => vo tab: PCCMIN_RESULT, }; - const filterParams = { + const pccMinFilterParams = { type: AgGridFilterType.PccMin, tab: PCCMIN_RESULT, updateFilterCallback: onFilter, }; - const inputFilterParams = ( + const inputPccMinFilterParams = ( filterDefinition: Pick< Required['filterComponentParams']['filterParams'], 'dataType' | 'comparators' @@ -85,7 +85,7 @@ export const getPccMinColumns = (intl: IntlShape, onFilter: (filters: any) => vo filterComponentParams: { filterParams: { ...filterDefinition, - ...filterParams, + ...pccMinFilterParams, }, }, }); @@ -95,39 +95,39 @@ export const getPccMinColumns = (intl: IntlShape, onFilter: (filters: any) => vo headerName: intl.formatMessage({ id: 'Bus' }), colId: 'busId', field: 'busId', - context: { sortParams, ...inputFilterParams(textFilterParams) }, + context: { sortParams, ...inputPccMinFilterParams(textFilterParams) }, minWidth: 180, }), makeAgGridCustomHeaderColumn({ headerName: intl.formatMessage({ id: 'Contingency' }), colId: 'limitingEquipment', field: 'limitingEquipment', - context: { sortParams, ...inputFilterParams(textFilterParams) }, + context: { sortParams, ...inputPccMinFilterParams(textFilterParams) }, minWidth: 180, }), makeAgGridCustomHeaderColumn({ headerName: intl.formatMessage({ id: 'PccMinTri' }), colId: 'pccMinTri', field: 'pccMinTri', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputFilterParams(numericFilterParams) }, + context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, }), makeAgGridCustomHeaderColumn({ headerName: intl.formatMessage({ id: 'IccMinTri' }), colId: 'iccMinTri', field: 'iccMinTri', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputFilterParams(numericFilterParams) }, + context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, }), makeAgGridCustomHeaderColumn({ headerName: intl.formatMessage({ id: 'xOhm' }), colId: 'x', field: 'x', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputFilterParams(numericFilterParams) }, + context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, }), makeAgGridCustomHeaderColumn({ headerName: intl.formatMessage({ id: 'rOhm' }), colId: 'r', field: 'r', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputFilterParams(numericFilterParams) }, + context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, }), ]; }; From e8cd4a3481ee5a20583b6c19dd3501d88ff10277 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 5 Nov 2025 17:24:16 +0100 Subject: [PATCH 26/27] duplicated code Signed-off-by: SOUISSI Maissa (Externe) --- .../results/pcc-min-columns-utils.ts | 81 +++++++++++++++++++ .../results/pccmin/pcc-min-result-table.tsx | 3 +- .../results/pccmin/pcc-min-result.type.ts | 81 +------------------ 3 files changed, 84 insertions(+), 81 deletions(-) create mode 100644 src/components/results/pcc-min-columns-utils.ts diff --git a/src/components/results/pcc-min-columns-utils.ts b/src/components/results/pcc-min-columns-utils.ts new file mode 100644 index 0000000000..bee9a15bec --- /dev/null +++ b/src/components/results/pcc-min-columns-utils.ts @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +import { numericFilterParams, textFilterParams, FilterType as AgGridFilterType } from 'types/custom-aggrid-types'; +import { ColumnContext } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; +import { CustomAggridComparatorFilter } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter'; +import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from 'utils/store-sort-filter-fields'; +import { IntlShape } from 'react-intl'; +import { makeAgGridCustomHeaderColumn } from 'components/custom-aggrid/utils/custom-aggrid-header-utils'; + +export const getPccMinColumns = (intl: IntlShape, onFilter: (filters: any) => void) => { + const sortParams: ColumnContext['sortParams'] = { + table: PCCMIN_ANALYSIS_RESULT_SORT_STORE, + tab: PCCMIN_RESULT, + }; + + const pccMinFilterParams = { + type: AgGridFilterType.PccMin, + tab: PCCMIN_RESULT, + updateFilterCallback: onFilter, + }; + + const inputPccMinFilterParams = ( + filterDefinition: Pick< + Required['filterComponentParams']['filterParams'], + 'dataType' | 'comparators' + > + ) => ({ + filterComponent: CustomAggridComparatorFilter, + filterComponentParams: { + filterParams: { + ...filterDefinition, + ...pccMinFilterParams, + }, + }, + }); + + return [ + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Bus' }), + colId: 'busId', + field: 'busId', + context: { sortParams, ...inputPccMinFilterParams(textFilterParams) }, + minWidth: 180, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'Contingency' }), + colId: 'limitingEquipment', + field: 'limitingEquipment', + context: { sortParams, ...inputPccMinFilterParams(textFilterParams) }, + minWidth: 180, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'PccMinTri' }), + colId: 'pccMinTri', + field: 'pccMinTri', + context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'IccMinTri' }), + colId: 'iccMinTri', + field: 'iccMinTri', + context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'xOhm' }), + colId: 'x', + field: 'x', + context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, + }), + makeAgGridCustomHeaderColumn({ + headerName: intl.formatMessage({ id: 'rOhm' }), + colId: 'r', + field: 'r', + context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, + }), + ]; +}; diff --git a/src/components/results/pccmin/pcc-min-result-table.tsx b/src/components/results/pccmin/pcc-min-result-table.tsx index e1a4d0365f..a30f6f928c 100644 --- a/src/components/results/pccmin/pcc-min-result-table.tsx +++ b/src/components/results/pccmin/pcc-min-result-table.tsx @@ -14,12 +14,13 @@ import { AppState } from '../../../redux/reducer'; import { DefaultCellRenderer } from '../../custom-aggrid/cell-renderers'; import { ComputingType } from '@gridsuite/commons-ui'; -import { getPccMinColumns, PccMinResultTableProps } from './pcc-min-result.type'; +import { PccMinResultTableProps } from './pcc-min-result.type'; import { AgGridReact } from 'ag-grid-react'; import { RenderTableAndExportCsv } from 'components/utils/renderTable-ExportCsv'; import { RESULTS_LOADING_DELAY } from 'components/network/constants'; import RunningStatus from 'components/utils/running-status'; import { useOpenLoaderShortWait } from 'components/dialogs/commons/handle-loader'; +import { getPccMinColumns } from '../pcc-min-columns-utils'; const PccMinResultTable: FunctionComponent = ({ result, isFetching, onFilter, filters }) => { const intl = useIntl(); diff --git a/src/components/results/pccmin/pcc-min-result.type.ts b/src/components/results/pccmin/pcc-min-result.type.ts index 017d0b5942..3483a97eaa 100644 --- a/src/components/results/pccmin/pcc-min-result.type.ts +++ b/src/components/results/pccmin/pcc-min-result.type.ts @@ -6,19 +6,9 @@ */ import type { UUID } from 'node:crypto'; -import { - FilterConfig, - numericFilterParams, - textFilterParams, - FilterType as AgGridFilterType, -} from 'types/custom-aggrid-types'; +import { FilterConfig } from 'types/custom-aggrid-types'; import { GlobalFilters } from '../common/global-filter/global-filter-types'; import { Page, Selector } from '../common/utils'; -import { makeAgGridCustomHeaderColumn } from 'components/custom-aggrid/utils/custom-aggrid-header-utils'; -import { ColumnContext } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; -import { CustomAggridComparatorFilter } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter'; -import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from 'utils/store-sort-filter-fields'; -import { IntlShape } from 'react-intl'; export interface SinglePccMinResultInfos { singlePccMinResultUuid: string; @@ -62,72 +52,3 @@ export const FROM_COLUMN_TO_FIELD_PCC_MIN: Record = { x: 'x', r: 'r', }; - -export const getPccMinColumns = (intl: IntlShape, onFilter: (filters: any) => void) => { - const sortParams: ColumnContext['sortParams'] = { - table: PCCMIN_ANALYSIS_RESULT_SORT_STORE, - tab: PCCMIN_RESULT, - }; - - const pccMinFilterParams = { - type: AgGridFilterType.PccMin, - tab: PCCMIN_RESULT, - updateFilterCallback: onFilter, - }; - - const inputPccMinFilterParams = ( - filterDefinition: Pick< - Required['filterComponentParams']['filterParams'], - 'dataType' | 'comparators' - > - ) => ({ - filterComponent: CustomAggridComparatorFilter, - filterComponentParams: { - filterParams: { - ...filterDefinition, - ...pccMinFilterParams, - }, - }, - }); - - return [ - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Bus' }), - colId: 'busId', - field: 'busId', - context: { sortParams, ...inputPccMinFilterParams(textFilterParams) }, - minWidth: 180, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Contingency' }), - colId: 'limitingEquipment', - field: 'limitingEquipment', - context: { sortParams, ...inputPccMinFilterParams(textFilterParams) }, - minWidth: 180, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'PccMinTri' }), - colId: 'pccMinTri', - field: 'pccMinTri', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'IccMinTri' }), - colId: 'iccMinTri', - field: 'iccMinTri', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'xOhm' }), - colId: 'x', - field: 'x', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'rOhm' }), - colId: 'r', - field: 'r', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, - }), - ]; -}; From a35a5732223381db84b5570ef7069907743a8979 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Wed, 5 Nov 2025 17:44:11 +0100 Subject: [PATCH 27/27] duplication Signed-off-by: SOUISSI Maissa (Externe) --- .../results/pcc-min-columns-utils.ts | 74 +++++++++---------- .../results/pccmin/pcc-min-result.type.ts | 1 + src/translations/en.json | 4 +- 3 files changed, 38 insertions(+), 41 deletions(-) diff --git a/src/components/results/pcc-min-columns-utils.ts b/src/components/results/pcc-min-columns-utils.ts index bee9a15bec..e4c1e67c10 100644 --- a/src/components/results/pcc-min-columns-utils.ts +++ b/src/components/results/pcc-min-columns-utils.ts @@ -10,6 +10,7 @@ import { CustomAggridComparatorFilter } from 'components/custom-aggrid/custom-ag import { PCCMIN_ANALYSIS_RESULT_SORT_STORE, PCCMIN_RESULT } from 'utils/store-sort-filter-fields'; import { IntlShape } from 'react-intl'; import { makeAgGridCustomHeaderColumn } from 'components/custom-aggrid/utils/custom-aggrid-header-utils'; +import { FROM_COLUMN_TO_FIELD_PCC_MIN } from './pccmin/pcc-min-result.type'; export const getPccMinColumns = (intl: IntlShape, onFilter: (filters: any) => void) => { const sortParams: ColumnContext['sortParams'] = { @@ -23,12 +24,17 @@ export const getPccMinColumns = (intl: IntlShape, onFilter: (filters: any) => vo updateFilterCallback: onFilter, }; - const inputPccMinFilterParams = ( + const createFilterContext = ( filterDefinition: Pick< Required['filterComponentParams']['filterParams'], 'dataType' | 'comparators' - > + >, + numeric?: boolean, + fractionDigits?: number ) => ({ + sortParams, + ...pccMinFilterParams, + ...(numeric ? { numeric: true, fractionDigits } : {}), filterComponent: CustomAggridComparatorFilter, filterComponentParams: { filterParams: { @@ -38,44 +44,34 @@ export const getPccMinColumns = (intl: IntlShape, onFilter: (filters: any) => vo }, }); - return [ - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Bus' }), - colId: 'busId', - field: 'busId', - context: { sortParams, ...inputPccMinFilterParams(textFilterParams) }, - minWidth: 180, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'Contingency' }), - colId: 'limitingEquipment', - field: 'limitingEquipment', - context: { sortParams, ...inputPccMinFilterParams(textFilterParams) }, - minWidth: 180, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'PccMinTri' }), + let columnsMeta = [ + { colId: 'busId', headerKey: 'Bus', filterDef: textFilterParams }, + { colId: 'limitingEquipment', headerKey: 'Contingency', filterDef: textFilterParams }, + { colId: 'pccMinTri', - field: 'pccMinTri', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'IccMinTri' }), + headerKey: 'PccMinTri', + filterDef: numericFilterParams, + numeric: true, + fractionDigits: 2, + }, + { colId: 'iccMinTri', - field: 'iccMinTri', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'xOhm' }), - colId: 'x', - field: 'x', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, - }), - makeAgGridCustomHeaderColumn({ - headerName: intl.formatMessage({ id: 'rOhm' }), - colId: 'r', - field: 'r', - context: { numeric: true, fractionDigits: 2, sortParams, ...inputPccMinFilterParams(numericFilterParams) }, - }), + headerKey: 'IccMinTri', + filterDef: numericFilterParams, + numeric: true, + fractionDigits: 2, + }, + { colId: 'x', headerKey: 'xOhm', filterDef: numericFilterParams, numeric: true, fractionDigits: 2 }, + { colId: 'r', headerKey: 'rOhm', filterDef: numericFilterParams, numeric: true, fractionDigits: 2 }, ]; + + return columnsMeta.map(({ colId, headerKey, filterDef, numeric, fractionDigits }) => + makeAgGridCustomHeaderColumn({ + colId, + field: FROM_COLUMN_TO_FIELD_PCC_MIN[colId], + headerName: intl.formatMessage({ id: headerKey }), + context: createFilterContext(filterDef, numeric, fractionDigits), + minWidth: numeric ? undefined : 180, + }) + ); }; diff --git a/src/components/results/pccmin/pcc-min-result.type.ts b/src/components/results/pccmin/pcc-min-result.type.ts index 3483a97eaa..8391606c00 100644 --- a/src/components/results/pccmin/pcc-min-result.type.ts +++ b/src/components/results/pccmin/pcc-min-result.type.ts @@ -14,6 +14,7 @@ export interface SinglePccMinResultInfos { singlePccMinResultUuid: string; busId: string; pccMinTri: number; + iccMinTri: number; limitingEquipment: string; x: number; r: number; diff --git a/src/translations/en.json b/src/translations/en.json index 59bf1c3601..eb88fa7939 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1649,6 +1649,6 @@ "generatorMinimumActivePowerMaxValueError" : "Minimum active power must be inferior to maximum active power", "PccMinTri": "Pcc min (MVA) ", "IccMinTri": "Icc min (kA)", - "rOhm": "r ((Ω))", - "xOhm":"x ((Ω))" + "rOhm": "r (Ω)", + "xOhm":"x (Ω)" }