@visactor/vtable-plugins 1.22.2 → 1.22.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/cjs/filter/filter-engine.js +3 -1
  2. package/cjs/filter/filter-engine.js.map +1 -1
  3. package/cjs/filter/filter-state-manager.d.ts +0 -1
  4. package/cjs/filter/filter-state-manager.js +1 -12
  5. package/cjs/filter/filter-state-manager.js.map +1 -1
  6. package/cjs/filter/filter.js +16 -3
  7. package/cjs/filter/filter.js.map +1 -1
  8. package/cjs/master-detail-plugin/config.d.ts +6 -1
  9. package/cjs/master-detail-plugin/config.js +54 -7
  10. package/cjs/master-detail-plugin/config.js.map +1 -1
  11. package/cjs/master-detail-plugin/core.d.ts +2 -1
  12. package/cjs/master-detail-plugin/core.js +31 -12
  13. package/cjs/master-detail-plugin/core.js.map +1 -1
  14. package/cjs/master-detail-plugin/events.js +1 -1
  15. package/cjs/master-detail-plugin/events.js.map +1 -1
  16. package/cjs/master-detail-plugin/subtable.d.ts +4 -0
  17. package/cjs/master-detail-plugin/subtable.js +42 -4
  18. package/cjs/master-detail-plugin/subtable.js.map +1 -1
  19. package/cjs/master-detail-plugin/types.d.ts +1 -1
  20. package/cjs/master-detail-plugin/types.js.map +1 -1
  21. package/cjs/table-carousel-animation.js +3 -3
  22. package/cjs/table-carousel-animation.js.map +1 -1
  23. package/cjs/table-series-number.d.ts +4 -0
  24. package/cjs/table-series-number.js +12 -4
  25. package/cjs/table-series-number.js.map +1 -1
  26. package/dist/vtable-plugins.js +240 -69
  27. package/dist/vtable-plugins.min.js +3 -3
  28. package/es/filter/filter-engine.js +3 -1
  29. package/es/filter/filter-engine.js.map +1 -1
  30. package/es/filter/filter-state-manager.d.ts +0 -1
  31. package/es/filter/filter-state-manager.js +1 -12
  32. package/es/filter/filter-state-manager.js.map +1 -1
  33. package/es/filter/filter.js +15 -3
  34. package/es/filter/filter.js.map +1 -1
  35. package/es/master-detail-plugin/config.d.ts +6 -1
  36. package/es/master-detail-plugin/config.js +54 -7
  37. package/es/master-detail-plugin/config.js.map +1 -1
  38. package/es/master-detail-plugin/core.d.ts +2 -1
  39. package/es/master-detail-plugin/core.js +30 -12
  40. package/es/master-detail-plugin/core.js.map +1 -1
  41. package/es/master-detail-plugin/events.js +1 -1
  42. package/es/master-detail-plugin/events.js.map +1 -1
  43. package/es/master-detail-plugin/subtable.d.ts +4 -0
  44. package/es/master-detail-plugin/subtable.js +41 -4
  45. package/es/master-detail-plugin/subtable.js.map +1 -1
  46. package/es/master-detail-plugin/types.d.ts +1 -1
  47. package/es/master-detail-plugin/types.js.map +1 -1
  48. package/es/table-carousel-animation.js +3 -3
  49. package/es/table-carousel-animation.js.map +1 -1
  50. package/es/table-series-number.d.ts +4 -0
  51. package/es/table-series-number.js +12 -4
  52. package/es/table-series-number.js.map +1 -1
  53. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/master-detail-plugin/subtable.ts"],"names":[],"mappings":"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","file":"subtable.js","sourcesContent":["import * as VTable from '@visactor/vtable';\r\nimport type { DetailTableOptions, SubTableCheckboxState, SubTableEventInfo } from './types';\r\nimport {\r\n getInternalProps,\r\n getRecordByRowIndex,\r\n parseMargin,\r\n setCellCheckboxStateByAttribute,\r\n findCheckboxColumnIndex\r\n} from './utils';\r\n\r\n/**\r\n * 子表管理相关功能\r\n */\r\nexport class SubTableManager {\r\n private timers: Set<NodeJS.Timeout> = new Set();\r\n constructor(private table: VTable.ListTable, private enableCheckboxCascade: boolean = true) {}\r\n private saveSubTableCheckboxState(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n const internalProps = getInternalProps(this.table);\r\n if (!internalProps.subTableCheckboxStates) {\r\n internalProps.subTableCheckboxStates = new Map();\r\n }\r\n const subTableState: SubTableCheckboxState = {\r\n checkedState: Object.fromEntries(\r\n Array.from(subTable.stateManager.checkedState.entries()).map(([recordKey, fieldStates]) => [\r\n recordKey,\r\n { ...fieldStates }\r\n ])\r\n ),\r\n headerCheckedState: { ...subTable.stateManager.headerCheckedState }\r\n };\r\n internalProps.subTableCheckboxStates.set(bodyRowIndex, subTableState);\r\n }\r\n\r\n /**\r\n * 恢复子表的checkbox状态\r\n * 先恢复之前保存的状态,然后根据enableCheckboxCascade决定是否应用父表状态覆盖\r\n */\r\n private restoreSubTableCheckboxState(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n const internalProps = getInternalProps(this.table);\r\n let savedState = internalProps.subTableCheckboxStates?.get(bodyRowIndex);\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n if (!savedState) {\r\n savedState = {\r\n checkedState: {},\r\n headerCheckedState: {}\r\n };\r\n }\r\n\r\n // 恢复保存的状态到子表状态管理器\r\n if (savedState.checkedState) {\r\n Object.keys(savedState.checkedState).forEach(recordKey => {\r\n const fieldStates = savedState.checkedState[recordKey];\r\n subTable.stateManager.checkedState.set(recordKey, fieldStates);\r\n });\r\n }\r\n if (savedState.headerCheckedState) {\r\n Object.keys(savedState.headerCheckedState).forEach(field => {\r\n subTable.stateManager.headerCheckedState[field] = savedState.headerCheckedState[field];\r\n });\r\n }\r\n\r\n // 如果启用了checkbox级联,应用父表状态覆盖子表状态\r\n if (this.enableCheckboxCascade) {\r\n const parentRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const parentRecord = getRecordByRowIndex(this.table, bodyRowIndex);\r\n if (parentRecord && this.table.stateManager) {\r\n const parentDataIndex = this.table.getRecordIndexByCell(0, parentRowIndex);\r\n if (parentDataIndex !== undefined && parentDataIndex !== null) {\r\n const parentIndexKey = parentDataIndex.toString();\r\n const parentCheckedStates = this.table.stateManager.checkedState.get(parentIndexKey);\r\n if (parentCheckedStates) {\r\n Object.keys(parentCheckedStates).forEach(field => {\r\n const parentState = parentCheckedStates[field];\r\n if (parentState === true || parentState === false) {\r\n subTable.stateManager.headerCheckedState[field] = parentState;\r\n const records = subTable.records || [];\r\n records.forEach((record, recordIndex) => {\r\n const indexKey = recordIndex.toString();\r\n let recordStates = subTable.stateManager.checkedState.get(indexKey);\r\n if (!recordStates) {\r\n recordStates = {};\r\n subTable.stateManager.checkedState.set(indexKey, recordStates);\r\n }\r\n recordStates[field] = parentState;\r\n (record as Record<string, unknown>)[field] = parentState;\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 使用安全的定时器管理\r\n this.safeSetTimeout(() => {\r\n this.updateSubTableCheckboxVisualState(subTable);\r\n }, 0);\r\n }\r\n\r\n private safeSetTimeout(callback: () => void, delay: number): NodeJS.Timeout {\r\n const id = setTimeout(() => {\r\n this.timers.delete(id);\r\n try {\r\n callback();\r\n } catch (error) {\r\n console.warn('Timer callback error:', error);\r\n }\r\n }, delay);\r\n this.timers.add(id);\r\n return id;\r\n }\r\n /**\r\n * 清理所有定时器\r\n */\r\n private cleanupAllTimers(): void {\r\n this.timers.forEach(id => clearTimeout(id));\r\n this.timers.clear();\r\n }\r\n /**\r\n * 更新子表checkbox的视觉状态\r\n */\r\n private updateSubTableCheckboxVisualState(subTable: VTable.ListTable, savedState?: SubTableCheckboxState): void {\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n\r\n // 如果提供了保存的状态,使用保存的状态;否则使用当前状态管理器中的状态\r\n const headerStates = savedState?.headerCheckedState || subTable.stateManager.headerCheckedState;\r\n const recordStates = savedState?.checkedState || {};\r\n\r\n // 更新表头checkbox视觉状态\r\n Object.keys(headerStates).forEach(field => {\r\n const headerState = headerStates[field];\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol !== -1) {\r\n const headerRow = 0;\r\n if (subTable.isHeader(checkboxCol, headerRow)) {\r\n subTable.scenegraph.updateHeaderCheckboxCellState(checkboxCol, headerRow, headerState);\r\n }\r\n }\r\n });\r\n\r\n // 更新body区域checkbox视觉状态\r\n if (savedState?.checkedState) {\r\n // 使用保存的状态\r\n Object.keys(recordStates).forEach(recordKey => {\r\n const fieldStates = recordStates[recordKey];\r\n const recordIndex = Number(recordKey);\r\n Object.keys(fieldStates).forEach(field => {\r\n const checkboxState = fieldStates[field];\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol !== -1) {\r\n // 查找对应的行\r\n for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {\r\n const dataIndex = subTable.getRecordIndexByCell(checkboxCol, row);\r\n if (dataIndex === recordIndex) {\r\n setCellCheckboxStateByAttribute(checkboxCol, row, checkboxState, subTable);\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n } else {\r\n // 使用状态管理器中的状态\r\n subTable.stateManager.checkedState.forEach((fieldStates, recordKey) => {\r\n const recordIndex = Number(recordKey);\r\n Object.keys(fieldStates).forEach(field => {\r\n const checkboxState = fieldStates[field];\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol !== -1) {\r\n // 查找对应的行\r\n for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {\r\n const dataIndex = subTable.getRecordIndexByCell(checkboxCol, row);\r\n if (dataIndex === recordIndex) {\r\n setCellCheckboxStateByAttribute(checkboxCol, row, checkboxState, subTable);\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 渲染子表\r\n *\r\n * 为指定的主表行创建并渲染子表实例。这是子表管理器的核心方法,包含以下步骤:\r\n * 1. 获取记录数据和详细配置\r\n * 2. 创建子表实例并设置配置选项\r\n * 3. 配置子表的视图区域(viewBox)和样式\r\n * 4. 设置滚动隔离和选中状态管理\r\n * 5. 恢复子表的复选框状态\r\n * 6. 将子表添加到主表的场景图中\r\n *\r\n * @param bodyRowIndex - 主表body区域的行索引\r\n * @param childrenData - 子表的数据数组\r\n * @param getDetailConfig - 获取详细配置的回调函数\r\n */\r\n renderSubTable(\r\n bodyRowIndex: number,\r\n childrenData: unknown[],\r\n getDetailConfig: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null\r\n ): void {\r\n const internalProps = getInternalProps(this.table);\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n if (!record) {\r\n return;\r\n }\r\n // 如果没有子数据,不渲染子表\r\n if (!childrenData || childrenData.length === 0) {\r\n return;\r\n }\r\n const detailConfig = getDetailConfig(record, bodyRowIndex);\r\n const childViewBox = this.calculateSubTableViewBox(bodyRowIndex, detailConfig);\r\n if (!childViewBox) {\r\n return;\r\n }\r\n const containerWidth = childViewBox.x2 - childViewBox.x1;\r\n const containerHeight = childViewBox.y2 - childViewBox.y1;\r\n // 创建子表配置,首先使用父表的重要属性作为基础\r\n const parentOptions = (this.table as { options: VTable.ListTableConstructorOptions }).options;\r\n const baseSubTableOptions: VTable.ListTableConstructorOptions = {\r\n viewBox: childViewBox,\r\n canvas: this.table.canvas,\r\n records: childrenData,\r\n columns: detailConfig?.columns || [],\r\n widthMode: 'adaptive',\r\n showHeader: true,\r\n canvasWidth: containerWidth,\r\n canvasHeight: containerHeight,\r\n // 继承父表的theme\r\n theme: parentOptions.theme\r\n };\r\n const { style: _style, ...userDetailConfig } = detailConfig || {};\r\n const subTableOptions = {\r\n ...baseSubTableOptions,\r\n ...userDetailConfig\r\n };\r\n const subTable = new VTable.ListTable(this.table.container, subTableOptions);\r\n internalProps.subTableInstances.set(bodyRowIndex, subTable);\r\n\r\n // 恢复子表的checkbox状态(如果之前有保存的状态)\r\n this.restoreSubTableCheckboxState(bodyRowIndex, subTable);\r\n // 确保子表内容在父表重绘后保持在上层\r\n const afterRenderHandler = () => {\r\n if (internalProps.subTableInstances && internalProps.subTableInstances.has(bodyRowIndex)) {\r\n subTable.render();\r\n }\r\n };\r\n this.table.on('after_render', afterRenderHandler);\r\n (subTable as VTable.ListTable & { __afterRenderHandler: () => void }).__afterRenderHandler = afterRenderHandler;\r\n this.setupScrollEventIsolation(subTable);\r\n this.setupUnifiedSelectionManagement(bodyRowIndex, subTable);\r\n this.setupSubTableCanvasClipping(subTable, bodyRowIndex);\r\n this.setupAntiFlickerMechanism(subTable);\r\n // 设置子表事件监听\r\n this.setupSubTableEventForwarding(bodyRowIndex, subTable);\r\n subTable.render();\r\n }\r\n\r\n // 缓存列范围计算结果\r\n private columnRangeCache: { startCol: number; endCol: number } | null = null;\r\n\r\n /**\r\n * 获取列范围\r\n */\r\n private getColumnRange(): { startCol: number; endCol: number } | null {\r\n if (this.columnRangeCache) {\r\n return this.columnRangeCache;\r\n }\r\n\r\n const frozenColCount = this.table.frozenColCount || 0;\r\n const rightFrozenColCount = this.table.rightFrozenColCount || 0;\r\n const totalColCount = this.table.colCount;\r\n let startCol = frozenColCount;\r\n let endCol = totalColCount - rightFrozenColCount - 1;\r\n // 如果没有冻结列,则使用全部列\r\n if (frozenColCount === 0 && rightFrozenColCount === 0) {\r\n startCol = 0;\r\n endCol = totalColCount - 1;\r\n }\r\n // 确保列索引有效\r\n if (startCol >= totalColCount || endCol < startCol) {\r\n return null;\r\n }\r\n\r\n this.columnRangeCache = { startCol, endCol };\r\n return this.columnRangeCache;\r\n }\r\n\r\n /**\r\n * 计算子表的viewBox区域\r\n */\r\n private calculateSubTableViewBox(\r\n bodyRowIndex: number,\r\n detailConfig?: DetailTableOptions | null,\r\n height?: number\r\n ): { x1: number; y1: number; x2: number; y2: number } | null {\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const detailRowRect = this.table.getCellRangeRelativeRect({ col: 0, row: rowIndex });\r\n if (!detailRowRect) {\r\n return null;\r\n }\r\n const internalProps = getInternalProps(this.table);\r\n const originalHeight = internalProps.originalRowHeights?.get(bodyRowIndex) || 0;\r\n const columnRange = this.getColumnRange();\r\n if (!columnRange) {\r\n return null;\r\n }\r\n const { startCol, endCol } = columnRange;\r\n const firstColRect = this.table.getCellRangeRelativeRect({ col: startCol, row: rowIndex });\r\n const lastColRect = this.table.getCellRangeRelativeRect({ col: endCol, row: rowIndex });\r\n if (!firstColRect || !lastColRect) {\r\n return null;\r\n }\r\n // 解析margin配置 [上, 右, 下, 左]\r\n const [marginTop, marginRight, marginBottom, marginLeft] = parseMargin(detailConfig?.style?.margin);\r\n const configHeight = height ? height : detailConfig?.style?.height || 300;\r\n // 如果配置的高度小于垂直margin总和,则不渲染子表\r\n if (configHeight <= marginTop + marginBottom) {\r\n return {\r\n x1: firstColRect.left + marginLeft,\r\n y1: detailRowRect.top + originalHeight,\r\n x2: lastColRect.right - marginRight,\r\n y2: detailRowRect.top + originalHeight\r\n };\r\n }\r\n const viewBox = {\r\n x1: firstColRect.left + marginLeft,\r\n y1: detailRowRect.top + originalHeight + marginTop,\r\n x2: lastColRect.right - marginRight,\r\n y2: detailRowRect.top + originalHeight - marginBottom + configHeight\r\n };\r\n // 确保viewBox有效\r\n if (viewBox.x2 <= viewBox.x1 || viewBox.y2 <= viewBox.y1) {\r\n return null;\r\n }\r\n return viewBox;\r\n }\r\n\r\n /**\r\n * 移除子表\r\n */\r\n removeSubTable(bodyRowIndex: number): void {\r\n const internalProps = getInternalProps(this.table);\r\n const subTable = internalProps.subTableInstances?.get(bodyRowIndex);\r\n if (subTable) {\r\n // 在删除子表前,保存其checkbox状态\r\n this.saveSubTableCheckboxState(bodyRowIndex, subTable);\r\n // 清理所有事件处理器和引用\r\n this.cleanupSubTableEventHandlers(subTable);\r\n // 释放子表资源\r\n if (typeof subTable.release === 'function') {\r\n try {\r\n subTable.release();\r\n } catch (error) {\r\n console.warn('Failed to release sub table:', error);\r\n }\r\n }\r\n internalProps.subTableInstances.delete(bodyRowIndex);\r\n }\r\n }\r\n\r\n /**\r\n * 清理子表的事件处理器和引用\r\n */\r\n private cleanupSubTableEventHandlers(subTable: VTable.ListTable): void {\r\n // 清理事件转发处理器\r\n this.cleanupSubTableEventForwarding(subTable);\r\n\r\n // 清理after_render事件处理器\r\n const afterRenderHandler = (subTable as VTable.ListTable & { __afterRenderHandler?: () => void })\r\n .__afterRenderHandler;\r\n if (afterRenderHandler) {\r\n this.table.off('after_render', afterRenderHandler);\r\n delete (subTable as VTable.ListTable & { __afterRenderHandler?: () => void }).__afterRenderHandler;\r\n }\r\n\r\n // 清理selection事件处理器\r\n const selectionHandler = (subTable as VTable.ListTable & { __selectionHandler?: () => void }).__selectionHandler;\r\n if (selectionHandler) {\r\n subTable.off('click_cell', selectionHandler);\r\n delete (subTable as VTable.ListTable & { __selectionHandler?: () => void }).__selectionHandler;\r\n }\r\n\r\n // 恢复原始的canvas方法\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __originalRenderMethod?: (...args: unknown[]) => unknown;\r\n __originalDrawMethod?: (...args: unknown[]) => unknown;\r\n __scrollHandler?: (args: unknown) => boolean;\r\n __subTableScrollHandler?: () => boolean;\r\n __clipInterval?: number;\r\n __antiFlickerHandler?: () => void;\r\n };\r\n\r\n // 恢复原始的render和draw方法\r\n if (subTable.scenegraph?.stage?.defaultLayer && extendedSubTable.__originalRenderMethod) {\r\n (subTable.scenegraph.stage.defaultLayer as Record<string, unknown>).render =\r\n extendedSubTable.__originalRenderMethod;\r\n delete extendedSubTable.__originalRenderMethod;\r\n }\r\n\r\n if (subTable.scenegraph?.stage?.defaultLayer && extendedSubTable.__originalDrawMethod) {\r\n (subTable.scenegraph.stage.defaultLayer as Record<string, unknown>).draw = extendedSubTable.__originalDrawMethod;\r\n delete extendedSubTable.__originalDrawMethod;\r\n }\r\n const scrollHandler = extendedSubTable.__scrollHandler;\r\n if (scrollHandler) {\r\n this.table.off('can_scroll', scrollHandler);\r\n delete extendedSubTable.__scrollHandler;\r\n }\r\n\r\n const subTableScrollHandler = extendedSubTable.__subTableScrollHandler;\r\n if (subTableScrollHandler) {\r\n subTable.off('can_scroll', subTableScrollHandler);\r\n delete extendedSubTable.__subTableScrollHandler;\r\n }\r\n\r\n // 清理定时器\r\n const clipInterval = extendedSubTable.__clipInterval;\r\n if (clipInterval) {\r\n clearInterval(clipInterval);\r\n delete extendedSubTable.__clipInterval;\r\n }\r\n\r\n // 清理anti-flicker事件处理器\r\n const antiFlickerHandler = extendedSubTable.__antiFlickerHandler;\r\n if (antiFlickerHandler) {\r\n this.table.off('after_render', antiFlickerHandler);\r\n delete extendedSubTable.__antiFlickerHandler;\r\n }\r\n\r\n // 清理checkbox事件处理器\r\n const checkboxHandler = (extendedSubTable as VTable.ListTable & { __checkboxHandler?: (args: unknown) => void })\r\n .__checkboxHandler;\r\n if (checkboxHandler) {\r\n subTable.off('checkbox_state_change', checkboxHandler);\r\n delete (extendedSubTable as VTable.ListTable & { __checkboxHandler?: (args: unknown) => void }).__checkboxHandler;\r\n }\r\n }\r\n\r\n /**\r\n * 设置滚动事件隔离\r\n */\r\n private setupScrollEventIsolation(subTable: VTable.ListTable): void {\r\n // 检测鼠标是否在子表区域内\r\n const isMouseInChildTableArea = (event: MouseEvent) => {\r\n const rect = this.table.canvas.getBoundingClientRect();\r\n const x = event.clientX - rect.left;\r\n const y = event.clientY - rect.top;\r\n const currentViewBox = (subTable as { options: { viewBox?: { x1: number; y1: number; x2: number; y2: number } } })\r\n .options.viewBox;\r\n if (!currentViewBox) {\r\n return false;\r\n }\r\n const isInArea =\r\n x >= currentViewBox.x1 && x <= currentViewBox.x2 && y >= currentViewBox.y1 && y <= currentViewBox.y2;\r\n return isInArea;\r\n };\r\n\r\n const isSubTableAtBottom = () => {\r\n const totalContentHeight = subTable.getAllRowsHeight();\r\n const viewportHeight = subTable.scenegraph.height;\r\n const scrollTop = subTable.scrollTop;\r\n if (totalContentHeight <= viewportHeight) {\r\n return true;\r\n }\r\n const maxScrollTop = totalContentHeight - viewportHeight;\r\n // 使用小的容差值来处理浮点数精度问题\r\n const isAtBottom = Math.abs(scrollTop - maxScrollTop) <= 1;\r\n return isAtBottom;\r\n };\r\n // 判断子表在滚动边界时是否应该继续滚动\r\n const shouldSubTableScroll = (event: MouseEvent) => {\r\n if (!event || !(event instanceof WheelEvent)) {\r\n return true;\r\n }\r\n const deltaY = event.deltaY;\r\n const isScrollingDown = deltaY > 0;\r\n const isScrollingUp = deltaY < 0;\r\n const currentScrollTop = subTable.scrollTop;\r\n // 如果滚动条在最上面且向上滚动,返回false\r\n if (currentScrollTop <= 0 && isScrollingUp) {\r\n return false;\r\n }\r\n // 如果滚动条在最下面且向下滚动,返回false\r\n if (isSubTableAtBottom() && isScrollingDown) {\r\n return false;\r\n }\r\n // 其他情况允许滚动\r\n return true;\r\n };\r\n let subTableCanScroll = false;\r\n\r\n const handleParentScroll = (parentArgs: unknown) => {\r\n const args = parentArgs as { event?: MouseEvent };\r\n\r\n if (args.event && isMouseInChildTableArea(args.event)) {\r\n // 使用边界检查函数判断子表是否应该滚动\r\n if (shouldSubTableScroll(args.event)) {\r\n subTableCanScroll = true;\r\n return false;\r\n }\r\n subTableCanScroll = false;\r\n return true;\r\n }\r\n subTableCanScroll = false;\r\n return true;\r\n };\r\n this.table.on('can_scroll', handleParentScroll);\r\n\r\n const handleSubTableScroll = (parentArgs: unknown) => {\r\n const args = parentArgs as { event?: MouseEvent };\r\n if (args.event === undefined) {\r\n return true;\r\n }\r\n return subTableCanScroll;\r\n };\r\n\r\n subTable.on('can_scroll', handleSubTableScroll);\r\n\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __scrollHandler?: (args: unknown) => boolean;\r\n __subTableScrollHandler?: (args: unknown) => boolean;\r\n };\r\n extendedSubTable.__scrollHandler = handleParentScroll;\r\n extendedSubTable.__subTableScrollHandler = handleSubTableScroll;\r\n }\r\n\r\n /**\r\n * 设置统一选中状态管理\r\n */\r\n private setupUnifiedSelectionManagement(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n // 这里设置子表的选择事件\r\n const selectionHandler = () => {\r\n this.clearAllSelectionsExcept(bodyRowIndex);\r\n };\r\n subTable.on('click_cell', selectionHandler);\r\n (subTable as VTable.ListTable & { __selectionHandler: () => void }).__selectionHandler = selectionHandler;\r\n }\r\n\r\n /**\r\n * 计算当前行所在分组层级的偏移高度\r\n * @param rowIndex 当前行索引\r\n * @returns 需要偏移的高度(所有父级分组行的高度总和)\r\n */\r\n private calculateGroupLevelOffset(rowIndex: number): number {\r\n try {\r\n // 获取当前行的记录索引和indexKey\r\n const recordIndex = this.table.getRecordShowIndexByCell(0, rowIndex);\r\n const indexKey = this.table.dataSource.getIndexKey(recordIndex);\r\n if (!Array.isArray(indexKey) || indexKey.length <= 1) {\r\n return 0;\r\n }\r\n\r\n let totalOffset = 0;\r\n for (let r = this.table.columnHeaderLevelCount; r < rowIndex; r++) {\r\n try {\r\n const record = this.table.getRecordByCell(0, r);\r\n // 检查是否是分组行\r\n if (record && typeof record === 'object' && 'vtableMergeName' in record) {\r\n const groupRecordIndex = this.table.getRecordShowIndexByCell(0, r);\r\n const groupIndexKey = this.table.dataSource.getIndexKey(groupRecordIndex);\r\n const normalizedGroupKey = Array.isArray(groupIndexKey) ? groupIndexKey : [groupIndexKey];\r\n // 检查这个分组行是否是当前行的祖先\r\n if (this.isAncestorGroup(normalizedGroupKey, indexKey)) {\r\n totalOffset += this.table.getRowHeight(r);\r\n }\r\n }\r\n } catch (e) {\r\n // 忽略单行错误,继续处理\r\n }\r\n }\r\n return totalOffset;\r\n } catch (error) {\r\n return 0;\r\n }\r\n }\r\n\r\n /**\r\n * 检查分组是否是目标行的祖先分组\r\n * @param groupKey 分组的indexKey\r\n * @param targetKey 目标行的indexKey\r\n * @returns 是否是祖先关系\r\n */\r\n private isAncestorGroup(groupKey: number[], targetKey: number[]): boolean {\r\n // 祖先分组的层级必须小于目标行的层级\r\n if (groupKey.length >= targetKey.length) {\r\n return false;\r\n }\r\n // 检查前缀是否匹配\r\n for (let i = 0; i < groupKey.length; i++) {\r\n if (groupKey[i] !== targetKey[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * 设置子表canvas裁剪,实现真正的clip截断效果\r\n */\r\n private setupSubTableCanvasClipping(subTable: VTable.ListTable, bodyRowIndex: number): void {\r\n // 获取子表的渲染stage\r\n if (!subTable.scenegraph?.stage) {\r\n return;\r\n }\r\n const stage = subTable.scenegraph.stage;\r\n // 存储原始方法的引用,以便后续恢复\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __originalRenderMethod?: (...args: unknown[]) => unknown;\r\n __originalDrawMethod?: (...args: unknown[]) => unknown;\r\n };\r\n // 计算裁剪区域的函数\r\n const calculateClipRegion = () => {\r\n try {\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const frozenRowsHeight = this.table.getFrozenRowsHeight();\r\n const frozenColsWidth = this.table.getFrozenColsWidth();\r\n const rightFrozenColsWidth = this.table.getRightFrozenColsWidth();\r\n const bottomFrozenRowsHeight = this.table.getBottomFrozenRowsHeight();\r\n const tableWidth = this.table.tableNoFrameWidth;\r\n const tableHeight = this.table.tableNoFrameHeight;\r\n const isFrozenDataRow = rowIndex < this.table.frozenRowCount && rowIndex >= this.table.columnHeaderLevelCount;\r\n const isBottomFrozenDataRow = rowIndex >= this.table.rowCount - this.table.bottomFrozenRowCount;\r\n\r\n // 计算当前子表所在分组的层级偏移\r\n const groupLevelOffset = this.calculateGroupLevelOffset(rowIndex);\r\n\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n const detailConfig =\r\n record && this.getDetailConfigForRecord ? this.getDetailConfigForRecord(record, bodyRowIndex) : null;\r\n const [, marginRight, , marginLeft] = parseMargin(detailConfig?.style?.margin);\r\n const clipX = frozenColsWidth + marginLeft;\r\n let clipY = 0;\r\n const clipWidth = tableWidth - frozenColsWidth - rightFrozenColsWidth - marginLeft / 2 - marginRight / 2;\r\n let clipHeight = tableHeight;\r\n if (isFrozenDataRow) {\r\n clipY = groupLevelOffset;\r\n clipHeight = tableHeight - bottomFrozenRowsHeight - groupLevelOffset;\r\n } else if (isBottomFrozenDataRow) {\r\n clipY = groupLevelOffset;\r\n clipHeight = tableHeight - groupLevelOffset;\r\n } else {\r\n clipY = frozenRowsHeight + groupLevelOffset;\r\n clipHeight = tableHeight - frozenRowsHeight - bottomFrozenRowsHeight - groupLevelOffset;\r\n }\r\n return { clipX, clipY, clipWidth, clipHeight };\r\n } catch (error) {\r\n return null;\r\n }\r\n };\r\n // 获取canvas context\r\n const window = stage.window;\r\n if (!window || typeof window.getContext !== 'function') {\r\n return;\r\n }\r\n const context = window.getContext();\r\n if (!context) {\r\n return;\r\n }\r\n const wrapRenderMethod = (obj: Record<string, unknown>, methodName: string, originalMethodKey: string) => {\r\n const originalMethod = obj[methodName] as (...args: unknown[]) => unknown;\r\n if (typeof originalMethod === 'function') {\r\n // 存储原始方法\r\n (extendedSubTable as unknown as Record<string, unknown>)[originalMethodKey] = originalMethod;\r\n obj[methodName] = function (...args: unknown[]) {\r\n context.save();\r\n try {\r\n const clipRegion = calculateClipRegion();\r\n if (clipRegion && clipRegion.clipWidth > 0 && clipRegion.clipHeight > 0) {\r\n const dpr =\r\n (window as { dpr?: number; devicePixelRatio?: number }).dpr ||\r\n (window as { dpr?: number; devicePixelRatio?: number }).devicePixelRatio ||\r\n 1;\r\n context.beginPath();\r\n context.rect(\r\n clipRegion.clipX * dpr,\r\n clipRegion.clipY * dpr,\r\n clipRegion.clipWidth * dpr,\r\n clipRegion.clipHeight * dpr\r\n );\r\n context.clip();\r\n }\r\n return originalMethod.apply(this, args);\r\n } finally {\r\n context.restore();\r\n }\r\n };\r\n }\r\n };\r\n if (stage.defaultLayer) {\r\n wrapRenderMethod(stage.defaultLayer, 'render', '__originalRenderMethod');\r\n wrapRenderMethod(stage.defaultLayer, 'draw', '__originalDrawMethod');\r\n }\r\n }\r\n\r\n private setupAntiFlickerMechanism(subTable: VTable.ListTable): void {\r\n try {\r\n const originalUpdateNextFrame = (subTable as unknown as { scenegraph?: { updateNextFrame?: () => void } })\r\n .scenegraph?.updateNextFrame;\r\n if (!originalUpdateNextFrame) {\r\n return;\r\n }\r\n const parentTable = this.table;\r\n const syncRender = () => {\r\n if (subTable && originalUpdateNextFrame) {\r\n originalUpdateNextFrame.call((subTable as unknown as { scenegraph: unknown }).scenegraph);\r\n }\r\n };\r\n parentTable.on('after_render', syncRender);\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __antiFlickerHandler?: () => void;\r\n };\r\n extendedSubTable.__antiFlickerHandler = syncRender;\r\n } catch (error) {\r\n console.warn('Failed to setup anti-flicker mechanism:', error);\r\n }\r\n }\r\n\r\n updateSubTablePositionsForRowResize(): void {\r\n const internalProps = getInternalProps(this.table);\r\n if (!internalProps.subTableInstances) {\r\n return;\r\n }\r\n internalProps.subTableInstances.forEach((subTable, bodyRowIndex) => {\r\n try {\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const scenegraph = this.table.scenegraph;\r\n let cellGroup: { attribute?: { height?: number } } | null = null;\r\n if (scenegraph && typeof scenegraph.highPerformanceGetCell === 'function') {\r\n cellGroup = scenegraph.highPerformanceGetCell(0, rowIndex);\r\n } else if (scenegraph && typeof scenegraph.getCell === 'function') {\r\n cellGroup = scenegraph.getCell(0, rowIndex);\r\n }\r\n const cellHeight: number =\r\n cellGroup && cellGroup.attribute && typeof cellGroup.attribute.height === 'number'\r\n ? cellGroup.attribute.height\r\n : -1;\r\n if (internalProps.originalRowHeights && typeof cellHeight === 'number' && cellHeight !== -1) {\r\n internalProps.originalRowHeights.set(bodyRowIndex, cellHeight);\r\n }\r\n } catch (e) {\r\n // 保持原有逻辑继续执行\r\n }\r\n });\r\n this.recalculateAllSubTablePositions();\r\n }\r\n\r\n /**\r\n * 重新计算子表位置\r\n * @param start 开始的bodyRowIndex,默认为最小值\r\n * @param end 结束的bodyRowIndex,默认为最大值\r\n */\r\n recalculateAllSubTablePositions(\r\n start?: number,\r\n end?: number,\r\n getDetailConfig?: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null\r\n ): void {\r\n // 清理列范围缓存,确保使用最新的列宽度信息\r\n this.columnRangeCache = null;\r\n const internalProps = getInternalProps(this.table);\r\n internalProps.subTableInstances?.forEach((subTable, bodyRowIndex) => {\r\n // 如果指定了范围,只处理范围内的子表\r\n if (start !== undefined && bodyRowIndex < start) {\r\n return;\r\n }\r\n if (end !== undefined && bodyRowIndex > end) {\r\n return;\r\n }\r\n // 获取记录和配置\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n const detailConfig = getDetailConfig\r\n ? getDetailConfig(record, bodyRowIndex)\r\n : this.getDetailConfigForRecord\r\n ? this.getDetailConfigForRecord(record, bodyRowIndex)\r\n : null;\r\n\r\n // 重新计算子表的 viewBox\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const originalHeight = internalProps.originalRowHeights?.get(bodyRowIndex) || 0;\r\n const currentRowHeight = this.table.getRowHeight(rowIndex);\r\n const detailHeight = currentRowHeight - originalHeight;\r\n const newViewBox = this.calculateSubTableViewBox(bodyRowIndex, detailConfig, detailHeight);\r\n if (newViewBox) {\r\n const newContainerWidth = newViewBox.x2 - newViewBox.x1;\r\n const newContainerHeight = newViewBox.y2 - newViewBox.y1;\r\n (subTable as { options: { viewBox?: { x1: number; y1: number; x2: number; y2: number } } }).options.viewBox =\r\n newViewBox;\r\n const subTableOptions = subTable.options as VTable.ListTableConstructorOptions;\r\n if (subTableOptions.canvasWidth !== newContainerWidth || subTableOptions.canvasHeight !== newContainerHeight) {\r\n subTableOptions.canvasWidth = newContainerWidth;\r\n subTableOptions.canvasHeight = newContainerHeight;\r\n subTable.resize();\r\n }\r\n if (subTable.scenegraph?.stage) {\r\n (subTable.scenegraph.stage as { setViewBox: (viewBox: unknown, flag: boolean) => void }).setViewBox(\r\n newViewBox,\r\n false\r\n );\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 清理所有子表\r\n */\r\n cleanup(): void {\r\n if (!this.table) {\r\n return;\r\n }\r\n // 首先清理所有定时器\r\n this.cleanupAllTimers();\r\n const internalProps = getInternalProps(this.table);\r\n if (internalProps && internalProps.subTableInstances) {\r\n internalProps.subTableInstances.forEach((subTable, bodyRowIndex) => {\r\n this.removeSubTable(bodyRowIndex);\r\n });\r\n internalProps.subTableInstances.clear();\r\n }\r\n // 清理缓存\r\n this.columnRangeCache = null;\r\n // 清理回调函数引用,避免循环引用\r\n this.getDetailConfigForRecord = undefined;\r\n // 清理表格引用\r\n (this as unknown as { table: unknown }).table = null;\r\n }\r\n\r\n /**\r\n * 获取所有子表实例\r\n * @returns Map<bodyRowIndex, VTable.ListTable>\r\n */\r\n getAllSubTableInstances(): Map<number, VTable.ListTable> | undefined {\r\n const internalProps = getInternalProps(this.table);\r\n return internalProps.subTableInstances;\r\n }\r\n\r\n /**\r\n * 根据bodyRowIndex获取指定的子表实例\r\n * @param bodyRowIndex body行索引\r\n * @returns 子表实例,如果不存在则返回null\r\n */\r\n getSubTableInstance(bodyRowIndex: number): VTable.ListTable | null {\r\n const internalProps = getInternalProps(this.table);\r\n return internalProps.subTableInstances?.get(bodyRowIndex) || null;\r\n }\r\n\r\n private getDetailConfigForRecord?: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null;\r\n\r\n /**\r\n * 设置回调函数\r\n */\r\n setCallbacks(callbacks: {\r\n getDetailConfigForRecord?: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null;\r\n }): void {\r\n this.getDetailConfigForRecord = callbacks.getDetailConfigForRecord;\r\n }\r\n\r\n /**\r\n * 设置子表事件转发\r\n */\r\n private setupSubTableEventForwarding(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n const masterRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n Object.values(VTable.TABLE_EVENT_TYPE).forEach(eventType => {\r\n if (eventType) {\r\n const handler = (...args: unknown[]) => {\r\n this.forwardSubTableEvent(eventType, bodyRowIndex, masterRowIndex, subTable, args);\r\n };\r\n\r\n subTable.on(eventType, handler);\r\n\r\n // 保存处理器引用以便后续清理\r\n const subTableWithHandlers = subTable as unknown as { __eventHandlers?: Map<string, unknown[]> };\r\n if (!subTableWithHandlers.__eventHandlers) {\r\n subTableWithHandlers.__eventHandlers = new Map();\r\n }\r\n const handlers = subTableWithHandlers.__eventHandlers;\r\n if (!handlers.has(eventType)) {\r\n handlers.set(eventType, []);\r\n }\r\n handlers.get(eventType)?.push(handler);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 转发子表事件到主表\r\n */\r\n private forwardSubTableEvent(\r\n eventType: string,\r\n bodyRowIndex: number,\r\n masterRowIndex: number,\r\n subTable: VTable.ListTable,\r\n originalArgs: unknown[]\r\n ): void {\r\n // 构建子表事件信息,直接使用VTable原生事件类型\r\n const subTableEventInfo: SubTableEventInfo = {\r\n eventType: eventType as keyof typeof VTable.TABLE_EVENT_TYPE,\r\n masterBodyRowIndex: bodyRowIndex,\r\n masterRowIndex: masterRowIndex,\r\n subTable: subTable,\r\n originalEventArgs: originalArgs\r\n };\r\n // 直接触发到主表的插件事件\r\n this.table.fireListeners(VTable.TABLE_EVENT_TYPE.PLUGIN_EVENT, {\r\n plugin: { name: 'Master Detail Plugin' },\r\n event: originalArgs[0], // 原始事件对象\r\n pluginEventInfo: subTableEventInfo\r\n });\r\n }\r\n\r\n /**\r\n * 直接清除主表选中\r\n */\r\n private clearMainTableSelectionInternal(): void {\r\n if (typeof (this.table as { clearSelected?: () => void }).clearSelected === 'function') {\r\n (this.table as { clearSelected: () => void }).clearSelected();\r\n }\r\n }\r\n\r\n /**\r\n * 清除除指定子表外的所有选中状态\r\n */\r\n private clearAllSelectionsExcept(exceptRecordIndex: number): void {\r\n // 清除父表选中状态\r\n this.clearMainTableSelectionInternal();\r\n // 清除其他子表的选中状态\r\n const internalProps = getInternalProps(this.table);\r\n internalProps.subTableInstances?.forEach((subTable, rowIndex) => {\r\n if (\r\n rowIndex !== exceptRecordIndex &&\r\n subTable &&\r\n typeof (subTable as { clearSelected?: () => void }).clearSelected === 'function'\r\n ) {\r\n (subTable as { clearSelected: () => void }).clearSelected();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 清理子表事件转发\r\n */\r\n private cleanupSubTableEventForwarding(subTable: VTable.ListTable): void {\r\n const subTableWithHandlers = subTable as unknown as { __eventHandlers?: Map<string, unknown[]> };\r\n if (subTableWithHandlers.__eventHandlers) {\r\n // 移除所有事件监听器\r\n for (const [eventType, handlers] of subTableWithHandlers.__eventHandlers) {\r\n for (const handler of handlers) {\r\n subTable.off(eventType, handler as (...args: unknown[]) => void);\r\n }\r\n }\r\n // 清理引用\r\n delete subTableWithHandlers.__eventHandlers;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/master-detail-plugin/subtable.ts"],"names":[],"mappings":"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","file":"subtable.js","sourcesContent":["import * as VTable from '@visactor/vtable';\r\nimport type { DetailTableOptions, SubTableCheckboxState, SubTableEventInfo } from './types';\r\nimport {\r\n getInternalProps,\r\n getRecordByRowIndex,\r\n parseMargin,\r\n setCellCheckboxStateByAttribute,\r\n findCheckboxColumnIndex\r\n} from './utils';\r\n\r\n/**\r\n * 子表管理相关功能\r\n */\r\nexport class SubTableManager {\r\n private timers: Set<NodeJS.Timeout> = new Set();\r\n constructor(private table: VTable.ListTable, private enableCheckboxCascade: boolean = true) {}\r\n private saveSubTableCheckboxState(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n const internalProps = getInternalProps(this.table);\r\n if (!internalProps.subTableCheckboxStates) {\r\n internalProps.subTableCheckboxStates = new Map();\r\n }\r\n const subTableState: SubTableCheckboxState = {\r\n checkedState: Object.fromEntries(\r\n Array.from(subTable.stateManager.checkedState.entries()).map(([recordKey, fieldStates]) => [\r\n recordKey,\r\n { ...fieldStates }\r\n ])\r\n ),\r\n headerCheckedState: { ...subTable.stateManager.headerCheckedState }\r\n };\r\n internalProps.subTableCheckboxStates.set(bodyRowIndex, subTableState);\r\n }\r\n\r\n /**\r\n * 恢复子表的checkbox状态\r\n * 先恢复之前保存的状态,然后根据enableCheckboxCascade决定是否应用父表状态覆盖\r\n */\r\n private restoreSubTableCheckboxState(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n const internalProps = getInternalProps(this.table);\r\n let savedState = internalProps.subTableCheckboxStates?.get(bodyRowIndex);\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n if (!savedState) {\r\n savedState = {\r\n checkedState: {},\r\n headerCheckedState: {}\r\n };\r\n }\r\n\r\n // 恢复保存的状态到子表状态管理器\r\n if (savedState.checkedState) {\r\n Object.keys(savedState.checkedState).forEach(recordKey => {\r\n const fieldStates = savedState.checkedState[recordKey];\r\n subTable.stateManager.checkedState.set(recordKey, fieldStates);\r\n });\r\n }\r\n if (savedState.headerCheckedState) {\r\n Object.keys(savedState.headerCheckedState).forEach(field => {\r\n subTable.stateManager.headerCheckedState[field] = savedState.headerCheckedState[field];\r\n });\r\n }\r\n\r\n // 如果启用了checkbox级联,应用父表状态覆盖子表状态\r\n if (this.enableCheckboxCascade) {\r\n const parentRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const parentRecord = getRecordByRowIndex(this.table, bodyRowIndex);\r\n if (parentRecord && this.table.stateManager) {\r\n const parentDataIndex = this.table.getRecordIndexByCell(0, parentRowIndex);\r\n if (parentDataIndex !== undefined && parentDataIndex !== null) {\r\n const parentIndexKey = parentDataIndex.toString();\r\n const parentCheckedStates = this.table.stateManager.checkedState.get(parentIndexKey);\r\n if (parentCheckedStates) {\r\n Object.keys(parentCheckedStates).forEach(field => {\r\n const parentState = parentCheckedStates[field];\r\n if (parentState === true || parentState === false) {\r\n subTable.stateManager.headerCheckedState[field] = parentState;\r\n const records = subTable.records || [];\r\n records.forEach((record, recordIndex) => {\r\n const indexKey = recordIndex.toString();\r\n let recordStates = subTable.stateManager.checkedState.get(indexKey);\r\n if (!recordStates) {\r\n recordStates = {};\r\n subTable.stateManager.checkedState.set(indexKey, recordStates);\r\n }\r\n recordStates[field] = parentState;\r\n (record as Record<string, unknown>)[field] = parentState;\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 使用安全的定时器管理\r\n this.safeSetTimeout(() => {\r\n this.updateSubTableCheckboxVisualState(subTable);\r\n }, 0);\r\n }\r\n\r\n private safeSetTimeout(callback: () => void, delay: number): NodeJS.Timeout {\r\n const id = setTimeout(() => {\r\n this.timers.delete(id);\r\n try {\r\n callback();\r\n } catch (error) {\r\n console.warn('Timer callback error:', error);\r\n }\r\n }, delay);\r\n this.timers.add(id);\r\n return id;\r\n }\r\n /**\r\n * 清理所有定时器\r\n */\r\n private cleanupAllTimers(): void {\r\n this.timers.forEach(id => clearTimeout(id));\r\n this.timers.clear();\r\n }\r\n /**\r\n * 更新子表checkbox的视觉状态\r\n */\r\n private updateSubTableCheckboxVisualState(subTable: VTable.ListTable, savedState?: SubTableCheckboxState): void {\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n\r\n // 如果提供了保存的状态,使用保存的状态;否则使用当前状态管理器中的状态\r\n const headerStates = savedState?.headerCheckedState || subTable.stateManager.headerCheckedState;\r\n const recordStates = savedState?.checkedState || {};\r\n\r\n // 更新表头checkbox视觉状态\r\n Object.keys(headerStates).forEach(field => {\r\n const headerState = headerStates[field];\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol !== -1) {\r\n const headerRow = 0;\r\n if (subTable.isHeader(checkboxCol, headerRow)) {\r\n subTable.scenegraph.updateHeaderCheckboxCellState(checkboxCol, headerRow, headerState);\r\n }\r\n }\r\n });\r\n\r\n // 更新body区域checkbox视觉状态\r\n if (savedState?.checkedState) {\r\n // 使用保存的状态\r\n Object.keys(recordStates).forEach(recordKey => {\r\n const fieldStates = recordStates[recordKey];\r\n const recordIndex = Number(recordKey);\r\n Object.keys(fieldStates).forEach(field => {\r\n const checkboxState = fieldStates[field];\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol !== -1) {\r\n // 查找对应的行\r\n for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {\r\n const dataIndex = subTable.getRecordIndexByCell(checkboxCol, row);\r\n if (dataIndex === recordIndex) {\r\n setCellCheckboxStateByAttribute(checkboxCol, row, checkboxState, subTable);\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n } else {\r\n // 使用状态管理器中的状态\r\n subTable.stateManager.checkedState.forEach((fieldStates, recordKey) => {\r\n const recordIndex = Number(recordKey);\r\n Object.keys(fieldStates).forEach(field => {\r\n const checkboxState = fieldStates[field];\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol !== -1) {\r\n // 查找对应的行\r\n for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {\r\n const dataIndex = subTable.getRecordIndexByCell(checkboxCol, row);\r\n if (dataIndex === recordIndex) {\r\n setCellCheckboxStateByAttribute(checkboxCol, row, checkboxState, subTable);\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 渲染子表\r\n *\r\n * 为指定的主表行创建并渲染子表实例。这是子表管理器的核心方法,包含以下步骤:\r\n * 1. 获取记录数据和详细配置\r\n * 2. 创建子表实例并设置配置选项\r\n * 3. 配置子表的视图区域(viewBox)和样式\r\n * 4. 设置滚动隔离和选中状态管理\r\n * 5. 恢复子表的复选框状态\r\n * 6. 将子表添加到主表的场景图中\r\n *\r\n * @param bodyRowIndex - 主表body区域的行索引\r\n * @param childrenData - 子表的数据数组\r\n * @param getDetailConfig - 获取详细配置的回调函数\r\n */\r\n renderSubTable(\r\n bodyRowIndex: number,\r\n childrenData: unknown[],\r\n getDetailConfig: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null\r\n ): void {\r\n const internalProps = getInternalProps(this.table);\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n if (!record) {\r\n return;\r\n }\r\n // 如果没有子数据,不渲染子表\r\n if (!childrenData || childrenData.length === 0) {\r\n return;\r\n }\r\n const detailConfig = getDetailConfig(record, bodyRowIndex);\r\n const childViewBox = this.calculateSubTableViewBox(bodyRowIndex, detailConfig);\r\n if (!childViewBox) {\r\n return;\r\n }\r\n const containerWidth = childViewBox.x2 - childViewBox.x1;\r\n const containerHeight = childViewBox.y2 - childViewBox.y1;\r\n // 创建子表配置,首先使用父表的重要属性作为基础\r\n const parentOptions = (this.table as { options: VTable.ListTableConstructorOptions }).options;\r\n const baseSubTableOptions: VTable.ListTableConstructorOptions = {\r\n viewBox: childViewBox,\r\n canvas: this.table.canvas,\r\n records: childrenData,\r\n columns: detailConfig?.columns || [],\r\n widthMode: 'adaptive',\r\n showHeader: true,\r\n canvasWidth: containerWidth,\r\n canvasHeight: containerHeight,\r\n // 继承父表的theme\r\n theme: parentOptions.theme\r\n };\r\n const { style: _style, ...userDetailConfig } = detailConfig || {};\r\n const subTableOptions = {\r\n ...baseSubTableOptions,\r\n ...userDetailConfig\r\n };\r\n const subTable = new VTable.ListTable(this.table.container, subTableOptions);\r\n internalProps.subTableInstances.set(bodyRowIndex, subTable);\r\n\r\n // 恢复子表的checkbox状态(如果之前有保存的状态)\r\n this.restoreSubTableCheckboxState(bodyRowIndex, subTable);\r\n // 确保子表内容在父表重绘后保持在上层\r\n const afterRenderHandler = () => {\r\n if (internalProps.subTableInstances && internalProps.subTableInstances.has(bodyRowIndex)) {\r\n subTable.render();\r\n }\r\n };\r\n this.table.on('after_render', afterRenderHandler);\r\n (subTable as VTable.ListTable & { __afterRenderHandler: () => void }).__afterRenderHandler = afterRenderHandler;\r\n this.setupScrollEventIsolation(subTable);\r\n this.setupUnifiedSelectionManagement(bodyRowIndex, subTable);\r\n this.setupSubTableCanvasClipping(subTable, bodyRowIndex);\r\n this.setupAntiFlickerMechanism(subTable);\r\n // 设置子表事件监听\r\n this.setupSubTableEventForwarding(bodyRowIndex, subTable);\r\n subTable.render();\r\n // 处理auto高度的情况\r\n if (detailConfig?.style?.height === 'auto') {\r\n this.handleAutoHeightAfterRender(bodyRowIndex, subTable, detailConfig);\r\n }\r\n }\r\n\r\n /**\r\n * 处理auto高度的后续计算\r\n * 在子表渲染完成后,计算实际内容高度并更新viewBox\r\n */\r\n private handleAutoHeightAfterRender(\r\n bodyRowIndex: number,\r\n subTable: VTable.ListTable,\r\n detailConfig: DetailTableOptions\r\n ): void {\r\n try {\r\n const actualContentHeight = this.calculateSubTableContentHeight(subTable);\r\n const [marginTop, , marginBottom] = parseMargin(detailConfig?.style?.margin);\r\n const totalRequiredHeight = actualContentHeight + marginTop + marginBottom;\r\n // 通知core插件更新主表行高\r\n if (this.onAutoHeightCalculated) {\r\n this.onAutoHeightCalculated(bodyRowIndex, totalRequiredHeight);\r\n }\r\n } catch (error) {\r\n console.warn('Error in auto height calculation:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 计算子表内容实际需要的高度\r\n */\r\n private calculateSubTableContentHeight(subTable: VTable.ListTable): number {\r\n try {\r\n const contentHeight = subTable.getAllRowsHeight();\r\n // 获取边框和阴影的额外高度\r\n let frameExtraHeight = 0;\r\n const theme = subTable.theme;\r\n if (theme?.frameStyle) {\r\n const frameStyle = theme.frameStyle;\r\n let borderTopWidth = 0;\r\n let borderBottomWidth = 0;\r\n if (frameStyle.borderLineWidth) {\r\n if (typeof frameStyle.borderLineWidth === 'number') {\r\n borderTopWidth = borderBottomWidth = frameStyle.borderLineWidth;\r\n } else if (Array.isArray(frameStyle.borderLineWidth)) {\r\n const borders = frameStyle.borderLineWidth;\r\n borderTopWidth = borders[0] || 0;\r\n borderBottomWidth = borders[2] || 0;\r\n }\r\n }\r\n let shadowTopHeight = 0;\r\n let shadowBottomHeight = 0;\r\n if (frameStyle.shadowBlur) {\r\n if (typeof frameStyle.shadowBlur === 'number') {\r\n shadowTopHeight = shadowBottomHeight = frameStyle.shadowBlur;\r\n } else if (Array.isArray(frameStyle.shadowBlur)) {\r\n const shadows = frameStyle.shadowBlur;\r\n shadowTopHeight = shadows[0] || 0;\r\n shadowBottomHeight = shadows[2] || 0;\r\n }\r\n }\r\n if (!frameStyle.innerBorder) {\r\n frameExtraHeight = borderTopWidth + borderBottomWidth + shadowTopHeight + shadowBottomHeight;\r\n }\r\n }\r\n const totalHeight = contentHeight + frameExtraHeight;\r\n return totalHeight;\r\n } catch (error) {\r\n console.warn('Error getting sub table total height:', error);\r\n return 300; // 默认高度\r\n }\r\n }\r\n\r\n // 回调函数用于通知core插件更新主表行高\r\n private onAutoHeightCalculated?: (bodyRowIndex: number, newTotalHeight: number) => void;\r\n\r\n /**\r\n * 设置auto高度计算完成的回调\r\n */\r\n setAutoHeightCallback(callback: (bodyRowIndex: number, newTotalHeight: number) => void): void {\r\n this.onAutoHeightCalculated = callback;\r\n }\r\n\r\n // 缓存列范围计算结果\r\n private columnRangeCache: { startCol: number; endCol: number } | null = null;\r\n\r\n /**\r\n * 获取列范围\r\n */\r\n private getColumnRange(): { startCol: number; endCol: number } | null {\r\n if (this.columnRangeCache) {\r\n return this.columnRangeCache;\r\n }\r\n\r\n const frozenColCount = this.table.frozenColCount || 0;\r\n const rightFrozenColCount = this.table.rightFrozenColCount || 0;\r\n const totalColCount = this.table.colCount;\r\n let startCol = frozenColCount;\r\n let endCol = totalColCount - rightFrozenColCount - 1;\r\n // 如果没有冻结列,则使用全部列\r\n if (frozenColCount === 0 && rightFrozenColCount === 0) {\r\n startCol = 0;\r\n endCol = totalColCount - 1;\r\n }\r\n // 确保列索引有效\r\n if (startCol >= totalColCount || endCol < startCol) {\r\n return null;\r\n }\r\n\r\n this.columnRangeCache = { startCol, endCol };\r\n return this.columnRangeCache;\r\n }\r\n\r\n /**\r\n * 计算子表的viewBox区域\r\n */\r\n private calculateSubTableViewBox(\r\n bodyRowIndex: number,\r\n detailConfig?: DetailTableOptions | null,\r\n height?: number\r\n ): { x1: number; y1: number; x2: number; y2: number } | null {\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const detailRowRect = this.table.getCellRangeRelativeRect({ col: 0, row: rowIndex });\r\n if (!detailRowRect) {\r\n return null;\r\n }\r\n const internalProps = getInternalProps(this.table);\r\n const originalHeight = internalProps.originalRowHeights?.get(bodyRowIndex) || 0;\r\n const columnRange = this.getColumnRange();\r\n if (!columnRange) {\r\n return null;\r\n }\r\n const { startCol, endCol } = columnRange;\r\n const firstColRect = this.table.getCellRangeRelativeRect({ col: startCol, row: rowIndex });\r\n const lastColRect = this.table.getCellRangeRelativeRect({ col: endCol, row: rowIndex });\r\n if (!firstColRect || !lastColRect) {\r\n return null;\r\n }\r\n // 解析margin配置 [上, 右, 下, 左]\r\n const [marginTop, marginRight, marginBottom, marginLeft] = parseMargin(detailConfig?.style?.margin);\r\n const configHeight = height ? height : detailConfig?.style?.height || 300;\r\n // 处理auto高度的情况\r\n let actualHeight: number;\r\n if (configHeight === 'auto') {\r\n // auto高度在renderSubTable后处理,这里先用默认值\r\n actualHeight = 300;\r\n } else {\r\n actualHeight = typeof configHeight === 'number' ? configHeight : 300;\r\n }\r\n // 如果配置的高度小于垂直margin总和,则不渲染子表\r\n if (actualHeight <= marginTop + marginBottom) {\r\n return {\r\n x1: firstColRect.left + marginLeft,\r\n y1: detailRowRect.top + originalHeight,\r\n x2: lastColRect.right - marginRight,\r\n y2: detailRowRect.top + originalHeight\r\n };\r\n }\r\n const viewBox = {\r\n x1: firstColRect.left + marginLeft,\r\n y1: detailRowRect.top + originalHeight + marginTop,\r\n x2: lastColRect.right - marginRight,\r\n y2: detailRowRect.top + originalHeight - marginBottom + actualHeight\r\n };\r\n // 确保viewBox有效\r\n if (viewBox.x2 <= viewBox.x1 || viewBox.y2 <= viewBox.y1) {\r\n return null;\r\n }\r\n return viewBox;\r\n }\r\n\r\n /**\r\n * 移除子表\r\n */\r\n removeSubTable(bodyRowIndex: number): void {\r\n const internalProps = getInternalProps(this.table);\r\n const subTable = internalProps.subTableInstances?.get(bodyRowIndex);\r\n if (subTable) {\r\n // 在删除子表前,保存其checkbox状态\r\n this.saveSubTableCheckboxState(bodyRowIndex, subTable);\r\n // 清理所有事件处理器和引用\r\n this.cleanupSubTableEventHandlers(subTable);\r\n // 释放子表资源\r\n if (typeof subTable.release === 'function') {\r\n try {\r\n subTable.release();\r\n } catch (error) {\r\n console.warn('Failed to release sub table:', error);\r\n }\r\n }\r\n internalProps.subTableInstances.delete(bodyRowIndex);\r\n }\r\n }\r\n\r\n /**\r\n * 清理子表的事件处理器和引用\r\n */\r\n private cleanupSubTableEventHandlers(subTable: VTable.ListTable): void {\r\n // 清理事件转发处理器\r\n this.cleanupSubTableEventForwarding(subTable);\r\n\r\n // 清理after_render事件处理器\r\n const afterRenderHandler = (subTable as VTable.ListTable & { __afterRenderHandler?: () => void })\r\n .__afterRenderHandler;\r\n if (afterRenderHandler) {\r\n this.table.off('after_render', afterRenderHandler);\r\n delete (subTable as VTable.ListTable & { __afterRenderHandler?: () => void }).__afterRenderHandler;\r\n }\r\n\r\n // 清理selection事件处理器\r\n const selectionHandler = (subTable as VTable.ListTable & { __selectionHandler?: () => void }).__selectionHandler;\r\n if (selectionHandler) {\r\n subTable.off('click_cell', selectionHandler);\r\n delete (subTable as VTable.ListTable & { __selectionHandler?: () => void }).__selectionHandler;\r\n }\r\n\r\n // 恢复原始的canvas方法\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __originalRenderMethod?: (...args: unknown[]) => unknown;\r\n __originalDrawMethod?: (...args: unknown[]) => unknown;\r\n __scrollHandler?: (args: unknown) => boolean;\r\n __subTableScrollHandler?: () => boolean;\r\n __clipInterval?: number;\r\n __antiFlickerHandler?: () => void;\r\n };\r\n\r\n // 恢复原始的render和draw方法\r\n if (subTable.scenegraph?.stage?.defaultLayer && extendedSubTable.__originalRenderMethod) {\r\n (subTable.scenegraph.stage.defaultLayer as Record<string, unknown>).render =\r\n extendedSubTable.__originalRenderMethod;\r\n delete extendedSubTable.__originalRenderMethod;\r\n }\r\n\r\n if (subTable.scenegraph?.stage?.defaultLayer && extendedSubTable.__originalDrawMethod) {\r\n (subTable.scenegraph.stage.defaultLayer as Record<string, unknown>).draw = extendedSubTable.__originalDrawMethod;\r\n delete extendedSubTable.__originalDrawMethod;\r\n }\r\n const scrollHandler = extendedSubTable.__scrollHandler;\r\n if (scrollHandler) {\r\n this.table.off('can_scroll', scrollHandler);\r\n delete extendedSubTable.__scrollHandler;\r\n }\r\n\r\n const subTableScrollHandler = extendedSubTable.__subTableScrollHandler;\r\n if (subTableScrollHandler) {\r\n subTable.off('can_scroll', subTableScrollHandler);\r\n delete extendedSubTable.__subTableScrollHandler;\r\n }\r\n\r\n // 清理定时器\r\n const clipInterval = extendedSubTable.__clipInterval;\r\n if (clipInterval) {\r\n clearInterval(clipInterval);\r\n delete extendedSubTable.__clipInterval;\r\n }\r\n\r\n // 清理anti-flicker事件处理器\r\n const antiFlickerHandler = extendedSubTable.__antiFlickerHandler;\r\n if (antiFlickerHandler) {\r\n this.table.off('after_render', antiFlickerHandler);\r\n delete extendedSubTable.__antiFlickerHandler;\r\n }\r\n\r\n // 清理checkbox事件处理器\r\n const checkboxHandler = (extendedSubTable as VTable.ListTable & { __checkboxHandler?: (args: unknown) => void })\r\n .__checkboxHandler;\r\n if (checkboxHandler) {\r\n subTable.off('checkbox_state_change', checkboxHandler);\r\n delete (extendedSubTable as VTable.ListTable & { __checkboxHandler?: (args: unknown) => void }).__checkboxHandler;\r\n }\r\n }\r\n\r\n /**\r\n * 设置滚动事件隔离\r\n */\r\n private setupScrollEventIsolation(subTable: VTable.ListTable): void {\r\n // 检测鼠标是否在子表区域内\r\n const isMouseInChildTableArea = (event: MouseEvent) => {\r\n const rect = this.table.canvas.getBoundingClientRect();\r\n const x = event.clientX - rect.left;\r\n const y = event.clientY - rect.top;\r\n const currentViewBox = (subTable as { options: { viewBox?: { x1: number; y1: number; x2: number; y2: number } } })\r\n .options.viewBox;\r\n if (!currentViewBox) {\r\n return false;\r\n }\r\n const isInArea =\r\n x >= currentViewBox.x1 && x <= currentViewBox.x2 && y >= currentViewBox.y1 && y <= currentViewBox.y2;\r\n return isInArea;\r\n };\r\n\r\n const isSubTableAtBottom = () => {\r\n const totalContentHeight = subTable.getAllRowsHeight();\r\n const viewportHeight = subTable.scenegraph.height;\r\n const scrollTop = subTable.scrollTop;\r\n if (totalContentHeight <= viewportHeight) {\r\n return true;\r\n }\r\n const maxScrollTop = totalContentHeight - viewportHeight;\r\n // 使用小的容差值来处理浮点数精度问题\r\n const isAtBottom = Math.abs(scrollTop - maxScrollTop) <= 1;\r\n return isAtBottom;\r\n };\r\n // 判断子表在滚动边界时是否应该继续滚动\r\n const shouldSubTableScroll = (event: MouseEvent) => {\r\n if (!event || !(event instanceof WheelEvent)) {\r\n return true;\r\n }\r\n const deltaY = event.deltaY;\r\n const isScrollingDown = deltaY > 0;\r\n const isScrollingUp = deltaY < 0;\r\n const currentScrollTop = subTable.scrollTop;\r\n // 如果滚动条在最上面且向上滚动,返回false\r\n if (currentScrollTop <= 0 && isScrollingUp) {\r\n return false;\r\n }\r\n // 如果滚动条在最下面且向下滚动,返回false\r\n if (isSubTableAtBottom() && isScrollingDown) {\r\n return false;\r\n }\r\n // 其他情况允许滚动\r\n return true;\r\n };\r\n let subTableCanScroll = false;\r\n\r\n const handleParentScroll = (parentArgs: unknown) => {\r\n const args = parentArgs as { event?: MouseEvent };\r\n\r\n if (args.event && isMouseInChildTableArea(args.event)) {\r\n // 使用边界检查函数判断子表是否应该滚动\r\n if (shouldSubTableScroll(args.event)) {\r\n subTableCanScroll = true;\r\n return false;\r\n }\r\n subTableCanScroll = false;\r\n return true;\r\n }\r\n subTableCanScroll = false;\r\n return true;\r\n };\r\n this.table.on('can_scroll', handleParentScroll);\r\n\r\n const handleSubTableScroll = (parentArgs: unknown) => {\r\n const args = parentArgs as { event?: MouseEvent };\r\n if (args.event === undefined) {\r\n return true;\r\n }\r\n return subTableCanScroll;\r\n };\r\n\r\n subTable.on('can_scroll', handleSubTableScroll);\r\n\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __scrollHandler?: (args: unknown) => boolean;\r\n __subTableScrollHandler?: (args: unknown) => boolean;\r\n };\r\n extendedSubTable.__scrollHandler = handleParentScroll;\r\n extendedSubTable.__subTableScrollHandler = handleSubTableScroll;\r\n }\r\n\r\n /**\r\n * 设置统一选中状态管理\r\n */\r\n private setupUnifiedSelectionManagement(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n // 这里设置子表的选择事件\r\n const selectionHandler = () => {\r\n this.clearAllSelectionsExcept(bodyRowIndex);\r\n };\r\n subTable.on('click_cell', selectionHandler);\r\n (subTable as VTable.ListTable & { __selectionHandler: () => void }).__selectionHandler = selectionHandler;\r\n }\r\n\r\n /**\r\n * 计算当前行所在分组层级的偏移高度\r\n * @param rowIndex 当前行索引\r\n * @returns 需要偏移的高度(所有父级分组行的高度总和)\r\n */\r\n private calculateGroupLevelOffset(rowIndex: number): number {\r\n try {\r\n // 获取当前行的记录索引和indexKey\r\n const recordIndex = this.table.getRecordShowIndexByCell(0, rowIndex);\r\n const indexKey = this.table.dataSource.getIndexKey(recordIndex);\r\n if (!Array.isArray(indexKey) || indexKey.length <= 1) {\r\n return 0;\r\n }\r\n\r\n let totalOffset = 0;\r\n for (let r = this.table.columnHeaderLevelCount; r < rowIndex; r++) {\r\n try {\r\n const record = this.table.getRecordByCell(0, r);\r\n // 检查是否是分组行\r\n if (record && typeof record === 'object' && 'vtableMergeName' in record) {\r\n const groupRecordIndex = this.table.getRecordShowIndexByCell(0, r);\r\n const groupIndexKey = this.table.dataSource.getIndexKey(groupRecordIndex);\r\n const normalizedGroupKey = Array.isArray(groupIndexKey) ? groupIndexKey : [groupIndexKey];\r\n // 检查这个分组行是否是当前行的祖先\r\n if (this.isAncestorGroup(normalizedGroupKey, indexKey)) {\r\n totalOffset += this.table.getRowHeight(r);\r\n }\r\n }\r\n } catch (e) {\r\n // 忽略单行错误,继续处理\r\n }\r\n }\r\n return totalOffset;\r\n } catch (error) {\r\n return 0;\r\n }\r\n }\r\n\r\n /**\r\n * 检查分组是否是目标行的祖先分组\r\n * @param groupKey 分组的indexKey\r\n * @param targetKey 目标行的indexKey\r\n * @returns 是否是祖先关系\r\n */\r\n private isAncestorGroup(groupKey: number[], targetKey: number[]): boolean {\r\n // 祖先分组的层级必须小于目标行的层级\r\n if (groupKey.length >= targetKey.length) {\r\n return false;\r\n }\r\n // 检查前缀是否匹配\r\n for (let i = 0; i < groupKey.length; i++) {\r\n if (groupKey[i] !== targetKey[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * 设置子表canvas裁剪,实现真正的clip截断效果\r\n */\r\n private setupSubTableCanvasClipping(subTable: VTable.ListTable, bodyRowIndex: number): void {\r\n // 获取子表的渲染stage\r\n if (!subTable.scenegraph?.stage) {\r\n return;\r\n }\r\n const stage = subTable.scenegraph.stage;\r\n // 存储原始方法的引用,以便后续恢复\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __originalRenderMethod?: (...args: unknown[]) => unknown;\r\n __originalDrawMethod?: (...args: unknown[]) => unknown;\r\n };\r\n // 计算裁剪区域的函数\r\n const calculateClipRegion = () => {\r\n try {\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const frozenRowsHeight = this.table.getFrozenRowsHeight();\r\n const frozenColsWidth = this.table.getFrozenColsWidth();\r\n const rightFrozenColsWidth = this.table.getRightFrozenColsWidth();\r\n const bottomFrozenRowsHeight = this.table.getBottomFrozenRowsHeight();\r\n const tableWidth = this.table.tableNoFrameWidth;\r\n const tableHeight = this.table.tableNoFrameHeight;\r\n const isFrozenDataRow = rowIndex < this.table.frozenRowCount && rowIndex >= this.table.columnHeaderLevelCount;\r\n const isBottomFrozenDataRow = rowIndex >= this.table.rowCount - this.table.bottomFrozenRowCount;\r\n\r\n // 计算当前子表所在分组的层级偏移\r\n const groupLevelOffset = this.calculateGroupLevelOffset(rowIndex);\r\n\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n const detailConfig =\r\n record && this.getDetailConfigForRecord ? this.getDetailConfigForRecord(record, bodyRowIndex) : null;\r\n const [, marginRight, , marginLeft] = parseMargin(detailConfig?.style?.margin);\r\n const clipX = frozenColsWidth + marginLeft;\r\n let clipY = 0;\r\n const clipWidth = tableWidth - frozenColsWidth - rightFrozenColsWidth - marginLeft / 2 - marginRight / 2;\r\n let clipHeight = tableHeight;\r\n if (isFrozenDataRow) {\r\n clipY = groupLevelOffset;\r\n clipHeight = tableHeight - bottomFrozenRowsHeight - groupLevelOffset;\r\n } else if (isBottomFrozenDataRow) {\r\n clipY = groupLevelOffset;\r\n clipHeight = tableHeight - groupLevelOffset;\r\n } else {\r\n clipY = frozenRowsHeight + groupLevelOffset;\r\n clipHeight = tableHeight - frozenRowsHeight - bottomFrozenRowsHeight - groupLevelOffset;\r\n }\r\n return { clipX, clipY, clipWidth, clipHeight };\r\n } catch (error) {\r\n return null;\r\n }\r\n };\r\n // 获取canvas context\r\n const window = stage.window;\r\n if (!window || typeof window.getContext !== 'function') {\r\n return;\r\n }\r\n const context = window.getContext();\r\n if (!context) {\r\n return;\r\n }\r\n const wrapRenderMethod = (obj: Record<string, unknown>, methodName: string, originalMethodKey: string) => {\r\n const originalMethod = obj[methodName] as (...args: unknown[]) => unknown;\r\n if (typeof originalMethod === 'function') {\r\n // 存储原始方法\r\n (extendedSubTable as unknown as Record<string, unknown>)[originalMethodKey] = originalMethod;\r\n obj[methodName] = function (...args: unknown[]) {\r\n context.save();\r\n try {\r\n const clipRegion = calculateClipRegion();\r\n if (clipRegion && clipRegion.clipWidth > 0 && clipRegion.clipHeight > 0) {\r\n const dpr =\r\n (window as { dpr?: number; devicePixelRatio?: number }).dpr ||\r\n (window as { dpr?: number; devicePixelRatio?: number }).devicePixelRatio ||\r\n 1;\r\n context.beginPath();\r\n context.rect(\r\n clipRegion.clipX * dpr,\r\n clipRegion.clipY * dpr,\r\n clipRegion.clipWidth * dpr,\r\n clipRegion.clipHeight * dpr\r\n );\r\n context.clip();\r\n }\r\n return originalMethod.apply(this, args);\r\n } finally {\r\n context.restore();\r\n }\r\n };\r\n }\r\n };\r\n if (stage.defaultLayer) {\r\n wrapRenderMethod(stage.defaultLayer, 'render', '__originalRenderMethod');\r\n wrapRenderMethod(stage.defaultLayer, 'draw', '__originalDrawMethod');\r\n }\r\n }\r\n\r\n private setupAntiFlickerMechanism(subTable: VTable.ListTable): void {\r\n try {\r\n const originalUpdateNextFrame = (subTable as unknown as { scenegraph?: { updateNextFrame?: () => void } })\r\n .scenegraph?.updateNextFrame;\r\n if (!originalUpdateNextFrame) {\r\n return;\r\n }\r\n const parentTable = this.table;\r\n const syncRender = () => {\r\n if (subTable && originalUpdateNextFrame) {\r\n originalUpdateNextFrame.call((subTable as unknown as { scenegraph: unknown }).scenegraph);\r\n }\r\n };\r\n parentTable.on('after_render', syncRender);\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __antiFlickerHandler?: () => void;\r\n };\r\n extendedSubTable.__antiFlickerHandler = syncRender;\r\n } catch (error) {\r\n console.warn('Failed to setup anti-flicker mechanism:', error);\r\n }\r\n }\r\n\r\n updateSubTablePositionsForRowResize(): void {\r\n const internalProps = getInternalProps(this.table);\r\n if (!internalProps.subTableInstances) {\r\n return;\r\n }\r\n internalProps.subTableInstances.forEach((subTable, bodyRowIndex) => {\r\n try {\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const scenegraph = this.table.scenegraph;\r\n let cellGroup: { attribute?: { height?: number } } | null = null;\r\n if (scenegraph && typeof scenegraph.highPerformanceGetCell === 'function') {\r\n cellGroup = scenegraph.highPerformanceGetCell(0, rowIndex);\r\n } else if (scenegraph && typeof scenegraph.getCell === 'function') {\r\n cellGroup = scenegraph.getCell(0, rowIndex);\r\n }\r\n const cellHeight: number =\r\n cellGroup && cellGroup.attribute && typeof cellGroup.attribute.height === 'number'\r\n ? cellGroup.attribute.height\r\n : -1;\r\n if (internalProps.originalRowHeights && typeof cellHeight === 'number' && cellHeight !== -1) {\r\n internalProps.originalRowHeights.set(bodyRowIndex, cellHeight);\r\n }\r\n } catch (e) {\r\n // 保持原有逻辑继续执行\r\n }\r\n });\r\n this.recalculateAllSubTablePositions();\r\n }\r\n\r\n /**\r\n * 重新计算子表位置\r\n * @param start 开始的bodyRowIndex,默认为最小值\r\n * @param end 结束的bodyRowIndex,默认为最大值\r\n */\r\n recalculateAllSubTablePositions(\r\n start?: number,\r\n end?: number,\r\n getDetailConfig?: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null\r\n ): void {\r\n // 清理列范围缓存,确保使用最新的列宽度信息\r\n this.columnRangeCache = null;\r\n const internalProps = getInternalProps(this.table);\r\n internalProps.subTableInstances?.forEach((subTable, bodyRowIndex) => {\r\n // 如果指定了范围,只处理范围内的子表\r\n if (start !== undefined && bodyRowIndex < start) {\r\n return;\r\n }\r\n if (end !== undefined && bodyRowIndex > end) {\r\n return;\r\n }\r\n // 获取记录和配置\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n const detailConfig = getDetailConfig\r\n ? getDetailConfig(record, bodyRowIndex)\r\n : this.getDetailConfigForRecord\r\n ? this.getDetailConfigForRecord(record, bodyRowIndex)\r\n : null;\r\n\r\n // 重新计算子表的 viewBox\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const originalHeight = internalProps.originalRowHeights?.get(bodyRowIndex) || 0;\r\n const currentRowHeight = this.table.getRowHeight(rowIndex);\r\n const detailHeight = currentRowHeight - originalHeight;\r\n const newViewBox = this.calculateSubTableViewBox(bodyRowIndex, detailConfig, detailHeight);\r\n if (newViewBox) {\r\n const newContainerWidth = newViewBox.x2 - newViewBox.x1;\r\n const newContainerHeight = newViewBox.y2 - newViewBox.y1;\r\n (subTable as { options: { viewBox?: { x1: number; y1: number; x2: number; y2: number } } }).options.viewBox =\r\n newViewBox;\r\n const subTableOptions = subTable.options as VTable.ListTableConstructorOptions;\r\n if (subTableOptions.canvasWidth !== newContainerWidth || subTableOptions.canvasHeight !== newContainerHeight) {\r\n subTableOptions.canvasWidth = newContainerWidth;\r\n subTableOptions.canvasHeight = newContainerHeight;\r\n subTable.resize();\r\n }\r\n if (subTable.scenegraph?.stage) {\r\n (subTable.scenegraph.stage as { setViewBox: (viewBox: unknown, flag: boolean) => void }).setViewBox(\r\n newViewBox,\r\n false\r\n );\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 清理所有子表\r\n */\r\n cleanup(): void {\r\n if (!this.table) {\r\n return;\r\n }\r\n // 首先清理所有定时器\r\n this.cleanupAllTimers();\r\n const internalProps = getInternalProps(this.table);\r\n if (internalProps && internalProps.subTableInstances) {\r\n internalProps.subTableInstances.forEach((subTable, bodyRowIndex) => {\r\n this.removeSubTable(bodyRowIndex);\r\n });\r\n internalProps.subTableInstances.clear();\r\n }\r\n // 清理缓存\r\n this.columnRangeCache = null;\r\n // 清理回调函数引用,避免循环引用\r\n this.getDetailConfigForRecord = undefined;\r\n // 清理表格引用\r\n (this as unknown as { table: unknown }).table = null;\r\n }\r\n\r\n /**\r\n * 获取所有子表实例\r\n * @returns Map<bodyRowIndex, VTable.ListTable>\r\n */\r\n getAllSubTableInstances(): Map<number, VTable.ListTable> | undefined {\r\n const internalProps = getInternalProps(this.table);\r\n return internalProps.subTableInstances;\r\n }\r\n\r\n /**\r\n * 根据bodyRowIndex获取指定的子表实例\r\n * @param bodyRowIndex body行索引\r\n * @returns 子表实例,如果不存在则返回null\r\n */\r\n getSubTableInstance(bodyRowIndex: number): VTable.ListTable | null {\r\n const internalProps = getInternalProps(this.table);\r\n return internalProps.subTableInstances?.get(bodyRowIndex) || null;\r\n }\r\n\r\n private getDetailConfigForRecord?: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null;\r\n\r\n /**\r\n * 设置回调函数\r\n */\r\n setCallbacks(callbacks: {\r\n getDetailConfigForRecord?: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null;\r\n }): void {\r\n this.getDetailConfigForRecord = callbacks.getDetailConfigForRecord;\r\n }\r\n\r\n /**\r\n * 设置子表事件转发\r\n */\r\n private setupSubTableEventForwarding(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n const masterRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n Object.values(VTable.TABLE_EVENT_TYPE).forEach(eventType => {\r\n if (eventType) {\r\n const handler = (...args: unknown[]) => {\r\n this.forwardSubTableEvent(eventType, bodyRowIndex, masterRowIndex, subTable, args);\r\n };\r\n\r\n subTable.on(eventType, handler);\r\n\r\n // 保存处理器引用以便后续清理\r\n const subTableWithHandlers = subTable as unknown as { __eventHandlers?: Map<string, unknown[]> };\r\n if (!subTableWithHandlers.__eventHandlers) {\r\n subTableWithHandlers.__eventHandlers = new Map();\r\n }\r\n const handlers = subTableWithHandlers.__eventHandlers;\r\n if (!handlers.has(eventType)) {\r\n handlers.set(eventType, []);\r\n }\r\n handlers.get(eventType)?.push(handler);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 转发子表事件到主表\r\n */\r\n private forwardSubTableEvent(\r\n eventType: string,\r\n bodyRowIndex: number,\r\n masterRowIndex: number,\r\n subTable: VTable.ListTable,\r\n originalArgs: unknown[]\r\n ): void {\r\n // 构建子表事件信息,直接使用VTable原生事件类型\r\n const subTableEventInfo: SubTableEventInfo = {\r\n eventType: eventType as keyof typeof VTable.TABLE_EVENT_TYPE,\r\n masterBodyRowIndex: bodyRowIndex,\r\n masterRowIndex: masterRowIndex,\r\n subTable: subTable,\r\n originalEventArgs: originalArgs\r\n };\r\n // 直接触发到主表的插件事件\r\n this.table.fireListeners(VTable.TABLE_EVENT_TYPE.PLUGIN_EVENT, {\r\n plugin: { name: 'Master Detail Plugin' },\r\n event: originalArgs[0], // 原始事件对象\r\n pluginEventInfo: subTableEventInfo\r\n });\r\n }\r\n\r\n /**\r\n * 直接清除主表选中\r\n */\r\n private clearMainTableSelectionInternal(): void {\r\n if (typeof (this.table as { clearSelected?: () => void }).clearSelected === 'function') {\r\n (this.table as { clearSelected: () => void }).clearSelected();\r\n }\r\n }\r\n\r\n /**\r\n * 清除除指定子表外的所有选中状态\r\n */\r\n private clearAllSelectionsExcept(exceptRecordIndex: number): void {\r\n // 清除父表选中状态\r\n this.clearMainTableSelectionInternal();\r\n // 清除其他子表的选中状态\r\n const internalProps = getInternalProps(this.table);\r\n internalProps.subTableInstances?.forEach((subTable, rowIndex) => {\r\n if (\r\n rowIndex !== exceptRecordIndex &&\r\n subTable &&\r\n typeof (subTable as { clearSelected?: () => void }).clearSelected === 'function'\r\n ) {\r\n (subTable as { clearSelected: () => void }).clearSelected();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 清理子表事件转发\r\n */\r\n private cleanupSubTableEventForwarding(subTable: VTable.ListTable): void {\r\n const subTableWithHandlers = subTable as unknown as { __eventHandlers?: Map<string, unknown[]> };\r\n if (subTableWithHandlers.__eventHandlers) {\r\n // 移除所有事件监听器\r\n for (const [eventType, handlers] of subTableWithHandlers.__eventHandlers) {\r\n for (const handler of handlers) {\r\n subTable.off(eventType, handler as (...args: unknown[]) => void);\r\n }\r\n }\r\n // 清理引用\r\n delete subTableWithHandlers.__eventHandlers;\r\n }\r\n }\r\n}\r\n"]}
@@ -3,7 +3,7 @@ import type { Group } from '@visactor/vtable/src/vrender';
3
3
  export interface DetailTableOptions extends VTable.ListTableConstructorOptions {
4
4
  style?: {
5
5
  margin?: number | [number, number] | [number, number, number, number];
6
- height?: number;
6
+ height?: number | 'auto';
7
7
  };
8
8
  }
9
9
  export interface MasterDetailPluginOptions {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/master-detail-plugin/types.ts"],"names":[],"mappings":"AA6EA,MAAM,UAAU,iBAAiB,CAAC,CAAkB,EAAE,CAAkB;IACtE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;QAClD,OAAO,CAAC,KAAK,CAAC,CAAC;KAChB;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACxC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3E;IAED,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC7C,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;KACrC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;QAC7C,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;KACrC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAKD,MAAM,UAAU,mBAAmB,CAAC,KAA4B,EAAE,MAAuB;IACvF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC;AAKD,MAAM,UAAU,uBAAuB,CAAC,KAA4B,EAAE,MAAuB;IAC3F,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC","file":"types.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\r\nimport type { Group } from '@visactor/vtable/src/vrender';\r\n\r\n/** 子表配置接口 - 继承 ListTableConstructorOptions */\r\nexport interface DetailTableOptions extends VTable.ListTableConstructorOptions {\r\n style?: {\r\n margin?: number | [number, number] | [number, number, number, number];\r\n height?: number;\r\n };\r\n}\r\n\r\n/**\r\n * 主从表插件配置选项\r\n */\r\nexport interface MasterDetailPluginOptions {\r\n /** 是否启用checkbox级联功能 - 控制主从表之间的复选框联动,默认为 true */\r\n enableCheckboxCascade?: boolean;\r\n /** 子表配置 - 可以是静态配置对象或动态配置函数 */\r\n detailTableOptions?: DetailTableOptions | ((params: { data: unknown; bodyRowIndex: number }) => DetailTableOptions);\r\n}\r\n\r\n/**\r\n * 子表checkbox状态接口\r\n */\r\nexport interface SubTableCheckboxState {\r\n checkedState: Record<string, Record<string | number, boolean | 'indeterminate'>>;\r\n headerCheckedState: Record<string | number, boolean | 'indeterminate'>;\r\n}\r\n\r\n/**\r\n * 内部属性扩展接口\r\n */\r\nexport interface InternalProps {\r\n expandedRecordIndices: (number | number[])[];\r\n subTableInstances: Map<number, VTable.ListTable>;\r\n originalRowHeights: Map<number, number>;\r\n _tempExpandedRecordIndices?: (number | number[])[];\r\n subTableCheckboxStates?: Map<number, SubTableCheckboxState>;\r\n}\r\n\r\n/**\r\n * 事件数据接口\r\n */\r\nexport interface CellContentWidthEventData {\r\n col: number;\r\n row: number;\r\n distWidth: number;\r\n cellHeight: number;\r\n detaX: number;\r\n autoRowHeight: boolean;\r\n needUpdateRowHeight: boolean;\r\n cellGroup: Group;\r\n padding: [number, number, number, number];\r\n textAlign: CanvasTextAlign;\r\n textBaseline: CanvasTextBaseline;\r\n}\r\n\r\nexport interface SelectBorderHeightEventData {\r\n startRow: number;\r\n endRow: number;\r\n currentHeight: number;\r\n selectComp: { rect: unknown; fillhandle?: unknown; role: string };\r\n}\r\n\r\n/**\r\n * 懒加载状态枚举\r\n */\r\nexport type LazyLoadState = 'loading' | 'loaded' | 'error';\r\n\r\n/**\r\n * 记录索引类型 - 支持单个数字或数字数组\r\n */\r\nexport type RecordIndexType = number | number[];\r\n\r\n/**\r\n * 工具函数:比较两个记录索引是否相等\r\n */\r\nexport function recordIndexEquals(a: RecordIndexType, b: RecordIndexType): boolean {\r\n if (typeof a === 'number' && typeof b === 'number') {\r\n return a === b;\r\n }\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n return a.length === b.length && a.every((val, index) => val === b[index]);\r\n }\r\n // 一个是数字,一个是数组的情况\r\n if (typeof a === 'number' && Array.isArray(b)) {\r\n return b.length === 1 && b[0] === a;\r\n }\r\n if (Array.isArray(a) && typeof b === 'number') {\r\n return a.length === 1 && a[0] === b;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 工具函数:检查记录索引数组中是否包含指定索引\r\n */\r\nexport function includesRecordIndex(array: (number | number[])[], target: RecordIndexType): boolean {\r\n return array.some(item => recordIndexEquals(item, target));\r\n}\r\n\r\n/**\r\n * 工具函数:在记录索引数组中查找指定索引的位置\r\n */\r\nexport function findRecordIndexPosition(array: (number | number[])[], target: RecordIndexType): number {\r\n return array.findIndex(item => recordIndexEquals(item, target));\r\n}\r\n\r\n/**\r\n * 子表事件信息接口\r\n */\r\nexport interface SubTableEventInfo {\r\n /** 子表事件类型 */\r\n eventType: keyof typeof VTable.TABLE_EVENT_TYPE;\r\n /** 主表行索引(不包含表头) */\r\n masterBodyRowIndex: number;\r\n /** 主表行索引(包含表头) */\r\n masterRowIndex: number;\r\n /** 子表实例 */\r\n subTable: unknown;\r\n /** 原始事件数据 */\r\n originalEventArgs?: unknown;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/master-detail-plugin/types.ts"],"names":[],"mappings":"AA6EA,MAAM,UAAU,iBAAiB,CAAC,CAAkB,EAAE,CAAkB;IACtE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;QAClD,OAAO,CAAC,KAAK,CAAC,CAAC;KAChB;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACxC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3E;IAED,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC7C,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;KACrC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;QAC7C,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;KACrC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAKD,MAAM,UAAU,mBAAmB,CAAC,KAA4B,EAAE,MAAuB;IACvF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC;AAKD,MAAM,UAAU,uBAAuB,CAAC,KAA4B,EAAE,MAAuB;IAC3F,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC","file":"types.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\r\nimport type { Group } from '@visactor/vtable/src/vrender';\r\n\r\n/** 子表配置接口 - 继承 ListTableConstructorOptions */\r\nexport interface DetailTableOptions extends VTable.ListTableConstructorOptions {\r\n style?: {\r\n margin?: number | [number, number] | [number, number, number, number];\r\n height?: number | 'auto';\r\n };\r\n}\r\n\r\n/**\r\n * 主从表插件配置选项\r\n */\r\nexport interface MasterDetailPluginOptions {\r\n /** 是否启用checkbox级联功能 - 控制主从表之间的复选框联动,默认为 true */\r\n enableCheckboxCascade?: boolean;\r\n /** 子表配置 - 可以是静态配置对象或动态配置函数 */\r\n detailTableOptions?: DetailTableOptions | ((params: { data: unknown; bodyRowIndex: number }) => DetailTableOptions);\r\n}\r\n\r\n/**\r\n * 子表checkbox状态接口\r\n */\r\nexport interface SubTableCheckboxState {\r\n checkedState: Record<string, Record<string | number, boolean | 'indeterminate'>>;\r\n headerCheckedState: Record<string | number, boolean | 'indeterminate'>;\r\n}\r\n\r\n/**\r\n * 内部属性扩展接口\r\n */\r\nexport interface InternalProps {\r\n expandedRecordIndices: (number | number[])[];\r\n subTableInstances: Map<number, VTable.ListTable>;\r\n originalRowHeights: Map<number, number>;\r\n _tempExpandedRecordIndices?: (number | number[])[];\r\n subTableCheckboxStates?: Map<number, SubTableCheckboxState>;\r\n}\r\n\r\n/**\r\n * 事件数据接口\r\n */\r\nexport interface CellContentWidthEventData {\r\n col: number;\r\n row: number;\r\n distWidth: number;\r\n cellHeight: number;\r\n detaX: number;\r\n autoRowHeight: boolean;\r\n needUpdateRowHeight: boolean;\r\n cellGroup: Group;\r\n padding: [number, number, number, number];\r\n textAlign: CanvasTextAlign;\r\n textBaseline: CanvasTextBaseline;\r\n}\r\n\r\nexport interface SelectBorderHeightEventData {\r\n startRow: number;\r\n endRow: number;\r\n currentHeight: number;\r\n selectComp: { rect: unknown; fillhandle?: unknown; role: string };\r\n}\r\n\r\n/**\r\n * 懒加载状态枚举\r\n */\r\nexport type LazyLoadState = 'loading' | 'loaded' | 'error';\r\n\r\n/**\r\n * 记录索引类型 - 支持单个数字或数字数组\r\n */\r\nexport type RecordIndexType = number | number[];\r\n\r\n/**\r\n * 工具函数:比较两个记录索引是否相等\r\n */\r\nexport function recordIndexEquals(a: RecordIndexType, b: RecordIndexType): boolean {\r\n if (typeof a === 'number' && typeof b === 'number') {\r\n return a === b;\r\n }\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n return a.length === b.length && a.every((val, index) => val === b[index]);\r\n }\r\n // 一个是数字,一个是数组的情况\r\n if (typeof a === 'number' && Array.isArray(b)) {\r\n return b.length === 1 && b[0] === a;\r\n }\r\n if (Array.isArray(a) && typeof b === 'number') {\r\n return a.length === 1 && a[0] === b;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 工具函数:检查记录索引数组中是否包含指定索引\r\n */\r\nexport function includesRecordIndex(array: (number | number[])[], target: RecordIndexType): boolean {\r\n return array.some(item => recordIndexEquals(item, target));\r\n}\r\n\r\n/**\r\n * 工具函数:在记录索引数组中查找指定索引的位置\r\n */\r\nexport function findRecordIndexPosition(array: (number | number[])[], target: RecordIndexType): number {\r\n return array.findIndex(item => recordIndexEquals(item, target));\r\n}\r\n\r\n/**\r\n * 子表事件信息接口\r\n */\r\nexport interface SubTableEventInfo {\r\n /** 子表事件类型 */\r\n eventType: keyof typeof VTable.TABLE_EVENT_TYPE;\r\n /** 主表行索引(不包含表头) */\r\n masterBodyRowIndex: number;\r\n /** 主表行索引(包含表头) */\r\n masterRowIndex: number;\r\n /** 子表实例 */\r\n subTable: unknown;\r\n /** 原始事件数据 */\r\n originalEventArgs?: unknown;\r\n}\r\n"]}
@@ -37,9 +37,9 @@ export class TableCarouselAnimationPlugin {
37
37
  var _a;
38
38
  if (!this.playing || this.table.isReleased) return;
39
39
  let animation = !0;
40
- const customRow = this.customDistRowFunction && this.customDistRowFunction(this.row, this.table);
41
- customRow ? (this.row = customRow.distRow, animation = null === (_a = customRow.animation) || void 0 === _a || _a) : isInteger(this.row) && this.table.scenegraph.proxy.screenTopRow !== this.row ? (this.row = this.table.frozenRowCount,
42
- animation = !1) : isInteger(this.row) || this.table.scenegraph.proxy.screenTopRow === Math.floor(this.row) ? this.row += this.rowCount : (this.row = this.table.frozenRowCount,
40
+ const screenTopRow = Math.max(this.table.scenegraph.proxy.screenTopRow, this.table.frozenRowCount), customRow = this.customDistRowFunction && this.customDistRowFunction(this.row, this.table);
41
+ customRow ? (this.row = customRow.distRow, animation = null === (_a = customRow.animation) || void 0 === _a || _a) : isInteger(this.row) && screenTopRow !== this.row ? (this.row = this.table.frozenRowCount,
42
+ animation = !1) : isInteger(this.row) || screenTopRow === Math.floor(this.row) ? this.row += this.rowCount : (this.row = this.table.frozenRowCount,
43
43
  animation = !1), this.table.scrollToRow(this.row, animation ? {
44
44
  duration: this.animationDuration,
45
45
  easing: this.animationEasing
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/table-carousel-animation.ts"],"names":[],"mappings":"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","file":"table-carousel-animation.js","sourcesContent":["import type { EasingType } from '@visactor/vtable/es/vrender';\nimport type { BaseTableAPI } from '@visactor/vtable/es/ts-types/base-table';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nimport type { pluginsDefinition } from '@visactor/vtable';\nfunction isInteger(value: number) {\n return Math.floor(value) === value;\n}\n\nexport interface ITableCarouselAnimationPluginOptions {\n id?: string;\n rowCount?: number;\n colCount?: number;\n animationDuration?: number;\n animationDelay?: number;\n animationEasing?: EasingType;\n autoPlay?: boolean;\n autoPlayDelay?: number;\n\n customDistRowFunction?: (row: number, table: BaseTableAPI) => { distRow: number; animation?: boolean } | undefined;\n customDistColFunction?: (col: number, table: BaseTableAPI) => { distCol: number; animation?: boolean } | undefined;\n}\n\nexport class TableCarouselAnimationPlugin implements pluginsDefinition.IVTablePlugin {\n id = `table-carousel-animation`;\n name = 'Table Carousel Animation';\n runTime = [TABLE_EVENT_TYPE.INITIALIZED];\n table: BaseTableAPI;\n\n rowCount: number;\n colCount: number;\n animationDuration: number;\n animationDelay: number;\n animationEasing: EasingType;\n\n playing: boolean;\n row: number;\n col: number;\n willUpdateRow: boolean = false;\n willUpdateCol: boolean = false;\n autoPlay: boolean;\n autoPlayDelay: number;\n\n customDistRowFunction?: (row: number, table: BaseTableAPI) => { distRow: number; animation?: boolean } | undefined;\n customDistColFunction?: (col: number, table: BaseTableAPI) => { distCol: number; animation?: boolean } | undefined;\n constructor(options: ITableCarouselAnimationPluginOptions = {}) {\n this.id = options.id ?? this.id;\n this.rowCount = options?.rowCount ?? undefined;\n this.colCount = options?.colCount ?? undefined;\n this.animationDuration = options?.animationDuration ?? 500;\n this.animationDelay = options?.animationDelay ?? 1000;\n this.animationEasing = options?.animationEasing ?? 'linear';\n this.autoPlay = options?.autoPlay ?? false;\n this.autoPlayDelay = options?.autoPlayDelay ?? 0;\n this.customDistColFunction = options.customDistColFunction;\n this.customDistRowFunction = options.customDistRowFunction;\n }\n run(...args: any[]) {\n if (!this.table) {\n this.table = args[2] as BaseTableAPI;\n }\n this.reset();\n\n if (this.autoPlay) {\n setTimeout(() => {\n this.play();\n }, this.autoPlayDelay);\n }\n }\n\n reset() {\n this.playing = false;\n this.row = this.table.frozenRowCount;\n this.col = this.table.frozenColCount;\n }\n\n play() {\n if (!this.table) {\n throw new Error('table is not initialized');\n }\n this.playing = true;\n\n if (this.rowCount && !this.willUpdateRow) {\n this.updateRow();\n } else if (this.colCount && !this.willUpdateCol) {\n this.updateCol();\n }\n }\n\n pause() {\n this.playing = false;\n }\n\n updateRow() {\n if (!this.playing || this.table.isReleased) {\n return;\n }\n\n let animation = true;\n const customRow = this.customDistRowFunction && this.customDistRowFunction(this.row, this.table);\n if (customRow) {\n this.row = customRow.distRow;\n animation = customRow.animation ?? true;\n } else if (isInteger(this.row) && this.table.scenegraph.proxy.screenTopRow !== this.row) {\n this.row = this.table.frozenRowCount;\n animation = false;\n } else if (!isInteger(this.row) && this.table.scenegraph.proxy.screenTopRow !== Math.floor(this.row)) {\n this.row = this.table.frozenRowCount;\n animation = false;\n } else {\n this.row += this.rowCount;\n }\n this.table.scrollToRow(\n this.row,\n animation ? { duration: this.animationDuration, easing: this.animationEasing } : undefined\n );\n this.willUpdateRow = true;\n setTimeout(\n () => {\n this.willUpdateRow = false;\n this.updateRow();\n },\n // animation ? this.animationDuration + this.animationDelay : 0\n this.animationDuration + this.animationDelay\n );\n }\n\n updateCol() {\n if (!this.playing || this.table.isReleased) {\n return;\n }\n\n let animation = true;\n const customCol = this.customDistColFunction && this.customDistColFunction(this.col, this.table);\n if (customCol) {\n this.col = customCol.distCol;\n animation = customCol.animation ?? true;\n } else if (isInteger(this.col) && this.table.scenegraph.proxy.screenLeftCol !== this.col) {\n this.col = this.table.frozenColCount;\n animation = false;\n } else if (!isInteger(this.col) && this.table.scenegraph.proxy.screenLeftCol !== Math.floor(this.col)) {\n this.col = this.table.frozenColCount;\n animation = false;\n } else {\n this.col += this.colCount;\n }\n\n this.table.scrollToCol(\n this.col,\n animation ? { duration: this.animationDuration, easing: this.animationEasing } : undefined\n );\n\n this.willUpdateCol = true;\n setTimeout(\n () => {\n this.willUpdateCol = false;\n this.updateCol();\n },\n // animation ? this.animationDuration + this.animationDelay : 0\n this.animationDuration + this.animationDelay\n );\n }\n release() {\n // do nothing\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/table-carousel-animation.ts"],"names":[],"mappings":"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","file":"table-carousel-animation.js","sourcesContent":["import type { EasingType } from '@visactor/vtable/es/vrender';\nimport type { BaseTableAPI } from '@visactor/vtable/es/ts-types/base-table';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nimport type { pluginsDefinition } from '@visactor/vtable';\nfunction isInteger(value: number) {\n return Math.floor(value) === value;\n}\n\nexport interface ITableCarouselAnimationPluginOptions {\n id?: string;\n rowCount?: number;\n colCount?: number;\n animationDuration?: number;\n animationDelay?: number;\n animationEasing?: EasingType;\n autoPlay?: boolean;\n autoPlayDelay?: number;\n\n customDistRowFunction?: (row: number, table: BaseTableAPI) => { distRow: number; animation?: boolean } | undefined;\n customDistColFunction?: (col: number, table: BaseTableAPI) => { distCol: number; animation?: boolean } | undefined;\n}\n\nexport class TableCarouselAnimationPlugin implements pluginsDefinition.IVTablePlugin {\n id = `table-carousel-animation`;\n name = 'Table Carousel Animation';\n runTime = [TABLE_EVENT_TYPE.INITIALIZED];\n table: BaseTableAPI;\n\n rowCount: number;\n colCount: number;\n animationDuration: number;\n animationDelay: number;\n animationEasing: EasingType;\n\n playing: boolean;\n row: number;\n col: number;\n willUpdateRow: boolean = false;\n willUpdateCol: boolean = false;\n autoPlay: boolean;\n autoPlayDelay: number;\n\n customDistRowFunction?: (row: number, table: BaseTableAPI) => { distRow: number; animation?: boolean } | undefined;\n customDistColFunction?: (col: number, table: BaseTableAPI) => { distCol: number; animation?: boolean } | undefined;\n constructor(options: ITableCarouselAnimationPluginOptions = {}) {\n this.id = options.id ?? this.id;\n this.rowCount = options?.rowCount ?? undefined;\n this.colCount = options?.colCount ?? undefined;\n this.animationDuration = options?.animationDuration ?? 500;\n this.animationDelay = options?.animationDelay ?? 1000;\n this.animationEasing = options?.animationEasing ?? 'linear';\n this.autoPlay = options?.autoPlay ?? false;\n this.autoPlayDelay = options?.autoPlayDelay ?? 0;\n this.customDistColFunction = options.customDistColFunction;\n this.customDistRowFunction = options.customDistRowFunction;\n }\n run(...args: any[]) {\n if (!this.table) {\n this.table = args[2] as BaseTableAPI;\n }\n this.reset();\n\n if (this.autoPlay) {\n setTimeout(() => {\n this.play();\n }, this.autoPlayDelay);\n }\n }\n\n reset() {\n this.playing = false;\n this.row = this.table.frozenRowCount;\n this.col = this.table.frozenColCount;\n }\n\n play() {\n if (!this.table) {\n throw new Error('table is not initialized');\n }\n this.playing = true;\n\n if (this.rowCount && !this.willUpdateRow) {\n this.updateRow();\n } else if (this.colCount && !this.willUpdateCol) {\n this.updateCol();\n }\n }\n\n pause() {\n this.playing = false;\n }\n\n updateRow() {\n if (!this.playing || this.table.isReleased) {\n return;\n }\n\n let animation = true;\n const screenTopRow = Math.max(this.table.scenegraph.proxy.screenTopRow, this.table.frozenRowCount);\n const customRow = this.customDistRowFunction && this.customDistRowFunction(this.row, this.table);\n if (customRow) {\n this.row = customRow.distRow;\n animation = customRow.animation ?? true;\n } else if (isInteger(this.row) && screenTopRow !== this.row) {\n this.row = this.table.frozenRowCount;\n animation = false;\n } else if (!isInteger(this.row) && screenTopRow !== Math.floor(this.row)) {\n this.row = this.table.frozenRowCount;\n animation = false;\n } else {\n this.row += this.rowCount;\n }\n this.table.scrollToRow(\n this.row,\n animation ? { duration: this.animationDuration, easing: this.animationEasing } : undefined\n );\n this.willUpdateRow = true;\n setTimeout(\n () => {\n this.willUpdateRow = false;\n this.updateRow();\n },\n // animation ? this.animationDuration + this.animationDelay : 0\n this.animationDuration + this.animationDelay\n );\n }\n\n updateCol() {\n if (!this.playing || this.table.isReleased) {\n return;\n }\n\n let animation = true;\n const customCol = this.customDistColFunction && this.customDistColFunction(this.col, this.table);\n if (customCol) {\n this.col = customCol.distCol;\n animation = customCol.animation ?? true;\n } else if (isInteger(this.col) && this.table.scenegraph.proxy.screenLeftCol !== this.col) {\n this.col = this.table.frozenColCount;\n animation = false;\n } else if (!isInteger(this.col) && this.table.scenegraph.proxy.screenLeftCol !== Math.floor(this.col)) {\n this.col = this.table.frozenColCount;\n animation = false;\n } else {\n this.col += this.colCount;\n }\n\n this.table.scrollToCol(\n this.col,\n animation ? { duration: this.animationDuration, easing: this.animationEasing } : undefined\n );\n\n this.willUpdateCol = true;\n setTimeout(\n () => {\n this.willUpdateCol = false;\n this.updateCol();\n },\n // animation ? this.animationDuration + this.animationDelay : 0\n this.animationDuration + this.animationDelay\n );\n }\n release() {\n // do nothing\n }\n}\n"]}
@@ -4,6 +4,10 @@ import type { ILayer, TableSeriesNumberAttributes } from '@visactor/vtable/es/vr
4
4
  export type TableSeriesNumberOptions = {
5
5
  rowCount: number;
6
6
  colCount: number;
7
+ dragOrder?: {
8
+ enableDragColumnOrder?: boolean;
9
+ enableDragRowOrder?: boolean;
10
+ };
7
11
  } & Partial<Pick<TableSeriesNumberAttributes, 'rowSeriesNumberGenerate' | 'colSeriesNumberGenerate' | 'rowSeriesNumberCellStyle' | 'colSeriesNumberCellStyle' | 'cornerCellStyle' | 'colSeriesNumberHeight' | 'rowSeriesNumberWidth'>>;
8
12
  export declare class TableSeriesNumber implements pluginsDefinition.IVTablePlugin {
9
13
  id: string;
@@ -206,8 +206,14 @@ export class TableSeriesNumber {
206
206
  }
207
207
  }
208
208
  }, pluginOptions.cornerCellStyle),
209
- checkMoveColumnOrder: colIndex => this.table.isColumnSelected(colIndex),
210
- checkMoveRowOrder: rowIndex => this.table.isRowSelected(rowIndex)
209
+ checkMoveColumnOrder: colIndex => {
210
+ var _a;
211
+ return !!(null === (_a = this.pluginOptions.dragOrder) || void 0 === _a ? void 0 : _a.enableDragColumnOrder) && this.table.isColumnSelected(colIndex);
212
+ },
213
+ checkMoveRowOrder: rowIndex => {
214
+ var _a;
215
+ return !!(null === (_a = this.pluginOptions.dragOrder) || void 0 === _a ? void 0 : _a.enableDragRowOrder) && this.table.isRowSelected(rowIndex);
216
+ }
211
217
  }), this.listenComponentEvents();
212
218
  }
213
219
  run(...args) {
@@ -222,6 +228,7 @@ export class TableSeriesNumber {
222
228
  for (let i = options.columns.length; i < this.pluginOptions.colCount; i++) {
223
229
  const columnFields = {
224
230
  field: i,
231
+ key: i,
225
232
  title: ""
226
233
  };
227
234
  options.columns.push(columnFields);
@@ -252,6 +259,7 @@ export class TableSeriesNumber {
252
259
  this.table.on(TABLE_EVENT_TYPE.RESIZE_ROW_END, this.handleResizeRowEnd), this.table.on(TABLE_EVENT_TYPE.CHANGE_HEADER_POSITION, this.handleChangeHeaderPosition);
253
260
  }
254
261
  listenComponentEvents() {
262
+ var _a, _b;
255
263
  this.seriesNumberComponent.on(SeriesNumberEvent.seriesNumberCellRightClick, this.handleSeriesNumberCellRightClick),
256
264
  this.seriesNumberComponent.on(SeriesNumberEvent.seriesNumberCellHover, this.handleSeriesNumberCellHover),
257
265
  this.seriesNumberComponent.on(SeriesNumberEvent.seriesNumberCellUnHover, this.handleSeriesNumberCellUnHover),
@@ -260,8 +268,8 @@ export class TableSeriesNumber {
260
268
  this.seriesNumberComponent.on(SeriesNumberEvent.rowSeriesNumberWidthChange, this.handleRowSeriesNumberWidthChange),
261
269
  this.seriesNumberComponent.on(SeriesNumberEvent.resizeColWidthStart, this.handleResizeColWidthStart),
262
270
  this.seriesNumberComponent.on(SeriesNumberEvent.resizeRowHeightStart, this.handleResizeRowHeightStart),
263
- this.seriesNumberComponent.on(SeriesNumberEvent.dragColumnOrderStart, this.handleDragColumOrderStart),
264
- this.seriesNumberComponent.on(SeriesNumberEvent.dragRowOrderStart, this.handleDragRowOrderStart);
271
+ (null === (_a = this.pluginOptions.dragOrder) || void 0 === _a ? void 0 : _a.enableDragColumnOrder) && this.seriesNumberComponent.on(SeriesNumberEvent.dragColumnOrderStart, this.handleDragColumOrderStart),
272
+ (null === (_b = this.pluginOptions.dragOrder) || void 0 === _b ? void 0 : _b.enableDragRowOrder) && this.seriesNumberComponent.on(SeriesNumberEvent.dragRowOrderStart, this.handleDragRowOrderStart);
265
273
  }
266
274
  release() {
267
275
  var _a, _b;