Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Right click context menu #800

Merged
merged 31 commits into from
Oct 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
2bccd55
feat: Copy and paste cards
nesadrian Sep 6, 2024
a64a9ff
Merge branch 'main' into 789-copy-and-paste-cards
nesadrian Sep 6, 2024
15af0f2
Merge branch 'main' into 789-copy-and-paste-cards
nesadrian Sep 9, 2024
4cb04bb
fix: Add missing import
nesadrian Sep 9, 2024
dda80af
feat: Right click menu
nesadrian Sep 12, 2024
fe8a5e5
refactor: Use _ for unused parameter
nesadrian Sep 12, 2024
51aed10
feat: Copy and paste error snackmessage
nesadrian Sep 12, 2024
784c8c6
fix: Copy paste target area
nesadrian Sep 12, 2024
78c0343
refactor Copy paste target typing
nesadrian Sep 12, 2024
cdd0f17
Merge branch 'main' into 789-copy-and-paste-cards
nesadrian Sep 12, 2024
f7a8fdd
fix: Menu text and icon spacing
nesadrian Sep 12, 2024
60f10e3
feat: Manu element for node options
nesadrian Sep 13, 2024
78d66cc
feat: Menu add node API call
nesadrian Sep 13, 2024
71de790
Merge branch '789-copy-and-paste-cards' into 799-right-click-menu
nesadrian Sep 13, 2024
5e62b66
fix: Menu expand direction issue
nesadrian Sep 14, 2024
152c451
Merge branch 'main' into 799-right-click-menu
nesadrian Sep 16, 2024
d56741a
refactor: Code review feedback
nesadrian Sep 26, 2024
f9d92b1
refactor: Improved optionmatrix typing
nesadrian Sep 27, 2024
18dc87a
Merge branch 'main' into 799-right-click-menu
nesadrian Sep 30, 2024
8440d04
refactor: Remove unused node type
nesadrian Sep 30, 2024
a436c52
fix: Check copy and delete node validity
nesadrian Sep 30, 2024
8f5beda
fix: Enable copy paste while contextmenu is open
nesadrian Sep 30, 2024
1634d33
Merge branch 'main' into 799-right-click-menu
nesadrian Sep 30, 2024
937c4ef
fix: Main activity copy paste
nesadrian Oct 7, 2024
9365a85
fix: Include children when deleting main and choice
nesadrian Oct 7, 2024
3e79a2c
fix: Close context menu on drag
nesadrian Oct 7, 2024
c7c1030
Merge branch '799-right-click-menu' of github.com:equinor/MAD-VSM-WEB…
nesadrian Oct 7, 2024
87b9dc7
Merge branch 'main' into 799-right-click-menu
nesadrian Oct 11, 2024
eb09cbc
fix: Duplicate to left and right
nesadrian Oct 11, 2024
4f059cf
fix: Temporarily disable left button for choice children
nesadrian Oct 11, 2024
61d5f2a
refactor: Add TODO
nesadrian Oct 11, 2024
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
16 changes: 6 additions & 10 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,25 @@

dansvend marked this conversation as resolved.
Show resolved Hide resolved
## [2.6.0](https://github.com/equinor/flyt/compare/v2.5.0...v2.6.0) (2024-09-11)


### Features

* infinite scroll ([#788](https://github.com/equinor/flyt/issues/788)) ([ac85041](https://github.com/equinor/flyt/commit/ac850415f47c6922fafc0c8327079ed8a86c7922))
* Main activity duration summary ([#768](https://github.com/equinor/flyt/issues/768)) ([2195660](https://github.com/equinor/flyt/commit/21956608bb28fec0c4f85b958aa848ea2ad2b84e))

- infinite scroll ([#788](https://github.com/equinor/flyt/issues/788)) ([ac85041](https://github.com/equinor/flyt/commit/ac850415f47c6922fafc0c8327079ed8a86c7922))
- Main activity duration summary ([#768](https://github.com/equinor/flyt/issues/768)) ([2195660](https://github.com/equinor/flyt/commit/21956608bb28fec0c4f85b958aa848ea2ad2b84e))

### Bug Fixes

* Upgrade dependencies ([#796](https://github.com/equinor/flyt/issues/796)) ([494d1e7](https://github.com/equinor/flyt/commit/494d1e7fd7ec534d70b4ade0bef34f5cae029b3c))
- Upgrade dependencies ([#796](https://github.com/equinor/flyt/issues/796)) ([494d1e7](https://github.com/equinor/flyt/commit/494d1e7fd7ec534d70b4ade0bef34f5cae029b3c))

## [2.5.0](https://github.com/equinor/flyt/compare/v2.4.0...v2.5.0) (2024-08-28)


### Features

* Full name of users ([#778](https://github.com/equinor/flyt/issues/778)) ([2523e98](https://github.com/equinor/flyt/commit/2523e9829d6ad192400b641818901f2df3458e04))

- Full name of users ([#778](https://github.com/equinor/flyt/issues/778)) ([2523e98](https://github.com/equinor/flyt/commit/2523e9829d6ad192400b641818901f2df3458e04))

### Bug Fixes

* Disable spamming of add card buttons ([#784](https://github.com/equinor/flyt/issues/784)) ([668f1fa](https://github.com/equinor/flyt/commit/668f1fa802d925f62f0ee942b72240c0f6a7d89b))
* display AxiosError message ([#774](https://github.com/equinor/flyt/issues/774)) ([76033a0](https://github.com/equinor/flyt/commit/76033a0e02572d190290b3ac52851582dd0faef9))
- Disable spamming of add card buttons ([#784](https://github.com/equinor/flyt/issues/784)) ([668f1fa](https://github.com/equinor/flyt/commit/668f1fa802d925f62f0ee942b72240c0f6a7d89b))
- display AxiosError message ([#774](https://github.com/equinor/flyt/issues/774)) ([76033a0](https://github.com/equinor/flyt/commit/76033a0e02572d190290b3ac52851582dd0faef9))

## [2.4.0](https://github.com/equinor/flyt/compare/v2.3.0...v2.4.0) (2024-08-06)

Expand Down
9 changes: 5 additions & 4 deletions components/DeleteNodeDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { ScrimDelete } from "./ScrimDelete";
export function DeleteNodeDialog(props: {
objectToDelete: NodeData;
onClose: () => void;
visible: boolean;
}) {
const { accounts } = useMsal();
const account = useAccount(accounts[0] || {});
Expand Down Expand Up @@ -44,8 +43,6 @@ export function DeleteNodeDialog(props: {
}
);

if (!props.visible) return null;

const handleClose = () => props.onClose();
const handleDelete = (includeChildren: boolean) =>
deleteMutation.mutate({
Expand Down Expand Up @@ -84,7 +81,11 @@ export function DeleteNodeDialog(props: {
open
header={header}
onClose={handleClose}
onConfirm={(_, includeChildren) => handleDelete(includeChildren)}
onConfirm={(_, includeChildren) =>
handleDelete(
type === mainActivity || type === choice || includeChildren
)
}
error={deleteMutation.error}
warningMessage={warningMessage}
confirmMessage={confirmMessage}
Expand Down
2 changes: 1 addition & 1 deletion components/Labels/ActiveFilterSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Button, Chip } from "@equinor/eds-core-react";
import { getLabel } from "services/labelsApi";
import { getUpdatedLabel } from "utils/getUpdatedLabel";
import { getUserById } from "services/userApi";
import { stringToArray } from "utils/stringToArray";
import { stringToArray } from "utils/stringHelpers";
import { toggleQueryParam } from "utils/toggleQueryParam";
import { unknownErrorToString } from "utils/isError";
import { useQuery } from "react-query";
Expand Down
45 changes: 45 additions & 0 deletions components/MenuItemExandable.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { Menu } from "@equinor/eds-core-react";
import { ReactElement, useState } from "react";
import ExpandArrow from "../public/expand_arrow_right.svg";
import styles from "./MenuItemExpandable.module.scss";

type MenuItemExandableProps = {
text: string;
reverseExpandDir?: boolean;
children: ReactElement | ReactElement[];
};

export const MenuItemExandable = ({
text,
reverseExpandDir,
children,
}: MenuItemExandableProps) => {
const [anchorEl, setAnchorEl] = useState<HTMLDivElement | null>(null);
const [isExpanded, setIsExpanded] = useState(false);

return (
<Menu.Item
ref={setAnchorEl}
onMouseEnter={() => setIsExpanded(true)}
onMouseLeave={() => setIsExpanded(false)}
>
<div>{text}</div>
<img
alt="right-arrow"
src={ExpandArrow.src}
className={styles.expandArrowContainer}
/>
<Menu
style={{
marginLeft: reverseExpandDir ? "4px" : "-4px",
}}
open={isExpanded}
anchorEl={anchorEl}
placement={reverseExpandDir ? "left-start" : "right-start"}
className={styles.menu}
>
{children}
</Menu>
</Menu.Item>
);
};
7 changes: 7 additions & 0 deletions components/MenuItemExpandable.module.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.menu > div {
padding: 0;
}

.expandArrowContainer {
margin-left: auto;
}
64 changes: 51 additions & 13 deletions components/canvas/Canvas.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { CanvasButtons } from "components/CanvasButtons";
import { ManageLabelBox } from "components/Labels/ManageLabelBox";
import { ResetProcessButton } from "components/ResetProcessButton";
import { useLayoutEffect, useState } from "react";
import { useEffect, useLayoutEffect, useRef, useState } from "react";
import ReactFlow, {
ControlButton,
Controls,
Expand Down Expand Up @@ -43,6 +43,9 @@ import { useCopyPaste } from "./hooks/useCopyPaste";
import { copyPasteNodeValidator } from "./utils/copyPasteValidators";
import { validTarget } from "./utils/validTarget";
import { useNodeAdd } from "./hooks/useNodeAdd";
import { useContextMenu } from "./hooks/useContextMenu";
import { ContextMenu } from "./ContextMenu";
import { nodeValidityMap } from "./utils/nodeValidityHelper";

type CanvasProps = {
graph: Graph;
Expand All @@ -61,6 +64,7 @@ const Canvas = ({
);
const { userCanEdit } = useAccess(project);
const { addNode } = useNodeAdd();
const ref = useRef<HTMLDivElement>(null);

const shapeSize = { height: 140, width: 140 };

Expand All @@ -71,7 +75,9 @@ const Canvas = ({
const [nodes, setNodes, onNodesChange] = useNodesState<NodeDataFull>([]);
const [edges, setEdges, onEdgesChange] = useEdgesState([]);

const [visibleDeleteNodeScrim, setVisibleDeleteNodeScrim] = useState(false);
const [nodeToBeDeleted, setNodeToBeDeleted] = useState<
Node<NodeData> | undefined
>(undefined);
const [edgeToBeDeletedId, setEdgeToBeDeletedId] = useState<
string | undefined
>(undefined);
Expand All @@ -81,14 +87,24 @@ const Canvas = ({
const { onNodeDragStart, onNodeDrag, onNodeDragStop } = useNodeDrag();
const { mutate: mergeNode, merging } = useNodeMerge();
const { deleteEdgeMutation } = useEdgeDelete();
const { menuData, onNodeContextMenu, onPaneContextMenu, closeContextMenu } =
useContextMenu(ref);

useEffect(() => {
!menuData && setHoveredNode(undefined);
}, [menuData]);

const { socketConnected, socketReason } = useWebSocket();
useCopyPaste(
const { copyToClipboard, paste } = useCopyPaste(
hoveredNode,
(node: Node<NodeData>) =>
hoveredNode?.id &&
validTarget(node, hoveredNode, nodes, false) &&
addNode(hoveredNode.id, node.data, Position.Bottom),
addNode(
hoveredNode.id,
node.data,
node.type === NodeTypes.mainActivity ? Position.Right : Position.Bottom
),
copyPasteNodeValidator
);

Expand Down Expand Up @@ -143,6 +159,8 @@ const Canvas = ({
mergeable:
node.children.length === 0 || node.type === NodeTypes.choice,
merging: merging,
deletable: nodeValidityMap[node.type].deletable,
copyable: nodeValidityMap[node.type].copyable,
parents: [parent.id],
userCanEdit,
isChoiceChild: parent.type === NodeTypes.choice,
Expand All @@ -161,6 +179,8 @@ const Canvas = ({
id: node.id,
data: {
...node,
deletable: nodeValidityMap[node.type].deletable,
copyable: nodeValidityMap[node.type].copyable,
parents: [],
columnId: node.id,
shapeHeight: shapeSize.height,
Expand Down Expand Up @@ -276,7 +296,7 @@ const Canvas = ({
selectedNode && handleSetSelectedNode(selectedNode.id);
}, [apiNodes, apiEdges, userCanEdit]);

useCenterCanvas();
const { centerCanvas } = useCenterCanvas();

return (
<>
Expand All @@ -301,12 +321,11 @@ const Canvas = ({
/>
<ToBeToggle />
<ResetProcessButton />
{selectedNode && (
{nodeToBeDeleted && (
<DeleteNodeDialog
objectToDelete={selectedNode.data}
visible={visibleDeleteNodeScrim}
objectToDelete={nodeToBeDeleted.data}
onClose={() => {
setVisibleDeleteNodeScrim(false);
setNodeToBeDeleted(undefined);
setSelectedNode(undefined);
}}
/>
Expand Down Expand Up @@ -335,7 +354,7 @@ const Canvas = ({
)}
<SideBar
onClose={() => setSelectedNode(undefined)}
onDelete={() => setVisibleDeleteNodeScrim(true)}
onDelete={() => setNodeToBeDeleted(selectedNode)}
canEdit={userCanEdit}
selectedNode={selectedNode?.data}
/>
Expand All @@ -347,6 +366,7 @@ const Canvas = ({
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onPaneClick={() => setSelectedNode(undefined)}
onMoveStart={() => closeContextMenu()}
minZoom={0.2}
nodesDraggable={userCanEdit}
nodesConnectable={true}
Expand All @@ -356,20 +376,38 @@ const Canvas = ({
onNodeDragStop={onNodeDragStop}
elevateEdgesOnSelect={true}
edgesFocusable={userCanEdit}
onNodeMouseEnter={(_, node) => setHoveredNode(node)}
onNodeMouseLeave={() => setHoveredNode(undefined)}
onEdgeMouseEnter={(event, edge) => handleSetSelectedEdge(edge)}
onNodeMouseEnter={(_, node) => {
!menuData && setHoveredNode(node);
}}
onNodeMouseLeave={() => {
!menuData && setHoveredNode(undefined);
}}
onEdgeMouseEnter={(_, edge) => handleSetSelectedEdge(edge)}
onEdgeMouseLeave={() => handleSetSelectedEdge(undefined)}
attributionPosition="bottom-right"
connectionRadius={100}
nodeDragThreshold={15}
onNodeContextMenu={onNodeContextMenu}
onPaneContextMenu={onPaneContextMenu}
ref={ref}
>
<MiniMapCustom />
<Controls className={styles.controls} showInteractive={false}>
<ControlButton className={styles.zoomContainer}>
<ZoomLevel />
</ControlButton>
</Controls>
{menuData && (
<ContextMenu
menuData={menuData}
copyToClipBoard={copyToClipboard}
paste={paste}
centerCanvas={centerCanvas}
nesadrian marked this conversation as resolved.
Show resolved Hide resolved
onDelete={(node) => setNodeToBeDeleted(node)}
onEditNode={(node) => setSelectedNode(node)}
canvasRef={ref}
/>
)}
</ReactFlow>
</>
);
Expand Down
7 changes: 7 additions & 0 deletions components/canvas/ContextMenu.module.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.menu {
position: absolute;
}

.menu > div {
padding: 0;
}
Loading
Loading