Skip to content

Commit 5ba907a

Browse files
committed
Add expandNodesToLevel utility
Resolves #244.
1 parent 0a18249 commit 5ba907a

File tree

6 files changed

+99
-2
lines changed

6 files changed

+99
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
* [#182]: Add `direction` property to support RTL languages
88
* [#211]: Throw an error when nodes have duplicate values
9+
* [#244]: Add `expandNodesToLevel` utility
910

1011
## [v1.6.0](https://github.com/jakezatecky/react-checkbox-tree/compare/v1.5.0...v1.6.0) (2019-12-11)
1112

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,23 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
135135
/>
136136
```
137137

138+
### Utility Functions
139+
140+
In addition to the `CheckboxTree` component, additional utility functions are available to set the initial state of the tree.
141+
142+
#### `expandNodesToLevel(nodes, targetLevel)`
143+
144+
Creates a list of all parent node keys until `targetLevel`.
145+
146+
Arguments:
147+
148+
* `nodes` (`Array`): The same array of nodes passed into the main `CheckboxTree` component
149+
* `targetLevel` (`number`): The maximum expansion depth. Use `Infinity` for maximum depth.
150+
151+
Returns:
152+
153+
* `Array`: A list of node keys.
154+
138155
### Properties
139156

140157
| Property | Type | Description | Default |

src/index.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
1-
// Export default to provide support for non-ES6 solutions
2-
module.exports = require('./js/CheckboxTree').default;
1+
const tree = require('./js/CheckboxTree').default;
2+
const utils = require('./js/utils');
3+
4+
module.exports = {
5+
default: tree,
6+
...utils,
7+
};

src/js/utils.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @param {Array} nodes The nodes to traverse.
3+
* @param {number} targetLevel How deep to expand the nodes.
4+
* @param {int} currentLevel The current level in the recursive chain.
5+
*
6+
* @returns {Array}
7+
*/
8+
function expandNodesToLevel(nodes, targetLevel, currentLevel = 0) {
9+
if (currentLevel > targetLevel) {
10+
return [];
11+
}
12+
13+
let expanded = [];
14+
nodes.forEach((node) => {
15+
if (node.children) {
16+
expanded = [
17+
...expanded,
18+
node.value,
19+
...expandNodesToLevel(node.children, targetLevel, currentLevel + 1),
20+
];
21+
}
22+
});
23+
return expanded;
24+
}
25+
26+
// eslint-disable-next-line import/prefer-default-export
27+
export { expandNodesToLevel };

test/.eslintrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"mocha": true
44
},
55
"rules": {
6+
"import/no-extraneous-dependencies": ["error", {"devDependencies": ["**/*.js"]}],
67
"react/jsx-props-no-spreading": "off"
78
}
89
}

test/utils.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { assert } from 'chai';
2+
3+
import { expandNodesToLevel } from '../src';
4+
5+
const nestedTree = [{
6+
value: '0',
7+
label: 'Node 0',
8+
children: [{
9+
value: '0-0',
10+
label: 'Node 0-0',
11+
}, {
12+
value: '0-1',
13+
label: 'Node 0-1',
14+
children: [{
15+
value: '0-1-0',
16+
label: 'Node 0-1-0',
17+
children: [{
18+
value: '0-1-0-0',
19+
label: 'Node 0-1-0-0',
20+
}],
21+
}, {
22+
value: '0-1-1',
23+
label: 'Node 0-1-1',
24+
children: [{
25+
value: '0-1-1-0',
26+
label: 'Node 0-1-1-0',
27+
}],
28+
}],
29+
}, {
30+
value: '0-2',
31+
label: 'Node 0-2',
32+
}],
33+
}, {
34+
value: '1',
35+
label: 'Node 1',
36+
}];
37+
38+
describe('utils', () => {
39+
describe('expandNodesToLevel', () => {
40+
it('should recursively traverse a tree of nodes and return the key values of parents from the level specified', () => {
41+
const expected = ['0', '0-1'];
42+
43+
assert.equal(expected, expandNodesToLevel(nestedTree, 1));
44+
});
45+
});
46+
});

0 commit comments

Comments
 (0)