From 8386c7af6ce90c46f9c5da81946592978ec50dfc Mon Sep 17 00:00:00 2001 From: moklick Date: Mon, 15 May 2023 10:56:21 +0200 Subject: [PATCH] refactor(node-toolbar): align prop --- .../src/examples/NodeToolbar/index.tsx | 59 +++++++-------- packages/node-toolbar/src/NodeToolbar.tsx | 72 ++++++++----------- 2 files changed, 52 insertions(+), 79 deletions(-) diff --git a/examples/vite-app/src/examples/NodeToolbar/index.tsx b/examples/vite-app/src/examples/NodeToolbar/index.tsx index 70d8e36e..b4d3d1c5 100644 --- a/examples/vite-app/src/examples/NodeToolbar/index.tsx +++ b/examples/vite-app/src/examples/NodeToolbar/index.tsx @@ -17,49 +17,38 @@ const nodeTypes: NodeTypes = { custom: CustomNode, }; +const positions = ['top', 'right', 'bottom', 'left']; +const alignments = ['start', 'center', 'end']; + const initialNodes: Node[] = [ - { - id: '1', - type: 'custom', - data: { label: 'toolbar top', toolbarPosition: Position.Top }, - position: { x: 0, y: 50 }, - className: 'react-flow__node-default', - }, - { - id: '2', - type: 'custom', - data: { label: 'toolbar right', toolbarPosition: Position.Right }, - position: { x: 300, y: 0 }, - className: 'react-flow__node-default', - }, - { - id: '3', - type: 'custom', - data: { label: 'toolbar bottom', toolbarPosition: Position.Bottom, toolbarAlign: 'end' }, - position: { x: 400, y: 100 }, - className: 'react-flow__node-default', - }, { id: '4', type: 'custom', - data: { label: 'toolbar left', toolbarPosition: Position.Left }, - position: { x: 400, y: 200 }, - className: 'react-flow__node-default', - }, - { - id: '5', - type: 'custom', - data: { label: 'toolbar always open', toolbarPosition: Position.Top, toolbarVisible: true }, - position: { x: 0, y: 200 }, + data: { label: 'toolbar top', toolbarPosition: Position.Top }, + position: { x: 0, y: -200 }, className: 'react-flow__node-default', }, ]; -const initialEdges: Edge[] = [ - { id: 'e1-2', source: '1', target: '2' }, - { id: 'e1-3', source: '1', target: '3' }, - { id: 'e1-4', source: '1', target: '4' }, -]; +positions.forEach((position, posIndex) => { + alignments.forEach((align, alignIndex) => { + const id = `node-${align}-${position}`; + initialNodes.push({ + id, + type: 'custom', + data: { + label: `toolbar ${position} ${align}`, + toolbarPosition: position as Position, + toolbarAlign: align, + toolbarVisible: true, + }, + className: 'react-flow__node-default', + position: { x: posIndex * 300, y: alignIndex * 100 }, + }); + }); +}); + +const initialEdges: Edge[] = []; const defaultEdgeOptions = { zIndex: 0 }; const nodeOrigin: NodeOrigin = [0.5, 0.5]; diff --git a/packages/node-toolbar/src/NodeToolbar.tsx b/packages/node-toolbar/src/NodeToolbar.tsx index 86ea993c..3b02b8bf 100644 --- a/packages/node-toolbar/src/NodeToolbar.tsx +++ b/packages/node-toolbar/src/NodeToolbar.tsx @@ -35,61 +35,45 @@ const storeSelector = (state: ReactFlowState) => ({ }); function getTransform(nodeRect: Rect, transform: Transform, position: Position, offset: number, align: Align): string { + let alignmentOffset = 0.5; + + if (align === 'start') { + alignmentOffset = 0; + } else if (align === 'end') { + alignmentOffset = 1; + } + // position === Position.Top - let xPos = (nodeRect.x + nodeRect.width / 2) * transform[2] + transform[0]; - let yPos = nodeRect.y * transform[2] + transform[1] - offset; - let xShift = -50; - let yShift = -100; + // we set the x any y position of the toolbar based on the nodes position + let pos = [ + (nodeRect.x + nodeRect.width * alignmentOffset) * transform[2] + transform[0], + nodeRect.y * transform[2] + transform[1] - offset, + ]; + // and than shift it based on the alignment. The shift values are in %. + let shift = [-100 * alignmentOffset, -100]; switch (position) { case Position.Right: - xPos = (nodeRect.x + nodeRect.width) * transform[2] + transform[0] + offset; - yPos = (nodeRect.y + nodeRect.height / 2) * transform[2] + transform[1]; - xShift = 0; - yShift = -50; + pos = [ + (nodeRect.x + nodeRect.width) * transform[2] + transform[0] + offset, + (nodeRect.y + nodeRect.height * alignmentOffset) * transform[2] + transform[1], + ]; + shift = [0, -100 * alignmentOffset]; break; case Position.Bottom: - yPos = (nodeRect.y + nodeRect.height) * transform[2] + transform[1] + offset; - yShift = 0; + pos[1] = (nodeRect.y + nodeRect.height) * transform[2] + transform[1] + offset; + shift[1] = 0; break; case Position.Left: - xPos = nodeRect.x * transform[2] + transform[0] - offset; - yPos = (nodeRect.y + nodeRect.height / 2) * transform[2] + transform[1]; - xShift = -100; - yShift = -50; + pos = [ + nodeRect.x * transform[2] + transform[0] - offset, + (nodeRect.y + nodeRect.height * alignmentOffset) * transform[2] + transform[1], + ]; + shift = [-100, -100 * alignmentOffset]; break; } - switch (position) { - case Position.Right: - case Position.Left: - switch (align) { - case 'start': - yPos = nodeRect.y * transform[2] + transform[1]; - yShift = 0; - break; - case 'end': - yPos = (nodeRect.y + nodeRect.height) * transform[2] + transform[1]; - yShift = -100; - break; - } - break; - case Position.Top: - case Position.Bottom: - switch (align) { - case 'start': - xPos = nodeRect.x * transform[2] + transform[0]; - xShift = 0; - break; - case 'end': - xPos = (nodeRect.x + nodeRect.width) * transform[2] + transform[0]; - xShift = -100; - break; - } - break -} - - return `translate(${xPos}px, ${yPos}px) translate(${xShift}%, ${yShift}%)`; + return `translate(${pos[0]}px, ${pos[1]}px) translate(${shift[0]}%, ${shift[1]}%)`; } function NodeToolbar({