{"version":3,"file":"useColumnResize.mjs","sources":["../../../src/table/hooks/useColumnResize.ts"],"sourcesContent":["/**\n * important info: only resize happened, th width calculating allowed\n * 验证场景：多级表头调整叶子结点列宽、吸顶表头调整列宽、列数量发生变化、表格未超出、表格已超出\n * - 固定列，调整列宽，需要更新固定位置；右侧固定列，调整列宽，需特殊处理\n * - 当表格内容没有超出时，即没有出现横向滚动条时，此时认为表格有足够的列宽呈现内容，修改宽度为相邻宽度调整\n * - 当表格内容超出，出现横向滚动条时，会自动调整当前列宽和表格总列宽，不影响相邻列宽\n */\nimport { ref, Ref, reactive, onMounted } from 'vue';\nimport isNumber from 'lodash/isNumber';\nimport { BaseTableCol, TableRowData, TdBaseTableProps } from '../type';\nimport { on, off } from '../../utils/dom';\n\nconst DEFAULT_MIN_WIDTH = 80;\nconst DEFAULT_MAX_WIDTH = 600;\n// 当离右边框的距离不超过 8 时，显示拖拽图标\nconst distance = 8;\n\nexport default function useColumnResize(params: {\n  isWidthOverflow: Ref<boolean>;\n  tableContentRef: Ref<HTMLDivElement>;\n  showColumnShadow: {\n    left: boolean;\n    right: boolean;\n  };\n  getThWidthList: (type?: 'default' | 'calculate') => { [colKeys: string]: number };\n  updateThWidthList: (data: { [colKey: string]: number }) => void;\n  setTableElmWidth: (width: number) => void;\n  updateTableAfterColumnResize: () => void;\n  onColumnResizeChange: TdBaseTableProps['onColumnResizeChange'];\n}) {\n  const {\n    isWidthOverflow,\n    tableContentRef,\n    showColumnShadow,\n    getThWidthList,\n    updateThWidthList,\n    setTableElmWidth,\n    updateTableAfterColumnResize,\n    onColumnResizeChange,\n  } = params;\n  const resizeLineRef = ref<HTMLDivElement>();\n  const effectColMap = ref<{ [colKey: string]: any }>({});\n  const leafColumns = ref([]);\n  let originalSelectStart: (this: GlobalEventHandlers, ev: Event) => any;\n  let originalDragStart: (this: GlobalEventHandlers, ev: Event) => any;\n\n  onMounted(() => {\n    const hasDocument = typeof document !== 'undefined';\n    originalSelectStart = hasDocument ? document.onselectstart : null;\n    originalDragStart = hasDocument ? document.ondragstart : null;\n  });\n\n  const getSiblingResizableCol = (nodes: BaseTableCol<TableRowData>[], index: number, type: 'prev' | 'next') => {\n    let i = index;\n    while (nodes[i] && nodes[i].resizable === false) {\n      if (type === 'next') {\n        i += 1;\n      } else {\n        i -= 1;\n      }\n    }\n    return nodes[i];\n  };\n\n  // 递归查找列宽度变化后，受影响的相关列。前后非禁用调整列宽的列\n  const setEffectColMap = (nodes: BaseTableCol<TableRowData>[], parent: BaseTableCol<TableRowData> | null) => {\n    if (!nodes) return;\n    leafColumns.value = nodes;\n    nodes.forEach((n, index) => {\n      const prevNode = getSiblingResizableCol(nodes, index - 1, 'prev');\n      const nextNode = getSiblingResizableCol(nodes, index + 1, 'next');\n      const parentPrevCol = parent ? effectColMap.value[parent.colKey].prev : nextNode;\n      const parentNextCol = parent ? effectColMap.value[parent.colKey].next : prevNode;\n      const prev = index === 0 ? parentPrevCol : prevNode;\n      const next = index === nodes.length - 1 ? parentNextCol : nextNode;\n      effectColMap.value[n.colKey] = {\n        prev,\n        next,\n        current: {\n          prevSibling: getSiblingResizableCol(nodes, index - 1, 'prev'),\n          nextSibling: getSiblingResizableCol(nodes, index + 1, 'next'),\n        },\n      };\n      setEffectColMap(n.children, n);\n    });\n  };\n\n  const resizeLineParams = {\n    isDragging: false,\n    draggingCol: null as HTMLElement,\n    draggingStart: 0,\n    // 列宽调整类型：影响右侧列宽度、影响左侧列宽度、或者仅影响自身\n    effectCol: 'next' as 'next' | 'prev',\n  };\n\n  const resizeLineStyle = reactive({\n    display: 'none',\n    height: '10px',\n    left: '10px',\n    bottom: '0',\n  });\n\n  // 当前列是否配置右侧固定并且处于固定激活状态\n  const isColRightFixActive = (col: BaseTableCol<TableRowData>) => col.fixed === 'right' && showColumnShadow.right;\n\n  // 频繁事件，仅用于计算是否在表头显示拖拽鼠标形态\n  const onColumnMouseover = (e: MouseEvent, col: BaseTableCol<TableRowData>) => {\n    // calculate mouse cursor before drag start\n    if (!resizeLineRef.value || resizeLineParams.isDragging || !e.target) return;\n    const target = (e.target as HTMLElement).closest('th');\n    // 判断是否为叶子阶段，仅叶子结点允许拖拽\n    const colKey = target.getAttribute('data-colkey');\n    if (!leafColumns.value.find((t) => t.colKey === colKey)) return;\n    const targetBoundRect = target.getBoundingClientRect();\n    const thRightCursor = targetBoundRect.right - e.pageX <= distance;\n    const thLeftCursor = e.pageX - targetBoundRect.left <= distance;\n    const isFixedToRight = isColRightFixActive(col);\n    if (thRightCursor || isFixedToRight) {\n      const colResizable = col.resizable ?? true;\n      if (colResizable) {\n        target.style.cursor = thRightCursor || (isFixedToRight && thLeftCursor) ? 'col-resize' : '';\n        const isCurrent = (thRightCursor && !isFixedToRight) || (isFixedToRight && thLeftCursor);\n        resizeLineParams.draggingCol = isCurrent ? target : (target.nextElementSibling as HTMLElement);\n        resizeLineParams.effectCol = 'next';\n        return;\n      }\n    } else if (thLeftCursor) {\n      const prevEl = target.previousElementSibling;\n      if (prevEl) {\n        const effectPrevCol = effectColMap.value[col.colKey]?.prev;\n        const colResizable = effectPrevCol?.resizable ?? true;\n        if (colResizable) {\n          target.style.cursor = 'col-resize';\n          resizeLineParams.draggingCol = prevEl as HTMLElement;\n          resizeLineParams.effectCol = 'prev';\n          return;\n        }\n      }\n    }\n    // 重置记录值\n    target.style.cursor = '';\n    resizeLineParams.draggingCol = null;\n    resizeLineParams.effectCol = null;\n  };\n\n  const getMinMaxColWidth = (targetCol: BaseTableCol<TableRowData>) => {\n    const propMinWidth = isNumber(targetCol.minWidth) ? targetCol.minWidth : parseInt(targetCol.minWidth || '0', 10);\n    return {\n      minColWidth: Math.max(targetCol.resize?.minWidth || DEFAULT_MIN_WIDTH, propMinWidth),\n      maxColWidth: targetCol.resize?.maxWidth || DEFAULT_MAX_WIDTH,\n    };\n  };\n\n  const getNormalResizeInfo = (\n    col: BaseTableCol,\n    effectPrevCol: BaseTableCol,\n    targetBoundRect: DOMRect,\n    tableBoundRect: DOMRect,\n  ) => {\n    const resizeLinePos = targetBoundRect.right - tableBoundRect.left;\n    const colLeft = targetBoundRect.left - tableBoundRect.left;\n    const targetCol = resizeLineParams.effectCol === 'next' ? col : effectPrevCol;\n    const { minColWidth, maxColWidth } = getMinMaxColWidth(targetCol);\n    return {\n      resizeLinePos,\n      minResizeLineLeft: colLeft + minColWidth,\n      maxResizeLineLeft: colLeft + maxColWidth,\n    };\n  };\n\n  const getFixedToRightResizeInfo = (\n    target: HTMLElement,\n    col: BaseTableCol,\n    effectPrevCol: BaseTableCol,\n    targetBoundRect: DOMRect,\n    tableBoundRect: DOMRect,\n  ) => {\n    const resizeLinePos = targetBoundRect.left - tableBoundRect.left;\n    const targetCol = target.dataset.colkey === col.colKey ? col : effectPrevCol;\n    const colLeft = targetBoundRect.left - tableBoundRect.left;\n    const { minColWidth, maxColWidth } = getMinMaxColWidth(targetCol);\n    return {\n      resizeLinePos,\n      minResizeLineLeft: colLeft + (targetBoundRect.width - maxColWidth),\n      maxResizeLineLeft: colLeft + (targetBoundRect.width - minColWidth),\n    };\n  };\n\n  const getFixedToLeftResizeInfo = (targetBoundRect: DOMRect, tableBoundRect: DOMRect) => {\n    const resizeLinePos = targetBoundRect.left - tableBoundRect.left;\n    const colLeft = targetBoundRect.left - tableBoundRect.left;\n    return {\n      resizeLinePos,\n      minResizeLineLeft: colLeft,\n      maxResizeLineLeft: colLeft,\n    };\n  };\n\n  const getTotalTableWidth = (thWidthList: { [key: string]: number }): number => {\n    let tableWidth = 0;\n    leafColumns.value.forEach((col) => {\n      tableWidth += thWidthList[col.colKey];\n    });\n    return tableWidth;\n  };\n  const getSiblingColCanResizable = (\n    newThWidthList: { [key: string]: number },\n    effectNextCol: BaseTableCol,\n    distance: number,\n    index: number,\n  ) => {\n    let isWidthAbnormal = true;\n    if (effectNextCol) {\n      const { minColWidth, maxColWidth } = getMinMaxColWidth(effectNextCol);\n      const targetNextColWidth = newThWidthList[effectNextCol.colKey] + distance;\n      isWidthAbnormal = targetNextColWidth < minColWidth || targetNextColWidth > maxColWidth;\n    }\n    return !(isWidthAbnormal || isWidthOverflow.value || index === leafColumns.value.length - 1);\n  };\n  const getOtherResizeInfo = (\n    col: BaseTableCol<TableRowData>,\n    effectPrevCol: BaseTableCol,\n    targetBoundRect: DOMRect,\n    tableBoundRect: DOMRect,\n  ) =>\n    effectPrevCol\n      ? getNormalResizeInfo(col, effectPrevCol, targetBoundRect, tableBoundRect)\n      : getFixedToLeftResizeInfo(targetBoundRect, tableBoundRect);\n\n  // 调整表格列宽\n  const onColumnMousedown = (e: MouseEvent, col: BaseTableCol<TableRowData>, index: number) => {\n    if (!resizeLineParams.draggingCol) return;\n    const target = resizeLineParams.draggingCol;\n    const targetBoundRect = target.getBoundingClientRect();\n    const tableBoundRect = tableContentRef.value?.getBoundingClientRect();\n    const effectNextCol = effectColMap.value[col.colKey]?.next;\n    const effectPrevCol = effectColMap.value[col.colKey]?.prev;\n    const { resizeLinePos, minResizeLineLeft, maxResizeLineLeft } = isColRightFixActive(col)\n      ? getFixedToRightResizeInfo(target, col, effectNextCol, targetBoundRect, tableBoundRect)\n      : getOtherResizeInfo(col, effectNextCol, targetBoundRect, tableBoundRect);\n\n    // 开始拖拽，记录下鼠标起始位置\n    resizeLineParams.isDragging = true;\n    resizeLineParams.draggingStart = e.x;\n\n    // 初始化 resizeLine 标记线\n    if (resizeLineRef?.value) {\n      resizeLineStyle.display = 'block';\n      resizeLineStyle.height = `${tableBoundRect.bottom - targetBoundRect.top}px`;\n      resizeLineStyle.left = `${resizeLinePos}px`;\n      const parent = tableContentRef.value.parentElement.getBoundingClientRect();\n      resizeLineStyle.bottom = `${parent.bottom - tableBoundRect.bottom}px`;\n    }\n\n    // 结束拖拽，更新列宽。拖拽时鼠标可能会超出 table 范围，需要给 document 绑定拖拽相关事件；\n    const onDragEnd = () => {\n      if (!resizeLineParams.isDragging) return;\n      const moveDistance = resizeLinePos - parseFloat(resizeLineStyle.left) || 0;\n      /**\n       * 计算列宽\n       *  - 若表格宽度已经超出，存在横向滚动，则直接改变当前列宽，也意味着改变表格总宽度\n       *  - 操作边框右侧，改变当前列和上一列；若上一列禁用宽度调整，则改变上一列的上一列，依次往前寻找\n       *  - 操作边框左侧，改变当前列和下一列；若下一列禁用宽度调整，则改变下一列的下一列，依次往后寻找\n       */\n      const thWidthList = getThWidthList('calculate');\n      const currentCol = effectColMap.value[col.colKey]?.current;\n      const currentSibling = resizeLineParams.effectCol === 'next' ? currentCol.nextSibling : currentCol.prevSibling;\n      // 多行表头，列宽为最后一层的宽度，即叶子结点宽度\n      const newThWidthList = { ...thWidthList };\n      // 当前列不允许修改宽度，就调整相邻列的宽度\n      const tmpCurrentCol = col.resizable !== false ? col : currentSibling;\n      // 是否允许调整后一列的列宽：列宽未超出时，满足后一列设置的最大最小值时且并非是最后一列（最后一列的右侧拉伸会认为是表格整体宽度调整）\n      const rightCol = resizeLineParams.effectCol === 'next' ? currentCol.nextSibling : col;\n      const canResizeSiblingColWidth = getSiblingColCanResizable(newThWidthList, rightCol, moveDistance, index);\n\n      if (resizeLineParams.effectCol === 'next') {\n        // 右侧激活态的固定列，需特殊调整\n        if (isColRightFixActive(col)) {\n          // 如果不相同，则表示改变相临的右侧列宽\n          if (target.dataset.colkey !== col.colKey) {\n            newThWidthList[effectNextCol.colKey] += moveDistance;\n          } else {\n            newThWidthList[tmpCurrentCol.colKey] += moveDistance;\n          }\n        } else {\n          // 非右侧激活态的固定列\n          newThWidthList[tmpCurrentCol.colKey] -= moveDistance;\n          if (canResizeSiblingColWidth) {\n            newThWidthList[effectNextCol.colKey] += moveDistance;\n          }\n        }\n      } else if (resizeLineParams.effectCol === 'prev') {\n        if (canResizeSiblingColWidth) {\n          newThWidthList[tmpCurrentCol.colKey] += moveDistance;\n        }\n        effectPrevCol && (newThWidthList[effectPrevCol.colKey] -= moveDistance);\n      }\n      updateThWidthList(newThWidthList);\n      const tableWidth = getTotalTableWidth(newThWidthList);\n      setTableElmWidth(Math.round(tableWidth));\n      updateTableAfterColumnResize();\n\n      // 恢复设置\n      resizeLineParams.isDragging = false;\n      resizeLineParams.draggingCol = null;\n      resizeLineParams.effectCol = null;\n      target.style.cursor = '';\n      resizeLineStyle.display = 'none';\n      resizeLineStyle.left = '0';\n      off(document, 'mouseup', onDragEnd);\n      off(document, 'mousemove', onDragOver);\n      document.onselectstart = originalSelectStart;\n      document.ondragstart = originalDragStart;\n      onColumnResizeChange?.({ columnsWidth: newThWidthList });\n    };\n\n    // 注意前后两列最小和最大宽度限制\n    const onDragOver = (e: MouseEvent) => {\n      if (resizeLineParams.isDragging) {\n        const left = resizeLinePos + e.x - resizeLineParams.draggingStart;\n        resizeLineStyle.left = `${Math.min(Math.max(left, minResizeLineLeft), maxResizeLineLeft)}px`;\n      }\n    };\n\n    on(document, 'mouseup', onDragEnd);\n    on(document, 'mousemove', onDragOver);\n\n    // 禁用鼠标的选中文字和拖放\n    document.onselectstart = () => false;\n    document.ondragstart = () => false;\n  };\n\n  return {\n    resizeLineRef,\n    resizeLineStyle,\n    onColumnMouseover,\n    onColumnMousedown,\n    setEffectColMap,\n  };\n}\n"],"names":["onMounted","originalSelectStart","originalDragStart","i","nodes","effectColMap","prev","next","current","setEffectColMap","isDragging","draggingCol","draggingStart","effectCol","display","height","left","bottom","target","maxColWidth","resizeLinePos","maxResizeLineLeft","minResizeLineLeft","leafColumns","tableWidth","isWidthAbnormal","resizeLineParams","resizeLineStyle","newThWidthList","setTableElmWidth","updateTableAfterColumnResize","off","onColumnResizeChange","columnsWidth","on","resizeLineRef","onColumnMouseover","onColumnMousedown"],"mappings":"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"}