From 3c6783727e5d28322d282f5358030bf161103550 Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Wed, 2 Mar 2022 09:21:09 +0100 Subject: [PATCH] =?UTF-8?q?feat(flow):=20=E2=9C=A8=20Edge=20menu=20on=20cl?= =?UTF-8?q?ick?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/shared/Graph/Edges/Edge.tsx | 59 ++++++++++++++++--- .../shared/Graph/Edges/EdgeMenu.tsx | 37 ++++++++++++ apps/builder/playwright/tests/editor.spec.ts | 5 ++ 3 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 apps/builder/components/shared/Graph/Edges/EdgeMenu.tsx diff --git a/apps/builder/components/shared/Graph/Edges/Edge.tsx b/apps/builder/components/shared/Graph/Edges/Edge.tsx index 87ebf4e60..dccd1afc3 100644 --- a/apps/builder/components/shared/Graph/Edges/Edge.tsx +++ b/apps/builder/components/shared/Graph/Edges/Edge.tsx @@ -7,6 +7,9 @@ import { getSourceEndpointId, } from 'services/graph' import { Edge as EdgeProps } from 'models' +import { Portal, useDisclosure } from '@chakra-ui/react' +import { useTypebot } from 'contexts/TypebotContext' +import { EdgeMenu } from './EdgeMenu' export type AnchorsPositionProps = { sourcePosition: Coordinates @@ -16,6 +19,7 @@ export type AnchorsPositionProps = { } export const Edge = ({ edge }: { edge: EdgeProps }) => { + const { deleteEdge } = useTypebot() const { previewingEdge, sourceEndpoints, @@ -23,7 +27,11 @@ export const Edge = ({ edge }: { edge: EdgeProps }) => { blocksCoordinates, graphOffsetY, } = useGraph() - const isPreviewing = previewingEdge?.id === edge.id + const [isMouseOver, setIsMouseOver] = useState(false) + const { isOpen, onOpen, onClose } = useDisclosure() + const [edgeMenuPosition, setEdgeMenuPosition] = useState({ x: 0, y: 0 }) + + const isPreviewing = isMouseOver || previewingEdge?.id === edge.id const sourceBlockCoordinates = blocksCoordinates && blocksCoordinates[edge.from.blockId] @@ -74,14 +82,47 @@ export const Edge = ({ edge }: { edge: EdgeProps }) => { sourceTop, ]) + const handleMouseEnter = () => setIsMouseOver(true) + + const handleMouseLeave = () => setIsMouseOver(false) + + const handleEdgeClick = (e: React.MouseEvent) => { + setEdgeMenuPosition({ x: e.clientX, y: e.clientY }) + onOpen() + } + + const handleDeleteEdge = () => deleteEdge(edge.id) + return ( - + <> + + + + + + ) } diff --git a/apps/builder/components/shared/Graph/Edges/EdgeMenu.tsx b/apps/builder/components/shared/Graph/Edges/EdgeMenu.tsx new file mode 100644 index 000000000..635531095 --- /dev/null +++ b/apps/builder/components/shared/Graph/Edges/EdgeMenu.tsx @@ -0,0 +1,37 @@ +import { Menu, MenuButton, MenuList, MenuItem } from '@chakra-ui/react' +import { TrashIcon } from 'assets/icons' +import React from 'react' + +type Props = { + isOpen: boolean + position: { x: number; y: number } + onDeleteEdge: () => void + onClose: () => void +} + +export const EdgeMenu = ({ + isOpen, + onClose, + position, + onDeleteEdge, +}: Props) => { + return ( + + + + } onClick={onDeleteEdge}> + Delete + + + + ) +} diff --git a/apps/builder/playwright/tests/editor.spec.ts b/apps/builder/playwright/tests/editor.spec.ts index 50ab8243c..1e4eac744 100644 --- a/apps/builder/playwright/tests/editor.spec.ts +++ b/apps/builder/playwright/tests/editor.spec.ts @@ -50,6 +50,11 @@ test.describe.parallel('Editor', () => { ) await expect(page.locator('[data-testid="edge"] >> nth=0')).toBeVisible() await expect(page.locator('[data-testid="edge"] >> nth=1')).toBeVisible() + + await page.click('[data-testid="clickable-edge"] >> nth=0', { force: true }) + await page.click('text=Delete') + const total = await page.locator('[data-testid="edge"]').count() + expect(total).toBe(1) }) test('Drag and drop steps and items should work', async ({ page }) => { const typebotId = generate()