Browse Source

增加一些接口

master
1549469775 3 years ago
parent
commit
1cc2e69ecb
  1. 8
      packages/components/tree/node.vue
  2. 19
      packages/components/tree/tree.vue
  3. 5
      packages/playground/src/dev/tree.vue
  4. 2
      packages/princess-ui/package.json

8
packages/components/tree/node.vue

@ -40,6 +40,7 @@
@onDrop="(e: INiuTreeKey, s?: ENiuTreeStatus)=>emit('onDrop', e, s)" @onDrop="(e: INiuTreeKey, s?: ENiuTreeStatus)=>emit('onDrop', e, s)"
@onDragover="(e: INiuTreeKey)=>emit('onDragover', e)" @onDragover="(e: INiuTreeKey)=>emit('onDragover', e)"
@onDragleave="(e: INiuTreeKey)=>emit('onDragleave', e)" @onDragleave="(e: INiuTreeKey)=>emit('onDragleave', e)"
@expand="(e: INiuTreeData)=>emit('expand', e)"
@click="(e: INiuTreeData)=>emit('click', e)" @click="(e: INiuTreeData)=>emit('click', e)"
:data-source-key="dataSourceKey" :data-source-key="dataSourceKey"
:data="item" :data="item"
@ -60,7 +61,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import node from './node.vue' import node from './node.vue'
import { inject, ref, provide, renderSlot, useSlots } from 'vue' import { inject, ref, provide, renderSlot, useSlots, watch } from 'vue'
import { isChildOf } from './util' import { isChildOf } from './util'
import renderNode from './renderNode' import renderNode from './renderNode'
import type { INiuTreeData, INiuTreeKey } from './type' import type { INiuTreeData, INiuTreeKey } from './type'
@ -79,11 +80,16 @@ const props = withDefaults(
const slots = useSlots() const slots = useSlots()
const aa = (fuck: any)=>renderSlot(slots, "default", fuck) const aa = (fuck: any)=>renderSlot(slots, "default", fuck)
watch(()=>props.data.isExpand, ()=>{
emit("expand", props.data)
})
const opts = inject("tree:opts", { const opts = inject("tree:opts", {
justOpen: false justOpen: false
}) })
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'click', data: INiuTreeData): void (e: 'click', data: INiuTreeData): void
(e: 'expand', data: INiuTreeData): void
(e: 'onDragstart', key: INiuTreeKey): void (e: 'onDragstart', key: INiuTreeKey): void
(e: 'onDragend', key: INiuTreeKey): void (e: 'onDragend', key: INiuTreeKey): void
(e: 'onDrop', key: INiuTreeKey, status?: ENiuTreeStatus): void (e: 'onDrop', key: INiuTreeKey, status?: ENiuTreeStatus): void

19
packages/components/tree/tree.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="ps-tree component"> <div class="ps-tree component">
<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" @expand="onExpand" @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 <template
#default="{ data, deep, dataSourceKey, status }: { data: INiuTreeData, deep: number, dataSourceKey: INiuTreeKey, status: ENiuTreeStatus }"> #default="{ data, deep, dataSourceKey, status }: { data: INiuTreeData, deep: number, dataSourceKey: INiuTreeKey, status: ENiuTreeStatus }">
@ -45,6 +45,10 @@ const slot = useSlots()
provide("tree:opts", props) provide("tree:opts", props)
function onExpand(item: INiuTreeData) {
emit("expand", item)
}
function clickNode(item: INiuTreeData) { function clickNode(item: INiuTreeData) {
if (props.justOpenOne) { if (props.justOpenOne) {
forEachTree(props.list, (node: INiuTreeData) => { forEachTree(props.list, (node: INiuTreeData) => {
@ -60,6 +64,7 @@ function clickNode(item: INiuTreeData) {
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'change'): void (e: 'change'): void
(e: 'expand', data: INiuTreeData): void
(e: 'itemDragstart'): void (e: 'itemDragstart'): void
}>() }>()
@ -78,8 +83,6 @@ async function onDrop(key: INiuTreeKey, status?: ENiuTreeStatus) {
let targetData = findByKey(key, props.list) let targetData = findByKey(key, props.list)
const sourceKey = dataSourceKey.value; const sourceKey = dataSourceKey.value;
dataSourceKey.value = undefined dataSourceKey.value = undefined
const isSuccess = (await props.dropFn?.(status, data, targetData))
if (isSuccess == undefined || isSuccess) {
switch (status) { switch (status) {
case ENiuTreeStatus.DragIn: case ENiuTreeStatus.DragIn:
if ( if (
@ -89,6 +92,8 @@ async function onDrop(key: INiuTreeKey, status?: ENiuTreeStatus) {
!isChildOf(key, sourceKey, props.list) && !isChildOf(key, sourceKey, props.list) &&
targetData.children targetData.children
) { ) {
const isSuccess = (await props.dropFn?.(status, data, targetData))
if (isSuccess == undefined || isSuccess) {
removeByKey(sourceKey, props.list) removeByKey(sourceKey, props.list)
targetData.children.push(data) targetData.children.push(data)
if (props.autoExpand) { if (props.autoExpand) {
@ -96,6 +101,7 @@ async function onDrop(key: INiuTreeKey, status?: ENiuTreeStatus) {
} }
emit("change") emit("change")
} }
}
break break
case ENiuTreeStatus.DragDown: case ENiuTreeStatus.DragDown:
// //
@ -105,10 +111,13 @@ async function onDrop(key: INiuTreeKey, status?: ENiuTreeStatus) {
sourceKey != key && sourceKey != key &&
!isChildOf(key, sourceKey, props.list) !isChildOf(key, sourceKey, props.list)
) { ) {
const isSuccess = (await props.dropFn?.(status, data, targetData))
if (isSuccess == undefined || isSuccess) {
removeByKey(sourceKey, props.list) removeByKey(sourceKey, props.list)
insertAfterByKey(key, data, props.list) insertAfterByKey(key, data, props.list)
emit("change") emit("change")
} }
}
break break
case ENiuTreeStatus.DragUp: case ENiuTreeStatus.DragUp:
// //
@ -118,12 +127,14 @@ async function onDrop(key: INiuTreeKey, status?: ENiuTreeStatus) {
sourceKey != key && sourceKey != key &&
!isChildOf(key, sourceKey, props.list) !isChildOf(key, sourceKey, props.list)
) { ) {
const isSuccess = (await props.dropFn?.(status, data, targetData))
if (isSuccess == undefined || isSuccess) {
removeByKey(sourceKey, props.list) removeByKey(sourceKey, props.list)
insertBeforeByKey(key, data, props.list) insertBeforeByKey(key, data, props.list)
emit("change") emit("change")
} }
break
} }
break
} }
} }
</script> </script>

5
packages/playground/src/dev/tree.vue

@ -24,7 +24,10 @@ const list = ref(convertTreeData([
title: "3" title: "3"
}, },
])) ]))
function onExpand(node: INiuTreeData) {
console.log(node);
}
const dropFn = (status: ENiuTreeStatus, data: INiuTreeData<any>, targetData: INiuTreeData<any>): Promise<boolean> => { const dropFn = (status: ENiuTreeStatus, data: INiuTreeData<any>, targetData: INiuTreeData<any>): Promise<boolean> => {
return new Promise((resolve) => { return new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
@ -49,7 +52,7 @@ const dropFn = (status: ENiuTreeStatus, data: INiuTreeData<any>, targetData: INi
</ps-tree> </ps-tree>
</Panel> </Panel>
<Panel name="Tree" desc="延迟2000ms执行操作"> <Panel name="Tree" desc="延迟2000ms执行操作">
<ps-tree :dropFn="dropFn" :list="list"> <ps-tree @expand="onExpand" :dropFn="dropFn" :list="list" auto-expand>
<template #default="{ data, deep }"> <template #default="{ data, deep }">
<div :style="{ <div :style="{
marginLeft: deep * 10 + 'px', marginLeft: deep * 10 + 'px',

2
packages/princess-ui/package.json

@ -1,6 +1,6 @@
{ {
"name": "princess-ui", "name": "princess-ui",
"version": "0.0.8-beta", "version": "0.0.8-beta.2",
"description": "a vue3 ui, just for personal use", "description": "a vue3 ui, just for personal use",
"scripts": { "scripts": {
"build": "tsc ./PrincessResolver.ts --skipLibCheck --esModuleInterop" "build": "tsc ./PrincessResolver.ts --skipLibCheck --esModuleInterop"

Loading…
Cancel
Save