From 8d33014291aa5c15bd7f72e7dcd6797eb51301ee Mon Sep 17 00:00:00 2001 From: Braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Thu, 21 Apr 2022 18:57:12 +0200 Subject: [PATCH] refactor(nodes,edges): change defaults to functional components # What's changed? * Change default node/edge components to functional components --- package/src/components/Edges/BaseEdge.ts | 45 +++++++---- package/src/components/Edges/BezierEdge.ts | 80 +++++++++++++++++++ package/src/components/Edges/BezierEdge.vue | 66 --------------- package/src/components/Edges/EdgeAnchor.ts | 45 +++++++++++ package/src/components/Edges/EdgeAnchor.vue | 49 ------------ package/src/components/Edges/EdgeWrapper.vue | 2 +- .../src/components/Edges/SimpleBezierEdge.ts | 76 ++++++++++++++++++ .../src/components/Edges/SimpleBezierEdge.vue | 64 --------------- .../src/components/Edges/SmoothStepEdge.ts | 78 ++++++++++++++++++ .../src/components/Edges/SmoothStepEdge.vue | 67 ---------------- package/src/components/Edges/StepEdge.ts | 27 +++++++ package/src/components/Edges/StepEdge.vue | 24 ------ package/src/components/Edges/StraightEdge.ts | 61 ++++++++++++++ package/src/components/Edges/StraightEdge.vue | 51 ------------ package/src/components/Edges/index.ts | 12 +-- package/src/components/Nodes/DefaultNode.ts | 25 ++++++ package/src/components/Nodes/DefaultNode.vue | 32 -------- package/src/components/Nodes/InputNode.ts | 17 ++++ package/src/components/Nodes/InputNode.vue | 25 ------ package/src/components/Nodes/OutputNode.ts | 17 ++++ package/src/components/Nodes/OutputNode.vue | 25 ------ package/src/components/Nodes/index.ts | 6 +- .../container/SelectionPane/SelectionPane.vue | 12 ++- package/src/container/Viewport/Transform.vue | 21 +++-- package/src/container/Viewport/Viewport.vue | 10 +-- package/src/index.ts | 11 ++- 26 files changed, 494 insertions(+), 454 deletions(-) create mode 100644 package/src/components/Edges/BezierEdge.ts delete mode 100644 package/src/components/Edges/BezierEdge.vue create mode 100644 package/src/components/Edges/EdgeAnchor.ts delete mode 100644 package/src/components/Edges/EdgeAnchor.vue create mode 100644 package/src/components/Edges/SimpleBezierEdge.ts delete mode 100644 package/src/components/Edges/SimpleBezierEdge.vue create mode 100644 package/src/components/Edges/SmoothStepEdge.ts delete mode 100644 package/src/components/Edges/SmoothStepEdge.vue create mode 100644 package/src/components/Edges/StepEdge.ts delete mode 100644 package/src/components/Edges/StepEdge.vue create mode 100644 package/src/components/Edges/StraightEdge.ts delete mode 100644 package/src/components/Edges/StraightEdge.vue create mode 100644 package/src/components/Nodes/DefaultNode.ts delete mode 100644 package/src/components/Nodes/DefaultNode.vue create mode 100644 package/src/components/Nodes/InputNode.ts delete mode 100644 package/src/components/Nodes/InputNode.vue create mode 100644 package/src/components/Nodes/OutputNode.ts delete mode 100644 package/src/components/Nodes/OutputNode.vue diff --git a/package/src/components/Edges/BaseEdge.ts b/package/src/components/Edges/BaseEdge.ts index 8163881a..f01e675a 100644 --- a/package/src/components/Edges/BaseEdge.ts +++ b/package/src/components/Edges/BaseEdge.ts @@ -16,26 +16,41 @@ interface Props { markerEnd?: string } -export default (function BaseEdge(props: Props, { attrs }) { +const BaseEdge: FunctionalComponent = function ({ + path, + centerX, + centerY, + label, + labelBgBorderRadius, + labelBgPadding, + labelBgStyle, + labelShowBg, + labelStyle, + markerStart, + markerEnd, + style, +}) { return [ h('path', { - style: attrs.style, - d: props.path, + style: { ...style }, + d: path, class: 'vue-flow__edge-path', - markerEnd: props.markerEnd, - markerStart: props.markerStart, + markerEnd, + markerStart, }), - props.label + label ? h(EdgeText, { - x: props.centerX, - y: props.centerY, - label: props.label, - labelStyle: props.labelStyle, - labelShowBg: props.labelShowBg, - labelBgStyle: props.labelBgStyle, - labelBgPadding: props.labelBgPadding, - labelBgBorderRadius: props.labelBgBorderRadius, + x: centerX, + y: centerY, + label, + labelStyle, + labelShowBg, + labelBgStyle, + labelBgPadding, + labelBgBorderRadius, }) : null, ] -} as FunctionalComponent) +} + +export default BaseEdge diff --git a/package/src/components/Edges/BezierEdge.ts b/package/src/components/Edges/BezierEdge.ts new file mode 100644 index 00000000..3d952550 --- /dev/null +++ b/package/src/components/Edges/BezierEdge.ts @@ -0,0 +1,80 @@ +import { FunctionalComponent } from 'vue' +import { getBezierPath, getBezierCenter } from './utils' +import BaseEdge from './BaseEdge' +import { Position } from '~/types' +import type { EdgeProps } from '~/types' + +const BezierEdge: FunctionalComponent = function ({ + sourcePosition = Position.Bottom, + targetPosition = Position.Top, + label, + labelStyle = {}, + labelShowBg = true, + labelBgStyle = {}, + labelBgPadding, + labelBgBorderRadius, + sourceY, + sourceX, + targetX, + targetY, + curvature, + markerEnd, + markerStart, + style, +}) { + const [centerX, centerY] = getBezierCenter({ + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + curvature, + }) + + const path = getBezierPath({ + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + curvature, + }) + + return h(BaseEdge, { + path, + centerX, + centerY, + label, + labelStyle, + labelShowBg, + labelBgStyle, + labelBgPadding, + labelBgBorderRadius, + style, + markerEnd, + markerStart, + }) +} + +BezierEdge.props = [ + 'sourcePosition', + 'targetPosition', + 'label', + 'labelStyle', + 'labelShowBg', + 'labelBgStyle', + 'labelBgPadding', + 'labelBgBorderRadius', + 'sourceY', + 'sourceX', + 'targetX', + 'targetY', + 'curvature', + 'markerEnd', + 'markerStart', + 'style', +] + +export default BezierEdge diff --git a/package/src/components/Edges/BezierEdge.vue b/package/src/components/Edges/BezierEdge.vue deleted file mode 100644 index 9b2c2c57..00000000 --- a/package/src/components/Edges/BezierEdge.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - diff --git a/package/src/components/Edges/EdgeAnchor.ts b/package/src/components/Edges/EdgeAnchor.ts new file mode 100644 index 00000000..2f1a437d --- /dev/null +++ b/package/src/components/Edges/EdgeAnchor.ts @@ -0,0 +1,45 @@ +import { FunctionalComponent, HTMLAttributes } from 'vue' +import { Position } from '~/types' + +interface Props extends HTMLAttributes { + position: Position + centerX: number + centerY: number + radius?: number +} + +const shiftX = (x: number, shift: number, position: Position): number => { + if (position === Position.Left) return x - shift + if (position === Position.Right) return x + shift + return x +} + +const shiftY = (y: number, shift: number, position: Position): number => { + if (position === Position.Top) return y - shift + if (position === Position.Bottom) return y + shift + return y +} + +const EdgeAnchor: FunctionalComponent = function ({ radius = 10, centerX = 0, centerY = 0, position = Position.Top }) { + const cx = computed(() => { + const val = shiftX(centerX, radius, position) + if (isNaN(val)) return 0 + else return val + }) + const cy = computed(() => { + const val = shiftY(centerY, radius, position) + if (isNaN(val)) return 0 + else return val + }) + + return h('circle', { + class: 'vue-flow__edgeupdater', + cx: cx.value, + cy: cy.value, + r: radius, + stroke: 'transparent', + fill: 'transparent', + }) +} + +export default EdgeAnchor diff --git a/package/src/components/Edges/EdgeAnchor.vue b/package/src/components/Edges/EdgeAnchor.vue deleted file mode 100644 index 603a2c15..00000000 --- a/package/src/components/Edges/EdgeAnchor.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/package/src/components/Edges/EdgeWrapper.vue b/package/src/components/Edges/EdgeWrapper.vue index 400130c0..20b4ca6a 100644 --- a/package/src/components/Edges/EdgeWrapper.vue +++ b/package/src/components/Edges/EdgeWrapper.vue @@ -4,7 +4,7 @@ import { useHandle, useVueFlow } from '../../composables' import { ConnectionMode, EdgeComponent, GraphEdge, GraphNode, Position } from '../../types' import { getEdgePositions, getHandle, getMarkerId } from '../../utils' import { Slots } from '../../context' -import EdgeAnchor from './EdgeAnchor.vue' +import EdgeAnchor from './EdgeAnchor' interface EdgeWrapper { id: string diff --git a/package/src/components/Edges/SimpleBezierEdge.ts b/package/src/components/Edges/SimpleBezierEdge.ts new file mode 100644 index 00000000..2efa33d0 --- /dev/null +++ b/package/src/components/Edges/SimpleBezierEdge.ts @@ -0,0 +1,76 @@ +import { FunctionalComponent } from 'vue' +import { getSimpleBezierCenter, getSimpleBezierPath } from './utils' +import BaseEdge from './BaseEdge' +import { Position } from '~/types' +import type { EdgeProps } from '~/types' + +const SimpleBezierEdge: FunctionalComponent = function ({ + sourcePosition = Position.Bottom, + targetPosition = Position.Top, + label, + labelStyle = {}, + labelShowBg = true, + labelBgStyle = {}, + labelBgPadding, + labelBgBorderRadius, + sourceY, + sourceX, + targetX, + targetY, + markerEnd, + markerStart, + style, +}) { + const [centerX, centerY] = getSimpleBezierCenter({ + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + }) + + const path = getSimpleBezierPath({ + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + }) + + return h(BaseEdge, { + path, + centerX, + centerY, + label, + labelStyle, + labelShowBg, + labelBgStyle, + labelBgPadding, + labelBgBorderRadius, + style, + markerEnd, + markerStart, + }) +} + +SimpleBezierEdge.props = [ + 'sourcePosition', + 'targetPosition', + 'label', + 'labelStyle', + 'labelShowBg', + 'labelBgStyle', + 'labelBgPadding', + 'labelBgBorderRadius', + 'sourceY', + 'sourceX', + 'targetX', + 'targetY', + 'markerEnd', + 'markerStart', + 'style', +] + +export default SimpleBezierEdge diff --git a/package/src/components/Edges/SimpleBezierEdge.vue b/package/src/components/Edges/SimpleBezierEdge.vue deleted file mode 100644 index 78de5868..00000000 --- a/package/src/components/Edges/SimpleBezierEdge.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - diff --git a/package/src/components/Edges/SmoothStepEdge.ts b/package/src/components/Edges/SmoothStepEdge.ts new file mode 100644 index 00000000..0c51c6a8 --- /dev/null +++ b/package/src/components/Edges/SmoothStepEdge.ts @@ -0,0 +1,78 @@ +import { FunctionalComponent } from 'vue' +import { getCenter, getSmoothStepPath } from './utils' +import BaseEdge from './BaseEdge' +import { Position, SmoothStepEdgeProps } from '~/types' + +const SmoothStepEdge: FunctionalComponent = function ({ + sourcePosition = Position.Bottom, + targetPosition = Position.Top, + label, + labelStyle = {}, + labelShowBg = true, + labelBgStyle = {}, + labelBgPadding, + labelBgBorderRadius, + sourceY, + sourceX, + targetX, + targetY, + markerEnd, + markerStart, + borderRadius, + style, +}) { + const [centerX, centerY] = getCenter({ + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + }) + + const path = getSmoothStepPath({ + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + borderRadius, + }) + + return h(BaseEdge, { + path, + centerX, + centerY, + label, + labelStyle, + labelShowBg, + labelBgStyle, + labelBgPadding, + labelBgBorderRadius, + style, + markerEnd, + markerStart, + }) +} + +SmoothStepEdge.props = [ + 'sourcePosition', + 'targetPosition', + 'label', + 'labelStyle', + 'labelShowBg', + 'labelBgStyle', + 'labelBgPadding', + 'labelBgBorderRadius', + 'sourceY', + 'sourceX', + 'targetX', + 'targetY', + 'borderRadius', + 'markerEnd', + 'markerStart', + 'style', +] + +export default SmoothStepEdge diff --git a/package/src/components/Edges/SmoothStepEdge.vue b/package/src/components/Edges/SmoothStepEdge.vue deleted file mode 100644 index b830b232..00000000 --- a/package/src/components/Edges/SmoothStepEdge.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - diff --git a/package/src/components/Edges/StepEdge.ts b/package/src/components/Edges/StepEdge.ts new file mode 100644 index 00000000..41080ff9 --- /dev/null +++ b/package/src/components/Edges/StepEdge.ts @@ -0,0 +1,27 @@ +import { FunctionalComponent } from 'vue' +import SmoothStepEdge from './SmoothStepEdge' +import { EdgeProps } from '~/types' + +const StepEdge: FunctionalComponent = function (props) { + return h(SmoothStepEdge, { ...props, borderRadius: 0 }) +} + +StepEdge.props = [ + 'sourcePosition', + 'targetPosition', + 'label', + 'labelStyle', + 'labelShowBg', + 'labelBgStyle', + 'labelBgPadding', + 'labelBgBorderRadius', + 'sourceY', + 'sourceX', + 'targetX', + 'targetY', + 'markerEnd', + 'markerStart', + 'style', +] + +export default StepEdge diff --git a/package/src/components/Edges/StepEdge.vue b/package/src/components/Edges/StepEdge.vue deleted file mode 100644 index dcb3271c..00000000 --- a/package/src/components/Edges/StepEdge.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/package/src/components/Edges/StraightEdge.ts b/package/src/components/Edges/StraightEdge.ts new file mode 100644 index 00000000..faef3d40 --- /dev/null +++ b/package/src/components/Edges/StraightEdge.ts @@ -0,0 +1,61 @@ +import { FunctionalComponent } from 'vue' +import BaseEdge from './BaseEdge' +import { EdgeProps } from '~/types' + +const StraightEdge: FunctionalComponent = function ({ + label, + labelStyle = {}, + labelShowBg = true, + labelBgStyle = {}, + labelBgPadding, + labelBgBorderRadius, + sourceY, + sourceX, + targetX, + targetY, + markerEnd, + markerStart, + style, +}) { + const centerY = computed(() => { + const yOffset = Math.abs(targetY - sourceY) / 2 + return targetY < sourceY ? targetY + yOffset : targetY - yOffset + }) + const centerX = computed(() => { + const xOffset = Math.abs(targetX - sourceX) / 2 + return targetX < sourceX ? targetX + xOffset : targetX - xOffset + }) + + return h(BaseEdge, { + path: `M ${sourceX},${sourceY}L ${targetX},${targetY}`, + centerX: centerX.value, + centerY: centerY.value, + label, + labelStyle, + labelShowBg, + labelBgStyle, + labelBgPadding, + labelBgBorderRadius, + style, + markerEnd, + markerStart, + }) +} + +StraightEdge.props = [ + 'label', + 'labelStyle', + 'labelShowBg', + 'labelBgStyle', + 'labelBgPadding', + 'labelBgBorderRadius', + 'sourceY', + 'sourceX', + 'targetX', + 'targetY', + 'markerEnd', + 'markerStart', + 'style', +] + +export default StraightEdge diff --git a/package/src/components/Edges/StraightEdge.vue b/package/src/components/Edges/StraightEdge.vue deleted file mode 100644 index c05ce886..00000000 --- a/package/src/components/Edges/StraightEdge.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - diff --git a/package/src/components/Edges/index.ts b/package/src/components/Edges/index.ts index 23c09f7f..70dc3441 100644 --- a/package/src/components/Edges/index.ts +++ b/package/src/components/Edges/index.ts @@ -1,7 +1,7 @@ -export { default as BezierEdge } from './BezierEdge.vue' -export { default as SimpleBezierEdge } from './SimpleBezierEdge.vue' -export { default as StepEdge } from './StepEdge.vue' -export { default as SmoothStepEdge } from './SmoothStepEdge.vue' -export { default as StraightEdge } from './StraightEdge.vue' -export { default as EdgeAnchor } from './EdgeAnchor.vue' +export { default as BezierEdge } from './BezierEdge' +export { default as SimpleBezierEdge } from './SimpleBezierEdge' +export { default as StepEdge } from './StepEdge' +export { default as SmoothStepEdge } from './SmoothStepEdge' +export { default as StraightEdge } from './StraightEdge' +export { default as EdgeAnchor } from './EdgeAnchor' export { default as EdgeText } from './EdgeText.vue' diff --git a/package/src/components/Nodes/DefaultNode.ts b/package/src/components/Nodes/DefaultNode.ts new file mode 100644 index 00000000..f68be7a4 --- /dev/null +++ b/package/src/components/Nodes/DefaultNode.ts @@ -0,0 +1,25 @@ +import { FunctionalComponent } from 'vue' +import Handle from '../Handle/Handle.vue' +import { NodeProps, Position } from '~/types' + +const DefaultNode: FunctionalComponent = function ( + { + sourcePosition = Position.Bottom, + targetPosition = Position.Top, + label, + connectable = false, + isValidTargetPos, + isValidSourcePos, + }: NodeProps, + { attrs }, +) { + return [ + h(Handle, { type: 'target', position: targetPosition, isConnectable: connectable, isValidConnection: isValidTargetPos }), + typeof label !== 'string' && label ? h(label) : h('span', {}, label), + h(Handle, { type: 'source', position: sourcePosition, isConnectable: connectable, isValidConnection: isValidSourcePos }), + ] +} + +DefaultNode.props = ['sourcePosition', 'targetPosition', 'label', 'isValidTargetPos', 'isValidSourcePos', 'connectable'] + +export default DefaultNode diff --git a/package/src/components/Nodes/DefaultNode.vue b/package/src/components/Nodes/DefaultNode.vue deleted file mode 100644 index 20a95a18..00000000 --- a/package/src/components/Nodes/DefaultNode.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/package/src/components/Nodes/InputNode.ts b/package/src/components/Nodes/InputNode.ts new file mode 100644 index 00000000..407a2bff --- /dev/null +++ b/package/src/components/Nodes/InputNode.ts @@ -0,0 +1,17 @@ +import { FunctionalComponent } from 'vue' +import Handle from '../Handle/Handle.vue' +import { NodeProps, Position } from '~/types' + +const InputNode: FunctionalComponent = function ( + { sourcePosition = Position.Bottom, label, connectable = false, isValidSourcePos }: NodeProps, + { attrs }, +) { + return [ + typeof label !== 'string' && label ? h(label) : h('span', {}, label), + h(Handle, { type: 'source', position: sourcePosition, isConnectable: connectable, isValidConnection: isValidSourcePos }), + ] +} + +InputNode.props = ['sourcePosition', 'label', 'isValidSourcePos', 'connectable'] + +export default InputNode diff --git a/package/src/components/Nodes/InputNode.vue b/package/src/components/Nodes/InputNode.vue deleted file mode 100644 index 19f28085..00000000 --- a/package/src/components/Nodes/InputNode.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/package/src/components/Nodes/OutputNode.ts b/package/src/components/Nodes/OutputNode.ts new file mode 100644 index 00000000..fb834704 --- /dev/null +++ b/package/src/components/Nodes/OutputNode.ts @@ -0,0 +1,17 @@ +import { FunctionalComponent } from 'vue' +import Handle from '../Handle/Handle.vue' +import { NodeProps, Position } from '~/types' + +const OutputNode: FunctionalComponent = function ( + { targetPosition = Position.Top, label, connectable = false, isValidTargetPos }: NodeProps, + { attrs }, +) { + return [ + h(Handle, { type: 'target', position: targetPosition, isConnectable: connectable, isValidConnection: isValidTargetPos }), + typeof label !== 'string' && label ? h(label) : h('span', {}, label), + ] +} + +OutputNode.props = ['targetPosition', 'label', 'isValidTargetPos', 'connectable'] + +export default OutputNode diff --git a/package/src/components/Nodes/OutputNode.vue b/package/src/components/Nodes/OutputNode.vue deleted file mode 100644 index 62833340..00000000 --- a/package/src/components/Nodes/OutputNode.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/package/src/components/Nodes/index.ts b/package/src/components/Nodes/index.ts index 53a63969..d638164e 100644 --- a/package/src/components/Nodes/index.ts +++ b/package/src/components/Nodes/index.ts @@ -1,3 +1,3 @@ -export { default as DefaultNode } from './DefaultNode.vue' -export { default as InputNode } from './InputNode.vue' -export { default as OutputNode } from './OutputNode.vue' +export { default as DefaultNode } from './DefaultNode' +export { default as InputNode } from './InputNode' +export { default as OutputNode } from './OutputNode' diff --git a/package/src/container/SelectionPane/SelectionPane.vue b/package/src/container/SelectionPane/SelectionPane.vue index 2d598724..9f6d70f2 100644 --- a/package/src/container/SelectionPane/SelectionPane.vue +++ b/package/src/container/SelectionPane/SelectionPane.vue @@ -53,7 +53,13 @@ export default { } diff --git a/package/src/container/Viewport/Transform.vue b/package/src/container/Viewport/Transform.vue index ddc35664..01fe5bce 100644 --- a/package/src/container/Viewport/Transform.vue +++ b/package/src/container/Viewport/Transform.vue @@ -5,7 +5,7 @@ import { useVueFlow, useZoomPanHelper, useWindow } from '../../composables' import { FlowExportObject, FlowInstance, Store, XYPosition } from '../../types' import { pointToRendererPoint } from '../../utils' -const { store } = useVueFlow() +const { id, store } = useVueFlow() const untilDimensions = async (store: Store) => { // if ssr we can't wait for dimensions, they'll never really exist @@ -55,9 +55,9 @@ onMounted(async () => { await untilDimensions(store) ready.value = true - store.instance = instance as FlowInstance + store.instance = instance store.fitViewOnInit && instance.fitView() - store.hooks.paneReady.trigger(instance as FlowInstance) + store.hooks.paneReady.trigger(instance) }) const transform = computed(() => `translate(${store.viewport.x}px,${store.viewport.y}px) scale(${store.viewport.zoom})`) @@ -68,15 +68,12 @@ export default { }