+
@@ -76,8 +91,8 @@ export default {
class-name="nodrag"
style="pointer-events: all"
:target="visible ? el : undefined"
- :resizable="true"
- :rotatable="true"
+ :resizable="resizable"
+ :rotatable="rotatable"
:snappable="snapToGrid"
:snap-element="snapToGrid"
:snap-gap="snapToGrid"
diff --git a/packages/resize-rotate-node/src/node/types.ts b/packages/resize-rotate-node/src/node/types.ts
new file mode 100644
index 00000000..35f22227
--- /dev/null
+++ b/packages/resize-rotate-node/src/node/types.ts
@@ -0,0 +1,27 @@
+import type { Dimensions, ElementData, Position } from '@braks/vue-flow'
+import type { MoveableProps } from 'vue3-moveable'
+import type { CSSProperties } from 'vue'
+
+export interface ResizeRotateNodeEmits {
+ (event: 'updateNodeInternals'): void
+ (event: 'resize', dimensions: Dimensions): void
+ (event: 'rotate', rotation: number): void
+}
+
+export interface ResizeRotateNodeData extends ElementData {
+ rotate: number
+ translate: number[]
+ dimensions: Dimensions
+ style: CSSProperties
+}
+
+export interface ResizeRotateNodeProps {
+ id: string
+ label: string
+ targetPosition: Position
+ sourcePosition: Position
+ resizable?: boolean
+ rotatable?: boolean
+ data: ResizeRotateNodeData
+ moveableProps?: MoveableProps
+}
diff --git a/packages/resize-rotate-node/src/node/utils.ts b/packages/resize-rotate-node/src/node/utils.ts
index 8ed074d5..24f9bcb2 100644
--- a/packages/resize-rotate-node/src/node/utils.ts
+++ b/packages/resize-rotate-node/src/node/utils.ts
@@ -1,35 +1,57 @@
import type { Able, MoveableEvents, MoveableManagerInterface } from 'vue3-moveable'
+import type { GraphNode } from '@braks/vue-flow'
+import { useVueFlow } from '@braks/vue-flow'
+import type { ResizeRotateNodeData, ResizeRotateNodeEmits } from './types'
-export function useMoveable(id: string, emits: (event: 'updateNodeInternals') => void) {
- const frame = reactive({
- translate: [0, 0],
- rotate: 0,
- })
+export function useMoveable(id: string, emits: ResizeRotateNodeEmits) {
+ const { findNode } = useVueFlow()
+ const node = findNode(id)! as GraphNode
+
+ if (!node.data) {
+ node.data = {
+ translate: [0, 0],
+ rotate: 0,
+ style: {},
+ dimensions: { width: NaN, height: NaN },
+ }
+ }
+ if (!node.data.style) node.data.style = {}
+ if (!node.data.rotate) node.data.rotate = 0
+ if (!node.data.translate) node.data.translate = [0, 0]
+ if (!node.data.dimensions) node.data.dimensions = { width: NaN, height: NaN }
const onResizeStart = (e: MoveableEvents['resizeStart']) => {
e.setOrigin(['%', '%'])
if (e.dragStart) {
- e.dragStart.set(frame.translate)
+ e.dragStart.set(node.data!.translate)
}
}
const onResize = (e: MoveableEvents['resize']) => {
- frame.translate = e.drag.beforeTranslate
+ node.data!.translate = e.drag.beforeTranslate
+ node.data!.dimensions = { width: e.width, height: e.height }
+
e.target.style.width = `${e.width}px`
e.target.style.height = `${e.height}px`
- e.target.style.transform = `translate(${frame.translate[0]}px, ${frame.translate[1]}px)` + ` rotate(${frame.rotate}deg)`
+ e.target.style.transform =
+ `translate(${node.data!.translate[0]}px, ${node.data!.translate[1]}px)` + ` rotate(${node.data!.rotate}deg)`
+
+ emits('resize', { width: e.width, height: e.height })
}
const onRotateStart = (e: MoveableEvents['rotateStart']) => {
- e.set(frame.rotate)
+ e.set(node.data!.rotate)
}
const onRotate = (e: MoveableEvents['rotate']) => {
- frame.rotate = e.beforeRotate
- e.target.style.transform = `translate(${frame.translate[0]}px, ${frame.translate[1]}px)` + ` rotate(${frame.rotate}deg)`
+ node.data!.rotate = e.beforeRotate
+
+ e.target.style.transform =
+ `translate(${node.data!.translate[0]}px, ${node.data!.translate[1]}px)` + ` rotate(${node.data!.rotate}deg)`
emits('updateNodeInternals')
+ emits('rotate', node.data!.rotate)
}
return {