import { computed, CSSProperties, defineComponent, HTMLAttributes, onBeforeUnmount, onUpdated, PropType, provide } from 'vue'; import GraphView from '../GraphView'; import DefaultNode from '../../components/Nodes/DefaultNode'; import InputNode from '../../components/Nodes/InputNode'; import OutputNode from '../../components/Nodes/OutputNode'; import { createNodeTypes } from '../NodeRenderer/utils'; import { BezierEdge, StepEdge, SmoothStepEdge, StraightEdge } from '../../components/Edges'; import { createEdgeTypes } from '../EdgeRenderer/utils'; import { Elements, NodeTypesType, EdgeTypesType, OnLoadFunc, Node, Edge, Connection, ConnectionMode, ConnectionLineType, ConnectionLineComponent, FlowTransform, OnConnectStartFunc, OnConnectStopFunc, OnConnectEndFunc, TranslateExtent, KeyCode, PanOnScrollMode, OnEdgeUpdateFunc, NodeExtent } from '../../types'; import '../../style.css'; import '../../theme-default.css'; import { initialState } from '../../store'; import configureStore from '../../store/configure-store'; const defaultNodeTypes = { input: InputNode, default: DefaultNode, output: OutputNode }; const defaultEdgeTypes = { default: BezierEdge, straight: StraightEdge, step: StepEdge, smoothstep: SmoothStepEdge }; export interface RevueFlowProps extends Omit { elements: Elements; onElementClick?: (event: MouseEvent, element: Node | Edge) => void; onElementsRemove?: (elements: Elements) => void; onNodeDoubleClick?: (event: MouseEvent, node: Node) => void; onNodeMouseEnter?: (event: MouseEvent, node: Node) => void; onNodeMouseMove?: (event: MouseEvent, node: Node) => void; onNodeMouseLeave?: (event: MouseEvent, node: Node) => void; onNodeContextMenu?: (event: MouseEvent, node: Node) => void; onNodeDragStart?: (event: MouseEvent, node: Node) => void; onNodeDrag?: (event: MouseEvent, node: Node) => void; onNodeDragStop?: (event: MouseEvent, node: Node) => void; onConnect?: (connection: Edge | Connection) => void; onConnectStart?: OnConnectStartFunc; onConnectStop?: OnConnectStopFunc; onConnectEnd?: OnConnectEndFunc; onLoad?: OnLoadFunc; onMove?: (flowTransform?: FlowTransform) => void; onMoveStart?: (flowTransform?: FlowTransform) => void; onMoveEnd?: (flowTransform?: FlowTransform) => void; onSelectionChange?: (elements: Elements | null) => void; onSelectionDragStart?: (event: MouseEvent, nodes: Node[]) => void; onSelectionDrag?: (event: MouseEvent, nodes: Node[]) => void; onSelectionDragStop?: (event: MouseEvent, nodes: Node[]) => void; onSelectionContextMenu?: (event: MouseEvent, nodes: Node[]) => void; onPaneScroll?: (event?: WheelEvent) => void; onPaneClick?: (event: MouseEvent) => void; onPaneContextMenu?: (event: MouseEvent) => void; nodeTypes?: NodeTypesType; edgeTypes?: EdgeTypesType; connectionMode?: ConnectionMode; connectionLineType?: ConnectionLineType; connectionLineStyle?: CSSProperties; connectionLineComponent?: ConnectionLineComponent; deleteKeyCode?: KeyCode; selectionKeyCode?: KeyCode; multiSelectionKeyCode?: KeyCode; zoomActivationKeyCode?: KeyCode; snapToGrid?: boolean; snapGrid?: [number, number]; onlyRenderVisibleElements?: boolean; nodesDraggable?: boolean; nodesConnectable?: boolean; elementsSelectable?: boolean; selectNodesOnDrag?: boolean; paneMoveable?: boolean; minZoom?: number; maxZoom?: number; defaultZoom?: number; defaultPosition?: [number, number]; translateExtent?: TranslateExtent; nodeExtent?: NodeExtent; arrowHeadColor?: string; markerEndId?: string; zoomOnScroll?: boolean; zoomOnPinch?: boolean; panOnScroll?: boolean; panOnScrollSpeed?: number; panOnScrollMode?: PanOnScrollMode; zoomOnDoubleClick?: boolean; onEdgeUpdate?: OnEdgeUpdateFunc; onEdgeContextMenu?: (event: MouseEvent, edge: Edge) => void; onEdgeMouseEnter?: (event: MouseEvent, edge: Edge) => void; onEdgeMouseMove?: (event: MouseEvent, edge: Edge) => void; onEdgeMouseLeave?: (event: MouseEvent, edge: Edge) => void; onEdgeDoubleClick?: (event: MouseEvent, edge: Edge) => void; onEdgeUpdateStart?: (event: MouseEvent, edge: Edge) => void; onEdgeUpdateEnd?: (event: MouseEvent, edge: Edge) => void; edgeUpdaterRadius?: number; nodeTypesId?: string; edgeTypesId?: string; } const RevueFlow = defineComponent({ name: 'RevueFlow', components: { GraphView }, props: { elements: { type: Array as PropType, required: true }, nodeTypesId: { type: String as PropType, required: false, default: '1' }, edgeTypesId: { type: String as PropType, required: false, default: '1' }, nodeTypes: { type: Object as PropType, required: false, default: () => defaultNodeTypes }, edgeTypes: { type: Object as PropType, required: false, default: () => defaultEdgeTypes }, onMove: { type: Function() as PropType, required: false, default: undefined as any }, onMoveStart: { type: Function() as PropType, required: false, default: undefined as any }, onMoveEnd: { type: Function() as PropType, required: false, default: undefined as any }, onLoad: { type: Function() as PropType, required: false, default: undefined as any }, onElementClick: { type: Function() as PropType, required: false, default: undefined as any }, onNodeDoubleClick: { type: Function() as PropType, required: false, default: undefined as any }, onEdgeDoubleClick: { type: Function() as PropType, required: false, default: undefined as any }, onNodeMouseEnter: { type: Function() as PropType, required: false, default: undefined as any }, onNodeMouseMove: { type: Function() as PropType, required: false, default: undefined as any }, onNodeMouseLeave: { type: Function() as PropType, required: false, default: undefined as any }, onNodeContextMenu: { type: Function() as PropType, required: false, default: undefined as any }, onNodeDragStart: { type: Function() as PropType, required: false, default: undefined as any }, onNodeDrag: { type: Function() as PropType, required: false, default: undefined as any }, onNodeDragStop: { type: Function() as PropType, required: false, default: undefined as any }, onSelectionContextMenu: { type: Function() as PropType, required: false, default: undefined as any }, onElementsRemove: { type: Function() as PropType, required: false, default: undefined as any }, onConnect: { type: Function() as PropType, required: false, default: undefined as any }, onConnectStart: { type: Function() as PropType, required: false, default: undefined as any }, onConnectStop: { type: Function() as PropType, required: false, default: undefined as any }, onConnectEnd: { type: Function() as PropType, required: false, default: undefined as any }, connectionMode: { type: String as PropType, required: false, default: ConnectionMode.Strict }, connectionLineType: { type: String as PropType, required: false, default: ConnectionLineType.Bezier }, connectionLineStyle: { type: Object as PropType, required: false, default: undefined }, connectionLineComponent: { type: Object as PropType, required: false, default: undefined as any }, selectionKeyCode: { type: [Number, String] as PropType, required: false, default: 'Shift' }, multiSelectionKeyCode: { type: [Number, String] as PropType, required: false, default: 'Meta' }, zoomActivationKeyCode: { type: [Number, String] as PropType, required: false, default: 'Meta' }, deleteKeyCode: { type: [Number, String] as PropType, required: false, default: 'Backspace' }, snapToGrid: { type: Boolean as PropType, required: false, default: false }, snapGrid: { type: Array as unknown as PropType, required: false, default: () => [15, 15] }, onlyRenderVisibleElements: { type: Boolean as PropType, required: false, default: false }, nodesDraggable: { type: Boolean as PropType, required: false, default: undefined }, nodesConnectable: { type: Boolean as PropType, required: false, default: undefined }, elementsSelectable: { type: Boolean as PropType, required: false, default: undefined }, selectNodesOnDrag: { type: Boolean as PropType, required: false, default: true }, minZoom: { type: Number as PropType, required: false, default: undefined }, maxZoom: { type: Number as PropType, required: false, default: undefined }, defaultZoom: { type: Number as PropType, required: false, default: 1 }, defaultPosition: { type: Array as unknown as PropType, required: false, default: () => [0, 0] }, translateExtent: { type: Array as unknown as PropType, required: false, default: undefined }, nodeExtent: { type: Array as unknown as PropType, required: false, default: undefined }, arrowHeadColor: { type: String as PropType, required: false, default: '#b1b1b7' }, markerEndId: { type: String as PropType, required: false, default: undefined }, zoomOnScroll: { type: Boolean as PropType, required: false, default: true }, zoomOnPinch: { type: Boolean as PropType, required: false, default: true }, panOnScroll: { type: Boolean as PropType, required: false, default: false }, panOnScrollSpeed: { type: Number as PropType, required: false, default: 0.5 }, panOnScrollMode: { type: String as PropType, required: false, default: PanOnScrollMode.Free }, zoomOnDoubleClick: { type: Boolean as PropType, required: false, default: true }, paneMoveable: { type: Boolean as PropType, required: false, default: true }, onPaneClick: { type: Function() as PropType, required: false, default: undefined as any }, onPaneScroll: { type: Function() as PropType, required: false, default: undefined as any }, onPaneContextMenu: { type: Function() as PropType, required: false, default: undefined as any }, onEdgeUpdate: { type: Function() as PropType, required: false, default: undefined as any }, onEdgeMouseEnter: { type: Function as unknown as PropType, required: false, default: undefined as any }, onEdgeContextMenu: { type: Function as unknown as PropType, required: false, default: undefined as any }, onEdgeMouseMove: { type: Function as unknown as PropType, required: false, default: undefined as any }, onEdgeMouseLeave: { type: Function as unknown as PropType, required: false, default: undefined as any }, onEdgeUpdateEnd: { type: Function as unknown as PropType, required: false, default: undefined as any }, onEdgeUpdateStart: { type: Function as unknown as PropType, required: false, default: undefined as any }, edgeUpdaterRadius: { type: Number as PropType, required: false, default: 10 } }, setup(props, { slots }) { const store = configureStore(initialState)(); provide('store', store); store.setElements(props.elements); onUpdated(() => { store.setElements(props.elements); }); onBeforeUnmount(() => { store.$reset(); store.setElements([]); }); const nodeTypesParsed = computed(() => props.nodeTypes && createNodeTypes(props.nodeTypes)); const edgeTypesParsed = computed(() => props.edgeTypes && createEdgeTypes(props.edgeTypes)); return () => (
{slots.default ? slots.default() : ''}
); } }); export default RevueFlow;