From ac4333c969cab695723b1c61426e5cee1e0ae96e Mon Sep 17 00:00:00 2001 From: Varlamov Date: Thu, 7 Nov 2019 19:19:58 +0300 Subject: [PATCH 1/3] Expand parent nodes of selected item. Scroll menu to selected item, by center --- src/mixins/treeselectMixin.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/mixins/treeselectMixin.js b/src/mixins/treeselectMixin.js index c9de00b5..bb6381ae 100644 --- a/src/mixins/treeselectMixin.js +++ b/src/mixins/treeselectMixin.js @@ -636,6 +636,14 @@ export default { type: [ Number, String ], default: 999, }, + + /** + * Set selected option to the center of the menu, if possible + */ + scrollPositionOnCenter: { + type: Boolean, + default: false + } }, data() { @@ -940,6 +948,7 @@ export default { } else { this.forest.normalizedOptions = [] } + this.expandParentNodes() }, getInstanceId() { @@ -1453,6 +1462,9 @@ export default { this.$nextTick(this.restoreMenuScrollPosition) if (!this.options && !this.async) this.loadRootOptions() this.toggleClickOutsideEvent(true) + if (this.scrollPositionOnCenter) { + this.$nextTick(this.scrollMenuOnCenter); + } this.$emit('open', this.getInstanceId()) }, @@ -1918,16 +1930,36 @@ export default { }, saveMenuScrollPosition() { + if (this.scrollPositionOnCenter) return; const $menu = this.getMenu() // istanbul ignore else if ($menu) this.menu.lastScrollPosition = $menu.scrollTop }, restoreMenuScrollPosition() { + if (this.scrollPositionOnCenter) return; const $menu = this.getMenu() // istanbul ignore else if ($menu) $menu.scrollTop = this.menu.lastScrollPosition }, + + scrollMenuOnCenter() { + const $option = document.querySelector(".vue-treeselect__option--selected"); + const $menu = this.getMenu(); + + if ($option && $menu) { + const position = Math.max($option.offsetTop - (($menu.offsetHeight - $option.offsetHeight) / 2), 0); + $menu.scrollTop = position; + } + }, + + expandParentNodes() { + for (const id of this.forest.selectedNodeIds) { + for (const ancestor of this.forest.nodeMap[id].ancestors) { + ancestor.isExpanded = true; + } + } + } }, created() { From 7248a58a10768096521199d628ed31b5923f8004 Mon Sep 17 00:00:00 2001 From: varlamov88 Date: Wed, 13 Nov 2019 16:48:02 +0300 Subject: [PATCH 2/3] Update treeselectMixin.js Expand parents in search mode then chidren is selected --- src/mixins/treeselectMixin.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mixins/treeselectMixin.js b/src/mixins/treeselectMixin.js index bb6381ae..6d76adf5 100644 --- a/src/mixins/treeselectMixin.js +++ b/src/mixins/treeselectMixin.js @@ -1783,6 +1783,10 @@ export default { this.buildForestState() if (nextState) { + this.expandParentNodes(); + if (this.scrollPositionOnCenter) { + this.$nextTick(this.scrollMenuOnCenter); + } this.$emit('select', node.raw, this.getInstanceId()) } else { this.$emit('deselect', node.raw, this.getInstanceId()) From 29af2e9909d1165115d3b462b3bf1b708a8967b9 Mon Sep 17 00:00:00 2001 From: varlamov88 Date: Wed, 13 Nov 2019 17:48:48 +0300 Subject: [PATCH 3/3] Update treeselectMixin.js --- src/mixins/treeselectMixin.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mixins/treeselectMixin.js b/src/mixins/treeselectMixin.js index 6d76adf5..c3917df1 100644 --- a/src/mixins/treeselectMixin.js +++ b/src/mixins/treeselectMixin.js @@ -1784,15 +1784,15 @@ export default { if (nextState) { this.expandParentNodes(); - if (this.scrollPositionOnCenter) { - this.$nextTick(this.scrollMenuOnCenter); - } this.$emit('select', node.raw, this.getInstanceId()) } else { this.$emit('deselect', node.raw, this.getInstanceId()) } if (this.localSearch.active && nextState && (this.single || this.clearOnSelect)) { + if (this.scrollPositionOnCenter) { + this.$nextTick(this.scrollMenuOnCenter); + } this.resetSearchQuery() }