Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ import ListItemIcon from '@mui/material/ListItemIcon';
import { ContentCopy, Delete, Edit } from '@mui/icons-material';
import ListItemText from '@mui/material/ListItemText';
import { useIntl } from 'react-intl';
import { OperationalLimitsGroup } from '../../../services/network-modification-types';
import { PopoverProps } from '@mui/material/Popover';
import { APPLICABILITY } from '../../network/constants';
import { OperationalLimitsGroupFormInfos } from '../network-modifications/line/modification/line-modification-type';

export interface LimitsGroupsContextualMenuProps {
parentFormName: string;
Expand Down Expand Up @@ -81,11 +81,11 @@ export function LimitsGroupsContextualMenu({
const handleDuplicateTab = () => {
let newName: string = '';
if (indexSelectedLimitSet !== null) {
const duplicatedLimits1: OperationalLimitsGroup = getValues(
const duplicatedLimits1: OperationalLimitsGroupFormInfos = getValues(
`${operationalLimitsGroupsFormName}[${indexSelectedLimitSet}]`
);
newName = duplicatedLimits1.name + '_COPY';
const newLimitsGroup1: OperationalLimitsGroup = {
const newLimitsGroup1: OperationalLimitsGroupFormInfos = {
...duplicatedLimits1,
[ID]: newName,
};
Expand Down
233 changes: 79 additions & 154 deletions src/components/dialogs/limits/limits-pane-utils.ts

Large diffs are not rendered by default.

12 changes: 7 additions & 5 deletions src/components/dialogs/limits/limits-pane.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { LimitsSidePane } from './limits-side-pane';
import { SelectedOperationalLimitGroup } from './selected-operational-limit-group.js';
import { useCallback, useRef, useState } from 'react';
import { useWatch } from 'react-hook-form';
import { CurrentLimits, OperationalLimitsGroup } from '../../../services/network-modification-types';
import { CurrentLimits } from '../../../services/network-modification-types';
import { OperationalLimitsGroupsTabs } from './operational-limits-groups-tabs';
import { tabStyles } from 'components/utils/tab-utils';
import IconButton from '@mui/material/IconButton';
Expand All @@ -26,6 +26,7 @@ import GridSection from '../commons/grid-section';
import { styles } from '../dialog-utils';
import AddIcon from '@mui/icons-material/ControlPoint';
import { APPLICABILITY } from '../../network/constants';
import { OperationalLimitsGroupFormInfos } from '../network-modifications/line/modification/line-modification-type';

export interface LimitsPaneProps {
id?: string;
Expand All @@ -44,7 +45,7 @@ export function LimitsPane({

const myRef: any = useRef<any>(null);

const limitsGroups: OperationalLimitsGroup[] = useWatch({
const limitsGroups: OperationalLimitsGroupFormInfos[] = useWatch({
name: `${id}.${OPERATIONAL_LIMITS_GROUPS}`,
});

Expand Down Expand Up @@ -72,10 +73,11 @@ export function LimitsPane({
}

// checks if limit sets with that name already exist
const sameNameInLs: OperationalLimitsGroup[] = limitsGroups
const sameNameInLs: OperationalLimitsGroupFormInfos[] = limitsGroups
.filter((_ls, index: number) => index !== indexSelectedLimitSet)
.filter(
(limitsGroup: OperationalLimitsGroup) => limitsGroup.name.trim() === editedLimitGroupName.trim()
(limitsGroup: OperationalLimitsGroupFormInfos) =>
limitsGroup.name.trim() === editedLimitGroupName.trim()
);

// only 2 limit sets with the same name are allowed and only if there have SIDE1 and SIDE2 applicability
Expand Down Expand Up @@ -151,7 +153,7 @@ export function LimitsPane({
<Grid item xs={6} sx={tabStyles.parametersBox} marginLeft={2}>
{indexSelectedLimitSet !== null &&
limitsGroups.map(
(operationalLimitsGroup: OperationalLimitsGroup, index: number) =>
(operationalLimitsGroup: OperationalLimitsGroupFormInfos, index: number) =>
index === indexSelectedLimitSet && (
<LimitsSidePane
key={operationalLimitsGroup.id}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import { tabStyles } from 'components/utils/tab-utils';
import { APPLICABILITY } from '../../network/constants';
import { type MuiStyles, NAME } from '@gridsuite/commons-ui';
import { grey } from '@mui/material/colors';
import { OperationalLimitsGroupFormInfos } from '../network-modifications/line/modification/line-modification-type';

const limitsStyles = {
limitsBackground: {
Expand All @@ -55,7 +56,7 @@ const limitsStyles = {

export interface OperationalLimitsGroupsTabsProps {
parentFormName: string;
limitsGroups: OperationalLimitsGroup[];
limitsGroups: OperationalLimitsGroupFormInfos[];
indexSelectedLimitSet: number | null;
setIndexSelectedLimitSet: React.Dispatch<React.SetStateAction<number | null>>;
checkLimitSetUnicity: (editedLimitGroupName: string, newSelectedApplicability: string) => string;
Expand Down Expand Up @@ -285,7 +286,7 @@ export const OperationalLimitsGroupsTabs = forwardRef<any, OperationalLimitsGrou
sx={tabStyles.listDisplay}
visibleScrollbar
>
{limitsGroups.map((opLg: OperationalLimitsGroup, index: number) => (
{limitsGroups.map((opLg: OperationalLimitsGroupFormInfos, index: number) => (
<Tab
onMouseEnter={() => setHoveredRowIndex(index)}
onMouseLeave={() => setHoveredRowIndex(-1)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import { useMemo } from 'react';
import { useWatch } from 'react-hook-form';
import { Box } from '@mui/material';
import { AutocompleteInput } from '@gridsuite/commons-ui';
import { OperationalLimitsGroup } from '../../../services/network-modification-types';
import { APPLICABILITY } from '../../network/constants';
import { useIntl } from 'react-intl';
import { OperationalLimitsGroupFormInfos } from '../network-modifications/line/modification/line-modification-type';

export interface SelectedOperationalLimitGroupProps {
selectedFormName: string;
Expand All @@ -29,7 +29,7 @@ export const SelectedOperationalLimitGroup = ({
previousValue,
isABranchModif,
}: Readonly<SelectedOperationalLimitGroupProps>) => {
const optionsValues: OperationalLimitsGroup[] = useWatch({
const optionsValues: OperationalLimitsGroupFormInfos[] = useWatch({
name: optionsFormName,
});
const intl = useIntl();
Expand All @@ -38,12 +38,12 @@ export const SelectedOperationalLimitGroup = ({
const finalOptions: string[] = optionsValues
? optionsValues
.filter(
(optionObj: OperationalLimitsGroup) =>
(optionObj: OperationalLimitsGroupFormInfos) =>
optionObj.applicability &&
(optionObj.applicability === filteredApplicability ||
optionObj.applicability === APPLICABILITY.EQUIPMENT.id)
)
.map((filteredoptionObj: OperationalLimitsGroup) => filteredoptionObj.name)
.map((filteredoptionObj: OperationalLimitsGroupFormInfos) => filteredoptionObj.name)
.filter((id: string) => id != null)
: [];
if (isABranchModif) {
Expand Down
24 changes: 18 additions & 6 deletions src/components/dialogs/limits/temporary-limits-table.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

import { useState } from 'react';
import { useFieldArray } from 'react-hook-form';
import { useCallback, useState } from 'react';
import { useFieldArray, useFormContext } from 'react-hook-form';
import { Box, Grid, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material';
import {
type ColumnNumeric,
Expand All @@ -21,7 +21,7 @@ import {
import IconButton from '@mui/material/IconButton';
import AddCircleIcon from '@mui/icons-material/AddCircle';
import DeleteIcon from '@mui/icons-material/Delete';
import { SELECTED } from '../../utils/field-constants';
import { DELETION_MARK, SELECTED } from '../../utils/field-constants';
import { TemporaryLimit } from '../../../services/network-modification-types';

const styles = {
Expand Down Expand Up @@ -92,8 +92,9 @@ function TemporaryLimitsTable({
isValueModified,
disableAddingRows = false,
}: Readonly<TemporaryLimitsTableProps>) {
const { fields, append, remove } = useFieldArray({ name: arrayFormName });
const { fields, append } = useFieldArray({ name: arrayFormName });
const [hoveredRowIndex, setHoveredRowIndex] = useState(-1);
const { setValue, getValues } = useFormContext();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not using useFieldArray methods?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to but I failed to do it.

  • fields only return a record of keys/default values. Is there something better than getValues and this ?
  • update would change the whole object at the index instead of just the DELETION_MARK part (I could combine it with a getValues but then it lose its point).
    Do you have a more precise idea ?


function renderTableCell(rowId: string, rowIndex: number, column: ColumnText | ColumnNumeric) {
const name = `${arrayFormName}[${rowIndex}].${column.dataKey}`;
Expand Down Expand Up @@ -144,11 +145,19 @@ function TemporaryLimitsTable({
);
}

const deletionMarkFormName = useCallback(
(index: number) => `${arrayFormName}[${index}].${DELETION_MARK}`,
[arrayFormName]
);

const renderTableRow = (rowId: string, index: number) => (
<TableRow onMouseEnter={() => setHoveredRowIndex(index)} onMouseLeave={() => setHoveredRowIndex(-1)}>
{columnsDefinition.map((column) => renderTableCell(rowId, index, column))}
<TableCell key={rowId + 'delete'}>
<IconButton color="primary" onClick={() => remove(index)}>
<IconButton
color="primary"
onClick={() => setValue(deletionMarkFormName(index), true, { shouldDirty: true })}
>
<DeleteIcon visibility={index === hoveredRowIndex ? 'visible' : 'hidden'} />
</IconButton>
</TableCell>
Expand All @@ -158,7 +167,10 @@ function TemporaryLimitsTable({
function renderTableBody() {
return (
<TableBody>
{fields.map((value: Record<'id', string>, index: number) => renderTableRow(value.id, index))}
{fields.map(
(value: Record<'id', string>, index: number) =>
!getValues(deletionMarkFormName(index)) && renderTableRow(value.id, index)
)}
</TableBody>
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ import {
getLimitsValidationSchema,
addModificationTypeToOpLimitsGroups,
getAllLimitsFormData,
formatOpLimitGroups,
updateOpLimitsGroups,
formatOpLimitGroupsToFormInfos,
combineFormAndMapServerLimitsGroups,
addOperationTypeToSelectedOpLG,
} from '../../../limits/limits-pane-utils';
import {
Expand Down Expand Up @@ -101,7 +101,7 @@ import { UUID } from 'crypto';
import { CurrentTreeNode } from '../../../../graph/tree-node.type';
import { BranchInfos } from '../../../../../services/study/network-map.type';
import { useIntl } from 'react-intl';
import { LineModificationFormInfos } from './line-modification-type';
import { LimitsDialogFormInfos, LineModificationFormInfos } from './line-modification-type';
import { LineModificationInfos } from '../../../../../services/network-modification-types';
import { toModificationOperation } from '../../../../utils/utils';

Expand Down Expand Up @@ -205,7 +205,7 @@ const LineModificationDialog = ({
b2: convertInputValue(FieldType.B2, lineModification.b2?.value ?? null),
}),
...getAllLimitsFormData(
formatOpLimitGroups(lineModification.operationalLimitsGroups),
formatOpLimitGroupsToFormInfos(lineModification.operationalLimitsGroups),
lineModification.selectedOperationalLimitsGroup1?.value ?? null,
lineModification.selectedOperationalLimitsGroup2?.value ?? null
),
Expand All @@ -227,7 +227,7 @@ const LineModificationDialog = ({
const connectivity2 = line[CONNECTIVITY]?.[CONNECTIVITY_2];
const characteristics = line[CHARACTERISTICS];
const stateEstimationData = line[STATE_ESTIMATION];
const limits = line[LIMITS];
const limits: LimitsDialogFormInfos = line[LIMITS];

modifyLine({
studyUuid: studyUuid,
Expand All @@ -241,12 +241,7 @@ const LineModificationDialog = ({
b1: convertOutputValue(FieldType.B1, characteristics[B1]),
g2: convertOutputValue(FieldType.G2, characteristics[G2]),
b2: convertOutputValue(FieldType.B2, characteristics[B2]),
operationalLimitsGroups: addModificationTypeToOpLimitsGroups(
limits[OPERATIONAL_LIMITS_GROUPS],
lineToModify,
editData,
currentNode
),
operationalLimitsGroups: addModificationTypeToOpLimitsGroups(limits[OPERATIONAL_LIMITS_GROUPS]),
selectedOperationalLimitsGroup1: addOperationTypeToSelectedOpLG(
limits[SELECTED_LIMITS_GROUP_1],
intl.formatMessage({
Expand Down Expand Up @@ -287,7 +282,7 @@ const LineModificationDialog = ({
});
});
},
[studyUuid, currentNodeUuid, editData, selectedId, lineToModify, currentNode, intl, snackError]
[studyUuid, currentNodeUuid, editData, selectedId, intl, snackError]
);

const clear = useCallback(() => {
Expand Down Expand Up @@ -315,7 +310,10 @@ const LineModificationDialog = ({
...formValues,
...{
[LIMITS]: {
[OPERATIONAL_LIMITS_GROUPS]: updateOpLimitsGroups(formValues, line),
[OPERATIONAL_LIMITS_GROUPS]: combineFormAndMapServerLimitsGroups(
formValues,
line
),
},
},
[ADDITIONAL_PROPERTIES]: getConcatenatedProperties(line, getValues),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,21 @@
import { UUID } from 'crypto';
import { OperationalLimitsGroup } from '../../../../../services/network-modification-types';
import { Property } from '../../common/properties/property-utils';
import {
APPLICABIlITY,
CURRENT_LIMITS,
DELETION_MARK,
ID,
NAME,
OPERATIONAL_LIMITS_GROUPS,
PERMANENT_LIMIT,
SELECTED_LIMITS_GROUP_1,
SELECTED_LIMITS_GROUP_2,
TEMPORARY_LIMIT_DURATION,
TEMPORARY_LIMIT_NAME,
TEMPORARY_LIMIT_VALUE,
TEMPORARY_LIMITS,
} from '../../../../utils/field-constants';

export interface LineModificationFormInfos {
equipmentId?: string;
Expand Down Expand Up @@ -51,5 +66,33 @@ export interface LineModificationFormInfos {
AdditionalProperties: any;
characteristics: any;
stateEstimation: any;
limits: any;
limits: LimitsDialogFormInfos;
}

export interface LimitsDialogFormInfos {
[SELECTED_LIMITS_GROUP_1]: string | null;
[SELECTED_LIMITS_GROUP_2]: string | null;
[OPERATIONAL_LIMITS_GROUPS]: OperationalLimitsGroupFormInfos[];
}

export interface OperationalLimitsGroupFormInfos {
// here 'id' is a concatenation of NAME and APPLICABIlITY because 2 limits sets on side1 and 2 may have the same name
// "ID" from the map server is stored as NAME in the form because of this
[ID]: string;
[APPLICABIlITY]?: string;
[NAME]: string;
[CURRENT_LIMITS]: CurrentLimitsFormInfos;
}

export interface CurrentLimitsFormInfos {
[ID]: string;
[PERMANENT_LIMIT]: number | null;
[TEMPORARY_LIMITS]: TemporaryLimitFormInfos[];
}

export interface TemporaryLimitFormInfos {
[TEMPORARY_LIMIT_NAME]: string;
[TEMPORARY_LIMIT_DURATION]: number | null;
[TEMPORARY_LIMIT_VALUE]: number | null;
[DELETION_MARK]: boolean;
}
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,11 @@ import {
import {
addModificationTypeToOpLimitsGroups,
addOperationTypeToSelectedOpLG,
formatOpLimitGroups,
formatOpLimitGroupsToFormInfos,
getAllLimitsFormData,
getLimitsEmptyFormData,
getLimitsValidationSchema,
updateOpLimitsGroups,
combineFormAndMapServerLimitsGroups,
} from '../../../limits/limits-pane-utils';
import { useOpenShortWaitFetching } from 'components/dialogs/commons/handle-modification-form';
import TwoWindingsTransformerModificationDialogHeader from './two-windings-transformer-modification-dialog-header';
Expand Down Expand Up @@ -247,7 +247,7 @@ const TwoWindingsTransformerModificationDialog = ({
}),
...getStateEstimationEditData(STATE_ESTIMATION, twtModification),
...getAllLimitsFormData(
formatOpLimitGroups(twtModification.operationalLimitsGroups),
formatOpLimitGroupsToFormInfos(twtModification.operationalLimitsGroups),
twtModification.selectedOperationalLimitsGroup1?.value ?? null,
twtModification.selectedOperationalLimitsGroup2?.value ?? null
),
Expand Down Expand Up @@ -483,12 +483,7 @@ const TwoWindingsTransformerModificationDialog = ({
ratedS: toModificationOperation(characteristics[RATED_S]),
ratedU1: toModificationOperation(characteristics[RATED_U1]),
ratedU2: toModificationOperation(characteristics[RATED_U2]),
operationalLimitsGroups: addModificationTypeToOpLimitsGroups(
limits[OPERATIONAL_LIMITS_GROUPS],
twtToModify,
editData,
currentNode
),
operationalLimitsGroups: addModificationTypeToOpLimitsGroups(limits[OPERATIONAL_LIMITS_GROUPS]),
selectedLimitsGroup1: addOperationTypeToSelectedOpLG(
limits[SELECTED_LIMITS_GROUP_1],
intl.formatMessage({
Expand Down Expand Up @@ -538,8 +533,6 @@ const TwoWindingsTransformerModificationDialog = ({
currentNodeUuid,
editData,
selectedId,
twtToModify,
currentNode,
intl,
computeRatioTapForSubmit,
computePhaseTapForSubmit,
Expand Down Expand Up @@ -660,7 +653,10 @@ const TwoWindingsTransformerModificationDialog = ({
...formValues,
...{
[LIMITS]: {
[OPERATIONAL_LIMITS_GROUPS]: updateOpLimitsGroups(formValues, twt),
[OPERATIONAL_LIMITS_GROUPS]: combineFormAndMapServerLimitsGroups(
formValues,
twt
),
},
},
...getRatioTapChangerFormData({
Expand Down
1 change: 1 addition & 0 deletions src/components/utils/field-constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ export const TEMPORARY_LIMIT_DURATION = 'acceptableDuration';
export const TEMPORARY_LIMIT_VALUE = 'value';
export const TEMPORARY_LIMIT_MODIFICATION_TYPE = {
MODIFY: 'MODIFY',
MODIFY_OR_ADD: 'MODIFY_OR_ADD', // if the limit exists it is modified, if not it is created
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe should rename it MODIFY OR ELSE ADD, it s easier to understand at first sight

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(in the back also)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You are right it would be clearer. Sadly I already merged MODIFY_OR_ADD for the operational limits groups equivalent. If I change one I should change both.

ADD: 'ADD',
DELETE: 'DELETE',
REPLACE: 'REPLACE',
Expand Down
Loading
Loading