diff --git a/package-lock.json b/package-lock.json index 65bee9245b..8083ea3a45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@gridsuite/commons-ui": "0.180.0", + "@gridsuite/commons-ui": "0.181.0", "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^4.1.3", "@mui/icons-material": "^5.18.0", @@ -3291,9 +3291,9 @@ } }, "node_modules/@gridsuite/commons-ui": { - "version": "0.180.0", - "resolved": "https://registry.npmjs.org/@gridsuite/commons-ui/-/commons-ui-0.180.0.tgz", - "integrity": "sha512-ksQ+DqLwu20AKPItIadC+GxZoMomW/uWmAd3z6/QOmODbGYeRuNaAnXIVc7bsBUE4QwMugSg/7M3j15OuE19ww==", + "version": "0.181.0", + "resolved": "https://registry.npmjs.org/@gridsuite/commons-ui/-/commons-ui-0.181.0.tgz", + "integrity": "sha512-arq+kDf3SseDYBgF3yi27G1ANNH36uqou8HPGGKgAszhWgo0I+Yjog4zMFpKmWpsxnNY3rY/J26tKx56qI1qWQ==", "license": "MPL-2.0", "dependencies": { "@ag-grid-community/locale": "^33.3.2", diff --git a/package.json b/package.json index 9a14da96ec..3833cb7e06 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@gridsuite/commons-ui": "0.180.0", + "@gridsuite/commons-ui": "0.181.0", "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^4.1.3", "@mui/icons-material": "^5.18.0", diff --git a/src/components/dialogs/network-modifications/load/modification/load-modification-dialog.tsx b/src/components/dialogs/network-modifications/load/modification/load-modification-dialog.tsx index f277e67a35..4379c619bb 100644 --- a/src/components/dialogs/network-modifications/load/modification/load-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/load/modification/load-modification-dialog.tsx @@ -8,50 +8,24 @@ import { CustomFormProvider, DeepNullable, - emptyProperties, EquipmentType, FieldConstants, getConcatenatedProperties, - getConnectivityFormData, - getConnectivityWithPositionEmptyFormData, - getConnectivityWithPositionSchema, - getInjectionActiveReactivePowerEditData, - getInjectionActiveReactivePowerEmptyFormData, - getInjectionActiveReactivePowerValidationSchemaProperties, - getPropertiesFromModification, - getSetPointsEmptyFormData, - getSetPointsSchema, LoadForm, LoadFormInfos, - modificationPropertiesSchema, - sanitizeString, + LoadModificationDto, + loadModificationDtoToForm, + loadModificationEmptyFormData, + LoadModificationFormData, + loadModificationFormSchema, + loadModificationFormToDto, snackWithFallback, - toModificationProperties, useSnackMessage, } from '@gridsuite/commons-ui'; import { yupResolver } from '@hookform/resolvers/yup'; import { useOpenShortWaitFetching } from 'components/dialogs/commons/handle-modification-form'; import { FORM_LOADING_DELAY } from 'components/network/constants'; -import { - ACTIVE_POWER_SETPOINT, - BUS_OR_BUSBAR_SECTION, - CONNECTED, - CONNECTION_DIRECTION, - CONNECTION_NAME, - CONNECTION_POSITION, - CONNECTIVITY, - EQUIPMENT_NAME, - ID, - LOAD_TYPE, - MEASUREMENT_P, - MEASUREMENT_Q, - REACTIVE_POWER_SET_POINT, - STATE_ESTIMATION, - VALIDITY, - VOLTAGE_LEVEL, -} from 'components/utils/field-constants'; import { useCallback, useEffect, useState } from 'react'; -import yup from 'components/utils/yup-config'; import { ModificationDialog } from '../../../commons/modificationDialog'; import { EquipmentIdSelector } from '../../../equipment-id/equipment-id-selector'; import { EQUIPMENT_INFOS_TYPES } from 'components/utils/equipment-types'; @@ -63,38 +37,19 @@ import { } from '../../../../../services/study/network'; import { isNodeBuilt } from '../../../../graph/util/model-functions'; import { EquipmentModificationDialogProps } from 'components/graph/menus/network-modifications/network-modification-menu.type'; -import { LoadModificationInfos, LoadModificationSchemaForm } from './load-modification.type'; 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'; -const emptyFormData = { - [EQUIPMENT_NAME]: '', - [LOAD_TYPE]: null, - ...getSetPointsEmptyFormData(true), - ...getConnectivityWithPositionEmptyFormData(true), - ...getInjectionActiveReactivePowerEmptyFormData(STATE_ESTIMATION), - ...emptyProperties, -}; - -const formSchema: yup.ObjectSchema> = yup - .object() - .shape({ - [EQUIPMENT_NAME]: yup.string().nullable(), - [LOAD_TYPE]: yup.string().nullable(), - [CONNECTIVITY]: getConnectivityWithPositionSchema(true), - [STATE_ESTIMATION]: getInjectionActiveReactivePowerValidationSchemaProperties(), - ...getSetPointsSchema(true), - }) - .concat(modificationPropertiesSchema) - .required(); +interface LoadModificationDtoWithId extends LoadModificationDto, WithModificationId {} export type LoadModificationDialogProps = EquipmentModificationDialogProps & { - editData?: LoadModificationInfos; + editData?: LoadModificationDtoWithId; }; export default function LoadModificationDialog({ - editData, // contains data when we try to edit an existing hypothesis from the current node's list + editData, defaultIdValue, // Used to pre-select an equipmentId when calling this dialog from the SLD currentNode, currentRootNetworkUuid, @@ -110,9 +65,9 @@ export default function LoadModificationDialog({ const [dataFetchStatus, setDataFetchStatus] = useState(FetchStatus.IDLE); const voltageLevelOptions = useVoltageLevelsListInfos(studyUuid, currentNode?.id, currentRootNetworkUuid); - const formMethods = useFormWithDirtyTracking>({ - defaultValues: emptyFormData, - resolver: yupResolver>(formSchema), + const formMethods = useFormWithDirtyTracking>({ + defaultValues: loadModificationEmptyFormData, + resolver: yupResolver>(loadModificationFormSchema), }); const { reset, getValues } = formMethods; @@ -128,43 +83,20 @@ export default function LoadModificationDialog({ [studyUuid, currentNodeUuid, currentRootNetworkUuid] ); - const fromEditDataToFormValues = useCallback( - (load: LoadModificationInfos) => { - if (load?.equipmentId) { - setSelectedId(load.equipmentId); - } - reset({ - [EQUIPMENT_NAME]: load.equipmentName?.value ?? '', - [LOAD_TYPE]: load.loadType?.value ?? null, - [ACTIVE_POWER_SETPOINT]: load.p0?.value ?? null, - [REACTIVE_POWER_SET_POINT]: load.q0?.value ?? null, - ...getConnectivityFormData({ - voltageLevelId: load?.voltageLevelId?.value ?? null, - busbarSectionId: load?.busOrBusbarSectionId?.value ?? null, - connectionName: load?.connectionName?.value ?? '', - connectionDirection: load?.connectionDirection?.value ?? null, - connectionPosition: load?.connectionPosition?.value ?? null, - terminalConnected: load?.terminalConnected?.value ?? null, - isEquipmentModification: true, - }), - ...getInjectionActiveReactivePowerEditData(STATE_ESTIMATION, load), - ...(getPropertiesFromModification(load.properties) ?? undefined), - }); - }, - [reset] - ); - useEffect(() => { if (editData) { - fromEditDataToFormValues(editData); + if (editData?.equipmentId) { + setSelectedId(editData.equipmentId); + } + reset(loadModificationDtoToForm(editData)); } - }, [fromEditDataToFormValues, editData]); + }, [reset, editData]); const onEquipmentIdChange = useCallback( (equipmentId: string) => { if (!equipmentId) { setLoadToModify(null); - reset(emptyFormData, { keepDefaultValues: true }); + reset(loadModificationEmptyFormData, { keepDefaultValues: true }); } else { setDataFetchStatus(FetchStatus.RUNNING); fetchNetworkElementInfos( @@ -182,6 +114,7 @@ export default function LoadModificationDialog({ reset( (formValues) => ({ ...formValues, + [FieldConstants.EQUIPMENT_ID]: equipmentId, [FieldConstants.ADDITIONAL_PROPERTIES]: getConcatenatedProperties(load, getValues), }), { keepDirty: true } @@ -191,6 +124,10 @@ export default function LoadModificationDialog({ }) .catch(() => { setDataFetchStatus(FetchStatus.FAILED); + reset( + { ...loadModificationEmptyFormData, [FieldConstants.EQUIPMENT_ID]: equipmentId }, + { keepDirty: true } + ); if (editData?.equipmentId !== equipmentId) { setLoadToModify(null); } @@ -207,33 +144,13 @@ export default function LoadModificationDialog({ }, [selectedId, onEquipmentIdChange]); const onSubmit = useCallback( - (load: LoadModificationSchemaForm) => { - const stateEstimationData = load[STATE_ESTIMATION]; - modifyLoad({ - studyUuid: studyUuid, - nodeUuid: currentNodeUuid, - modificationUuid: editData?.uuid, - id: selectedId, - name: sanitizeString(load?.equipmentName), - loadType: load?.loadType, - p0: load?.activePowerSetpoint, - q0: load?.reactivePowerSetpoint, - voltageLevelId: load[CONNECTIVITY]?.[VOLTAGE_LEVEL]?.[ID], - busOrBusbarSectionId: load[CONNECTIVITY]?.[BUS_OR_BUSBAR_SECTION]?.[ID], - connectionName: sanitizeString(load[CONNECTIVITY]?.[CONNECTION_NAME]), - connectionDirection: load[CONNECTIVITY]?.[CONNECTION_DIRECTION], - connectionPosition: load[CONNECTIVITY]?.[CONNECTION_POSITION], - terminalConnected: load[CONNECTIVITY]?.[CONNECTED], - pMeasurementValue: stateEstimationData?.[MEASUREMENT_P]?.[FieldConstants.VALUE], - pMeasurementValidity: stateEstimationData?.[MEASUREMENT_P]?.[VALIDITY], - qMeasurementValue: stateEstimationData?.[MEASUREMENT_Q]?.[FieldConstants.VALUE], - qMeasurementValidity: stateEstimationData?.[MEASUREMENT_Q]?.[VALIDITY], - properties: toModificationProperties(load) ?? null, - }).catch((error: Error) => { + (loadForm: LoadModificationFormData) => { + const dto = loadModificationFormToDto(loadForm); + modifyLoad(studyUuid, currentNodeUuid, editData?.uuid, dto).catch((error: Error) => { snackWithFallback(snackError, error, { headerId: 'LoadModificationError' }); }); }, - [selectedId, editData, studyUuid, currentNodeUuid, snackError] + [currentNodeUuid, editData?.uuid, snackError, studyUuid] ); const open = useOpenShortWaitFetching({ @@ -245,12 +162,12 @@ export default function LoadModificationDialog({ }); const clear = useCallback(() => { - reset(emptyFormData); + reset(loadModificationEmptyFormData); }, [reset]); return ( ; - loadType: AttributeModification; - p0: AttributeModification; - q0: AttributeModification; - voltageLevelId: AttributeModification; - busOrBusbarSectionId: AttributeModification; - connectionDirection: AttributeModification; - connectionName?: AttributeModification; - connectionPosition?: AttributeModification; - terminalConnected?: AttributeModification; - properties?: Property[]; -} diff --git a/src/services/network-modification-types.ts b/src/services/network-modification-types.ts index 77c7ef5ce2..9af4472fe2 100644 --- a/src/services/network-modification-types.ts +++ b/src/services/network-modification-types.ts @@ -79,29 +79,6 @@ export interface BatteryModificationInfos { stepUpTransformerX: AttributeModification | null; } -export interface LoadModificationInfo { - studyUuid: string; - nodeUuid: UUID; - modificationUuid?: string; - id: string | null; - name?: string | null; - loadType?: string | null; - voltageLevelId?: string; - busOrBusbarSectionId?: string; - connectionName?: string | null; - connectionDirection?: string | null; - connectionPosition?: number | null; - terminalConnected?: boolean | null; - p0?: number | null; - q0?: number | null; - pMeasurementValue?: number; - pMeasurementValidity?: boolean; - qMeasurementValue?: number; - qMeasurementValidity?: boolean; - isUpdate?: boolean; - properties: Property[] | null; -} - export interface ShuntCompensatorModificationInfos { type: string; uuid: string | null; diff --git a/src/services/study/network-modifications.ts b/src/services/study/network-modifications.ts index e466bf6e8f..c4aca43476 100644 --- a/src/services/study/network-modifications.ts +++ b/src/services/study/network-modifications.ts @@ -12,6 +12,7 @@ import { EquipmentInfos, EquipmentType, LoadCreationDto, + LoadModificationDto, MODIFICATION_TYPES, ModificationType, safeEncodeURIComponent, @@ -44,7 +45,6 @@ import { LineCreationInfos, LineModificationInfos, LinesAttachToSplitLinesInfo, - LoadModificationInfo, MoveVoltageLevelFeederBaysInfos, NetworkModificationRequestInfos, ShuntCompensatorCreationInfos, @@ -416,31 +416,14 @@ export function createLoad(studyUuid: UUID, nodeUuid: UUID, modificationUuid: UU }); } -export function modifyLoad({ - studyUuid, - nodeUuid, - modificationUuid = undefined, - id, - name, - loadType, - p0, - q0, - voltageLevelId = undefined, - busOrBusbarSectionId = undefined, - connectionName = undefined, - connectionDirection = undefined, - connectionPosition = undefined, - terminalConnected = undefined, - pMeasurementValue, - pMeasurementValidity, - qMeasurementValue, - qMeasurementValidity, - properties, -}: LoadModificationInfo) { +export function modifyLoad( + studyUuid: UUID, + nodeUuid: UUID, + modificationUuid: UUID | undefined, + dto: LoadModificationDto +) { let modifyLoadUrl = getNetworkModificationUrl(studyUuid, nodeUuid); - - const isUpdate = !!modificationUuid; - if (isUpdate) { + if (modificationUuid) { modifyLoadUrl += '/' + encodeURIComponent(modificationUuid); console.info('Updating load modification'); } else { @@ -448,30 +431,12 @@ export function modifyLoad({ } return backendFetchText(modifyLoadUrl, { - method: isUpdate ? 'PUT' : 'POST', + method: modificationUuid ? 'PUT' : 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, - body: JSON.stringify({ - type: MODIFICATION_TYPES.LOAD_MODIFICATION.type, - equipmentId: id, - equipmentName: toModificationOperation(name), - loadType: toModificationOperation(loadType), - connectionName: toModificationOperation(connectionName), - connectionDirection: toModificationOperation(connectionDirection), - connectionPosition: toModificationOperation(connectionPosition), - terminalConnected: toModificationOperation(terminalConnected), - p0: toModificationOperation(p0), - q0: toModificationOperation(q0), - voltageLevelId: toModificationOperation(voltageLevelId), - busOrBusbarSectionId: toModificationOperation(busOrBusbarSectionId), - pMeasurementValue: toModificationOperation(pMeasurementValue), - pMeasurementValidity: toModificationOperation(pMeasurementValidity), - qMeasurementValue: toModificationOperation(qMeasurementValue), - qMeasurementValidity: toModificationOperation(qMeasurementValidity), - properties, - }), + body: JSON.stringify(dto), }); } diff --git a/src/translations/en.json b/src/translations/en.json index b4ea32c5f8..969be33741 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -576,7 +576,6 @@ "NodeBuildingError": "An error occurred while building node", "NodeUnbuildingError": "An error occurred while unbuilding node", "NetworkModifications": "Network modifications", - "ModifyLoad": "Modify load", "NameOptional": "Name (optional)", "TypeOptional": "Type (optional)", "UndefinedDefaultValue": "Undefined (default value)", @@ -802,10 +801,6 @@ "TemporaryLimitValue": "Value (A)", "TemporaryLimitNameUnicityError": "Temporary limit names must be unique in the table", "TemporaryLimitDurationUnicityError": "Temporary limit acceptable durations must be unique in the table", - "StateEstimationTab": "State estimation", - "MeasurementsSection": "Measurements", - "ValidMeasurement": "Valid", - "InvalidMeasurement": "Invalid", "EstimateTapPositionSection": "Estimate tap position", "RatioTapChangerEstimateTapPosition": "Ratio tap changer", "PhaseTapChangerEstimateTapPosition": "Phase tap changer", diff --git a/src/translations/fr.json b/src/translations/fr.json index 1783bb2da4..eb39fc506c 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -575,7 +575,6 @@ "NodeBuildingError": "Une erreur est survenue lors de la réalisation du nœud", "NodeUnbuildingError": "Une erreur est survenue lors de la déréalisation du nœud", "NetworkModifications": "Modifications de réseau", - "ModifyLoad": "Modifier une consommation", "NameOptional": "Nom (optionnel)", "TypeOptional": "Type (optionnel)", "UndefinedDefaultValue": "Non défini (valeur par défaut)", @@ -798,10 +797,6 @@ "TemporaryLimitValue": "Valeur (A)", "TemporaryLimitNameUnicityError": "Les noms des limites temporaires doivent être uniques dans la table", "TemporaryLimitDurationUnicityError": "Les tempos des limites temporaires doivent être uniques dans la table", - "StateEstimationTab": "Estimation d'état", - "MeasurementsSection": "Télémesures", - "ValidMeasurement": "Valide", - "InvalidMeasurement": "Invalide", "EstimateTapPositionSection": "Estimer prise", "RatioTapChangerEstimateTapPosition": "Régleur", "PhaseTapChangerEstimateTapPosition": "Déphaseur",