{"version":3,"file":"dynamic_scroller.vue.cjs","sources":["../../../../components/scroller/modules/dynamic_scroller.vue"],"sourcesContent":["<template>\n  <core-scroller\n    ref=\"scroller\"\n    :items=\"itemsWithSize\"\n    :min-item-size=\"minItemSize\"\n    :direction=\"direction\"\n    :key-field=\"keyField\"\n    :list-tag=\"listTag\"\n    :item-tag=\"itemTag\"\n    v-bind=\"$attrs\"\n  >\n    <template\n      #default=\"{ item: itemWithSize, index, active }\"\n    >\n      <dt-scroller-item\n        :item=\"itemWithSize\"\n        :active=\"active\"\n        :size-dependencies=\"[\n          itemWithSize.message,\n        ]\"\n        :data-index=\"index\"\n      >\n        <slot\n          v-bind=\"{\n            item: itemWithSize.item,\n            index,\n            active,\n            itemWithSize,\n          }\"\n        />\n      </dt-scroller-item>\n    </template>\n  </core-scroller>\n</template>\n\n<!-- eslint-disable-next-line max-len -->\n<!-- This is a code from external library (https://github.com/Akryum/vue-virtual-scroller/blob/master/packages/vue-virtual-scroller/src/components/DynamicScroller.vue)\nWe have modified it for our own specific use. -->\n<script>\nimport CoreScroller from './core_scroller.vue';\nimport DtScrollerItem from './scroller_item.vue';\nimport { returnFirstEl } from '@/common/utils';\n\nexport default {\n  name: 'DynamicScroller',\n\n  components: {\n    CoreScroller,\n    DtScrollerItem,\n  },\n\n  provide () {\n    if (typeof ResizeObserver !== 'undefined') {\n      this.$_resizeObserver = new ResizeObserver(entries => {\n        requestAnimationFrame(() => {\n          if (!Array.isArray(entries)) {\n            return;\n          }\n          for (const entry of entries) {\n            if (entry.target && entry.target.$_vs_onResize) {\n              let width, height;\n              if (entry.borderBoxSize) {\n                const resizeObserverSize = entry.borderBoxSize[0];\n                width = resizeObserverSize.inlineSize;\n                height = resizeObserverSize.blockSize;\n              } else {\n                // @TODO remove when contentRect is deprecated\n                width = entry.contentRect.width;\n                height = entry.contentRect.height;\n              }\n              entry.target.$_vs_onResize(entry.target.$_vs_id, width, height);\n            }\n          }\n        });\n      });\n    }\n\n    return {\n      vscrollData: this.vscrollData,\n      vscrollParent: this,\n      vscrollResizeObserver: this.$_resizeObserver,\n    };\n  },\n\n  inheritAttrs: false,\n\n  props: {\n    /*\n      * The items to render.\n      * If the items are simple arrays, the index will be used as the key.\n      * If the items are objects, the keyField will be used as the key.\n     */\n    items: {\n      type: Array,\n      required: true,\n    },\n\n    /*\n      * Indicates if the items are dynamic.\n      * If true, the items will be wrapped in a DtScrollerItem component.\n      * This is required for dynamic items to be able to react to changes in their size.\n     */\n    dynamic: {\n      type: Boolean,\n      default: false,\n    },\n\n    /*\n      * The key field to use for the items.\n      * Only used if the items are objects.\n     */\n    keyField: {\n      type: String,\n      default: 'id',\n    },\n\n    /*\n      * The direction of the scroller.\n      * Can be either 'vertical' or 'horizontal'.\n     */\n    direction: {\n      type: String,\n      default: 'vertical',\n      validator: (value) => ['vertical', 'horizontal'].includes(value),\n    },\n\n    /*\n      * The tag to use for the list.\n     */\n    listTag: {\n      type: String,\n      default: 'div',\n    },\n\n    /*\n      * The tag to use for the items.\n     */\n    itemTag: {\n      type: String,\n      default: 'div',\n    },\n\n    /*\n      * Display height (or width in horizontal mode) of the items in pixels\n      * used to calculate the scroll size and position.\n      * Is required for the initial render of items in DYNAMIC size mode.\n     */\n    minItemSize: {\n      type: [Number, String],\n    },\n  },\n\n  data () {\n    return {\n      vscrollData: {\n        active: true,\n        sizes: {},\n        keyField: this.keyField,\n        simpleArray: false,\n      },\n    };\n  },\n\n  computed: {\n    simpleArray () {\n      return this.items.length && typeof this.items[0] !== 'object';\n    },\n\n    itemsWithSize () {\n      const result = [];\n      const { items, keyField, simpleArray } = this;\n      const sizes = this.vscrollData.sizes;\n      const l = items.length;\n      for (let i = 0; i < l; i++) {\n        const item = items[i];\n        const id = simpleArray ? i : item[keyField];\n        let size = sizes[id];\n        if (typeof size === 'undefined' && !this.$_undefinedMap[id]) {\n          size = 0;\n        }\n        result.push({\n          item,\n          [keyField]: id,\n          size,\n        });\n      }\n      return result;\n    },\n  },\n\n  watch: {\n    simpleArray: {\n      handler (value) {\n        this.vscrollData.simpleArray = value;\n      },\n\n      immediate: true,\n    },\n\n    itemsWithSize (next, prev) {\n      const scrollTop = returnFirstEl(this.$el).scrollTop;\n\n      // Calculate total diff between prev and next sizes\n      // over current scroll top. Then add it to scrollTop to\n      // avoid jumping the contents that the user is seeing.\n      let prevActiveTop = 0; let activeTop = 0;\n      const length = Math.min(next.length, prev.length);\n      for (let i = 0; i < length; i++) {\n        if (prevActiveTop >= scrollTop) {\n          break;\n        }\n        prevActiveTop += prev[i].size || this.minItemSize;\n        activeTop += next[i].size || this.minItemSize;\n      }\n      const offset = activeTop - prevActiveTop;\n\n      if (offset === 0) {\n        return;\n      }\n\n      returnFirstEl(this.$el).scrollTop += offset;\n    },\n  },\n\n  beforeCreate () {\n    this.$_updates = [];\n    this.$_undefinedSizes = 0;\n    this.$_undefinedMap = {};\n  },\n\n  activated () {\n    this.vscrollData.active = true;\n  },\n\n  deactivated () {\n    this.vscrollData.active = false;\n  },\n\n  methods: {\n    dynamicScrollerUpdateItems () {\n      const scroller = this.$refs.scroller;\n      if (scroller) scroller._updateVisibleItems(true);\n    },\n\n    dynamicScrollerUpdateItemsFromBottom () {\n      const scroller = this.$refs.scroller;\n      if (scroller) scroller._updateVisibleItems(false, true);\n    },\n\n    scrollToItem (index) {\n      const scroller = this.$refs.scroller;\n      if (scroller) scroller.scrollToItem(index);\n    },\n\n    scrollToBottom () {\n      if (this.$_scrollingToBottom) return;\n      this.$_scrollingToBottom = true;\n      const el = returnFirstEl(this.$el);\n      // Item is inserted to the DOM\n      this.$nextTick(() => {\n        el.scrollTop = el.scrollHeight + 5000;\n        // Item sizes are computed\n        const cb = () => {\n          el.scrollTop = el.scrollHeight + 5000;\n          requestAnimationFrame(() => {\n            el.scrollTop = el.scrollHeight + 5000;\n            if (this.$_undefinedSizes === 0) {\n              this.$_scrollingToBottom = false;\n            } else {\n              requestAnimationFrame(cb);\n            }\n          });\n        };\n        requestAnimationFrame(cb);\n      });\n    },\n  },\n};\n</script>\n"],"names":["CoreScroller","DtScrollerItem","returnFirstEl","_openBlock","_createBlock","_mergeProps","_createVNode","_withCtx","_renderSlot","_normalizeProps","_guardReactiveProps"],"mappings":"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"}