UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 9.33 kB
{"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 {\n addClass,\n hasClass,\n isGreaterThan,\n removeClass,\n} 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 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":"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"}