Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(cdk:utils): add tree utils, fix data param of getAllSelectedKeys…
…, 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
Showing
34 changed files
with
1,060 additions
and
572 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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', | ||
]) | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.