From d6fc98720887fa0ced1339e32bdf5a9667042d6d Mon Sep 17 00:00:00 2001 From: Radouane Khouadri Date: Thu, 16 Jul 2026 10:06:39 +0200 Subject: [PATCH 1/5] move contingencies to a tab in sa parameters --- .../limitreductions/columns-definitions.ts | 6 +- .../security-analysis-parameters-form.tsx | 20 +++---- .../security-analysis-parameters-selector.tsx | 57 ++++++++++++++++--- 3 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/features/parameters/common/limitreductions/columns-definitions.ts b/src/features/parameters/common/limitreductions/columns-definitions.ts index dd1eb0c36..86db93e5c 100644 --- a/src/features/parameters/common/limitreductions/columns-definitions.ts +++ b/src/features/parameters/common/limitreductions/columns-definitions.ts @@ -36,11 +36,13 @@ export interface ILimitReductionsByVoltageLevel { } export enum TabValues { - General = 0, - LimitReductions = 1, + Contingencies = 0, + General = 1, + LimitReductions = 2, } export const TAB_INFO = [ + { label: TabValues[TabValues.Contingencies], developerModeOnly: false }, { label: TabValues[TabValues.General], developerModeOnly: false }, { label: TabValues[TabValues.LimitReductions], developerModeOnly: false }, ]; diff --git a/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx b/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx index 65d9609b0..004b762b6 100644 --- a/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx +++ b/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx @@ -4,14 +4,13 @@ * 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 { Box, Stack } from '@mui/material'; +import { Stack } from '@mui/material'; import { ForwardedRef } from 'react'; import { UUID } from 'node:crypto'; import { parametersStyles } from '../parameters-style'; -import { CONTINGENCY_LISTS_INFOS, ContingencyTableApi, LineSeparator, ProviderParam } from '../common'; +import { ContingencyTableApi, ProviderParam } from '../common'; import { SecurityAnalysisParametersSelector } from './security-analysis-parameters-selector'; import { UseSecurityAnalysisParametersFormReturn } from './use-security-analysis-parameters-form'; -import { ContingencyTable } from '../common/contingency-table'; import { ContingencyCount } from '../common/contingency-table/types'; export type SecurityAnalysisParametersFormProps = { @@ -34,21 +33,16 @@ export function SecurityAnalysisParametersForm({ return ( - - - - + ); diff --git a/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx b/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx index 031711111..874afe472 100644 --- a/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx +++ b/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx @@ -5,12 +5,23 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { SyntheticEvent, useCallback, useEffect, useMemo, useState } from 'react'; +import { SyntheticEvent, useCallback, useEffect, useMemo, useState, ForwardedRef } from 'react'; import { FormattedMessage } from 'react-intl'; import { Grid2 as Grid, Tab, Tabs } from '@mui/material'; -import { ILimitReductionsByVoltageLevel, LimitReductionsTableForm, TAB_INFO, TabPanel, TabValues } from '../common'; +import { UUID } from 'node:crypto'; +import { + ILimitReductionsByVoltageLevel, + LimitReductionsTableForm, + TAB_INFO, + TabPanel, + TabValues, + CONTINGENCY_LISTS_INFOS, + ContingencyTableApi, +} from '../common'; +import { ContingencyTable } from '../common/contingency-table'; +import { ContingencyCount } from '../common/contingency-table/types'; import { PARAM_PROVIDER_OPENLOADFLOW } from '../loadflow'; import { ViolationsHidingParameters } from './security-analysis-violations-hiding'; import { SAParametersEnriched } from '../../../utils/types'; @@ -20,31 +31,48 @@ export function SecurityAnalysisParametersSelector({ currentProvider, isDeveloperMode, defaultLimitReductions, + showContingencyCount, + fetchContingencyCount, + contingencyTableApiRef, + isBuiltCurrentNode, }: Readonly<{ params: SAParametersEnriched | null; currentProvider?: string; isDeveloperMode: boolean; defaultLimitReductions: ILimitReductionsByVoltageLevel[]; + showContingencyCount: boolean; + fetchContingencyCount?: (contingencyListIds: UUID[] | null, abortSignal: AbortSignal) => Promise; + contingencyTableApiRef?: ForwardedRef; + isBuiltCurrentNode?: boolean; }>) { - const [tabSelected, setTabSelected] = useState(TabValues.General); + // Default to the first tab: Contingencies + const [tabSelected, setTabSelected] = useState(TabValues.Contingencies); + const handleTabChange = useCallback((event: SyntheticEvent, newValue: number) => { setTabSelected(newValue); }, []); const tabValue = useMemo(() => { - return tabSelected === TabValues.LimitReductions && !params?.limitReductions ? TabValues.General : tabSelected; + // Keep the LimitReductions guard logic + if (tabSelected === TabValues.LimitReductions && !params?.limitReductions) { + return TabValues.General; + } + return tabSelected; }, [params, tabSelected]); useEffect(() => { - if (currentProvider !== PARAM_PROVIDER_OPENLOADFLOW) { + if (currentProvider !== PARAM_PROVIDER_OPENLOADFLOW && tabSelected === TabValues.LimitReductions) { + // If provider changes and LimitReductions is not available, go back to General setTabSelected(TabValues.General); } - }, [currentProvider]); + }, [currentProvider, tabSelected]); + + const visibleTabs = TAB_INFO.filter((t) => isDeveloperMode || !t.developerModeOnly); return ( - {TAB_INFO.filter((t) => isDeveloperMode || !t.developerModeOnly).map( + {visibleTabs.map( (tab, index) => (tab.label !== TabValues[TabValues.LimitReductions] || (currentProvider === PARAM_PROVIDER_OPENLOADFLOW && params?.limitReductions)) && ( @@ -61,9 +89,22 @@ export function SecurityAnalysisParametersSelector({ )} - {TAB_INFO.filter((t) => isDeveloperMode || !t.developerModeOnly).map((tab, index) => ( + {visibleTabs.map((tab, index) => ( + {tabValue === TabValues.Contingencies && ( + + + + )} + {tabValue === TabValues.General && } + {tabValue === TabValues.LimitReductions && currentProvider === PARAM_PROVIDER_OPENLOADFLOW && params?.limitReductions && ( From 58695657ba08bb8bd01e05a73c1deba87f43cf86 Mon Sep 17 00:00:00 2001 From: Radouane Khouadri Date: Thu, 16 Jul 2026 23:39:28 +0200 Subject: [PATCH 2/5] adress reviews --- .../limitreductions/columns-definitions.ts | 4 +-- .../security-analysis-parameters-form.tsx | 3 +- .../security-analysis-parameters-selector.tsx | 32 ++++++++----------- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/features/parameters/common/limitreductions/columns-definitions.ts b/src/features/parameters/common/limitreductions/columns-definitions.ts index 86db93e5c..07e169eaf 100644 --- a/src/features/parameters/common/limitreductions/columns-definitions.ts +++ b/src/features/parameters/common/limitreductions/columns-definitions.ts @@ -37,13 +37,13 @@ export interface ILimitReductionsByVoltageLevel { export enum TabValues { Contingencies = 0, - General = 1, + Aggravation = 1, LimitReductions = 2, } export const TAB_INFO = [ { label: TabValues[TabValues.Contingencies], developerModeOnly: false }, - { label: TabValues[TabValues.General], developerModeOnly: false }, + { label: TabValues[TabValues.Aggravation], developerModeOnly: false }, { label: TabValues[TabValues.LimitReductions], developerModeOnly: false }, ]; diff --git a/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx b/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx index 004b762b6..a663d32b7 100644 --- a/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx +++ b/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx @@ -6,7 +6,7 @@ */ import { Stack } from '@mui/material'; import { ForwardedRef } from 'react'; -import { UUID } from 'node:crypto'; +import type { UUID } from 'node:crypto'; import { parametersStyles } from '../parameters-style'; import { ContingencyTableApi, ProviderParam } from '../common'; import { SecurityAnalysisParametersSelector } from './security-analysis-parameters-selector'; @@ -33,7 +33,6 @@ export function SecurityAnalysisParametersForm({ return ( - ; isBuiltCurrentNode?: boolean; }>) { - // Default to the first tab: Contingencies const [tabSelected, setTabSelected] = useState(TabValues.Contingencies); const handleTabChange = useCallback((event: SyntheticEvent, newValue: number) => { @@ -53,17 +52,14 @@ export function SecurityAnalysisParametersSelector({ }, []); const tabValue = useMemo(() => { - // Keep the LimitReductions guard logic - if (tabSelected === TabValues.LimitReductions && !params?.limitReductions) { - return TabValues.General; - } - return tabSelected; + return tabSelected === TabValues.LimitReductions && !params?.limitReductions + ? TabValues.Contingencies + : tabSelected; }, [params, tabSelected]); useEffect(() => { if (currentProvider !== PARAM_PROVIDER_OPENLOADFLOW && tabSelected === TabValues.LimitReductions) { - // If provider changes and LimitReductions is not available, go back to General - setTabSelected(TabValues.General); + setTabSelected(TabValues.Contingencies); } }, [currentProvider, tabSelected]); @@ -92,18 +88,16 @@ export function SecurityAnalysisParametersSelector({ {visibleTabs.map((tab, index) => ( {tabValue === TabValues.Contingencies && ( - - - + )} - {tabValue === TabValues.General && } + {tabValue === TabValues.Aggravation && } {tabValue === TabValues.LimitReductions && currentProvider === PARAM_PROVIDER_OPENLOADFLOW && From 951229aa1a7eba0f41e280f675c1b7b5f6c4d951 Mon Sep 17 00:00:00 2001 From: Radouane Khouadri Date: Fri, 17 Jul 2026 10:37:19 +0200 Subject: [PATCH 3/5] keep contingencies tab mounted to avoid fetching data on every tab selection --- .../security-analysis-parameters-selector.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx b/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx index c9b220722..83eb1ef7a 100644 --- a/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx +++ b/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx @@ -86,8 +86,8 @@ export function SecurityAnalysisParametersSelector({ {visibleTabs.map((tab, index) => ( - - {tabValue === TabValues.Contingencies && ( + + {index === TabValues.Contingencies && ( Date: Fri, 17 Jul 2026 14:24:35 +0200 Subject: [PATCH 4/5] add translations --- src/translations/en/parameters.ts | 2 ++ src/translations/fr/parameters.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/translations/en/parameters.ts b/src/translations/en/parameters.ts index a30990ae6..b64070be9 100644 --- a/src/translations/en/parameters.ts +++ b/src/translations/en/parameters.ts @@ -67,6 +67,8 @@ export const parametersEn = { leftOpenBracket: '(', rightOpenBracket: ')', + Aggravation: 'Aggravation', + Contingencies: 'Contingencies', Advanced: 'Advanced', Provider: 'Provider', diff --git a/src/translations/fr/parameters.ts b/src/translations/fr/parameters.ts index 749f6ddab..ef795f580 100644 --- a/src/translations/fr/parameters.ts +++ b/src/translations/fr/parameters.ts @@ -69,6 +69,8 @@ export const parametersFr = { leftOpenBracket: ']', rightOpenBracket: '[', + Aggravation: 'Aggravation', + Contingencies: 'Aléas', Advanced: 'Avancés', Provider: 'Simulateur', From 80500ce544c155159a0309cae01e83d588726546 Mon Sep 17 00:00:00 2001 From: Antoine Bouhours Date: Fri, 17 Jul 2026 14:39:07 +0200 Subject: [PATCH 5/5] Simplify AS tabs handling (#1247) * adress reviews * keep contingencies tab mounted to avoid fetching data on every tab selection * Simplify AS tabs handling * Simplify AS tabs handling * Simplify AS tabs handling * Simplify AS tabs handling * Simplify AS tabs handling * Remove unnecessary Grid * Lint --------- Co-authored-by: Radouane Khouadri --- src/features/parameters/common/constants.ts | 7 -- .../limitreductions/columns-definitions.ts | 12 --- .../security-analysis/columns-definitions.ts | 38 ++++---- .../parameters/security-analysis/constants.ts | 18 ++++ .../parameters/security-analysis/index.ts | 1 + ... security-analysis-parameters-content.tsx} | 93 +++++++++---------- .../security-analysis-parameters-dialog.tsx | 2 - .../security-analysis-parameters-form.tsx | 7 +- .../security-analysis-parameters-inline.tsx | 2 - .../security-analysis-violations-hiding.tsx | 22 ++--- .../use-security-analysis-parameters-form.ts | 42 ++++----- 11 files changed, 119 insertions(+), 125 deletions(-) create mode 100644 src/features/parameters/security-analysis/constants.ts rename src/features/parameters/security-analysis/{security-analysis-parameters-selector.tsx => security-analysis-parameters-content.tsx} (50%) diff --git a/src/features/parameters/common/constants.ts b/src/features/parameters/common/constants.ts index e6a976655..1d0cca4b5 100644 --- a/src/features/parameters/common/constants.ts +++ b/src/features/parameters/common/constants.ts @@ -8,13 +8,6 @@ export const PROVIDER = 'provider'; export const VOLTAGE_LEVEL = 'voltageLevel'; -export const PARAM_SA_PROVIDER = 'provider'; -export const PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD = 'flowProportionalThreshold'; -export const PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD = 'lowVoltageProportionalThreshold'; -export const PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD = 'lowVoltageAbsoluteThreshold'; -export const PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD = 'highVoltageProportionalThreshold'; -export const PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD = 'highVoltageAbsoluteThreshold'; - export const VERSION_PARAMETER = 'version'; export const COMMON_PARAMETERS = 'commonParameters'; export const ADVANCED_PARAMETERS = 'advancedParameters'; diff --git a/src/features/parameters/common/limitreductions/columns-definitions.ts b/src/features/parameters/common/limitreductions/columns-definitions.ts index 07e169eaf..03c355f04 100644 --- a/src/features/parameters/common/limitreductions/columns-definitions.ts +++ b/src/features/parameters/common/limitreductions/columns-definitions.ts @@ -35,18 +35,6 @@ export interface ILimitReductionsByVoltageLevel { temporaryLimitReductions: ITemporaryLimitReduction[]; } -export enum TabValues { - Contingencies = 0, - Aggravation = 1, - LimitReductions = 2, -} - -export const TAB_INFO = [ - { label: TabValues[TabValues.Contingencies], developerModeOnly: false }, - { label: TabValues[TabValues.Aggravation], developerModeOnly: false }, - { label: TabValues[TabValues.LimitReductions], developerModeOnly: false }, -]; - export interface LimitReductionIColumnsDef { label: React.ReactNode; dataKey: string; diff --git a/src/features/parameters/security-analysis/columns-definitions.ts b/src/features/parameters/security-analysis/columns-definitions.ts index b49ad3826..a10767ce3 100644 --- a/src/features/parameters/security-analysis/columns-definitions.ts +++ b/src/features/parameters/security-analysis/columns-definitions.ts @@ -8,21 +8,23 @@ import * as yup from 'yup'; import { getLimitReductionsFormSchema, ILimitReductionsByVoltageLevel, - PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD, - PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, - PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, - PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD, - PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, - PARAM_SA_PROVIDER, + PROVIDER, toFormValuesLimitReductions, } from '../common'; import { getNameElementEditorSchema } from '../common/name-element-editor'; import { getContingencyListsInfosFormSchema, toFormValuesContingencyListsInfos } from '../common/contingency-table'; import { SAParametersEnriched } from '../../../utils'; +import { + FLOW_PROPORTIONAL_THRESHOLD, + HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, + HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, + LOW_VOLTAGE_ABSOLUTE_THRESHOLD, + LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, +} from './constants'; export const getSAParametersFormSchema = (name: string | null, limitReductions?: ILimitReductionsByVoltageLevel[]) => { const providerSchema = yup.object().shape({ - [PARAM_SA_PROVIDER]: yup.string().required(), + [PROVIDER]: yup.string().required(), }); const contingencyListsInfosSchema = getContingencyListsInfosFormSchema(); @@ -32,23 +34,23 @@ export const getSAParametersFormSchema = (name: string | null, limitReductions?: ); const thresholdsSchema = yup.object().shape({ - [PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD]: yup + [FLOW_PROPORTIONAL_THRESHOLD]: yup .number() .min(0, 'NormalizedPercentage') .max(100, 'NormalizedPercentage') .required(), - [PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD]: yup + [LOW_VOLTAGE_PROPORTIONAL_THRESHOLD]: yup .number() .min(0, 'NormalizedPercentage') .max(100, 'NormalizedPercentage') .required(), - [PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD]: yup.number().required(), - [PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD]: yup + [LOW_VOLTAGE_ABSOLUTE_THRESHOLD]: yup.number().required(), + [HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD]: yup .number() .min(0, 'NormalizedPercentage') .max(100, 'NormalizedPercentage') .required(), - [PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD]: yup.number().required(), + [HIGH_VOLTAGE_ABSOLUTE_THRESHOLD]: yup.number().required(), }); return yup @@ -63,13 +65,13 @@ export const getSAParametersFormSchema = (name: string | null, limitReductions?: }; export const toFormValueSaParameters = (params: SAParametersEnriched) => ({ - [PARAM_SA_PROVIDER]: params.provider, + [PROVIDER]: params.provider, ...toFormValuesContingencyListsInfos(params?.contingencyListsInfos ?? []), ...toFormValuesLimitReductions(params?.limitReductions), // SA specific form values - [PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD]: params.flowProportionalThreshold * 100, - [PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD]: params.lowVoltageProportionalThreshold * 100, - [PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD]: params.lowVoltageAbsoluteThreshold, - [PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD]: params.highVoltageProportionalThreshold * 100, - [PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD]: params.highVoltageAbsoluteThreshold, + [FLOW_PROPORTIONAL_THRESHOLD]: params.flowProportionalThreshold * 100, + [LOW_VOLTAGE_PROPORTIONAL_THRESHOLD]: params.lowVoltageProportionalThreshold * 100, + [LOW_VOLTAGE_ABSOLUTE_THRESHOLD]: params.lowVoltageAbsoluteThreshold, + [HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD]: params.highVoltageProportionalThreshold * 100, + [HIGH_VOLTAGE_ABSOLUTE_THRESHOLD]: params.highVoltageAbsoluteThreshold, }); diff --git a/src/features/parameters/security-analysis/constants.ts b/src/features/parameters/security-analysis/constants.ts new file mode 100644 index 000000000..b09c7857f --- /dev/null +++ b/src/features/parameters/security-analysis/constants.ts @@ -0,0 +1,18 @@ +/** + * 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/. + */ + +export const FLOW_PROPORTIONAL_THRESHOLD = 'flowProportionalThreshold'; +export const LOW_VOLTAGE_PROPORTIONAL_THRESHOLD = 'lowVoltageProportionalThreshold'; +export const LOW_VOLTAGE_ABSOLUTE_THRESHOLD = 'lowVoltageAbsoluteThreshold'; +export const HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD = 'highVoltageProportionalThreshold'; +export const HIGH_VOLTAGE_ABSOLUTE_THRESHOLD = 'highVoltageAbsoluteThreshold'; + +export enum TabValues { + Contingencies = 0, + Aggravation = 1, + LimitReductions = 2, +} diff --git a/src/features/parameters/security-analysis/index.ts b/src/features/parameters/security-analysis/index.ts index e3d2eb9e3..b9d0c869e 100644 --- a/src/features/parameters/security-analysis/index.ts +++ b/src/features/parameters/security-analysis/index.ts @@ -7,3 +7,4 @@ export * from './security-analysis-parameters-inline'; export * from './security-analysis-parameters-dialog'; +export * from './constants'; diff --git a/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx b/src/features/parameters/security-analysis/security-analysis-parameters-content.tsx similarity index 50% rename from src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx rename to src/features/parameters/security-analysis/security-analysis-parameters-content.tsx index 83eb1ef7a..9d5dac0ea 100644 --- a/src/features/parameters/security-analysis/security-analysis-parameters-selector.tsx +++ b/src/features/parameters/security-analysis/security-analysis-parameters-content.tsx @@ -9,14 +9,12 @@ import { SyntheticEvent, useCallback, useEffect, useMemo, useState, ForwardedRef import { FormattedMessage } from 'react-intl'; -import { Grid2 as Grid, Tab, Tabs } from '@mui/material'; +import { Tab, Tabs } from '@mui/material'; import type { UUID } from 'node:crypto'; import { ILimitReductionsByVoltageLevel, LimitReductionsTableForm, - TAB_INFO, TabPanel, - TabValues, CONTINGENCY_LISTS_INFOS, ContingencyTableApi, } from '../common'; @@ -25,11 +23,19 @@ import { ContingencyCount } from '../common/contingency-table/types'; import { PARAM_PROVIDER_OPENLOADFLOW } from '../loadflow'; import { ViolationsHidingParameters } from './security-analysis-violations-hiding'; import { SAParametersEnriched } from '../../../utils/types'; +import { TabValues } from './constants'; +import type { MuiStyles } from '../../../utils/styles'; -export function SecurityAnalysisParametersSelector({ +const styles = { + tab: { + fontSize: 17, + fontWeight: 'bold', + }, +} as const satisfies MuiStyles; + +export function SecurityAnalysisParametersContent({ params, currentProvider, - isDeveloperMode, defaultLimitReductions, showContingencyCount, fetchContingencyCount, @@ -38,7 +44,6 @@ export function SecurityAnalysisParametersSelector({ }: Readonly<{ params: SAParametersEnriched | null; currentProvider?: string; - isDeveloperMode: boolean; defaultLimitReductions: ILimitReductionsByVoltageLevel[]; showContingencyCount: boolean; fetchContingencyCount?: (contingencyListIds: UUID[] | null, abortSignal: AbortSignal) => Promise; @@ -63,51 +68,45 @@ export function SecurityAnalysisParametersSelector({ } }, [currentProvider, tabSelected]); - const visibleTabs = TAB_INFO.filter((t) => isDeveloperMode || !t.developerModeOnly); - return ( - + <> - {visibleTabs.map( - (tab, index) => - (tab.label !== TabValues[TabValues.LimitReductions] || - (currentProvider === PARAM_PROVIDER_OPENLOADFLOW && params?.limitReductions)) && ( - } - value={index} - sx={{ - fontSize: 17, - fontWeight: 'bold', - }} - /> - ) + } + value={TabValues.Contingencies} + sx={styles.tab} + /> + } + value={TabValues.Aggravation} + sx={styles.tab} + /> + {currentProvider === PARAM_PROVIDER_OPENLOADFLOW && params?.limitReductions && ( + } + value={TabValues.LimitReductions} + sx={styles.tab} + /> )} - {visibleTabs.map((tab, index) => ( - - {index === TabValues.Contingencies && ( - - )} - - {tabValue === TabValues.Aggravation && } - - {tabValue === TabValues.LimitReductions && - currentProvider === PARAM_PROVIDER_OPENLOADFLOW && - params?.limitReductions && ( - - - - )} - - ))} - + + + + + + + + {currentProvider === PARAM_PROVIDER_OPENLOADFLOW && params?.limitReductions && ( + + )} + + ); } diff --git a/src/features/parameters/security-analysis/security-analysis-parameters-dialog.tsx b/src/features/parameters/security-analysis/security-analysis-parameters-dialog.tsx index 223491314..09fc26005 100644 --- a/src/features/parameters/security-analysis/security-analysis-parameters-dialog.tsx +++ b/src/features/parameters/security-analysis/security-analysis-parameters-dialog.tsx @@ -29,7 +29,6 @@ export function SecurityAnalysisParametersDialog({ activeDirectory, language, userProfile, - isDeveloperMode = false, }: Readonly) { const parametersBackend = useParametersBackend( userProfile, @@ -80,7 +79,6 @@ export function SecurityAnalysisParametersDialog({ ) : ( diff --git a/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx b/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx index a663d32b7..79ae960e6 100644 --- a/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx +++ b/src/features/parameters/security-analysis/security-analysis-parameters-form.tsx @@ -9,7 +9,7 @@ import { ForwardedRef } from 'react'; import type { UUID } from 'node:crypto'; import { parametersStyles } from '../parameters-style'; import { ContingencyTableApi, ProviderParam } from '../common'; -import { SecurityAnalysisParametersSelector } from './security-analysis-parameters-selector'; +import { SecurityAnalysisParametersContent } from './security-analysis-parameters-content'; import { UseSecurityAnalysisParametersFormReturn } from './use-security-analysis-parameters-form'; import { ContingencyCount } from '../common/contingency-table/types'; @@ -19,7 +19,6 @@ export type SecurityAnalysisParametersFormProps = { fetchContingencyCount?: (contingencyListIds: UUID[] | null, abortSignal: AbortSignal) => Promise; contingencyTableApiRef?: ForwardedRef; isBuiltCurrentNode?: boolean; - isDeveloperMode: boolean; }; export function SecurityAnalysisParametersForm({ @@ -28,15 +27,13 @@ export function SecurityAnalysisParametersForm({ fetchContingencyCount, contingencyTableApiRef, isBuiltCurrentNode, - isDeveloperMode, }: Readonly) { return ( - ; @@ -100,7 +99,6 @@ export function SecurityAnalysisParametersInline({ fetchContingencyCount={fetchContingencyCount} contingencyTableApiRef={contingencyTableApiRef} isBuiltCurrentNode={isBuiltCurrentNode} - isDeveloperMode={isDeveloperMode} /> diff --git a/src/features/parameters/security-analysis/security-analysis-violations-hiding.tsx b/src/features/parameters/security-analysis/security-analysis-violations-hiding.tsx index 224c34bf1..5270396eb 100644 --- a/src/features/parameters/security-analysis/security-analysis-violations-hiding.tsx +++ b/src/features/parameters/security-analysis/security-analysis-violations-hiding.tsx @@ -12,12 +12,12 @@ import { CustomTooltip } from '../../../components/ui/tooltip/CustomTooltip'; import { parametersStyles } from '../parameters-style'; import { FloatInput } from '../../../components/ui'; import { - PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD, - PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, - PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, - PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD, - PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, -} from '../common'; + FLOW_PROPORTIONAL_THRESHOLD, + HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, + HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, + LOW_VOLTAGE_ABSOLUTE_THRESHOLD, + LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, +} from './constants'; interface FieldToShow { label: string; @@ -76,7 +76,7 @@ const fieldsToShow: FieldToShow[] = [ { label: 'securityAnalysis.current', firstField: { - name: PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD, + name: FLOW_PROPORTIONAL_THRESHOLD, label: '%', }, tooltipInfoId: 'securityAnalysis.toolTip.current', @@ -85,24 +85,24 @@ const fieldsToShow: FieldToShow[] = [ { label: 'securityAnalysis.lowVoltage', firstField: { - name: PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, + name: LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, label: '%', }, secondField: { label: 'kV', - name: PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD, + name: LOW_VOLTAGE_ABSOLUTE_THRESHOLD, }, tooltipInfoId: 'securityAnalysis.toolTip.lowVoltage', }, { label: 'securityAnalysis.highVoltage', firstField: { - name: PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, + name: HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, label: '%', }, secondField: { label: 'kV', - name: PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, + name: HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, }, tooltipInfoId: 'securityAnalysis.toolTip.highVoltage', }, diff --git a/src/features/parameters/security-analysis/use-security-analysis-parameters-form.ts b/src/features/parameters/security-analysis/use-security-analysis-parameters-form.ts index eade08149..4de3e7269 100644 --- a/src/features/parameters/security-analysis/use-security-analysis-parameters-form.ts +++ b/src/features/parameters/security-analysis/use-security-analysis-parameters-form.ts @@ -22,12 +22,7 @@ import { IST_FORM, LIMIT_DURATION_FORM, LIMIT_REDUCTIONS_FORM, - PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD, - PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, - PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, - PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD, - PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, - PARAM_SA_PROVIDER, + PROVIDER, toFormValuesLimitReductions, } from '../common'; import { getNameElementEditorEmptyFormData } from '../common/name-element-editor'; @@ -37,6 +32,13 @@ import { snackWithFallback } from '../../../utils/error'; import { mapSecurityAnalysisParameters, SAParametersEnriched } from '../../../utils/types'; import { getSAParametersFormSchema, toFormValueSaParameters } from './columns-definitions'; import { ACTIVATED, DESCRIPTION, ID, NAME } from '../common/parameter-table-field'; +import { + FLOW_PROPORTIONAL_THRESHOLD, + HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, + HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, + LOW_VOLTAGE_ABSOLUTE_THRESHOLD, + LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, +} from './constants'; export interface UseSecurityAnalysisParametersFormReturn { formMethods: UseFormReturn; @@ -80,20 +82,20 @@ export const useSecurityAnalysisParametersForm = ( const formMethods = useForm({ defaultValues: { ...getNameElementEditorEmptyFormData(name, description), - [PARAM_SA_PROVIDER]: params?.provider, + [PROVIDER]: params?.provider, [CONTINGENCY_LISTS_INFOS]: [], [LIMIT_REDUCTIONS_FORM]: [], - [PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD]: null, - [PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD]: null, - [PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD]: null, - [PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD]: null, - [PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD]: null, + [FLOW_PROPORTIONAL_THRESHOLD]: null, + [LOW_VOLTAGE_PROPORTIONAL_THRESHOLD]: null, + [LOW_VOLTAGE_ABSOLUTE_THRESHOLD]: null, + [HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD]: null, + [HIGH_VOLTAGE_ABSOLUTE_THRESHOLD]: null, }, resolver: yupResolver(formSchema), }); const { reset, watch } = formMethods; - const watchProvider = watch(PARAM_SA_PROVIDER) as string | undefined; + const watchProvider = watch(PROVIDER) as string | undefined; const paramsLoaded = useMemo(() => !!params && !!watchProvider, [watchProvider, params]); const [paramsFormInitialized, setParamsFormInitialized] = useState(false); @@ -140,14 +142,12 @@ export const useSecurityAnalysisParametersForm = ( const formatNewParams = useCallback( (formData: Record) => { return { - [PARAM_SA_PROVIDER]: formData[PARAM_SA_PROVIDER], - [PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD]: formData[PARAM_SA_FLOW_PROPORTIONAL_THRESHOLD] / 100, - [PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD]: - formData[PARAM_SA_LOW_VOLTAGE_PROPORTIONAL_THRESHOLD] / 100, - [PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD]: formData[PARAM_SA_LOW_VOLTAGE_ABSOLUTE_THRESHOLD], - [PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD]: - formData[PARAM_SA_HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD] / 100, - [PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD]: formData[PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD], + [PROVIDER]: formData[PROVIDER], + [FLOW_PROPORTIONAL_THRESHOLD]: formData[FLOW_PROPORTIONAL_THRESHOLD] / 100, + [LOW_VOLTAGE_PROPORTIONAL_THRESHOLD]: formData[LOW_VOLTAGE_PROPORTIONAL_THRESHOLD] / 100, + [LOW_VOLTAGE_ABSOLUTE_THRESHOLD]: formData[LOW_VOLTAGE_ABSOLUTE_THRESHOLD], + [HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD]: formData[HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD] / 100, + [HIGH_VOLTAGE_ABSOLUTE_THRESHOLD]: formData[HIGH_VOLTAGE_ABSOLUTE_THRESHOLD], [CONTINGENCY_LISTS_INFOS]: toContingencyListsInfos(formData[CONTINGENCY_LISTS_INFOS]), limitReductions: toLimitReductions(formData[LIMIT_REDUCTIONS_FORM]), };