diff --git a/src/components/graph/menus/create-node-menu.tsx b/src/components/graph/menus/create-node-menu.tsx index f46e7ba3f2..0a703e5088 100644 --- a/src/components/graph/menus/create-node-menu.tsx +++ b/src/components/graph/menus/create-node-menu.tsx @@ -12,8 +12,7 @@ import { useIsAnyNodeBuilding } from '../../utils/is-any-node-building-hook'; import { useSelector } from 'react-redux'; import ChildMenuItem from './create-child-menu-item'; import { CustomDialog } from '../../utils/custom-dialog'; -import { CustomNestedMenuItem, PARAM_DEVELOPER_MODE } from '@gridsuite/commons-ui'; -import { BUILD_STATUS } from '../../network/constants'; +import { CustomNestedMenuItem, PARAM_DEVELOPER_MODE, BuildStatus } from '@gridsuite/commons-ui'; import { type AppState, type NodeSelectionForCopy } from 'redux/reducer.type'; import type { UUID } from 'node:crypto'; import NetworkModificationTreeModel from '../network-modification-tree-model'; @@ -354,7 +353,7 @@ const CreateNodeMenu: React.FC = ({ id: 'buildNode', disabled: activeNode?.data?.globalBuildStatus?.startsWith('BUILT') || - activeNode?.data?.globalBuildStatus === BUILD_STATUS.BUILDING, + activeNode?.data?.globalBuildStatus === BuildStatus.BUILDING, }, UNBUILD_NODE: { onRoot: false, diff --git a/src/components/graph/menus/root-network/unbuild-all-nodes-button.tsx b/src/components/graph/menus/root-network/unbuild-all-nodes-button.tsx index b37c23e7e2..033f32ef23 100644 --- a/src/components/graph/menus/root-network/unbuild-all-nodes-button.tsx +++ b/src/components/graph/menus/root-network/unbuild-all-nodes-button.tsx @@ -4,7 +4,7 @@ * 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 { CancelButton, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; +import { CancelButton, snackWithFallback, useSnackMessage, BuildStatus } from '@gridsuite/commons-ui'; import { StopCircleOutlined } from '@mui/icons-material'; import { Button, @@ -22,7 +22,6 @@ import { useSelector } from 'react-redux'; import { AppState } from 'redux/reducer.type'; import { unbuildAllStudyNodes } from 'services/study/study'; import { NETWORK_MODIFICATION } from '../../../../utils/report/report.constant'; -import { BUILD_STATUS } from '../../../network/constants'; const styles = { button: { @@ -73,7 +72,7 @@ export const UnbuildAllNodesButton = () => { .filter((treeNode) => treeNode.type === NETWORK_MODIFICATION) .every( (treeNode) => - treeNode.data.globalBuildStatus === BUILD_STATUS.NOT_BUILT || + treeNode.data.globalBuildStatus === BuildStatus.NOT_BUILT || treeNode.data.globalBuildStatus === undefined ); }, [treeModel]); diff --git a/src/components/graph/network-modification-tree-model.ts b/src/components/graph/network-modification-tree-model.ts index 77aaa37463..855c2a0c06 100644 --- a/src/components/graph/network-modification-tree-model.ts +++ b/src/components/graph/network-modification-tree-model.ts @@ -6,7 +6,7 @@ */ import { convertNodetoReactFlowModelNode, getModificationNodeDataOrUndefined } from './util/model-functions'; -import { BUILD_STATUS } from '../network/constants'; +import { BuildStatus } from '@gridsuite/commons-ui'; import type { UUID } from 'node:crypto'; import { Edge } from '@xyflow/react'; import { AbstractNode, CurrentTreeNode, NetworkModificationNodeData, RootNodeData } from './tree-node.type'; @@ -273,6 +273,6 @@ export default class NetworkModificationTreeModel { setBuildingStatus() { this.isAnyNodeBuilding = - this.treeNodes.find((node) => node?.data?.globalBuildStatus === BUILD_STATUS.BUILDING) !== undefined; + this.treeNodes.find((node) => node?.data?.globalBuildStatus === BuildStatus.BUILDING) !== undefined; } } diff --git a/src/components/graph/nodes/build-button.tsx b/src/components/graph/nodes/build-button.tsx index c5af50b4e3..402310d257 100644 --- a/src/components/graph/nodes/build-button.tsx +++ b/src/components/graph/nodes/build-button.tsx @@ -5,16 +5,15 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { BUILD_STATUS } from 'components/network/constants'; import React, { useCallback, useState } from 'react'; import { PlayCircleFilled, StopCircleOutlined } from '@mui/icons-material'; import { Button, CircularProgress } from '@mui/material'; import { buildNode, unbuildNode } from '../../../services/study'; import type { UUID } from 'node:crypto'; -import { type MuiStyles, snackWithFallback, useSnackMessage } from '@gridsuite/commons-ui'; +import { type MuiStyles, snackWithFallback, BuildStatus, useSnackMessage } from '@gridsuite/commons-ui'; type BuildButtonProps = { - buildStatus?: BUILD_STATUS; + buildStatus?: BuildStatus; studyUuid: UUID | null; currentRootNetworkUuid: UUID | null; nodeUuid: UUID; @@ -50,7 +49,7 @@ export const BuildButton = ({ setIsLoading(true); - if (!buildStatus || buildStatus === BUILD_STATUS.NOT_BUILT) { + if (!buildStatus || buildStatus === BuildStatus.NOT_BUILT) { buildNode(studyUuid, nodeUuid, currentRootNetworkUuid) .catch((error) => snackWithFallback(snackError, error, { headerId: 'NodeBuildingError' })) .finally(() => { @@ -73,7 +72,7 @@ export const BuildButton = ({ if (isLoading) { return ; } - return !buildStatus || buildStatus === BUILD_STATUS.NOT_BUILT ? ( + return !buildStatus || buildStatus === BuildStatus.NOT_BUILT ? ( ) : ( diff --git a/src/components/graph/nodes/build-status-chip.tsx b/src/components/graph/nodes/build-status-chip.tsx deleted file mode 100644 index ed2beca07b..0000000000 --- a/src/components/graph/nodes/build-status-chip.tsx +++ /dev/null @@ -1,79 +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, { ReactElement } from 'react'; -import { Chip } from '@mui/material'; -import { useIntl } from 'react-intl'; -import { BUILD_STATUS } from 'components/network/constants'; -import { mergeSx, type SxStyle } from '@gridsuite/commons-ui'; - -function getBuildStatusSx(buildStatus: BUILD_STATUS | undefined): SxStyle { - return (theme) => { - const bs = theme.node.buildStatus; - // pick background based on status - let bg: string; - - switch (buildStatus) { - case BUILD_STATUS.BUILT: - bg = bs.success; - break; - case BUILD_STATUS.BUILT_WITH_WARNING: - bg = bs.warning; - break; - case BUILD_STATUS.BUILT_WITH_ERROR: - bg = bs.error; - break; - default: - bg = bs.notBuilt; - break; - } - - // only set explicit contrast color when it's the "notBuilt" background - const shouldSetContrast = bg === bs.notBuilt; - - return { - background: bg, - ...(shouldSetContrast ? { color: theme.palette.getContrastText(bg) } : {}), - '&:hover': { - backgroundColor: bg, - }, - }; - }; -} - -const baseStyle: SxStyle = (theme) => - ({ - padding: theme.spacing(1, 0.5), - fontSize: '12px', - fontWeight: 400, - lineHeight: '100%', - }) as const; - -type BuildStatusChipProps = { - buildStatus?: BUILD_STATUS; - sx?: SxStyle; - icon?: ReactElement; - onClick?: (e: React.MouseEvent) => void; -}; - -const BuildStatusChip = ({ buildStatus = BUILD_STATUS.NOT_BUILT, sx, icon, onClick }: BuildStatusChipProps) => { - const intl = useIntl(); - - const label = intl.formatMessage({ id: buildStatus }); - - return ( - - ); -}; - -export default BuildStatusChip; diff --git a/src/components/graph/nodes/network-modification-node.tsx b/src/components/graph/nodes/network-modification-node.tsx index 81cec9ddbd..bb1b83d31f 100644 --- a/src/components/graph/nodes/network-modification-node.tsx +++ b/src/components/graph/nodes/network-modification-node.tsx @@ -9,16 +9,21 @@ import { NodeProps, Position } from '@xyflow/react'; import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; import { useSelector } from 'react-redux'; import Box from '@mui/material/Box'; -import { copyToClipboard, LIGHT_THEME, type MuiStyles, useSnackMessage } from '@gridsuite/commons-ui'; +import { + copyToClipboard, + LIGHT_THEME, + type MuiStyles, + useSnackMessage, + BuildStatusChip, + BuildStatus, +} from '@gridsuite/commons-ui'; import { getLocalStorageTheme } from '../../../redux/session-storage/local-storage'; -import { BUILD_STATUS } from '../../network/constants'; import { AppState } from 'redux/reducer.type'; import { CopyType } from 'components/network-modification.type'; import { ModificationNode } from '../tree-node.type'; import NodeHandle from './node-handle'; import { baseNodeStyles, interactiveNodeStyles } from './styles'; import NodeOverlaySpinner from './node-overlay-spinner'; -import BuildStatusChip from './build-status-chip'; import { BuildButton } from './build-button'; import { Tooltip, Typography } from '@mui/material'; @@ -189,13 +194,13 @@ const NetworkModificationNode = (props: NodeProps) => { - {props.data.globalBuildStatus !== BUILD_STATUS.BUILDING && ( + {props.data.globalBuildStatus !== BuildStatus.BUILDING && ( )} - {props.data.localBuildStatus !== BUILD_STATUS.BUILDING && ( + {props.data.localBuildStatus !== BuildStatus.BUILDING && ( ) => { )} - {props.data.localBuildStatus === BUILD_STATUS.BUILDING && } + {props.data.localBuildStatus === BuildStatus.BUILDING && } diff --git a/src/components/graph/tree-node.type.ts b/src/components/graph/tree-node.type.ts index c3245fdafb..570d7d6283 100644 --- a/src/components/graph/tree-node.type.ts +++ b/src/components/graph/tree-node.type.ts @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import type { UUID } from 'node:crypto'; -import { BUILD_STATUS } from '../network/constants'; +import { BuildStatus } from '@gridsuite/commons-ui'; import { Node } from '@xyflow/react'; export enum NodeType { @@ -40,8 +40,8 @@ export type StashedNodeProperties = { }; export interface NodeBuildStatus { - globalBuildStatus: BUILD_STATUS; - localBuildStatus: BUILD_STATUS; + globalBuildStatus: BuildStatus; + localBuildStatus: BuildStatus; } export type RootNodeData = AbstractNode & { @@ -67,12 +67,12 @@ export type NetworkModificationNodeData = AbstractNode & { export type NodeCommonData = { label: string; - globalBuildStatus?: BUILD_STATUS; + globalBuildStatus?: BuildStatus; description?: string; readOnly?: boolean; nodeType?: NetworkModificationNodeType; }; -export type ReactFlowModificationNodeData = NodeCommonData & { localBuildStatus?: BUILD_STATUS }; +export type ReactFlowModificationNodeData = NodeCommonData & { localBuildStatus?: BuildStatus }; export type ModificationNode = Node & { id: UUID; diff --git a/src/components/graph/util/model-functions.ts b/src/components/graph/util/model-functions.ts index ba535c6ae8..a6bda0f57b 100644 --- a/src/components/graph/util/model-functions.ts +++ b/src/components/graph/util/model-functions.ts @@ -6,7 +6,7 @@ */ import type { UUID } from 'node:crypto'; -import { BUILD_STATUS } from '../../network/constants'; +import { BuildStatus } from '@gridsuite/commons-ui'; import type NetworkModificationTreeModel from '../network-modification-tree-model'; import { CurrentTreeNode, @@ -121,7 +121,7 @@ export function isNodeReadOnly(node: CurrentTreeNode | null) { return node?.data?.readOnly ? true : false; // ternary operator because of potential undefined } -export function isStatusBuilt(status: BUILD_STATUS | undefined) { +export function isStatusBuilt(status: BuildStatus | undefined) { return status?.startsWith('BUILT'); } diff --git a/src/components/network-modification-tree-pane.jsx b/src/components/network-modification-tree-pane.jsx index d1c8f931e3..f4bf806628 100644 --- a/src/components/network-modification-tree-pane.jsx +++ b/src/components/network-modification-tree-pane.jsx @@ -30,9 +30,9 @@ import { snackWithFallback, useNotificationsListener, useSnackMessage, + BuildStatus, } from '@gridsuite/commons-ui'; import { ExportNetworkDialog } from './dialogs/export-network/export-network-dialog'; -import { BUILD_STATUS } from './network/constants'; import { copySubtree, copyTreeNode, @@ -261,8 +261,8 @@ export const NetworkModificationTreePane = ({ studyUuid, currentRootNetworkUuid createTreeNode(studyUuid, element.id, insertMode, { name: response, type: type, - localBuildStatus: BUILD_STATUS.NOT_BUILT, - globalBuildStatus: BUILD_STATUS.NOT_BUILT, + localBuildStatus: BuildStatus.NOT_BUILT, + globalBuildStatus: BuildStatus.NOT_BUILT, nodeType: networkModificationNodeType, }).catch((error) => { snackWithFallback(snackError, error, { headerId: 'NodeCreateError' }); diff --git a/src/components/network/constants.ts b/src/components/network/constants.ts index 3049ccdaa5..7459b70192 100644 --- a/src/components/network/constants.ts +++ b/src/components/network/constants.ts @@ -129,14 +129,6 @@ export const VARIATION_TYPES = { TARGET_P: { id: 'TARGET_P', label: 'TargetPText' }, } as const; -export enum BUILD_STATUS { - NOT_BUILT = 'NOT_BUILT', - BUILDING = 'BUILDING', - BUILT = 'BUILT', - BUILT_WITH_WARNING = 'BUILT_WITH_WARNING', - BUILT_WITH_ERROR = 'BUILT_WITH_ERROR', -} - export const SWITCH_TYPE = { BREAKER: { id: 'BREAKER', label: 'Breaker' }, DISCONNECTOR: { id: 'DISCONNECTOR', label: 'Disconnector' }, diff --git a/src/components/parameters-tabs.tsx b/src/components/parameters-tabs.tsx index 7eb630152b..be5ec129c6 100644 --- a/src/components/parameters-tabs.tsx +++ b/src/components/parameters-tabs.tsx @@ -49,6 +49,7 @@ import { VoltageInitParametersInLine, DynamicSecurityAnalysisInline, fetchDynamicSecurityAnalysisProviders, + BuildStatus, } from '@gridsuite/commons-ui'; import { useParametersNotification } from './dialogs/parameters/use-parameters-notification'; import { useGetVoltageInitParameters } from './dialogs/parameters/use-get-voltage-init-parameters'; @@ -67,7 +68,6 @@ import { fetchDynamicSecurityAnalysisParameters, updateDynamicSecurityAnalysisParameters, } from '../services/study/dynamic-security-analysis'; -import { BUILD_STATUS } from './network/constants'; enum TAB_VALUES { lfParamsTabValue = 'LOAD_FLOW', @@ -88,6 +88,7 @@ const ParametersTabs: FunctionComponent = () => { const attemptedLeaveParametersTabIndex = useSelector((state: AppState) => state.attemptedLeaveParametersTabIndex); const user = useSelector((state: AppState) => state.user); const studyUuid = useSelector((state: AppState) => state.studyUuid); + const currentNode = useSelector((state: AppState) => state.currentTreeNode ?? null); const currentNodeUuid = useSelector((state: AppState) => state.currentTreeNode?.id ?? null); const currentNodeBuildStatus = useSelector((state: AppState) => state.currentTreeNode?.data.globalBuildStatus); const currentRootNetworkUuid = useSelector((state: AppState) => state.currentRootNetworkUuid); @@ -315,8 +316,8 @@ const ParametersTabs: FunctionComponent = () => { parametersBackend={securityAnalysisParametersBackend} fetchContingencyCount={fetchContingencyCountBackend} isBuiltCurrentNode={ - currentNodeBuildStatus !== BUILD_STATUS.NOT_BUILT && - currentNodeBuildStatus !== BUILD_STATUS.BUILDING + currentNodeBuildStatus !== BuildStatus.NOT_BUILT && + currentNodeBuildStatus !== BuildStatus.BUILDING } setHaveDirtyFields={setDirtyFields} isDeveloperMode={isDeveloperMode} @@ -330,6 +331,7 @@ const ParametersTabs: FunctionComponent = () => { currentRootNetworkUuid={currentRootNetworkUuid} parametersBackend={sensitivityAnalysisBackend} setHaveDirtyFields={setDirtyFields} + globalBuildStatus={currentNode?.data?.globalBuildStatus} isDeveloperMode={isDeveloperMode} /> ); @@ -394,6 +396,7 @@ const ParametersTabs: FunctionComponent = () => { ); } }, [ + currentNode, tabValue, studyUuid, languageLocal, diff --git a/src/components/results/common/computation-report-viewer.tsx b/src/components/results/common/computation-report-viewer.tsx index 10e83e8881..6a15d65eaa 100644 --- a/src/components/results/common/computation-report-viewer.tsx +++ b/src/components/results/common/computation-report-viewer.tsx @@ -9,11 +9,10 @@ import { FunctionComponent, useEffect, useMemo, useState } from 'react'; import ReportViewer from '../../report-viewer/report-viewer'; import { useSelector } from 'react-redux'; import { AppState } from '../../../redux/reducer.type'; -import { ComputingType } from '@gridsuite/commons-ui'; +import { ComputingType, BuildStatus } from '@gridsuite/commons-ui'; import WaitingLoader from '../../utils/waiting-loader'; import { useReportFetcher } from '../../../hooks/use-report-fetcher'; import { Report, SeverityLevel } from '../../../utils/report/report.type'; -import { BUILD_STATUS } from 'components/network/constants'; import { sortSeverityList } from 'utils/report/report-severity'; interface ComputationReportViewerProps { @@ -27,7 +26,7 @@ export const ComputationReportViewer: FunctionComponent state.currentTreeNode); const [isReportLoading, fetchReport, fetchReportSeverities] = useReportFetcher(reportType); const shouldFetchReport = useMemo( - () => studyUuid && currentNode?.id && currentNode?.data?.globalBuildStatus !== BUILD_STATUS.NOT_BUILT, + () => studyUuid && currentNode?.id && currentNode?.data?.globalBuildStatus !== BuildStatus.NOT_BUILT, [studyUuid, currentNode] ); diff --git a/src/components/study-container.jsx b/src/components/study-container.jsx index d56a354bdf..1d470f8a62 100644 --- a/src/components/study-container.jsx +++ b/src/components/study-container.jsx @@ -36,10 +36,10 @@ import { useIntlRef, useNotificationsListener, useSnackMessage, + BuildStatus, } from '@gridsuite/commons-ui'; import NetworkModificationTreeModel from './graph/network-modification-tree-model'; import { getFirstNodeOfType } from './graph/util/model-functions'; -import { BUILD_STATUS } from './network/constants'; import { useAllComputingStatus } from './computing-status/use-all-computing-status'; import { fetchNetworkModificationTree, fetchNetworkModificationTreeNode } from '../services/study/tree-subtree'; import { fetchNetworkExistence, fetchRootNetworkIndexationStatus } from '../services/study/network'; @@ -337,9 +337,9 @@ export function StudyContainer() { if (initIndexationStatus === RootNetworkIndexationStatus.INDEXED) { firstSelectedNode = getFirstNodeOfType(tree, NodeType.NETWORK_MODIFICATION, [ - BUILD_STATUS.BUILT, - BUILD_STATUS.BUILT_WITH_WARNING, - BUILD_STATUS.BUILT_WITH_ERROR, + BuildStatus.BUILT, + BuildStatus.BUILT_WITH_WARNING, + BuildStatus.BUILT_WITH_ERROR, ]) || firstSelectedNode; } diff --git a/src/services/study/tree-subtree.ts b/src/services/study/tree-subtree.ts index c71e92cf64..736325d59a 100644 --- a/src/services/study/tree-subtree.ts +++ b/src/services/study/tree-subtree.ts @@ -6,17 +6,16 @@ */ import { getStudyUrl } from './index'; -import { backendFetch, backendFetchJson } from '@gridsuite/commons-ui'; +import { backendFetch, backendFetchJson, BuildStatus } from '@gridsuite/commons-ui'; import type { UUID } from 'node:crypto'; import { AbstractNode, NodeType, StashedNodeProperties } from '../../components/graph/tree-node.type'; -import { BUILD_STATUS } from '../../components/network/constants'; import { NodeInsertModes } from 'types/notification-types'; interface Node { name: string; type: NodeType; - localBuildStatus: BUILD_STATUS; - globalBuildStatus: BUILD_STATUS; + localBuildStatus: BuildStatus; + globalBuildStatus: BuildStatus; } export function copySubtree( sourceStudyUuid: UUID, diff --git a/src/translations/en.json b/src/translations/en.json index 479a8267ff..0f1a6e5f70 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1613,11 +1613,6 @@ "voltage-level": "voltage level", "substation": "substation", "notValidVoltageLevel": "Invalid voltage level to add busbar section. Please re-create the voltage level.", - "BUILT": "Built", - "BUILT_WITH_WARNING": "Warnings", - "BUILT_WITH_ERROR": "Errors", - "NOT_BUILT": "Not built", - "BUILDING": "Building", "allBusbarSections": "All", "allOptionHelperText": "Busbars have different sections (number or index)", "enableNavigationSync": "Enable multi-tab tree navigation", diff --git a/src/translations/fr.json b/src/translations/fr.json index e0507aa25d..03cf877253 100644 --- a/src/translations/fr.json +++ b/src/translations/fr.json @@ -1608,11 +1608,6 @@ "voltage-level": "poste", "substation": "site", "notValidVoltageLevel": "Poste invalide pour l'ajout de section/tronçon. Veuillez re-créer le poste.", - "BUILT": "Réalisé", - "BUILT_WITH_WARNING": "Alertes", - "BUILT_WITH_ERROR": "Erreurs", - "NOT_BUILT": "Non réalisé", - "BUILDING": "En cours de réalisation", "allBusbarSections": "Tous", "allOptionHelperText": "Tous les jeux de barres n'ont pas les memes sections (index et nombre)", "enableNavigationSync": "Activer la navigation dans l'arbre en multi-onglets",