|
@ -3,7 +3,8 @@ |
|
|
<template v-for="(item, index) in list" :key="item.key"> |
|
|
<template v-for="(item, index) in list" :key="item.key"> |
|
|
<node @onDragstart="onDragstart" @onDragEnd="onDragEnd" @onDrop="onDrop" :data-source-key="dataSourceKey" |
|
|
<node @onDragstart="onDragstart" @onDragEnd="onDragEnd" @onDrop="onDrop" :data-source-key="dataSourceKey" |
|
|
:data="item" :list="list" :level="level" @click="(item) => clickNode(item)"> |
|
|
:data="item" :list="list" :level="level" @click="(item) => clickNode(item)"> |
|
|
<template #default="{ data, deep, dataSourceKey, status }: { data: INiuTreeData, deep: number, dataSourceKey: INiuTreeKey, status: ENiuTreeStatus }"> |
|
|
<template |
|
|
|
|
|
#default="{ data, deep, dataSourceKey, status }: { data: INiuTreeData, deep: number, dataSourceKey: INiuTreeKey, status: ENiuTreeStatus }"> |
|
|
<slot :data="data" :deep="deep" :dataSourceKey="dataSourceKey" :status="status"></slot> |
|
|
<slot :data="data" :deep="deep" :dataSourceKey="dataSourceKey" :status="status"></slot> |
|
|
</template> |
|
|
</template> |
|
|
</node> |
|
|
</node> |
|
@ -31,6 +32,7 @@ const props = withDefaults( |
|
|
autoExpand?: boolean |
|
|
autoExpand?: boolean |
|
|
justOpenOne?: boolean |
|
|
justOpenOne?: boolean |
|
|
level?: number |
|
|
level?: number |
|
|
|
|
|
dropFn?(status: ENiuTreeStatus, data: INiuTreeData, targetData: INiuTreeData): boolean | Promise<boolean> |
|
|
}>(), |
|
|
}>(), |
|
|
{ |
|
|
{ |
|
|
justOpenOne: false, |
|
|
justOpenOne: false, |
|
@ -69,56 +71,60 @@ function onDragstart(key: INiuTreeKey) { |
|
|
function onDragEnd(key: INiuTreeKey) { |
|
|
function onDragEnd(key: INiuTreeKey) { |
|
|
dataSourceKey.value = undefined |
|
|
dataSourceKey.value = undefined |
|
|
} |
|
|
} |
|
|
function onDrop(key: INiuTreeKey, status?: ENiuTreeStatus) { |
|
|
async function onDrop(key: INiuTreeKey, status?: ENiuTreeStatus) { |
|
|
if (!dataSourceKey.value) return |
|
|
if (!dataSourceKey.value) return |
|
|
if (!key) return |
|
|
if (!key) return |
|
|
let data = findByKey(dataSourceKey.value, props.list) |
|
|
let data = findByKey(dataSourceKey.value, props.list) |
|
|
let targetData = findByKey(key, props.list) |
|
|
let targetData = findByKey(key, props.list) |
|
|
switch (status) { |
|
|
const sourceKey = dataSourceKey.value; |
|
|
case ENiuTreeStatus.DragIn: |
|
|
dataSourceKey.value = undefined |
|
|
if ( |
|
|
const isSuccess = (await props.dropFn?.(status, data, targetData)) |
|
|
data && |
|
|
if (isSuccess == undefined || isSuccess) { |
|
|
targetData && |
|
|
switch (status) { |
|
|
dataSourceKey.value != key && |
|
|
case ENiuTreeStatus.DragIn: |
|
|
!isChildOf(key, dataSourceKey.value, props.list) && |
|
|
if ( |
|
|
targetData.children |
|
|
data && |
|
|
) { |
|
|
targetData && |
|
|
removeByKey(dataSourceKey.value, props.list) |
|
|
sourceKey != key && |
|
|
targetData.children.push(data) |
|
|
!isChildOf(key, sourceKey, props.list) && |
|
|
if (props.autoExpand) { |
|
|
targetData.children |
|
|
targetData.isExpand = true |
|
|
) { |
|
|
|
|
|
removeByKey(sourceKey, props.list) |
|
|
|
|
|
targetData.children.push(data) |
|
|
|
|
|
if (props.autoExpand) { |
|
|
|
|
|
targetData.isExpand = true |
|
|
|
|
|
} |
|
|
|
|
|
emit("change") |
|
|
|
|
|
} |
|
|
|
|
|
break |
|
|
|
|
|
case ENiuTreeStatus.DragDown: |
|
|
|
|
|
// 按索引往列表添加节点 |
|
|
|
|
|
if ( |
|
|
|
|
|
data && |
|
|
|
|
|
targetData && |
|
|
|
|
|
sourceKey != key && |
|
|
|
|
|
!isChildOf(key, sourceKey, props.list) |
|
|
|
|
|
) { |
|
|
|
|
|
removeByKey(sourceKey, props.list) |
|
|
|
|
|
insertAfterByKey(key, data, props.list) |
|
|
|
|
|
emit("change") |
|
|
} |
|
|
} |
|
|
emit("change") |
|
|
break |
|
|
} |
|
|
case ENiuTreeStatus.DragUp: |
|
|
break |
|
|
// 按索引往列表添加节点 |
|
|
case ENiuTreeStatus.DragDown: |
|
|
if ( |
|
|
// 按索引往列表添加节点 |
|
|
data && |
|
|
if ( |
|
|
targetData && |
|
|
data && |
|
|
sourceKey != key && |
|
|
targetData && |
|
|
!isChildOf(key, sourceKey, props.list) |
|
|
dataSourceKey.value != key && |
|
|
) { |
|
|
!isChildOf(key, dataSourceKey.value, props.list) |
|
|
removeByKey(sourceKey, props.list) |
|
|
) { |
|
|
insertBeforeByKey(key, data, props.list) |
|
|
removeByKey(dataSourceKey.value, props.list) |
|
|
emit("change") |
|
|
insertAfterByKey(key, data, props.list) |
|
|
} |
|
|
emit("change") |
|
|
break |
|
|
} |
|
|
} |
|
|
break |
|
|
|
|
|
case ENiuTreeStatus.DragUp: |
|
|
|
|
|
// 按索引往列表添加节点 |
|
|
|
|
|
if ( |
|
|
|
|
|
data && |
|
|
|
|
|
targetData && |
|
|
|
|
|
dataSourceKey.value != key && |
|
|
|
|
|
!isChildOf(key, dataSourceKey.value, props.list) |
|
|
|
|
|
) { |
|
|
|
|
|
removeByKey(dataSourceKey.value, props.list) |
|
|
|
|
|
insertBeforeByKey(key, data, props.list) |
|
|
|
|
|
emit("change") |
|
|
|
|
|
} |
|
|
|
|
|
break |
|
|
|
|
|
} |
|
|
} |
|
|
dataSourceKey.value = undefined |
|
|
|
|
|
} |
|
|
} |
|
|
</script> |
|
|
</script> |
|
|
|
|
|
|
|
|