You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
4.3 KiB
163 lines
4.3 KiB
import { INiuTreeData, INiuTreeKey, INiuTreeProps } from "./type"
|
|
|
|
export function convertTreeData(items: INiuTreeProps[]) {
|
|
return convertData<INiuTreeProps, INiuTreeData>(items)
|
|
}
|
|
export function convert(item: INiuTreeProps) {
|
|
return convertData<INiuTreeProps, INiuTreeData>([item])[0]
|
|
}
|
|
|
|
export function convertData<
|
|
T extends { children?: T[] },
|
|
S extends { children?: S[] }
|
|
>(data: T[] | S[]): S[] {
|
|
const transformData = data.map((item: any) => {
|
|
const children = item.children && convertData(item.children)
|
|
const result = {
|
|
...item,
|
|
isEdit: item?.isEdit?item.isEdit:false,
|
|
isNew: item?.isNew?item.isNew:false,
|
|
isFolder: !!children,
|
|
isExpand: item?.isExpand?item.isExpand:false, // 默认全部收缩
|
|
isFile: !children,
|
|
children,
|
|
} as S
|
|
return result
|
|
})
|
|
return transformData
|
|
}
|
|
|
|
export function sort(treeData: INiuTreeData[]) {
|
|
// 文件夹排前面
|
|
// 按文件名排序
|
|
}
|
|
|
|
export function flatTreeData(treeData: INiuTreeData[]): INiuTreeData[] {
|
|
let res: INiuTreeData[] = []
|
|
treeData.forEach((data) => {
|
|
res.push(data)
|
|
if (data.children) {
|
|
res = res.concat(flatTreeData(data.children))
|
|
}
|
|
})
|
|
return res
|
|
}
|
|
export function isChildOf(
|
|
a_key: INiuTreeKey,
|
|
b_key: INiuTreeKey,
|
|
treeData: INiuTreeData[]
|
|
) {
|
|
if (!a_key) return false
|
|
if (!b_key) return false
|
|
if (a_key === b_key) return false
|
|
|
|
let target_node = findByKey(b_key, treeData)
|
|
if (!target_node || !Array.isArray(target_node.children)) return false
|
|
|
|
return (
|
|
flatTreeData(target_node.children).findIndex((i) => i.key === a_key) >
|
|
-1
|
|
)
|
|
}
|
|
|
|
export function forEachTree(tree: INiuTreeData[], cb: (node: INiuTreeData)=>void) {
|
|
tree.forEach(v=>{
|
|
cb && cb(v)
|
|
if(v.children && v.children.length){
|
|
forEachTree(v.children, cb)
|
|
}
|
|
})
|
|
}
|
|
|
|
export function findByKey(
|
|
key: INiuTreeKey,
|
|
treeData: INiuTreeData[]
|
|
): INiuTreeData | undefined {
|
|
for (let i = 0; i < treeData.length; i++) {
|
|
const data = treeData[i]
|
|
if (data.key === key) {
|
|
return data
|
|
}
|
|
if (data.children && data.children.length) {
|
|
let result = findByKey(key, data.children)
|
|
if (result) {
|
|
return result
|
|
}
|
|
}
|
|
}
|
|
}
|
|
export function findByKeyParent(
|
|
key: INiuTreeKey,
|
|
treeData: INiuTreeData[]
|
|
): INiuTreeData | undefined {
|
|
for (let i = 0; i < treeData.length; i++) {
|
|
const data = treeData[i]
|
|
if (data.children?.map(v=>v.key).includes(key)) {
|
|
return data
|
|
}
|
|
if (data.children && data.children.length) {
|
|
let result = findByKeyParent(key, data.children)
|
|
if (result) {
|
|
return result
|
|
}
|
|
}
|
|
}
|
|
}
|
|
export function insertBeforeByKey(
|
|
key: INiuTreeKey,
|
|
node: INiuTreeData,
|
|
treeData: INiuTreeData[]
|
|
) {
|
|
if (!treeData || !treeData.length) {
|
|
return
|
|
}
|
|
for (let i = 0; i < treeData.length; i++) {
|
|
let data = treeData[i]
|
|
console.log(key)
|
|
|
|
if (data.key === key) {
|
|
console.log(node)
|
|
treeData.splice(i, 0, node)
|
|
break
|
|
}
|
|
if (data && data.children) {
|
|
insertBeforeByKey(key, node, data.children)
|
|
}
|
|
}
|
|
}
|
|
export function insertAfterByKey(
|
|
key: INiuTreeKey,
|
|
node: INiuTreeData,
|
|
treeData: INiuTreeData[]
|
|
) {
|
|
if (!treeData || !treeData.length) {
|
|
return
|
|
}
|
|
for (let i = 0; i < treeData.length; i++) {
|
|
let data = treeData[i]
|
|
if (data.key === key) {
|
|
treeData.splice(i + 1, 0, node)
|
|
break
|
|
}
|
|
if (data && data.children) {
|
|
insertAfterByKey(key, node, data.children)
|
|
}
|
|
}
|
|
}
|
|
// https://blog.csdn.net/baidu_36095053/article/details/121649810
|
|
export function removeByKey(key: INiuTreeKey, treeData: INiuTreeData[], cb?:(node: INiuTreeData)=>void) {
|
|
if (!treeData || !treeData.length) {
|
|
return
|
|
}
|
|
for (let i = 0; i < treeData.length; i++) {
|
|
let data = treeData[i]
|
|
if (data.key === key) {
|
|
cb && cb(data)
|
|
treeData.splice(i, 1)
|
|
break
|
|
}
|
|
if (data && data.children) {
|
|
removeByKey(key, data.children)
|
|
}
|
|
}
|
|
}
|
|
|