element-plus
Version:
A Component Library for Vue 3
1 lines • 29.4 kB
Source Map (JSON)
{"version":3,"file":"build-grid.mjs","names":["isClient","Scrollbar"],"sources":["../../../../../../../packages/components/virtual-list/src/builders/build-grid.ts"],"sourcesContent":["import {\n Fragment,\n computed,\n defineComponent,\n getCurrentInstance,\n h,\n mergeProps,\n nextTick,\n onMounted,\n ref,\n resolveDynamicComponent,\n unref,\n} from 'vue'\nimport { useEventListener } from '@vueuse/core'\nimport {\n getScrollBarWidth,\n hasOwn,\n isClient,\n isNumber,\n isString,\n} from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport Scrollbar from '../components/scrollbar'\nimport { useGridWheel } from '../hooks/use-grid-wheel'\nimport { useCache } from '../hooks/use-cache'\nimport { useGridTouch } from '../hooks/use-grid-touch'\nimport { virtualizedGridProps } from '../props'\nimport { getRTLOffsetType, getScrollDir, isRTL } from '../utils'\nimport {\n AUTO_ALIGNMENT,\n BACKWARD,\n FORWARD,\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 {\n CSSProperties,\n Ref,\n StyleValue,\n UnwrapRef,\n VNode,\n VNodeChild,\n} from 'vue'\nimport type {\n Alignment,\n GridConstructorProps,\n GridScrollOptions,\n GridStates,\n ScrollbarExpose,\n} from '../types'\nimport type { VirtualizedGridProps } from '../props'\nimport type { DynamicSizeGridInstance } from '../components/dynamic-size-grid.ts'\n\nconst createGrid = ({\n name,\n clearCache,\n getColumnPosition,\n getColumnStartIndexForOffset,\n getColumnStopIndexForStartIndex,\n getEstimatedTotalHeight,\n getEstimatedTotalWidth,\n getColumnOffset,\n getRowOffset,\n getRowPosition,\n getRowStartIndexForOffset,\n getRowStopIndexForStartIndex,\n\n initCache,\n injectToInstance,\n validateProps,\n}: GridConstructorProps<VirtualizedGridProps>) => {\n return defineComponent({\n name: name ?? 'ElVirtualList',\n props: virtualizedGridProps,\n emits: [ITEM_RENDER_EVT, SCROLL_EVT],\n setup(props, { emit, expose, slots }) {\n const ns = useNamespace('vl')\n\n validateProps(props)\n const instance = getCurrentInstance()!\n const cache = ref(initCache(props, instance))\n injectToInstance?.(instance, cache)\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 hScrollbar = ref<ScrollbarExpose>()\n const vScrollbar = ref<ScrollbarExpose>()\n // innerRef is the actual container element which contains all the elements\n const innerRef = ref<HTMLElement>()\n const states = ref<GridStates>({\n isScrolling: false,\n scrollLeft: isNumber(props.initScrollLeft) ? props.initScrollLeft : 0,\n scrollTop: isNumber(props.initScrollTop) ? props.initScrollTop : 0,\n updateRequested: false,\n xAxisScrollDir: FORWARD,\n yAxisScrollDir: FORWARD,\n })\n\n const getItemStyleCache = useCache()\n\n // computed\n const parsedHeight = computed(() =>\n Number.parseInt(`${props.height}`, 10)\n )\n const parsedWidth = computed(() => Number.parseInt(`${props.width}`, 10))\n const columnsToRender = computed(() => {\n const { totalColumn, totalRow, columnCache } = props\n const { isScrolling, xAxisScrollDir, scrollLeft } = unref(states)\n\n if (totalColumn === 0 || totalRow === 0) {\n return [0, 0, 0, 0]\n }\n\n const startIndex = getColumnStartIndexForOffset(\n props,\n scrollLeft,\n unref(cache)\n )\n const stopIndex = getColumnStopIndexForStartIndex(\n props,\n startIndex,\n scrollLeft,\n unref(cache)\n )\n\n const cacheBackward =\n !isScrolling || xAxisScrollDir === BACKWARD\n ? Math.max(1, columnCache)\n : 1\n const cacheForward =\n !isScrolling || xAxisScrollDir === FORWARD\n ? Math.max(1, columnCache)\n : 1\n\n return [\n Math.max(0, startIndex - cacheBackward),\n Math.max(0, Math.min(totalColumn! - 1, stopIndex + cacheForward)),\n startIndex,\n stopIndex,\n ]\n })\n\n const rowsToRender = computed(() => {\n const { totalColumn, totalRow, rowCache } = props\n const { isScrolling, yAxisScrollDir, scrollTop } = unref(states)\n\n if (totalColumn === 0 || totalRow === 0) {\n return [0, 0, 0, 0]\n }\n\n const startIndex = getRowStartIndexForOffset(\n props,\n scrollTop,\n unref(cache)\n )\n const stopIndex = getRowStopIndexForStartIndex(\n props,\n startIndex,\n scrollTop,\n unref(cache)\n )\n\n const cacheBackward =\n !isScrolling || yAxisScrollDir === BACKWARD\n ? Math.max(1, rowCache)\n : 1\n const cacheForward =\n !isScrolling || yAxisScrollDir === FORWARD ? Math.max(1, rowCache) : 1\n\n return [\n Math.max(0, startIndex - cacheBackward),\n Math.max(0, Math.min(totalRow! - 1, stopIndex + cacheForward)),\n startIndex,\n stopIndex,\n ]\n })\n\n const estimatedTotalHeight = computed(() =>\n getEstimatedTotalHeight(props, unref(cache))\n )\n const estimatedTotalWidth = computed(() =>\n getEstimatedTotalWidth(props, unref(cache))\n )\n\n const windowStyle = computed<StyleValue>(() => [\n {\n position: 'relative',\n overflow: 'hidden',\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 width = `${unref(estimatedTotalWidth)}px`\n const height = `${unref(estimatedTotalHeight)}px`\n\n return {\n height,\n pointerEvents: unref(states).isScrolling ? 'none' : undefined,\n width,\n\n // fix scrolling issues in Firefox.\n margin: 0,\n boxSizing: 'border-box',\n }\n })\n\n // methods\n const emitEvents = () => {\n const { totalColumn, totalRow } = props\n\n if (totalColumn! > 0 && totalRow! > 0) {\n const [\n columnCacheStart,\n columnCacheEnd,\n columnVisibleStart,\n columnVisibleEnd,\n ] = unref(columnsToRender)\n const [rowCacheStart, rowCacheEnd, rowVisibleStart, rowVisibleEnd] =\n unref(rowsToRender)\n // emit the render item event with\n // [xAxisInvisibleStart, xAxisInvisibleEnd, xAxisVisibleStart, xAxisVisibleEnd]\n // [yAxisInvisibleStart, yAxisInvisibleEnd, yAxisVisibleStart, yAxisVisibleEnd]\n emit(ITEM_RENDER_EVT, {\n columnCacheStart,\n columnCacheEnd,\n rowCacheStart,\n rowCacheEnd,\n columnVisibleStart,\n columnVisibleEnd,\n rowVisibleStart,\n rowVisibleEnd,\n })\n }\n\n const {\n scrollLeft,\n scrollTop,\n updateRequested,\n xAxisScrollDir,\n yAxisScrollDir,\n } = unref(states)\n emit(SCROLL_EVT, {\n xAxisScrollDir,\n scrollLeft,\n yAxisScrollDir,\n scrollTop,\n updateRequested,\n })\n }\n\n const onScroll = (e: Event) => {\n const {\n clientHeight,\n clientWidth,\n scrollHeight,\n scrollLeft,\n scrollTop,\n scrollWidth,\n } = e.currentTarget as HTMLElement\n\n const _states = unref(states)\n\n if (\n _states.scrollTop === scrollTop &&\n _states.scrollLeft === scrollLeft\n ) {\n return\n }\n\n let _scrollLeft = scrollLeft\n\n if (isRTL(props.direction)) {\n switch (getRTLOffsetType()) {\n case RTL_OFFSET_NAG:\n _scrollLeft = -scrollLeft\n break\n case RTL_OFFSET_POS_DESC:\n _scrollLeft = scrollWidth - clientWidth - scrollLeft\n break\n }\n }\n\n states.value = {\n ..._states,\n isScrolling: true,\n scrollLeft: _scrollLeft,\n scrollTop: Math.max(\n 0,\n Math.min(scrollTop, scrollHeight - clientHeight)\n ),\n updateRequested: true,\n xAxisScrollDir: getScrollDir(_states.scrollLeft, _scrollLeft),\n yAxisScrollDir: getScrollDir(_states.scrollTop, scrollTop),\n }\n\n nextTick(() => resetIsScrolling())\n\n onUpdated()\n emitEvents()\n }\n\n const onVerticalScroll = (distance: number, totalSteps: number) => {\n const height = unref(parsedHeight)\n const offset =\n ((estimatedTotalHeight.value - height) / totalSteps) * distance\n scrollTo({\n scrollTop: Math.min(estimatedTotalHeight.value - height, offset),\n })\n }\n\n const onHorizontalScroll = (distance: number, totalSteps: number) => {\n const width = unref(parsedWidth)\n const offset =\n ((estimatedTotalWidth.value - width) / totalSteps) * distance\n scrollTo({\n scrollLeft: Math.min(estimatedTotalWidth.value - width, offset),\n })\n }\n\n const { onWheel } = useGridWheel(\n {\n atXStartEdge: computed(() => states.value.scrollLeft <= 0),\n atXEndEdge: computed(\n () =>\n states.value.scrollLeft >=\n estimatedTotalWidth.value - unref(parsedWidth)\n ),\n atYStartEdge: computed(() => states.value.scrollTop <= 0),\n atYEndEdge: computed(\n () =>\n states.value.scrollTop >=\n estimatedTotalHeight.value - unref(parsedHeight)\n ),\n },\n (x: number, y: number) => {\n hScrollbar.value?.onMouseUp?.()\n vScrollbar.value?.onMouseUp?.()\n const width = unref(parsedWidth)\n const height = unref(parsedHeight)\n scrollTo({\n scrollLeft: Math.min(\n states.value.scrollLeft + x,\n estimatedTotalWidth.value - width\n ),\n scrollTop: Math.min(\n states.value.scrollTop + y,\n estimatedTotalHeight.value - height\n ),\n })\n }\n )\n\n useEventListener(windowRef, 'wheel', onWheel, {\n passive: false,\n })\n\n const scrollTo = ({\n scrollLeft = states.value.scrollLeft,\n scrollTop = states.value.scrollTop,\n }: GridScrollOptions) => {\n scrollLeft = Math.max(scrollLeft, 0)\n scrollTop = Math.max(scrollTop, 0)\n const _states = unref(states)\n if (\n scrollTop === _states.scrollTop &&\n scrollLeft === _states.scrollLeft\n ) {\n return\n }\n\n states.value = {\n ..._states,\n xAxisScrollDir: getScrollDir(_states.scrollLeft, scrollLeft),\n yAxisScrollDir: getScrollDir(_states.scrollTop, scrollTop),\n scrollLeft,\n scrollTop,\n updateRequested: true,\n }\n\n nextTick(() => resetIsScrolling())\n\n onUpdated()\n emitEvents()\n }\n\n const { touchStartX, touchStartY, handleTouchStart, handleTouchMove } =\n useGridTouch(\n windowRef,\n states,\n scrollTo,\n estimatedTotalWidth,\n estimatedTotalHeight,\n parsedWidth,\n parsedHeight\n )\n\n const scrollToItem = (\n rowIndex = 0,\n columnIdx = 0,\n alignment: Alignment = AUTO_ALIGNMENT\n ) => {\n const _states = unref(states)\n columnIdx = Math.max(0, Math.min(columnIdx, props.totalColumn! - 1))\n rowIndex = Math.max(0, Math.min(rowIndex, props.totalRow! - 1))\n const scrollBarWidth = getScrollBarWidth(ns.namespace.value)\n\n const _cache = unref(cache)\n const estimatedHeight = getEstimatedTotalHeight(props, _cache)\n const estimatedWidth = getEstimatedTotalWidth(props, _cache)\n\n scrollTo({\n scrollLeft: getColumnOffset(\n props,\n columnIdx,\n alignment,\n _states.scrollLeft,\n _cache,\n estimatedWidth > (props.width as number) ? scrollBarWidth : 0\n ),\n scrollTop: getRowOffset(\n props,\n rowIndex,\n alignment,\n _states.scrollTop,\n _cache,\n estimatedHeight > (props.height as number) ? scrollBarWidth : 0\n ),\n })\n }\n\n const getItemStyle = (rowIndex: number, columnIndex: number) => {\n const { columnWidth, direction, rowHeight } = props\n const itemStyleCache = getItemStyleCache.value(\n clearCache && columnWidth,\n clearCache && rowHeight,\n clearCache && direction\n )\n // since there was no need to introduce an nested array into cache object\n // we use row,column to construct the key for indexing the map.\n const key = `${rowIndex},${columnIndex}`\n\n if (hasOwn(itemStyleCache, key)) {\n return itemStyleCache[key] as CSSProperties\n } else {\n const [, left] = getColumnPosition(props, columnIndex, unref(cache))\n const _cache = unref(cache)\n\n const rtl = isRTL(direction)\n const [height, top] = getRowPosition(props, rowIndex, _cache)\n const [width] = getColumnPosition(props, columnIndex, _cache)\n\n itemStyleCache[key] = {\n position: 'absolute',\n left: rtl ? undefined : `${left}px`,\n right: rtl ? `${left}px` : undefined,\n top: `${top}px`,\n height: `${height}px`,\n width: `${width}px`,\n }\n\n return itemStyleCache[key] as CSSProperties\n }\n }\n\n // TODO: debounce setting is scrolling.\n\n const resetIsScrolling = () => {\n states.value.isScrolling = false\n nextTick(() => {\n getItemStyleCache.value(-1, null, null)\n })\n }\n\n // life cycles\n onMounted(() => {\n // for SSR\n if (!isClient) return\n const { initScrollLeft, initScrollTop } = props\n const windowElement = unref(windowRef)\n if (windowElement) {\n if (isNumber(initScrollLeft)) {\n windowElement.scrollLeft = initScrollLeft\n }\n if (isNumber(initScrollTop)) {\n windowElement.scrollTop = initScrollTop\n }\n }\n emitEvents()\n })\n\n const onUpdated = () => {\n const { direction } = props\n const { scrollLeft, scrollTop, updateRequested } = unref(states)\n\n const windowElement = unref(windowRef)\n if (updateRequested && windowElement) {\n if (direction === RTL) {\n switch (getRTLOffsetType()) {\n case RTL_OFFSET_NAG: {\n windowElement.scrollLeft = -scrollLeft\n break\n }\n case RTL_OFFSET_POS_ASC: {\n windowElement.scrollLeft = scrollLeft\n break\n }\n default: {\n const { clientWidth, scrollWidth } = windowElement\n windowElement.scrollLeft =\n scrollWidth - clientWidth - scrollLeft\n break\n }\n }\n } else {\n windowElement.scrollLeft = Math.max(0, scrollLeft)\n }\n\n windowElement.scrollTop = Math.max(0, scrollTop)\n }\n }\n\n const { resetAfterColumnIndex, resetAfterRowIndex, resetAfter } =\n instance.proxy as DynamicSizeGridInstance\n\n expose({\n windowRef,\n innerRef,\n getItemStyleCache,\n touchStartX,\n touchStartY,\n handleTouchStart,\n handleTouchMove,\n scrollTo,\n scrollToItem,\n states,\n resetAfterColumnIndex,\n resetAfterRowIndex,\n resetAfter,\n })\n\n // rendering part\n\n const renderScrollbars = () => {\n const {\n scrollbarAlwaysOn,\n scrollbarStartGap,\n scrollbarEndGap,\n totalColumn,\n totalRow,\n } = props\n\n const width = unref(parsedWidth)\n const height = unref(parsedHeight)\n const estimatedWidth = unref(estimatedTotalWidth)\n const estimatedHeight = unref(estimatedTotalHeight)\n const { scrollLeft, scrollTop } = unref(states)\n const horizontalScrollbar = h(Scrollbar, {\n ref: hScrollbar,\n alwaysOn: scrollbarAlwaysOn,\n startGap: scrollbarStartGap,\n endGap: scrollbarEndGap,\n class: ns.e('horizontal'),\n clientSize: width,\n layout: 'horizontal',\n onScroll: onHorizontalScroll,\n ratio: (width * 100) / estimatedWidth,\n scrollFrom: scrollLeft / (estimatedWidth - width),\n total: totalRow,\n visible: true,\n })\n\n const verticalScrollbar = h(Scrollbar, {\n ref: vScrollbar,\n alwaysOn: scrollbarAlwaysOn,\n startGap: scrollbarStartGap,\n endGap: scrollbarEndGap,\n class: ns.e('vertical'),\n clientSize: height,\n layout: 'vertical',\n onScroll: onVerticalScroll,\n ratio: (height * 100) / estimatedHeight,\n scrollFrom: scrollTop / (estimatedHeight - height),\n\n total: totalColumn,\n visible: true,\n })\n\n return {\n horizontalScrollbar,\n verticalScrollbar,\n }\n }\n\n const renderItems = () => {\n const [columnStart, columnEnd] = unref(columnsToRender)\n const [rowStart, rowEnd] = unref(rowsToRender)\n const { data, totalColumn, totalRow, useIsScrolling, itemKey } = props\n const children: VNodeChild[] = []\n if (totalRow > 0 && totalColumn > 0) {\n for (let row = rowStart; row <= rowEnd; row++) {\n for (let column = columnStart; column <= columnEnd; column++) {\n const key = itemKey({ columnIndex: column, data, rowIndex: row })\n children.push(\n h(\n Fragment,\n { key },\n slots.default?.({\n columnIndex: column,\n data,\n isScrolling: useIsScrolling\n ? unref(states).isScrolling\n : undefined,\n style: getItemStyle(row, column),\n rowIndex: row,\n })\n )\n )\n }\n }\n }\n return children\n }\n\n const renderInner = () => {\n const Inner = resolveDynamicComponent(props.innerElement) as VNode\n const children = renderItems()\n return [\n h(\n Inner,\n mergeProps(props.innerProps, {\n style: unref(innerStyle),\n ref: innerRef,\n }),\n !isString(Inner)\n ? {\n default: () => children,\n }\n : children\n ),\n ]\n }\n\n const renderWindow = () => {\n const Container = resolveDynamicComponent(\n props.containerElement\n ) as VNode\n const { horizontalScrollbar, verticalScrollbar } = renderScrollbars()\n const Inner = renderInner()\n\n return h(\n 'div',\n {\n key: 0,\n class: ns.e('wrapper'),\n role: props.role,\n },\n [\n h(\n Container,\n {\n class: props.className,\n style: unref(windowStyle),\n onScroll,\n ref: windowRef,\n },\n !isString(Container) ? { default: () => Inner } : Inner\n ),\n horizontalScrollbar,\n verticalScrollbar,\n ]\n )\n }\n\n return renderWindow\n },\n })\n}\n\nexport default createGrid\n\nexport type GridInstance = InstanceType<ReturnType<typeof createGrid>> &\n UnwrapRef<{\n windowRef: Ref<HTMLElement>\n innerRef: Ref<HTMLElement>\n getItemStyleCache: ReturnType<typeof useCache>\n scrollTo: (scrollOptions: GridScrollOptions) => void\n scrollToItem: (\n rowIndex: number,\n columnIndex: number,\n alignment: Alignment\n ) => void\n states: Ref<GridStates>\n }>\n"],"mappings":"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"}