UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 14 kB
{"version":3,"file":"util.mjs","sources":["../../../../../../packages/components/table/src/util.ts"],"sourcesContent":["import { hasOwn } from '@vue/shared'\nimport { createPopper } from '@popperjs/core'\nimport PopupManager from '@element-plus/utils/popup-manager'\nimport { getValueByPath } from '@element-plus/utils/util'\nimport { off, on } from '@element-plus/utils/dom'\n\nimport type {\n PopperInstance,\n IPopperOptions,\n} from '@element-plus/components/popper'\nimport type { Indexable, Nullable } from '@element-plus/utils/types'\nimport type { TableColumnCtx } from './table-column/defaults'\n\nexport const getCell = function (event: Event): HTMLElement {\n let cell = event.target as HTMLElement\n\n while (cell && cell.tagName.toUpperCase() !== 'HTML') {\n if (cell.tagName.toUpperCase() === 'TD') {\n return cell\n }\n cell = cell.parentNode as HTMLElement\n }\n\n return null\n}\n\nconst isObject = function (obj: unknown): boolean {\n return obj !== null && typeof obj === 'object'\n}\n\nexport const orderBy = function <T>(\n array: T[],\n sortKey: string,\n reverse: string | number,\n sortMethod,\n sortBy: string | (string | ((a: T, b: T, array?: T[]) => number))[]\n) {\n if (\n !sortKey &&\n !sortMethod &&\n (!sortBy || (Array.isArray(sortBy) && !sortBy.length))\n ) {\n return array\n }\n if (typeof reverse === 'string') {\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, index) {\n if (sortBy) {\n if (!Array.isArray(sortBy)) {\n sortBy = [sortBy]\n }\n return sortBy.map(function (by) {\n if (typeof by === 'string') {\n return getValueByPath(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 [isObject(value) ? getValueByPath(value, sortKey) : value]\n }\n const compare = function (a, b) {\n if (sortMethod) {\n return sortMethod(a.value, b.value)\n }\n for (let i = 0, len = a.key.length; 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(function (value, index) {\n return {\n value,\n index,\n key: getKey ? getKey(value, index) : null,\n }\n })\n .sort(function (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>(\n table: {\n columns: TableColumnCtx<T>[]\n },\n columnId: string\n): null | TableColumnCtx<T> {\n let column = null\n table.columns.forEach(function (item) {\n if (item.id === columnId) {\n column = item\n }\n })\n return column\n}\n\nexport const getColumnByKey = function <T>(\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 return column\n}\n\nexport const getColumnByCell = function <T>(\n table: {\n columns: TableColumnCtx<T>[]\n },\n cell: HTMLElement\n): null | TableColumnCtx<T> {\n const matches = (cell.className || '').match(/el-table_[^\\s]+/gm)\n if (matches) {\n return getColumnById(table, matches[0])\n }\n return null\n}\n\nexport const getRowIdentity = <T>(\n row: T,\n rowKey: string | ((row: T) => any)\n): string => {\n if (!row) throw new Error('Row is required when get row identity')\n if (typeof rowKey === 'string') {\n if (rowKey.indexOf('.') < 0) {\n return `${row[rowKey]}`\n }\n const key = rowKey.split('.')\n let current = row\n for (let i = 0; i < key.length; i++) {\n current = current[key[i]]\n }\n return `${current}`\n } else if (typeof rowKey === 'function') {\n return rowKey.call(null, row)\n }\n}\n\nexport const getKeysMap = function <T>(\n array: T[],\n rowKey: string\n): Record<string, { row: T; index: number }> {\n const arrayMap = {}\n ;(array || []).forEach((row, index) => {\n arrayMap[getRowIdentity(row, rowKey)] = { row, index }\n })\n return arrayMap\n}\n\nexport function mergeOptions<T, K>(defaults: T, config: K): T & K {\n const options = {} as T & K\n let key\n for (key in defaults) {\n options[key] = defaults[key]\n }\n for (key in config) {\n if (hasOwn(config as unknown as Indexable<any>, key)) {\n const value = config[key]\n if (typeof value !== 'undefined') {\n options[key] = value\n }\n }\n }\n return options\n}\n\nexport function parseWidth(width: number | string): number {\n if (width !== undefined) {\n width = parseInt(width as string, 10)\n if (isNaN(width)) {\n width = null\n }\n }\n return +width\n}\n\nexport function parseMinWidth(minWidth): number {\n if (typeof minWidth !== 'undefined') {\n minWidth = parseWidth(minWidth)\n if (isNaN(minWidth)) {\n minWidth = 80\n }\n }\n return minWidth\n}\n\nexport function parseHeight(height: number | string) {\n if (typeof height === 'number') {\n return height\n }\n if (typeof height === 'string') {\n if (/^\\d+(?:px)?$/.test(height)) {\n return 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.js\nexport function compose(...funcs) {\n if (funcs.length === 0) {\n return (arg) => arg\n }\n if (funcs.length === 1) {\n return funcs[0]\n }\n return funcs.reduce(\n (a, b) =>\n (...args) =>\n a(b(...args))\n )\n}\n\nexport function toggleRowStatus<T>(\n statusArr: T[],\n row: T,\n newVal: boolean\n): boolean {\n let changed = false\n const index = statusArr.indexOf(row)\n const included = index !== -1\n\n const addRow = () => {\n statusArr.push(row)\n changed = true\n }\n const removeRow = () => {\n statusArr.splice(index, 1)\n changed = true\n }\n\n if (typeof newVal === 'boolean') {\n if (newVal && !included) {\n addRow()\n } else if (!newVal && included) {\n removeRow()\n }\n } else {\n if (included) {\n removeRow()\n } else {\n addRow()\n }\n }\n return changed\n}\n\nexport function walkTreeNode(\n root,\n cb,\n childrenKey = 'children',\n lazyKey = 'hasChildren'\n) {\n const isNil = (array) => !(Array.isArray(array) && array.length)\n\n function _walker(parent, children, level) {\n cb(parent, children, level)\n children.forEach((item) => {\n if (item[lazyKey]) {\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) => {\n if (item[lazyKey]) {\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\nexport let removePopper\n\nexport function createTablePopper(\n trigger: HTMLElement,\n popperContent: string,\n popperOptions: Partial<IPopperOptions>,\n tooltipEffect: string\n) {\n function renderContent(): HTMLDivElement {\n const isLight = tooltipEffect === 'light'\n const content = document.createElement('div')\n content.className = `el-popper ${isLight ? 'is-light' : 'is-dark'}`\n content.innerHTML = popperContent\n content.style.zIndex = String(PopupManager.nextZIndex())\n document.body.appendChild(content)\n return content\n }\n function renderArrow(): HTMLDivElement {\n const arrow = document.createElement('div')\n arrow.className = 'el-popper__arrow'\n arrow.style.bottom = '-4px'\n return arrow\n }\n function showPopper() {\n popperInstance && popperInstance.update()\n }\n removePopper = function removePopper() {\n try {\n popperInstance && popperInstance.destroy()\n content && document.body.removeChild(content)\n off(trigger, 'mouseenter', showPopper)\n off(trigger, 'mouseleave', removePopper)\n } catch {}\n }\n let popperInstance: Nullable<PopperInstance> = null\n const content = renderContent()\n const arrow = renderArrow()\n content.appendChild(arrow)\n\n popperInstance = createPopper(trigger, content, {\n modifiers: [\n {\n name: 'offset',\n options: {\n offset: [0, 8],\n },\n },\n {\n name: 'arrow',\n options: {\n element: arrow,\n padding: 10,\n },\n },\n ],\n ...popperOptions,\n })\n on(trigger, 'mouseenter', showPopper)\n on(trigger, 'mouseleave', removePopper)\n return popperInstance\n}\n"],"names":[],"mappings":"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"}