xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 23.5 kB
Source Map (JSON)
{"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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"}