feat: Add mini map node events
# What's changed? * Add events for mini map node click & dbl click * Receives event + node as parameters
This commit is contained in:
@@ -24,7 +24,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "ts-patch install -s",
|
"prepare": "ts-patch install -s",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"types": "vue-tsc --declaration --emitDeclarationOnly && tsc -p tsconfig.build.json && shx rm -rf tmp && yarn lint:dist",
|
"types": "yarn prepare && vue-tsc --declaration --emitDeclarationOnly && tsc -p tsconfig.build.json && shx rm -rf tmp && yarn lint:dist",
|
||||||
"typedoc": "typedoc --tsconfig tsconfig.docs.json dist/index.d.ts --out typedocs",
|
"typedoc": "typedoc --tsconfig tsconfig.docs.json dist/index.d.ts --out typedocs",
|
||||||
"theme": "postcss src/style.css -o dist/style.css && postcss src/theme-default.css -o dist/theme-default.css",
|
"theme": "postcss src/style.css -o dist/style.css && postcss src/theme-default.css -o dist/theme-default.css",
|
||||||
"lint": "eslint --ext \".js,.jsx,.ts,.tsx\" --fix --ignore-path ../.gitignore .",
|
"lint": "eslint --ext \".js,.jsx,.ts,.tsx\" --fix --ignore-path ../.gitignore .",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ShapeRendering, MiniMapNodeFunc } from '../../types'
|
import { ShapeRendering, MiniMapNodeFunc, GraphNode } from '../../types'
|
||||||
import { useVueFlow, useWindow } from '../../composables'
|
import { useVueFlow, useWindow } from '../../composables'
|
||||||
import { getBoundsofRects, getRectOfNodes } from '../../utils'
|
import { getBoundsofRects, getRectOfNodes } from '../../utils'
|
||||||
import type { MiniMapProps } from '../../types/components'
|
import type { MiniMapProps } from '../../types/components'
|
||||||
@@ -70,6 +70,14 @@ const d = computed(() => {
|
|||||||
h${-viewBB.value.width}z`
|
h${-viewBB.value.width}z`
|
||||||
else return ''
|
else return ''
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const onNodeClick = (event: MouseEvent, node: GraphNode) => {
|
||||||
|
store.hooks.miniMapNodeClick.trigger({ event, node })
|
||||||
|
}
|
||||||
|
|
||||||
|
const onNodeDblClick = (event: MouseEvent, node: GraphNode) => {
|
||||||
|
store.hooks.miniMapNodeDoubleClick.trigger({ event, node })
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
export default {
|
export default {
|
||||||
@@ -85,6 +93,7 @@ export default {
|
|||||||
>
|
>
|
||||||
<template v-for="node of store.getNodes" :key="`mini-map-node-${node.id}`">
|
<template v-for="node of store.getNodes" :key="`mini-map-node-${node.id}`">
|
||||||
<MiniMapNode
|
<MiniMapNode
|
||||||
|
:id="node.id"
|
||||||
:position="node.computedPosition"
|
:position="node.computedPosition"
|
||||||
:dimensions="node.dimensions"
|
:dimensions="node.dimensions"
|
||||||
:style="node.style"
|
:style="node.style"
|
||||||
@@ -94,13 +103,24 @@ export default {
|
|||||||
:stroke-color="nodeStrokeColorFunc(node)"
|
:stroke-color="nodeStrokeColorFunc(node)"
|
||||||
:stroke-width="props.nodeStrokeWidth"
|
:stroke-width="props.nodeStrokeWidth"
|
||||||
:shape-rendering="shapeRendering"
|
:shape-rendering="shapeRendering"
|
||||||
|
@click="(e) => onNodeClick(e, node)"
|
||||||
|
@dblclick="(e) => onNodeDblClick(e, node)"
|
||||||
>
|
>
|
||||||
<slot
|
<slot
|
||||||
|
:id="node.id"
|
||||||
:name="`node-${node.type}`"
|
:name="`node-${node.type}`"
|
||||||
:position="node.computedPosition"
|
:parent-node="node.parentNode"
|
||||||
:dimensions="node.dimensions"
|
|
||||||
:selected="node.selected"
|
:selected="node.selected"
|
||||||
:dragging="node.dragging"
|
:dragging="node.dragging"
|
||||||
|
:position="node.computedPosition"
|
||||||
|
:dimensions="node.dimensions"
|
||||||
|
:style="node.style"
|
||||||
|
:class="nodeClassNameFunc(node)"
|
||||||
|
:color="nodeColorFunc(node)"
|
||||||
|
:border-radius="props.nodeBorderRadius"
|
||||||
|
:stroke-color="nodeStrokeColorFunc(node)"
|
||||||
|
:stroke-width="props.nodeStrokeWidth"
|
||||||
|
:shape-rendering="shapeRendering"
|
||||||
/>
|
/>
|
||||||
</MiniMapNode>
|
</MiniMapNode>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -5,7 +5,10 @@ import type { MiniMapNodeProps } from '../../types/components'
|
|||||||
const props = withDefaults(defineProps<MiniMapNodeProps>(), {
|
const props = withDefaults(defineProps<MiniMapNodeProps>(), {
|
||||||
shapeRendering: 'geometricPrecision',
|
shapeRendering: 'geometricPrecision',
|
||||||
})
|
})
|
||||||
const attrs = useAttrs()
|
|
||||||
|
const emit = defineEmits(['click', 'dblClick'])
|
||||||
|
|
||||||
|
const attrs: any = useAttrs()
|
||||||
|
|
||||||
const styles = (attrs.style ?? {}) as CSSProperties
|
const styles = (attrs.style ?? {}) as CSSProperties
|
||||||
const fill = computed(() => props.color || (styles.background as string) || styles.backgroundColor)
|
const fill = computed(() => props.color || (styles.background as string) || styles.backgroundColor)
|
||||||
@@ -19,6 +22,7 @@ export default {
|
|||||||
<rect
|
<rect
|
||||||
class="vue-flow__minimap-node"
|
class="vue-flow__minimap-node"
|
||||||
:class="attrs.class"
|
:class="attrs.class"
|
||||||
|
:style="attrs.style"
|
||||||
:x="props.position.x"
|
:x="props.position.x"
|
||||||
:y="props.position.y"
|
:y="props.position.y"
|
||||||
:rx="props.borderRadius"
|
:rx="props.borderRadius"
|
||||||
@@ -29,6 +33,8 @@ export default {
|
|||||||
:stroke="props.strokeColor"
|
:stroke="props.strokeColor"
|
||||||
:stroke-width="props.strokeWidth"
|
:stroke-width="props.strokeWidth"
|
||||||
:shape-rendering="props.shapeRendering"
|
:shape-rendering="props.shapeRendering"
|
||||||
|
@click="emit('click')"
|
||||||
|
@dblClick="emit('dblClick')"
|
||||||
/>
|
/>
|
||||||
<slot />
|
<slot />
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
export { default as MiniMap } from './MiniMap/MiniMap.vue'
|
export { default as MiniMap } from './MiniMap/MiniMap.vue'
|
||||||
|
export { default as MiniMapNode } from './MiniMap/MiniMapNode.vue'
|
||||||
export { default as Controls } from './Controls/Controls.vue'
|
export { default as Controls } from './Controls/Controls.vue'
|
||||||
export { default as Background } from './Background/Background.vue'
|
export { default as Background } from './Background/Background.vue'
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ export const createHooks = (): FlowHooks => ({
|
|||||||
nodeDragStart: createEventHook(),
|
nodeDragStart: createEventHook(),
|
||||||
nodeDrag: createEventHook(),
|
nodeDrag: createEventHook(),
|
||||||
nodeDragStop: createEventHook(),
|
nodeDragStop: createEventHook(),
|
||||||
|
miniMapNodeClick: createEventHook(),
|
||||||
|
miniMapNodeDoubleClick: createEventHook(),
|
||||||
connect: createEventHook(),
|
connect: createEventHook(),
|
||||||
connectStart: createEventHook(),
|
connectStart: createEventHook(),
|
||||||
connectStop: createEventHook(),
|
connectStop: createEventHook(),
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ export interface FlowEvents<NodeData = ElementData, EdgeData = ElementData> {
|
|||||||
nodeDragStart: { event: MouseTouchEvent; node: GraphNode<NodeData> }
|
nodeDragStart: { event: MouseTouchEvent; node: GraphNode<NodeData> }
|
||||||
nodeDrag: { event: MouseTouchEvent; node: GraphNode<NodeData> }
|
nodeDrag: { event: MouseTouchEvent; node: GraphNode<NodeData> }
|
||||||
nodeDragStop: { event: MouseTouchEvent; node: GraphNode<NodeData> }
|
nodeDragStop: { event: MouseTouchEvent; node: GraphNode<NodeData> }
|
||||||
|
miniMapNodeClick: { event: MouseTouchEvent; node: GraphNode<NodeData> }
|
||||||
|
miniMapNodeDoubleClick: { event: MouseTouchEvent; node: GraphNode<NodeData> }
|
||||||
connect: Connection
|
connect: Connection
|
||||||
connectStart: {
|
connectStart: {
|
||||||
event: MouseEvent
|
event: MouseEvent
|
||||||
|
|||||||
Reference in New Issue
Block a user