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",