summaryrefslogtreecommitdiff
path: root/vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue')
-rw-r--r--vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue53
1 files changed, 41 insertions, 12 deletions
diff --git a/vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue b/vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue
index 5e9661a53c8..3ce35999d8a 100644
--- a/vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue
+++ b/vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue
@@ -572,20 +572,49 @@ export default {
},
scrollToItem (index) {
- let scroll
- if (this.itemSize === null) {
- scroll = index > 0 ? this.sizes[index - 1].accumulator : 0
- } else {
- scroll = index * this.itemSize
- }
- this.scrollToPosition(scroll)
+ this.$_scrollDirty = true
+ const { viewport, scrollDirection, scrollDistance } = this.scrollToPosition(index)
+ viewport[scrollDirection] = scrollDistance
+
+ setTimeout(() => {
+ this.$_scrollDirty = false
+ this.updateVisibleItems(false, true)
+ })
},
- scrollToPosition (position) {
- if (this.direction === 'vertical') {
- this.$el.scrollTop = position
- } else {
- this.$el.scrollLeft = position
+ scrollToPosition (index) {
+ const getPositionOfItem = (index) => {
+ if (this.itemSize === null) {
+ return index > 0 ? this.sizes[index - 1].accumulator : 0
+ } else {
+ return index * this.itemSize
+ }
+ }
+ const position = getPositionOfItem(index)
+ const direction = this.direction === 'vertical'
+ ? { scroll: 'scrollTop', start: 'top' }
+ : { scroll: 'scrollLeft', start: 'left' }
+
+ if (this.pageMode) {
+ const viewportEl = ScrollParent(this.$el)
+ // HTML doesn't overflow like other elements
+ const scrollTop = viewportEl.tagName === 'HTML' ? 0 : viewportEl[direction.scroll]
+ const viewport = viewportEl.getBoundingClientRect()
+
+ const scroller = this.$el.getBoundingClientRect()
+ const scrollerPosition = scroller[direction.start] - viewport[direction.start]
+
+ return {
+ viewport: viewportEl,
+ scrollDirection: direction.scroll,
+ scrollDistance: position + scrollTop + scrollerPosition,
+ }
+ }
+
+ return {
+ viewport: this.$el,
+ scrollDirection: direction.scroll,
+ scrollDistance: position,
}
},