Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
1bc1c7d
wip creation dialog ok, clean not done
dbraquart Mar 4, 2026
11cc046
linter + tests ok (clean pas complet)
dbraquart Mar 4, 2026
b5f107a
rm study uuids from PositionDiagemPane props
dbraquart Mar 4, 2026
ea9fb2d
Merge remote-tracking branch 'origin/main' into dbraquart/use-load-mo…
dbraquart Mar 4, 2026
ed6d12b
sounds good
dbraquart Mar 4, 2026
ea54a4f
clean: use CheckboxNullableInput from comm
dbraquart Mar 4, 2026
a6bf5ec
clean: use connectivity from comm
dbraquart Mar 4, 2026
c52f312
clean: use connectivity from comm
dbraquart Mar 4, 2026
ad52bf9
Merge remote-tracking branch 'origin/dbraquart/use-load-modification-…
dbraquart Mar 5, 2026
8bbdbb8
clean: use measurement from comm
dbraquart Mar 5, 2026
53191e0
clean: use set-point from comm
dbraquart Mar 5, 2026
e466c67
clean: use areIdsEqual and getObjectId from comm
dbraquart Mar 5, 2026
b40fc87
clean: use loadType and connectionDirection from comm
dbraquart Mar 5, 2026
b2d1866
clean: use some translations from comm
dbraquart Mar 5, 2026
c507340
wip
dbraquart Mar 6, 2026
d9b4732
use FormToDto in submit
dbraquart Mar 6, 2026
ed15346
Merge remote-tracking branch 'origin/main' into dbraquart/use-load-mo…
dbraquart Mar 9, 2026
e79c966
update with last DTO (uuid not incl anymore)
dbraquart Mar 9, 2026
b4553c3
Merge branch 'dbraquart/use-load-modification-forms-from-commons-ui' …
dbraquart Mar 9, 2026
21126ad
update with last DTO (uuid not incl anymore)
dbraquart Mar 9, 2026
14fe534
fix onEquipmentIdChange
dbraquart Mar 9, 2026
73f1e7e
Merge remote-tracking branch 'origin/main' into dbraquart/use-load-mo…
dbraquart Mar 11, 2026
6004747
Merge branch 'main' into dbraquart/use-load-modification-forms-from-c…
dbraquart Mar 11, 2026
b84db20
Merge branch 'dbraquart/use-load-modification-forms-from-commons-ui' …
dbraquart Mar 11, 2026
3c25ac4
fix for empty equipmentId
dbraquart Mar 11, 2026
3f1136e
Merge remote-tracking branch 'origin/main' into dbraquart/use-load-mo…
dbraquart Mar 16, 2026
fb4d30d
Merge branch 'main' into dbraquart/use-load-modification-forms-from-c…
dbraquart Mar 18, 2026
b141aea
Merge remote-tracking branch 'origin/main' into dbraquart/use-load-mo…
dbraquart Mar 18, 2026
55d498f
Merge branch 'dbraquart/use-load-modification-forms-from-commons-ui' …
dbraquart Mar 18, 2026
d70582a
Merge remote-tracking branch 'origin/main' into dbraquart/use-load-mo…
dbraquart Mar 19, 2026
fa6d861
clean unused type
dbraquart Mar 19, 2026
a528c33
upgrade to last commonsUI 0.181.0
dbraquart Mar 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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<DeepNullable<LoadModificationSchemaForm>> = 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,
Expand All @@ -110,9 +65,9 @@ export default function LoadModificationDialog({
const [dataFetchStatus, setDataFetchStatus] = useState<string>(FetchStatus.IDLE);
const voltageLevelOptions = useVoltageLevelsListInfos(studyUuid, currentNode?.id, currentRootNetworkUuid);

const formMethods = useFormWithDirtyTracking<DeepNullable<LoadModificationSchemaForm>>({
defaultValues: emptyFormData,
resolver: yupResolver<DeepNullable<LoadModificationSchemaForm>>(formSchema),
const formMethods = useFormWithDirtyTracking<DeepNullable<LoadModificationFormData>>({
defaultValues: loadModificationEmptyFormData,
resolver: yupResolver<DeepNullable<LoadModificationFormData>>(loadModificationFormSchema),
});

const { reset, getValues } = formMethods;
Expand All @@ -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(
Expand All @@ -182,6 +114,7 @@ export default function LoadModificationDialog({
reset(
(formValues) => ({
...formValues,
[FieldConstants.EQUIPMENT_ID]: equipmentId,
[FieldConstants.ADDITIONAL_PROPERTIES]: getConcatenatedProperties(load, getValues),
}),
{ keepDirty: true }
Expand All @@ -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);
}
Expand All @@ -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({
Expand All @@ -245,12 +162,12 @@ export default function LoadModificationDialog({
});

const clear = useCallback(() => {
reset(emptyFormData);
reset(loadModificationEmptyFormData);
}, [reset]);

return (
<CustomFormProvider
validationSchema={formSchema}
validationSchema={loadModificationFormSchema}
removeOptional={true}
{...formMethods}
isNodeBuilt={isNodeBuilt(currentNode)}
Expand Down Expand Up @@ -280,7 +197,6 @@ export default function LoadModificationDialog({
{selectedId != null && (
<LoadForm
loadToModify={loadToModify}
equipmentId={selectedId}
isModification={true}
voltageLevelOptions={voltageLevelOptions}
PositionDiagramPane={PositionDiagramPane}
Expand Down

This file was deleted.

23 changes: 0 additions & 23 deletions src/services/network-modification-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,29 +79,6 @@ export interface BatteryModificationInfos {
stepUpTransformerX: AttributeModification<number> | 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;
Expand Down
Loading
Loading