element-plus
Version:
A Component Library for Vue 3
1 lines • 24.9 kB
Source Map (JSON)
{"version":3,"file":"build-list.mjs","names":["isClient","Scrollbar"],"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 watch,\n} from 'vue'\nimport { clamp, useEventListener } from '@vueuse/core'\nimport {\n hasOwn,\n isClient,\n isGreaterThan,\n isNumber,\n isString,\n} 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 END_REACHED_EVT,\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, ScrollDirection } 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, END_REACHED_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 as ScrollDirection,\n scrollOffset: isNumber(props.initScrollOffset)\n ? props.initScrollOffset\n : 0,\n updateRequested: false,\n isScrollbarDragging: false,\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 const innerWidth = props.innerWidth\n return {\n height: horizontal ? '100%' : `${size}px`,\n pointerEvents: unref(states).isScrolling ? 'none' : undefined,\n width: horizontal\n ? `${size}px`\n : innerWidth !== undefined\n ? isNumber(innerWidth)\n ? `${innerWidth}px`\n : innerWidth\n : '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 const maxOffset = computed(() =>\n Math.max(0, estimatedTotalSize.value - (clientSize.value as number))\n )\n\n const normalizeOffset = (offset: number) =>\n clamp(offset, 0, maxOffset.value)\n\n // Tolerance must cover sub-pixel differences that arise when the\n // browser's actual scrollHeight−clientHeight (affected by DPR\n // rounding) doesn't exactly match our computed maxOffset.\n // Without this, the native scroll event after onUpdated resets\n // edgeState and causes a duplicate end-reached emission.\n const EDGE_TOLERANCE = 1\n\n const getEdgeState = (normalizedOffset: number) => ({\n start: !isGreaterThan(normalizedOffset, 0, EDGE_TOLERANCE),\n end: !isGreaterThan(maxOffset.value, normalizedOffset, EDGE_TOLERANCE),\n })\n\n const normalizedScrollOffset = computed(() =>\n normalizeOffset(states.value.scrollOffset)\n )\n const currentEdgeState = computed(() =>\n getEdgeState(normalizedScrollOffset.value)\n )\n\n let edgeState = currentEdgeState.value\n\n const startEdgeReached = computed(() => currentEdgeState.value.start)\n const endEdgeReached = computed(() => currentEdgeState.value.end)\n\n // methods\n const { onWheel } = useWheel(\n {\n atStartEdge: startEdgeReached,\n atEndEdge: endEdgeReached,\n layout: computed(() => props.layout),\n },\n (offset) => {\n ;(\n scrollbarRef.value as {\n onMouseUp: () => void\n }\n ).onMouseUp?.()\n scrollTo(\n Math.min(states.value.scrollOffset + offset, maxOffset.value)\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 emitEndReached = (direction: ScrollDirection, offset: number) => {\n const nextEdgeState = getEdgeState(offset)\n const horizontalEnd = props.direction === RTL ? 'left' : 'right'\n const horizontalStart = props.direction === RTL ? 'right' : 'left'\n\n if (direction === FORWARD && nextEdgeState.end && !edgeState.end) {\n emit(END_REACHED_EVT, _isHorizontal.value ? horizontalEnd : 'bottom')\n }\n\n if (direction === BACKWARD && nextEdgeState.start && !edgeState.start) {\n emit(END_REACHED_EVT, _isHorizontal.value ? horizontalStart : 'top')\n }\n\n edgeState = nextEdgeState\n }\n\n const updateScrollOffset = (\n offset: number,\n {\n isScrolling,\n updateRequested,\n }: {\n isScrolling: boolean\n updateRequested: boolean\n }\n ) => {\n const currentState = unref(states)\n const nextOffset = Math.max(offset, 0)\n\n if (nextOffset === currentState.scrollOffset) {\n return\n }\n\n const scrollDir = getScrollDir(currentState.scrollOffset, nextOffset)\n\n states.value = {\n ...currentState,\n isScrolling,\n scrollDir,\n scrollOffset: nextOffset,\n updateRequested,\n }\n emitEndReached(scrollDir, normalizeOffset(nextOffset))\n\n nextTick(resetIsScrolling)\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 updateScrollOffset(Math.min(scrollTop, scrollHeight - clientHeight), {\n isScrolling: true,\n updateRequested: false,\n })\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 updateScrollOffset(Math.min(scrollOffset, scrollWidth - clientWidth), {\n isScrolling: true,\n updateRequested: false,\n })\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 = (maxOffset.value / totalSteps) * distanceToGo\n scrollTo(Math.min(maxOffset.value, offset))\n }\n\n const scrollTo = (offset: number) => {\n updateScrollOffset(offset, {\n isScrolling: unref(states).isScrolling,\n updateRequested: true,\n })\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 watch(maxOffset, () => {\n edgeState = currentEdgeState.value\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 scrollbarAlwaysOn,\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: 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'), scrollbarAlwaysOn ? 'always-on' : ''],\n },\n [listContainer, scrollbar]\n )\n },\n })\n}\n\nexport default createList\n"],"mappings":"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"}