import { defineComponent, inject, onBeforeMount, onMounted, ref, PropType, CSSProperties } from 'vue'; import FlowRenderer from '../FlowRenderer'; import NodeRenderer from '../NodeRenderer'; import EdgeRenderer from '../EdgeRenderer'; import { onLoadProject, onLoadGetElements, onLoadToObject } from '../../utils/graph'; import { RevueFlowProps } from '../RevueFlow'; import { NodeTypesType, EdgeTypesType, ConnectionLineType, KeyCode, RevueFlowStore } from '../../types'; import useZoomPanHelper from '../../hooks/useZoomPanHelper'; export interface GraphViewProps extends Omit { nodeTypes: NodeTypesType; edgeTypes: EdgeTypesType; selectionKeyCode: KeyCode; deleteKeyCode: KeyCode; multiSelectionKeyCode: KeyCode; connectionLineType: ConnectionLineType; snapToGrid: boolean; snapGrid: [number, number]; onlyRenderVisibleElements: boolean; defaultZoom: number; defaultPosition: [number, number]; arrowHeadColor: string; selectNodesOnDrag: boolean; } const GraphView = defineComponent({ name: 'GraphView', components: { NodeRenderer, EdgeRenderer }, props: { nodeTypes: { type: Object as PropType, required: false, default: undefined }, edgeTypes: { type: Object as PropType, required: false, default: undefined }, onMove: { type: Function as unknown as PropType, required: false, default: undefined as any }, onMoveStart: { type: Function as unknown as PropType, required: false, default: undefined as any }, onMoveEnd: { type: Function as unknown as PropType, required: false, default: undefined as any }, onLoad: { type: Function as unknown as PropType, required: false, default: undefined as any }, onElementClick: { type: Function as unknown as PropType, required: false, default: undefined as any }, onNodeDoubleClick: { type: Function as unknown as PropType, required: false, default: undefined as any }, onEdgeDoubleClick: { type: Function as unknown as PropType, required: false, default: undefined as any }, onNodeMouseEnter: { type: Function as unknown as PropType, required: false, default: undefined as any }, onNodeMouseMove: { type: Function as unknown as PropType, required: false, default: undefined as any }, onNodeMouseLeave: { type: Function as unknown as PropType, required: false, default: undefined as any }, onNodeContextMenu: { type: Function as unknown as PropType, required: false, default: undefined as any }, onNodeDragStart: { type: Function as unknown as PropType, required: false, default: undefined as any }, onNodeDrag: { type: Function as unknown as PropType, required: false, default: undefined as any }, onNodeDragStop: { type: Function as unknown as PropType, required: false, default: undefined as any }, onSelectionContextMenu: { type: Function as unknown as PropType, required: false, default: undefined as any }, onElementsRemove: { type: Function as unknown as PropType, required: false, default: undefined as any }, onConnect: { type: Function as unknown as PropType, required: false, default: undefined as any }, onConnectStart: { type: Function as unknown as PropType, required: false, default: undefined as any }, onConnectStop: { type: Function as unknown as PropType, required: false, default: undefined as any }, onConnectEnd: { type: Function as unknown as PropType, required: false, default: undefined as any }, connectionMode: { type: String as PropType, required: false, default: undefined }, connectionLineType: { type: String as PropType, required: false, default: undefined }, connectionLineStyle: { type: Object as PropType, required: false, default: () => ({} as CSSProperties) }, connectionLineComponent: { type: Object as PropType, required: false, default: undefined as any }, selectionKeyCode: { type: [Number, String] as PropType, required: false, default: undefined }, multiSelectionKeyCode: { type: [Number, String] as PropType, required: false, default: undefined }, zoomActivationKeyCode: { type: [Number, String] as PropType, required: false, default: undefined }, deleteKeyCode: { type: [Number, String] as PropType, required: false, default: undefined }, snapToGrid: { type: Boolean as PropType, required: false, default: undefined }, snapGrid: { type: Array as unknown as PropType, required: false, default: undefined }, onlyRenderVisibleElements: { type: Boolean as PropType, required: false, default: undefined }, 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: undefined }, 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: undefined }, defaultPosition: { type: Array as unknown as PropType, required: false, default: undefined }, 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: undefined }, markerEndId: { type: String as PropType, required: false, default: undefined }, zoomOnScroll: { type: Boolean as PropType, required: false, default: undefined }, zoomOnPinch: { type: Boolean as PropType, required: false, default: undefined }, panOnScroll: { type: Boolean as PropType, required: false, default: undefined }, panOnScrollSpeed: { type: Number as PropType, required: false, default: undefined }, panOnScrollMode: { type: String as PropType, required: false, default: undefined }, zoomOnDoubleClick: { type: Boolean as PropType, required: false, default: undefined }, paneMoveable: { type: Boolean as PropType, required: false, default: undefined }, onPaneClick: { type: Function as unknown as PropType, required: false, default: undefined as any }, onPaneScroll: { type: Function as unknown as PropType, required: false, default: undefined as any }, onPaneContextMenu: { type: Function as unknown as PropType, required: false, default: undefined as any }, onEdgeUpdate: { type: Function as unknown 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 }, onSelectionDragStart: { type: Function as unknown as PropType, required: false, default: undefined as any }, onSelectionDrag: { type: Function as unknown as PropType, required: false, default: undefined as any }, onSelectionDragStop: { type: Function as unknown as PropType, required: false, default: undefined as any }, edgeUpdaterRadius: { type: Number as PropType, required: false, default: undefined } }, setup(props) { const store = inject('store'); const isInitialized = ref(false); onMounted(() => { const { zoomIn, zoomOut, zoomTo, transform, fitView, initialized } = useZoomPanHelper(); if (!isInitialized.value && initialized) { if (props.onLoad && store) { props.onLoad({ fitView: (params = { padding: 0.1 }) => fitView(params), zoomIn, zoomOut, zoomTo, setTransform: transform, project: onLoadProject(store), getElements: onLoadGetElements(store), toObject: onLoadToObject(store) }); } isInitialized.value = true; } }); onMounted(() => { if (typeof props.nodesConnectable !== 'undefined') { store?.setNodesConnectable(!!props.nodesConnectable); } if (typeof props.elementsSelectable !== 'undefined') { store?.setElementsSelectable(!!props.elementsSelectable); } if (typeof props.connectionMode !== 'undefined') { store?.setConnectionMode(props.connectionMode); } }); onBeforeMount(() => { if (props.onConnect) { store?.setOnConnect(props.onConnect); } if (props.onConnectStart) { store?.setOnConnectStart(props.onConnectStart); } if (props.onConnectStop) { store?.setOnConnectStop(props.onConnectStop); } if (props.onConnectEnd) { store?.setOnConnectEnd(props.onConnectEnd); } if (typeof props.snapToGrid !== 'undefined') { store?.setSnapToGrid(props.snapToGrid); } if (typeof props.snapGrid !== 'undefined') { store?.setSnapGrid(props.snapGrid); } if (typeof props.nodesDraggable !== 'undefined') { store?.setNodesDraggable(!!props.nodesDraggable); } if (typeof props.nodesConnectable !== 'undefined') { store?.setNodesConnectable(!!props.nodesConnectable); } if (typeof props.elementsSelectable !== 'undefined') { store?.setElementsSelectable(!!props.elementsSelectable); } if (typeof props.minZoom !== 'undefined') { store?.setMinZoom(props.minZoom); } if (typeof props.maxZoom !== 'undefined') { store?.setMaxZoom(props.maxZoom); } if (typeof props.translateExtent !== 'undefined') { store?.setTranslateExtent(props.translateExtent); } if (typeof props.nodeExtent !== 'undefined') { store?.setNodeExtent(props.nodeExtent); } }); return () => ( ); } }); export default GraphView;