Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
b2f71dd
Typescript migration of line creation
FranckLecuyer Jan 9, 2026
c25d559
Merge branch 'main' into migrate_line_creation_to_typescript
FranckLecuyer Jan 9, 2026
6d0f8c8
Add type for connectivity in getCharacteristicsFormData function
FranckLecuyer Jan 9, 2026
ec232c9
Add interface for LineCharacteristicsPane
FranckLecuyer Jan 12, 2026
39fd068
Merge branch 'main' into migrate_line_creation_to_typescript
FranckLecuyer Jan 12, 2026
1dc9a8e
Fix pb with temporary limits not properly displayed
FranckLecuyer Jan 13, 2026
3b25af7
Merge branch 'main' into migrate_line_creation_to_typescript
FranckLecuyer Jan 13, 2026
2355de8
Add interface for onSubmit parameter
FranckLecuyer Jan 13, 2026
8ded4e0
Remove some casts to any
FranckLecuyer Jan 13, 2026
fc4bf14
Fix sonar issue on duplicated lines
FranckLecuyer Jan 13, 2026
59011ef
Merge branch 'main' into migrate_line_creation_to_typescript
FranckLecuyer Jan 13, 2026
24acef2
Merge branch 'main' into migrate_line_creation_to_typescript
FranckLecuyer Jan 14, 2026
5b3554c
Merge branch 'main' into migrate_line_creation_to_typescript
thangqp Jan 15, 2026
4041ba2
Merge branch 'main' into migrate_line_creation_to_typescript
FranckLecuyer Jan 19, 2026
afa9f9f
Merge branch 'main' into migrate_line_creation_to_typescript
FranckLecuyer Jan 19, 2026
71967d7
Move interfaces in separate file
FranckLecuyer Jan 19, 2026
f8c2ddc
Merge branch 'main' into migrate_line_creation_to_typescript
FranckLecuyer Jan 19, 2026
9e943fd
Merge branch 'main' into migrate_line_creation_to_typescript
thangqp Jan 19, 2026
42a9ddb
TS Migration Line Creation (Thang)
thangqp Jan 19, 2026
2c7d30b
merge
thangqp Jan 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
27 changes: 14 additions & 13 deletions src/components/dialogs/connectivity/connectivity-form-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ export const getConnectivityData = (
};
};

export const getConnectivityFormData = (
export const getConnectivityFormData = <T extends string = typeof CONNECTIVITY>(
{
voltageLevelId,
busbarSectionId,
Expand All @@ -194,20 +194,21 @@ export const getConnectivityFormData = (
terminalConnected?: boolean | null;
isEquipmentModification?: boolean;
},
id = CONNECTIVITY
id: T = CONNECTIVITY as T
) => {
return {
[id]: {
...getConnectivityPropertiesData({
voltageLevelId,
busbarSectionId,
}),
[CONNECTION_DIRECTION]: connectionDirection ?? null,
[CONNECTION_NAME]: connectionName ?? '',
[CONNECTION_POSITION]: connectionPosition ?? null,
[CONNECTED]: terminalConnected ?? (isEquipmentModification ? null : true),
},
const connectivityData = {
...getConnectivityPropertiesData({
voltageLevelId,
busbarSectionId,
}),
[CONNECTION_DIRECTION]: connectionDirection ?? null,
[CONNECTION_NAME]: connectionName ?? '',
[CONNECTION_POSITION]: connectionPosition ?? null,
[CONNECTED]: terminalConnected ?? (isEquipmentModification ? null : true),
};
return {
[id]: connectivityData,
} as Record<T, typeof connectivityData>;
};

export const createConnectivityData = (equipmentToModify: any, index: number) => ({
Expand Down
35 changes: 21 additions & 14 deletions src/components/dialogs/limits/limits-pane-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,17 +133,21 @@ function hasDuplicateOperationalLimitsGroups(context: TestContext) {
return !isDuplicate;
}

const limitsValidationSchemaCreation = (id: string) => {
const completeLimitsGroupSchema = {
const limitsValidationSchemaCreation = <T extends string>(id: T) => {
const completeLimitsGroupSchemaShape = {
[OPERATIONAL_LIMITS_GROUPS]: yup.array(yup.object().shape(limitsGroupValidationSchema())).required(),
[SELECTED_OPERATIONAL_LIMITS_GROUP_ID1]: yup.string().nullable(),
[SELECTED_OPERATIONAL_LIMITS_GROUP_ID2]: yup.string().nullable(),
[ENABLE_OLG_MODIFICATION]: yup.boolean(),
};
return { [id]: yup.object().shape(completeLimitsGroupSchema) };
const completeLimitsGroupsSchema = yup.object().shape(completeLimitsGroupSchemaShape);
return { [id]: completeLimitsGroupsSchema } as Record<
T,
yup.ObjectSchema<yup.InferType<typeof completeLimitsGroupsSchema>>
>;
};

export const getLimitsValidationSchema = (id: string = LIMITS) => {
export const getLimitsValidationSchema = <T extends string = typeof LIMITS>(id: T = LIMITS as T) => {
return limitsValidationSchemaCreation(id);
};

Expand Down Expand Up @@ -190,21 +194,22 @@ export const formatOpLimitGroupsToFormInfos = (
});
};

export const getAllLimitsFormData = (
export const getAllLimitsFormData = <T extends string = typeof LIMITS>(
operationalLimitsGroups: OperationalLimitsGroupFormSchema[] = [],
selectedOperationalLimitsGroupId1: string | null = null,
selectedOperationalLimitsGroupId2: string | null = null,
enableOLGModification: boolean | null = true,
id = LIMITS
id: T = LIMITS as T
) => {
return {
[id]: {
[OPERATIONAL_LIMITS_GROUPS]: operationalLimitsGroups,
[SELECTED_OPERATIONAL_LIMITS_GROUP_ID1]: selectedOperationalLimitsGroupId1,
[SELECTED_OPERATIONAL_LIMITS_GROUP_ID2]: selectedOperationalLimitsGroupId2,
[ENABLE_OLG_MODIFICATION]: !!enableOLGModification,
},
const allLimitsFormData = {
[OPERATIONAL_LIMITS_GROUPS]: operationalLimitsGroups,
[SELECTED_OPERATIONAL_LIMITS_GROUP_ID1]: selectedOperationalLimitsGroupId1,
[SELECTED_OPERATIONAL_LIMITS_GROUP_ID2]: selectedOperationalLimitsGroupId2,
[ENABLE_OLG_MODIFICATION]: !!enableOLGModification,
};
return {
[id]: allLimitsFormData,
} as Record<T, typeof allLimitsFormData>;
};

/**
Expand Down Expand Up @@ -236,7 +241,9 @@ export const sanitizeLimitsGroups = (
},
}));

export const sanitizeLimitNames = (temporaryLimitList: TemporaryLimitFormSchema[]): TemporaryLimitFormSchema[] =>
export const sanitizeLimitNames = (
temporaryLimitList: TemporaryLimitFormSchema[] | undefined
): TemporaryLimitFormSchema[] =>
temporaryLimitList
?.filter((limit: TemporaryLimitFormSchema) => limit?.name?.trim())
.map(({ name, ...temporaryLimit }) => ({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export interface OperationalLimitsGroupFormSchema {

export interface CurrentLimitsFormSchema {
[PERMANENT_LIMIT]: number | null;
[TEMPORARY_LIMITS]: TemporaryLimitFormSchema[];
[TEMPORARY_LIMITS]?: TemporaryLimitFormSchema[];
}

interface LimitsPropertyFormSchema {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ export type ComputedLineCharacteristics = {
totalResistance: number;
totalReactance: number;
totalSusceptance: number;
finalCurrentLimits: CurrentLimitsInfo[];
};

export type CurrentLimitsInfo = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,22 +208,22 @@ const LineAttachToVoltageLevelDialog = ({
}, [reset]);

const onLineCreationDo = useCallback(
(lineCreationInfo) => {
({ lineCreationInfos }) => {
return new Promise(() => {
const preparedLine = {
type: MODIFICATION_TYPES.LINE_CREATION.type,
equipmentId: lineCreationInfo.equipmentId,
equipmentName: lineCreationInfo.equipmentName,
r: lineCreationInfo.r,
x: lineCreationInfo.x,
g1: lineCreationInfo.g1,
b1: lineCreationInfo.b1,
g2: lineCreationInfo.g2,
b2: lineCreationInfo.b2,
operationalLimitsGroups: lineCreationInfo.operationalLimitsGroups,
selectedOperationalLimitsGroupId1: lineCreationInfo.selectedOperationalLimitsGroupId1,
selectedOperationalLimitsGroupId2: lineCreationInfo.selectedOperationalLimitsGroupId2,
properties: lineCreationInfo.properties,
equipmentId: lineCreationInfos.equipmentId,
equipmentName: lineCreationInfos.equipmentName,
r: lineCreationInfos.r,
x: lineCreationInfos.x,
g1: lineCreationInfos.g1,
b1: lineCreationInfos.b1,
g2: lineCreationInfos.g2,
b2: lineCreationInfos.b2,
operationalLimitsGroups: lineCreationInfos.operationalLimitsGroups,
selectedOperationalLimitsGroupId1: lineCreationInfos.selectedOperationalLimitsGroupId1,
selectedOperationalLimitsGroupId2: lineCreationInfos.selectedOperationalLimitsGroupId2,
properties: lineCreationInfos.properties,
};
setAttachmentLine(preparedLine);
setValue(`${ATTACHMENT_LINE_ID}`, preparedLine.equipmentId, {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,31 @@
*/

import {
B1,
B2,
CHARACTERISTICS,
CONNECTIVITY_1,
CONNECTIVITY_2,
R,
G1,
G2,
B1,
B2,
R,
X,
} from 'components/utils/field-constants';
import yup from 'components/utils/yup-config';
import {
getConnectivityWithPositionEmptyFormData,
getConnectivityWithPositionValidationSchema,
} from '../../../connectivity/connectivity-form-utils';
import { LineCharacteristics } from '../modification/line-modification-type';
import { Connectivity } from 'components/dialogs/connectivity/connectivity.type';
import { DeepNullable } from '../../../../utils/ts-utils';

const characteristicsValidationSchema = (id, displayConnectivity, modification) => ({
[id]: yup.object().shape({
const characteristicsValidationSchema = <T extends string>(
id: T,
displayConnectivity: boolean,
modification: boolean
) => {
const characteristicsSchema = yup.object().shape({
[R]: modification
? yup.number().nullable().min(0, 'mustBeGreaterOrEqualToZero')
: yup.number().nullable().min(0, 'mustBeGreaterOrEqualToZero').required(),
Expand All @@ -34,14 +41,21 @@ const characteristicsValidationSchema = (id, displayConnectivity, modification)
[G2]: yup.number().nullable().min(0, 'mustBeGreaterOrEqualToZero'),
...(displayConnectivity && getConnectivityWithPositionValidationSchema(false, CONNECTIVITY_1)),
...(displayConnectivity && getConnectivityWithPositionValidationSchema(false, CONNECTIVITY_2)),
}),
});
});
return {
[id]: characteristicsSchema,
} as Record<T, yup.ObjectSchema<yup.InferType<typeof characteristicsSchema>>>;
};

export const getCharacteristicsValidationSchema = (id, displayConnectivity, modification = false) => {
export const getCharacteristicsValidationSchema = <T extends string>(
id: T,
displayConnectivity: boolean,
modification: boolean = false
) => {
return characteristicsValidationSchema(id, displayConnectivity, modification);
};

const characteristicsEmptyFormData = (id, displayConnectivity = true) => ({
const characteristicsEmptyFormData = (id: string, displayConnectivity: boolean = true) => ({
[id]: {
[R]: null,
[X]: null,
Expand All @@ -54,15 +68,33 @@ const characteristicsEmptyFormData = (id, displayConnectivity = true) => ({
},
});

export const getCharacteristicsEmptyFormData = (id = CHARACTERISTICS, displayConnectivity = true) => {
export const getCharacteristicsEmptyFormData = (id: string = CHARACTERISTICS, displayConnectivity: boolean = true) => {
return characteristicsEmptyFormData(id, displayConnectivity);
};

export const getCharacteristicsFormData = (
{ r = null, x = null, g1 = null, b1 = null, g2 = null, b2 = null, connectivity1 = null, connectivity2 = null },
id = CHARACTERISTICS
) => ({
[id]: {
export const getCharacteristicsFormData = <T extends string = typeof CHARACTERISTICS>(
{
r,
x,
g1 = null,
b1 = null,
g2 = null,
b2 = null,
connectivity1 = null,
connectivity2 = null,
}: {
r: number;
x: number;
g1: number | null;
b1: number | null;
g2: number | null;
b2: number | null;
connectivity1: DeepNullable<Connectivity> | null;
connectivity2: DeepNullable<Connectivity> | null;
},
id: T = CHARACTERISTICS as T
) => {
const characteristicsFormData = {
[R]: r,
[X]: x,
[G1]: g1,
Expand All @@ -71,10 +103,16 @@ export const getCharacteristicsFormData = (
[B2]: b2,
[CONNECTIVITY_1]: connectivity1,
[CONNECTIVITY_2]: connectivity2,
},
});
};
return {
[id]: characteristicsFormData,
} as Record<T, typeof characteristicsFormData>;
};

export const getCharacteristicsWithOutConnectivityFormData = ({ r, x, g1, b1, g2, b2 }, id = CHARACTERISTICS) => ({
export const getCharacteristicsWithOutConnectivityFormData = (
{ r, x, g1, b1, g2, b2 }: LineCharacteristics,
id = CHARACTERISTICS
) => ({
[id]: {
[R]: r,
[X]: x,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import PropertiesForm from '../../common/properties/properties-form';
import useVoltageLevelsListInfos from '../../../../../hooks/use-voltage-levels-list-infos';
import GridSection from '../../../commons/grid-section';
import GridItem from '../../../commons/grid-item';
import { UUID } from 'node:crypto';
import { CurrentTreeNode } from '../../../../graph/tree-node.type';

const styles = {
h3: {
Expand All @@ -32,6 +34,16 @@ const styles = {
},
};

interface LineCharacteristicsPaneProps {
id?: string;
studyUuid: UUID;
currentNode: CurrentTreeNode;
currentRootNetworkUuid: UUID;
displayConnectivity: boolean;
lineToModify?: any;
clearableFields?: boolean;
isModification?: boolean;
}
const LineCharacteristicsPane = ({
id = CHARACTERISTICS,
studyUuid,
Expand All @@ -41,7 +53,7 @@ const LineCharacteristicsPane = ({
lineToModify,
clearableFields = false,
isModification = false,
}) => {
}: LineCharacteristicsPaneProps) => {
const currentNodeUuid = currentNode.id;
const voltageLevelOptions = useVoltageLevelsListInfos(studyUuid, currentNodeUuid, currentRootNetworkUuid);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,22 @@

import { EQUIPMENT_ID, EQUIPMENT_NAME, TAB_HEADER } from 'components/utils/field-constants';
import yup from 'components/utils/yup-config';
import { ObjectSchema } from 'yup';

const headerValidationSchema = (id) => ({
[id]: yup.object().shape({
const headerValidationSchema = <T extends string>(id: T) => {
const headerSchema = yup.object().shape({
[EQUIPMENT_ID]: yup.string().required(),
[EQUIPMENT_NAME]: yup.string().nullable(),
}),
});

export const getHeaderValidationSchema = (id = TAB_HEADER) => {
});
return {
[id]: headerSchema,
} as Record<T, ObjectSchema<yup.InferType<typeof headerSchema>>>;
};
export const getHeaderValidationSchema = <T extends string = typeof TAB_HEADER>(id: T = TAB_HEADER as T) => {
return headerValidationSchema(id);
};

const headerEmptyFormData = (id) => ({
const headerEmptyFormData = (id: string) => ({
[id]: {
[EQUIPMENT_ID]: '',
[EQUIPMENT_NAME]: '',
Expand All @@ -30,12 +33,18 @@ export const getHeaderEmptyFormData = (id = TAB_HEADER) => {
return headerEmptyFormData(id);
};

export const getHeaderFormData = ({ equipmentId, equipmentName = '' }, id = TAB_HEADER) => ({
[id]: {
export const getHeaderFormData = <T extends string = typeof TAB_HEADER>(
{ equipmentId, equipmentName = '' }: { equipmentId: string; equipmentName: string | null },
id: T = TAB_HEADER as T
) => {
const headerFormData = {
[EQUIPMENT_ID]: equipmentId,
[EQUIPMENT_NAME]: equipmentName,
},
});
};
return {
[id]: headerFormData,
} as Record<T, typeof headerFormData>;
};

export const LineCreationDialogTab = {
CHARACTERISTICS_TAB: 0,
Expand Down
Loading
Loading