diff --git a/src/components/graph/menus/network-modifications/network-modification-node-editor.tsx b/src/components/graph/menus/network-modifications/network-modification-node-editor.tsx index 0f5be0c319..ce5a9b6d49 100644 --- a/src/components/graph/menus/network-modifications/network-modification-node-editor.tsx +++ b/src/components/graph/menus/network-modifications/network-modification-node-editor.tsx @@ -21,6 +21,7 @@ import { NetworkModificationsTable, NotificationsUrlKeys, removeNullFields, + setModificationMetadata, snackWithFallback, useNotificationsListener, usePrevious, @@ -84,7 +85,6 @@ import { copyOrMoveModifications } from '../../../../services/study'; import { fetchExcludedNetworkModifications, fetchNetworkModifications, - setModificationMetadata, stashModifications, } from '../../../../services/study/network-modifications'; import { @@ -102,6 +102,7 @@ import ByFilterDeletionDialog from '../../../dialogs/network-modifications/by-fi import { LccCreationDialog } from '../../../dialogs/network-modifications/hvdc-line/lcc/creation/lcc-creation-dialog'; import { styles } from './network-modification-node-editor-utils'; import { + CommonStudyEventData, isModificationsDeleteFinishedNotification, isModificationsUpdateFinishedNotification, isNodeDeletedNotification, @@ -113,7 +114,6 @@ import { ModificationsUpdatingInProgressEventData, NotificationType, parseEventData, - CommonStudyEventData, } from 'types/notification-types'; import { LccModificationDialog } from '../../../dialogs/network-modifications/hvdc-line/lcc/modification/lcc-modification-dialog'; import VoltageLevelTopologyModificationDialog from '../../../dialogs/network-modifications/voltage-level/topology-modification/voltage-level-topology-modification-dialog'; @@ -809,47 +809,15 @@ const NetworkModificationNodeEditor = () => { modificationsToExclude, ]); - const updateModification = useCallback( - async (modif: ComposedModificationMetadata, newName: string) => { - return setModificationMetadata(studyUuid, currentNode?.id, modif.uuid, { + const handleNameChange = useCallback( + (modification: ComposedModificationMetadata, newName: string) => + setModificationMetadata(studyUuid, currentNode?.id, modification.uuid, { name: newName, - type: modif?.type, - }); - }, + type: modification.type, + }), [studyUuid, currentNode?.id] ); - const handleCellEdit = useCallback( - async (modification: ComposedModificationMetadata, newName?: string) => { - if (!newName || newName.trim() === '') { - return; - } - const trimmed = newName.trim(); - - // Optimistic immediate update - setModifications((prev) => - prev.map((m) => { - if (m.uuid !== modification.uuid) return m; - try { - const parsed = JSON.parse(m.messageValues); - return { - ...m, - messageValues: JSON.stringify({ ...parsed, name: trimmed }), - }; - } catch { - return m; - } - }) - ); - try { - await updateModification(modification, trimmed); - } catch { - // Rollback in case of an error - setModifications((prev) => prev.map((m) => (m.uuid !== modification.uuid ? m : modification))); - } - }, - [updateModification] - ); const handleEvent = useCallback( (event: MessageEvent) => { const eventData = parseEventData(event); @@ -1130,17 +1098,10 @@ const NetworkModificationNodeEditor = () => { const columns = useMemo[]>( () => [ - ...createBaseColumns(handleCellEdit), - ...(isMonoRootStudy - ? [] - : createRootNetworksColumns( - rootNetworks, - currentRootNetworkUuid!, - modificationsToExclude, - setModificationsToExclude - )), + ...createBaseColumns(handleNameChange), + ...(isMonoRootStudy ? [] : createRootNetworksColumns(rootNetworks)), ], - [handleCellEdit, isMonoRootStudy, rootNetworks, currentRootNetworkUuid, modificationsToExclude] + [handleNameChange, isMonoRootStudy, rootNetworks] ); const renderNetworkModificationsTable = () => { @@ -1170,6 +1131,11 @@ const NetworkModificationNodeEditor = () => { highlightedModificationUuid={highlightedModificationUuid} studyUuid={studyUuid} currentNodeId={currentNode?.id} + currentRootNetworkUuid={currentRootNetworkUuid ?? undefined} + rootNetworks={isMonoRootStudy ? undefined : rootNetworks} + modificationsToExclude={modificationsToExclude} + setModificationsToExclude={setModificationsToExclude} + isDisabled={isAnyNodeBuilding || mapDataLoading} /> ); }; diff --git a/src/components/graph/menus/network-modifications/network-modification-table/createColumns.tsx b/src/components/graph/menus/network-modifications/network-modification-table/createColumns.tsx index 3fdc0578fc..bbc5481057 100644 --- a/src/components/graph/menus/network-modifications/network-modification-table/createColumns.tsx +++ b/src/components/graph/menus/network-modifications/network-modification-table/createColumns.tsx @@ -8,23 +8,19 @@ import { BASE_MODIFICATION_TABLE_COLUMNS, ComposedModificationMetadata, computeTagMinSize, - ExcludedNetworkModifications, - networkModificationTableStyles, -} from '@gridsuite/commons-ui'; -import React, { SetStateAction } from 'react'; -import { ColumnDef } from '@tanstack/react-table'; -import { RootNetworkMetadata } from '../network-modification-menu.type'; -import { DescriptionCellRenderer, DragHandleRenderer, NameCellRenderer, NameHeaderRenderer, + networkModificationTableStyles, RootNetworkCellRenderer, RootNetworkHeaderRenderer, SelectCellRenderer, SelectHeaderRenderer, SwitchCellRenderer, -} from './renderers/cell-renderers'; +} from '@gridsuite/commons-ui'; +import { ColumnDef } from '@tanstack/react-table'; +import { RootNetworkMetadata } from '../network-modification-menu.type'; /** * Column definition is broken up in 2 parts : base columns which are always on display and root networks columns. @@ -33,7 +29,7 @@ import { */ export const createBaseColumns = ( - onEditNameCell: (modification: ComposedModificationMetadata, newName?: string) => void + onNameChange: (modification: ComposedModificationMetadata, newName: string) => Promise ): ColumnDef[] => [ { id: BASE_MODIFICATION_TABLE_COLUMNS.DRAG_HANDLE.id, @@ -62,7 +58,7 @@ export const createBaseColumns = ( cell: NameCellRenderer, meta: { cellStyle: networkModificationTableStyles.columnCell.modificationName, - onEditNameCell, + onChange: onNameChange, }, minSize: 160, }, @@ -86,14 +82,10 @@ export const createBaseColumns = ( ]; export const createRootNetworksColumns = ( - rootNetworks: RootNetworkMetadata[], - currentRootNetworkUuid: string, - modificationsToExclude: ExcludedNetworkModifications[], - setModificationsToExclude: React.Dispatch> + rootNetworks: RootNetworkMetadata[] ): ColumnDef[] => { const tagMinSizes = rootNetworks.map((rootNetwork) => computeTagMinSize(rootNetwork.tag ?? '')); const sharedSize = Math.max(Math.min(...tagMinSizes), 56); - const currentRootNetworkTag = rootNetworks.find((item) => item.rootNetworkUuid === currentRootNetworkUuid)?.tag; return rootNetworks.map((rootNetwork, index) => ({ id: rootNetwork.rootNetworkUuid, @@ -103,11 +95,6 @@ export const createRootNetworksColumns = ( minSize: tagMinSizes[index], meta: { cellStyle: networkModificationTableStyles.columnCell.rootNetworkChip, - rootNetwork, - modificationsToExclude, - setModificationsToExclude, - isCurrentRootNetwork: rootNetwork.rootNetworkUuid === currentRootNetworkUuid, - currentRootNetworkTag, }, })); }; diff --git a/src/components/graph/menus/network-modifications/network-modification-table/renderers/cell-renderers.tsx b/src/components/graph/menus/network-modifications/network-modification-table/renderers/cell-renderers.tsx deleted file mode 100644 index abd1d3b2e8..0000000000 --- a/src/components/graph/menus/network-modifications/network-modification-table/renderers/cell-renderers.tsx +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Copyright (c) 2026, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -import { - ComposedModificationMetadata, - createRootNetworkChipCellSx, - DragHandleCell, - NameCell, - NetworkModificationEditorNameHeader, - networkModificationTableStyles, - SelectCell, - SelectHeaderCell, -} from '@gridsuite/commons-ui'; -import { CellContext, HeaderContext } from '@tanstack/react-table'; -import { Badge, Box, Tooltip } from '@mui/material'; -import { RemoveRedEye as RemoveRedEyeIcon } from '@mui/icons-material'; -import { FormattedMessage } from 'react-intl'; -import DescriptionCell from './description-cell'; -import SwitchCell from './switch-cell'; -import RootNetworkChipCell from './root-network-chip-cell'; - -/** - * Cell/header renderers must keep a stable reference across renders: react-table calls - * `flexRender(columnDef.cell, ctx)`, and when a renderer function is used as a component, - * a new function reference is treated as a different component type — which can - * unmount/remount the cell and reset its local state. - * - * But what matters is the *scope* the renderer is defined in, not whether it is inline or named. - * An inline arrow inside a module-scope constant (e.g. `BASE_COLUMNS`) is created once and is - * just as stable as a named component. The renderers below are hoisted because they are reused - * by `createRootNetworksColumns`, which is a factory called inside a hook — defining them inline - * there would produce a fresh reference on every call. - * - * Dynamic values are routed via react-table's `meta`: table-wide via `table.options.meta`, - * per-column via `column.columnDef.meta`. - */ - -type CCtx = CellContext; -type HCtx = HeaderContext; - -export function DragHandleRenderer({ table }: CCtx) { - return ; -} - -export function SelectHeaderRenderer({ table }: HCtx) { - return ; -} - -export function SelectCellRenderer({ row, table }: CCtx) { - return ; -} - -export function NameHeaderRenderer({ table }: HCtx) { - const meta = table.options.meta; - const nameHeaderProps = meta?.nameHeaderProps; - if (!nameHeaderProps) { - return null; - } - return ( - - ); -} - -export function NameCellRenderer({ row, column }: CCtx) { - return ; -} - -export function DescriptionCellRenderer({ row }: CCtx) { - return ; -} - -export function SwitchCellRenderer({ row }: CCtx) { - return ; -} - -export function RootNetworkHeaderRenderer({ column, table }: HCtx) { - const colMeta = column.columnDef.meta; - const tableMeta = table.options.meta; - if (!colMeta?.isCurrentRootNetwork || (tableMeta?.modificationsCount ?? 0) < 1) { - return null; - } - return ( - - } - > - - - - - - ); -} - -export function RootNetworkCellRenderer({ row, column }: CCtx) { - const meta = column.columnDef.meta; - if (!meta?.rootNetwork || !meta.modificationsToExclude || !meta.setModificationsToExclude) { - return null; - } - return ( - - - - ); -} diff --git a/src/components/graph/menus/network-modifications/network-modification-table/renderers/description-cell.tsx b/src/components/graph/menus/network-modifications/network-modification-table/renderers/description-cell.tsx deleted file mode 100644 index d0d06294f2..0000000000 --- a/src/components/graph/menus/network-modifications/network-modification-table/renderers/description-cell.tsx +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -import { - ComposedModificationMetadata, - createEditDescriptionStyle, - DescriptionModificationDialog, - EditNoteIcon, -} from '@gridsuite/commons-ui'; -import { FunctionComponent, useCallback, useState } from 'react'; -import { Tooltip } from '@mui/material'; -import { useSelector } from 'react-redux'; -import IconButton from '@mui/material/IconButton'; -import { useIsAnyNodeBuilding } from '../../../../../utils/is-any-node-building-hook'; -import { setModificationMetadata } from '../../../../../../services/study/network-modifications'; -import { AppState } from '../../../../../../redux/reducer.type'; -import { FormattedMessage } from 'react-intl'; - -const DescriptionCell: FunctionComponent<{ data: ComposedModificationMetadata }> = (props) => { - const { data } = props; - const studyUuid = useSelector((state: AppState) => state.studyUuid); - const currentNode = useSelector((state: AppState) => state.currentTreeNode); - const [isLoading, setIsLoading] = useState(false); - const isAnyNodeBuilding = useIsAnyNodeBuilding(); - const mapDataLoading = useSelector((state: AppState) => state.mapDataLoading); - const [openDescModificationDialog, setOpenDescModificationDialog] = useState(false); - - const modificationUuid = data?.uuid; - const description = data?.description; - const empty = !description; - - const updateModification = useCallback( - async (descriptionRecord: Record) => { - setIsLoading(true); - - return setModificationMetadata(studyUuid, currentNode?.id, modificationUuid, { - description: descriptionRecord.description, - type: data?.type, - }).finally(() => { - setIsLoading(false); - }); - }, - [studyUuid, currentNode?.id, modificationUuid, data?.type] - ); - - const handleDescDialogClose = useCallback(() => { - setOpenDescModificationDialog(false); - }, []); - - const handleModifyDescription = useCallback(() => { - setOpenDescModificationDialog(true); - }, []); - - return ( - <> - {openDescModificationDialog && modificationUuid && ( - - )} - } arrow enterDelay={250}> - - - - - - - - ); -}; - -export default DescriptionCell; diff --git a/src/components/graph/menus/network-modifications/network-modification-table/renderers/root-network-chip-cell.tsx b/src/components/graph/menus/network-modifications/network-modification-table/renderers/root-network-chip-cell.tsx deleted file mode 100644 index 17dab4d05a..0000000000 --- a/src/components/graph/menus/network-modifications/network-modification-table/renderers/root-network-chip-cell.tsx +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -import React, { useState, useCallback, useMemo, SetStateAction, FunctionComponent } from 'react'; -import { - ActivableChip, - ComposedModificationMetadata, - ExcludedNetworkModifications, - snackWithFallback, - useSnackMessage, -} from '@gridsuite/commons-ui'; -import { updateModificationStatusByRootNetwork } from 'services/study/network-modifications'; -import { useSelector } from 'react-redux'; -import { RootNetworkMetadata } from '../../network-modification-menu.type'; -import { useIsAnyNodeBuilding } from 'components/utils/is-any-node-building-hook'; -import type { UUID } from 'node:crypto'; -import { AppState } from '../../../../../../redux/reducer.type'; - -function getUpdatedExcludedModifications( - prev: ExcludedNetworkModifications[], - rootNetworkUuid: UUID, - modificationUuid: UUID, - updateStatus: (isExcluded: boolean) => void -): ExcludedNetworkModifications[] { - const exists = prev.some((item) => item.rootNetworkUuid === rootNetworkUuid); - - if (exists) { - return prev.map((modif) => { - if (modif.rootNetworkUuid !== rootNetworkUuid) { - return modif; - } - - const isExcluded = modif.modificationUuidsToExclude.includes(modificationUuid); - const newModificationUuidsToExclude = isExcluded - ? modif.modificationUuidsToExclude.filter((id) => id !== modificationUuid) - : [...modif.modificationUuidsToExclude, modificationUuid]; - - // If previously excluded, now it is activated (true), else deactivated (false) - updateStatus(isExcluded); - - return { - ...modif, - modificationUuidsToExclude: newModificationUuidsToExclude, - }; - }); - } else { - updateStatus(false); - return [ - ...prev, - { - rootNetworkUuid: rootNetworkUuid, - modificationUuidsToExclude: [modificationUuid], - }, - ]; - } -} - -interface RootNetworkChipCellRendererProps { - data?: ComposedModificationMetadata; - modificationsToExclude: ExcludedNetworkModifications[]; - setModificationsToExclude: React.Dispatch>; - rootNetwork: RootNetworkMetadata; -} - -const RootNetworkChipCell: FunctionComponent = ({ - data, - rootNetwork, - modificationsToExclude, - setModificationsToExclude, -}) => { - const studyUuid = useSelector((state: AppState) => state.studyUuid); - const currentNode = useSelector((state: AppState) => state.currentTreeNode); - const [isLoading, setIsLoading] = useState(false); - const isAnyNodeBuilding = useIsAnyNodeBuilding(); - const mapDataLoading = useSelector((state: AppState) => state.mapDataLoading); - - const { snackError } = useSnackMessage(); - const modificationUuid = data?.uuid; - const isModificationActivated = useMemo(() => { - if (!modificationUuid) { - return false; - } - if (rootNetwork.isCreating) { - return true; - } - - const excludedSet = new Set( - modificationsToExclude.find((item) => item.rootNetworkUuid === rootNetwork.rootNetworkUuid) - ?.modificationUuidsToExclude || [] - ); - - return !excludedSet.has(modificationUuid); - }, [modificationUuid, modificationsToExclude, rootNetwork.rootNetworkUuid, rootNetwork.isCreating]); - - const updateStatus = useCallback( - (newStatus: boolean) => { - if (!studyUuid || !modificationUuid || !currentNode) { - setIsLoading(false); - return; - } - - updateModificationStatusByRootNetwork( - studyUuid, - currentNode?.id, - rootNetwork.rootNetworkUuid, - modificationUuid, - newStatus - ) - .catch((error) => { - snackWithFallback(snackError, error, { headerId: 'modificationActivationByRootNetworkError' }); - }) - .finally(() => { - setIsLoading(false); - }); - }, - [studyUuid, modificationUuid, currentNode, rootNetwork, snackError] - ); - const handleModificationActivationByRootNetwork = useCallback(() => { - if (!modificationUuid) { - return; - } - - setIsLoading(true); - - setModificationsToExclude((prev) => - getUpdatedExcludedModifications(prev, rootNetwork.rootNetworkUuid, modificationUuid, updateStatus) - ); - }, [modificationUuid, rootNetwork.rootNetworkUuid, setModificationsToExclude, updateStatus]); - - return ( - - ); -}; - -export default RootNetworkChipCell; diff --git a/src/components/graph/menus/network-modifications/network-modification-table/renderers/switch-cell.tsx b/src/components/graph/menus/network-modifications/network-modification-table/renderers/switch-cell.tsx deleted file mode 100644 index f5cc3abdcf..0000000000 --- a/src/components/graph/menus/network-modifications/network-modification-table/renderers/switch-cell.tsx +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -import React, { FunctionComponent, useCallback, useEffect, useState } from 'react'; -import { Switch, Tooltip } from '@mui/material'; -import { ComposedModificationMetadata, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; -import { setModificationMetadata } from 'services/study/network-modifications'; -import { useSelector } from 'react-redux'; -import { FormattedMessage } from 'react-intl'; -import { useIsAnyNodeBuilding } from 'components/utils/is-any-node-building-hook'; -import { AppState } from '../../../../../../redux/reducer.type'; - -export interface SwitchCellRendererProps { - data: ComposedModificationMetadata; -} - -const SwitchCell: FunctionComponent = (props) => { - const { data } = props; - const studyUuid = useSelector((state: AppState) => state.studyUuid); - const currentNode = useSelector((state: AppState) => state.currentTreeNode); - const [isLoading, setIsLoading] = useState(false); - const isAnyNodeBuilding = useIsAnyNodeBuilding(); - const mapDataLoading = useSelector((state: AppState) => state.mapDataLoading); - - const { snackError } = useSnackMessage(); - - const modificationUuid = data?.uuid; - const [modificationActivated, setModificationActivated] = useState(data?.activated); - - // Re-sync the local checked state when the row data is refreshed (e.g. after a server notification). - useEffect(() => { - setModificationActivated(data?.activated); - }, [data?.activated]); - - const toggleModificationActive = useCallback( - (_event: React.ChangeEvent, checked: boolean) => { - if (!modificationUuid) { - return; - } - - setIsLoading(true); - setModificationActivated(checked); - - setModificationMetadata(studyUuid, currentNode?.id, modificationUuid, { - activated: checked, - type: data?.type, - }) - .catch((error) => { - setModificationActivated(data?.activated); // rollback - snackWithFallback(snackError, error, { headerId: 'networkModificationActivationError' }); - }) - .finally(() => { - setIsLoading(false); - }); - }, - [modificationUuid, studyUuid, currentNode?.id, data?.type, data?.activated, snackError] - ); - - return ( - } - arrow - enterDelay={250} - > - - - - - ); -}; - -export default SwitchCell; diff --git a/src/module-tanstack.d.ts b/src/module-tanstack.d.ts deleted file mode 100644 index f3c67bd573..0000000000 --- a/src/module-tanstack.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2026, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -import { Dispatch, RefObject, SetStateAction } from 'react'; -import { SxProps, Theme } from '@mui/material'; -import { ComposedModificationMetadata, ExcludedNetworkModifications, NameHeaderProps } from '@gridsuite/commons-ui'; -import { RootNetworkMetadata } from 'components/graph/menus/network-modifications/network-modification-menu.type'; - -declare module '@tanstack/react-table' { - // TableMeta = values shared by the whole table (same value across every cell). - // Read at runtime via `table.options.meta` from any cell/header renderer. - interface TableMeta { - lastClickedRowId: RefObject; - onRowSelected?: (selectedRows: TData[]) => void; - isRowDragDisabled?: boolean; - modificationsCount?: number; - nameHeaderProps?: NameHeaderProps; - } - - // ColumnMeta = values that differ from one column to another. - // Read at runtime via `column.columnDef.meta` (per-column). - // TData / TValue must match the original generic signature of ColumnMeta for the - // module-augmentation merge to apply. They aren't referenced in this body, hence the disable. - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface ColumnMeta { - cellStyle?: SxProps; - rootNetwork?: RootNetworkMetadata; - modificationsToExclude?: ExcludedNetworkModifications[]; - setModificationsToExclude?: Dispatch>; - isCurrentRootNetwork?: boolean; - currentRootNetworkTag?: string; - onEditNameCell?: (modification: ComposedModificationMetadata, newName?: string) => void; - } -} diff --git a/src/services/study/network-modifications.ts b/src/services/study/network-modifications.ts index 6c1f4ca870..de16655af7 100644 --- a/src/services/study/network-modifications.ts +++ b/src/services/study/network-modifications.ts @@ -25,17 +25,12 @@ import { EquipmentType, ExcludedNetworkModifications, ModificationByAssignmentDto, - ComposedModificationMetadata, GeneratorCreationDto, GeneratorModificationDto, ShuntCompensatorCreationDto, BatteryCreationDto, } from '@gridsuite/commons-ui'; -import { - getBaseNetworkModificationUrl, - getStudyUrlWithNodeUuid, - getStudyUrlWithNodeUuidAndRootNetworkUuid, -} from './index'; +import { getBaseNetworkModificationUrl, getStudyUrlWithNodeUuid } from './index'; import { BRANCH_SIDE, OPERATING_STATUS_ACTION } from '../../components/network/constants'; import type { UUID } from 'node:crypto'; import { @@ -144,46 +139,6 @@ export function stashModifications(studyUuid: UUID | null, nodeUuid: UUID | unde }); } -export function setModificationMetadata( - studyUuid: UUID | null, - nodeUuid: UUID | undefined, - modificationUuid: UUID | undefined, - metadata: Partial -): Promise { - const urlSearchParams = new URLSearchParams(); - urlSearchParams.append('uuids', String([modificationUuid])); - const modificationUpdateUrl = getNetworkModificationUrl(studyUuid, nodeUuid) + '?' + urlSearchParams.toString(); - return backendFetch(modificationUpdateUrl, { - method: 'PUT', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - body: JSON.stringify(metadata), - }); -} - -export function updateModificationStatusByRootNetwork( - studyUuid: UUID, - nodeUuid: UUID, - rootNetworkUuid: UUID, - modificationUuid: UUID, - activated: boolean -) { - const urlSearchParams = new URLSearchParams(); - urlSearchParams.append('activated', String(activated)); - urlSearchParams.append('uuids', String([modificationUuid])); - const modificationUpdateActiveUrl = - getStudyUrlWithNodeUuidAndRootNetworkUuid(studyUuid, nodeUuid, rootNetworkUuid) + - '/network-modifications' + - '?' + - urlSearchParams.toString(); - console.debug(modificationUpdateActiveUrl); - return backendFetch(modificationUpdateActiveUrl, { - method: 'PUT', - }); -} - export function restoreModifications(studyUuid: UUID | null, nodeUuid: UUID | undefined, modificationUuids: UUID[]) { const urlSearchParams = new URLSearchParams(); urlSearchParams.append('stashed', String(false)); diff --git a/src/translations/en.json b/src/translations/en.json index 99619bfd91..a5c82bfc0d 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1233,6 +1233,7 @@ "guidancePopUp.action": "Close editor", "generateNad": "Generate", "networkModificationActivationError": "An error occurred while enabling / disabling modification", + "networkModificationRenamingError": "An error occurred while renaming the modification", "AddAutomaton": "Add an automaton", "BusBarCountMustBeGreaterThanOrEqualToOne": "Number of busbars must be greater than or equal to 1", "SectionCountMustBeGreaterThanOrEqualToOne": "Number of sections must be greater than or equal to 1", diff --git a/src/translations/fr.json b/src/translations/fr.json index a07fdd1d5b..45933dfbdd 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -1231,6 +1231,7 @@ "guidancePopUp.action": "Fermer l'éditeur", "generateNad": "Générer", "networkModificationActivationError": "Une erreur est survenue lors de l'activation / désactivation de la modification", + "networkModificationRenamingError": "Une erreur est survenue lors du renommage de la modification", "AddAutomaton": "Ajouter un automate", "BusBarCountMustBeGreaterThanOrEqualToOne": "Un nombre de barres doit être supérieur ou égal à 1", "SectionCountMustBeGreaterThanOrEqualToOne": "Un nombre de sections doit être supérieur ou égal à 1",