element-plus
Version:
A Component Library for Vue 3
1 lines • 28.3 kB
Source Map (JSON)
{"version":3,"file":"build-list.mjs","sources":["../../../../../../../packages/components/virtual-list/src/builders/build-list.ts"],"sourcesContent":["import {\n Fragment,\n computed,\n defineComponent,\n getCurrentInstance,\n h,\n mergeProps,\n nextTick,\n onActivated,\n onMounted,\n onUpdated,\n ref,\n resolveDynamicComponent,\n unref,\n} from 'vue'\nimport { useEventListener } from '@vueuse/core'\nimport { hasOwn, isClient, isNumber, isString } from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport { useCache } from '../hooks/use-cache'\nimport useWheel from '../hooks/use-wheel'\nimport Scrollbar from '../components/scrollbar'\nimport { getRTLOffsetType, getScrollDir, isHorizontal } from '../utils'\nimport { virtualizedListProps } from '../props'\nimport {\n AUTO_ALIGNMENT,\n BACKWARD,\n FORWARD,\n HORIZONTAL,\n ITEM_RENDER_EVT,\n RTL,\n RTL_OFFSET_NAG,\n RTL_OFFSET_POS_ASC,\n RTL_OFFSET_POS_DESC,\n SCROLL_EVT,\n} from '../defaults'\n\nimport type { CSSProperties, Slot, VNode, VNodeChild } from 'vue'\nimport type { Alignment, ListConstructorProps } from '../types'\nimport type { VirtualizedListProps } from '../props'\n\nconst createList = ({\n name,\n getOffset,\n getItemSize,\n getItemOffset,\n getEstimatedTotalSize,\n getStartIndexForOffset,\n getStopIndexForStartIndex,\n initCache,\n clearCache,\n validateProps,\n}: ListConstructorProps<VirtualizedListProps>) => {\n return defineComponent({\n name: name ?? 'ElVirtualList',\n props: virtualizedListProps,\n emits: [ITEM_RENDER_EVT, SCROLL_EVT],\n setup(props, { emit, expose }) {\n validateProps(props)\n const instance = getCurrentInstance()!\n\n const ns = useNamespace('vl')\n\n const dynamicSizeCache = ref(initCache(props, instance))\n\n const getItemStyleCache = useCache<CSSProperties>()\n // refs\n // here windowRef and innerRef can be type of HTMLElement\n // or user defined component type, depends on the type passed\n // by user\n const windowRef = ref<HTMLElement>()\n const innerRef = ref<HTMLElement>()\n const scrollbarRef = ref()\n const states = ref({\n isScrolling: false,\n scrollDir: 'forward',\n scrollOffset: isNumber(props.initScrollOffset)\n ? props.initScrollOffset\n : 0,\n updateRequested: false,\n isScrollbarDragging: false,\n scrollbarAlwaysOn: props.scrollbarAlwaysOn,\n })\n\n // computed\n const itemsToRender = computed(() => {\n const { total, cache } = props\n const { isScrolling, scrollDir, scrollOffset } = unref(states)\n\n if (total === 0) {\n return [0, 0, 0, 0]\n }\n\n const startIndex = getStartIndexForOffset(\n props,\n scrollOffset,\n unref(dynamicSizeCache)\n )\n const stopIndex = getStopIndexForStartIndex(\n props,\n startIndex,\n scrollOffset,\n unref(dynamicSizeCache)\n )\n\n const cacheBackward =\n !isScrolling || scrollDir === BACKWARD ? Math.max(1, cache) : 1\n const cacheForward =\n !isScrolling || scrollDir === FORWARD ? Math.max(1, cache) : 1\n\n return [\n Math.max(0, startIndex - cacheBackward),\n Math.max(0, Math.min(total! - 1, stopIndex + cacheForward)),\n startIndex,\n stopIndex,\n ]\n })\n\n const estimatedTotalSize = computed(() =>\n getEstimatedTotalSize(props, unref(dynamicSizeCache))\n )\n\n const _isHorizontal = computed(() => isHorizontal(props.layout))\n\n const windowStyle = computed(() => [\n {\n position: 'relative',\n [`overflow-${_isHorizontal.value ? 'x' : 'y'}`]: 'scroll',\n WebkitOverflowScrolling: 'touch',\n willChange: 'transform',\n },\n {\n direction: props.direction,\n height: isNumber(props.height) ? `${props.height}px` : props.height,\n width: isNumber(props.width) ? `${props.width}px` : props.width,\n },\n props.style,\n ])\n\n const innerStyle = computed(() => {\n const size = unref(estimatedTotalSize)\n const horizontal = unref(_isHorizontal)\n return {\n height: horizontal ? '100%' : `${size}px`,\n pointerEvents: unref(states).isScrolling ? 'none' : undefined,\n width: horizontal ? `${size}px` : '100%',\n\n // fix scrolling issues in Firefox.\n margin: 0,\n boxSizing: 'border-box',\n }\n })\n\n const clientSize = computed(() =>\n _isHorizontal.value ? props.width : props.height\n )\n\n // methods\n const { onWheel } = useWheel(\n {\n atStartEdge: computed(() => states.value.scrollOffset <= 0),\n atEndEdge: computed(\n () => states.value.scrollOffset >= estimatedTotalSize.value\n ),\n layout: computed(() => props.layout),\n },\n (offset) => {\n ;(\n scrollbarRef.value as {\n onMouseUp: () => void\n }\n ).onMouseUp?.()\n scrollTo(\n Math.min(\n states.value.scrollOffset + offset,\n estimatedTotalSize.value - (clientSize.value as number)\n )\n )\n }\n )\n\n useEventListener(windowRef, 'wheel', onWheel, {\n passive: false,\n })\n\n const emitEvents = () => {\n const { total } = props\n\n if (total! > 0) {\n const [cacheStart, cacheEnd, visibleStart, visibleEnd] =\n unref(itemsToRender)\n emit(ITEM_RENDER_EVT, cacheStart, cacheEnd, visibleStart, visibleEnd)\n }\n\n const { scrollDir, scrollOffset, updateRequested } = unref(states)\n emit(SCROLL_EVT, scrollDir, scrollOffset, updateRequested)\n }\n\n const scrollVertically = (e: Event) => {\n const { clientHeight, scrollHeight, scrollTop } =\n e.currentTarget as HTMLElement\n const _states = unref(states)\n if (_states.scrollOffset === scrollTop) {\n return\n }\n\n const scrollOffset = Math.max(\n 0,\n Math.min(scrollTop, scrollHeight - clientHeight)\n )\n\n states.value = {\n ..._states,\n isScrolling: true,\n scrollDir: getScrollDir(_states.scrollOffset, scrollOffset),\n scrollOffset,\n updateRequested: false,\n }\n\n nextTick(resetIsScrolling)\n }\n\n const scrollHorizontally = (e: Event) => {\n const { clientWidth, scrollLeft, scrollWidth } =\n e.currentTarget as HTMLElement\n const _states = unref(states)\n\n if (_states.scrollOffset === scrollLeft) {\n return\n }\n\n const { direction } = props\n\n let scrollOffset = scrollLeft\n\n if (direction === RTL) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // It's also easier for this component if we convert offsets to the same format as they would be in for ltr.\n // So the simplest solution is to determine which browser behavior we're dealing with, and convert based on it.\n switch (getRTLOffsetType()) {\n case RTL_OFFSET_NAG: {\n scrollOffset = -scrollLeft\n break\n }\n case RTL_OFFSET_POS_DESC: {\n scrollOffset = scrollWidth - clientWidth - scrollLeft\n break\n }\n }\n }\n\n scrollOffset = Math.max(\n 0,\n Math.min(scrollOffset, scrollWidth - clientWidth)\n )\n\n states.value = {\n ..._states,\n isScrolling: true,\n scrollDir: getScrollDir(_states.scrollOffset, scrollOffset),\n scrollOffset,\n updateRequested: false,\n }\n\n nextTick(resetIsScrolling)\n }\n\n const onScroll = (e: Event) => {\n unref(_isHorizontal) ? scrollHorizontally(e) : scrollVertically(e)\n emitEvents()\n }\n\n const onScrollbarScroll = (distanceToGo: number, totalSteps: number) => {\n const offset =\n ((estimatedTotalSize.value - (clientSize.value as number)) /\n totalSteps) *\n distanceToGo\n scrollTo(\n Math.min(\n estimatedTotalSize.value - (clientSize.value as number),\n offset\n )\n )\n }\n\n const scrollTo = (offset: number) => {\n offset = Math.max(offset, 0)\n\n if (offset === unref(states).scrollOffset) {\n return\n }\n\n states.value = {\n ...unref(states),\n scrollOffset: offset,\n scrollDir: getScrollDir(unref(states).scrollOffset, offset),\n updateRequested: true,\n }\n\n nextTick(resetIsScrolling)\n }\n\n const scrollToItem = (\n idx: number,\n alignment: Alignment = AUTO_ALIGNMENT\n ) => {\n const { scrollOffset } = unref(states)\n\n idx = Math.max(0, Math.min(idx, props.total! - 1))\n scrollTo(\n getOffset(\n props,\n idx,\n alignment,\n scrollOffset,\n unref(dynamicSizeCache)\n )\n )\n }\n\n const getItemStyle = (idx: number) => {\n const { direction, itemSize, layout } = props\n\n const itemStyleCache = getItemStyleCache.value(\n clearCache && itemSize,\n clearCache && layout,\n clearCache && direction\n )\n\n let style: CSSProperties\n if (hasOwn(itemStyleCache, String(idx))) {\n style = itemStyleCache[idx]\n } else {\n const offset = getItemOffset(props, idx, unref(dynamicSizeCache))\n const size = getItemSize(props, idx, unref(dynamicSizeCache))\n const horizontal = unref(_isHorizontal)\n\n const isRtl = direction === RTL\n const offsetHorizontal = horizontal ? offset : 0\n itemStyleCache[idx] = style = {\n position: 'absolute',\n left: isRtl ? undefined : `${offsetHorizontal}px`,\n right: isRtl ? `${offsetHorizontal}px` : undefined,\n top: !horizontal ? `${offset}px` : 0,\n height: !horizontal ? `${size}px` : '100%',\n width: horizontal ? `${size}px` : '100%',\n }\n }\n\n return style\n }\n\n // TODO: perf optimization here, reset isScrolling with debounce.\n\n const resetIsScrolling = () => {\n states.value.isScrolling = false\n nextTick(() => {\n getItemStyleCache.value(-1, null, null)\n })\n }\n\n const resetScrollTop = () => {\n const window = windowRef.value\n if (window) {\n window.scrollTop = 0\n }\n }\n\n // life cycles\n onMounted(() => {\n if (!isClient) return\n const { initScrollOffset } = props\n const windowElement = unref(windowRef)\n if (isNumber(initScrollOffset) && windowElement) {\n if (unref(_isHorizontal)) {\n windowElement.scrollLeft = initScrollOffset\n } else {\n windowElement.scrollTop = initScrollOffset\n }\n }\n\n emitEvents()\n })\n\n onUpdated(() => {\n const { direction, layout } = props\n const { scrollOffset, updateRequested } = unref(states)\n const windowElement = unref(windowRef)\n\n if (updateRequested && windowElement) {\n if (layout === HORIZONTAL) {\n if (direction === RTL) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n switch (getRTLOffsetType()) {\n case RTL_OFFSET_NAG: {\n windowElement.scrollLeft = -scrollOffset\n break\n }\n case RTL_OFFSET_POS_ASC: {\n windowElement.scrollLeft = scrollOffset\n break\n }\n default: {\n const { clientWidth, scrollWidth } = windowElement\n windowElement.scrollLeft =\n scrollWidth - clientWidth - scrollOffset\n break\n }\n }\n } else {\n windowElement.scrollLeft = scrollOffset\n }\n } else {\n windowElement.scrollTop = scrollOffset\n }\n }\n })\n\n onActivated(() => {\n unref(windowRef)!.scrollTop = unref(states).scrollOffset\n })\n\n const api = {\n ns,\n clientSize,\n estimatedTotalSize,\n windowStyle,\n windowRef,\n innerRef,\n innerStyle,\n itemsToRender,\n scrollbarRef,\n states,\n getItemStyle,\n onScroll,\n onScrollbarScroll,\n onWheel,\n scrollTo,\n scrollToItem,\n resetScrollTop,\n }\n\n expose({\n windowRef,\n innerRef,\n getItemStyleCache,\n scrollTo,\n scrollToItem,\n resetScrollTop,\n states,\n })\n\n return api\n },\n\n render(ctx: any) {\n const {\n $slots,\n className,\n clientSize,\n containerElement,\n data,\n getItemStyle,\n innerElement,\n itemsToRender,\n innerStyle,\n layout,\n total,\n onScroll,\n onScrollbarScroll,\n states,\n useIsScrolling,\n windowStyle,\n ns,\n } = ctx\n\n const [start, end] = itemsToRender\n\n const Container = resolveDynamicComponent(containerElement)\n const Inner = resolveDynamicComponent(innerElement)\n\n const children = [] as VNodeChild[]\n\n if (total > 0) {\n for (let i = start; i <= end; i++) {\n children.push(\n h(\n Fragment,\n { key: i },\n ($slots.default as Slot)?.({\n data,\n index: i,\n isScrolling: useIsScrolling ? states.isScrolling : undefined,\n style: getItemStyle(i),\n })\n )\n )\n }\n }\n\n const InnerNode = [\n h(\n Inner as VNode,\n mergeProps(ctx.innerProps, {\n style: innerStyle,\n ref: 'innerRef',\n }),\n !isString(Inner)\n ? {\n default: () => children,\n }\n : children\n ),\n ]\n\n const scrollbar = h(Scrollbar, {\n ref: 'scrollbarRef',\n clientSize,\n layout,\n onScroll: onScrollbarScroll,\n ratio: (clientSize * 100) / this.estimatedTotalSize,\n scrollFrom:\n states.scrollOffset / (this.estimatedTotalSize - clientSize),\n total,\n alwaysOn: states.scrollbarAlwaysOn,\n })\n\n const listContainer = h(\n Container as VNode,\n {\n class: [ns.e('window'), className],\n style: windowStyle,\n onScroll,\n ref: 'windowRef',\n key: 0,\n },\n !isString(Container) ? { default: () => [InnerNode] } : [InnerNode]\n )\n\n return h(\n 'div',\n {\n key: 0,\n class: [ns.e('wrapper'), states.scrollbarAlwaysOn ? 'always-on' : ''],\n },\n [listContainer, scrollbar]\n )\n },\n })\n}\n\nexport default createList\n"],"names":["Scrollbar"],"mappings":"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"}