Skip to content

Commit

Permalink
feat(cdk:utils): add tree utils, fix data param of getAllSelectedKeys…
Browse files Browse the repository at this point in the history
…, fix filtered or paginated tree data value error (#1406)

* feat(cdk:utils): add tree utils

* fix(comp:transfer): correct `data` param of `getAllSelectedKeys`
 `data` param of `getAllSelectedKeys`  strategy fuction should be datasource when mod is immediate

* fix(pro:transfer): filtered or paginated tree data value error
when tree data is filtered or paginated, target data is overidden by new keys which should be appended insteadt
  • Loading branch information
sallerli1 committed Jan 13, 2023
1 parent 65328e7 commit 56035c1
Show file tree
Hide file tree
Showing 34 changed files with 1,060 additions and 572 deletions.
257 changes: 257 additions & 0 deletions packages/cdk/utils/__tests__/tree.spec.ts
@@ -0,0 +1,257 @@
import { filterTree, flattenTree, getTreeKeys, mapTree, mergeTree, traverseTree } from '../src/tree'

interface Data {
key: string
label: string
children?: Data[]
}

const treeData: Data[] = [
{
label: 'Node 0',
key: '0',
children: [
{
label: 'Node 0-0',
key: '0-0',
children: [
{ label: 'Node 0-0-0', key: '0-0-0' },
{ label: 'Node 0-0-1', key: '0-0-1' },
{ label: 'Node 0-0-2', key: '0-0-2' },
],
},
{
label: 'Node 0-1',
key: '0-1',
children: [
{ label: 'Node 0-1-0', key: '0-1-0' },
{ label: 'Node 0-1-1', key: '0-1-1' },
{ label: 'Node 0-1-2', key: '0-1-2' },
],
},
],
},
{ label: 'Node 1', key: '1' },
]
const treeDataKeys = ['0', '0-0', '0-0-0', '0-0-1', '0-0-2', '0-1', '0-1-0', '0-1-1', '0-1-2', '1']
const treeDataParentsMap = new Map<string, string[]>([
['0', []],
['1', []],
['0-0', ['0']],
['0-1', ['0']],
['0-0-0', ['0-0', '0']],
['0-0-1', ['0-0', '0']],
['0-0-2', ['0-0', '0']],
['0-1-0', ['0-1', '0']],
['0-1-1', ['0-1', '0']],
['0-1-2', ['0-1', '0']],
])

describe('tree.ts', () => {
test('traverseTree work', () => {
const keys: string[] = []
traverseTree(treeData, 'children', (item, parents) => {
keys.push(item.key)
expect(parents.map(parent => parent.key)).toEqual(treeDataParentsMap.get(item.key))
expect(parents.every(parent => parent.label === `Node ${parent.key}`)).toBeTruthy()
})

expect(keys).toEqual(treeDataKeys)
})

test('mapTree work', () => {
expect(
mapTree(treeData, 'children', (item, parents) => {
expect(parents.map(parent => parent.key)).toEqual(treeDataParentsMap.get(item.key))
expect(parents.every(parent => parent.label === `Node ${parent.key}`)).toBeTruthy()

return {
...item,
mapped: true,
}
}),
).toEqual([
{
label: 'Node 0',
key: '0',
mapped: true,
children: [
{
label: 'Node 0-0',
key: '0-0',
mapped: true,
children: [
{ label: 'Node 0-0-0', key: '0-0-0', mapped: true },
{ label: 'Node 0-0-1', key: '0-0-1', mapped: true },
{ label: 'Node 0-0-2', key: '0-0-2', mapped: true },
],
},
{
label: 'Node 0-1',
key: '0-1',
mapped: true,
children: [
{ label: 'Node 0-1-0', key: '0-1-0', mapped: true },
{ label: 'Node 0-1-1', key: '0-1-1', mapped: true },
{ label: 'Node 0-1-2', key: '0-1-2', mapped: true },
],
},
],
},
{ label: 'Node 1', key: '1', mapped: true },
])
})

test('filterTree work with straytegy or work', () => {
expect(
filterTree(
treeData,
'children',
(item, parents) => {
expect(parents.map(parent => parent.key)).toEqual(treeDataParentsMap.get(item.key))
expect(parents.every(parent => parent.label === `Node ${parent.key}`)).toBeTruthy()
return /1/.test(item.label)
},
'or',
),
).toEqual([
{
label: 'Node 0',
key: '0',
children: [
{
label: 'Node 0-0',
key: '0-0',
children: [{ label: 'Node 0-0-1', key: '0-0-1' }],
},
{
label: 'Node 0-1',
key: '0-1',
children: [
{ label: 'Node 0-1-0', key: '0-1-0' },
{ label: 'Node 0-1-1', key: '0-1-1' },
{ label: 'Node 0-1-2', key: '0-1-2' },
],
},
],
},
{ label: 'Node 1', key: '1' },
])
})

test('filterTree work with straytegy and work', () => {
expect(
filterTree(
treeData,
'children',
(item, parents) => {
expect(parents.map(parent => parent.key)).toEqual(treeDataParentsMap.get(item.key))
expect(parents.every(parent => parent.label === `Node ${parent.key}`)).toBeTruthy()
return /1/.test(item.label)
},
'and',
),
).toEqual([{ label: 'Node 1', key: '1' }])
})

test('mergeTree work', () => {
interface TargetData extends Data {
overidden?: boolean
children?: TargetData[]
}

expect(
mergeTree(
treeData,
[
{
label: 'Node 0',
key: '0',
children: [
{
label: 'Node 0-0',
key: '0-0',
children: [
{ label: 'Node 0-0-1-overidden', key: '0-0-1', overidden: true },
{ label: 'Node 0-0-3', key: '0-0-3' },
],
},
{
label: 'Node 0-1',
key: '0-1',
children: [{ label: 'Node 0-1-3', key: '0-1-3' }],
},
],
},
{ label: 'Node 2', key: '2' },
] as TargetData[],
'children',
item => item.key,
),
).toEqual([
{
label: 'Node 0',
key: '0',
children: [
{
label: 'Node 0-0',
key: '0-0',
children: [
{ label: 'Node 0-0-0', key: '0-0-0' },
{ label: 'Node 0-0-1-overidden', key: '0-0-1', overidden: true },
{ label: 'Node 0-0-2', key: '0-0-2' },
{ label: 'Node 0-0-3', key: '0-0-3' },
],
},
{
label: 'Node 0-1',
key: '0-1',
children: [
{ label: 'Node 0-1-0', key: '0-1-0' },
{ label: 'Node 0-1-1', key: '0-1-1' },
{ label: 'Node 0-1-2', key: '0-1-2' },
{ label: 'Node 0-1-3', key: '0-1-3' },
],
},
],
},
{ label: 'Node 1', key: '1' },
{ label: 'Node 2', key: '2' },
])
})

test('flattenTree work', () => {
expect(flattenTree(treeData, 'children').map(item => item.key)).toEqual(treeDataKeys)
})
test('flattenTree with Map work', () => {
const flattenedTree = flattenTree(treeData, 'children', item => ({ ...item, mapped: true }))
expect(flattenedTree.map(item => item.key)).toEqual(treeDataKeys)
expect(flattenedTree.every(item => item.mapped)).toBeTruthy()
})
test('flattenTree with leafOnly work', () => {
expect(flattenTree(treeData, 'children', undefined, true).map(item => item.key)).toEqual([
'0-0-0',
'0-0-1',
'0-0-2',
'0-1-0',
'0-1-1',
'0-1-2',
'1',
])
})

test('getTreeKeys work', () => {
expect(getTreeKeys(treeData, 'children', item => item.key)).toEqual(treeDataKeys)
})
test('getTreeKeys with leafOnly work', () => {
expect(getTreeKeys(treeData, 'children', item => item.key, true)).toEqual([
'0-0-0',
'0-0-1',
'0-0-2',
'0-1-0',
'0-1-1',
'0-1-2',
'1',
])
})
})
1 change: 1 addition & 0 deletions packages/cdk/utils/index.ts
Expand Up @@ -18,3 +18,4 @@ export * from './src/typeof'
export * from './src/uniqueId'
export * from './src/useEventListener'
export * from './src/vNode'
export * from './src/tree'

0 comments on commit 56035c1

Please sign in to comment.