Skip to content

Commit 2d66c9a

Browse files
committed
Make treeData to flatData converter more general
1 parent 4c05ce6 commit 2d66c9a

File tree

3 files changed

+71
-59
lines changed

3 files changed

+71
-59
lines changed

src/react-sortable-tree.js

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { AutoSizer, VirtualScroll } from 'react-virtualized';
99
import TreeNode from './tree-node';
1010
import {
1111
walk,
12-
getVisibleNodeInfoFlattened,
12+
getFlatDataFromTree,
1313
changeNodeAtPath,
1414
removeNodeAtPath,
1515
addNodeUnderParentPath,
@@ -72,10 +72,7 @@ class ReactSortableTree extends Component {
7272

7373
this.state = {
7474
draggingTreeData: null,
75-
rows: getVisibleNodeInfoFlattened({
76-
treeData: props.treeData,
77-
getNodeKey: this.getNodeKey,
78-
}),
75+
rows: this.getRows(props.treeData),
7976
};
8077

8178
this.startDrag = this.startDrag.bind(this);
@@ -93,10 +90,7 @@ class ReactSortableTree extends Component {
9390
// Calculate the rows to be shown from the new tree data
9491
this.setState({
9592
draggingTreeData: null,
96-
rows: getVisibleNodeInfoFlattened({
97-
treeData: nextProps.treeData,
98-
getNodeKey: this.getNodeKey,
99-
}),
93+
rows: this.getRows(nextProps.treeData),
10094
});
10195
}
10296
}
@@ -110,21 +104,23 @@ class ReactSortableTree extends Component {
110104

111105
this.setState({
112106
draggingTreeData,
113-
rows: getVisibleNodeInfoFlattened({
114-
treeData: draggingTreeData,
115-
getNodeKey: this.getNodeKey,
116-
}),
107+
rows: this.getRows(draggingTreeData),
108+
});
109+
}
110+
111+
getRows(treeData) {
112+
return getFlatDataFromTree({
113+
ignoreCollapsed: true,
114+
getNodeKey: this.getNodeKey,
115+
treeData,
117116
});
118117
}
119118

120119
endDrag({ node, path }, dropResult) {
121120
if (!dropResult) {
122121
return this.setState({
123122
draggingTreeData: null,
124-
rows: getVisibleNodeInfoFlattened({
125-
treeData: this.props.treeData,
126-
getNodeKey: this.getNodeKey,
127-
}),
123+
rows: this.getRows(this.props.treeData),
128124
});
129125
}
130126

src/utils/tree-data-utils.js

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -276,36 +276,6 @@ export function map({ treeData, getNodeKey, callback, ignoreCollapsed = false })
276276
}).node.children;
277277
}
278278

279-
/**
280-
* Get visible node data flattened.
281-
*
282-
* @param {!Object[]} treeData - Tree data
283-
* @param {!function} getNodeKey - Function to get the key from the nodeData and tree index
284-
*
285-
* @return {{
286-
* node: Object,
287-
* path: []string|[]number,
288-
* lowerSiblingCounts: []number
289-
* }}[] nodes - The node array
290-
*/
291-
export function getVisibleNodeInfoFlattened({ treeData, getNodeKey }) {
292-
if (!treeData || treeData.length < 1) {
293-
return [];
294-
}
295-
296-
const flattened = [];
297-
walk({
298-
treeData,
299-
getNodeKey,
300-
ignoreCollapsed: true,
301-
callback: ({ node, lowerSiblingCounts, path, treeIndex }) => {
302-
flattened[treeIndex] = { node, lowerSiblingCounts, path };
303-
},
304-
});
305-
306-
return flattened;
307-
}
308-
309279
/**
310280
* Replaces node at path with object, or callback-defined object
311281
*
@@ -460,6 +430,37 @@ export function addNodeUnderParentPath({
460430
});
461431
}
462432

433+
/**
434+
* Get tree data flattened.
435+
*
436+
* @param {!Object[]} treeData - Tree data
437+
* @param {!function} getNodeKey - Function to get the key from the nodeData and tree index
438+
* @param {boolean=} ignoreCollapsed - Ignore children of nodes without `expanded` set to `true`
439+
*
440+
* @return {{
441+
* node: Object,
442+
* path: []string|[]number,
443+
* lowerSiblingCounts: []number
444+
* }}[] nodes - The node array
445+
*/
446+
export function getFlatDataFromTree({ treeData, getNodeKey, ignoreCollapsed = false }) {
447+
if (!treeData || treeData.length < 1) {
448+
return [];
449+
}
450+
451+
const flattened = [];
452+
walk({
453+
treeData,
454+
getNodeKey,
455+
ignoreCollapsed,
456+
callback: ({ node, lowerSiblingCounts, path }) => {
457+
flattened.push({ node, lowerSiblingCounts, path });
458+
},
459+
});
460+
461+
return flattened;
462+
}
463+
463464
/**
464465
* Generate a tree structure from flat data.
465466
*
@@ -508,5 +509,3 @@ export function getTreeFromFlatData({
508509

509510
return childrenToParents[rootKey].map(child => trav(child));
510511
}
511-
512-
// Performs change to every node in the tree

src/utils/tree-data-utils.test.js

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
getVisibleNodeInfoAtIndex,
44
changeNodeAtPath,
55
getTreeFromFlatData,
6-
getVisibleNodeInfoFlattened,
6+
getFlatDataFromTree,
77
walk,
88
map,
99
} from './tree-data-utils';
@@ -268,19 +268,24 @@ describe('getVisibleNodeInfoAtIndex', () => {
268268
});
269269

270270

271-
describe('getVisibleNodeInfoAtIndex', () => {
271+
describe('getFlatDataFromTree', () => {
272272
it('should handle empty data', () => {
273-
expect(getVisibleNodeInfoFlattened({treeData: [], getNodeKey: keyFromTreeIndex})).toEqual([]);
274-
expect(getVisibleNodeInfoFlattened({treeData: null, getNodeKey: keyFromTreeIndex})).toEqual([]);
275-
expect(getVisibleNodeInfoFlattened({treeData: undefined, getNodeKey: keyFromTreeIndex})).toEqual([]);
273+
expect(getFlatDataFromTree({treeData: [], getNodeKey: keyFromTreeIndex})).toEqual([]);
274+
expect(getFlatDataFromTree({treeData: null, getNodeKey: keyFromTreeIndex})).toEqual([]);
275+
expect(getFlatDataFromTree({treeData: undefined, getNodeKey: keyFromTreeIndex})).toEqual([]);
276276
});
277277

278278
it('should handle flat data', () => {
279-
expect(getVisibleNodeInfoFlattened({ treeData: [ { key: 0 } ], getNodeKey: keyFromTreeIndex })).toEqual([
279+
expect(getFlatDataFromTree({
280+
ignoreCollapsed: true,
281+
getNodeKey: keyFromTreeIndex,
282+
treeData: [ { key: 0 } ],
283+
})).toEqual([
280284
{ node: { key: 0 }, path: [0], lowerSiblingCounts: [ 0 ] },
281285
]);
282286

283-
expect(getVisibleNodeInfoFlattened({
287+
expect(getFlatDataFromTree({
288+
ignoreCollapsed: true,
284289
treeData: [ { key: 0 }, { key: 1 } ],
285290
getNodeKey: keyFromTreeIndex
286291
})).toEqual([
@@ -312,7 +317,11 @@ describe('getVisibleNodeInfoAtIndex', () => {
312317
{ key: 6 },
313318
];
314319

315-
expect(getVisibleNodeInfoFlattened({ treeData, getNodeKey: keyFromTreeIndex })).toEqual([
320+
expect(getFlatDataFromTree({
321+
ignoreCollapsed: true,
322+
getNodeKey: keyFromTreeIndex,
323+
treeData,
324+
})).toEqual([
316325
{ node: treeData[0], path: [0], lowerSiblingCounts: [ 1 ] },
317326
{ node: treeData[1], path: [1], lowerSiblingCounts: [ 0 ] }
318327
]);
@@ -343,7 +352,11 @@ describe('getVisibleNodeInfoAtIndex', () => {
343352
{ key: 6 },
344353
];
345354

346-
expect(getVisibleNodeInfoFlattened({ treeData, getNodeKey: keyFromKey })).toEqual([
355+
expect(getFlatDataFromTree({
356+
ignoreCollapsed: true,
357+
getNodeKey: keyFromKey,
358+
treeData,
359+
})).toEqual([
347360
{ node: treeData[0], path: [0], lowerSiblingCounts: [ 1 ] },
348361
{ node: treeData[0].children[0], path: [0, 1], lowerSiblingCounts: [ 1, 1 ] },
349362
{ node: treeData[0].children[1], path: [0, 4], lowerSiblingCounts: [ 1, 0 ] },
@@ -378,7 +391,11 @@ describe('getVisibleNodeInfoAtIndex', () => {
378391
{ key: 6 },
379392
];
380393

381-
expect(getVisibleNodeInfoFlattened({ treeData, getNodeKey: keyFromTreeIndex })).toEqual([
394+
expect(getFlatDataFromTree({
395+
ignoreCollapsed: true,
396+
treeData,
397+
getNodeKey: keyFromTreeIndex,
398+
})).toEqual([
382399
{ node: treeData[0], path: [0], lowerSiblingCounts: [1] },
383400
{ node: treeData[0].children[0], path: [0, 1], lowerSiblingCounts: [1, 1] },
384401
{ node: treeData[0].children[0].children[0], path: [0, 1, 2], lowerSiblingCounts: [1, 1, 1] },

0 commit comments

Comments
 (0)