Skip to content
Open
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
5 changes: 2 additions & 3 deletions src/components/graph/menus/create-node-menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@
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';

Check failure on line 15 in src/components/graph/menus/create-node-menu.tsx

View workflow job for this annotation

GitHub Actions / build / build

Module '"@gridsuite/commons-ui"' has no exported member 'BuildStatus'.
import { type AppState, type NodeSelectionForCopy } from 'redux/reducer.type';
import type { UUID } from 'node:crypto';
import NetworkModificationTreeModel from '../network-modification-tree-model';
Expand Down Expand Up @@ -354,7 +353,7 @@
id: 'buildNode',
disabled:
activeNode?.data?.globalBuildStatus?.startsWith('BUILT') ||
activeNode?.data?.globalBuildStatus === BUILD_STATUS.BUILDING,
activeNode?.data?.globalBuildStatus === BuildStatus.BUILDING,
},
UNBUILD_NODE: {
onRoot: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Check failure on line 7 in src/components/graph/menus/root-network/unbuild-all-nodes-button.tsx

View workflow job for this annotation

GitHub Actions / build / build

Module '"@gridsuite/commons-ui"' has no exported member 'BuildStatus'.
import { StopCircleOutlined } from '@mui/icons-material';
import {
Button,
Expand All @@ -22,7 +22,6 @@
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: {
Expand Down Expand Up @@ -73,7 +72,7 @@
.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]);
Expand Down
4 changes: 2 additions & 2 deletions src/components/graph/network-modification-tree-model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*/

import { convertNodetoReactFlowModelNode, getModificationNodeDataOrUndefined } from './util/model-functions';
import { BUILD_STATUS } from '../network/constants';
import { BuildStatus } from '@gridsuite/commons-ui';

Check failure on line 9 in src/components/graph/network-modification-tree-model.ts

View workflow job for this annotation

GitHub Actions / build / build

Module '"@gridsuite/commons-ui"' has no exported member 'BuildStatus'.
import type { UUID } from 'node:crypto';
import { Edge } from '@xyflow/react';
import { AbstractNode, CurrentTreeNode, NetworkModificationNodeData, RootNodeData } from './tree-node.type';
Expand Down Expand Up @@ -273,6 +273,6 @@

setBuildingStatus() {
this.isAnyNodeBuilding =
this.treeNodes.find((node) => node?.data?.globalBuildStatus === BUILD_STATUS.BUILDING) !== undefined;
this.treeNodes.find((node) => node?.data?.globalBuildStatus === BuildStatus.BUILDING) !== undefined;
}
}
9 changes: 4 additions & 5 deletions src/components/graph/nodes/build-button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Check failure on line 13 in src/components/graph/nodes/build-button.tsx

View workflow job for this annotation

GitHub Actions / build / build

Module '"@gridsuite/commons-ui"' has no exported member 'BuildStatus'.

type BuildButtonProps = {
buildStatus?: BUILD_STATUS;
buildStatus?: BuildStatus;
studyUuid: UUID | null;
currentRootNetworkUuid: UUID | null;
nodeUuid: UUID;
Expand Down Expand Up @@ -50,7 +49,7 @@

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(() => {
Expand All @@ -73,7 +72,7 @@
if (isLoading) {
return <CircularProgress size={24} color="primary" />;
}
return !buildStatus || buildStatus === BUILD_STATUS.NOT_BUILT ? (
return !buildStatus || buildStatus === BuildStatus.NOT_BUILT ? (
<PlayCircleFilled sx={styles.playColor} />
) : (
<StopCircleOutlined color="primary" />
Expand Down
79 changes: 0 additions & 79 deletions src/components/graph/nodes/build-status-chip.tsx

This file was deleted.

17 changes: 11 additions & 6 deletions src/components/graph/nodes/network-modification-node.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,21 @@
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,

Check failure on line 17 in src/components/graph/nodes/network-modification-node.tsx

View workflow job for this annotation

GitHub Actions / build / build

Module '"@gridsuite/commons-ui"' has no exported member 'BuildStatusChip'.
BuildStatus,

Check failure on line 18 in src/components/graph/nodes/network-modification-node.tsx

View workflow job for this annotation

GitHub Actions / build / build

Module '"@gridsuite/commons-ui"' has no exported member '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';
Expand Down Expand Up @@ -160,7 +165,7 @@
buildStatus={props.data.globalBuildStatus}
sx={styles.chipFloating}
icon={<ArrowUpwardIcon style={{ fontSize: '14px' }} color="inherit" />}
onClick={(e) => e.stopPropagation()}

Check failure on line 168 in src/components/graph/nodes/network-modification-node.tsx

View workflow job for this annotation

GitHub Actions / build / build

Parameter 'e' implicitly has an 'any' type.
/>
)}

Expand Down Expand Up @@ -189,13 +194,13 @@
</Box>

<Box sx={styles.footerBox}>
{props.data.globalBuildStatus !== BUILD_STATUS.BUILDING && (
{props.data.globalBuildStatus !== BuildStatus.BUILDING && (
<BuildStatusChip buildStatus={props.data.localBuildStatus} />
)}
</Box>

<Box sx={styles.buildBox}>
{props.data.localBuildStatus !== BUILD_STATUS.BUILDING && (
{props.data.localBuildStatus !== BuildStatus.BUILDING && (
<BuildButton
buildStatus={props.data.localBuildStatus}
studyUuid={studyUuid}
Expand All @@ -205,7 +210,7 @@
)}
</Box>

{props.data.localBuildStatus === BUILD_STATUS.BUILDING && <NodeOverlaySpinner />}
{props.data.localBuildStatus === BuildStatus.BUILDING && <NodeOverlaySpinner />}
</ForwardRefBox>
</Tooltip>
</>
Expand Down
10 changes: 5 additions & 5 deletions src/components/graph/tree-node.type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Check failure on line 8 in src/components/graph/tree-node.type.ts

View workflow job for this annotation

GitHub Actions / build / build

Module '"@gridsuite/commons-ui"' has no exported member 'BuildStatus'.
import { Node } from '@xyflow/react';

export enum NodeType {
Expand Down Expand Up @@ -40,8 +40,8 @@
};

export interface NodeBuildStatus {
globalBuildStatus: BUILD_STATUS;
localBuildStatus: BUILD_STATUS;
globalBuildStatus: BuildStatus;
localBuildStatus: BuildStatus;
}

export type RootNodeData = AbstractNode & {
Expand All @@ -67,12 +67,12 @@

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<ReactFlowModificationNodeData, NodeType.NETWORK_MODIFICATION> & {
id: UUID;
Expand Down
4 changes: 2 additions & 2 deletions src/components/graph/util/model-functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*/

import type { UUID } from 'node:crypto';
import { BUILD_STATUS } from '../../network/constants';
import { BuildStatus } from '@gridsuite/commons-ui';

Check failure on line 9 in src/components/graph/util/model-functions.ts

View workflow job for this annotation

GitHub Actions / build / build

Module '"@gridsuite/commons-ui"' has no exported member 'BuildStatus'.
import type NetworkModificationTreeModel from '../network-modification-tree-model';
import {
CurrentTreeNode,
Expand Down Expand Up @@ -121,7 +121,7 @@
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');
}

Expand Down
6 changes: 3 additions & 3 deletions src/components/network-modification-tree-pane.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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' });
Expand Down
8 changes: 0 additions & 8 deletions src/components/network/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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' },
Expand Down
9 changes: 6 additions & 3 deletions src/components/parameters-tabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
VoltageInitParametersInLine,
DynamicSecurityAnalysisInline,
fetchDynamicSecurityAnalysisProviders,
BuildStatus,

Check failure on line 52 in src/components/parameters-tabs.tsx

View workflow job for this annotation

GitHub Actions / build / build

Module '"@gridsuite/commons-ui"' has no exported member 'BuildStatus'.
} from '@gridsuite/commons-ui';
import { useParametersNotification } from './dialogs/parameters/use-parameters-notification';
import { useGetVoltageInitParameters } from './dialogs/parameters/use-get-voltage-init-parameters';
Expand All @@ -67,7 +68,6 @@
fetchDynamicSecurityAnalysisParameters,
updateDynamicSecurityAnalysisParameters,
} from '../services/study/dynamic-security-analysis';
import { BUILD_STATUS } from './network/constants';

enum TAB_VALUES {
lfParamsTabValue = 'LOAD_FLOW',
Expand All @@ -88,6 +88,7 @@
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);
Expand Down Expand Up @@ -315,8 +316,8 @@
parametersBackend={securityAnalysisParametersBackend}
fetchContingencyCount={fetchContingencyCountBackend}
isBuiltCurrentNode={
currentNodeBuildStatus !== BUILD_STATUS.NOT_BUILT &&
currentNodeBuildStatus !== BUILD_STATUS.BUILDING
currentNodeBuildStatus !== BuildStatus.NOT_BUILT &&
currentNodeBuildStatus !== BuildStatus.BUILDING
Comment on lines +319 to +320
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

isBuiltCurrentNode currently treats unknown status as built

Because globalBuildStatus is optional, undefined can reach this check and evaluates to true with the current negated comparisons. That can enable Security Analysis on nodes with unknown build state.

Proposed fix
                         isBuiltCurrentNode={
-                            currentNodeBuildStatus !== BuildStatus.NOT_BUILT &&
-                            currentNodeBuildStatus !== BuildStatus.BUILDING
+                            currentNodeBuildStatus != null &&
+                            currentNodeBuildStatus !== BuildStatus.NOT_BUILT &&
+                            currentNodeBuildStatus !== BuildStatus.BUILDING
                         }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
currentNodeBuildStatus !== BuildStatus.NOT_BUILT &&
currentNodeBuildStatus !== BuildStatus.BUILDING
currentNodeBuildStatus != null &&
currentNodeBuildStatus !== BuildStatus.NOT_BUILT &&
currentNodeBuildStatus !== BuildStatus.BUILDING
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/parameters-tabs.tsx` around lines 319 - 320, The current check
using negations allows undefined to be treated as "built"; update the
isBuiltCurrentNode logic to explicitly check for the built state(s) rather than
relying on !== comparisons. Replace the expression using currentNodeBuildStatus
!== BuildStatus.NOT_BUILT && currentNodeBuildStatus !== BuildStatus.BUILDING
with an explicit equality check (e.g., currentNodeBuildStatus ===
BuildStatus.BUILT or currentNodeBuildStatus === <other explicit built enum>) so
that undefined or unknown statuses evaluate to false; adjust any usage inside
ParametersTabs (or the isBuiltCurrentNode variable) accordingly.

}
setHaveDirtyFields={setDirtyFields}
isDeveloperMode={isDeveloperMode}
Expand All @@ -330,6 +331,7 @@
currentRootNetworkUuid={currentRootNetworkUuid}
parametersBackend={sensitivityAnalysisBackend}
setHaveDirtyFields={setDirtyFields}
globalBuildStatus={currentNode?.data?.globalBuildStatus}
isDeveloperMode={isDeveloperMode}
/>
);
Expand Down Expand Up @@ -394,6 +396,7 @@
);
}
}, [
currentNode,
tabValue,
studyUuid,
languageLocal,
Expand Down
5 changes: 2 additions & 3 deletions src/components/results/common/computation-report-viewer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -27,7 +26,7 @@ export const ComputationReportViewer: FunctionComponent<ComputationReportViewerP
const currentNode = useSelector((state: AppState) => 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]
);

Expand Down
Loading
Loading