UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 25.3 kB
{"version":3,"file":"util.mjs","names":["isUndefined"],"sources":["../../../../../../packages/components/table/src/util.ts"],"sourcesContent":["import { Comment, Fragment, createVNode, isVNode, render } from 'vue'\nimport { flatMap, get, isNull, merge } from 'lodash-unified'\nimport {\n ensureArray,\n getProp,\n hasOwn,\n isArray,\n isBoolean,\n isFunction,\n isNumber,\n isObject,\n isString,\n isUndefined,\n throwError,\n} from '@element-plus/utils'\nimport ElTooltip, {\n type ElTooltipProps,\n} from '@element-plus/components/tooltip'\n\nimport type { DefaultRow, Table, TreeProps } from './table/defaults'\nimport type { TableColumnCtx } from './table-column/defaults'\nimport type { CSSProperties, VNode, VNodeArrayChildren } from 'vue'\n\nexport type TableOverflowTooltipOptions = Partial<\n Pick<\n ElTooltipProps,\n | 'appendTo'\n | 'effect'\n | 'enterable'\n | 'hideAfter'\n | 'offset'\n | 'placement'\n | 'popperClass'\n | 'popperOptions'\n | 'showAfter'\n | 'showArrow'\n | 'transition'\n >\n>\n\nexport type TableOverflowTooltipFormatter<T extends DefaultRow> = (data: {\n row: T\n column: TableColumnCtx<T>\n cellValue: any\n}) => VNode | string\n\ntype RemovePopperFn = (() => void) & {\n trigger?: HTMLElement\n vm?: VNode\n}\n\ntype CompareValue<T> = {\n value: T\n index: number\n key: any[] | null\n}\n\nexport const getCell = function (event: Event) {\n return (event.target as HTMLElement)?.closest('td')\n}\n\nexport const orderBy = function <T extends DefaultRow>(\n array: T[],\n sortKey: string | null,\n reverse: string | number | null,\n sortMethod: TableColumnCtx<T>['sortMethod'] | null,\n sortBy: string | string[] | ((a: T, index: number, array?: T[]) => string)\n) {\n if (\n !sortKey &&\n !sortMethod &&\n (!sortBy || (isArray(sortBy) && !sortBy.length))\n ) {\n return array\n }\n if (isString(reverse)) {\n reverse = reverse === 'descending' ? -1 : 1\n } else {\n reverse = reverse && reverse < 0 ? -1 : 1\n }\n const getKey = sortMethod\n ? null\n : function (value: T, index: number) {\n if (sortBy) {\n return flatMap(ensureArray(sortBy), (by) => {\n if (isString(by)) {\n return get(value, by)\n } else {\n return by(value, index, array)\n }\n })\n }\n if (sortKey !== '$key') {\n if (isObject(value) && '$value' in value) value = value.$value\n }\n return [\n isObject(value) ? (sortKey ? get(value, sortKey) : null) : value,\n ]\n }\n const compare = function (a: CompareValue<T>, b: CompareValue<T>) {\n if (sortMethod) {\n return sortMethod(a.value, b.value)\n }\n for (let i = 0, len = a.key?.length ?? 0; i < len; i++) {\n if (a.key?.[i] < b.key?.[i]) {\n return -1\n }\n if (a.key?.[i] > b.key?.[i]) {\n return 1\n }\n }\n return 0\n }\n return array\n .map<CompareValue<T>>((value: T, index) => {\n return {\n value,\n index,\n key: getKey ? getKey(value, index) : null,\n }\n })\n .sort((a, b) => {\n let order = compare(a, b)\n if (!order) {\n // make stable https://en.wikipedia.org/wiki/Sorting_algorithm#Stability\n order = a.index - b.index\n }\n return order * +reverse\n })\n .map((item) => item.value)\n}\n\nexport const getColumnById = function <T extends DefaultRow>(\n table: {\n columns: TableColumnCtx<T>[]\n },\n columnId: string\n): null | TableColumnCtx<T> {\n let column = null\n table.columns.forEach((item) => {\n if (item.id === columnId) {\n column = item\n }\n })\n return column\n}\n\nexport const getColumnByKey = function <T extends DefaultRow>(\n table: {\n columns: TableColumnCtx<T>[]\n },\n columnKey: string\n): TableColumnCtx<T> {\n let column = null\n for (let i = 0; i < table.columns.length; i++) {\n const item = table.columns[i]\n if (item.columnKey === columnKey) {\n column = item\n break\n }\n }\n if (!column)\n throwError('ElTable', `No column matching with column-key: ${columnKey}`)\n return column\n}\n\nexport const getColumnByCell = function <T extends DefaultRow>(\n table: {\n columns: TableColumnCtx<T>[]\n },\n cell: HTMLElement,\n namespace: string\n): null | TableColumnCtx<T> {\n const matches = (cell.className || '').match(\n new RegExp(`${namespace}-table_[^\\\\s]+`, 'gm')\n )\n if (matches) {\n return getColumnById(table, matches[0])\n }\n return null\n}\n\nexport const getRowIdentity = <T extends DefaultRow>(\n row: T,\n rowKey: string | ((row: T) => string) | null\n): string => {\n if (!row) throw new Error('Row is required when get row identity')\n if (isString(rowKey)) {\n if (!rowKey.includes('.')) {\n return `${row[rowKey]}`\n }\n const key = rowKey.split('.')\n let current: any = row\n for (const element of key) {\n current = current[element]\n }\n //TODO: \"current\" is now any, we just satisfies typecheck here\n // but this function can actually return a number\n return `${current}`\n } else if (isFunction(rowKey)) {\n return rowKey.call(null, row)\n }\n return ''\n}\n\nexport const getKeysMap = function <T extends DefaultRow>(\n array: T[],\n rowKey: string | null,\n flatten = false,\n childrenKey = 'children'\n): Record<PropertyKey, { row: T; index: number }> {\n const data = array || []\n const arrayMap: Record<string, { row: T; index: number }> = {}\n\n data.forEach((row, index) => {\n arrayMap[getRowIdentity(row, rowKey)] = { row, index }\n\n if (flatten) {\n const children = row[childrenKey]\n if (isArray(children)) {\n Object.assign(arrayMap, getKeysMap(children, rowKey, true, childrenKey))\n }\n }\n })\n\n return arrayMap\n}\n\nexport function mergeOptions<T extends DefaultRow, K extends DefaultRow>(\n defaults: T,\n config: K\n): T & K {\n const options = {} as T & K\n let key: keyof T & keyof K\n for (key in defaults) {\n options[key] = defaults[key]\n }\n for (key in config) {\n if (hasOwn(config, key)) {\n const value = config[key]\n if (!isUndefined(value)) {\n options[key as keyof K] = value\n }\n }\n }\n return options\n}\n\nexport function parseWidth(width?: number | string): number | string {\n if (width === '') return width\n if (!isUndefined(width)) {\n width = Number.parseInt(width as string, 10)\n if (Number.isNaN(width)) {\n width = ''\n }\n }\n return width!\n}\n\nexport function parseMinWidth(minWidth: number | string): number | string {\n if (minWidth === '') return minWidth\n if (!isUndefined(minWidth)) {\n minWidth = parseWidth(minWidth)\n if (Number.isNaN(minWidth)) {\n minWidth = 80\n }\n }\n return minWidth\n}\n\nexport function parseHeight(height: number | string | null) {\n if (isNumber(height)) {\n return height\n }\n if (isString(height)) {\n if (/^\\d+(?:px)?$/.test(height)) {\n return Number.parseInt(height, 10)\n } else {\n return height\n }\n }\n return null\n}\n\n// https://github.com/reduxjs/redux/blob/master/src/compose.ts\nexport function compose(...funcs: ((...args: any[]) => void)[]) {\n if (funcs.length === 0) {\n return <T>(arg: T) => arg\n }\n if (funcs.length === 1) {\n return funcs[0]\n }\n return funcs.reduce(\n (a, b) =>\n (...args: any[]) =>\n a(b(...args))\n )\n}\n\nexport function toggleRowStatus<T extends DefaultRow>(\n statusArr: T[],\n row: T,\n newVal?: boolean,\n tableTreeProps?: TreeProps,\n selectable?: ((row: T, index: number) => boolean) | null,\n rowIndex?: number,\n rowKey?: string | null\n): boolean {\n let _rowIndex = rowIndex ?? 0\n let changed = false\n\n const getIndex = () => {\n if (!rowKey) {\n return statusArr.indexOf(row)\n }\n\n const id = getRowIdentity(row, rowKey)\n\n return statusArr.findIndex((item) => getRowIdentity(item, rowKey) === id)\n }\n\n const index = getIndex()\n\n const included = index !== -1\n const isRowSelectable = selectable?.call(null, row, _rowIndex)\n\n const toggleStatus = (type: 'add' | 'remove') => {\n if (type === 'add') {\n statusArr.push(row)\n } else {\n statusArr.splice(index, 1)\n }\n changed = true\n }\n const getChildrenCount = <T extends DefaultRow>(row: T) => {\n let count = 0\n const children = tableTreeProps?.children && row[tableTreeProps.children]\n if (children && isArray(children)) {\n count += children.length\n children.forEach((item) => {\n count += getChildrenCount(item)\n })\n }\n return count\n }\n\n if (!selectable || isRowSelectable) {\n if (isBoolean(newVal)) {\n if (newVal && !included) {\n toggleStatus('add')\n } else if (!newVal && included) {\n toggleStatus('remove')\n }\n } else {\n included ? toggleStatus('remove') : toggleStatus('add')\n }\n }\n\n if (\n !tableTreeProps?.checkStrictly &&\n tableTreeProps?.children &&\n isArray(row[tableTreeProps.children])\n ) {\n row[tableTreeProps.children].forEach((item: T) => {\n const childChanged = toggleRowStatus(\n statusArr,\n item,\n newVal ?? !included,\n tableTreeProps,\n selectable,\n _rowIndex + 1,\n rowKey\n )\n _rowIndex += getChildrenCount(item) + 1\n if (childChanged) {\n changed = childChanged\n }\n })\n }\n return changed\n}\n\nexport function walkTreeNode<T extends DefaultRow>(\n root: T[],\n cb: (parent: any, children: T | T[] | null, level: number) => void,\n childrenKey = 'children',\n lazyKey = 'hasChildren',\n lazy = false\n) {\n const isNil = (array: any): array is null => !(isArray(array) && array.length)\n\n function _walker(parent: any, children: T | T[], level: number) {\n cb(parent, children, level)\n children.forEach((item: any) => {\n if (item[lazyKey] && lazy) {\n cb(item, null, level + 1)\n return\n }\n const children = item[childrenKey]\n if (!isNil(children)) {\n _walker(item, children, level + 1)\n }\n })\n }\n\n root.forEach((item: any) => {\n if (item[lazyKey] && lazy) {\n cb(item, null, 0)\n return\n }\n const children = item[childrenKey]\n if (!isNil(children)) {\n _walker(item, children, 0)\n }\n })\n}\n\nconst getTableOverflowTooltipProps = <T extends DefaultRow>(\n props: TableOverflowTooltipOptions,\n innerText: string,\n row: T,\n column: TableColumnCtx<T> | null\n) => {\n // merge popperOptions\n const popperOptions = {\n strategy: 'fixed',\n ...props.popperOptions,\n }\n\n const tooltipFormatterContent = isFunction(column?.tooltipFormatter)\n ? column.tooltipFormatter({\n row,\n column,\n cellValue: getProp(row, column.property).value,\n })\n : undefined\n\n if (isVNode(tooltipFormatterContent)) {\n return {\n slotContent: tooltipFormatterContent,\n content: null,\n ...props,\n popperOptions,\n }\n }\n\n return {\n slotContent: null,\n content: tooltipFormatterContent ?? innerText,\n ...props,\n popperOptions,\n }\n}\n\nexport let removePopper: RemovePopperFn | null = null\n\nexport function createTablePopper<T extends DefaultRow>(\n props: TableOverflowTooltipOptions,\n popperContent: string,\n row: T,\n column: TableColumnCtx<T> | null,\n trigger: HTMLElement | null,\n table: Table<DefaultRow>\n) {\n const tableOverflowTooltipProps = getTableOverflowTooltipProps(\n props,\n popperContent,\n row,\n column\n )\n const mergedProps = {\n ...tableOverflowTooltipProps,\n slotContent: undefined,\n }\n if (removePopper?.trigger === trigger) {\n const comp = removePopper.vm?.component\n merge(comp?.props, mergedProps)\n if (comp && tableOverflowTooltipProps.slotContent) {\n comp.slots.content = () => [tableOverflowTooltipProps.slotContent]\n }\n return\n }\n removePopper?.()\n const parentNode = table?.refs.tableWrapper\n const ns = parentNode?.dataset.prefix\n const vm = createVNode(\n ElTooltip,\n {\n virtualTriggering: true,\n virtualRef: trigger,\n appendTo: parentNode,\n placement: 'top',\n transition: 'none', // Default does not require transition\n offset: 0,\n hideAfter: 0,\n ...mergedProps,\n },\n tableOverflowTooltipProps.slotContent\n ? {\n content: () => tableOverflowTooltipProps.slotContent,\n }\n : undefined\n )\n vm.appContext = { ...table.appContext, ...table }\n const container = document.createElement('div')\n render(vm, container)\n vm.component!.exposed!.onOpen()\n const scrollContainer = parentNode?.querySelector(`.${ns}-scrollbar__wrap`)\n removePopper = () => {\n if (vm.component?.exposed?.onClose) {\n vm.component.exposed.onClose()\n }\n render(null, container)\n const currentRemovePopper = removePopper as RemovePopperFn\n scrollContainer?.removeEventListener('scroll', currentRemovePopper)\n currentRemovePopper.trigger = undefined\n currentRemovePopper.vm = undefined\n removePopper = null\n }\n removePopper.trigger = trigger ?? undefined\n removePopper.vm = vm\n scrollContainer?.addEventListener('scroll', removePopper)\n}\n\nfunction getCurrentColumns<T extends DefaultRow>(\n column: TableColumnCtx<T>\n): TableColumnCtx<T>[] {\n if (column.children) {\n return flatMap(column.children, getCurrentColumns)\n } else {\n return [column]\n }\n}\n\nfunction getColSpan<T extends DefaultRow>(\n colSpan: number,\n column: TableColumnCtx<T>\n) {\n return colSpan + column.colSpan\n}\n\nexport const isFixedColumn = <T extends DefaultRow>(\n index: number,\n fixed: string | boolean | undefined,\n store: any,\n realColumns?: TableColumnCtx<T>[]\n) => {\n let start = 0\n let after = index\n const columns = store.states.columns.value\n if (realColumns) {\n // fixed column supported in grouped header\n const curColumns = getCurrentColumns(realColumns[index])\n const preColumns = columns.slice(0, columns.indexOf(curColumns[0]))\n\n start = preColumns.reduce(getColSpan, 0)\n after = start + curColumns.reduce(getColSpan, 0) - 1\n } else {\n start = index\n }\n let fixedLayout\n switch (fixed) {\n case 'left':\n if (after < store.states.fixedLeafColumnsLength.value) {\n fixedLayout = 'left'\n }\n break\n case 'right':\n if (\n start >=\n columns.length - store.states.rightFixedLeafColumnsLength.value\n ) {\n fixedLayout = 'right'\n }\n break\n default:\n if (after < store.states.fixedLeafColumnsLength.value) {\n fixedLayout = 'left'\n } else if (\n start >=\n columns.length - store.states.rightFixedLeafColumnsLength.value\n ) {\n fixedLayout = 'right'\n }\n }\n return fixedLayout\n ? {\n direction: fixedLayout,\n start,\n after,\n }\n : {}\n}\n\nexport const getFixedColumnsClass = <T extends DefaultRow>(\n namespace: string,\n index: number,\n fixed: string | boolean | undefined,\n store: any,\n realColumns?: TableColumnCtx<T>[],\n offset = 0\n) => {\n const classes: string[] = []\n const { direction, start, after } = isFixedColumn(\n index,\n fixed,\n store,\n realColumns\n )\n if (direction) {\n const isLeft = direction === 'left'\n classes.push(`${namespace}-fixed-column--${direction}`)\n if (\n isLeft &&\n after + offset === store.states.fixedLeafColumnsLength.value - 1\n ) {\n classes.push('is-last-column')\n } else if (\n !isLeft &&\n start - offset ===\n store.states.columns.value.length -\n store.states.rightFixedLeafColumnsLength.value\n ) {\n classes.push('is-first-column')\n }\n }\n return classes\n}\n\nfunction getOffset<T extends DefaultRow>(\n offset: number,\n column: TableColumnCtx<T>\n) {\n return (\n offset +\n (isNull(column.realWidth) || Number.isNaN(column.realWidth)\n ? Number(column.width)\n : column.realWidth)\n )\n}\n\nexport const getFixedColumnOffset = <T extends DefaultRow>(\n index: number,\n fixed: string | boolean | undefined,\n store: any,\n realColumns?: TableColumnCtx<T>[]\n) => {\n const {\n direction,\n start = 0,\n after = 0,\n } = isFixedColumn(index, fixed, store, realColumns)\n if (!direction) {\n return\n }\n const styles: CSSProperties = {}\n const isLeft = direction === 'left'\n const columns = store.states.columns.value\n if (isLeft) {\n styles.left = columns.slice(0, start).reduce(getOffset, 0)\n } else {\n styles.right = columns\n .slice(after + 1)\n .reverse()\n .reduce(getOffset, 0)\n }\n return styles\n}\n\nexport const ensurePosition = <T extends CSSProperties>(\n style: T | undefined,\n key: keyof T\n) => {\n if (!style) return\n if (!Number.isNaN(style[key])) {\n style[key] = `${style[key]}px` as any\n }\n}\n\nexport function ensureValidVNode(\n vnodes: VNodeArrayChildren\n): VNodeArrayChildren | null {\n return vnodes.some((child) => {\n if (!isVNode(child)) return true\n if (child.type === Comment) return false\n if (\n child.type === Fragment &&\n !ensureValidVNode(child.children as VNodeArrayChildren)\n ) {\n return false\n }\n return true\n })\n ? vnodes\n : null\n}\n"],"mappings":"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"}