diff --git a/src/components/Edges/BezierEdge.tsx b/src/components/Edges/BezierEdge.tsx index f2851301..b0b77502 100644 --- a/src/components/Edges/BezierEdge.tsx +++ b/src/components/Edges/BezierEdge.tsx @@ -1,9 +1,8 @@ -import { computed, CSSProperties, defineComponent, PropType } from 'vue'; - +import { defineComponent } from 'vue'; import EdgeText from './EdgeText'; - -import { getMarkerEnd, getCenter } from './utils'; -import { ArrowHeadType, Position } from '../../types'; +import { getMarkerEnd, getCenter, GetCenterParams, DefaultEdgeProps } from './utils'; +import { ArrowHeadType, EdgeType, Position } from '../../types'; +import { reactify } from '@vueuse/core'; interface GetBezierPathParams { sourceX: number; @@ -48,104 +47,34 @@ export function getBezierPath({ export default defineComponent({ inheritAttrs: false, props: { - sourceX: { - type: Number, - required: true - }, - sourceY: { - type: Number, - required: true - }, - targetX: { - type: Number, - required: true - }, - targetY: { - type: Number, - required: true - }, - sourcePosition: { - type: String as PropType, - required: false, - default: Position.Bottom - }, - targetPosition: { - type: String as PropType, - required: false, - default: Position.Top - }, - label: { - type: String, - required: false, - default: undefined - }, - labelStyle: { - type: Object, - required: false, - default: undefined - }, - labelShowBg: { - type: Boolean, - required: false, - default: false - }, - labelBgStyle: { - type: String, - required: false, - default: undefined - }, - labelBgPadding: { - type: Array as unknown as PropType<[number, number]>, - required: false, - default: () => [0, 0] - }, - labelBgBorderRadius: { - type: Number, - required: false, - default: 0 - }, - arrowHeadType: { - type: String as PropType, - required: false, - default: undefined - }, - markerEndId: { - type: String, - required: false, - default: undefined - }, - style: { - type: Object as PropType, - required: false, - default: () => {} - } + ...DefaultEdgeProps }, setup(props) { - const centered = computed(() => { + const centered = reactify(({ sourceX, sourceY, targetX, targetY, targetPosition, sourcePosition }: GetCenterParams) => { return getCenter({ - sourceX: props.sourceX, - sourceY: props.sourceY, - targetX: props.targetX, - targetY: props.targetY, - sourcePosition: props.sourcePosition, - targetPosition: props.targetPosition + sourceX: sourceX, + sourceY: sourceY, + targetX: targetX, + targetY: targetY, + sourcePosition: sourcePosition, + targetPosition: targetPosition }); }); - const path = computed(() => { + const path = reactify(({ sourceX, sourceY, targetX, targetY, targetPosition, sourcePosition }: GetBezierPathParams) => { return getBezierPath({ - sourceX: props.sourceX, - sourceY: props.sourceY, - targetX: props.targetX, - targetY: props.targetY, - targetPosition: props.targetPosition, - sourcePosition: props.sourcePosition + sourceX: sourceX, + sourceY: sourceY, + targetX: targetX, + targetY: targetY, + targetPosition: targetPosition, + sourcePosition: sourcePosition }); }); const text = props.label ? ( ) : null; - const markerEnd = computed(() => getMarkerEnd(props.arrowHeadType, props.markerEndId)); + const markerEnd = reactify((arrowHeadType?: ArrowHeadType, markerEndId?: string) => getMarkerEnd(arrowHeadType, markerEndId)); return () => ( <> - + {text} ); } -}); +}) as EdgeType; diff --git a/src/components/Edges/Edge.tsx b/src/components/Edges/Edge.tsx index 92b181eb..ddaf291c 100644 --- a/src/components/Edges/Edge.tsx +++ b/src/components/Edges/Edge.tsx @@ -1,6 +1,6 @@ -import { EdgeAnchor } from './EdgeAnchor'; -import { ConnectionMode, Edge, Elements, Node, Position, RevueFlowStore, Transform } from '../../types'; import { computed, defineComponent, h, inject, PropType, ref } from 'vue'; +import EdgeAnchor from './EdgeAnchor'; +import { ConnectionMode, Edge, Elements, Node, Position, RevueFlowStore, Transform } from '../../types'; import { RevueFlowHooks } from '../../hooks/RevueFlowHooks'; import { getEdgePositions, getHandle, getSourceTargetNodes, isEdgeVisible } from '../../container/EdgeRenderer/utils'; import { isEdge } from '../../utils/graph'; diff --git a/src/components/Edges/EdgeAnchor.tsx b/src/components/Edges/EdgeAnchor.tsx index 1a6303e8..f5c4b12f 100644 --- a/src/components/Edges/EdgeAnchor.tsx +++ b/src/components/Edges/EdgeAnchor.tsx @@ -20,7 +20,7 @@ export interface EdgeAnchorProps extends HTMLAttributes { radius?: number; } -export const EdgeAnchor = defineComponent({ +export default defineComponent({ props: { position: { type: String as PropType, diff --git a/src/components/Edges/EdgeText.tsx b/src/components/Edges/EdgeText.tsx index 6f866398..d1b2ef5a 100644 --- a/src/components/Edges/EdgeText.tsx +++ b/src/components/Edges/EdgeText.tsx @@ -1,7 +1,7 @@ import { EdgeTextProps, Rect } from '../../types'; import { defineComponent, PropType, ref, watch } from 'vue'; -const EdgeText = defineComponent({ +export default defineComponent({ props: { x: { type: Number as PropType, @@ -83,5 +83,3 @@ const EdgeText = defineComponent({ ); } }); - -export default EdgeText; diff --git a/src/components/Edges/SmoothStepEdge.tsx b/src/components/Edges/SmoothStepEdge.tsx index 6b51cf0d..c6b815c4 100644 --- a/src/components/Edges/SmoothStepEdge.tsx +++ b/src/components/Edges/SmoothStepEdge.tsx @@ -1,8 +1,8 @@ -import { defineComponent } from 'vue'; - +import { computed, defineComponent } from 'vue'; import EdgeText from './EdgeText'; -import { getMarkerEnd, getCenter } from './utils'; -import { EdgeSmoothStepProps, Position } from '../../types'; +import { getMarkerEnd, getCenter, EdgeSmoothProps } from './utils'; +import { ArrowHeadType, EdgeType, Position } from '../../types'; +import { reactify } from '@vueuse/core'; // These are some helper methods for drawing the round corners // The name indicates the direction of the path. "bottomLeftCorner" goes @@ -92,35 +92,41 @@ export function getSmoothStepPath({ return `M ${sourceX},${sourceY}${firstCornerPath}${secondCornerPath}L ${targetX},${targetY}`; } -const SmoothStepEdge = defineComponent({ +export default defineComponent({ inheritAttrs: false, - props: EdgeSmoothStepProps, + props: { + ...EdgeSmoothProps + }, setup(props) { - const [centerX, centerY] = getCenter({ - sourceX: props.sourceX, - sourceY: props.sourceY, - targetX: props.targetX, - targetY: props.targetY, - sourcePosition: props.sourcePosition, - targetPosition: props.targetPosition + const centered = computed(() => { + return getCenter({ + sourceX: props.sourceX, + sourceY: props.sourceY, + targetX: props.targetX, + targetY: props.targetY, + sourcePosition: props.sourcePosition, + targetPosition: props.targetPosition + }); }); - const path = getSmoothStepPath({ - sourceX: props.sourceX, - sourceY: props.sourceY, - targetX: props.targetX, - targetY: props.targetY, - sourcePosition: props.sourcePosition, - targetPosition: props.targetPosition, - borderRadius: props.borderRadius + const path = computed(() => { + return getSmoothStepPath({ + sourceX: props.sourceX, + sourceY: props.sourceY, + targetX: props.targetX, + targetY: props.targetY, + sourcePosition: props.sourcePosition, + targetPosition: props.targetPosition, + borderRadius: props.borderRadius + }); }); - const markerEnd = getMarkerEnd(props.arrowHeadType, props.markerEndId); + const markerEnd = reactify((arrowHeadType?: ArrowHeadType, markerEndId?: string) => getMarkerEnd(arrowHeadType, markerEndId)); const text = props.label ? ( - + {text} ); } -}); - -export default SmoothStepEdge; +}) as unknown as EdgeType; diff --git a/src/components/Edges/StepEdge.tsx b/src/components/Edges/StepEdge.tsx index 0736d131..1235bbf0 100644 --- a/src/components/Edges/StepEdge.tsx +++ b/src/components/Edges/StepEdge.tsx @@ -1,15 +1,15 @@ import { defineComponent } from 'vue'; - -import { EdgeSmoothStepProps } from '../../types'; import SmoothStepEdge from './SmoothStepEdge'; +import { EdgeSmoothProps } from './utils'; +import { EdgeType } from '../../types'; -const StepEdge = defineComponent({ - inheritAttrs: false, +export default defineComponent({ components: { SmoothStepEdge }, - props: EdgeSmoothStepProps, + inheritAttrs: false, + props: { + ...EdgeSmoothProps + }, setup(props) { return () => ; } -}); - -export default StepEdge; +}) as EdgeType; diff --git a/src/components/Edges/StraightEdge.tsx b/src/components/Edges/StraightEdge.tsx index bae3772d..10d5d965 100644 --- a/src/components/Edges/StraightEdge.tsx +++ b/src/components/Edges/StraightEdge.tsx @@ -1,24 +1,28 @@ import { defineComponent } from 'vue'; - import EdgeText from './EdgeText'; -import { getMarkerEnd } from './utils'; -import { EdgeProps } from '../../types'; +import { getMarkerEnd, DefaultEdgeProps } from './utils'; +import { reactify } from '@vueuse/core'; +import { ArrowHeadType, EdgeType } from '../../types'; -const StraightEdge = defineComponent({ +export default defineComponent({ inheritAttrs: false, - props: EdgeProps, + props: { + ...DefaultEdgeProps + }, setup(props) { - const yOffset = Math.abs(props.targetY - props.sourceY) / 2; - const centerY = props.targetY < props.sourceY ? props.targetY + yOffset : props.targetY - yOffset; - - const xOffset = Math.abs(props.targetX - props.sourceX) / 2; - const centerX = props.targetX < props.sourceX ? props.targetX + xOffset : props.targetX - xOffset; - const markerEnd = getMarkerEnd(props.arrowHeadType, props.markerEndId); + const centerY = reactify((targetY: number, sourceY: number) => { + const yOffset = Math.abs(targetY - sourceY) / 2; + return targetY < sourceY ? targetY + yOffset : targetY - yOffset; + }); + const centerX = reactify((targetX: number, sourceX: number) => { + const xOffset = Math.abs(targetX - sourceX) / 2; + return targetX < sourceX ? targetX + xOffset : targetX - xOffset; + }); const text = props.label ? ( ) : null; + const markerEnd = reactify((arrowHeadType?: ArrowHeadType, markerEndId?: string) => getMarkerEnd(arrowHeadType, markerEndId)); + return ( <> {text} ); } -}); - -export default StraightEdge; +}) as unknown as EdgeType; diff --git a/src/components/Edges/utils.ts b/src/components/Edges/utils.ts index aec27a81..ad2b9ca8 100644 --- a/src/components/Edges/utils.ts +++ b/src/components/Edges/utils.ts @@ -1,4 +1,5 @@ -import { ArrowHeadType, Position } from '../../types'; +import { ArrowHeadType, Position, EdgeProps, EdgeSmoothStepProps } from '../../types'; +import { PropType } from 'vue'; export const getMarkerEnd = (arrowHeadType?: ArrowHeadType, markerEndId?: string): string => { if (typeof markerEndId !== 'undefined' && markerEndId) { @@ -52,3 +53,110 @@ export const getCenter = ({ return [centerX, centerY, xOffset, yOffset]; }; + +export const DefaultEdgeProps = { + id: { + type: String as PropType, + required: true, + default: 0 + }, + sourceX: { + type: Number as PropType, + required: true, + default: 0 + }, + sourceY: { + type: Number as PropType, + required: true, + default: 0 + }, + targetX: { + type: Number as PropType, + required: true, + default: 0 + }, + targetY: { + type: Number as PropType, + required: true, + default: 0 + }, + sourcePosition: { + type: String as PropType, + required: false, + default: Position.Bottom + }, + targetPosition: { + type: String as PropType, + required: false, + default: Position.Top + }, + label: { + type: String as PropType, + required: false, + default: undefined + }, + labelStyle: { + type: Object as PropType, + required: false, + default: undefined + }, + labelShowBg: { + type: Boolean as PropType, + required: false, + default: false + }, + labelBgStyle: { + type: String as PropType, + required: false, + default: undefined + }, + labelBgPadding: { + type: Array as unknown as PropType<[number, number]>, + required: false, + default: undefined + }, + labelBgBorderRadius: { + type: Number as PropType, + required: false, + default: undefined + }, + arrowHeadType: { + type: Object as PropType, + required: false, + default: undefined + }, + markerEndId: { + type: String as PropType, + required: false, + default: undefined + }, + style: { + type: Object as PropType, + required: false, + default: undefined + }, + data: { + type: Object as PropType, + required: false, + default: undefined + }, + sourceHandleId: { + type: String as PropType, + required: false, + default: undefined + }, + targetHandleId: { + type: String as PropType, + required: false, + default: undefined + } +}; + +export const EdgeSmoothProps = { + ...DefaultEdgeProps, + borderRadius: { + type: Number as PropType, + required: false, + default: 5 + } +}; diff --git a/src/components/Handle/index.tsx b/src/components/Handle/index.tsx index 3e7c20d1..5ac59094 100644 --- a/src/components/Handle/index.tsx +++ b/src/components/Handle/index.tsx @@ -31,11 +31,6 @@ export default defineComponent({ type: String, required: false, default: undefined - }, - onConnect: { - type: Function, - required: false, - default: undefined } }, setup(props, { slots }) { diff --git a/src/components/Nodes/DefaultNode.tsx b/src/components/Nodes/DefaultNode.tsx index 073c64b0..c1cb4899 100644 --- a/src/components/Nodes/DefaultNode.tsx +++ b/src/components/Nodes/DefaultNode.tsx @@ -1,8 +1,8 @@ -import Handle from '../../components/Handle'; -import { NodeProps, Position } from '../../types'; import { defineComponent, PropType } from 'vue'; +import Handle from '../../components/Handle'; +import { NodeProps, NodeType, Position } from '../../types'; -const DefaultNode = defineComponent({ +export default defineComponent({ name: 'DefaultNode', components: { Handle }, inheritAttrs: false, @@ -37,6 +37,4 @@ const DefaultNode = defineComponent({ ); } -}); - -export default DefaultNode; +}) as NodeType; diff --git a/src/components/Nodes/InputNode.tsx b/src/components/Nodes/InputNode.tsx index 69231e57..dcf5e1ae 100644 --- a/src/components/Nodes/InputNode.tsx +++ b/src/components/Nodes/InputNode.tsx @@ -1,8 +1,8 @@ import Handle from '../../components/Handle'; -import { NodeProps, Position } from '../../types'; +import { NodeProps, NodeType, Position } from '../../types'; import { defineComponent, PropType } from 'vue'; -const InputNode = defineComponent({ +export default defineComponent({ name: 'InputNode', components: { Handle }, inheritAttrs: false, @@ -31,6 +31,4 @@ const InputNode = defineComponent({ ); } -}); - -export default InputNode; +}) as NodeType; diff --git a/src/components/Nodes/Node.vue b/src/components/Nodes/Node.vue index 0fec31e9..07bc1e28 100644 --- a/src/components/Nodes/Node.vue +++ b/src/components/Nodes/Node.vue @@ -39,11 +39,11 @@ import { computed, CSSProperties, defineComponent, inject, PropType, provide } from 'vue'; import { templateRef, tryOnMounted, useResizeObserver } from '@vueuse/core'; import { DraggableCore, DraggableEventListener } from '@braks/revue-draggable'; -import { Node, NodeDimensionUpdate, NodeTypesType, RevueFlowStore } from '../../types'; +import { Node, NodeDimensionUpdate, NodeType, RevueFlowStore } from '../../types'; import { RevueFlowHooks } from '../../hooks/RevueFlowHooks'; interface NodeProps { - nodeTypes: NodeTypesType; + nodeTypes: Record; snapToGrid: boolean; snapGrid: [number, number]; selectNodesOnDrag: boolean; diff --git a/src/components/Nodes/OutputNode.tsx b/src/components/Nodes/OutputNode.tsx index 160816fb..dc6d2081 100644 --- a/src/components/Nodes/OutputNode.tsx +++ b/src/components/Nodes/OutputNode.tsx @@ -1,8 +1,8 @@ import Handle from '../../components/Handle'; -import { NodeProps, Position } from '../../types'; +import { NodeProps, NodeType, Position } from '../../types'; import { defineComponent, PropType } from 'vue'; -const OutputNode = defineComponent({ +export default defineComponent({ name: 'OutputNode', components: { Handle }, inheritAttrs: false, @@ -31,6 +31,4 @@ const OutputNode = defineComponent({ ); } -}); - -export default OutputNode; +}) as NodeType; diff --git a/src/components/NodesSelection/index.tsx b/src/components/NodesSelection/index.tsx index 8c4275bb..a8436c4e 100644 --- a/src/components/NodesSelection/index.tsx +++ b/src/components/NodesSelection/index.tsx @@ -1,3 +1,4 @@ +// @ts-nocheck /** * The nodes selection rectangle gets displayed when a user * made a selectio with on or several nodes diff --git a/src/container/EdgeRenderer/utils.ts b/src/container/EdgeRenderer/utils.ts index 9153081f..ba0ef9a4 100644 --- a/src/container/EdgeRenderer/utils.ts +++ b/src/container/EdgeRenderer/utils.ts @@ -1,17 +1,17 @@ import { BezierEdge, StepEdge, SmoothStepEdge, StraightEdge } from '../../components/Edges'; import { rectToBox } from '../../utils/graph'; -import { EdgeTypesType, Position, Node, XYPosition, ElementId, HandleElement, Transform, Edge } from '../../types'; +import { Position, Node, XYPosition, ElementId, HandleElement, Transform, Edge, EdgeType } from '../../types'; -export function createEdgeTypes(edgeTypes: EdgeTypesType): EdgeTypesType { - const standardTypes: EdgeTypesType = { +export function createEdgeTypes(edgeTypes: Record): Record { + const standardTypes: Record = { default: edgeTypes.default || BezierEdge, straight: edgeTypes.bezier || StraightEdge, step: edgeTypes.step || StepEdge, smoothstep: edgeTypes.step || SmoothStepEdge }; - const wrappedTypes = {} as EdgeTypesType; - const specialTypes: EdgeTypesType = Object.keys(edgeTypes) + const wrappedTypes = {} as Record; + const specialTypes: Record = Object.keys(edgeTypes) .filter((k) => !['default', 'bezier'].includes(k)) .reduce((res, key) => { res[key] = edgeTypes[key] || BezierEdge; diff --git a/src/container/GraphView/GraphView.vue b/src/container/GraphView/GraphView.vue index 7d3bddf7..01f30f31 100644 --- a/src/container/GraphView/GraphView.vue +++ b/src/container/GraphView/GraphView.vue @@ -37,7 +37,7 @@