jjb-lc-designable
Version:
基于alibaba-designable源码二次封装的表单设计器。
60 lines (58 loc) • 2.22 kB
text/typescript
import { Engine, CursorDragType } from '../models'
import { DragStartEvent, DragMoveEvent, DragStopEvent } from '../events'
export const useTranslateEffect = (engine: Engine) => {
engine.subscribeTo(DragStartEvent, (event) => {
const target = event.data.target as HTMLElement
const currentWorkspace =
event.context?.workspace ?? engine.workbench.activeWorkspace
const handler = target?.closest(`*[${engine.props.nodeTranslateAttrName}]`)
if (!currentWorkspace) return
const helper = currentWorkspace.operation.transformHelper
if (handler) {
const type = handler.getAttribute(engine.props.nodeTranslateAttrName)
if (type) {
const selectionElement = handler.closest(
`*[${engine.props.nodeSelectionIdAttrName}]`
) as HTMLElement
if (selectionElement) {
const nodeId = selectionElement.getAttribute(
engine.props.nodeSelectionIdAttrName
)
if (nodeId) {
const node = engine.findNodeById(nodeId)
if (node) {
helper.dragStart({ dragNodes: [node], type: 'translate' })
}
}
}
}
}
})
engine.subscribeTo(DragMoveEvent, (event) => {
if (engine.cursor.dragType !== CursorDragType.Translate) return
const currentWorkspace =
event.context?.workspace ?? engine.workbench.activeWorkspace
const helper = currentWorkspace?.operation.transformHelper
const dragNodes = helper.dragNodes
if (!dragNodes.length) return
helper.dragMove()
dragNodes.forEach((node) => {
const element = node.getElement()
helper.translate(node, (translate) => {
element.style.position = 'absolute'
element.style.left = '0px'
element.style.top = '0px'
element.style.transform = `translate3d(${translate.x}px,${translate.y}px,0)`
})
})
})
engine.subscribeTo(DragStopEvent, (event) => {
if (engine.cursor.dragType !== CursorDragType.Translate) return
const currentWorkspace =
event.context?.workspace ?? engine.workbench.activeWorkspace
const helper = currentWorkspace?.operation.transformHelper
if (helper) {
helper.dragEnd()
}
})
}