UNPKG

vuetify

Version:

Vue Material Component Framework

1 lines 6.22 kB
{"version":3,"file":"virtual.mjs","names":["computed","ref","propsFactory","makeDataTableVirtualProps","visibleItems","type","String","Number","default","itemHeight","UP","DOWN","useVirtual","props","items","startIndex","parseInt","containerRef","isScrolling","calculateOffset","index","value","calculateMidPointIndex","scrollTop","start","end","length","middle","Math","floor","middleOffset","lastScrollTop","scrollTimeout","handleScroll","clearTimeout","setTimeout","direction","midPointIndex","buffer","round","max","min","stopIndex","paddingTop","paddingBottom"],"sources":["../../../../src/labs/VDataTable/composables/virtual.ts"],"sourcesContent":["// Utilities\nimport { computed, ref } from 'vue'\nimport { propsFactory } from '@/util'\n\n// Types\nimport type { Ref } from 'vue'\n\nexport const makeDataTableVirtualProps = propsFactory({\n visibleItems: {\n type: [String, Number],\n default: 20,\n },\n itemHeight: {\n type: [String, Number],\n default: 52,\n },\n}, 'virtual')\n\ntype VirtualProps = {\n itemHeight: string | number\n visibleItems: string | number\n}\n\nconst UP = -1\nconst DOWN = 1\n\n// TODO: Replace this with composable from v-virtual-scroll\nexport function useVirtual (props: VirtualProps, items: Ref<any[]>) {\n const startIndex = ref(0)\n const itemHeight = computed(() => parseInt(props.itemHeight, 10))\n const visibleItems = computed(() => parseInt(props.visibleItems, 10))\n const containerRef = ref<HTMLDivElement>()\n const isScrolling = ref(false)\n\n function calculateOffset (index: number) {\n return index * itemHeight.value\n }\n\n function calculateMidPointIndex (scrollTop: number) {\n let start = 0\n let end = items.value.length\n\n while (start <= end) {\n const middle = start + Math.floor((end - start) / 2)\n const middleOffset = calculateOffset(middle)\n\n if (middleOffset === scrollTop) {\n return middle\n } else if (middleOffset < scrollTop) {\n start = middle + 1\n } else if (middleOffset > scrollTop) {\n end = middle - 1\n }\n }\n\n return start\n }\n\n let lastScrollTop = 0\n let scrollTimeout: any\n function handleScroll () {\n if (!containerRef.value) return\n\n isScrolling.value = true\n clearTimeout(scrollTimeout)\n scrollTimeout = setTimeout(() => {\n isScrolling.value = false\n }, 100)\n\n const scrollTop = containerRef.value.scrollTop\n const direction = scrollTop < lastScrollTop ? UP : DOWN\n\n const midPointIndex = calculateMidPointIndex(scrollTop)\n\n const buffer = Math.round(visibleItems.value / 3)\n if (direction === UP && midPointIndex <= startIndex.value) {\n startIndex.value = Math.max(midPointIndex - buffer, 0)\n } else if (direction === DOWN && midPointIndex >= startIndex.value + (buffer * 2)) {\n startIndex.value = Math.min(Math.max(0, midPointIndex - buffer), items.value.length - visibleItems.value)\n }\n\n lastScrollTop = containerRef.value.scrollTop\n }\n\n const stopIndex = computed(() => Math.min(items.value.length, startIndex.value + visibleItems.value))\n const paddingTop = computed(() => calculateOffset(startIndex.value))\n const paddingBottom = computed(() => calculateOffset(items.value.length) - calculateOffset(stopIndex.value))\n\n return {\n startIndex,\n stopIndex,\n paddingTop,\n paddingBottom,\n handleScroll,\n containerRef,\n itemHeight,\n isScrolling,\n }\n}\n"],"mappings":"AAAA;AACA,SAASA,QAAQ,EAAEC,GAAG,QAAQ,KAAK;AAAA,SAC1BC,YAAY,mCAErB;AAGA,OAAO,MAAMC,yBAAyB,GAAGD,YAAY,CAAC;EACpDE,YAAY,EAAE;IACZC,IAAI,EAAE,CAACC,MAAM,EAAEC,MAAM,CAAC;IACtBC,OAAO,EAAE;EACX,CAAC;EACDC,UAAU,EAAE;IACVJ,IAAI,EAAE,CAACC,MAAM,EAAEC,MAAM,CAAC;IACtBC,OAAO,EAAE;EACX;AACF,CAAC,EAAE,SAAS,CAAC;AAOb,MAAME,EAAE,GAAG,CAAC,CAAC;AACb,MAAMC,IAAI,GAAG,CAAC;;AAEd;AACA,OAAO,SAASC,UAAU,CAAEC,KAAmB,EAAEC,KAAiB,EAAE;EAClE,MAAMC,UAAU,GAAGd,GAAG,CAAC,CAAC,CAAC;EACzB,MAAMQ,UAAU,GAAGT,QAAQ,CAAC,MAAMgB,QAAQ,CAACH,KAAK,CAACJ,UAAU,EAAE,EAAE,CAAC,CAAC;EACjE,MAAML,YAAY,GAAGJ,QAAQ,CAAC,MAAMgB,QAAQ,CAACH,KAAK,CAACT,YAAY,EAAE,EAAE,CAAC,CAAC;EACrE,MAAMa,YAAY,GAAGhB,GAAG,EAAkB;EAC1C,MAAMiB,WAAW,GAAGjB,GAAG,CAAC,KAAK,CAAC;EAE9B,SAASkB,eAAe,CAAEC,KAAa,EAAE;IACvC,OAAOA,KAAK,GAAGX,UAAU,CAACY,KAAK;EACjC;EAEA,SAASC,sBAAsB,CAAEC,SAAiB,EAAE;IAClD,IAAIC,KAAK,GAAG,CAAC;IACb,IAAIC,GAAG,GAAGX,KAAK,CAACO,KAAK,CAACK,MAAM;IAE5B,OAAOF,KAAK,IAAIC,GAAG,EAAE;MACnB,MAAME,MAAM,GAAGH,KAAK,GAAGI,IAAI,CAACC,KAAK,CAAC,CAACJ,GAAG,GAAGD,KAAK,IAAI,CAAC,CAAC;MACpD,MAAMM,YAAY,GAAGX,eAAe,CAACQ,MAAM,CAAC;MAE5C,IAAIG,YAAY,KAAKP,SAAS,EAAE;QAC9B,OAAOI,MAAM;MACf,CAAC,MAAM,IAAIG,YAAY,GAAGP,SAAS,EAAE;QACnCC,KAAK,GAAGG,MAAM,GAAG,CAAC;MACpB,CAAC,MAAM,IAAIG,YAAY,GAAGP,SAAS,EAAE;QACnCE,GAAG,GAAGE,MAAM,GAAG,CAAC;MAClB;IACF;IAEA,OAAOH,KAAK;EACd;EAEA,IAAIO,aAAa,GAAG,CAAC;EACrB,IAAIC,aAAkB;EACtB,SAASC,YAAY,GAAI;IACvB,IAAI,CAAChB,YAAY,CAACI,KAAK,EAAE;IAEzBH,WAAW,CAACG,KAAK,GAAG,IAAI;IACxBa,YAAY,CAACF,aAAa,CAAC;IAC3BA,aAAa,GAAGG,UAAU,CAAC,MAAM;MAC/BjB,WAAW,CAACG,KAAK,GAAG,KAAK;IAC3B,CAAC,EAAE,GAAG,CAAC;IAEP,MAAME,SAAS,GAAGN,YAAY,CAACI,KAAK,CAACE,SAAS;IAC9C,MAAMa,SAAS,GAAGb,SAAS,GAAGQ,aAAa,GAAGrB,EAAE,GAAGC,IAAI;IAEvD,MAAM0B,aAAa,GAAGf,sBAAsB,CAACC,SAAS,CAAC;IAEvD,MAAMe,MAAM,GAAGV,IAAI,CAACW,KAAK,CAACnC,YAAY,CAACiB,KAAK,GAAG,CAAC,CAAC;IACjD,IAAIe,SAAS,KAAK1B,EAAE,IAAI2B,aAAa,IAAItB,UAAU,CAACM,KAAK,EAAE;MACzDN,UAAU,CAACM,KAAK,GAAGO,IAAI,CAACY,GAAG,CAACH,aAAa,GAAGC,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC,MAAM,IAAIF,SAAS,KAAKzB,IAAI,IAAI0B,aAAa,IAAItB,UAAU,CAACM,KAAK,GAAIiB,MAAM,GAAG,CAAE,EAAE;MACjFvB,UAAU,CAACM,KAAK,GAAGO,IAAI,CAACa,GAAG,CAACb,IAAI,CAACY,GAAG,CAAC,CAAC,EAAEH,aAAa,GAAGC,MAAM,CAAC,EAAExB,KAAK,CAACO,KAAK,CAACK,MAAM,GAAGtB,YAAY,CAACiB,KAAK,CAAC;IAC3G;IAEAU,aAAa,GAAGd,YAAY,CAACI,KAAK,CAACE,SAAS;EAC9C;EAEA,MAAMmB,SAAS,GAAG1C,QAAQ,CAAC,MAAM4B,IAAI,CAACa,GAAG,CAAC3B,KAAK,CAACO,KAAK,CAACK,MAAM,EAAEX,UAAU,CAACM,KAAK,GAAGjB,YAAY,CAACiB,KAAK,CAAC,CAAC;EACrG,MAAMsB,UAAU,GAAG3C,QAAQ,CAAC,MAAMmB,eAAe,CAACJ,UAAU,CAACM,KAAK,CAAC,CAAC;EACpE,MAAMuB,aAAa,GAAG5C,QAAQ,CAAC,MAAMmB,eAAe,CAACL,KAAK,CAACO,KAAK,CAACK,MAAM,CAAC,GAAGP,eAAe,CAACuB,SAAS,CAACrB,KAAK,CAAC,CAAC;EAE5G,OAAO;IACLN,UAAU;IACV2B,SAAS;IACTC,UAAU;IACVC,aAAa;IACbX,YAAY;IACZhB,YAAY;IACZR,UAAU;IACVS;EACF,CAAC;AACH"}