Skip to content

Commit ec979ec

Browse files
authored
Merge pull request #134 from nih-sparc/multiselect-dropdown-fix
Multiselect dropdown fix
2 parents c4c05bd + 251efca commit ec979ec

File tree

2 files changed

+65
-14
lines changed

2 files changed

+65
-14
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nih-sparc/sparc-design-system-components",
3-
"version": "0.26.30",
3+
"version": "0.27.0",
44
"private": false,
55
"scripts": {
66
"serve": "vue-cli-service serve",

src/components/DropdownMultiselect/src/DropdownMultiselect.vue

Lines changed: 64 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
node-key="id"
3434
show-checkbox
3535
check-on-click-node
36-
:default-expand-all="false"
3736
:default-checked-keys="defaultCheckedKeys"
37+
:auto-expand-parent="false"
3838
:expand-on-click-node="false"
3939
:filter-node-method="filterNodes"
4040
:props="treeProps"
@@ -44,14 +44,14 @@
4444
</el-scrollbar>
4545
</el-form>
4646
<div
47-
v-if="showExpandOptionsContainer && !optionsExpanded"
47+
v-show="showExpandOptionsContainer && !optionsExpanded"
4848
v-on:click="setOptionsExpanded(true)"
4949
class="expand-options-container"
5050
>
5151
+ Expand
5252
</div>
5353
<div
54-
v-if="showExpandOptionsContainer && optionsExpanded"
54+
v-show="showExpandOptionsContainer && optionsExpanded"
5555
v-on:click="setOptionsExpanded(false)"
5656
class="expand-options-container"
5757
>
@@ -101,6 +101,7 @@ export default {
101101
return {
102102
showAll: true,
103103
treeProps: {
104+
children: 'children',
104105
label: 'label'
105106
},
106107
optionsExpanded: true,
@@ -180,19 +181,17 @@ export default {
180181
},
181182
},
182183
watch: {
183-
allVisibleDataIds(val) {
184+
allVisibleDataIds() {
184185
this.numOptionsShown = 0;
185-
this.$refs.tree.filter(val)
186+
this.$refs.tree.filter()
186187
},
187188
'visibleData': function() {
188189
this.setShowAll();
189190
}
190191
},
191192
mounted() {
192193
if (this.defaultCheckedKeys.length) {
193-
this.$nextTick(() => {
194-
this.onCheckChange()
195-
})
194+
this.onCheckChange()
196195
}
197196
if (this.showExpandOptionsContainer || this.visibleData !== undefined) {
198197
this.numOptionsShown = 0;
@@ -244,21 +243,73 @@ export default {
244243
this.$refs.tree.filter()
245244
},
246245
updateParentFacetsSelectedStatus() {
246+
let visibleCheckedParents = this.visibleCheckedNodes.filter(visibleNode => {
247+
return !visibleNode.label.includes('.')
248+
})
249+
let visibleCheckedChildren = this.visibleCheckedNodes.filter(visibleNode => {
250+
return visibleNode.label.includes('.')
251+
})
252+
253+
// First check for any subfacets that have a parent that is not set
254+
visibleCheckedChildren.forEach(checkedChild => {
255+
const parentLabel = checkedChild.label.split('.')[0]
256+
if (!visibleCheckedParents.some(parent => parent.label == parentLabel)) {
257+
this.$refs.tree.setChecked(checkedChild.id, true, true)
258+
}
259+
})
260+
247261
const halfCheckedNodes = this.$refs.tree.getHalfCheckedNodes()
248262
// set the half checked nodes checked status based upon what facets are actually visible since navigating between tabs might
249263
// cause some to be hidden so the parent facet should now possibly be checked/unchecked instead of half checked
250264
halfCheckedNodes.forEach(halfCheckedNode => {
265+
const visibleChildren = halfCheckedNode.children.filter((child) => {
266+
return this.allVisibleDataIds.includes(child.label)
267+
})
268+
const visibleCheckedChildren = halfCheckedNode.children.filter((child) => {
269+
return this.visibleCheckedNodes.some(visibleNode => visibleNode.label == child.label)
270+
})
271+
if (!this.allVisibleDataIds.includes(halfCheckedNode.label)) {
272+
return
273+
}
251274
if (this.visibleCheckedNodes.every(visibleNode => !halfCheckedNode.children.some(child => visibleNode.label == child.label))) {
252275
this.$refs.tree.setChecked(halfCheckedNode.id, false)
253276
}
254-
else if (this.visibleCheckedNodes.every(visibleNode => halfCheckedNode.children.some(child => visibleNode.label == child.label))) {
277+
// If number of visible checked nodes in halfCheckedNode is equal to number of children that are visible (number of children thast are visible is equal to allVisibleDataIds with halfCheckedNode label as a parent)
278+
else if (visibleChildren.length == visibleCheckedChildren.length) {
255279
this.$refs.tree.setChecked(halfCheckedNode.id, true)
256280
}
257281
})
258-
// set any subfacets again so that their parent facets get updated to checked/half checked in case their parent selection was cleared
259-
// by the previous tab navigation (i.e. show all was set automatically all the visible facets aviable in the new tab were selected)
260-
this.visibleCheckedNodes.filter(node => node.label.includes('.')).forEach(subfacet => {
261-
this.$refs.tree.setChecked(subfacet.id, true, true)
282+
283+
visibleCheckedParents = this.visibleCheckedNodes.filter(visibleNode => {
284+
return !visibleNode.label.includes('.')
285+
})
286+
visibleCheckedChildren = this.visibleCheckedNodes.filter(visibleNode => {
287+
return visibleNode.label.includes('.')
288+
})
289+
290+
visibleCheckedParents.forEach(checkedParent => {
291+
// If any children are unselected then select one deep so that the parent is half-checked
292+
const visibleChildren = checkedParent.children.filter(child => this.allVisibleDataIds.includes(child.label))
293+
if (visibleChildren.some(visibleChild => {
294+
let isChecked = false
295+
visibleCheckedChildren.forEach(checkedChild => {
296+
if (checkedChild.label == visibleChild.label) {
297+
isChecked = true
298+
return
299+
}
300+
})
301+
return !isChecked
302+
})) {
303+
const alreadyCheckedChild = visibleCheckedChildren.find(child => {
304+
const childsParentLabel = child.label.split('.')[0]
305+
return childsParentLabel == checkedParent.label
306+
})
307+
if (alreadyCheckedChild != undefined) {
308+
this.$refs.tree.setChecked(alreadyCheckedChild.id, true, true)
309+
} else {
310+
this.$refs.tree.setChecked(checkedParent.id, false)
311+
}
312+
}
262313
})
263314
},
264315
setShowAll: function() {

0 commit comments

Comments
 (0)