@gridsuite/commons-ui 0.212.0 → 0.213.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/components/filter/expert/ExpertFilterForm.d.ts +1 -1
  2. package/dist/components/filter/expert/ExpertFilterForm.js +2 -13
  3. package/dist/components/filter/explicitNaming/ExplicitNamingFilterForm.js +7 -10
  4. package/dist/components/filter/utils/filterApi.js +3 -3
  5. package/dist/components/index.js +16 -0
  6. package/dist/components/network-modification-table/columns-definition.d.ts +0 -2
  7. package/dist/components/network-modification-table/index.js +16 -0
  8. package/dist/components/network-modification-table/network-modifications-table.d.ts +8 -2
  9. package/dist/components/network-modification-table/network-modifications-table.js +33 -8
  10. package/dist/components/network-modification-table/renderers/cell-renderers.d.ts +23 -0
  11. package/dist/components/network-modification-table/renderers/cell-renderers.js +103 -0
  12. package/dist/components/network-modification-table/renderers/description-cell.d.ts +9 -0
  13. package/dist/components/network-modification-table/renderers/description-cell.js +73 -0
  14. package/dist/components/network-modification-table/renderers/index.d.ts +4 -0
  15. package/dist/components/network-modification-table/renderers/index.js +17 -1
  16. package/dist/components/network-modification-table/renderers/name-cell.d.ts +2 -2
  17. package/dist/components/network-modification-table/renderers/name-cell.js +28 -9
  18. package/dist/components/network-modification-table/renderers/root-network-chip-cell.d.ts +13 -0
  19. package/dist/components/network-modification-table/renderers/root-network-chip-cell.js +138 -0
  20. package/dist/components/network-modification-table/renderers/select-cell.js +2 -2
  21. package/dist/components/network-modification-table/renderers/select-header-cell.js +2 -2
  22. package/dist/components/network-modification-table/renderers/switch-cell.d.ts +9 -0
  23. package/dist/components/network-modification-table/renderers/switch-cell.js +63 -0
  24. package/dist/index.js +24 -3
  25. package/dist/services/index.js +4 -1
  26. package/dist/services/networkModification.d.ts +8 -1
  27. package/dist/services/networkModification.js +45 -1
  28. package/dist/translations/en/filterEn.d.ts +0 -1
  29. package/dist/translations/en/filterEn.js +0 -1
  30. package/dist/translations/en/filterExpertEn.d.ts +0 -2
  31. package/dist/translations/en/filterExpertEn.js +0 -2
  32. package/dist/translations/en/networkModificationsEn.d.ts +1 -0
  33. package/dist/translations/en/networkModificationsEn.js +4 -3
  34. package/dist/translations/fr/filterExpertFr.d.ts +0 -2
  35. package/dist/translations/fr/filterExpertFr.js +0 -2
  36. package/dist/translations/fr/filterFr.d.ts +0 -1
  37. package/dist/translations/fr/filterFr.js +0 -1
  38. package/dist/translations/fr/networkModificationsFr.d.ts +1 -0
  39. package/dist/translations/fr/networkModificationsFr.js +4 -3
  40. package/dist/utils/constants/index.js +2 -1
  41. package/dist/utils/constants/translationKeys.d.ts +1 -0
  42. package/dist/utils/constants/translationKeys.js +2 -0
  43. package/dist/utils/index.js +4 -2
  44. package/dist/utils/types/equipmentTypes.d.ts +1 -0
  45. package/dist/utils/types/equipmentTypes.js +5 -1
  46. package/dist/utils/types/index.js +2 -1
  47. package/dist/utils/types/network-modification-types.d.ts +6 -0
  48. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
+ import { default as yup } from '../../../utils/yupConfig';
1
2
  import { FieldType } from '../../../utils/types/fieldType';
2
- import * as yup from 'yup';
3
3
  export declare const expertFilterSchema: {
4
4
  rules: yup.ObjectSchema<{}, yup.AnyObject, {}, "">;
5
5
  };
@@ -2,9 +2,9 @@ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
2
  import { useCallback, useMemo } from "react";
3
3
  import { formatQuery } from "react-querybuilder/formatQuery";
4
4
  import { useWatch } from "react-hook-form";
5
- import * as yup from "yup";
6
5
  import { v4 } from "uuid";
7
6
  import { Box } from "@mui/material";
7
+ import "../../../utils/yupConfig.js";
8
8
  import { testQuery } from "./expertFilterUtils.js";
9
9
  import { EXPERT_FILTER_QUERY, RULES, OPERATOR_OPTIONS, COMBINATOR_OPTIONS, EXPERT_FILTER_FIELDS, EXPERT_FILTER_EQUIPMENTS } from "./expertFilterConstants.js";
10
10
  import { FieldConstants } from "../../../utils/constants/fieldConstants.js";
@@ -18,7 +18,6 @@ import "../../../utils/conversionUtils.js";
18
18
  import "../../../utils/types/equipmentType.js";
19
19
  import { FieldType } from "../../../utils/types/fieldType.js";
20
20
  import "@mui/icons-material";
21
- import "../../../utils/yupConfig.js";
22
21
  import "react-intl";
23
22
  import "../../treeViewFinder/TreeViewFinder.js";
24
23
  import "localized-countries";
@@ -30,6 +29,7 @@ import { filterStyles } from "../HeaderFilterForm.js";
30
29
  import "../../overflowableText/OverflowableText.js";
31
30
  import "../../inputs/reactHookForm/provider/CustomFormProvider.js";
32
31
  import { useCustomFormContext } from "../../inputs/reactHookForm/provider/useCustomFormContext.js";
32
+ import * as yup from "yup";
33
33
  import "../../inputs/reactHookForm/agGridTable/BottomRightButtons.js";
34
34
  import "../../customAGGrid/customAggrid.js";
35
35
  import "ag-grid-community";
@@ -44,17 +44,6 @@ import "@material-symbols/svg-400/outlined/add_notes.svg?react";
44
44
  import "../../inputs/reactHookForm/expandableInput/ExpandableInput.js";
45
45
  import "@react-querybuilder/material";
46
46
  import "../../inputs/reactQueryBuilder/PropertyValueEditor.js";
47
- yup.setLocale({
48
- mixed: {
49
- required: "YupRequired",
50
- notType: ({ type }) => {
51
- if (type === "number") {
52
- return "YupNotTypeNumber";
53
- }
54
- return "YupNotTypeDefault";
55
- }
56
- }
57
- });
58
47
  import '../../../assets/ExpertFilterForm.css';function isSupportedEquipmentType(equipmentType) {
59
48
  return Object.values(EXPERT_FILTER_EQUIPMENTS).map((equipments) => equipments.id).includes(equipmentType);
60
49
  }
@@ -8,7 +8,7 @@ import { FieldConstants } from "../../../utils/constants/fieldConstants.js";
8
8
  import "../../../utils/yupConfig.js";
9
9
  import { CustomAgGridTable } from "../../inputs/reactHookForm/agGridTable/CustomAgGridTable.js";
10
10
  import { SelectInput } from "../../inputs/reactHookForm/selectInputs/SelectInput.js";
11
- import { Generator, Load } from "../../../utils/types/equipmentTypes.js";
11
+ import { isInjection } from "../../../utils/types/equipmentTypes.js";
12
12
  import { NumericEditor } from "../../inputs/reactHookForm/agGridTable/cellEditors/numericEditor.js";
13
13
  import { InputWithPopupConfirmation } from "../../inputs/reactHookForm/selectInputs/InputWithPopupConfirmation.js";
14
14
  import { toFloatOrNullValue } from "../../inputs/reactHookForm/utils/functions.js";
@@ -50,9 +50,6 @@ import "../../inputs/reactQueryBuilder/CustomReactQueryBuilder.js";
50
50
  import "../../inputs/reactQueryBuilder/PropertyValueEditor.js";
51
51
  import "react-querybuilder";
52
52
  import * as yup from "yup";
53
- function isGeneratorOrLoad(equipmentType) {
54
- return equipmentType === Generator.type || equipmentType === Load.type;
55
- }
56
53
  const explicitNamingFilterSchema = {
57
54
  [FILTER_EQUIPMENTS_ATTRIBUTES]: yup.array().of(
58
55
  yup.object().shape({
@@ -60,7 +57,7 @@ const explicitNamingFilterSchema = {
60
57
  [DISTRIBUTION_KEY]: yup.number().nullable()
61
58
  })
62
59
  ).compact((row) => !row[DISTRIBUTION_KEY] && !row[FieldConstants.EQUIPMENT_ID]).min(1, "emptyFilterError").when([FieldConstants.EQUIPMENT_TYPE], {
63
- is: (equipmentType) => isGeneratorOrLoad(equipmentType),
60
+ is: (equipmentType) => isInjection(equipmentType),
64
61
  then: (innerSchema) => innerSchema.test("noKeyWithoutId", "distributionKeyWithMissingIdError", (array) => {
65
62
  return !array.some((row) => !row[FieldConstants.EQUIPMENT_ID]);
66
63
  }).test("ifOneKeyThenKeyEverywhere", "missingDistributionKeyError", (array) => {
@@ -100,7 +97,7 @@ function ExplicitNamingFilterForm({
100
97
  });
101
98
  }
102
99
  }, [snackError, watchEquipmentType]);
103
- const forGeneratorOrLoad = isGeneratorOrLoad(watchEquipmentType);
100
+ const forGeneratorBatteryOrLoad = isInjection(watchEquipmentType);
104
101
  useEffect(() => {
105
102
  if (sourceFilterForExplicitNamingConversion) {
106
103
  setValue(FieldConstants.EQUIPMENT_TYPE, sourceFilterForExplicitNamingConversion.equipmentType);
@@ -120,7 +117,7 @@ function ExplicitNamingFilterForm({
120
117
  valueParser: (params) => params.newValue?.trim() ?? null
121
118
  }
122
119
  ];
123
- if (forGeneratorOrLoad) {
120
+ if (forGeneratorBatteryOrLoad) {
124
121
  newColumnDefs.push({
125
122
  headerName: intl.formatMessage({ id: DISTRIBUTION_KEY }),
126
123
  field: DISTRIBUTION_KEY,
@@ -131,7 +128,7 @@ function ExplicitNamingFilterForm({
131
128
  });
132
129
  }
133
130
  return newColumnDefs;
134
- }, [intl, forGeneratorOrLoad]);
131
+ }, [intl, forGeneratorBatteryOrLoad]);
135
132
  const defaultColDef = useMemo(
136
133
  () => ({
137
134
  suppressMovable: true
@@ -140,11 +137,11 @@ function ExplicitNamingFilterForm({
140
137
  );
141
138
  const csvFileHeaders = useMemo(() => {
142
139
  const newCsvFileHeaders = [intl.formatMessage({ id: FieldConstants.EQUIPMENT_ID })];
143
- if (forGeneratorOrLoad) {
140
+ if (forGeneratorBatteryOrLoad) {
144
141
  newCsvFileHeaders.push(intl.formatMessage({ id: DISTRIBUTION_KEY }));
145
142
  }
146
143
  return newCsvFileHeaders;
147
- }, [intl, forGeneratorOrLoad]);
144
+ }, [intl, forGeneratorBatteryOrLoad]);
148
145
  const getDataFromCsvFile = useCallback((csvData) => {
149
146
  if (csvData) {
150
147
  return csvData.map((value) => {
@@ -1,5 +1,5 @@
1
1
  import { FieldConstants } from "../../../utils/constants/fieldConstants.js";
2
- import { Generator, Load } from "../../../utils/types/equipmentTypes.js";
2
+ import { isInjection } from "../../../utils/types/equipmentTypes.js";
3
3
  import { exportExpertRules } from "../expert/expertFilterUtils.js";
4
4
  import { DISTRIBUTION_KEY, FilterType } from "../constants/FilterConstants.js";
5
5
  import { createFilter, saveFilter } from "../../../services/explore.js";
@@ -11,8 +11,8 @@ import "@mui/icons-material";
11
11
  import "../../../utils/yupConfig.js";
12
12
  const saveExplicitNamingFilter = (tableValues, isFilterCreation, equipmentType, name, description, id, setCreateFilterErr, handleClose, activeDirectory, token) => {
13
13
  let cleanedTableValues;
14
- const isGeneratorOrLoad = equipmentType === Generator.type || equipmentType === Load.type;
15
- if (isGeneratorOrLoad) {
14
+ const isEquipmentAnInjection = isInjection(equipmentType);
15
+ if (isEquipmentAnInjection) {
16
16
  cleanedTableValues = tableValues.map((row) => ({
17
17
  [FieldConstants.EQUIPMENT_ID]: row[FieldConstants.EQUIPMENT_ID],
18
18
  [DISTRIBUTION_KEY]: row[DISTRIBUTION_KEY]
@@ -269,12 +269,16 @@ import { COLUMNS_WITHOUT_BORDER, DEPTH_CELL_WIDTH, DROP_FORBIDDEN_INDICATOR_BOTT
269
269
  import { AUTO_EXTENSIBLE_COLUMNS, BASE_MODIFICATION_TABLE_COLUMNS, computeTagMinSize } from "./network-modification-table/columns-definition.js";
270
270
  import { NetworkModificationsTable } from "./network-modification-table/network-modifications-table.js";
271
271
  import { useModificationsDragAndDrop } from "./network-modification-table/use-modifications-drag-and-drop.js";
272
+ import { DescriptionCellRenderer, DragHandleRenderer, NameCellRenderer, NameHeaderRenderer, RootNetworkCellRenderer, RootNetworkHeaderRenderer, SelectCellRenderer, SelectHeaderRenderer, SwitchCellRenderer } from "./network-modification-table/renderers/cell-renderers.js";
272
273
  import { DepthBox } from "./network-modification-table/renderers/depth-box.js";
274
+ import { DescriptionCell } from "./network-modification-table/renderers/description-cell.js";
273
275
  import { DragHandleCell } from "./network-modification-table/renderers/drag-handle-cell.js";
274
276
  import { NameCell } from "./network-modification-table/renderers/name-cell.js";
275
277
  import { NetworkModificationEditorNameHeader } from "./network-modification-table/renderers/network-modification-node-editor-name-header.js";
278
+ import { RootNetworkChipCell } from "./network-modification-table/renderers/root-network-chip-cell.js";
276
279
  import { SelectCell } from "./network-modification-table/renderers/select-cell.js";
277
280
  import { SelectHeaderCell } from "./network-modification-table/renderers/select-header-cell.js";
281
+ import { SwitchCell } from "./network-modification-table/renderers/switch-cell.js";
278
282
  import { DragCloneRow } from "./network-modification-table/row/drag-row-clone.js";
279
283
  import { ModificationRow } from "./network-modification-table/row/modification-row.js";
280
284
  import { MAX_COMPOSITE_NESTING_DEPTH, fetchSubModificationsForExpandedRows, findAllLoadedCompositeModifications, findModificationInTree, formatToComposedModification, isCompositeModification, mergeSubModificationsIntoTree, moveSubModificationInTree, updateModificationFieldInTree, updateSubModificationsOfACompositeInTree } from "./network-modification-table/utils.js";
@@ -385,6 +389,8 @@ export {
385
389
  DataType,
386
390
  DefaultCellRenderer,
387
391
  DepthBox,
392
+ DescriptionCell,
393
+ DescriptionCellRenderer,
388
394
  DescriptionField,
389
395
  DescriptionInput,
390
396
  DescriptionModificationDialog,
@@ -398,6 +404,7 @@ export {
398
404
  DndTableBottomRightButtons,
399
405
  DragCloneRow,
400
406
  DragHandleCell,
407
+ DragHandleRenderer,
401
408
  DynamicMarginCalculationInline,
402
409
  DynamicSecurityAnalysisInline,
403
410
  DynamicSimulationInline,
@@ -516,6 +523,8 @@ export {
516
523
  NODE_CLUSTER_FILTER_IDS,
517
524
  NadPositionsGenerationMode,
518
525
  NameCell,
526
+ NameCellRenderer,
527
+ NameHeaderRenderer,
519
528
  NetworkModificationEditorNameHeader,
520
529
  NetworkModificationNameCellRenderer,
521
530
  NetworkModificationsTable,
@@ -590,6 +599,9 @@ export {
590
599
  ReadOnlyInput,
591
600
  RemoveButton,
592
601
  ResizeHandle,
602
+ RootNetworkCellRenderer,
603
+ RootNetworkChipCell,
604
+ RootNetworkHeaderRenderer,
593
605
  RuleValueEditor,
594
606
  SCENARIO_DURATION,
595
607
  SELECTED,
@@ -624,8 +636,10 @@ export {
624
636
  SecurityAnalysisParametersDialog,
625
637
  SecurityAnalysisParametersInline,
626
638
  SelectCell,
639
+ SelectCellRenderer,
627
640
  SelectClearable,
628
641
  SelectHeaderCell,
642
+ SelectHeaderRenderer,
629
643
  SelectInput,
630
644
  SelectWithConfirmationInput,
631
645
  SensiBranchesTabValues,
@@ -647,6 +661,8 @@ export {
647
661
  SubstationCreationForm,
648
662
  SubstationLayout,
649
663
  SubstationModificationForm,
664
+ SwitchCell,
665
+ SwitchCellRenderer,
650
666
  SwitchInput,
651
667
  SwitchKind,
652
668
  SwitchWithLabel,
@@ -1,4 +1,3 @@
1
- import { NetworkModificationEditorNameHeaderProps } from './renderers';
2
1
  export declare const computeTagMinSize: (tag: string) => number;
3
2
  export declare const BASE_MODIFICATION_TABLE_COLUMNS: {
4
3
  DRAG_HANDLE: {
@@ -23,4 +22,3 @@ export declare const BASE_MODIFICATION_TABLE_COLUMNS: {
23
22
  };
24
23
  };
25
24
  export declare const AUTO_EXTENSIBLE_COLUMNS: string[];
26
- export type NameHeaderProps = Omit<NetworkModificationEditorNameHeaderProps, 'modificationCount'>;
@@ -2,12 +2,16 @@ import { COLUMNS_WITHOUT_BORDER, DEPTH_CELL_WIDTH, DROP_FORBIDDEN_INDICATOR_BOTT
2
2
  import { AUTO_EXTENSIBLE_COLUMNS, BASE_MODIFICATION_TABLE_COLUMNS, computeTagMinSize } from "./columns-definition.js";
3
3
  import { NetworkModificationsTable } from "./network-modifications-table.js";
4
4
  import { useModificationsDragAndDrop } from "./use-modifications-drag-and-drop.js";
5
+ import { DescriptionCellRenderer, DragHandleRenderer, NameCellRenderer, NameHeaderRenderer, RootNetworkCellRenderer, RootNetworkHeaderRenderer, SelectCellRenderer, SelectHeaderRenderer, SwitchCellRenderer } from "./renderers/cell-renderers.js";
5
6
  import { DepthBox } from "./renderers/depth-box.js";
7
+ import { DescriptionCell } from "./renderers/description-cell.js";
6
8
  import { DragHandleCell } from "./renderers/drag-handle-cell.js";
7
9
  import { NameCell } from "./renderers/name-cell.js";
8
10
  import { NetworkModificationEditorNameHeader } from "./renderers/network-modification-node-editor-name-header.js";
11
+ import { RootNetworkChipCell } from "./renderers/root-network-chip-cell.js";
9
12
  import { SelectCell } from "./renderers/select-cell.js";
10
13
  import { SelectHeaderCell } from "./renderers/select-header-cell.js";
14
+ import { SwitchCell } from "./renderers/switch-cell.js";
11
15
  import { DragCloneRow } from "./row/drag-row-clone.js";
12
16
  import { ModificationRow } from "./row/modification-row.js";
13
17
  import { MAX_COMPOSITE_NESTING_DEPTH, fetchSubModificationsForExpandedRows, findAllLoadedCompositeModifications, findModificationInTree, formatToComposedModification, isCompositeModification, mergeSubModificationsIntoTree, moveSubModificationInTree, updateModificationFieldInTree, updateSubModificationsOfACompositeInTree } from "./utils.js";
@@ -21,16 +25,28 @@ export {
21
25
  DROP_INDICATOR_BOTTOM,
22
26
  DROP_INDICATOR_TOP,
23
27
  DepthBox,
28
+ DescriptionCell,
29
+ DescriptionCellRenderer,
24
30
  DragCloneRow,
25
31
  DragHandleCell,
32
+ DragHandleRenderer,
26
33
  MAX_COMPOSITE_NESTING_DEPTH,
27
34
  MODIFICATION_ROW_HEIGHT,
28
35
  ModificationRow,
29
36
  NameCell,
37
+ NameCellRenderer,
38
+ NameHeaderRenderer,
30
39
  NetworkModificationEditorNameHeader,
31
40
  NetworkModificationsTable,
41
+ RootNetworkCellRenderer,
42
+ RootNetworkChipCell,
43
+ RootNetworkHeaderRenderer,
32
44
  SelectCell,
45
+ SelectCellRenderer,
33
46
  SelectHeaderCell,
47
+ SelectHeaderRenderer,
48
+ SwitchCell,
49
+ SwitchCellRenderer,
34
50
  computeTagMinSize,
35
51
  createCellBorderColor,
36
52
  createCellContentWrapperSx,
@@ -1,7 +1,8 @@
1
+ import { Dispatch, SetStateAction } from 'react';
1
2
  import { ColumnDef } from '@tanstack/react-table';
2
3
  import { UUID } from 'node:crypto';
3
4
  import { NetworkModificationEditorNameHeaderProps } from './renderers';
4
- import { ComposedModificationMetadata, NetworkModificationMetadata } from '../../utils';
5
+ import { ExcludedNetworkModifications, RootNetworkRowInfo, ComposedModificationMetadata, NetworkModificationMetadata } from '../../utils';
5
6
  interface NetworkModificationsTableProps extends Omit<NetworkModificationEditorNameHeaderProps, 'modificationCount'> {
6
7
  modifications: NetworkModificationMetadata[];
7
8
  handleCellClick: (modification: NetworkModificationMetadata) => void;
@@ -13,6 +14,11 @@ interface NetworkModificationsTableProps extends Omit<NetworkModificationEditorN
13
14
  highlightedModificationUuid: UUID | null;
14
15
  studyUuid: UUID | null;
15
16
  currentNodeId?: UUID;
17
+ currentRootNetworkUuid?: UUID;
18
+ rootNetworks?: RootNetworkRowInfo[];
19
+ modificationsToExclude?: ExcludedNetworkModifications[];
20
+ setModificationsToExclude?: Dispatch<SetStateAction<ExcludedNetworkModifications[]>>;
21
+ isDisabled?: boolean;
16
22
  }
17
- export declare function NetworkModificationsTable({ modifications, handleCellClick, isRowDragDisabled, onRowDragStart, onRowDragEnd, onRowSelected, columns, highlightedModificationUuid, studyUuid, currentNodeId, isImpactedByNotification, notificationMessageId, isFetchingModifications, pendingState, }: Readonly<NetworkModificationsTableProps>): import("react/jsx-runtime").JSX.Element;
23
+ export declare function NetworkModificationsTable({ modifications, handleCellClick, isRowDragDisabled, onRowDragStart, onRowDragEnd, onRowSelected, columns, highlightedModificationUuid, studyUuid, currentNodeId, currentRootNetworkUuid, rootNetworks, modificationsToExclude, setModificationsToExclude, isDisabled, isImpactedByNotification, notificationMessageId, isFetchingModifications, pendingState, }: Readonly<NetworkModificationsTableProps>): import("react/jsx-runtime").JSX.Element;
18
24
  export {};
@@ -30,6 +30,11 @@ function NetworkModificationsTable({
30
30
  highlightedModificationUuid,
31
31
  studyUuid = null,
32
32
  currentNodeId = void 0,
33
+ currentRootNetworkUuid,
34
+ rootNetworks,
35
+ modificationsToExclude,
36
+ setModificationsToExclude,
37
+ isDisabled = false,
33
38
  isImpactedByNotification,
34
39
  notificationMessageId,
35
40
  isFetchingModifications,
@@ -74,26 +79,46 @@ function NetworkModificationsTable({
74
79
  }, []);
75
80
  const tableMeta = useMemo(
76
81
  () => ({
77
- lastClickedRowId,
78
- onRowSelected,
79
- isRowDragDisabled,
80
- modificationsCount: modifications.length,
81
- nameHeaderProps: {
82
+ context: {
83
+ studyUuid,
84
+ currentNodeId,
85
+ currentRootNetworkUuid,
86
+ rootNetworks
87
+ },
88
+ modifications: {
89
+ count: modifications.length,
90
+ toExclude: modificationsToExclude,
91
+ setToExclude: setModificationsToExclude
92
+ },
93
+ interaction: {
94
+ lastClickedRowId,
95
+ onRowSelected,
96
+ isRowDragDisabled
97
+ },
98
+ status: {
82
99
  isImpactedByNotification,
83
100
  notificationMessageId,
84
101
  isFetchingModifications,
85
- pendingState
102
+ pendingState,
103
+ isDisabled
86
104
  }
87
105
  }),
88
106
  [
107
+ studyUuid,
108
+ currentNodeId,
109
+ currentRootNetworkUuid,
110
+ rootNetworks,
111
+ modifications.length,
112
+ modificationsToExclude,
113
+ setModificationsToExclude,
89
114
  lastClickedRowId,
90
115
  onRowSelected,
91
116
  isRowDragDisabled,
92
- modifications.length,
93
117
  isImpactedByNotification,
94
118
  notificationMessageId,
95
119
  isFetchingModifications,
96
- pendingState
120
+ pendingState,
121
+ isDisabled
97
122
  ]
98
123
  );
99
124
  const table = useReactTable({
@@ -0,0 +1,23 @@
1
+ import { CellContext, HeaderContext } from '@tanstack/react-table';
2
+ import { ComposedModificationMetadata } from '../../../utils';
3
+ /**
4
+ * Cell/header renderers must keep a stable reference across renders to avoid
5
+ * unmounting/remounting cells and resetting local states. The renderers below are
6
+ * hoisted because they're reused by `createBaseColumns` and `createRootNetworksColumns`,
7
+ * factories called inside a hook — defining them inline there would produce fresh references.
8
+ *
9
+ * Dynamic values are routed via react-table's `meta`: table-wide via `table.options.meta`,
10
+ * per-column via `column.columnDef.meta`.
11
+ */
12
+ type CCtx = CellContext<ComposedModificationMetadata, unknown>;
13
+ type HCtx = HeaderContext<ComposedModificationMetadata, unknown>;
14
+ export declare function DragHandleRenderer({ table }: CCtx): import("react/jsx-runtime").JSX.Element;
15
+ export declare function SelectHeaderRenderer({ table }: HCtx): import("react/jsx-runtime").JSX.Element;
16
+ export declare function SelectCellRenderer({ row, table }: CCtx): import("react/jsx-runtime").JSX.Element;
17
+ export declare function NameHeaderRenderer({ table }: HCtx): import("react/jsx-runtime").JSX.Element;
18
+ export declare function NameCellRenderer({ row, column }: CCtx): import("react/jsx-runtime").JSX.Element;
19
+ export declare function DescriptionCellRenderer({ row, table }: CCtx): import("react/jsx-runtime").JSX.Element;
20
+ export declare function SwitchCellRenderer({ row, table }: CCtx): import("react/jsx-runtime").JSX.Element;
21
+ export declare function RootNetworkHeaderRenderer({ column, table }: HCtx): import("react/jsx-runtime").JSX.Element | null;
22
+ export declare function RootNetworkCellRenderer({ row, column, table }: CCtx): import("react/jsx-runtime").JSX.Element | null;
23
+ export {};
@@ -0,0 +1,103 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Box, Tooltip, Badge } from "@mui/material";
3
+ import { RemoveRedEye } from "@mui/icons-material";
4
+ import { FormattedMessage } from "react-intl";
5
+ import { DragHandleCell } from "./drag-handle-cell.js";
6
+ import { NameCell } from "./name-cell.js";
7
+ import { NetworkModificationEditorNameHeader } from "./network-modification-node-editor-name-header.js";
8
+ import { SelectCell } from "./select-cell.js";
9
+ import { SelectHeaderCell } from "./select-header-cell.js";
10
+ import { DescriptionCell } from "./description-cell.js";
11
+ import { SwitchCell } from "./switch-cell.js";
12
+ import { RootNetworkChipCell } from "./root-network-chip-cell.js";
13
+ import { networkModificationTableStyles, createRootNetworkChipCellSx } from "../network-modification-table-styles.js";
14
+ function DragHandleRenderer({ table }) {
15
+ return /* @__PURE__ */ jsx(DragHandleCell, { isRowDragDisabled: table.options.meta?.interaction.isRowDragDisabled ?? false });
16
+ }
17
+ function SelectHeaderRenderer({ table }) {
18
+ return /* @__PURE__ */ jsx(SelectHeaderCell, { table });
19
+ }
20
+ function SelectCellRenderer({ row, table }) {
21
+ return /* @__PURE__ */ jsx(SelectCell, { row, table });
22
+ }
23
+ function NameHeaderRenderer({ table }) {
24
+ const { meta } = table.options;
25
+ return /* @__PURE__ */ jsx(
26
+ NetworkModificationEditorNameHeader,
27
+ {
28
+ modificationCount: meta?.modifications.count ?? 0,
29
+ isImpactedByNotification: meta?.status.isImpactedByNotification ?? (() => false),
30
+ notificationMessageId: meta?.status.notificationMessageId,
31
+ isFetchingModifications: meta?.status.isFetchingModifications ?? false,
32
+ pendingState: meta?.status.pendingState ?? false
33
+ }
34
+ );
35
+ }
36
+ function NameCellRenderer({ row, column }) {
37
+ return /* @__PURE__ */ jsx(NameCell, { row, onChange: column.columnDef.meta?.onChange });
38
+ }
39
+ function DescriptionCellRenderer({ row, table }) {
40
+ const { meta } = table.options;
41
+ return /* @__PURE__ */ jsx(
42
+ DescriptionCell,
43
+ {
44
+ data: row.original,
45
+ studyUuid: meta?.context.studyUuid ?? null,
46
+ currentNodeId: meta?.context.currentNodeId,
47
+ isDisabled: meta?.status.isDisabled
48
+ }
49
+ );
50
+ }
51
+ function SwitchCellRenderer({ row, table }) {
52
+ const { meta } = table.options;
53
+ return /* @__PURE__ */ jsx(
54
+ SwitchCell,
55
+ {
56
+ data: row.original,
57
+ studyUuid: meta?.context.studyUuid ?? null,
58
+ currentNodeId: meta?.context.currentNodeId,
59
+ isDisabled: meta?.status.isDisabled
60
+ }
61
+ );
62
+ }
63
+ function RootNetworkHeaderRenderer({ column, table }) {
64
+ const { meta } = table.options;
65
+ const isCurrentRootNetwork = !!meta?.context.currentRootNetworkUuid && column.id === meta.context.currentRootNetworkUuid;
66
+ if (!isCurrentRootNetwork || (meta?.modifications.count ?? 0) < 1) {
67
+ return null;
68
+ }
69
+ const currentRootNetworkTag = meta?.context.rootNetworks?.find(
70
+ (r) => r.rootNetworkUuid === meta.context.currentRootNetworkUuid
71
+ )?.tag;
72
+ return /* @__PURE__ */ jsx(Box, { sx: networkModificationTableStyles.rootNetworkHeader, children: /* @__PURE__ */ jsx(Tooltip, { title: /* @__PURE__ */ jsx(FormattedMessage, { id: "visualizedRootNetwork", values: { tag: currentRootNetworkTag } }), children: /* @__PURE__ */ jsx(Badge, { overlap: "circular", color: "primary", variant: "dot", children: /* @__PURE__ */ jsx(RemoveRedEye, {}) }) }) });
73
+ }
74
+ function RootNetworkCellRenderer({ row, column, table }) {
75
+ const { meta } = table.options;
76
+ const rootNetwork = meta?.context.rootNetworks?.find((r) => r.rootNetworkUuid === column.id);
77
+ if (!rootNetwork || !meta?.modifications.toExclude || !meta.modifications.setToExclude) {
78
+ return null;
79
+ }
80
+ return /* @__PURE__ */ jsx(Box, { sx: createRootNetworkChipCellSx(row.original.activated), children: /* @__PURE__ */ jsx(
81
+ RootNetworkChipCell,
82
+ {
83
+ data: row.original,
84
+ studyUuid: meta?.context.studyUuid ?? null,
85
+ currentNodeId: meta?.context.currentNodeId,
86
+ rootNetwork,
87
+ modificationsToExclude: meta.modifications.toExclude,
88
+ setModificationsToExclude: meta.modifications.setToExclude,
89
+ isDisabled: meta?.status.isDisabled
90
+ }
91
+ ) });
92
+ }
93
+ export {
94
+ DescriptionCellRenderer,
95
+ DragHandleRenderer,
96
+ NameCellRenderer,
97
+ NameHeaderRenderer,
98
+ RootNetworkCellRenderer,
99
+ RootNetworkHeaderRenderer,
100
+ SelectCellRenderer,
101
+ SelectHeaderRenderer,
102
+ SwitchCellRenderer
103
+ };
@@ -0,0 +1,9 @@
1
+ import { UUID } from 'node:crypto';
2
+ import { ComposedModificationMetadata } from '../../../utils';
3
+ export interface DescriptionCellProps {
4
+ data: ComposedModificationMetadata;
5
+ studyUuid: UUID | null;
6
+ currentNodeId?: UUID;
7
+ isDisabled?: boolean;
8
+ }
9
+ export declare function DescriptionCell(props: DescriptionCellProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,73 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { useState, useCallback } from "react";
3
+ import { Tooltip, IconButton } from "@mui/material";
4
+ import { FormattedMessage } from "react-intl";
5
+ import "react-hook-form";
6
+ import "../../inputs/reactHookForm/provider/CustomFormProvider.js";
7
+ import { DescriptionModificationDialog } from "../../dialogs/descriptionModificationDialog/DescriptionModificationDialog.js";
8
+ import "../../dialogs/elementSaveDialog/ElementSaveDialog.js";
9
+ import "../../../utils/conversionUtils.js";
10
+ import "../../../utils/types/equipmentType.js";
11
+ import "@mui/icons-material";
12
+ import "../../../utils/yupConfig.js";
13
+ import { setModificationMetadata } from "../../../services/networkModification.js";
14
+ import "../../treeViewFinder/TreeViewFinder.js";
15
+ import "localized-countries";
16
+ import "localized-countries/data/fr";
17
+ import "localized-countries/data/en";
18
+ import "notistack";
19
+ import "@material-symbols/svg-400/outlined/left_panel_open.svg?react";
20
+ import "@material-symbols/svg-400/outlined/arrows_output.svg?react";
21
+ import "@material-symbols/svg-400/outlined/arrows_input.svg?react";
22
+ import "@material-symbols/svg-400/outlined/left_panel_close.svg?react";
23
+ import { EditNoteIcon } from "../../icons/EditNoteIcon.js";
24
+ import { createEditDescriptionStyle } from "../network-modification-table-styles.js";
25
+ function DescriptionCell(props) {
26
+ const { data, studyUuid, currentNodeId, isDisabled = false } = props;
27
+ const [isLoading, setIsLoading] = useState(false);
28
+ const [openDescModificationDialog, setOpenDescModificationDialog] = useState(false);
29
+ const modificationUuid = data.uuid;
30
+ const { description } = data;
31
+ const empty = !description;
32
+ const updateModification = useCallback(
33
+ async (descriptionRecord) => {
34
+ setIsLoading(true);
35
+ return setModificationMetadata(studyUuid, currentNodeId, modificationUuid, {
36
+ description: descriptionRecord.description,
37
+ type: data.type
38
+ }).finally(() => {
39
+ setIsLoading(false);
40
+ });
41
+ },
42
+ [studyUuid, currentNodeId, modificationUuid, data.type]
43
+ );
44
+ const handleDescDialogClose = useCallback(() => {
45
+ setOpenDescModificationDialog(false);
46
+ }, []);
47
+ const handleModifyDescription = useCallback(() => {
48
+ setOpenDescModificationDialog(true);
49
+ }, []);
50
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
51
+ openDescModificationDialog && modificationUuid && /* @__PURE__ */ jsx(
52
+ DescriptionModificationDialog,
53
+ {
54
+ open: true,
55
+ description: description ?? "",
56
+ onClose: handleDescDialogClose,
57
+ updateElement: updateModification
58
+ }
59
+ ),
60
+ /* @__PURE__ */ jsx(Tooltip, { title: description ?? /* @__PURE__ */ jsx(FormattedMessage, { id: "addDescription" }), arrow: true, enterDelay: 250, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
61
+ IconButton,
62
+ {
63
+ onClick: handleModifyDescription,
64
+ disabled: isLoading || isDisabled,
65
+ sx: createEditDescriptionStyle(data.description),
66
+ children: /* @__PURE__ */ jsx(EditNoteIcon, { empty })
67
+ }
68
+ ) }) })
69
+ ] });
70
+ }
71
+ export {
72
+ DescriptionCell
73
+ };
@@ -4,9 +4,13 @@
4
4
  * License, v. 2.0. If a copy of the MPL was not distributed with this
5
5
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
6
  */
7
+ export * from './cell-renderers';
7
8
  export * from './depth-box';
9
+ export * from './description-cell';
8
10
  export * from './drag-handle-cell';
9
11
  export * from './name-cell';
10
12
  export * from './network-modification-node-editor-name-header';
13
+ export * from './root-network-chip-cell';
11
14
  export * from './select-cell';
12
15
  export * from './select-header-cell';
16
+ export * from './switch-cell';
@@ -1,14 +1,30 @@
1
+ import { DescriptionCellRenderer, DragHandleRenderer, NameCellRenderer, NameHeaderRenderer, RootNetworkCellRenderer, RootNetworkHeaderRenderer, SelectCellRenderer, SelectHeaderRenderer, SwitchCellRenderer } from "./cell-renderers.js";
1
2
  import { DepthBox } from "./depth-box.js";
3
+ import { DescriptionCell } from "./description-cell.js";
2
4
  import { DragHandleCell } from "./drag-handle-cell.js";
3
5
  import { NameCell } from "./name-cell.js";
4
6
  import { NetworkModificationEditorNameHeader } from "./network-modification-node-editor-name-header.js";
7
+ import { RootNetworkChipCell } from "./root-network-chip-cell.js";
5
8
  import { SelectCell } from "./select-cell.js";
6
9
  import { SelectHeaderCell } from "./select-header-cell.js";
10
+ import { SwitchCell } from "./switch-cell.js";
7
11
  export {
8
12
  DepthBox,
13
+ DescriptionCell,
14
+ DescriptionCellRenderer,
9
15
  DragHandleCell,
16
+ DragHandleRenderer,
10
17
  NameCell,
18
+ NameCellRenderer,
19
+ NameHeaderRenderer,
11
20
  NetworkModificationEditorNameHeader,
21
+ RootNetworkCellRenderer,
22
+ RootNetworkChipCell,
23
+ RootNetworkHeaderRenderer,
12
24
  SelectCell,
13
- SelectHeaderCell
25
+ SelectCellRenderer,
26
+ SelectHeaderCell,
27
+ SelectHeaderRenderer,
28
+ SwitchCell,
29
+ SwitchCellRenderer
14
30
  };
@@ -2,7 +2,7 @@ import { Row } from '@tanstack/react-table';
2
2
  import { ComposedModificationMetadata } from '../../../utils';
3
3
  interface NameCellProps {
4
4
  row: Row<ComposedModificationMetadata>;
5
- onEditNameCell?: (modification: ComposedModificationMetadata, newName: string) => void;
5
+ onChange?: (modification: ComposedModificationMetadata, newValue: string) => Promise<unknown>;
6
6
  }
7
- export declare function NameCell({ row, onEditNameCell }: Readonly<NameCellProps>): import("react/jsx-runtime").JSX.Element;
7
+ export declare function NameCell({ row, onChange }: Readonly<NameCellProps>): import("react/jsx-runtime").JSX.Element;
8
8
  export {};