update: remove useHooks usage
Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { useHooks, useStore, getEdgeCenter, getBezierPath, getMarkerEnd, ArrowHeadType, Edge, ElementId, Position } from '~/index'
|
import { getEdgeCenter, getBezierPath, getMarkerEnd, ArrowHeadType, Edge, ElementId, Position, useVueFlow } from '~/index'
|
||||||
|
|
||||||
interface CustomEdgeProps<T = any> extends Edge<T> {
|
interface CustomEdgeProps<T = any> extends Edge<T> {
|
||||||
id: ElementId
|
id: ElementId
|
||||||
@@ -15,12 +15,11 @@ interface CustomEdgeProps<T = any> extends Edge<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const props = defineProps<CustomEdgeProps>()
|
const props = defineProps<CustomEdgeProps>()
|
||||||
const store = useStore()
|
const store = useVueFlow()
|
||||||
const hooks = useHooks()
|
|
||||||
const onEdgeClick = (evt: Event, id: string) => {
|
const onEdgeClick = (evt: Event, id: string) => {
|
||||||
const edge = store.edges.find((edge) => edge.id === id)
|
const edge = store.edges.find((edge) => edge.id === id)
|
||||||
if (edge) {
|
if (edge) {
|
||||||
hooks.elementsRemove.trigger([edge])
|
store.hooks.elementsRemove.trigger([edge])
|
||||||
}
|
}
|
||||||
evt.stopPropagation()
|
evt.stopPropagation()
|
||||||
alert(`remove ${id}`)
|
alert(`remove ${id}`)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { useHandle, useHooks, useStore } from '../../composables'
|
import { useHandle, useStore } from '../../composables'
|
||||||
import { ConnectionMode, Edge, EdgePositions, EdgeType, Position } from '../../types'
|
import { ConnectionMode, Edge, EdgePositions, EdgeType, Position } from '../../types'
|
||||||
import EdgeAnchor from './EdgeAnchor.vue'
|
import EdgeAnchor from './EdgeAnchor.vue'
|
||||||
import { getEdgePositions, getHandle, getSourceTargetNodes, isEdgeVisible } from '~/container/EdgeRenderer/utils'
|
import { getEdgePositions, getHandle, getSourceTargetNodes, isEdgeVisible } from '~/container/EdgeRenderer/utils'
|
||||||
@@ -15,7 +15,6 @@ interface EdgeProps {
|
|||||||
const props = withDefaults(defineProps<EdgeProps>(), {})
|
const props = withDefaults(defineProps<EdgeProps>(), {})
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const hooks = useHooks()
|
|
||||||
|
|
||||||
const onEdgeClick = (event: MouseEvent) => {
|
const onEdgeClick = (event: MouseEvent) => {
|
||||||
if (store.elementsSelectable) {
|
if (store.elementsSelectable) {
|
||||||
@@ -23,20 +22,20 @@ const onEdgeClick = (event: MouseEvent) => {
|
|||||||
store.addSelectedElements([props.edge])
|
store.addSelectedElements([props.edge])
|
||||||
}
|
}
|
||||||
|
|
||||||
hooks.edgeClick.trigger({ event, edge: props.edge })
|
store.hooks.edgeClick.trigger({ event, edge: props.edge })
|
||||||
}
|
}
|
||||||
|
|
||||||
const onEdgeContextMenu = (event: MouseEvent) =>
|
const onEdgeContextMenu = (event: MouseEvent) =>
|
||||||
hooks.edgeContextMenu.trigger({
|
store.hooks.edgeContextMenu.trigger({
|
||||||
event,
|
event,
|
||||||
edge: props.edge,
|
edge: props.edge,
|
||||||
})
|
})
|
||||||
|
|
||||||
const onEdgeMouseEnter = (event: MouseEvent) => hooks.edgeMouseEnter.trigger({ event, edge: props.edge })
|
const onEdgeMouseEnter = (event: MouseEvent) => store.hooks.edgeMouseEnter.trigger({ event, edge: props.edge })
|
||||||
|
|
||||||
const onEdgeMouseMove = (event: MouseEvent) => hooks.edgeMouseMove.trigger({ event, edge: props.edge })
|
const onEdgeMouseMove = (event: MouseEvent) => store.hooks.edgeMouseMove.trigger({ event, edge: props.edge })
|
||||||
|
|
||||||
const onEdgeMouseLeave = (event: MouseEvent) => hooks.edgeMouseLeave.trigger({ event, edge: props.edge })
|
const onEdgeMouseLeave = (event: MouseEvent) => store.hooks.edgeMouseLeave.trigger({ event, edge: props.edge })
|
||||||
|
|
||||||
const handler = useHandle()
|
const handler = useHandle()
|
||||||
const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => {
|
const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => {
|
||||||
@@ -45,9 +44,9 @@ const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => {
|
|||||||
const isValidConnection = () => true
|
const isValidConnection = () => true
|
||||||
const isTarget = isSourceHandle
|
const isTarget = isSourceHandle
|
||||||
|
|
||||||
hooks.edgeUpdateStart.trigger({ event, edge: props.edge })
|
store.hooks.edgeUpdateStart.trigger({ event, edge: props.edge })
|
||||||
handler(event, handleId, nodeId, isTarget, isValidConnection, isSourceHandle ? 'target' : 'source', (connection) =>
|
handler(event, handleId, nodeId, isTarget, isValidConnection, isSourceHandle ? 'target' : 'source', (connection) =>
|
||||||
hooks.edgeUpdate.trigger({ edge: props.edge, connection }),
|
store.hooks.edgeUpdate.trigger({ edge: props.edge, connection }),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { useHandle, useHooks, useStore } from '../../composables'
|
import { useHandle, useStore } from '../../composables'
|
||||||
import { Position, ValidConnectionFunc } from '../../types'
|
import { Position, ValidConnectionFunc } from '../../types'
|
||||||
import { NodeId } from '~/context'
|
import { NodeId } from '../../context'
|
||||||
|
|
||||||
interface HandleProps {
|
interface HandleProps {
|
||||||
id?: string
|
id?: string
|
||||||
@@ -19,7 +19,6 @@ const props = withDefaults(defineProps<HandleProps>(), {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const hooks = useHooks()
|
|
||||||
const nodeId = inject(NodeId)!
|
const nodeId = inject(NodeId)!
|
||||||
|
|
||||||
const handler = useHandle()
|
const handler = useHandle()
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { DraggableEventListener, DraggableCore } from '@braks/revue-draggable'
|
import { DraggableEventListener, DraggableCore } from '@braks/revue-draggable'
|
||||||
import { useHooks, useStore } from '../../composables'
|
import { useStore } from '../../composables'
|
||||||
import { Node, NodeType, SnapGrid } from '../../types'
|
import { Node, NodeType, SnapGrid } from '../../types'
|
||||||
import { NodeId } from '~/context'
|
import { NodeId } from '../../context'
|
||||||
|
|
||||||
interface NodeProps {
|
interface NodeProps {
|
||||||
node: Node
|
node: Node
|
||||||
@@ -18,7 +18,6 @@ const props = withDefaults(defineProps<NodeProps>(), {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const hooks = useHooks()
|
|
||||||
provide(NodeId, props.node.id)
|
provide(NodeId, props.node.id)
|
||||||
|
|
||||||
const nodeElement = templateRef<HTMLDivElement>('node-element', null)
|
const nodeElement = templateRef<HTMLDivElement>('node-element', null)
|
||||||
@@ -33,15 +32,15 @@ const connectable = computed(() =>
|
|||||||
const scale = computed(() => store.transform[2])
|
const scale = computed(() => store.transform[2])
|
||||||
|
|
||||||
const onMouseEnterHandler = () =>
|
const onMouseEnterHandler = () =>
|
||||||
props.node.__rf?.isDragging && ((event: MouseEvent) => hooks.nodeMouseEnter.trigger({ event, node: props.node }))
|
props.node.__rf?.isDragging && ((event: MouseEvent) => store.hooks.nodeMouseEnter.trigger({ event, node: props.node }))
|
||||||
|
|
||||||
const onMouseMoveHandler = () =>
|
const onMouseMoveHandler = () =>
|
||||||
props.node.__rf?.isDragging && ((event: MouseEvent) => hooks.nodeMouseMove.trigger({ event, node: props.node }))
|
props.node.__rf?.isDragging && ((event: MouseEvent) => store.hooks.nodeMouseMove.trigger({ event, node: props.node }))
|
||||||
|
|
||||||
const onMouseLeaveHandler = () =>
|
const onMouseLeaveHandler = () =>
|
||||||
props.node.__rf?.isDragging && ((event: MouseEvent) => hooks.nodeMouseLeave.trigger({ event, node: props.node }))
|
props.node.__rf?.isDragging && ((event: MouseEvent) => store.hooks.nodeMouseLeave.trigger({ event, node: props.node }))
|
||||||
|
|
||||||
const onContextMenuHandler = () => (event: MouseEvent) => hooks.nodeContextMenu.trigger({ event, node: props.node })
|
const onContextMenuHandler = () => (event: MouseEvent) => store.hooks.nodeContextMenu.trigger({ event, node: props.node })
|
||||||
|
|
||||||
const onSelectNodeHandler = (event: MouseEvent) => {
|
const onSelectNodeHandler = (event: MouseEvent) => {
|
||||||
if (!draggable.value) {
|
if (!draggable.value) {
|
||||||
@@ -51,13 +50,13 @@ const onSelectNodeHandler = (event: MouseEvent) => {
|
|||||||
|
|
||||||
if (!props.selected) store.addSelectedElements([n])
|
if (!props.selected) store.addSelectedElements([n])
|
||||||
}
|
}
|
||||||
hooks.nodeClick.trigger({ event, node: n })
|
store.hooks.nodeClick.trigger({ event, node: n })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onDragStart: DraggableEventListener = ({ event }) => {
|
const onDragStart: DraggableEventListener = ({ event }) => {
|
||||||
const n = props.node
|
const n = props.node
|
||||||
hooks.nodeDragStart.trigger({ event, node: n })
|
store.hooks.nodeDragStart.trigger({ event, node: n })
|
||||||
|
|
||||||
if (props.selectNodesOnDrag && selectable) {
|
if (props.selectNodesOnDrag && selectable) {
|
||||||
store.unsetNodesSelection()
|
store.unsetNodesSelection()
|
||||||
@@ -73,7 +72,7 @@ const onDrag: DraggableEventListener = ({ event, data }) => {
|
|||||||
const n = props.node
|
const n = props.node
|
||||||
n.position.x += data.deltaX
|
n.position.x += data.deltaX
|
||||||
n.position.y += data.deltaY
|
n.position.y += data.deltaY
|
||||||
hooks.nodeDrag.trigger({ event, node: n })
|
store.hooks.nodeDrag.trigger({ event, node: n })
|
||||||
|
|
||||||
store.updateNodePosDiff({
|
store.updateNodePosDiff({
|
||||||
id: props.node.id,
|
id: props.node.id,
|
||||||
@@ -93,7 +92,7 @@ const onDragStop: DraggableEventListener = ({ event }) => {
|
|||||||
if (selectable.value && !props.selectNodesOnDrag && !props.selected) {
|
if (selectable.value && !props.selectNodesOnDrag && !props.selected) {
|
||||||
store.addSelectedElements([n])
|
store.addSelectedElements([n])
|
||||||
}
|
}
|
||||||
hooks.nodeClick.trigger({ event, node: n })
|
store.hooks.nodeClick.trigger({ event, node: n })
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -103,7 +102,7 @@ const onDragStop: DraggableEventListener = ({ event }) => {
|
|||||||
isDragging: false,
|
isDragging: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
hooks.nodeDragStop.trigger({ event, node: n })
|
store.hooks.nodeDragStop.trigger({ event, node: n })
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { Draggable, DraggableEventListener } from '@braks/revue-draggable'
|
import { Draggable, DraggableEventListener } from '@braks/revue-draggable'
|
||||||
import { useHooks, useStore } from '../../composables'
|
import { useStore } from '../../composables'
|
||||||
import { Node } from '../../types'
|
import { Node } from '../../types'
|
||||||
import { getRectOfNodes, isNode } from '../../utils'
|
import { getRectOfNodes, isNode } from '../../utils'
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const hooks = useHooks()
|
|
||||||
|
|
||||||
const selectedNodes = store.selectedElements
|
const selectedNodes = store.selectedElements
|
||||||
? store.selectedElements.filter(isNode).map((selectedNode) => {
|
? store.selectedElements.filter(isNode).map((selectedNode) => {
|
||||||
@@ -29,12 +28,12 @@ const innerStyle = {
|
|||||||
|
|
||||||
const onStart: DraggableEventListener = ({ event }) => {
|
const onStart: DraggableEventListener = ({ event }) => {
|
||||||
const nodes = selectedNodes
|
const nodes = selectedNodes
|
||||||
hooks.selectionDragStart.trigger({ event, nodes })
|
store.hooks.selectionDragStart.trigger({ event, nodes })
|
||||||
}
|
}
|
||||||
|
|
||||||
const onDrag: DraggableEventListener = ({ event, data }) => {
|
const onDrag: DraggableEventListener = ({ event, data }) => {
|
||||||
const nodes = selectedNodes
|
const nodes = selectedNodes
|
||||||
hooks.selectionDrag.trigger({ event, nodes })
|
store.hooks.selectionDrag.trigger({ event, nodes })
|
||||||
store.updateNodePosDiff({
|
store.updateNodePosDiff({
|
||||||
diff: {
|
diff: {
|
||||||
x: data.deltaX,
|
x: data.deltaX,
|
||||||
@@ -46,7 +45,7 @@ const onDrag: DraggableEventListener = ({ event, data }) => {
|
|||||||
|
|
||||||
const onStop: DraggableEventListener = ({ event }) => {
|
const onStop: DraggableEventListener = ({ event }) => {
|
||||||
const nodes = selectedNodes
|
const nodes = selectedNodes
|
||||||
hooks.selectionDragStop.trigger({ event, nodes })
|
store.hooks.selectionDragStop.trigger({ event, nodes })
|
||||||
store.updateNodePosDiff({
|
store.updateNodePosDiff({
|
||||||
isDragging: false,
|
isDragging: false,
|
||||||
})
|
})
|
||||||
@@ -54,7 +53,7 @@ const onStop: DraggableEventListener = ({ event }) => {
|
|||||||
|
|
||||||
const onContextMenu = (event: MouseEvent) => {
|
const onContextMenu = (event: MouseEvent) => {
|
||||||
const nodes = selectedNodes
|
const nodes = selectedNodes
|
||||||
hooks.selectionContextMenu.trigger({ event, nodes })
|
store.hooks.selectionContextMenu.trigger({ event, nodes })
|
||||||
}
|
}
|
||||||
|
|
||||||
const transform = computed(() => store.transform)
|
const transform = computed(() => store.transform)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import useStore from './useStore'
|
import useStore from './useStore'
|
||||||
import useHooks from './useHooks'
|
|
||||||
import { getHostForElement } from '~/utils'
|
import { getHostForElement } from '~/utils'
|
||||||
import { Connection, ConnectionMode, ElementId, HandleType, ValidConnectionFunc } from '~/types'
|
import { Connection, ConnectionMode, ElementId, HandleType, ValidConnectionFunc } from '~/types'
|
||||||
|
|
||||||
@@ -70,7 +69,6 @@ const resetRecentHandle = (hoveredHandle: Element): void => {
|
|||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const hooks = useHooks()
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
event: MouseEvent,
|
event: MouseEvent,
|
||||||
@@ -107,7 +105,7 @@ export default () => {
|
|||||||
connectionHandleId: handleId,
|
connectionHandleId: handleId,
|
||||||
connectionHandleType: handleType,
|
connectionHandleType: handleType,
|
||||||
})
|
})
|
||||||
hooks.connectStart.trigger({ event, params: { nodeId, handleId, handleType } })
|
store.hooks.connectStart.trigger({ event, params: { nodeId, handleId, handleType } })
|
||||||
|
|
||||||
function onMouseMove(event: MouseEvent) {
|
function onMouseMove(event: MouseEvent) {
|
||||||
store.connectionPosition.x = event.clientX - containerBounds.left
|
store.connectionPosition.x = event.clientX - containerBounds.left
|
||||||
@@ -147,16 +145,16 @@ export default () => {
|
|||||||
doc,
|
doc,
|
||||||
)
|
)
|
||||||
|
|
||||||
hooks.connectStop.trigger(event)
|
store.hooks.connectStop.trigger(event)
|
||||||
|
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
hooks.connect.trigger(connection)
|
store.hooks.connect.trigger(connection)
|
||||||
onEdgeUpdate?.(connection)
|
onEdgeUpdate?.(connection)
|
||||||
}
|
}
|
||||||
|
|
||||||
hooks.connectEnd.trigger(event)
|
store.hooks.connectEnd.trigger(event)
|
||||||
|
|
||||||
if (elementEdgeUpdaterType) hooks.edgeUpdateEnd.trigger(event)
|
if (elementEdgeUpdaterType) store.hooks.edgeUpdateEnd.trigger(event)
|
||||||
|
|
||||||
resetRecentHandle(recentHoveredHandle)
|
resetRecentHandle(recentHoveredHandle)
|
||||||
store.setConnectionNodeId({ connectionNodeId: undefined, connectionHandleId: undefined, connectionHandleType: undefined })
|
store.setConnectionNodeId({ connectionNodeId: undefined, connectionHandleId: undefined, connectionHandleType: undefined })
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import useStore from './useStore'
|
|
||||||
import {
|
import {
|
||||||
Connection,
|
Connection,
|
||||||
Edge,
|
Edge,
|
||||||
@@ -10,6 +9,7 @@ import {
|
|||||||
OnConnectStartParams,
|
OnConnectStartParams,
|
||||||
FlowInstance,
|
FlowInstance,
|
||||||
FlowEvents,
|
FlowEvents,
|
||||||
|
FlowStore,
|
||||||
} from '~/types'
|
} from '~/types'
|
||||||
import { Hooks } from '~/context'
|
import { Hooks } from '~/context'
|
||||||
|
|
||||||
@@ -66,10 +66,9 @@ const bind = (emit: EmitFunc, hooks: FlowHooks) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default (emit?: EmitFunc) => {
|
export default (store: FlowStore, emit?: EmitFunc) => {
|
||||||
let hooks = inject(Hooks)!
|
let hooks = inject(Hooks)!
|
||||||
if (!hooks) {
|
if (!hooks) {
|
||||||
const store = useStore()
|
|
||||||
if (import.meta.env.DEV) console.warn('hooks context not found; creating default hooks')
|
if (import.meta.env.DEV) console.warn('hooks context not found; creating default hooks')
|
||||||
hooks = store.hooks
|
hooks = store.hooks
|
||||||
if (typeof emit === 'function') bind(emit, hooks)
|
if (typeof emit === 'function') bind(emit, hooks)
|
||||||
|
|||||||
@@ -1,16 +1,37 @@
|
|||||||
import { FlowOptions } from '~/types'
|
import { FlowExportObject, FlowOptions } from '~/types'
|
||||||
import { useFlowStore, initialState } from '~/store'
|
import { useFlowStore, initialState } from '~/store'
|
||||||
import { Store } from '~/context'
|
import { Store } from '~/context'
|
||||||
|
import { onLoadToObject } from '~/utils'
|
||||||
|
|
||||||
|
let id = 0
|
||||||
export default (options?: Partial<FlowOptions>) => {
|
export default (options?: Partial<FlowOptions>) => {
|
||||||
let store = inject(Store)!
|
let store = inject(Store)!
|
||||||
|
const withStorage = options?.storageKey ?? false
|
||||||
|
|
||||||
if (!store) {
|
if (!store) {
|
||||||
if (import.meta.env.DEV) console.warn('store context not found; creating default store')
|
if (import.meta.env.DEV) console.warn('store context not found; creating default store')
|
||||||
store = useFlowStore({
|
let storedState = ref<FlowExportObject>()
|
||||||
...initialState(),
|
const initial = initialState()
|
||||||
|
const storageKey = typeof options?.storageKey === 'string' ? options.storageKey : options?.id ?? `vue-flow-${id++}`
|
||||||
|
if (withStorage) {
|
||||||
|
storedState = useStorage(storageKey, {} as FlowExportObject)
|
||||||
|
if (storedState.value) {
|
||||||
|
initial.elements = storedState.value.elements ?? options?.elements ?? []
|
||||||
|
if (storedState.value.position && storedState.value.zoom)
|
||||||
|
initial.transform = [storedState.value.position[0], storedState.value.position[1], storedState.value.zoom]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const preloadedState = {
|
||||||
|
...initial,
|
||||||
...options,
|
...options,
|
||||||
})()
|
}
|
||||||
|
store = useFlowStore(storageKey, preloadedState)()
|
||||||
|
if (withStorage && storageKey === store.$id) {
|
||||||
|
const toObject = onLoadToObject(store)
|
||||||
|
store.$subscribe(() => {
|
||||||
|
storedState.value = toObject()
|
||||||
|
})
|
||||||
|
}
|
||||||
provide(Store, store)
|
provide(Store, store)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import useHooks from './useHooks'
|
import useHooks from './useHooks'
|
||||||
import useStore from './useStore'
|
import useStore from './useStore'
|
||||||
import { EmitFunc } from '~/types'
|
import { EmitFunc, FlowOptions } from '~/types'
|
||||||
|
|
||||||
export const initFlow = (emit: EmitFunc) => {
|
export const initFlow = (emit: EmitFunc, options: Partial<FlowOptions>) => {
|
||||||
const store = useStore()
|
const store = useStore(options)
|
||||||
const hooks = useHooks(emit)
|
const hooks = useHooks(store, emit)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
store,
|
store,
|
||||||
@@ -12,4 +12,4 @@ export const initFlow = (emit: EmitFunc) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default () => useStore()
|
export default (options?: Partial<FlowOptions>) => useStore(options)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ElementId, FlowElement, KeyCode } from '../../types'
|
import { ElementId, FlowElement, KeyCode } from '../../types'
|
||||||
import { useHooks, useStore, useKeyPress } from '../../composables'
|
import { useStore, useKeyPress } from '../../composables'
|
||||||
import NodesSelection from '../../components/NodesSelection/NodesSelection.vue'
|
import NodesSelection from '../../components/NodesSelection/NodesSelection.vue'
|
||||||
import UserSelection from '../../components/UserSelection/UserSelection.vue'
|
import UserSelection from '../../components/UserSelection/UserSelection.vue'
|
||||||
import { getConnectedEdges, isNode } from '../../utils'
|
import { getConnectedEdges, isNode } from '../../utils'
|
||||||
@@ -17,17 +17,16 @@ const props = withDefaults(defineProps<SelectionPaneProps>(), {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const hooks = useHooks()
|
|
||||||
|
|
||||||
const onClick = (event: MouseEvent) => {
|
const onClick = (event: MouseEvent) => {
|
||||||
hooks.paneClick.trigger(event)
|
store.hooks.paneClick.trigger(event)
|
||||||
store.unsetNodesSelection()
|
store.unsetNodesSelection()
|
||||||
store.resetSelectedElements()
|
store.resetSelectedElements()
|
||||||
}
|
}
|
||||||
|
|
||||||
const onContextMenu = (event: MouseEvent) => hooks.paneContextMenu.trigger(event)
|
const onContextMenu = (event: MouseEvent) => store.hooks.paneContextMenu.trigger(event)
|
||||||
|
|
||||||
const onWheel = (event: WheelEvent) => hooks.paneScroll.trigger(event)
|
const onWheel = (event: WheelEvent) => store.hooks.paneScroll.trigger(event)
|
||||||
|
|
||||||
const selectionKeyPresed = ref(false)
|
const selectionKeyPresed = ref(false)
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@ onMounted(() => {
|
|||||||
new Map<ElementId, FlowElement>(),
|
new Map<ElementId, FlowElement>(),
|
||||||
)
|
)
|
||||||
|
|
||||||
hooks.elementsRemove.trigger(Array.from(elementsToRemove.values()))
|
store.hooks.elementsRemove.trigger(Array.from(elementsToRemove.values()))
|
||||||
store.unsetNodesSelection()
|
store.unsetNodesSelection()
|
||||||
store.resetSelectedElements()
|
store.resetSelectedElements()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import {
|
|||||||
TranslateExtent,
|
TranslateExtent,
|
||||||
NodeExtent,
|
NodeExtent,
|
||||||
FlowOptions,
|
FlowOptions,
|
||||||
FlowEvents,
|
|
||||||
} from '../../types'
|
} from '../../types'
|
||||||
import ZoomPane from '../../container/ZoomPane/ZoomPane.vue'
|
import ZoomPane from '../../container/ZoomPane/ZoomPane.vue'
|
||||||
import SelectionPane from '../../container/SelectionPane/SelectionPane.vue'
|
import SelectionPane from '../../container/SelectionPane/SelectionPane.vue'
|
||||||
@@ -21,7 +20,7 @@ import NodeRenderer from '../../container/NodeRenderer/NodeRenderer.vue'
|
|||||||
import EdgeRenderer from '../../container/EdgeRenderer/EdgeRenderer.vue'
|
import EdgeRenderer from '../../container/EdgeRenderer/EdgeRenderer.vue'
|
||||||
import { DefaultNode, InputNode, OutputNode } from '../../components/Nodes'
|
import { DefaultNode, InputNode, OutputNode } from '../../components/Nodes'
|
||||||
import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge } from '../../components/Edges'
|
import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge } from '../../components/Edges'
|
||||||
import { initFlow } from '~/composables'
|
import { createHooks, initFlow } from '../../composables'
|
||||||
|
|
||||||
export interface FlowProps extends FlowOptions {
|
export interface FlowProps extends FlowOptions {
|
||||||
elements: Elements
|
elements: Elements
|
||||||
@@ -59,6 +58,7 @@ export interface FlowProps extends FlowOptions {
|
|||||||
edgeUpdaterRadius?: number
|
edgeUpdaterRadius?: number
|
||||||
edgeTypesId?: string
|
edgeTypesId?: string
|
||||||
nodeTypesId?: string
|
nodeTypesId?: string
|
||||||
|
storage?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
const props = withDefaults(defineProps<FlowProps>(), {
|
const props = withDefaults(defineProps<FlowProps>(), {
|
||||||
@@ -100,9 +100,8 @@ const props = withDefaults(defineProps<FlowProps>(), {
|
|||||||
edgeTypesId: '1',
|
edgeTypesId: '1',
|
||||||
nodeTypesId: '1',
|
nodeTypesId: '1',
|
||||||
})
|
})
|
||||||
export type DefineFlowEvents = { (event: keyof FlowEvents, flowEvent: FlowEvents[keyof FlowEvents]): void }
|
|
||||||
|
|
||||||
const emit = defineEmits<DefineFlowEvents>()
|
const emit = defineEmits(Object.keys(createHooks()))
|
||||||
|
|
||||||
const defaultNodeTypes: Record<string, NodeType> = {
|
const defaultNodeTypes: Record<string, NodeType> = {
|
||||||
input: InputNode as NodeType,
|
input: InputNode as NodeType,
|
||||||
@@ -117,11 +116,10 @@ const defaultEdgeTypes: Record<string, EdgeType> = {
|
|||||||
smoothstep: SmoothStepEdge as EdgeType,
|
smoothstep: SmoothStepEdge as EdgeType,
|
||||||
}
|
}
|
||||||
|
|
||||||
const { store, hooks } = initFlow(emit)
|
const { store, hooks } = initFlow(emit, props)
|
||||||
|
|
||||||
const init = (opts: typeof props) => {
|
const init = (opts: typeof props) => {
|
||||||
store.$state = { ...store.$state, ...opts }
|
store.$state = { ...store.$state, ...(props as any) }
|
||||||
store.setElements(opts.elements)
|
|
||||||
store.setMinZoom(opts.minZoom)
|
store.setMinZoom(opts.minZoom)
|
||||||
store.setMaxZoom(opts.maxZoom)
|
store.setMaxZoom(opts.maxZoom)
|
||||||
store.setTranslateExtent(opts.translateExtent)
|
store.setTranslateExtent(opts.translateExtent)
|
||||||
@@ -147,10 +145,12 @@ invoke(async () => {
|
|||||||
watch(
|
watch(
|
||||||
elements,
|
elements,
|
||||||
(val, oldVal) => {
|
(val, oldVal) => {
|
||||||
const hasDiff = diff(val, oldVal)
|
nextTick(() => {
|
||||||
if (hasDiff.length > 0) store.setElements(val)
|
const hasDiff = diff(val, oldVal)
|
||||||
|
if (hasDiff.length > 0) store.setElements(val)
|
||||||
|
})
|
||||||
},
|
},
|
||||||
{ flush: 'pre', deep: true },
|
{ flush: 'post', deep: true },
|
||||||
)
|
)
|
||||||
|
|
||||||
const nodeTypes = computed(() => {
|
const nodeTypes = computed(() => {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { D3ZoomEvent, zoom, zoomIdentity, ZoomTransform } from 'd3-zoom'
|
|||||||
import { get, invoke } from '@vueuse/core'
|
import { get, invoke } from '@vueuse/core'
|
||||||
import { pointer, select } from 'd3-selection'
|
import { pointer, select } from 'd3-selection'
|
||||||
import { FlowInstance, FlowTransform, KeyCode, PanOnScrollMode } from '../../types'
|
import { FlowInstance, FlowTransform, KeyCode, PanOnScrollMode } from '../../types'
|
||||||
import { useHooks, useKeyPress, useStore, useZoomPanHelper } from '../../composables'
|
import { useKeyPress, useStore, useZoomPanHelper } from '../../composables'
|
||||||
import { clamp, onLoadGetElements, onLoadProject, onLoadToObject } from '../../utils'
|
import { clamp, onLoadGetElements, onLoadProject, onLoadToObject } from '../../utils'
|
||||||
|
|
||||||
interface ZoomPaneProps {
|
interface ZoomPaneProps {
|
||||||
@@ -34,7 +34,6 @@ const props = withDefaults(defineProps<ZoomPaneProps>(), {
|
|||||||
paneMoveable: true,
|
paneMoveable: true,
|
||||||
})
|
})
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const hooks = useHooks()
|
|
||||||
|
|
||||||
const zoomPaneEl = templateRef<HTMLDivElement>('zoomPane', null)
|
const zoomPaneEl = templateRef<HTMLDivElement>('zoomPane', null)
|
||||||
|
|
||||||
@@ -75,7 +74,7 @@ invoke(async () => {
|
|||||||
if (viewChanged(transform.value, event.transform)) {
|
if (viewChanged(transform.value, event.transform)) {
|
||||||
const flowTransform = eventToFlowTransform(event.transform)
|
const flowTransform = eventToFlowTransform(event.transform)
|
||||||
transform.value = flowTransform
|
transform.value = flowTransform
|
||||||
hooks.moveStart.trigger(flowTransform)
|
store.hooks.moveStart.trigger(flowTransform)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -83,7 +82,7 @@ invoke(async () => {
|
|||||||
if (viewChanged(transform.value, event.transform)) {
|
if (viewChanged(transform.value, event.transform)) {
|
||||||
const flowTransform = eventToFlowTransform(event.transform)
|
const flowTransform = eventToFlowTransform(event.transform)
|
||||||
transform.value = flowTransform
|
transform.value = flowTransform
|
||||||
hooks.moveEnd.trigger(flowTransform)
|
store.hooks.moveEnd.trigger(flowTransform)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -95,7 +94,7 @@ invoke(async () => {
|
|||||||
if (viewChanged(transform.value, event.transform)) {
|
if (viewChanged(transform.value, event.transform)) {
|
||||||
const flowTransform = eventToFlowTransform(event.transform)
|
const flowTransform = eventToFlowTransform(event.transform)
|
||||||
transform.value = flowTransform
|
transform.value = flowTransform
|
||||||
hooks.move.trigger(flowTransform)
|
store.hooks.move.trigger(flowTransform)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -196,7 +195,7 @@ invoke(async () => {
|
|||||||
getElements: onLoadGetElements(store),
|
getElements: onLoadGetElements(store),
|
||||||
toObject: onLoadToObject(store),
|
toObject: onLoadToObject(store),
|
||||||
}
|
}
|
||||||
hooks.load.trigger(instance)
|
store.hooks.load.trigger(instance)
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ type NextElements = {
|
|||||||
nextEdges: Edge[]
|
nextEdges: Edge[]
|
||||||
}
|
}
|
||||||
const pinia = createPinia()
|
const pinia = createPinia()
|
||||||
let id = 0
|
|
||||||
|
|
||||||
const parseElements = (elements: Elements, nodes: Node[], edges: Edge[], nodeExtent: NodeExtent) => {
|
const parseElements = (elements: Elements, nodes: Node[], edges: Edge[], nodeExtent: NodeExtent) => {
|
||||||
const nextElements: NextElements = {
|
const nextElements: NextElements = {
|
||||||
@@ -68,11 +67,14 @@ const parseElements = (elements: Elements, nodes: Node[], edges: Edge[], nodeExt
|
|||||||
return nextElements
|
return nextElements
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function flowStore(preloadedState: FlowState): StoreDefinition<string, FlowState, any, FlowActions> {
|
export default function flowStore(id: string, preloadedState: FlowState): StoreDefinition<string, FlowState, any, FlowActions> {
|
||||||
setActivePinia(pinia)
|
setActivePinia(pinia)
|
||||||
|
const { nextEdges, nextNodes } = parseElements(preloadedState.elements, [], [], preloadedState.nodeExtent)
|
||||||
|
preloadedState.nodes = nextNodes
|
||||||
|
preloadedState.edges = nextEdges
|
||||||
|
|
||||||
return defineStore({
|
return defineStore({
|
||||||
id: `vue-flow-${id++}`,
|
id: id ?? 'vue-flow',
|
||||||
state: () => ({
|
state: () => ({
|
||||||
...preloadedState,
|
...preloadedState,
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ export const initialState = (): FlowState => ({
|
|||||||
|
|
||||||
isReady: false,
|
isReady: false,
|
||||||
hooks: createHooks(),
|
hooks: createHooks(),
|
||||||
|
storageKey: undefined,
|
||||||
|
|
||||||
vueFlowVersion: typeof __VUE_FLOW_VERSION__ !== 'undefined' ? __VUE_FLOW_VERSION__ : '-',
|
vueFlowVersion: typeof __VUE_FLOW_VERSION__ !== 'undefined' ? __VUE_FLOW_VERSION__ : '-',
|
||||||
})
|
})
|
||||||
|
|||||||
+4
-3
@@ -1,14 +1,14 @@
|
|||||||
import { Store } from 'pinia'
|
import { Store } from 'pinia'
|
||||||
import { Dimensions, ElementId, Elements, Rect, SelectionRect, SnapGrid, Transform, XYPosition } from './types'
|
import { Dimensions, ElementId, Elements, FlowOptions, Rect, SelectionRect, SnapGrid, Transform, XYPosition } from './types'
|
||||||
import { HandleType } from './handle'
|
import { HandleType } from './handle'
|
||||||
import { ConnectionMode, OnConnectEndFunc, OnConnectFunc, OnConnectStartFunc, OnConnectStopFunc } from './connection'
|
import { ConnectionMode, OnConnectEndFunc, OnConnectFunc, OnConnectStartFunc, OnConnectStopFunc } from './connection'
|
||||||
import { Edge, EdgeType } from './edge'
|
import { Edge, EdgeType } from './edge'
|
||||||
import { Node, NodeExtent, NodeType, TranslateExtent } from './node'
|
import { Node, NodeExtent, NodeType, TranslateExtent } from './node'
|
||||||
import { FlowActions } from './actions'
|
import { FlowActions } from './actions'
|
||||||
import { D3Selection, D3Zoom, D3ZoomHandler } from './panel'
|
import { D3Selection, D3Zoom, D3ZoomHandler } from './panel'
|
||||||
import { FlowHooks } from '~/types/hooks'
|
import { FlowHooks } from './hooks'
|
||||||
|
|
||||||
export interface FlowState {
|
export interface FlowState extends FlowOptions {
|
||||||
dimensions: Dimensions
|
dimensions: Dimensions
|
||||||
transform: Transform
|
transform: Transform
|
||||||
elements: Elements
|
elements: Elements
|
||||||
@@ -56,6 +56,7 @@ export interface FlowState {
|
|||||||
|
|
||||||
isReady: boolean
|
isReady: boolean
|
||||||
hooks: FlowHooks
|
hooks: FlowHooks
|
||||||
|
storageKey?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export type FlowStore = Store<string, FlowState, any, FlowActions>
|
export type FlowStore = Store<string, FlowState, any, FlowActions>
|
||||||
|
|||||||
@@ -124,4 +124,5 @@ export interface FlowOptions extends Omit<HTMLAttributes, 'onLoad'> {
|
|||||||
edgeUpdaterRadius?: number
|
edgeUpdaterRadius?: number
|
||||||
nodeTypesId?: string
|
nodeTypesId?: string
|
||||||
edgeTypesId?: string
|
edgeTypesId?: string
|
||||||
|
storageKey?: string
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user