Add draggable/droppable flags

This commit is contained in:
huchenlei
2024-08-31 20:38:34 -04:00
committed by Chenlei Hu
parent 50f1ca8eaf
commit 86e7c12e27
2 changed files with 37 additions and 28 deletions

View File

@@ -78,36 +78,41 @@ onMounted(() => {
treeNodeElement.value = container.value?.closest( treeNodeElement.value = container.value?.closest(
'.p-tree-node-content' '.p-tree-node-content'
) as HTMLElement ) as HTMLElement
dropTargetCleanup = dropTargetForElements({ if (props.node.droppable) {
element: treeNodeElement.value, dropTargetCleanup = dropTargetForElements({
onDrop: (event) => { element: treeNodeElement.value,
const dndData = event.source.data as TreeExplorerDragAndDropData onDrop: (event) => {
if (dndData.type === 'tree-explorer-node') { const dndData = event.source.data as TreeExplorerDragAndDropData
if (dndData.type === 'tree-explorer-node') {
canDrop.value = false
emit('itemDropped', props.node, dndData.data)
}
},
onDragEnter: (event) => {
const dndData = event.source.data as TreeExplorerDragAndDropData
if (dndData.type === 'tree-explorer-node') {
canDrop.value = true
}
},
onDragLeave: () => {
canDrop.value = false canDrop.value = false
emit('itemDropped', props.node, dndData.data)
} }
}, })
onDragEnter: (event) => { }
const dndData = event.source.data as TreeExplorerDragAndDropData
if (dndData.type === 'tree-explorer-node') { if (props.node.draggable) {
canDrop.value = true draggableCleanup = draggable({
} element: treeNodeElement.value,
}, getInitialData() {
onDragLeave: () => { return {
canDrop.value = false type: 'tree-explorer-node',
} data: props.node
}) }
draggableCleanup = draggable({ },
element: treeNodeElement.value, onDragStart: () => emit('dragStart', props.node),
getInitialData() { onDrop: () => emit('dragEnd', props.node)
return { })
type: 'tree-explorer-node', }
data: props.node
}
},
onDragStart: () => emit('dragStart', props.node),
onDrop: () => emit('dragEnd', props.node)
})
}) })
onUnmounted(() => { onUnmounted(() => {
dropTargetCleanup() dropTargetCleanup()

View File

@@ -15,6 +15,10 @@ export interface TreeExplorerNode<T = any> {
node: TreeExplorerNode<T>, node: TreeExplorerNode<T>,
child: TreeExplorerNode<T> child: TreeExplorerNode<T>
) => void ) => void
// Whether the node is draggable
draggable?: boolean
// Whether the node is droppable
droppable?: boolean
} }
export interface RenderedTreeExplorerNode<T = any> extends TreeExplorerNode<T> { export interface RenderedTreeExplorerNode<T = any> extends TreeExplorerNode<T> {