diff --git a/src/components/parameters/common/contingency-table/columns-definitions.ts b/src/components/parameters/common/contingency-table/columns-definitions.ts index bc48c6a2d..438dcfb21 100644 --- a/src/components/parameters/common/contingency-table/columns-definitions.ts +++ b/src/components/parameters/common/contingency-table/columns-definitions.ts @@ -4,11 +4,21 @@ * 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 { Parameters, ColumnsDef, ID, NAME, DESCRIPTION, ACTIVATED } from '../parameter-table'; +import { + Parameters, + ColumnsDef, + DESCRIPTION, + ACTIVATED, + CONTAINER_NAME, + CONTAINER_ID, + NAME, + ID, + EquipmentsContainer, +} from '../parameter-table'; import { ElementType } from '../../../../utils'; import { CONTINGENCY_LISTS_INFOS, CONTINGENCY_LISTS } from '../constants'; import yup from '../../../../utils/yupConfig'; -import { IdName, ContingencyListsInfos } from './types'; +import { ContingencyListsInfos } from './types'; export const COLUMNS_DEFINITIONS_CONTINGENCY_LISTS_INFOS: ColumnsDef[] = [ { @@ -58,7 +68,10 @@ export const getContingencyListsInfosFormSchema = () => { }) ) .required() - .min(1, 'FieldIsRequired'), + .when([ACTIVATED], { + is: (activated: boolean) => activated, + then: (schema) => schema.min(1, 'FieldIsRequired'), + }), [DESCRIPTION]: yup.string(), [ACTIVATED]: yup.boolean().required(), }) @@ -70,9 +83,9 @@ export const getContingencyListsInfosFormSchema = () => { export const toFormValuesContingencyListsInfos = (contingencyListsInfos: ContingencyListsInfos[]) => { return { [CONTINGENCY_LISTS_INFOS]: contingencyListsInfos?.map((contingencyListInfos: ContingencyListsInfos) => ({ - [CONTINGENCY_LISTS]: contingencyListInfos[CONTINGENCY_LISTS]?.map((c: IdName) => ({ - [NAME]: c[NAME], - [ID]: c[ID], + [CONTINGENCY_LISTS]: contingencyListInfos[CONTINGENCY_LISTS]?.map((c: EquipmentsContainer) => ({ + [NAME]: c[CONTAINER_NAME], + [ID]: c[CONTAINER_ID], })), [DESCRIPTION]: contingencyListInfos[DESCRIPTION], [ACTIVATED]: contingencyListInfos[ACTIVATED], diff --git a/src/components/parameters/common/contingency-table/contingency-table.tsx b/src/components/parameters/common/contingency-table/contingency-table.tsx index b7855fe4d..6665bb279 100644 --- a/src/components/parameters/common/contingency-table/contingency-table.tsx +++ b/src/components/parameters/common/contingency-table/contingency-table.tsx @@ -8,9 +8,8 @@ import { Alert, Stack } from '@mui/material'; import { useCallback, useEffect, useState } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; import { FieldValues, useWatch } from 'react-hook-form'; -import { UUID } from 'node:crypto'; import { useCreateRowData } from '../../../../hooks'; -import { ColumnsDef, ID, ACTIVATED, ParameterTable } from '../parameter-table'; +import { ColumnsDef, ACTIVATED, ParameterTable, CONTAINER_ID } from '../parameter-table'; import { CONTINGENCY_LISTS, CONTINGENCY_LISTS_INFOS } from '../constants'; import { COLUMNS_DEFINITIONS_CONTINGENCY_LISTS_INFOS, ParamContingencyLists } from './columns-definitions'; import { ContingencyCount, ContingencyListsInfos } from './types'; @@ -21,7 +20,7 @@ export function ContingencyTable({ isBuiltCurrentNode, }: Readonly<{ showContingencyCount: boolean; - fetchContingencyCount?: (contingencyLists: UUID[] | null) => Promise; + fetchContingencyCount?: (contingencyLists: string[] | null) => Promise; isBuiltCurrentNode?: boolean; // necessary if we want to show the contingency count }>) { const intl = useIntl(); @@ -58,7 +57,9 @@ export function ContingencyTable({ fetchContingencyCount?.( contingencyListsInfos .filter((lists) => lists[ACTIVATED]) - .flatMap((lists) => lists[CONTINGENCY_LISTS]?.map((contingencyList) => contingencyList[ID])) + .flatMap((lists) => + lists[CONTINGENCY_LISTS]?.map((contingencyList) => contingencyList[CONTAINER_ID]) + ) ) .then((contingencyCount) => { setSimulatedContingencyCount(contingencyCount); diff --git a/src/components/parameters/common/contingency-table/types.ts b/src/components/parameters/common/contingency-table/types.ts index 22bd25e49..47baa0486 100644 --- a/src/components/parameters/common/contingency-table/types.ts +++ b/src/components/parameters/common/contingency-table/types.ts @@ -4,16 +4,12 @@ * 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 { UUID } from 'node:crypto'; -import { ACTIVATED, DESCRIPTION, ID, NAME } from '../parameter-table/constants'; +import { ACTIVATED, DESCRIPTION } from '../parameter-table/constants'; import { CONTINGENCY_LISTS } from '../constants'; +import { EquipmentsContainer } from '../parameter-table/types'; -export interface IdName { - [ID]: UUID; - [NAME]: string; -} export interface ContingencyListsInfos { - [CONTINGENCY_LISTS]: IdName[]; + [CONTINGENCY_LISTS]: EquipmentsContainer[]; [DESCRIPTION]: string; [ACTIVATED]: boolean; } diff --git a/src/components/parameters/common/parameter-table/constants.ts b/src/components/parameters/common/parameter-table/constants.ts index 4aacf64ac..b15610236 100644 --- a/src/components/parameters/common/parameter-table/constants.ts +++ b/src/components/parameters/common/parameter-table/constants.ts @@ -11,3 +11,5 @@ export const NAME = 'name'; export const ID = 'id'; export const ACTIVATED = 'activated'; export const DESCRIPTION = 'description'; +export const CONTAINER_ID = 'containerId'; +export const CONTAINER_NAME = 'containerName'; diff --git a/src/components/parameters/common/parameter-table/types.ts b/src/components/parameters/common/parameter-table/types.ts index d0d6b9a4b..37765bd0b 100644 --- a/src/components/parameters/common/parameter-table/types.ts +++ b/src/components/parameters/common/parameter-table/types.ts @@ -1,3 +1,5 @@ +import { CONTAINER_ID, CONTAINER_NAME } from './constants'; + /** * Copyright (c) 2026, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public @@ -25,3 +27,8 @@ export interface ColumnsDef { descriptionItems?: boolean; width?: string; } + +export interface EquipmentsContainer { + [CONTAINER_ID]: string; + [CONTAINER_NAME]: string | null; +} diff --git a/src/components/parameters/security-analysis/security-analysis-parameters-form.tsx b/src/components/parameters/security-analysis/security-analysis-parameters-form.tsx index 78309c313..6e7703d41 100644 --- a/src/components/parameters/security-analysis/security-analysis-parameters-form.tsx +++ b/src/components/parameters/security-analysis/security-analysis-parameters-form.tsx @@ -7,7 +7,6 @@ import { ReactNode } from 'react'; import { FormattedMessage } from 'react-intl'; import { Box, Grid, LinearProgress } from '@mui/material'; -import { UUID } from 'node:crypto'; import { CustomFormProvider, MuiSelectInput } from '../../inputs'; import { parametersStyles } from '../parameters-style'; import { LineSeparator, PARAM_SA_PROVIDER } from '../common'; @@ -54,7 +53,7 @@ export function SecurityAnalysisParametersForm({ }: Readonly<{ securityAnalysisMethods: UseSecurityAnalysisParametersFormReturn; showContingencyCount: boolean; - fetchContingencyCount?: (contingencyListIds: UUID[] | null) => Promise; + fetchContingencyCount?: (contingencyListIds: string[] | null) => Promise; isBuiltCurrentNode?: boolean; renderTitleFields?: () => ReactNode; renderActions?: () => ReactNode; diff --git a/src/components/parameters/security-analysis/security-analysis-parameters-inline.tsx b/src/components/parameters/security-analysis/security-analysis-parameters-inline.tsx index 4f7677316..58418c6d0 100644 --- a/src/components/parameters/security-analysis/security-analysis-parameters-inline.tsx +++ b/src/components/parameters/security-analysis/security-analysis-parameters-inline.tsx @@ -36,7 +36,7 @@ export function SecurityAnalysisParametersInline({ }: Readonly<{ studyUuid: UUID | null; parametersBackend: UseParametersBackendReturnProps; - fetchContingencyCount: (contingencyListIds: UUID[] | null) => Promise; + fetchContingencyCount: (contingencyListIds: string[] | null) => Promise; isBuiltCurrentNode: boolean; setHaveDirtyFields: (isDirty: boolean) => void; isDeveloperMode: boolean; diff --git a/src/components/parameters/security-analysis/use-security-analysis-parameters-form.ts b/src/components/parameters/security-analysis/use-security-analysis-parameters-form.ts index c827ac5ac..66d82e4cb 100644 --- a/src/components/parameters/security-analysis/use-security-analysis-parameters-form.ts +++ b/src/components/parameters/security-analysis/use-security-analysis-parameters-form.ts @@ -32,7 +32,7 @@ import { useSnackMessage } from '../../../hooks'; import { snackWithFallback } from '../../../utils/error'; import { SAParameters } from './types'; import { getSAParametersFormSchema, toFormValueSaParameters } from './columns-definitions'; -import { ID, NAME, DESCRIPTION, ACTIVATED } from '../common/parameter-table'; +import { NAME, DESCRIPTION, ACTIVATED, CONTAINER_ID, CONTAINER_NAME, ID } from '../common/parameter-table'; import { ContingencyListsInfos } from '../common/contingency-table/types'; export interface UseSecurityAnalysisParametersFormReturn { @@ -100,10 +100,12 @@ export const useSecurityAnalysisParametersForm = ( return []; } return formContingencyListsInfos.map((contingencyListsInfos) => ({ - [CONTINGENCY_LISTS]: contingencyListsInfos[CONTINGENCY_LISTS]?.map((c: Record) => ({ - [ID]: c[ID], - [NAME]: c[NAME], - })), + [CONTINGENCY_LISTS]: contingencyListsInfos[CONTINGENCY_LISTS]?.map( + (container: Record) => ({ + [CONTAINER_ID]: container[ID], + [CONTAINER_NAME]: container[NAME], + }) + ), [DESCRIPTION]: contingencyListsInfos[DESCRIPTION], [ACTIVATED]: contingencyListsInfos[ACTIVATED], })); diff --git a/src/components/parameters/sensi/columns-definitions.ts b/src/components/parameters/sensi/columns-definitions.ts index f65d42ba3..490868c3b 100644 --- a/src/components/parameters/sensi/columns-definitions.ts +++ b/src/components/parameters/sensi/columns-definitions.ts @@ -21,7 +21,7 @@ import { SUPERVISED_VOLTAGE_LEVELS, } from './constants'; import { ElementType, EquipmentType } from '../../../utils'; -import { CONTINGENCIES } from '../common'; +import { CONTINGENCY_LISTS } from '../common'; import { ACTIVATED, ColumnsDef, Parameters } from '../common/parameter-table'; export const MONITORED_BRANCHES_EQUIPMENT_TYPES = [EquipmentType.LINE, EquipmentType.TWO_WINDINGS_TRANSFORMER]; @@ -83,7 +83,7 @@ export const COLUMNS_DEFINITIONS_INJECTIONS_SET: ColumnsDef[] = [ }, { label: 'ContingencyLists', - dataKey: CONTINGENCIES, + dataKey: CONTINGENCY_LISTS, initialValue: [], editable: true, directoryItems: true, @@ -122,7 +122,7 @@ export const COLUMNS_DEFINITIONS_INJECTIONS = [ }, { label: 'ContingencyLists', - dataKey: CONTINGENCIES, + dataKey: CONTINGENCY_LISTS, initialValue: [], editable: true, directoryItems: true, @@ -170,7 +170,7 @@ export const COLUMNS_DEFINITIONS_HVDCS = [ }, { label: 'ContingencyLists', - dataKey: CONTINGENCIES, + dataKey: CONTINGENCY_LISTS, initialValue: [], editable: true, directoryItems: true, @@ -218,7 +218,7 @@ export const COLUMNS_DEFINITIONS_PSTS = [ }, { label: 'ContingencyLists', - dataKey: CONTINGENCIES, + dataKey: CONTINGENCY_LISTS, initialValue: [], editable: true, directoryItems: true, @@ -257,7 +257,7 @@ export const COLUMNS_DEFINITIONS_NODES = [ }, { label: 'ContingencyLists', - dataKey: CONTINGENCIES, + dataKey: CONTINGENCY_LISTS, initialValue: [], editable: true, directoryItems: true, diff --git a/src/components/parameters/sensi/constants.ts b/src/components/parameters/sensi/constants.ts index d44946832..2dd208400 100644 --- a/src/components/parameters/sensi/constants.ts +++ b/src/components/parameters/sensi/constants.ts @@ -23,8 +23,6 @@ export const PARAMETER_SENSI_INJECTION = 'sensitivityInjection'; export const PARAMETER_SENSI_HVDC = 'sensitivityHVDC'; export const PARAMETER_SENSI_PST = 'sensitivityPST'; export const PARAMETER_SENSI_NODES = 'sensitivityNodes'; -export const CONTAINER_ID = 'containerId'; -export const CONTAINER_NAME = 'containerName'; export const MAX_RESULTS_COUNT = 500000; export const MAX_VARIABLES_COUNT = 5000; diff --git a/src/components/parameters/sensi/sensitivity-analysis-parameters-inline.tsx b/src/components/parameters/sensi/sensitivity-analysis-parameters-inline.tsx index 4c1aa5898..1b4475798 100644 --- a/src/components/parameters/sensi/sensitivity-analysis-parameters-inline.tsx +++ b/src/components/parameters/sensi/sensitivity-analysis-parameters-inline.tsx @@ -29,6 +29,7 @@ import { useSensitivityAnalysisParametersForm } from './use-sensitivity-analysis import { SensitivityAnalysisParametersForm } from './sensitivity-analysis-parameters-form'; import { PopupConfirmationDialog } from '../../dialogs'; import { snackWithFallback } from '../../../utils/error'; +import { EquipmentsContainer } from '../common/parameter-table'; interface SensitivityAnalysisParametersProps { studyUuid: UUID | null; @@ -71,7 +72,7 @@ export function SensitivityAnalysisParametersInline({ if (newParams && newParams.length > 0) { setOpenSelectParameterDialog(false); fetchSensitivityAnalysisParameters(newParams[0].id) - .then((parameters: SensitivityAnalysisParametersInfos) => { + .then((parameters: SensitivityAnalysisParametersInfos) => { console.info(`loading the following sensi parameters : ${parameters.uuid}`); reset(sensitivityAnalysisMethods.fromSensitivityAnalysisParamsDataToFormValues(parameters), { keepDefaultValues: true, diff --git a/src/components/parameters/sensi/use-sensitivity-analysis-parameters.ts b/src/components/parameters/sensi/use-sensitivity-analysis-parameters.ts index 18fde3030..1185551a4 100644 --- a/src/components/parameters/sensi/use-sensitivity-analysis-parameters.ts +++ b/src/components/parameters/sensi/use-sensitivity-analysis-parameters.ts @@ -9,7 +9,7 @@ import { yupResolver } from '@hookform/resolvers/yup'; import { type ObjectSchema } from 'yup'; import { useCallback, useEffect, useMemo, useState } from 'react'; import type { UUID } from 'node:crypto'; -import { ComputingType, CONTINGENCIES, PROVIDER } from '../common'; +import { ComputingType, CONTINGENCY_LISTS, PROVIDER } from '../common'; import { ElementType, FactorsCount, @@ -30,8 +30,6 @@ import { } from './utils'; import { ANGLE_FLOW_SENSITIVITY_VALUE_THRESHOLD, - CONTAINER_ID, - CONTAINER_NAME, DEFAULT_FACTOR_COUNT, DISTRIBUTION_TYPE, EQUIPMENTS_IN_VOLTAGE_REGULATION, @@ -58,15 +56,17 @@ import { import { DEFAULT_TIMEOUT_MS, IGNORE_SIGNAL, updateParameter } from '../../../services'; import { useSnackMessage } from '../../../hooks'; import { getNameElementEditorEmptyFormData } from '../common/name-element-editor'; -import { ACTIVATED } from '../common/parameter-table'; +import { ACTIVATED, CONTAINER_ID, CONTAINER_NAME, EquipmentsContainer } from '../common/parameter-table'; export interface UseSensitivityAnalysisParametersReturn { formMethods: UseFormReturn; formSchema: ObjectSchema; formattedProviders: { id: string; label: string }[]; - fromSensitivityAnalysisParamsDataToFormValues: (parameters: SensitivityAnalysisParametersInfos) => any; - formatNewParams: (formData: Record) => SensitivityAnalysisParametersInfos; - params: SensitivityAnalysisParametersInfos | null; + fromSensitivityAnalysisParamsDataToFormValues: ( + parameters: SensitivityAnalysisParametersInfos + ) => any; + formatNewParams: (formData: Record) => SensitivityAnalysisParametersInfos; + params: SensitivityAnalysisParametersInfos | null; paramsLoaded: boolean; isStudyLinked: boolean; onSaveInline: (formData: Record) => void; @@ -116,7 +116,8 @@ export const useSensitivityAnalysisParametersForm = ({ const [isLoading, setIsLoading] = useState(false); const [isSubmitAction, setIsSubmitAction] = useState(false); - const [factorCountParams, setFactorCountParams] = useState(null); + const [factorCountParams, setFactorCountParams] = + useState | null>(null); const emptyFormData = useMemo(() => { return { @@ -255,7 +256,9 @@ export const useSensitivityAnalysisParametersForm = ({ }, [updateFactorCount]); const fromSensitivityAnalysisParamsDataToFormValues = useCallback( - (parameters: SensitivityAnalysisParametersInfos): SensitivityAnalysisParametersFormSchema => { + ( + parameters: SensitivityAnalysisParametersInfos + ): SensitivityAnalysisParametersFormSchema => { return { [PROVIDER]: parameters[PROVIDER], [FLOW_FLOW_SENSITIVITY_VALUE_THRESHOLD]: parameters.flowFlowSensitivityValueThreshold, @@ -279,8 +282,8 @@ export const useSensitivityAnalysisParametersForm = ({ }; }) ?? [], [DISTRIBUTION_TYPE]: sensiInjectionsSet[DISTRIBUTION_TYPE], - [CONTINGENCIES]: - sensiInjectionsSet[CONTINGENCIES]?.map((sensiInjection) => { + [CONTINGENCY_LISTS]: + sensiInjectionsSet[CONTINGENCY_LISTS]?.map((sensiInjection) => { return { [FieldConstants.ID]: sensiInjection[CONTAINER_ID], [FieldConstants.NAME]: sensiInjection[CONTAINER_NAME], @@ -307,8 +310,8 @@ export const useSensitivityAnalysisParametersForm = ({ [FieldConstants.NAME]: sensiInjection[CONTAINER_NAME], }; }) ?? [], - [CONTINGENCIES]: - sensiInjections[CONTINGENCIES]?.map((sensiInjection) => { + [CONTINGENCY_LISTS]: + sensiInjections[CONTINGENCY_LISTS]?.map((sensiInjection) => { return { [FieldConstants.ID]: sensiInjection[CONTAINER_ID], [FieldConstants.NAME]: sensiInjection[CONTAINER_NAME], @@ -335,8 +338,8 @@ export const useSensitivityAnalysisParametersForm = ({ }; }) ?? [], [SENSITIVITY_TYPE]: sensiInjectionsSet[SENSITIVITY_TYPE], - [CONTINGENCIES]: - sensiInjectionsSet[CONTINGENCIES]?.map((sensiInjection) => { + [CONTINGENCY_LISTS]: + sensiInjectionsSet[CONTINGENCY_LISTS]?.map((sensiInjection) => { return { [FieldConstants.ID]: sensiInjection[CONTAINER_ID], [FieldConstants.NAME]: sensiInjection[CONTAINER_NAME], @@ -363,8 +366,8 @@ export const useSensitivityAnalysisParametersForm = ({ }; }) ?? [], [SENSITIVITY_TYPE]: sensiInjectionsSet[SENSITIVITY_TYPE], - [CONTINGENCIES]: - sensiInjectionsSet[CONTINGENCIES]?.map((sensiInjection) => { + [CONTINGENCY_LISTS]: + sensiInjectionsSet[CONTINGENCY_LISTS]?.map((sensiInjection) => { return { [FieldConstants.ID]: sensiInjection[CONTAINER_ID], [FieldConstants.NAME]: sensiInjection[CONTAINER_NAME], @@ -390,8 +393,8 @@ export const useSensitivityAnalysisParametersForm = ({ [FieldConstants.NAME]: sensiInjection[CONTAINER_NAME], }; }) ?? [], - [CONTINGENCIES]: - sensiInjectionsSet[CONTINGENCIES]?.map((sensiInjection) => { + [CONTINGENCY_LISTS]: + sensiInjectionsSet[CONTINGENCY_LISTS]?.map((sensiInjection) => { return { [FieldConstants.ID]: sensiInjection[CONTAINER_ID], [FieldConstants.NAME]: sensiInjection[CONTAINER_NAME], diff --git a/src/components/parameters/sensi/utils.ts b/src/components/parameters/sensi/utils.ts index 92cc04226..63ea13fd0 100644 --- a/src/components/parameters/sensi/utils.ts +++ b/src/components/parameters/sensi/utils.ts @@ -9,8 +9,6 @@ import { FieldValues } from 'react-hook-form'; import yup from '../../../utils/yupConfig'; import { ANGLE_FLOW_SENSITIVITY_VALUE_THRESHOLD, - CONTAINER_ID, - CONTAINER_NAME, DISTRIBUTION_TYPE, EQUIPMENTS_IN_VOLTAGE_REGULATION, FLOW_FLOW_SENSITIVITY_VALUE_THRESHOLD, @@ -28,11 +26,11 @@ import { SUPERVISED_VOLTAGE_LEVELS, } from './constants'; import { DistributionType, SensitivityType } from '../../../utils'; -import { CONTINGENCIES, PROVIDER } from '../common'; +import { CONTINGENCY_LISTS, PROVIDER } from '../common'; import { getNameElementEditorSchema } from '../common/name-element-editor'; import { NAME } from '../../inputs'; import { ID } from '../../../utils/constants/filterConstant'; -import { ACTIVATED } from '../common/parameter-table'; +import { ACTIVATED, CONTAINER_ID, CONTAINER_NAME } from '../common/parameter-table'; const getMonitoredBranchesSchema = () => { return { @@ -41,7 +39,7 @@ const getMonitoredBranchesSchema = () => { .of( yup.object().shape({ [ID]: yup.string().required(), - [NAME]: yup.string().required(), + [NAME]: yup.string().nullable().defined(), }) ) .required() @@ -64,12 +62,12 @@ const getSensitivityTypeSchema = () => { }; }; -const getContingenciesSchema = () => { +const getContingencyListsSchema = () => { return { - [CONTINGENCIES]: yup.array().of( + [CONTINGENCY_LISTS]: yup.array().of( yup.object().shape({ [ID]: yup.string().required(), - [NAME]: yup.string().required(), + [NAME]: yup.string().nullable().defined(), }) ), [ACTIVATED]: yup.boolean().required(), @@ -86,7 +84,7 @@ export const getSensiHVDCsFormSchema = () => ({ .of( yup.object().shape({ [ID]: yup.string().required(), - [NAME]: yup.string().required(), + [NAME]: yup.string().nullable().defined(), }) ) .required() @@ -94,7 +92,7 @@ export const getSensiHVDCsFormSchema = () => ({ is: (activated: boolean) => activated, then: (schema) => schema.min(1, 'FieldIsRequired'), }), - ...getContingenciesSchema(), + ...getContingencyListsSchema(), }) ), }); @@ -116,7 +114,7 @@ export const getSensiHvdcformatNewParams = (newParams: SensitivityAnalysisParame }; }), [SENSITIVITY_TYPE]: sensitivityHVDCs[SENSITIVITY_TYPE], - [CONTINGENCIES]: sensitivityHVDCs[CONTINGENCIES]?.map((container) => { + [CONTINGENCY_LISTS]: sensitivityHVDCs[CONTINGENCY_LISTS]?.map((container) => { return { [CONTAINER_ID]: container[ID], [CONTAINER_NAME]: container[NAME], @@ -137,7 +135,7 @@ export const getSensiInjectionsFormSchema = () => ({ .of( yup.object().shape({ [ID]: yup.string().required(), - [NAME]: yup.string().required(), + [NAME]: yup.string().nullable().defined(), }) ) .required() @@ -145,7 +143,7 @@ export const getSensiInjectionsFormSchema = () => ({ is: (activated: boolean) => activated, then: (schema) => schema.min(1, 'FieldIsRequired'), }), - ...getContingenciesSchema(), + ...getContingencyListsSchema(), }) ), }); @@ -166,7 +164,7 @@ export const getSensiInjectionsformatNewParams = (newParams: SensitivityAnalysis [CONTAINER_NAME]: container[NAME], }; }), - [CONTINGENCIES]: sensitivityInjections[CONTINGENCIES]?.map((container) => { + [CONTINGENCY_LISTS]: sensitivityInjections[CONTINGENCY_LISTS]?.map((container) => { return { [CONTAINER_ID]: container[ID], [CONTAINER_NAME]: container[NAME], @@ -187,7 +185,7 @@ export const getSensiInjectionsSetFormSchema = () => ({ .of( yup.object().shape({ [ID]: yup.string().required(), - [NAME]: yup.string().required(), + [NAME]: yup.string().nullable().defined(), }) ) .required() @@ -202,7 +200,7 @@ export const getSensiInjectionsSetFormSchema = () => ({ is: (activated: boolean) => activated, then: (schema) => schema.required(), }), - ...getContingenciesSchema(), + ...getContingencyListsSchema(), }) ), }); @@ -224,7 +222,7 @@ export interface IRowNewParams { [ID]: string; [NAME]: string; }>; - [CONTINGENCIES]: Array<{ + [CONTINGENCY_LISTS]: Array<{ [ID]: string; [NAME]: string; }>; @@ -236,7 +234,7 @@ export const getGenericRowNewParams = (newRowParams: IRowNewParams) => { [INJECTIONS]: newRowParams[INJECTIONS]?.map((container) => container[ID]), [HVDC_LINES]: newRowParams[HVDC_LINES]?.map((container) => container[ID]), [PSTS]: newRowParams[PSTS]?.map((container) => container[ID]), - [CONTINGENCIES]: newRowParams[CONTINGENCIES]?.map((container) => container[ID]), + [CONTINGENCY_LISTS]: newRowParams[CONTINGENCY_LISTS]?.map((container) => container[ID]), }; }; @@ -257,7 +255,7 @@ export const getSensiInjectionsSetformatNewParams = (newParams: SensitivityAnaly }; }), [DISTRIBUTION_TYPE]: sensitivityInjectionSet[DISTRIBUTION_TYPE], - [CONTINGENCIES]: sensitivityInjectionSet[CONTINGENCIES]?.map((container) => { + [CONTINGENCY_LISTS]: sensitivityInjectionSet[CONTINGENCY_LISTS]?.map((container) => { return { [CONTAINER_ID]: container[ID], [CONTAINER_NAME]: container[NAME], @@ -275,16 +273,16 @@ export const getSensiNodesFormSchema = () => ({ [SUPERVISED_VOLTAGE_LEVELS]: yup.array().of( yup.object().shape({ [ID]: yup.string().required(), - [NAME]: yup.string().required(), + [NAME]: yup.string().nullable().defined(), }) ), [EQUIPMENTS_IN_VOLTAGE_REGULATION]: yup.array().of( yup.object().shape({ [ID]: yup.string().required(), - [NAME]: yup.string().required(), + [NAME]: yup.string().nullable().defined(), }) ), - ...getContingenciesSchema(), + ...getContingencyListsSchema(), }) ), }); @@ -307,7 +305,7 @@ export const getSensiNodesformatNewParams = (newParams: SensitivityAnalysisParam }; } ), - [CONTINGENCIES]: sensitivityNode[CONTINGENCIES]?.map((container) => { + [CONTINGENCY_LISTS]: sensitivityNode[CONTINGENCY_LISTS]?.map((container) => { return { [CONTAINER_ID]: container[ID], [CONTAINER_NAME]: container[NAME], @@ -329,7 +327,7 @@ export const getSensiPSTsFormSchema = () => ({ .of( yup.object().shape({ [ID]: yup.string().required(), - [NAME]: yup.string().required(), + [NAME]: yup.string().nullable().defined(), }) ) .required() @@ -337,7 +335,7 @@ export const getSensiPSTsFormSchema = () => ({ is: (activated: boolean) => activated, then: (schema) => schema.min(1, 'FieldIsRequired'), }), - ...getContingenciesSchema(), + ...getContingencyListsSchema(), }) ), }); @@ -359,7 +357,7 @@ export const getSensiPstformatNewParams = (newParams: SensitivityAnalysisParamet }; }), [SENSITIVITY_TYPE]: sensitivityPSTs[SENSITIVITY_TYPE], - [CONTINGENCIES]: sensitivityPSTs[CONTINGENCIES]?.map((container) => { + [CONTINGENCY_LISTS]: sensitivityPSTs[CONTINGENCY_LISTS]?.map((container) => { return { [CONTAINER_ID]: container[ID], [CONTAINER_NAME]: container[NAME], diff --git a/src/services/sensitivity-analysis.ts b/src/services/sensitivity-analysis.ts index 49f424d46..64758c0d2 100644 --- a/src/services/sensitivity-analysis.ts +++ b/src/services/sensitivity-analysis.ts @@ -6,10 +6,20 @@ */ import type { UUID } from 'node:crypto'; import { backendFetch, backendFetchJson, safeEncodeURIComponent } from './utils'; -import { FactorsCount, SensitivityAnalysisParametersInfos } from '../utils'; +import { + FactorsCount, + SensitivityAnalysisParametersInfos, + SensitivityInjectionsSet, + SensitivityInjection, + SensitivityHVDC, + SensitivityPST, + SensitivityNodes, +} from '../utils'; import { PREFIX_STUDY_QUERIES } from './loadflow'; +import { CONTAINER_ID, CONTAINER_NAME } from '../components/parameters/common/parameter-table/constants'; +import { EquipmentsContainer } from '../components/parameters/common/parameter-table'; -const GET_PARAMETERS_PREFIX = `${import.meta.env.VITE_API_GATEWAY}/sensitivity-analysis/v1/parameters`; +const GET_PARAMETERS_PREFIX = `${import.meta.env.VITE_API_GATEWAY}/study/v1/sensitivity-analysis/parameters`; const PREFIX_SENSITIVITY_ANALYSIS_SERVER_QUERIES = `${import.meta.env.VITE_API_GATEWAY}/sensitivity-analysis`; export const getStudyUrl = (studyUuid: UUID | null) => `${PREFIX_STUDY_QUERIES}/v1/studies/${safeEncodeURIComponent(studyUuid)}`; @@ -34,13 +44,6 @@ export function fetchSensitivityAnalysisProviders(): Promise { return backendFetchJson(url); } -export function getSensitivityAnalysisParameters(studyUuid: UUID) { - console.info('get sensitivity analysis parameters'); - const url = `${getStudyUrl(studyUuid)}/sensitivity-analysis/parameters`; - console.debug(url); - return backendFetchJson(url); -} - export function fetchSensitivityAnalysisParameters(parameterUuid: string) { console.info('get sensitivity analysis parameters'); const url = `${GET_PARAMETERS_PREFIX}/${parameterUuid}`; @@ -50,7 +53,7 @@ export function fetchSensitivityAnalysisParameters(parameterUuid: string) { export function setSensitivityAnalysisParameters( studyUuid: UUID | null, - newParams: SensitivityAnalysisParametersInfos | null + newParamsInfos: SensitivityAnalysisParametersInfos | null ) { console.info('set sensitivity analysis parameters'); const url = `${getStudyUrl(studyUuid)}/sensitivity-analysis/parameters`; @@ -61,7 +64,7 @@ export function setSensitivityAnalysisParameters( Accept: 'application/json', 'Content-Type': 'application/json', }, - body: newParams ? JSON.stringify(newParams) : null, + body: newParamsInfos ? JSON.stringify(mapSensitivityAnalysisParameters(newParamsInfos)) : null, }); } @@ -69,7 +72,7 @@ export function getSensitivityAnalysisFactorsCount( studyUuid: UUID | null, currentNodeUuid: UUID, currentRootNetworkUuid: UUID, - newParams: SensitivityAnalysisParametersInfos, + newParams: SensitivityAnalysisParametersInfos, abortSignal: AbortSignal ): Promise { console.info('get sensitivity analysis parameters computing count'); @@ -85,7 +88,10 @@ export function getSensitivityAnalysisFactorsCount( }); } -export function updateSensitivityAnalysisParameters(parameterUuid: UUID, newParams: any) { +export function updateSensitivityAnalysisParameters( + parameterUuid: UUID, + newParamsInfos: SensitivityAnalysisParametersInfos | null +) { console.info('set security analysis parameters'); const setSecurityAnalysisParametersUrl = `${getSensiUrl()}parameters/${parameterUuid}`; console.debug(setSecurityAnalysisParametersUrl); @@ -95,6 +101,6 @@ export function updateSensitivityAnalysisParameters(parameterUuid: UUID, newPara Accept: 'application/json', 'Content-Type': 'application/json', }, - body: newParams ? JSON.stringify(newParams) : null, + body: newParamsInfos ? JSON.stringify(mapSensitivityAnalysisParameters(newParamsInfos)) : null, }); } diff --git a/src/utils/types/parameters.type.ts b/src/utils/types/parameters.type.ts index 7ac617279..34f0c81bc 100644 --- a/src/utils/types/parameters.type.ts +++ b/src/utils/types/parameters.type.ts @@ -15,6 +15,7 @@ import { SensitivityAnalysisParametersInfos } from './sensitivity-analysis.type' import { type ShortCircuitParametersInfos } from '../../components/parameters/short-circuit/short-circuit-parameters.type'; import { SAParameters } from '../../components/parameters/security-analysis/types'; import { DynamicMarginCalculationParametersInfos } from './dynamic-margin-calculation.type'; +import { EquipmentsContainer } from '../../components/parameters/common/parameter-table/types'; export enum ParameterType { BOOLEAN = 'BOOLEAN', @@ -41,7 +42,7 @@ export type SpecificParametersValues = Record; export type SpecificParametersPerProvider = Record; export type ParametersInfos = T extends ComputingType.SENSITIVITY_ANALYSIS - ? SensitivityAnalysisParametersInfos + ? SensitivityAnalysisParametersInfos : T extends ComputingType.SECURITY_ANALYSIS ? SAParameters : T extends ComputingType.LOAD_FLOW diff --git a/src/utils/types/sensitivity-analysis.type.ts b/src/utils/types/sensitivity-analysis.type.ts index defa82167..f6bc28919 100644 --- a/src/utils/types/sensitivity-analysis.type.ts +++ b/src/utils/types/sensitivity-analysis.type.ts @@ -6,6 +6,7 @@ */ import type { UUID } from 'node:crypto'; +import { EquipmentsContainer } from '../../components/parameters/common/parameter-table/types'; export enum DistributionType { PROPORTIONAL = 'PROPORTIONAL', @@ -19,45 +20,40 @@ export enum SensitivityType { DELTA_A = 'DELTA_A', } -interface EquipmentsContainer { - containerId: string; - containerName: string; -} - -interface SensitivityParamsCommon { - contingencies?: EquipmentsContainer[]; +interface SensitivityParamsCommon { + contingencyLists?: T[]; activated?: boolean | null; } -export interface SensitivityInjectionsSet extends SensitivityParamsCommon { - monitoredBranches?: EquipmentsContainer[]; - injections?: EquipmentsContainer[]; +export interface SensitivityInjectionsSet extends SensitivityParamsCommon { + monitoredBranches?: T[]; + injections?: T[]; distributionType?: DistributionType; } -export interface SensitivityInjection extends SensitivityParamsCommon { - monitoredBranches?: EquipmentsContainer[]; - injections?: EquipmentsContainer[]; +export interface SensitivityInjection extends SensitivityParamsCommon { + monitoredBranches?: T[]; + injections?: T[]; } -export interface SensitivityHVDC extends SensitivityParamsCommon { - monitoredBranches?: EquipmentsContainer[]; +export interface SensitivityHVDC extends SensitivityParamsCommon { + monitoredBranches?: T[]; sensitivityType?: SensitivityType; - hvdcs?: EquipmentsContainer[]; + hvdcs?: T[]; } -export interface SensitivityPST extends SensitivityParamsCommon { - monitoredBranches?: EquipmentsContainer[]; +export interface SensitivityPST extends SensitivityParamsCommon { + monitoredBranches?: T[]; sensitivityType?: SensitivityType; - psts?: EquipmentsContainer[]; + psts?: T[]; } -export interface SensitivityNodes extends SensitivityParamsCommon { - monitoredVoltageLevels?: EquipmentsContainer[]; - equipmentsInVoltageRegulation?: EquipmentsContainer[]; +export interface SensitivityNodes extends SensitivityParamsCommon { + monitoredVoltageLevels?: T[]; + equipmentsInVoltageRegulation?: T[]; } -export interface SensitivityAnalysisParametersInfos { +export interface SensitivityAnalysisParametersInfos { provider: string; uuid?: UUID; date?: Date; @@ -65,11 +61,11 @@ export interface SensitivityAnalysisParametersInfos { flowFlowSensitivityValueThreshold: number; angleFlowSensitivityValueThreshold: number; flowVoltageSensitivityValueThreshold: number; - sensitivityInjectionsSet?: SensitivityInjectionsSet[]; - sensitivityInjection?: SensitivityInjection[]; - sensitivityHVDC?: SensitivityHVDC[]; - sensitivityPST?: SensitivityPST[]; - sensitivityNodes?: SensitivityNodes[]; + sensitivityInjectionsSet?: SensitivityInjectionsSet[]; + sensitivityInjection?: SensitivityInjection[]; + sensitivityHVDC?: SensitivityHVDC[]; + sensitivityPST?: SensitivityPST[]; + sensitivityNodes?: SensitivityNodes[]; } export interface FactorsCount {