Skip to content

Commit e670002

Browse files
authored
fix: Empty dropdown while searching for deeper nodes πŸ› (dowjones#186)
* chore: Remove unused dep πŸ”₯ * chore: Selected package upgrades ⚑ * fix: Filter hidden nodes so dropdown is not empty * fix: Only return matched nodes * chore: Babel upgrade due to deprecated presets ⚑ https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets * fix: Revert Babel-7 craziness. Restore sanity * chore: Update tests * chore: Update docs bundle * fix: Restore existing behavior
1 parent 624b437 commit e670002

File tree

6 files changed

+979
-1340
lines changed

6 files changed

+979
-1340
lines changed

β€Ždocs/bundle.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

β€Žpackage.json

+12-13
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,20 @@
4646
"react-infinite-scroll-component": "^4.0.2"
4747
},
4848
"devDependencies": {
49-
"@babel/plugin-syntax-jsx": "^7.0.0-beta.46",
50-
"@babel/preset-stage-3": "^7.0.0-beta.46",
49+
"@babel/plugin-syntax-jsx": "7.0.0-beta.46",
50+
"@babel/preset-stage-3": "7.0.0-beta.46",
5151
"@commitlint/cli": "^7.0.0",
5252
"@commitlint/config-conventional": "^7.0.0",
53-
"ava": "^1.0.0-beta.4",
54-
"babel-core": "^6.24.1",
55-
"babel-eslint": "^8.0.0",
56-
"babel-loader": "^7.1.2",
57-
"babel-plugin-istanbul": "^4.1.3",
58-
"babel-plugin-transform-class-properties": "^6.24.1",
59-
"babel-plugin-transform-react-remove-prop-types": "^0.4.13",
60-
"babel-preset-es2015": "^6.24.1",
61-
"babel-preset-react": "^6.24.1",
62-
"babel-preset-stage-0": "^6.24.1",
53+
"ava": "1.0.0-beta.4",
54+
"babel-core": "6.24.1",
55+
"babel-eslint": "8.0.0",
56+
"babel-loader": "7.1.2",
57+
"babel-plugin-istanbul": "4.1.3",
58+
"babel-plugin-transform-class-properties": "6.24.1",
59+
"babel-plugin-transform-react-remove-prop-types": "0.4.13",
60+
"babel-preset-es2015": "6.24.1",
61+
"babel-preset-react": "6.24.1",
62+
"babel-preset-stage-0": "6.24.1",
6363
"commitizen": "^2.9.6",
6464
"conventional-changelog-cli": "^2.0.5",
6565
"coveralls": "^3.0.0",
@@ -94,7 +94,6 @@
9494
"react": "^16.0.0",
9595
"react-dom": "^16.0.0",
9696
"react-story": "^0.0.10",
97-
"release-it": "^7.6.1",
9897
"rimraf": "^2.6.1",
9998
"sinon": "^5.0.0",
10099
"style-loader": "^0.20.1",

β€Žsrc/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class DropdownTreeSelect extends Component {
112112
}
113113

114114
onInputChange = value => {
115-
const { allNodesHidden, tree } = this.treeManager.filterTree(value)
115+
const { allNodesHidden, tree } = this.treeManager.filterTree(value, this.props.keepTreeOnSearch)
116116
const searchModeOn = value.length > 0
117117

118118
this.setState({

β€Žsrc/tree-manager/index.js

+12-9
Original file line numberDiff line numberDiff line change
@@ -54,30 +54,33 @@ class TreeManager {
5454
return matches
5555
}
5656

57-
setChildMatchStatus(id) {
57+
addParentsToTree(id, tree) {
5858
if (id !== undefined) {
5959
const node = this.getNodeById(id)
60+
this.addParentsToTree(node._parent, tree)
61+
node.hide = true
6062
node.matchInChildren = true
61-
this.setChildMatchStatus(node._parent)
63+
tree.set(id, node)
6264
}
6365
}
6466

65-
filterTree(searchTerm) {
67+
filterTree(searchTerm, keepTreeOnSearch) {
6668
const matches = this.getMatches(searchTerm.toLowerCase())
6769

68-
this.tree.forEach(node => {
69-
node.hide = true
70-
node.matchInChildren = false
71-
})
70+
const matchTree = new Map()
7271

7372
matches.forEach(m => {
7473
const node = this.getNodeById(m)
7574
node.hide = false
76-
this.setChildMatchStatus(node._parent)
75+
if (keepTreeOnSearch) {
76+
// add parent nodes first or else the tree won't be rendered in correct hierarchy
77+
this.addParentsToTree(node._parent, matchTree)
78+
}
79+
matchTree.set(m, node)
7780
})
7881

7982
const allNodesHidden = matches.length === 0
80-
return { allNodesHidden, tree: this.tree }
83+
return { allNodesHidden, tree: matchTree }
8184
}
8285

8386
restoreNodes() {

β€Žsrc/tree-manager/tests/index.test.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -333,10 +333,11 @@ test('should get matching nodes when searched', t => {
333333
]
334334
}
335335
const manager = new TreeManager(tree)
336-
const { allNodesHidden } = manager.filterTree('search')
336+
const { allNodesHidden, tree: matchTree } = manager.filterTree('search')
337337
t.false(allNodesHidden)
338338
const nodes = ['i1', 'c1']
339-
nodes.forEach(n => t.false(manager.getNodeById(n).hide))
339+
nodes.forEach(n => t.not(matchTree.get(n), undefined))
340+
t.is(matchTree.get('c2'), undefined)
340341
})
341342

342343
test('should hide all nodes when search term is not found', t => {
@@ -362,8 +363,6 @@ test('should hide all nodes when search term is not found', t => {
362363
const manager = new TreeManager(tree)
363364
const { allNodesHidden } = manager.filterTree('bla-bla')
364365
t.true(allNodesHidden)
365-
const nodes = ['i1', 'c1']
366-
nodes.forEach(n => t.true(manager.getNodeById(n).hide))
367366
})
368367

369368
test('should use cached results for subsequent searches', t => {
@@ -457,10 +456,11 @@ test('should get matching nodes with mixed case when searched', t => {
457456
]
458457
}
459458
const manager = new TreeManager(tree)
460-
const { allNodesHidden } = manager.filterTree('SearCH')
459+
const { allNodesHidden, tree: matchTree } = manager.filterTree('SearCH')
461460
t.false(allNodesHidden)
462461
const nodes = ['i1', 'c1']
463-
nodes.forEach(n => t.false(manager.getNodeById(n).hide))
462+
nodes.forEach(n => t.not(matchTree.get(n), undefined))
463+
t.is(matchTree.get('c2'), undefined)
464464
})
465465

466466
test('should uncheck previous node in simple select mode', t => {

0 commit comments

Comments
Β (0)