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 } from '../../types'; import { CSSProperties, defineComponent, onBeforeMount, onMounted, PropType, ref } from 'vue-demi'; import store from '../../store'; 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 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: 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 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 PropType, required: false, default: undefined as any }, onEdgeContextMenu: { type: Function() as PropType, required: false, default: undefined as any }, onEdgeMouseMove: { type: Function() as PropType, required: false, default: undefined as any }, onEdgeMouseLeave: { type: Function() as PropType, required: false, default: undefined as any }, onEdgeUpdateEnd: { type: Function() as PropType, required: false, default: undefined as any }, onEdgeUpdateStart: { type: Function() as PropType, required: false, default: undefined as any }, edgeUpdaterRadius: { type: Number as PropType, required: false, default: undefined } }, setup(props) { const pinia = store(); const isInitialized = ref(false); onMounted(() => { const { zoomIn, zoomOut, zoomTo, transform, fitView, initialized } = useZoomPanHelper(); if (!isInitialized.value && initialized) { if (props.onLoad) { props.onLoad({ fitView: (params = { padding: 0.1 }) => fitView(params), zoomIn, zoomOut, zoomTo, setTransform: transform, project: onLoadProject(pinia), getElements: onLoadGetElements(pinia), toObject: onLoadToObject(pinia) }); } isInitialized.value = true; } }); onBeforeMount(() => { if (props.onConnect) { pinia.setOnConnect(props.onConnect); } if (props.onConnectStart) { pinia.setOnConnectStart(props.onConnectStart); } if (props.onConnectStop) { pinia.setOnConnectStop(props.onConnectStop); } if (props.onConnectEnd) { pinia.setOnConnectEnd(props.onConnectEnd); } if (typeof props.snapToGrid !== 'undefined') { pinia.setSnapToGrid(props.snapToGrid); } if (typeof props.snapGrid !== 'undefined') { pinia.setSnapGrid(props.snapGrid); } if (typeof props.nodesDraggable !== 'undefined') { pinia.setNodesDraggable(!!props.nodesDraggable); } if (typeof props.nodesConnectable !== 'undefined') { pinia.setNodesConnectable(!!props.nodesConnectable); } if (typeof props.elementsSelectable !== 'undefined') { pinia.setElementsSelectable(!!props.elementsSelectable); } if (typeof props.minZoom !== 'undefined') { pinia.setMinZoom(props.minZoom as any); } if (typeof props.maxZoom !== 'undefined') { pinia.setMaxZoom(props.maxZoom as any); } if (typeof props.translateExtent !== 'undefined') { pinia.setTranslateExtent(props.translateExtent as any); } if (typeof props.nodeExtent !== 'undefined') { pinia.setNodeExtent(props.nodeExtent as any); } }); onMounted(() => { if (typeof props.nodesConnectable !== 'undefined') { pinia.setNodesConnectable(!!props.nodesConnectable); } }); onMounted(() => { if (typeof props.elementsSelectable !== 'undefined') { pinia.setElementsSelectable(!!props.elementsSelectable); } if (typeof props.connectionMode !== 'undefined') { pinia.setConnectionMode(props.connectionMode as any); } }); return () => ( ); } }); export default GraphView;