{"version":3,"file":"events-helper.mjs","names":[],"sources":["../../../../../../../packages/components/table/src/table-body/events-helper.ts"],"sourcesContent":["import { h, inject, ref } from 'vue'\nimport { debounce } from 'lodash-unified'\nimport { addClass, hasClass, removeClass } from '@element-plus/utils'\nimport {\n  createTablePopper,\n  getCell,\n  getColumnByCell,\n  removePopper,\n} from '../util'\nimport { TABLE_INJECTION_KEY } from '../tokens'\n\nimport type { TableColumnCtx } from '../table-column/defaults'\nimport type { TableBodyProps } from './defaults'\nimport type { TableOverflowTooltipOptions } from '../util'\nimport type { DefaultRow } from '../table/defaults'\n\nfunction isGreaterThan(a: number, b: number, epsilon = 0.03) {\n  return a - b > epsilon\n}\n\nfunction useEvents<T extends DefaultRow>(props: Partial<TableBodyProps<T>>) {\n  const parent = inject(TABLE_INJECTION_KEY)\n  const tooltipContent = ref('')\n  const tooltipTrigger = ref(h('div'))\n  const handleEvent = (event: Event, row: T, name: string) => {\n    const table = parent\n    const cell = getCell(event)\n    let column: TableColumnCtx<T> | null = null\n    const namespace = table?.vnode.el?.dataset.prefix\n    if (cell) {\n      column = getColumnByCell(\n        {\n          columns: props.store?.states.columns.value ?? [],\n        },\n        cell,\n        namespace\n      )\n      if (column) {\n        table?.emit(`cell-${name}`, row, column, cell, event)\n      }\n    }\n    table?.emit(`row-${name}`, row, column, event)\n  }\n  const handleDoubleClick = (event: Event, row: T) => {\n    handleEvent(event, row, 'dblclick')\n  }\n  const handleClick = (event: Event, row: T) => {\n    props.store?.commit('setCurrentRow', row)\n    handleEvent(event, row, 'click')\n  }\n  const handleContextMenu = (event: Event, row: T) => {\n    handleEvent(event, row, 'contextmenu')\n  }\n  const handleMouseEnter = debounce((index: number) => {\n    props.store?.commit('setHoverRow', index)\n  }, 30)\n  const handleMouseLeave = debounce(() => {\n    props.store?.commit('setHoverRow', null)\n  }, 30)\n  const getPadding = (el: HTMLElement) => {\n    const style = window.getComputedStyle(el, null)\n    const paddingLeft = Number.parseInt(style.paddingLeft, 10) || 0\n    const paddingRight = Number.parseInt(style.paddingRight, 10) || 0\n    const paddingTop = Number.parseInt(style.paddingTop, 10) || 0\n    const paddingBottom = Number.parseInt(style.paddingBottom, 10) || 0\n    return {\n      left: paddingLeft,\n      right: paddingRight,\n      top: paddingTop,\n      bottom: paddingBottom,\n    }\n  }\n\n  const toggleRowClassByCell = (\n    rowSpan: number,\n    event: MouseEvent,\n    toggle: (el: Element, cls: string) => void\n  ) => {\n    let node: Node | null | undefined = (event?.target as Element | null)\n      ?.parentNode\n    while (rowSpan > 1) {\n      node = node?.nextSibling\n      if (!node || node.nodeName !== 'TR') break\n      toggle(node as Element, 'hover-row hover-fixed-row')\n      rowSpan--\n    }\n  }\n\n  const handleCellMouseEnter = (\n    event: MouseEvent,\n    row: T,\n    tooltipOptions: TableOverflowTooltipOptions\n  ) => {\n    if (!parent) return\n    const table = parent\n    const cell = getCell(event)\n    const namespace = table?.vnode.el?.dataset.prefix\n    let column: TableColumnCtx<T> | null = null\n    if (cell) {\n      column = getColumnByCell(\n        {\n          columns: props.store?.states.columns.value ?? [],\n        },\n        cell,\n        namespace\n      )\n      if (!column) {\n        return\n      }\n      if (cell.rowSpan > 1) {\n        toggleRowClassByCell(cell.rowSpan, event, addClass)\n      }\n      const hoverState = (table.hoverState = {\n        cell,\n        column: column as any,\n        row,\n      })\n      table?.emit(\n        'cell-mouse-enter',\n        hoverState.row,\n        hoverState.column,\n        hoverState.cell,\n        event\n      )\n    }\n\n    if (!tooltipOptions) {\n      if (removePopper?.trigger === cell) {\n        removePopper?.()\n      }\n      return\n    }\n\n    // 判断是否text-overflow, 如果是就显示tooltip\n    const cellChild = (event.target as HTMLElement).querySelector(\n      '.cell'\n    ) as HTMLElement\n    if (\n      !(\n        hasClass(cellChild, `${namespace}-tooltip`) &&\n        cellChild.childNodes.length &&\n        cellChild.textContent?.trim()\n      )\n    ) {\n      return\n    }\n    // use range width instead of scrollWidth to determine whether the text is overflowing\n    // to address a potential FireFox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1074543#c3\n    const range = document.createRange()\n    range.setStart(cellChild, 0)\n    range.setEnd(cellChild, cellChild.childNodes.length)\n    /** detail: https://github.com/element-plus/element-plus/issues/10790\n     *  What went wrong?\n     *  UI > Browser > Zoom, In Blink/WebKit, getBoundingClientRect() sometimes returns inexact values, probably due to lost precision during internal calculations. In the example above:\n     *    - Expected: 188\n     *    - Actual: 188.00000762939453\n     */\n    const { width: rangeWidth, height: rangeHeight } =\n      range.getBoundingClientRect()\n    const { width: cellChildWidth, height: cellChildHeight } =\n      cellChild.getBoundingClientRect()\n\n    const { top, left, right, bottom } = getPadding(cellChild)\n    const horizontalPadding = left + right\n    const verticalPadding = top + bottom\n    if (\n      isGreaterThan(rangeWidth + horizontalPadding, cellChildWidth) ||\n      isGreaterThan(rangeHeight + verticalPadding, cellChildHeight) ||\n      // When using a high-resolution screen, it is possible that a returns cellChild.scrollWidth value of 1921 and\n      // cellChildWidth returns a value of 1920.994140625. #16856 #16673\n      isGreaterThan(cellChild.scrollWidth, cellChildWidth)\n    ) {\n      createTablePopper(\n        tooltipOptions,\n        (cell?.innerText || cell?.textContent) ?? '',\n        row,\n        column,\n        cell,\n        table\n      )\n    } else if (removePopper?.trigger === cell) {\n      removePopper?.()\n    }\n  }\n  const handleCellMouseLeave = (event: MouseEvent) => {\n    const cell = getCell(event)\n    if (!cell) return\n    if (cell.rowSpan > 1) {\n      toggleRowClassByCell(cell.rowSpan, event, removeClass)\n    }\n    const oldHoverState = parent?.hoverState\n    parent?.emit(\n      'cell-mouse-leave',\n      oldHoverState?.row,\n      oldHoverState?.column,\n      oldHoverState?.cell,\n      event\n    )\n  }\n\n  return {\n    handleDoubleClick,\n    handleClick,\n    handleContextMenu,\n    handleMouseEnter,\n    handleMouseLeave,\n    handleCellMouseEnter,\n    handleCellMouseLeave,\n    tooltipContent,\n    tooltipTrigger,\n  }\n}\n\nexport default useEvents\n"],"mappings":";;;;;;;AAgBA,SAAS,cAAc,GAAW,GAAW,UAAU,KAAM;AAC3D,QAAO,IAAI,IAAI;;AAGjB,SAAS,UAAgC,OAAmC;CAC1E,MAAM,SAAS,OAAO,oBAAoB;CAC1C,MAAM,iBAAiB,IAAI,GAAG;CAC9B,MAAM,iBAAiB,IAAI,EAAE,MAAM,CAAC;CACpC,MAAM,eAAe,OAAc,KAAQ,SAAiB;EAC1D,MAAM,QAAQ;EACd,MAAM,OAAO,QAAQ,MAAM;EAC3B,IAAI,SAAmC;EACvC,MAAM,YAAY,OAAO,MAAM,IAAI,QAAQ;AAC3C,MAAI,MAAM;AACR,YAAS,gBACP,EACE,SAAS,MAAM,OAAO,OAAO,QAAQ,SAAS,EAAE,EACjD,EACD,MACA,UACD;AACD,OAAI,OACF,QAAO,KAAK,QAAQ,QAAQ,KAAK,QAAQ,MAAM,MAAM;;AAGzD,SAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,MAAM;;CAEhD,MAAM,qBAAqB,OAAc,QAAW;AAClD,cAAY,OAAO,KAAK,WAAW;;CAErC,MAAM,eAAe,OAAc,QAAW;AAC5C,QAAM,OAAO,OAAO,iBAAiB,IAAI;AACzC,cAAY,OAAO,KAAK,QAAQ;;CAElC,MAAM,qBAAqB,OAAc,QAAW;AAClD,cAAY,OAAO,KAAK,cAAc;;CAExC,MAAM,mBAAmB,UAAU,UAAkB;AACnD,QAAM,OAAO,OAAO,eAAe,MAAM;IACxC,GAAG;CACN,MAAM,mBAAmB,eAAe;AACtC,QAAM,OAAO,OAAO,eAAe,KAAK;IACvC,GAAG;CACN,MAAM,cAAc,OAAoB;EACtC,MAAM,QAAQ,OAAO,iBAAiB,IAAI,KAAK;AAK/C,SAAO;GACL,MALkB,OAAO,SAAS,MAAM,aAAa,GAAG,IAAI;GAM5D,OALmB,OAAO,SAAS,MAAM,cAAc,GAAG,IAAI;GAM9D,KALiB,OAAO,SAAS,MAAM,YAAY,GAAG,IAAI;GAM1D,QALoB,OAAO,SAAS,MAAM,eAAe,GAAG,IAAI;GAMjE;;CAGH,MAAM,wBACJ,SACA,OACA,WACG;EACH,IAAI,QAAiC,OAAO,SACxC;AACJ,SAAO,UAAU,GAAG;AAClB,UAAO,MAAM;AACb,OAAI,CAAC,QAAQ,KAAK,aAAa,KAAM;AACrC,UAAO,MAAiB,4BAA4B;AACpD;;;CAIJ,MAAM,wBACJ,OACA,KACA,mBACG;AACH,MAAI,CAAC,OAAQ;EACb,MAAM,QAAQ;EACd,MAAM,OAAO,QAAQ,MAAM;EAC3B,MAAM,YAAY,OAAO,MAAM,IAAI,QAAQ;EAC3C,IAAI,SAAmC;AACvC,MAAI,MAAM;AACR,YAAS,gBACP,EACE,SAAS,MAAM,OAAO,OAAO,QAAQ,SAAS,EAAE,EACjD,EACD,MACA,UACD;AACD,OAAI,CAAC,OACH;AAEF,OAAI,KAAK,UAAU,EACjB,sBAAqB,KAAK,SAAS,OAAO,SAAS;GAErD,MAAM,aAAc,MAAM,aAAa;IACrC;IACQ;IACR;IACD;AACD,UAAO,KACL,oBACA,WAAW,KACX,WAAW,QACX,WAAW,MACX,MACD;;AAGH,MAAI,CAAC,gBAAgB;AACnB,OAAI,cAAc,YAAY,KAC5B,iBAAgB;AAElB;;EAIF,MAAM,YAAa,MAAM,OAAuB,cAC9C,QACD;AACD,MACE,EACE,SAAS,WAAW,GAAG,UAAU,UAAU,IAC3C,UAAU,WAAW,UACrB,UAAU,aAAa,MAAM,EAG/B;EAIF,MAAM,QAAQ,SAAS,aAAa;AACpC,QAAM,SAAS,WAAW,EAAE;AAC5B,QAAM,OAAO,WAAW,UAAU,WAAW,OAAO;;;;;;;EAOpD,MAAM,EAAE,OAAO,YAAY,QAAQ,gBACjC,MAAM,uBAAuB;EAC/B,MAAM,EAAE,OAAO,gBAAgB,QAAQ,oBACrC,UAAU,uBAAuB;EAEnC,MAAM,EAAE,KAAK,MAAM,OAAO,WAAW,WAAW,UAAU;EAC1D,MAAM,oBAAoB,OAAO;EACjC,MAAM,kBAAkB,MAAM;AAC9B,MACE,cAAc,aAAa,mBAAmB,eAAe,IAC7D,cAAc,cAAc,iBAAiB,gBAAgB,IAG7D,cAAc,UAAU,aAAa,eAAe,CAEpD,mBACE,iBACC,MAAM,aAAa,MAAM,gBAAgB,IAC1C,KACA,QACA,MACA,MACD;WACQ,cAAc,YAAY,KACnC,iBAAgB;;CAGpB,MAAM,wBAAwB,UAAsB;EAClD,MAAM,OAAO,QAAQ,MAAM;AAC3B,MAAI,CAAC,KAAM;AACX,MAAI,KAAK,UAAU,EACjB,sBAAqB,KAAK,SAAS,OAAO,YAAY;EAExD,MAAM,gBAAgB,QAAQ;AAC9B,UAAQ,KACN,oBACA,eAAe,KACf,eAAe,QACf,eAAe,MACf,MACD;;AAGH,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}