From d66e01e1738a0a6e7d7fb05e326fb2ff6ebc0408 Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Tue, 7 Jul 2026 16:50:05 +0200 Subject: [PATCH] wip Signed-off-by: David BRAQUART --- .../line/modification/line-dialog-tabs.tsx | 51 --- .../line-modification-dialog-header.tsx | 70 --- .../line-modification-dialog-tabs.tsx | 77 ---- .../modification/line-modification-dialog.tsx | 412 +++++------------- .../modification/line-modification-type.ts | 30 -- .../line/modification/line-utils.ts | 13 - src/services/network-modification-types.ts | 43 -- src/services/study/network-modifications.ts | 93 +--- src/translations/en.json | 2 - src/translations/fr.json | 2 - 10 files changed, 125 insertions(+), 668 deletions(-) delete mode 100644 src/components/dialogs/network-modifications/line/modification/line-dialog-tabs.tsx delete mode 100644 src/components/dialogs/network-modifications/line/modification/line-modification-dialog-header.tsx delete mode 100644 src/components/dialogs/network-modifications/line/modification/line-modification-dialog-tabs.tsx delete mode 100644 src/components/dialogs/network-modifications/line/modification/line-modification-type.ts delete mode 100644 src/components/dialogs/network-modifications/line/modification/line-utils.ts diff --git a/src/components/dialogs/network-modifications/line/modification/line-dialog-tabs.tsx b/src/components/dialogs/network-modifications/line/modification/line-dialog-tabs.tsx deleted file mode 100644 index 5a977a49a2..0000000000 --- a/src/components/dialogs/network-modifications/line/modification/line-dialog-tabs.tsx +++ /dev/null @@ -1,51 +0,0 @@ -/** - * 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 { Grid, Tab, Tabs } from '@mui/material'; -import { FormattedMessage } from 'react-intl'; -import { getTabIndicatorStyle, getTabStyle } from '../../../../utils/tab-utils'; -import { LineModificationDialogTab } from './line-utils'; - -interface LineDialogTabsProps { - tabIndex: number; - tabIndexesWithError: number[]; - setTabIndex: (index: number) => void; -} - -const LineDialogTabs = ({ tabIndex, tabIndexesWithError, setTabIndex }: LineDialogTabsProps) => { - return ( - - setTabIndex(newValue)} - TabIndicatorProps={{ - sx: getTabIndicatorStyle(tabIndexesWithError, tabIndex), - }} - > - } - sx={getTabStyle(tabIndexesWithError, LineModificationDialogTab.CONNECTIVITY_TAB)} - /> - } - sx={getTabStyle(tabIndexesWithError, LineModificationDialogTab.CHARACTERISTICS_TAB)} - /> - } - sx={getTabStyle(tabIndexesWithError, LineModificationDialogTab.LIMITS_TAB)} - /> - } - sx={getTabStyle(tabIndexesWithError, LineModificationDialogTab.STATE_ESTIMATION_TAB)} - /> - - - ); -}; - -export default LineDialogTabs; diff --git a/src/components/dialogs/network-modifications/line/modification/line-modification-dialog-header.tsx b/src/components/dialogs/network-modifications/line/modification/line-modification-dialog-header.tsx deleted file mode 100644 index 3212886145..0000000000 --- a/src/components/dialogs/network-modifications/line/modification/line-modification-dialog-header.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/** - * 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 { EQUIPMENT_NAME } from 'components/utils/field-constants'; -import { Box, Grid2 as Grid, TextField } from '@mui/material'; -import LineDialogTabs from './line-dialog-tabs'; -import { BranchInfos, filledTextField, TextInput } from '@gridsuite/commons-ui'; -import { GridItem } from '../../../commons/grid-item'; - -export interface LineModificationDialogHeaderProps { - lineToModify: BranchInfos | null; - tabIndexesWithError: number[]; - tabIndex: number; - setTabIndex: (index: number) => void; - equipmentId: string; -} - -const LineModificationDialogHeader = ({ - lineToModify, - tabIndexesWithError, - tabIndex, - setTabIndex, - equipmentId, -}: Readonly) => { - const lineIdField = ( - - ); - - const lineNameField = ( - - ); - - return ( - - - {lineIdField} - {lineNameField} - - - - ); -}; - -export default LineModificationDialogHeader; diff --git a/src/components/dialogs/network-modifications/line/modification/line-modification-dialog-tabs.tsx b/src/components/dialogs/network-modifications/line/modification/line-modification-dialog-tabs.tsx deleted file mode 100644 index e731d3097f..0000000000 --- a/src/components/dialogs/network-modifications/line/modification/line-modification-dialog-tabs.tsx +++ /dev/null @@ -1,77 +0,0 @@ -/** - * 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 { Box } from '@mui/material'; -import { LineModificationDialogTab } from './line-utils'; -import type { UUID } from 'node:crypto'; -import { CurrentTreeNode } from '../../../../graph/tree-node.type'; -import { JSX, useCallback } from 'react'; -import { - BranchActiveReactivePowerMeasurementsForm, - BranchConnectivityForm, - BranchInfos, - LimitsPane, - LineCharacteristicsPane, -} from '@gridsuite/commons-ui'; -import PositionDiagramPane from '../../../../grid-layout/cards/diagrams/singleLineDiagram/positionDiagram/position-diagram-pane'; -import useVoltageLevelsListInfos from '../../../../../hooks/use-voltage-levels-list-infos'; -import { fetchBusesOrBusbarSectionsForVoltageLevel } from '../../../../../services/study/network'; - -export interface LineModificationDialogTabsProps { - studyUuid: UUID; - currentNode: CurrentTreeNode; - currentRootNetworkUuid: UUID; - lineToModify: BranchInfos | null; - tabIndex: number | null; -} - -const LineModificationDialogTabs = ({ - studyUuid, - currentNode, - currentRootNetworkUuid, - lineToModify, - tabIndex, -}: Readonly): JSX.Element => { - const voltageLevelOptions = useVoltageLevelsListInfos(studyUuid, currentNode.id, currentRootNetworkUuid); - const fetchBusesOrBusbarSections = useCallback( - (voltageLevelId: string) => - fetchBusesOrBusbarSectionsForVoltageLevel( - studyUuid, - currentNode.id, - currentRootNetworkUuid, - voltageLevelId - ), - [studyUuid, currentNode.id, currentRootNetworkUuid] - ); - - return ( - <> - - - - - - - - ); -}; - -export default LineModificationDialogTabs; diff --git a/src/components/dialogs/network-modifications/line/modification/line-modification-dialog.tsx b/src/components/dialogs/network-modifications/line/modification/line-modification-dialog.tsx index 7adff16393..24ff44706a 100644 --- a/src/components/dialogs/network-modifications/line/modification/line-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/line/modification/line-modification-dialog.tsx @@ -7,122 +7,54 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { - convertInputValue, - convertOutputValue, - createConnectivityData, CustomFormProvider, DeepNullable, - emptyProperties, EquipmentType, FieldConstants, - FieldType, - getBranchActiveReactivePowerEditData, - getBranchActiveReactivePowerEmptyFormData, - getBranchActiveReactivePowerValidationSchema, - getLineCharacteristicsFormData, - getCon1andCon2WithPositionValidationSchema, getConcatenatedProperties, - getConnectivityFormData, - getCont1Cont2WithPositionEmptyFormData, - getPropertiesFromModification, - modificationPropertiesSchema, - OperationalLimitsGroupsFormSchema, - sanitizeString, snackWithFallback, - toModificationOperation, - toModificationProperties, useSnackMessage, - addModificationTypeToOpLimitsGroups, - addOperationTypeToSelectedOpLG, - getLimitsEmptyFormData, - getLineCharacteristicsEmptyFormData, - getLineCharacteristicsValidationSchemaProps, - getLimitsValidationSchema, - formatOpLimitGroupsToFormInfos, convertToOperationalLimitsGroupFormSchema, OperationalLimitsGroupFormSchema, - getAllLimitsFormData, BranchInfos, ComputedLineCharacteristics, convertToLineSegmentInfos, convertLimitsToOperationalLimitsGroupFormSchema, - SegmentFormData, LineSegmentsFormData, + lineModificationFormToDto, + LineForm, + LineModificationDto, + lineModificationFormSchema, + lineModificationEmptyFormData, + LineModificationFormData, + lineModificationDtoToForm, } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; -import { - APPLY_SEGMENTS_LIMITS, - B1, - B2, - BUS_OR_BUSBAR_SECTION, - CHARACTERISTICS, - CONNECTED, - CONNECTION_DIRECTION, - CONNECTION_NAME, - CONNECTION_POSITION, - CONNECTIVITY, - CONNECTIVITY_1, - CONNECTIVITY_2, - ENABLE_OLG_MODIFICATION, - EQUIPMENT_NAME, - FINAL_CURRENT_LIMITS, - G1, - G2, - LIMITS, - LINE_SEGMENTS, - MEASUREMENT_P1, - MEASUREMENT_P2, - MEASUREMENT_Q1, - MEASUREMENT_Q2, - NAME, - OPERATIONAL_LIMITS_GROUPS, - R, - SELECTED_OPERATIONAL_LIMITS_GROUP_ID1, - SELECTED_OPERATIONAL_LIMITS_GROUP_ID2, - STATE_ESTIMATION, - TOTAL_REACTANCE, - TOTAL_RESISTANCE, - TOTAL_SUSCEPTANCE, - VALIDITY, - VOLTAGE_LEVEL, - X, -} from 'components/utils/field-constants'; -import { FieldErrors } from 'react-hook-form'; -import * as yup from 'yup'; import { ModificationDialog } from '../../../commons/modificationDialog'; -import LineModificationDialogTabs from './line-modification-dialog-tabs'; -import LineModificationDialogHeader from './line-modification-dialog-header'; import { useOpenShortWaitFetching } from 'components/dialogs/commons/handle-modification-form'; import { FORM_LOADING_DELAY } from 'components/network/constants'; import LineTypeSegmentDialog from '../../../line-types-catalog/line-type-segment-dialog'; import { EQUIPMENT_INFOS_TYPES } from 'components/utils/equipment-types'; import { EquipmentIdSelector } from '../../../equipment-id/equipment-id-selector'; import { modifyLine } from '../../../../../services/study/network-modifications'; -import { fetchNetworkElementInfos } from '../../../../../services/study/network'; +import { + fetchBusesOrBusbarSectionsForVoltageLevel, + fetchNetworkElementInfos, +} from '../../../../../services/study/network'; +import { useIntl } from 'react-intl'; import { FetchStatus } from '../../../../../services/utils'; -import { LineModificationDialogTab } from './line-utils'; import { isNodeBuilt } from '../../../../graph/util/model-functions'; -import type { UUID } from 'node:crypto'; -import { CurrentTreeNode } from '../../../../graph/tree-node.type'; -import { useIntl } from 'react-intl'; -import { LineModificationFormSchema } from './line-modification-type'; -import { LineModificationInfos } from '../../../../../services/network-modification-types'; import { useFormWithDirtyTracking } from 'components/dialogs/commons/use-form-with-dirty-tracking'; +import PositionDiagramPane from '../../../../grid-layout/cards/diagrams/singleLineDiagram/positionDiagram/position-diagram-pane'; +import useVoltageLevelsListInfos from '../../../../../hooks/use-voltage-levels-list-infos'; +import { WithModificationId } from 'services/network-modification-types'; +import { EquipmentModificationDialogProps } from 'components/graph/menus/network-modifications/network-modification-menu.type'; + +interface LineModificationDtoWithId extends LineModificationDto, WithModificationId {} -export interface LineModificationDialogProps { - // contains data when we try to edit an existing hypothesis from the current node's list - editData: LineModificationInfos | null | undefined; - // Used to pre-select an equipmentId when calling this dialog from the SLD or network map - defaultIdValue: string; - studyUuid: UUID; - currentNode: CurrentTreeNode; - currentRootNetworkUuid: UUID; - isUpdate: boolean; - editDataFetchStatus?: string; - open?: boolean; - onClose?: () => void; - //...dialogProps -} +export type LineModificationDialogProps = EquipmentModificationDialogProps & { + editData?: LineModificationDtoWithId; +}; /** * Dialog to modify a line in the network @@ -149,167 +81,47 @@ const LineModificationDialog = ({ const intl = useIntl(); const { snackError } = useSnackMessage(); const [selectedId, setSelectedId] = useState(defaultIdValue ?? null); - const [tabIndexesWithError, setTabIndexesWithError] = useState([]); const [dataFetchStatus, setDataFetchStatus] = useState(FetchStatus.IDLE); const [lineToModify, setLineToModify] = useState(null); - const [tabIndex, setTabIndex] = useState(LineModificationDialogTab.CONNECTIVITY_TAB); const [isOpenLineTypesCatalogDialog, setIsOpenLineTypesCatalogDialog] = useState(false); + const voltageLevelOptions = useVoltageLevelsListInfos(studyUuid, currentNode?.id, currentRootNetworkUuid); - const emptyFormData: any = useMemo( - () => ({ - [EQUIPMENT_NAME]: '', - ...getCont1Cont2WithPositionEmptyFormData(true), - ...getLineCharacteristicsEmptyFormData(), - ...getLimitsEmptyFormData(), - ...getBranchActiveReactivePowerEmptyFormData(STATE_ESTIMATION), - ...emptyProperties, - }), - [] - ); - - const formSchema = yup - .object() - .shape({ - [EQUIPMENT_NAME]: yup.string().nullable(), - ...getCon1andCon2WithPositionValidationSchema(true), - [CHARACTERISTICS]: getLineCharacteristicsValidationSchemaProps(true), - ...getLimitsValidationSchema(LIMITS, true), - ...getBranchActiveReactivePowerValidationSchema(STATE_ESTIMATION), - }) - .concat(modificationPropertiesSchema) - .required(); - - const formMethods = useFormWithDirtyTracking({ - defaultValues: emptyFormData, - resolver: yupResolver(formSchema), + const formMethods = useFormWithDirtyTracking>({ + defaultValues: lineModificationEmptyFormData, + resolver: yupResolver>(lineModificationFormSchema), }); const { reset, setValue, getValues, watch } = formMethods; - const editSegmentsValue = watch(LINE_SEGMENTS); - const applySegmentsLimits = watch(APPLY_SEGMENTS_LIMITS); + const editSegmentsValue = watch(FieldConstants.LINE_SEGMENTS) as LineSegmentsFormData; + const applySegmentsLimits = watch(FieldConstants.APPLY_SEGMENTS_LIMITS) as boolean; const editSegmentsData = useMemo( () => ({ - [LINE_SEGMENTS]: editSegmentsValue ?? [], - [APPLY_SEGMENTS_LIMITS]: applySegmentsLimits ?? true, + [FieldConstants.LINE_SEGMENTS]: editSegmentsValue ?? [], + [FieldConstants.APPLY_SEGMENTS_LIMITS]: applySegmentsLimits ?? true, }), [editSegmentsValue, applySegmentsLimits] ); - const fromEditDataToFormValues = useCallback( - (lineModification: LineModificationInfos) => { - if (lineModification?.equipmentId) { - setSelectedId(lineModification.equipmentId); - } - reset({ - [EQUIPMENT_NAME]: lineModification.equipmentName?.value ?? '', - [CONNECTIVITY]: { - ...getConnectivityFormData( - createConnectivityData(lineModification, 1), - FieldConstants.CONNECTIVITY_1 - ), - ...getConnectivityFormData( - createConnectivityData(lineModification, 2), - FieldConstants.CONNECTIVITY_2 - ), - }, - ...getBranchActiveReactivePowerEditData(STATE_ESTIMATION, lineModification), - ...getLineCharacteristicsFormData({ - r: lineModification.r?.value ?? null, - x: lineModification.x?.value ?? null, - g1: convertInputValue(FieldType.G1, lineModification.g1?.value ?? null), - b1: convertInputValue(FieldType.B1, lineModification.b1?.value ?? null), - g2: convertInputValue(FieldType.G2, lineModification.g2?.value ?? null), - b2: convertInputValue(FieldType.B2, lineModification.b2?.value ?? null), - }), - ...getAllLimitsFormData( - formatOpLimitGroupsToFormInfos(lineModification.operationalLimitsGroups), - lineModification.selectedOperationalLimitsGroupId1?.value ?? null, - lineModification.selectedOperationalLimitsGroupId2?.value ?? null, - lineModification[ENABLE_OLG_MODIFICATION] - ), - ...getPropertiesFromModification(lineModification.properties), - [LINE_SEGMENTS]: lineModification.lineSegments, - [APPLY_SEGMENTS_LIMITS]: lineModification.applySegmentsLimits ?? true, - }); - }, - [reset] - ); - useEffect(() => { if (editData) { - fromEditDataToFormValues(editData); + if (editData?.equipmentId) { + setSelectedId(editData.equipmentId); + } + reset(lineModificationDtoToForm(editData)); } - }, [fromEditDataToFormValues, editData]); + }, [reset, editData]); - const onSubmit = useCallback( - (line: LineModificationFormSchema) => { - const connectivity1 = line[CONNECTIVITY]?.[CONNECTIVITY_1]; - const connectivity2 = line[CONNECTIVITY]?.[CONNECTIVITY_2]; - const characteristics = line[CHARACTERISTICS]; - const stateEstimationData = line[STATE_ESTIMATION]; - const limits: OperationalLimitsGroupsFormSchema = line[LIMITS]; - modifyLine({ - studyUuid: studyUuid, - nodeUuid: currentNodeUuid, - modificationUuid: editData?.uuid ?? '', - lineId: selectedId, - equipmentName: toModificationOperation(sanitizeString(line[EQUIPMENT_NAME]) ?? ''), - r: characteristics[R], - x: characteristics[X], - g1: convertOutputValue(FieldType.G1, characteristics[G1]), - b1: convertOutputValue(FieldType.B1, characteristics[B1]), - g2: convertOutputValue(FieldType.G2, characteristics[G2]), - b2: convertOutputValue(FieldType.B2, characteristics[B2]), - operationalLimitsGroups: limits[ENABLE_OLG_MODIFICATION] - ? addModificationTypeToOpLimitsGroups(limits[OPERATIONAL_LIMITS_GROUPS]) - : [], - selectedOperationalLimitsGroupId1: addOperationTypeToSelectedOpLG( - limits[SELECTED_OPERATIONAL_LIMITS_GROUP_ID1], - intl.formatMessage({ - id: 'None', - }) - ), - selectedOperationalLimitsGroupId2: addOperationTypeToSelectedOpLG( - limits[SELECTED_OPERATIONAL_LIMITS_GROUP_ID2], - intl.formatMessage({ - id: 'None', - }) - ), - [ENABLE_OLG_MODIFICATION]: limits[ENABLE_OLG_MODIFICATION], - voltageLevelId1: connectivity1[VOLTAGE_LEVEL]?.id, - busOrBusbarSectionId1: connectivity1[BUS_OR_BUSBAR_SECTION]?.id, - voltageLevelId2: connectivity2[VOLTAGE_LEVEL]?.id, - busOrBusbarSectionId2: connectivity2[BUS_OR_BUSBAR_SECTION]?.id, - connectionName1: sanitizeString(connectivity1[CONNECTION_NAME]), - connectionName2: sanitizeString(connectivity2[CONNECTION_NAME]), - connectionDirection1: connectivity1[CONNECTION_DIRECTION], - connectionDirection2: connectivity2[CONNECTION_DIRECTION], - connectionPosition1: connectivity1[CONNECTION_POSITION], - connectionPosition2: connectivity2[CONNECTION_POSITION], - connected1: connectivity1[CONNECTED], - connected2: connectivity2[CONNECTED], - properties: toModificationProperties(line), - p1MeasurementValue: stateEstimationData[MEASUREMENT_P1][FieldConstants.VALUE], - p1MeasurementValidity: stateEstimationData[MEASUREMENT_P1][VALIDITY], - q1MeasurementValue: stateEstimationData[MEASUREMENT_Q1][FieldConstants.VALUE], - q1MeasurementValidity: stateEstimationData[MEASUREMENT_Q1][VALIDITY], - p2MeasurementValue: stateEstimationData[MEASUREMENT_P2][FieldConstants.VALUE], - p2MeasurementValidity: stateEstimationData[MEASUREMENT_P2][VALIDITY], - q2MeasurementValue: stateEstimationData[MEASUREMENT_Q2][FieldConstants.VALUE], - q2MeasurementValidity: stateEstimationData[MEASUREMENT_Q2][VALIDITY], - lineSegments: line[LINE_SEGMENTS], - applySegmentsLimits: line[APPLY_SEGMENTS_LIMITS] ?? true, - }).catch((error) => { - snackWithFallback(snackError, error, { headerId: 'LineModificationError' }); - }); - }, - [studyUuid, currentNodeUuid, editData, selectedId, intl, snackError] - ); + const onSubmit = useCallback((lineForm: LineModificationFormData) => { + const dto = lineModificationFormToDto(lineForm, intl); + modifyLine(studyUuid, currentNodeUuid, editData?.uuid, dto).catch((error: unknown) => { + snackWithFallback(snackError, error, { headerId: 'LineModificationError' }); + }); + }, []); const clear = () => { - reset(emptyFormData); + reset(lineModificationEmptyFormData); }; const onEquipmentIdChange = useCallback( @@ -329,18 +141,21 @@ const LineModificationDialog = ({ if (line) { setLineToModify(line); reset( - (formValues: LineModificationFormSchema) => ({ + (formValues: DeepNullable) => ({ ...formValues, ...{ - [LIMITS]: formValues?.limits[ENABLE_OLG_MODIFICATION] + [FieldConstants.LIMITS]: formValues?.limits?.[ + FieldConstants.ENABLE_OLG_MODIFICATION + ] ? { - [ENABLE_OLG_MODIFICATION]: formValues.limits[ENABLE_OLG_MODIFICATION], - [OPERATIONAL_LIMITS_GROUPS]: + [FieldConstants.ENABLE_OLG_MODIFICATION]: + formValues.limits?.[FieldConstants.ENABLE_OLG_MODIFICATION], + [FieldConstants.OPERATIONAL_LIMITS_GROUPS]: formValues.limits?.operationalLimitsGroups ?? [], } : { - [ENABLE_OLG_MODIFICATION]: false, - [OPERATIONAL_LIMITS_GROUPS]: + [FieldConstants.ENABLE_OLG_MODIFICATION]: false, + [FieldConstants.OPERATIONAL_LIMITS_GROUPS]: convertToOperationalLimitsGroupFormSchema( line?.currentLimits ?? [] ), @@ -355,16 +170,28 @@ const LineModificationDialog = ({ }) .catch(() => { setDataFetchStatus(FetchStatus.FAILED); + reset( + { ...lineModificationEmptyFormData, [FieldConstants.EQUIPMENT_ID]: equipmentId }, + { keepDirty: true } + ); if (editData?.equipmentId !== equipmentId) { setLineToModify(null); } }); } else { setLineToModify(null); - reset(emptyFormData, { keepDefaultValues: true }); + reset(lineModificationEmptyFormData, { keepDefaultValues: true }); } }, - [studyUuid, currentNodeUuid, currentRootNetworkUuid, reset, getValues, editData?.equipmentId, emptyFormData] + [ + studyUuid, + currentNodeUuid, + currentRootNetworkUuid, + reset, + getValues, + editData?.equipmentId, + lineModificationEmptyFormData, + ] ); useEffect(() => { @@ -373,31 +200,6 @@ const LineModificationDialog = ({ } }, [selectedId, onEquipmentIdChange]); - const onValidationError = (errors: FieldErrors) => { - let tabsInError: number[] = []; - if (errors?.[LIMITS] !== undefined) { - tabsInError.push(LineModificationDialogTab.LIMITS_TAB); - } - if (errors?.[CHARACTERISTICS] !== undefined) { - tabsInError.push(LineModificationDialogTab.CHARACTERISTICS_TAB); - } - if (errors?.[CONNECTIVITY] !== undefined) { - tabsInError.push(LineModificationDialogTab.CONNECTIVITY_TAB); - } - if (errors?.[STATE_ESTIMATION] !== undefined) { - tabsInError.push(LineModificationDialogTab.STATE_ESTIMATION_TAB); - } - - if (tabsInError.includes(tabIndex)) { - // error in current tab => do not change tab systematically but remove current tab in error list - setTabIndexesWithError(tabsInError.filter((errorTabIndex) => errorTabIndex !== tabIndex)); - } else if (tabsInError.length > 0) { - // switch to the first tab in the list then remove the tab in the error list - setTabIndex(tabsInError[0]); - setTabIndexesWithError(tabsInError.filter((errorTabIndex, index, arr) => errorTabIndex !== arr[0])); - } - }; - const open = useOpenShortWaitFetching({ isDataFetched: !isUpdate || @@ -412,54 +214,72 @@ const LineModificationDialog = ({ const handleLineSegmentsBuildSubmit = ( data: ComputedLineCharacteristics, - lineSegments: DeepNullable[], + lineSegments: DeepNullable, applyLimits: boolean | null ) => { - setValue(`${CHARACTERISTICS}.${R}`, data[TOTAL_RESISTANCE], { - shouldDirty: true, - }); - setValue(`${CHARACTERISTICS}.${X}`, data[TOTAL_REACTANCE], { - shouldDirty: true, - }); - setValue(`${CHARACTERISTICS}.${B1}`, data[TOTAL_SUSCEPTANCE] / 2, { - shouldDirty: true, - }); - setValue(`${CHARACTERISTICS}.${B2}`, data[TOTAL_SUSCEPTANCE] / 2, { + setValue( + `${FieldConstants.CHARACTERISTICS}.${FieldConstants.R}` as any, + data[FieldConstants.TOTAL_RESISTANCE], + { + shouldDirty: true, + } + ); + setValue(`${FieldConstants.CHARACTERISTICS}.${FieldConstants.X}` as any, data[FieldConstants.TOTAL_REACTANCE], { shouldDirty: true, }); - setValue(LINE_SEGMENTS, convertToLineSegmentInfos(lineSegments as LineSegmentsFormData)); + setValue( + `${FieldConstants.CHARACTERISTICS}.${FieldConstants.B1}` as any, + data[FieldConstants.TOTAL_SUSCEPTANCE] / 2, + { + shouldDirty: true, + } + ); + setValue( + `${FieldConstants.CHARACTERISTICS}.${FieldConstants.B2}` as any, + data[FieldConstants.TOTAL_SUSCEPTANCE] / 2, + { + shouldDirty: true, + } + ); + setValue(FieldConstants.LINE_SEGMENTS, convertToLineSegmentInfos(lineSegments as LineSegmentsFormData)); const shouldApplyLimits = applyLimits ?? true; - setValue(APPLY_SEGMENTS_LIMITS, shouldApplyLimits); + setValue(FieldConstants.APPLY_SEGMENTS_LIMITS, shouldApplyLimits); if (shouldApplyLimits) { - const limitsFromSegments = convertLimitsToOperationalLimitsGroupFormSchema(data[FINAL_CURRENT_LIMITS]); + const limitsFromSegments = convertLimitsToOperationalLimitsGroupFormSchema( + data[FieldConstants.FINAL_CURRENT_LIMITS] + ); const actualLimits: OperationalLimitsGroupFormSchema[] = - getValues(`${LIMITS}.${OPERATIONAL_LIMITS_GROUPS}`) ?? []; + getValues(`${FieldConstants.LIMITS}.${FieldConstants.OPERATIONAL_LIMITS_GROUPS}`) ?? []; const mergedLimits = [ ...actualLimits.filter( (actualLimit) => - !limitsFromSegments.some((limitsFromSegment) => limitsFromSegment[NAME] === actualLimit[NAME]) + !limitsFromSegments.some( + (limitsFromSegment) => + limitsFromSegment[FieldConstants.NAME] === actualLimit[FieldConstants.NAME] + ) ), ...limitsFromSegments, ]; - setValue(`${LIMITS}.${OPERATIONAL_LIMITS_GROUPS}`, mergedLimits); - setValue(`${LIMITS}.${ENABLE_OLG_MODIFICATION}`, true); + setValue(`${FieldConstants.LIMITS}.${FieldConstants.OPERATIONAL_LIMITS_GROUPS}` as any, mergedLimits); + setValue(`${FieldConstants.LIMITS}.${FieldConstants.ENABLE_OLG_MODIFICATION}` as any, true); } }; - const headerAndTabs = ( - + const fetchBusesOrBusbarSections = useCallback( + (voltageLevelId: string) => + fetchBusesOrBusbarSectionsForVoltageLevel( + studyUuid, + currentNodeUuid, + currentRootNetworkUuid, + voltageLevelId + ), + [studyUuid, currentNodeUuid, currentRootNetworkUuid] ); return ( )} - {selectedId != null && ( // TODO when moving to commons-ui, use generic + {selectedId != null && ( <> - | null; - nodeUuid: UUID; - modificationUuid: string; - lineId: string; - r: AttributeModification | null; - x: AttributeModification | null; - g1: AttributeModification | null; - b1: AttributeModification | null; - g2: AttributeModification | null; - b2: AttributeModification | null; - operationalLimitsGroups: OperationalLimitsGroup[]; - selectedOperationalLimitsGroupId1: AttributeModification | null; - selectedOperationalLimitsGroupId2: AttributeModification | null; - [ENABLE_OLG_MODIFICATION]: boolean; - applySegmentsLimits: boolean; - voltageLevelId1: string; - busOrBusbarSectionId1: string; - voltageLevelId2: string; - busOrBusbarSectionId2: string; - connectionName1: string | null; - connectionName2: string | null; - connectionDirection1: string | null; - connectionDirection2: string | null; - connectionPosition1: string | null; - connectionPosition2: string | null; - connected1: boolean; - connected2: boolean; - properties: Property[] | null; - lineSegments?: LineSegmentInfos[]; - p1MeasurementValue: number | null; - p1MeasurementValidity: boolean | null; - q1MeasurementValue: number | null; - q1MeasurementValidity: boolean | null; - p2MeasurementValue: number | null; - p2MeasurementValidity: boolean | null; - q2MeasurementValue: number | null; - q2MeasurementValidity: boolean | null; -} - export interface LimitsPropertyInfos { name: string; value: string; diff --git a/src/services/study/network-modifications.ts b/src/services/study/network-modifications.ts index 5f27671c9d..1d71dd9379 100644 --- a/src/services/study/network-modifications.ts +++ b/src/services/study/network-modifications.ts @@ -33,6 +33,7 @@ import { BatteryModificationDto, LineCreationDto, OPERATIONAL_LIMITS_GROUPS_MODIFICATION_TYPE, + LineModificationDto, } from '@gridsuite/commons-ui'; import { getBaseNetworkModificationUrl, getStudyUrlWithNodeUuid } from './index'; import { BRANCH_SIDE, OPERATING_STATUS_ACTION } from '../../components/network/constants'; @@ -49,7 +50,6 @@ import { GenerationDispatchModificationInfos, LCCCreationInfo, LccModificationInfos, - LineModificationInfos, LinesAttachToSplitLinesInfo, MoveVoltageLevelFeederBaysInfos, NetworkModificationRequestInfos, @@ -647,48 +647,14 @@ export function createLine({ }); } -export function modifyLine({ - studyUuid, - nodeUuid, - modificationUuid, - lineId, - equipmentName, - r, - x, - g1, - b1, - g2, - b2, - operationalLimitsGroups, - selectedOperationalLimitsGroupId1, - selectedOperationalLimitsGroupId2, - enableOLGModification, - voltageLevelId1, - busOrBusbarSectionId1, - voltageLevelId2, - busOrBusbarSectionId2, - connectionName1, - connectionName2, - connectionDirection1, - connectionDirection2, - connectionPosition1, - connectionPosition2, - connected1, - connected2, - properties, - p1MeasurementValue, - p1MeasurementValidity, - q1MeasurementValue, - q1MeasurementValidity, - p2MeasurementValue, - p2MeasurementValidity, - q2MeasurementValue, - q2MeasurementValidity, - lineSegments, -}: LineModificationInfos) { +export function modifyLine( + studyUuid: UUID, + nodeUuid: UUID, + modificationUuid: UUID | undefined, + dto: LineModificationDto +) { let modifyLineUrl = getNetworkModificationUrl(studyUuid, nodeUuid); - const isUpdate = !!modificationUuid; - if (isUpdate) { + if (modificationUuid) { modifyLineUrl += '/' + encodeURIComponent(modificationUuid); console.info('Updating line modification'); } else { @@ -696,51 +662,12 @@ export function modifyLine({ } return backendFetchText(modifyLineUrl, { - method: isUpdate ? 'PUT' : 'POST', + method: modificationUuid ? 'PUT' : 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, - body: JSON.stringify({ - type: MODIFICATION_TYPES.LINE_MODIFICATION.type, - equipmentId: lineId, - equipmentName: equipmentName, - r: toModificationOperation(r), - x: toModificationOperation(x), - g1: toModificationOperation(g1), - b1: toModificationOperation(b1), - g2: toModificationOperation(g2), - b2: toModificationOperation(b2), - operationalLimitsGroups: operationalLimitsGroups, - selectedOperationalLimitsGroupId1: selectedOperationalLimitsGroupId1, - selectedOperationalLimitsGroupId2: selectedOperationalLimitsGroupId2, - [ENABLE_OLG_MODIFICATION]: enableOLGModification, - [OLGS_MODIFICATION_TYPE]: enableOLGModification - ? OPERATIONAL_LIMITS_GROUPS_MODIFICATION_TYPE.REPLACE - : null, - voltageLevelId1: toModificationOperation(voltageLevelId1), - busOrBusbarSectionId1: toModificationOperation(busOrBusbarSectionId1), - voltageLevelId2: toModificationOperation(voltageLevelId2), - busOrBusbarSectionId2: toModificationOperation(busOrBusbarSectionId2), - connectionName1: toModificationOperation(connectionName1), - connectionName2: toModificationOperation(connectionName2), - connectionDirection1: toModificationOperation(connectionDirection1), - connectionDirection2: toModificationOperation(connectionDirection2), - connectionPosition1: toModificationOperation(connectionPosition1), - connectionPosition2: toModificationOperation(connectionPosition2), - terminal1Connected: toModificationOperation(connected1), - terminal2Connected: toModificationOperation(connected2), - properties, - p1MeasurementValue: toModificationOperation(p1MeasurementValue), - p1MeasurementValidity: toModificationOperation(p1MeasurementValidity), - q1MeasurementValue: toModificationOperation(q1MeasurementValue), - q1MeasurementValidity: toModificationOperation(q1MeasurementValidity), - p2MeasurementValue: toModificationOperation(p2MeasurementValue), - p2MeasurementValidity: toModificationOperation(p2MeasurementValidity), - q2MeasurementValue: toModificationOperation(q2MeasurementValue), - q2MeasurementValidity: toModificationOperation(q2MeasurementValidity), - lineSegments: lineSegments, - }), + body: JSON.stringify(dto), }); } diff --git a/src/translations/en.json b/src/translations/en.json index a86e872752..2a67e4da0e 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -531,7 +531,6 @@ "LoadCreationError": "Error while creating load", "LoadModificationError": "Error while modifying load", - "LineModificationError": "Error while modifying line", "HVDCLineConverterStationError": "Error while getting HVDC line converter stations", "StaticVarCompensatorCreationError": "Error while creating static var compensator", "LccCreationError": "Error while creating HVDC (LCC)", @@ -582,7 +581,6 @@ "reactiveCapabilityCurvePmax": "Pmax", "reactiveCapabilityCurveQminPmax": "QminPmax", "reactiveCapabilityCurveQmaxPmax": "QmaxPmax", - "ModifyLine": "Modify line", "CreateVsc": "Create HVDC (VSC)", "CreateLcc": "Create HVDC (LCC)", "Filters": "Filters", diff --git a/src/translations/fr.json b/src/translations/fr.json index b74b3a0f4b..c0e029146a 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -528,7 +528,6 @@ "LoadCreationError": "Erreur lors de la création d'une consommation", "LoadModificationError": "Erreur lors de la modification d'une consommation", - "LineModificationError": "Erreur lors de la modification d'une ligne", "HVDCLineConverterStationError": "Erreur lors de l'accès aux stations de conversion de la ligne HVDC", "StaticVarCompensatorCreationError": "Erreur lors de la création d'un cspr", "LccCreationError": "Erreur lors de la création d'une HVDC (LCC)", @@ -578,7 +577,6 @@ "reactiveCapabilityCurvePmax": "Pmax", "reactiveCapabilityCurveQminPmax": "QminPmax", "reactiveCapabilityCurveQmaxPmax": "QmaxPmax", - "ModifyLine": "Modifier une ligne", "CreateVsc": "Création d'une HVDC (VSC)", "CreateLcc": "Création d'une HVDC (LCC)", "Filters": "Filtres",