{"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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"}