refactor(edges): Make edge updating optional
* add an option to enable edge updating globally * pass an option to an edge to enable updating for a single edge Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
@@ -65,6 +65,7 @@ const toggleclasss = () => {
|
|||||||
@connect="onConnect"
|
@connect="onConnect"
|
||||||
@node-drag-stop="onNodeDragStop"
|
@node-drag-stop="onNodeDragStop"
|
||||||
@node-click="onElementClick"
|
@node-click="onElementClick"
|
||||||
|
@edge-update="log"
|
||||||
@load="onLoad"
|
@load="onLoad"
|
||||||
>
|
>
|
||||||
<MiniMap />
|
<MiniMap />
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ const onElementsRemove = (elementsToRemove: Elements) => (elements.value = remov
|
|||||||
:snap-grid="snapGrid"
|
:snap-grid="snapGrid"
|
||||||
@element-click="onElementClick"
|
@element-click="onElementClick"
|
||||||
@elements-remove="onElementsRemove"
|
@elements-remove="onElementsRemove"
|
||||||
@eonnect="onConnect"
|
@connect="onConnect"
|
||||||
@pane-click="onPaneClick"
|
@pane-click="onPaneClick"
|
||||||
@pane-scroll="onPaneScroll"
|
@pane-scroll="onPaneScroll"
|
||||||
@pane-contex-menu="onPaneContextMenu"
|
@pane-contex-menu="onPaneContextMenu"
|
||||||
@@ -158,6 +158,7 @@ const onElementsRemove = (elementsToRemove: Elements) => (elements.value = remov
|
|||||||
@selection-change="onSelectionChange"
|
@selection-change="onSelectionChange"
|
||||||
@move-end="onMoveEnd"
|
@move-end="onMoveEnd"
|
||||||
@load="onLoad"
|
@load="onLoad"
|
||||||
|
@edge-update="onEdgeMouseMove"
|
||||||
@edge-context-menu="onEdgeContextMenu"
|
@edge-context-menu="onEdgeContextMenu"
|
||||||
@edge-mouse-enter="onEdgeMouseEnter"
|
@edge-mouse-enter="onEdgeMouseEnter"
|
||||||
@edge-mouse-move="onEdgeMouseMove"
|
@edge-mouse-move="onEdgeMouseMove"
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ interface EdgeWrapper {
|
|||||||
markerEndId?: string
|
markerEndId?: string
|
||||||
edgeUpdaterRadius?: number
|
edgeUpdaterRadius?: number
|
||||||
selectable?: boolean
|
selectable?: boolean
|
||||||
|
updatable?: boolean
|
||||||
dimensions: Dimensions
|
dimensions: Dimensions
|
||||||
transform: Transform
|
transform: Transform
|
||||||
}
|
}
|
||||||
@@ -192,7 +193,12 @@ export default {
|
|||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
</slot>
|
</slot>
|
||||||
<g @mousedown="onEdgeUpdaterSourceMouseDown" @mouseenter="onEdgeUpdaterMouseEnter" @mouseout="onEdgeUpdaterMouseOut">
|
<g
|
||||||
|
v-if="props.updatable"
|
||||||
|
@mousedown="onEdgeUpdaterSourceMouseDown"
|
||||||
|
@mouseenter="onEdgeUpdaterMouseEnter"
|
||||||
|
@mouseout="onEdgeUpdaterMouseOut"
|
||||||
|
>
|
||||||
<EdgeAnchor
|
<EdgeAnchor
|
||||||
:position="sourcePosition"
|
:position="sourcePosition"
|
||||||
:center-x="edgePos.sourceX"
|
:center-x="edgePos.sourceX"
|
||||||
@@ -200,7 +206,12 @@ export default {
|
|||||||
:radius="props.edgeUpdaterRadius"
|
:radius="props.edgeUpdaterRadius"
|
||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
<g @mousedown="onEdgeUpdaterTargetMouseDown" @mouseenter="onEdgeUpdaterMouseEnter" @mouseout="onEdgeUpdaterMouseOut">
|
<g
|
||||||
|
v-if="props.updatable"
|
||||||
|
@mousedown="onEdgeUpdaterTargetMouseDown"
|
||||||
|
@mouseenter="onEdgeUpdaterMouseEnter"
|
||||||
|
@mouseout="onEdgeUpdaterMouseOut"
|
||||||
|
>
|
||||||
<EdgeAnchor
|
<EdgeAnchor
|
||||||
:position="targetPosition"
|
:position="targetPosition"
|
||||||
:center-x="edgePos.targetX"
|
:center-x="edgePos.targetX"
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ export const createHooks = (): FlowHooks => ({
|
|||||||
paneScroll: createEventHook(),
|
paneScroll: createEventHook(),
|
||||||
paneClick: createEventHook(),
|
paneClick: createEventHook(),
|
||||||
paneContextMenu: createEventHook(),
|
paneContextMenu: createEventHook(),
|
||||||
edgeUpdate: createEventHook(),
|
|
||||||
edgeContextMenu: createEventHook(),
|
edgeContextMenu: createEventHook(),
|
||||||
edgeMouseEnter: createEventHook(),
|
edgeMouseEnter: createEventHook(),
|
||||||
edgeMouseMove: createEventHook(),
|
edgeMouseMove: createEventHook(),
|
||||||
@@ -37,6 +36,7 @@ export const createHooks = (): FlowHooks => ({
|
|||||||
edgeDoubleClick: createEventHook(),
|
edgeDoubleClick: createEventHook(),
|
||||||
edgeClick: createEventHook(),
|
edgeClick: createEventHook(),
|
||||||
edgeUpdateStart: createEventHook(),
|
edgeUpdateStart: createEventHook(),
|
||||||
|
edgeUpdate: createEventHook(),
|
||||||
edgeUpdateEnd: createEventHook(),
|
edgeUpdateEnd: createEventHook(),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -34,12 +34,14 @@ interface EdgeRendererProps {
|
|||||||
connectionPosition?: XYPosition
|
connectionPosition?: XYPosition
|
||||||
connectionMode: ConnectionMode
|
connectionMode: ConnectionMode
|
||||||
nodesConnectable?: boolean
|
nodesConnectable?: boolean
|
||||||
|
edgesUpdatable?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
const props = withDefaults(defineProps<EdgeRendererProps>(), {
|
const props = withDefaults(defineProps<EdgeRendererProps>(), {
|
||||||
arrowHeadColor: '#b1b1b7',
|
arrowHeadColor: '#b1b1b7',
|
||||||
connectionLineType: ConnectionLineType.Bezier,
|
connectionLineType: ConnectionLineType.Bezier,
|
||||||
edgeUpdaterRadius: 10,
|
edgeUpdaterRadius: 10,
|
||||||
|
handleEdgeUpdate: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
const getType = (type?: string) => {
|
const getType = (type?: string) => {
|
||||||
@@ -85,6 +87,7 @@ export default {
|
|||||||
:edge="edge"
|
:edge="edge"
|
||||||
:component="getType(edge.type)"
|
:component="getType(edge.type)"
|
||||||
:selectable="props.elementsSelectable"
|
:selectable="props.elementsSelectable"
|
||||||
|
:updatable="typeof edge.updatable === 'undefined' ? props.edgesUpdatable : edge.updatable"
|
||||||
:edge-updater-radius="props.edgeUpdaterRadius"
|
:edge-updater-radius="props.edgeUpdaterRadius"
|
||||||
:dimensions="props.dimensions"
|
:dimensions="props.dimensions"
|
||||||
:transform="props.transform"
|
:transform="props.transform"
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ interface FlowProps extends FlowOptions {
|
|||||||
snapToGrid?: boolean
|
snapToGrid?: boolean
|
||||||
snapGrid?: [number, number]
|
snapGrid?: [number, number]
|
||||||
onlyRenderVisibleElements?: boolean
|
onlyRenderVisibleElements?: boolean
|
||||||
|
edgesUpdatable?: boolean
|
||||||
nodesDraggable?: boolean
|
nodesDraggable?: boolean
|
||||||
nodesConnectable?: boolean
|
nodesConnectable?: boolean
|
||||||
elementsSelectable?: boolean
|
elementsSelectable?: boolean
|
||||||
@@ -61,8 +62,6 @@ interface FlowProps extends FlowOptions {
|
|||||||
loading?: Loading
|
loading?: Loading
|
||||||
}
|
}
|
||||||
|
|
||||||
const emit = defineEmits([...Object.keys(createHooks()), 'update:modelValue'])
|
|
||||||
|
|
||||||
const props = withDefaults(defineProps<FlowProps>(), {
|
const props = withDefaults(defineProps<FlowProps>(), {
|
||||||
modelValue: () => [],
|
modelValue: () => [],
|
||||||
connectionMode: ConnectionMode.Loose,
|
connectionMode: ConnectionMode.Loose,
|
||||||
@@ -74,6 +73,7 @@ const props = withDefaults(defineProps<FlowProps>(), {
|
|||||||
snapToGrid: false,
|
snapToGrid: false,
|
||||||
snapGrid: () => [15, 15],
|
snapGrid: () => [15, 15],
|
||||||
onlyRenderVisibleElements: false,
|
onlyRenderVisibleElements: false,
|
||||||
|
edgesUpdatable: false,
|
||||||
nodesConnectable: true,
|
nodesConnectable: true,
|
||||||
nodesDraggable: true,
|
nodesDraggable: true,
|
||||||
elementsSelectable: true,
|
elementsSelectable: true,
|
||||||
@@ -102,6 +102,7 @@ const props = withDefaults(defineProps<FlowProps>(), {
|
|||||||
edgeUpdaterRadius: 10,
|
edgeUpdaterRadius: 10,
|
||||||
loading: false,
|
loading: false,
|
||||||
})
|
})
|
||||||
|
const emit = defineEmits([...Object.keys(createHooks()).filter((key) => key !== 'edgeUpdate'), 'update:modelValue'])
|
||||||
const store = initFlow(emit, typeof props.storageKey === 'string' ? props.storageKey : props.id)
|
const store = initFlow(emit, typeof props.storageKey === 'string' ? props.storageKey : props.id)
|
||||||
const elements = useVModel(props, 'modelValue', emit)
|
const elements = useVModel(props, 'modelValue', emit)
|
||||||
const options = Object.assign({}, store.$state, props)
|
const options = Object.assign({}, store.$state, props)
|
||||||
@@ -117,21 +118,23 @@ const { pause: pauseModel, resume: resumeModel } = pausableWatch(
|
|||||||
)
|
)
|
||||||
const { pause, resume } = pausableWatch(elements, async (val) => await store.setElements(val), { flush: 'post' })
|
const { pause, resume } = pausableWatch(elements, async (val) => await store.setElements(val), { flush: 'post' })
|
||||||
|
|
||||||
until(() => store.isReady).toBe(true).then(() => {
|
until(() => store.isReady)
|
||||||
watch(
|
.toBe(true)
|
||||||
() => store.elements,
|
.then(() => {
|
||||||
(val) => {
|
watch(
|
||||||
pause()
|
() => store.elements,
|
||||||
pauseModel()
|
(val) => {
|
||||||
elements.value = val
|
pause()
|
||||||
setTimeout(() => {
|
pauseModel()
|
||||||
resume()
|
elements.value = val
|
||||||
resumeModel()
|
setTimeout(() => {
|
||||||
}, 1)
|
resume()
|
||||||
},
|
resumeModel()
|
||||||
{ flush: 'post', deep: true },
|
}, 1)
|
||||||
)
|
},
|
||||||
})
|
{ flush: 'post', deep: true },
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
const transitionName = computed(() => {
|
const transitionName = computed(() => {
|
||||||
let name = ''
|
let name = ''
|
||||||
@@ -144,11 +147,7 @@ const transitionName = computed(() => {
|
|||||||
|
|
||||||
onBeforeUnmount(() => store?.$dispose())
|
onBeforeUnmount(() => store?.$dispose())
|
||||||
</script>
|
</script>
|
||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: 'VueFlow'
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<template>
|
<template>
|
||||||
<div class="vue-flow">
|
<div class="vue-flow">
|
||||||
<Transition :key="`vue-flow-transition-${store.$id}`" :name="transitionName">
|
<Transition :key="`vue-flow-transition-${store.$id}`" :name="transitionName">
|
||||||
@@ -222,6 +221,7 @@ export default {
|
|||||||
:arrow-head-color="store.arrowHeadColor"
|
:arrow-head-color="store.arrowHeadColor"
|
||||||
:marker-end-id="store.markerEndId"
|
:marker-end-id="store.markerEndId"
|
||||||
:only-render-visible-elements="store.onlyRenderVisibleElements"
|
:only-render-visible-elements="store.onlyRenderVisibleElements"
|
||||||
|
:edges-updatable="store.edgesUpdatable"
|
||||||
>
|
>
|
||||||
<template
|
<template
|
||||||
v-for="edgeName of Object.keys(store.getEdgeTypes)"
|
v-for="edgeName of Object.keys(store.getEdgeTypes)"
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ export default (id: string, preloadedState: FlowState) => {
|
|||||||
if (typeof state.elementsSelectable !== 'undefined') this.elementsSelectable = state.elementsSelectable
|
if (typeof state.elementsSelectable !== 'undefined') this.elementsSelectable = state.elementsSelectable
|
||||||
if (typeof state.onlyRenderVisibleElements !== 'undefined')
|
if (typeof state.onlyRenderVisibleElements !== 'undefined')
|
||||||
this.onlyRenderVisibleElements = state.onlyRenderVisibleElements
|
this.onlyRenderVisibleElements = state.onlyRenderVisibleElements
|
||||||
|
if (typeof state.edgesUpdatable !== 'undefined') this.edgesUpdatable = state.edgesUpdatable
|
||||||
if (typeof state.nodesConnectable !== 'undefined') this.nodesConnectable = state.nodesConnectable
|
if (typeof state.nodesConnectable !== 'undefined') this.nodesConnectable = state.nodesConnectable
|
||||||
if (typeof state.nodesDraggable !== 'undefined') this.nodesDraggable = state.nodesDraggable
|
if (typeof state.nodesDraggable !== 'undefined') this.nodesDraggable = state.nodesDraggable
|
||||||
if (typeof state.arrowHeadColor !== 'undefined') this.arrowHeadColor = state.arrowHeadColor
|
if (typeof state.arrowHeadColor !== 'undefined') this.arrowHeadColor = state.arrowHeadColor
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ export interface Edge<T = any> {
|
|||||||
data?: T
|
data?: T
|
||||||
class?: string
|
class?: string
|
||||||
isHidden?: boolean
|
isHidden?: boolean
|
||||||
|
updatable?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface GraphEdge<T = any> extends Edge<T> {
|
export interface GraphEdge<T = any> extends Edge<T> {
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ export interface FlowOptions {
|
|||||||
snapToGrid?: boolean
|
snapToGrid?: boolean
|
||||||
snapGrid?: [number, number]
|
snapGrid?: [number, number]
|
||||||
onlyRenderVisibleElements?: boolean
|
onlyRenderVisibleElements?: boolean
|
||||||
|
edgesUpdatable?: boolean
|
||||||
nodesDraggable?: boolean
|
nodesDraggable?: boolean
|
||||||
nodesConnectable?: boolean
|
nodesConnectable?: boolean
|
||||||
elementsSelectable?: boolean
|
elementsSelectable?: boolean
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,6 @@ export interface FlowEvents {
|
|||||||
paneScroll: WheelEvent | undefined
|
paneScroll: WheelEvent | undefined
|
||||||
paneClick: MouseEvent
|
paneClick: MouseEvent
|
||||||
paneContextMenu: MouseEvent
|
paneContextMenu: MouseEvent
|
||||||
edgeUpdate: { edge: GraphEdge; connection: Connection }
|
|
||||||
edgeContextMenu: { event: MouseEvent; edge: GraphEdge }
|
edgeContextMenu: { event: MouseEvent; edge: GraphEdge }
|
||||||
edgeMouseEnter: { event: MouseEvent; edge: GraphEdge }
|
edgeMouseEnter: { event: MouseEvent; edge: GraphEdge }
|
||||||
edgeMouseMove: { event: MouseEvent; edge: GraphEdge }
|
edgeMouseMove: { event: MouseEvent; edge: GraphEdge }
|
||||||
@@ -44,6 +43,7 @@ export interface FlowEvents {
|
|||||||
edgeDoubleClick: { event: MouseEvent; edge: GraphEdge }
|
edgeDoubleClick: { event: MouseEvent; edge: GraphEdge }
|
||||||
edgeClick: { event: MouseEvent; edge: GraphEdge }
|
edgeClick: { event: MouseEvent; edge: GraphEdge }
|
||||||
edgeUpdateStart: { event: MouseEvent; edge: GraphEdge }
|
edgeUpdateStart: { event: MouseEvent; edge: GraphEdge }
|
||||||
|
edgeUpdate: { edge: GraphEdge; connection: Connection }
|
||||||
edgeUpdateEnd: { event: MouseEvent; edge: GraphEdge }
|
edgeUpdateEnd: { event: MouseEvent; edge: GraphEdge }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ export interface FlowState extends Omit<FlowOptions, 'elements'> {
|
|||||||
snapToGrid: boolean
|
snapToGrid: boolean
|
||||||
snapGrid: SnapGrid
|
snapGrid: SnapGrid
|
||||||
|
|
||||||
|
edgesUpdatable: boolean
|
||||||
nodesDraggable: boolean
|
nodesDraggable: boolean
|
||||||
nodesConnectable: boolean
|
nodesConnectable: boolean
|
||||||
elementsSelectable: boolean
|
elementsSelectable: boolean
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ export const initialState = (): FlowState => ({
|
|||||||
snapGrid: [15, 15],
|
snapGrid: [15, 15],
|
||||||
snapToGrid: false,
|
snapToGrid: false,
|
||||||
|
|
||||||
|
edgesUpdatable: false,
|
||||||
nodesDraggable: true,
|
nodesDraggable: true,
|
||||||
nodesConnectable: true,
|
nodesConnectable: true,
|
||||||
elementsSelectable: true,
|
elementsSelectable: true,
|
||||||
|
|||||||
Reference in New Issue
Block a user