{"version":3,"file":"event-helper.mjs","names":[],"sources":["../../../../../../../packages/components/table/src/table-header/event-helper.ts"],"sourcesContent":["import { getCurrentInstance, inject, ref } from 'vue'\nimport { isNull } from 'lodash-unified'\nimport {\n  addClass,\n  hasClass,\n  isClient,\n  isElement,\n  removeClass,\n} from '@element-plus/utils'\nimport { TABLE_INJECTION_KEY } from '../tokens'\n\nimport type { EmitFn } from '@element-plus/utils'\nimport type { TableHeaderProps } from '.'\nimport type { TableColumnCtx } from '../table-column/defaults'\nimport type { DefaultRow, TableSortOrder } from '../table/defaults'\n\nfunction useEvent<T extends DefaultRow>(\n  props: TableHeaderProps<T>,\n  emit: EmitFn<string[]>\n) {\n  const instance = getCurrentInstance()\n  const parent = inject(TABLE_INJECTION_KEY)\n  const handleFilterClick = (event: Event) => {\n    event.stopPropagation()\n    return\n  }\n\n  const handleHeaderClick = (\n    event: PointerEvent,\n    column: TableColumnCtx<T>\n  ) => {\n    if (!column.filters && column.sortable) {\n      handleSortClick(event, column, false)\n    } else if (column.filterable && !column.sortable) {\n      handleFilterClick(event)\n    }\n    parent?.emit('header-click', column, event)\n  }\n\n  const handleHeaderContextMenu = (\n    event: PointerEvent,\n    column: TableColumnCtx<T>\n  ) => {\n    parent?.emit('header-contextmenu', column, event)\n  }\n  const draggingColumn = ref<TableColumnCtx<T> | null>(null)\n  const dragging = ref(false)\n  const dragState = ref<{\n    startMouseLeft: number\n    startLeft: number\n    startColumnLeft: number\n    tableLeft: number\n  }>()\n  const handleMouseDown = (event: MouseEvent, column: TableColumnCtx<T>) => {\n    if (!isClient) return\n    if (column.children && column.children.length > 0) return\n    /* istanbul ignore if */\n    if (\n      draggingColumn.value &&\n      props.border &&\n      draggingColumn.value.id === column.id\n    ) {\n      dragging.value = true\n\n      const table = parent\n      emit('set-drag-visible', true)\n      const tableEl = table?.vnode.el\n      const tableLeft = tableEl?.getBoundingClientRect().left\n      const columnEl = instance?.vnode?.el?.querySelector(`th.${column.id}`)\n      const columnRect = columnEl.getBoundingClientRect()\n      const minLeft = columnRect.left - tableLeft + 30\n\n      addClass(columnEl, 'noclick')\n\n      dragState.value = {\n        startMouseLeft: event.clientX,\n        startLeft: columnRect.right - tableLeft,\n        startColumnLeft: columnRect.left - tableLeft,\n        tableLeft,\n      }\n      const resizeProxy = table?.refs.resizeProxy as HTMLElement\n      resizeProxy.style.left = `${(dragState.value as any).startLeft}px`\n\n      document.onselectstart = function () {\n        return false\n      }\n      document.ondragstart = function () {\n        return false\n      }\n\n      const handleMouseMove = (event: MouseEvent) => {\n        const deltaLeft =\n          event.clientX - (dragState.value as any).startMouseLeft\n        const proxyLeft = (dragState.value as any).startLeft + deltaLeft\n\n        resizeProxy.style.left = `${Math.max(minLeft, proxyLeft)}px`\n      }\n\n      const handleMouseUp = () => {\n        if (dragging.value) {\n          const { startColumnLeft, startLeft } = dragState.value as any\n          const finalLeft = Number.parseInt(resizeProxy.style.left, 10)\n          const columnWidth = finalLeft - startColumnLeft\n          column.width = column.realWidth = columnWidth\n          table?.emit(\n            'header-dragend',\n            column.width,\n            startLeft - startColumnLeft,\n            column,\n            event\n          )\n          requestAnimationFrame(() => {\n            props.store.scheduleLayout(false, true)\n          })\n          document.body.style.cursor = ''\n          dragging.value = false\n          draggingColumn.value = null\n          dragState.value = undefined\n          emit('set-drag-visible', false)\n        }\n\n        document.removeEventListener('mousemove', handleMouseMove)\n        document.removeEventListener('mouseup', handleMouseUp)\n        document.onselectstart = null\n        document.ondragstart = null\n\n        setTimeout(() => {\n          removeClass(columnEl, 'noclick')\n        }, 0)\n      }\n\n      document.addEventListener('mousemove', handleMouseMove)\n      document.addEventListener('mouseup', handleMouseUp)\n    }\n  }\n\n  const handleMouseMove = (event: MouseEvent, column: TableColumnCtx<T>) => {\n    if (!props.border || (column.children && column.children.length > 0)) return\n    const el = event.target as HTMLElement\n    const target = isElement(el) ? el.closest('th') : null\n    if (!target) {\n      return\n    }\n\n    const isSortable = hasClass(target, 'is-sortable')\n\n    if (isSortable) {\n      const cursor = dragging.value ? 'col-resize' : ''\n      target.style.cursor = cursor\n\n      const caret = target.querySelector<HTMLElement>('.caret-wrapper')\n      if (caret) {\n        caret.style.cursor = cursor\n      }\n    }\n\n    if (!column.resizable || dragging.value) {\n      draggingColumn.value = null\n      return\n    }\n\n    const rect = target.getBoundingClientRect()\n    const isLastTh = target.parentNode?.lastElementChild === target\n    const allowDrag = props.allowDragLastColumn || !isLastTh\n    const isResizeHandleActive =\n      rect.width > 12 && rect.right - event.clientX < 8 && allowDrag\n    const cursor = isResizeHandleActive ? 'col-resize' : ''\n\n    document.body.style.cursor = cursor\n    draggingColumn.value = isResizeHandleActive ? (column as any) : null\n    if (isSortable) {\n      target.style.cursor = cursor\n    }\n  }\n\n  const handleMouseOut = () => {\n    if (!isClient || dragging.value) return\n    document.body.style.cursor = ''\n  }\n  const toggleOrder = ({ order, sortOrders }: TableColumnCtx<T>) => {\n    if ((order as string) === '') return sortOrders[0]\n    const index = sortOrders.indexOf(order || null)\n    return sortOrders[index > sortOrders.length - 2 ? 0 : index + 1]\n  }\n  const handleSortClick = (\n    event: Event,\n    column: TableColumnCtx<T>,\n    givenOrder?: TableSortOrder | boolean\n  ) => {\n    event.stopPropagation()\n    const order = (\n      column.order === givenOrder ? null : givenOrder || toggleOrder(column)\n    ) as TableSortOrder | null\n    const target = (event.target as HTMLElement)?.closest('th')\n\n    if (target) {\n      if (hasClass(target, 'noclick')) {\n        removeClass(target, 'noclick')\n        return\n      }\n    }\n\n    if (!column.sortable) return\n\n    const clickTarget = event.currentTarget\n\n    if (\n      ['ascending', 'descending'].some(\n        (str) =>\n          hasClass(clickTarget as Element, str) &&\n          !column.sortOrders.includes(str as TableSortOrder)\n      )\n    ) {\n      return\n    }\n\n    const states = props.store.states\n    let sortProp = states.sortProp.value\n    let sortOrder\n    const sortingColumn = states.sortingColumn.value\n\n    if (\n      sortingColumn !== column ||\n      (sortingColumn === column && isNull(sortingColumn.order))\n    ) {\n      if (sortingColumn) {\n        sortingColumn.order = null\n      }\n      states.sortingColumn.value = column\n      sortProp = column.property ?? null\n    }\n    if (!order) {\n      sortOrder = column.order = null\n    } else {\n      sortOrder = column.order = order\n    }\n\n    states.sortProp.value = sortProp\n    states.sortOrder.value = sortOrder\n\n    parent?.store.commit('changeSortCondition')\n  }\n\n  return {\n    handleHeaderClick,\n    handleHeaderContextMenu,\n    handleMouseDown,\n    handleMouseMove,\n    handleMouseOut,\n    handleSortClick,\n    handleFilterClick,\n  }\n}\n\nexport default useEvent\n"],"mappings":"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"}