@canvas-components/list-table 0.2.0
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.
- package/LICENSE +21 -0
- package/README.md +198 -0
- package/dist/index.cjs +22097 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1652 -0
- package/dist/index.d.ts +1652 -0
- package/dist/index.js +22095 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/debug/debug-manager.ts","../src/domain/columns/column-key.ts","../src/debug/debug-overlay.ts","../src/rendering/canvas-renderer.ts","../src/domain/columns/compute-column-widths.ts","../src/domain/columns/flatten-leaf-columns.ts","../src/domain/columns/normalize-columns.ts","../src/domain/columns/split-fixed-columns.ts","../src/domain/columns/column-runtime.ts","../src/features/header-settings/header-settings-feature.ts","../src/domain/constants.ts","../src/shared/theme/theme.ts","../src/adapters/dom-host.ts","../src/interaction/pointer.ts","../src/adapters/canvas-host.ts","../src/adapters/component-portal.ts","../src/domain/rows/row-key.ts","../src/interaction/selection.ts","../src/schema/style.ts","../src/domain/rows/frozen-rows.ts","../src/domain/rows/pagination.ts","../src/domain/data/get-value-by-data-index.ts","../src/domain/rows/row-selection.ts","../src/engine/store/state.ts","../src/engine/store/reducer.ts","../src/engine/store/create-store.ts","../src/engine/store/actions.ts","../src/engine/controllers/store-facade.ts","../src/interaction/hit-test.ts","../src/features/tooltip/body-tooltip-controller.ts","../src/features/scroll/scroll-session.ts","../src/services/runtime-sync-service.ts","../src/rendering/cell-content/content-style.ts","../src/rendering/cell-content/draw-arrow-content.ts","../src/rendering/cell-content/draw-barcode-content.ts","../src/rendering/cell-content/draw-button-content.ts","../src/rendering/cell-content/draw-chart-content.ts","../src/rendering/cell-content/draw-color-content.ts","../src/rendering/cell-content/draw-image-content.ts","../src/rendering/cell-content/draw-symbol.ts","../src/rendering/cell-content/draw-icon-content.ts","../src/rendering/cell-content/draw-link-content.ts","../src/rendering/cell-content/draw-nested-table-content.ts","../src/rendering/cell-content/draw-progress-content.ts","../src/rendering/cell-content/draw-qrcode-content.ts","../src/rendering/cell-content/draw-rate-content.ts","../src/rendering/cell-content/draw-selection-content.ts","../src/rendering/cell-content/draw-switch-content.ts","../src/rendering/cell-content/draw-tag-content.ts","../src/rendering/cell-content/draw-text-content.ts","../src/features/editing/editing-utils.ts","../src/rendering/cell-content/cell-content-renderer.ts","../src/services/cell-content-action-service.ts","../src/domain/layout/geometry.ts","../src/domain/layout/scrollbar.ts","../src/services/scrollbar-service.ts","../src/services/pointer-hit-service.ts","../src/engine/store/selectors.ts","../src/domain/layout/coordinate.ts","../src/domain/columns/header-reorder.ts","../src/features/column-reorder/column-reorder-feature.ts","../src/shared/animations/scrollbar-opacity.ts","../src/engine/runtime.ts","../src/features/scroll/scroll-feature.ts","../src/engine/controllers/scroll-animation-controller.ts","../src/services/expandable-service.ts","../src/domain/rows/row-height.ts","../src/rendering/pipeline/visible-row.ts","../src/shared/animations/control-animation.ts","../src/shared/animations/collapse-animation.ts","../src/engine/controllers/animation-controller.ts","../src/shared/carousel/carousel.ts","../src/engine/controllers/carousel-controller.ts","../src/services/clipboard-service.ts","../src/services/content-preview-service.ts","../src/shared/image/image-download.ts","../src/engine/controllers/content-action-controller.ts","../src/validation/cell-validation.ts","../src/validation/table-validation.ts","../src/domain/data/set-value-by-data-index.ts","../src/features/editing/editing-feature.ts","../src/services/scroll-to-service.ts","../src/engine/controllers/editing-controller.ts","../src/features/column-resize/column-resize-feature.ts","../src/features/overlay/context-menu-builder.ts","../src/ui/filter-constants.ts","../src/shared/filter/filter-utils.ts","../src/services/query-service.ts","../src/features/overlay/overlay-panel-builders.ts","../src/features/overlay/overlay-feature.ts","../src/features/tooltip/tooltip-feature.ts","../src/services/range-highlight-service.ts","../src/shared/utils/hit-result.ts","../src/features/row-drag/row-drag-types.ts","../src/features/row-drag/row-drag-session.ts","../src/features/row-drag/row-drag-insertion.ts","../src/services/row-drag-bus.ts","../src/services/row-drag-preview-service.ts","../src/services/row-drag-transform-service.ts","../src/engine/controllers/row-drag-controller.ts","../src/engine/controllers/event-controller.ts","../src/adapters/event-host-factory.ts","../src/features/sorting/sorting-feature.ts","../src/features/filtering/filtering-feature.ts","../src/services/query-action-service.ts","../src/services/header-settings-action-service.ts","../src/shared/theme/density.ts","../src/shared/filter/filter-panel-data.ts","../src/engine/controllers/header-action-controller.ts","../src/engine/controllers/overlay-controller.ts","../src/adapters/storage/indexeddb-column-config-storage.ts","../src/services/column-config-service.ts","../src/services/persistence-service.ts","../src/engine/controllers/persistence-controller.ts","../src/services/data-source-service.ts","../src/engine/controllers/query-controller.ts","../src/domain/columns/build-header-tree.ts","../src/domain/layout/compute-scrollbar-layout.ts","../src/domain/layout/compute-viewport.ts","../src/domain/rows/body-layout.ts","../src/domain/columns/column-layout.ts","../src/domain/columns/header-layout.ts","../src/services/collapsible-row-service.ts","../src/services/layout-service.ts","../src/rendering/pipeline/pagination-renderer.ts","../src/features/pagination/pagination-feature.ts","../src/services/pagination-service.ts","../src/services/render-host-service.ts","../src/rendering/primitives/draw-grid.ts","../src/rendering/primitives/draw-summary.ts","../src/rendering/primitives/draw-scrollbars.ts","../src/rendering/primitives/collapse-trigger.ts","../src/rendering/primitives/draw-body.ts","../src/rendering/pipeline/body-section-renderer.ts","../src/rendering/primitives/header-text-layout.ts","../src/rendering/primitives/draw-header.ts","../src/rendering/pipeline/header-renderer.ts","../src/rendering/pipeline/inline-expand-column.ts","../src/rendering/pipeline/collapse-render-config.ts","../src/rendering/pipeline/row-drag-indicator-renderer.ts","../src/rendering/pipeline/active-cell-overlay.ts","../src/rendering/pipeline/render-pipeline.ts","../src/rendering/pipeline/scene-builder.ts","../src/services/render-service.ts","../src/engine/controllers/render-controller.ts","../src/features/frozen-rows/frozen-rows-feature.ts","../src/services/frozen-row-action-service.ts","../src/features/row-selection/row-selection-feature.ts","../src/services/selection-service.ts","../src/services/selection-action-service.ts","../src/services/scroll-pagination-service.ts","../src/domain/rows/collapse-range.ts","../src/domain/columns/column-boundary.ts","../src/engine/controllers/row-action-controller.ts","../src/engine/controllers/scroll-to-controller.ts","../src/domain/columns/header-leaf-range.ts","../src/domain/rows/selection-state.ts","../src/engine/controllers/selection-controller.ts","../src/services/summary-service.ts","../src/domain/summary/summary-interaction.ts","../src/domain/summary/summary-key.ts","../src/engine/controllers/summary-controller.ts","../src/engine/controller-assembly.ts","../src/engine/list-table-engine.ts","../src/list-table.ts"],"names":["insertIndex","getRowKey","drawBarcodeToCanvas","getCanvasChartRenderer","drawCanvasChartToCanvas","resolveCanvasChartTooltipText","DEFAULT_COLUMN_WIDTH","drawQrCodeToCanvas","roundRectPath","drawRoundedRectPath","contentRect","contentVisibleRect","fullWidth","fittedContent","visibleContent","remainingText","gapWidth","resolveRateText","clamp","isPointInRect","now","siblingNodes","ratio","start","column","selectedColumns","record","rowIndex","copyText","copyRows","copyJson","downloadJsonFile","mapRowsToExportRecords","exportTableToCsv","exportTableToTxt","exportTableToXlsx","scrolled","getFrozenRowPosition","copyTextSync","position","hitTest","isIndexInHighlightRange","intersectRects","CONTENT_HORIZONTAL_PADDING","EMPTY_RANGE_HIGHLIGHT","isSameDataIndex","appendRoundedRectPath","isDragSourceColumn","getAlignedTextX","ACTION_GAP","ACTION_SIZE","ACTION_PADDING_INLINE","GRID_LINE_OFFSET","roundRect","ellipsisText","yieldToMainThread","resolveSummaryConfig","options"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ListTableDebugOptions } from \"../schema/state\";\r\nimport type { ListTableDebugSnapshot } from \"./debug-snapshot\";\r\n\r\n/**\r\n * 调试管理器。\r\n */\r\nexport class DebugManager {\r\n private readonly options: ListTableDebugOptions;\r\n private snapshot: ListTableDebugSnapshot | null;\r\n\r\n /**\r\n * 创建调试管理器。\r\n *\r\n * @param options 调试配置。\r\n */\r\n constructor(options: ListTableDebugOptions = {}) {\r\n this.options = options;\r\n this.snapshot = null;\r\n }\r\n\r\n /**\r\n * 是否启用。\r\n *\r\n * @returns 启用状态。\r\n */\r\n isEnabled() {\r\n return !!this.options.enabled;\r\n }\r\n\r\n /**\r\n * 获取调试配置。\r\n *\r\n * @returns 调试配置。\r\n */\r\n getOptions() {\r\n return this.options;\r\n }\r\n\r\n /**\r\n * 更新快照。\r\n *\r\n * @param snapshot 调试快照。\r\n */\r\n setSnapshot(snapshot: ListTableDebugSnapshot) {\r\n this.snapshot = snapshot;\r\n }\r\n\r\n /**\r\n * 获取快照。\r\n *\r\n * @returns 调试快照。\r\n */\r\n getSnapshot() {\r\n return this.snapshot;\r\n }\r\n\r\n /**\r\n * 记录调试日志。\r\n *\r\n * @param label 标签。\r\n * @param payload 数据。\r\n */\r\n log(label: string, payload: unknown) {\r\n if (!this.options.enabled) {\r\n return;\r\n }\r\n\r\n if (!this.options.logDrawCalls && !this.options.logStateChanges) {\r\n return;\r\n }\r\n\r\n console.info(`[ListTable Debug] ${label}`, payload);\r\n }\r\n}\r\n","import type { ListTableColumn, TableColumnDataIndex } from \"../../schema/column\";\r\n\r\n/**\r\n * 将列 dataIndex 统一转换为稳定字符串,作为默认列标识。\r\n */\r\nexport function stringifyColumnDataIndex(dataIndex: TableColumnDataIndex) {\r\n return Array.isArray(dataIndex)\r\n ? dataIndex.map((item) => String(item)).join(\".\")\r\n : String(dataIndex);\r\n}\r\n\r\n/**\r\n * 解析列运行时 key,未显式传入 key 时默认回退到 dataIndex。\r\n */\r\nexport function resolveColumnKey<RecordType>(\r\n column: Pick<ListTableColumn<RecordType>, \"key\" | \"dataIndex\">,\r\n) {\r\n return column.key?.trim() || stringifyColumnDataIndex(column.dataIndex);\r\n}\r\n\r\n/**\r\n * 就地补齐列 key,确保后续运行时逻辑始终能拿到稳定列标识。\r\n */\r\nexport function ensureColumnKeysInPlace<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n) {\r\n columns.forEach((column) => {\r\n column.key = resolveColumnKey(column);\r\n if (column.children?.length) {\r\n ensureColumnKeysInPlace(column.children);\r\n }\r\n });\r\n}\r\n","import type { ListTableDebugOptions } from \"../schema/state\";\r\nimport type { ListTableTheme } from \"../schema/style\";\r\nimport type { ListTableDebugSnapshot, Rect } from \"./debug-snapshot\";\r\n\r\n/**\r\n * 绘制调试辅助层。\r\n *\r\n * @param ctx 画布上下文。\r\n * @param snapshot 调试快照。\r\n * @param options 调试开关。\r\n * @param theme 当前主题。\r\n */\r\nexport function drawDebugOverlay(\r\n ctx: CanvasRenderingContext2D,\r\n snapshot: ListTableDebugSnapshot,\r\n options: ListTableDebugOptions,\r\n theme: ListTableTheme,\r\n) {\r\n if (!options.enabled) {\r\n return;\r\n }\r\n\r\n ctx.save();\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = theme.debugStrokeColor;\r\n ctx.fillStyle = theme.debugFillColor;\r\n\r\n if (options.showHeaderBounds) {\r\n drawDescriptorRects(ctx, snapshot, \"header\");\r\n }\r\n\r\n if (options.showBodyBounds) {\r\n drawDescriptorRects(ctx, snapshot, \"body\");\r\n }\r\n\r\n if (options.showHeaderActionOverlay) {\r\n drawDescriptorRects(ctx, snapshot, \"header-action\");\r\n }\r\n\r\n if (options.showHitTarget && snapshot.hitTest?.rect) {\r\n drawRect(ctx, snapshot.hitTest.rect, \"#10b981\");\r\n }\r\n\r\n if (options.showFixedSplitLines) {\r\n const leftLine = snapshot.layout.fixedWidthLeft;\r\n const rightLine = snapshot.layout.totalWidth - snapshot.layout.fixedWidthRight;\r\n drawVerticalGuide(ctx, leftLine, snapshot.layout.headerHeight + 1);\r\n drawVerticalGuide(ctx, rightLine, snapshot.layout.headerHeight + 1);\r\n }\r\n\r\n ctx.restore();\r\n}\r\n\r\nfunction drawDescriptorRects(\r\n ctx: CanvasRenderingContext2D,\r\n snapshot: ListTableDebugSnapshot,\r\n kind: \"header\" | \"body\" | \"header-action\",\r\n) {\r\n snapshot.descriptors\r\n .filter((descriptor) => descriptor.kind === kind)\r\n .forEach((descriptor) => {\r\n drawRect(ctx, descriptor.rect, ctx.strokeStyle as string);\r\n });\r\n}\r\n\r\nfunction drawRect(\r\n ctx: CanvasRenderingContext2D,\r\n rect: Rect,\r\n color: string,\r\n) {\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.strokeRect(rect.x + 0.5, rect.y + 0.5, rect.width, rect.height);\r\n ctx.restore();\r\n}\r\n\r\nfunction drawVerticalGuide(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n height: number,\r\n) {\r\n ctx.save();\r\n ctx.strokeStyle = \"#8b5cf6\";\r\n ctx.beginPath();\r\n ctx.moveTo(x + 0.5, 0);\r\n ctx.lineTo(x + 0.5, Math.max(height, 0));\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n","import { drawDebugOverlay } from \"../debug/debug-overlay\";\r\nimport type { ListTableDebugSnapshot } from \"../debug/debug-snapshot\";\r\nimport type { ListTableDebugOptions } from \"../schema/state\";\r\nimport type { ListTableTheme } from \"../schema/style\";\r\n\r\n/**\r\n * 画布渲染器。\r\n */\r\nexport class CanvasRenderer {\r\n private readonly canvas: HTMLCanvasElement;\r\n private readonly ctx: CanvasRenderingContext2D;\r\n private readonly theme: ListTableTheme;\r\n private readonly debug: ListTableDebugOptions;\r\n private contentZoom = 1;\r\n private cssWidth = 1;\r\n private cssHeight = 1;\r\n\r\n /**\r\n * 创建渲染器。\r\n *\r\n * @param canvas 画布节点。\r\n * @param theme 主题配置。\r\n * @param debug 调试配置。\r\n */\r\n constructor(\r\n canvas: HTMLCanvasElement,\r\n theme: ListTableTheme,\r\n debug: ListTableDebugOptions,\r\n ) {\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) {\r\n throw new Error(\"ListTable 初始化失败:当前环境不支持 2D Canvas。\");\r\n }\r\n\r\n this.canvas = canvas;\r\n this.ctx = ctx;\r\n this.theme = theme;\r\n this.debug = debug;\r\n }\r\n\r\n /**\r\n * 调整尺寸。\r\n *\r\n * @param width 逻辑宽度。\r\n * @param height 逻辑高度。\r\n * @param contentZoom 内容缩放比例(1 = 100%),通过绘制变换放大而不是 CSS scale,保持清晰。\r\n */\r\n resize(width: number, height: number, contentZoom = 1) {\r\n const dpr = window.devicePixelRatio || 1;\r\n const zoom =\r\n typeof contentZoom === \"number\" &&\r\n Number.isFinite(contentZoom) &&\r\n contentZoom > 0\r\n ? contentZoom\r\n : 1;\r\n // width/height 为可视 CSS 像素(宿主尺寸),与位图一一对应;缩放由 setTransform 承担。\r\n const cssWidth = Math.max(Math.round(width), 1);\r\n const cssHeight = Math.max(Math.round(height), 1);\r\n this.canvas.width = Math.max(Math.round(cssWidth * dpr), 1);\r\n this.canvas.height = Math.max(Math.round(cssHeight * dpr), 1);\r\n this.canvas.style.width = `${cssWidth}px`;\r\n this.canvas.style.height = `${cssHeight}px`;\r\n this.cssWidth = cssWidth;\r\n this.cssHeight = cssHeight;\r\n this.contentZoom = zoom;\r\n this.ctx.setTransform(dpr * zoom, 0, 0, dpr * zoom, 0, 0);\r\n }\r\n\r\n /**\r\n * 清空画布。\r\n *\r\n * @param width 宽度。\r\n * @param height 高度。\r\n */\r\n clear(width: number, height: number) {\r\n // 先按设备像素清空整张位图,再在用户坐标系覆盖整个可视区域。\r\n const transform = this.ctx.getTransform();\r\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.ctx.setTransform(transform);\r\n const cover = this.resolveCoverSize(width, height);\r\n this.ctx.fillStyle = this.theme.backgroundColor;\r\n this.ctx.fillRect(0, 0, cover.width, cover.height);\r\n }\r\n\r\n /**\r\n * 获取上下文。\r\n *\r\n * @returns 2D 上下文。\r\n */\r\n getContext() {\r\n return this.ctx;\r\n }\r\n\r\n /**\r\n * 绘制调试层。\r\n *\r\n * @param snapshot 调试快照。\r\n */\r\n drawDebug(snapshot: ListTableDebugSnapshot) {\r\n drawDebugOverlay(this.ctx, snapshot, this.debug, this.theme);\r\n }\r\n\r\n /**\r\n * 绘制空状态。\r\n *\r\n * @param width 宽度。\r\n * @param height 高度。\r\n * @param text 空状态文案。\r\n * @param top 空状态区域相对画布顶部的偏移。\r\n */\r\n drawEmpty(width: number, height: number, text: string, top = 0) {\r\n this.ctx.save();\r\n this.ctx.fillStyle = this.theme.emptyBackgroundColor;\r\n const safeTop = Math.max(top, 0);\r\n const cover =\r\n safeTop > 0\r\n ? {\r\n width: Math.max(width, this.cssWidth / this.contentZoom),\r\n height: Math.max(height, 0),\r\n }\r\n : this.resolveCoverSize(width, height);\r\n this.ctx.fillRect(0, safeTop, cover.width, cover.height);\r\n this.ctx.fillStyle = this.theme.emptyTextColor;\r\n this.ctx.font = `${this.theme.fontSize}px ${this.theme.fontFamily}`;\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textBaseline = \"middle\";\r\n this.ctx.fillText(text, cover.width / 2, safeTop + cover.height / 2);\r\n this.ctx.restore();\r\n }\r\n\r\n /**\r\n * 计算可覆盖整个可视画布的用户坐标尺寸。\r\n */\r\n private resolveCoverSize(width: number, height: number) {\r\n const zoom = this.contentZoom > 0 ? this.contentZoom : 1;\r\n return {\r\n width: Math.max(width, this.cssWidth / zoom),\r\n height: Math.max(height, this.cssHeight / zoom),\r\n };\r\n }\r\n}\r\n","import type { InternalLeafColumn } from \"./types\";\r\n\r\n/**\r\n * 计算总宽度。\r\n *\r\n * @param columns 叶子列。\r\n * @returns 宽度总和。\r\n */\r\nexport function computeColumnWidths<RecordType>(\r\n columns: InternalLeafColumn<RecordType>[],\r\n) {\r\n return columns.reduce((total, column) => total + column.width, 0);\r\n}\r\n\r\n/**\r\n * 当所有列宽度之和小于容器宽度时,按比例均分剩余空间。\r\n * 覆盖写入 column.width(原地修改)。\r\n *\r\n * @param columns 叶子列。\r\n * @param containerWidth 容器宽度。\r\n */\r\nexport function stretchColumnWidths<RecordType>(\r\n columns: InternalLeafColumn<RecordType>[],\r\n containerWidth: number,\r\n) {\r\n const totalWidth = computeColumnWidths(columns);\r\n if (totalWidth >= containerWidth || columns.length === 0) {\r\n return;\r\n }\r\n\r\n const stretchableColumns = columns.filter(\r\n (column) => column.minWidth !== column.maxWidth,\r\n );\r\n if (stretchableColumns.length === 0) {\r\n return;\r\n }\r\n\r\n const extra = containerWidth - totalWidth;\r\n const stretchableWidth = computeColumnWidths(stretchableColumns);\r\n const ratio = stretchableWidth > 0 ? extra / stretchableWidth : 0;\r\n\r\n for (const column of stretchableColumns) {\r\n column.width = Math.round(column.width * (1 + ratio));\r\n }\r\n\r\n // 补齐因舍入导致的像素差\r\n const adjustedTotal = computeColumnWidths(columns);\r\n const remain = containerWidth - adjustedTotal;\r\n if (remain > 0) {\r\n stretchableColumns[stretchableColumns.length - 1]!.width += remain;\r\n }\r\n}\r\n","import type { InternalLeafColumn, NormalizedColumn } from \"./types\";\r\n\r\n/**\r\n * 拍平叶子列。\r\n *\r\n * @param columns 标准化列。\r\n * @returns 叶子列。\r\n */\r\nexport function flattenLeafColumns<RecordType>(\r\n columns: NormalizedColumn<RecordType>[],\r\n) {\r\n const leafColumns: InternalLeafColumn<RecordType>[] = [];\r\n\r\n const visit = (column: NormalizedColumn<RecordType>) => {\r\n if (column.children?.length) {\r\n column.children.forEach(visit);\r\n return;\r\n }\r\n\r\n leafColumns.push({\r\n ...column,\r\n leafIndex: leafColumns.length,\r\n });\r\n };\r\n\r\n columns.forEach(visit);\r\n return leafColumns;\r\n}\r\n","import type {\r\n ListTableColumn,\r\n ListTableHeaderContent,\r\n ListTableHeaderTitle,\r\n} from \"../../schema/column\";\r\nimport { resolveColumnKey } from \"./column-key\";\r\nimport type { NormalizedColumn } from \"./types\";\r\n\r\nconst DEFAULT_COLUMN_WIDTH = 160;\r\nconst DEFAULT_MIN_WIDTH = 60;\r\nconst DEFAULT_MAX_WIDTH = 480;\r\n\r\n/**\r\n * 标准化列定义。\r\n *\r\n * @param columns 原始列。\r\n * @returns 标准化结果。\r\n */\r\nexport function normalizeColumns<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n): NormalizedColumn<RecordType>[] {\r\n return columns\r\n .filter((column) => !column.hidden)\r\n .map((column) => normalizeColumn(column, 0, null));\r\n}\r\n\r\nfunction normalizeColumn<RecordType>(\r\n column: ListTableColumn<RecordType>,\r\n depth: number,\r\n parentKey: string | null,\r\n): NormalizedColumn<RecordType> {\r\n const resolvedKey = resolveColumnKey(column);\r\n const width = clampWidth(\r\n Number(column.width) || DEFAULT_COLUMN_WIDTH,\r\n Number(column.minWidth) || DEFAULT_MIN_WIDTH,\r\n Number(column.maxWidth) || DEFAULT_MAX_WIDTH,\r\n );\r\n const title = column.title ?? resolvedKey;\r\n const titleContent = normalizeHeaderTitle(title);\r\n if (hasStaticRequiredRule(column)) {\r\n titleContent.unshift({\r\n type: \"text\",\r\n text: \"*\",\r\n color: \"#ff4d4f\",\r\n fontWeight: \"400\",\r\n });\r\n }\r\n\r\n const normalized: NormalizedColumn<RecordType> = {\r\n key: resolvedKey,\r\n title: resolveHeaderTitleText(title),\r\n titleContent,\r\n dataIndex: column.dataIndex,\r\n width,\r\n minWidth: Number(column.minWidth) || DEFAULT_MIN_WIDTH,\r\n maxWidth: Number(column.maxWidth) || DEFAULT_MAX_WIDTH,\r\n align: column.align ?? \"left\",\r\n fixed: column.fixed,\r\n hidden: column.hidden,\r\n ellipsis: column.ellipsis,\r\n editable: column.editable,\r\n formItemProps: column.formItemProps,\r\n allowSort: column.allowSort,\r\n sortValueGetter: column.sortValueGetter,\r\n defaultSortOrder: column.defaultSortOrder,\r\n sortPriority: column.sortPriority,\r\n allowFilter: column.allowFilter,\r\n filterModes: column.filterModes,\r\n filterValueGetter: column.filterValueGetter,\r\n filterOptionValueGetter: column.filterOptionValueGetter,\r\n filterOptions: column.filterOptions,\r\n render: column.render,\r\n onCell: column.onCell,\r\n cellType: column.cellType,\r\n cellStyle: column.cellStyle,\r\n moneyFormat: column.moneyFormat,\r\n headerStyle: column.headerStyle,\r\n summary: column.summary,\r\n summaryTitle: column.summaryTitle,\r\n meta: column.meta,\r\n depth,\r\n parentKey,\r\n };\r\n\r\n if (column.children?.length) {\r\n normalized.children = column.children\r\n .filter((child) => !child.hidden)\r\n .map((child) => normalizeColumn(child, depth + 1, resolvedKey));\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\nfunction hasStaticRequiredRule<RecordType>(column: ListTableColumn<RecordType>) {\r\n const formItemProps = column.formItemProps;\r\n if (!formItemProps || typeof formItemProps === \"function\") {\r\n return false;\r\n }\r\n const rules = formItemProps.rules;\r\n return (\r\n Array.isArray(rules) &&\r\n rules.some(\r\n (rule) => rule.required === true && rule.showRequiredMark !== false,\r\n )\r\n );\r\n}\r\n\r\nfunction normalizeHeaderTitle(title: ListTableHeaderTitle) {\r\n const contents = Array.isArray(title) ? title : [title];\r\n return contents.flatMap((content): ListTableHeaderContent[] => {\r\n if (typeof content === \"string\") {\r\n return [{ type: \"text\", text: content }];\r\n }\r\n if (content.type === \"text\" || content.type === \"img\") {\r\n return [content];\r\n }\r\n return [];\r\n });\r\n}\r\n\r\nfunction resolveHeaderTitleText(title: ListTableHeaderTitle) {\r\n return normalizeHeaderTitle(title)\r\n .filter((content) => content.type === \"text\")\r\n .map((content) => content.text)\r\n .join(\"\");\r\n}\r\n\r\nfunction clampWidth(width: number, minWidth: number, maxWidth: number) {\r\n return Math.min(Math.max(width, minWidth), maxWidth);\r\n}\r\n","import type { InternalLeafColumn, SplitLeafColumns } from \"./types\";\r\n\r\n/**\r\n * 拆分固定列。\r\n *\r\n * @param columns 叶子列。\r\n * @returns 三段列集合。\r\n */\r\nexport function splitFixedColumns<RecordType>(\r\n columns: InternalLeafColumn<RecordType>[],\r\n): SplitLeafColumns<RecordType> {\r\n return columns.reduce<SplitLeafColumns<RecordType>>(\r\n (result, column) => {\r\n if (column.fixed === \"left\") {\r\n result.left.push(column);\r\n } else if (column.fixed === \"right\") {\r\n result.right.push(column);\r\n } else {\r\n result.center.push(column);\r\n }\r\n\r\n return result;\r\n },\r\n {\r\n left: [],\r\n center: [],\r\n right: [],\r\n },\r\n );\r\n}\r\n","import type { ListTableOptions } from \"../../schema/table-options\";\r\nimport type { ListTableColumn } from \"../../schema/column\";\r\nimport type {\r\n ListTableColumnRuntimeConfig,\r\n ListTableSortState,\r\n} from \"../../schema/state\";\r\nimport { computeColumnWidths } from \"./compute-column-widths\";\r\nimport { ensureColumnKeysInPlace, resolveColumnKey } from \"./column-key\";\r\nimport { flattenLeafColumns } from \"./flatten-leaf-columns\";\r\nimport { normalizeColumns } from \"./normalize-columns\";\r\nimport { splitFixedColumns } from \"./split-fixed-columns\";\r\nimport type { InternalLeafColumn, NormalizedColumn } from \"./types\";\r\nimport type { SegmentColumn } from \"./segment-column\";\r\n\r\nexport function resolveInitialSortState<RecordType>(\r\n columns: ListTableOptions<RecordType>[\"columns\"],\r\n fallback?: ListTableSortState,\r\n): ListTableSortState {\r\n let matchedState = fallback ?? {\r\n key: null,\r\n order: null,\r\n };\r\n\r\n const visit = (items: ListTableOptions<RecordType>[\"columns\"]) => {\r\n items.forEach((column) => {\r\n if (column.defaultSortOrder && matchedState.key == null) {\r\n matchedState = {\r\n key: resolveColumnKey(column),\r\n order: column.defaultSortOrder,\r\n };\r\n }\r\n\r\n if (column.children?.length) {\r\n visit(column.children);\r\n }\r\n });\r\n };\r\n\r\n visit(columns);\r\n return matchedState;\r\n}\r\n\r\nexport function registerRuntimeColumn<RecordType>(\r\n column: NormalizedColumn<RecordType>,\r\n config: Record<string, ListTableColumnRuntimeConfig>,\r\n) {\r\n config[column.key] = {\r\n width: column.width,\r\n visible: true,\r\n fixed: column.fixed,\r\n };\r\n\r\n column.children?.forEach((child) => registerRuntimeColumn(child, config));\r\n}\r\n\r\nexport function buildSegmentColumns<RecordType>(\r\n columns: InternalLeafColumn<RecordType>[],\r\n startX: number,\r\n): Array<SegmentColumn<RecordType>> {\r\n let currentX = startX;\r\n return columns.map((column) => {\r\n const result: SegmentColumn<RecordType> = {\r\n ...column,\r\n drawX: currentX,\r\n };\r\n currentX += column.width;\r\n return result;\r\n });\r\n}\r\n\r\nexport function getFixedSectionWidths<RecordType>(\r\n columns: ListTableOptions<RecordType>[\"columns\"],\r\n) {\r\n ensureColumnKeysInPlace(columns);\r\n const leafColumns = flattenLeafColumns(normalizeColumns(columns));\r\n const splitColumns = splitFixedColumns(leafColumns);\r\n\r\n return {\r\n left: computeColumnWidths(splitColumns.left),\r\n right: computeColumnWidths(splitColumns.right),\r\n };\r\n}\r\n\r\nexport function setColumnFixed<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n targetKey: string,\r\n direction: \"left\" | \"right\" | \"none\",\r\n initialColumns?: ListTableColumn<RecordType>[],\r\n) {\r\n ensureColumnKeysInPlace(columns);\r\n if (initialColumns) {\r\n ensureColumnKeysInPlace(initialColumns);\r\n }\r\n updateColumnFixed(columns, targetKey, direction, initialColumns);\r\n}\r\n\r\nexport function setNestedColumnWidth<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n targetKey: string,\r\n newWidth: number,\r\n) {\r\n ensureColumnKeysInPlace(columns);\r\n for (const column of columns) {\r\n if (column.key === targetKey) {\r\n column.width = newWidth;\r\n return;\r\n }\r\n if (column.children?.length) {\r\n setNestedColumnWidth(column.children, targetKey, newWidth);\r\n }\r\n }\r\n}\r\n\r\nfunction updateColumnFixed<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n targetKey: string,\r\n direction: \"left\" | \"right\" | \"none\",\r\n initialColumns?: ListTableColumn<RecordType>[],\r\n) {\r\n for (const column of columns) {\r\n if (\r\n column.children?.length &&\r\n updateColumnFixed(\r\n column.children,\r\n targetKey,\r\n direction,\r\n initialColumns,\r\n )\r\n ) {\r\n return true;\r\n }\r\n\r\n if (column.key !== targetKey) {\r\n continue;\r\n }\r\n\r\n applyColumnFixedInSiblings(\r\n columns,\r\n column,\r\n direction,\r\n initialColumns,\r\n );\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction applyColumnFixedInSiblings<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n column: ListTableColumn<RecordType>,\r\n direction: \"left\" | \"right\" | \"none\",\r\n initialColumns?: ListTableColumn<RecordType>[],\r\n) {\r\n const sourceIndex = columns.indexOf(column);\r\n if (sourceIndex === -1) {\r\n return;\r\n }\r\n\r\n if (direction === \"none\") {\r\n delete column.fixed;\r\n // 取消固定后,按初始兄弟顺序插回,避免停留在固定区原位置。\r\n const columnKey = resolveColumnKey(column);\r\n const initialSiblingKeys = initialColumns\r\n ? findSiblingKeysAtTarget(initialColumns, columnKey)\r\n : null;\r\n if (!initialSiblingKeys?.length) {\r\n return;\r\n }\r\n columns.splice(sourceIndex, 1);\r\n const insertIndex = resolveInsertIndexByOriginalOrder(\r\n columns,\r\n columnKey,\r\n initialSiblingKeys,\r\n );\r\n columns.splice(insertIndex, 0, column);\r\n return;\r\n }\r\n\r\n columns.splice(sourceIndex, 1);\r\n column.fixed = direction;\r\n\r\n const insertIndex =\r\n direction === \"left\"\r\n ? getNextLeftFixedInsertIndex(columns)\r\n : getNextRightFixedInsertIndex(columns);\r\n columns.splice(insertIndex, 0, column);\r\n}\r\n\r\n/**\r\n * 在初始列树中查找目标列所在兄弟列表的 key 顺序。\r\n */\r\nfunction findSiblingKeysAtTarget<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n targetKey: string,\r\n): string[] | null {\r\n for (const column of columns) {\r\n if (resolveColumnKey(column) === targetKey) {\r\n return columns.map((item) => resolveColumnKey(item));\r\n }\r\n }\r\n\r\n for (const column of columns) {\r\n if (!column.children?.length) {\r\n continue;\r\n }\r\n const nested = findSiblingKeysAtTarget(column.children, targetKey);\r\n if (nested) {\r\n return nested;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * 根据初始兄弟顺序,计算列应插回的位置。\r\n */\r\nfunction resolveInsertIndexByOriginalOrder<RecordType>(\r\n remainingColumns: ListTableColumn<RecordType>[],\r\n columnKey: string,\r\n initialSiblingKeys: string[],\r\n) {\r\n const originalIndex = initialSiblingKeys.indexOf(columnKey);\r\n if (originalIndex < 0) {\r\n return remainingColumns.length;\r\n }\r\n\r\n for (let index = 0; index < remainingColumns.length; index += 1) {\r\n const siblingKey = resolveColumnKey(remainingColumns[index]!);\r\n const siblingOriginalIndex = initialSiblingKeys.indexOf(siblingKey);\r\n if (siblingOriginalIndex > originalIndex) {\r\n return index;\r\n }\r\n }\r\n\r\n return remainingColumns.length;\r\n}\r\n\r\nfunction getNextLeftFixedInsertIndex<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n) {\r\n let insertIndex = 0;\r\n columns.forEach((column, index) => {\r\n if (column.fixed === \"left\") {\r\n insertIndex = index + 1;\r\n }\r\n });\r\n return insertIndex;\r\n}\r\n\r\nfunction getNextRightFixedInsertIndex<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n) {\r\n const firstRightFixedIndex = columns.findIndex(\r\n (column) => column.fixed === \"right\",\r\n );\r\n return firstRightFixedIndex === -1 ? columns.length : firstRightFixedIndex;\r\n}\r\n\r\n","import type { ListTableOptions } from \"../../schema/table-options\";\r\nimport { ensureColumnKeysInPlace, resolveColumnKey } from \"../../domain/columns/column-key\";\r\nimport { getFixedSectionWidths, setColumnFixed } from \"../../domain/columns/column-runtime\";\r\nimport type { HeaderContextMenuColumnItem } from \"../../ui/types\";\r\nimport type { ListTableColumn } from \"../../schema/column\";\r\n\r\nexport interface CollapsedHeaderColumnMarker {\r\n columnKey: string;\r\n align: \"left\" | \"right\";\r\n rangeStart: number;\r\n rangeEnd: number;\r\n}\r\n\r\ntype MutableColumnNode<RecordType> = ListTableColumn<RecordType>;\r\n\r\n/**\r\n * 克隆列配置,保留 render / getter 等函数引用。\r\n */\r\nexport function cloneColumns<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n): ListTableColumn<RecordType>[] {\r\n return columns.map((column) => ({\r\n ...column,\r\n key: resolveColumnKey(column),\r\n children: column.children ? cloneColumns(column.children) : undefined,\r\n }));\r\n}\r\n\r\n/**\r\n * 使用源列树替换目标列树,保持外层数组引用稳定。\r\n */\r\nexport function replaceColumns<RecordType>(\r\n target: ListTableColumn<RecordType>[],\r\n source: ListTableColumn<RecordType>[],\r\n) {\r\n target.splice(0, target.length, ...cloneColumns(source));\r\n}\r\n\r\n/**\r\n * 构建表头设置菜单的列树。\r\n */\r\nexport function buildHeaderSettingsItems<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n): HeaderContextMenuColumnItem[] {\r\n ensureColumnKeysInPlace(columns);\r\n const totalVisibleLeafCount = countVisibleLeafColumns(columns);\r\n\r\n return columns.map((column) =>\r\n buildHeaderSettingsItem(column, totalVisibleLeafCount, false),\r\n );\r\n}\r\n\r\n/**\r\n * 切换指定列及其子列的显示状态。\r\n */\r\nexport function setHeaderColumnVisible<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n columnKey: string,\r\n visible: boolean,\r\n) {\r\n if (!visible) {\r\n const targetLeafCount = getColumnLeafCount(columns, columnKey, true);\r\n if (targetLeafCount >= countVisibleLeafColumns(columns)) {\r\n return false;\r\n }\r\n }\r\n\r\n const updated = setColumnVisible(columns, columnKey, visible);\r\n if (updated) {\r\n normalizeHiddenState(columns);\r\n }\r\n return updated;\r\n}\r\n\r\n/**\r\n * 应用固定列方向并返回新的横向滚动位置。\r\n */\r\nexport function applyHeaderFixedDirection<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n columnKey: string;\r\n direction: \"left\" | \"right\" | \"none\";\r\n currentScrollLeft: number;\r\n /**\r\n * 初始列配置,用于取消固定时恢复到原始兄弟顺序。\r\n */\r\n initialColumns?: ListTableOptions<RecordType>[\"columns\"];\r\n}) {\r\n const previousFixedWidths = getFixedSectionWidths(params.options.columns);\r\n setColumnFixed(\r\n params.options.columns,\r\n params.columnKey,\r\n params.direction,\r\n params.initialColumns,\r\n );\r\n const nextFixedWidths = getFixedSectionWidths(params.options.columns);\r\n const fixedWidthLeftDelta =\r\n nextFixedWidths.left - previousFixedWidths.left;\r\n\r\n return Math.max(params.currentScrollLeft + fixedWidthLeftDelta, 0);\r\n}\r\n\r\n/**\r\n * 重置表头列树配置。\r\n */\r\nexport function resetHeaderColumnsConfig<RecordType>(params: {\r\n columns: ListTableOptions<RecordType>[\"columns\"];\r\n initialColumns: ListTableOptions<RecordType>[\"columns\"];\r\n initialStretchColumns: ListTableOptions<RecordType>[\"stretchColumns\"];\r\n currentScrollTop: number;\r\n}) {\r\n replaceColumns(params.columns, params.initialColumns);\r\n return {\r\n stretchColumns: params.initialStretchColumns,\r\n scroll: {\r\n left: 0,\r\n top: params.currentScrollTop,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 切换列显隐并返回最新菜单项。\r\n */\r\nexport function toggleHeaderColumnVisibility<RecordType>(params: {\r\n columns: ListTableOptions<RecordType>[\"columns\"];\r\n columnKey: string;\r\n visible: boolean;\r\n selectedHeaderKey: string | null;\r\n selectedHeaderRect: { x: number; y: number; width: number; height: number } | null;\r\n}) {\r\n const updated = setHeaderColumnVisible(\r\n params.columns,\r\n params.columnKey,\r\n params.visible,\r\n );\r\n if (!updated) {\r\n return null;\r\n }\r\n\r\n return {\r\n selectedHeaderKey:\r\n !params.visible && params.selectedHeaderKey === params.columnKey\r\n ? null\r\n : params.selectedHeaderKey,\r\n selectedHeaderRect:\r\n !params.visible && params.selectedHeaderKey === params.columnKey\r\n ? null\r\n : params.selectedHeaderRect,\r\n menuItems: buildHeaderSettingsItems(params.columns),\r\n };\r\n}\r\n\r\nexport function resolveCollapsedHeaderColumnMarkers<RecordType>(params: {\r\n columns: ListTableColumn<RecordType>[];\r\n visibleColumnKeys: string[];\r\n}) {\r\n ensureColumnKeysInPlace(params.columns);\r\n const allLeafKeys = collectLeafColumnKeys(params.columns);\r\n const visibleKeySet = new Set(params.visibleColumnKeys);\r\n const visibleLeafKeys = allLeafKeys.filter((key) => visibleKeySet.has(key));\r\n if (visibleLeafKeys.length === 0) {\r\n return [] as CollapsedHeaderColumnMarker[];\r\n }\r\n\r\n const leafIndexMap = new Map(\r\n allLeafKeys.map((key, index) => [key, index]),\r\n );\r\n const markers: CollapsedHeaderColumnMarker[] = [];\r\n let previousVisibleIndex = -1;\r\n\r\n visibleLeafKeys.forEach((columnKey) => {\r\n const visibleIndex = leafIndexMap.get(columnKey);\r\n if (typeof visibleIndex !== \"number\") {\r\n return;\r\n }\r\n if (visibleIndex > previousVisibleIndex + 1) {\r\n const rangeStart = previousVisibleIndex + 1;\r\n const rangeEnd = visibleIndex - 1;\r\n const previousVisibleKey =\r\n previousVisibleIndex >= 0 ? allLeafKeys[previousVisibleIndex] : null;\r\n if (previousVisibleKey) {\r\n markers.push({\r\n columnKey: previousVisibleKey,\r\n align: \"right\",\r\n rangeStart,\r\n rangeEnd,\r\n });\r\n }\r\n markers.push({\r\n columnKey,\r\n align: \"left\",\r\n rangeStart,\r\n rangeEnd,\r\n });\r\n }\r\n previousVisibleIndex = visibleIndex;\r\n });\r\n\r\n const lastVisibleKey = visibleLeafKeys[visibleLeafKeys.length - 1];\r\n const lastVisibleIndex =\r\n lastVisibleKey == null ? -1 : (leafIndexMap.get(lastVisibleKey) ?? -1);\r\n if (lastVisibleKey && lastVisibleIndex < allLeafKeys.length - 1) {\r\n markers.push({\r\n columnKey: lastVisibleKey,\r\n align: \"right\",\r\n rangeStart: lastVisibleIndex + 1,\r\n rangeEnd: allLeafKeys.length - 1,\r\n });\r\n }\r\n\r\n return markers;\r\n}\r\n\r\nexport function getHeaderLeafColumnKeys<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n) {\r\n ensureColumnKeysInPlace(columns);\r\n return collectLeafColumnKeys(columns);\r\n}\r\n\r\nexport function restoreHeaderColumnRange<RecordType>(params: {\r\n columns: ListTableColumn<RecordType>[];\r\n rangeStart: number;\r\n rangeEnd: number;\r\n}) {\r\n ensureColumnKeysInPlace(params.columns);\r\n const leafColumns = collectLeafColumns(params.columns);\r\n let updated = false;\r\n\r\n for (\r\n let index = params.rangeStart;\r\n index <= params.rangeEnd && index < leafColumns.length;\r\n index += 1\r\n ) {\r\n const column = leafColumns[index];\r\n if (!column) {\r\n continue;\r\n }\r\n updated =\r\n setHeaderColumnVisible(params.columns, resolveColumnKey(column), true) ||\r\n updated;\r\n }\r\n\r\n return updated;\r\n}\r\n\r\n/**\r\n * 恢复所有隐藏列,并保留列宽、固定位置等其他列配置。\r\n */\r\nexport function restoreAllHiddenHeaderColumns<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n) {\r\n ensureColumnKeysInPlace(columns);\r\n let updated = false;\r\n collectLeafColumns(columns).forEach((column) => {\r\n updated =\r\n setHeaderColumnVisible(columns, resolveColumnKey(column), true) || updated;\r\n });\r\n return updated;\r\n}\r\n\r\nfunction buildHeaderSettingsItem<RecordType>(\r\n column: ListTableColumn<RecordType>,\r\n totalVisibleLeafCount: number,\r\n parentHidden: boolean,\r\n): HeaderContextMenuColumnItem {\r\n const hidden = parentHidden || !!column.hidden;\r\n const children = column.children?.map((child) =>\r\n buildHeaderSettingsItem(child, totalVisibleLeafCount, hidden),\r\n );\r\n const leafCount = countLeafColumns([column]);\r\n const visibleLeafCount = hidden ? 0 : countVisibleLeafColumns([column]);\r\n const checked = leafCount > 0 && visibleLeafCount === leafCount;\r\n const indeterminate = visibleLeafCount > 0 && visibleLeafCount < leafCount;\r\n const disabled = visibleLeafCount > 0 && visibleLeafCount >= totalVisibleLeafCount;\r\n\r\n return {\r\n key: resolveColumnKey(column),\r\n title: String(column.title ?? resolveColumnKey(column)),\r\n checked,\r\n indeterminate,\r\n disabled,\r\n children,\r\n };\r\n}\r\n\r\nfunction setColumnVisible<RecordType>(\r\n columns: MutableColumnNode<RecordType>[],\r\n columnKey: string,\r\n visible: boolean,\r\n ancestors: MutableColumnNode<RecordType>[] = [],\r\n): boolean {\r\n for (const column of columns) {\r\n if (column.key === columnKey) {\r\n ancestors.forEach((item) => {\r\n item.hidden = false;\r\n });\r\n setSubtreeVisible(column, visible);\r\n return true;\r\n }\r\n\r\n if (column.children?.length) {\r\n const updated = setColumnVisible(\r\n column.children,\r\n columnKey,\r\n visible,\r\n [...ancestors, column],\r\n );\r\n if (updated) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction setSubtreeVisible<RecordType>(\r\n column: MutableColumnNode<RecordType>,\r\n visible: boolean,\r\n) {\r\n column.hidden = !visible;\r\n column.children?.forEach((child) => {\r\n setSubtreeVisible(child, visible);\r\n });\r\n}\r\n\r\nfunction normalizeHiddenState<RecordType>(\r\n columns: MutableColumnNode<RecordType>[],\r\n) {\r\n columns.forEach((column) => {\r\n if (column.children?.length) {\r\n normalizeHiddenState(column.children);\r\n column.hidden = column.children.every((child) => !!child.hidden);\r\n }\r\n });\r\n}\r\n\r\nfunction countLeafColumns<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n) {\r\n let count = 0;\r\n columns.forEach((column) => {\r\n if (column.children?.length) {\r\n count += countLeafColumns(column.children);\r\n } else {\r\n count += 1;\r\n }\r\n });\r\n return count;\r\n}\r\n\r\nfunction countVisibleLeafColumns<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n) {\r\n let count = 0;\r\n columns.forEach((column) => {\r\n if (column.hidden) {\r\n return;\r\n }\r\n if (column.children?.length) {\r\n count += countVisibleLeafColumns(column.children);\r\n } else {\r\n count += 1;\r\n }\r\n });\r\n return count;\r\n}\r\n\r\nfunction getColumnLeafCount<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n columnKey: string,\r\n visibleOnly: boolean,\r\n): number {\r\n for (const column of columns) {\r\n if (column.key === columnKey) {\r\n return visibleOnly\r\n ? countVisibleLeafColumns([column])\r\n : countLeafColumns([column]);\r\n }\r\n if (column.children?.length) {\r\n const count = getColumnLeafCount(column.children, columnKey, visibleOnly);\r\n if (count > 0) {\r\n return count;\r\n }\r\n }\r\n }\r\n return 0;\r\n}\r\n\r\nfunction collectLeafColumnKeys<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n) {\r\n return collectLeafColumns(columns).map((column) => resolveColumnKey(column));\r\n}\r\n\r\nfunction collectLeafColumns<RecordType>(\r\n columns: ListTableColumn<RecordType>[],\r\n): ListTableColumn<RecordType>[] {\r\n const result: ListTableColumn<RecordType>[] = [];\r\n columns.forEach((column) => {\r\n if (column.children?.length) {\r\n result.push(...collectLeafColumns(column.children));\r\n return;\r\n }\r\n result.push(column);\r\n });\r\n return result;\r\n}\r\n","export const DEFAULT_ROW_HEIGHT = 40;\r\nexport const DEFAULT_HEADER_ROW_HEIGHT = 42;\r\nexport const HORIZONTAL_SCROLL_STEP = 120;\r\nexport const DEFAULT_SUMMARY_ROW_HEIGHT = 40;\r\nexport const DEFAULT_PAGINATION_PAGE_SIZE = 10;\r\nexport const FALLBACK_TABLE_WIDTH = 320;\r\nexport const FALLBACK_TABLE_HEIGHT = 240;\r\nexport const BODY_TOOLTIP_DELAY = 1000;\r\n/** 外层 contentLayer 的 1px 边框占用(上下/左右各 1)。 */\r\nexport const TABLE_CONTENT_BORDER_SIZE = 2;\r\n/** 内容刚好贴合时,忽略 1px 内的浮点/布局误差,避免误出滚动条。 */\r\nconst SCROLL_OVERFLOW_EPSILON = 1;\r\n\r\n/**\r\n * 解析表格尺寸配置。\r\n */\r\nexport function resolveTableSize(\r\n value: number | string | undefined,\r\n fallback: string,\r\n) {\r\n if (value == null) {\r\n return fallback;\r\n }\r\n\r\n return typeof value === \"number\" ? `${value}px` : value;\r\n}\r\n\r\n/**\r\n * 当表格内容高度小于可用容器高度时,返回应收缩到的高度;否则返回 null 保持容器高度。\r\n */\r\nexport function resolveFittedTableHeight(params: {\r\n availableHeight: number;\r\n contentHeight: number;\r\n}): number | null {\r\n const availableHeight = Math.max(params.availableHeight, 0);\r\n const contentHeight = Math.max(Math.ceil(params.contentHeight), 0);\r\n if (contentHeight <= 0 || availableHeight <= 0) {\r\n return null;\r\n }\r\n // 内容不超过可用高度(含 1px 误差)时,按内容高度收缩,避免空白并去掉多余滚动空间。\r\n if (contentHeight <= availableHeight + SCROLL_OVERFLOW_EPSILON) {\r\n return contentHeight;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 计算表格内容总高度(表头 + 冻结区 + 滚动内容 + 汇总)。\r\n */\r\nexport function resolveTableContentHeight(params: {\r\n headerHeight: number;\r\n topFrozenHeight: number;\r\n totalBodyHeight: number;\r\n bottomFrozenHeight: number;\r\n summaryHeight: number;\r\n}): number {\r\n return (\r\n Math.max(params.headerHeight, 0) +\r\n Math.max(params.topFrozenHeight, 0) +\r\n Math.max(params.totalBodyHeight, 0) +\r\n Math.max(params.bottomFrozenHeight, 0) +\r\n Math.max(params.summaryHeight, 0)\r\n );\r\n}\r\n","import type { ListTableTheme } from \"../../schema/style\";\r\n\r\nexport function applyThemeVariables(\r\n wrapper: HTMLDivElement,\r\n theme: ListTableTheme,\r\n) {\r\n wrapper.style.setProperty(\"--list-table-font-family\", theme.fontFamily);\r\n wrapper.style.setProperty(\"--list-table-popover-bg\", \"#ffffff\");\r\n wrapper.style.setProperty(\"--list-table-popover-input-bg\", \"#ffffff\");\r\n wrapper.style.setProperty(\"--list-table-popover-section-bg\", \"#fafafa\");\r\n wrapper.style.setProperty(\"--list-table-popover-border-color\", theme.borderColor);\r\n wrapper.style.setProperty(\"--list-table-popover-text-color\", theme.textColor);\r\n wrapper.style.setProperty(\"--list-table-popover-title-color\", theme.headerTextColor);\r\n wrapper.style.setProperty(\"--list-table-popover-muted-color\", theme.mutedTextColor);\r\n wrapper.style.setProperty(\"--list-table-popover-primary-color\", \"#1677ff\");\r\n wrapper.style.setProperty(\r\n \"--list-table-popover-shadow\",\r\n \"0 6px 16px rgba(0, 0, 0, 0.12)\",\r\n );\r\n wrapper.style.setProperty(\"--list-table-tooltip-text-color\", \"#ffffff\");\r\n wrapper.style.setProperty(\r\n \"--list-table-tooltip-bg\",\r\n \"rgba(30, 40, 60, 0.9)\",\r\n );\r\n}\r\n","import type { Rect } from \"../debug/debug-snapshot\";\nimport type { ListTableTheme } from \"../schema/style\";\nimport { resolveTableSize } from \"../domain/constants\";\nimport { applyThemeVariables } from \"../shared/theme/theme\";\n\nconst RESIZE_RENDER_SETTLE_DELAY = 240;\n\nexport interface ListTableDomHostNodes {\n wrapperElement: HTMLDivElement;\n contentLayerElement: HTMLDivElement;\n canvasHostElement: HTMLDivElement;\n canvasElement: HTMLCanvasElement;\n paginationElement: HTMLDivElement;\n}\n\n/**\n * 列表表格宿主 DOM 适配器。\n */\nexport class ListTableDomHost {\n private nodes: ListTableDomHostNodes | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private resizeDebounceTimer: number | null = null;\n private configuredSize: {\n width: number | string | undefined;\n height: number | string | undefined;\n } = { width: undefined, height: undefined };\n private fittedHeight: number | null = null;\n private contentZoom = 1;\n\n mount(\n container: HTMLElement,\n theme: ListTableTheme,\n size: {\n width: number | string | undefined;\n height: number | string | undefined;\n },\n ) {\n if (this.nodes) {\n return this.nodes;\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.style.position = \"relative\";\n wrapper.style.display = \"flex\";\n wrapper.style.flexDirection = \"column\";\n wrapper.style.minWidth = \"0\";\n wrapper.style.boxSizing = \"border-box\";\n wrapper.style.overflow = \"visible\";\n\n const contentLayer = document.createElement(\"div\");\n contentLayer.style.position = \"relative\";\n contentLayer.style.display = \"flex\";\n contentLayer.style.flexDirection = \"column\";\n contentLayer.style.flex = \"1 1 auto\";\n contentLayer.style.minWidth = \"0\";\n contentLayer.style.width = \"100%\";\n contentLayer.style.boxSizing = \"border-box\";\n contentLayer.style.minHeight = \"0\";\n contentLayer.style.overflow = \"hidden\";\n\n const canvasHost = document.createElement(\"div\");\n canvasHost.style.position = \"relative\";\n canvasHost.style.flex = \"1 1 auto\";\n canvasHost.style.minWidth = \"0\";\n canvasHost.style.width = \"100%\";\n canvasHost.style.boxSizing = \"border-box\";\n canvasHost.style.minHeight = \"0\";\n canvasHost.style.overflow = \"hidden\";\n\n const canvas = document.createElement(\"canvas\");\n canvas.tabIndex = 0;\n canvas.style.position = \"absolute\";\n canvas.style.top = \"0\";\n canvas.style.left = \"0\";\n canvas.style.display = \"block\";\n canvas.style.outline = \"none\";\n // 初始尺寸由 renderer.resize 写入精确 px,避免 100% 拉伸发糊。\n canvas.style.width = \"0px\";\n canvas.style.height = \"0px\";\n\n const paginationElement = document.createElement(\"div\");\n paginationElement.style.display = \"none\";\n paginationElement.style.flex = \"0 0 auto\";\n paginationElement.style.padding = \"12px 16px\";\n\n canvasHost.appendChild(canvas);\n contentLayer.appendChild(canvasHost);\n contentLayer.appendChild(paginationElement);\n wrapper.appendChild(contentLayer);\n container.appendChild(wrapper);\n\n this.nodes = {\n wrapperElement: wrapper,\n contentLayerElement: contentLayer,\n canvasHostElement: canvasHost,\n canvasElement: canvas,\n paginationElement,\n };\n this.applyTheme(theme, size);\n\n return this.nodes;\n }\n\n applyTheme(\n theme: ListTableTheme,\n size: {\n width: number | string | undefined;\n height: number | string | undefined;\n },\n ) {\n if (!this.nodes) {\n return;\n }\n\n this.configuredSize = { width: size.width, height: size.height };\n applyThemeVariables(this.nodes.wrapperElement, theme);\n this.nodes.wrapperElement.style.width = resolveTableSize(\n this.configuredSize.width,\n \"100%\",\n );\n this.applyWrapperHeight();\n this.nodes.contentLayerElement.style.border = `1px solid ${theme.borderColor}`;\n this.nodes.contentLayerElement.style.borderRadius = \"12px\";\n this.nodes.contentLayerElement.style.background = theme.backgroundColor;\n this.nodes.paginationElement.style.borderTop = `1px solid ${theme.borderColor}`;\n this.nodes.paginationElement.style.background = theme.backgroundColor;\n }\n\n /**\n * 临时恢复为配置高度,便于测量父容器真实可用高度。\n */\n prepareAvailableHeightMeasure() {\n if (!this.nodes) {\n return;\n }\n this.nodes.wrapperElement.style.height = resolveTableSize(\n this.configuredSize.height,\n \"100%\",\n );\n }\n\n /**\n * 内容高度小于容器时收缩;否则恢复配置高度。\n */\n setFittedHeight(height: number | null) {\n const next =\n typeof height === \"number\" && Number.isFinite(height) && height > 0\n ? Math.ceil(height)\n : null;\n if (this.fittedHeight === next) {\n return false;\n }\n this.fittedHeight = next;\n this.applyWrapperHeight();\n return true;\n }\n\n private applyWrapperHeight() {\n if (!this.nodes) {\n return;\n }\n if (this.fittedHeight != null) {\n this.nodes.wrapperElement.style.height = `${this.fittedHeight}px`;\n return;\n }\n this.nodes.wrapperElement.style.height = resolveTableSize(\n this.configuredSize.height,\n \"100%\",\n );\n }\n\n observeResize(listener: () => void) {\n if (!this.nodes?.wrapperElement) {\n return;\n }\n\n this.disconnectResizeObserver();\n this.resizeObserver = new ResizeObserver(() => {\n if (this.resizeDebounceTimer != null) {\n window.clearTimeout(this.resizeDebounceTimer);\n }\n this.resizeDebounceTimer = window.setTimeout(() => {\n this.resizeDebounceTimer = null;\n listener();\n }, RESIZE_RENDER_SETTLE_DELAY);\n });\n // 优先观察挂载容器,确保父级高度变化后仍能重新测量可用高度。\n const observeTarget =\n this.nodes.wrapperElement.parentElement ?? this.nodes.wrapperElement;\n this.resizeObserver.observe(observeTarget);\n // 同时观察自身,捕获宽度变化(父级高度不变时也可能变宽/变窄)。\n if (observeTarget !== this.nodes.wrapperElement) {\n this.resizeObserver.observe(this.nodes.wrapperElement);\n }\n }\n\n disconnectResizeObserver() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n if (this.resizeDebounceTimer != null) {\n window.clearTimeout(this.resizeDebounceTimer);\n this.resizeDebounceTimer = null;\n }\n }\n\n getNodes() {\n return this.nodes;\n }\n\n toViewportPoint(x: number, y: number) {\n const hostRect = this.nodes?.canvasHostElement.getBoundingClientRect();\n if (!hostRect) {\n return { x, y };\n }\n\n return {\n x: hostRect.left + x * this.contentZoom,\n y: hostRect.top + y * this.contentZoom,\n };\n }\n\n toViewportRect(rect: Rect): Rect {\n const point = this.toViewportPoint(rect.x, rect.y);\n return {\n ...rect,\n x: point.x,\n y: point.y,\n width: rect.width * this.contentZoom,\n height: rect.height * this.contentZoom,\n };\n }\n\n getCanvasViewportRect(): Rect | null {\n const hostRect = this.nodes?.canvasHostElement.getBoundingClientRect();\n if (!hostRect) {\n return null;\n }\n\n return {\n x: hostRect.left,\n y: hostRect.top,\n width: hostRect.width,\n height: hostRect.height,\n };\n }\n\n getCanvasHostElement() {\n return this.nodes?.canvasHostElement ?? null;\n }\n\n /**\n * 设置表格内容缩放(1 = 100%)。\n * 仅保存比例供坐标转换;实际缩放在 Canvas 绘制变换中完成,避免 CSS scale 发糊。\n */\n setContentZoom(zoom: number) {\n const next =\n typeof zoom === \"number\" && Number.isFinite(zoom) && zoom > 0 ? zoom : 1;\n if (this.contentZoom === next) {\n return;\n }\n this.contentZoom = next;\n }\n\n getContentZoom() {\n return this.contentZoom;\n }\n\n destroy() {\n this.disconnectResizeObserver();\n this.nodes?.wrapperElement.remove();\n this.nodes = null;\n this.contentZoom = 1;\n }\n}\n","/**\r\n * 将浏览器坐标转换为 canvas CSS 坐标。\r\n *\r\n * @param canvas 画布节点。\r\n * @param clientX 浏览器横坐标。\r\n * @param clientY 浏览器纵坐标。\r\n * @returns CSS 坐标。\r\n */\r\nexport function getCanvasPointerPosition(\r\n canvas: HTMLCanvasElement,\r\n clientX: number,\r\n clientY: number,\r\n) {\r\n const rect = canvas.getBoundingClientRect();\r\n\r\n return {\r\n x: clientX - rect.left,\r\n y: clientY - rect.top,\r\n };\r\n}\r\n","import { getCanvasPointerPosition } from \"../interaction/pointer\";\n\nexport interface ListTableCanvasEventHandlers {\n keydown: (event: KeyboardEvent) => void;\n wheel: (event: WheelEvent) => void;\n mousemove: (event: MouseEvent) => void;\n mouseleave: (event: MouseEvent) => void;\n click: (event: MouseEvent) => void;\n dblclick: (event: MouseEvent) => void;\n mousedown: (event: MouseEvent) => void;\n contextmenu: (event: MouseEvent) => void;\n}\n\n/**\n * 画布事件宿主适配器。\n */\nexport class ListTableCanvasHost {\n private canvasElement: HTMLCanvasElement | null = null;\n private canvasHandlers: ListTableCanvasEventHandlers | null = null;\n private windowMoveHandler: ((event: MouseEvent) => void) | null = null;\n private windowUpHandler: ((event: MouseEvent) => void) | null = null;\n private contentZoom = 1;\n\n mount(canvasElement: HTMLCanvasElement) {\n this.canvasElement = canvasElement;\n }\n\n getCanvasElement() {\n return this.canvasElement;\n }\n\n bindCanvasEvents(handlers: ListTableCanvasEventHandlers) {\n if (!this.canvasElement) {\n return;\n }\n\n this.unbindCanvasEvents();\n this.canvasHandlers = handlers;\n this.canvasElement.addEventListener(\"keydown\", handlers.keydown);\n this.canvasElement.addEventListener(\"wheel\", handlers.wheel, {\n passive: false,\n });\n this.canvasElement.addEventListener(\"mousemove\", handlers.mousemove);\n this.canvasElement.addEventListener(\"mouseleave\", handlers.mouseleave);\n this.canvasElement.addEventListener(\"click\", handlers.click);\n this.canvasElement.addEventListener(\"dblclick\", handlers.dblclick);\n this.canvasElement.addEventListener(\"mousedown\", handlers.mousedown);\n this.canvasElement.addEventListener(\"contextmenu\", handlers.contextmenu);\n }\n\n unbindCanvasEvents() {\n if (!this.canvasElement || !this.canvasHandlers) {\n return;\n }\n\n this.canvasElement.removeEventListener(\"wheel\", this.canvasHandlers.wheel);\n this.canvasElement.removeEventListener(\n \"keydown\",\n this.canvasHandlers.keydown,\n );\n this.canvasElement.removeEventListener(\n \"mousemove\",\n this.canvasHandlers.mousemove,\n );\n this.canvasElement.removeEventListener(\n \"mouseleave\",\n this.canvasHandlers.mouseleave,\n );\n this.canvasElement.removeEventListener(\"click\", this.canvasHandlers.click);\n this.canvasElement.removeEventListener(\n \"dblclick\",\n this.canvasHandlers.dblclick,\n );\n this.canvasElement.removeEventListener(\n \"mousedown\",\n this.canvasHandlers.mousedown,\n );\n this.canvasElement.removeEventListener(\n \"contextmenu\",\n this.canvasHandlers.contextmenu,\n );\n this.canvasHandlers = null;\n }\n\n bindWindowDragEvents(\n moveHandler: (event: MouseEvent) => void,\n upHandler: (event: MouseEvent) => void,\n ) {\n this.unbindWindowDragEvents();\n this.windowMoveHandler = moveHandler;\n this.windowUpHandler = upHandler;\n window.addEventListener(\"mousemove\", moveHandler);\n window.addEventListener(\"mouseup\", upHandler);\n }\n\n unbindWindowDragEvents() {\n if (this.windowMoveHandler) {\n window.removeEventListener(\"mousemove\", this.windowMoveHandler);\n this.windowMoveHandler = null;\n }\n if (this.windowUpHandler) {\n window.removeEventListener(\"mouseup\", this.windowUpHandler);\n this.windowUpHandler = null;\n }\n }\n\n getPointerPosition(clientX: number, clientY: number) {\n if (!this.canvasElement) {\n return {\n x: clientX,\n y: clientY,\n };\n }\n\n const point = getCanvasPointerPosition(\n this.canvasElement,\n clientX,\n clientY,\n );\n if (this.contentZoom === 1) {\n return point;\n }\n // 绘制使用 contentZoom 变换:1 布局单位 = contentZoom CSS 像素。\n return {\n x: point.x / this.contentZoom,\n y: point.y / this.contentZoom,\n };\n }\n\n setCursor(cursor: string) {\n if (!this.canvasElement) {\n return;\n }\n\n if (this.canvasElement.style.cursor === cursor) {\n return;\n }\n\n this.canvasElement.style.cursor = cursor;\n }\n\n /**\n * 同步内容缩放,供指针坐标还原使用。\n */\n setContentZoom(zoom: number) {\n this.contentZoom =\n typeof zoom === \"number\" && Number.isFinite(zoom) && zoom > 0 ? zoom : 1;\n }\n\n destroy() {\n this.unbindCanvasEvents();\n this.unbindWindowDragEvents();\n this.canvasElement = null;\n this.contentZoom = 1;\n }\n}\n","import type {\r\n ListTableFilterPanelAdapter,\r\n ListTableFixedPopupAdapter,\r\n ListTableHeaderContextMenuAdapter,\r\n ListTablePaginationAdapter,\r\n ListTableTooltipAdapter,\r\n} from \"../ui/types\";\r\n\r\n/**\r\n * DOM 浮层与外部组件统一协调器。\r\n */\r\nexport class ListTableComponentPortal {\r\n readonly pagination: ListTablePaginationAdapter = createNoopPaginationLayer();\r\n readonly tooltip: ListTableTooltipAdapter = createNoopTooltipLayer();\r\n readonly filterPanel: ListTableFilterPanelAdapter =\r\n createNoopFilterPanelLayer();\r\n readonly fixedPopup: ListTableFixedPopupAdapter = createNoopFixedPopupLayer();\r\n readonly headerContextMenu: ListTableHeaderContextMenuAdapter =\r\n createNoopHeaderContextMenuLayer();\r\n\r\n mount(_wrapperElement: HTMLElement) {\r\n return undefined;\r\n }\r\n\r\n hideFloatingLayers() {\r\n this.filterPanel.hide();\r\n this.fixedPopup.hide();\r\n this.headerContextMenu.hide();\r\n }\r\n\r\n destroy() {\r\n this.pagination.destroy();\r\n }\r\n}\r\n\r\nfunction createNoopVisibilityState() {\r\n let visible = false;\r\n\r\n return {\r\n show() {\r\n visible = true;\r\n },\r\n hide() {\r\n visible = false;\r\n },\r\n isVisible() {\r\n return visible;\r\n },\r\n };\r\n}\r\n\r\nfunction createNoopTooltipLayer(): ListTableTooltipAdapter {\r\n const state = createNoopVisibilityState();\r\n return {\r\n mount: () => undefined,\r\n show: (_x, _y, _content, _variant) => {\r\n state.show();\r\n },\r\n hide: () => {\r\n state.hide();\r\n },\r\n destroy: () => undefined,\r\n };\r\n}\r\n\r\nfunction createNoopFilterPanelLayer(): ListTableFilterPanelAdapter {\r\n const state = createNoopVisibilityState();\r\n return {\r\n mount: () => undefined,\r\n show: (_config) => {\r\n state.show();\r\n },\r\n hide: () => {\r\n state.hide();\r\n },\r\n isVisible: () => state.isVisible(),\r\n destroy: () => undefined,\r\n };\r\n}\r\n\r\nfunction createNoopFixedPopupLayer(): ListTableFixedPopupAdapter {\r\n const state = createNoopVisibilityState();\r\n return {\r\n mount: () => undefined,\r\n show: (_config) => {\r\n state.show();\r\n },\r\n hide: () => {\r\n state.hide();\r\n },\r\n isVisible: () => state.isVisible(),\r\n destroy: () => undefined,\r\n };\r\n}\r\n\r\nfunction createNoopHeaderContextMenuLayer(): ListTableHeaderContextMenuAdapter {\r\n const state = createNoopVisibilityState();\r\n return {\r\n mount: () => undefined,\r\n show: (_config) => {\r\n state.show();\r\n },\r\n hide: () => {\r\n state.hide();\r\n },\r\n isVisible: () => state.isVisible(),\r\n updateColumns: () => undefined,\r\n destroy: () => undefined,\r\n };\r\n}\r\n\r\nfunction createNoopPaginationLayer(): ListTablePaginationAdapter {\r\n return {\r\n mount: () => undefined,\r\n update: () => undefined,\r\n destroy: () => undefined,\r\n };\r\n}\r\n","/**\r\n * 判断两个行 key 集合是否包含相同元素(忽略顺序)。\r\n */\r\nexport function areSameRowKeySet(\r\n left: Array<string | number>,\r\n right: Array<string | number>,\r\n) {\r\n if (left.length !== right.length) {\r\n return false;\r\n }\r\n\r\n const rightKeys = new Set(right);\r\n return left.every((key) => rightKeys.has(key));\r\n}\r\n","import type { ListTableSelectionState } from \"../schema/state\";\n\nexport type ListTableCellNavigateDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\n/**\n * 创建空选中态。\n *\n * @returns 初始选中状态。\n */\nexport function createEmptySelection(): ListTableSelectionState {\n return {\n rowIndex: null,\n columnKey: null,\n };\n}\n\n/**\n * 解析活动单元格按方向键移动后的相邻位置。\n */\nexport function resolveAdjacentCellSelection(params: {\n selection: ListTableSelectionState;\n rowCount: number;\n columnKeys: string[];\n direction: ListTableCellNavigateDirection;\n}): { rowIndex: number; columnKey: string } | null {\n const { selection, rowCount, columnKeys, direction } = params;\n if (\n selection.rowIndex == null ||\n selection.columnKey == null ||\n selection.rowIndex < 0 ||\n selection.rowIndex >= rowCount\n ) {\n return null;\n }\n\n const columnIndex = columnKeys.indexOf(selection.columnKey);\n if (columnIndex < 0) {\n return null;\n }\n\n if (direction === \"up\" || direction === \"down\") {\n const flatIndex = columnIndex * rowCount + selection.rowIndex;\n const nextFlatIndex = flatIndex + (direction === \"up\" ? -1 : 1);\n const cellCount = rowCount * columnKeys.length;\n if (nextFlatIndex < 0 || nextFlatIndex >= cellCount) {\n return null;\n }\n\n return {\n rowIndex: nextFlatIndex % rowCount,\n columnKey: columnKeys[Math.floor(nextFlatIndex / rowCount)],\n };\n }\n\n const columnOffset = direction === \"left\" ? -1 : 1;\n const nextColumnIndex = columnIndex + columnOffset;\n if (nextColumnIndex < 0 || nextColumnIndex >= columnKeys.length) {\n return null;\n }\n\n return {\n rowIndex: selection.rowIndex,\n columnKey: columnKeys[nextColumnIndex],\n };\n}\n\n/**\n * 解析活动单元格按 Tab 键移动后的位置,行尾与行首会跨行换列。\n */\nexport function resolveTabCellSelection(params: {\n selection: ListTableSelectionState;\n rowCount: number;\n columnKeys: string[];\n reverse?: boolean;\n}): { rowIndex: number; columnKey: string } | null {\n const { selection, rowCount, columnKeys, reverse = false } = params;\n if (\n selection.rowIndex == null ||\n selection.columnKey == null ||\n selection.rowIndex < 0 ||\n selection.rowIndex >= rowCount ||\n columnKeys.length === 0\n ) {\n return null;\n }\n\n const columnIndex = columnKeys.indexOf(selection.columnKey);\n if (columnIndex < 0) {\n return null;\n }\n\n const flatIndex = selection.rowIndex * columnKeys.length + columnIndex;\n const nextFlatIndex = flatIndex + (reverse ? -1 : 1);\n const cellCount = rowCount * columnKeys.length;\n if (nextFlatIndex < 0 || nextFlatIndex >= cellCount) {\n return null;\n }\n\n return {\n rowIndex: Math.floor(nextFlatIndex / columnKeys.length),\n columnKey: columnKeys[nextFlatIndex % columnKeys.length],\n };\n}\n","/**\r\n * 单元格边框定义。\r\n */\r\nexport interface ListTableBorderStyle {\r\n color?: string;\r\n width?: number;\r\n}\r\n\r\n/**\r\n * 单元格样式定义。\r\n */\r\nexport interface ListTableCellStyle {\r\n backgroundColor?: string;\r\n color?: string;\r\n fontSize?: number;\r\n fontWeight?: string;\r\n textAlign?: CanvasTextAlign;\r\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\r\n paddingInline?: number;\r\n paddingBlock?: number;\r\n borderColor?: string;\r\n borderWidth?: number;\r\n}\r\n\r\n/**\r\n * 主题定义。\r\n */\r\nexport interface ListTableTheme {\r\n backgroundColor: string;\r\n stripedBackgroundColor: string;\r\n borderColor: string;\r\n textColor: string;\r\n mutedTextColor: string;\r\n headerBackgroundColor: string;\r\n headerTextColor: string;\r\n fixedShadowColor: string;\r\n frozenRowBackgroundColor: string;\r\n hoverBackgroundColor: string;\r\n selectionBackgroundColor: string;\r\n emptyBackgroundColor: string;\r\n emptyTextColor: string;\r\n debugStrokeColor: string;\r\n debugFillColor: string;\r\n fontFamily: string;\r\n fontSize: number;\r\n headerFontWeight: string;\r\n}\r\n\r\n/**\r\n * 默认主题。\r\n */\r\nexport const defaultListTableTheme: ListTableTheme = {\r\n backgroundColor: \"#ffffff\",\r\n stripedBackgroundColor: \"#f8fafc\",\r\n borderColor: \"#d9e1ec\",\r\n textColor: \"#1f2329\",\r\n mutedTextColor: \"#7a8798\",\r\n headerBackgroundColor: \"#f5f8fc\",\r\n headerTextColor: \"#18212f\",\r\n fixedShadowColor: \"rgba(15, 23, 42, 0.08)\",\r\n frozenRowBackgroundColor: \"#fff7e6\",\r\n hoverBackgroundColor: \"#edf4ff\",\r\n selectionBackgroundColor: \"#dbeafe\",\r\n emptyBackgroundColor: \"#f8fafc\",\r\n emptyTextColor: \"#63748a\",\r\n debugStrokeColor: \"#ef4444\",\r\n debugFillColor: \"rgba(239, 68, 68, 0.08)\",\r\n fontFamily:\r\n '\"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif',\r\n fontSize: 14,\r\n headerFontWeight: \"600\",\r\n};\r\n","import type { ListTableRowKey } from \"./row-selection\";\r\n\r\nexport type FrozenRowPosition = \"top\" | \"bottom\";\r\n\r\nexport interface RowSection<RecordType> {\r\n rows: RecordType[];\r\n rowIndexMap?: number[];\r\n}\r\n\r\nexport interface FrozenRowLayout<RecordType> {\r\n top: RowSection<RecordType>;\r\n scroll: RowSection<RecordType>;\r\n bottom: RowSection<RecordType>;\r\n}\r\n\r\nexport interface FrozenRowState {\r\n topRowKeys: ListTableRowKey[];\r\n bottomRowKeys: ListTableRowKey[];\r\n}\r\n\r\n/**\r\n * 创建冻结行状态。\r\n */\r\nexport function createFrozenRowState(): FrozenRowState {\r\n return {\r\n topRowKeys: [],\r\n bottomRowKeys: [],\r\n };\r\n}\r\n\r\n/**\r\n * 将行移动到指定冻结区域。\r\n */\r\nexport function freezeRowKey(\r\n state: FrozenRowState,\r\n rowKey: ListTableRowKey,\r\n position: FrozenRowPosition,\r\n): FrozenRowState {\r\n const nextState = unfreezeRowKey(state, rowKey);\r\n\r\n if (position === \"top\") {\r\n return {\r\n ...nextState,\r\n topRowKeys: [...nextState.topRowKeys, rowKey],\r\n };\r\n }\r\n\r\n return {\r\n ...nextState,\r\n bottomRowKeys: [...nextState.bottomRowKeys, rowKey],\r\n };\r\n}\r\n\r\n/**\r\n * 取消指定行冻结。\r\n */\r\nexport function unfreezeRowKey(\r\n state: FrozenRowState,\r\n rowKey: ListTableRowKey,\r\n): FrozenRowState {\r\n return {\r\n topRowKeys: state.topRowKeys.filter((key) => key !== rowKey),\r\n bottomRowKeys: state.bottomRowKeys.filter((key) => key !== rowKey),\r\n };\r\n}\r\n\r\n/**\r\n * 获取行当前冻结位置。\r\n */\r\nexport function getFrozenRowPosition(\r\n state: FrozenRowState,\r\n rowKey: ListTableRowKey,\r\n): FrozenRowPosition | null {\r\n if (state.topRowKeys.includes(rowKey)) {\r\n return \"top\";\r\n }\r\n\r\n if (state.bottomRowKeys.includes(rowKey)) {\r\n return \"bottom\";\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * 根据冻结状态拆分可滚动行和冻结行。\r\n */\r\nexport function resolveFrozenRows<RecordType>(params: {\r\n rows: RecordType[];\r\n state: FrozenRowState;\r\n getRowKey: (\r\n record: RecordType,\r\n rowIndex: number,\r\n ) => ListTableRowKey | null | undefined;\r\n}): FrozenRowLayout<RecordType> {\r\n const { rows, state, getRowKey } = params;\r\n if (state.topRowKeys.length === 0 && state.bottomRowKeys.length === 0) {\r\n return {\r\n top: {\r\n rows: [],\r\n },\r\n scroll: {\r\n rows,\r\n },\r\n bottom: {\r\n rows: [],\r\n },\r\n };\r\n }\r\n\r\n const topKeys = new Set(state.topRowKeys);\r\n const bottomKeys = new Set(state.bottomRowKeys);\r\n const layout: FrozenRowLayout<RecordType> = {\r\n top: {\r\n rows: [],\r\n rowIndexMap: [],\r\n },\r\n scroll: {\r\n rows: [],\r\n rowIndexMap: [],\r\n },\r\n bottom: {\r\n rows: [],\r\n rowIndexMap: [],\r\n },\r\n };\r\n\r\n rows.forEach((record, rowIndex) => {\r\n const rowKey = getRowKey(record, rowIndex);\r\n if (rowKey == null) {\r\n layout.scroll.rows.push(record);\r\n layout.scroll.rowIndexMap!.push(rowIndex);\r\n return;\r\n }\r\n if (topKeys.has(rowKey)) {\r\n layout.top.rows.push(record);\r\n layout.top.rowIndexMap!.push(rowIndex);\r\n return;\r\n }\r\n\r\n if (bottomKeys.has(rowKey)) {\r\n layout.bottom.rows.push(record);\r\n layout.bottom.rowIndexMap!.push(rowIndex);\r\n return;\r\n }\r\n\r\n layout.scroll.rows.push(record);\r\n layout.scroll.rowIndexMap!.push(rowIndex);\r\n });\r\n\r\n return layout;\r\n}\r\n","import type {\r\n ListTableOptions,\r\n ListTableQueryPagination,\r\n} from \"../../schema/table-options\";\r\n\r\nexport interface PaginationState {\r\n currentPage: number;\r\n pageSize: number;\r\n scrollPageSize: number;\r\n}\r\n\r\n/**\r\n * 创建分页初始状态。\r\n */\r\nexport function createInitialPaginationState<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n defaultPageSize: number,\r\n): PaginationState {\r\n const pagination = options.pagination || null;\r\n const pageSize = pagination?.pageSize ?? defaultPageSize;\r\n return {\r\n currentPage: pagination?.current ?? 1,\r\n pageSize,\r\n scrollPageSize: pageSize,\r\n };\r\n}\r\n\r\n/**\r\n * 同步分页状态。\r\n */\r\nexport function resolvePaginationState<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n currentState: PaginationState,\r\n defaultPageSize: number,\r\n): PaginationState {\r\n const pagination = options.pagination;\r\n if (!pagination) {\r\n return {\r\n currentPage: 1,\r\n pageSize: defaultPageSize,\r\n scrollPageSize: defaultPageSize,\r\n };\r\n }\r\n\r\n const pageSize = pagination.pageSize ?? currentState.pageSize ?? defaultPageSize;\r\n return {\r\n currentPage: pagination.current ?? currentState.currentPage ?? 1,\r\n pageSize,\r\n scrollPageSize: pageSize,\r\n };\r\n}\r\n\r\n/**\r\n * 判断是否为滚动加载模式。\r\n */\r\nexport function isScrollPaginationMode<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n) {\r\n return !!options.pagination && options.pagination.mode === \"scroll\";\r\n}\r\n\r\n/**\r\n * 计算分页总数。\r\n */\r\nexport function getPaginationTotal<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n total: number,\r\n) {\r\n const pagination = options.pagination || null;\r\n return pagination?.total ?? total;\r\n}\r\n\r\n/**\r\n * 获取当前有效 pageSize。\r\n */\r\nexport function getEffectivePageSize<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n state: PaginationState,\r\n) {\r\n return isScrollPaginationMode(options)\r\n ? Math.max(1, state.scrollPageSize)\r\n : Math.max(1, state.pageSize);\r\n}\r\n\r\n/**\r\n * 获取分页总页数。\r\n */\r\nfunction getPaginationTotalPages<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n total: number,\r\n state: PaginationState,\r\n) {\r\n return Math.max(\r\n 1,\r\n Math.ceil(\r\n getPaginationTotal(options, total) /\r\n Math.max(1, getEffectivePageSize(options, state)),\r\n ),\r\n );\r\n}\r\n\r\n/**\r\n * 根据分页状态切分当前可见数据。\r\n */\r\nexport function sliceDisplayRowsByPagination<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n rows: RecordType[];\r\n state: PaginationState;\r\n}) {\r\n const { options, rows, state } = params;\r\n const pagination = options.pagination;\r\n if (!pagination) {\r\n return rows;\r\n }\r\n\r\n const totalPages = getPaginationTotalPages(options, rows.length, state);\r\n const current = clampPageNumber(state.currentPage, totalPages);\r\n if (isScrollPaginationMode(options)) {\r\n return rows.slice(0, current * getEffectivePageSize(options, state));\r\n }\r\n\r\n const startIndex = (current - 1) * state.pageSize;\r\n return rows.slice(startIndex, startIndex + state.pageSize);\r\n}\r\n\r\n/**\r\n * 转换为 query onChange 所需的分页结构。\r\n */\r\nexport function toQueryPagination<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n total: number,\r\n state: PaginationState,\r\n): ListTableQueryPagination {\r\n if (!options.pagination) {\r\n return false;\r\n }\r\n\r\n return {\r\n current: state.currentPage,\r\n pageSize: getEffectivePageSize(options, state),\r\n total: getPaginationTotal(options, total),\r\n };\r\n}\r\n\r\n/**\r\n * 计算滚动模式下下一页页码。\r\n */\r\nexport function resolveNextScrollPage<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n state: PaginationState;\r\n totalRows: number;\r\n scrollTop: number;\r\n maxScrollTop: number;\r\n rowHeight: number;\r\n}) {\r\n const { options, state, totalRows, scrollTop, maxScrollTop, rowHeight } = params;\r\n if (!options.pagination || !isScrollPaginationMode(options)) {\r\n return null;\r\n }\r\n\r\n const remainingDistance = maxScrollTop - scrollTop;\r\n if (remainingDistance > rowHeight) {\r\n return null;\r\n }\r\n\r\n const totalPages = getPaginationTotalPages(options, totalRows, state);\r\n const nextPage = clampPageNumber(state.currentPage + 1, totalPages);\r\n if (nextPage === state.currentPage) {\r\n return null;\r\n }\r\n\r\n return nextPage;\r\n}\r\n\r\n/**\r\n * 同步滚动模式下的有效 pageSize。\r\n */\r\nexport function resolveScrollPageSize<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n pageSize: number;\r\n bodyHeight: number;\r\n rowHeight: number;\r\n}) {\r\n const { options, pageSize, bodyHeight, rowHeight } = params;\r\n if (!isScrollPaginationMode(options)) {\r\n return pageSize;\r\n }\r\n\r\n const safeRowHeight = Math.max(1, rowHeight);\r\n const visibleRows = Math.max(1, Math.ceil(bodyHeight / safeRowHeight));\r\n return Math.max(pageSize, visibleRows + 1);\r\n}\r\n\r\n/**\r\n * 归一化页码。\r\n */\r\nfunction clampPageNumber(page: number, totalPages: number) {\r\n if (!Number.isFinite(page)) {\r\n return 1;\r\n }\r\n\r\n return Math.min(Math.max(1, Math.floor(page)), totalPages);\r\n}\r\n","import type { TableColumnDataIndex } from \"../../schema/column\";\r\n\r\n/**\r\n * 通过 dataIndex 安全读取值。\r\n *\r\n * @param record 数据记录。\r\n * @param dataIndex 路径。\r\n * @returns 读取结果。\r\n */\r\nexport function getValueByDataIndex(\r\n record: unknown,\r\n dataIndex?: TableColumnDataIndex,\r\n) {\r\n if (dataIndex == null) {\r\n return undefined;\r\n }\r\n\r\n const path = Array.isArray(dataIndex) ? dataIndex : [dataIndex];\r\n let current: unknown = record;\r\n\r\n for (const key of path) {\r\n if (current == null) {\r\n return undefined;\r\n }\r\n\r\n if (typeof current !== \"object\" && !Array.isArray(current)) {\r\n return undefined;\r\n }\r\n\r\n current = (current as Record<string | number, unknown>)[key];\r\n }\r\n\r\n return current;\r\n}\r\n","import { getValueByDataIndex } from \"../data/get-value-by-data-index\";\r\nimport type { ListTableColumn } from \"../../schema/column\";\r\nimport type {\r\n ListTableOptions,\r\n ListTableRowSelectionOptions,\r\n} from \"../../schema/table-options\";\r\n\r\nconst maximumTreeDepthCache = new WeakMap<object, Map<string, number>>();\r\n\r\nexport const ROW_SELECTION_COLUMN_KEY = \"__row_selection__\";\r\nexport const EXPAND_COLUMN_KEY = \"__row_expand__\";\r\n\r\nexport type ListTableRowKey = string | number;\r\n\r\n/**\r\n * 获取行选择初始选中 keys。\r\n */\r\nexport function getInitialSelectedRowKeys<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n) {\r\n const rowSelection = options.rowSelection;\r\n if (!rowSelection) {\r\n return [];\r\n }\r\n\r\n if (rowSelection.selectedRowKeys !== undefined) {\r\n return [...rowSelection.selectedRowKeys];\r\n }\r\n\r\n return [...(rowSelection.defaultSelectedRowKeys ?? [])];\r\n}\r\n\r\n/**\r\n * 同步受控/非受控行选择状态。\r\n */\r\nexport function resolveSyncedSelectedRowKeys<RecordType>(\r\n rowSelection: ListTableRowSelectionOptions<RecordType> | undefined,\r\n selectedRowKeys: ListTableRowKey[],\r\n) {\r\n if (!rowSelection) {\r\n return [];\r\n }\r\n\r\n if (rowSelection.selectedRowKeys !== undefined) {\r\n return [...rowSelection.selectedRowKeys];\r\n }\r\n\r\n if (\r\n selectedRowKeys.length === 0 &&\r\n rowSelection.defaultSelectedRowKeys !== undefined\r\n ) {\r\n return [...rowSelection.defaultSelectedRowKeys];\r\n }\r\n\r\n return selectedRowKeys;\r\n}\r\n\r\n/**\r\n * 解析记录的唯一 key。\r\n */\r\nexport function getRowKey<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n record: RecordType,\r\n index: number,\r\n) {\r\n const rowKey = options.rowKey;\r\n if (typeof rowKey === \"function\") {\r\n return rowKey(record, index);\r\n }\r\n\r\n if (rowKey != null) {\r\n const resolved = getValueByDataIndex(record, rowKey);\r\n if (typeof resolved === \"string\" || typeof resolved === \"number\") {\r\n return resolved;\r\n }\r\n }\r\n\r\n const sourceIndex = Array.isArray(options.dataSource)\r\n ? options.dataSource.indexOf(record)\r\n : -1;\r\n const fallback = (record as Record<string, unknown>).key ??\r\n (record as Record<string, unknown>).id ??\r\n (sourceIndex >= 0 ? sourceIndex : index);\r\n return typeof fallback === \"string\" || typeof fallback === \"number\"\r\n ? fallback\r\n : index;\r\n}\r\n\r\n/**\r\n * 判断当前记录是否禁用选择。\r\n */\r\nfunction isRowSelectionDisabled<RecordType>(\r\n rowSelection: ListTableRowSelectionOptions<RecordType> | undefined,\r\n record: RecordType,\r\n) {\r\n return rowSelection?.getCheckboxProps?.(record)?.disabled === true;\r\n}\r\n\r\n/**\r\n * 构建选择列。\r\n */\r\nfunction createRowSelectionColumn<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: ListTableRowKey[];\r\n}) {\r\n const { options, selectedRowKeys } = params;\r\n const rowSelection = options.rowSelection;\r\n const type = rowSelection?.type === \"radio\" ? \"radio\" : \"checkbox\";\r\n\r\n const selectionColumn: ListTableColumn<RecordType> = {\r\n key: ROW_SELECTION_COLUMN_KEY,\r\n dataIndex: ROW_SELECTION_COLUMN_KEY,\r\n title: \"\",\r\n width: rowSelection?.columnWidth ?? 52,\r\n minWidth: rowSelection?.columnWidth ?? 52,\r\n maxWidth: rowSelection?.columnWidth ?? 52,\r\n fixed: rowSelection?.fixed ?? \"left\",\r\n align: rowSelection?.align ?? \"center\",\r\n resizable: false,\r\n draggable: false,\r\n cellType: type,\r\n render: (_value, record, rowIndex) => {\r\n const rowKey = getRowKey(options, record, rowIndex);\r\n return {\r\n type,\r\n checked: selectedRowKeys.includes(rowKey),\r\n disabled: isRowSelectionDisabled(rowSelection, record),\r\n };\r\n },\r\n meta: {\r\n systemType: \"rowSelection\",\r\n },\r\n };\r\n\r\n return selectionColumn;\r\n}\r\n\r\n/**\r\n * 构建展开列。\r\n */\r\nexport function createExpandColumn<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n) {\r\n const expandable = options.expandable;\r\n if (\r\n !expandable ||\r\n expandable.showExpandIcon === false ||\r\n expandable.showExpandColumn !== true\r\n ) {\r\n return null;\r\n }\r\n\r\n const columnWidth = resolveExpandColumnWidth(options);\r\n const expandColumn: ListTableColumn<RecordType> = {\r\n key: EXPAND_COLUMN_KEY,\r\n dataIndex: EXPAND_COLUMN_KEY,\r\n title: \"\",\r\n width: columnWidth,\r\n minWidth: columnWidth,\r\n maxWidth: columnWidth,\r\n fixed: expandable.fixed ?? \"left\",\r\n align: \"left\",\r\n resizable: false,\r\n draggable: false,\r\n editable: false,\r\n meta: {\r\n systemType: \"expandable\",\r\n },\r\n };\r\n\r\n return expandColumn;\r\n}\r\n\r\nfunction resolveExpandColumnWidth<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n) {\r\n const expandable = options.expandable;\r\n const minimumWidth = expandable?.columnWidth ?? 52;\r\n const indentSize = expandable?.indentSize ?? 15;\r\n const childrenColumnName = expandable?.childrenColumnName ?? \"children\";\r\n const maximumDepth = resolveMaximumTreeDepth(\r\n options.dataSource,\r\n childrenColumnName,\r\n );\r\n return Math.max(minimumWidth, 38 + maximumDepth * indentSize);\r\n}\r\n\r\nfunction resolveMaximumTreeDepth<RecordType>(\r\n rows: RecordType[],\r\n childrenColumnName: string,\r\n depth = 0,\r\n): number {\r\n if (depth === 0) {\r\n const cached = maximumTreeDepthCache.get(rows)?.get(childrenColumnName);\r\n if (cached != null) {\r\n return cached;\r\n }\r\n }\r\n\r\n let maximumDepth = depth;\r\n rows.forEach((record) => {\r\n const children = (record as Record<string, unknown>)[childrenColumnName];\r\n if (!Array.isArray(children) || children.length === 0) {\r\n return;\r\n }\r\n maximumDepth = Math.max(\r\n maximumDepth,\r\n resolveMaximumTreeDepth(\r\n children as RecordType[],\r\n childrenColumnName,\r\n depth + 1,\r\n ),\r\n );\r\n });\r\n\r\n if (depth === 0) {\r\n const dataSourceCache =\r\n maximumTreeDepthCache.get(rows) ?? new Map<string, number>();\r\n dataSourceCache.set(childrenColumnName, maximumDepth);\r\n maximumTreeDepthCache.set(rows, dataSourceCache);\r\n }\r\n return maximumDepth;\r\n}\r\n\r\n/**\r\n * 返回包含选择列的最终列配置。\r\n */\r\nexport function getResolvedColumns<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n selectedRowKeys: ListTableRowKey[],\r\n) {\r\n let resolvedColumns = [...options.columns];\r\n const expandColumn = createExpandColumn(options);\r\n\r\n if (expandColumn) {\r\n resolvedColumns =\r\n expandColumn.fixed === \"right\"\r\n ? [...resolvedColumns, expandColumn]\r\n : [expandColumn, ...resolvedColumns];\r\n }\r\n\r\n if (!options.rowSelection) {\r\n return resolvedColumns;\r\n }\r\n\r\n const selectionColumn = createRowSelectionColumn({\r\n options,\r\n selectedRowKeys,\r\n });\r\n return selectionColumn.fixed === \"right\"\r\n ? [...resolvedColumns, selectionColumn]\r\n : [selectionColumn, ...resolvedColumns];\r\n}\r\n\r\n/**\r\n * 获取当前选中行集合。\r\n */\r\nexport function getSelectedRows<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n selectedRowKeys: ListTableRowKey[],\r\n) {\r\n return options.dataSource.filter((record, index) =>\r\n selectedRowKeys.includes(getRowKey(options, record, index)),\r\n );\r\n}\r\n\r\n/**\r\n * 获取当前可见且允许选择的记录。\r\n */\r\nfunction getVisibleSelectableRows<RecordType>(params: {\r\n rowSelection: ListTableRowSelectionOptions<RecordType> | undefined;\r\n displayData: RecordType[];\r\n}) {\r\n const { rowSelection, displayData } = params;\r\n return displayData.filter((record) => !isRowSelectionDisabled(rowSelection, record));\r\n}\r\n\r\n/**\r\n * 获取表头勾选状态。\r\n */\r\nexport function getHeaderSelectionState<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: ListTableRowKey[];\r\n displayData: RecordType[];\r\n}) {\r\n const { options, selectedRowKeys, displayData } = params;\r\n const rowSelection = options.rowSelection;\r\n const visibleRows = getVisibleSelectableRows({\r\n rowSelection,\r\n displayData,\r\n });\r\n const selectedVisibleKeys = visibleRows\r\n .map((record, index) => getRowKey(options, record, index))\r\n .filter((key) => selectedRowKeys.includes(key));\r\n\r\n const type: \"checkbox\" | \"radio\" =\r\n rowSelection?.type === \"radio\" ? \"radio\" : \"checkbox\";\r\n return {\r\n type,\r\n checked:\r\n visibleRows.length > 0 && selectedVisibleKeys.length === visibleRows.length,\r\n indeterminate:\r\n selectedVisibleKeys.length > 0 &&\r\n selectedVisibleKeys.length < visibleRows.length,\r\n disabled: visibleRows.length === 0,\r\n };\r\n}\r\n\r\n/**\r\n * 切换单行选中态。\r\n */\r\nexport function resolveToggledRowSelectionKeys<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: ListTableRowKey[];\r\n record: RecordType;\r\n rowIndex: number;\r\n}) {\r\n const { options, selectedRowKeys, record, rowIndex } = params;\r\n const rowSelection = options.rowSelection;\r\n if (!rowSelection || isRowSelectionDisabled(rowSelection, record)) {\r\n return null;\r\n }\r\n\r\n const rowKey = getRowKey(options, record, rowIndex);\r\n const type = rowSelection.type === \"radio\" ? \"radio\" : \"checkbox\";\r\n const selected = selectedRowKeys.includes(rowKey);\r\n const nextKeys =\r\n type === \"radio\"\r\n ? selected\r\n ? selectedRowKeys\r\n : [rowKey]\r\n : selected\r\n ? selectedRowKeys.filter((key) => key !== rowKey)\r\n : [...selectedRowKeys, rowKey];\r\n\r\n return {\r\n selected,\r\n nextKeys,\r\n };\r\n}\r\n\r\n/**\r\n * 切换当前可见数据的全选状态。\r\n */\r\nexport function resolveToggleAllVisibleRowKeys<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: ListTableRowKey[];\r\n displayData: RecordType[];\r\n}) {\r\n const { options, selectedRowKeys, displayData } = params;\r\n const rowSelection = options.rowSelection;\r\n if (!rowSelection || rowSelection.type === \"radio\") {\r\n return null;\r\n }\r\n\r\n const visibleRows = getVisibleSelectableRows({\r\n rowSelection,\r\n displayData,\r\n });\r\n const visibleKeys = visibleRows.map((record, index) =>\r\n getRowKey(options, record, index)\r\n );\r\n const headerState = getHeaderSelectionState({\r\n options,\r\n selectedRowKeys,\r\n displayData,\r\n });\r\n\r\n return headerState.checked\r\n ? selectedRowKeys.filter((key) => !visibleKeys.includes(key))\r\n : Array.from(new Set([...selectedRowKeys, ...visibleKeys]));\r\n}\r\n","import { createEmptySelection } from \"../../interaction/selection\";\r\nimport type {\r\n ListTableColumnRuntimeConfig,\r\n CollapsedRowState,\r\n ExpandedRowState,\r\n ListTableFilterState,\r\n ListTableRangeHighlightState,\r\n ListTableSelectionState,\r\n ListTableSortState,\r\n HoverState,\r\n ScrollState,\r\n} from \"../../schema/state\";\r\nimport {\r\n defaultListTableTheme,\r\n type ListTableTheme,\r\n} from \"../../schema/style\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport {\r\n createFrozenRowState,\r\n type FrozenRowState,\r\n} from \"../../domain/rows/frozen-rows\";\r\nimport {\r\n createInitialPaginationState,\r\n resolvePaginationState,\r\n} from \"../../domain/rows/pagination\";\r\nimport { getInitialSelectedRowKeys, resolveSyncedSelectedRowKeys } from \"../../domain/rows/row-selection\";\r\nimport { resolveInitialSortState } from \"../../domain/columns/column-runtime\";\r\nimport { DEFAULT_PAGINATION_PAGE_SIZE } from \"../../domain/constants\";\r\n\r\nexport interface ListTablePaginationState {\r\n currentPage: number;\r\n pageSize: number;\r\n scrollPageSize: number;\r\n}\r\n\r\nexport interface ListTableInteractiveState {\r\n scroll: ScrollState;\r\n hover: HoverState;\r\n selection: ListTableSelectionState;\r\n rangeHighlight: ListTableRangeHighlightState;\r\n}\r\n\r\nexport interface ListTableQueryRuntimeState {\r\n sortState: ListTableSortState;\r\n filterState: ListTableFilterState;\r\n pagination: ListTablePaginationState;\r\n}\r\n\r\nexport interface ListTableRuntimeState<RecordType> {\r\n theme: ListTableTheme;\r\n interactive: ListTableInteractiveState;\r\n query: ListTableQueryRuntimeState;\r\n runtimeColumns: Record<string, ListTableColumnRuntimeConfig>;\r\n selectedRowKeys: Array<string | number>;\r\n expandedRowKeys: ExpandedRowState[\"expandedRowKeys\"];\r\n collapsedRowKeys: CollapsedRowState[\"collapsedRowKeys\"];\r\n frozenRows: FrozenRowState;\r\n}\r\n\r\n/**\r\n * 创建列表表格初始运行时状态。\r\n *\r\n * @param options 表格配置。\r\n * @returns 初始状态。\r\n */\r\nexport function createInitialListTableState<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n): ListTableRuntimeState<RecordType> {\r\n const pagination = createInitialPaginationState(options, DEFAULT_PAGINATION_PAGE_SIZE);\r\n\r\n return {\r\n theme: {\r\n ...defaultListTableTheme,\r\n ...options.theme,\r\n },\r\n interactive: {\r\n scroll: { left: 0, top: 0 },\r\n hover: {\r\n rowIndex: null,\r\n columnKey: null,\r\n area: \"empty\",\r\n },\r\n selection: createEmptySelection(),\r\n rangeHighlight: {\r\n selectedRowAnchorIndex: null,\r\n selectedRowRange: null,\r\n selectedColumnAnchorKey: null,\r\n selectedColumnRange: null,\r\n },\r\n },\r\n query: {\r\n sortState: resolveInitialSortState(options.columns),\r\n filterState: {},\r\n pagination: {\r\n currentPage: pagination.currentPage,\r\n pageSize: pagination.pageSize,\r\n scrollPageSize: pagination.scrollPageSize,\r\n },\r\n },\r\n runtimeColumns: {},\r\n selectedRowKeys: getInitialSelectedRowKeys(options),\r\n expandedRowKeys:\r\n options.expandable?.expandedRowKeys ??\r\n options.expandable?.defaultExpandedRowKeys ??\r\n [],\r\n collapsedRowKeys: [],\r\n frozenRows: createFrozenRowState(),\r\n };\r\n}\r\n\r\n/**\r\n * 根据新配置解析下一份运行时状态。\r\n *\r\n * @param options 新配置。\r\n * @param previous 上一份状态。\r\n * @returns 更新后的状态。\r\n */\r\nexport function resolveListTableStateOnOptionsUpdate<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n previous: ListTableRuntimeState<RecordType>,\r\n): ListTableRuntimeState<RecordType> {\r\n const pagination = resolvePaginationState(\r\n options,\r\n previous.query.pagination,\r\n DEFAULT_PAGINATION_PAGE_SIZE,\r\n );\r\n\r\n return {\r\n ...previous,\r\n theme: {\r\n ...defaultListTableTheme,\r\n ...options.theme,\r\n },\r\n query: {\r\n sortState: resolveInitialSortState(options.columns, previous.query.sortState),\r\n filterState: previous.query.filterState,\r\n pagination: {\r\n currentPage: pagination.currentPage,\r\n pageSize: pagination.pageSize,\r\n scrollPageSize: pagination.scrollPageSize,\r\n },\r\n },\r\n selectedRowKeys: resolveSyncedSelectedRowKeys(\r\n options.rowSelection,\r\n previous.selectedRowKeys,\r\n ),\r\n expandedRowKeys:\r\n options.expandable?.expandedRowKeys ?? previous.expandedRowKeys,\r\n collapsedRowKeys: previous.collapsedRowKeys,\r\n };\r\n}\r\n","import type { ListTableStateAction } from \"./actions\";\r\nimport type { ListTableRuntimeState } from \"./state\";\r\n\r\n/**\r\n * 列表表格运行时状态 reducer。\r\n */\r\nexport function reduceListTableState<RecordType>(\r\n state: ListTableRuntimeState<RecordType>,\r\n action: ListTableStateAction<RecordType>,\r\n): ListTableRuntimeState<RecordType> {\r\n switch (action.type) {\r\n case \"set-theme\":\r\n return { ...state, theme: action.payload };\r\n case \"set-scroll\":\r\n return {\r\n ...state,\r\n interactive: {\r\n ...state.interactive,\r\n scroll: action.payload,\r\n },\r\n };\r\n case \"set-hover\":\r\n return {\r\n ...state,\r\n interactive: {\r\n ...state.interactive,\r\n hover: action.payload,\r\n },\r\n };\r\n case \"set-selection\":\r\n return {\r\n ...state,\r\n interactive: {\r\n ...state.interactive,\r\n selection: action.payload,\r\n },\r\n };\r\n case \"set-range-highlight\":\r\n return {\r\n ...state,\r\n interactive: {\r\n ...state.interactive,\r\n rangeHighlight: action.payload,\r\n },\r\n };\r\n case \"set-sort\":\r\n return {\r\n ...state,\r\n query: {\r\n ...state.query,\r\n sortState: action.payload,\r\n },\r\n };\r\n case \"set-filter\":\r\n return {\r\n ...state,\r\n query: {\r\n ...state.query,\r\n filterState: action.payload,\r\n },\r\n };\r\n case \"set-pagination\":\r\n return {\r\n ...state,\r\n query: {\r\n ...state.query,\r\n pagination: action.payload,\r\n },\r\n };\r\n case \"set-runtime-columns\":\r\n return {\r\n ...state,\r\n runtimeColumns: action.payload,\r\n };\r\n case \"set-selected-row-keys\":\r\n return {\r\n ...state,\r\n selectedRowKeys: action.payload,\r\n };\r\n case \"set-expanded-row-keys\":\r\n return {\r\n ...state,\r\n expandedRowKeys: action.payload,\r\n };\r\n case \"set-collapsed-row-keys\":\r\n return {\r\n ...state,\r\n collapsedRowKeys: action.payload,\r\n };\r\n case \"set-frozen-rows\":\r\n return {\r\n ...state,\r\n frozenRows: action.payload,\r\n };\r\n case \"replace-state\":\r\n return action.payload;\r\n default:\r\n return state;\r\n }\r\n}\r\n","import type { ListTableStateAction } from \"./actions\";\r\nimport { reduceListTableState } from \"./reducer\";\r\nimport type { ListTableRuntimeState } from \"./state\";\r\n\r\ntype StoreListener<RecordType> = (\r\n state: ListTableRuntimeState<RecordType>,\r\n action: ListTableStateAction<RecordType>,\r\n) => void;\r\n\r\n/**\r\n * 轻量运行时 store。\r\n */\r\nexport class ListTableStore<RecordType> {\r\n private state: ListTableRuntimeState<RecordType>;\r\n private readonly listeners = new Set<StoreListener<RecordType>>();\r\n\r\n constructor(initialState: ListTableRuntimeState<RecordType>) {\r\n this.state = initialState;\r\n }\r\n\r\n getSnapshot() {\r\n return this.state;\r\n }\r\n\r\n dispatch(action: ListTableStateAction<RecordType>) {\r\n this.state = reduceListTableState(this.state, action);\r\n this.listeners.forEach((listener) => listener(this.state, action));\r\n }\r\n\r\n subscribe(listener: StoreListener<RecordType>) {\r\n this.listeners.add(listener);\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n}\r\n","import type {\r\n ListTableColumnRuntimeConfig,\r\n CollapsedRowState,\r\n ExpandedRowState,\r\n ListTableFilterState,\r\n ListTableRangeHighlightState,\r\n ListTableSelectionState,\r\n ListTableSortState,\r\n HoverState,\r\n ScrollState,\r\n} from \"../../schema/state\";\r\nimport type { ListTableTheme } from \"../../schema/style\";\r\nimport type { FrozenRowState } from \"../../domain/rows/frozen-rows\";\r\nimport type { ListTablePaginationState, ListTableRuntimeState } from \"./state\";\r\n\r\nexport type ListTableStateAction<RecordType> =\r\n | { type: \"set-theme\"; payload: ListTableTheme }\r\n | { type: \"set-scroll\"; payload: ScrollState }\r\n | { type: \"set-hover\"; payload: HoverState }\r\n | { type: \"set-selection\"; payload: ListTableSelectionState }\r\n | { type: \"set-range-highlight\"; payload: ListTableRangeHighlightState }\r\n | { type: \"set-sort\"; payload: ListTableSortState }\r\n | { type: \"set-filter\"; payload: ListTableFilterState }\r\n | { type: \"set-pagination\"; payload: ListTablePaginationState }\r\n | {\r\n type: \"set-runtime-columns\";\r\n payload: Record<string, ListTableColumnRuntimeConfig>;\r\n }\r\n | { type: \"set-selected-row-keys\"; payload: Array<string | number> }\r\n | { type: \"set-expanded-row-keys\"; payload: ExpandedRowState[\"expandedRowKeys\"] }\r\n | { type: \"set-collapsed-row-keys\"; payload: CollapsedRowState[\"collapsedRowKeys\"] }\r\n | { type: \"set-frozen-rows\"; payload: FrozenRowState }\r\n | { type: \"replace-state\"; payload: ListTableRuntimeState<RecordType> };\r\n\r\nexport function setThemeAction(theme: ListTableTheme): ListTableStateAction<never> {\r\n return { type: \"set-theme\", payload: theme };\r\n}\r\n\r\nexport function setScrollAction(scroll: ScrollState): ListTableStateAction<never> {\r\n return { type: \"set-scroll\", payload: scroll };\r\n}\r\n\r\nexport function setHoverAction(hover: HoverState): ListTableStateAction<never> {\r\n return { type: \"set-hover\", payload: hover };\r\n}\r\n\r\nexport function setSelectionAction(\r\n selection: ListTableSelectionState,\r\n): ListTableStateAction<never> {\r\n return { type: \"set-selection\", payload: selection };\r\n}\r\n\r\nexport function setRangeHighlightAction(\r\n rangeHighlight: ListTableRangeHighlightState,\r\n): ListTableStateAction<never> {\r\n return { type: \"set-range-highlight\", payload: rangeHighlight };\r\n}\r\n\r\nexport function setSortAction(sortState: ListTableSortState): ListTableStateAction<never> {\r\n return { type: \"set-sort\", payload: sortState };\r\n}\r\n\r\nexport function setFilterAction(\r\n filterState: ListTableFilterState,\r\n): ListTableStateAction<never> {\r\n return { type: \"set-filter\", payload: filterState };\r\n}\r\n\r\nexport function setPaginationAction(\r\n pagination: ListTablePaginationState,\r\n): ListTableStateAction<never> {\r\n return { type: \"set-pagination\", payload: pagination };\r\n}\r\n\r\nexport function setRuntimeColumnsAction(\r\n runtimeColumns: Record<string, ListTableColumnRuntimeConfig>,\r\n): ListTableStateAction<never> {\r\n return { type: \"set-runtime-columns\", payload: runtimeColumns };\r\n}\r\n\r\nexport function setSelectedRowKeysAction(\r\n selectedRowKeys: Array<string | number>,\r\n): ListTableStateAction<never> {\r\n return { type: \"set-selected-row-keys\", payload: selectedRowKeys };\r\n}\r\n\r\nexport function setExpandedRowKeysAction(\r\n expandedRowKeys: ExpandedRowState[\"expandedRowKeys\"],\r\n): ListTableStateAction<never> {\r\n return { type: \"set-expanded-row-keys\", payload: expandedRowKeys };\r\n}\r\n\r\nexport function setCollapsedRowKeysAction(\r\n collapsedRowKeys: CollapsedRowState[\"collapsedRowKeys\"],\r\n): ListTableStateAction<never> {\r\n return { type: \"set-collapsed-row-keys\", payload: collapsedRowKeys };\r\n}\r\n\r\nexport function setFrozenRowsAction(\r\n frozenRows: FrozenRowState,\r\n): ListTableStateAction<never> {\r\n return { type: \"set-frozen-rows\", payload: frozenRows };\r\n}\r\n\r\nexport function replaceStateAction<RecordType>(\r\n state: ListTableRuntimeState<RecordType>,\r\n): ListTableStateAction<RecordType> {\r\n return { type: \"replace-state\", payload: state };\r\n}\r\n","import type {\r\n ListTableColumnRuntimeConfig,\r\n ListTableFilterState,\r\n ListTableRangeHighlightState,\r\n ListTableSelectionState,\r\n ListTableSortState,\r\n HoverState,\r\n ScrollState,\r\n} from \"../../schema/state\";\r\nimport type { ListTableTheme } from \"../../schema/style\";\r\nimport type { FrozenRowState } from \"../../domain/rows/frozen-rows\";\r\nimport type { ListTableStore } from \"../store/create-store\";\r\nimport {\r\n setCollapsedRowKeysAction,\r\n setExpandedRowKeysAction,\r\n setFilterAction,\r\n setFrozenRowsAction,\r\n setHoverAction,\r\n setPaginationAction,\r\n setRangeHighlightAction,\r\n setRuntimeColumnsAction,\r\n setScrollAction,\r\n setSelectedRowKeysAction,\r\n setSelectionAction,\r\n setSortAction,\r\n setThemeAction,\r\n} from \"../store/actions\";\r\n\r\n/**\r\n * 对 ListTableStore 的字段级读写门面,避免主类堆积样板 getter/setter。\r\n */\r\nexport class ListTableStoreFacade<RecordType> {\r\n private readonly store: ListTableStore<RecordType>;\r\n\r\n constructor(store: ListTableStore<RecordType>) {\r\n this.store = store;\r\n }\r\n\r\n get theme(): ListTableTheme {\r\n return this.store.getSnapshot().theme;\r\n }\r\n\r\n set theme(value: ListTableTheme) {\r\n this.store.dispatch(setThemeAction(value));\r\n }\r\n\r\n get scroll(): ScrollState {\r\n return this.store.getSnapshot().interactive.scroll;\r\n }\r\n\r\n set scroll(value: ScrollState) {\r\n this.store.dispatch(setScrollAction(value));\r\n }\r\n\r\n get hover(): HoverState {\r\n return this.store.getSnapshot().interactive.hover;\r\n }\r\n\r\n set hover(value: HoverState) {\r\n this.store.dispatch(setHoverAction(value));\r\n }\r\n\r\n get selection(): ListTableSelectionState {\r\n return this.store.getSnapshot().interactive.selection;\r\n }\r\n\r\n set selection(value: ListTableSelectionState) {\r\n this.store.dispatch(setSelectionAction(value));\r\n }\r\n\r\n get rangeHighlight(): ListTableRangeHighlightState {\r\n return this.store.getSnapshot().interactive.rangeHighlight;\r\n }\r\n\r\n set rangeHighlight(value: ListTableRangeHighlightState) {\r\n this.store.dispatch(setRangeHighlightAction(value));\r\n }\r\n\r\n get sortState(): ListTableSortState {\r\n return this.store.getSnapshot().query.sortState;\r\n }\r\n\r\n set sortState(value: ListTableSortState) {\r\n this.store.dispatch(setSortAction(value));\r\n }\r\n\r\n get filterState(): ListTableFilterState {\r\n return this.store.getSnapshot().query.filterState;\r\n }\r\n\r\n set filterState(value: ListTableFilterState) {\r\n this.store.dispatch(setFilterAction(value));\r\n }\r\n\r\n get runtimeColumns(): Record<string, ListTableColumnRuntimeConfig> {\r\n return this.store.getSnapshot().runtimeColumns;\r\n }\r\n\r\n set runtimeColumns(value: Record<string, ListTableColumnRuntimeConfig>) {\r\n this.store.dispatch(setRuntimeColumnsAction(value));\r\n }\r\n\r\n get currentPage(): number {\r\n return this.store.getSnapshot().query.pagination.currentPage;\r\n }\r\n\r\n set currentPage(value: number) {\r\n this.store.dispatch(\r\n setPaginationAction({\r\n ...this.store.getSnapshot().query.pagination,\r\n currentPage: value,\r\n }),\r\n );\r\n }\r\n\r\n get pageSize(): number {\r\n return this.store.getSnapshot().query.pagination.pageSize;\r\n }\r\n\r\n set pageSize(value: number) {\r\n this.store.dispatch(\r\n setPaginationAction({\r\n ...this.store.getSnapshot().query.pagination,\r\n pageSize: value,\r\n }),\r\n );\r\n }\r\n\r\n get scrollPageSize(): number {\r\n return this.store.getSnapshot().query.pagination.scrollPageSize;\r\n }\r\n\r\n set scrollPageSize(value: number) {\r\n this.store.dispatch(\r\n setPaginationAction({\r\n ...this.store.getSnapshot().query.pagination,\r\n scrollPageSize: value,\r\n }),\r\n );\r\n }\r\n\r\n get selectedRowKeys(): Array<string | number> {\r\n return this.store.getSnapshot().selectedRowKeys;\r\n }\r\n\r\n set selectedRowKeys(value: Array<string | number>) {\r\n this.store.dispatch(setSelectedRowKeysAction(value));\r\n }\r\n\r\n get expandedRowKeys(): Array<string | number> {\r\n return this.store.getSnapshot().expandedRowKeys;\r\n }\r\n\r\n set expandedRowKeys(value: Array<string | number>) {\r\n this.store.dispatch(setExpandedRowKeysAction(value));\r\n }\r\n\r\n get collapsedRowKeys(): Array<string | number> {\r\n return this.store.getSnapshot().collapsedRowKeys;\r\n }\r\n\r\n set collapsedRowKeys(value: Array<string | number>) {\r\n this.store.dispatch(setCollapsedRowKeysAction(value));\r\n }\r\n\r\n get frozenRows(): FrozenRowState {\r\n return this.store.getSnapshot().frozenRows;\r\n }\r\n\r\n set frozenRows(value: FrozenRowState) {\r\n this.store.dispatch(setFrozenRowsAction(value));\r\n }\r\n}\r\n","import type {\r\n DebugHitTestResult,\r\n RenderCellDescriptor,\r\n} from \"../debug/debug-snapshot\";\r\n\r\n/**\r\n * 根据点位命中描述符。\r\n *\r\n * @param x 横坐标。\r\n * @param y 纵坐标。\r\n * @param descriptors 渲染描述符。\r\n * @returns 命中结果。\r\n */\r\nexport function hitTest(\r\n x: number,\r\n y: number,\r\n descriptors: RenderCellDescriptor[],\r\n): DebugHitTestResult {\r\n const sortedDescriptors = [...descriptors].sort((left, right) => {\r\n return getPriority(right) - getPriority(left);\r\n });\r\n\r\n const matched = sortedDescriptors.find(\r\n (descriptor) =>\r\n isPointInRect(x, y, descriptor.rect) &&\r\n isPointInsideOwningBodyCell(x, y, descriptor, descriptors),\r\n );\r\n\r\n if (!matched) {\r\n return {\r\n area: \"empty\",\r\n };\r\n }\r\n\r\n return {\r\n area: mapKindToArea(matched.kind, matched.actionType),\r\n columnKey: matched.columnKey,\r\n rowIndex: matched.rowIndex,\r\n rowSpan: matched.rowSpan,\r\n controlType: matched.controlType,\r\n contentIndex: matched.contentIndex,\r\n contentKey: matched.contentKey,\r\n nestedRowKey: matched.nestedRowKey,\r\n nestedRowIndex: matched.nestedRowIndex,\r\n nestedColumnDataIndex: matched.nestedColumnDataIndex,\r\n nestedColumnIndex: matched.nestedColumnIndex,\r\n resizeEdge: matched.resizeEdge,\r\n cursor: matched.cursor,\r\n rect: matched.rect,\r\n tooltipText: matched.tooltipText,\r\n tooltipVariant: matched.tooltipVariant,\r\n scrollbarRole: matched.scrollbarRole,\r\n };\r\n}\r\n\r\n/**\r\n * 将结构化内容的交互区域限制在所属单元格内,避免被 Canvas 裁剪的内容穿透到相邻单元格。\r\n */\r\nfunction isPointInsideOwningBodyCell(\r\n x: number,\r\n y: number,\r\n descriptor: RenderCellDescriptor,\r\n descriptors: RenderCellDescriptor[],\r\n) {\r\n if (\r\n descriptor.kind !== \"body-content\" &&\r\n descriptor.kind !== \"body-control\"\r\n ) {\r\n return true;\r\n }\r\n\r\n const owningCells = descriptors.filter(\r\n (candidate) =>\r\n (candidate.kind === \"body\" || candidate.kind === \"expanded-row\") &&\r\n candidate.rowIndex === descriptor.rowIndex &&\r\n candidate.columnKey === descriptor.columnKey,\r\n );\r\n if (owningCells.length === 0) {\r\n return true;\r\n }\r\n const exactOwningCells = owningCells.filter(\r\n (candidate) =>\r\n candidate.fixed === descriptor.fixed &&\r\n candidate.frozen === descriptor.frozen,\r\n );\r\n const candidates =\r\n exactOwningCells.length > 0 ? exactOwningCells : owningCells;\r\n return candidates.some((candidate) => isPointInRect(x, y, candidate.rect));\r\n}\r\n\r\n/**\r\n * 解析鼠标在合并单元格内实际命中的数据行。\r\n */\r\nexport function resolveMergedCellHitRowIndex(params: {\r\n result: DebugHitTestResult;\r\n x: number;\r\n y: number;\r\n descriptors: RenderCellDescriptor[];\r\n}) {\r\n const { result, x, y, descriptors } = params;\r\n if (\r\n typeof result.rowIndex !== \"number\" ||\r\n !result.columnKey ||\r\n (result.area !== \"body\" &&\r\n result.area !== \"body-content\" &&\r\n result.area !== \"body-control\")\r\n ) {\r\n return result.rowIndex;\r\n }\r\n\r\n const bodyDescriptor = descriptors.find(\r\n (descriptor) =>\r\n descriptor.kind === \"body\" &&\r\n descriptor.rowIndex === result.rowIndex &&\r\n descriptor.columnKey === result.columnKey &&\r\n (descriptor.rowSpan ?? 1) > 1 &&\r\n isPointInRect(x, y, descriptor.rect),\r\n );\r\n if (!bodyDescriptor || !bodyDescriptor.rowSpan) {\r\n return result.rowIndex;\r\n }\r\n\r\n const rowHeight = bodyDescriptor.rect.height / bodyDescriptor.rowSpan;\r\n if (rowHeight <= 0) {\r\n return result.rowIndex;\r\n }\r\n\r\n const rowOffset = Math.min(\r\n Math.max(Math.floor((y - bodyDescriptor.rect.y) / rowHeight), 0),\r\n bodyDescriptor.rowSpan - 1,\r\n );\r\n return result.rowIndex + rowOffset;\r\n}\r\n\r\nfunction mapKindToArea(\r\n kind: RenderCellDescriptor[\"kind\"],\r\n actionType?: RenderCellDescriptor[\"actionType\"],\r\n): DebugHitTestResult[\"area\"] {\r\n if (kind === \"header\") {\r\n return \"header\";\r\n }\r\n\r\n if (kind === \"body\") {\r\n return \"body\";\r\n }\r\n\r\n if (kind === \"body-content\") {\r\n return \"body-content\";\r\n }\r\n\r\n if (kind === \"body-control\") {\r\n return \"body-control\";\r\n }\r\n\r\n if (kind === \"expand-trigger\") {\r\n return \"expand-trigger\";\r\n }\r\n\r\n if (kind === \"collapse-trigger\") {\r\n return \"collapse-trigger\";\r\n }\r\n\r\n if (kind === \"column-collapse-trigger\") {\r\n return \"column-collapse-trigger\";\r\n }\r\n\r\n if (kind === \"expanded-row\") {\r\n return \"expanded-row\";\r\n }\r\n\r\n if (kind === \"header-selection\") {\r\n return \"header-selection\";\r\n }\r\n\r\n if (kind === \"resize-handle\") {\r\n return \"resize-handle\";\r\n }\r\n\r\n if (kind === \"horizontal-scrollbar\") {\r\n return \"horizontal-scrollbar\";\r\n }\r\n\r\n if (kind === \"vertical-scrollbar\") {\r\n return \"vertical-scrollbar\";\r\n }\r\n\r\n if (kind === \"summary\") {\r\n return \"summary\";\r\n }\r\n\r\n if (actionType === \"sort\") {\r\n return \"sort-trigger\";\r\n }\r\n\r\n if (actionType === \"filter\") {\r\n return \"filter-trigger\";\r\n }\r\n\r\n if (actionType === \"fixed\") {\r\n return \"fixed-trigger\";\r\n }\r\n\r\n return \"empty\";\r\n}\r\n\r\nfunction getPriority(descriptor: RenderCellDescriptor) {\n let priority = getBasePriority(descriptor.kind);\n // 汇总行同时存在整行兜底描述符和具体单元格描述符;具体单元格必须优先,\n // 否则兜底描述符缺少 columnKey,会导致右键菜单无法解析当前汇总列。\n if (descriptor.kind === \"summary\" && descriptor.columnKey) {\n priority += 1;\n }\n // 冻结行位于滚动行上层,描述符重叠时优先命中冻结行。\n if (\r\n (descriptor.kind === \"body\" ||\r\n descriptor.kind === \"body-content\" ||\r\n descriptor.kind === \"body-control\") &&\r\n descriptor.frozen\r\n ) {\r\n priority += 2;\r\n }\r\n // 固定列 body 比非固定列 body 优先级高,确保视觉上层单元格被命中\r\n if (descriptor.kind === \"body\" && descriptor.fixed) {\r\n priority += 1;\r\n }\r\n return priority;\r\n}\r\n\r\nfunction getBasePriority(kind: RenderCellDescriptor[\"kind\"]) {\r\n switch (kind) {\r\n case \"resize-handle\":\r\n return 4;\r\n case \"header-action\":\r\n return 3;\r\n case \"header-selection\":\r\n return 3;\r\n case \"header\":\r\n return 2;\r\n case \"body-content\":\r\n return 2;\r\n case \"body-control\":\r\n return 2;\r\n case \"expand-trigger\":\r\n case \"collapse-trigger\":\r\n case \"column-collapse-trigger\":\r\n return 3;\r\n case \"expanded-row\":\r\n case \"body\":\r\n return 1;\r\n case \"summary\":\r\n return 2;\r\n case \"horizontal-scrollbar\":\r\n case \"vertical-scrollbar\":\r\n return 5;\r\n default:\r\n return 0;\r\n }\r\n}\r\n\r\nfunction isPointInRect(\r\n x: number,\r\n y: number,\r\n rect: RenderCellDescriptor[\"rect\"],\r\n) {\r\n return (\r\n x >= rect.x &&\r\n x <= rect.x + rect.width &&\r\n y >= rect.y &&\r\n y <= rect.y + rect.height\r\n );\r\n}\r\n","import type { DebugHitTestResult } from \"../../debug/debug-snapshot\";\r\nimport type { ListTableTooltipAdapter } from \"../../ui/types\";\r\n\r\ninterface BodyTooltipControllerOptions {\r\n tooltip: ListTableTooltipAdapter;\r\n delay: number;\r\n toViewportPoint: (x: number, y: number) => { x: number; y: number };\r\n}\r\n\r\n/**\r\n * 管理 body 单元格 ellipsis 延迟 tooltip。\r\n */\r\nexport class BodyTooltipController {\r\n private readonly tooltip: ListTableTooltipAdapter;\r\n private readonly delay: number;\r\n private readonly toViewportPoint: BodyTooltipControllerOptions[\"toViewportPoint\"];\r\n private timer: number | null = null;\r\n private tooltipKey: string | null = null;\r\n\r\n constructor(options: BodyTooltipControllerOptions) {\r\n this.tooltip = options.tooltip;\r\n this.delay = options.delay;\r\n this.toViewportPoint = options.toViewportPoint;\r\n }\r\n\r\n /**\r\n * 根据命中结果决定是否延迟展示 tooltip。\r\n */\r\n update(result: DebugHitTestResult, showImmediate: () => void) {\r\n if (this.schedule(result)) {\r\n return;\r\n }\r\n\r\n this.clear(false);\r\n showImmediate();\r\n }\r\n\r\n /**\r\n * 清理延迟任务和展示状态。\r\n */\r\n clear(hideTooltip = true) {\r\n if (this.timer != null) {\r\n window.clearTimeout(this.timer);\r\n this.timer = null;\r\n }\r\n\r\n this.tooltipKey = null;\r\n if (hideTooltip) {\r\n this.tooltip.hide();\r\n }\r\n }\r\n\r\n private schedule(result: DebugHitTestResult) {\r\n if (\r\n (result.area !== \"body\" && result.area !== \"body-content\") ||\r\n !result.tooltipText ||\r\n !result.rect ||\r\n typeof result.rowIndex !== \"number\" ||\r\n !result.columnKey\r\n ) {\r\n return false;\r\n }\r\n\r\n if (result.tooltipVariant === \"error\") {\r\n this.clear();\r\n this.tooltipKey = `${result.rowIndex}:${result.columnKey}:${result.tooltipText}`;\r\n const tooltipPoint = this.toViewportPoint(\r\n result.rect.x + result.rect.width / 2,\r\n result.rect.y + result.rect.height + 8,\r\n );\r\n this.tooltip.show(\r\n tooltipPoint.x,\r\n tooltipPoint.y,\r\n result.tooltipText,\r\n \"error\",\r\n );\r\n return true;\r\n }\r\n\r\n const tooltipKey = `${result.rowIndex}:${result.columnKey}:${result.tooltipText}`;\r\n if (this.tooltipKey === tooltipKey) {\r\n return true;\r\n }\r\n\r\n this.clear();\r\n this.tooltipKey = tooltipKey;\r\n this.timer = window.setTimeout(() => {\r\n if (\r\n this.tooltipKey !== tooltipKey ||\r\n (result.area !== \"body\" && result.area !== \"body-content\") ||\r\n !result.rect ||\r\n !result.tooltipText\r\n ) {\r\n return;\r\n }\r\n\r\n const tooltipPoint = this.toViewportPoint(\r\n result.rect.x + result.rect.width / 2,\r\n result.rect.y + result.rect.height + 8,\r\n );\r\n this.tooltip.show(\r\n tooltipPoint.x,\r\n tooltipPoint.y,\r\n result.tooltipText,\r\n result.tooltipVariant,\r\n );\r\n this.timer = null;\r\n }, this.delay);\r\n return true;\r\n }\r\n}\r\n","import type { ScrollState } from \"../../schema/state\";\r\n\r\n/**\r\n * 解析滚动变更对编辑会话的影响。\r\n */\r\nexport function applyScrollSessionChange(params: {\r\n current: ScrollState;\r\n next: ScrollState;\r\n hasEditingSession: boolean;\r\n}) {\r\n const { current, next, hasEditingSession } = params;\r\n const changed = current.left !== next.left || current.top !== next.top;\r\n\r\n return {\r\n changed,\r\n shouldCloseEditor: changed && hasEditingSession,\r\n };\r\n}\r\n","import { normalizeColumns } from \"../domain/columns/normalize-columns\";\r\nimport type {\r\n HeaderTreeNode,\r\n InternalLeafColumn,\r\n NormalizedColumn,\r\n} from \"../domain/columns/types\";\r\nimport type { HeaderCellLayout } from \"../domain/columns/header-layout-types\";\r\nimport type { ScrollbarLayout } from \"../domain/layout/scrollbar-types\";\r\nimport type { ListTableColumnRuntimeConfig } from \"../schema/state\";\r\nimport type { ListTableOptions } from \"../schema/table-options\";\r\nimport { registerRuntimeColumn } from \"../domain/columns/column-runtime\";\r\nimport { getResolvedColumns } from \"../domain/rows/row-selection\";\r\nimport type { ListTableRenderSnapshot } from \"./layout-service\";\r\nimport type { ColumnSegments } from \"../domain/columns/column-layout\";\r\n\r\nexport interface ListTableRuntimeProjection<RecordType> {\r\n normalizedColumns: NormalizedColumn<RecordType>[];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n headerTree: HeaderTreeNode<RecordType>[];\r\n headerRows: Array<Array<HeaderCellLayout<RecordType>>>;\r\n columnSegments: ColumnSegments<RecordType>;\r\n scrollbarLayout: ScrollbarLayout;\r\n scroll: { left: number; top: number };\r\n scrollPageSize: number;\r\n}\r\n\r\n/**\r\n * 根据当前 options 和选中状态刷新运行时列映射。\r\n */\r\nexport function buildRuntimeColumnsMap<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: Array<string | number>;\r\n}) {\r\n const runtimeColumns: Record<string, ListTableColumnRuntimeConfig> = {};\r\n normalizeColumns(getResolvedColumns(params.options, params.selectedRowKeys)).forEach((column) => {\r\n registerRuntimeColumn(column, runtimeColumns);\r\n });\r\n return runtimeColumns;\r\n}\r\n\r\n/**\r\n * 将渲染快照投影为主类运行时缓存需要的字段。\r\n */\r\nexport function projectRuntimeStateFromSnapshot<RecordType>(\r\n snapshot: ListTableRenderSnapshot<RecordType>,\r\n): ListTableRuntimeProjection<RecordType> {\r\n return {\r\n normalizedColumns: snapshot.normalizedColumns,\r\n leafColumns: snapshot.leafColumns,\r\n headerTree: snapshot.headerTree,\r\n headerRows: snapshot.headerRows,\r\n columnSegments: snapshot.columnSegments,\r\n scrollbarLayout: snapshot.scrollbarLayout,\r\n scroll: snapshot.scroll,\r\n scrollPageSize: snapshot.scrollPageSize,\r\n };\r\n}\r\n\r\nexport interface ListTableRuntimeLayoutCache<RecordType> {\r\n normalizedColumns: NormalizedColumn<RecordType>[];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n headerTree: HeaderTreeNode<RecordType>[];\r\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>;\r\n columnSegments: ColumnSegments<RecordType>;\r\n scrollbarLayout: ScrollbarLayout;\r\n}\r\n\r\nexport interface ApplyListTableRenderPassParams<RecordType> {\r\n didRender: boolean;\r\n empty: boolean;\r\n projection: ListTableRuntimeProjection<RecordType> | null;\r\n emptyNormalizedColumns: NormalizedColumn<RecordType>[] | null;\r\n layout: ListTableRuntimeLayoutCache<RecordType>;\r\n setScroll: (scroll: { left: number; top: number }) => void;\r\n setScrollPageSize: (value: number) => void;\r\n}\r\n\r\n/**\r\n * 将渲染 pass 结果回写到主类布局缓存与滚动状态。\r\n */\r\nexport function applyListTableRenderPassResult<RecordType>(\r\n params: ApplyListTableRenderPassParams<RecordType>,\r\n) {\r\n if (!params.didRender) {\r\n return;\r\n }\r\n\r\n if (params.empty) {\r\n params.layout.normalizedColumns = params.emptyNormalizedColumns ?? [];\r\n params.layout.leafColumns = [];\r\n params.layout.headerTree = [];\r\n params.layout.headerRowsCache = [];\r\n params.layout.columnSegments = {\r\n leftSegment: [],\r\n centerSegment: [],\r\n rightSegment: [],\r\n };\r\n params.layout.scrollbarLayout = {};\r\n return;\r\n }\r\n\r\n const projection = params.projection;\r\n if (!projection) {\r\n return;\r\n }\r\n\r\n params.layout.normalizedColumns = projection.normalizedColumns;\r\n params.layout.leafColumns = projection.leafColumns;\r\n params.layout.headerTree = projection.headerTree;\r\n params.layout.headerRowsCache = projection.headerRows;\r\n params.layout.columnSegments = projection.columnSegments;\r\n params.layout.scrollbarLayout = projection.scrollbarLayout;\r\n params.setScroll(projection.scroll);\r\n params.setScrollPageSize(projection.scrollPageSize);\r\n}\r\n\r\n","import type {\r\n ListTableLinkCellContent,\r\n ListTableTagCellContent,\r\n ListTableTextDecoration,\r\n ListTableTextCellContent,\r\n} from \"../../schema/column\";\r\nimport type { ListTableTheme } from \"../../schema/style\";\r\n\r\ninterface FontStyleCapableContent {\r\n fontSize?: number;\r\n fontWeight?: string;\r\n style?: {\r\n textAlign?: CanvasTextAlign;\r\n fontSize?: number;\r\n fontWeight?: string;\r\n fontFamily?: string;\r\n color?: string;\r\n backgroundColor?: string;\r\n opacity?: number;\r\n textDecoration?: ListTableTextDecoration;\r\n textIndent?: number;\r\n };\r\n}\r\n\r\n/**\r\n * 解析内容片段的字号,优先使用 `style.fontSize`,并兼容旧字段。\r\n */\r\nexport function resolveContentFontSize(\r\n content: FontStyleCapableContent,\r\n fallbackFontSize: number,\r\n) {\r\n return content.style?.fontSize ?? content.fontSize ?? fallbackFontSize;\r\n}\r\n\r\n/**\r\n * 解析内容片段的字重,优先使用 `style.fontWeight`,并兼容旧字段。\r\n */\r\nexport function resolveContentFontWeight(\r\n content: FontStyleCapableContent,\r\n fallbackFontWeight = \"\",\r\n) {\r\n return content.style?.fontWeight ?? content.fontWeight ?? fallbackFontWeight;\r\n}\r\n\r\n/**\r\n * 解析内容片段的字体族。\r\n */\r\nexport function resolveContentFontFamily(\r\n content: FontStyleCapableContent,\r\n theme: ListTableTheme,\r\n) {\r\n return content.style?.fontFamily ?? theme.fontFamily;\r\n}\r\n\r\n/**\r\n * 解析文本 / 链接片段的文字颜色。\r\n */\r\nexport function resolveTextualContentColor<RecordType>(\r\n content:\r\n | ListTableTextCellContent<RecordType>\r\n | ListTableLinkCellContent<RecordType>,\r\n fallbackColor: string,\r\n) {\r\n return content.style?.color ?? content.color ?? fallbackColor;\r\n}\r\n\r\n/**\r\n * 解析标签片段的文字颜色。\r\n */\r\nexport function resolveTagTextColor<RecordType>(\r\n content: ListTableTagCellContent<RecordType>,\r\n fallbackColor: string,\r\n) {\r\n return content.style?.color ?? content.textColor ?? fallbackColor;\r\n}\r\n\r\n/**\r\n * 解析内容片段的背景色。\r\n */\r\nexport function resolveContentBackgroundColor(content: {\r\n style?: {\r\n backgroundColor?: string;\r\n };\r\n}) {\r\n return content.style?.backgroundColor;\r\n}\r\n\r\n/**\r\n * 解析内容片段透明度。\r\n */\r\nexport function resolveContentOpacity(content: {\r\n style?: {\r\n opacity?: number;\r\n };\r\n}) {\r\n const opacity = content.style?.opacity;\r\n if (opacity == null || Number.isNaN(opacity)) {\r\n return 1;\r\n }\r\n return Math.min(Math.max(opacity, 0), 1);\r\n}\r\n\r\n/**\r\n * 解析内容片段的文本装饰。\r\n */\r\nexport function resolveContentTextDecoration(content: {\r\n style?: {\r\n textDecoration?: ListTableTextDecoration;\r\n };\r\n}) {\r\n return content.style?.textDecoration;\r\n}\r\n\r\n/**\r\n * 解析内容片段的文本缩进。\r\n */\r\nexport function resolveContentTextIndent(content: {\r\n style?: {\r\n textIndent?: number;\r\n };\r\n}) {\r\n return content.style?.textIndent ?? 0;\r\n}\r\n\r\n/**\r\n * 解析内容片段的局部文本对齐方式。\r\n */\r\nexport function resolveContentTextAlign(content: {\r\n style?: {\r\n textAlign?: CanvasTextAlign;\r\n };\r\n}) {\r\n return content.style?.textAlign ?? \"left\";\r\n}\r\n\r\n/**\r\n * 解析内容片段的布局宽度,允许文本类内容使用 `style.width` 形成局部对齐盒子。\r\n */\r\nexport function resolveContentLayoutWidth(\r\n content: {\r\n style?: {\r\n width?: number;\r\n };\r\n },\r\n intrinsicWidth: number,\r\n) {\r\n return Math.max(content.style?.width ?? intrinsicWidth, intrinsicWidth);\r\n}\r\n\r\n/**\r\n * 根据局部对齐方式,计算文本绘制起点。\r\n */\r\nexport function resolveAlignedTextX(params: {\r\n baseX: number;\r\n boxWidth: number;\r\n textWidth: number;\r\n textIndent?: number;\r\n textAlign?: CanvasTextAlign;\r\n}) {\r\n const {\r\n baseX,\r\n boxWidth,\r\n textWidth,\r\n textIndent = 0,\r\n textAlign = \"left\",\r\n } = params;\r\n const availableWidth = Math.max(boxWidth - textIndent, 0);\r\n if (textAlign === \"center\") {\r\n return baseX + textIndent + Math.max((availableWidth - textWidth) / 2, 0);\r\n }\r\n if (textAlign === \"right\") {\r\n return baseX + textIndent + Math.max(availableWidth - textWidth, 0);\r\n }\r\n return baseX + textIndent;\r\n}\r\n\r\n/**\r\n * 构建 Canvas 字体字符串。\r\n */\r\nexport function buildCanvasFont(params: {\r\n fontWeight?: string;\r\n fontSize: number;\r\n fontFamily: string;\r\n}) {\r\n const { fontWeight = \"\", fontSize, fontFamily } = params;\r\n return `${fontWeight} ${fontSize}px ${fontFamily}`.trim();\r\n}\r\n\r\n/**\r\n * 计算文本片段的像素边界,用于绘制局部背景。\r\n */\r\nexport function measureTextBounds(ctx: CanvasRenderingContext2D, text: string) {\r\n const metrics = ctx.measureText(text);\r\n const ascent = metrics.actualBoundingBoxAscent || 0;\r\n const descent = metrics.actualBoundingBoxDescent || 0;\r\n const width = metrics.width;\r\n return {\r\n width,\r\n ascent,\r\n descent,\r\n height: Math.max(ascent + descent, 1),\r\n };\r\n}\r\n\r\n/**\r\n * 根据实际字形边界计算视觉居中的 alphabetic 基线。\r\n */\r\nexport function resolveCenteredTextBaselineY(params: {\r\n centerY: number;\r\n ascent: number;\r\n descent: number;\r\n}) {\r\n const { ascent, centerY, descent } = params;\r\n return centerY + (ascent - descent) / 2;\r\n}\r\n\r\n/**\r\n * 绘制文本装饰线。\r\n */\r\nexport function drawTextDecoration(params: {\r\n ctx: CanvasRenderingContext2D;\r\n x: number;\r\n centerY: number;\r\n width: number;\r\n ascent: number;\r\n descent: number;\r\n color: string;\r\n textDecoration?: ListTableTextDecoration;\r\n}) {\r\n const { ctx, x, centerY, width, ascent, descent, color, textDecoration } =\r\n params;\r\n if (!textDecoration || textDecoration === \"none\" || width <= 0) {\r\n return;\r\n }\r\n\r\n let y = centerY;\r\n if (textDecoration === \"underline\") {\r\n y = centerY + descent + 1.5;\r\n } else if (textDecoration === \"line-through\") {\r\n y = centerY - ascent * 0.3;\r\n } else if (textDecoration === \"overline\") {\r\n y = centerY - ascent - 1;\r\n }\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = 1;\r\n ctx.moveTo(x, y);\r\n ctx.lineTo(x + width, y);\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n","import type { ListTableArrowCellContent } from \"../../schema/column\";\r\nimport type { DrawBodyArrowContentParams } from \"./types\";\r\nimport {\r\n resolveContentLayoutWidth,\r\n resolveContentOpacity,\r\n} from \"./content-style\";\r\n\r\nconst DEFAULT_ARROW_SIZE = 16;\r\nconst DEFAULT_UP_COLOR = \"#52c41a\";\r\nconst DEFAULT_DOWN_COLOR = \"#ff4d4f\";\r\n\r\n/**\r\n * 绘制上箭头或下箭头内容。\r\n */\r\nexport function drawBodyArrowContent<RecordType>(\r\n params: DrawBodyArrowContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const width = measureArrowContentWidth(content);\r\n const height = measureArrowContentHeight(content);\r\n const size = Math.min(width, height);\r\n const left = cursorX + (width - size) / 2;\r\n const top = rect.y + (rect.height - size) / 2;\r\n const centerX = left + size / 2;\r\n const color =\r\n content.color ??\r\n (content.direction === \"up\" ? DEFAULT_UP_COLOR : DEFAULT_DOWN_COLOR);\r\n const headY =\r\n content.direction === \"up\" ? top + size * 0.24 : top + size * 0.76;\r\n const shoulderY =\r\n content.direction === \"up\" ? top + size * 0.45 : top + size * 0.55;\r\n const shaftEndY =\r\n content.direction === \"up\" ? top + size * 0.78 : top + size * 0.22;\r\n\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = content.lineWidth ?? 2;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n ctx.beginPath();\r\n ctx.moveTo(left + size * 0.28, shoulderY);\r\n ctx.lineTo(centerX, headY);\r\n ctx.lineTo(left + size * 0.72, shoulderY);\r\n ctx.moveTo(centerX, headY);\r\n ctx.lineTo(centerX, shaftEndY);\r\n ctx.stroke();\r\n ctx.restore();\r\n\r\n if (content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: { x: cursorX, y: top, width, height },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor: content.cursor ?? (content.onClick ? \"pointer\" : undefined),\r\n });\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * 计算箭头内容宽度。\r\n */\r\nexport function measureArrowContentWidth<RecordType>(\r\n content: ListTableArrowCellContent<RecordType>,\r\n) {\r\n return resolveContentLayoutWidth(content, content.size ?? DEFAULT_ARROW_SIZE);\r\n}\r\n\r\n/**\r\n * 计算箭头内容高度。\r\n */\r\nexport function measureArrowContentHeight<RecordType>(\r\n content: ListTableArrowCellContent<RecordType>,\r\n) {\r\n return Math.max(\r\n content.style?.height ?? content.size ?? DEFAULT_ARROW_SIZE,\r\n 0,\r\n );\r\n}\r\n","import { drawBarcodeToCanvas } from \"@canvas-components/barcode\";\r\nimport type { ListTableBarcodeCellContent } from \"../../schema/column\";\r\nimport type { DrawBodyBarcodeContentParams } from \"./types\";\r\nimport {\r\n resolveContentFontFamily,\r\n resolveContentFontSize,\r\n resolveContentFontWeight,\r\n resolveContentOpacity,\r\n} from \"./content-style\";\r\n\r\nconst DEFAULT_BARCODE_WIDTH = 144;\r\nconst DEFAULT_BARCODE_HEIGHT = 56;\r\n\r\ninterface ResolvedBarcodeSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * 绘制条形码内容。\r\n */\r\nexport function drawBodyBarcodeContent<RecordType>(\r\n params: DrawBodyBarcodeContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const size = resolveBarcodeSize(content);\r\n const top = rect.y + (rect.height - size.height) / 2;\r\n\r\n ctx.save();\r\n drawBarcodeToCanvas({\r\n ctx,\r\n x: cursorX,\r\n y: top,\r\n width: size.width,\r\n height: size.height,\r\n value: content.value,\r\n format: content.format,\r\n color: content.style?.color ?? content.color,\r\n backgroundColor: content.style?.backgroundColor ?? content.backgroundColor,\r\n padding: content.padding,\r\n opacity: resolveContentOpacity(content),\r\n displayValue: content.showText,\r\n text: content.text,\r\n fontSize: resolveContentFontSize(content, 12),\r\n fontWeight: resolveContentFontWeight(content, \"\"),\r\n fontFamily: resolveContentFontFamily(content, theme),\r\n textColor: content.style?.color ?? content.color,\r\n });\r\n ctx.restore();\r\n\r\n if (content.preview !== false || content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: top,\r\n width: size.width,\r\n height: size.height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor:\r\n content.cursor ??\r\n (content.preview !== false || content.onClick ? \"pointer\" : undefined),\r\n tooltipText: content.text ?? content.value,\r\n });\r\n }\r\n\r\n return size.width;\r\n}\r\n\r\n/**\r\n * 计算条形码内容宽度。\r\n */\r\nexport function measureBarcodeContentWidth<RecordType>(\r\n content: ListTableBarcodeCellContent<RecordType>,\r\n) {\r\n return resolveBarcodeSize(content).width;\r\n}\r\n\r\n/**\r\n * 计算条形码内容高度。\r\n */\r\nexport function measureBarcodeContentHeight<RecordType>(\r\n content: ListTableBarcodeCellContent<RecordType>,\r\n) {\r\n return resolveBarcodeSize(content).height;\r\n}\r\n\r\nfunction resolveBarcodeSize<RecordType>(\r\n content: ListTableBarcodeCellContent<RecordType>,\r\n): ResolvedBarcodeSize {\r\n return {\r\n width: Math.max(content.style?.width ?? DEFAULT_BARCODE_WIDTH, 1),\r\n height: Math.max(content.style?.height ?? DEFAULT_BARCODE_HEIGHT, 1),\r\n };\r\n}\r\n","import type {\r\n ListTableButtonCellContent,\r\n ListTableButtonSize,\r\n ListTableButtonType,\r\n} from \"../../schema/column\";\r\nimport type { DrawBodyButtonContentParams } from \"./types\";\r\nimport {\r\n buildCanvasFont,\r\n drawTextDecoration,\r\n measureTextBounds,\r\n resolveAlignedTextX,\r\n resolveContentFontFamily,\r\n resolveContentFontSize,\r\n resolveContentFontWeight,\r\n resolveContentLayoutWidth,\r\n resolveContentOpacity,\r\n resolveContentTextAlign,\r\n resolveContentTextDecoration,\r\n resolveContentTextIndent,\r\n} from \"./content-style\";\r\n\r\nconst BUTTON_HEIGHT_MAP: Record<ListTableButtonSize, number> = {\r\n small: 24,\r\n middle: 32,\r\n medium: 32,\r\n large: 40,\r\n};\r\nconst BUTTON_FONT_SIZE_MAP: Record<ListTableButtonSize, number> = {\r\n small: 14,\r\n middle: 14,\r\n medium: 14,\r\n large: 16,\r\n};\r\nconst BUTTON_PADDING_INLINE_MAP: Record<ListTableButtonSize, number> = {\r\n small: 7,\r\n middle: 15,\r\n medium: 15,\r\n large: 15,\r\n};\r\nconst BUTTON_RADIUS_MAP: Record<ListTableButtonSize, number> = {\r\n small: 4,\r\n middle: 6,\r\n medium: 6,\r\n large: 8,\r\n};\r\n\r\ninterface ResolvedButtonPalette {\r\n textColor: string;\r\n backgroundColor: string;\r\n borderColor: string;\r\n bordered: boolean;\r\n dashed: boolean;\r\n}\r\n\r\n/**\r\n * 绘制按钮内容。\r\n */\r\nexport function drawBodyButtonContent<RecordType>(\r\n params: DrawBodyButtonContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const width = measureButtonContentWidth(ctx, content, theme);\r\n const size = resolveButtonSize(content.size);\r\n const height = measureButtonContentHeight(content);\r\n const top = rect.y + (rect.height - height) / 2;\r\n const palette = resolveButtonPalette(content);\r\n const textIndent = resolveContentTextIndent(content);\r\n const paddingInline = BUTTON_PADDING_INLINE_MAP[size];\r\n const radius = BUTTON_RADIUS_MAP[size];\r\n\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n\r\n if (palette.backgroundColor !== \"transparent\" || palette.bordered) {\r\n drawRoundedRectPath(ctx, cursorX, top, width, height, Math.min(radius, height / 2));\r\n if (palette.backgroundColor !== \"transparent\") {\r\n ctx.fillStyle = palette.backgroundColor;\r\n ctx.fill();\r\n }\r\n if (palette.bordered) {\r\n ctx.save();\r\n if (palette.dashed) {\r\n ctx.setLineDash([4, 2]);\r\n }\r\n ctx.strokeStyle = palette.borderColor;\r\n ctx.lineWidth = 1;\r\n ctx.stroke();\r\n ctx.restore();\r\n }\r\n }\r\n\r\n applyButtonTextStyle(ctx, content, theme);\r\n const bounds = measureTextBounds(ctx, content.text);\r\n const textX = resolveAlignedTextX({\r\n baseX: cursorX + paddingInline,\r\n boxWidth: Math.max(width - paddingInline * 2, 0),\r\n textWidth: bounds.width,\r\n textIndent,\r\n textAlign: resolveContentTextAlign(content),\r\n });\r\n ctx.fillStyle = content.style?.color ?? palette.textColor;\r\n ctx.fillText(content.text, textX, rect.y + rect.height / 2);\r\n drawTextDecoration({\r\n ctx,\r\n x: textX,\r\n centerY: rect.y + rect.height / 2,\r\n width: bounds.width,\r\n ascent: bounds.ascent,\r\n descent: bounds.descent,\r\n color: content.style?.color ?? palette.textColor,\r\n textDecoration: resolveContentTextDecoration(content),\r\n });\r\n ctx.restore();\r\n\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: top,\r\n width,\r\n height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor: content.disabled ? \"not-allowed\" : content.cursor ?? (content.onClick ? \"pointer\" : undefined),\r\n tooltipText: content.text,\r\n });\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * 计算按钮片段宽度。\r\n */\r\nexport function measureButtonContentWidth<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableButtonCellContent<RecordType>,\r\n theme: DrawBodyButtonContentParams<RecordType>[\"theme\"],\r\n) {\r\n const size = resolveButtonSize(content.size);\r\n applyButtonTextStyle(ctx, content, theme);\r\n const intrinsicWidth =\r\n Math.max(ctx.measureText(content.text).width + resolveContentTextIndent(content), 0) +\r\n BUTTON_PADDING_INLINE_MAP[size] * 2;\r\n return resolveContentLayoutWidth(content, intrinsicWidth);\r\n}\r\n\r\n/**\r\n * 计算按钮片段高度。\r\n */\r\nexport function measureButtonContentHeight<RecordType>(\r\n content: ListTableButtonCellContent<RecordType>,\r\n) {\r\n return BUTTON_HEIGHT_MAP[resolveButtonSize(content.size)];\r\n}\r\n\r\nfunction applyButtonTextStyle<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableButtonCellContent<RecordType>,\r\n theme: DrawBodyButtonContentParams<RecordType>[\"theme\"],\r\n) {\r\n const size = resolveButtonSize(content.size);\r\n ctx.font = buildCanvasFont({\r\n fontWeight: resolveContentFontWeight(content, \"400\"),\r\n fontSize: resolveContentFontSize(content, BUTTON_FONT_SIZE_MAP[size]),\r\n fontFamily: resolveContentFontFamily(content, theme),\r\n });\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"middle\";\r\n}\r\n\r\nfunction resolveButtonSize(size: ListTableButtonSize | undefined): ListTableButtonSize {\r\n if (size === \"middle\") {\r\n return \"middle\";\r\n }\r\n if (size === \"small\" || size === \"large\") {\r\n return size;\r\n }\r\n return \"medium\";\r\n}\r\n\r\nfunction resolveButtonPalette<RecordType>(\r\n content: ListTableButtonCellContent<RecordType>,\r\n): ResolvedButtonPalette {\r\n if (content.disabled) {\r\n return {\r\n textColor: \"#00000040\",\r\n backgroundColor: content.buttonType === \"text\" || content.buttonType === \"link\" ? \"transparent\" : \"#ffffff\",\r\n borderColor: \"#d9d9d9\",\r\n bordered: content.buttonType !== \"text\" && content.buttonType !== \"link\",\r\n dashed: content.buttonType === \"dashed\",\r\n };\r\n }\r\n\r\n const type = content.buttonType ?? \"default\";\r\n const isDanger = content.danger === true;\r\n const primaryColor = isDanger ? \"#ff4d4f\" : \"#1677ff\";\r\n const subtleTextColor = isDanger ? \"#ff4d4f\" : \"#262626\";\r\n const linkColor = isDanger ? \"#ff4d4f\" : \"#1677ff\";\r\n\r\n if (type === \"primary\") {\r\n return {\r\n textColor: \"#ffffff\",\r\n backgroundColor: primaryColor,\r\n borderColor: primaryColor,\r\n bordered: true,\r\n dashed: false,\r\n };\r\n }\r\n\r\n if (type === \"dashed\") {\r\n return {\r\n textColor: subtleTextColor,\r\n backgroundColor: \"#ffffff\",\r\n borderColor: isDanger ? \"#ffccc7\" : \"#d9d9d9\",\r\n bordered: true,\r\n dashed: true,\r\n };\r\n }\r\n\r\n if (type === \"text\") {\r\n return {\r\n textColor: subtleTextColor,\r\n backgroundColor: \"transparent\",\r\n borderColor: \"transparent\",\r\n bordered: false,\r\n dashed: false,\r\n };\r\n }\r\n\r\n if (type === \"link\") {\r\n return {\r\n textColor: linkColor,\r\n backgroundColor: \"transparent\",\r\n borderColor: \"transparent\",\r\n bordered: false,\r\n dashed: false,\r\n };\r\n }\r\n\r\n return {\r\n textColor: subtleTextColor,\r\n backgroundColor: \"#ffffff\",\r\n borderColor: isDanger ? \"#ffccc7\" : \"#d9d9d9\",\r\n bordered: true,\r\n dashed: false,\r\n };\r\n}\r\n\r\nfunction drawRoundedRectPath(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n radius: number,\r\n) {\r\n const r = Math.min(radius, width / 2, height / 2);\r\n ctx.beginPath();\r\n ctx.moveTo(x + r, y);\r\n ctx.arcTo(x + width, y, x + width, y + height, r);\r\n ctx.arcTo(x + width, y + height, x, y + height, r);\r\n ctx.arcTo(x, y + height, x, y, r);\r\n ctx.arcTo(x, y, x + width, y, r);\r\n ctx.closePath();\r\n}\r\n","import {\r\n drawCanvasChartToCanvas,\r\n getCanvasChartRenderer,\r\n resolveCanvasChartTooltipText,\r\n type CanvasChartSparklineOption,\r\n} from \"@canvas-components/chart\";\r\nimport type {\r\n ListTableChartCellContent,\r\n ListTableChartSize,\r\n ListTableSparklineChartCellContent,\r\n} from \"../../schema/column\";\r\nimport type { DrawBodyChartContentParams } from \"./types\";\r\nimport { resolveContentOpacity } from \"./content-style\";\r\n\r\nconst CHART_WIDTH = 96;\r\nconst CHART_HEIGHT = 28;\r\nconst CHART_SMALL_WIDTH = 80;\r\nconst CHART_SMALL_HEIGHT = 24;\r\n\r\ninterface ChartSizeMetrics {\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * 绘制图表内容。\r\n */\r\nexport function drawBodyChartContent<RecordType>(params: DrawBodyChartContentParams<RecordType>) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n animationProgress,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const metrics = resolveChartSizeMetrics(content);\r\n const top = rect.y + (rect.height - metrics.height) / 2;\r\n const chartType = content.chartType;\r\n const option = resolveChartOption(content);\r\n\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n if (getCanvasChartRenderer(chartType)) {\r\n drawCanvasChartToCanvas({\r\n ctx,\r\n type: chartType,\r\n x: cursorX,\r\n y: top,\r\n width: metrics.width,\r\n height: metrics.height,\r\n option,\r\n animationProgress,\r\n });\r\n }\r\n ctx.restore();\r\n\r\n if (content.preview !== false || content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: top,\r\n width: metrics.width,\r\n height: metrics.height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor:\r\n content.cursor ??\r\n (content.preview !== false || content.onClick ? \"pointer\" : undefined),\r\n tooltipText: resolveChartTooltipText(content, option),\r\n });\r\n }\r\n\r\n return metrics.width;\r\n}\r\n\r\n/**\r\n * 计算图表宽度。\r\n */\r\nexport function measureChartContentWidth<RecordType>(\r\n content: ListTableChartCellContent<RecordType>,\r\n) {\r\n return resolveChartSizeMetrics(content).width;\r\n}\r\n\r\n/**\r\n * 计算图表高度。\r\n */\r\nexport function measureChartContentHeight<RecordType>(\r\n content: ListTableChartCellContent<RecordType>,\r\n) {\r\n return resolveChartSizeMetrics(content).height;\r\n}\r\n\r\n/**\r\n * 解析图表片段的纯文本内容。\r\n */\r\nexport function resolveChartContentPlainText<RecordType>(\r\n content: ListTableChartCellContent<RecordType>,\r\n) {\r\n if (!isSparklineChartContent(content)) {\r\n return \"\";\r\n }\r\n\r\n return resolveSparklineValues(content).join(\", \");\r\n}\r\n\r\nfunction resolveChartTooltipText<RecordType>(\r\n content: ListTableChartCellContent<RecordType>,\r\n option: unknown,\r\n) {\r\n return resolveCanvasChartTooltipText({\r\n type: content.chartType,\r\n option,\r\n }) ?? resolveChartContentPlainText(content);\r\n}\r\n\r\nfunction resolveChartSizeMetrics<RecordType>(\r\n content: ListTableChartCellContent<RecordType>,\r\n): ChartSizeMetrics {\r\n const preset = resolvePresetChartSize(content.size);\r\n const size = content.size;\r\n let width = preset.width;\r\n let height = preset.height;\r\n\r\n if (typeof size === \"number\") {\r\n width = size;\r\n height = preset.height;\r\n } else if (Array.isArray(size)) {\r\n width = size[0];\r\n height = size[1];\r\n } else if (size && typeof size === \"object\") {\r\n width = size.width ?? width;\r\n height = size.height ?? height;\r\n }\r\n\r\n return {\r\n width: Math.max(content.style?.width ?? width, 1),\r\n height: Math.max(content.style?.height ?? height, 1),\r\n };\r\n}\r\n\r\nfunction resolvePresetChartSize(\r\n size: ListTableChartSize | undefined,\r\n): ChartSizeMetrics {\r\n if (size === \"small\") {\r\n return {\r\n width: CHART_SMALL_WIDTH,\r\n height: CHART_SMALL_HEIGHT,\r\n };\r\n }\r\n\r\n return {\r\n width: CHART_WIDTH,\r\n height: CHART_HEIGHT,\r\n };\r\n}\r\n\r\nfunction resolveSparklineOption<RecordType>(\r\n content: ListTableSparklineChartCellContent<RecordType>,\r\n): CanvasChartSparklineOption {\r\n if (content.option) {\r\n return content.option;\r\n }\r\n\r\n return {\r\n yAxis: {\r\n min: content.min,\r\n max: content.max,\r\n },\r\n grid: typeof content.padding === \"number\"\r\n ? {\r\n left: content.padding,\r\n right: content.padding,\r\n top: content.padding,\r\n bottom: content.padding,\r\n }\r\n : undefined,\r\n series: {\r\n type: \"line\",\r\n data: resolveSparklineValues(content),\r\n smooth: content.smooth,\r\n showSymbol: (content.pointRadius ?? 0) > 0,\r\n symbolSize: content.pointRadius ? content.pointRadius * 2 : undefined,\r\n lineStyle: {\r\n color: content.color,\r\n width: content.lineWidth,\r\n },\r\n areaStyle: content.areaColor\r\n ? {\r\n color: content.areaColor,\r\n }\r\n : undefined,\r\n itemStyle: {\r\n color: content.pointColor ?? content.color,\r\n },\r\n },\r\n };\r\n}\r\n\r\nfunction resolveSparklineValues<RecordType>(\r\n content: ListTableSparklineChartCellContent<RecordType>,\r\n) {\r\n if (!content.option) {\r\n return content.values ?? [];\r\n }\r\n\r\n const series = Array.isArray(content.option.series)\r\n ? content.option.series[0]\r\n : content.option.series;\r\n return series?.data ?? content.values ?? [];\r\n}\r\n\r\nexport function resolveChartOption<RecordType>(\r\n content: ListTableChartCellContent<RecordType>,\r\n) {\r\n if (isSparklineChartContent(content)) {\r\n return resolveSparklineOption(content);\r\n }\r\n\r\n return content.option;\r\n}\r\n\r\nfunction isSparklineChartContent<RecordType>(\r\n content: ListTableChartCellContent<RecordType>,\r\n): content is ListTableSparklineChartCellContent<RecordType> {\r\n return content.chartType === \"sparkline\";\r\n}\r\n","import type { ListTableColorCellContent } from \"../../schema/column\";\r\nimport type { DrawBodyColorContentParams } from \"./types\";\r\nimport {\r\n resolveContentLayoutWidth,\r\n resolveContentOpacity,\r\n} from \"./content-style\";\r\n\r\nconst DEFAULT_COLOR_WIDTH = 28;\r\nconst DEFAULT_COLOR_HEIGHT = 28;\r\nconst DEFAULT_COLOR_RADIUS = 4;\r\nconst INVALID_COLOR = \"#ff4d4f\";\r\nconst INVALID_COLOR_BACKGROUND = \"#fff2f0\";\r\n\r\n/**\r\n * 绘制颜色块内容。\r\n */\r\nexport function drawBodyColorContent<RecordType>(\r\n params: DrawBodyColorContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const width = measureColorContentWidth(content);\r\n const height = measureColorContentHeight(content);\r\n const top = rect.y + (rect.height - height) / 2;\r\n const radius = Math.min(\r\n Math.max(content.radius ?? DEFAULT_COLOR_RADIUS, 0),\r\n width / 2,\r\n height / 2,\r\n );\r\n const validColor = isValidCanvasColor(ctx, content.value);\r\n\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n appendRoundedRectPath(ctx, cursorX, top, width, height, radius);\r\n ctx.fillStyle = validColor ? content.value : INVALID_COLOR_BACKGROUND;\r\n ctx.fill();\r\n ctx.strokeStyle = validColor\r\n ? content.borderColor ?? \"rgba(0, 0, 0, 0.15)\"\r\n : INVALID_COLOR;\r\n ctx.lineWidth = 1;\r\n ctx.stroke();\r\n if (!validColor) {\r\n drawInvalidColorCross(ctx, cursorX, top, width, height);\r\n }\r\n ctx.restore();\r\n\r\n if (content.onClick || content.cursor || !validColor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: { x: cursorX, y: top, width, height },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor:\r\n content.cursor ??\r\n (content.onClick ? \"pointer\" : !validColor ? \"help\" : undefined),\r\n tooltipText: validColor\r\n ? content.value\r\n : `无法解析:${content.value}`,\r\n });\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * 使用浏览器原生能力判断颜色值是否可被 Canvas 解析。\r\n */\r\nexport function isValidCanvasColor(\r\n ctx: CanvasRenderingContext2D,\r\n value: string,\r\n) {\r\n const normalizedValue = value.trim();\r\n if (!normalizedValue) {\r\n return false;\r\n }\r\n\r\n if (typeof CSS !== \"undefined\" && typeof CSS.supports === \"function\") {\r\n return CSS.supports(\"color\", normalizedValue);\r\n }\r\n\r\n const originalFillStyle = ctx.fillStyle;\r\n try {\r\n ctx.fillStyle = \"#010203\";\r\n ctx.fillStyle = normalizedValue;\r\n const firstResult = String(ctx.fillStyle).toLowerCase();\r\n ctx.fillStyle = \"#040506\";\r\n ctx.fillStyle = normalizedValue;\r\n const secondResult = String(ctx.fillStyle).toLowerCase();\r\n return firstResult !== \"#010203\" || secondResult !== \"#040506\";\r\n } finally {\r\n ctx.fillStyle = originalFillStyle;\r\n }\r\n}\r\n\r\n/**\r\n * 计算颜色块宽度。\r\n */\r\nexport function measureColorContentWidth<RecordType>(\r\n content: ListTableColorCellContent<RecordType>,\r\n) {\r\n return resolveContentLayoutWidth(content, content.width ?? DEFAULT_COLOR_WIDTH);\r\n}\r\n\r\n/**\r\n * 计算颜色块高度。\r\n */\r\nexport function measureColorContentHeight<RecordType>(\r\n content: ListTableColorCellContent<RecordType>,\r\n) {\r\n return Math.max(content.style?.height ?? content.height ?? DEFAULT_COLOR_HEIGHT, 0);\r\n}\r\n\r\nfunction drawInvalidColorCross(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n) {\r\n const padding = Math.max(Math.min(width, height) * 0.28, 3);\r\n ctx.beginPath();\r\n ctx.moveTo(x + padding, y + padding);\r\n ctx.lineTo(x + width - padding, y + height - padding);\r\n ctx.moveTo(x + width - padding, y + padding);\r\n ctx.lineTo(x + padding, y + height - padding);\r\n ctx.strokeStyle = INVALID_COLOR;\r\n ctx.lineWidth = 2;\r\n ctx.lineCap = \"round\";\r\n ctx.stroke();\r\n}\r\n\r\nfunction appendRoundedRectPath(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n radius: number,\r\n) {\r\n ctx.beginPath();\r\n ctx.moveTo(x + radius, y);\r\n ctx.lineTo(x + width - radius, y);\r\n ctx.arcTo(x + width, y, x + width, y + radius, radius);\r\n ctx.lineTo(x + width, y + height - radius);\r\n ctx.arcTo(x + width, y + height, x + width - radius, y + height, radius);\r\n ctx.lineTo(x + radius, y + height);\r\n ctx.arcTo(x, y + height, x, y + height - radius, radius);\r\n ctx.lineTo(x, y + radius);\r\n ctx.arcTo(x, y, x + radius, y, radius);\r\n ctx.closePath();\r\n}\r\n","import type {\r\n ListTableImageCellContent,\r\n ListTableImageObjectFit,\r\n} from \"../../schema/column\";\r\nimport type { DrawBodyImageContentParams } from \"./types\";\r\nimport { resolveContentOpacity } from \"./content-style\";\r\n\r\nconst DEFAULT_IMAGE_SIZE = 40;\r\nconst PLACEHOLDER_BACKGROUND_COLOR = \"#f5f8fc\";\r\nconst PLACEHOLDER_BORDER_COLOR = \"#d9e1ec\";\r\nconst PLACEHOLDER_ICON_COLOR = \"#b8c4d3\";\r\n\r\ninterface ResolvedImageSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\ninterface ImageCacheLoadingEntry {\r\n status: \"loading\";\r\n image: HTMLImageElement;\r\n callbacks: Set<() => void>;\r\n}\r\n\r\ninterface ImageCacheLoadedEntry {\r\n status: \"loaded\";\r\n image: HTMLImageElement;\r\n}\r\n\r\ninterface ImageCacheErrorEntry {\r\n status: \"error\";\r\n}\r\n\r\ntype ImageCacheEntry =\r\n | ImageCacheLoadingEntry\r\n | ImageCacheLoadedEntry\r\n | ImageCacheErrorEntry;\r\n\r\nconst imageCache = new Map<string, ImageCacheEntry>();\r\n\r\n/**\r\n * 绘制图片内容。\r\n */\r\nexport function drawBodyImageContent<RecordType>(\r\n params: DrawBodyImageContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n requestRender,\r\n } = params;\r\n const image = ensureImageLoaded(content.src, requestRender);\r\n const { width, height } = resolveImageContentSize(content, image);\r\n const top = rect.y + (rect.height - height) / 2;\r\n\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n ctx.beginPath();\r\n ctx.rect(cursorX, top, width, height);\r\n ctx.clip();\r\n\r\n if (image) {\r\n drawImageWithObjectFit(ctx, image, content, cursorX, top, width, height);\r\n } else {\r\n drawImagePlaceholder(\r\n ctx,\r\n cursorX,\r\n top,\r\n width,\r\n height,\r\n content.style?.backgroundColor ?? PLACEHOLDER_BACKGROUND_COLOR,\r\n );\r\n }\r\n ctx.restore();\r\n\r\n if (content.preview !== false || content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: top,\r\n width,\r\n height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor:\r\n content.cursor ??\r\n (content.preview !== false || content.onClick ? \"pointer\" : undefined),\r\n tooltipText: content.alt,\r\n });\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * 计算图片内容宽度。\r\n */\r\nexport function measureImageContentWidth<RecordType>(\r\n content: ListTableImageCellContent<RecordType>,\r\n) {\r\n return resolveImageContentSize(content, getLoadedImage(content.src)).width;\r\n}\r\n\r\n/**\r\n * 计算图片内容高度。\r\n */\r\nexport function measureImageContentHeight<RecordType>(\r\n content: ListTableImageCellContent<RecordType>,\r\n) {\r\n return resolveImageContentSize(content, getLoadedImage(content.src)).height;\r\n}\r\n\r\nexport function ensureImageLoaded(\r\n src: string,\r\n requestRender?: () => void,\r\n) {\r\n if (!src) {\r\n return null;\r\n }\r\n\r\n const cached = imageCache.get(src);\r\n if (cached?.status === \"loaded\") {\r\n return cached.image;\r\n }\r\n\r\n if (cached?.status === \"loading\") {\r\n if (requestRender) {\r\n cached.callbacks.add(requestRender);\r\n }\r\n return null;\r\n }\r\n\r\n if (cached?.status === \"error\") {\r\n return null;\r\n }\r\n\r\n const image = new Image();\r\n const callbacks = new Set<() => void>();\r\n if (requestRender) {\r\n callbacks.add(requestRender);\r\n }\r\n\r\n imageCache.set(src, {\r\n status: \"loading\",\r\n image,\r\n callbacks,\r\n });\r\n\r\n image.onload = () => {\r\n imageCache.set(src, {\r\n status: \"loaded\",\r\n image,\r\n });\r\n callbacks.forEach((callback) => {\r\n callback();\r\n });\r\n };\r\n\r\n image.onerror = () => {\r\n imageCache.set(src, {\r\n status: \"error\",\r\n });\r\n callbacks.forEach((callback) => {\r\n callback();\r\n });\r\n };\r\n\r\n image.src = src;\r\n return null;\r\n}\r\n\r\nfunction getLoadedImage(src: string) {\r\n const cached = src ? imageCache.get(src) : undefined;\r\n return cached?.status === \"loaded\" ? cached.image : null;\r\n}\r\n\r\nfunction resolveImageContentSize<RecordType>(\r\n content: ListTableImageCellContent<RecordType>,\r\n image: HTMLImageElement | null,\r\n): ResolvedImageSize {\r\n const styleWidth = content.style?.width;\r\n const styleHeight = content.style?.height;\r\n const naturalWidth = image?.naturalWidth ?? 0;\r\n const naturalHeight = image?.naturalHeight ?? 0;\r\n const hasNaturalRatio = naturalWidth > 0 && naturalHeight > 0;\r\n const aspectRatio = hasNaturalRatio ? naturalWidth / naturalHeight : 1;\r\n\r\n if (styleWidth != null && styleHeight != null) {\r\n return {\r\n width: Math.max(styleWidth, 1),\r\n height: Math.max(styleHeight, 1),\r\n };\r\n }\r\n\r\n if (styleWidth != null) {\r\n return {\r\n width: Math.max(styleWidth, 1),\r\n height: Math.max(hasNaturalRatio ? styleWidth / aspectRatio : styleWidth, 1),\r\n };\r\n }\r\n\r\n if (styleHeight != null) {\r\n return {\r\n width: Math.max(hasNaturalRatio ? styleHeight * aspectRatio : styleHeight, 1),\r\n height: Math.max(styleHeight, 1),\r\n };\r\n }\r\n\r\n if (hasNaturalRatio) {\r\n return {\r\n width: Math.max(DEFAULT_IMAGE_SIZE * aspectRatio, 1),\r\n height: DEFAULT_IMAGE_SIZE,\r\n };\r\n }\r\n\r\n return {\r\n width: DEFAULT_IMAGE_SIZE,\r\n height: DEFAULT_IMAGE_SIZE,\r\n };\r\n}\r\n\r\nfunction drawImageWithObjectFit<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n image: HTMLImageElement,\r\n content: ListTableImageCellContent<RecordType>,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n) {\r\n const naturalWidth = image.naturalWidth || width;\r\n const naturalHeight = image.naturalHeight || height;\r\n const objectFit = resolveObjectFit(content);\r\n const backgroundColor = content.style?.backgroundColor ?? PLACEHOLDER_BACKGROUND_COLOR;\r\n const targetRect = resolveObjectFitRect({\r\n objectFit,\r\n boxWidth: width,\r\n boxHeight: height,\r\n naturalWidth,\r\n naturalHeight,\r\n });\r\n\r\n if (objectFit !== \"fill\") {\r\n ctx.fillStyle = backgroundColor;\r\n ctx.fillRect(x, y, width, height);\r\n }\r\n\r\n ctx.drawImage(\r\n image,\r\n x + targetRect.x,\r\n y + targetRect.y,\r\n targetRect.width,\r\n targetRect.height,\r\n );\r\n}\r\n\r\nfunction resolveObjectFit<RecordType>(\r\n content: ListTableImageCellContent<RecordType>,\r\n): ListTableImageObjectFit {\r\n return content.style?.objectFit ?? \"cover\";\r\n}\r\n\r\nfunction resolveObjectFitRect(params: {\r\n objectFit: ListTableImageObjectFit;\r\n boxWidth: number;\r\n boxHeight: number;\r\n naturalWidth: number;\r\n naturalHeight: number;\r\n}) {\r\n const { objectFit, boxWidth, boxHeight, naturalWidth, naturalHeight } = params;\r\n if (objectFit === \"fill\") {\r\n return { x: 0, y: 0, width: boxWidth, height: boxHeight };\r\n }\r\n\r\n if (objectFit === \"none\") {\r\n return {\r\n x: (boxWidth - naturalWidth) / 2,\r\n y: (boxHeight - naturalHeight) / 2,\r\n width: naturalWidth,\r\n height: naturalHeight,\r\n };\r\n }\r\n\r\n const containScale = Math.min(boxWidth / naturalWidth, boxHeight / naturalHeight);\r\n const coverScale = Math.max(boxWidth / naturalWidth, boxHeight / naturalHeight);\r\n const scale =\r\n objectFit === \"contain\"\r\n ? containScale\r\n : objectFit === \"scale-down\"\r\n ? Math.min(1, containScale)\r\n : coverScale;\r\n const width = naturalWidth * scale;\r\n const height = naturalHeight * scale;\r\n\r\n return {\r\n x: (boxWidth - width) / 2,\r\n y: (boxHeight - height) / 2,\r\n width,\r\n height,\r\n };\r\n}\r\n\r\nfunction drawImagePlaceholder(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n backgroundColor = PLACEHOLDER_BACKGROUND_COLOR,\r\n) {\r\n ctx.fillStyle = backgroundColor;\r\n ctx.fillRect(x, y, width, height);\r\n ctx.strokeStyle = PLACEHOLDER_BORDER_COLOR;\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(x + 0.5, y + 0.5, Math.max(width - 1, 0), Math.max(height - 1, 0));\r\n\r\n const inset = Math.max(Math.min(width, height) * 0.22, 4);\r\n const iconLeft = x + inset;\r\n const iconTop = y + inset;\r\n const iconWidth = Math.max(width - inset * 2, 6);\r\n const iconHeight = Math.max(height - inset * 2, 6);\r\n const sunRadius = Math.max(Math.min(iconWidth, iconHeight) * 0.12, 1.5);\r\n\r\n ctx.strokeStyle = PLACEHOLDER_ICON_COLOR;\r\n ctx.fillStyle = PLACEHOLDER_ICON_COLOR;\r\n ctx.beginPath();\r\n ctx.moveTo(iconLeft, iconTop + iconHeight);\r\n ctx.lineTo(iconLeft + iconWidth * 0.34, iconTop + iconHeight * 0.54);\r\n ctx.lineTo(iconLeft + iconWidth * 0.54, iconTop + iconHeight * 0.76);\r\n ctx.lineTo(iconLeft + iconWidth * 0.78, iconTop + iconHeight * 0.34);\r\n ctx.lineTo(iconLeft + iconWidth, iconTop + iconHeight);\r\n ctx.stroke();\r\n\r\n ctx.beginPath();\r\n ctx.arc(\r\n iconLeft + iconWidth * 0.72,\r\n iconTop + iconHeight * 0.28,\r\n sunRadius,\r\n 0,\r\n Math.PI * 2,\r\n );\r\n ctx.fill();\r\n}\r\n","import type { ListTableSymbolType } from \"../../schema/column\";\r\n\r\nconst SYMBOL_COLOR_MAP: Record<ListTableSymbolType, string> = {\r\n star: \"#fadb14\",\r\n sun: \"#faad14\",\r\n moon: \"#597ef7\",\r\n};\r\n\r\n/**\r\n * 绘制可部分填充的星星、太阳或月亮图形。\r\n */\r\nexport function drawCellSymbol(\r\n ctx: CanvasRenderingContext2D,\r\n params: {\r\n type: ListTableSymbolType;\r\n x: number;\r\n y: number;\r\n size: number;\r\n activeColor: string;\r\n inactiveColor: string;\r\n fillRatio: number;\r\n },\r\n) {\r\n const { type, x, y, size, activeColor, inactiveColor } = params;\r\n const fillRatio = Math.min(Math.max(params.fillRatio, 0), 1);\r\n appendCellSymbolPath(ctx, type, x, y, size);\r\n ctx.fillStyle = inactiveColor;\r\n ctx.fill(\"evenodd\");\r\n\r\n if (fillRatio <= 0) {\r\n return;\r\n }\r\n\r\n ctx.save();\r\n appendCellSymbolPath(ctx, type, x, y, size);\r\n ctx.clip(\"evenodd\");\r\n ctx.fillStyle = activeColor;\r\n ctx.fillRect(x, y, size * fillRatio, size);\r\n ctx.restore();\r\n}\r\n\r\n/**\r\n * 获取独立图形的默认颜色。\r\n */\r\nexport function resolveCellSymbolColor(type: ListTableSymbolType) {\r\n return SYMBOL_COLOR_MAP[type];\r\n}\r\n\r\n/**\r\n * 构建图形路径。\r\n */\r\nexport function appendCellSymbolPath(\r\n ctx: CanvasRenderingContext2D,\r\n type: ListTableSymbolType,\r\n x: number,\r\n y: number,\r\n size: number,\r\n) {\r\n if (type === \"moon\") {\r\n appendMoonPath(ctx, x, y, size);\r\n return;\r\n }\r\n\r\n const pointCount = type === \"sun\" ? 16 : 10;\r\n const outerRadius = size / 2;\r\n const innerRadius = outerRadius * (type === \"sun\" ? 0.68 : 0.5);\r\n const centerX = x + outerRadius;\r\n const centerY = y + outerRadius;\r\n ctx.beginPath();\r\n for (let index = 0; index < pointCount; index += 1) {\r\n const angle = -Math.PI / 2 + (Math.PI * 2 * index) / pointCount;\r\n const radius = index % 2 === 0 ? outerRadius : innerRadius;\r\n const pointX = centerX + Math.cos(angle) * radius;\r\n const pointY = centerY + Math.sin(angle) * radius;\r\n if (index === 0) ctx.moveTo(pointX, pointY);\r\n else ctx.lineTo(pointX, pointY);\r\n }\r\n ctx.closePath();\r\n}\r\n\r\nfunction appendMoonPath(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n) {\r\n ctx.beginPath();\r\n ctx.moveTo(x + size * 0.64, y + size * 0.04);\r\n ctx.bezierCurveTo(\r\n x + size * 0.28,\r\n y + size * 0.08,\r\n x + size * 0.06,\r\n y + size * 0.32,\r\n x + size * 0.06,\r\n y + size * 0.54,\r\n );\r\n ctx.bezierCurveTo(\r\n x + size * 0.06,\r\n y + size * 0.8,\r\n x + size * 0.32,\r\n y + size * 0.98,\r\n x + size * 0.64,\r\n y + size * 0.96,\r\n );\r\n ctx.bezierCurveTo(\r\n x + size * 0.43,\r\n y + size * 0.78,\r\n x + size * 0.37,\r\n y + size * 0.58,\r\n x + size * 0.41,\r\n y + size * 0.39,\r\n );\r\n ctx.bezierCurveTo(\r\n x + size * 0.44,\r\n y + size * 0.22,\r\n x + size * 0.53,\r\n y + size * 0.1,\r\n x + size * 0.64,\r\n y + size * 0.04,\r\n );\r\n ctx.closePath();\r\n}\r\n","import type { ListTableIconCellContent } from \"../../schema/column\";\r\nimport type { DrawBodyIconContentParams } from \"./types\";\r\nimport {\r\n resolveContentLayoutWidth,\r\n resolveContentOpacity,\r\n} from \"./content-style\";\r\nimport { drawCellSymbol, resolveCellSymbolColor } from \"./draw-symbol\";\r\n\r\nconst DEFAULT_ICON_SIZE = 20;\r\n\r\n/**\r\n * 绘制独立的太阳、月亮或星星图标。\r\n */\r\nexport function drawBodyIconContent<RecordType>(\r\n params: DrawBodyIconContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const width = measureIconContentWidth(content);\r\n const height = measureIconContentHeight(content);\r\n const size = Math.min(width, height);\r\n const left = cursorX + (width - size) / 2;\r\n const top = rect.y + (rect.height - size) / 2;\r\n const color =\r\n content.style?.color ??\r\n content.color ??\r\n resolveCellSymbolColor(content.icon);\r\n\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n drawCellSymbol(ctx, {\r\n type: content.icon,\r\n x: left,\r\n y: top,\r\n size,\r\n activeColor: color,\r\n inactiveColor: color,\r\n fillRatio: 1,\r\n });\r\n ctx.restore();\r\n\r\n if (content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: { x: cursorX, y: top, width, height },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor: content.cursor ?? (content.onClick ? \"pointer\" : undefined),\r\n tooltipText: content.icon,\r\n });\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * 计算图标宽度。\r\n */\r\nexport function measureIconContentWidth<RecordType>(\r\n content: ListTableIconCellContent<RecordType>,\r\n) {\r\n return resolveContentLayoutWidth(content, content.size ?? DEFAULT_ICON_SIZE);\r\n}\r\n\r\n/**\r\n * 计算图标高度。\r\n */\r\nexport function measureIconContentHeight<RecordType>(\r\n content: ListTableIconCellContent<RecordType>,\r\n) {\r\n return Math.max(\r\n content.style?.height ?? content.size ?? DEFAULT_ICON_SIZE,\r\n 0,\r\n );\r\n}\r\n","import type { ListTableLinkCellContent } from \"../../schema/column\";\r\nimport type { DrawBodyLinkContentParams } from \"./types\";\r\nimport {\r\n buildCanvasFont,\r\n drawTextDecoration,\r\n measureTextBounds,\r\n resolveAlignedTextX,\r\n resolveContentBackgroundColor,\r\n resolveContentFontFamily,\r\n resolveContentFontSize,\r\n resolveContentFontWeight,\r\n resolveContentLayoutWidth,\r\n resolveContentOpacity,\r\n resolveContentTextAlign,\r\n resolveContentTextDecoration,\r\n resolveContentTextIndent,\r\n resolveTextualContentColor,\r\n} from \"./content-style\";\r\n\r\n/**\r\n * 绘制单个链接片段,并注册点击命中区域。\r\n */\r\nexport function drawBodyLinkContent<RecordType>(\r\n params: DrawBodyLinkContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n hovered,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n tooltipText,\r\n } = params;\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n applyLinkContentStyle(ctx, content, theme, hovered);\r\n const bounds = measureTextBounds(ctx, content.text);\r\n const textIndent = resolveContentTextIndent(content);\r\n const intrinsicWidth = Math.max(bounds.width + textIndent, 0);\r\n const width = resolveContentLayoutWidth(content, intrinsicWidth);\r\n const textX = resolveAlignedTextX({\r\n baseX: cursorX,\r\n boxWidth: width,\r\n textWidth: bounds.width,\r\n textIndent,\r\n textAlign: resolveContentTextAlign(content),\r\n });\r\n drawLinkContentBackground(ctx, content, textX, rect.y + rect.height / 2);\r\n ctx.fillText(content.text, textX, rect.y + rect.height / 2);\r\n\r\n const textDecoration = resolveLinkTextDecoration(content, hovered);\r\n if (textDecoration === \"underline\") {\r\n const baselineY =\r\n rect.y + rect.height / 2 + getLinkUnderlineOffset(ctx, content, theme, hovered);\r\n ctx.beginPath();\r\n ctx.strokeStyle = resolveLinkColor(content, hovered);\r\n ctx.lineWidth = 1;\r\n ctx.moveTo(textX, baselineY);\r\n ctx.lineTo(textX + bounds.width, baselineY);\r\n ctx.stroke();\r\n } else {\r\n drawTextDecoration({\r\n ctx,\r\n x: textX,\r\n centerY: rect.y + rect.height / 2,\r\n width: bounds.width,\r\n ascent: bounds.ascent,\r\n descent: bounds.descent,\r\n color: resolveLinkColor(content, hovered),\r\n textDecoration,\r\n });\r\n }\r\n ctx.restore();\r\n\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: rect.y,\r\n width,\r\n height: rect.height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor: content.disabled ? \"not-allowed\" : content.cursor ?? \"pointer\",\r\n tooltipText,\r\n });\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * 计算链接片段宽度。\r\n */\r\nexport function measureLinkContentWidth<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableLinkCellContent<RecordType>,\r\n theme: DrawBodyLinkContentParams<RecordType>[\"theme\"],\r\n) {\r\n applyLinkContentStyle(ctx, content, theme, false);\r\n const intrinsicWidth = Math.max(\r\n ctx.measureText(content.text).width + resolveContentTextIndent(content),\r\n 0,\r\n );\r\n return resolveContentLayoutWidth(content, intrinsicWidth);\r\n}\r\n\r\n/**\r\n * 应用链接文本样式。\r\n */\r\nfunction applyLinkContentStyle<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableLinkCellContent<RecordType>,\r\n theme: DrawBodyLinkContentParams<RecordType>[\"theme\"],\r\n hovered = false,\r\n) {\r\n ctx.fillStyle = resolveLinkColor(content, hovered);\r\n ctx.font = buildCanvasFont({\r\n fontWeight: resolveContentFontWeight(content),\r\n fontSize: resolveContentFontSize(content, theme.fontSize),\r\n fontFamily: resolveContentFontFamily(content, theme),\r\n });\r\n ctx.textBaseline = \"middle\";\r\n ctx.textAlign = \"left\";\r\n}\r\n\r\nfunction drawLinkContentBackground<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableLinkCellContent<RecordType>,\r\n cursorX: number,\r\n centerY: number,\r\n) {\r\n const backgroundColor = resolveContentBackgroundColor(content);\r\n if (!backgroundColor) {\r\n return;\r\n }\r\n\r\n const bounds = measureTextBounds(ctx, content.text);\r\n ctx.save();\r\n ctx.fillStyle = backgroundColor;\r\n ctx.fillRect(\r\n cursorX,\r\n centerY - bounds.ascent,\r\n bounds.width,\r\n bounds.height,\r\n );\r\n ctx.restore();\r\n}\r\n\r\n/**\r\n * 计算下划线的垂直偏移。\r\n */\r\nfunction getLinkUnderlineOffset<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableLinkCellContent<RecordType>,\r\n theme: DrawBodyLinkContentParams<RecordType>[\"theme\"],\r\n hovered = false,\r\n) {\r\n applyLinkContentStyle(ctx, content, theme, hovered);\r\n const metrics = ctx.measureText(content.text);\r\n const descent = metrics.actualBoundingBoxDescent || 2;\r\n return descent + 1.5;\r\n}\r\n\r\n/**\r\n * 解析链接当前状态下的颜色。\r\n */\r\nfunction resolveLinkColor<RecordType>(\r\n content: ListTableLinkCellContent<RecordType>,\r\n hovered = false,\r\n) {\r\n if (content.disabled) {\r\n return content.disabledColor ?? content.style?.color ?? \"#bfbfbf\";\r\n }\r\n\r\n if (hovered) {\r\n return content.hoverColor ?? content.style?.color ?? \"#4096ff\";\r\n }\r\n\r\n if (content.visited) {\r\n return content.visitedColor ?? content.style?.color ?? \"#722ed1\";\r\n }\r\n\r\n return resolveTextualContentColor(content, \"#1677ff\");\r\n}\r\n\r\n/**\r\n * 判断当前是否应绘制链接下划线。\r\n */\r\nfunction shouldDrawUnderline<RecordType>(\r\n underline: ListTableLinkCellContent<RecordType>[\"underline\"],\r\n hovered = false,\r\n) {\r\n if (underline === false) {\r\n return false;\r\n }\r\n\r\n if (underline === \"hover\") {\r\n return hovered;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction resolveLinkTextDecoration<RecordType>(\r\n content: ListTableLinkCellContent<RecordType>,\r\n hovered = false,\r\n) {\r\n const styleTextDecoration = resolveContentTextDecoration(content);\r\n if (styleTextDecoration) {\r\n return styleTextDecoration;\r\n }\r\n\r\n return shouldDrawUnderline(content.underline, hovered) ? \"underline\" : \"none\";\r\n}\r\n","import {\r\n DEFAULT_HEADER_ROW_HEIGHT,\r\n DEFAULT_ROW_HEIGHT,\r\n} from \"../../domain/constants\";\r\nimport { getValueByDataIndex } from \"../../domain/data/get-value-by-data-index\";\r\nimport type {\r\n ListTableNestedTableCellContent,\r\n TableColumnDataIndex,\r\n} from \"../../schema/column\";\r\nimport type { DrawBodyNestedTableContentParams } from \"./types\";\r\n\r\nconst DEFAULT_COLUMN_WIDTH = 140;\r\nconst TABLE_PADDING_X = 12;\r\n\r\nexport function drawBodyNestedTableContent<RecordType>(\r\n params: DrawBodyNestedTableContentParams<RecordType>,\r\n) {\r\n const { ctx, rect, content, cursorX, theme } = params;\r\n const width = resolveNestedTableDrawWidth(\r\n content,\r\n params.availableWidth ?? rect.width,\r\n );\r\n const headerHeight = resolveNestedTableHeaderHeight(content);\r\n const rowHeight = resolveNestedTableRowHeight(content);\r\n const rows = content.dataSource;\r\n const height = measureNestedTableContentHeight(content);\r\n const x = cursorX;\r\n const y = rect.y;\r\n const columns = content.columns;\r\n const columnWidths = resolveColumnWidths(content, width);\r\n const bordered = content.bordered !== false;\r\n const borderColor = theme.borderColor;\r\n const highlight = params.highlight ?? null;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(rect.x, rect.y, rect.width, rect.height);\r\n ctx.clip();\r\n\r\n ctx.fillStyle = theme.backgroundColor;\r\n ctx.fillRect(x, y, width, height);\r\n\r\n ctx.fillStyle = theme.headerBackgroundColor;\r\n ctx.fillRect(x, y, width, headerHeight);\r\n\r\n let currentX = x;\r\n columns.forEach((column, columnIndex) => {\r\n const columnWidth = columnWidths[columnIndex] ?? DEFAULT_COLUMN_WIDTH;\r\n if (\r\n isNestedTableColumnHighlighted(content, column, columnIndex, highlight)\r\n ) {\r\n ctx.fillStyle = theme.selectionBackgroundColor;\r\n ctx.fillRect(currentX, y, columnWidth, headerHeight);\r\n }\r\n drawNestedTableText({\r\n ctx,\r\n text: column.title,\r\n x: currentX,\r\n y,\r\n width: columnWidth,\r\n height: headerHeight,\r\n align: column.align,\r\n font: `${theme.headerFontWeight} ${theme.fontSize}px ${theme.fontFamily}`,\r\n color: theme.headerTextColor,\r\n });\r\n pushNestedTableDescriptor({\r\n drawParams: params,\r\n content,\r\n rect: {\r\n x: currentX,\r\n y,\r\n width: columnWidth,\r\n height: headerHeight,\r\n },\r\n column,\r\n columnIndex,\r\n });\r\n currentX += columnWidth;\r\n });\r\n\r\n if (rows.length === 0) {\r\n drawNestedTableText({\r\n ctx,\r\n text: content.emptyText ?? \"暂无数据\",\r\n x,\r\n y: y + headerHeight,\r\n width,\r\n height: rowHeight,\r\n align: \"center\",\r\n font: `${theme.fontSize}px ${theme.fontFamily}`,\r\n color: theme.mutedTextColor,\r\n });\r\n if (bordered) {\r\n drawNestedTableGridLines({\r\n ctx,\r\n x,\r\n y,\r\n width,\r\n height,\r\n headerHeight,\r\n rowHeight,\r\n rowCount: 1,\r\n columnWidths,\r\n color: borderColor,\r\n skipOuterBorders: params.skipOuterBorders,\r\n });\r\n }\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n rows.forEach((record, rowIndex) => {\r\n const rowY = y + headerHeight + rowIndex * rowHeight;\r\n const rowHighlighted = isNestedTableRowHighlighted(\r\n content,\r\n record,\r\n rowIndex,\r\n highlight,\r\n );\r\n if (rowHighlighted) {\r\n ctx.fillStyle = theme.selectionBackgroundColor;\r\n ctx.fillRect(x, rowY, width, rowHeight);\r\n } else if (rowIndex % 2 === 1) {\r\n ctx.fillStyle = theme.stripedBackgroundColor;\r\n ctx.fillRect(x, rowY, width, rowHeight);\r\n }\r\n let cellX = x;\r\n columns.forEach((column, columnIndex) => {\r\n const columnWidth = columnWidths[columnIndex] ?? DEFAULT_COLUMN_WIDTH;\r\n if (\r\n !rowHighlighted &&\r\n isNestedTableColumnHighlighted(content, column, columnIndex, highlight)\r\n ) {\r\n ctx.fillStyle = theme.selectionBackgroundColor;\r\n ctx.fillRect(cellX, rowY, columnWidth, rowHeight);\r\n }\r\n drawNestedTableText({\r\n ctx,\r\n text: String(getValueByDataIndex(record, column.dataIndex) ?? \"\"),\r\n x: cellX,\r\n y: rowY,\r\n width: columnWidth,\r\n height: rowHeight,\r\n align: column.align,\r\n font: `${theme.fontSize}px ${theme.fontFamily}`,\r\n color: theme.textColor,\r\n });\r\n pushNestedTableDescriptor({\r\n drawParams: params,\r\n content,\r\n record,\r\n rect: {\r\n x: cellX,\r\n y: rowY,\r\n width: columnWidth,\r\n height: rowHeight,\r\n },\r\n column,\r\n columnIndex,\r\n rowIndex,\r\n });\r\n cellX += columnWidth;\r\n });\r\n });\r\n\r\n if (bordered) {\r\n drawNestedTableGridLines({\r\n ctx,\r\n x,\r\n y,\r\n width,\r\n height,\r\n headerHeight,\r\n rowHeight,\r\n rowCount: Math.max(rows.length, 1),\r\n columnWidths,\r\n color: borderColor,\r\n skipOuterBorders: params.skipOuterBorders,\r\n });\r\n }\r\n\r\n ctx.restore();\r\n}\r\n\r\nexport function measureNestedTableContentWidth(\r\n content: ListTableNestedTableCellContent,\r\n) {\r\n return resolveNestedTableWidth(content);\r\n}\r\n\r\nexport function measureNestedTableContentHeight(\r\n content: ListTableNestedTableCellContent,\r\n) {\r\n return (\r\n resolveNestedTableHeaderHeight(content) +\r\n Math.max(content.dataSource.length, 1) *\r\n resolveNestedTableRowHeight(content)\r\n );\r\n}\r\n\r\nfunction resolveNestedTableWidth(content: ListTableNestedTableCellContent) {\r\n return (\r\n content.width ??\r\n content.columns.reduce(\r\n (sum, column) => sum + (column.width ?? DEFAULT_COLUMN_WIDTH),\r\n 0,\r\n )\r\n );\r\n}\r\n\r\nfunction resolveNestedTableDrawWidth(\r\n content: ListTableNestedTableCellContent,\r\n availableWidth: number,\r\n) {\r\n if (typeof content.width === \"number\") {\r\n return content.width;\r\n }\r\n\r\n return Math.max(availableWidth, 0);\r\n}\r\n\r\nfunction resolveNestedTableRowHeight(\r\n content: ListTableNestedTableCellContent,\r\n) {\r\n if (typeof content.rowHeight === \"number\") {\r\n return content.rowHeight;\r\n }\r\n return DEFAULT_ROW_HEIGHT;\r\n}\r\n\r\nfunction resolveNestedTableHeaderHeight(\r\n content: ListTableNestedTableCellContent,\r\n) {\r\n if (typeof content.headerHeight === \"number\") {\r\n return content.headerHeight;\r\n }\r\n return DEFAULT_HEADER_ROW_HEIGHT;\r\n}\r\n\r\nfunction resolveColumnWidths(\r\n content: ListTableNestedTableCellContent,\r\n tableWidth: number,\r\n) {\r\n const baseWidths = content.columns.map(\r\n (column) => column.width ?? DEFAULT_COLUMN_WIDTH,\r\n );\r\n const explicitTotal = baseWidths.reduce((sum, width) => sum + width, 0);\r\n if (explicitTotal <= 0) {\r\n return baseWidths;\r\n }\r\n\r\n if (explicitTotal <= tableWidth) {\r\n const extra =\r\n (tableWidth - explicitTotal) / Math.max(content.columns.length, 1);\r\n return normalizeColumnWidthsToTableWidth(\r\n baseWidths.map((width) => width + extra),\r\n tableWidth,\r\n );\r\n }\r\n\r\n const scale = tableWidth / explicitTotal;\r\n return normalizeColumnWidthsToTableWidth(\r\n baseWidths.map((width) => width * scale),\r\n tableWidth,\r\n );\r\n}\r\n\r\nfunction isNestedTableRowHighlighted(\r\n content: ListTableNestedTableCellContent,\r\n record: Record<string, unknown>,\r\n rowIndex: number,\r\n highlight: DrawBodyNestedTableContentParams<unknown>[\"highlight\"],\r\n) {\r\n if (content.highlightRowIndexes?.includes(rowIndex)) {\r\n return true;\r\n }\r\n\r\n const rowKey = resolveNestedTableRowKey(content, record, rowIndex);\r\n return (\r\n (rowKey != null && content.highlightRowKeys?.includes(rowKey) === true) ||\r\n (rowKey != null && highlight?.rowKey === rowKey) ||\r\n highlight?.rowIndex === rowIndex\r\n );\r\n}\r\n\r\nfunction isNestedTableColumnHighlighted(\r\n content: ListTableNestedTableCellContent,\r\n column: ListTableNestedTableCellContent[\"columns\"][number],\r\n columnIndex: number,\r\n highlight: DrawBodyNestedTableContentParams<unknown>[\"highlight\"],\r\n) {\r\n if (content.highlightColumnIndexes?.includes(columnIndex)) {\r\n return true;\r\n }\r\n\r\n return (\r\n content.highlightColumnDataIndexes?.some((dataIndex) =>\r\n isSameDataIndex(dataIndex, column.dataIndex),\r\n ) === true ||\r\n highlight?.columnDataIndex === serializeDataIndex(column.dataIndex) ||\r\n highlight?.columnIndex === columnIndex\r\n );\r\n}\r\n\r\nfunction resolveNestedTableRowKey(\r\n content: ListTableNestedTableCellContent,\r\n record: Record<string, unknown>,\r\n rowIndex: number,\r\n) {\r\n if (typeof content.rowKey === \"function\") {\r\n return content.rowKey(record, rowIndex);\r\n }\r\n\r\n if (content.rowKey != null) {\r\n const value = getValueByDataIndex(record, content.rowKey);\r\n return typeof value === \"string\" || typeof value === \"number\"\r\n ? value\r\n : undefined;\r\n }\r\n\r\n const fallbackKey = (record as { key?: unknown }).key;\r\n return typeof fallbackKey === \"string\" || typeof fallbackKey === \"number\"\r\n ? fallbackKey\r\n : rowIndex;\r\n}\r\n\r\nfunction isSameDataIndex(\r\n left: TableColumnDataIndex,\r\n right: TableColumnDataIndex,\r\n) {\r\n const leftPath = Array.isArray(left) ? left : [left];\r\n const rightPath = Array.isArray(right) ? right : [right];\r\n\r\n return (\r\n leftPath.length === rightPath.length &&\r\n leftPath.every((key, index) => key === rightPath[index])\r\n );\r\n}\r\n\r\nfunction pushNestedTableDescriptor<RecordType>(params: {\r\n drawParams: DrawBodyNestedTableContentParams<RecordType>;\r\n content: ListTableNestedTableCellContent;\r\n record?: Record<string, unknown>;\r\n rect: { x: number; y: number; width: number; height: number };\r\n column: ListTableNestedTableCellContent[\"columns\"][number];\r\n columnIndex: number;\r\n rowIndex?: number;\r\n}) {\r\n const { column, columnIndex, content, drawParams, record, rect, rowIndex } =\r\n params;\r\n const rowKey =\r\n record != null && typeof rowIndex === \"number\"\r\n ? resolveNestedTableRowKey(content, record, rowIndex)\r\n : undefined;\r\n\r\n drawParams.descriptors.push({\r\n kind: \"body-content\",\r\n rect,\r\n columnKey: drawParams.column.key,\r\n rowIndex: drawParams.rowIndex,\r\n contentIndex: drawParams.contentIndex,\r\n contentKey: \"nested-table\",\r\n nestedRowKey: rowKey,\r\n nestedRowIndex: rowIndex,\r\n nestedColumnDataIndex: serializeDataIndex(column.dataIndex),\r\n nestedColumnIndex: columnIndex,\r\n cursor: \"pointer\",\r\n });\r\n}\r\n\r\nfunction serializeDataIndex(dataIndex: TableColumnDataIndex) {\r\n return (Array.isArray(dataIndex) ? dataIndex : [dataIndex])\r\n .map((item) => String(item))\r\n .join(\".\");\r\n}\r\n\r\nfunction drawNestedTableText(params: {\r\n ctx: CanvasRenderingContext2D;\r\n text: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n align?: \"left\" | \"center\" | \"right\";\r\n font: string;\r\n color: string;\r\n}) {\r\n const {\r\n align = \"left\",\r\n color,\r\n ctx,\r\n font,\r\n height,\r\n text,\r\n width,\r\n x,\r\n y,\r\n } = params;\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(x, y, width, height);\r\n ctx.clip();\r\n ctx.font = font;\r\n ctx.fillStyle = color;\r\n ctx.textBaseline = \"middle\";\r\n ctx.textAlign = align;\r\n const measuredText = fitText(\r\n ctx,\r\n text,\r\n Math.max(width - TABLE_PADDING_X * 2, 0),\r\n );\r\n const textX =\r\n align === \"center\"\r\n ? x + width / 2\r\n : align === \"right\"\r\n ? x + width - TABLE_PADDING_X\r\n : x + TABLE_PADDING_X;\r\n ctx.fillText(measuredText, textX, y + height / 2);\r\n ctx.restore();\r\n}\r\n\r\nfunction fitText(\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n maxWidth: number,\r\n) {\r\n if (maxWidth <= 0) {\r\n return \"\";\r\n }\r\n if (ctx.measureText(text).width <= maxWidth) {\r\n return text;\r\n }\r\n const ellipsis = \"...\";\r\n const ellipsisWidth = ctx.measureText(ellipsis).width;\r\n if (ellipsisWidth > maxWidth) {\r\n return ellipsis;\r\n }\r\n let output = \"\";\r\n for (const char of text) {\r\n const next = `${output}${char}`;\r\n if (ctx.measureText(next).width + ellipsisWidth > maxWidth) {\r\n break;\r\n }\r\n output = next;\r\n }\r\n return output ? `${output}${ellipsis}` : ellipsis;\r\n}\r\n\r\nfunction drawOuterBorders(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n color: string,\r\n skipBorders:\r\n | DrawBodyNestedTableContentParams<unknown>[\"skipOuterBorders\"]\r\n | undefined,\r\n) {\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n if (!skipBorders?.top) {\r\n ctx.moveTo(x, y + 0.5);\r\n ctx.lineTo(x + width, y + 0.5);\r\n }\r\n if (!skipBorders?.right) {\r\n ctx.moveTo(x + width - 0.5, y);\r\n ctx.lineTo(x + width - 0.5, y + height);\r\n }\r\n if (!skipBorders?.bottom) {\r\n ctx.moveTo(x, y + height - 0.5);\r\n ctx.lineTo(x + width, y + height - 0.5);\r\n }\r\n if (!skipBorders?.left) {\r\n ctx.moveTo(x + 1.5, y);\r\n ctx.lineTo(x + 1.5, y + height);\r\n }\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n\r\nfunction drawNestedTableGridLines(params: {\r\n ctx: CanvasRenderingContext2D;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n headerHeight: number;\r\n rowHeight: number;\r\n rowCount: number;\r\n columnWidths: number[];\r\n color: string;\r\n skipOuterBorders?: DrawBodyNestedTableContentParams<unknown>[\"skipOuterBorders\"];\r\n}) {\r\n const {\r\n color,\r\n columnWidths,\r\n ctx,\r\n headerHeight,\r\n height,\r\n rowCount,\r\n rowHeight,\r\n width,\r\n x,\r\n y,\r\n skipOuterBorders,\r\n } = params;\r\n\r\n let columnX = x;\r\n columnWidths.forEach((columnWidth, columnIndex) => {\r\n columnX += columnWidth;\r\n if (columnIndex < columnWidths.length - 1) {\r\n drawVerticalLine(ctx, columnX, y, height, color);\r\n }\r\n });\r\n\r\n drawHorizontalLine(ctx, x, y + headerHeight, width, color);\r\n for (let rowIndex = 1; rowIndex < rowCount; rowIndex += 1) {\r\n drawHorizontalLine(\r\n ctx,\r\n x,\r\n y + headerHeight + rowIndex * rowHeight,\r\n width,\r\n color,\r\n );\r\n }\r\n drawOuterBorders(ctx, x, y, width, height, color, skipOuterBorders);\r\n}\r\n\r\nfunction normalizeColumnWidthsToTableWidth(\r\n widths: number[],\r\n tableWidth: number,\r\n) {\r\n if (widths.length === 0) {\r\n return widths;\r\n }\r\n\r\n const normalized = [...widths];\r\n const previousTotal = normalized\r\n .slice(0, -1)\r\n .reduce((sum, width) => sum + width, 0);\r\n normalized[normalized.length - 1] = Math.max(tableWidth - previousTotal, 0);\r\n return normalized;\r\n}\r\n\r\nfunction drawHorizontalLine(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n color: string,\r\n) {\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n ctx.moveTo(x, y + 0.5);\r\n ctx.lineTo(x + width, y + 0.5);\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n\r\nfunction drawVerticalLine(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n height: number,\r\n color: string,\r\n) {\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n ctx.moveTo(x + 0.5, y);\r\n ctx.lineTo(x + 0.5, y + height);\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n","import type {\r\n ListTableProgressCellContent,\r\n ListTableProgressShape,\r\n ListTableProgressSize,\r\n} from \"../../schema/column\";\r\nimport type { DrawBodyProgressContentParams } from \"./types\";\r\nimport {\r\n buildCanvasFont,\r\n resolveContentFontFamily,\r\n resolveContentFontSize,\r\n resolveContentFontWeight,\r\n resolveContentOpacity,\r\n} from \"./content-style\";\r\n\r\nconst LINE_PROGRESS_WIDTH = 96;\r\nconst LINE_PROGRESS_HEIGHT = 8;\r\nconst LINE_PROGRESS_GAP = 8;\r\nconst LINE_PROGRESS_SMALL_WIDTH = 80;\r\nconst LINE_PROGRESS_SMALL_HEIGHT = 6;\r\nconst CIRCLE_PROGRESS_SIZE = 38;\r\nconst CIRCLE_PROGRESS_SMALL_SIZE = 28;\r\nconst PROGRESS_TEXT_COLOR = \"#595959\";\r\nconst PROGRESS_TRACK_COLOR = \"#f0f0f0\";\r\nconst PROGRESS_FILL_COLOR = \"#1677ff\";\r\nconst PROGRESS_SUCCESS_COLOR = \"#52c41a\";\r\n\r\ninterface ResolvedProgressMetrics {\r\n width: number;\r\n height: number;\r\n shape: ListTableProgressShape;\r\n strokeWidth: number;\r\n progressWidth: number;\r\n progressHeight: number;\r\n progressText?: string;\r\n}\r\n\r\ninterface ProgressSizeMetrics {\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * 绘制进度内容。\r\n */\r\nexport function drawBodyProgressContent<RecordType>(\r\n params: DrawBodyProgressContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n animationProgress,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const metrics = resolveProgressMetrics(ctx, content, theme);\r\n const top = rect.y + (rect.height - metrics.height) / 2;\r\n\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n\r\n if (metrics.shape === \"circle\") {\r\n drawCircleProgress(ctx, content, theme, cursorX, top, metrics, animationProgress);\r\n } else {\r\n drawLineProgress(ctx, content, theme, cursorX, top, metrics, animationProgress);\r\n }\r\n\r\n ctx.restore();\r\n\r\n if (content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: top,\r\n width: metrics.width,\r\n height: metrics.height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor: content.cursor ?? (content.onClick ? \"pointer\" : undefined),\r\n tooltipText: metrics.progressText,\r\n });\r\n }\r\n\r\n return metrics.width;\r\n}\r\n\r\n/**\r\n * 计算进度片段宽度。\r\n */\r\nexport function measureProgressContentWidth<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableProgressCellContent<RecordType>,\r\n theme: DrawBodyProgressContentParams<RecordType>[\"theme\"],\r\n) {\r\n return resolveProgressMetrics(ctx, content, theme).width;\r\n}\r\n\r\n/**\r\n * 计算进度片段高度。\r\n */\r\nexport function measureProgressContentHeight<RecordType>(\r\n content: ListTableProgressCellContent<RecordType>,\r\n theme: DrawBodyProgressContentParams<RecordType>[\"theme\"],\r\n) {\r\n const shape = content.shape ?? \"line\";\r\n const textHeight = shouldShowProgressLabel(content)\r\n ? resolveContentFontSize(content, Math.max(theme.fontSize - 1, 12))\r\n : 0;\r\n const sizeMetrics = resolveProgressSizeMetrics(content, shape);\r\n if (shape === \"circle\") {\r\n return Math.max(sizeMetrics.height, sizeMetrics.width, 20);\r\n }\r\n const progressHeight = Math.max(sizeMetrics.height, 6);\r\n return textHeight > 0 ? Math.max(progressHeight, textHeight + 4) : progressHeight;\r\n}\r\n\r\nfunction drawLineProgress<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableProgressCellContent<RecordType>,\r\n theme: DrawBodyProgressContentParams<RecordType>[\"theme\"],\r\n x: number,\r\n y: number,\r\n metrics: ResolvedProgressMetrics,\r\n animationProgress?: number,\r\n) {\r\n const progressTop = y + (metrics.height - metrics.progressHeight) / 2;\r\n const radius = metrics.progressHeight / 2;\r\n const progressRatio = resolveAnimatedProgressRatio(content, animationProgress);\r\n const fillWidth = metrics.progressWidth * progressRatio;\r\n const trackColor = content.trackColor ?? PROGRESS_TRACK_COLOR;\r\n const fillColor = resolveProgressColor(content, progressRatio);\r\n\r\n drawRoundRect(ctx, x, progressTop, metrics.progressWidth, metrics.progressHeight, radius);\r\n ctx.fillStyle = trackColor;\r\n ctx.fill();\r\n\r\n if (fillWidth > 0) {\r\n drawRoundRect(ctx, x, progressTop, fillWidth, metrics.progressHeight, radius);\r\n ctx.fillStyle = fillColor;\r\n ctx.fill();\r\n }\r\n\r\n if (shouldShowProgressLabel(content)) {\r\n applyProgressTextStyle(ctx, content, theme);\r\n ctx.fillStyle = resolveProgressTextColor(content);\r\n ctx.fillText(\r\n metrics.progressText ?? \"\",\r\n x + metrics.progressWidth + LINE_PROGRESS_GAP,\r\n y + metrics.height / 2,\r\n );\r\n }\r\n}\r\n\r\nfunction drawCircleProgress<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableProgressCellContent<RecordType>,\r\n theme: DrawBodyProgressContentParams<RecordType>[\"theme\"],\r\n x: number,\r\n y: number,\r\n metrics: ResolvedProgressMetrics,\r\n animationProgress?: number,\r\n) {\r\n const progressRatio = resolveAnimatedProgressRatio(content, animationProgress);\r\n const centerX = x + metrics.progressWidth / 2;\r\n const centerY = y + metrics.progressHeight / 2;\r\n const radius = Math.max(\r\n Math.min(metrics.progressWidth, metrics.progressHeight) / 2 - metrics.strokeWidth / 2,\r\n 1,\r\n );\r\n const trackColor = content.trackColor ?? PROGRESS_TRACK_COLOR;\r\n const fillColor = resolveProgressColor(content, progressRatio);\r\n\r\n ctx.beginPath();\r\n ctx.strokeStyle = trackColor;\r\n ctx.lineWidth = metrics.strokeWidth;\r\n ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);\r\n ctx.stroke();\r\n\r\n if (progressRatio > 0) {\r\n ctx.beginPath();\r\n ctx.strokeStyle = fillColor;\r\n ctx.lineWidth = metrics.strokeWidth;\r\n ctx.lineCap = \"round\";\r\n ctx.arc(\r\n centerX,\r\n centerY,\r\n radius,\r\n -Math.PI / 2,\r\n -Math.PI / 2 + Math.PI * 2 * progressRatio,\r\n );\r\n ctx.stroke();\r\n ctx.lineCap = \"butt\";\r\n }\r\n\r\n if (shouldShowProgressLabel(content)) {\r\n applyProgressTextStyle(ctx, content, theme);\r\n ctx.fillStyle = resolveProgressTextColor(content);\r\n ctx.textAlign = \"center\";\r\n ctx.fillText(metrics.progressText ?? \"\", centerX, centerY);\r\n ctx.textAlign = \"left\";\r\n }\r\n}\r\n\r\nfunction resolveProgressMetrics<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableProgressCellContent<RecordType>,\r\n theme: DrawBodyProgressContentParams<RecordType>[\"theme\"],\r\n): ResolvedProgressMetrics {\r\n const shape = content.shape ?? \"line\";\r\n const progressText = resolveProgressText(content);\r\n const strokeWidth = Math.max(content.strokeWidth ?? (shape === \"circle\" ? 4 : 8), 2);\r\n const showLabel = shouldShowProgressLabel(content);\r\n const sizeMetrics = resolveProgressSizeMetrics(content, shape);\r\n\r\n applyProgressTextStyle(ctx, content, theme);\r\n const textWidth = showLabel && progressText ? ctx.measureText(progressText).width : 0;\r\n const textHeight = showLabel\r\n ? resolveContentFontSize(content, Math.max(theme.fontSize - 1, 12))\r\n : 0;\r\n\r\n if (shape === \"circle\") {\r\n return {\r\n width: Math.max(sizeMetrics.width, 20),\r\n height: Math.max(sizeMetrics.height, sizeMetrics.width, 20),\r\n shape,\r\n strokeWidth,\r\n progressWidth: Math.max(sizeMetrics.width, 20),\r\n progressHeight: Math.max(sizeMetrics.height, sizeMetrics.width, 20),\r\n progressText,\r\n };\r\n }\r\n\r\n const progressWidth = Math.max(sizeMetrics.width, 36);\r\n const progressHeight = Math.max(sizeMetrics.height, 6);\r\n const width =\r\n !showLabel\r\n ? progressWidth\r\n : progressWidth + LINE_PROGRESS_GAP + textWidth;\r\n const height = showLabel\r\n ? Math.max(progressHeight, textHeight + 4)\r\n : progressHeight;\r\n\r\n return {\r\n width,\r\n height,\r\n shape,\r\n strokeWidth,\r\n progressWidth,\r\n progressHeight,\r\n progressText,\r\n };\r\n}\r\n\r\nfunction resolveProgressSizeMetrics<RecordType>(\r\n content: ListTableProgressCellContent<RecordType>,\r\n shape: ListTableProgressShape,\r\n): ProgressSizeMetrics {\r\n const preset = resolvePresetProgressSize(content.size, shape);\r\n const size = content.size;\r\n\r\n let width = preset.width;\r\n let height = preset.height;\r\n\r\n if (typeof size === \"number\") {\r\n width = size;\r\n height = shape === \"circle\" ? size : preset.height;\r\n } else if (Array.isArray(size)) {\r\n width = size[0];\r\n height = size[1];\r\n } else if (size && typeof size === \"object\") {\r\n width = size.width ?? width;\r\n height = size.height ?? height;\r\n }\r\n\r\n return {\r\n width: Math.max(content.style?.width ?? width, 1),\r\n height: Math.max(content.style?.height ?? height, 1),\r\n };\r\n}\r\n\r\nfunction resolvePresetProgressSize(\r\n size: ListTableProgressSize | undefined,\r\n shape: ListTableProgressShape,\r\n): ProgressSizeMetrics {\r\n if (shape === \"circle\") {\r\n if (size === \"small\") {\r\n return {\r\n width: CIRCLE_PROGRESS_SMALL_SIZE,\r\n height: CIRCLE_PROGRESS_SMALL_SIZE,\r\n };\r\n }\r\n return {\r\n width: CIRCLE_PROGRESS_SIZE,\r\n height: CIRCLE_PROGRESS_SIZE,\r\n };\r\n }\r\n\r\n if (size === \"small\") {\r\n return {\r\n width: LINE_PROGRESS_SMALL_WIDTH,\r\n height: LINE_PROGRESS_SMALL_HEIGHT,\r\n };\r\n }\r\n return {\r\n width: LINE_PROGRESS_WIDTH,\r\n height: LINE_PROGRESS_HEIGHT,\r\n };\r\n}\r\n\r\nfunction resolveProgressText<RecordType>(\r\n content: ListTableProgressCellContent<RecordType>,\r\n) {\r\n if (content.text) {\r\n return content.text;\r\n }\r\n if (content.showPercent === false) {\r\n return undefined;\r\n }\r\n return `${Math.round(resolveProgressRatio(content) * 100)}%`;\r\n}\r\n\r\nfunction shouldShowProgressLabel<RecordType>(\r\n content: ListTableProgressCellContent<RecordType>,\r\n) {\r\n if (content.text) {\r\n return true;\r\n }\r\n if (typeof content.showPercent === \"boolean\") {\r\n return content.showPercent;\r\n }\r\n return content.showInfo !== false;\r\n}\r\n\r\nfunction resolveProgressRatio<RecordType>(\r\n content: ListTableProgressCellContent<RecordType>,\r\n) {\r\n const min = content.min ?? 0;\r\n const max = content.max ?? 100;\r\n const range = max - min;\r\n if (range <= 0) {\r\n return 0;\r\n }\r\n return Math.min(Math.max((content.value - min) / range, 0), 1);\r\n}\r\n\r\nfunction resolveAnimatedProgressRatio<RecordType>(\r\n content: ListTableProgressCellContent<RecordType>,\r\n animationProgress?: number,\r\n) {\r\n if (typeof animationProgress !== \"number\" || Number.isNaN(animationProgress)) {\r\n return resolveProgressRatio(content);\r\n }\r\n return Math.min(Math.max(animationProgress, 0), 1);\r\n}\r\n\r\nfunction resolveProgressColor<RecordType>(\r\n content: ListTableProgressCellContent<RecordType>,\r\n progressRatio: number,\r\n) {\r\n if (progressRatio >= 1) {\r\n return content.successColor ?? content.progressColor ?? content.color ?? PROGRESS_SUCCESS_COLOR;\r\n }\r\n return content.progressColor ?? content.color ?? PROGRESS_FILL_COLOR;\r\n}\r\n\r\nfunction resolveProgressTextColor<RecordType>(\r\n content: ListTableProgressCellContent<RecordType>,\r\n) {\r\n return content.style?.color ?? PROGRESS_TEXT_COLOR;\r\n}\r\n\r\nfunction applyProgressTextStyle<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableProgressCellContent<RecordType>,\r\n theme: DrawBodyProgressContentParams<RecordType>[\"theme\"],\r\n) {\r\n ctx.font = buildCanvasFont({\r\n fontWeight: resolveContentFontWeight(content, \"500\"),\r\n fontSize: resolveContentFontSize(content, Math.max(theme.fontSize - 1, 12)),\r\n fontFamily: resolveContentFontFamily(content, theme),\r\n });\r\n ctx.textBaseline = \"middle\";\r\n ctx.textAlign = \"left\";\r\n}\r\n\r\nfunction drawRoundRect(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n radius: number,\r\n) {\r\n const r = Math.min(radius, width / 2, height / 2);\r\n ctx.beginPath();\r\n ctx.moveTo(x + r, y);\r\n ctx.arcTo(x + width, y, x + width, y + height, r);\r\n ctx.arcTo(x + width, y + height, x, y + height, r);\r\n ctx.arcTo(x, y + height, x, y, r);\r\n ctx.arcTo(x, y, x + width, y, r);\r\n ctx.closePath();\r\n}\r\n","import { drawQrCodeToCanvas } from \"@canvas-components/qrcode\";\r\nimport type { ListTableQrCodeCellContent } from \"../../schema/column\";\r\nimport type { DrawBodyQrCodeContentParams } from \"./types\";\r\nimport { resolveContentOpacity } from \"./content-style\";\r\nconst DEFAULT_QRCODE_SIZE = 64;\r\n\r\ninterface ResolvedQrCodeSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * 绘制二维码内容。\r\n */\r\nexport function drawBodyQrCodeContent<RecordType>(\r\n params: DrawBodyQrCodeContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const size = resolveQrCodeSize(content);\r\n const top = rect.y + (rect.height - size.height) / 2;\r\n\r\n ctx.save();\r\n drawQrCodeToCanvas({\r\n ctx,\r\n x: cursorX,\r\n y: top,\r\n width: size.width,\r\n height: size.height,\r\n value: content.value,\r\n level: content.level,\r\n color: content.style?.color ?? content.color,\r\n backgroundColor: content.style?.backgroundColor ?? content.backgroundColor,\r\n padding: content.padding,\r\n opacity: resolveContentOpacity(content),\r\n });\r\n ctx.restore();\r\n\r\n if (content.preview !== false || content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: top,\r\n width: size.width,\r\n height: size.height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor:\r\n content.cursor ??\r\n (content.preview !== false || content.onClick ? \"pointer\" : undefined),\r\n tooltipText: content.value,\r\n });\r\n }\r\n\r\n return size.width;\r\n}\r\n\r\n/**\r\n * 计算二维码内容宽度。\r\n */\r\nexport function measureQrCodeContentWidth<RecordType>(\r\n content: ListTableQrCodeCellContent<RecordType>,\r\n) {\r\n return resolveQrCodeSize(content).width;\r\n}\r\n\r\n/**\r\n * 计算二维码内容高度。\r\n */\r\nexport function measureQrCodeContentHeight<RecordType>(\r\n content: ListTableQrCodeCellContent<RecordType>,\r\n) {\r\n return resolveQrCodeSize(content).height;\r\n}\r\n\r\nfunction resolveQrCodeSize<RecordType>(\r\n content: ListTableQrCodeCellContent<RecordType>,\r\n): ResolvedQrCodeSize {\r\n const fallbackSize = Math.max(content.size ?? DEFAULT_QRCODE_SIZE, 1);\r\n const width = Math.max(content.style?.width ?? content.size ?? fallbackSize, 1);\r\n const height = Math.max(content.style?.height ?? content.size ?? fallbackSize, 1);\r\n const drawSize = Math.max(Math.min(width, height), 1);\r\n return {\r\n width,\r\n height,\r\n };\r\n}\r\n","import type {\r\n ListTableRateCellContent,\r\n ListTableRateSize,\r\n} from \"../../schema/column\";\r\nimport type { DrawBodyRateContentParams } from \"./types\";\r\nimport {\r\n buildCanvasFont,\r\n measureTextBounds,\r\n resolveAlignedTextX,\r\n resolveContentFontFamily,\r\n resolveContentFontSize,\r\n resolveContentFontWeight,\r\n resolveContentLayoutWidth,\r\n resolveContentOpacity,\r\n resolveContentTextAlign,\r\n resolveContentTextIndent,\r\n} from \"./content-style\";\r\nimport { drawCellSymbol } from \"./draw-symbol\";\r\n\r\nconst RATE_SMALL_SIZE = 16;\r\nconst RATE_MEDIUM_SIZE = 20;\r\nconst RATE_LARGE_SIZE = 24;\r\nconst RATE_GAP = 4;\r\nconst RATE_COLOR = \"#fadb14\";\r\nconst RATE_BACKGROUND_COLOR = \"rgba(0, 0, 0, 0.06)\";\r\nconst RATE_TEXT_GAP = 8;\r\n\r\ninterface ResolvedRateMetrics {\r\n width: number;\r\n height: number;\r\n starSize: number;\r\n starGap: number;\r\n count: number;\r\n displayValue: number;\r\n text?: string;\r\n}\r\n\r\n/**\r\n * 绘制评分内容。\r\n */\r\nexport function drawBodyRateContent<RecordType>(\r\n params: DrawBodyRateContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const metrics = resolveRateMetrics(ctx, content, theme);\r\n const top = rect.y + (rect.height - metrics.height) / 2;\r\n const starTop = top + Math.max((metrics.height - metrics.starSize) / 2, 0);\r\n const activeColor = content.style?.color ?? content.color ?? RATE_COLOR;\r\n const inactiveColor = content.style?.backgroundColor ?? content.backgroundColor ?? RATE_BACKGROUND_COLOR;\r\n\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n\r\n for (let index = 0; index < metrics.count; index += 1) {\r\n const starX = cursorX + index * (metrics.starSize + metrics.starGap);\r\n const fillRatio = Math.min(Math.max(metrics.displayValue - index, 0), 1);\r\n drawCellSymbol(ctx, {\r\n type: content.shape ?? \"star\",\r\n x: starX,\r\n y: starTop,\r\n size: metrics.starSize,\r\n activeColor,\r\n inactiveColor,\r\n fillRatio,\r\n });\r\n }\r\n\r\n if (metrics.text) {\r\n applyRateTextStyle(ctx, content, theme);\r\n const bounds = measureTextBounds(ctx, metrics.text);\r\n const textIndent = resolveContentTextIndent(content);\r\n const textX = resolveAlignedTextX({\r\n baseX:\r\n cursorX + metrics.count * metrics.starSize + Math.max(metrics.count - 1, 0) * metrics.starGap + RATE_TEXT_GAP,\r\n boxWidth: Math.max(metrics.width - (metrics.count * metrics.starSize + Math.max(metrics.count - 1, 0) * metrics.starGap + RATE_TEXT_GAP), 0),\r\n textWidth: bounds.width,\r\n textIndent,\r\n textAlign: resolveContentTextAlign(content),\r\n });\r\n ctx.fillStyle = content.style?.color ?? theme.textColor;\r\n ctx.fillText(metrics.text, textX, rect.y + rect.height / 2);\r\n }\r\n\r\n ctx.restore();\r\n\r\n if (content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: top,\r\n width: metrics.width,\r\n height: metrics.height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor: content.cursor ?? (content.onClick ? \"pointer\" : undefined),\r\n tooltipText: metrics.text ?? String(metrics.displayValue),\r\n });\r\n }\r\n\r\n return metrics.width;\r\n}\r\n\r\n/**\r\n * 计算评分片段宽度。\r\n */\r\nexport function measureRateContentWidth<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableRateCellContent<RecordType>,\r\n theme: DrawBodyRateContentParams<RecordType>[\"theme\"],\r\n) {\r\n return resolveRateMetrics(ctx, content, theme).width;\r\n}\r\n\r\n/**\r\n * 计算评分片段高度。\r\n */\r\nexport function measureRateContentHeight<RecordType>(\r\n content: ListTableRateCellContent<RecordType>,\r\n theme: DrawBodyRateContentParams<RecordType>[\"theme\"],\r\n) {\r\n const starSize = resolveRateStarSize(content.size);\r\n const textHeight = content.showText === true || content.text\r\n ? resolveContentFontSize(content, theme.fontSize)\r\n : 0;\r\n return Math.max(starSize, textHeight);\r\n}\r\n\r\nfunction resolveRateMetrics<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableRateCellContent<RecordType>,\r\n theme: DrawBodyRateContentParams<RecordType>[\"theme\"],\r\n): ResolvedRateMetrics {\r\n const starSize = resolveRateStarSize(content.size);\r\n const starGap = Math.max(content.gap ?? RATE_GAP, 0);\r\n const count = Math.max(Math.floor(content.count ?? 5), 1);\r\n const displayValue = resolveDisplayRateValue(content, count);\r\n const text = resolveRateText(content);\r\n const starsWidth = count * starSize + Math.max(count - 1, 0) * starGap;\r\n\r\n let textWidth = 0;\r\n if (text) {\r\n applyRateTextStyle(ctx, content, theme);\r\n textWidth = RATE_TEXT_GAP + ctx.measureText(text).width;\r\n }\r\n\r\n return {\r\n width: resolveContentLayoutWidth(content, starsWidth + textWidth),\r\n height: Math.max(starSize, text ? resolveContentFontSize(content, theme.fontSize) : 0),\r\n starSize,\r\n starGap,\r\n count,\r\n displayValue,\r\n text,\r\n };\r\n}\r\n\r\nfunction resolveRateStarSize(size: ListTableRateSize | undefined) {\r\n if (typeof size === \"number\") {\r\n return Math.max(size, 8);\r\n }\r\n if (size === \"small\") {\r\n return RATE_SMALL_SIZE;\r\n }\r\n if (size === \"large\") {\r\n return RATE_LARGE_SIZE;\r\n }\r\n return RATE_MEDIUM_SIZE;\r\n}\r\n\r\nfunction resolveDisplayRateValue<RecordType>(\r\n content: ListTableRateCellContent<RecordType>,\r\n count: number,\r\n) {\r\n const rawValue = Number.isFinite(content.value) ? content.value : 0;\r\n const clamped = Math.min(Math.max(rawValue, 0), count);\r\n if (content.allowHalf) {\r\n return Math.round(clamped * 2) / 2;\r\n }\r\n return Math.round(clamped);\r\n}\r\n\r\nfunction resolveRateText<RecordType>(\r\n content: ListTableRateCellContent<RecordType>,\r\n) {\r\n if (content.text) {\r\n return content.text;\r\n }\r\n if (content.showText) {\r\n return String(content.value);\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction applyRateTextStyle<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableRateCellContent<RecordType>,\r\n theme: DrawBodyRateContentParams<RecordType>[\"theme\"],\r\n) {\r\n ctx.font = buildCanvasFont({\r\n fontWeight: resolveContentFontWeight(content, \"400\"),\r\n fontSize: resolveContentFontSize(content, theme.fontSize),\r\n fontFamily: resolveContentFontFamily(content, theme),\r\n });\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"middle\";\r\n}\r\n","import type { DrawBodySelectionContentParams, BodyCellRect } from \"./types\";\r\n\r\nconst SELECTION_CONTROL_SIZE = 16;\r\nconst CHECKED_COLOR = \"#1677ff\";\r\nconst UNCHECKED_STROKE_COLOR = \"#94a3b8\";\r\nconst UNCHECKED_FILL_COLOR = \"#ffffff\";\r\nconst DISABLED_STROKE_COLOR = \"#cbd5e1\";\r\nconst DISABLED_FILL_COLOR = \"#f1f5f9\";\r\n\r\n/**\r\n * 绘制表体中的选择控件内容。\r\n */\r\nexport function drawBodySelectionContent<RecordType>(\r\n params: DrawBodySelectionContentParams<RecordType>,\r\n) {\r\n const { ctx, rect, content, animationProgress, contentIndex, cursorX, rowIndex, column, frozen, descriptors } = params;\r\n const centerY = rect.y + rect.height / 2;\r\n const controlRect = {\r\n x: cursorX,\r\n y: centerY - SELECTION_CONTROL_SIZE / 2,\r\n width: SELECTION_CONTROL_SIZE,\r\n height: SELECTION_CONTROL_SIZE,\r\n };\r\n\r\n drawSelectionControl(\r\n ctx,\r\n controlRect,\r\n content.type,\r\n content.checked,\r\n !!content.disabled,\r\n false,\r\n animationProgress,\r\n );\r\n\r\n descriptors.push({\r\n kind: \"body-control\",\r\n rect: controlRect,\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n controlType: content.type,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor:\r\n content.disabled === true\r\n ? \"not-allowed\"\r\n : content.cursor ?? (content.onClick ? \"pointer\" : undefined),\r\n });\r\n\r\n return controlRect.width;\r\n}\r\n\r\n/**\r\n * 计算选择控件宽度。\r\n */\r\nexport function measureSelectionContentWidth() {\r\n return SELECTION_CONTROL_SIZE;\r\n}\r\n\r\n/**\r\n * 绘制选择控件。\r\n */\r\nexport function drawSelectionControl(\r\n ctx: CanvasRenderingContext2D,\r\n rect: BodyCellRect,\r\n type: \"checkbox\" | \"radio\",\r\n checked: boolean,\r\n disabled: boolean,\r\n indeterminate = false,\r\n animationProgress?: number,\r\n) {\r\n ctx.save();\r\n const normalizedProgress =\r\n typeof animationProgress === \"number\"\r\n ? Math.max(0, Math.min(animationProgress, 1))\r\n : checked || indeterminate\r\n ? 1\r\n : 0;\r\n const strokeColor = disabled\r\n ? DISABLED_STROKE_COLOR\r\n : mixColor(UNCHECKED_STROKE_COLOR, CHECKED_COLOR, normalizedProgress);\r\n const fillColor = disabled\r\n ? DISABLED_FILL_COLOR\r\n : mixColor(UNCHECKED_FILL_COLOR, CHECKED_COLOR, normalizedProgress);\r\n\r\n if (type === \"checkbox\") {\r\n ctx.fillStyle = fillColor;\r\n ctx.strokeStyle = strokeColor;\r\n ctx.lineWidth = 1.5;\r\n roundRectPath(ctx, rect.x, rect.y, rect.width, rect.height, 4);\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n if (indeterminate) {\r\n ctx.strokeStyle = \"#ffffff\";\r\n ctx.lineWidth = 2;\r\n ctx.beginPath();\r\n ctx.moveTo(rect.x + 4, rect.y + rect.height / 2);\r\n ctx.lineTo(rect.x + rect.width - 4, rect.y + rect.height / 2);\r\n ctx.stroke();\r\n } else if (normalizedProgress > 0) {\r\n ctx.strokeStyle = \"#ffffff\";\r\n ctx.lineWidth = 2;\r\n ctx.globalAlpha = normalizedProgress;\r\n ctx.beginPath();\r\n ctx.moveTo(\r\n rect.x + 3.5,\r\n rect.y + rect.height / 2 + (1 - normalizedProgress) * 1.5,\r\n );\r\n ctx.lineTo(\r\n rect.x + 5.5 + normalizedProgress * 1.5,\r\n rect.y + rect.height - 5.5 + (1 - normalizedProgress),\r\n );\r\n ctx.lineTo(\r\n rect.x + rect.width - 5.5 + normalizedProgress * 2,\r\n rect.y + 5.5 - normalizedProgress,\r\n );\r\n ctx.stroke();\r\n }\r\n } else {\r\n ctx.fillStyle = UNCHECKED_FILL_COLOR;\r\n ctx.strokeStyle = strokeColor;\r\n ctx.lineWidth = 1.5;\r\n ctx.beginPath();\r\n ctx.arc(\r\n rect.x + rect.width / 2,\r\n rect.y + rect.height / 2,\r\n rect.width / 2 - 1.5,\r\n 0,\r\n Math.PI * 2,\r\n );\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n if (normalizedProgress > 0) {\r\n ctx.fillStyle = disabled\r\n ? DISABLED_STROKE_COLOR\r\n : mixColor(UNCHECKED_FILL_COLOR, CHECKED_COLOR, normalizedProgress);\r\n ctx.beginPath();\r\n ctx.arc(\r\n rect.x + rect.width / 2,\r\n rect.y + rect.height / 2,\r\n (rect.width / 2 - 5) * easeOut(normalizedProgress),\r\n 0,\r\n Math.PI * 2,\r\n );\r\n ctx.fill();\r\n }\r\n }\r\n\r\n ctx.restore();\r\n}\r\n\r\n/**\r\n * 混合两个十六进制颜色。\r\n */\r\nfunction mixColor(from: string, to: string, progress: number) {\r\n const clamped = Math.max(0, Math.min(progress, 1));\r\n const fromRgb = hexToRgb(from);\r\n const toRgb = hexToRgb(to);\r\n\r\n return `rgb(${interpolateChannel(fromRgb.r, toRgb.r, clamped)}, ${interpolateChannel(fromRgb.g, toRgb.g, clamped)}, ${interpolateChannel(fromRgb.b, toRgb.b, clamped)})`;\r\n}\r\n\r\n/**\r\n * 将十六进制颜色转换为 RGB 通道。\r\n */\r\nfunction hexToRgb(hex: string) {\r\n const normalized = hex.replace(\"#\", \"\");\r\n const safeHex =\r\n normalized.length === 3\r\n ? normalized\r\n .split(\"\")\r\n .map((channel) => `${channel}${channel}`)\r\n .join(\"\")\r\n : normalized;\r\n\r\n return {\r\n r: Number.parseInt(safeHex.slice(0, 2), 16),\r\n g: Number.parseInt(safeHex.slice(2, 4), 16),\r\n b: Number.parseInt(safeHex.slice(4, 6), 16),\r\n };\r\n}\r\n\r\n/**\r\n * 计算单个颜色通道插值。\r\n */\r\nfunction interpolateChannel(from: number, to: number, progress: number) {\r\n return Math.round(from + (to - from) * progress);\r\n}\r\n\r\n/**\r\n * 计算控件内部元素的缓出进度。\r\n */\r\nfunction easeOut(progress: number) {\r\n return 1 - (1 - progress) * (1 - progress);\r\n}\r\n\r\nfunction roundRectPath(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n radius: number,\r\n) {\r\n const r = Math.min(radius, width / 2, height / 2);\r\n ctx.beginPath();\r\n ctx.moveTo(x + r, y);\r\n ctx.arcTo(x + width, y, x + width, y + height, r);\r\n ctx.arcTo(x + width, y + height, x, y + height, r);\r\n ctx.arcTo(x, y + height, x, y, r);\r\n ctx.arcTo(x, y, x + width, y, r);\r\n ctx.closePath();\r\n}\r\n","import type { BodyCellRect, DrawBodySwitchContentParams } from \"./types\";\r\n\r\nconst SWITCH_MIN_WIDTH = 44;\r\nconst SWITCH_HEIGHT = 22;\r\nconst SWITCH_PADDING = 2;\r\nconst SWITCH_HANDLE_SIZE = SWITCH_HEIGHT - SWITCH_PADDING * 2;\r\nconst SWITCH_TEXT_PADDING = 6;\r\n\r\n/**\r\n * 绘制表体中的开关内容,视觉风格参考 Ant Design Switch。\r\n */\r\nexport function drawBodySwitchContent<RecordType>(\r\n params: DrawBodySwitchContentParams<RecordType>,\r\n) {\r\n const { ctx, rect, content, animationProgress, contentIndex, cursorX, rowIndex, column, theme, frozen, descriptors } = params;\r\n const switchWidth = measureSwitchContentWidth(ctx, content, theme);\r\n const switchRect = {\r\n x: cursorX,\r\n y: rect.y + (rect.height - SWITCH_HEIGHT) / 2,\r\n width: switchWidth,\r\n height: SWITCH_HEIGHT,\r\n };\r\n\r\n drawSwitchControl(ctx, switchRect, content, theme, animationProgress);\r\n\r\n descriptors.push({\r\n kind: \"body-control\",\r\n rect: switchRect,\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n controlType: \"switch\",\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor:\r\n content.disabled === true\r\n ? \"not-allowed\"\r\n : content.cursor ?? (content.onClick ? \"pointer\" : undefined),\r\n });\r\n\r\n return switchRect.width;\r\n}\r\n\r\n/**\r\n * 绘制开关控件。\r\n */\r\nexport function drawSwitchControl(\r\n ctx: CanvasRenderingContext2D,\r\n rect: BodyCellRect,\r\n content: {\r\n checked: boolean;\r\n disabled?: boolean;\r\n checkedChildren?: string;\r\n uncheckedChildren?: string;\r\n },\r\n theme: DrawBodySwitchContentParams<unknown>[\"theme\"],\r\n animationProgress?: number,\r\n) {\r\n const checked = content.checked;\r\n const disabled = content.disabled === true;\r\n const normalizedProgress =\r\n typeof animationProgress === \"number\"\r\n ? Math.max(0, Math.min(animationProgress, 1))\r\n : checked\r\n ? 1\r\n : 0;\r\n const trackColor = disabled\r\n ? checked\r\n ? \"#91caff\"\r\n : \"#d9d9d9\"\r\n : checked\r\n ? \"#1677ff\"\r\n : \"rgba(0, 0, 0, 0.25)\";\r\n const textColor = disabled ? \"rgba(255, 255, 255, 0.75)\" : \"#ffffff\";\r\n const handleX =\r\n rect.x +\r\n SWITCH_PADDING +\r\n (rect.width - SWITCH_HANDLE_SIZE - SWITCH_PADDING * 2) * normalizedProgress;\r\n\r\n ctx.save();\r\n ctx.fillStyle = trackColor;\r\n roundRectPath(ctx, rect.x, rect.y, rect.width, rect.height, rect.height / 2);\r\n ctx.fill();\r\n\r\n const displayText =\r\n normalizedProgress >= 0.5\r\n ? content.checkedChildren ?? \"\"\r\n : content.uncheckedChildren ?? \"\";\r\n if (displayText) {\r\n ctx.fillStyle = textColor;\r\n ctx.font = `12px ${theme.fontFamily}`;\r\n ctx.textBaseline = \"alphabetic\";\r\n ctx.textAlign = checked ? \"left\" : \"right\";\r\n const metrics = ctx.measureText(displayText);\r\n const textHeight =\r\n (metrics.actualBoundingBoxAscent ?? 0) +\r\n (metrics.actualBoundingBoxDescent ?? 0);\r\n const baselineY =\r\n rect.y +\r\n (rect.height + textHeight) / 2 -\r\n (metrics.actualBoundingBoxDescent ?? 0);\r\n ctx.fillText(\r\n displayText,\r\n checked\r\n ? rect.x + SWITCH_TEXT_PADDING\r\n : rect.x + rect.width - SWITCH_TEXT_PADDING,\r\n baselineY,\r\n );\r\n }\r\n\r\n ctx.shadowColor = \"rgba(0, 0, 0, 0.15)\";\r\n ctx.shadowBlur = 2;\r\n ctx.shadowOffsetY = 1;\r\n ctx.fillStyle = disabled ? \"#f5f5f5\" : \"#ffffff\";\r\n roundRectPath(\r\n ctx,\r\n handleX,\r\n rect.y + SWITCH_PADDING,\r\n SWITCH_HANDLE_SIZE,\r\n SWITCH_HANDLE_SIZE,\r\n SWITCH_HANDLE_SIZE / 2,\r\n );\r\n ctx.fill();\r\n ctx.restore();\r\n}\r\n\r\nexport function measureSwitchContentWidth(\r\n ctx: CanvasRenderingContext2D,\r\n content: {\r\n checkedChildren?: string;\r\n uncheckedChildren?: string;\r\n },\r\n theme: DrawBodySwitchContentParams<unknown>[\"theme\"],\r\n) {\r\n const checkedText = content.checkedChildren ?? \"\";\r\n const uncheckedText = content.uncheckedChildren ?? \"\";\r\n if (!checkedText && !uncheckedText) {\r\n return SWITCH_MIN_WIDTH;\r\n }\r\n\r\n ctx.save();\r\n ctx.font = `12px ${theme.fontFamily}`;\r\n const maxTextWidth = Math.max(\r\n ctx.measureText(checkedText).width,\r\n ctx.measureText(uncheckedText).width,\r\n );\r\n ctx.restore();\r\n\r\n return Math.max(\r\n SWITCH_MIN_WIDTH,\r\n Math.ceil(maxTextWidth + SWITCH_HANDLE_SIZE + SWITCH_TEXT_PADDING * 3),\r\n );\r\n}\r\n\r\nfunction roundRectPath(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n radius: number,\r\n) {\r\n const r = Math.min(radius, width / 2, height / 2);\r\n ctx.beginPath();\r\n ctx.moveTo(x + r, y);\r\n ctx.arcTo(x + width, y, x + width, y + height, r);\r\n ctx.arcTo(x + width, y + height, x, y + height, r);\r\n ctx.arcTo(x, y + height, x, y, r);\r\n ctx.arcTo(x, y, x + width, y, r);\r\n ctx.closePath();\r\n}\r\n","import type { ListTableTagCellContent } from \"../../schema/column\";\r\nimport type { DrawBodyTagContentParams } from \"./types\";\r\nimport {\r\n buildCanvasFont,\r\n drawTextDecoration,\r\n measureTextBounds,\r\n resolveAlignedTextX,\r\n resolveContentFontFamily,\r\n resolveContentFontSize,\r\n resolveContentFontWeight,\r\n resolveContentLayoutWidth,\r\n resolveContentOpacity,\r\n resolveContentTextAlign,\r\n resolveContentTextDecoration,\r\n resolveContentTextIndent,\r\n resolveTagTextColor,\r\n} from \"./content-style\";\r\n\r\nconst TAG_HORIZONTAL_PADDING = 8;\r\nconst TAG_HEIGHT = 22;\r\nconst TAG_RADIUS = 4;\r\n\r\ninterface ResolvedTagPalette {\r\n backgroundColor: string;\r\n borderColor: string;\r\n textColor: string;\r\n}\r\n\r\nconst ANT_TAG_PRESET_MAP: Record<string, ResolvedTagPalette> = {\r\n default: {\r\n backgroundColor: \"#fafafa\",\r\n borderColor: \"#d9d9d9\",\r\n textColor: \"#595959\",\r\n },\r\n success: {\r\n backgroundColor: \"#f6ffed\",\r\n borderColor: \"#b7eb8f\",\r\n textColor: \"#389e0d\",\r\n },\r\n processing: {\r\n backgroundColor: \"#e6f4ff\",\r\n borderColor: \"#91caff\",\r\n textColor: \"#1677ff\",\r\n },\r\n error: {\r\n backgroundColor: \"#fff2f0\",\r\n borderColor: \"#ffccc7\",\r\n textColor: \"#cf1322\",\r\n },\r\n warning: {\r\n backgroundColor: \"#fffbe6\",\r\n borderColor: \"#ffe58f\",\r\n textColor: \"#d48806\",\r\n },\r\n blue: {\r\n backgroundColor: \"#e6f4ff\",\r\n borderColor: \"#91caff\",\r\n textColor: \"#0958d9\",\r\n },\r\n cyan: {\r\n backgroundColor: \"#e6fffb\",\r\n borderColor: \"#87e8de\",\r\n textColor: \"#08979c\",\r\n },\r\n geekblue: {\r\n backgroundColor: \"#f0f5ff\",\r\n borderColor: \"#adc6ff\",\r\n textColor: \"#1d39c4\",\r\n },\r\n gold: {\r\n backgroundColor: \"#fffbe6\",\r\n borderColor: \"#ffe58f\",\r\n textColor: \"#d48806\",\r\n },\r\n green: {\r\n backgroundColor: \"#f6ffed\",\r\n borderColor: \"#b7eb8f\",\r\n textColor: \"#389e0d\",\r\n },\r\n lime: {\r\n backgroundColor: \"#fcffe6\",\r\n borderColor: \"#eaff8f\",\r\n textColor: \"#7cb305\",\r\n },\r\n magenta: {\r\n backgroundColor: \"#fff0f6\",\r\n borderColor: \"#ffadd2\",\r\n textColor: \"#c41d7f\",\r\n },\r\n orange: {\r\n backgroundColor: \"#fff7e6\",\r\n borderColor: \"#ffd591\",\r\n textColor: \"#d46b08\",\r\n },\r\n purple: {\r\n backgroundColor: \"#f9f0ff\",\r\n borderColor: \"#d3adf7\",\r\n textColor: \"#722ed1\",\r\n },\r\n red: {\r\n backgroundColor: \"#fff1f0\",\r\n borderColor: \"#ffa39e\",\r\n textColor: \"#cf1322\",\r\n },\r\n volcano: {\r\n backgroundColor: \"#fff2e8\",\r\n borderColor: \"#ffbb96\",\r\n textColor: \"#d4380d\",\r\n },\r\n};\r\n\r\n/**\r\n * 绘制标签内容。\r\n */\r\nexport function drawBodyTagContent<RecordType>(\r\n params: DrawBodyTagContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n } = params;\r\n const width = measureTagContentWidth(ctx, content, theme);\r\n const height = content.height ?? TAG_HEIGHT;\r\n const top = rect.y + (rect.height - height) / 2;\r\n const radius = Math.min(content.radius ?? TAG_RADIUS, height / 2);\r\n const palette = resolveTagPalette(content);\r\n const bordered = content.bordered !== false;\r\n const textColor = resolveTagTextColor(content, palette.textColor);\r\n const textIndent = resolveContentTextIndent(content);\r\n const paddingInline = content.paddingInline ?? TAG_HORIZONTAL_PADDING;\r\n\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n drawRoundedRectPath(ctx, cursorX, top, width, height, radius);\r\n ctx.fillStyle = content.style?.backgroundColor ?? palette.backgroundColor;\r\n ctx.fill();\r\n\r\n if (bordered) {\r\n ctx.strokeStyle = palette.borderColor;\r\n ctx.lineWidth = 1;\r\n ctx.stroke();\r\n }\r\n\r\n ctx.fillStyle = textColor;\r\n ctx.font = buildCanvasFont({\r\n fontWeight: resolveContentFontWeight(content, \"500\"),\r\n fontSize: resolveContentFontSize(content, Math.max(theme.fontSize - 1, 12)),\r\n fontFamily: resolveContentFontFamily(content, theme),\r\n });\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"middle\";\r\n const bounds = measureTextBounds(ctx, content.text);\r\n const textBoxWidth = Math.max(width - paddingInline * 2, 0);\r\n const textX = resolveAlignedTextX({\r\n baseX: cursorX + paddingInline,\r\n boxWidth: textBoxWidth,\r\n textWidth: bounds.width,\r\n textIndent,\r\n textAlign: resolveContentTextAlign(content),\r\n });\r\n ctx.fillText(content.text, textX, rect.y + rect.height / 2);\r\n drawTextDecoration({\r\n ctx,\r\n x: textX,\r\n centerY: rect.y + rect.height / 2,\r\n width: bounds.width,\r\n ascent: bounds.ascent,\r\n descent: bounds.descent,\r\n color: textColor,\r\n textDecoration: resolveContentTextDecoration(content),\r\n });\r\n ctx.restore();\r\n\r\n if (content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: top,\r\n width,\r\n height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor: content.cursor ?? (content.onClick ? \"pointer\" : undefined),\r\n });\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * 计算标签片段宽度。\r\n */\r\nexport function measureTagContentWidth<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableTagCellContent<RecordType>,\r\n theme: DrawBodyTagContentParams<RecordType>[\"theme\"],\r\n) {\r\n applyTagTextStyle(ctx, content, theme);\r\n const intrinsicWidth =\r\n Math.max(ctx.measureText(content.text).width + resolveContentTextIndent(content), 0) +\r\n (content.paddingInline ?? TAG_HORIZONTAL_PADDING) * 2;\r\n return resolveContentLayoutWidth(content, intrinsicWidth);\r\n}\r\n\r\nfunction applyTagTextStyle<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableTagCellContent<RecordType>,\r\n theme: DrawBodyTagContentParams<RecordType>[\"theme\"],\r\n) {\r\n ctx.font = buildCanvasFont({\r\n fontWeight: resolveContentFontWeight(content, \"500\"),\r\n fontSize: resolveContentFontSize(content, Math.max(theme.fontSize - 1, 12)),\r\n fontFamily: resolveContentFontFamily(content, theme),\r\n });\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"middle\";\r\n}\r\n\r\nfunction resolveTagPalette<RecordType>(\r\n content: ListTableTagCellContent<RecordType>,\r\n): ResolvedTagPalette {\r\n if (\r\n content.style?.backgroundColor ||\r\n content.style?.color ||\r\n content.backgroundColor ||\r\n content.borderColor ||\r\n content.textColor\r\n ) {\r\n return {\r\n backgroundColor: content.style?.backgroundColor ?? content.backgroundColor ?? ANT_TAG_PRESET_MAP.default.backgroundColor,\r\n borderColor:\r\n content.borderColor ??\r\n content.style?.backgroundColor ??\r\n content.backgroundColor ??\r\n ANT_TAG_PRESET_MAP.default.borderColor,\r\n textColor: content.style?.color ?? content.textColor ?? ANT_TAG_PRESET_MAP.default.textColor,\r\n };\r\n }\r\n\r\n const preset = content.color ? ANT_TAG_PRESET_MAP[content.color] : undefined;\r\n if (preset) {\r\n return preset;\r\n }\r\n\r\n if (content.color) {\r\n const textColor = getReadableTextColor(content.color);\r\n return {\r\n backgroundColor: content.color,\r\n borderColor: content.color,\r\n textColor,\r\n };\r\n }\r\n\r\n return ANT_TAG_PRESET_MAP.default;\r\n}\r\n\r\nfunction drawRoundedRectPath(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n radius: number,\r\n) {\r\n ctx.beginPath();\r\n ctx.moveTo(x + radius, y);\r\n ctx.arcTo(x + width, y, x + width, y + height, radius);\r\n ctx.arcTo(x + width, y + height, x, y + height, radius);\r\n ctx.arcTo(x, y + height, x, y, radius);\r\n ctx.arcTo(x, y, x + width, y, radius);\r\n ctx.closePath();\r\n}\r\n\r\nfunction getReadableTextColor(color: string) {\r\n const rgb = parseColorToRgb(color);\r\n if (!rgb) {\r\n return \"#ffffff\";\r\n }\r\n\r\n const luminance =\r\n (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;\r\n return luminance > 0.6 ? \"#1f1f1f\" : \"#ffffff\";\r\n}\r\n\r\nfunction parseColorToRgb(color: string) {\r\n const normalized = color.trim().toLowerCase();\r\n if (/^#([0-9a-f]{3}){1,2}$/i.test(normalized)) {\r\n const hex = normalized.slice(1);\r\n const expanded =\r\n hex.length === 3\r\n ? hex\r\n .split(\"\")\r\n .map((char) => `${char}${char}`)\r\n .join(\"\")\r\n : hex;\r\n return {\r\n r: Number.parseInt(expanded.slice(0, 2), 16),\r\n g: Number.parseInt(expanded.slice(2, 4), 16),\r\n b: Number.parseInt(expanded.slice(4, 6), 16),\r\n };\r\n }\r\n\r\n const rgbMatch = normalized.match(\r\n /^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})/i,\r\n );\r\n if (!rgbMatch) {\r\n return null;\r\n }\r\n\r\n return {\r\n r: Number.parseInt(rgbMatch[1] ?? \"0\", 10),\r\n g: Number.parseInt(rgbMatch[2] ?? \"0\", 10),\r\n b: Number.parseInt(rgbMatch[3] ?? \"0\", 10),\r\n };\r\n}\r\n","import type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\r\nimport type { ListTableTextCellContent } from \"../../schema/column\";\r\nimport type { DrawBodyTextContentParams, BodyCellRect } from \"./types\";\r\nimport {\r\n buildCanvasFont,\r\n drawTextDecoration,\r\n measureTextBounds,\r\n resolveAlignedTextX,\r\n resolveContentBackgroundColor,\r\n resolveContentFontFamily,\r\n resolveContentFontSize,\r\n resolveContentFontWeight,\r\n resolveContentLayoutWidth,\r\n resolveContentOpacity,\r\n resolveContentTextAlign,\r\n resolveContentTextDecoration,\r\n resolveContentTextIndent,\r\n resolveCenteredTextBaselineY,\r\n resolveTextualContentColor,\r\n} from \"./content-style\";\r\n\r\nconst TEXT_HORIZONTAL_PADDING = 12;\r\n\r\ninterface PreparedTextSegment<RecordType> {\r\n content: ListTableTextCellContent<RecordType>;\r\n contentIndex: number;\r\n text: string;\r\n width: number;\r\n}\r\n\r\n/**\r\n * 绘制纯文本单元格内容,保留文本片段样式并支持片段点击。\r\n */\r\nexport function drawTextOnlyBodyCellContents<RecordType>(params: {\r\n ctx: CanvasRenderingContext2D;\r\n rect: BodyCellRect;\r\n contents: ListTableTextCellContent<RecordType>[];\r\n rowIndex: number;\r\n column: DrawBodyTextContentParams<RecordType>[\"column\"];\r\n theme: DrawBodyTextContentParams<RecordType>[\"theme\"];\r\n frozen: boolean;\r\n descriptors: RenderCellDescriptor[];\r\n}) {\r\n const { ctx, rect, contents, rowIndex, column, theme, frozen, descriptors } =\r\n params;\r\n const fullText = contents.map((content) => content.text).join(\"\");\r\n if (!fullText) {\r\n return undefined;\r\n }\r\n\r\n const availableWidth = Math.max(rect.width - TEXT_HORIZONTAL_PADDING * 2, 0);\r\n const preparedSegments = prepareTextSegments({\r\n ctx,\r\n contents,\r\n availableWidth,\r\n ellipsis: column.ellipsis === true,\r\n theme,\r\n });\r\n const displayWidth = preparedSegments.reduce(\r\n (sum, item) => sum + item.width,\r\n 0,\r\n );\r\n\r\n let cursorX = rect.x + TEXT_HORIZONTAL_PADDING;\r\n if (column.align === \"center\") {\r\n cursorX = rect.x + (rect.width - displayWidth) / 2;\r\n } else if (column.align === \"right\") {\r\n cursorX = rect.x + rect.width - TEXT_HORIZONTAL_PADDING - displayWidth;\r\n }\r\n\r\n const tooltipText =\r\n column.ellipsis &&\r\n preparedSegments.map((item) => item.text).join(\"\") !== fullText\r\n ? fullText\r\n : undefined;\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(\r\n rect.x + TEXT_HORIZONTAL_PADDING,\r\n rect.y,\r\n availableWidth,\r\n rect.height,\r\n );\r\n ctx.clip();\r\n\r\n preparedSegments.forEach((segment) => {\r\n drawBodyTextContent({\r\n ctx,\r\n rect,\r\n content: segment.content,\r\n contentIndex: segment.contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n tooltipText,\r\n });\r\n cursorX += segment.width;\r\n });\r\n\r\n ctx.restore();\r\n return tooltipText;\r\n}\r\n\r\n/**\r\n * 绘制单个文本片段,并在需要时注册点击命中区域。\r\n */\r\nexport function drawBodyTextContent<RecordType>(\r\n params: DrawBodyTextContentParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n tooltipText,\r\n } = params;\r\n ctx.save();\r\n ctx.globalAlpha *= resolveContentOpacity(content);\r\n applyTextContentStyle(\r\n ctx,\r\n content,\r\n column.cellStyle?.color ?? theme.textColor,\r\n theme,\r\n );\r\n const bounds = measureTextBounds(ctx, content.text);\r\n const textIndent = resolveContentTextIndent(content);\r\n const intrinsicWidth = Math.max(bounds.width + textIndent, 0);\r\n const width = resolveContentLayoutWidth(content, intrinsicWidth);\r\n const textX = resolveAlignedTextX({\r\n baseX: cursorX,\r\n boxWidth: width,\r\n textWidth: bounds.width,\r\n textIndent,\r\n textAlign: resolveContentTextAlign(content),\r\n });\r\n const centerY = rect.y + rect.height / 2;\r\n const textY = resolveCenteredTextBaselineY({\r\n centerY,\r\n ascent: bounds.ascent,\r\n descent: bounds.descent,\r\n });\r\n drawTextContentBackground(ctx, content, textX, textY);\r\n ctx.fillText(content.text, textX, textY);\r\n drawTextDecoration({\r\n ctx,\r\n x: textX,\r\n centerY,\r\n width: bounds.width,\r\n ascent: bounds.ascent,\r\n descent: bounds.descent,\r\n color: resolveTextualContentColor(\r\n content,\r\n column.cellStyle?.color ?? theme.textColor,\r\n ),\r\n textDecoration: resolveContentTextDecoration(content),\r\n });\r\n ctx.restore();\r\n\r\n if (content.onClick || content.cursor) {\r\n descriptors.push({\r\n kind: \"body-content\",\r\n rect: {\r\n x: cursorX,\r\n y: rect.y,\r\n width,\r\n height: rect.height,\r\n },\r\n columnKey: column.key,\r\n rowIndex,\r\n fixed: column.fixed,\r\n frozen,\r\n contentIndex,\r\n contentKey: content.key,\r\n cursor: content.cursor ?? (content.onClick ? \"pointer\" : undefined),\r\n tooltipText,\r\n });\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * 计算文本片段宽度。\r\n */\r\nexport function measureTextContentWidth<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableTextCellContent<RecordType>,\r\n theme: DrawBodyTextContentParams<RecordType>[\"theme\"],\r\n) {\r\n applyTextContentStyle(ctx, content, theme.textColor, theme);\r\n const intrinsicWidth = Math.max(\r\n ctx.measureText(content.text).width + resolveContentTextIndent(content),\r\n 0,\r\n );\r\n return resolveContentLayoutWidth(content, intrinsicWidth);\r\n}\r\n\r\nfunction drawTextContentBackground<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableTextCellContent<RecordType>,\r\n cursorX: number,\r\n baselineY: number,\r\n) {\r\n const backgroundColor = resolveContentBackgroundColor(content);\r\n if (!backgroundColor) {\r\n return;\r\n }\r\n\r\n const bounds = measureTextBounds(ctx, content.text);\r\n ctx.save();\r\n ctx.fillStyle = backgroundColor;\r\n ctx.fillRect(cursorX, baselineY - bounds.ascent, bounds.width, bounds.height);\r\n ctx.restore();\r\n}\r\n\r\nfunction prepareTextSegments<RecordType>(params: {\r\n ctx: CanvasRenderingContext2D;\r\n contents: ListTableTextCellContent<RecordType>[];\r\n availableWidth: number;\r\n ellipsis: boolean;\r\n theme: DrawBodyTextContentParams<RecordType>[\"theme\"];\r\n}) {\r\n const { ctx, contents, availableWidth, ellipsis, theme } = params;\r\n const prepared: PreparedTextSegment<RecordType>[] = [];\r\n let usedWidth = 0;\r\n let truncated = false;\r\n\r\n for (let index = 0; index < contents.length; index += 1) {\r\n const content = contents[index];\r\n if (!content) {\r\n continue;\r\n }\r\n\r\n const text = content.text ?? \"\";\r\n if (!text) {\r\n continue;\r\n }\r\n\r\n if (!ellipsis) {\r\n prepared.push({\r\n content,\r\n contentIndex: index,\r\n text,\r\n width: measureTextContentWidth(ctx, content, theme),\r\n });\r\n continue;\r\n }\r\n\r\n const remainingWidth = Math.max(availableWidth - usedWidth, 0);\r\n if (remainingWidth <= 0) {\r\n truncated = true;\r\n break;\r\n }\r\n\r\n const displayText = ellipsisText(\r\n ctx,\r\n text,\r\n content,\r\n theme,\r\n remainingWidth,\r\n index < contents.length - 1,\r\n );\r\n const width = measureTextContentWidth(\r\n ctx,\r\n { ...content, text: displayText },\r\n theme,\r\n );\r\n prepared.push({\r\n content: {\r\n ...content,\r\n text: displayText,\r\n },\r\n contentIndex: index,\r\n text: displayText,\r\n width,\r\n });\r\n usedWidth += width;\r\n\r\n if (displayText !== text) {\r\n truncated = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!truncated) {\r\n return prepared;\r\n }\r\n\r\n return prepared;\r\n}\r\n\r\nfunction ellipsisText<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n content: ListTableTextCellContent<RecordType>,\r\n theme: DrawBodyTextContentParams<RecordType>[\"theme\"],\r\n maxWidth: number,\r\n _keepTrailingEllipsis: boolean,\r\n) {\r\n if (!text) {\r\n return \"\";\r\n }\r\n\r\n applyTextContentStyle(ctx, content, theme.textColor, theme);\r\n if (ctx.measureText(text).width <= maxWidth) {\r\n return text;\r\n }\r\n\r\n const ellipsis = \"...\";\r\n let output = \"\";\r\n for (const char of text) {\r\n const next = `${output}${char}`;\r\n if (ctx.measureText(`${next}${ellipsis}`).width > maxWidth) {\r\n return output ? `${output}${ellipsis}` : ellipsis;\r\n }\r\n output = next;\r\n }\r\n\r\n return text;\r\n}\r\n\r\nfunction applyTextContentStyle<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableTextCellContent<RecordType>,\r\n fallbackColor: string,\r\n theme: DrawBodyTextContentParams<RecordType>[\"theme\"],\r\n) {\r\n ctx.fillStyle = resolveTextualContentColor(content, fallbackColor);\r\n ctx.font = buildCanvasFont({\r\n fontWeight: resolveContentFontWeight(content),\r\n fontSize: resolveContentFontSize(content, theme.fontSize),\r\n fontFamily: resolveContentFontFamily(content, theme),\r\n });\r\n ctx.textBaseline = \"alphabetic\";\r\n ctx.textAlign = \"left\";\r\n}\r\n","import { getValueByDataIndex } from \"../../domain/data/get-value-by-data-index\";\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\nimport type { ListTableFormItemPropsConfig } from \"../../schema/column\";\nimport {\n EXPAND_COLUMN_KEY,\n ROW_SELECTION_COLUMN_KEY,\n} from \"../../domain/rows/row-selection\";\nimport type { ListTableEditorNavigateDirection } from \"../../ui/types\";\n\nexport interface CellEditContext<RecordType> {\n value: unknown;\n record: RecordType;\n rowIndex: number;\n}\n\n/**\n * 判断列是否支持单元格编辑。\n */\nexport function canEditCell<RecordType>(\n column: InternalLeafColumn<RecordType> | undefined,\n context: CellEditContext<RecordType>,\n) {\n if (\n !column ||\n column.key === ROW_SELECTION_COLUMN_KEY ||\n column.key === EXPAND_COLUMN_KEY\n ) {\n return false;\n }\n\n const editConfig = getColumnEditConfig(column, context);\n if (!editConfig || column.dataIndex == null) {\n return false;\n }\n\n if (editConfig.valueType !== \"text\") {\n return true;\n }\n\n return column.cellType == null || column.cellType === \"text\";\n}\n\n/**\n * 解析列编辑配置。\n */\nexport function getColumnEditConfig<RecordType>(\n column: InternalLeafColumn<RecordType>,\n context: CellEditContext<RecordType>,\n): ListTableFormItemPropsConfig<RecordType> | null {\n if (!resolveColumnEditable(column, context)) {\n return null;\n }\n\n const resolvedFormItemProps = resolveColumnFormItemProps(column, context);\n if (!resolvedFormItemProps) {\n return {\n valueType: \"text\" as const,\n clickCount: 2,\n };\n }\n\n return {\n clickCount: normalizeEditClickCount(resolvedFormItemProps.clickCount),\n valueType: resolvedFormItemProps.valueType ?? \"text\",\n format: resolvedFormItemProps.format,\n placeholder: resolvedFormItemProps.placeholder,\n min: resolvedFormItemProps.min,\n max: resolvedFormItemProps.max,\n step: resolvedFormItemProps.step,\n options: resolvedFormItemProps.options,\n showSearch: resolvedFormItemProps.showSearch,\n filterOption: resolvedFormItemProps.filterOption,\n onPressEnter: resolvedFormItemProps.onPressEnter,\n rangeSeparator: resolvedFormItemProps.rangeSeparator,\n };\n}\n\n/**\n * 判断当前点击次数是否应该触发编辑。\n */\nexport function shouldOpenCellEditorOnClick<RecordType>(\n column: InternalLeafColumn<RecordType> | undefined,\n clickCount: number,\n context: CellEditContext<RecordType>,\n) {\n const editConfig = column ? getColumnEditConfig(column, context) : null;\n if (!editConfig) {\n return false;\n }\n\n return (\n normalizeEditClickCount(editConfig.clickCount) ===\n normalizeEditClickCount(clickCount)\n );\n}\n\n/**\n * 归一化编辑触发点击次数。\n */\nexport function normalizeEditClickCount(clickCount?: number) {\n if (typeof clickCount !== \"number\" || !Number.isFinite(clickCount)) {\n return 2;\n }\n\n return clickCount >= 2 ? 2 : 1;\n}\n\n/**\n * 解析单元格格式化文案。\n */\nexport function resolveFormattedCellText<RecordType>(params: {\n column: InternalLeafColumn<RecordType>;\n value: unknown;\n record: RecordType;\n rowIndex: number;\n}) {\n const { column, value, record, rowIndex } = params;\n const resolvedFormItemProps = resolveColumnFormItemProps(column, {\n value,\n record,\n rowIndex,\n });\n const formatter = resolvedFormItemProps?.format;\n if (typeof formatter === \"function\") {\n return formatter(value, record, rowIndex);\n }\n if (formatter === \"\") {\n return \"\";\n }\n\n if (\n Array.isArray(value) &&\n (resolvedFormItemProps?.valueType === \"date-range\" ||\n resolvedFormItemProps?.valueType === \"datetime-range\" ||\n resolvedFormItemProps?.valueType === \"timerange\")\n ) {\n const [start = \"\", end = \"\"] = value;\n return `${String(start ?? \"\")}${\n resolvedFormItemProps.rangeSeparator ?? \" ~ \"\n }${String(end ?? \"\")}`;\n }\n\n return null;\n}\n\n/**\n * 解析编辑态键盘导航目标。\n */\nexport function resolveNextEditableCell<RecordType>(params: {\n rowIndex: number;\n columnKey: string;\n leafColumns: InternalLeafColumn<RecordType>[];\n rows: RecordType[];\n direction: ListTableEditorNavigateDirection;\n}) {\n const { rowIndex, columnKey, leafColumns, rows, direction } = params;\n const rowCount = rows.length;\n if (rowIndex < 0 || rowIndex >= rowCount) {\n return null;\n }\n\n const currentRecord = rows[rowIndex];\n if (!currentRecord) {\n return null;\n }\n\n const editableColumns = leafColumns.filter((column) =>\n canEditCell(column, {\n value:\n column.dataIndex == null\n ? undefined\n : getValueByDataIndex(currentRecord, column.dataIndex),\n record: currentRecord,\n rowIndex,\n }),\n );\n if (editableColumns.length === 0) {\n return null;\n }\n\n const currentColumnIndex = editableColumns.findIndex(\n (column) => column.key === columnKey,\n );\n if (currentColumnIndex < 0) {\n return null;\n }\n\n if (direction === \"up\" || direction === \"down\") {\n const targetRowIndex = rowIndex + (direction === \"up\" ? -1 : 1);\n if (targetRowIndex < 0 || targetRowIndex >= rowCount) {\n return null;\n }\n\n return {\n rowIndex: targetRowIndex,\n columnKey,\n };\n }\n\n if (direction === \"next\") {\n if (currentColumnIndex < editableColumns.length - 1) {\n return {\n rowIndex,\n columnKey: editableColumns[currentColumnIndex + 1].key,\n };\n }\n\n if (rowIndex < rowCount - 1) {\n return {\n rowIndex: rowIndex + 1,\n columnKey: editableColumns[0].key,\n };\n }\n\n return null;\n }\n\n if (currentColumnIndex > 0) {\n return {\n rowIndex,\n columnKey: editableColumns[currentColumnIndex - 1].key,\n };\n }\n\n if (rowIndex > 0) {\n return {\n rowIndex: rowIndex - 1,\n columnKey: editableColumns[editableColumns.length - 1].key,\n };\n }\n\n return null;\n}\n\nfunction resolveColumnEditable<RecordType>(\n column: InternalLeafColumn<RecordType>,\n context: CellEditContext<RecordType>,\n) {\n if (column.editable == null) {\n return false;\n }\n\n if (typeof column.editable === \"function\") {\n return column.editable(context.value, context.record, context.rowIndex);\n }\n\n return column.editable;\n}\n\nfunction resolveColumnFormItemProps<RecordType>(\n column: InternalLeafColumn<RecordType>,\n context: CellEditContext<RecordType>,\n) {\n if (typeof column.formItemProps === \"function\") {\n return column.formItemProps(\n context.value,\n context.record,\n context.rowIndex,\n );\n }\n\n return column.formItemProps;\n}\n","import { getValueByDataIndex } from \"../../domain/data/get-value-by-data-index\";\r\nimport type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\r\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport type {\r\n ListTableCellContent,\r\n ListTableChartCellContent,\r\n ListTableLinkCellContent,\r\n ListTableMoneyCellContent,\r\n ListTableMoneyFormatOptions,\r\n ListTableProgressCellContent,\r\n ListTableRateCellContent,\r\n ListTableRenderResult,\r\n ListTableTextCellContent,\r\n} from \"../../schema/column\";\r\nimport {\r\n drawBodyArrowContent,\r\n measureArrowContentHeight,\r\n measureArrowContentWidth,\r\n} from \"./draw-arrow-content\";\r\nimport {\r\n drawBodyBarcodeContent,\r\n measureBarcodeContentHeight,\r\n measureBarcodeContentWidth,\r\n} from \"./draw-barcode-content\";\r\nimport {\r\n drawBodyButtonContent,\r\n measureButtonContentHeight,\r\n measureButtonContentWidth,\r\n} from \"./draw-button-content\";\r\nimport {\r\n drawBodyChartContent,\r\n measureChartContentHeight,\r\n measureChartContentWidth,\r\n resolveChartContentPlainText,\r\n} from \"./draw-chart-content\";\r\nimport {\r\n drawBodyColorContent,\r\n measureColorContentHeight,\r\n measureColorContentWidth,\r\n} from \"./draw-color-content\";\r\nimport {\r\n drawBodyImageContent,\r\n measureImageContentHeight,\r\n measureImageContentWidth,\r\n} from \"./draw-image-content\";\r\nimport {\r\n drawBodyIconContent,\r\n measureIconContentHeight,\r\n measureIconContentWidth,\r\n} from \"./draw-icon-content\";\r\nimport {\r\n drawBodyLinkContent,\r\n measureLinkContentWidth,\r\n} from \"./draw-link-content\";\r\nimport {\r\n drawBodyNestedTableContent,\r\n measureNestedTableContentHeight,\r\n measureNestedTableContentWidth,\r\n} from \"./draw-nested-table-content\";\r\nimport {\r\n drawBodyProgressContent,\r\n measureProgressContentHeight,\r\n measureProgressContentWidth,\r\n} from \"./draw-progress-content\";\r\nimport {\r\n drawBodyQrCodeContent,\r\n measureQrCodeContentHeight,\r\n measureQrCodeContentWidth,\r\n} from \"./draw-qrcode-content\";\r\nimport {\r\n drawBodyRateContent,\r\n measureRateContentHeight,\r\n measureRateContentWidth,\r\n} from \"./draw-rate-content\";\r\nimport {\r\n drawBodySelectionContent,\r\n measureSelectionContentWidth,\r\n} from \"./draw-selection-content\";\r\nimport {\r\n drawBodySwitchContent,\r\n measureSwitchContentWidth,\r\n} from \"./draw-switch-content\";\r\nimport {\r\n drawBodyTagContent,\r\n measureTagContentWidth,\r\n} from \"./draw-tag-content\";\r\nimport {\r\n drawBodyTextContent,\r\n measureTextContentWidth,\r\n} from \"./draw-text-content\";\r\nimport { resolveFormattedCellText } from \"../../features/editing/editing-utils\";\r\nimport type { DrawBodyCellContentsParams } from \"./types\";\r\n\r\nconst CONTENT_HORIZONTAL_PADDING = 12;\r\nconst CONTENT_GAP = 8;\r\nconst CONTENT_VERTICAL_PADDING = 6;\r\n\r\ninterface ExpandedBodyContent<RecordType> {\r\n content: ListTableCellContent<RecordType>;\r\n contentIndex: number;\r\n gapBefore: boolean;\r\n}\r\n\r\ninterface PositionedBodyContent<\r\n RecordType,\r\n> extends ExpandedBodyContent<RecordType> {\r\n width: number;\r\n}\r\n\r\ninterface BodyContentLine<RecordType> {\r\n items: PositionedBodyContent<RecordType>[];\r\n width: number;\r\n}\r\n\r\n/**\r\n * 解析表体单元格内容。\r\n */\r\nexport function resolveBodyCellContents<RecordType>(params: {\r\n record: RecordType;\r\n rowIndex: number;\r\n column: InternalLeafColumn<RecordType>;\r\n}) {\r\n const { record, rowIndex, column } = params;\r\n const value = getValueByDataIndex(record, column.dataIndex);\r\n const rendered = column.render?.(value, record, rowIndex, column);\r\n if (rendered != null) {\r\n return normalizeCellContents(rendered);\r\n }\r\n const formattedText = resolveFormattedCellText({\r\n column,\r\n value,\r\n record,\r\n rowIndex,\r\n });\r\n\r\n if (\r\n column.cellType === \"checkbox\" ||\r\n column.cellType === \"radio\" ||\r\n column.cellType === \"switch\"\r\n ) {\r\n return [\r\n {\r\n type: column.cellType,\r\n checked: Boolean(value),\r\n } as ListTableCellContent<RecordType>,\r\n ] satisfies ListTableCellContent<RecordType>[];\r\n }\r\n\r\n if (column.cellType === \"link\") {\r\n return [\r\n {\r\n type: \"link\",\r\n text: formattedText ?? String(value ?? \"\"),\r\n href: typeof value === \"string\" ? value : undefined,\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[];\r\n }\r\n\r\n if (column.cellType === \"button\") {\r\n return [\r\n {\r\n type: \"button\",\r\n text: formattedText ?? String(value ?? \"\"),\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[];\r\n }\r\n\r\n if (column.cellType === \"color\") {\r\n const colorValue = String(value ?? \"\");\r\n return colorValue\r\n ? ([\r\n {\r\n type: \"color\",\r\n value: colorValue,\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[])\r\n : [];\r\n }\r\n\r\n if (column.cellType === \"barcode\") {\r\n const barcodeValue = String(value ?? \"\");\r\n return barcodeValue\r\n ? ([\r\n {\r\n type: \"barcode\",\r\n value: barcodeValue,\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[])\r\n : [];\r\n }\r\n\r\n if (column.cellType === \"image\") {\r\n const src = String(value ?? \"\");\r\n return src\r\n ? ([\r\n {\r\n type: \"image\",\r\n src,\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[])\r\n : [];\r\n }\r\n\r\n if (column.cellType === \"qrcode\") {\r\n const qrValue = String(value ?? \"\");\r\n return qrValue\r\n ? ([\r\n {\r\n type: \"qrcode\",\r\n value: qrValue,\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[])\r\n : [];\r\n }\r\n\r\n if (column.cellType === \"progress\") {\r\n const numericValue =\r\n typeof value === \"number\"\r\n ? value\r\n : typeof value === \"string\"\r\n ? Number(value)\r\n : 0;\r\n return [\r\n {\r\n type: \"progress\",\r\n value: Number.isFinite(numericValue) ? numericValue : 0,\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[];\r\n }\r\n\r\n if (column.cellType === \"rate\") {\r\n const numericValue =\r\n typeof value === \"number\"\r\n ? value\r\n : typeof value === \"string\"\r\n ? Number(value)\r\n : 0;\r\n return [\r\n {\r\n type: \"rate\",\r\n value: Number.isFinite(numericValue) ? numericValue : 0,\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[];\r\n }\r\n\r\n if (column.cellType === \"chart\") {\r\n const content = resolveDefaultChartContent<RecordType>(value);\r\n return content\r\n ? ([content] satisfies ListTableCellContent<RecordType>[])\r\n : [];\r\n }\r\n\r\n if (column.cellType === \"tag\") {\r\n return [\r\n {\r\n type: \"tag\",\r\n text: formattedText ?? String(value ?? \"\"),\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[];\r\n }\r\n\r\n if (column.cellType === \"money\") {\r\n return [\r\n {\r\n type: \"text\",\r\n text: formattedText ?? formatMoneyValue(value, column.moneyFormat),\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[];\r\n }\r\n\r\n return [\r\n {\r\n type: \"text\",\r\n text: formattedText ?? String(value ?? \"\"),\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[];\r\n}\r\n\r\n/**\r\n * 归一化单元格内容结构。\r\n */\r\nexport function normalizeCellContents<RecordType>(\r\n contents: ListTableRenderResult<RecordType>,\r\n) {\r\n if (Array.isArray(contents)) {\r\n return contents.map(normalizeCellContentItem);\r\n }\r\n\r\n if (typeof contents === \"string\" || typeof contents === \"number\") {\r\n return [\r\n {\r\n type: \"text\",\r\n text: String(contents),\r\n },\r\n ] satisfies ListTableCellContent<RecordType>[];\r\n }\r\n\r\n if (contents == null) {\r\n return [];\r\n }\r\n\r\n return [normalizeCellContentItem(contents)];\r\n}\r\n\r\nfunction normalizeDrawableCellContents<RecordType>(\r\n contents: ListTableCellContent<RecordType>[],\r\n) {\r\n return contents.map(normalizeCellContentItem);\r\n}\r\n\r\nfunction normalizeCellContentItem<RecordType>(\r\n content: ListTableCellContent<RecordType>,\r\n): ListTableCellContent<RecordType> {\r\n if (content.type !== \"money\") {\r\n return content;\r\n }\r\n\r\n return {\r\n type: \"text\",\r\n text: formatMoneyValue(content.value, content),\r\n key: content.key,\r\n style: content.style,\r\n cursor: content.cursor,\r\n onClick: content.onClick,\r\n color: content.color,\r\n fontSize: content.fontSize,\r\n fontWeight: content.fontWeight,\r\n };\r\n}\r\n\r\nfunction formatMoneyValue(\r\n value: unknown,\r\n options?: ListTableMoneyFormatOptions,\r\n) {\r\n if (value == null || value === \"\") {\r\n return \"\";\r\n }\r\n\r\n const numericValue = parseMoneyNumber(value);\r\n if (numericValue == null) {\r\n return String(value);\r\n }\r\n\r\n const decimalPlaces = normalizeDecimalPlaces(options?.decimalPlaces);\r\n const separator = resolveThousandsSeparator(options?.thousandsSeparator);\r\n const symbol = options?.symbol ?? \"\";\r\n const sign = numericValue < 0 ? \"-\" : \"\";\r\n const absoluteText = Math.abs(numericValue).toFixed(decimalPlaces);\r\n const [integerText = \"0\", decimalText] = absoluteText.split(\".\");\r\n const formattedInteger = separator\r\n ? integerText.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\r\n : integerText;\r\n const formattedDecimal =\r\n decimalText != null && decimalText.length > 0 ? `.${decimalText}` : \"\";\r\n\r\n return `${sign}${symbol}${formattedInteger}${formattedDecimal}`;\r\n}\r\n\r\nfunction parseMoneyNumber(value: unknown) {\r\n if (typeof value === \"number\") {\r\n return Number.isFinite(value) ? value : null;\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return null;\r\n }\r\n\r\n const normalized = value.trim().replace(/,/g, \"\");\r\n if (!normalized) {\r\n return null;\r\n }\r\n\r\n const numericValue = Number(normalized);\r\n return Number.isFinite(numericValue) ? numericValue : null;\r\n}\r\n\r\nfunction normalizeDecimalPlaces(decimalPlaces: number | undefined) {\r\n if (typeof decimalPlaces !== \"number\" || !Number.isFinite(decimalPlaces)) {\r\n return 2;\r\n }\r\n\r\n return Math.max(Math.trunc(decimalPlaces), 0);\r\n}\r\n\r\nfunction resolveThousandsSeparator(separator: boolean | string | undefined) {\r\n if (separator === false) {\r\n return \"\";\r\n }\r\n if (typeof separator === \"string\") {\r\n return separator;\r\n }\r\n return \",\";\r\n}\r\n\r\n/**\r\n * 绘制表体单元格内容。\r\n */\r\nexport function drawBodyCellContents<RecordType>(\r\n params: DrawBodyCellContentsParams<RecordType>,\r\n) {\r\n const {\r\n ctx,\r\n rect,\r\n visibleRect,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n hovered,\r\n descriptors,\r\n getNestedTableHighlight,\r\n getControlAnimationProgress,\r\n requestRender,\r\n skipNestedTableOuterBorders,\r\n } = params;\r\n const contents = normalizeDrawableCellContents(params.contents);\r\n if (contents.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const paddingInline =\r\n column.cellStyle?.paddingInline ?? CONTENT_HORIZONTAL_PADDING;\r\n const paddingBlock =\r\n column.cellStyle?.paddingBlock ?? CONTENT_VERTICAL_PADDING;\r\n const availableWidth = Math.max(rect.width - paddingInline * 2, 0);\r\n const availableHeight = Math.max(rect.height - paddingBlock * 2, 0);\r\n if (availableWidth <= 0 || availableHeight <= 0) {\r\n return undefined;\r\n }\r\n\r\n if (contents.length === 1 && contents[0]?.type === \"table\") {\r\n const contentRect = {\r\n x: rect.x,\r\n y: rect.y,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n const contentVisibleRect = visibleRect\r\n ? intersectRects(contentRect, visibleRect)\r\n : contentRect;\r\n if (!contentVisibleRect) {\r\n return undefined;\r\n }\r\n const itemDescriptors: RenderCellDescriptor[] = [];\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(\r\n contentVisibleRect.x,\r\n contentVisibleRect.y,\r\n contentVisibleRect.width,\r\n contentVisibleRect.height,\r\n );\r\n ctx.clip();\r\n drawExpandedBodyContent({\r\n ctx,\r\n rect: contentRect,\r\n content: contents[0],\r\n contentIndex: 0,\r\n cursorX: contentRect.x,\r\n availableWidth: contentVisibleRect.width,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n hovered,\r\n descriptors: itemDescriptors,\r\n getNestedTableHighlight,\r\n getControlAnimationProgress,\r\n requestRender,\r\n skipNestedTableOuterBorders,\r\n });\r\n ctx.restore();\r\n appendClippedContentDescriptors(\r\n descriptors,\r\n itemDescriptors,\r\n contentVisibleRect,\r\n );\r\n return undefined;\r\n }\r\n\r\n const lineHeight = getBodyCellContentsLineHeight(contents, theme);\r\n const layout = layoutBodyCellContents({\r\n ctx,\r\n contents,\r\n column,\r\n theme,\r\n availableWidth,\r\n availableHeight,\r\n lineHeight,\r\n });\r\n\r\n if (layout.lines.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const blockHeight = Math.min(\r\n layout.lines.length * lineHeight,\r\n availableHeight,\r\n );\r\n const contentTop = resolveContentTop(\r\n rect,\r\n blockHeight,\r\n paddingBlock,\r\n column.cellStyle?.verticalAlign,\r\n );\r\n const contentRect = {\r\n x: rect.x + paddingInline,\r\n y: rect.y + paddingBlock,\r\n width: availableWidth,\r\n height: availableHeight,\r\n };\r\n const contentVisibleRect = visibleRect\r\n ? intersectRects(contentRect, visibleRect)\r\n : contentRect;\r\n if (!contentVisibleRect) {\r\n return undefined;\r\n }\r\n\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(contentRect.x, contentRect.y, contentRect.width, contentRect.height);\r\n ctx.clip();\r\n\r\n layout.lines.forEach((line, lineIndex) => {\r\n const lineRect = {\r\n x: contentRect.x,\r\n y: contentTop + lineIndex * lineHeight,\r\n width: contentRect.width,\r\n height: lineHeight,\r\n };\r\n const lineVisibleRect = intersectRects(lineRect, contentVisibleRect);\r\n if (!lineVisibleRect) {\r\n return;\r\n }\r\n let cursorX = resolveStickyLineStartX({\r\n rect: lineRect,\r\n visibleRect: lineVisibleRect,\r\n lineWidth: line.width,\r\n align: column.align,\r\n });\r\n line.items.forEach((item, itemIndex) => {\r\n if (itemIndex > 0 && item.gapBefore) {\r\n cursorX += CONTENT_GAP;\r\n }\r\n\r\n const itemDescriptors: RenderCellDescriptor[] = [];\r\n drawExpandedBodyContent({\r\n ctx,\r\n rect: lineRect,\r\n content: item.content,\r\n contentIndex: item.contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n hovered,\r\n descriptors: itemDescriptors,\r\n getNestedTableHighlight,\r\n getControlAnimationProgress,\r\n requestRender,\r\n skipNestedTableOuterBorders,\r\n });\r\n appendClippedContentDescriptors(\r\n descriptors,\r\n itemDescriptors,\r\n contentVisibleRect,\r\n );\r\n cursorX += item.width;\r\n });\r\n });\r\n\r\n ctx.restore();\r\n return column.ellipsis === true && layout.truncated\r\n ? buildBodyContentsPlainText(contents)\r\n : undefined;\r\n}\r\n\r\n/**\r\n * 将内容命中描述符裁剪到实际可见区域,完全不可见的描述符不参与交互。\r\n */\r\nfunction appendClippedContentDescriptors(\r\n descriptors: RenderCellDescriptor[],\r\n itemDescriptors: RenderCellDescriptor[],\r\n visibleRect: DrawBodyCellContentsParams<never>[\"rect\"],\r\n) {\r\n itemDescriptors.forEach((descriptor) => {\r\n const clippedRect = intersectRects(descriptor.rect, visibleRect);\r\n if (!clippedRect) {\r\n return;\r\n }\r\n descriptors.push({\r\n ...descriptor,\r\n rect: clippedRect,\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * 计算表体单元格内容所需高度。\r\n */\r\nexport function measureBodyCellContentsHeight<RecordType>(params: {\r\n ctx: CanvasRenderingContext2D;\r\n contents: ListTableCellContent<RecordType>[];\r\n column: DrawBodyCellContentsParams<RecordType>[\"column\"];\r\n theme: DrawBodyCellContentsParams<RecordType>[\"theme\"];\r\n}) {\r\n const { ctx, column, theme } = params;\r\n const contents = normalizeDrawableCellContents(params.contents);\r\n if (contents.length === 0) {\r\n return 0;\r\n }\r\n\r\n const paddingInline =\r\n column.cellStyle?.paddingInline ?? CONTENT_HORIZONTAL_PADDING;\r\n const paddingBlock =\r\n column.cellStyle?.paddingBlock ?? CONTENT_VERTICAL_PADDING;\r\n const availableWidth = Math.max(column.width - paddingInline * 2, 0);\r\n if (availableWidth <= 0) {\r\n return paddingBlock * 2;\r\n }\r\n\r\n const lineHeight = getBodyCellContentsLineHeight(contents, theme);\r\n const layout = layoutBodyCellContents({\r\n ctx,\r\n contents,\r\n column,\r\n theme,\r\n availableWidth,\r\n availableHeight: Number.POSITIVE_INFINITY,\r\n lineHeight,\r\n });\r\n\r\n if (layout.lines.length === 0) {\r\n return paddingBlock * 2;\r\n }\r\n\r\n return Math.ceil(layout.lines.length * lineHeight + paddingBlock * 2);\r\n}\r\n\r\nfunction layoutBodyCellContents<RecordType>(params: {\r\n ctx: CanvasRenderingContext2D;\r\n contents: ListTableCellContent<RecordType>[];\r\n column: DrawBodyCellContentsParams<RecordType>[\"column\"];\r\n theme: DrawBodyCellContentsParams<RecordType>[\"theme\"];\r\n availableWidth: number;\r\n availableHeight: number;\r\n lineHeight: number;\r\n}) {\r\n const {\r\n ctx,\r\n contents,\r\n column,\r\n theme,\r\n availableWidth,\r\n availableHeight,\r\n lineHeight,\r\n } = params;\r\n const expandedContents = expandBodyContents(contents);\r\n const maxLines =\r\n column.ellipsis === true\r\n ? 1\r\n : Math.max(Math.floor(availableHeight / lineHeight), 1);\r\n\r\n return column.ellipsis === true\r\n ? buildSingleLineLayout(ctx, expandedContents, availableWidth, theme)\r\n : buildWrappedLineLayout(\r\n ctx,\r\n expandedContents,\r\n availableWidth,\r\n maxLines,\r\n theme,\r\n );\r\n}\r\n\r\nfunction expandBodyContents<RecordType>(\r\n contents: ListTableCellContent<RecordType>[],\r\n) {\r\n const textOnly = contents.every((content) => content.type === \"text\");\r\n const expanded: ExpandedBodyContent<RecordType>[] = [];\r\n\r\n contents.forEach((content, contentIndex) => {\r\n expanded.push({\r\n content,\r\n contentIndex,\r\n gapBefore: expanded.length > 0 && !textOnly,\r\n });\r\n\r\n if (\r\n (content.type === \"checkbox\" || content.type === \"radio\") &&\r\n content.label\r\n ) {\r\n const textLabelContent: ListTableTextCellContent<RecordType> = {\r\n type: \"text\",\r\n text: content.label,\r\n key: content.key,\r\n cursor: content.disabled === true ? \"not-allowed\" : content.cursor,\r\n onClick: content.disabled === true ? undefined : content.onClick,\r\n };\r\n expanded.push({\r\n content: textLabelContent,\r\n contentIndex,\r\n gapBefore: true,\r\n });\r\n }\r\n });\r\n\r\n return expanded;\r\n}\r\n\r\nfunction buildSingleLineLayout<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n contents: ExpandedBodyContent<RecordType>[],\r\n availableWidth: number,\r\n theme: DrawBodyCellContentsParams<RecordType>[\"theme\"],\r\n) {\r\n const line: BodyContentLine<RecordType> = {\r\n items: [],\r\n width: 0,\r\n };\r\n let truncated = false;\r\n\r\n for (let index = 0; index < contents.length; index += 1) {\r\n const item = contents[index];\r\n if (!item) {\r\n continue;\r\n }\r\n\r\n if (item.content.style?.display === \"block\") {\r\n if (line.items.length > 0) {\r\n applyTrailingEllipsis(ctx, line, theme, availableWidth);\r\n truncated = true;\r\n break;\r\n }\r\n\r\n truncated = index < contents.length - 1;\r\n const nextContent = truncateExpandedContent(\r\n ctx,\r\n item.content,\r\n theme,\r\n availableWidth,\r\n true,\r\n );\r\n if (nextContent) {\r\n line.items.push({\r\n ...item,\r\n content: nextContent,\r\n width: measureExpandedContentWidth(ctx, nextContent, theme),\r\n });\r\n line.width = availableWidth;\r\n }\r\n break;\r\n }\r\n\r\n const gapWidth = line.items.length > 0 && item.gapBefore ? CONTENT_GAP : 0;\r\n const remainingWidth = availableWidth - line.width - gapWidth;\r\n if (remainingWidth <= 0) {\r\n truncated = true;\r\n break;\r\n }\r\n\r\n const fullWidth = measureExpandedContentWidth(ctx, item.content, theme);\r\n const hasTail = index < contents.length - 1;\r\n if (fullWidth <= remainingWidth) {\r\n line.items.push({\r\n ...item,\r\n width: fullWidth,\r\n });\r\n line.width += gapWidth + fullWidth;\r\n continue;\r\n }\r\n\r\n const truncatedContent = truncateExpandedContent(\r\n ctx,\r\n item.content,\r\n theme,\r\n remainingWidth,\r\n true,\r\n );\r\n if (truncatedContent) {\r\n line.items.push({\r\n ...item,\r\n content: truncatedContent,\r\n width: measureExpandedContentWidth(ctx, truncatedContent, theme),\r\n });\r\n line.width +=\r\n gapWidth + measureExpandedContentWidth(ctx, truncatedContent, theme);\r\n } else if (hasTail || line.items.length > 0) {\r\n applyTrailingEllipsis(ctx, line, theme, availableWidth);\r\n }\r\n\r\n truncated = true;\r\n break;\r\n }\r\n\r\n return {\r\n lines: line.items.length > 0 ? [line] : [],\r\n truncated,\r\n };\r\n}\r\n\r\nfunction buildWrappedLineLayout<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n contents: ExpandedBodyContent<RecordType>[],\r\n availableWidth: number,\r\n maxLines: number,\r\n theme: DrawBodyCellContentsParams<RecordType>[\"theme\"],\r\n) {\r\n const lines: BodyContentLine<RecordType>[] = [];\r\n let currentLine: BodyContentLine<RecordType> = { items: [], width: 0 };\r\n let truncated = false;\r\n\r\n for (let index = 0; index < contents.length; index += 1) {\r\n let currentItem: ExpandedBodyContent<RecordType> | null =\r\n contents[index] ?? null;\r\n while (currentItem) {\r\n if (currentItem.content.style?.display === \"block\") {\r\n if (currentLine.items.length > 0) {\r\n if (lines.length + 1 >= maxLines) {\r\n truncated = true;\r\n currentItem = null;\r\n break;\r\n }\r\n lines.push(currentLine);\r\n currentLine = { items: [], width: 0 };\r\n }\r\n\r\n const fullWidth = measureExpandedContentWidth(\r\n ctx,\r\n currentItem.content,\r\n theme,\r\n );\r\n if (\r\n !isBreakableContent(currentItem.content) ||\r\n fullWidth <= availableWidth\r\n ) {\r\n lines.push({\r\n items: [\r\n {\r\n ...currentItem,\r\n gapBefore: false,\r\n width: fullWidth,\r\n },\r\n ],\r\n width: availableWidth,\r\n });\r\n currentItem = null;\r\n continue;\r\n }\r\n\r\n const fittedContent = truncateExpandedContent(\r\n ctx,\r\n currentItem.content,\r\n theme,\r\n availableWidth,\r\n false,\r\n );\r\n if (!fittedContent) {\r\n truncated = true;\r\n currentItem = null;\r\n break;\r\n }\r\n\r\n const fittedWidth = measureExpandedContentWidth(\r\n ctx,\r\n fittedContent,\r\n theme,\r\n );\r\n lines.push({\r\n items: [\r\n {\r\n ...currentItem,\r\n content: fittedContent,\r\n gapBefore: false,\r\n width: fittedWidth,\r\n },\r\n ],\r\n width: availableWidth,\r\n });\r\n\r\n const visibleContent =\r\n fittedContent.type === \"text\" || fittedContent.type === \"link\"\r\n ? fittedContent\r\n : currentItem.content;\r\n const remainingText = getBreakableContentText(\r\n currentItem.content,\r\n ).slice(getBreakableContentText(visibleContent).length);\r\n if (!remainingText) {\r\n currentItem = null;\r\n continue;\r\n }\r\n\r\n if (lines.length >= maxLines) {\r\n truncated = true;\r\n currentItem = null;\r\n break;\r\n }\r\n\r\n currentItem = {\r\n ...currentItem,\r\n content: setBreakableContentText(currentItem.content, remainingText),\r\n gapBefore: false,\r\n };\r\n continue;\r\n }\r\n\r\n const gapWidth =\r\n currentLine.items.length > 0 && currentItem.gapBefore ? CONTENT_GAP : 0;\r\n const remainingWidth = availableWidth - currentLine.width - gapWidth;\r\n\r\n if (remainingWidth <= 0) {\r\n if (lines.length + 1 >= maxLines) {\r\n truncated = true;\r\n currentItem = null;\r\n break;\r\n }\r\n if (currentLine.items.length > 0) {\r\n lines.push(currentLine);\r\n }\r\n currentLine = { items: [], width: 0 };\r\n currentItem = {\r\n ...currentItem,\r\n gapBefore: false,\r\n };\r\n continue;\r\n }\r\n\r\n const fullWidth = measureExpandedContentWidth(\r\n ctx,\r\n currentItem.content,\r\n theme,\r\n );\r\n if (!isBreakableContent(currentItem.content)) {\r\n if (fullWidth > remainingWidth && currentLine.items.length > 0) {\r\n if (lines.length + 1 >= maxLines) {\r\n truncated = true;\r\n currentItem = null;\r\n break;\r\n }\r\n lines.push(currentLine);\r\n currentLine = { items: [], width: 0 };\r\n currentItem = {\r\n ...currentItem,\r\n gapBefore: false,\r\n };\r\n continue;\r\n }\r\n\r\n currentLine.items.push({\r\n ...currentItem,\r\n width: fullWidth,\r\n });\r\n currentLine.width += gapWidth + fullWidth;\r\n currentItem = null;\r\n continue;\r\n }\r\n\r\n if (fullWidth <= remainingWidth) {\r\n currentLine.items.push({\r\n ...currentItem,\r\n width: fullWidth,\r\n });\r\n currentLine.width += gapWidth + fullWidth;\r\n currentItem = null;\r\n continue;\r\n }\r\n\r\n const fittedContent = truncateExpandedContent(\r\n ctx,\r\n currentItem.content,\r\n theme,\r\n remainingWidth,\r\n false,\r\n );\r\n if (!fittedContent) {\r\n if (lines.length + 1 >= maxLines) {\r\n truncated = true;\r\n currentItem = null;\r\n break;\r\n }\r\n if (currentLine.items.length > 0) {\r\n lines.push(currentLine);\r\n }\r\n currentLine = { items: [], width: 0 };\r\n currentItem = {\r\n ...currentItem,\r\n gapBefore: false,\r\n };\r\n continue;\r\n }\r\n\r\n currentLine.items.push({\r\n ...currentItem,\r\n content: fittedContent,\r\n width: measureExpandedContentWidth(ctx, fittedContent, theme),\r\n });\r\n currentLine.width +=\r\n gapWidth + measureExpandedContentWidth(ctx, fittedContent, theme);\r\n\r\n const visibleContent =\r\n fittedContent.type === \"text\" || fittedContent.type === \"link\"\r\n ? fittedContent\r\n : currentItem.content;\r\n const remainingText = getBreakableContentText(currentItem.content).slice(\r\n getBreakableContentText(visibleContent).length,\r\n );\r\n if (!remainingText) {\r\n currentItem = null;\r\n continue;\r\n }\r\n\r\n if (lines.length + 1 >= maxLines) {\r\n truncated = true;\r\n currentItem = null;\r\n break;\r\n }\r\n\r\n lines.push(currentLine);\r\n currentLine = { items: [], width: 0 };\r\n currentItem = {\r\n ...currentItem,\r\n content: setBreakableContentText(currentItem.content, remainingText),\r\n gapBefore: false,\r\n };\r\n }\r\n\r\n if (truncated) {\r\n break;\r\n }\r\n }\r\n\r\n if (currentLine.items.length > 0 && lines.length < maxLines) {\r\n lines.push(currentLine);\r\n }\r\n\r\n return {\r\n lines,\r\n truncated,\r\n };\r\n}\r\n\r\nfunction drawExpandedBodyContent<RecordType>(params: {\r\n ctx: CanvasRenderingContext2D;\r\n rect: DrawBodyCellContentsParams<RecordType>[\"rect\"];\r\n content: ListTableCellContent<RecordType>;\r\n contentIndex: number;\r\n cursorX: number;\r\n availableWidth?: number;\r\n rowIndex: number;\r\n column: DrawBodyCellContentsParams<RecordType>[\"column\"];\r\n theme: DrawBodyCellContentsParams<RecordType>[\"theme\"];\r\n frozen: boolean;\r\n hovered?: boolean;\r\n descriptors: DrawBodyCellContentsParams<RecordType>[\"descriptors\"];\r\n getNestedTableHighlight?: DrawBodyCellContentsParams<RecordType>[\"getNestedTableHighlight\"];\r\n getControlAnimationProgress?: DrawBodyCellContentsParams<RecordType>[\"getControlAnimationProgress\"];\r\n requestRender?: DrawBodyCellContentsParams<RecordType>[\"requestRender\"];\r\n skipNestedTableOuterBorders?: DrawBodyCellContentsParams<RecordType>[\"skipNestedTableOuterBorders\"];\r\n}) {\r\n const {\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n availableWidth,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n hovered,\r\n descriptors,\r\n getNestedTableHighlight,\r\n getControlAnimationProgress,\r\n requestRender,\r\n skipNestedTableOuterBorders,\r\n } = params;\r\n\r\n if (content.type === \"text\") {\r\n drawBodyTextContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"arrow\") {\r\n drawBodyArrowContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"link\") {\r\n drawBodyLinkContent({\r\n ctx,\r\n rect,\r\n content,\r\n hovered,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"image\") {\r\n drawBodyImageContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n requestRender,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"icon\") {\r\n drawBodyIconContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"barcode\") {\r\n drawBodyBarcodeContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"qrcode\") {\r\n drawBodyQrCodeContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"color\") {\r\n drawBodyColorContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"button\") {\r\n drawBodyButtonContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"progress\") {\r\n drawBodyProgressContent({\r\n ctx,\r\n rect,\r\n content,\r\n animationProgress: getControlAnimationProgress?.({\r\n rowIndex,\r\n columnKey: column.key,\r\n contentIndex,\r\n }),\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"chart\") {\r\n drawBodyChartContent({\r\n ctx,\r\n rect,\r\n content,\r\n animationProgress: getControlAnimationProgress?.({\r\n rowIndex,\r\n columnKey: column.key,\r\n contentIndex,\r\n }),\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"rate\") {\r\n drawBodyRateContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"tag\") {\r\n drawBodyTagContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"switch\") {\r\n drawBodySwitchContent({\r\n ctx,\r\n rect,\r\n content,\r\n animationProgress: getControlAnimationProgress?.({\r\n rowIndex,\r\n columnKey: column.key,\r\n contentIndex,\r\n }),\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"table\") {\r\n drawBodyNestedTableContent({\r\n ctx,\r\n rect,\r\n content,\r\n contentIndex,\r\n cursorX,\r\n availableWidth,\r\n rowIndex,\r\n column,\r\n theme,\r\n frozen,\r\n descriptors,\r\n highlight: getNestedTableHighlight?.({\r\n rowIndex,\r\n columnKey: column.key,\r\n contentIndex,\r\n }),\r\n skipOuterBorders: skipNestedTableOuterBorders,\r\n });\r\n return;\r\n }\r\n\r\n if (content.type === \"checkbox\" || content.type === \"radio\") {\r\n drawBodySelectionContent({\r\n ctx,\r\n rect,\r\n content,\r\n animationProgress: getControlAnimationProgress?.({\r\n rowIndex,\r\n columnKey: column.key,\r\n contentIndex,\r\n }),\r\n contentIndex,\r\n cursorX,\r\n rowIndex,\r\n column,\r\n frozen,\r\n descriptors,\r\n });\r\n }\r\n}\r\n\r\nfunction measureExpandedContentWidth<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableCellContent<RecordType>,\r\n theme: DrawBodyCellContentsParams<RecordType>[\"theme\"],\r\n) {\r\n if (content.type === \"text\") {\r\n return measureTextContentWidth(ctx, content, theme);\r\n }\r\n\r\n if (content.type === \"arrow\") {\r\n return measureArrowContentWidth(content);\r\n }\r\n\r\n if (content.type === \"link\") {\r\n return measureLinkContentWidth(ctx, content, theme);\r\n }\r\n\r\n if (content.type === \"image\") {\r\n return measureImageContentWidth(content);\r\n }\r\n\r\n if (content.type === \"icon\") {\r\n return measureIconContentWidth(content);\r\n }\r\n\r\n if (content.type === \"barcode\") {\r\n return measureBarcodeContentWidth(content);\r\n }\r\n\r\n if (content.type === \"qrcode\") {\r\n return measureQrCodeContentWidth(content);\r\n }\r\n\r\n if (content.type === \"color\") {\r\n return measureColorContentWidth(content);\r\n }\r\n\r\n if (content.type === \"button\") {\r\n return measureButtonContentWidth(ctx, content, theme);\r\n }\r\n\r\n if (content.type === \"progress\") {\r\n return measureProgressContentWidth(ctx, content, theme);\r\n }\r\n\r\n if (content.type === \"chart\") {\r\n return measureChartContentWidth(content);\r\n }\r\n\r\n if (content.type === \"rate\") {\r\n return measureRateContentWidth(ctx, content, theme);\r\n }\r\n\r\n if (content.type === \"tag\") {\r\n return measureTagContentWidth(ctx, content, theme);\r\n }\r\n\r\n if (content.type === \"switch\") {\r\n return measureSwitchContentWidth(ctx, content, theme);\r\n }\r\n\r\n if (content.type === \"table\") {\r\n return measureNestedTableContentWidth(content);\r\n }\r\n\r\n return measureSelectionContentWidth();\r\n}\r\n\r\nfunction getBodyCellContentsLineHeight<RecordType>(\r\n contents: ListTableCellContent<RecordType>[],\r\n theme: DrawBodyCellContentsParams<RecordType>[\"theme\"],\r\n) {\r\n let lineHeight = theme.fontSize + 8;\r\n contents.forEach((item) => {\r\n if (item.type === \"arrow\") {\r\n lineHeight = Math.max(lineHeight, measureArrowContentHeight(item));\r\n return;\r\n }\r\n if (item.type === \"tag\") {\r\n lineHeight = Math.max(\r\n lineHeight,\r\n Math.max(\r\n item.style?.fontSize ??\r\n item.fontSize ??\r\n Math.max(theme.fontSize - 1, 12),\r\n 12,\r\n ) + 10,\r\n item.height ?? 22,\r\n );\r\n return;\r\n }\r\n if (item.type === \"image\") {\r\n lineHeight = Math.max(lineHeight, measureImageContentHeight(item));\r\n return;\r\n }\r\n if (item.type === \"icon\") {\r\n lineHeight = Math.max(lineHeight, measureIconContentHeight(item));\r\n return;\r\n }\r\n if (item.type === \"barcode\") {\r\n lineHeight = Math.max(lineHeight, measureBarcodeContentHeight(item));\r\n return;\r\n }\r\n if (item.type === \"qrcode\") {\r\n lineHeight = Math.max(lineHeight, measureQrCodeContentHeight(item));\r\n return;\r\n }\r\n if (item.type === \"color\") {\r\n lineHeight = Math.max(lineHeight, measureColorContentHeight(item));\r\n return;\r\n }\r\n if (item.type === \"button\") {\r\n lineHeight = Math.max(lineHeight, measureButtonContentHeight(item));\r\n return;\r\n }\r\n if (item.type === \"progress\") {\r\n lineHeight = Math.max(\r\n lineHeight,\r\n measureProgressContentHeight(item, theme),\r\n );\r\n return;\r\n }\r\n if (item.type === \"chart\") {\r\n lineHeight = Math.max(lineHeight, measureChartContentHeight(item));\r\n return;\r\n }\r\n if (item.type === \"rate\") {\r\n lineHeight = Math.max(lineHeight, measureRateContentHeight(item, theme));\r\n return;\r\n }\r\n if (item.type === \"switch\") {\r\n lineHeight = Math.max(lineHeight, 22);\r\n return;\r\n }\r\n if (item.type === \"table\") {\r\n lineHeight = Math.max(lineHeight, measureNestedTableContentHeight(item));\r\n return;\r\n }\r\n if (item.type === \"checkbox\" || item.type === \"radio\") {\r\n lineHeight = Math.max(lineHeight, 16);\r\n return;\r\n }\r\n if (item.type === \"text\" || item.type === \"link\") {\r\n lineHeight = Math.max(\r\n lineHeight,\r\n (item.style?.fontSize ?? item.fontSize ?? theme.fontSize) + 8,\r\n );\r\n return;\r\n }\r\n });\r\n return lineHeight;\r\n}\r\n\r\nfunction truncateExpandedContent<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n content: ListTableCellContent<RecordType>,\r\n theme: DrawBodyCellContentsParams<RecordType>[\"theme\"],\r\n maxWidth: number,\r\n withEllipsis: boolean,\r\n) {\r\n if (content.type === \"text\" || content.type === \"link\") {\r\n const nextText = fitTextToWidth(\r\n getBreakableContentText(content),\r\n (next) =>\r\n measureExpandedContentWidth(\r\n ctx,\r\n setBreakableContentText(content, next),\r\n theme,\r\n ),\r\n maxWidth,\r\n withEllipsis,\r\n );\r\n return nextText ? setBreakableContentText(content, nextText) : null;\r\n }\r\n\r\n if (content.type === \"tag\") {\r\n const paddingInline = content.paddingInline ?? 8;\r\n const textWidth = Math.max(maxWidth - paddingInline * 2, 0);\r\n const nextText = fitTextToWidth(\r\n content.text,\r\n (next) =>\r\n measureExpandedContentWidth(ctx, { ...content, text: next }, theme),\r\n Math.max(textWidth + paddingInline * 2, 0),\r\n withEllipsis,\r\n );\r\n return nextText\r\n ? {\r\n ...content,\r\n text: nextText,\r\n }\r\n : null;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction fitTextToWidth(\r\n text: string,\r\n measure: (text: string) => number,\r\n maxWidth: number,\r\n withEllipsis: boolean,\r\n forceEllipsis = false,\r\n) {\r\n if (!text || maxWidth <= 0) {\r\n return \"\";\r\n }\r\n\r\n if (!withEllipsis && measure(text) <= maxWidth) {\r\n return text;\r\n }\r\n\r\n const ellipsis = withEllipsis ? \"...\" : \"\";\r\n const ellipsisWidth = withEllipsis ? measure(ellipsis) : 0;\r\n if (withEllipsis && ellipsisWidth > maxWidth) {\r\n return \"\";\r\n }\r\n\r\n let output = \"\";\r\n for (const char of text) {\r\n const next = `${output}${char}`;\r\n const measuredWidth = measure(withEllipsis ? `${next}${ellipsis}` : next);\r\n if (measuredWidth > maxWidth) {\r\n break;\r\n }\r\n output = next;\r\n }\r\n\r\n if (!output) {\r\n return withEllipsis ? ellipsis : \"\";\r\n }\r\n\r\n if (withEllipsis && (forceEllipsis || output.length < text.length)) {\r\n return `${output}${ellipsis}`;\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction applyTrailingEllipsis<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n line: BodyContentLine<RecordType>,\r\n theme: DrawBodyCellContentsParams<RecordType>[\"theme\"],\r\n availableWidth: number,\r\n) {\r\n for (let index = line.items.length - 1; index >= 0; index -= 1) {\r\n const item = line.items[index];\r\n if (!item || !isEllipsizableContent(item.content)) {\r\n continue;\r\n }\r\n\r\n const widthBefore = line.items\r\n .slice(0, index)\r\n .reduce((sum, current, currentIndex) => {\r\n const gapWidth =\r\n currentIndex > 0 && current.gapBefore ? CONTENT_GAP : 0;\r\n return sum + gapWidth + current.width;\r\n }, 0);\r\n const gapWidth = index > 0 && item.gapBefore ? CONTENT_GAP : 0;\r\n const nextContent = truncateExpandedContent(\r\n ctx,\r\n item.content,\r\n theme,\r\n availableWidth - widthBefore - gapWidth,\r\n true,\r\n );\r\n if (!nextContent) {\r\n continue;\r\n }\r\n\r\n const forcedContent =\r\n nextContent.type === \"text\" || nextContent.type === \"link\"\r\n ? setBreakableContentText(\r\n nextContent,\r\n fitTextToWidth(\r\n getBreakableContentText(nextContent),\r\n (text) =>\r\n measureExpandedContentWidth(\r\n ctx,\r\n setBreakableContentText(nextContent, text),\r\n theme,\r\n ),\r\n availableWidth - widthBefore - gapWidth,\r\n true,\r\n true,\r\n ),\r\n )\r\n : nextContent.type === \"tag\"\r\n ? {\r\n ...nextContent,\r\n text: fitTextToWidth(\r\n item.content.type === \"tag\"\r\n ? item.content.text\r\n : nextContent.text,\r\n (text) =>\r\n measureExpandedContentWidth(\r\n ctx,\r\n { ...nextContent, text },\r\n theme,\r\n ),\r\n availableWidth - widthBefore - gapWidth,\r\n true,\r\n true,\r\n ),\r\n }\r\n : nextContent;\r\n\r\n const nextWidth = measureExpandedContentWidth(ctx, forcedContent, theme);\r\n line.items = line.items.slice(0, index + 1);\r\n line.items[index] = {\r\n ...item,\r\n content: forcedContent,\r\n width: nextWidth,\r\n };\r\n line.width = widthBefore + gapWidth + nextWidth;\r\n return;\r\n }\r\n}\r\n\r\nfunction isBreakableContent<RecordType>(\r\n content: ListTableCellContent<RecordType>,\r\n): content is\r\n | ListTableTextCellContent<RecordType>\r\n | ListTableLinkCellContent<RecordType> {\r\n return (\r\n (content.type === \"text\" || content.type === \"link\") &&\r\n content.style?.display !== \"inline-block\"\r\n );\r\n}\r\n\r\nfunction isEllipsizableContent<RecordType>(\r\n content: ListTableCellContent<RecordType>,\r\n) {\r\n return (\r\n content.type === \"text\" || content.type === \"link\" || content.type === \"tag\"\r\n );\r\n}\r\n\r\nfunction getBreakableContentText<RecordType>(\r\n content:\r\n | ListTableTextCellContent<RecordType>\r\n | ListTableLinkCellContent<RecordType>,\r\n) {\r\n return content.text;\r\n}\r\n\r\nfunction setBreakableContentText<RecordType>(\r\n content:\r\n | ListTableTextCellContent<RecordType>\r\n | ListTableLinkCellContent<RecordType>,\r\n text: string,\r\n) {\r\n return {\r\n ...content,\r\n text,\r\n };\r\n}\r\n\r\nfunction buildBodyContentsPlainText<RecordType>(\r\n contents: ListTableCellContent<RecordType>[],\r\n) {\r\n return contents\r\n .map((content) => {\r\n if (content.type === \"arrow\") {\r\n return content.direction === \"up\" ? \"↑\" : \"↓\";\r\n }\r\n if (content.type === \"icon\") {\r\n return content.icon;\r\n }\r\n if (\r\n content.type === \"text\" ||\r\n content.type === \"link\" ||\r\n content.type === \"tag\"\r\n ) {\r\n return content.text;\r\n }\r\n if (content.type === \"money\") {\r\n return formatMoneyValue(content.value, content);\r\n }\r\n if (content.type === \"progress\") {\r\n return (\r\n content.text ?? `${Math.round(resolveProgressPercent(content))}%`\r\n );\r\n }\r\n if (content.type === \"chart\") {\r\n return resolveChartContentPlainText(content);\r\n }\r\n if (content.type === \"button\") {\r\n return content.text;\r\n }\r\n if (content.type === \"qrcode\") {\r\n return content.value;\r\n }\r\n if (content.type === \"barcode\") {\r\n return content.text ?? content.value;\r\n }\r\n if (content.type === \"color\") {\r\n return content.value;\r\n }\r\n if (content.type === \"rate\") {\r\n return resolveRateText(content);\r\n }\r\n if (content.type === \"image\") {\r\n return content.alt ?? content.src;\r\n }\r\n if (content.type === \"switch\") {\r\n return content.checked\r\n ? (content.checkedChildren ?? \"\")\r\n : (content.uncheckedChildren ?? \"\");\r\n }\r\n if (content.type === \"table\") {\r\n return content.dataSource\r\n .map((record) =>\r\n content.columns\r\n .map((column) =>\r\n String(getValueByDataIndex(record, column.dataIndex) ?? \"\"),\r\n )\r\n .join(\" \"),\r\n )\r\n .join(\" \");\r\n }\r\n if (content.type === \"checkbox\" || content.type === \"radio\") {\r\n return content.label ?? \"\";\r\n }\r\n return \"\";\r\n })\r\n .filter(Boolean)\r\n .join(\" \");\r\n}\r\n\r\nfunction resolveProgressPercent<RecordType>(\r\n content: ListTableProgressCellContent<RecordType>,\r\n) {\r\n const min = content.min ?? 0;\r\n const max = content.max ?? 100;\r\n const range = max - min;\r\n if (range <= 0) {\r\n return 0;\r\n }\r\n return Math.min(Math.max(((content.value - min) / range) * 100, 0), 100);\r\n}\r\n\r\nfunction resolveRateText<RecordType>(\r\n content: ListTableRateCellContent<RecordType>,\r\n) {\r\n return content.text ?? String(content.value);\r\n}\r\n\r\nfunction resolveDefaultChartContent<RecordType>(\r\n value: unknown,\r\n): ListTableChartCellContent<RecordType> | null {\r\n if (\r\n value &&\r\n typeof value === \"object\" &&\r\n \"chartType\" in value &&\r\n typeof value.chartType === \"string\" &&\r\n \"option\" in value\r\n ) {\r\n const chartValue = value as ListTableChartCellContent<RecordType>;\r\n return {\r\n key: chartValue.key,\r\n style: chartValue.style,\r\n cursor: chartValue.cursor,\r\n onClick: chartValue.onClick,\r\n type: \"chart\",\r\n chartType: chartValue.chartType,\r\n option: chartValue.option,\r\n size: chartValue.size,\r\n values: \"values\" in chartValue ? chartValue.values : undefined,\r\n min: \"min\" in chartValue ? chartValue.min : undefined,\r\n max: \"max\" in chartValue ? chartValue.max : undefined,\r\n color: \"color\" in chartValue ? chartValue.color : undefined,\r\n lineWidth: \"lineWidth\" in chartValue ? chartValue.lineWidth : undefined,\r\n areaColor: \"areaColor\" in chartValue ? chartValue.areaColor : undefined,\r\n pointColor:\r\n \"pointColor\" in chartValue ? chartValue.pointColor : undefined,\r\n pointRadius:\r\n \"pointRadius\" in chartValue ? chartValue.pointRadius : undefined,\r\n padding: \"padding\" in chartValue ? chartValue.padding : undefined,\r\n smooth: \"smooth\" in chartValue ? chartValue.smooth : undefined,\r\n };\r\n }\r\n\r\n const values = resolveNumericSeriesValues(value);\r\n if (values.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n type: \"chart\",\r\n chartType: \"sparkline\",\r\n option: {\r\n series: {\r\n type: \"line\",\r\n data: values,\r\n },\r\n },\r\n };\r\n}\r\n\r\nfunction resolveNumericSeriesValues(value: unknown) {\r\n return Array.isArray(value)\r\n ? value\r\n .map((item) => (typeof item === \"number\" ? item : Number(item)))\r\n .filter((item) => Number.isFinite(item))\r\n : [];\r\n}\r\n\r\nfunction resolveContentTop(\r\n rect: DrawBodyCellContentsParams<never>[\"rect\"],\r\n blockHeight: number,\r\n paddingBlock: number,\r\n verticalAlign?: \"top\" | \"middle\" | \"bottom\",\r\n) {\r\n if (verticalAlign === \"top\") {\r\n return rect.y + paddingBlock;\r\n }\r\n\r\n if (verticalAlign === \"bottom\") {\r\n return rect.y + rect.height - paddingBlock - blockHeight;\r\n }\r\n\r\n return rect.y + (rect.height - blockHeight) / 2;\r\n}\r\n\r\nfunction resolveLineStartX(\r\n rect: DrawBodyCellContentsParams<never>[\"rect\"],\r\n lineWidth: number,\r\n align: DrawBodyCellContentsParams<never>[\"column\"][\"align\"],\r\n) {\r\n if (align === \"center\") {\r\n return rect.x + (rect.width - lineWidth) / 2;\r\n }\r\n\r\n if (align === \"right\") {\r\n return rect.x + rect.width - lineWidth;\r\n }\r\n\r\n return rect.x;\r\n}\r\n\r\nexport function resolveStickyLineStartX(params: {\r\n rect: DrawBodyCellContentsParams<never>[\"rect\"];\r\n visibleRect: DrawBodyCellContentsParams<never>[\"rect\"];\r\n lineWidth: number;\r\n align: DrawBodyCellContentsParams<never>[\"column\"][\"align\"];\r\n}) {\r\n const { rect, visibleRect, lineWidth, align } = params;\r\n const preferredX = resolveLineStartX(rect, lineWidth, align);\r\n\r\n const minX = visibleRect.x;\r\n const maxX = visibleRect.x + Math.max(visibleRect.width - lineWidth, 0);\r\n\r\n return clamp(preferredX, minX, maxX);\r\n}\r\n\r\nfunction intersectRects(\r\n left: DrawBodyCellContentsParams<never>[\"rect\"],\r\n right: DrawBodyCellContentsParams<never>[\"rect\"],\r\n) {\r\n const x = Math.max(left.x, right.x);\r\n const y = Math.max(left.y, right.y);\r\n const maxX = Math.min(left.x + left.width, right.x + right.width);\r\n const maxY = Math.min(left.y + left.height, right.y + right.height);\r\n\r\n if (maxX <= x || maxY <= y) {\r\n return null;\r\n }\r\n\r\n return {\r\n x,\r\n y,\r\n width: maxX - x,\r\n height: maxY - y,\r\n };\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number) {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nexport { drawSelectionControl } from \"./draw-selection-content\";\r\n","import { getValueByDataIndex } from \"../domain/data/get-value-by-data-index\";\r\nimport type {\r\n DebugHitTestResult,\r\n Rect,\r\n} from \"../debug/debug-snapshot\";\r\nimport type { InternalLeafColumn } from \"../domain/columns/types\";\r\nimport type {\r\n ListTableButtonCellContent,\r\n ListTableCellContent,\r\n ListTableCellContentClickContext,\r\n} from \"../schema/column\";\r\nimport { resolveBodyCellContents } from \"../rendering/cell-content/cell-content-renderer\";\r\nimport type { ListTableDangerConfirmRequest } from \"../ui/types\";\r\n\r\n/**\r\n * 触发表体单元格内容点击回调。\r\n */\r\nexport function emitBodyCellContentClick<RecordType>(params: {\r\n result: DebugHitTestResult;\r\n event: MouseEvent;\r\n rows: RecordType[];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n onPreview?: (content: ListTableCellContent<RecordType>) => void;\r\n dangerConfirmAnchorRect?: Rect;\r\n onDangerConfirm?: (request: ListTableDangerConfirmRequest) => void;\r\n}) {\r\n const { result, event, rows, leafColumns } = params;\r\n if (typeof result.rowIndex !== \"number\" || !result.columnKey) {\r\n return false;\r\n }\r\n\r\n const record = rows[result.rowIndex];\r\n const column = leafColumns.find((item) => item.key === result.columnKey);\r\n if (!record || !column) {\r\n return false;\r\n }\r\n\r\n const contents = resolveBodyCellContents({\r\n record,\r\n rowIndex: result.rowIndex,\r\n column,\r\n });\r\n const contentIndex = resolveBodyContentIndex(result, contents);\r\n if (typeof contentIndex !== \"number\") {\r\n return false;\r\n }\r\n\r\n const content = contents[contentIndex];\r\n if (!content || isCellContentDisabled(content)) {\r\n return false;\r\n }\r\n\r\n const context: ListTableCellContentClickContext<RecordType> = {\r\n record,\r\n rowIndex: result.rowIndex,\r\n column,\r\n value: getValueByDataIndex(record, column.dataIndex),\r\n contentIndex,\r\n nativeEvent: event,\r\n };\r\n if (shouldRequestDangerConfirm(content)) {\r\n requestDangerButtonConfirm({\r\n anchorRect:\r\n params.dangerConfirmAnchorRect ?? resolveEventAnchorRect(event),\r\n content,\r\n onConfirm: () => {\r\n emitResolvedBodyCellContentClick({\r\n content,\r\n context,\r\n onPreview: params.onPreview,\r\n });\r\n },\r\n onDangerConfirm: params.onDangerConfirm,\r\n });\r\n return true;\r\n }\r\n\r\n return emitResolvedBodyCellContentClick({\r\n content,\r\n context,\r\n onPreview: params.onPreview,\r\n });\r\n}\r\n\r\nfunction emitResolvedBodyCellContentClick<RecordType>(params: {\r\n content: ListTableCellContent<RecordType>;\r\n context: ListTableCellContentClickContext<RecordType>;\r\n onPreview?: (content: ListTableCellContent<RecordType>) => void;\r\n}) {\r\n const { content, context } = params;\r\n if (content.type === \"link\" && content.href) {\r\n globalThis.open?.(content.href, content.target ?? \"_blank\");\r\n }\r\n content.onClick?.(context);\r\n if (isPreviewableContent(content) && content.preview !== false) {\r\n params.onPreview?.(content);\r\n }\r\n return (\r\n content.type === \"link\" ||\r\n typeof content.onClick === \"function\" ||\r\n (isPreviewableContent(content) && content.preview !== false)\r\n );\r\n}\r\n\r\nfunction shouldRequestDangerConfirm<RecordType>(\r\n content: ListTableCellContent<RecordType>,\r\n): content is ListTableButtonCellContent<RecordType> {\r\n return (\r\n content.type === \"button\" &&\r\n content.danger === true &&\r\n typeof content.onClick === \"function\"\r\n );\r\n}\r\n\r\nfunction requestDangerButtonConfirm<RecordType>(params: {\r\n anchorRect: Rect;\r\n content: ListTableButtonCellContent<RecordType>;\r\n onConfirm: () => void;\r\n onDangerConfirm?: (request: ListTableDangerConfirmRequest) => void;\r\n}) {\r\n const { anchorRect, content, onConfirm, onDangerConfirm } = params;\r\n const confirmConfig = resolveDangerButtonConfirmConfig(content);\r\n const request: ListTableDangerConfirmRequest = {\r\n anchorRect,\r\n ...confirmConfig,\r\n onConfirm,\r\n onCancel: () => undefined,\r\n };\r\n\r\n if (onDangerConfirm) {\r\n onDangerConfirm(request);\r\n return;\r\n }\r\n\r\n if (typeof globalThis.confirm === \"function\") {\r\n if (globalThis.confirm(confirmConfig.title)) {\r\n onConfirm();\r\n }\r\n return;\r\n }\r\n\r\n request.onCancel();\r\n}\r\n\r\nfunction resolveDangerButtonConfirmConfig<RecordType>(\r\n content: ListTableButtonCellContent<RecordType>,\r\n) {\r\n return {\r\n title: content.popconfirm?.title ?? \"确认执行该操作吗?\",\r\n description: content.popconfirm?.description,\r\n okText: content.popconfirm?.okText ?? \"确定\",\r\n cancelText: content.popconfirm?.cancelText ?? \"取消\",\r\n };\r\n}\r\n\r\nfunction resolveEventAnchorRect(event: MouseEvent): Rect {\r\n return {\r\n x: event.clientX,\r\n y: event.clientY,\r\n width: 0,\r\n height: 0,\r\n };\r\n}\r\n\r\n/**\r\n * 解析命中位置对应的结构化单元格内容。\r\n */\r\nexport function resolveHitCellContent<RecordType>(params: {\r\n result: DebugHitTestResult;\r\n rows: RecordType[];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n}) {\r\n const { result, rows, leafColumns } = params;\r\n if (typeof result.rowIndex !== \"number\" || !result.columnKey) return null;\r\n const record = rows[result.rowIndex];\r\n const column = leafColumns.find((item) => item.key === result.columnKey);\r\n if (!record || !column) return null;\r\n const contents = resolveBodyCellContents({\r\n record,\r\n rowIndex: result.rowIndex,\r\n column,\r\n });\r\n const contentIndex = resolveBodyContentIndex(result, contents);\r\n return typeof contentIndex === \"number\"\r\n ? (contents[contentIndex] ?? null)\r\n : null;\r\n}\r\n\r\nfunction isPreviewableContent<RecordType>(\r\n content: ListTableCellContent<RecordType>,\r\n): content is Extract<\r\n ListTableCellContent<RecordType>,\r\n { type: \"image\" | \"qrcode\" | \"barcode\" | \"chart\" }\r\n> {\r\n return (\r\n content.type === \"image\" ||\r\n content.type === \"qrcode\" ||\r\n content.type === \"barcode\" ||\r\n content.type === \"chart\"\r\n );\r\n}\r\n\r\n/**\r\n * 补齐表体内容命中的内容索引。\r\n */\r\nexport function hydrateBodyContentHitResult<RecordType>(params: {\r\n result: DebugHitTestResult;\r\n rows: RecordType[];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n}) {\r\n const { result, rows, leafColumns } = params;\r\n if (\r\n typeof result.rowIndex !== \"number\" ||\r\n !result.columnKey ||\r\n typeof result.contentIndex === \"number\" ||\r\n (result.area !== \"body-control\" && result.area !== \"body-content\")\r\n ) {\r\n return result;\r\n }\r\n\r\n const record = rows[result.rowIndex];\r\n const column = leafColumns.find((item) => item.key === result.columnKey);\r\n if (!record || !column) {\r\n return result;\r\n }\r\n\r\n const contents = resolveBodyCellContents({\r\n record,\r\n rowIndex: result.rowIndex,\r\n column,\r\n });\r\n const contentIndex = resolveBodyContentIndex(result, contents);\r\n if (typeof contentIndex !== \"number\") {\r\n return result;\r\n }\r\n\r\n const matchedContent = contents[contentIndex];\r\n return {\r\n ...result,\r\n contentIndex,\r\n contentKey: result.contentKey ?? matchedContent?.key,\r\n cursor:\r\n result.cursor ??\r\n (isCellContentDisabled(matchedContent)\r\n ? \"not-allowed\"\r\n : (matchedContent?.cursor ??\r\n (matchedContent?.type === \"link\" || matchedContent?.onClick\r\n ? \"pointer\"\r\n : undefined))),\r\n };\r\n}\r\n\r\n/**\r\n * 判断单元格内容是否处于禁用态。\r\n */\r\nfunction isCellContentDisabled<RecordType>(\r\n content: ListTableCellContent<RecordType> | undefined,\r\n) {\r\n if (!content) {\r\n return false;\r\n }\r\n\r\n if (content.type === \"arrow\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"icon\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"text\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"image\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"qrcode\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"barcode\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"color\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"button\") {\r\n return content.disabled === true;\r\n }\r\n\r\n if (content.type === \"progress\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"chart\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"rate\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"tag\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"money\") {\r\n return false;\r\n }\r\n\r\n if (content.type === \"table\") {\r\n return false;\r\n }\r\n\r\n return content.disabled === true;\r\n}\r\n\r\nfunction resolveBodyContentIndex<RecordType>(\r\n result: DebugHitTestResult,\r\n contents: ListTableCellContent<RecordType>[],\r\n) {\r\n if (typeof result.contentIndex === \"number\") {\r\n return result.contentIndex;\r\n }\r\n\r\n if (result.area === \"body-control\" && result.controlType) {\r\n const matchedIndex = contents.findIndex(\r\n (content) =>\r\n content.type !== \"text\" && content.type === result.controlType,\r\n );\r\n return matchedIndex >= 0 ? matchedIndex : undefined;\r\n }\r\n\r\n if (result.contentKey) {\r\n const matchedIndex = contents.findIndex(\r\n (content) => content.key === result.contentKey,\r\n );\r\n return matchedIndex >= 0 ? matchedIndex : undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n","export function clamp(value: number, min: number, max: number) {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nexport function isPointInRect(\r\n x: number,\r\n y: number,\r\n rect: { x: number; y: number; width: number; height: number },\r\n) {\r\n return (\r\n x >= rect.x &&\r\n x <= rect.x + rect.width &&\r\n y >= rect.y &&\r\n y <= rect.y + rect.height\r\n );\r\n}\r\n","import type { DebugHitTestResult } from \"../../debug/debug-snapshot\";\r\nimport type { AxisScrollbarLayout } from \"./scrollbar-types\";\r\nimport { isPointInRect } from \"./geometry\";\r\n\r\nexport function isPointInScrollbar(\r\n x: number,\r\n y: number,\r\n scrollbar: AxisScrollbarLayout,\r\n) {\r\n return (\r\n isPointInRect(x, y, scrollbar.decreaseButton) ||\r\n isPointInRect(x, y, scrollbar.increaseButton) ||\r\n isPointInRect(x, y, scrollbar.track) ||\r\n isPointInRect(x, y, scrollbar.thumb)\r\n );\r\n}\r\n\r\nexport function resolveScrollbarRole(\r\n x: number,\r\n y: number,\r\n scrollbar: AxisScrollbarLayout,\r\n): DebugHitTestResult[\"scrollbarRole\"] {\r\n if (isPointInRect(x, y, scrollbar.thumb)) {\r\n return \"thumb\";\r\n }\r\n\r\n if (isPointInRect(x, y, scrollbar.decreaseButton)) {\r\n return \"decrease-button\";\r\n }\r\n\r\n if (isPointInRect(x, y, scrollbar.increaseButton)) {\r\n return \"increase-button\";\r\n }\r\n\r\n if (isPointInRect(x, y, scrollbar.track)) {\r\n return \"track\";\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n","import type { DebugHitTestResult } from \"../debug/debug-snapshot\";\r\nimport type { ScrollbarLayout } from \"../domain/layout/scrollbar-types\";\r\nimport type { ListTableOptions } from \"../schema/table-options\";\r\nimport type { HoverState } from \"../schema/state\";\r\nimport { isPointInScrollbar, resolveScrollbarRole } from \"../domain/layout/scrollbar\";\r\n\r\n/**\r\n * 基于滚动条布局补全命中结果。\r\n */\r\nexport function resolvePointerHitWithScrollbars(\r\n result: DebugHitTestResult,\r\n x: number,\r\n y: number,\r\n scrollbarLayout: ScrollbarLayout,\r\n): DebugHitTestResult {\r\n if (result.area !== \"empty\") {\r\n return result;\r\n }\r\n\r\n const horizontalScrollbar = scrollbarLayout.horizontal;\r\n if (horizontalScrollbar && isPointInScrollbar(x, y, horizontalScrollbar)) {\r\n return {\r\n area: \"horizontal-scrollbar\",\r\n columnKey: \"__horizontal_scrollbar__\",\r\n scrollbarRole: resolveScrollbarRole(x, y, horizontalScrollbar),\r\n };\r\n }\r\n\r\n const verticalScrollbar = scrollbarLayout.vertical;\r\n if (verticalScrollbar && isPointInScrollbar(x, y, verticalScrollbar)) {\r\n return {\r\n area: \"vertical-scrollbar\",\r\n columnKey: \"__vertical_scrollbar__\",\r\n scrollbarRole: resolveScrollbarRole(x, y, verticalScrollbar),\r\n };\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 判断滚动条当前是否可见。\r\n */\r\nexport function resolveScrollbarVisibility<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n draggingScrollbar: boolean;\r\n continuousScrollActive: boolean;\r\n hover: HoverState;\r\n scrollbarActiveUntil: number;\r\n now: number;\r\n}) {\r\n const { options, draggingScrollbar, continuousScrollActive, hover, scrollbarActiveUntil, now } = params;\r\n const scrollbarOption = options.scrollbar;\r\n\r\n if (scrollbarOption?.visible === true) {\r\n return true;\r\n }\r\n if (scrollbarOption?.visible === false) {\r\n return false;\r\n }\r\n\r\n return (\r\n draggingScrollbar ||\r\n continuousScrollActive ||\r\n hover.area === \"horizontal-scrollbar\" ||\r\n hover.area === \"vertical-scrollbar\" ||\r\n hover.area !== \"empty\" ||\r\n now < scrollbarActiveUntil\r\n );\r\n}\r\n\r\n","import type {\r\n DebugHitTestResult,\r\n RenderCellDescriptor,\r\n} from \"../debug/debug-snapshot\";\r\nimport {\r\n hitTest,\r\n resolveMergedCellHitRowIndex,\r\n} from \"../interaction/hit-test\";\r\nimport type { InternalLeafColumn } from \"../domain/columns/types\";\r\nimport type { ScrollbarLayout } from \"../domain/layout/scrollbar-types\";\r\nimport { hydrateBodyContentHitResult } from \"./cell-content-action-service\";\r\nimport { resolvePointerHitWithScrollbars } from \"./scrollbar-service\";\r\n\r\nexport interface ResolveListTablePointerHitOptions {\r\n excludeKinds?: RenderCellDescriptor[\"kind\"][];\r\n}\r\n\r\nexport interface ResolveListTablePointerHitResult {\r\n result: DebugHitTestResult;\r\n hitScrollbar: boolean;\r\n}\r\n\r\n/**\r\n * 解析列表表格指针命中结果。\r\n */\r\nexport function resolveListTablePointerHit<RecordType>(params: {\r\n x: number;\r\n y: number;\r\n descriptors: RenderCellDescriptor[];\r\n rows: RecordType[];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n scrollbarLayout: ScrollbarLayout;\r\n scrollbarVisible: boolean;\r\n options?: ResolveListTablePointerHitOptions;\r\n}): ResolveListTablePointerHitResult {\r\n const {\r\n x,\r\n y,\r\n descriptors,\r\n rows,\r\n leafColumns,\r\n scrollbarLayout,\r\n scrollbarVisible,\r\n options,\r\n } = params;\r\n const filteredDescriptors = options?.excludeKinds?.length\r\n ? descriptors.filter(\r\n (descriptor) => !options.excludeKinds?.includes(descriptor.kind),\r\n )\r\n : descriptors;\r\n const nextResult = resolvePointerHitWithScrollbars(\r\n hitTest(x, y, filteredDescriptors),\r\n x,\r\n y,\r\n scrollbarVisible ? scrollbarLayout : {},\r\n );\r\n const hydratedResult = hydrateBodyContentHitResult({\r\n result: nextResult,\r\n rows,\r\n leafColumns,\r\n });\r\n const hitRowIndex = resolveMergedCellHitRowIndex({\r\n result: hydratedResult,\r\n x,\r\n y,\r\n descriptors: filteredDescriptors,\r\n });\r\n const result =\r\n typeof hitRowIndex === \"number\"\r\n ? { ...hydratedResult, hitRowIndex }\r\n : hydratedResult;\r\n\r\n return {\r\n result,\r\n hitScrollbar:\r\n result.area === \"horizontal-scrollbar\" ||\r\n result.area === \"vertical-scrollbar\",\r\n };\r\n}\r\n\r\n","import type { ListTableQueryRuntimeState } from \"../../services/query-service\";\r\nimport type { ListTableRuntimeState } from \"./state\";\r\n\r\n/**\r\n * 获取 query 运行时状态。\r\n */\r\nexport function selectListTableQueryState<RecordType>(\r\n state: ListTableRuntimeState<RecordType>,\r\n): ListTableQueryRuntimeState {\r\n return {\r\n sortState: state.query.sortState,\r\n filterState: state.query.filterState,\r\n pagination: state.query.pagination,\r\n };\r\n}\r\n\r\n/**\r\n * 获取当前滚动状态。\r\n */\r\nexport function selectListTableScrollState<RecordType>(\r\n state: ListTableRuntimeState<RecordType>,\r\n) {\r\n return state.interactive.scroll;\r\n}\r\n\r\n/**\r\n * 获取当前 hover 状态。\r\n */\r\nexport function selectListTableHoverState<RecordType>(\r\n state: ListTableRuntimeState<RecordType>,\r\n) {\r\n return state.interactive.hover;\r\n}\r\n\r\n/**\r\n * 获取当前选择状态。\r\n */\r\nexport function selectListTableSelectionState<RecordType>(\r\n state: ListTableRuntimeState<RecordType>,\r\n) {\r\n return state.interactive.selection;\r\n}\r\n\r\n/**\r\n * 获取当前区间高亮状态。\r\n */\r\nexport function selectListTableRangeHighlightState<RecordType>(\r\n state: ListTableRuntimeState<RecordType>,\r\n) {\r\n return state.interactive.rangeHighlight;\r\n}\r\n\r\n/**\r\n * 获取当前展开行键集合。\r\n */\r\nexport function selectExpandedRowKeys<RecordType>(\r\n state: ListTableRuntimeState<RecordType>,\r\n) {\r\n return state.expandedRowKeys;\r\n}\r\n","import type { Rect } from \"../../debug/debug-snapshot\";\r\n\r\n/**\r\n * 将布局矩形按内容缩放转换到宿主本地坐标。\r\n */\r\nexport function scaleRectByZoom(rect: Rect, zoom: number): Rect {\r\n const safeZoom = zoom > 0 ? zoom : 1;\r\n return {\r\n x: rect.x * safeZoom,\r\n y: rect.y * safeZoom,\r\n width: rect.width * safeZoom,\r\n height: rect.height * safeZoom,\r\n };\r\n}\r\n","import type { HeaderTreeNode } from \"./types\";\r\nimport { clamp } from \"../layout/geometry\";\r\n\r\ninterface HeaderNodeBounds {\r\n left: number;\r\n right: number;\r\n}\r\n\r\ninterface HeaderReorderTarget {\r\n targetSiblingIndex: number;\r\n targetColumnKey: string | null;\r\n targetLeafIndex: number;\r\n targetIndicatorX: number;\r\n}\r\n\r\n\r\n/**\r\n * 基于同级表头节点解析拖拽插入位置。\r\n */\r\nexport function resolveHeaderReorderTarget<RecordType>(\r\n pointerX: number,\r\n siblings: HeaderTreeNode<RecordType>[],\r\n getBounds: (columnKey: string) => HeaderNodeBounds | null,\r\n): HeaderReorderTarget | null {\r\n if (siblings.length === 0) {\r\n return null;\r\n }\r\n\r\n let targetSiblingIndex = siblings.length;\r\n const firstBounds = getBounds(siblings[0].key);\r\n const lastSibling = siblings[siblings.length - 1];\r\n const lastBounds = lastSibling ? getBounds(lastSibling.key) : null;\r\n\r\n if (firstBounds && pointerX <= firstBounds.left) {\r\n targetSiblingIndex = 0;\r\n } else if (lastBounds && pointerX >= lastBounds.right) {\r\n targetSiblingIndex = siblings.length;\r\n } else {\r\n for (let index = 0; index < siblings.length; index += 1) {\r\n const bounds = getBounds(siblings[index].key);\r\n if (!bounds) {\r\n continue;\r\n }\r\n if (pointerX >= bounds.left && pointerX <= bounds.right) {\r\n const leftRange = pointerX - bounds.left;\r\n const rightRange = bounds.right - pointerX;\r\n targetSiblingIndex = leftRange > rightRange ? index + 1 : index;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n targetSiblingIndex = clamp(targetSiblingIndex, 0, siblings.length);\r\n const targetIndicatorX = resolveTargetIndicatorX(\r\n siblings,\r\n targetSiblingIndex,\r\n getBounds,\r\n );\r\n if (targetIndicatorX == null) {\r\n return null;\r\n }\r\n\r\n return {\r\n targetSiblingIndex,\r\n targetColumnKey: siblings[targetSiblingIndex]?.key ?? null,\r\n targetLeafIndex:\r\n targetSiblingIndex < siblings.length\r\n ? siblings[targetSiblingIndex]?.leafStartIndex ?? 0\r\n : (siblings[siblings.length - 1]?.leafEndIndex ?? 0) + 1,\r\n targetIndicatorX,\r\n };\r\n}\r\n\r\nfunction resolveTargetIndicatorX<RecordType>(\r\n siblings: HeaderTreeNode<RecordType>[],\r\n targetSiblingIndex: number,\r\n getBounds: (columnKey: string) => HeaderNodeBounds | null,\r\n) {\r\n if (targetSiblingIndex <= 0) {\r\n return getBounds(siblings[0].key)?.left ?? null;\r\n }\r\n\r\n if (targetSiblingIndex >= siblings.length) {\r\n return getBounds(siblings[siblings.length - 1].key)?.right ?? null;\r\n }\r\n\r\n return (\r\n getBounds(siblings[targetSiblingIndex].key)?.left ??\r\n getBounds(siblings[targetSiblingIndex - 1].key)?.right ??\r\n null\r\n );\r\n}\r\n\r\n/**\r\n * 生成表头拖拽提示文案。\r\n */\r\nexport function getHeaderReorderTooltipText<RecordType>(params: {\r\n siblings: HeaderTreeNode<RecordType>[];\r\n targetSiblingIndex: number;\r\n currentX: number;\r\n getBounds: (columnKey: string) => HeaderNodeBounds | null;\r\n}) {\r\n const { siblings, targetSiblingIndex, currentX, getBounds } = params;\r\n if (siblings.length === 0) {\r\n return null;\r\n }\r\n\r\n if (targetSiblingIndex <= 0) {\r\n return `移动到 ${siblings[0].title} 前`;\r\n }\r\n\r\n if (targetSiblingIndex >= siblings.length) {\r\n return `移动到 ${siblings[siblings.length - 1].title} 后`;\r\n }\r\n\r\n const previousSibling = siblings[targetSiblingIndex - 1];\r\n const nextSibling = siblings[targetSiblingIndex];\r\n const previousBounds = previousSibling ? getBounds(previousSibling.key) : null;\r\n const nextBounds = nextSibling ? getBounds(nextSibling.key) : null;\r\n\r\n if (previousBounds && nextBounds) {\r\n const gapCenter = (previousBounds.right + nextBounds.left) / 2;\r\n return currentX > gapCenter\r\n ? `移动到 ${previousSibling.title} 后`\r\n : `移动到 ${nextSibling.title} 前`;\r\n }\r\n\r\n return `移动到 ${nextSibling.title} 前`;\r\n}\r\n\r\n\r\ninterface HeaderReorderDragState {\r\n sourceSiblingIndex: number;\r\n targetSiblingIndex: number;\r\n}\r\n\r\n/**\r\n * 判断当前拖拽是否会产生有效重排。\r\n */\r\nexport function shouldCommitHeaderReorder(\r\n dragState: HeaderReorderDragState,\r\n) {\r\n return !(\r\n dragState.targetSiblingIndex === dragState.sourceSiblingIndex ||\r\n dragState.targetSiblingIndex === dragState.sourceSiblingIndex + 1\r\n );\r\n}\r\n","import type { Rect } from \"../../debug/debug-snapshot\";\r\nimport type {\r\n HeaderTreeNode,\r\n InternalLeafColumn,\r\n NormalizedColumn,\r\n} from \"../../domain/columns/types\";\r\nimport { ensureColumnKeysInPlace } from \"../../domain/columns/column-key\";\r\nimport type { HeaderCellLayout } from \"../../domain/columns/header-layout-types\";\nimport {\r\n getHeaderReorderTooltipText,\r\n resolveHeaderReorderTarget,\r\n} from \"../../domain/columns/header-reorder\";\r\nimport type {\r\n DraggingReorderState,\r\n SwapAnimationState,\r\n} from \"../../domain/types\";\r\nimport type { ColumnSegments } from \"../../domain/columns/column-layout\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\n\r\ninterface ReorderColumnLike {\r\n key?: string;\r\n children?: ReorderColumnLike[];\r\n}\r\n\r\nexport function isHeaderNodeReorderable<RecordType>(\r\n node: HeaderTreeNode<RecordType>,\r\n getMovableLeafColumns: (\r\n node: HeaderTreeNode<RecordType>,\r\n ) => InternalLeafColumn<RecordType>[],\r\n) {\r\n if (node.fixed || node.column.draggable === false) {\r\n return false;\r\n }\r\n\r\n return getMovableLeafColumns(node).length > 0;\r\n}\r\n\r\nexport function getReorderableHeaderSiblings<RecordType>(\r\n siblings: HeaderTreeNode<RecordType>[],\r\n getMovableLeafColumns: (\r\n node: HeaderTreeNode<RecordType>,\r\n ) => InternalLeafColumn<RecordType>[],\r\n) {\r\n return siblings.filter((node) =>\r\n isHeaderNodeReorderable(node, getMovableLeafColumns),\r\n );\r\n}\r\n\r\nexport function getLeafColumnsBounds<RecordType>(\r\n columns: InternalLeafColumn<RecordType>[],\r\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>,\r\n) {\r\n let left = Number.POSITIVE_INFINITY;\r\n let right = Number.NEGATIVE_INFINITY;\r\n\r\n columns.forEach((column) => {\r\n const bounds = getHeaderNodeBounds(headerRowsCache, column.key);\r\n if (!bounds) {\r\n return;\r\n }\r\n left = Math.min(left, bounds.left);\r\n right = Math.max(right, bounds.right);\r\n });\r\n\r\n if (!Number.isFinite(left) || !Number.isFinite(right)) {\r\n return null;\r\n }\r\n\r\n return { left, right };\r\n}\r\n\r\nexport function isLeafHeaderIntersectingRect<RecordType>(\r\n columnKey: string,\r\n rect: Rect,\r\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>,\r\n) {\r\n const bounds = getHeaderNodeBounds(headerRowsCache, columnKey);\r\n if (!bounds) {\r\n return false;\r\n }\r\n\r\n return bounds.right > rect.x && bounds.left < rect.x + rect.width;\r\n}\r\n\r\nexport function getHeaderNodeMovableLeafColumns<RecordType>(params: {\r\n node: HeaderTreeNode<RecordType>;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>;\r\n hitRect?: Rect;\r\n}) {\r\n const { node, leafColumns, headerRowsCache, hitRect } = params;\r\n const columns: InternalLeafColumn<RecordType>[] = [];\r\n\r\n for (\r\n let leafIndex = node.leafStartIndex;\r\n leafIndex <= node.leafEndIndex;\r\n leafIndex += 1\r\n ) {\r\n const leaf = leafColumns[leafIndex];\r\n if (!leaf || leaf.fixed || leaf.draggable === false) {\r\n continue;\r\n }\r\n if (\r\n hitRect &&\r\n !isLeafHeaderIntersectingRect(leaf.key, hitRect, headerRowsCache)\r\n ) {\r\n continue;\r\n }\r\n columns.push(leaf);\r\n }\r\n\r\n return columns;\r\n}\r\n\r\nexport function getHeaderNodeReorderBoundsByKey<RecordType>(params: {\r\n columnKey: string;\r\n headerTree: HeaderTreeNode<RecordType>[];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>;\r\n}) {\r\n const { columnKey, headerTree, leafColumns, headerRowsCache } = params;\r\n const node = findHeaderNodeByKey(headerTree, columnKey);\r\n if (!node) {\r\n return null;\r\n }\r\n\r\n return getLeafColumnsBounds(\r\n getHeaderNodeMovableLeafColumns({\r\n node,\r\n leafColumns,\r\n headerRowsCache,\r\n }),\r\n headerRowsCache,\r\n );\r\n}\r\n\r\n/**\r\n * 在列树中移动目标列。\r\n */\r\nexport function reorderColumns(\r\n cols: ReorderColumnLike[],\r\n sourceKey: string,\r\n targetKey: string | null,\r\n movableKeys?: string[],\r\n): boolean {\r\n const srcIdx = cols.findIndex((c) => c.key === sourceKey);\r\n if (srcIdx === -1) {\r\n for (const col of cols) {\r\n if (col.children?.length) {\r\n const moved = reorderColumns(\r\n col.children,\r\n sourceKey,\r\n targetKey,\r\n movableKeys,\r\n );\r\n if (moved) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n const movableKeySet = movableKeys?.length ? new Set(movableKeys) : null;\r\n if (movableKeySet && !movableKeySet.has(sourceKey)) {\r\n return false;\r\n }\r\n if (\r\n targetKey !== null &&\r\n (cols.findIndex((c) => c.key === targetKey) === -1 ||\r\n (movableKeySet != null && !movableKeySet.has(targetKey)))\r\n ) {\r\n return false;\r\n }\r\n\r\n const [item] = cols.splice(srcIdx, 1);\r\n if (targetKey === null) {\r\n const insertIndex = resolveAppendIndex(cols, movableKeySet);\r\n cols.splice(insertIndex, 0, item);\r\n } else {\r\n const targetIndex = cols.findIndex((c) => c.key === targetKey);\r\n if (targetIndex === -1) {\r\n const insertIndex = resolveAppendIndex(cols, movableKeySet);\r\n cols.splice(insertIndex, 0, item);\r\n } else {\r\n cols.splice(targetIndex, 0, item);\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction resolveAppendIndex(\r\n cols: ReorderColumnLike[],\r\n movableKeySet: Set<string> | null,\r\n) {\r\n if (!movableKeySet) {\r\n return cols.length;\r\n }\r\n\r\n for (let index = cols.length - 1; index >= 0; index -= 1) {\r\n const columnKey = cols[index].key;\r\n if (columnKey && movableKeySet.has(columnKey)) {\r\n return index + 1;\r\n }\r\n }\r\n\r\n return cols.length;\r\n}\r\n\r\n/**\r\n * 收集当前列段的 drawX 位置。\r\n */\r\nexport function collectSegmentPositions<RecordType>(\r\n segments: Array<\r\n Array<import(\"../../domain/columns/segment-column\").SegmentColumn<RecordType>>\n >,\r\n) {\r\n const positions = new Map<string, number>();\r\n for (const cols of segments) {\r\n for (const col of cols) {\r\n positions.set(col.key, col.drawX);\r\n }\r\n }\r\n return positions;\r\n}\r\n\r\n/**\r\n * 根据重排前后位置生成交换动画列集合。\r\n */\r\nexport function resolveSwapAnimationColumns(\r\n fromPositions: Map<string, number>,\r\n toPositions: Map<string, number>,\r\n) {\r\n const animColumns = new Map<string, { from: number; to: number }>();\r\n for (const [key, toX] of toPositions) {\r\n const fromX = fromPositions.get(key);\r\n if (fromX !== undefined && Math.abs(fromX - toX) > 1) {\r\n animColumns.set(key, { from: fromX, to: toX });\r\n }\r\n }\r\n return animColumns;\r\n}\r\n\r\n/**\r\n * 递归查找标准化列。\r\n */\r\nexport function findNormalizedColumnByKey<RecordType>(\r\n columns: NormalizedColumn<RecordType>[],\r\n columnKey: string,\r\n): NormalizedColumn<RecordType> | null {\r\n for (const column of columns) {\r\n if (column.key === columnKey) {\r\n return column;\r\n }\r\n if (column.children?.length) {\r\n const matched = findNormalizedColumnByKey(column.children, columnKey);\r\n if (matched) {\r\n return matched;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * 查找当前表头节点及其同级信息。\r\n */\r\nexport function getHeaderDragContext<RecordType>(\r\n nodes: HeaderTreeNode<RecordType>[],\r\n columnKey: string,\r\n): {\r\n node: HeaderTreeNode<RecordType>;\r\n siblings: HeaderTreeNode<RecordType>[];\r\n siblingIndex: number;\r\n} | null {\r\n for (let index = 0; index < nodes.length; index += 1) {\r\n const node = nodes[index];\r\n if (node.key === columnKey) {\r\n return {\r\n node,\r\n siblings: nodes,\r\n siblingIndex: index,\r\n };\r\n }\r\n if (node.children.length > 0) {\r\n const matched = getHeaderDragContext(node.children, columnKey);\r\n if (matched) {\r\n return matched;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * 通过 key 查找当前表头树节点。\r\n */\r\nexport function findHeaderNodeByKey<RecordType>(\r\n nodes: HeaderTreeNode<RecordType>[],\r\n columnKey: string,\r\n) {\r\n return getHeaderDragContext(nodes, columnKey)?.node ?? null;\r\n}\r\n\r\n/**\r\n * 计算表头节点当前可见边界。\r\n */\r\nexport function getHeaderNodeBounds<RecordType>(\r\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>,\r\n columnKey: string,\r\n) {\r\n let minX = Number.POSITIVE_INFINITY;\r\n let maxX = Number.NEGATIVE_INFINITY;\r\n\r\n headerRowsCache.forEach((row) => {\r\n row.forEach((cell) => {\r\n if (cell.node.key !== columnKey) {\r\n return;\r\n }\r\n minX = Math.min(minX, cell.x);\r\n maxX = Math.max(maxX, cell.x + cell.width);\r\n });\r\n });\r\n\r\n if (!Number.isFinite(minX) || !Number.isFinite(maxX)) {\r\n return null;\r\n }\r\n\r\n return {\r\n left: minX,\r\n right: maxX,\r\n };\r\n}\r\n\r\nexport function startColumnReorderDrag<RecordType>(params: {\r\n result: { area: string; columnKey?: string; rect?: Rect };\r\n options: ListTableOptions<RecordType>;\r\n normalizedColumns: NormalizedColumn<RecordType>[];\r\n headerTree: HeaderTreeNode<RecordType>[];\r\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>;\r\n pointerX: number;\r\n headerRowHeight: number;\r\n getMovableLeafColumns: (\r\n node: HeaderTreeNode<RecordType>,\r\n hitRect?: Rect,\r\n ) => InternalLeafColumn<RecordType>[];\r\n}) {\r\n const {\r\n result,\r\n options,\r\n normalizedColumns,\r\n headerTree,\r\n headerRowsCache,\r\n pointerX,\r\n headerRowHeight,\r\n getMovableLeafColumns,\r\n } = params;\r\n if (result.area !== \"header\" || !result.columnKey || !options.draggable) {\r\n return null;\r\n }\r\n\r\n const draggableColumn = findNormalizedColumnByKey(\r\n normalizedColumns,\r\n result.columnKey,\r\n );\r\n if (draggableColumn?.draggable === false) {\r\n return null;\r\n }\r\n\r\n const dragContext = getHeaderDragContext(headerTree, result.columnKey);\r\n if (\r\n !dragContext ||\r\n !isHeaderNodeReorderable(dragContext.node, (node) =>\r\n getMovableLeafColumns(node),\r\n )\r\n ) {\r\n return null;\r\n }\r\n\r\n const sourceColumns = getMovableLeafColumns(dragContext.node, result.rect);\r\n if (sourceColumns.length === 0) {\r\n return null;\r\n }\r\n\r\n const movableSiblings = getReorderableHeaderSiblings(\r\n dragContext.siblings,\r\n (node) => getMovableLeafColumns(node),\r\n );\r\n const sourceSiblingIndex = movableSiblings.findIndex(\r\n (item) => item.key === dragContext.node.key,\r\n );\r\n if (sourceSiblingIndex === -1 || movableSiblings.length <= 1) {\r\n return null;\r\n }\r\n\r\n const sourceBounds = getLeafColumnsBounds(sourceColumns, headerRowsCache);\r\n if (!sourceBounds) {\r\n return null;\r\n }\r\n\r\n const sourceLeafIndexes = sourceColumns.map((column) => column.leafIndex);\r\n const sourceLeafStartIndex = Math.min(...sourceLeafIndexes);\r\n const sourceLeafEndIndex = Math.max(...sourceLeafIndexes);\r\n\r\n return {\r\n columnKey: dragContext.node.key,\r\n sourceIndex: sourceLeafStartIndex,\r\n targetIndex: sourceLeafStartIndex,\r\n sourceLeafStartIndex,\r\n sourceLeafEndIndex,\r\n sourceColumnKeys: sourceColumns.map((column) => column.key),\r\n startX: pointerX,\r\n currentX: pointerX,\r\n activated: false,\r\n sourceSiblingIndex,\r\n targetSiblingIndex: sourceSiblingIndex,\r\n targetColumnKey: movableSiblings[sourceSiblingIndex]?.key ?? null,\r\n targetIndicatorX: sourceBounds.left,\r\n sourceHeaderRect: {\r\n x: sourceBounds.left,\r\n y: result.rect?.y ?? 0,\r\n width: sourceBounds.right - sourceBounds.left,\r\n height: result.rect?.height ?? headerRowHeight,\r\n },\r\n selectedHeaderRect: {\r\n x: result.rect?.x ?? sourceBounds.left,\r\n y: result.rect?.y ?? 0,\r\n width: result.rect?.width ?? sourceBounds.right - sourceBounds.left,\r\n height: result.rect?.height ?? headerRowHeight,\r\n },\r\n siblingKeys: movableSiblings.map((item) => item.key),\r\n } satisfies DraggingReorderState;\r\n}\r\n\r\nexport function updateColumnReorderDrag<RecordType>(params: {\r\n dragging: DraggingReorderState;\r\n pointerX: number;\r\n headerTree: HeaderTreeNode<RecordType>[];\r\n getBounds: (columnKey: string) => { left: number; right: number } | null;\r\n}) {\r\n const { dragging, pointerX, headerTree, getBounds } = params;\r\n const next = {\r\n ...dragging,\r\n currentX: pointerX,\r\n };\r\n\r\n if (!next.activated && Math.abs(pointerX - next.startX) > 5) {\r\n next.activated = true;\r\n }\r\n\r\n if (next.activated) {\r\n const siblingNodes = next.siblingKeys\r\n .map((key) => findHeaderNodeByKey(headerTree, key))\r\n .filter((item): item is HeaderTreeNode<RecordType> => item != null);\r\n const target = resolveHeaderReorderTarget(\r\n pointerX,\r\n siblingNodes,\r\n getBounds,\r\n );\r\n if (target) {\r\n next.targetSiblingIndex = target.targetSiblingIndex;\r\n next.targetColumnKey = target.targetColumnKey;\r\n next.targetIndex = target.targetLeafIndex;\r\n next.targetIndicatorX = target.targetIndicatorX;\r\n }\r\n }\r\n\r\n const siblingNodes = next.siblingKeys\r\n .map((key) => findHeaderNodeByKey(headerTree, key))\r\n .filter((item): item is HeaderTreeNode<RecordType> => item != null);\r\n const tooltipText = getHeaderReorderTooltipText({\r\n siblings: siblingNodes,\r\n targetSiblingIndex: next.targetSiblingIndex,\r\n currentX: next.currentX,\r\n getBounds,\r\n });\r\n\r\n return {\r\n dragging: next,\r\n tooltipText,\r\n };\r\n}\r\n\r\nexport function commitColumnReorder<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n sourceKey: string;\r\n targetKey: string | null;\r\n movableKeys: string[];\r\n columnSegments: ColumnSegments<RecordType>;\r\n refreshLayout: () => ColumnSegments<RecordType>;\r\n releaseAnimation?: DraggingReorderState;\r\n}) {\r\n const {\r\n options,\r\n sourceKey,\r\n targetKey,\r\n movableKeys,\r\n columnSegments,\r\n refreshLayout,\r\n releaseAnimation,\r\n } = params;\r\n const previousColumns = [\r\n ...columnSegments.leftSegment,\r\n ...columnSegments.centerSegment,\r\n ...columnSegments.rightSegment,\r\n ];\r\n const fromPositions = collectSegmentPositions([\r\n columnSegments.leftSegment,\r\n columnSegments.centerSegment,\r\n columnSegments.rightSegment,\r\n ]);\r\n ensureColumnKeysInPlace(options.columns);\r\n reorderColumns(options.columns, sourceKey, targetKey, movableKeys);\r\n if (fromPositions.size === 0) {\r\n return null;\r\n }\r\n const nextSegments = refreshLayout();\r\n\r\n const toPositions = collectSegmentPositions([\r\n nextSegments.leftSegment,\r\n nextSegments.centerSegment,\r\n nextSegments.rightSegment,\r\n ]);\r\n const animColumns = resolveSwapAnimationColumns(fromPositions, toPositions);\r\n applyReleaseColumnAnimation({\r\n animColumns,\r\n previousColumns,\r\n toPositions,\r\n releaseAnimation,\r\n });\r\n if (animColumns.size === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n columns: animColumns,\r\n startTime: performance.now(),\r\n duration: releaseAnimation ? 320 : 250,\r\n release: resolveReleaseOverlayAnimation({\r\n releaseAnimation,\r\n previousColumns,\r\n toPositions,\r\n }),\r\n } satisfies SwapAnimationState;\r\n}\r\n\r\nfunction applyReleaseColumnAnimation<RecordType>(params: {\r\n animColumns: Map<string, { from: number; to: number }>;\r\n previousColumns: Array<{\r\n key: string;\r\n width: number;\r\n drawX: number;\r\n }>;\r\n toPositions: Map<string, number>;\r\n releaseAnimation?: DraggingReorderState;\r\n}) {\r\n const { animColumns, previousColumns, toPositions, releaseAnimation } =\r\n params;\r\n if (!releaseAnimation || releaseAnimation.sourceColumnKeys.length === 0) {\r\n return;\r\n }\r\n\r\n const previousColumnMap = new Map(\r\n previousColumns.map((column) => [column.key, column]),\r\n );\r\n const sourceColumns = releaseAnimation.sourceColumnKeys\r\n .map((key) => previousColumnMap.get(key))\r\n .filter(\r\n (\r\n column,\r\n ): column is {\r\n key: string;\r\n width: number;\r\n drawX: number;\r\n } => column != null,\r\n );\r\n if (sourceColumns.length === 0) {\r\n return;\r\n }\r\n\r\n const sourceWidth = sourceColumns.reduce(\r\n (total, column) => total + column.width,\r\n 0,\r\n );\r\n let nextFromX = releaseAnimation.currentX - sourceWidth / 2;\r\n sourceColumns.forEach((column) => {\r\n const to = toPositions.get(column.key);\r\n if (to == null) {\r\n nextFromX += column.width;\r\n return;\r\n }\r\n\r\n if (Math.abs(nextFromX - to) > 0.5) {\r\n animColumns.set(column.key, {\r\n from: nextFromX,\r\n to,\r\n });\r\n }\r\n nextFromX += column.width;\r\n });\r\n}\r\n\r\nfunction resolveReleaseOverlayAnimation<RecordType>(params: {\r\n releaseAnimation?: DraggingReorderState;\r\n previousColumns: Array<{\r\n key: string;\r\n width: number;\r\n drawX: number;\r\n }>;\r\n toPositions: Map<string, number>;\r\n}) {\r\n const { releaseAnimation, previousColumns, toPositions } = params;\r\n if (!releaseAnimation || releaseAnimation.sourceColumnKeys.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const previousColumnMap = new Map(\r\n previousColumns.map((column) => [column.key, column]),\r\n );\r\n const sourceColumns = releaseAnimation.sourceColumnKeys\r\n .map((key) => previousColumnMap.get(key))\r\n .filter((column): column is NonNullable<typeof column> => column != null);\r\n if (sourceColumns.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const targetLeft = sourceColumns.reduce((left, column) => {\r\n const position = toPositions.get(column.key);\r\n return position == null ? left : Math.min(left, position);\r\n }, Number.POSITIVE_INFINITY);\r\n if (!Number.isFinite(targetLeft)) {\r\n return undefined;\r\n }\r\n\r\n const sourceWidth = sourceColumns.reduce(\r\n (total, column) => total + column.width,\r\n 0,\r\n );\r\n return {\r\n dragging: { ...releaseAnimation },\r\n fromX: releaseAnimation.currentX,\r\n toX: targetLeft + sourceWidth / 2,\r\n };\r\n}\r\n\r\n/**\r\n * 推进列交换动画。\r\n */\r\nexport function advanceColumnReorderAnimation(\r\n animation: SwapAnimationState | null,\r\n now: number,\r\n) {\r\n if (!animation) {\r\n return {\r\n active: false,\r\n completed: false,\r\n animation: null,\r\n };\r\n }\r\n\r\n const elapsed = now - animation.startTime;\r\n if (elapsed >= animation.duration) {\r\n return {\r\n active: false,\r\n completed: true,\r\n animation: null,\r\n };\r\n }\r\n\r\n return {\r\n active: true,\r\n completed: false,\r\n animation,\r\n };\r\n}\r\n\r\n","/**\r\n * 解析滚动条透明度同步后的状态。\r\n */\r\nexport function resolveScrollbarOpacitySync(params: {\r\n opacity: number;\r\n target: number;\r\n visible: boolean;\r\n visibleOption?: boolean;\r\n hasAnimationFrame: boolean;\r\n epsilon?: number;\r\n}) {\r\n const epsilon = params.epsilon ?? 0.001;\r\n\r\n if (params.visibleOption === true) {\r\n return {\r\n opacity: 1,\r\n target: 1,\r\n shouldStartAnimation: false,\r\n shouldStopAnimation: true,\r\n };\r\n }\r\n\r\n if (params.visibleOption === false) {\r\n if (params.opacity > epsilon) {\r\n return {\r\n opacity: params.opacity,\r\n target: 0,\r\n shouldStartAnimation: true,\r\n shouldStopAnimation: false,\r\n };\r\n }\r\n\r\n return {\r\n opacity: 0,\r\n target: 0,\r\n shouldStartAnimation: false,\r\n shouldStopAnimation: true,\r\n };\r\n }\r\n\r\n const nextTarget = params.visible ? 1 : 0;\r\n const targetChanged = Math.abs(nextTarget - params.target) > epsilon;\r\n const shouldResumeAnimation =\r\n Math.abs(params.opacity - nextTarget) > epsilon &&\r\n !params.hasAnimationFrame;\r\n\r\n return {\r\n opacity: params.opacity,\r\n target: nextTarget,\r\n shouldStartAnimation: targetChanged || shouldResumeAnimation,\r\n shouldStopAnimation: false,\r\n };\r\n}\r\n\r\n/**\r\n * 推进滚动条透明度过渡,返回下一帧状态。\r\n */\r\nexport function advanceScrollbarOpacityStep(params: {\r\n opacity: number;\r\n target: number;\r\n deltaMs: number;\r\n fadeInTimeConstantMs?: number;\r\n fadeOutTimeConstantMs?: number;\r\n settleEpsilon?: number;\r\n}) {\r\n const deltaMs = Math.max(Math.min(params.deltaMs, 64), 0);\r\n const fadeIn = Math.max(params.fadeInTimeConstantMs ?? 70, 1);\r\n const fadeOut = Math.max(params.fadeOutTimeConstantMs ?? 140, 1);\r\n const timeConstant = params.target > params.opacity ? fadeIn : fadeOut;\r\n const alpha = 1 - Math.exp(-deltaMs / timeConstant);\r\n const next = params.opacity + (params.target - params.opacity) * alpha;\r\n const settleEpsilon = params.settleEpsilon ?? 0.01;\r\n const settled = Math.abs(params.target - next) < settleEpsilon;\r\n return {\r\n opacity: settled ? params.target : next,\r\n settled,\r\n };\r\n}\r\n","import type {\r\n DebugHitTestResult,\r\n RenderCellDescriptor,\r\n Rect,\r\n} from \"../debug/debug-snapshot\";\r\nimport type {\r\n HeaderTreeNode,\r\n InternalLeafColumn,\r\n NormalizedColumn,\r\n} from \"../domain/columns/types\";\r\nimport type { HeaderCellLayout } from \"../domain/columns/header-layout-types\";\r\nimport type { ScrollbarLayout } from \"../domain/layout/scrollbar-types\";\r\nimport type { NestedTableHighlightState } from \"../rendering/cell-content/types\";\r\nimport type { ListTableValidationError } from \"../validation/table-validation\";\r\nimport type { ColumnSegments } from \"../domain/columns/column-layout\";\r\nimport type { ListTableRenderSnapshot } from \"../services/layout-service\";\r\nimport type {\r\n CellControlAnimationState,\r\n DraggingReorderState,\r\n DraggingResizeState,\r\n DraggingScrollbarState,\r\n SwapAnimationState,\r\n} from \"../domain/types\";\r\nimport type { HeaderContextMenuConfig } from \"../ui/types\";\r\n\r\nexport interface ListTableLayoutRuntime<RecordType> {\r\n normalizedColumns: NormalizedColumn<RecordType>[];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n columnSegments: ColumnSegments<RecordType>;\r\n headerTree: HeaderTreeNode<RecordType>[];\r\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>;\r\n descriptors: RenderCellDescriptor[];\r\n scrollbarLayout: ScrollbarLayout;\r\n currentRenderSnapshot: ListTableRenderSnapshot<RecordType> | null;\r\n pendingRenderHitResult: DebugHitTestResult | null;\r\n}\r\n\r\nexport interface ListTableInteractionRuntime {\r\n draggingScrollbar: DraggingScrollbarState | null;\r\n draggingResize: DraggingResizeState | null;\r\n draggingReorder: DraggingReorderState | null;\r\n suppressNextClick: boolean;\r\n}\r\n\r\nexport interface ListTableSelectionRuntime {\r\n selectedHeaderKey: string | null;\r\n selectedHeaderRect: Rect | null;\r\n summarySelected: boolean;\r\n}\r\n\r\nexport interface ListTableOverlayRuntime {\r\n filterPanelVisible: boolean;\r\n fixedPopupVisible: boolean;\r\n headerContextMenuVisible: boolean;\r\n headerContextMenuConfig: HeaderContextMenuConfig | null;\r\n}\r\n\r\nexport interface ListTableAnimationRuntime<RecordType> {\r\n swapAnimation: SwapAnimationState | null;\r\n swapAnimationFrameId: number | null;\r\n scrollToAnimation: {\r\n fromLeft: number;\r\n toLeft: number;\r\n fromTop: number;\r\n toTop: number;\r\n startTime: number;\r\n duration: number;\r\n onComplete?: () => void;\r\n } | null;\r\n scrollToAnimationFrameId: number | null;\r\n controlAnimations: Map<string, CellControlAnimationState>;\r\n lastControlValues: Map<string, number>;\r\n controlAnimationRowsRef: RecordType[] | null;\r\n controlAnimationWindowKey: string | null;\r\n controlAnimationColumnKey: string | null;\r\n controlAnimationFrameId: number | null;\r\n expandAnimations: Map<string, CellControlAnimationState>;\r\n lastExpandedRowKeys: Set<string>;\r\n expandAnimationFrameId: number | null;\r\n collapseRowAnimations: Map<string, CellControlAnimationState>;\r\n collapseCellHeightAnimations: Map<string, CellControlAnimationState>;\r\n collapseAnimationFrameId: number | null;\r\n nestedTableHighlights: Map<string, NestedTableHighlightState>;\r\n pendingCollapseRowPositions: Map<string, number> | null;\r\n scrollbarActiveUntil: number;\r\n scrollbarHideTimer: number | null;\r\n scrollbarOpacity: number;\r\n scrollbarOpacityTarget: number;\r\n scrollbarOpacityFrameId: number | null;\r\n scrollbarOpacityLastTime: number;\r\n wheelScrollTarget: { left: number; top: number } | null;\r\n wheelScrollFrameId: number | null;\r\n wheelScrollLastTime: number;\r\n continuousScrollTimer: number | null;\r\n carouselScrollTimer: number | null;\r\n carouselScrollAnimationFrameId: number | null;\r\n carouselScrollConfigKey: string | null;\r\n carouselScrollPausedByPointer: boolean;\r\n carouselScrollAnimation: {\r\n from: { left: number; top: number };\r\n to: { left: number; top: number };\r\n startTime: number;\r\n duration: number;\r\n direction: \"vertical\" | \"horizontal\";\r\n } | null;\r\n}\r\n\r\nexport interface ListTableAsyncRuntime<RecordType> {\r\n queryRowsOverrideBase: RecordType[] | null;\r\n queryTaskId: number;\r\n queryAbortController: AbortController | null;\r\n summaryValueMap: Map<string, string>;\r\n summaryRowsSourceRef: RecordType[] | null;\r\n summaryQueryStateKey: string | null;\r\n summaryRowsWindowKey: string | null;\r\n summaryConfigKey: string | null;\r\n summaryReady: boolean;\r\n summaryTaskId: number;\r\n summaryAbortController: AbortController | null;\r\n summaryResumeTimer: number | null;\r\n validationMessages: Map<string, string>;\r\n validationTaskId: number;\r\n lastValidationErrors: ListTableValidationError<RecordType>[];\r\n}\r\n\r\nexport interface ListTableViewRuntime {\r\n tableZoom: number;\r\n exportTaskRunning: boolean;\r\n renderFrameId: number | null;\r\n}\r\n\r\nexport interface ListTableRuntime<RecordType> {\r\n layout: ListTableLayoutRuntime<RecordType>;\r\n interaction: ListTableInteractionRuntime;\r\n selection: ListTableSelectionRuntime;\r\n overlay: ListTableOverlayRuntime;\r\n animation: ListTableAnimationRuntime<RecordType>;\r\n async: ListTableAsyncRuntime<RecordType>;\r\n view: ListTableViewRuntime;\r\n}\r\n\r\n/**\r\n * 创建浮层协调运行时状态。\r\n */\r\nexport function createListTableOverlayRuntime(): ListTableOverlayRuntime {\r\n return {\r\n filterPanelVisible: false,\r\n fixedPopupVisible: false,\r\n headerContextMenuVisible: false,\r\n headerContextMenuConfig: null,\r\n };\r\n}\r\n\r\n/**\r\n * 创建动画协调运行时状态。\r\n */\r\nexport function createListTableAnimationRuntime<\r\n RecordType,\r\n>(): ListTableAnimationRuntime<RecordType> {\r\n return {\r\n swapAnimation: null,\r\n swapAnimationFrameId: null,\r\n scrollToAnimation: null,\r\n scrollToAnimationFrameId: null,\r\n controlAnimations: new Map(),\r\n lastControlValues: new Map(),\r\n controlAnimationRowsRef: null,\r\n controlAnimationWindowKey: null,\r\n controlAnimationColumnKey: null,\r\n controlAnimationFrameId: null,\r\n expandAnimations: new Map(),\r\n lastExpandedRowKeys: new Set(),\r\n expandAnimationFrameId: null,\r\n collapseRowAnimations: new Map(),\r\n collapseCellHeightAnimations: new Map(),\r\n collapseAnimationFrameId: null,\r\n nestedTableHighlights: new Map(),\r\n pendingCollapseRowPositions: null,\r\n scrollbarActiveUntil: 0,\r\n scrollbarHideTimer: null,\r\n scrollbarOpacity: 0,\r\n scrollbarOpacityTarget: 0,\r\n scrollbarOpacityFrameId: null,\r\n scrollbarOpacityLastTime: 0,\r\n wheelScrollTarget: null,\r\n wheelScrollFrameId: null,\r\n wheelScrollLastTime: 0,\r\n continuousScrollTimer: null,\r\n carouselScrollTimer: null,\r\n carouselScrollAnimationFrameId: null,\r\n carouselScrollConfigKey: null,\r\n carouselScrollPausedByPointer: false,\r\n carouselScrollAnimation: null,\r\n };\r\n}\r\n\r\n/**\r\n * 创建列表表格协调层运行时容器。\r\n */\r\nexport function createListTableRuntime<\r\n RecordType,\r\n>(): ListTableRuntime<RecordType> {\r\n return {\r\n layout: {\r\n normalizedColumns: [],\r\n leafColumns: [],\r\n columnSegments: {\r\n leftSegment: [],\r\n centerSegment: [],\r\n rightSegment: [],\r\n },\r\n headerTree: [],\r\n headerRowsCache: [],\r\n descriptors: [],\r\n scrollbarLayout: {},\r\n currentRenderSnapshot: null,\r\n pendingRenderHitResult: null,\r\n },\r\n interaction: {\r\n draggingScrollbar: null,\r\n draggingResize: null,\r\n draggingReorder: null,\r\n suppressNextClick: false,\r\n },\r\n selection: {\r\n selectedHeaderKey: null,\r\n selectedHeaderRect: null,\r\n summarySelected: false,\r\n },\r\n overlay: createListTableOverlayRuntime(),\r\n animation: createListTableAnimationRuntime(),\r\n async: {\r\n queryRowsOverrideBase: null,\r\n queryTaskId: 0,\r\n queryAbortController: null,\r\n summaryValueMap: new Map(),\r\n summaryRowsSourceRef: null,\r\n summaryQueryStateKey: null,\r\n summaryRowsWindowKey: null,\r\n summaryConfigKey: null,\r\n summaryReady: true,\r\n summaryTaskId: 0,\r\n summaryAbortController: null,\r\n summaryResumeTimer: null,\r\n validationMessages: new Map(),\r\n validationTaskId: 0,\r\n lastValidationErrors: [],\r\n },\r\n view: {\r\n tableZoom: 1,\r\n exportTaskRunning: false,\r\n renderFrameId: null,\r\n },\r\n };\r\n}\r\n\r\n","import type { ScrollState } from \"../../schema/state\";\r\nimport type { ListTableCarouselScrollOptions } from \"../../schema/table-options\";\r\nimport { clamp } from \"../../domain/layout/geometry\";\r\nimport type { DraggingScrollbarState } from \"../../domain/types\";\r\n\r\nexport interface ScrollViewportBounds {\r\n maxScrollLeft: number;\r\n maxScrollTop: number;\r\n}\r\n\r\nexport interface CarouselColumnStep {\r\n width: number;\r\n}\r\n\r\nexport interface CarouselScrollResolution {\r\n nextScroll: ScrollState;\r\n animate: boolean;\r\n shouldStop: boolean;\r\n}\r\n\r\n/** DOM_DELTA_PIXEL */\r\nexport const WHEEL_DELTA_MODE_PIXEL = 0;\r\n/** DOM_DELTA_LINE */\r\nexport const WHEEL_DELTA_MODE_LINE = 1;\r\n/** DOM_DELTA_PAGE */\r\nexport const WHEEL_DELTA_MODE_PAGE = 2;\r\n\r\n/**\r\n * 将单个轴向的滚轮增量转换为布局像素。\r\n */\r\nexport function normalizeWheelDeltaToPixels(params: {\r\n delta: number;\r\n deltaMode: number;\r\n lineHeight: number;\r\n pageSize: number;\r\n}) {\r\n const delta = Number.isFinite(params.delta) ? params.delta : 0;\r\n const lineHeight = Math.max(params.lineHeight, 1);\r\n const pageSize = Math.max(params.pageSize, 1);\r\n\r\n if (params.deltaMode === WHEEL_DELTA_MODE_LINE) {\r\n return delta * lineHeight;\r\n }\r\n if (params.deltaMode === WHEEL_DELTA_MODE_PAGE) {\r\n return delta * pageSize;\r\n }\r\n\r\n return delta;\r\n}\r\n\r\n/**\r\n * 柔化鼠标滚轮的离散步进,避免一次跳动过大。\r\n */\r\nexport function softenWheelDeltaPixels(params: {\r\n delta: number;\r\n deltaMode: number;\r\n lineHeight: number;\r\n}) {\r\n const delta = params.delta;\r\n if (delta === 0) {\r\n return 0;\r\n }\r\n\r\n const abs = Math.abs(delta);\r\n const lineHeight = Math.max(params.lineHeight, 1);\r\n // Windows/macOS 常见鼠标一格约为 100/120px。\r\n if (\r\n params.deltaMode === WHEEL_DELTA_MODE_PIXEL &&\r\n abs >= 80 &&\r\n abs <= 160\r\n ) {\r\n return delta * 0.42;\r\n }\r\n\r\n // LINE 模式下按行高换算后仍可能一步过大,收敛到更细的步幅。\r\n if (params.deltaMode === WHEEL_DELTA_MODE_LINE) {\r\n const maxStep = Math.max(lineHeight * 0.75, 24);\r\n if (abs <= maxStep) {\r\n return delta * 0.72;\r\n }\r\n return Math.sign(delta) * (maxStep + (abs - maxStep) * 0.35);\r\n }\r\n\r\n // 其它大步进(如 page 或异常像素)做轻度压缩。\r\n const softThreshold = Math.max(lineHeight * 1.25, 48);\r\n if (abs <= softThreshold) {\r\n return delta;\r\n }\r\n return Math.sign(delta) * (softThreshold + (abs - softThreshold) * 0.4);\r\n}\r\n\r\n/**\r\n * 解析一次滚轮事件对应的布局坐标滚动增量。\r\n */\r\nexport function resolveWheelScrollDelta(params: {\r\n deltaX: number;\r\n deltaY: number;\r\n deltaMode: number;\r\n shiftKey: boolean;\r\n lineHeight: number;\r\n pageWidth: number;\r\n pageHeight: number;\r\n zoom: number;\r\n}) {\r\n const zoom = params.zoom > 0 ? params.zoom : 1;\r\n const rawX = softenWheelDeltaPixels({\r\n delta: normalizeWheelDeltaToPixels({\r\n delta: params.deltaX,\r\n deltaMode: params.deltaMode,\r\n lineHeight: params.lineHeight,\r\n pageSize: params.pageWidth,\r\n }),\r\n deltaMode: params.deltaMode,\r\n lineHeight: params.lineHeight,\r\n });\r\n const rawY = softenWheelDeltaPixels({\r\n delta: normalizeWheelDeltaToPixels({\r\n delta: params.deltaY,\r\n deltaMode: params.deltaMode,\r\n lineHeight: params.lineHeight,\r\n pageSize: params.pageHeight,\r\n }),\r\n deltaMode: params.deltaMode,\r\n lineHeight: params.lineHeight,\r\n });\r\n\r\n if (params.shiftKey) {\r\n return {\r\n left: (rawX + rawY) / zoom,\r\n top: 0,\r\n };\r\n }\r\n\r\n return {\r\n left: rawX / zoom,\r\n top: rawY / zoom,\r\n };\r\n}\r\n\r\n/**\r\n * 判断滚轮事件是否更适合直接跟手(触控板像素流)。\r\n */\r\nexport function shouldApplyWheelDeltaImmediately(params: {\r\n deltaX: number;\r\n deltaY: number;\r\n deltaMode: number;\r\n}) {\r\n if (params.deltaMode !== WHEEL_DELTA_MODE_PIXEL) {\r\n return false;\r\n }\r\n return Math.abs(params.deltaX) < 40 && Math.abs(params.deltaY) < 40;\r\n}\r\n\r\n/**\r\n * 计算平滑滚轮动画的下一帧位置。\r\n */\r\nexport function advanceWheelScrollSmoothing(params: {\r\n current: ScrollState;\r\n target: ScrollState;\r\n deltaMs: number;\r\n /** 时间常数,越大越“粘”。 */\r\n timeConstantMs?: number;\r\n}) {\r\n const timeConstant = Math.max(params.timeConstantMs ?? 92, 1);\r\n const deltaMs = Math.max(Math.min(params.deltaMs, 64), 0);\r\n const alpha = 1 - Math.exp(-deltaMs / timeConstant);\r\n const nextLeft =\r\n params.current.left + (params.target.left - params.current.left) * alpha;\r\n const nextTop =\r\n params.current.top + (params.target.top - params.current.top) * alpha;\r\n const done =\r\n Math.abs(params.target.left - nextLeft) < 0.35 &&\r\n Math.abs(params.target.top - nextTop) < 0.35;\r\n\r\n return {\r\n nextScroll: done\r\n ? { left: params.target.left, top: params.target.top }\r\n : { left: nextLeft, top: nextTop },\r\n done,\r\n };\r\n}\r\n\r\n/**\r\n * 按按钮步进滚动。\r\n */\r\nexport function stepScrollbarScroll(params: {\r\n current: ScrollState;\r\n area: \"horizontal-scrollbar\" | \"vertical-scrollbar\";\r\n direction: -1 | 1;\r\n viewport: ScrollViewportBounds;\r\n rowHeight: number;\r\n horizontalStep: number;\r\n}) {\r\n const { current, area, direction, viewport, rowHeight, horizontalStep } = params;\r\n if (area === \"horizontal-scrollbar\") {\r\n return {\r\n ...current,\r\n left: clamp(\r\n current.left + direction * horizontalStep,\r\n 0,\r\n viewport.maxScrollLeft,\r\n ),\r\n };\r\n }\r\n\r\n return {\r\n ...current,\r\n top: clamp(\r\n current.top + direction * rowHeight,\r\n 0,\r\n viewport.maxScrollTop,\r\n ),\r\n };\r\n}\r\n\r\n/**\r\n * 点击滚动条轨道进行跳转。\r\n */\r\nexport function jumpScrollbarScroll(params: {\r\n current: ScrollState;\r\n axis: \"horizontal\" | \"vertical\";\r\n pointerValue: number;\r\n track: { x: number; y: number; width: number; height: number };\r\n thumb: { x: number; y: number; width: number; height: number };\r\n viewport: ScrollViewportBounds;\r\n}) {\r\n const { current, axis, pointerValue, track, thumb, viewport } = params;\r\n if (axis === \"horizontal\") {\r\n const nextThumbX = clamp(\r\n pointerValue - thumb.width / 2,\r\n track.x,\r\n track.x + track.width - thumb.width,\r\n );\r\n const ratio =\r\n track.width === thumb.width\r\n ? 0\r\n : (nextThumbX - track.x) / (track.width - thumb.width);\r\n return {\r\n ...current,\r\n left: ratio * viewport.maxScrollLeft,\r\n };\r\n }\r\n\r\n const nextThumbY = clamp(\r\n pointerValue - thumb.height / 2,\r\n track.y,\r\n track.y + track.height - thumb.height,\r\n );\r\n const ratio =\r\n track.height === thumb.height\r\n ? 0\r\n : (nextThumbY - track.y) / (track.height - thumb.height);\r\n return {\r\n ...current,\r\n top: ratio * viewport.maxScrollTop,\r\n };\r\n}\r\n\r\n/**\r\n * 根据拖拽状态计算滚动位置。\r\n */\r\nexport function dragScrollbarScroll(params: {\r\n current: ScrollState;\r\n dragging: DraggingScrollbarState;\r\n pointerValue: number;\r\n}) {\r\n const { current, dragging, pointerValue } = params;\r\n const nextThumbValue = clamp(\r\n pointerValue - dragging.pointerOffset,\r\n dragging.trackStart,\r\n dragging.trackStart + dragging.trackLength - dragging.thumbLength,\r\n );\r\n const ratio =\r\n dragging.trackLength === dragging.thumbLength\r\n ? 0\r\n : (nextThumbValue - dragging.trackStart) /\r\n (dragging.trackLength - dragging.thumbLength);\r\n\r\n if (dragging.axis === \"horizontal\") {\r\n return {\r\n ...current,\r\n left: ratio * dragging.maxScroll,\r\n };\r\n }\r\n\r\n return {\r\n ...current,\r\n top: ratio * dragging.maxScroll,\r\n };\r\n}\r\n\r\n/**\r\n * 解析轮播滚动下一帧目标位置。\r\n */\r\nexport function resolveCarouselScroll(params: {\r\n current: ScrollState;\r\n viewport: ScrollViewportBounds;\r\n rowHeight: number;\r\n carouselScroll?: ListTableCarouselScrollOptions;\r\n centerColumns: CarouselColumnStep[];\r\n}) {\r\n const {\r\n current,\r\n viewport,\r\n rowHeight,\r\n carouselScroll,\r\n centerColumns,\r\n } = params;\r\n if (!carouselScroll) {\r\n return null;\r\n }\r\n\r\n const direction = carouselScroll.direction ?? \"vertical\";\r\n const loop = carouselScroll.loop !== false;\r\n if (direction === \"horizontal\") {\r\n return resolveHorizontalCarouselScroll({\r\n current,\r\n maxScrollLeft: viewport.maxScrollLeft,\r\n centerColumns,\r\n loop,\r\n });\r\n }\r\n\r\n return resolveVerticalCarouselScroll({\r\n current,\r\n maxScrollTop: viewport.maxScrollTop,\r\n rowHeight,\r\n loop,\r\n });\r\n}\r\n\r\nfunction resolveVerticalCarouselScroll(params: {\r\n current: ScrollState;\r\n maxScrollTop: number;\r\n rowHeight: number;\r\n loop: boolean;\r\n}): CarouselScrollResolution | null {\r\n const { current, maxScrollTop, rowHeight, loop } = params;\r\n if (maxScrollTop <= 0) {\r\n return null;\r\n }\r\n\r\n const epsilon = 0.5;\r\n if (current.top >= maxScrollTop - epsilon) {\r\n return {\r\n nextScroll: {\r\n ...current,\r\n top: loop ? 0 : maxScrollTop,\r\n },\r\n animate: false,\r\n shouldStop: !loop,\r\n };\r\n }\r\n\r\n return {\r\n nextScroll: {\r\n ...current,\r\n top: clamp(current.top + Math.max(rowHeight, 1), 0, maxScrollTop),\r\n },\r\n animate: true,\r\n shouldStop: false,\r\n };\r\n}\r\n\r\nfunction resolveHorizontalCarouselScroll(params: {\r\n current: ScrollState;\r\n maxScrollLeft: number;\r\n centerColumns: CarouselColumnStep[];\r\n loop: boolean;\r\n}): CarouselScrollResolution | null {\r\n const { current, maxScrollLeft, centerColumns, loop } = params;\r\n if (maxScrollLeft <= 0) {\r\n return null;\r\n }\r\n\r\n const epsilon = 0.5;\r\n if (current.left >= maxScrollLeft - epsilon) {\r\n return {\r\n nextScroll: {\r\n ...current,\r\n left: loop ? 0 : maxScrollLeft,\r\n },\r\n animate: false,\r\n shouldStop: !loop,\r\n };\r\n }\r\n\r\n const boundaries = resolveColumnBoundaries(centerColumns, maxScrollLeft);\r\n const nextLeft =\r\n boundaries.find((boundary) => boundary > current.left + epsilon) ??\r\n maxScrollLeft;\r\n\r\n return {\r\n nextScroll: {\r\n ...current,\r\n left: clamp(nextLeft, 0, maxScrollLeft),\r\n },\r\n animate: true,\r\n shouldStop: false,\r\n };\r\n}\r\n\r\nfunction resolveColumnBoundaries(\r\n columns: CarouselColumnStep[],\r\n maxScrollLeft: number,\r\n) {\r\n const boundaries: number[] = [];\r\n let offset = 0;\r\n\r\n columns.forEach((column) => {\r\n offset += Math.max(column.width, 0);\r\n boundaries.push(clamp(offset, 0, maxScrollLeft));\r\n });\r\n\r\n return Array.from(new Set(boundaries)).filter((value) => value > 0);\r\n}\r\n","import type { ScrollState } from \"../../schema/state\";\r\nimport type { ListTableAnimationRuntime } from \"../runtime\";\r\nimport { advanceWheelScrollSmoothing } from \"../../features/scroll/scroll-feature\";\r\n\r\nexport interface ListTableAnimationScheduler {\r\n now(): number;\r\n dateNow(): number;\r\n requestAnimationFrame(callback: FrameRequestCallback): number;\r\n cancelAnimationFrame(id: number): void;\r\n setTimeout(callback: () => void, delay: number): number;\r\n clearTimeout(id: number): void;\r\n setInterval(callback: () => void, delay: number): number;\r\n clearInterval(id: number): void;\r\n}\r\n\r\nexport interface ListTableScrollAnimationControllerOptions<RecordType> {\r\n runtime: ListTableAnimationRuntime<RecordType>;\r\n scheduler: ListTableAnimationScheduler;\r\n getScroll: () => ScrollState;\r\n setScroll: (scroll: ScrollState) => void;\r\n applyScroll: (scroll: ScrollState) => boolean;\r\n requestRender: () => void;\r\n onScrollPageLoad: () => void;\r\n markScrollbarActive: () => void;\r\n}\r\n\r\n/**\r\n * 协调滚动相关动画和自动滚动定时器。\r\n */\r\nexport class ListTableScrollAnimationController<RecordType> {\r\n private readonly runtime: ListTableAnimationRuntime<RecordType>;\r\n private readonly scheduler: ListTableAnimationScheduler;\r\n private readonly getScroll: () => ScrollState;\r\n private readonly setScroll: (scroll: ScrollState) => void;\r\n private readonly applyScroll: (scroll: ScrollState) => boolean;\r\n private readonly requestRender: () => void;\r\n private readonly onScrollPageLoad: () => void;\r\n private readonly markScrollbarActive: () => void;\r\n\r\n constructor(options: ListTableScrollAnimationControllerOptions<RecordType>) {\r\n this.runtime = options.runtime;\r\n this.scheduler = options.scheduler;\r\n this.getScroll = options.getScroll;\r\n this.setScroll = options.setScroll;\r\n this.applyScroll = options.applyScroll;\r\n this.requestRender = options.requestRender;\r\n this.onScrollPageLoad = options.onScrollPageLoad;\r\n this.markScrollbarActive = options.markScrollbarActive;\r\n }\r\n\r\n startScrollToAnimation(params: {\r\n targetLeft: number;\r\n targetTop: number;\r\n duration?: number;\r\n onComplete?: () => void;\r\n }) {\r\n // 中断上一次动画,不触发旧回调,避免连续导航时打开错误单元格。\r\n this.stopScrollToAnimation();\r\n const scroll = this.getScroll();\r\n this.runtime.scrollToAnimation = {\r\n fromLeft: scroll.left,\r\n toLeft: params.targetLeft,\r\n fromTop: scroll.top,\r\n toTop: params.targetTop,\r\n startTime: this.scheduler.now(),\r\n duration:\r\n typeof params.duration === \"number\" &&\r\n Number.isFinite(params.duration) &&\r\n params.duration > 0\r\n ? params.duration\r\n : 320,\r\n onComplete: params.onComplete,\r\n };\r\n this.runtime.scrollToAnimationFrameId =\r\n this.scheduler.requestAnimationFrame(() => {\r\n this.advanceScrollToAnimation();\r\n });\r\n }\r\n\r\n stopScrollToAnimation() {\r\n if (this.runtime.scrollToAnimationFrameId != null) {\r\n this.scheduler.cancelAnimationFrame(\r\n this.runtime.scrollToAnimationFrameId,\r\n );\r\n this.runtime.scrollToAnimationFrameId = null;\r\n }\r\n this.runtime.scrollToAnimation = null;\r\n }\r\n\r\n getWheelScrollTarget() {\r\n return this.runtime.wheelScrollTarget;\r\n }\r\n\r\n startWheelScrollSmoothing(target: ScrollState) {\r\n this.runtime.wheelScrollTarget = target;\r\n if (this.runtime.wheelScrollFrameId != null) {\r\n return;\r\n }\r\n\r\n this.runtime.wheelScrollLastTime = this.scheduler.now();\r\n this.runtime.wheelScrollFrameId = this.scheduler.requestAnimationFrame(\r\n () => {\r\n this.advanceWheelScrollSmoothingFrame();\r\n },\r\n );\r\n }\r\n\r\n stopWheelScrollSmoothing() {\r\n if (this.runtime.wheelScrollFrameId != null) {\r\n this.scheduler.cancelAnimationFrame(this.runtime.wheelScrollFrameId);\r\n this.runtime.wheelScrollFrameId = null;\r\n }\r\n this.runtime.wheelScrollTarget = null;\r\n this.runtime.wheelScrollLastTime = 0;\r\n }\r\n\r\n syncCarouselScroll(params: {\r\n enabled: boolean;\r\n interval: number | null;\r\n configKey: string | null;\r\n onTick: (interval: number) => void;\r\n }) {\r\n if (\r\n !params.enabled ||\r\n params.interval == null ||\r\n this.runtime.carouselScrollPausedByPointer\r\n ) {\r\n this.stopCarouselScroll();\r\n return;\r\n }\r\n\r\n if (\r\n this.runtime.carouselScrollTimer != null &&\r\n this.runtime.carouselScrollConfigKey === params.configKey\r\n ) {\r\n return;\r\n }\r\n\r\n this.stopCarouselScroll();\r\n this.runtime.carouselScrollConfigKey = params.configKey;\r\n this.runtime.carouselScrollTimer = this.scheduler.setInterval(() => {\r\n params.onTick(params.interval!);\r\n }, params.interval);\r\n }\r\n\r\n stopCarouselScroll() {\r\n if (this.runtime.carouselScrollTimer != null) {\r\n this.scheduler.clearInterval(this.runtime.carouselScrollTimer);\r\n this.runtime.carouselScrollTimer = null;\r\n }\r\n this.stopCarouselScrollAnimation();\r\n this.runtime.carouselScrollConfigKey = null;\r\n }\r\n\r\n stopCarouselScrollAnimation() {\r\n if (this.runtime.carouselScrollAnimationFrameId != null) {\r\n this.scheduler.cancelAnimationFrame(\r\n this.runtime.carouselScrollAnimationFrameId,\r\n );\r\n this.runtime.carouselScrollAnimationFrameId = null;\r\n }\r\n this.runtime.carouselScrollAnimation = null;\r\n }\r\n\r\n startCarouselScrollAnimation(params: {\r\n target: ScrollState;\r\n direction: \"vertical\" | \"horizontal\";\r\n interval: number;\r\n }) {\r\n this.stopCarouselScrollAnimation();\r\n this.runtime.carouselScrollAnimation = {\r\n from: {\r\n ...this.getScroll(),\r\n },\r\n to: params.target,\r\n startTime: this.scheduler.now(),\r\n duration: Math.min(\r\n Math.max(Math.round(params.interval * 0.45), 160),\r\n 360,\r\n ),\r\n direction: params.direction,\r\n };\r\n this.runtime.carouselScrollAnimationFrameId =\r\n this.scheduler.requestAnimationFrame(() => {\r\n this.advanceCarouselScrollAnimation();\r\n });\r\n }\r\n\r\n pauseCarouselScrollByPointer() {\r\n if (this.runtime.carouselScrollPausedByPointer) {\r\n return false;\r\n }\r\n\r\n this.runtime.carouselScrollPausedByPointer = true;\r\n this.stopCarouselScroll();\r\n return true;\r\n }\r\n\r\n resumeCarouselScrollByPointer() {\r\n if (!this.runtime.carouselScrollPausedByPointer) {\r\n return false;\r\n }\r\n\r\n this.runtime.carouselScrollPausedByPointer = false;\r\n return true;\r\n }\r\n\r\n destroy() {\r\n this.stopScrollToAnimation();\r\n this.stopWheelScrollSmoothing();\r\n this.stopCarouselScroll();\r\n }\r\n\r\n private advanceScrollToAnimation() {\r\n if (!this.runtime.scrollToAnimation) {\r\n this.runtime.scrollToAnimationFrameId = null;\r\n return;\r\n }\r\n\r\n const animation = this.runtime.scrollToAnimation;\r\n const elapsed = Math.max(this.scheduler.now() - animation.startTime, 0);\r\n const progress = Math.min(elapsed / animation.duration, 1);\r\n const eased = 1 - Math.pow(1 - progress, 3);\r\n this.setScroll({\r\n left:\r\n animation.fromLeft + (animation.toLeft - animation.fromLeft) * eased,\r\n top: animation.fromTop + (animation.toTop - animation.fromTop) * eased,\r\n });\r\n this.requestRender();\r\n this.onScrollPageLoad();\r\n\r\n if (progress >= 1) {\r\n const onComplete = animation.onComplete;\r\n this.stopScrollToAnimation();\r\n onComplete?.();\r\n return;\r\n }\r\n\r\n this.runtime.scrollToAnimationFrameId =\r\n this.scheduler.requestAnimationFrame(() => {\r\n this.advanceScrollToAnimation();\r\n });\r\n }\r\n\r\n private advanceWheelScrollSmoothingFrame() {\r\n this.runtime.wheelScrollFrameId = null;\r\n const target = this.runtime.wheelScrollTarget;\r\n if (!target) {\r\n return;\r\n }\r\n\r\n const now = this.scheduler.now();\r\n const deltaMs = now - this.runtime.wheelScrollLastTime;\r\n this.runtime.wheelScrollLastTime = now;\r\n const previousTop = this.getScroll().top;\r\n const { nextScroll, done } = advanceWheelScrollSmoothing({\r\n current: this.getScroll(),\r\n target,\r\n deltaMs,\r\n });\r\n const changed = this.applyScroll(nextScroll);\r\n if (changed) {\r\n this.markScrollbarActive();\r\n this.requestRender();\r\n if (nextScroll.top !== previousTop) {\r\n this.onScrollPageLoad();\r\n }\r\n }\r\n\r\n if (done) {\r\n this.runtime.wheelScrollTarget = null;\r\n return;\r\n }\r\n\r\n this.runtime.wheelScrollFrameId = this.scheduler.requestAnimationFrame(\r\n () => {\r\n this.advanceWheelScrollSmoothingFrame();\r\n },\r\n );\r\n }\r\n\r\n private advanceCarouselScrollAnimation() {\r\n if (!this.runtime.carouselScrollAnimation) {\r\n this.runtime.carouselScrollAnimationFrameId = null;\r\n return;\r\n }\r\n\r\n const animation = this.runtime.carouselScrollAnimation;\r\n const elapsed = Math.max(this.scheduler.now() - animation.startTime, 0);\r\n const progress = Math.min(elapsed / animation.duration, 1);\r\n const eased = 1 - Math.pow(1 - progress, 3);\r\n this.setScroll({\r\n left:\r\n animation.from.left + (animation.to.left - animation.from.left) * eased,\r\n top: animation.from.top + (animation.to.top - animation.from.top) * eased,\r\n });\r\n this.requestRender();\r\n if (animation.direction === \"vertical\") {\r\n this.onScrollPageLoad();\r\n }\r\n\r\n if (progress >= 1) {\r\n this.runtime.carouselScrollAnimationFrameId = null;\r\n this.runtime.carouselScrollAnimation = null;\r\n return;\r\n }\r\n\r\n this.runtime.carouselScrollAnimationFrameId =\r\n this.scheduler.requestAnimationFrame(() => {\r\n this.advanceCarouselScrollAnimation();\r\n });\r\n }\r\n}\r\n","import type { ListTableOptions } from \"../schema/table-options\";\r\nimport type { ListTableRenderResult } from \"../schema/column\";\r\nimport { getRowKey, type ListTableRowKey } from \"../domain/rows/row-selection\";\r\n\r\n/**\r\n * 展开详情行内容定义。\r\n */\r\nexport interface ListTableExpandedRowContent<\r\n RecordType = Record<string, unknown>,\r\n> {\r\n value:\r\n | ListTableRenderResult<RecordType>\r\n | ListTableRenderResult<RecordType>[];\r\n}\r\n\r\n/**\r\n * 可见数据行定义。\r\n */\r\nexport interface ListTableVisibleDataRow<RecordType = Record<string, unknown>> {\r\n kind: \"data\";\r\n record: RecordType;\r\n rowKey: ListTableRowKey;\r\n dataRowIndex: number;\r\n depth: number;\r\n parentRowKey: ListTableRowKey | null;\r\n indexPath: number[];\r\n hasChildren: boolean;\r\n expanded: boolean;\r\n expandable: boolean;\r\n}\r\n\r\n/**\r\n * 可见详情占位行定义。\r\n */\r\nexport interface ListTableVisibleExpandedRow<\r\n RecordType = Record<string, unknown>,\r\n> {\r\n kind: \"expanded\";\r\n record: RecordType;\r\n rowKey: string;\r\n ownerRowKey: ListTableRowKey;\r\n ownerDataRowIndex: number;\r\n height?: number;\r\n depth: number;\r\n parentRowKey: ListTableRowKey | null;\r\n content: ListTableExpandedRowContent<RecordType>;\r\n}\r\n\r\n/**\r\n * 展开能力下的可见行定义。\r\n */\r\nexport type ListTableVisibleRow<RecordType = Record<string, unknown>> =\r\n | ListTableVisibleDataRow<RecordType>\r\n | ListTableVisibleExpandedRow<RecordType>;\r\n\r\nconst visibleRowsCache = new WeakMap<\r\n object,\r\n {\r\n optionsRef: object;\r\n expandedRowKeysSignature: string;\r\n rowKey: unknown;\r\n visibleRows: ListTableVisibleRow<unknown>[];\r\n }\r\n>();\r\nconst expandedVisibleRowsCache = new WeakMap<object, boolean>();\r\n\r\n/**\r\n * 解析受控/非受控展开状态。\r\n */\r\nexport function resolveExpandableState<RecordType>(params: {\r\n expandable?: ListTableOptions<RecordType>[\"expandable\"];\r\n}) {\r\n const expandable = params.expandable;\r\n if (expandable?.expandedRowKeys !== undefined) {\r\n return {\r\n expandedRowKeys: [...expandable.expandedRowKeys],\r\n isControlled: true,\r\n };\r\n }\r\n\r\n return {\r\n expandedRowKeys: [...(expandable?.defaultExpandedRowKeys ?? [])],\r\n isControlled: false,\r\n };\r\n}\r\n\r\n/**\r\n * 切换展开键集合。\r\n */\r\nexport function toggleExpandedRowKey(\r\n expandedRowKeys: Array<string | number>,\r\n rowKey: string | number,\r\n) {\r\n if (expandedRowKeys.includes(rowKey)) {\r\n return expandedRowKeys.filter((key) => key !== rowKey);\r\n }\r\n\r\n return [...expandedRowKeys, rowKey];\r\n}\r\n\r\n/**\r\n * 根据可见行解析下一次展开切换结果。\r\n */\r\nexport function resolveExpandedRowToggle<RecordType>(params: {\r\n visibleRows: ListTableVisibleRow<RecordType>[];\r\n expandedRowKeys: Array<string | number>;\r\n rowIndex: number;\r\n}) {\r\n const targetRow = params.visibleRows.find(\r\n (row): row is Extract<ListTableVisibleRow<RecordType>, { kind: \"data\" }> =>\r\n row.kind === \"data\" && row.dataRowIndex === params.rowIndex,\r\n );\r\n if (!targetRow || !targetRow.expandable) {\r\n return null;\r\n }\r\n\r\n const nextExpandedRowKeys = toggleExpandedRowKey(\r\n params.expandedRowKeys,\r\n targetRow.rowKey,\r\n );\r\n return {\r\n row: targetRow,\r\n expanded: nextExpandedRowKeys.includes(targetRow.rowKey),\r\n nextExpandedRowKeys,\r\n };\r\n}\r\n\r\n/**\r\n * 解析查询动作触发后的展开态清空结果。\r\n */\r\nexport function resolveExpandedRowsReset<RecordType>(params: {\r\n expandedRowKeys: Array<string | number>;\r\n expandable?: ListTableOptions<RecordType>[\"expandable\"];\r\n}) {\r\n const { expandedRowKeys, expandable } = params;\r\n const nextExpandedRowKeys: Array<string | number> = [];\r\n const changed = expandedRowKeys.length > 0;\r\n\r\n return {\r\n nextExpandedRowKeys,\r\n changed,\r\n shouldSetState: changed && expandable?.expandedRowKeys === undefined,\r\n shouldNotify:\r\n changed &&\r\n expandable?.expandedRowKeys !== undefined &&\r\n typeof expandable.onExpandedRowsChange === \"function\",\r\n };\r\n}\r\n\r\n/**\r\n * 将原始数据拍平成可见行。\r\n */\r\nexport function flattenExpandableRows<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n rows: RecordType[];\r\n expandedRowKeys: Array<string | number>;\r\n}) {\r\n const { options, rows, expandedRowKeys } = params;\r\n const expandedRowKeysSignature = expandedRowKeys.join(\"|\");\r\n const cached = visibleRowsCache.get(rows as object);\r\n if (\r\n cached &&\r\n cached.optionsRef === options &&\r\n cached.rowKey === options.rowKey &&\r\n cached.expandedRowKeysSignature === expandedRowKeysSignature\r\n ) {\r\n return cached.visibleRows as ListTableVisibleRow<RecordType>[];\r\n }\r\n\r\n const expandable = options.expandable;\r\n if (!expandable) {\r\n return cacheVisibleRows({\r\n rows,\r\n options,\r\n expandedRowKeysSignature,\r\n visibleRows: resolvePlainVisibleRows(options, rows),\r\n hasExpandedRows: false,\r\n });\r\n }\r\n\r\n if (canUseLazyExpandedDetailFastPath(options, rows, expandedRowKeys)) {\r\n return cacheVisibleRows({\r\n rows,\r\n options,\r\n expandedRowKeysSignature,\r\n visibleRows: resolvePlainVisibleRows(options, rows, {\r\n expandable: true,\r\n }),\r\n hasExpandedRows: false,\r\n });\r\n }\r\n\r\n const visibleRows: ListTableVisibleRow<RecordType>[] = [];\r\n let hasExpandedRows = false;\r\n const expandedKeySet = new Set(expandedRowKeys);\r\n const childrenColumnName = expandable?.childrenColumnName ?? \"children\";\r\n let dataRowIndex = 0;\r\n\r\n const visitRows = (\r\n currentRows: RecordType[],\r\n depth: number,\r\n parentRowKey: ListTableRowKey | null,\r\n parentPath: number[],\r\n ) => {\r\n currentRows.forEach((record, index) => {\r\n const currentDataRowIndex = dataRowIndex;\r\n dataRowIndex += 1;\r\n const rowIndex = currentDataRowIndex;\r\n const rowKey = getRowKey(options, record, rowIndex);\r\n const children = getChildRows(record, childrenColumnName);\r\n const hasChildren = children.length > 0;\r\n const allowExpand = expandable?.rowExpandable?.(record) ?? true;\r\n const expandedContent = resolveExpandedContent(\r\n expandable,\r\n record,\r\n rowIndex,\r\n );\r\n const canExpand = allowExpand && (hasChildren || expandedContent != null);\r\n const expanded = canExpand && expandedKeySet.has(rowKey);\r\n const indexPath = [...parentPath, index];\r\n\r\n visibleRows.push({\r\n kind: \"data\",\r\n record,\r\n rowKey,\r\n dataRowIndex: currentDataRowIndex,\r\n depth,\r\n parentRowKey,\r\n indexPath,\r\n hasChildren,\r\n expanded,\r\n expandable: canExpand,\r\n });\r\n\r\n if (expanded && expandedContent != null) {\r\n hasExpandedRows = true;\r\n visibleRows.push({\r\n kind: \"expanded\",\r\n record,\r\n rowKey: `${String(rowKey)}::__expanded__`,\r\n ownerRowKey: rowKey,\r\n ownerDataRowIndex: currentDataRowIndex,\r\n height: resolveExpandedRowHeight(expandable, record, rowIndex),\r\n depth: depth + 1,\r\n parentRowKey: rowKey,\r\n content: {\r\n value: expandedContent,\r\n },\r\n });\r\n }\r\n\r\n if (expanded && hasChildren && allowExpand) {\r\n visitRows(children, depth + 1, rowKey, indexPath);\r\n }\r\n });\r\n };\r\n\r\n visitRows(rows, 0, null, []);\r\n return cacheVisibleRows({\r\n rows,\r\n options,\r\n expandedRowKeysSignature,\r\n visibleRows,\r\n hasExpandedRows,\r\n });\r\n}\r\n\r\n/**\r\n * 判断可见行是否包含变高的展开详情行。\r\n */\r\nexport function hasExpandedVisibleRows<RecordType>(\r\n rows: ListTableVisibleRow<RecordType>[],\r\n) {\r\n const cached = expandedVisibleRowsCache.get(rows);\r\n if (cached != null) {\r\n return cached;\r\n }\r\n\r\n const hasExpandedRows = rows.some((row) => row.kind === \"expanded\");\r\n expandedVisibleRowsCache.set(rows, hasExpandedRows);\r\n return hasExpandedRows;\r\n}\r\n\r\nfunction resolvePlainVisibleRows<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n rows: RecordType[],\r\n config?: {\r\n expandable?: boolean;\r\n },\r\n) {\r\n return rows.map((record, index) => ({\r\n kind: \"data\" as const,\r\n record,\r\n rowKey: getRowKey(options, record, index),\r\n dataRowIndex: index,\r\n depth: 0,\r\n parentRowKey: null,\r\n indexPath: [index],\r\n hasChildren: false,\r\n expanded: false,\r\n expandable: config?.expandable ?? false,\r\n }));\r\n}\r\n\r\nfunction canUseLazyExpandedDetailFastPath<RecordType>(\r\n options: ListTableOptions<RecordType>,\r\n rows: RecordType[],\r\n expandedRowKeys: Array<string | number>,\r\n) {\r\n const expandable = options.expandable;\r\n if (\r\n !expandable?.expandedRowRender ||\r\n expandedRowKeys.length > 0 ||\r\n typeof expandable.rowExpandable === \"function\"\r\n ) {\r\n return false;\r\n }\r\n\r\n if (rows.length === 0) {\r\n return true;\r\n }\r\n\r\n const firstRow = rows[0];\r\n return firstRow == null || typeof firstRow !== \"object\";\r\n}\r\n\r\nfunction cacheVisibleRows<RecordType>(params: {\r\n rows: RecordType[];\r\n options: ListTableOptions<RecordType>;\r\n expandedRowKeysSignature: string;\r\n visibleRows: ListTableVisibleRow<RecordType>[];\r\n hasExpandedRows: boolean;\r\n}) {\r\n visibleRowsCache.set(params.rows as object, {\r\n optionsRef: params.options,\r\n expandedRowKeysSignature: params.expandedRowKeysSignature,\r\n rowKey: params.options.rowKey,\r\n visibleRows: params.visibleRows as ListTableVisibleRow<unknown>[],\r\n });\r\n expandedVisibleRowsCache.set(params.visibleRows, params.hasExpandedRows);\r\n\r\n return params.visibleRows;\r\n}\r\n\r\nfunction getChildRows<RecordType>(\r\n record: RecordType,\r\n childrenColumnName: string,\r\n) {\r\n const value = (record as Record<string, unknown>)[childrenColumnName];\r\n return Array.isArray(value) ? (value as RecordType[]) : [];\r\n}\r\n\r\nfunction resolveExpandedContent<RecordType>(\r\n expandable: ListTableOptions<RecordType>[\"expandable\"] | undefined,\r\n record: RecordType,\r\n index: number,\r\n) {\r\n const value = expandable?.expandedRowRender?.(record, index);\r\n if (value == null) {\r\n return null;\r\n }\r\n\r\n if (Array.isArray(value) && value.length === 0) {\r\n return null;\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction resolveExpandedRowHeight<RecordType>(\r\n expandable: ListTableOptions<RecordType>[\"expandable\"] | undefined,\r\n record: RecordType,\r\n index: number,\r\n) {\r\n const expandedRowHeight = expandable?.expandedRowHeight;\r\n const height =\r\n typeof expandedRowHeight === \"function\"\r\n ? expandedRowHeight(record, index)\r\n : expandedRowHeight;\r\n\r\n return typeof height === \"number\" && Number.isFinite(height) && height > 0\r\n ? height\r\n : undefined;\r\n}\r\n","import type { ListTableVisibleRow } from \"../../services/expandable-service\";\r\nimport { hasExpandedVisibleRows } from \"../../services/expandable-service\";\r\n\r\n/**\r\n * 获取可见行实际行高。\r\n */\r\nexport function getVisibleRowHeight<RecordType>(\r\n row: ListTableVisibleRow<RecordType> | undefined,\r\n baseRowHeight: number,\r\n) {\r\n if (row?.kind === \"expanded\" && typeof row.height === \"number\") {\r\n return row.height;\r\n }\r\n\r\n return baseRowHeight;\r\n}\r\n\r\n/**\r\n * 计算指定可见行区间的累计高度。\r\n */\r\nexport function sumVisibleRowHeights<RecordType>(params: {\r\n rows: Array<ListTableVisibleRow<RecordType>>;\r\n rowHeight: number;\r\n start?: number;\r\n end?: number;\r\n}) {\r\n const start = Math.max(params.start ?? 0, 0);\r\n const end = Math.min(params.end ?? params.rows.length, params.rows.length);\r\n if (!hasExpandedVisibleRows(params.rows)) {\r\n return Math.max(end - start, 0) * params.rowHeight;\r\n }\r\n let height = 0;\r\n\r\n for (let index = start; index < end; index += 1) {\r\n height += getVisibleRowHeight(params.rows[index], params.rowHeight);\r\n }\r\n\r\n return height;\r\n}\r\n","import type { ScrollState } from \"../../schema/state\";\r\nimport type { BodyLayout } from \"../../domain/rows/body-layout\";\r\nimport type { FrozenRowLayout, RowSection } from \"../../domain/rows/frozen-rows\";\r\nimport { getVisibleRowHeight } from \"../../domain/rows/row-height\";\r\nimport type { ListTableVisibleRow } from \"../../services/expandable-service\";\r\nimport { hasExpandedVisibleRows } from \"../../services/expandable-service\";\r\n\r\nexport interface VisibleRowRange {\r\n start: number;\r\n end: number;\r\n}\r\n\r\n/**\r\n * 计算指定区段在当前滚动偏移下的可见行范围。\r\n */\r\nexport function resolveVisibleSectionRowRange(params: {\r\n rowCount: number;\r\n rowHeight: number;\r\n bodyHeight: number;\r\n scrollTop: number;\r\n rows?: Array<ListTableVisibleRow<unknown>>;\r\n}): VisibleRowRange {\r\n const { rowCount, rowHeight, bodyHeight, scrollTop, rows } = params;\r\n if (rowCount <= 0 || rowHeight <= 0 || bodyHeight <= 0) {\r\n return {\r\n start: 0,\r\n end: 0,\r\n };\r\n }\r\n\r\n if (rows?.length && hasExpandedVisibleRows(rows)) {\r\n let start = 0;\r\n let offset = 0;\r\n while (start < rowCount) {\r\n const nextOffset = offset + getVisibleRowHeight(rows[start], rowHeight);\r\n if (nextOffset > scrollTop) {\r\n break;\r\n }\r\n offset = nextOffset;\r\n start += 1;\r\n }\r\n\r\n let end = start;\r\n let visibleHeight = offset - scrollTop;\r\n while (end < rowCount && visibleHeight < bodyHeight + rowHeight) {\r\n visibleHeight += getVisibleRowHeight(rows[end], rowHeight);\r\n end += 1;\r\n }\r\n\r\n return {\r\n start,\r\n end: Math.min(end, rowCount),\r\n };\r\n }\r\n\r\n const start = Math.max(Math.floor(scrollTop / rowHeight), 0);\r\n const visibleRowCount = Math.ceil(bodyHeight / rowHeight) + 1;\r\n return {\r\n start,\r\n end: Math.min(start + visibleRowCount, rowCount),\r\n };\r\n}\r\n\r\n/**\r\n * 遍历当前快照中真正参与渲染的可见行。\r\n */\r\nexport function forEachVisibleSnapshotRow<RecordType>(\r\n params: {\r\n frozenRows: FrozenRowLayout<ListTableVisibleRow<RecordType>>;\r\n bodyLayout: BodyLayout;\r\n rowHeight: number;\r\n scroll: ScrollState;\r\n },\r\n visitor: (record: RecordType, rowIndex: number) => void,\r\n) {\r\n const { frozenRows, bodyLayout, rowHeight, scroll } = params;\r\n\r\n forEachSectionRow(\r\n frozenRows.top,\r\n resolveVisibleSectionRowRange({\r\n rowCount: frozenRows.top.rows.length,\r\n rowHeight,\r\n bodyHeight: bodyLayout.topFrozenHeight,\r\n scrollTop: 0,\r\n rows: frozenRows.top.rows as Array<ListTableVisibleRow<unknown>>,\r\n }),\r\n visitor,\r\n );\r\n forEachSectionRow(\r\n frozenRows.scroll,\r\n resolveVisibleSectionRowRange({\r\n rowCount: frozenRows.scroll.rows.length,\r\n rowHeight,\r\n bodyHeight: bodyLayout.scrollBodyHeight,\r\n scrollTop: scroll.top,\r\n rows: frozenRows.scroll.rows as Array<ListTableVisibleRow<unknown>>,\r\n }),\r\n visitor,\r\n );\r\n forEachSectionRow(\r\n frozenRows.bottom,\r\n resolveVisibleSectionRowRange({\r\n rowCount: frozenRows.bottom.rows.length,\r\n rowHeight,\r\n bodyHeight: bodyLayout.bottomFrozenHeight,\r\n scrollTop: 0,\r\n rows: frozenRows.bottom.rows as Array<ListTableVisibleRow<unknown>>,\r\n }),\r\n visitor,\r\n );\r\n}\r\n\r\nfunction forEachSectionRow<RecordType>(\r\n section: RowSection<ListTableVisibleRow<RecordType>>,\r\n range: VisibleRowRange,\r\n visitor: (record: RecordType, rowIndex: number) => void,\r\n) {\r\n for (let rowIndex = range.start; rowIndex < range.end; rowIndex += 1) {\r\n const row = section.rows[rowIndex];\r\n if (!row || row.kind !== \"data\") {\r\n continue;\r\n }\r\n\r\n visitor(row.record, row.dataRowIndex);\r\n }\r\n}\r\n\r\n/**\r\n * 遍历当前快照中真正参与渲染的可见行(含展开行)。\r\n */\r\nexport function forEachRenderedVisibleRow<RecordType>(\r\n snapshot: {\r\n frozenRows: FrozenRowLayout<ListTableVisibleRow<RecordType>>;\r\n bodyLayout: BodyLayout;\r\n rowHeight: number;\r\n scroll: ScrollState;\r\n },\r\n visitor: (\r\n row: ListTableVisibleRow<RecordType>,\r\n visibleRowIndex: number,\r\n ) => void,\r\n) {\r\n const visitSection = (\r\n section: RowSection<ListTableVisibleRow<RecordType>>,\r\n range: VisibleRowRange,\r\n ) => {\r\n for (let rowIndex = range.start; rowIndex < range.end; rowIndex += 1) {\r\n const row = section.rows[rowIndex];\r\n const visibleRowIndex = section.rowIndexMap?.[rowIndex] ?? rowIndex;\r\n if (!row) {\r\n continue;\r\n }\r\n\r\n visitor(row, visibleRowIndex);\r\n }\r\n };\r\n\r\n visitSection(snapshot.frozenRows.top, {\r\n start: 0,\r\n end: snapshot.frozenRows.top.rows.length,\r\n });\r\n visitSection(\r\n snapshot.frozenRows.scroll,\r\n resolveVisibleSectionRowRange({\r\n rowCount: snapshot.frozenRows.scroll.rows.length,\r\n rowHeight: snapshot.rowHeight,\r\n bodyHeight: snapshot.bodyLayout.scrollBodyHeight,\r\n scrollTop: snapshot.scroll.top,\r\n rows: snapshot.frozenRows.scroll.rows as Array<\r\n ListTableVisibleRow<unknown>\r\n >,\r\n }),\r\n );\r\n visitSection(snapshot.frozenRows.bottom, {\r\n start: 0,\r\n end: snapshot.frozenRows.bottom.rows.length,\r\n });\r\n}\r\n\r\n/**\r\n * 捕获当前已渲染可见行的位置索引。\r\n */\r\nexport function captureRenderedVisibleRowPositions<RecordType>(\r\n snapshot: {\r\n frozenRows: FrozenRowLayout<ListTableVisibleRow<RecordType>>;\r\n bodyLayout: BodyLayout;\r\n rowHeight: number;\r\n scroll: ScrollState;\r\n } | null,\r\n) {\r\n if (!snapshot) {\r\n return null;\r\n }\r\n\r\n const positions = new Map<string, number>();\r\n forEachRenderedVisibleRow(snapshot, (row, index) => {\r\n positions.set(String(row.rowKey), index);\r\n });\r\n return positions;\r\n}\r\n","import type { CellControlAnimationState } from \"../../domain/types\";\r\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\r\nimport { resolveVisibleSectionRowRange } from \"../../rendering/pipeline/visible-row\";\nimport type { ListTableVisibleRow } from \"../../services/expandable-service\";\r\n\r\n/**\r\n * 控制动画缓存 key。\r\n */\r\nexport function getControlAnimationKey(\r\n rowKey: string | number,\r\n columnKey: string,\r\n contentIndex: number,\r\n) {\r\n return `${rowKey}::${columnKey}::${contentIndex}`;\r\n}\r\n\r\n/**\r\n * 嵌套表格高亮缓存 key。\r\n */\r\nexport function getNestedTableHighlightKey(\r\n rowIndex: number,\r\n columnKey: string,\r\n contentIndex: number,\r\n) {\r\n return `${rowIndex}::${columnKey}::${contentIndex}`;\r\n}\r\n\r\n/**\r\n * easeOutQuad 插值。\r\n */\r\nexport function getAnimationValue(\r\n animation: CellControlAnimationState,\r\n now: number,\r\n) {\r\n const elapsed = Math.max(now - animation.startTime, 0);\r\n const progress = Math.min(elapsed / animation.duration, 1);\r\n const eased = 1 - (1 - progress) * (1 - progress);\r\n return animation.from + (animation.to - animation.from) * eased;\r\n}\r\n\r\n/**\r\n * easeInOutQuad 插值,用于行展开/折叠。\r\n */\r\nexport function getRowAnimationValue(\r\n animation: CellControlAnimationState,\r\n now: number,\r\n) {\r\n const elapsed = Math.max(now - animation.startTime, 0);\r\n const progress = Math.min(elapsed / animation.duration, 1);\r\n const eased =\r\n progress < 0.5\r\n ? 2 * progress * progress\r\n : 1 - Math.pow(-2 * progress + 2, 2) / 2;\r\n return animation.from + (animation.to - animation.from) * eased;\r\n}\r\n\r\n/**\r\n * 将进度条内容解析为 0~1 的归一化值。\r\n */\r\nexport function resolveProgressAnimationValue(content: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n}) {\r\n const min = content.min ?? 0;\r\n const max = content.max ?? 100;\r\n const range = max - min;\r\n if (range <= 0) {\r\n return 0;\r\n }\r\n return Math.min(Math.max((content.value - min) / range, 0), 1);\r\n}\r\n\r\n/**\r\n * 由当前可见窗口生成控制动画对账 key。\r\n */\r\nexport function buildControlAnimationWindowKey<RecordType>(\r\n snapshot: Pick<\r\n ListTableRenderSnapshot<RecordType>,\r\n \"frozenRows\" | \"rowHeight\" | \"bodyLayout\" | \"scroll\"\r\n >,\r\n) {\r\n const topRange = resolveVisibleSectionRowRange({\r\n rowCount: snapshot.frozenRows.top.rows.length,\r\n rowHeight: snapshot.rowHeight,\r\n bodyHeight: snapshot.bodyLayout.topFrozenHeight,\r\n scrollTop: 0,\r\n rows: snapshot.frozenRows.top.rows as Array<ListTableVisibleRow<unknown>>,\r\n });\r\n const scrollRange = resolveVisibleSectionRowRange({\r\n rowCount: snapshot.frozenRows.scroll.rows.length,\r\n rowHeight: snapshot.rowHeight,\r\n bodyHeight: snapshot.bodyLayout.scrollBodyHeight,\r\n scrollTop: snapshot.scroll.top,\r\n rows: snapshot.frozenRows.scroll.rows as Array<\r\n ListTableVisibleRow<unknown>\r\n >,\r\n });\r\n const bottomRange = resolveVisibleSectionRowRange({\r\n rowCount: snapshot.frozenRows.bottom.rows.length,\r\n rowHeight: snapshot.rowHeight,\r\n bodyHeight: snapshot.bodyLayout.bottomFrozenHeight,\r\n scrollTop: 0,\r\n rows: snapshot.frozenRows.bottom.rows as Array<\r\n ListTableVisibleRow<unknown>\r\n >,\r\n });\r\n\r\n return [\r\n `${topRange.start}-${topRange.end}`,\r\n `${scrollRange.start}-${scrollRange.end}`,\r\n `${bottomRange.start}-${bottomRange.end}`,\r\n ].join(\"|\");\r\n}\r\n\r\n/**\r\n * 由当前叶子列生成控制动画列签名。\r\n */\r\nexport function buildControlAnimationColumnKey<RecordType>(\r\n columns: Array<Pick<InternalLeafColumn<RecordType>, \"key\">>,\r\n) {\r\n return columns.map((column) => column.key).join(\"|\");\r\n}\r\n\r\n/**\r\n * 判断控制动画是否需要根据当前快照重新对账。\r\n */\r\nexport function shouldReconcileControlAnimations(params: {\r\n rowsRef: unknown;\r\n windowKey: string | null;\r\n columnKey: string | null;\r\n displayRows: unknown;\r\n nextWindowKey: string;\r\n nextColumnKey: string;\r\n}) {\r\n return !(\r\n params.rowsRef === params.displayRows &&\r\n params.windowKey === params.nextWindowKey &&\r\n params.columnKey === params.nextColumnKey\r\n );\r\n}\r\n\r\n/**\r\n * 清理已结束的动画条目。\r\n */\r\nexport function pruneFinishedAnimations(\r\n animations: Map<string, CellControlAnimationState>,\r\n now: number,\r\n) {\r\n Array.from(animations.entries()).forEach(([key, animation]) => {\r\n if (now - animation.startTime >= animation.duration) {\r\n animations.delete(key);\r\n }\r\n });\r\n}\r\n","/**\r\n * 折叠单元格高度动画缓存 key。\r\n */\r\nexport function getCollapseCellAnimationKey(\r\n rowIndex: number,\r\n columnKey: string,\r\n) {\r\n return `${rowIndex}::${columnKey}`;\r\n}\r\n\r\n/**\r\n * 解析折叠动作覆盖的行区间。\r\n * 若当前点击行落在已选行高亮区间内,则折叠整段选区。\r\n */\r\nexport function resolveCollapsedRowRange(params: {\r\n rowIndex: number;\r\n selectedRowRange: { start: number; end: number } | null | undefined;\r\n}) {\r\n const { rowIndex, selectedRowRange } = params;\r\n if (\r\n selectedRowRange &&\r\n rowIndex >= selectedRowRange.start &&\r\n rowIndex <= selectedRowRange.end\r\n ) {\r\n return selectedRowRange;\r\n }\r\n\r\n return {\r\n start: rowIndex,\r\n end: rowIndex,\r\n };\r\n}\r\n","import { advanceColumnReorderAnimation } from \"../../features/column-reorder/column-reorder-feature\";\r\nimport {\r\n advanceScrollbarOpacityStep,\r\n resolveScrollbarOpacitySync,\r\n} from \"../../shared/animations/scrollbar-opacity\";\r\nimport type { CellControlAnimationState, SwapAnimationState } from \"../../domain/types\";\r\nimport type { ScrollState } from \"../../schema/state\";\r\nimport type { NestedTableHighlightState } from \"../../rendering/cell-content/types\";\r\nimport type { DebugHitTestResult } from \"../../debug/debug-snapshot\";\r\nimport { resolveBodyCellContents } from \"../../rendering/cell-content/cell-content-renderer\";\r\nimport {\r\n createListTableAnimationRuntime,\r\n type ListTableAnimationRuntime,\r\n} from \"../runtime\";\r\nimport {\r\n ListTableScrollAnimationController,\r\n type ListTableAnimationScheduler,\r\n} from \"./scroll-animation-controller\";\r\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\r\nimport {\r\n forEachRenderedVisibleRow,\r\n forEachVisibleSnapshotRow,\r\n} from \"../../rendering/pipeline/visible-row\";\nimport {\r\n buildControlAnimationColumnKey,\r\n buildControlAnimationWindowKey,\r\n getAnimationValue,\r\n getControlAnimationKey,\r\n getNestedTableHighlightKey,\r\n getRowAnimationValue,\r\n pruneFinishedAnimations,\r\n resolveProgressAnimationValue,\r\n shouldReconcileControlAnimations,\r\n} from \"../../shared/animations/control-animation\";\r\nimport { getCollapseCellAnimationKey } from \"../../shared/animations/collapse-animation\";\r\n\r\nconst ROW_EXPAND_ANIMATION_DURATION = 240;\r\nexport type { ListTableAnimationScheduler };\r\n\r\nexport interface ListTableAnimationControllerOptions<RecordType> {\r\n runtime?: ListTableAnimationRuntime<RecordType>;\r\n getScrollbarVisibleOption: () => boolean | undefined;\r\n isScrollbarVisible: () => boolean;\r\n getScroll?: () => ScrollState;\r\n setScroll?: (scroll: ScrollState) => void;\r\n applyScroll?: (scroll: ScrollState) => boolean;\r\n getRowKey?: (record: RecordType, rowIndex: number) => string | number;\r\n requestRender: () => void;\r\n onScrollPageLoad?: () => void;\r\n onScrollbarActive?: () => void;\r\n scheduler?: ListTableAnimationScheduler;\r\n}\r\n\r\n/**\r\n * 协调 ListTable 的动画状态与 frame loop。\r\n */\r\nexport class ListTableAnimationController<RecordType> {\r\n private readonly runtime: ListTableAnimationRuntime<RecordType>;\r\n private readonly getScrollbarVisibleOption: () => boolean | undefined;\r\n private readonly isScrollbarVisible: () => boolean;\r\n private readonly getScroll: () => ScrollState;\r\n private readonly setScroll: (scroll: ScrollState) => void;\r\n private readonly applyScroll: (scroll: ScrollState) => boolean;\r\n private readonly getRowKey: (\r\n record: RecordType,\r\n rowIndex: number,\r\n ) => string | number;\r\n private readonly requestRender: () => void;\r\n private readonly onScrollPageLoad: () => void;\r\n private readonly onScrollbarActive: () => void;\r\n private readonly scheduler: ListTableAnimationScheduler;\r\n private readonly scrollAnimationController: ListTableScrollAnimationController<RecordType>;\r\n\r\n constructor(options: ListTableAnimationControllerOptions<RecordType>) {\r\n this.runtime = options.runtime ?? createListTableAnimationRuntime();\r\n this.getScrollbarVisibleOption = options.getScrollbarVisibleOption;\r\n this.isScrollbarVisible = options.isScrollbarVisible;\r\n this.getScroll = options.getScroll ?? (() => ({ left: 0, top: 0 }));\r\n this.setScroll = options.setScroll ?? (() => undefined);\r\n this.applyScroll =\r\n options.applyScroll ??\r\n ((scroll) => {\r\n this.setScroll(scroll);\r\n return true;\r\n });\r\n this.getRowKey = options.getRowKey ?? ((_record, rowIndex) => rowIndex);\r\n this.requestRender = options.requestRender;\r\n this.onScrollPageLoad = options.onScrollPageLoad ?? (() => undefined);\r\n this.onScrollbarActive = options.onScrollbarActive ?? (() => undefined);\r\n this.scheduler = options.scheduler ?? createDefaultAnimationScheduler();\r\n this.scrollAnimationController = new ListTableScrollAnimationController({\r\n runtime: this.runtime,\r\n scheduler: this.scheduler,\r\n getScroll: this.getScroll,\r\n setScroll: this.setScroll,\r\n applyScroll: this.applyScroll,\r\n requestRender: this.requestRender,\r\n onScrollPageLoad: this.onScrollPageLoad,\r\n markScrollbarActive: () => this.markScrollbarActive(),\r\n });\r\n }\r\n\r\n getScrollbarActiveUntil() {\r\n return this.runtime.scrollbarActiveUntil;\r\n }\r\n\r\n getScrollbarOpacity() {\r\n return this.runtime.scrollbarOpacity;\r\n }\r\n\r\n /**\r\n * 同步滚动条透明度目标,并在需要时启动淡入淡出。\r\n */\r\n syncScrollbarOpacity() {\r\n const visibleOption = this.getScrollbarVisibleOption();\r\n const next = resolveScrollbarOpacitySync({\r\n opacity: this.runtime.scrollbarOpacity,\r\n target: this.runtime.scrollbarOpacityTarget,\r\n visible:\r\n typeof visibleOption === \"boolean\"\r\n ? visibleOption\r\n : this.isScrollbarVisible(),\r\n visibleOption,\r\n hasAnimationFrame: this.runtime.scrollbarOpacityFrameId != null,\r\n });\r\n\r\n this.runtime.scrollbarOpacity = next.opacity;\r\n this.runtime.scrollbarOpacityTarget = next.target;\r\n if (next.shouldStopAnimation) {\r\n this.stopScrollbarOpacityAnimation();\r\n } else if (next.shouldStartAnimation) {\r\n this.ensureScrollbarOpacityAnimation();\r\n }\r\n return this.runtime.scrollbarOpacity;\r\n }\r\n\r\n markScrollbarActive(duration = 900) {\r\n this.runtime.scrollbarActiveUntil = this.scheduler.dateNow() + duration;\r\n if (this.runtime.scrollbarHideTimer != null) {\r\n this.scheduler.clearTimeout(this.runtime.scrollbarHideTimer);\r\n }\r\n // 立即朝可见态过渡,避免首次出现时硬切。\r\n this.runtime.scrollbarOpacityTarget = 1;\r\n this.ensureScrollbarOpacityAnimation();\r\n this.runtime.scrollbarHideTimer = this.scheduler.setTimeout(() => {\r\n this.runtime.scrollbarHideTimer = null;\r\n // 到期后根据最新状态决定是否淡出。\r\n this.syncScrollbarOpacity();\r\n if (this.runtime.scrollbarOpacity > 0.001 || this.isScrollbarVisible()) {\r\n this.requestRender();\r\n }\r\n }, duration + 16);\r\n this.onScrollbarActive();\r\n }\r\n\r\n stopScrollbarOpacityAnimation() {\r\n if (this.runtime.scrollbarOpacityFrameId != null) {\r\n this.scheduler.cancelAnimationFrame(this.runtime.scrollbarOpacityFrameId);\r\n this.runtime.scrollbarOpacityFrameId = null;\r\n }\r\n this.runtime.scrollbarOpacityLastTime = 0;\r\n }\r\n\r\n getSwapAnimation() {\r\n return this.runtime.swapAnimation;\r\n }\r\n\r\n startSwapAnimation(animation: SwapAnimationState | null) {\r\n this.runtime.swapAnimation = animation;\r\n if (!animation) {\r\n this.stopSwapAnimationFrame();\r\n return;\r\n }\r\n this.requestRender();\r\n this.ensureSwapAnimationFrame();\r\n }\r\n\r\n startSwapColumnAnimation(\r\n columns: Map<string, { from: number; to: number }>,\r\n duration = 220,\r\n ) {\r\n this.startSwapAnimation({\r\n columns,\r\n startTime: this.scheduler.now(),\r\n duration,\r\n });\r\n }\r\n\r\n stopSwapAnimation() {\r\n this.stopSwapAnimationFrame();\r\n this.runtime.swapAnimation = null;\r\n }\r\n\r\n startScrollToAnimation(params: {\r\n targetLeft: number;\r\n targetTop: number;\r\n duration?: number;\r\n onComplete?: () => void;\r\n }) {\r\n this.scrollAnimationController.startScrollToAnimation(params);\r\n }\r\n\r\n stopScrollToAnimation() {\r\n this.scrollAnimationController.stopScrollToAnimation();\r\n }\r\n\r\n getWheelScrollTarget() {\r\n return this.scrollAnimationController.getWheelScrollTarget();\r\n }\r\n\r\n startWheelScrollSmoothing(target: ScrollState) {\r\n this.scrollAnimationController.startWheelScrollSmoothing(target);\r\n }\r\n\r\n stopWheelScrollSmoothing() {\r\n this.scrollAnimationController.stopWheelScrollSmoothing();\r\n }\r\n\r\n syncCarouselScroll(params: {\r\n enabled: boolean;\r\n interval: number | null;\r\n configKey: string | null;\r\n onTick: (interval: number) => void;\r\n }) {\r\n this.scrollAnimationController.syncCarouselScroll(params);\r\n }\r\n\r\n stopCarouselScroll() {\r\n this.scrollAnimationController.stopCarouselScroll();\r\n }\r\n\r\n stopCarouselScrollAnimation() {\r\n this.scrollAnimationController.stopCarouselScrollAnimation();\r\n }\r\n\r\n startCarouselScrollAnimation(params: {\r\n target: ScrollState;\r\n direction: \"vertical\" | \"horizontal\";\r\n interval: number;\r\n }) {\r\n this.scrollAnimationController.startCarouselScrollAnimation(params);\r\n }\r\n\r\n pauseCarouselScrollByPointer() {\r\n return this.scrollAnimationController.pauseCarouselScrollByPointer();\r\n }\r\n\r\n resumeCarouselScrollByPointer() {\r\n return this.scrollAnimationController.resumeCarouselScrollByPointer();\r\n }\r\n\r\n setPendingCollapseRowPositions(positions: Map<string, number> | null) {\r\n this.runtime.pendingCollapseRowPositions = positions;\r\n }\r\n\r\n reconcileCollapseAnimations(snapshot: ListTableRenderSnapshot<RecordType>) {\r\n const previousPositions = this.runtime.pendingCollapseRowPositions;\r\n if (!previousPositions) {\r\n return;\r\n }\r\n\r\n this.runtime.pendingCollapseRowPositions = null;\r\n const now = this.scheduler.now();\r\n forEachRenderedVisibleRow(snapshot, (row, nextIndex) => {\r\n const previousIndex = previousPositions.get(String(row.rowKey));\r\n if (typeof previousIndex !== \"number\" || previousIndex === nextIndex) {\r\n return;\r\n }\r\n\r\n const offset = (previousIndex - nextIndex) * snapshot.rowHeight;\r\n if (Math.abs(offset) < 0.001) {\r\n return;\r\n }\r\n\r\n this.runtime.collapseRowAnimations.set(String(row.rowKey), {\r\n from: offset,\r\n to: 0,\r\n startTime: now,\r\n duration: ROW_EXPAND_ANIMATION_DURATION,\r\n });\r\n });\r\n }\r\n\r\n reconcileExpandAnimations(params: {\r\n expandableEnabled: boolean;\r\n expandedRowKeys: Array<string | number>;\r\n }) {\r\n if (!params.expandableEnabled) {\r\n this.runtime.expandAnimations.clear();\r\n this.runtime.lastExpandedRowKeys.clear();\r\n return;\r\n }\r\n\r\n const now = this.scheduler.now();\r\n this.pruneFinishedExpandAnimations(now);\r\n const nextExpandedRowKeys = new Set(\r\n params.expandedRowKeys.map((rowKey) => String(rowKey)),\r\n );\r\n const changedRowKeys = new Set([\r\n ...this.runtime.lastExpandedRowKeys,\r\n ...nextExpandedRowKeys,\r\n ]);\r\n\r\n changedRowKeys.forEach((rowKey) => {\r\n const previousValue = this.runtime.lastExpandedRowKeys.has(rowKey)\r\n ? 1\r\n : 0;\r\n const nextValue = nextExpandedRowKeys.has(rowKey) ? 1 : 0;\r\n if (previousValue === nextValue) {\r\n return;\r\n }\r\n\r\n const activeAnimation = this.runtime.expandAnimations.get(rowKey);\r\n const from = activeAnimation\r\n ? getRowAnimationValue(activeAnimation, now)\r\n : previousValue;\r\n if (Math.abs(from - nextValue) < 0.001) {\r\n this.runtime.expandAnimations.delete(rowKey);\r\n return;\r\n }\r\n\r\n this.runtime.expandAnimations.set(rowKey, {\r\n from,\r\n to: nextValue,\r\n startTime: now,\r\n duration: ROW_EXPAND_ANIMATION_DURATION,\r\n });\r\n });\r\n\r\n this.runtime.lastExpandedRowKeys = nextExpandedRowKeys;\r\n }\r\n\r\n getExpandAnimationProgress(rowKey: string | number) {\r\n const animation = this.runtime.expandAnimations.get(String(rowKey));\r\n if (!animation) {\r\n return undefined;\r\n }\r\n\r\n return getRowAnimationValue(animation, this.scheduler.now());\r\n }\r\n\r\n getCollapseRowOffset(rowKey: string | number) {\r\n const animation = this.runtime.collapseRowAnimations.get(String(rowKey));\r\n if (!animation) {\r\n return undefined;\r\n }\r\n\r\n return getRowAnimationValue(animation, this.scheduler.now());\r\n }\r\n\r\n getCollapseCellHeight(params: { rowIndex: number; columnKey: string }) {\r\n const animation = this.runtime.collapseCellHeightAnimations.get(\r\n getCollapseCellAnimationKey(params.rowIndex, params.columnKey),\r\n );\r\n if (!animation) {\r\n return undefined;\r\n }\r\n\r\n return getRowAnimationValue(animation, this.scheduler.now());\r\n }\r\n\r\n setCollapseCellHeightAnimation(\r\n params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n } & CellControlAnimationState,\r\n ) {\r\n this.runtime.collapseCellHeightAnimations.set(\r\n getCollapseCellAnimationKey(params.rowIndex, params.columnKey),\r\n {\r\n from: params.from,\r\n to: params.to,\r\n startTime: params.startTime,\r\n duration: params.duration,\r\n },\r\n );\r\n }\r\n\r\n shouldReconcileControlAnimations(\r\n snapshot: ListTableRenderSnapshot<RecordType>,\r\n ) {\r\n return shouldReconcileControlAnimations({\r\n rowsRef: this.runtime.controlAnimationRowsRef,\r\n windowKey: this.runtime.controlAnimationWindowKey,\r\n columnKey: this.runtime.controlAnimationColumnKey,\r\n displayRows: snapshot.displayRows,\r\n nextWindowKey: buildControlAnimationWindowKey(snapshot),\r\n nextColumnKey: buildControlAnimationColumnKey(snapshot.leafColumns),\r\n });\r\n }\r\n\r\n reconcileControlAnimations(snapshot: ListTableRenderSnapshot<RecordType>) {\r\n const now = this.scheduler.now();\r\n this.pruneFinishedControlAnimations(now);\r\n const nextValues = new Map<string, number>();\r\n\r\n forEachVisibleSnapshotRow(\r\n {\r\n frozenRows: snapshot.frozenRows,\r\n bodyLayout: snapshot.bodyLayout,\r\n rowHeight: snapshot.rowHeight,\r\n scroll: snapshot.scroll,\r\n },\r\n (record, rowIndex) => {\r\n const rowKey = this.getRowKey(record, rowIndex);\r\n snapshot.leafColumns.forEach((column) => {\r\n const contents = resolveBodyCellContents({\r\n record,\r\n rowIndex,\r\n column,\r\n });\r\n contents.forEach((content, contentIndex) => {\r\n const isProgress = content.type === \"progress\";\r\n const isAnimatedControl =\r\n content.type === \"checkbox\" ||\r\n content.type === \"radio\" ||\r\n content.type === \"switch\";\r\n if (!isProgress && !isAnimatedControl) {\r\n return;\r\n }\r\n\r\n const controlKey = getControlAnimationKey(\r\n rowKey,\r\n column.key,\r\n contentIndex,\r\n );\r\n const nextValue =\r\n content.type === \"progress\"\r\n ? resolveProgressAnimationValue(content)\r\n : content.checked\r\n ? 1\r\n : 0;\r\n nextValues.set(controlKey, nextValue);\r\n const previousValue =\r\n this.runtime.lastControlValues.get(controlKey);\r\n if (\r\n typeof previousValue !== \"number\" ||\r\n Math.abs(previousValue - nextValue) < 0.001\r\n ) {\r\n return;\r\n }\r\n\r\n const activeAnimation =\r\n this.runtime.controlAnimations.get(controlKey);\r\n const from = activeAnimation\r\n ? getAnimationValue(activeAnimation, now)\r\n : previousValue;\r\n const to = nextValue;\r\n if (Math.abs(from - to) < 0.001) {\r\n this.runtime.controlAnimations.delete(controlKey);\r\n return;\r\n }\r\n\r\n this.runtime.controlAnimations.set(controlKey, {\r\n from,\r\n to,\r\n startTime: now,\r\n duration: 180,\r\n });\r\n });\r\n });\r\n },\r\n );\r\n\r\n this.runtime.lastControlValues = nextValues;\r\n this.runtime.controlAnimationRowsRef = snapshot.displayRows;\r\n this.runtime.controlAnimationWindowKey =\r\n buildControlAnimationWindowKey(snapshot);\r\n this.runtime.controlAnimationColumnKey = buildControlAnimationColumnKey(\r\n snapshot.leafColumns,\r\n );\r\n Array.from(this.runtime.controlAnimations.keys()).forEach((key) => {\r\n if (!nextValues.has(key)) {\r\n this.runtime.controlAnimations.delete(key);\r\n }\r\n });\r\n }\r\n\r\n getControlAnimationProgress(params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n contentIndex: number;\r\n snapshot: ListTableRenderSnapshot<RecordType> | null;\r\n }) {\r\n const record = params.snapshot?.displayRows[params.rowIndex];\r\n if (!record) {\r\n return undefined;\r\n }\r\n\r\n const rowKey = this.getRowKey(record, params.rowIndex);\r\n const animation = this.runtime.controlAnimations.get(\r\n getControlAnimationKey(rowKey, params.columnKey, params.contentIndex),\r\n );\r\n if (!animation) {\r\n return undefined;\r\n }\r\n\r\n return getAnimationValue(animation, this.scheduler.now());\r\n }\r\n\r\n getNestedTableHighlight(params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n contentIndex: number;\r\n }) {\r\n return (\r\n this.runtime.nestedTableHighlights.get(\r\n getNestedTableHighlightKey(\r\n params.rowIndex,\r\n params.columnKey,\r\n params.contentIndex,\r\n ),\r\n ) ?? null\r\n );\r\n }\r\n\r\n updateNestedTableHighlightFromClick(result: DebugHitTestResult) {\r\n if (\r\n result.area !== \"body-content\" ||\r\n result.contentKey !== \"nested-table\" ||\r\n typeof result.rowIndex !== \"number\" ||\r\n !result.columnKey ||\r\n typeof result.contentIndex !== \"number\"\r\n ) {\r\n return false;\r\n }\r\n\r\n const highlight: NestedTableHighlightState = {\r\n rowKey: result.nestedRowKey,\r\n rowIndex: result.nestedRowIndex,\r\n columnDataIndex: result.nestedColumnDataIndex,\r\n columnIndex: result.nestedColumnIndex,\r\n };\r\n this.runtime.nestedTableHighlights.set(\r\n getNestedTableHighlightKey(\r\n result.rowIndex,\r\n result.columnKey,\r\n result.contentIndex,\r\n ),\r\n highlight,\r\n );\r\n return true;\r\n }\r\n\r\n ensureControlAnimationFrame() {\r\n if (\r\n this.runtime.controlAnimations.size === 0 ||\r\n this.runtime.controlAnimationFrameId != null\r\n ) {\r\n return;\r\n }\r\n\r\n this.runtime.controlAnimationFrameId = this.scheduler.requestAnimationFrame(\r\n () => {\r\n this.runtime.controlAnimationFrameId = null;\r\n this.advanceControlAnimationFrame();\r\n },\r\n );\r\n }\r\n\r\n stopControlAnimations() {\r\n if (this.runtime.controlAnimationFrameId != null) {\r\n this.scheduler.cancelAnimationFrame(this.runtime.controlAnimationFrameId);\r\n this.runtime.controlAnimationFrameId = null;\r\n }\r\n this.runtime.controlAnimations.clear();\r\n this.runtime.lastControlValues.clear();\r\n this.runtime.controlAnimationRowsRef = null;\r\n this.runtime.controlAnimationWindowKey = null;\r\n this.runtime.controlAnimationColumnKey = null;\r\n }\r\n\r\n ensureExpandAnimationFrame() {\r\n if (\r\n this.runtime.expandAnimations.size === 0 ||\r\n this.runtime.expandAnimationFrameId != null\r\n ) {\r\n return;\r\n }\r\n\r\n this.runtime.expandAnimationFrameId = this.scheduler.requestAnimationFrame(\r\n () => {\r\n this.runtime.expandAnimationFrameId = null;\r\n this.advanceExpandAnimationFrame();\r\n },\r\n );\r\n }\r\n\r\n ensureCollapseAnimationFrame() {\r\n if (\r\n (this.runtime.collapseRowAnimations.size === 0 &&\r\n this.runtime.collapseCellHeightAnimations.size === 0) ||\r\n this.runtime.collapseAnimationFrameId != null\r\n ) {\r\n return;\r\n }\r\n\r\n this.runtime.collapseAnimationFrameId =\r\n this.scheduler.requestAnimationFrame(() => {\r\n this.runtime.collapseAnimationFrameId = null;\r\n this.advanceCollapseAnimationFrame();\r\n });\r\n }\r\n\r\n stopExpandAnimations() {\r\n if (this.runtime.expandAnimationFrameId != null) {\r\n this.scheduler.cancelAnimationFrame(this.runtime.expandAnimationFrameId);\r\n this.runtime.expandAnimationFrameId = null;\r\n }\r\n this.runtime.expandAnimations.clear();\r\n this.runtime.lastExpandedRowKeys.clear();\r\n }\r\n\r\n stopCollapseAnimations() {\r\n if (this.runtime.collapseAnimationFrameId != null) {\r\n this.scheduler.cancelAnimationFrame(\r\n this.runtime.collapseAnimationFrameId,\r\n );\r\n this.runtime.collapseAnimationFrameId = null;\r\n }\r\n this.runtime.collapseRowAnimations.clear();\r\n this.runtime.collapseCellHeightAnimations.clear();\r\n this.runtime.pendingCollapseRowPositions = null;\r\n }\r\n\r\n destroy() {\r\n this.stopScrollbarOpacityAnimation();\r\n this.stopSwapAnimation();\r\n this.scrollAnimationController.destroy();\r\n this.stopControlAnimations();\r\n this.stopExpandAnimations();\r\n this.stopCollapseAnimations();\r\n if (this.runtime.scrollbarHideTimer != null) {\r\n this.scheduler.clearTimeout(this.runtime.scrollbarHideTimer);\r\n this.runtime.scrollbarHideTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * 停止所有动画循环(销毁前调用)。\r\n */\r\n stopAll() {\r\n this.stopCarouselScroll();\r\n this.stopScrollToAnimation();\r\n this.stopWheelScrollSmoothing();\r\n this.stopScrollbarOpacityAnimation();\r\n this.stopControlAnimations();\r\n this.stopExpandAnimations();\r\n this.stopCollapseAnimations();\r\n this.stopSwapAnimation();\r\n }\r\n\r\n private ensureScrollbarOpacityAnimation() {\r\n if (this.runtime.scrollbarOpacityFrameId != null) {\r\n return;\r\n }\r\n this.runtime.scrollbarOpacityLastTime = this.scheduler.now();\r\n this.runtime.scrollbarOpacityFrameId = this.scheduler.requestAnimationFrame(\r\n () => {\r\n this.advanceScrollbarOpacityAnimation();\r\n },\r\n );\r\n }\r\n\r\n private ensureSwapAnimationFrame() {\r\n if (\r\n this.runtime.swapAnimation == null ||\r\n this.runtime.swapAnimationFrameId != null\r\n ) {\r\n return;\r\n }\r\n\r\n this.runtime.swapAnimationFrameId = this.scheduler.requestAnimationFrame(\r\n () => {\r\n this.advanceSwapAnimationFrame();\r\n },\r\n );\r\n }\r\n\r\n private stopSwapAnimationFrame() {\r\n if (this.runtime.swapAnimationFrameId != null) {\r\n this.scheduler.cancelAnimationFrame(this.runtime.swapAnimationFrameId);\r\n this.runtime.swapAnimationFrameId = null;\r\n }\r\n }\r\n\r\n private advanceScrollbarOpacityAnimation() {\r\n this.runtime.scrollbarOpacityFrameId = null;\r\n const now = this.scheduler.now();\r\n const deltaMs = now - this.runtime.scrollbarOpacityLastTime;\r\n this.runtime.scrollbarOpacityLastTime = now;\r\n const { opacity, settled } = advanceScrollbarOpacityStep({\r\n opacity: this.runtime.scrollbarOpacity,\r\n target: this.runtime.scrollbarOpacityTarget,\r\n deltaMs,\r\n });\r\n this.runtime.scrollbarOpacity = opacity;\r\n // 每一帧都提交绘制,确保淡出最后一帧也能清掉残留。\r\n this.requestRender();\r\n\r\n if (!settled) {\r\n this.runtime.scrollbarOpacityFrameId =\r\n this.scheduler.requestAnimationFrame(() => {\r\n this.advanceScrollbarOpacityAnimation();\r\n });\r\n }\r\n }\r\n\r\n private advanceSwapAnimationFrame() {\r\n this.runtime.swapAnimationFrameId = null;\r\n const result = advanceColumnReorderAnimation(\r\n this.runtime.swapAnimation,\r\n this.scheduler.now(),\r\n );\r\n this.runtime.swapAnimation = result.animation;\r\n this.requestRender();\r\n if (result.active) {\r\n this.ensureSwapAnimationFrame();\r\n }\r\n }\r\n\r\n private advanceExpandAnimationFrame() {\r\n const now = this.scheduler.now();\r\n this.pruneFinishedExpandAnimations(now);\r\n this.requestRender();\r\n }\r\n\r\n private advanceCollapseAnimationFrame() {\r\n const now = this.scheduler.now();\r\n this.pruneFinishedCollapseAnimations(now);\r\n this.requestRender();\r\n }\r\n\r\n private advanceControlAnimationFrame() {\r\n const now = this.scheduler.now();\r\n this.pruneFinishedControlAnimations(now);\r\n this.requestRender();\r\n }\r\n\r\n private pruneFinishedControlAnimations(now: number) {\r\n pruneFinishedAnimations(this.runtime.controlAnimations, now);\r\n }\r\n\r\n private pruneFinishedExpandAnimations(now: number) {\r\n pruneFinishedAnimations(this.runtime.expandAnimations, now);\r\n }\r\n\r\n private pruneFinishedCollapseAnimations(now: number) {\r\n pruneFinishedAnimations(this.runtime.collapseRowAnimations, now);\r\n pruneFinishedAnimations(this.runtime.collapseCellHeightAnimations, now);\r\n }\r\n}\r\n\r\nfunction createDefaultAnimationScheduler(): ListTableAnimationScheduler {\r\n return {\r\n now: () => performance.now(),\r\n dateNow: () => Date.now(),\r\n requestAnimationFrame: (callback) => requestAnimationFrame(callback),\r\n cancelAnimationFrame: (id) => cancelAnimationFrame(id),\r\n setTimeout: (callback, delay) => window.setTimeout(callback, delay),\r\n clearTimeout: (id) => window.clearTimeout(id),\r\n setInterval: (callback, delay) => window.setInterval(callback, delay),\r\n clearInterval: (id) => window.clearInterval(id),\r\n };\r\n}\r\n","/**\r\n * 解析轮播滚动间隔(毫秒)。\r\n * 未配置 carousel 时返回 null;非法值回退 2000,并限制最小 200。\r\n */\r\nexport function resolveCarouselScrollInterval(params: {\r\n enabled: boolean;\r\n interval?: number;\r\n}) {\r\n if (!params.enabled) {\r\n return null;\r\n }\r\n if (\r\n typeof params.interval !== \"number\" ||\r\n !Number.isFinite(params.interval)\r\n ) {\r\n return 2000;\r\n }\r\n return Math.max(params.interval, 200);\r\n}\r\n","import type { ScrollState } from \"../../schema/state\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport { resolveCarouselScroll } from \"../../features/scroll/scroll-feature\";\r\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\r\nimport { resolveCarouselScrollInterval } from \"../../shared/carousel/carousel\";\r\nimport type { ListTableAnimationController } from \"./animation-controller\";\r\nimport type { ListTableEditingController } from \"./editing-controller\";\r\nimport type {\r\n DraggingReorderState,\r\n DraggingResizeState,\r\n DraggingScrollbarState,\r\n} from \"../../domain/types\";\r\n\r\nexport interface ListTableCarouselControllerOptions<RecordType> {\r\n getOptions: () => ListTableOptions<RecordType>;\r\n getScroll: () => ScrollState;\r\n setScroll: (value: ScrollState) => void;\r\n getCurrentRenderSnapshot: () => ListTableRenderSnapshot<RecordType> | null;\r\n getDraggingScrollbar: () => DraggingScrollbarState | null;\r\n getDraggingResize: () => DraggingResizeState | null;\r\n getDraggingReorder: () => DraggingReorderState | null;\r\n editingController: ListTableEditingController<RecordType>;\r\n animationController: ListTableAnimationController<RecordType>;\r\n requestRender: () => void;\r\n}\r\n\r\n/**\r\n * 协调轮播滚动启停、推进与指针恢复。\r\n */\r\nexport class ListTableCarouselController<RecordType> {\r\n private readonly options: ListTableCarouselControllerOptions<RecordType>;\r\n\r\n constructor(options: ListTableCarouselControllerOptions<RecordType>) {\r\n this.options = options;\r\n }\r\n\r\n syncCarouselScroll() {\r\n const carouselScroll = this.options.getOptions().carouselScroll;\r\n const interval = this.resolveCarouselScrollInterval();\r\n this.options.animationController.syncCarouselScroll({\r\n enabled: Boolean(carouselScroll),\r\n interval,\r\n configKey: carouselScroll\r\n ? `${carouselScroll.direction ?? \"vertical\"}::${carouselScroll.step ?? \"auto\"}::${interval}`\r\n : null,\r\n onTick: (nextInterval) => this.advanceCarouselScroll(nextInterval),\r\n });\r\n }\r\n\r\n resumeCarouselScrollByPointer() {\r\n if (!this.options.animationController.resumeCarouselScrollByPointer()) {\r\n return;\r\n }\r\n\r\n this.syncCarouselScroll();\r\n }\r\n\r\n private advanceCarouselScroll(interval: number) {\r\n const snapshot = this.options.getCurrentRenderSnapshot();\r\n if (\r\n !snapshot ||\r\n this.options.getDraggingScrollbar() ||\r\n this.options.getDraggingResize() ||\r\n this.options.getDraggingReorder() ||\r\n this.options.editingController.getSession()\r\n ) {\r\n return;\r\n }\r\n\r\n const scroll = this.options.getScroll();\r\n const resolved = resolveCarouselScroll({\r\n current: scroll,\r\n viewport: snapshot.viewport,\r\n rowHeight: snapshot.rowHeight,\r\n carouselScroll: this.options.getOptions().carouselScroll,\r\n centerColumns: snapshot.columnMetrics.splitColumns.center,\r\n });\r\n if (!resolved) {\r\n return;\r\n }\r\n\r\n const nextScroll = resolved.nextScroll;\r\n const unchanged =\r\n Math.abs(nextScroll.left - scroll.left) < 0.5 &&\r\n Math.abs(nextScroll.top - scroll.top) < 0.5;\r\n if (unchanged) {\r\n return;\r\n }\r\n\r\n if (!resolved.animate) {\r\n this.options.animationController.stopCarouselScrollAnimation();\r\n this.options.setScroll(nextScroll);\r\n this.options.requestRender();\r\n if (resolved.shouldStop) {\r\n this.options.animationController.stopCarouselScroll();\r\n }\r\n return;\r\n }\r\n\r\n this.options.animationController.startCarouselScrollAnimation({\r\n target: nextScroll,\r\n direction:\r\n this.options.getOptions().carouselScroll?.direction ?? \"vertical\",\r\n interval,\r\n });\r\n }\r\n\r\n private resolveCarouselScrollInterval() {\r\n const carouselScroll = this.options.getOptions().carouselScroll;\r\n return resolveCarouselScrollInterval({\r\n enabled: Boolean(carouselScroll),\r\n interval: carouselScroll?.interval,\r\n });\r\n }\r\n}\r\n","import {\n copyJson,\n copyRows,\n copyText,\n downloadJsonFile,\n exportTableToCsv,\n exportTableToTxt,\n exportTableToXlsx,\n type ExportTableColumn,\n mapRowsToExportRecords,\n} from \"@canvas-components/utils\";\nimport { getValueByDataIndex } from \"../domain/data/get-value-by-data-index\";\nimport type {\n HeaderTreeNode,\n InternalLeafColumn,\n} from \"../domain/columns/types\";\nimport type {\n ListTableCellContent,\n ListTableRenderResult,\n} from \"../schema/column\";\nimport { resolveChartContentPlainText } from \"../rendering/cell-content/draw-chart-content\";\nimport { resolveFormattedCellText } from \"../features/editing/editing-utils\";\nimport { findHeaderNodeByKey } from \"../features/column-reorder/column-reorder-feature\";\nimport { ROW_SELECTION_COLUMN_KEY } from \"../domain/rows/row-selection\";\nimport { EXPAND_COLUMN_KEY } from \"../domain/rows/row-selection\";\nimport type {\n ListTableRangeHighlightState,\n ListTableSelectionState,\n} from \"../schema/state\";\n\n/**\n * 获取单元格复制文本。\n */\nexport function getCellClipboardText<RecordType>(\n record: RecordType,\n rowIndex: number,\n column: InternalLeafColumn<RecordType>,\n) {\n const value = getValueByDataIndex(record, column.dataIndex);\n const rendered = column.render?.(value, record, rowIndex, column);\n if (rendered != null) {\n return renderResultToClipboardText(rendered);\n }\n\n if (column.cellType === \"checkbox\" || column.cellType === \"radio\") {\n return String(Boolean(value));\n }\n\n return (\n resolveFormattedCellText({\n column,\n value,\n record,\n rowIndex,\n }) ?? String(value ?? \"\")\n );\n}\n\n/** 根据当前单元格、行区间或列区间选中状态生成快捷复制文本。 */\nexport function createListTableSelectionCopyText<RecordType>(params: {\n rows: RecordType[];\n columns: InternalLeafColumn<RecordType>[];\n selection: ListTableSelectionState;\n rangeHighlight: Partial<ListTableRangeHighlightState>;\n highlightMode?: \"cell\" | \"row\" | \"column\" | \"cross\";\n}) {\n const columns = params.columns.filter(\n (column) =>\n column.key !== ROW_SELECTION_COLUMN_KEY &&\n column.key !== EXPAND_COLUMN_KEY,\n );\n const columnRange = params.rangeHighlight.selectedColumnRange;\n const rowRange = params.rangeHighlight.selectedRowRange;\n const cellRange = params.rangeHighlight.selectedCellRange;\n if (cellRange) {\n const selectedColumns = params.columns.filter(\n (column, index) =>\n index >= cellRange.startColumnIndex &&\n index <= cellRange.endColumnIndex &&\n column.key !== ROW_SELECTION_COLUMN_KEY &&\n column.key !== EXPAND_COLUMN_KEY,\n );\n return params.rows\n .slice(cellRange.startRowIndex, cellRange.endRowIndex + 1)\n .map((record, offset) =>\n selectedColumns\n .map((column) =>\n getCellClipboardText(\n record,\n cellRange.startRowIndex + offset,\n column,\n ),\n )\n .join(\" \"),\n )\n .join(\"\\n\");\n }\n const mode =\n params.highlightMode ??\n (rowRange && columnRange ? \"cross\" : rowRange ? \"row\" : \"column\");\n const selectedColumns = columnRange\n ? params.columns.filter(\n (column, index) =>\n index >= columnRange.start && index <= columnRange.end,\n ).filter(\n (column) =>\n column.key !== ROW_SELECTION_COLUMN_KEY &&\n column.key !== EXPAND_COLUMN_KEY,\n )\n : columns;\n const startRow = rowRange ? Math.max(rowRange.start, 0) : 0;\n const endRow = rowRange\n ? Math.min(rowRange.end, params.rows.length - 1)\n : params.rows.length - 1;\n\n if (\n mode === \"column\" &&\n columnRange &&\n params.selection.rowIndex == null\n ) {\n return params.rows\n .map((record, rowIndex) =>\n selectedColumns\n .map((column) => getCellClipboardText(record, rowIndex, column))\n .join(\" \"),\n )\n .join(\"\\n\");\n }\n\n const { rowIndex, columnKey } = params.selection;\n const record = rowIndex == null ? undefined : params.rows[rowIndex];\n const column = columns.find((item) => item.key === columnKey);\n return record && column && rowIndex != null\n ? getCellClipboardText(record, rowIndex, column)\n : null;\n}\n\n/** 按指定的零基行列区域生成复制文本。 */\nexport function createListTableRangeCopyText<RecordType>(params: {\n rows: RecordType[];\n columns: InternalLeafColumn<RecordType>[];\n startRowIndex: number;\n endRowIndex: number;\n startColumnIndex: number;\n endColumnIndex: number;\n}) {\n return createListTableSelectionCopyText({\n rows: params.rows,\n columns: params.columns,\n selection: { rowIndex: null, columnKey: null },\n rangeHighlight: {\n selectedCellRange: {\n startRowIndex: Math.max(\n Math.min(params.startRowIndex, params.endRowIndex),\n 0,\n ),\n endRowIndex: Math.min(\n Math.max(params.startRowIndex, params.endRowIndex),\n Math.max(params.rows.length - 1, 0),\n ),\n startColumnIndex: Math.max(\n Math.min(params.startColumnIndex, params.endColumnIndex),\n 0,\n ),\n endColumnIndex: Math.min(\n Math.max(params.startColumnIndex, params.endColumnIndex),\n Math.max(params.columns.length - 1, 0),\n ),\n },\n },\n });\n}\n\n/**\n * 复制表体单元格内容。\n */\nexport async function copyBodyCellContent<RecordType>(params: {\n rows: RecordType[];\n columns: InternalLeafColumn<RecordType>[];\n rowIndex: number;\n columnKey: string;\n}) {\n const { rows, columns, rowIndex, columnKey } = params;\n const record = rows[rowIndex];\n const column = columns.find((item) => item.key === columnKey);\n if (!record || !column) {\n return;\n }\n\n try {\n await copyText(getCellClipboardText(record, rowIndex, column));\n } catch (error) {\n console.error(\"[ListTable] Failed to copy cell:\", error);\n }\n}\n\n/**\n * 复制表头单元格内容。\n */\nexport async function copyHeaderCellContent<RecordType>(params: {\n headerTree: HeaderTreeNode<RecordType>[];\n columnKey: string;\n}) {\n const headerNode = findHeaderNodeByKey(params.headerTree, params.columnKey);\n\n try {\n await copyText(headerNode?.title ?? params.columnKey);\n } catch (error) {\n console.error(\"[ListTable] Failed to copy header cell:\", error);\n }\n}\n\n/**\n * 复制整列内容。\n */\nexport async function copyColumnContent<RecordType>(params: {\n rows: RecordType[];\n columns: InternalLeafColumn<RecordType>[];\n columnKey: string;\n}) {\n const { rows, columns, columnKey } = params;\n const column = columns.find((item) => item.key === columnKey);\n if (!column) {\n return;\n }\n\n const values = rows.map((record, rowIndex) => [\n getCellClipboardText(record, rowIndex, column),\n ]);\n\n try {\n await copyRows(values);\n } catch (error) {\n console.error(\"[ListTable] Failed to copy column:\", error);\n }\n}\n\n/**\n * 复制行文本内容。\n */\nexport async function copyRowTextContent<RecordType>(params: {\n rows: RecordType[];\n columns: InternalLeafColumn<RecordType>[];\n rowIndex: number;\n}) {\n const { rows, columns, rowIndex } = params;\n const record = rows[rowIndex];\n if (!record) {\n return;\n }\n\n const values = columns\n .filter((column) => column.key !== ROW_SELECTION_COLUMN_KEY)\n .map((column) => getCellClipboardText(record, rowIndex, column));\n\n try {\n await copyRows([values]);\n } catch (error) {\n console.error(\"[ListTable] Failed to copy row text:\", error);\n }\n}\n\n/**\n * 复制行 JSON 内容。\n */\nexport async function copyRowJsonContent<RecordType>(params: {\n rows: RecordType[];\n rowIndex: number;\n}) {\n const record = params.rows[params.rowIndex];\n if (!record) {\n return;\n }\n\n try {\n await copyJson(record);\n } catch (error) {\n console.error(\"[ListTable] Failed to copy row json:\", error);\n }\n}\n\n/**\n * 导出全部行 JSON 内容。\n */\nexport async function exportAllRowsJsonContent<RecordType>(params: {\n rows: RecordType[];\n columns: InternalLeafColumn<RecordType>[];\n}) {\n await downloadJsonFile({\n fileName: buildTableExportFileName(\"json\"),\n data: mapRowsToExportRecords({\n rows: params.rows,\n columns: buildExportColumns(params.columns),\n }),\n });\n}\n\n/**\n * 导出全部行 CSV 内容。\n */\nexport async function exportAllRowsCsvContent<RecordType>(params: {\n rows: RecordType[];\n columns: InternalLeafColumn<RecordType>[];\n}) {\n await exportTableToCsv({\n fileName: buildTableExportFileName(\"csv\"),\n rows: params.rows,\n columns: buildExportColumns(params.columns),\n });\n}\n\n/**\n * 导出全部行 TXT 内容。\n */\nexport async function exportAllRowsTxtContent<RecordType>(params: {\n rows: RecordType[];\n columns: InternalLeafColumn<RecordType>[];\n}) {\n await exportTableToTxt({\n fileName: buildTableExportFileName(\"txt\"),\n rows: params.rows,\n columns: buildExportColumns(params.columns),\n });\n}\n\n/**\n * 导出全部行 XLSX 内容。\n */\nexport async function exportAllRowsXlsxContent<RecordType>(params: {\n rows: RecordType[];\n columns: InternalLeafColumn<RecordType>[];\n}) {\n await exportTableToXlsx({\n fileName: buildTableExportFileName(\"xlsx\"),\n rows: params.rows,\n columns: buildExportColumns(params.columns),\n sheetName: \"TableData\",\n });\n}\n\nfunction renderResultToClipboardText<RecordType>(\n result: ListTableRenderResult<RecordType>,\n) {\n if (result == null) {\n return \"\";\n }\n\n if (Array.isArray(result)) {\n return result.map((item) => cellContentToClipboardText(item)).join(\"\");\n }\n\n if (typeof result === \"string\" || typeof result === \"number\") {\n return String(result);\n }\n\n return cellContentToClipboardText(result);\n}\n\nfunction cellContentToClipboardText<RecordType>(\n content: ListTableCellContent<RecordType>,\n) {\n if (content.type === \"arrow\") {\n return content.direction === \"up\" ? \"↑\" : \"↓\";\n }\n\n if (content.type === \"icon\") {\n return content.icon;\n }\n\n if (content.type === \"text\") {\n return content.text;\n }\n\n if (content.type === \"link\") {\n return content.text || content.href || \"\";\n }\n\n if (content.type === \"image\") {\n return content.alt || content.src || \"\";\n }\n\n if (content.type === \"button\") {\n return content.text;\n }\n\n if (content.type === \"progress\") {\n return (\n content.text ?? `${Math.round(resolveProgressClipboardPercent(content))}%`\n );\n }\n\n if (content.type === \"chart\") {\n return resolveChartContentPlainText(content);\n }\n\n if (content.type === \"rate\") {\n return content.text ?? String(content.value);\n }\n\n if (content.type === \"qrcode\") {\n return content.value;\n }\n\n if (content.type === \"barcode\") {\n return content.text ?? content.value;\n }\n\n if (content.type === \"color\") {\n return content.value;\n }\n\n if (content.type === \"switch\") {\n return content.checked\n ? (content.checkedChildren ?? \"true\")\n : (content.uncheckedChildren ?? \"false\");\n }\n\n if (content.type === \"tag\") {\n return content.text;\n }\n\n if (content.type === \"checkbox\" || content.type === \"radio\") {\n return content.label ?? String(content.checked);\n }\n\n return \"\";\n}\n\nfunction resolveProgressClipboardPercent<RecordType>(\n content: Extract<ListTableCellContent<RecordType>, { type: \"progress\" }>,\n) {\n const min = content.min ?? 0;\n const max = content.max ?? 100;\n const range = max - min;\n if (range <= 0) {\n return 0;\n }\n return Math.min(Math.max(((content.value - min) / range) * 100, 0), 100);\n}\n\nfunction buildExportColumns<RecordType>(\n columns: InternalLeafColumn<RecordType>[],\n): ExportTableColumn<RecordType>[] {\n return columns\n .filter((column) => column.key !== ROW_SELECTION_COLUMN_KEY)\n .map((column) => ({\n key: column.key,\n title: column.title ?? column.key,\n value: (row: RecordType, rowIndex: number) =>\n getCellClipboardText(row, rowIndex, column),\n }));\n}\n\nfunction buildTableExportFileName(extension: \"json\" | \"csv\" | \"txt\" | \"xlsx\") {\n const now = new Date();\n const stamp = [\n now.getFullYear(),\n padTimePart(now.getMonth() + 1),\n padTimePart(now.getDate()),\n ].join(\"\");\n const time = [\n padTimePart(now.getHours()),\n padTimePart(now.getMinutes()),\n padTimePart(now.getSeconds()),\n ].join(\"\");\n return `list-table-export-${stamp}-${time}.${extension}`;\n}\n\nfunction padTimePart(value: number) {\n return String(value).padStart(2, \"0\");\n}\n","import { drawBarcodeToCanvas } from \"@canvas-components/barcode\";\r\nimport { drawCanvasChartToCanvas } from \"@canvas-components/chart\";\r\nimport { drawQrCodeToCanvas } from \"@canvas-components/qrcode\";\r\nimport { resolveChartOption } from \"../rendering/cell-content/draw-chart-content\";\r\nimport type { ListTableCellContent } from \"../schema/column\";\r\nimport type { ListTableImagePreviewRequest } from \"../schema/table-options\";\r\n\r\n/**\r\n * 根据原始内容配置生成高分辨率预览图片。\r\n */\r\nexport function createCellContentPreviewSource(\r\n content: ListTableCellContent,\r\n) {\r\n if (content.type === \"image\") {\r\n return content.src;\r\n }\r\n if (\r\n content.type !== \"qrcode\" &&\r\n content.type !== \"barcode\" &&\r\n content.type !== \"chart\"\r\n ) {\r\n return null;\r\n }\r\n\r\n const size = resolvePreviewSize(content.type);\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = size.width;\r\n canvas.height = size.height;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return null;\r\n\r\n if (content.type === \"qrcode\") {\r\n drawQrCodeToCanvas({\r\n ctx,\r\n x: 0,\r\n y: 0,\r\n width: size.width,\r\n height: size.height,\r\n value: content.value,\r\n level: content.level,\r\n color: content.style?.color ?? content.color,\r\n backgroundColor:\r\n content.style?.backgroundColor ?? content.backgroundColor ?? \"#ffffff\",\r\n padding: content.padding ?? 4,\r\n });\r\n } else if (content.type === \"barcode\") {\r\n drawBarcodeToCanvas({\r\n ctx,\r\n x: 0,\r\n y: 0,\r\n width: size.width,\r\n height: size.height,\r\n value: content.value,\r\n format: content.format,\r\n color: content.style?.color ?? content.color,\r\n backgroundColor:\r\n content.style?.backgroundColor ?? content.backgroundColor ?? \"#ffffff\",\r\n padding: Math.max(content.padding ?? 8, 24),\r\n displayValue: content.showText,\r\n text: content.text,\r\n fontSize: 32,\r\n fontFamily: \"sans-serif\",\r\n textColor: content.style?.color ?? content.color,\r\n });\r\n } else {\r\n ctx.fillStyle = content.style?.backgroundColor ?? \"#ffffff\";\r\n ctx.fillRect(0, 0, size.width, size.height);\r\n drawCanvasChartToCanvas({\r\n ctx,\r\n type: content.chartType,\r\n x: 24,\r\n y: 24,\r\n width: size.width - 48,\r\n height: size.height - 48,\r\n option: resolveChartOption(content),\r\n animationProgress: 1,\r\n });\r\n }\r\n return canvas.toDataURL(\"image/png\");\r\n}\r\n\r\n/**\r\n * 解析右键菜单中可下载的单元格内容动作元信息。\r\n */\r\nexport function resolveContentDownloadMeta(\r\n content: ListTableCellContent | null | undefined,\r\n) {\r\n if (\r\n !content ||\r\n (content.type !== \"image\" &&\r\n content.type !== \"qrcode\" &&\r\n content.type !== \"barcode\")\r\n ) {\r\n return null;\r\n }\r\n\r\n const labels = {\r\n image: \"下载图片\",\r\n qrcode: \"下载二维码\",\r\n barcode: \"下载条形码\",\r\n } as const;\r\n\r\n return {\r\n type: content.type,\r\n label: labels[content.type],\r\n src: createCellContentPreviewSource(content),\r\n };\r\n}\r\n\r\n/**\r\n * 解析单元格内容预览请求。\r\n */\r\nexport function resolveCellContentPreviewRequest(\r\n content: ListTableCellContent,\r\n onClose: () => void,\r\n): ListTableImagePreviewRequest | null {\r\n const src = createCellContentPreviewSource(content);\r\n if (!src) {\r\n return null;\r\n }\r\n\r\n return {\r\n src,\r\n alt: resolveCellContentPreviewAlt(content),\r\n onClose,\r\n };\r\n}\r\n\r\n/**\r\n * 解析预览弹层的 alt 文案。\r\n */\r\nexport function resolveCellContentPreviewAlt(content: ListTableCellContent) {\r\n if (content.type === \"image\") {\r\n return content.alt;\r\n }\r\n if (content.type === \"qrcode\") {\r\n return content.value;\r\n }\r\n if (content.type === \"barcode\") {\r\n return content.text ?? content.value;\r\n }\r\n return \"chart\";\r\n}\r\n\r\nfunction resolvePreviewSize(type: \"qrcode\" | \"barcode\" | \"chart\") {\r\n if (type === \"qrcode\") return { width: 320, height: 320 };\r\n if (type === \"barcode\") return { width: 640, height: 240 };\r\n return { width: 720, height: 320 };\r\n}\r\n","/**\r\n * 将图片数据统一转换为 PNG。\r\n */\r\nexport async function convertImageBlobToPng(blob: Blob) {\r\n const objectUrl = URL.createObjectURL(blob);\r\n try {\r\n const image = await new Promise<HTMLImageElement>((resolve, reject) => {\r\n const nextImage = new Image();\r\n nextImage.onload = () => resolve(nextImage);\r\n nextImage.onerror = () => reject(new Error(\"Failed to decode image\"));\r\n nextImage.src = objectUrl;\r\n });\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = Math.max(image.naturalWidth, 1);\r\n canvas.height = Math.max(image.naturalHeight, 1);\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) throw new Error(\"Failed to create image canvas\");\r\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n return await new Promise<Blob>((resolve, reject) => {\r\n canvas.toBlob((pngBlob) => {\r\n if (pngBlob) resolve(pngBlob);\r\n else reject(new Error(\"Failed to encode PNG\"));\r\n }, \"image/png\");\r\n });\r\n } finally {\r\n URL.revokeObjectURL(objectUrl);\r\n }\r\n}\r\n\r\n/**\r\n * 触发浏览器下载 Blob。\r\n */\r\nexport function downloadBlobAsFile(blob: Blob, fileName: string) {\r\n const objectUrl = URL.createObjectURL(blob);\r\n const anchor = document.createElement(\"a\");\r\n anchor.href = objectUrl;\r\n anchor.download = fileName;\r\n anchor.click();\r\n window.setTimeout(() => URL.revokeObjectURL(objectUrl), 0);\r\n}\r\n\r\n/**\r\n * 拉取图片资源并转换为 PNG Blob。\r\n */\r\nexport async function fetchImageAsPngBlob(src: string) {\r\n const response = await fetch(src);\r\n if (!response.ok) {\r\n throw new Error(`Failed to download image: ${response.status}`);\r\n }\r\n return convertImageBlobToPng(await response.blob());\r\n}\r\n","import type { ListTableCellContent } from \"../../schema/column\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport { exportAllRowsXlsxContent } from \"../../services/clipboard-service\";\r\nimport {\r\n resolveCellContentPreviewRequest,\r\n resolveContentDownloadMeta,\r\n} from \"../../services/content-preview-service\";\r\nimport {\r\n downloadBlobAsFile,\r\n fetchImageAsPngBlob,\r\n} from \"../../shared/image/image-download\";\r\nimport type { ListTableOverlayController } from \"./overlay-controller\";\r\nimport type { ListTableHeaderContextMenuAdapter } from \"../../ui/types\";\r\n\r\nexport interface ListTableContentActionControllerOptions<RecordType> {\r\n getOptions: () => ListTableOptions<RecordType>;\r\n getLeafColumns: () => InternalLeafColumn<RecordType>[];\r\n overlayController: ListTableOverlayController<RecordType>;\r\n headerContextMenu: ListTableHeaderContextMenuAdapter;\r\n}\r\n\r\n/**\r\n * 协调导出、内容预览与图片下载等副作用动作。\r\n */\r\nexport class ListTableContentActionController<RecordType> {\r\n private readonly options: ListTableContentActionControllerOptions<RecordType>;\r\n private exportTaskRunning = false;\r\n\r\n constructor(options: ListTableContentActionControllerOptions<RecordType>) {\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * 异步导出全部原始数据为 XLSX。\r\n */\r\n exportXlsx() {\r\n this.startExportTask(\r\n () =>\r\n exportAllRowsXlsxContent({\r\n rows: this.options.getOptions().dataSource,\r\n columns: this.options.getLeafColumns(),\r\n }),\r\n \"正在导出 XLSX…\",\r\n );\r\n }\r\n\r\n startExportTask(task: () => Promise<void>, text: string) {\r\n if (this.exportTaskRunning) {\r\n return;\r\n }\r\n\r\n this.exportTaskRunning = true;\r\n this.options.overlayController.showLoading(text);\r\n\r\n void task()\r\n .catch((error) => {\r\n console.error(\"[ListTable] Failed to export table data:\", error);\r\n })\r\n .finally(() => {\r\n this.exportTaskRunning = false;\r\n this.options.overlayController.hideLoading();\r\n });\r\n }\r\n\r\n resolveContentDownloadAction(\r\n content: ListTableCellContent<RecordType> | null,\r\n ) {\r\n const meta = resolveContentDownloadMeta(content);\r\n if (!meta) {\r\n return null;\r\n }\r\n return {\r\n label: meta.label,\r\n onDownload: async () => {\r\n if (!meta.src) {\r\n return;\r\n }\r\n this.options.headerContextMenu.hide();\r\n await this.downloadImageSource(meta.src, meta.type);\r\n },\r\n };\r\n }\r\n\r\n showCellContentPreview(content: ListTableCellContent<RecordType>) {\r\n const request = resolveCellContentPreviewRequest(content, () => {\r\n this.options.getOptions().ui?.onImagePreviewRequest?.(null);\r\n });\r\n if (!request) {\r\n return;\r\n }\r\n this.options.getOptions().ui?.onImagePreviewRequest?.(request);\r\n }\r\n\r\n private async downloadImageSource(src: string, baseName: string) {\r\n try {\r\n const blob = await fetchImageAsPngBlob(src);\r\n downloadBlobAsFile(blob, `${baseName}.png`);\r\n } catch (error) {\r\n console.warn(\"Failed to convert downloaded image to PNG.\", error);\r\n }\r\n }\r\n}\r\n","import type {\r\n ListTableColumn,\r\n ListTableFormRule,\r\n ListTableFormRules,\r\n} from \"../schema/column\";\r\n\r\nexport interface ListTableCellValidationContext<RecordType> {\r\n value: unknown;\r\n record: RecordType;\r\n rowIndex: number;\r\n}\r\n\r\n/**\r\n * 解析当前单元格的校验规则。\r\n */\r\nexport function resolveCellValidationRules<RecordType>(\r\n column: Pick<ListTableColumn<RecordType>, \"formItemProps\">,\r\n context: ListTableCellValidationContext<RecordType>,\r\n) {\r\n const rules = resolveFormRules(column.formItemProps, context);\r\n return rules ?? [];\r\n}\r\n\r\n/**\r\n * 校验当前单元格的值,返回首个错误文案。\r\n */\r\nexport async function validateCellValue<RecordType>(\r\n column: Pick<ListTableColumn<RecordType>, \"formItemProps\">,\r\n context: ListTableCellValidationContext<RecordType>,\r\n) {\r\n const rules = resolveCellValidationRules(column, context);\r\n\r\n for (const rule of rules) {\r\n const requiredError = validateRequiredRule(rule, context.value);\r\n if (requiredError) {\r\n return requiredError;\r\n }\r\n\r\n if (!rule.validator) {\r\n continue;\r\n }\r\n\r\n try {\r\n const result = await rule.validator(\r\n context.value,\r\n context.record,\r\n context.rowIndex,\r\n );\r\n if (typeof result === \"string\" && result.trim().length > 0) {\r\n return result;\r\n }\r\n if (result === false) {\r\n return rule.message;\r\n }\r\n } catch (error) {\r\n if (error instanceof Error && error.message.trim().length > 0) {\r\n return error.message;\r\n }\r\n return rule.message;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction resolveFormRules<RecordType>(\r\n formItemProps: ListTableColumn<RecordType>[\"formItemProps\"],\r\n context: ListTableCellValidationContext<RecordType>,\r\n) {\r\n const rules = resolveFormItemPropsRules(formItemProps, context);\r\n if (!rules?.length) {\r\n return null;\r\n }\r\n return rules;\r\n}\r\n\r\nfunction resolveFormItemPropsRules<RecordType>(\r\n formItemProps: ListTableColumn<RecordType>[\"formItemProps\"],\r\n context: ListTableCellValidationContext<RecordType>,\r\n) {\r\n const resolvedFormItemProps =\r\n typeof formItemProps === \"function\"\r\n ? formItemProps(context.value, context.record, context.rowIndex)\r\n : formItemProps;\r\n\r\n return resolveRules(resolvedFormItemProps?.rules, context);\r\n}\r\n\r\nfunction resolveRules<RecordType>(\r\n rules: ListTableFormRules<RecordType> | undefined,\r\n context: ListTableCellValidationContext<RecordType>,\r\n) {\r\n if (typeof rules === \"function\") {\r\n return rules(context.value, context.record, context.rowIndex);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nfunction validateRequiredRule<RecordType>(\r\n rule: ListTableFormRule<RecordType>,\r\n value: unknown,\r\n) {\r\n if (!rule.required) {\r\n return null;\r\n }\r\n\r\n if (isEmptyValue(value)) {\r\n return rule.message;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction isEmptyValue(value: unknown) {\r\n if (value == null) {\r\n return true;\r\n }\r\n\r\n if (typeof value === \"string\") {\r\n return value.trim().length === 0;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.length === 0;\r\n }\r\n\r\n return false;\r\n}\r\n","import { getValueByDataIndex } from \"../domain/data/get-value-by-data-index\";\r\nimport type { InternalLeafColumn } from \"../domain/columns/types\";\r\nimport type {\r\n ListTableColumn,\r\n ListTableFormItemPropsConfig,\r\n TableColumnDataIndex,\r\n} from \"../schema/column\";\r\nimport { validateCellValue } from \"./cell-validation\";\r\n\r\nexport interface ListTableValidationError<RecordType> {\r\n rowIndex: number;\r\n rowKey: string | number;\r\n columnKey: string;\r\n dataIndex?: TableColumnDataIndex;\r\n message: string;\r\n value: unknown;\r\n record: RecordType;\r\n}\r\n\r\nexport interface ListTableValidationErrorField<RecordType> {\r\n rowIndex: number;\r\n rowKey: string | number;\r\n columnKey: string;\r\n dataIndex?: TableColumnDataIndex;\r\n name: Array<string | number>;\r\n errors: string[];\r\n value: unknown;\r\n record: RecordType;\r\n}\r\n\r\nexport interface ListTableValidationFailure<RecordType> {\r\n values: RecordType[];\r\n errorFields: ListTableValidationErrorField<RecordType>[];\r\n outOfDate: boolean;\r\n}\r\n\r\nexport interface ListTableValidationTarget {\r\n rowIndex: number;\r\n columnKey: string;\r\n}\r\n\r\n/**\r\n * 构建单元格校验状态键。\r\n */\r\nexport function buildValidationStateKey(\r\n rowKey: string | number,\r\n columnKey: string,\r\n) {\r\n return `${String(rowKey)}::${columnKey}`;\r\n}\r\n\r\n/**\r\n * 获取单元格校验消息。\r\n */\r\nexport function resolveValidationMessage(params: {\r\n state: ReadonlyMap<string, string>;\r\n rowKey: string | number;\r\n columnKey: string;\r\n}) {\r\n return (\r\n params.state.get(\r\n buildValidationStateKey(params.rowKey, params.columnKey),\r\n ) ?? null\r\n );\r\n}\r\n\r\n/**\r\n * 按指定目标执行校验,并返回最新错误状态。\r\n */\r\nexport async function validateTableCells<RecordType>(params: {\r\n rows: RecordType[];\r\n columns: Array<\r\n Pick<InternalLeafColumn<RecordType>, \"key\" | \"dataIndex\" | \"formItemProps\">\r\n >;\r\n getRowKey: (record: RecordType, rowIndex: number) => string | number;\r\n targets?: ListTableValidationTarget[];\r\n state?: ReadonlyMap<string, string>;\r\n}) {\r\n const { rows, columns, getRowKey, targets, state } = params;\r\n const nextState = new Map(state);\r\n const nextErrors: ListTableValidationError<RecordType>[] = [];\r\n const normalizedTargets =\r\n targets?.length != null && targets.length > 0\r\n ? targets\r\n : rows.flatMap((_, rowIndex) =>\r\n columns.map((column) => ({\r\n rowIndex,\r\n columnKey: column.key,\r\n })),\r\n );\r\n const visited = new Set<string>();\r\n\r\n for (const target of normalizedTargets) {\r\n const column = columns.find((item) => item.key === target.columnKey);\r\n const record = rows[target.rowIndex];\r\n if (!column || !record) {\r\n continue;\r\n }\r\n\r\n const rowKey = getRowKey(record, target.rowIndex);\r\n const stateKey = buildValidationStateKey(rowKey, column.key);\r\n if (visited.has(stateKey)) {\r\n continue;\r\n }\r\n visited.add(stateKey);\r\n\r\n const value =\r\n column.dataIndex == null\r\n ? undefined\r\n : getValueByDataIndex(record, column.dataIndex);\r\n const message = await validateCellValue(column, {\r\n value,\r\n record,\r\n rowIndex: target.rowIndex,\r\n });\r\n\r\n if (message) {\r\n nextState.set(stateKey, message);\r\n nextErrors.push({\r\n rowIndex: target.rowIndex,\r\n rowKey,\r\n columnKey: column.key,\r\n dataIndex: column.dataIndex,\r\n message,\r\n value,\r\n record,\r\n });\r\n continue;\r\n }\r\n\r\n nextState.delete(stateKey);\r\n }\r\n\r\n return {\r\n state: nextState,\r\n errors: nextErrors,\r\n };\r\n}\r\n\r\n/**\r\n * 构建类似 antd Form 的校验失败结果。\r\n */\r\nexport function createValidationFailure<RecordType>(\r\n values: RecordType[],\r\n errors: ListTableValidationError<RecordType>[],\r\n outOfDate = false,\r\n): ListTableValidationFailure<RecordType> {\r\n return {\r\n values,\r\n errorFields: errors.map((error) => ({\r\n rowIndex: error.rowIndex,\r\n rowKey: error.rowKey,\r\n columnKey: error.columnKey,\r\n dataIndex: error.dataIndex,\r\n name: buildErrorFieldName(error),\r\n errors: [error.message],\r\n value: error.value,\r\n record: error.record,\r\n })),\r\n outOfDate,\r\n };\r\n}\r\n\r\n/**\r\n * 解析字段变更后需要联动校验的目标单元格。\r\n */\r\nexport function resolveValidationTargetsForChange<RecordType>(params: {\r\n rows: RecordType[];\r\n columns: Array<\r\n Pick<InternalLeafColumn<RecordType>, \"key\" | \"dataIndex\" | \"formItemProps\">\r\n >;\r\n rowIndex: number;\r\n columnKey: string;\r\n}) {\r\n const { rows, columns, rowIndex, columnKey } = params;\r\n const record = rows[rowIndex];\r\n const sourceColumn = columns.find((item) => item.key === columnKey);\r\n if (!record || !sourceColumn) {\r\n return [];\r\n }\r\n\r\n const sourceDataIndexKey = normalizeDataIndex(sourceColumn.dataIndex);\r\n const nextTargets: ListTableValidationTarget[] = [{ rowIndex, columnKey }];\r\n if (!sourceDataIndexKey) {\r\n return nextTargets;\r\n }\r\n\r\n columns.forEach((column) => {\r\n if (column.key === columnKey) {\r\n return;\r\n }\r\n\r\n const dependencies = resolveFormItemProps(column, {\r\n value:\r\n column.dataIndex == null\r\n ? undefined\r\n : getValueByDataIndex(record, column.dataIndex),\r\n record,\r\n rowIndex,\r\n })?.dependencies;\r\n if (!dependencies?.length) {\r\n return;\r\n }\r\n\r\n const hasMatchedDependency = dependencies.some(\r\n (dependency) => normalizeDataIndex(dependency) === sourceDataIndexKey,\r\n );\r\n if (!hasMatchedDependency) {\r\n return;\r\n }\r\n\r\n nextTargets.push({\r\n rowIndex,\r\n columnKey: column.key,\r\n });\r\n });\r\n\r\n return nextTargets;\r\n}\r\n\r\nfunction resolveFormItemProps<RecordType>(\r\n column: Pick<ListTableColumn<RecordType>, \"formItemProps\">,\r\n context: {\r\n value: unknown;\r\n record: RecordType;\r\n rowIndex: number;\r\n },\r\n): ListTableFormItemPropsConfig<RecordType> | undefined {\r\n if (typeof column.formItemProps === \"function\") {\r\n return column.formItemProps(\r\n context.value,\r\n context.record,\r\n context.rowIndex,\r\n );\r\n }\r\n\r\n return column.formItemProps;\r\n}\r\n\r\nfunction normalizeDataIndex(dataIndex?: TableColumnDataIndex) {\r\n if (dataIndex == null) {\r\n return null;\r\n }\r\n\r\n return Array.isArray(dataIndex) ? dataIndex.join(\".\") : String(dataIndex);\r\n}\r\n\r\nfunction buildErrorFieldName<RecordType>(\r\n error: ListTableValidationError<RecordType>,\r\n) {\r\n if (Array.isArray(error.dataIndex)) {\r\n return [error.rowIndex, ...error.dataIndex];\r\n }\r\n\r\n if (error.dataIndex != null) {\r\n return [error.rowIndex, error.dataIndex];\r\n }\r\n\r\n return [error.rowIndex, error.columnKey];\r\n}\r\n","import type { TableColumnDataIndex } from \"../../schema/column\";\r\n\r\n/**\r\n * 通过 dataIndex 安全写入值。\r\n *\r\n * @param record 数据记录。\r\n * @param dataIndex 路径。\r\n * @param value 待写入的值。\r\n */\r\nexport function setValueByDataIndex(\r\n record: unknown,\r\n dataIndex: TableColumnDataIndex | undefined,\r\n value: unknown,\r\n) {\r\n if (\r\n record == null ||\r\n dataIndex == null ||\r\n (typeof record !== \"object\" && !Array.isArray(record))\r\n ) {\r\n return false;\r\n }\r\n\r\n const path = Array.isArray(dataIndex) ? dataIndex : [dataIndex];\r\n if (path.length === 0) {\r\n return false;\r\n }\r\n\r\n let current = record as Record<string | number, unknown>;\r\n for (let index = 0; index < path.length - 1; index += 1) {\r\n const key = path[index];\r\n const next = current[key];\r\n if (next == null || (typeof next !== \"object\" && !Array.isArray(next))) {\r\n current[key] = {};\r\n }\r\n current = current[key] as Record<string | number, unknown>;\r\n }\r\n\r\n current[path[path.length - 1] as string | number] = value;\r\n return true;\r\n}\r\n","import { getValueByDataIndex } from \"../../domain/data/get-value-by-data-index\";\nimport { setValueByDataIndex } from \"../../domain/data/set-value-by-data-index\";\nimport type { RenderCellDescriptor, Rect } from \"../../debug/debug-snapshot\";\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\nimport type {\n ListTableEditorConfig,\n ListTableEditorCommitOptions,\n ListTableEditorRequest,\n ListTableEditorNavigateDirection,\n ListTableEditorFactory,\n} from \"../../ui/types\";\nimport { canEditCell, getColumnEditConfig } from \"./editing-utils\";\n\n/** 与 canvas 单元格内容默认内边距保持一致。 */\nconst DEFAULT_EDITOR_PADDING_INLINE = 12;\nconst DEFAULT_EDITOR_PADDING_BLOCK = 6;\n\nexport interface ListTableEditingSession {\n rowIndex: number;\n columnKey: string;\n element?: HTMLElement;\n focus?: () => void;\n getValue: () => unknown;\n destroy?: () => void;\n}\n\n/**\n * 打开单元格编辑会话。\n */\nexport function openCellEditingSession<RecordType>(params: {\n rowIndex: number;\n columnKey: string;\n leafColumns: InternalLeafColumn<RecordType>[];\n rows: RecordType[];\n descriptors: RenderCellDescriptor[];\n toViewportRect: (rect: Rect) => Rect;\n /**\n * 将布局矩形转换为挂载到画布宿主内的本地坐标(含缩放)。\n */\n toHostRect?: (rect: Rect) => Rect;\n getViewportClipRect?: () => Rect | null;\n getEditorHostElement?: () => HTMLElement | null;\n theme: {\n fontSize: number;\n fontFamily: string;\n textColor: string;\n /**\n * 内容缩放比例,用于把布局内边距换算为可视像素。\n * @default 1\n */\n contentZoom?: number;\n };\n editorFactory?: ListTableEditorFactory | null;\n onEditorRequest?: (request: ListTableEditorRequest | null) => void;\n onCommit: (options?: ListTableEditorCommitOptions) => void;\n onCancel: () => void;\n onNavigate?: (direction: ListTableEditorNavigateDirection) => void;\n initialValue?: unknown;\n}) {\n const {\n rowIndex,\n columnKey,\n leafColumns,\n rows,\n descriptors,\n toViewportRect,\n toHostRect,\n getViewportClipRect,\n getEditorHostElement,\n theme,\n editorFactory,\n onEditorRequest,\n onCommit,\n onCancel,\n onNavigate,\n initialValue,\n } = params;\n const column = leafColumns.find((item) => item.key === columnKey);\n const record = rows[rowIndex];\n if (!column || !record) {\n return null;\n }\n const currentValue =\n column.dataIndex == null\n ? undefined\n : getValueByDataIndex(record, column.dataIndex);\n if (\n !canEditCell(column, {\n value: currentValue,\n record,\n rowIndex,\n })\n ) {\n return null;\n }\n\n const descriptor = descriptors.find(\n (item) =>\n item.kind === \"body\" &&\n item.rowIndex === rowIndex &&\n item.columnKey === columnKey,\n );\n if (!descriptor) {\n return null;\n }\n\n const editConfig = getColumnEditConfig(column, {\n value: currentValue,\n record,\n rowIndex,\n });\n if (!editConfig) {\n return null;\n }\n const editorConfig = resolveEditorConfig(editConfig);\n const editingValue = initialValue === undefined ? currentValue : initialValue;\n\n const hostRect = toHostRect ? toHostRect(descriptor.rect) : descriptor.rect;\n\n const zoom =\n typeof theme.contentZoom === \"number\" &&\n Number.isFinite(theme.contentZoom) &&\n theme.contentZoom > 0\n ? theme.contentZoom\n : 1;\n const paddingInline =\n (column.cellStyle?.paddingInline ?? DEFAULT_EDITOR_PADDING_INLINE) * zoom;\n const paddingBlock =\n (column.cellStyle?.paddingBlock ?? DEFAULT_EDITOR_PADDING_BLOCK) * zoom;\n const editorTheme = {\n fontSize: theme.fontSize,\n fontFamily: theme.fontFamily,\n textColor: theme.textColor,\n cellColor: column.cellStyle?.color,\n paddingInline,\n paddingBlock,\n contentZoom: zoom,\n };\n\n if (onEditorRequest) {\n let nextValue = editingValue;\n onEditorRequest({\n editorKey: JSON.stringify([rowIndex, columnKey]),\n rect: toViewportRect(descriptor.rect),\n clipRect: getViewportClipRect?.() ?? undefined,\n hostRect,\n hostElement: getEditorHostElement?.() ?? undefined,\n value: nextValue,\n config: editorConfig,\n theme: editorTheme,\n onChange: (value) => {\n nextValue = value;\n },\n onCommit,\n onCancel,\n onNavigate,\n });\n\n return {\n rowIndex,\n columnKey,\n focus: () => {},\n getValue: () => nextValue,\n destroy: () => {\n onEditorRequest(null);\n },\n } satisfies ListTableEditingSession;\n }\n\n if (!editorFactory) {\n return null;\n }\n\n const session = editorFactory.createCellEditorSession({\n rect: toViewportRect(descriptor.rect),\n clipRect: getViewportClipRect?.() ?? undefined,\n hostRect,\n hostElement: getEditorHostElement?.() ?? undefined,\n value: editingValue,\n config: editorConfig,\n theme: editorTheme,\n onCommit,\n onCancel,\n onNavigate,\n });\n if (!session) {\n return null;\n }\n if (!session.element) {\n return null;\n }\n\n document.body.appendChild(session.element);\n session.focus();\n\n return {\n rowIndex,\n columnKey,\n element: session.element,\n focus: () => {\n session.focus();\n },\n getValue: () => session.getValue(),\n destroy: session.destroy,\n } satisfies ListTableEditingSession;\n}\n\nfunction resolveEditorConfig(\n config: ListTableEditorConfig,\n): ListTableEditorConfig {\n return {\n format: config.format,\n max: config.max,\n min: config.min,\n options: config.options,\n showSearch: config.showSearch,\n filterOption: config.filterOption,\n onPressEnter: config.onPressEnter,\n placeholder: config.placeholder,\n rangeSeparator: config.rangeSeparator,\n step: config.step,\n valueType: config.valueType,\n };\n}\n\n/**\n * 提交编辑会话。\n */\nexport function commitCellEditingSession<RecordType>(params: {\n session: ListTableEditingSession | null;\n leafColumns: InternalLeafColumn<RecordType>[];\n rows: RecordType[];\n}) {\n const { session, leafColumns, rows } = params;\n if (!session) {\n return false;\n }\n\n const column = leafColumns.find((item) => item.key === session.columnKey);\n const record = rows[session.rowIndex];\n if (!column || !record || column.dataIndex == null) {\n return false;\n }\n\n setValueByDataIndex(record, column.dataIndex, session.getValue());\n return true;\n}\n\n/**\n * 关闭编辑会话。\n */\nexport function closeCellEditingSession(\n session: ListTableEditingSession | null,\n) {\n if (!session) {\n return null;\n }\n\n session.destroy?.();\n session.element?.remove();\n return null;\n}\n","import type { FrozenRowLayout } from \"../domain/rows/frozen-rows\";\r\nimport type { InternalLeafColumn } from \"../domain/columns/types\";\r\nimport type { ColumnMetrics } from \"../domain/columns/column-layout\";\r\nimport type { ListTableVisibleRow } from \"./expandable-service\";\r\n\r\nexport interface ResolveScrollTopForRowIndexParams {\r\n rowIndex: number;\r\n rowCount: number;\r\n rowHeight: number;\r\n maxScrollTop: number;\r\n frozenRows: FrozenRowLayout<unknown>;\r\n}\r\n\r\nexport interface ResolveScrollLeftForColIndexParams<RecordType> {\r\n colIndex: number;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n columnMetrics: ColumnMetrics<RecordType>;\r\n maxScrollLeft: number;\r\n}\r\n\r\nexport interface ResolveScrollToTargetParams {\r\n currentLeft: number;\r\n currentTop: number;\r\n rowRequested: boolean;\r\n columnRequested: boolean;\r\n targetTop: number | null;\r\n targetLeft: number | null;\r\n}\r\n\r\nexport interface ResolveScrollLeftToRevealColumnParams<RecordType> {\r\n columnKey: string;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n columnMetrics: ColumnMetrics<RecordType>;\r\n scrollLeft: number;\r\n maxScrollLeft: number;\r\n}\r\n\r\nexport interface ResolveScrollTopToRevealRowParams {\r\n rowIndex: number;\r\n rowCount: number;\r\n rowHeight: number;\r\n bodyHeight: number;\r\n scrollTop: number;\r\n maxScrollTop: number;\r\n frozenRows: FrozenRowLayout<unknown>;\r\n}\r\n\r\n/**\r\n * 合并横纵滚动目标,单个方向不可滚动时不阻断另一个方向。\r\n */\r\nexport function resolveScrollToTarget(\r\n params: ResolveScrollToTargetParams,\r\n): { left: number; top: number } | null {\r\n const rowResolved = params.rowRequested && params.targetTop != null;\r\n const columnResolved = params.columnRequested && params.targetLeft != null;\r\n if (!rowResolved && !columnResolved) {\r\n return null;\r\n }\r\n\r\n return {\r\n left: columnResolved ? params.targetLeft! : params.currentLeft,\r\n top: rowResolved ? params.targetTop! : params.currentTop,\r\n };\r\n}\r\n\r\n/**\r\n * 将数据行索引映射为包含展开行的可见行索引。\r\n */\r\nexport function resolveVisibleRowIndexForDataRow<RecordType>(params: {\r\n rowIndex: number;\r\n rowCount: number;\r\n frozenRows: FrozenRowLayout<ListTableVisibleRow<RecordType>>;\r\n}): number | null {\r\n const rowIndex = Math.max(0, Math.floor(params.rowIndex));\r\n if (rowIndex >= params.rowCount) {\r\n return null;\r\n }\r\n\r\n for (const section of [\r\n params.frozenRows.top,\r\n params.frozenRows.scroll,\r\n params.frozenRows.bottom,\r\n ]) {\r\n const sectionIndex = section.rows.findIndex(\r\n (row) => row.kind === \"data\" && row.dataRowIndex === rowIndex,\r\n );\r\n if (sectionIndex >= 0) {\r\n return section.rowIndexMap?.[sectionIndex] ?? sectionIndex;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * 根据行索引计算目标纵向滚动距离。\r\n */\r\nexport function resolveScrollTopForRowIndex(\r\n params: ResolveScrollTopForRowIndexParams,\r\n): number | null {\r\n const { rowCount, rowHeight, maxScrollTop, frozenRows } = params;\r\n const rowIndex = Math.max(0, Math.floor(params.rowIndex));\r\n if (rowIndex >= rowCount) {\r\n return null;\r\n }\r\n\r\n if (\r\n frozenRows.top.rowIndexMap?.includes(rowIndex) ||\r\n frozenRows.bottom.rowIndexMap?.includes(rowIndex)\r\n ) {\r\n return null;\r\n }\r\n\r\n const scrollSectionIndex = frozenRows.scroll.rowIndexMap\r\n ? frozenRows.scroll.rowIndexMap.indexOf(rowIndex)\r\n : rowIndex;\r\n if (scrollSectionIndex < 0) {\r\n return null;\r\n }\r\n\r\n return Math.min(\r\n Math.max(scrollSectionIndex * rowHeight, 0),\r\n Math.max(maxScrollTop, 0),\r\n );\r\n}\r\n\r\n/**\r\n * 根据列索引计算目标横向滚动距离。\r\n */\r\nexport function resolveScrollLeftForColIndex<RecordType>(\r\n params: ResolveScrollLeftForColIndexParams<RecordType>,\r\n): number | null {\r\n const { leafColumns, columnMetrics, maxScrollLeft } = params;\r\n const colIndex = Math.max(0, Math.floor(params.colIndex));\r\n const targetColumn = leafColumns[colIndex];\r\n if (!targetColumn) {\r\n return null;\r\n }\r\n\r\n if (targetColumn.fixed === \"left\" || targetColumn.fixed === \"right\") {\r\n return null;\r\n }\r\n\r\n const centerColumns = columnMetrics.splitColumns.center;\r\n const centerColumnIndex = centerColumns.findIndex(\r\n (column) => column.key === targetColumn.key,\r\n );\r\n if (centerColumnIndex < 0) {\r\n return null;\r\n }\r\n\r\n const targetLeft = centerColumns\r\n .slice(0, centerColumnIndex)\r\n .reduce((sum, column) => sum + column.width, 0);\r\n\r\n return Math.min(Math.max(targetLeft, 0), Math.max(maxScrollLeft, 0));\r\n}\r\n\r\n/**\r\n * 横向滚动,使目标列完整进入中间可视区;已完全可见时返回 null。\r\n */\r\nexport function resolveScrollLeftToRevealColumn<RecordType>(\r\n params: ResolveScrollLeftToRevealColumnParams<RecordType>,\r\n): number | null {\r\n const { columnKey, leafColumns, columnMetrics, scrollLeft, maxScrollLeft } =\r\n params;\r\n const targetColumn = leafColumns.find((column) => column.key === columnKey);\r\n if (!targetColumn) {\r\n return null;\r\n }\r\n if (targetColumn.fixed === \"left\" || targetColumn.fixed === \"right\") {\r\n return null;\r\n }\r\n\r\n const centerColumns = columnMetrics.splitColumns.center;\r\n const centerColumnIndex = centerColumns.findIndex(\r\n (column) => column.key === targetColumn.key,\r\n );\r\n if (centerColumnIndex < 0) {\r\n return null;\r\n }\r\n\r\n const columnLeft = centerColumns\r\n .slice(0, centerColumnIndex)\r\n .reduce((sum, column) => sum + column.width, 0);\r\n const columnRight = columnLeft + targetColumn.width;\r\n const viewLeft = Math.max(scrollLeft, 0);\r\n const viewRight = viewLeft + Math.max(columnMetrics.availableCenterWidth, 0);\r\n const safeMaxScrollLeft = Math.max(maxScrollLeft, 0);\r\n\r\n // 已完整可见。\r\n if (columnLeft >= viewLeft - 0.5 && columnRight <= viewRight + 0.5) {\r\n return null;\r\n }\r\n\r\n let nextLeft = viewLeft;\r\n if (columnLeft < viewLeft) {\r\n // 左侧被裁切:把列左缘对齐到可视区左缘。\r\n nextLeft = columnLeft;\r\n } else if (columnRight > viewRight) {\r\n // 右侧被裁切:把列右缘对齐到可视区右缘。\r\n nextLeft = columnRight - columnMetrics.availableCenterWidth;\r\n }\r\n\r\n nextLeft = Math.min(Math.max(nextLeft, 0), safeMaxScrollLeft);\r\n if (Math.abs(nextLeft - scrollLeft) < 0.5) {\r\n return null;\r\n }\r\n return nextLeft;\r\n}\r\n\r\n/**\r\n * 纵向滚动,使目标行完整进入滚动体可视区;已完全可见时返回 null。\r\n */\r\nexport function resolveScrollTopToRevealRow(\r\n params: ResolveScrollTopToRevealRowParams,\r\n): number | null {\r\n const {\r\n rowCount,\r\n rowHeight,\r\n bodyHeight,\r\n scrollTop,\r\n maxScrollTop,\r\n frozenRows,\r\n } = params;\r\n const rowIndex = Math.max(0, Math.floor(params.rowIndex));\r\n if (rowIndex >= rowCount) {\r\n return null;\r\n }\r\n\r\n if (\r\n frozenRows.top.rowIndexMap?.includes(rowIndex) ||\r\n frozenRows.bottom.rowIndexMap?.includes(rowIndex)\r\n ) {\r\n return null;\r\n }\r\n\r\n const scrollSectionIndex = frozenRows.scroll.rowIndexMap\r\n ? frozenRows.scroll.rowIndexMap.indexOf(rowIndex)\r\n : rowIndex;\r\n if (scrollSectionIndex < 0) {\r\n return null;\r\n }\r\n\r\n const rowTop = scrollSectionIndex * rowHeight;\r\n const rowBottom = rowTop + rowHeight;\r\n const viewTop = Math.max(scrollTop, 0);\r\n const viewBottom = viewTop + Math.max(bodyHeight, 0);\r\n const safeMaxScrollTop = Math.max(maxScrollTop, 0);\r\n\r\n if (rowTop >= viewTop - 0.5 && rowBottom <= viewBottom + 0.5) {\r\n return null;\r\n }\r\n\r\n let nextTop = viewTop;\r\n if (rowTop < viewTop) {\r\n nextTop = rowTop;\r\n } else if (rowBottom > viewBottom) {\r\n nextTop = rowBottom - bodyHeight;\r\n }\r\n\r\n nextTop = Math.min(Math.max(nextTop, 0), safeMaxScrollTop);\r\n if (Math.abs(nextTop - scrollTop) < 0.5) {\r\n return null;\r\n }\r\n return nextTop;\r\n}\r\n","import type { RenderCellDescriptor, Rect } from \"../../debug/debug-snapshot\";\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\nimport type { ListTableTheme } from \"../../schema/style\";\nimport type { ListTableOptions } from \"../../schema/table-options\";\nimport type { ScrollState } from \"../../schema/state\";\nimport {\n createValidationFailure,\n resolveValidationMessage,\n resolveValidationTargetsForChange,\n validateTableCells,\n type ListTableValidationError,\n} from \"../../validation/table-validation\";\nimport {\n closeCellEditingSession,\n commitCellEditingSession,\n openCellEditingSession,\n type ListTableEditingSession,\n} from \"../../features/editing/editing-feature\";\nimport { resolveNextEditableCell } from \"../../features/editing/editing-utils\";\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\nimport {\n resolveScrollLeftToRevealColumn,\n resolveScrollTopToRevealRow,\n} from \"../../services/scroll-to-service\";\nimport type {\n ListTableEditorNavigateDirection,\n ListTableEditorCommitOptions,\n ListTableEditorFactory,\n} from \"../../ui/types\";\nimport { getRowKey } from \"../../domain/rows/row-selection\";\n\nexport interface ListTableEditingControllerOptions<RecordType> {\n getOptions: () => ListTableOptions<RecordType>;\n getTheme: () => ListTableTheme;\n getTableZoom: () => number;\n getLeafColumns: () => InternalLeafColumn<RecordType>[];\n getDisplayData: () => RecordType[];\n getDescriptors: () => RenderCellDescriptor[];\n getCurrentRenderSnapshot: () => ListTableRenderSnapshot<RecordType> | null;\n getScroll: () => ScrollState;\n setSelection?: (value: { rowIndex: number; columnKey: string }) => void;\n getEditorFactory: () => ListTableEditorFactory | null;\n toViewportRect: (rect: Rect) => Rect;\n toHostRect: (rect: Rect) => Rect;\n getEditorClipRect: () => Rect | null;\n getEditorHostElement: () => HTMLElement | null;\n clearBodyTooltip: () => void;\n startScrollToAnimation: (params: {\n targetLeft: number;\n targetTop: number;\n duration?: number;\n onComplete?: () => void;\n }) => void;\n requestRender: () => void;\n focusTable?: () => void;\n}\n\n/**\n * 协调 ListTable 编辑器生命周期、导航与单元格校验。\n */\nexport class ListTableEditingController<RecordType> {\n private readonly options: ListTableEditingControllerOptions<RecordType>;\n private editingSession: ListTableEditingSession | null = null;\n private validationMessages = new Map<string, string>();\n private validationTaskId = 0;\n\n constructor(options: ListTableEditingControllerOptions<RecordType>) {\n this.options = options;\n }\n\n hasSession() {\n return this.editingSession != null;\n }\n\n getSession() {\n return this.editingSession;\n }\n\n open(rowIndex: number, columnKey: string, initialValue?: unknown) {\n this.close(false);\n this.options.clearBodyTooltip();\n const zoom =\n this.options.getTableZoom() > 0 ? this.options.getTableZoom() : 1;\n const theme = this.options.getTheme();\n this.editingSession = openCellEditingSession({\n rowIndex,\n columnKey,\n leafColumns: this.options.getLeafColumns(),\n rows: this.options.getDisplayData(),\n descriptors: this.options.getDescriptors(),\n toViewportRect: (rect) => this.options.toViewportRect(rect),\n toHostRect: (rect) => this.options.toHostRect(rect),\n getViewportClipRect: () => this.options.getEditorClipRect(),\n getEditorHostElement: () => this.options.getEditorHostElement(),\n theme: {\n // 编辑层是 DOM,字号/内边距需与 canvas 缩放后的视觉大小一致。\n fontSize: theme.fontSize * zoom,\n fontFamily: theme.fontFamily,\n textColor: theme.textColor,\n contentZoom: zoom,\n },\n editorFactory: this.options.getEditorFactory(),\n onEditorRequest: this.options.getOptions().ui?.onEditorRequest,\n onCommit: (commitOptions) => {\n this.commit(commitOptions);\n },\n onCancel: () => {\n this.close(false);\n this.options.requestRender();\n },\n onNavigate: (direction) => {\n this.navigate(direction);\n },\n initialValue,\n });\n }\n\n commit(options?: ListTableEditorCommitOptions) {\n const session = this.editingSession;\n commitCellEditingSession({\n session,\n leafColumns: this.options.getLeafColumns(),\n rows: this.options.getDisplayData(),\n });\n this.close(false);\n if (session) {\n void this.validateCellTargets(session.rowIndex, session.columnKey);\n }\n this.options.requestRender();\n if (options?.restoreTableFocus) {\n queueMicrotask(() => {\n if (!this.editingSession) {\n this.options.focusTable?.();\n }\n });\n }\n }\n\n navigate(direction: ListTableEditorNavigateDirection) {\n const session = this.editingSession;\n if (!session) {\n return;\n }\n\n const nextTarget = resolveNextEditableCell({\n rowIndex: session.rowIndex,\n columnKey: session.columnKey,\n leafColumns: this.options.getLeafColumns(),\n rows: this.options.getDisplayData(),\n direction,\n });\n\n commitCellEditingSession({\n session,\n leafColumns: this.options.getLeafColumns(),\n rows: this.options.getDisplayData(),\n });\n void this.validateCellTargets(session.rowIndex, session.columnKey);\n this.close(false);\n this.options.requestRender();\n\n if (direction === \"up\" || direction === \"down\") {\n if (!nextTarget) {\n this.options.focusTable?.();\n return;\n }\n\n this.options.setSelection?.(nextTarget);\n const revealTarget = () => {\n this.options.requestRender();\n this.options.focusTable?.();\n };\n const scrolled = this.ensureCellVisibleForEditing(\n nextTarget.rowIndex,\n nextTarget.columnKey,\n revealTarget,\n );\n if (!scrolled) {\n revealTarget();\n }\n return;\n }\n\n if (!nextTarget) {\n return;\n }\n\n this.options.setSelection?.(nextTarget);\n\n // Tab/方向键切到视口外单元格时,先平滑滚入再打开编辑,避免空白错位。\n const scrolled = this.ensureCellVisibleForEditing(\n nextTarget.rowIndex,\n nextTarget.columnKey,\n () => {\n this.open(nextTarget.rowIndex, nextTarget.columnKey);\n },\n );\n if (!scrolled) {\n this.open(nextTarget.rowIndex, nextTarget.columnKey);\n }\n }\n\n /**\n * 确保目标可编辑单元格完整进入视口。\n * 需要滚动时使用过渡动画,并在结束后再打开编辑器。\n *\n * @returns 是否触发了滚动动画。\n */\n ensureCellVisibleForEditing(\n rowIndex: number,\n columnKey: string,\n onVisible?: () => void,\n ) {\n const snapshot = this.options.getCurrentRenderSnapshot();\n if (!snapshot) {\n return false;\n }\n\n const scroll = this.options.getScroll();\n const nextLeft = resolveScrollLeftToRevealColumn({\n columnKey,\n leafColumns: snapshot.leafColumns,\n columnMetrics: snapshot.columnMetrics,\n scrollLeft: scroll.left,\n maxScrollLeft: snapshot.viewport.maxScrollLeft,\n });\n const nextTop = resolveScrollTopToRevealRow({\n rowIndex,\n rowCount: snapshot.visibleRows.length,\n rowHeight: snapshot.rowHeight,\n bodyHeight: snapshot.bodyLayout.scrollBodyHeight,\n scrollTop: scroll.top,\n maxScrollTop: snapshot.viewport.maxScrollTop,\n frozenRows: snapshot.frozenRows,\n });\n\n const leftChanged =\n nextLeft != null && Math.abs(nextLeft - scroll.left) >= 0.5;\n const topChanged = nextTop != null && Math.abs(nextTop - scroll.top) >= 0.5;\n if (!leftChanged && !topChanged) {\n return false;\n }\n\n this.options.startScrollToAnimation({\n targetLeft: leftChanged ? nextLeft! : scroll.left,\n targetTop: topChanged ? nextTop! : scroll.top,\n duration: 240,\n onComplete: onVisible,\n });\n return true;\n }\n\n close(_keepFocusState = false) {\n this.editingSession = closeCellEditingSession(this.editingSession);\n }\n\n closeOnScroll() {\n if (this.editingSession) {\n this.close(false);\n }\n }\n\n getValidationMessage(\n record: RecordType,\n rowIndex: number,\n columnKey: string,\n ) {\n return resolveValidationMessage({\n state: this.validationMessages,\n rowKey: getRowKey(this.options.getOptions(), record, rowIndex),\n columnKey,\n });\n }\n\n async validateCellTargets(\n rowIndex: number,\n columnKey: string,\n ): Promise<ListTableValidationError<RecordType>[]> {\n const rows = this.options.getDisplayData();\n const leafColumns = this.options.getLeafColumns();\n const tableOptions = this.options.getOptions();\n const targets = resolveValidationTargetsForChange({\n rows,\n columns: leafColumns,\n rowIndex,\n columnKey,\n });\n const taskId = ++this.validationTaskId;\n const result = await validateTableCells({\n rows,\n columns: leafColumns,\n getRowKey: (record: RecordType, index: number) =>\n getRowKey(tableOptions, record, index),\n targets,\n state: this.validationMessages,\n });\n if (taskId !== this.validationTaskId) {\n return result.errors;\n }\n this.validationMessages = result.state;\n this.options.requestRender();\n return result.errors;\n }\n\n /**\n * 提交当前编辑会话(若有),并校验整表。\n */\n async validateTable(): Promise<RecordType[]> {\n if (this.editingSession) {\n const { rowIndex, columnKey } = this.editingSession;\n commitCellEditingSession({\n session: this.editingSession,\n leafColumns: this.options.getLeafColumns(),\n rows: this.options.getDisplayData(),\n });\n this.close(false);\n await this.validateCellTargets(rowIndex, columnKey);\n }\n\n const values = this.options.getDisplayData();\n const leafColumns = this.options.getLeafColumns();\n const tableOptions = this.options.getOptions();\n const taskId = ++this.validationTaskId;\n const result = await validateTableCells({\n rows: values,\n columns: leafColumns,\n getRowKey: (record: RecordType, rowIndex: number) =>\n getRowKey(tableOptions, record, rowIndex),\n state: this.validationMessages,\n });\n const outOfDate = taskId !== this.validationTaskId;\n if (outOfDate) {\n throw createValidationFailure(values, result.errors, true);\n }\n this.validationMessages = result.state;\n this.options.requestRender();\n if (result.errors.length > 0) {\n throw createValidationFailure(values, result.errors);\n }\n return values;\n }\n\n destroy() {\n this.close(false);\n this.validationTaskId += 1;\n this.validationMessages = new Map();\n }\n}\n","import type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport { clamp } from \"../../domain/layout/geometry\";\r\nimport { setNestedColumnWidth } from \"../../domain/columns/column-runtime\";\r\nimport type { DraggingResizeState } from \"../../domain/types\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\n\r\n/**\r\n * 启动列宽拖拽。\r\n */\r\nexport function startColumnResizeDrag<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n columnKey: string;\r\n pointerX: number;\r\n}) {\r\n const { options, leafColumns, columnKey, pointerX } = params;\r\n\r\n for (const leaf of leafColumns) {\r\n setNestedColumnWidth(options.columns, leaf.key, leaf.width);\r\n }\r\n\r\n const column = leafColumns.find((item) => item.key === columnKey);\r\n if (\r\n !column ||\r\n column.resizable === false ||\r\n column.minWidth === column.maxWidth\r\n ) {\r\n return null;\r\n }\r\n\r\n return {\r\n columnKey: column.key,\r\n startX: pointerX,\r\n startWidth: column.width,\r\n minWidth: column.minWidth,\r\n maxWidth: column.maxWidth,\r\n } satisfies DraggingResizeState;\r\n}\r\n\r\n/**\r\n * 更新列宽拖拽。\r\n */\r\nexport function updateColumnResizeDrag<RecordType>(params: {\r\n dragging: DraggingResizeState;\r\n pointerX: number;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n options: ListTableOptions<RecordType>;\r\n}) {\r\n const { dragging, pointerX, leafColumns, options } = params;\r\n const dx = pointerX - dragging.startX;\r\n const nextWidth = Math.round(\r\n clamp(dragging.startWidth + dx, dragging.minWidth, dragging.maxWidth),\r\n );\r\n const column = leafColumns.find((item) => item.key === dragging.columnKey);\r\n if (!column || column.width === nextWidth) {\r\n return null;\r\n }\r\n\r\n column.width = nextWidth;\r\n setNestedColumnWidth(options.columns, dragging.columnKey, nextWidth);\r\n\r\n return {\r\n column,\r\n nextWidth,\r\n };\r\n}\r\n\r\n/**\r\n * 完成列宽拖拽。\r\n */\r\nexport function finishColumnResizeDrag<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n dragging: DraggingResizeState | null;\r\n}) {\r\n const { options, dragging } = params;\r\n if (!dragging) {\r\n return false;\r\n }\r\n\r\n options.stretchColumns = false;\r\n return true;\r\n}\r\n","import type {\r\n HeaderContextMenuColumnItem,\r\n HeaderContextMenuConfig,\r\n HeaderContextMenuDensity,\r\n} from \"../../ui/types\";\r\nimport type {\r\n HeaderTreeNode,\r\n InternalLeafColumn,\r\n} from \"../../domain/columns/types\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport type {\r\n ListTableContextMenuFeature,\r\n ListTableContextMenuOptions,\r\n} from \"../../schema/table-options\";\r\nimport {\r\n copyBodyCellContent,\r\n copyColumnContent,\r\n copyHeaderCellContent,\r\n exportAllRowsCsvContent,\r\n exportAllRowsJsonContent,\r\n exportAllRowsTxtContent,\r\n exportAllRowsXlsxContent,\r\n copyRowJsonContent,\r\n copyRowTextContent,\r\n} from \"../../services/clipboard-service\";\r\nimport { buildHeaderSettingsItems } from \"../header-settings/header-settings-feature\";\r\nimport { ROW_SELECTION_COLUMN_KEY } from \"../../domain/rows/row-selection\";\r\nimport type { FrozenRowPosition } from \"../../domain/rows/frozen-rows\";\nimport type { ListTableSummaryType } from \"../../schema/column\";\n\nexport interface ListTableSummaryContextMenuConfig {\n summaryVisible?: boolean;\n summaryColumnKey?: string;\n summaryType?: ListTableSummaryType;\n summaryPrecision?: number;\n onToggleSummary?: () => void;\n onChangeSummaryType?: (type: ListTableSummaryType) => void;\n onChangeSummaryPrecision?: (precision: number | undefined) => void;\n}\n\r\nexport interface ListTableContextMenuActions {\n onCopyHeaderCell: (columnKey: string) => void;\r\n onCopyBodyCell: (rowIndex: number, columnKey: string) => void;\r\n onCopyColumn: (columnKey: string) => void;\r\n onCopyRowText: (rowIndex: number) => void;\r\n onCopyRowJson: (rowIndex: number) => void;\n onCopySelection?: () => void;\n onCopyCustomSelection?: (range: {\n startRow: number;\n startColumn: number;\n endRow: number;\n endColumn: number;\n }) => void;\n onExportJson: () => void;\r\n onExportCsv: () => void;\r\n onExportTxt: () => void;\r\n onExportXlsx: () => void;\r\n onFreezeRow: (rowIndex: number, position: FrozenRowPosition) => void;\r\n onUnfreezeRow: (rowIndex: number) => void;\r\n onToggleExpandRow: (rowIndex: number) => void;\r\n onExpandAllCollapsedRows?: () => void;\r\n onResetFilter: () => void;\r\n onResetSort: () => void;\r\n onResetHeader: () => void;\r\n onChangeDensity: (density: HeaderContextMenuDensity) => void;\r\n onChangeZoom: (zoom: number) => void;\r\n onToggleCurrentColumn?: (columnKey: string, visible: boolean) => void;\r\n onToggleColumn: (columnKey: string, visible: boolean) => void;\r\n onExpandAllCollapsedColumns?: () => void;\r\n onClose: () => void;\n onToggleSummary?: () => void;\n onChangeSummaryType?: (columnKey: string, type: ListTableSummaryType) => void;\n onChangeSummaryPrecision?: (\n columnKey: string,\n precision: number | undefined,\n ) => void;\n}\n\r\n/**\r\n * 创建列表表格右键菜单动作。\r\n */\r\nexport function createListTableContextMenuActions<RecordType>(params: {\n getRows: () => RecordType[];\r\n getAllRows: () => RecordType[];\r\n getColumns: () => InternalLeafColumn<RecordType>[];\r\n getHeaderTree: () => HeaderTreeNode<RecordType>[];\r\n hideMenu: () => void;\r\n startExportTask: (task: () => Promise<void>, text: string) => void;\r\n onFreezeRow: (rowIndex: number, position: FrozenRowPosition) => void;\r\n onUnfreezeRow: (rowIndex: number) => void;\r\n onToggleExpandRow: (rowIndex: number) => void;\r\n onExpandAllCollapsedRows?: () => void;\r\n onResetFilter: () => void;\r\n onResetSort: () => void;\r\n onResetHeader: () => void;\r\n onChangeDensity: (density: HeaderContextMenuDensity) => void;\r\n onChangeZoom: (zoom: number) => void;\r\n onToggleCurrentColumn?: (columnKey: string, visible: boolean) => void;\r\n onToggleColumn: (columnKey: string, visible: boolean) => void;\r\n onExpandAllCollapsedColumns?: () => void;\r\n onClose: () => void;\n onToggleSummary?: () => void;\n onChangeSummaryType?: (columnKey: string, type: ListTableSummaryType) => void;\n onChangeSummaryPrecision?: (\n columnKey: string,\n precision: number | undefined,\n ) => void;\n onCopySelection?: () => void;\n onCopyCustomSelection?: (range: {\n startRow: number;\n startColumn: number;\n endRow: number;\n endColumn: number;\n }) => void;\n}): ListTableContextMenuActions {\n return {\r\n onCopyHeaderCell: (columnKey) => {\r\n params.hideMenu();\r\n void copyHeaderCellContent({\r\n headerTree: params.getHeaderTree(),\r\n columnKey,\r\n });\r\n },\r\n onCopyBodyCell: (rowIndex, columnKey) => {\r\n params.hideMenu();\r\n void copyBodyCellContent({\r\n rows: params.getRows(),\r\n columns: params.getColumns(),\r\n rowIndex,\r\n columnKey,\r\n });\r\n },\r\n onCopyColumn: (columnKey) => {\r\n params.hideMenu();\r\n void copyColumnContent({\r\n rows: params.getRows(),\r\n columns: params.getColumns(),\r\n columnKey,\r\n });\r\n },\r\n onCopyRowText: (rowIndex) => {\r\n params.hideMenu();\r\n void copyRowTextContent({\r\n rows: params.getRows(),\r\n columns: params.getColumns(),\r\n rowIndex,\r\n });\r\n },\r\n onCopyRowJson: (rowIndex) => {\n params.hideMenu();\r\n void copyRowJsonContent({\r\n rows: params.getRows(),\r\n rowIndex,\r\n });\n },\n onCopySelection: params.onCopySelection\n ? () => {\n params.hideMenu();\n params.onCopySelection?.();\n }\n : undefined,\n onCopyCustomSelection: params.onCopyCustomSelection\n ? (range) => {\n params.hideMenu();\n params.onCopyCustomSelection?.(range);\n }\n : undefined,\n onExportJson: () => {\r\n params.hideMenu();\r\n params.startExportTask(\r\n () =>\r\n exportAllRowsJsonContent({\r\n rows: params.getAllRows(),\r\n columns: params.getColumns(),\r\n }),\r\n \"正在导出 JSON…\",\r\n );\r\n },\r\n onExportCsv: () => {\r\n params.hideMenu();\r\n params.startExportTask(\r\n () =>\r\n exportAllRowsCsvContent({\r\n rows: params.getAllRows(),\r\n columns: params.getColumns(),\r\n }),\r\n \"正在导出 CSV…\",\r\n );\r\n },\r\n onExportTxt: () => {\r\n params.hideMenu();\r\n params.startExportTask(\r\n () =>\r\n exportAllRowsTxtContent({\r\n rows: params.getAllRows(),\r\n columns: params.getColumns(),\r\n }),\r\n \"正在导出 TXT…\",\r\n );\r\n },\r\n onExportXlsx: () => {\r\n params.hideMenu();\r\n params.startExportTask(\r\n () =>\r\n exportAllRowsXlsxContent({\r\n rows: params.getAllRows(),\r\n columns: params.getColumns(),\r\n }),\r\n \"正在导出 XLSX…\",\r\n );\r\n },\r\n onFreezeRow: params.onFreezeRow,\r\n onUnfreezeRow: params.onUnfreezeRow,\r\n onToggleExpandRow: params.onToggleExpandRow,\r\n onExpandAllCollapsedRows: params.onExpandAllCollapsedRows ?? (() => {}),\r\n onResetFilter: params.onResetFilter,\r\n onResetSort: params.onResetSort,\r\n onResetHeader: params.onResetHeader,\r\n onChangeDensity: params.onChangeDensity,\r\n onChangeZoom: params.onChangeZoom,\r\n onToggleCurrentColumn:\r\n params.onToggleCurrentColumn ?? params.onToggleColumn,\r\n onToggleColumn: params.onToggleColumn,\r\n onExpandAllCollapsedColumns:\r\n params.onExpandAllCollapsedColumns ?? (() => {}),\r\n onClose: params.onClose,\n onToggleSummary: params.onToggleSummary\n ? () => {\n params.hideMenu();\n params.onToggleSummary?.();\n }\n : undefined,\n onChangeSummaryType: params.onChangeSummaryType\n ? (columnKey, type) => {\n params.hideMenu();\n params.onChangeSummaryType?.(columnKey, type);\n }\n : undefined,\n onChangeSummaryPrecision: params.onChangeSummaryPrecision\n ? (columnKey, precision) => {\n params.hideMenu();\n params.onChangeSummaryPrecision?.(columnKey, precision);\n }\n : undefined,\n };\n}\n\r\n/**\r\n * 构建列表表格右键菜单配置。\r\n */\r\nexport function buildListTableContextMenuConfig<RecordType>(params: {\r\n x: number;\r\n y: number;\r\n columns: ListTableOptions<RecordType>[\"columns\"];\r\n columnKey: string;\r\n isHeaderArea: boolean;\n isSummaryArea?: boolean;\n bodyRowIndex: number | null;\r\n frozenRowPosition: FrozenRowPosition | null;\r\n density: HeaderContextMenuDensity;\r\n zoom?: number;\r\n hasCollapsedRows?: boolean;\r\n contentDownload?: { label: string; onDownload: () => void } | null;\r\n actions: ListTableContextMenuActions;\r\n contextMenu?: false | ListTableContextMenuOptions;\n summaryVisible?: boolean;\n selectionRange?: {\n startRowIndex: number;\n endRowIndex: number;\n startColumnIndex: number;\n endColumnIndex: number;\n } | null;\n rowCount?: number;\n columnCount?: number;\n}): HeaderContextMenuConfig & ListTableSummaryContextMenuConfig {\n const {\r\n x,\r\n y,\r\n columns,\r\n columnKey,\r\n isHeaderArea,\n isSummaryArea = false,\n bodyRowIndex,\r\n frozenRowPosition,\r\n density,\r\n zoom,\r\n hasCollapsedRows,\r\n contentDownload,\r\n actions,\r\n contextMenu,\n summaryVisible = true,\n selectionRange,\n rowCount = 0,\n columnCount = 0,\n } = params;\r\n const enabledFeatures = resolveEnabledContextMenuFeatures(contextMenu);\r\n const isBodyArea = bodyRowIndex != null;\n const isSelectionColumn = columnKey === ROW_SELECTION_COLUMN_KEY;\r\n const enableCopy = enabledFeatures.has(\"copy\");\r\n const enableExport = enabledFeatures.has(\"export\");\r\n const enableDownloadContent = enabledFeatures.has(\"downloadContent\");\r\n const enableRowCollapse = enabledFeatures.has(\"rowCollapse\");\r\n const enableColumnCollapse = enabledFeatures.has(\"columnCollapse\");\r\n const enableFreeze = enabledFeatures.has(\"freeze\");\r\n const enableReset = enabledFeatures.has(\"reset\");\r\n const enableDensity = enabledFeatures.has(\"density\");\r\n const enableZoom = enabledFeatures.has(\"zoom\");\r\n const enableColumnVisibility = enabledFeatures.has(\"columnVisibility\");\r\n const headerItems =\r\n isHeaderArea && (enableColumnVisibility || enableColumnCollapse)\r\n ? buildHeaderSettingsItems(columns)\r\n : undefined;\r\n const currentColumnItem = headerItems\r\n ? findHeaderColumnItem(headerItems, columnKey)\r\n : null;\r\n const canToggleCurrentColumn =\r\n enableColumnCollapse &&\r\n isHeaderArea &&\r\n !isSelectionColumn &&\r\n currentColumnItem != null &&\r\n !currentColumnItem.disabled;\r\n const currentColumnVisible = currentColumnItem?.checked !== false;\r\n\r\n const summaryConfig: ListTableSummaryContextMenuConfig = {\n summaryVisible,\n onToggleSummary:\n isHeaderArea && actions.onToggleSummary\n ? () => actions.onToggleSummary?.()\n : undefined,\n };\n\n if (isSummaryArea && !isSelectionColumn && actions.onChangeSummaryType) {\n const column = findSummaryColumn(columns, columnKey);\n const summary = resolveSummaryConfig(column?.summary);\n summaryConfig.summaryColumnKey = columnKey;\n summaryConfig.summaryType = summary?.type ?? \"sum\";\n summaryConfig.summaryPrecision = summary?.precision;\n summaryConfig.onChangeSummaryType = (type) =>\n actions.onChangeSummaryType?.(columnKey, type);\n summaryConfig.onChangeSummaryPrecision = (precision) =>\n actions.onChangeSummaryPrecision?.(columnKey, precision);\n }\n\n return {\n x,\r\n y,\r\n columns: enableColumnVisibility ? headerItems : undefined,\r\n density: enableDensity ? density : undefined,\r\n zoom: enableZoom ? normalizeContextMenuZoom(zoom) : undefined,\r\n onCopyCell:\r\n enableCopy && isHeaderArea\r\n ? () => {\r\n actions.onCopyHeaderCell(columnKey);\r\n }\r\n : enableCopy && isBodyArea && !isSelectionColumn\r\n ? () => {\r\n actions.onCopyBodyCell(bodyRowIndex, columnKey);\r\n }\r\n : undefined,\r\n onCopyColumn: enableCopy && !isSelectionColumn\r\n ? () => {\r\n actions.onCopyColumn(columnKey);\r\n }\r\n : undefined,\r\n onCopyRowText: enableCopy && isBodyArea\r\n ? () => {\r\n actions.onCopyRowText(bodyRowIndex);\r\n }\r\n : undefined,\r\n onCopyRowJson: enableCopy && isBodyArea\n ? () => {\r\n actions.onCopyRowJson(bodyRowIndex);\r\n }\r\n : undefined,\n onCopySelection:\n enableCopy && selectionRange ? actions.onCopySelection : undefined,\n customSelection:\n enableCopy && rowCount > 0 && columnCount > 0\n ? {\n startRow: (selectionRange?.startRowIndex ?? bodyRowIndex ?? 0) + 1,\n startColumn: (selectionRange?.startColumnIndex ?? 0) + 1,\n endRow: (selectionRange?.endRowIndex ?? bodyRowIndex ?? 0) + 1,\n endColumn: (selectionRange?.endColumnIndex ?? 0) + 1,\n rowCount,\n columnCount,\n }\n : undefined,\n onCopyCustomSelection:\n enableCopy && rowCount > 0 && columnCount > 0\n ? actions.onCopyCustomSelection\n : undefined,\n onExportJson: enableExport\r\n ? () => {\r\n actions.onExportJson();\r\n }\r\n : undefined,\r\n onExportCsv: enableExport\r\n ? () => {\r\n actions.onExportCsv();\r\n }\r\n : undefined,\r\n onExportTxt: enableExport\r\n ? () => {\r\n actions.onExportTxt();\r\n }\r\n : undefined,\r\n onExportXlsx: enableExport\r\n ? () => {\r\n actions.onExportXlsx();\r\n }\r\n : undefined,\r\n downloadContentLabel: enableDownloadContent\r\n ? contentDownload?.label\r\n : undefined,\r\n onDownloadContent: enableDownloadContent\r\n ? contentDownload?.onDownload\r\n : undefined,\r\n toggleExpandRowLabel:\r\n enableRowCollapse && isBodyArea ? \"折叠行\" : undefined,\r\n onToggleExpandRow: enableRowCollapse && isBodyArea\r\n ? () => {\r\n actions.onToggleExpandRow(bodyRowIndex);\r\n }\r\n : undefined,\r\n onExpandAllCollapsedRows:\r\n enableRowCollapse && isBodyArea && hasCollapsedRows\r\n ? actions.onExpandAllCollapsedRows\r\n : undefined,\r\n toggleColumnLabel: canToggleCurrentColumn\r\n ? currentColumnVisible\r\n ? \"折叠列\"\r\n : \"展开列\"\r\n : undefined,\r\n onToggleCurrentColumn: canToggleCurrentColumn\r\n ? () => {\r\n (actions.onToggleCurrentColumn ?? actions.onToggleColumn)(\r\n columnKey,\r\n !currentColumnVisible,\r\n );\r\n }\r\n : undefined,\r\n onExpandAllCollapsedColumns:\r\n enableColumnCollapse &&\r\n isHeaderArea &&\r\n hasHiddenHeaderColumns(headerItems)\r\n ? actions.onExpandAllCollapsedColumns\r\n : undefined,\r\n onFreezeRowTop:\r\n enableFreeze && isBodyArea && frozenRowPosition !== \"top\"\r\n ? () => {\r\n actions.onFreezeRow(bodyRowIndex, \"top\");\r\n }\r\n : undefined,\r\n onFreezeRowBottom:\r\n enableFreeze && isBodyArea && frozenRowPosition !== \"bottom\"\r\n ? () => {\r\n actions.onFreezeRow(bodyRowIndex, \"bottom\");\r\n }\r\n : undefined,\r\n onUnfreezeRow:\r\n enableFreeze && isBodyArea && frozenRowPosition != null\r\n ? () => {\r\n actions.onUnfreezeRow(bodyRowIndex);\r\n }\r\n : undefined,\r\n onResetFilter:\r\n enableReset && isHeaderArea ? actions.onResetFilter : undefined,\r\n onResetSort: enableReset && isHeaderArea ? actions.onResetSort : undefined,\r\n onResetHeader:\r\n enableReset && isHeaderArea ? actions.onResetHeader : undefined,\r\n onChangeDensity: enableDensity ? actions.onChangeDensity : undefined,\r\n onChangeZoom: enableZoom ? actions.onChangeZoom : undefined,\r\n onToggleColumn:\r\n enableColumnVisibility && isHeaderArea\r\n ? actions.onToggleColumn\r\n : undefined,\r\n onClose: actions.onClose,\n ...summaryConfig,\n };\n}\n\nfunction resolveSummaryConfig<RecordType>(\n summary: ListTableOptions<RecordType>[\"columns\"][number][\"summary\"] | undefined,\n) {\n if (summary === true) {\n return { type: \"sum\" as const };\n }\n if (summary == null || summary === false) {\n return null;\n }\n return { type: summary.type ?? \"sum\", precision: summary.precision };\n}\n\nfunction findSummaryColumn<RecordType>(\n columns: ListTableOptions<RecordType>[\"columns\"],\n columnKey: string,\n): ListTableOptions<RecordType>[\"columns\"][number] | undefined {\n for (const column of columns) {\n if (column.key === columnKey) {\n return column;\n }\n const nested = column.children?.length\n ? findSummaryColumn(column.children, columnKey)\n : undefined;\n if (nested) {\n return nested;\n }\n }\n return undefined;\n}\n\r\nconst DEFAULT_CONTEXT_MENU_FEATURES: ListTableContextMenuFeature[] = [\r\n \"copy\",\r\n \"export\",\r\n \"downloadContent\",\r\n \"rowCollapse\",\r\n \"columnCollapse\",\r\n \"freeze\",\r\n \"reset\",\r\n \"density\",\r\n \"zoom\",\r\n \"columnVisibility\",\r\n];\r\n\r\n/**\r\n * 解析最终启用的右键菜单功能集合。\r\n */\r\nexport function resolveEnabledContextMenuFeatures(\r\n contextMenu?: false | ListTableContextMenuOptions,\r\n) {\r\n if (contextMenu === false) {\r\n return new Set<ListTableContextMenuFeature>();\r\n }\r\n\r\n const baseFeatures =\r\n contextMenu?.features && contextMenu.features.length > 0\r\n ? contextMenu.features\r\n : DEFAULT_CONTEXT_MENU_FEATURES;\r\n const disabled = new Set(contextMenu?.disabledFeatures ?? []);\r\n return new Set(baseFeatures.filter((feature) => !disabled.has(feature)));\r\n}\r\n\r\n/** 缩放默认值 / 边界(1 = 100%)。 */\r\nexport const CONTEXT_MENU_ZOOM_DEFAULT = 1;\r\nexport const CONTEXT_MENU_ZOOM_MIN = 0.5;\r\nexport const CONTEXT_MENU_ZOOM_MAX = 2;\r\nexport const CONTEXT_MENU_ZOOM_STEP = 0.1;\r\n\r\n/**\r\n * 规范化缩放比例,限制在合法区间并保留一位小数。\r\n */\r\nexport function normalizeContextMenuZoom(zoom?: number) {\r\n const next =\r\n typeof zoom === \"number\" && Number.isFinite(zoom)\r\n ? zoom\r\n : CONTEXT_MENU_ZOOM_DEFAULT;\r\n const clamped = Math.min(\r\n CONTEXT_MENU_ZOOM_MAX,\r\n Math.max(CONTEXT_MENU_ZOOM_MIN, next),\r\n );\r\n return Math.round(clamped * 10) / 10;\r\n}\r\n\r\nfunction hasHiddenHeaderColumns(\r\n items: HeaderContextMenuColumnItem[] | undefined,\r\n): boolean {\r\n return Boolean(\r\n items?.some(\r\n (item) => item.checked === false || hasHiddenHeaderColumns(item.children),\r\n ),\r\n );\r\n}\r\n\r\nfunction findHeaderColumnItem(\r\n items: HeaderContextMenuColumnItem[],\r\n columnKey: string,\r\n): HeaderContextMenuColumnItem | null {\r\n for (const item of items) {\r\n if (item.key === columnKey) {\r\n return item;\r\n }\r\n if (item.children?.length) {\r\n const matched = findHeaderColumnItem(item.children, columnKey);\r\n if (matched) {\r\n return matched;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/**\r\n * 筛选面板内置特殊选项值。\r\n */\r\nexport const FILTER_PANEL_ALL_OPTION = \"__all__\";\r\nexport const FILTER_PANEL_BLANK_OPTION = \"__blank__\";\r\nexport const FILTER_PANEL_NOT_BLANK_OPTION = \"__not_blank__\";\r\nexport const FILTER_PANEL_NULL_OPTION = \"__null__\";\r\n","import { getValueByDataIndex } from \"../../domain/data/get-value-by-data-index\";\r\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport type { ListTableFilterState } from \"../../schema/state\";\r\nimport type { FilterPanelOptionItem } from \"../../ui/types\";\r\nimport {\r\n FILTER_PANEL_ALL_OPTION,\r\n FILTER_PANEL_BLANK_OPTION,\r\n FILTER_PANEL_NULL_OPTION,\r\n FILTER_PANEL_NOT_BLANK_OPTION,\r\n} from \"../../ui/filter-constants\";\r\n\r\nconst TABLE_QUERY_COLLATOR = new Intl.Collator(\"zh-CN\", {\r\n numeric: true,\r\n sensitivity: \"base\",\r\n});\r\n\r\nexport function resolveColumnFilterValue<RecordType>(\r\n record: RecordType,\r\n column: InternalLeafColumn<RecordType>,\r\n) {\r\n if (column.filterValueGetter) {\r\n return column.filterValueGetter(record);\r\n }\r\n\r\n const value = getValueByDataIndex(record, column.dataIndex);\r\n if (value !== undefined) {\r\n return value;\r\n }\r\n\r\n return (record as Record<string, unknown>)[column.key];\r\n}\r\n\r\nexport function stringifyFilterValue(value: unknown): string {\r\n if (value == null || typeof value === \"boolean\") {\r\n return \"\";\r\n }\r\n\r\n if (typeof value === \"string\" || typeof value === \"number\") {\r\n return String(value).trim();\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => stringifyFilterValue(item))\r\n .join(\" \")\r\n .trim();\r\n }\r\n\r\n if (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n \"props\" in value &&\r\n typeof value.props === \"object\" &&\r\n value.props !== null &&\r\n \"children\" in value.props\r\n ) {\r\n return stringifyFilterValue(\r\n (value.props as { children?: unknown }).children,\r\n );\r\n }\r\n\r\n return \"\";\r\n}\r\n\r\nexport function serializeFilterOptionValue(value: unknown): string {\r\n if (value === null) {\r\n return FILTER_PANEL_NULL_OPTION;\r\n }\r\n\r\n return stringifyFilterValue(value);\r\n}\r\n\r\nexport function resolveColumnFilterOptionValue<RecordType>(\r\n record: RecordType,\r\n column: InternalLeafColumn<RecordType>,\r\n): string {\r\n if (column.filterOptionValueGetter) {\r\n return serializeFilterOptionValue(column.filterOptionValueGetter(record));\r\n }\r\n\r\n if (column.filterOptions?.length) {\r\n const rawValue =\r\n getValueByDataIndex(record, column.dataIndex) ??\r\n (record as Record<string, unknown>)[column.key];\r\n if (rawValue !== undefined) {\r\n return serializeFilterOptionValue(rawValue);\r\n }\r\n\r\n return serializeFilterOptionValue(resolveColumnFilterValue(record, column));\r\n }\r\n\r\n return serializeFilterOptionValue(resolveColumnFilterValue(record, column));\r\n}\r\n\r\nexport function matchFilterValue(\r\n rawValue: unknown,\r\n filterValue: ListTableFilterState[string],\r\n optionValue = serializeFilterOptionValue(rawValue),\r\n) {\r\n if ((filterValue.filterType ?? \"value\") === \"condition\") {\r\n return matchConditionFilterValue(rawValue, filterValue);\r\n }\r\n\r\n const normalizedValue = stringifyFilterValue(rawValue);\r\n const normalizedKeyword = filterValue.keyword.trim().toLowerCase();\r\n const selectedKeys = (filterValue.selectedKeys ?? []).filter(Boolean);\r\n const selectedSet = new Set(selectedKeys.map((item) => item.toLowerCase()));\r\n\r\n if (selectedKeys.length > 0) {\r\n const allowBlank = selectedSet.has(FILTER_PANEL_BLANK_OPTION.toLowerCase());\r\n const allowNotBlank = selectedSet.has(\r\n FILTER_PANEL_NOT_BLANK_OPTION.toLowerCase(),\r\n );\r\n const valueSelections = selectedKeys.filter(\r\n (item) =>\r\n item !== FILTER_PANEL_BLANK_OPTION &&\r\n item !== FILTER_PANEL_NOT_BLANK_OPTION &&\r\n item !== FILTER_PANEL_ALL_OPTION,\r\n );\r\n const isBlank =\r\n normalizedValue.length === 0 || optionValue === FILTER_PANEL_NULL_OPTION;\r\n\r\n if (isBlank) {\r\n return allowBlank;\r\n }\r\n\r\n if (allowNotBlank && valueSelections.length === 0) {\r\n return true;\r\n }\r\n\r\n if (valueSelections.length === 0) {\r\n return false;\r\n }\r\n\r\n return valueSelections\r\n .map((item) => item.toLowerCase())\r\n .includes(optionValue.toLowerCase());\r\n }\r\n\r\n if (!normalizedKeyword) {\r\n return true;\r\n }\r\n\r\n const lowercaseValue = normalizedValue.toLowerCase();\r\n return filterValue.searchExact || filterValue.mode === \"exact\"\r\n ? lowercaseValue === normalizedKeyword\r\n : lowercaseValue.includes(normalizedKeyword);\r\n}\r\n\r\nexport function isMeaningfulFilterValue(value: ListTableFilterState[string]) {\r\n if ((value.filterType ?? \"value\") === \"condition\") {\r\n return (\r\n isSingleConditionActive(\r\n value.conditionOperator ?? \"none\",\r\n value.conditionValue?.trim() ?? \"\",\r\n value.conditionSecondValue?.trim() ?? \"\",\r\n ) ||\r\n isSingleConditionActive(\r\n value.secondConditionOperator ?? \"none\",\r\n value.secondConditionValue?.trim() ?? \"\",\r\n value.secondConditionSecondValue?.trim() ?? \"\",\r\n )\r\n );\r\n }\r\n\r\n return (\r\n value.keyword.trim().length > 0 ||\r\n (value.selectedKeys?.filter(Boolean).length ?? 0) > 0\r\n );\r\n}\r\n\r\nexport function prependSpecialFilterOptions<RecordType>(\r\n options: FilterPanelOptionItem[],\r\n dataSource: RecordType[],\r\n column: InternalLeafColumn<RecordType>,\r\n) {\r\n const blankCount = dataSource.filter((record) => {\r\n return (\r\n stringifyFilterValue(resolveColumnFilterValue(record, column)).length ===\r\n 0\r\n );\r\n }).length;\r\n const notBlankCount = dataSource.length - blankCount;\r\n\r\n return [\r\n {\r\n label: \"全部\",\r\n value: FILTER_PANEL_ALL_OPTION,\r\n count: dataSource.length,\r\n kind: \"all\" as const,\r\n },\r\n {\r\n label: \"空\",\r\n value: FILTER_PANEL_BLANK_OPTION,\r\n count: blankCount,\r\n kind: \"blank\" as const,\r\n },\r\n {\r\n label: \"非空\",\r\n value: FILTER_PANEL_NOT_BLANK_OPTION,\r\n count: notBlankCount,\r\n kind: \"notBlank\" as const,\r\n },\r\n ...options,\r\n ];\r\n}\r\n\r\nfunction matchConditionFilterValue(\r\n rawValue: unknown,\r\n filterValue: ListTableFilterState[string],\r\n) {\r\n const sourceText = stringifyFilterValue(rawValue).toLowerCase();\r\n const firstOperator = filterValue.conditionOperator ?? \"none\";\r\n const firstValue = filterValue.conditionValue?.trim().toLowerCase() ?? \"\";\r\n const firstSecondValue =\r\n filterValue.conditionSecondValue?.trim().toLowerCase() ?? \"\";\r\n const secondOperator = filterValue.secondConditionOperator ?? \"none\";\r\n const secondValue =\r\n filterValue.secondConditionValue?.trim().toLowerCase() ?? \"\";\r\n const secondSecondValue =\r\n filterValue.secondConditionSecondValue?.trim().toLowerCase() ?? \"\";\r\n const relation = filterValue.conditionRelation ?? \"and\";\r\n\r\n const hasFirst = isSingleConditionActive(\r\n firstOperator,\r\n firstValue,\r\n firstSecondValue,\r\n );\r\n const hasSecond = isSingleConditionActive(\r\n secondOperator,\r\n secondValue,\r\n secondSecondValue,\r\n );\r\n\r\n if (!hasFirst && !hasSecond) {\r\n return true;\r\n }\r\n\r\n if (!hasFirst) {\r\n return evaluateCondition(\r\n sourceText,\r\n secondOperator,\r\n secondValue,\r\n secondSecondValue,\r\n );\r\n }\r\n\r\n if (!hasSecond) {\r\n return evaluateCondition(\r\n sourceText,\r\n firstOperator,\r\n firstValue,\r\n firstSecondValue,\r\n );\r\n }\r\n\r\n const primaryResult = evaluateCondition(\r\n sourceText,\r\n firstOperator,\r\n firstValue,\r\n firstSecondValue,\r\n );\r\n const secondaryResult = evaluateCondition(\r\n sourceText,\r\n secondOperator,\r\n secondValue,\r\n secondSecondValue,\r\n );\r\n\r\n return relation === \"or\"\r\n ? primaryResult || secondaryResult\r\n : primaryResult && secondaryResult;\r\n}\r\n\r\nfunction isSingleConditionActive(\r\n operator: ListTableFilterState[string][\"conditionOperator\"] | \"none\",\r\n conditionValue: string,\r\n conditionSecondValue: string,\r\n) {\r\n if (!operator || operator === \"none\") {\r\n return false;\r\n }\r\n\r\n if (operator === \"blank\" || operator === \"notBlank\") {\r\n return true;\r\n }\r\n\r\n if (operator === \"between\" || operator === \"notBetween\") {\r\n return conditionValue.length > 0 && conditionSecondValue.length > 0;\r\n }\r\n\r\n return conditionValue.length > 0;\r\n}\r\n\r\nfunction evaluateCondition(\r\n sourceText: string,\r\n operator: ListTableFilterState[string][\"conditionOperator\"] | \"none\",\r\n firstValue = \"\",\r\n secondValue = \"\",\r\n) {\r\n if (!operator || operator === \"none\") {\r\n return true;\r\n }\r\n\r\n switch (operator) {\r\n case \"eq\":\r\n return wildcardEquals(sourceText, firstValue);\r\n case \"neq\":\r\n return !wildcardEquals(sourceText, firstValue);\r\n case \"gt\":\r\n return compareFilterOperand(sourceText, firstValue) > 0;\r\n case \"gte\":\r\n return compareFilterOperand(sourceText, firstValue) >= 0;\r\n case \"lt\":\r\n return compareFilterOperand(sourceText, firstValue) < 0;\r\n case \"lte\":\r\n return compareFilterOperand(sourceText, firstValue) <= 0;\r\n case \"between\":\r\n return (\r\n compareFilterOperand(sourceText, firstValue) >= 0 &&\r\n compareFilterOperand(sourceText, secondValue) <= 0\r\n );\r\n case \"notBetween\":\r\n return (\r\n compareFilterOperand(sourceText, firstValue) < 0 ||\r\n compareFilterOperand(sourceText, secondValue) > 0\r\n );\r\n case \"startsWith\":\r\n return wildcardStartsWith(sourceText, firstValue);\r\n case \"notStartsWith\":\r\n return !wildcardStartsWith(sourceText, firstValue);\r\n case \"endsWith\":\r\n return wildcardEndsWith(sourceText, firstValue);\r\n case \"notEndsWith\":\r\n return !wildcardEndsWith(sourceText, firstValue);\r\n case \"includes\":\r\n return wildcardContains(sourceText, firstValue);\r\n case \"notIncludes\":\r\n return !wildcardContains(sourceText, firstValue);\r\n case \"blank\":\r\n return sourceText.trim() === \"\";\r\n case \"notBlank\":\r\n return sourceText.trim() !== \"\";\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\nfunction compareFilterOperand(left: string, right: string) {\r\n const leftNumber = Number(left);\r\n const rightNumber = Number(right);\r\n const canUseNumberCompare =\r\n left.trim() !== \"\" &&\r\n right.trim() !== \"\" &&\r\n !Number.isNaN(leftNumber) &&\r\n !Number.isNaN(rightNumber);\r\n\r\n if (canUseNumberCompare) {\r\n return leftNumber - rightNumber;\r\n }\r\n\r\n return TABLE_QUERY_COLLATOR.compare(left, right);\r\n}\r\n\r\nfunction hasWildcardPattern(value: string) {\r\n return value.includes(\"_\") || value.includes(\"%\");\r\n}\r\n\r\nfunction escapeRegExp(value: string) {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\nfunction wildcardToRegExp(value: string) {\r\n const pattern = Array.from(value)\r\n .map((char) => {\r\n if (char === \"%\") {\r\n return \".*\";\r\n }\r\n if (char === \"_\") {\r\n return \".\";\r\n }\r\n return escapeRegExp(char);\r\n })\r\n .join(\"\");\r\n\r\n return new RegExp(`^${pattern}$`, \"i\");\r\n}\r\n\r\nfunction wildcardEquals(sourceText: string, pattern: string) {\r\n if (!hasWildcardPattern(pattern)) {\r\n return sourceText === pattern;\r\n }\r\n\r\n return wildcardToRegExp(pattern).test(sourceText);\r\n}\r\n\r\nfunction wildcardContains(sourceText: string, pattern: string) {\r\n if (!hasWildcardPattern(pattern)) {\r\n return sourceText.includes(pattern);\r\n }\r\n\r\n return wildcardToRegExp(`%${pattern}%`).test(sourceText);\r\n}\r\n\r\nfunction wildcardStartsWith(sourceText: string, pattern: string) {\r\n if (!hasWildcardPattern(pattern)) {\r\n return sourceText.startsWith(pattern);\r\n }\r\n\r\n return wildcardToRegExp(`${pattern}%`).test(sourceText);\r\n}\r\n\r\nfunction wildcardEndsWith(sourceText: string, pattern: string) {\r\n if (!hasWildcardPattern(pattern)) {\r\n return sourceText.endsWith(pattern);\r\n }\r\n\r\n return wildcardToRegExp(`%${pattern}`).test(sourceText);\r\n}\r\n","import type { InternalLeafColumn } from \"../domain/columns/types\";\r\nimport type { ListTableOptions } from \"../schema/table-options\";\r\nimport type {\r\n ListTableFilterState,\r\n ListTableSortState,\r\n} from \"../schema/state\";\r\nimport type {\r\n ListTableFilterConditionOperator,\r\n ListTableFilterConditionRelation,\r\n ListTableFilterMatchMode,\r\n ListTableFilterType,\r\n ListTableFilterValue,\r\n FilterPanelOptionItem,\r\n} from \"../ui/types\";\r\nimport {\r\n sliceDisplayRowsByPagination,\r\n toQueryPagination,\r\n type PaginationState,\r\n} from \"../domain/rows/pagination\";\r\nimport {\r\n prependSpecialFilterOptions,\r\n resolveColumnFilterOptionValue,\r\n resolveColumnFilterValue,\r\n serializeFilterOptionValue,\r\n stringifyFilterValue,\r\n isMeaningfulFilterValue,\r\n matchFilterValue,\r\n} from \"../shared/filter/filter-utils\";\r\n\r\nexport const FILTER_PANEL_TEXTS = {\r\n title: \"筛选\",\r\n valueFilterTab: \"按值过滤\",\r\n conditionFilterTab: \"按条件过滤\",\r\n searchPlaceholder: \"输入关键字\",\r\n optionsLabel: \"可选值\",\r\n emptyOptions: \"暂无可选值\",\r\n loadingOptions: \"正在统计筛选项…\",\r\n exactToggleLabel: \"精确\",\r\n allOptionLabel: \"全部\",\r\n blankOptionLabel: \"空\",\r\n notBlankOptionLabel: \"非空\",\r\n operatorLabel: \"运算符\",\r\n relationLabel: \"条件关系\",\r\n firstConditionLabel: \"条件 1\",\r\n secondConditionLabel: \"条件 2\",\r\n firstValuePlaceholder: \"请输入条件值\",\r\n secondValuePlaceholder: \"请输入第二个值\",\r\n relationAndLabel: \"并且\",\r\n relationOrLabel: \"或者\",\r\n resetAction: \"重置\",\r\n applyAction: \"应用\",\r\n};\r\n\r\nconst ASYNC_FILTER_OPTION_BATCH_SIZE = 20_000;\r\n\r\nexport interface ListTableQueryRuntimeState {\r\n sortState: ListTableSortState;\r\n filterState: ListTableFilterState;\r\n pagination: PaginationState;\r\n}\r\n\r\nexport interface EmitListTableQueryChangeParams<RecordType> {\r\n options: ListTableOptions<RecordType>;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n query: ListTableQueryRuntimeState;\r\n action: \"sort\" | \"filter\" | \"paginate\";\r\n currentDataSource: RecordType[];\r\n baseRowsOverride?: RecordType[];\r\n filteredDataSourceOverride?: RecordType[];\r\n}\r\n\r\n/**\r\n * 按当前排序状态生成有序数据。\r\n */\r\nexport function sortRows<RecordType>(\r\n rows: RecordType[],\r\n sortState: ListTableSortState,\r\n leafColumns: InternalLeafColumn<RecordType>[],\r\n) {\r\n const key = sortState.key;\r\n const order = sortState.order;\r\n if (!key || !order) {\r\n return rows;\r\n }\r\n\r\n const column = leafColumns.find((col) => col.key === key);\r\n return [...rows].sort((a, b) => {\r\n const aVal = resolveSortValue(a, column);\r\n const bVal = resolveSortValue(b, column);\r\n\r\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\r\n return order === \"ascend\" ? aVal - bVal : bVal - aVal;\r\n }\r\n\r\n const strA = String(aVal);\r\n const strB = String(bVal);\r\n return order === \"ascend\"\r\n ? strA.localeCompare(strB)\r\n : strB.localeCompare(strA);\r\n });\r\n}\r\n\r\n/**\r\n * 按筛选状态过滤数据。\r\n */\r\nexport function filterRows<RecordType>(\r\n rows: RecordType[],\r\n filterState: ListTableFilterState,\r\n leafColumns: InternalLeafColumn<RecordType>[],\r\n) {\r\n const activeEntries = Object.entries(filterState).filter(([, value]) =>\r\n isMeaningfulFilterValue(value),\r\n );\r\n if (activeEntries.length === 0) {\r\n return rows;\r\n }\r\n\r\n return rows.filter((record) => {\r\n return activeEntries.every(([columnKey, filterValue]) => {\r\n const column = leafColumns.find((item) => item.key === columnKey);\r\n if (!column) {\r\n return true;\r\n }\r\n\r\n return matchFilterValue(\r\n resolveColumnFilterValue(record, column),\r\n filterValue,\r\n resolveColumnFilterOptionValue(record, column),\r\n );\r\n });\r\n });\r\n}\r\n\r\nexport async function filterRowsAsync<RecordType>(params: {\r\n rows: RecordType[];\r\n filterState: ListTableFilterState;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n signal?: AbortSignal;\r\n}) {\r\n const { rows, filterState, leafColumns, signal } = params;\r\n const activeEntries = Object.entries(filterState).filter(([, value]) =>\r\n isMeaningfulFilterValue(value),\r\n );\r\n if (activeEntries.length === 0) {\r\n return rows;\r\n }\r\n\r\n const result: RecordType[] = [];\r\n for (\r\n let startIndex = 0;\r\n startIndex < rows.length;\r\n startIndex += ASYNC_FILTER_OPTION_BATCH_SIZE\r\n ) {\r\n if (signal?.aborted) {\r\n throw new Error(\"filter rows aborted\");\r\n }\r\n\r\n const endIndex = Math.min(\r\n startIndex + ASYNC_FILTER_OPTION_BATCH_SIZE,\r\n rows.length,\r\n );\r\n for (let index = startIndex; index < endIndex; index += 1) {\r\n const record = rows[index];\r\n if (!record) {\r\n continue;\r\n }\r\n\r\n const matched = activeEntries.every(([columnKey, filterValue]) => {\r\n const column = leafColumns.find((item) => item.key === columnKey);\r\n if (!column) {\r\n return true;\r\n }\r\n\r\n return matchFilterValue(\r\n resolveColumnFilterValue(record, column),\r\n filterValue,\r\n resolveColumnFilterOptionValue(record, column),\r\n );\r\n });\r\n if (matched) {\r\n result.push(record);\r\n }\r\n }\r\n\r\n if (endIndex < rows.length) {\r\n await yieldToMainThread();\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function buildFilterPanelValue(\r\n currentValue: ListTableFilterState[string],\r\n) {\r\n return {\r\n keyword: currentValue.keyword,\r\n mode: currentValue.mode,\r\n searchExact: currentValue.searchExact,\r\n selectedKeys: currentValue.selectedKeys ?? [],\r\n filterType: currentValue.filterType,\r\n conditionOperator: currentValue.conditionOperator,\r\n conditionValue: currentValue.conditionValue,\r\n conditionSecondValue: currentValue.conditionSecondValue,\r\n conditionRelation: currentValue.conditionRelation,\r\n secondConditionOperator: currentValue.secondConditionOperator,\r\n secondConditionValue: currentValue.secondConditionValue,\r\n secondConditionSecondValue: currentValue.secondConditionSecondValue,\r\n } satisfies ListTableFilterValue;\r\n}\r\n\r\nexport function resolveFilterModes<RecordType>(\r\n column: InternalLeafColumn<RecordType>,\r\n) {\r\n return (\r\n column.filterModes?.length ? column.filterModes : [\"fuzzy\", \"exact\"]\r\n ) as ListTableFilterMatchMode[];\r\n}\r\n\r\nexport function getColumnFilterOptions<RecordType>(params: {\r\n column: InternalLeafColumn<RecordType>;\r\n dataSource: RecordType[];\r\n optionThreshold?: number;\r\n}) {\r\n const { column, dataSource, optionThreshold = 50 } = params;\r\n const explicitOptions =\r\n column.filterOptions\r\n ?.map((item) =>\r\n typeof item === \"string\"\r\n ? {\r\n label: item,\r\n value: item,\r\n }\r\n : {\r\n label: item.label,\r\n value: serializeFilterOptionValue(item.value),\r\n },\r\n )\r\n .filter((item) => item.label.trim().length > 0) ?? [];\r\n if (explicitOptions.length > 0) {\r\n const explicitCounts = new Map<string, number>();\r\n const explicitSet = new Set(explicitOptions.map((item) => item.value));\r\n\r\n explicitOptions.forEach((item) => {\r\n explicitCounts.set(item.value, 0);\r\n });\r\n dataSource.forEach((record) => {\r\n const value = resolveColumnFilterOptionValue(record, column);\r\n if (!explicitSet.has(value)) {\r\n return;\r\n }\r\n\r\n explicitCounts.set(value, (explicitCounts.get(value) ?? 0) + 1);\r\n });\r\n\r\n const explicitOptionItems = explicitOptions.map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n count: explicitCounts.get(item.value) ?? 0,\r\n kind: \"value\" as const,\r\n }));\r\n return prependSpecialFilterOptions(explicitOptionItems, dataSource, column);\r\n }\r\n\r\n const optionCountMap = new Map<string, number>();\r\n let exceedsThreshold = false;\r\n dataSource.forEach((record) => {\r\n const value = stringifyFilterValue(\r\n resolveColumnFilterValue(record, column),\r\n );\r\n if (!value) {\r\n return;\r\n }\r\n if (!optionCountMap.has(value) && optionCountMap.size >= optionThreshold) {\r\n exceedsThreshold = true;\r\n return;\r\n }\r\n optionCountMap.set(value, (optionCountMap.get(value) ?? 0) + 1);\r\n });\r\n\r\n if (exceedsThreshold) {\r\n return prependSpecialFilterOptions([], dataSource, column);\r\n }\r\n\r\n const optionItems: FilterPanelOptionItem[] = Array.from(\r\n optionCountMap.entries(),\r\n )\r\n .map(([value, count]) => ({\r\n label: value,\r\n value,\r\n count,\r\n kind: \"value\" as const,\r\n }))\r\n .slice(0, optionThreshold);\r\n\r\n return prependSpecialFilterOptions(optionItems, dataSource, column);\r\n}\r\n\r\nexport async function getColumnFilterOptionsAsync<RecordType>(params: {\r\n column: InternalLeafColumn<RecordType>;\r\n dataSource: RecordType[];\r\n signal?: AbortSignal;\r\n}) {\r\n const { column, dataSource, signal } = params;\r\n const explicitOptions =\r\n column.filterOptions\r\n ?.map((item) =>\r\n typeof item === \"string\"\r\n ? {\r\n label: item,\r\n value: item,\r\n }\r\n : {\r\n label: item.label,\r\n value: serializeFilterOptionValue(item.value),\r\n },\r\n )\r\n .filter((item) => item.label.trim().length > 0) ?? [];\r\n const explicitSet = new Set(explicitOptions.map((item) => item.value));\r\n const explicitCounts = new Map<string, number>();\r\n const optionCountMap = new Map<string, number>();\r\n let blankCount = 0;\r\n\r\n explicitOptions.forEach((item) => {\r\n explicitCounts.set(item.value, 0);\r\n });\r\n\r\n for (\r\n let startIndex = 0;\r\n startIndex < dataSource.length;\r\n startIndex += ASYNC_FILTER_OPTION_BATCH_SIZE\r\n ) {\r\n if (signal?.aborted) {\r\n throw new Error(\"filter options aborted\");\r\n }\r\n\r\n const endIndex = Math.min(\r\n startIndex + ASYNC_FILTER_OPTION_BATCH_SIZE,\r\n dataSource.length,\r\n );\r\n for (let index = startIndex; index < endIndex; index += 1) {\r\n const record = dataSource[index];\r\n const value = stringifyFilterValue(\r\n resolveColumnFilterValue(record, column),\r\n );\r\n if (!value) {\r\n blankCount += 1;\r\n continue;\r\n }\r\n\r\n if (explicitOptions.length > 0) {\r\n if (explicitSet.has(value)) {\r\n explicitCounts.set(value, (explicitCounts.get(value) ?? 0) + 1);\r\n }\r\n continue;\r\n }\r\n\r\n optionCountMap.set(value, (optionCountMap.get(value) ?? 0) + 1);\r\n }\r\n\r\n if (endIndex < dataSource.length) {\r\n await yieldToMainThread();\r\n }\r\n }\r\n\r\n const optionItems: FilterPanelOptionItem[] =\r\n explicitOptions.length > 0\r\n ? explicitOptions.map((item) => ({\r\n label: item.label,\r\n value: item.value,\r\n count: explicitCounts.get(item.value) ?? 0,\r\n kind: \"value\" as const,\r\n }))\r\n : Array.from(optionCountMap.entries()).map(([value, count]) => ({\r\n label: value,\r\n value,\r\n count,\r\n kind: \"value\" as const,\r\n }));\r\n\r\n return [\r\n {\r\n label: \"全部\",\r\n value: \"__all__\",\r\n count: dataSource.length,\r\n kind: \"all\" as const,\r\n },\r\n {\r\n label: \"空\",\r\n value: \"__blank__\",\r\n count: blankCount,\r\n kind: \"blank\" as const,\r\n },\r\n {\r\n label: \"非空\",\r\n value: \"__not_blank__\",\r\n count: dataSource.length - blankCount,\r\n kind: \"notBlank\" as const,\r\n },\r\n ...optionItems,\r\n ];\r\n}\r\n\r\nfunction yieldToMainThread() {\r\n return new Promise<void>((resolve) => {\r\n setTimeout(resolve, 0);\r\n });\r\n}\r\n\r\nfunction resolveSortValue<RecordType>(\r\n record: RecordType,\r\n column?: InternalLeafColumn<RecordType>,\r\n): string | number {\r\n if (!column) {\r\n return \"\";\r\n }\r\n\r\n const customValue = column.sortValueGetter?.(record);\r\n if (typeof customValue === \"number\" || typeof customValue === \"string\") {\r\n return customValue;\r\n }\r\n\r\n const rawValue = stringifyFilterValue(\r\n resolveColumnFilterValue(record, column),\r\n );\r\n const numericValue = Number(rawValue);\r\n if (!Number.isNaN(numericValue) && rawValue.trim() !== \"\") {\r\n return numericValue;\r\n }\r\n\r\n return rawValue;\r\n}\r\n\r\nexport function buildFilterStateValue(\r\n value: ListTableFilterValue,\r\n): ListTableFilterState[string] {\r\n return {\r\n keyword: value.keyword.trim(),\r\n mode: value.mode,\r\n searchExact: !!value.searchExact,\r\n filterType: (value.filterType ?? \"value\") as ListTableFilterType,\r\n selectedKeys: value.selectedKeys ?? [],\r\n conditionOperator: value.conditionOperator as\r\n | ListTableFilterConditionOperator\r\n | undefined,\r\n conditionValue: value.conditionValue,\r\n conditionSecondValue: value.conditionSecondValue,\r\n conditionRelation: value.conditionRelation as\r\n | ListTableFilterConditionRelation\r\n | undefined,\r\n secondConditionOperator: value.secondConditionOperator as\r\n | ListTableFilterConditionOperator\r\n | undefined,\r\n secondConditionValue: value.secondConditionValue,\r\n secondConditionSecondValue: value.secondConditionSecondValue,\r\n };\r\n}\r\n\r\nexport function toQueryFilters(filters: ListTableFilterState) {\r\n return Object.entries(filters).reduce<Record<string, string[] | null>>(\r\n (result, [columnKey, filterValue]) => {\r\n const selectedKeys = filterValue.selectedKeys?.filter(Boolean) ?? [];\r\n if (selectedKeys.length > 0) {\r\n result[columnKey] = selectedKeys;\r\n return result;\r\n }\r\n\r\n const keyword = filterValue.keyword.trim();\r\n result[columnKey] = keyword ? [keyword] : null;\r\n return result;\r\n },\r\n {},\r\n );\r\n}\r\n\r\nexport function toQuerySorter<RecordType>(\r\n sortState: ListTableSortState,\r\n leafColumns: InternalLeafColumn<RecordType>[],\r\n) {\r\n const leafColumn = leafColumns.find((column) => column.key === sortState.key);\r\n return {\r\n columnKey: sortState.key,\r\n field: leafColumn?.dataIndex,\r\n order: sortState.order,\r\n };\r\n}\r\n\r\nexport function getActiveFilterColumnKeys(filters: ListTableFilterState) {\r\n return Object.entries(filters)\r\n .filter(([, value]) => isMeaningfulFilterValue(value))\r\n .map(([columnKey]) => columnKey);\r\n}\r\n\r\n/**\r\n * 获取基础显示数据。\r\n */\r\nexport function getBaseDisplayRows<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n query: ListTableQueryRuntimeState;\r\n}) {\r\n const { options, leafColumns, query } = params;\r\n const rows =\r\n options.query?.mode !== \"remote\"\r\n ? filterRows(options.dataSource, query.filterState, leafColumns)\r\n : options.dataSource;\r\n\r\n return sortRows(rows, query.sortState, leafColumns);\r\n}\r\n\r\nexport async function getBaseDisplayRowsAsync<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n query: ListTableQueryRuntimeState;\r\n signal?: AbortSignal;\r\n}) {\r\n const { options, leafColumns, query, signal } = params;\r\n const rows =\r\n options.query?.mode !== \"remote\"\r\n ? await filterRowsAsync({\r\n rows: options.dataSource,\r\n filterState: query.filterState,\r\n leafColumns,\r\n signal,\r\n })\r\n : options.dataSource;\r\n\r\n return sortRows(rows, query.sortState, leafColumns);\r\n}\r\n\r\n/**\r\n * 获取最终显示数据。\r\n */\r\nexport function getDisplayRows<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n query: ListTableQueryRuntimeState;\r\n}) {\r\n const rows = getBaseDisplayRows(params);\r\n if (!params.options.pagination || params.options.query?.mode === \"remote\") {\r\n return rows;\r\n }\r\n\r\n return sliceDisplayRowsByPagination({\r\n options: params.options,\r\n rows,\r\n state: params.query.pagination,\r\n });\r\n}\r\n\r\nexport function sliceDisplayRowsFromBaseRows<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n rows: RecordType[];\r\n query: ListTableQueryRuntimeState;\r\n}) {\r\n if (!params.options.pagination || params.options.query?.mode === \"remote\") {\r\n return params.rows;\r\n }\r\n\r\n return sliceDisplayRowsByPagination({\r\n options: params.options,\r\n rows: params.rows,\r\n state: params.query.pagination,\r\n });\r\n}\r\n\r\n/**\r\n * 统一触发查询变更回调。\r\n */\r\nexport function emitListTableQueryChange<RecordType>(\r\n params: EmitListTableQueryChangeParams<RecordType>,\r\n) {\r\n const {\r\n options,\r\n leafColumns,\r\n query,\r\n action,\r\n currentDataSource,\r\n baseRowsOverride,\r\n filteredDataSourceOverride,\r\n } = params;\r\n const onChange = options.query?.onChange;\r\n if (!onChange) {\r\n return;\r\n }\r\n\r\n const baseRows =\r\n baseRowsOverride ??\r\n getBaseDisplayRows({\r\n options,\r\n leafColumns,\r\n query,\r\n });\r\n const rawFilters = { ...query.filterState };\r\n const filteredDataSource =\r\n filteredDataSourceOverride ??\r\n filterRows(options.dataSource, query.filterState, leafColumns);\r\n const filters = toQueryFilters(rawFilters);\r\n const sorter = toQuerySorter(query.sortState, leafColumns);\r\n const pagination = toQueryPagination(\r\n options,\r\n baseRows.length,\r\n query.pagination,\r\n );\r\n const extra = {\r\n currentDataSource,\r\n action,\r\n mode: options.query?.mode ?? \"local\",\r\n activeColumnKeys: Object.keys(query.filterState),\r\n filteredDataSource,\r\n rawFilters,\r\n sorter: query.sortState,\r\n sorters:\r\n query.sortState.key && query.sortState.order\r\n ? [\r\n {\r\n key: query.sortState.key,\r\n order: query.sortState.order,\r\n priority: 0,\r\n },\r\n ]\r\n : [],\r\n };\r\n\r\n onChange(pagination, filters, sorter, extra);\r\n}\r\n","import type { Rect } from \"../../debug/debug-snapshot\";\r\nimport type {\r\n ListTableFilterMatchMode,\r\n ListTableFilterValue,\r\n FilterPanelOptionItem,\r\n} from \"../../ui/types\";\r\nimport { FILTER_PANEL_TEXTS } from \"../../services/query-service\";\r\n\r\n/**\r\n * 构建筛选浮层参数。\r\n */\r\nexport function buildFilterPanelShowOptions(params: {\r\n columnTitle: string;\r\n anchorRect: Rect;\r\n value: ListTableFilterValue;\r\n modes: ListTableFilterMatchMode[];\r\n options: FilterPanelOptionItem[];\r\n onApply: (value: ListTableFilterValue) => void;\r\n onReset: () => void;\r\n onClose: () => void;\r\n}) {\r\n return {\r\n columnTitle: params.columnTitle,\r\n anchorRect: params.anchorRect,\r\n value: params.value,\r\n modes: params.modes,\r\n options: params.options,\r\n texts: FILTER_PANEL_TEXTS,\r\n onApply: params.onApply,\r\n onReset: params.onReset,\r\n onClose: params.onClose,\r\n };\r\n}\r\n\r\n/**\r\n * 构建固定列浮层参数。\r\n */\r\nexport function buildFixedPopupShowOptions(params: {\r\n anchorRect: Rect;\r\n currentFixed?: \"left\" | \"right\";\r\n onSelect: (direction: \"left\" | \"right\" | \"none\") => void;\r\n onClose: () => void;\r\n}) {\r\n return {\r\n anchorRect: params.anchorRect,\r\n currentFixed: params.currentFixed,\r\n onSelect: params.onSelect,\r\n onClose: params.onClose,\r\n };\r\n}\r\n","import type {\r\n DebugHitTestResult,\r\n Rect,\r\n} from \"../../debug/debug-snapshot\";\r\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport type {\r\n ListTableSortState,\r\n ListTableFilterState,\r\n} from \"../../schema/state\";\r\nimport type {\r\n ListTableFilterValue,\r\n HeaderContextMenuDensity,\r\n} from \"../../ui/types\";\r\nimport {\r\n buildListTableContextMenuConfig,\r\n createListTableContextMenuActions,\r\n} from \"./context-menu-builder\";\r\nimport {\r\n buildFilterPanelShowOptions,\r\n buildFixedPopupShowOptions,\r\n} from \"./overlay-panel-builders\";\r\nimport {\r\n buildFilterPanelValue,\r\n getColumnFilterOptions,\r\n resolveFilterModes,\r\n} from \"../../services/query-service\";\r\nimport { ROW_SELECTION_COLUMN_KEY } from \"../../domain/rows/row-selection\";\r\nimport type { FrozenRowPosition } from \"../../domain/rows/frozen-rows\";\nimport type { ListTableSummaryType } from \"../../schema/column\";\n\r\n/**\r\n * 判断命中结果是否位于表头区域。\r\n */\r\nexport function isHeaderInteractionArea(result: DebugHitTestResult) {\r\n return (\r\n result.area === \"header\" ||\r\n result.area === \"header-selection\" ||\r\n result.area === \"sort-trigger\" ||\r\n result.area === \"filter-trigger\" ||\r\n result.area === \"fixed-trigger\"\r\n );\r\n}\r\n\r\n/**\r\n * 判断命中结果是否位于表体区域。\r\n */\r\nexport function isBodyInteractionArea(result: DebugHitTestResult) {\n return (\r\n result.area === \"body\" ||\r\n result.area === \"body-content\" ||\r\n result.area === \"body-control\" ||\r\n result.area === \"collapse-trigger\" ||\n result.area === \"summary\"\n );\r\n}\r\n\r\n/**\r\n * 打开或关闭筛选面板。\r\n */\r\nexport function toggleFilterOverlay<RecordType>(params: {\r\n filterPanel: {\r\n isVisible: () => boolean;\r\n hide: () => void;\r\n show: (options: ReturnType<typeof buildFilterPanelShowOptions>) => void;\r\n };\r\n hoverColumnKey: string | null;\r\n columnKey: string;\r\n anchorRect: Rect;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n options: ListTableOptions<RecordType>;\r\n filterState: ListTableFilterState;\r\n dataSource?: RecordType[];\r\n toViewportRect: (rect: Rect) => Rect;\r\n onApply: (value: ListTableFilterValue) => void;\r\n onReset: () => void;\r\n}) {\r\n const {\r\n filterPanel,\r\n hoverColumnKey,\r\n columnKey,\r\n anchorRect,\r\n leafColumns,\r\n options,\r\n filterState,\r\n dataSource,\r\n toViewportRect,\r\n onApply,\r\n onReset,\r\n } = params;\r\n if (filterPanel.isVisible() && hoverColumnKey === columnKey) {\r\n filterPanel.hide();\r\n return;\r\n }\r\n\r\n const column = leafColumns.find((item) => item.key === columnKey);\r\n if (!column) {\r\n return;\r\n }\r\n\r\n const currentValue = filterState[columnKey] ?? {\r\n keyword: \"\",\r\n mode: \"fuzzy\" as const,\r\n filterType: \"value\" as const,\r\n selectedKeys: [],\r\n };\r\n\r\n filterPanel.show(\r\n buildFilterPanelShowOptions({\r\n columnTitle: column.title ?? \"\",\r\n anchorRect: toViewportRect(anchorRect),\r\n value: buildFilterPanelValue(currentValue),\r\n modes: resolveFilterModes(column),\r\n options: getColumnFilterOptions({\r\n column,\r\n dataSource: dataSource ?? options.dataSource,\r\n optionThreshold: options.query?.optionThreshold,\r\n }),\r\n onApply,\r\n onReset,\r\n onClose: () => {\r\n filterPanel.hide();\r\n },\r\n }),\r\n );\r\n}\r\n\r\n/**\r\n * 打开或关闭固定列浮层。\r\n */\r\nexport function toggleFixedOverlay<RecordType>(params: {\r\n fixedPopup: {\r\n isVisible: () => boolean;\r\n hide: () => void;\r\n show: (options: ReturnType<typeof buildFixedPopupShowOptions>) => void;\r\n };\r\n columnKey: string;\r\n anchorRect: Rect;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n toViewportRect: (rect: Rect) => Rect;\r\n onSelect: (direction: \"left\" | \"right\" | \"none\") => void;\r\n onClose?: () => void;\r\n}) {\r\n const {\r\n fixedPopup,\r\n columnKey,\r\n anchorRect,\r\n leafColumns,\r\n toViewportRect,\r\n onSelect,\r\n onClose,\r\n } = params;\r\n if (fixedPopup.isVisible()) {\r\n fixedPopup.hide();\r\n onClose?.();\r\n return;\r\n }\r\n\r\n const column = leafColumns.find((item) => item.key === columnKey);\r\n if (!column) {\r\n return;\r\n }\r\n\r\n fixedPopup.show(\r\n buildFixedPopupShowOptions({\r\n anchorRect: toViewportRect(anchorRect),\r\n currentFixed: column.fixed,\r\n onSelect: (direction) => {\r\n onSelect(direction);\r\n fixedPopup.hide();\r\n onClose?.();\r\n },\r\n onClose: () => {\r\n fixedPopup.hide();\r\n onClose?.();\r\n },\r\n }),\r\n );\r\n}\r\n\r\n/**\r\n * 打开表头上下文菜单。\r\n */\r\nexport function showHeaderContextMenu<RecordType>(params: {\r\n result: DebugHitTestResult;\r\n event: MouseEvent;\r\n options: ListTableOptions<RecordType>;\r\n headerContextMenu: {\r\n hide: () => void;\r\n show: (\r\n config: ReturnType<typeof buildListTableContextMenuConfig<RecordType>>,\r\n ) => void;\r\n };\r\n filterPanel: { hide: () => void };\r\n fixedPopup: { hide: () => void };\r\n hideBodyTooltip: () => void;\r\n getRows: () => RecordType[];\r\n getAllRows: () => RecordType[];\r\n getColumns: () => InternalLeafColumn<RecordType>[];\r\n getHeaderTree: () => import(\"../../domain/columns/types\").HeaderTreeNode<RecordType>[];\r\n getFrozenRowPosition: (rowIndex: number) => FrozenRowPosition | null;\r\n startExportTask: (task: () => Promise<void>, text: string) => void;\r\n onSelectHeader: (columnKey: string, rect: Rect | null | undefined) => void;\r\n onSelectBodyRow?: (rowIndex: number, columnKey: string) => void;\r\n onFreezeRow: (rowIndex: number, position: FrozenRowPosition) => void;\r\n onUnfreezeRow: (rowIndex: number) => void;\r\n onToggleExpandRow: (rowIndex: number) => void;\r\n hasCollapsedRows: boolean;\r\n onExpandAllCollapsedRows: () => void;\r\n onResetFilter: () => void;\r\n onResetSort: () => void;\r\n onResetHeader: () => void;\r\n onChangeDensity: (density: HeaderContextMenuDensity) => void;\r\n zoom: number;\r\n onChangeZoom: (zoom: number) => void;\r\n onToggleCurrentColumn?: (columnKey: string, visible: boolean) => void;\r\n onToggleColumn: (columnKey: string, visible: boolean) => void;\r\n onExpandAllCollapsedColumns: () => void;\r\n onClose: () => void;\n onToggleSummary?: () => void;\n onChangeSummaryType?: (columnKey: string, type: ListTableSummaryType) => void;\n onChangeSummaryPrecision?: (\n columnKey: string,\n precision: number | undefined,\n ) => void;\n summaryVisible?: boolean;\n getSelectionRange?: () => {\n startRowIndex: number;\n endRowIndex: number;\n startColumnIndex: number;\n endColumnIndex: number;\n } | null;\n onCopySelection?: () => void;\n onCopyCustomSelection?: (range: {\n startRow: number;\n startColumn: number;\n endRow: number;\n endColumn: number;\n }) => void;\n contentDownload?: { label: string; onDownload: () => void } | null;\n}) {\r\n const {\r\n result,\r\n event,\r\n options,\r\n headerContextMenu,\r\n filterPanel,\r\n fixedPopup,\r\n hideBodyTooltip,\r\n getRows,\r\n getAllRows,\r\n getColumns,\r\n getHeaderTree,\r\n getFrozenRowPosition,\r\n startExportTask,\r\n onSelectHeader,\r\n onSelectBodyRow,\r\n onFreezeRow,\r\n onUnfreezeRow,\r\n onToggleExpandRow,\r\n hasCollapsedRows,\r\n onExpandAllCollapsedRows,\r\n onResetFilter,\r\n onResetSort,\r\n onResetHeader,\r\n onChangeDensity,\r\n onChangeZoom,\r\n onToggleCurrentColumn,\r\n onToggleColumn,\r\n onExpandAllCollapsedColumns,\r\n onClose,\n onToggleSummary,\n onChangeSummaryType,\n onChangeSummaryPrecision,\n summaryVisible,\n getSelectionRange,\n onCopySelection,\n onCopyCustomSelection,\n contentDownload,\n } = params;\r\n const isHeaderArea = isHeaderInteractionArea(result);\n const isBodyArea = isBodyInteractionArea(result);\n const isSummaryArea = result.area === \"summary\";\n const isSelectionColumn = result.columnKey === ROW_SELECTION_COLUMN_KEY;\r\n\r\n if (\r\n (!isHeaderArea && !isBodyArea) ||\r\n !result.columnKey ||\r\n (isHeaderArea && isSelectionColumn)\r\n ) {\r\n headerContextMenu.hide();\r\n return false;\r\n }\r\n\r\n if (options.contextMenu === false) {\r\n headerContextMenu.hide();\r\n return false;\r\n }\r\n\r\n event.preventDefault();\r\n filterPanel.hide();\r\n fixedPopup.hide();\r\n hideBodyTooltip();\r\n\r\n if (isHeaderArea) {\r\n onSelectHeader(result.columnKey, result.rect);\r\n }\r\n\r\n const bodyRowIndex =\r\n isBodyArea && typeof result.rowIndex === \"number\" ? result.rowIndex : null;\r\n if (bodyRowIndex != null) {\r\n onSelectBodyRow?.(bodyRowIndex, result.columnKey);\r\n }\r\n const frozenRowPosition =\r\n bodyRowIndex == null ? null : getFrozenRowPosition(bodyRowIndex);\r\n\r\n headerContextMenu.show(\r\n buildListTableContextMenuConfig({\r\n x: event.clientX,\r\n y: event.clientY,\r\n columns: options.columns,\r\n columnKey: result.columnKey,\r\n isHeaderArea,\n isSummaryArea,\n bodyRowIndex,\r\n frozenRowPosition,\r\n density: resolveContextMenuDensity(options.rowHeight),\r\n zoom: params.zoom,\r\n hasCollapsedRows,\r\n contentDownload,\r\n contextMenu: options.contextMenu,\n summaryVisible:\n summaryVisible ?? options.summaryRowHeight !== 0,\n selectionRange: getSelectionRange?.() ?? null,\n rowCount: getRows().length,\n columnCount: getColumns().length,\n actions: createListTableContextMenuActions({\n getRows,\r\n getAllRows,\r\n getColumns,\r\n getHeaderTree,\r\n hideMenu: () => {\r\n headerContextMenu.hide();\r\n },\r\n startExportTask,\r\n onFreezeRow,\r\n onUnfreezeRow,\r\n onToggleExpandRow,\r\n onExpandAllCollapsedRows,\r\n onResetFilter,\r\n onResetSort,\r\n onResetHeader,\r\n onChangeDensity,\r\n onChangeZoom,\r\n onToggleCurrentColumn,\r\n onToggleColumn,\r\n onExpandAllCollapsedColumns,\r\n onClose,\n onToggleSummary,\n onChangeSummaryType,\n onChangeSummaryPrecision,\n onCopySelection,\n onCopyCustomSelection,\n }),\n }),\r\n );\r\n\r\n return true;\r\n}\r\n\r\nfunction resolveContextMenuDensity(\r\n rowHeight: number | \"auto\" | undefined,\r\n): HeaderContextMenuDensity {\r\n if (rowHeight === 48) {\r\n return \"comfortable\";\r\n }\r\n if (rowHeight === 32) {\r\n return \"compact\";\r\n }\r\n return \"middle\";\r\n}\r\n","import type {\r\n DebugHitTestResult,\r\n Rect,\r\n} from \"../../debug/debug-snapshot\";\r\nimport type { ListTableSortState } from \"../../schema/state\";\r\n\r\nexport interface TooltipControllerLike {\r\n show: (\r\n x: number,\r\n y: number,\r\n content: string,\r\n variant?: \"default\" | \"error\",\r\n ) => void;\r\n hide: () => void;\r\n}\r\n\r\n/**\r\n * 生成表头操作按钮 tooltip 文案。\r\n */\r\nexport function getHeaderActionTooltipText(\r\n result: DebugHitTestResult,\r\n sortState: ListTableSortState,\r\n) {\r\n const area = result.area;\r\n if (\r\n area !== \"sort-trigger\" &&\r\n area !== \"filter-trigger\" &&\r\n area !== \"fixed-trigger\"\r\n ) {\r\n return null;\r\n }\r\n\r\n if (area === \"sort-trigger\") {\r\n const isSameColumn = sortState.key === result.columnKey;\r\n if (!isSameColumn || sortState.order === null) {\r\n return \"点击升序\";\r\n }\r\n if (sortState.order === \"ascend\") {\r\n return \"点击降序\";\r\n }\r\n return \"取消排序\";\r\n }\r\n\r\n if (area === \"filter-trigger\") {\r\n return \"筛选\";\r\n }\r\n\r\n return \"固定列\";\r\n}\r\n\r\n/**\r\n * 更新表头操作 tooltip。\r\n */\r\nexport function updateHeaderActionTooltip(params: {\r\n result: DebugHitTestResult;\r\n sortState: ListTableSortState;\r\n tooltip: TooltipControllerLike;\r\n toViewportPoint: (x: number, y: number) => { x: number; y: number };\r\n}) {\r\n const { result, sortState, tooltip, toViewportPoint } = params;\r\n const rect = result.rect;\r\n const text = getHeaderActionTooltipText(result, sortState);\r\n if (!text) {\r\n tooltip.hide();\r\n return;\r\n }\r\n\r\n if (!rect) {\r\n return;\r\n }\r\n\r\n const tooltipPoint = toViewportPoint(\r\n rect.x + rect.width / 2,\r\n rect.y + rect.height + 4,\r\n );\r\n tooltip.show(tooltipPoint.x, tooltipPoint.y, text);\r\n}\r\n\r\n/**\r\n * 显示拖拽反馈 tooltip。\r\n */\r\nexport function showDragTooltip(params: {\r\n tooltip: TooltipControllerLike;\r\n toViewportPoint: (x: number, y: number) => { x: number; y: number };\r\n x: number;\r\n y: number;\r\n text: string;\r\n}) {\r\n const { tooltip, toViewportPoint, x, y, text } = params;\r\n const point = toViewportPoint(x, y + 16);\r\n tooltip.show(point.x, point.y, text);\r\n}\r\n","import type {\r\n ListTableHighlightRange,\r\n ListTableRangeHighlightState,\r\n} from \"../schema/state\";\r\n\r\n/**\r\n * 空区间高亮状态。\r\n */\r\nexport const EMPTY_RANGE_HIGHLIGHT_STATE: ListTableRangeHighlightState = {\r\n selectedRowAnchorIndex: null,\r\n selectedRowRange: null,\r\n selectedColumnAnchorKey: null,\r\n selectedColumnRange: null,\r\n};\r\n\r\n/**\r\n * 判断索引是否命中区间。\r\n */\r\nexport function isIndexInHighlightRange(\r\n index: number,\r\n range: ListTableHighlightRange | null,\r\n) {\r\n return Boolean(range && index >= range.start && index <= range.end);\r\n}\r\n\r\n/**\r\n * 根据内容区点击解析下一份行高亮状态。\r\n */\r\nexport function resolveNextRowHighlight(params: {\r\n current: ListTableRangeHighlightState;\r\n rowIndex: number;\r\n shiftKey: boolean;\r\n}) {\r\n return resolveNextRowHighlightByIndexRange({\r\n current: params.current,\r\n rangeStartIndex: params.rowIndex,\r\n rangeEndIndex: params.rowIndex,\r\n shiftKey: params.shiftKey,\r\n });\r\n}\r\n\r\n/**\r\n * 根据行索引区间解析下一份行高亮状态。\r\n */\r\nexport function resolveNextRowHighlightByIndexRange(params: {\r\n current: ListTableRangeHighlightState;\r\n rangeStartIndex: number;\r\n rangeEndIndex: number;\r\n shiftKey: boolean;\r\n}) {\r\n const rangeStartIndex = Math.max(0, Math.floor(params.rangeStartIndex));\r\n const rangeEndIndex = Math.max(\r\n rangeStartIndex,\r\n Math.floor(params.rangeEndIndex),\r\n );\r\n const anchor =\r\n params.shiftKey && params.current.selectedRowAnchorIndex != null\r\n ? params.current.selectedRowAnchorIndex\r\n : rangeStartIndex;\r\n\r\n return {\r\n ...params.current,\r\n selectedRowAnchorIndex: anchor,\r\n selectedRowRange: createHighlightRange(anchor, rangeEndIndex),\r\n } satisfies ListTableRangeHighlightState;\r\n}\r\n\r\n/**\r\n * 根据右键菜单打开行为解析下一份行高亮状态。\r\n * 命中已有高亮区间时保留范围,命中区间外时回退为当前行。\r\n */\r\nexport function resolveNextRowHighlightForContextMenu(params: {\r\n current: ListTableRangeHighlightState;\r\n rowIndex: number;\r\n}) {\r\n if (\r\n isIndexInHighlightRange(params.rowIndex, params.current.selectedRowRange)\r\n ) {\r\n return params.current;\r\n }\r\n\r\n return resolveNextRowHighlight({\r\n current: params.current,\r\n rowIndex: params.rowIndex,\r\n shiftKey: false,\r\n });\r\n}\r\n\r\n/**\r\n * 根据表头右键菜单打开行为解析下一份列高亮状态。\r\n * 命中已有高亮区间时保留范围,命中区间外时回退为当前表头。\r\n */\r\nexport function resolveNextColumnHighlightForContextMenu(params: {\r\n current: ListTableRangeHighlightState;\r\n columnKey: string;\r\n leafColumnKeys: string[];\r\n rangeStartIndex: number;\r\n rangeEndIndex: number;\r\n}) {\r\n const currentRange = params.current.selectedColumnRange;\r\n if (\r\n currentRange &&\r\n params.rangeStartIndex >= currentRange.start &&\r\n params.rangeEndIndex <= currentRange.end\r\n ) {\r\n return {\r\n ...params.current,\r\n selectedRowAnchorIndex: null,\r\n selectedRowRange: null,\r\n } satisfies ListTableRangeHighlightState;\r\n }\r\n\r\n return resolveNextColumnHighlightForHeaderClick({\r\n ...params,\r\n shiftKey: false,\r\n });\r\n}\r\n\r\n/**\r\n * 解析表头右键快捷操作应作用的列集合。\r\n */\r\nexport function resolveColumnKeysForContextMenuAction(params: {\r\n current: ListTableRangeHighlightState;\r\n columnKey: string;\r\n leafColumnKeys: string[];\r\n rangeStartIndex?: number;\r\n rangeEndIndex?: number;\r\n}) {\r\n const columnIndex = params.leafColumnKeys.indexOf(params.columnKey);\r\n const rangeStartIndex = params.rangeStartIndex ?? columnIndex;\r\n const rangeEndIndex = params.rangeEndIndex ?? columnIndex;\r\n const hasValidTargetRange =\r\n rangeStartIndex >= 0 &&\r\n rangeEndIndex >= rangeStartIndex &&\r\n rangeEndIndex < params.leafColumnKeys.length;\r\n const currentRange = params.current.selectedColumnRange;\r\n if (\r\n currentRange &&\r\n hasValidTargetRange &&\r\n rangeStartIndex >= currentRange.start &&\r\n rangeEndIndex <= currentRange.end\r\n ) {\r\n return params.leafColumnKeys.slice(\r\n currentRange.start,\r\n currentRange.end + 1,\r\n );\r\n }\r\n\r\n if (hasValidTargetRange) {\r\n return params.leafColumnKeys.slice(rangeStartIndex, rangeEndIndex + 1);\r\n }\r\n\r\n return [];\r\n}\r\n\r\n/**\r\n * 根据表头点击解析下一份列高亮状态。\r\n */\r\nexport function resolveNextColumnHighlight(params: {\r\n current: ListTableRangeHighlightState;\r\n columnKey: string;\r\n leafColumnKeys: string[];\r\n shiftKey: boolean;\r\n}) {\r\n const columnIndex = params.leafColumnKeys.indexOf(params.columnKey);\r\n if (columnIndex < 0) {\r\n return params.current;\r\n }\r\n\r\n return resolveNextColumnHighlightByIndexRange({\r\n current: params.current,\r\n columnKey: params.columnKey,\r\n leafColumnKeys: params.leafColumnKeys,\r\n rangeStartIndex: columnIndex,\r\n rangeEndIndex: columnIndex,\r\n shiftKey: params.shiftKey,\r\n });\r\n}\r\n\r\n/**\r\n * 根据表头点击解析下一份列高亮状态。\r\n * 表头点击会覆盖之前的行高亮,只保留最新的列高亮。\r\n */\r\nexport function resolveNextColumnHighlightForHeaderClick(params: {\r\n current: ListTableRangeHighlightState;\r\n columnKey: string;\r\n leafColumnKeys: string[];\r\n rangeStartIndex: number;\r\n rangeEndIndex: number;\r\n shiftKey: boolean;\r\n}) {\r\n const nextCurrent = {\r\n ...params.current,\r\n selectedRowAnchorIndex: null,\r\n selectedRowRange: null,\r\n } satisfies ListTableRangeHighlightState;\r\n\r\n const hasValidRange =\r\n params.rangeStartIndex >= 0 &&\r\n params.rangeEndIndex >= 0 &&\r\n params.rangeStartIndex < params.leafColumnKeys.length &&\r\n params.rangeEndIndex < params.leafColumnKeys.length;\r\n\r\n if (!params.shiftKey) {\r\n const leafColumnIndex = params.leafColumnKeys.indexOf(params.columnKey);\r\n if (leafColumnIndex >= 0) {\r\n return resolveNextColumnHighlightByIndexRange({\r\n ...params,\r\n current: nextCurrent,\r\n rangeStartIndex: leafColumnIndex,\r\n rangeEndIndex: leafColumnIndex,\r\n });\r\n }\r\n\r\n if (hasValidRange) {\r\n return resolveNextColumnHighlightByIndexRange({\r\n ...params,\r\n current: nextCurrent,\r\n });\r\n }\r\n\r\n return {\r\n ...nextCurrent,\r\n selectedColumnAnchorKey: params.columnKey,\r\n selectedColumnRange: null,\r\n } satisfies ListTableRangeHighlightState;\r\n }\r\n\r\n if (hasValidRange) {\r\n return resolveNextColumnHighlightByIndexRange({\r\n ...params,\r\n current: nextCurrent,\r\n });\r\n }\r\n\r\n return resolveNextColumnHighlight({\r\n current: nextCurrent,\r\n columnKey: params.columnKey,\r\n leafColumnKeys: params.leafColumnKeys,\r\n shiftKey: params.shiftKey,\r\n });\r\n}\r\n\r\n/**\r\n * 根据叶子列索引区间解析下一份列高亮状态。\r\n */\r\nexport function resolveNextColumnHighlightByIndexRange(params: {\r\n current: ListTableRangeHighlightState;\r\n columnKey: string;\r\n leafColumnKeys: string[];\r\n rangeStartIndex: number;\r\n rangeEndIndex: number;\r\n shiftKey: boolean;\r\n}) {\r\n if (\r\n params.rangeStartIndex < 0 ||\r\n params.rangeEndIndex < 0 ||\r\n params.rangeStartIndex >= params.leafColumnKeys.length ||\r\n params.rangeEndIndex >= params.leafColumnKeys.length\r\n ) {\r\n return params.current;\r\n }\r\n\r\n const anchorIndex = resolveColumnAnchorIndex({\r\n anchorKey: params.current.selectedColumnAnchorKey,\r\n leafColumnKeys: params.leafColumnKeys,\r\n });\r\n const nextAnchorIndex =\r\n params.shiftKey && anchorIndex != null\r\n ? anchorIndex\r\n : params.rangeStartIndex;\r\n\r\n return {\r\n ...params.current,\r\n selectedColumnAnchorKey:\r\n params.leafColumnKeys[nextAnchorIndex] ?? params.columnKey,\r\n selectedColumnRange: createHighlightRange(\r\n nextAnchorIndex,\r\n params.shiftKey ? params.rangeEndIndex : params.rangeEndIndex,\r\n ),\r\n } satisfies ListTableRangeHighlightState;\r\n}\r\n\r\nfunction resolveColumnAnchorIndex(params: {\r\n anchorKey: string | null;\r\n leafColumnKeys: string[];\r\n}) {\r\n if (!params.anchorKey) {\r\n return null;\r\n }\r\n\r\n const anchorIndex = params.leafColumnKeys.indexOf(params.anchorKey);\r\n return anchorIndex >= 0 ? anchorIndex : null;\r\n}\r\n\r\nfunction createHighlightRange(\r\n start: number,\r\n end: number,\r\n): ListTableHighlightRange {\r\n return {\r\n start: Math.min(start, end),\r\n end: Math.max(start, end),\r\n };\r\n}\r\n\r\n/**\r\n * 标准化高亮模式。\r\n * @default \"row\"\r\n */\r\nexport function resolveHighlightMode(\r\n mode: \"cell\" | \"row\" | \"column\" | \"cross\" | undefined,\r\n): \"cell\" | \"row\" | \"column\" | \"cross\" {\r\n if (mode === \"cell\" || mode === \"column\" || mode === \"cross\") {\r\n return mode;\r\n }\r\n return \"row\";\r\n}\r\n\r\n/**\r\n * 表头选中时重置行高亮;非 shift 时同时清空列高亮。\r\n */\r\nexport function resolveRangeHighlightForHeaderSelection(params: {\r\n current: ListTableRangeHighlightState;\r\n shiftKey: boolean;\r\n}) {\r\n const nextRangeHighlight = {\r\n ...params.current,\r\n selectedRowAnchorIndex: null,\r\n selectedRowRange: null,\r\n };\r\n if (!params.shiftKey) {\r\n nextRangeHighlight.selectedColumnAnchorKey =\r\n EMPTY_RANGE_HIGHLIGHT_STATE.selectedColumnAnchorKey;\r\n nextRangeHighlight.selectedColumnRange =\r\n EMPTY_RANGE_HIGHLIGHT_STATE.selectedColumnRange;\r\n }\r\n return nextRangeHighlight;\r\n}\r\n\r\n/**\r\n * 按高亮模式解析 body 点击后的区间高亮状态。\r\n */\r\nexport function resolveRangeHighlightForBodyInteraction(params: {\r\n current: ListTableRangeHighlightState;\r\n mode: \"cell\" | \"row\" | \"column\" | \"cross\" | undefined;\r\n rowIndex: number;\r\n columnKey: string;\r\n shiftKey: boolean;\r\n rowSpan?: number;\r\n leafColumnKeys: string[];\r\n columnRange: { start: number; end: number } | null;\r\n selectionColumnKey: string;\r\n expandColumnKey: string;\r\n}) {\r\n const mode = resolveHighlightMode(params.mode);\r\n const canHighlightColumn =\r\n params.columnKey !== params.selectionColumnKey &&\r\n params.columnKey !== params.expandColumnKey;\r\n const rangeEndIndex =\r\n params.rowIndex + Math.max(Math.floor(params.rowSpan ?? 1), 1) - 1;\r\n\r\n if (mode === \"cell\") {\r\n return EMPTY_RANGE_HIGHLIGHT_STATE;\r\n }\r\n\r\n if (mode === \"row\") {\r\n return {\r\n ...resolveNextRowHighlightByIndexRange({\r\n current: params.current,\r\n rangeStartIndex: params.rowIndex,\r\n rangeEndIndex,\r\n shiftKey: params.shiftKey,\r\n }),\r\n selectedColumnAnchorKey: null,\r\n selectedColumnRange: null,\r\n };\r\n }\r\n\r\n if (mode === \"column\") {\r\n if (!canHighlightColumn || !params.columnRange) {\r\n return {\r\n ...params.current,\r\n selectedRowAnchorIndex: null,\r\n selectedRowRange: null,\r\n };\r\n }\r\n return {\r\n ...resolveNextColumnHighlightByIndexRange({\r\n current: params.current,\r\n columnKey: params.columnKey,\r\n leafColumnKeys: params.leafColumnKeys,\r\n rangeStartIndex: params.columnRange.start,\r\n rangeEndIndex: params.columnRange.end,\r\n shiftKey: params.shiftKey,\r\n }),\r\n selectedRowAnchorIndex: null,\r\n selectedRowRange: null,\r\n };\r\n }\r\n\r\n // cross:同时维护行区间与列区间\r\n let next: ListTableRangeHighlightState =\r\n resolveNextRowHighlightByIndexRange({\r\n current: params.current,\r\n rangeStartIndex: params.rowIndex,\r\n rangeEndIndex,\r\n shiftKey: params.shiftKey,\r\n });\r\n if (canHighlightColumn && params.columnRange) {\r\n next = resolveNextColumnHighlightByIndexRange({\r\n current: next,\r\n columnKey: params.columnKey,\r\n leafColumnKeys: params.leafColumnKeys,\r\n rangeStartIndex: params.columnRange.start,\r\n rangeEndIndex: params.columnRange.end,\r\n shiftKey: false,\r\n });\r\n }\r\n return next;\r\n}\r\n\r\n/**\r\n * 根据高亮模式判断单元格是否应显示区间高亮。\r\n */\r\nexport function isCellHighlightedByMode(params: {\r\n mode: \"cell\" | \"row\" | \"column\" | \"cross\" | undefined;\r\n isCellSelected: boolean;\r\n isRowRangeSelected: boolean;\r\n isColumnRangeSelected: boolean;\r\n}) {\r\n const mode = resolveHighlightMode(params.mode);\r\n if (mode === \"cell\") {\r\n return params.isCellSelected;\r\n }\r\n if (mode === \"row\") {\r\n return params.isRowRangeSelected;\r\n }\r\n if (mode === \"column\") {\r\n return params.isColumnRangeSelected;\r\n }\r\n // cross:行高亮 + 列高亮(交叉)\r\n return params.isRowRangeSelected || params.isColumnRangeSelected;\r\n}\r\n","import type { DebugHitTestResult } from \"../../debug/debug-snapshot\";\r\n\r\n/**\r\n * 判断两次命中结果是否在交互相关字段上发生变化。\r\n */\r\nexport function didHitResultChange(\r\n currentHit: DebugHitTestResult | null | undefined,\r\n result: DebugHitTestResult,\r\n) {\r\n if (!currentHit) {\r\n return true;\r\n }\r\n\r\n return !(\r\n currentHit.area === result.area &&\r\n currentHit.scrollbarRole === result.scrollbarRole &&\r\n currentHit.columnKey === result.columnKey &&\r\n currentHit.rowIndex === result.rowIndex &&\r\n currentHit.controlType === result.controlType &&\r\n currentHit.contentIndex === result.contentIndex &&\r\n currentHit.contentKey === result.contentKey &&\r\n currentHit.nestedRowKey === result.nestedRowKey &&\r\n currentHit.nestedRowIndex === result.nestedRowIndex &&\r\n currentHit.nestedColumnDataIndex === result.nestedColumnDataIndex &&\r\n currentHit.nestedColumnIndex === result.nestedColumnIndex &&\r\n currentHit.cursor === result.cursor &&\r\n currentHit.tooltipText === result.tooltipText &&\r\n currentHit.tooltipVariant === result.tooltipVariant\r\n );\r\n}\r\n","import type {\r\n ListTableRowDragPayload,\r\n ListTableRowDragZone,\r\n} from \"../../schema/row-drag\";\r\n\r\nexport type {\r\n ListTableRowDragMode,\r\n ListTableRowDragOptions,\r\n ListTableRowDragPayload,\r\n ListTableRowDragSourceInfo,\r\n ListTableRowDragZone,\r\n} from \"../../schema/row-drag\";\r\n\r\nexport type ListTableRowDragPhase = \"idle\" | \"potential\" | \"dragging\";\r\n\r\n/**\r\n * 本表拖拽会话快照。\r\n */\r\nexport interface ListTableRowDragSession {\r\n phase: ListTableRowDragPhase;\r\n rowIndex: number | null;\r\n startClientX: number;\r\n startClientY: number;\r\n currentClientX: number;\r\n currentClientY: number;\r\n payload: ListTableRowDragPayload | null;\r\n hoverZone: ListTableRowDragZone | null;\r\n hoverTableId: string | null;\r\n}\r\n\r\n/**\r\n * 默认载荷类型。\r\n */\r\nexport const DEFAULT_ROW_DRAG_PAYLOAD_TYPE = \"list-table/row\";\r\n\r\n/**\r\n * 默认拖拽启动阈值(像素)。\r\n */\r\nexport const DEFAULT_ROW_DRAG_THRESHOLD = 5;\r\n","import {\r\n DEFAULT_ROW_DRAG_THRESHOLD,\r\n type ListTableRowDragPayload,\r\n type ListTableRowDragPhase,\r\n type ListTableRowDragSession,\r\n type ListTableRowDragZone,\r\n} from \"./row-drag-types\";\r\n\r\n/**\r\n * 创建空闲会话。\r\n */\r\nexport function createIdleRowDragSession(): ListTableRowDragSession {\r\n return {\r\n phase: \"idle\",\r\n rowIndex: null,\r\n startClientX: 0,\r\n startClientY: 0,\r\n currentClientX: 0,\r\n currentClientY: 0,\r\n payload: null,\r\n hoverZone: null,\r\n hoverTableId: null,\r\n };\r\n}\r\n\r\n/**\r\n * 进入 potential:按下行但尚未超过阈值。\r\n */\r\nexport function noteRowDragPotential(params: {\r\n session: ListTableRowDragSession;\r\n rowIndex: number;\r\n clientX: number;\r\n clientY: number;\r\n}): ListTableRowDragSession {\r\n return {\r\n ...params.session,\r\n phase: \"potential\",\r\n rowIndex: params.rowIndex,\r\n startClientX: params.clientX,\r\n startClientY: params.clientY,\r\n currentClientX: params.clientX,\r\n currentClientY: params.clientY,\r\n payload: null,\r\n hoverZone: null,\r\n hoverTableId: null,\r\n };\r\n}\r\n\r\n/**\r\n * 是否已超过启动阈值。\r\n */\r\nexport function isRowDragThresholdExceeded(params: {\r\n session: ListTableRowDragSession;\r\n clientX: number;\r\n clientY: number;\r\n threshold?: number;\r\n}): boolean {\r\n if (params.session.phase !== \"potential\") {\r\n return false;\r\n }\r\n const threshold = params.threshold ?? DEFAULT_ROW_DRAG_THRESHOLD;\r\n const dx = params.clientX - params.session.startClientX;\r\n const dy = params.clientY - params.session.startClientY;\r\n return dx * dx + dy * dy >= threshold * threshold;\r\n}\r\n\r\n/**\r\n * 进入 dragging 并挂上载荷。\r\n */\r\nexport function beginRowDrag(params: {\r\n session: ListTableRowDragSession;\r\n payload: ListTableRowDragPayload;\r\n clientX: number;\r\n clientY: number;\r\n}): ListTableRowDragSession {\r\n return {\r\n ...params.session,\r\n phase: \"dragging\",\r\n payload: params.payload,\r\n currentClientX: params.clientX,\r\n currentClientY: params.clientY,\r\n };\r\n}\r\n\r\n/**\r\n * 更新拖拽中指针与目标悬停信息。\r\n */\r\nexport function moveRowDrag(params: {\r\n session: ListTableRowDragSession;\r\n clientX: number;\r\n clientY: number;\r\n hoverZone?: ListTableRowDragZone | null;\r\n hoverTableId?: string | null;\r\n}): ListTableRowDragSession {\r\n if (params.session.phase === \"idle\") {\r\n return params.session;\r\n }\r\n return {\r\n ...params.session,\r\n currentClientX: params.clientX,\r\n currentClientY: params.clientY,\r\n hoverZone:\r\n params.hoverZone === undefined\r\n ? params.session.hoverZone\r\n : params.hoverZone,\r\n hoverTableId:\r\n params.hoverTableId === undefined\r\n ? params.session.hoverTableId\r\n : params.hoverTableId,\r\n };\r\n}\r\n\r\n/**\r\n * 结束会话回到 idle。\r\n */\r\nexport function endRowDragSession(): ListTableRowDragSession {\r\n return createIdleRowDragSession();\r\n}\r\n\r\n/**\r\n * 当前是否处于指定阶段。\r\n */\r\nexport function isRowDragPhase(\r\n session: ListTableRowDragSession,\r\n phase: ListTableRowDragPhase,\r\n): boolean {\r\n return session.phase === phase;\r\n}\r\n","/**\r\n * 行拖拽插入位置。\r\n */\r\nexport interface RowDragInsertionPosition {\r\n insertIndex: number;\r\n indicatorY: number;\r\n}\r\n\r\n/**\r\n * 根据可见 body 描述符和指针位置解析目标插入位置。\r\n */\r\nexport function resolveRowDragInsertionPosition(params: {\r\n descriptors: Array<{\r\n kind?: string;\r\n rowIndex?: number;\r\n rect: { y: number; height: number };\r\n }>;\r\n pointerY: number;\r\n rowCount: number;\r\n bodyTop: number;\r\n bodyBottom: number;\r\n}): RowDragInsertionPosition {\r\n const bodyTop = Math.max(params.bodyTop, 0);\r\n const bodyBottom = Math.max(params.bodyBottom, bodyTop);\r\n const rowCount = Math.max(params.rowCount, 0);\r\n const rowRects = resolveVisibleRowRects(params.descriptors).sort(\r\n (left, right) => left.top - right.top || left.rowIndex - right.rowIndex,\r\n );\r\n\r\n if (rowRects.length === 0) {\r\n return {\r\n insertIndex: 0,\r\n indicatorY: bodyTop,\r\n };\r\n }\r\n\r\n for (const row of rowRects) {\r\n if (params.pointerY <= (row.top + row.bottom) / 2) {\r\n return {\r\n insertIndex: clamp(row.rowIndex, 0, rowCount),\r\n indicatorY: clamp(row.top, bodyTop, bodyBottom),\r\n };\r\n }\r\n }\r\n\r\n const lastRow = rowRects[rowRects.length - 1]!;\r\n return {\r\n insertIndex: clamp(lastRow.rowIndex + 1, 0, rowCount),\r\n indicatorY: clamp(lastRow.bottom, bodyTop, bodyBottom),\r\n };\r\n}\r\n\r\nfunction resolveVisibleRowRects(\r\n descriptors: Array<{\r\n kind?: string;\r\n rowIndex?: number;\r\n rect: { y: number; height: number };\r\n }>,\r\n) {\r\n const rows = new Map<\r\n number,\r\n { rowIndex: number; top: number; bottom: number; height: number }\r\n >();\r\n\r\n for (const descriptor of descriptors) {\r\n if (descriptor.kind !== \"body\" || descriptor.rowIndex == null) {\r\n continue;\r\n }\r\n const height = Math.max(descriptor.rect.height, 0);\r\n const candidate = {\r\n rowIndex: descriptor.rowIndex,\r\n top: descriptor.rect.y,\r\n bottom: descriptor.rect.y + height,\r\n height,\r\n };\r\n const current = rows.get(descriptor.rowIndex);\r\n if (!current || candidate.height < current.height) {\r\n rows.set(descriptor.rowIndex, candidate);\r\n }\r\n }\r\n\r\n return Array.from(rows.values());\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number) {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n","import type {\r\n ListTableRowDragPayload,\r\n ListTableRowDragZone,\r\n} from \"../features/row-drag/row-drag-types\";\r\n\r\n/**\r\n * 目标表 drop 命中结果。\r\n */\r\nexport interface RowDragHit {\r\n tableId: string;\r\n zone: ListTableRowDragZone;\r\n insertIndex: number | null;\r\n indicatorY: number | null;\r\n /** 行预览释放后落位的视口坐标。 */\r\n previewTarget?: {\r\n left: number;\r\n top: number;\r\n };\r\n}\r\n\r\n/**\r\n * 目标表向总线注册的适配器。\r\n */\r\nexport interface RowDragTargetAdapter {\r\n tableId: string;\r\n /** 是否允许作为放置目标。 */\r\n enabled: () => boolean;\r\n /** 粗筛:指针是否在本表 drop 区域内,并返回 zone。 */\r\n hitTest: (clientX: number, clientY: number) => RowDragHit | null;\r\n /** 是否接受当前载荷。 */\r\n canAccept: (payload: ListTableRowDragPayload, hit: RowDragHit) => boolean;\r\n /** 更新或清除目标表插入指示线。 */\r\n onHoverChange?: (hit: RowDragHit | null) => void;\r\n /** 接受已转换的行数据。 */\r\n accept: (params: {\r\n payload: ListTableRowDragPayload;\r\n hit: RowDragHit;\r\n rows: unknown[];\r\n nativeEvent: MouseEvent;\r\n }) => void | Promise<void>;\r\n}\r\n\r\n/**\r\n * 提交结果。\r\n */\r\nexport interface RowDragCommitResult {\r\n accepted: boolean;\r\n hit: RowDragHit | null;\r\n reason?: \"no-active\" | \"no-hit\" | \"rejected\" | \"accept-error\";\r\n}\r\n\r\ninterface ActiveRowDrag {\r\n payload: ListTableRowDragPayload;\r\n sourceTableId: string;\r\n}\r\n\r\n/**\r\n * 跨表格行拖拽全局总线(进程内单例)。\r\n */\r\nexport class RowDragBus {\r\n private readonly targets = new Map<string, RowDragTargetAdapter>();\r\n private readonly registrationOrder: string[] = [];\r\n private active: ActiveRowDrag | null = null;\r\n private hoveredHit: RowDragHit | null = null;\r\n\r\n /**\r\n * 注册目标表。\r\n */\r\n register(tableId: string, adapter: RowDragTargetAdapter): void {\r\n if (this.targets.has(tableId)) {\r\n if (this.hoveredHit?.tableId === tableId) {\r\n this.targets.get(tableId)?.onHoverChange?.(null);\r\n this.hoveredHit = null;\r\n }\r\n this.targets.set(tableId, adapter);\r\n return;\r\n }\r\n this.targets.set(tableId, adapter);\r\n this.registrationOrder.push(tableId);\r\n }\r\n\r\n /**\r\n * 取消注册。\r\n */\r\n unregister(tableId: string): void {\r\n if (this.hoveredHit?.tableId === tableId) {\r\n this.targets.get(tableId)?.onHoverChange?.(null);\r\n this.hoveredHit = null;\r\n }\r\n this.targets.delete(tableId);\r\n const index = this.registrationOrder.indexOf(tableId);\r\n if (index >= 0) {\r\n this.registrationOrder.splice(index, 1);\r\n }\r\n if (this.active?.sourceTableId === tableId) {\r\n this.finishActiveDrag();\r\n }\r\n }\r\n\r\n /**\r\n * 开始全局拖拽。\r\n */\r\n begin(payload: ListTableRowDragPayload): void {\r\n this.setHoveredHit(null);\r\n this.active = {\r\n payload,\r\n sourceTableId: payload.source.tableId,\r\n };\r\n }\r\n\r\n /**\r\n * 当前活动载荷。\r\n */\r\n getActivePayload(): ListTableRowDragPayload | null {\r\n return this.active?.payload ?? null;\r\n }\r\n\r\n /**\r\n * 按指针位置命中可接收目标(后注册优先,近似上层)。\r\n */\r\n updatePointer(clientX: number, clientY: number): RowDragHit | null {\r\n if (!this.active) {\r\n this.setHoveredHit(null);\r\n return null;\r\n }\r\n const payload = this.active.payload;\r\n for (let i = this.registrationOrder.length - 1; i >= 0; i -= 1) {\r\n const tableId = this.registrationOrder[i]!;\r\n const adapter = this.targets.get(tableId);\r\n if (!adapter || !adapter.enabled()) {\r\n continue;\r\n }\r\n const hit = adapter.hitTest(clientX, clientY);\r\n if (!hit) {\r\n continue;\r\n }\r\n if (!adapter.canAccept(payload, hit)) {\r\n continue;\r\n }\r\n this.setHoveredHit(hit);\r\n return hit;\r\n }\r\n this.setHoveredHit(null);\r\n return null;\r\n }\r\n\r\n /**\r\n * 提交 drop。调用方负责 transform;此处仅做命中与 accept。\r\n */\r\n async commit(params: {\r\n clientX: number;\r\n clientY: number;\r\n nativeEvent: MouseEvent;\r\n resolveRows: (\r\n payload: ListTableRowDragPayload,\r\n hit: RowDragHit,\r\n ) => unknown[] | Promise<unknown[]>;\r\n }): Promise<RowDragCommitResult> {\r\n if (!this.active) {\r\n return { accepted: false, hit: null, reason: \"no-active\" };\r\n }\r\n const active = this.active;\r\n const payload = active.payload;\r\n const hit = this.updatePointer(params.clientX, params.clientY);\r\n if (!hit) {\r\n this.finishActiveDrag(active);\r\n return { accepted: false, hit: null, reason: \"no-hit\" };\r\n }\r\n const adapter = this.targets.get(hit.tableId);\r\n if (!adapter || !adapter.canAccept(payload, hit)) {\r\n this.finishActiveDrag(active);\r\n return { accepted: false, hit, reason: \"rejected\" };\r\n }\r\n try {\r\n const rows = await params.resolveRows(payload, hit);\r\n await adapter.accept({\r\n payload,\r\n hit,\r\n rows,\r\n nativeEvent: params.nativeEvent,\r\n });\r\n this.finishActiveDrag(active);\r\n return { accepted: true, hit };\r\n } catch {\r\n this.finishActiveDrag(active);\r\n return { accepted: false, hit, reason: \"accept-error\" };\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前拖拽。传入载荷时,仅清理对应会话。\r\n */\r\n cancel(expectedPayload?: ListTableRowDragPayload): void {\r\n if (expectedPayload && this.active?.payload !== expectedPayload) {\r\n return;\r\n }\r\n this.finishActiveDrag();\r\n }\r\n\r\n /**\r\n * 测试用:清空全部状态。\r\n */\r\n resetForTests(): void {\r\n this.setHoveredHit(null);\r\n this.targets.clear();\r\n this.registrationOrder.length = 0;\r\n this.active = null;\r\n }\r\n\r\n private finishActiveDrag(expectedActive?: ActiveRowDrag): void {\r\n if (expectedActive && this.active !== expectedActive) {\r\n return;\r\n }\r\n this.active = null;\r\n this.setHoveredHit(null);\r\n }\r\n\r\n private setHoveredHit(hit: RowDragHit | null): void {\r\n const previous = this.hoveredHit;\r\n if (isSameRowDragHit(previous, hit)) {\r\n return;\r\n }\r\n if (previous) {\r\n this.targets.get(previous.tableId)?.onHoverChange?.(null);\r\n }\r\n this.hoveredHit = hit;\r\n if (hit) {\r\n this.targets.get(hit.tableId)?.onHoverChange?.(hit);\r\n }\r\n }\r\n}\r\n\r\nfunction isSameRowDragHit(left: RowDragHit | null, right: RowDragHit | null) {\r\n return (\r\n left?.tableId === right?.tableId &&\r\n left?.zone === right?.zone &&\r\n left?.insertIndex === right?.insertIndex &&\r\n left?.indicatorY === right?.indicatorY &&\r\n left?.previewTarget?.left === right?.previewTarget?.left &&\r\n left?.previewTarget?.top === right?.previewTarget?.top\r\n );\r\n}\r\n\r\n/**\r\n * 默认全局总线实例。\r\n */\r\nexport const rowDragBus = new RowDragBus();\r\n","/**\r\n * 行拖拽截图与浮动预览。\r\n */\r\n\r\nexport interface RowScreenshotRect {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface CaptureRowScreenshotParams {\r\n sourceCanvas: HTMLCanvasElement;\r\n /** 逻辑坐标矩形(与 canvas 绘制坐标系一致,未乘 dpr)。 */\r\n rect: RowScreenshotRect;\r\n /** 内容缩放,默认 1。 */\r\n contentZoom?: number;\r\n devicePixelRatio?: number;\r\n}\r\n\r\nexport interface RowDragPreviewHandle {\r\n element: HTMLDivElement;\r\n image: HTMLImageElement;\r\n updatePosition: (clientX: number, clientY: number) => void;\r\n releaseTo: (left: number, top: number, duration?: number) => Promise<void>;\r\n setDataUrl: (dataUrl: string) => void;\r\n destroy: () => void;\r\n}\r\n\r\n/** 行拖拽浮动预览创建参数。 */\r\nexport interface CreateRowDragPreviewParams {\r\n parent?: HTMLElement;\r\n opacity?: number;\r\n /** 兼容旧定位方式:预览左上角相对指针的水平偏移。 */\r\n offsetX?: number;\r\n /** 兼容旧定位方式:预览左上角相对指针的垂直偏移。 */\r\n offsetY?: number;\r\n /** 指针在行截图内部的水平抓取偏移,设置后优先于 offsetX。 */\r\n grabOffsetX?: number;\r\n /** 指针在行截图内部的垂直抓取偏移,设置后优先于 offsetY。 */\r\n grabOffsetY?: number;\r\n}\r\n\r\nconst PREVIEW_CLASS = \"list-table-row-drag-preview\";\r\nconst PREVIEW_OPACITY = 0.75;\r\nconst PREVIEW_OFFSET_X = 8;\r\nconst PREVIEW_OFFSET_Y = 8;\r\nconst PREVIEW_RELEASE_DURATION = 220;\r\n\r\n/**\r\n * 从主 canvas 裁切指定逻辑矩形为 PNG dataURL。\r\n */\r\nexport function captureRowScreenshotDataUrl(\r\n params: CaptureRowScreenshotParams,\r\n): string | null {\r\n const {\r\n sourceCanvas,\r\n rect,\r\n contentZoom = 1,\r\n devicePixelRatio = typeof window !== \"undefined\"\r\n ? window.devicePixelRatio || 1\r\n : 1,\r\n } = params;\r\n\r\n if (rect.width <= 0 || rect.height <= 0) {\r\n return null;\r\n }\r\n\r\n const scale = devicePixelRatio * (contentZoom > 0 ? contentZoom : 1);\r\n const sx = Math.max(Math.round(rect.x * scale), 0);\r\n const sy = Math.max(Math.round(rect.y * scale), 0);\r\n const sw = Math.max(Math.round(rect.width * scale), 1);\r\n const sh = Math.max(Math.round(rect.height * scale), 1);\r\n\r\n if (sx >= sourceCanvas.width || sy >= sourceCanvas.height) {\r\n return null;\r\n }\r\n\r\n const clippedW = Math.min(sw, sourceCanvas.width - sx);\r\n const clippedH = Math.min(sh, sourceCanvas.height - sy);\r\n if (clippedW <= 0 || clippedH <= 0) {\r\n return null;\r\n }\r\n\r\n const rowCanvas = document.createElement(\"canvas\");\r\n rowCanvas.width = clippedW;\r\n rowCanvas.height = clippedH;\r\n const ctx = rowCanvas.getContext(\"2d\");\r\n if (!ctx) {\r\n return null;\r\n }\r\n\r\n ctx.drawImage(\r\n sourceCanvas,\r\n sx,\r\n sy,\r\n clippedW,\r\n clippedH,\r\n 0,\r\n 0,\r\n clippedW,\r\n clippedH,\r\n );\r\n\r\n try {\r\n return rowCanvas.toDataURL(\"image/png\");\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * 创建跟随指针的半透明行预览 DOM。\r\n */\r\nexport function createRowDragPreview(\r\n params?: CreateRowDragPreviewParams,\r\n): RowDragPreviewHandle {\r\n const parent = params?.parent ?? document.body;\r\n const opacity = params?.opacity ?? PREVIEW_OPACITY;\r\n const offsetX = params?.offsetX ?? PREVIEW_OFFSET_X;\r\n const offsetY = params?.offsetY ?? PREVIEW_OFFSET_Y;\r\n const grabOffsetX =\r\n typeof params?.grabOffsetX === \"number\" &&\r\n Number.isFinite(params.grabOffsetX)\r\n ? params.grabOffsetX\r\n : null;\r\n const grabOffsetY =\r\n typeof params?.grabOffsetY === \"number\" &&\r\n Number.isFinite(params.grabOffsetY)\r\n ? params.grabOffsetY\r\n : null;\r\n\r\n const element = document.createElement(\"div\");\r\n element.className = PREVIEW_CLASS;\r\n element.style.position = \"fixed\";\r\n element.style.left = \"0\";\r\n element.style.top = \"0\";\r\n element.style.zIndex = \"10000\";\r\n element.style.opacity = String(opacity);\r\n element.style.pointerEvents = \"none\";\r\n element.style.transform = \"translate3d(0px, 0px, 0)\";\r\n element.style.willChange = \"transform\";\r\n element.style.boxShadow = \"0 8px 24px rgba(0,0,0,0.18)\";\r\n element.style.borderRadius = \"2px\";\r\n element.style.overflow = \"hidden\";\r\n element.setAttribute(\"aria-hidden\", \"true\");\r\n\r\n const image = document.createElement(\"img\");\r\n image.alt = \"\";\r\n image.draggable = false;\r\n image.style.display = \"block\";\r\n image.style.maxWidth = \"none\";\r\n element.appendChild(image);\r\n parent.appendChild(element);\r\n\r\n const updatePosition = (clientX: number, clientY: number) => {\r\n const pointerX = Number.isFinite(clientX) ? clientX : 0;\r\n const pointerY = Number.isFinite(clientY) ? clientY : 0;\r\n const nextX = pointerX + (grabOffsetX == null ? offsetX : -grabOffsetX);\r\n const nextY = pointerY + (grabOffsetY == null ? offsetY : -grabOffsetY);\r\n element.style.transform = `translate3d(${nextX}px, ${nextY}px, 0)`;\r\n };\r\n\r\n const setDataUrl = (dataUrl: string) => {\r\n image.src = dataUrl;\r\n };\r\n\r\n const releaseTo = (\r\n left: number,\r\n top: number,\r\n duration = PREVIEW_RELEASE_DURATION,\r\n ) => {\r\n const releaseDuration = Math.max(duration, 0);\r\n element.style.transition = [\r\n `transform ${releaseDuration}ms cubic-bezier(0.22, 1, 0.36, 1)`,\r\n `opacity ${releaseDuration}ms ease-out`,\r\n `box-shadow ${releaseDuration}ms ease-out`,\r\n ].join(\", \");\r\n element.getBoundingClientRect();\r\n element.style.transform = `translate3d(${left}px, ${top}px, 0)`;\r\n element.style.opacity = \"0\";\r\n element.style.boxShadow = \"0 2px 8px rgba(0,0,0,0.08)\";\r\n return new Promise<void>((resolve) => {\r\n window.setTimeout(resolve, releaseDuration);\r\n });\r\n };\r\n\r\n const destroy = () => {\r\n element.remove();\r\n };\r\n\r\n return {\r\n element,\r\n image,\r\n updatePosition,\r\n releaseTo,\r\n setDataUrl,\r\n destroy,\r\n };\r\n}\r\n\r\n/**\r\n * 从 body 单元格 descriptors 推导行截图矩形(整行可视宽度)。\r\n */\r\nexport function resolveRowScreenshotRectFromDescriptors(params: {\r\n descriptors: Array<{\r\n kind?: string;\r\n rowIndex?: number;\r\n rect: { x: number; y: number; width: number; height: number };\r\n }>;\r\n rowIndex: number;\r\n tableWidth: number;\r\n}): RowScreenshotRect | null {\r\n const cells = params.descriptors.filter(\r\n (item) => item.kind === \"body\" && item.rowIndex === params.rowIndex,\r\n );\r\n if (cells.length === 0) {\r\n return null;\r\n }\r\n\r\n let minY = Number.POSITIVE_INFINITY;\r\n let maxY = Number.NEGATIVE_INFINITY;\r\n for (const cell of cells) {\r\n minY = Math.min(minY, cell.rect.y);\r\n maxY = Math.max(maxY, cell.rect.y + cell.rect.height);\r\n }\r\n\r\n if (!Number.isFinite(minY) || !Number.isFinite(maxY) || maxY <= minY) {\r\n return null;\r\n }\r\n\r\n return {\r\n x: 0,\r\n y: minY,\r\n width: Math.max(params.tableWidth, 1),\r\n height: maxY - minY,\r\n };\r\n}\r\n","import type {\r\n ListTableRowDragOptions,\r\n ListTableRowDragPayload,\r\n} from \"../features/row-drag/row-drag-types\";\r\n\r\n/**\r\n * 将源载荷转换为目标表行结构。\r\n *\r\n * - 提供 `transform` 时优先调用(可异步)\r\n * - 否则透传 `payload.records`(要求结构兼容)\r\n */\r\nexport async function resolveDropRows<TargetRecord>(params: {\r\n payload: ListTableRowDragPayload;\r\n transform?: ListTableRowDragOptions<TargetRecord>[\"transform\"];\r\n}): Promise<TargetRecord[]> {\r\n if (params.transform) {\r\n const result = await params.transform(params.payload);\r\n return Array.isArray(result) ? result : [];\r\n }\r\n return params.payload.records as TargetRecord[];\r\n}\r\n","import type { DebugHitTestResult } from \"../../debug/debug-snapshot\";\r\nimport type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport { getRowKey } from \"../../domain/rows/row-selection\";\r\nimport {\r\n beginRowDrag,\r\n createIdleRowDragSession,\r\n endRowDragSession,\r\n isRowDragThresholdExceeded,\r\n moveRowDrag,\r\n noteRowDragPotential,\r\n} from \"../../features/row-drag/row-drag-session\";\r\nimport {\r\n DEFAULT_ROW_DRAG_PAYLOAD_TYPE,\r\n DEFAULT_ROW_DRAG_THRESHOLD,\r\n type ListTableRowDragPayload,\r\n type ListTableRowDragSession,\r\n} from \"../../features/row-drag/row-drag-types\";\r\nimport { resolveRowDragInsertionPosition } from \"../../features/row-drag/row-drag-insertion\";\r\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\r\nimport {\r\n rowDragBus,\r\n type RowDragHit,\r\n type RowDragTargetAdapter,\r\n} from \"../../services/row-drag-bus\";\r\nimport {\r\n captureRowScreenshotDataUrl,\r\n createRowDragPreview,\r\n resolveRowScreenshotRectFromDescriptors,\r\n type RowDragPreviewHandle,\r\n} from \"../../services/row-drag-preview-service\";\r\nimport { resolveDropRows } from \"../../services/row-drag-transform-service\";\r\n\r\nlet nextGeneratedTableId = 1;\r\n\r\n/**\r\n * 目标表当前行插入指示线。\r\n */\r\nexport interface ListTableRowDragIndicator {\r\n insertIndex: number;\r\n y: number;\r\n}\r\n\r\ninterface RowDragPreviewCapture {\r\n dataUrl: string;\r\n grabOffsetX: number;\r\n grabOffsetY: number;\r\n}\r\n\r\n/**\r\n * RowDragController 访问核心的最小接口。\r\n */\r\nexport interface ListTableRowDragControllerOptions<RecordType> {\r\n getOptions: () => ListTableOptions<RecordType>;\r\n getTableId: () => string;\r\n getCanvasElement: () => HTMLCanvasElement | null;\r\n getWrapperElement: () => HTMLDivElement | null;\r\n getCurrentRenderSnapshot: () => ListTableRenderSnapshot<RecordType> | null;\r\n getDescriptors: () => RenderCellDescriptor[];\r\n getDisplayData: () => RecordType[];\r\n getTableZoom: () => number;\r\n isBusyWithOtherDrag: () => boolean;\r\n isEditing: () => boolean;\r\n suppressNextClick: () => void;\r\n requestRender: () => void;\r\n}\r\n\r\n/**\r\n * 协调本表行拖出、预览、跨表 bus 注册与 drop 回调。\r\n */\r\nexport class ListTableRowDragController<RecordType> {\r\n private readonly options: ListTableRowDragControllerOptions<RecordType>;\r\n private session: ListTableRowDragSession = createIdleRowDragSession();\r\n private preview: RowDragPreviewHandle | null = null;\r\n private registeredTableId: string | null = null;\r\n private keydownHandler: ((event: KeyboardEvent) => void) | null = null;\r\n private dropIndicator: ListTableRowDragIndicator | null = null;\r\n private potentialPointer: { x: number; y: number } | null = null;\r\n\r\n constructor(options: ListTableRowDragControllerOptions<RecordType>) {\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * 同步注册到全局 bus(options 变更后可重复调用)。\r\n */\r\n syncRegistration(): void {\r\n const tableId = this.options.getTableId();\r\n const rowDrag = this.options.getOptions().rowDrag;\r\n const shouldRegister = Boolean(rowDrag?.droppable || rowDrag?.enabled);\r\n\r\n if (this.registeredTableId && this.registeredTableId !== tableId) {\r\n rowDragBus.unregister(this.registeredTableId);\r\n this.registeredTableId = null;\r\n }\r\n\r\n if (!shouldRegister) {\r\n if (this.registeredTableId) {\r\n rowDragBus.unregister(this.registeredTableId);\r\n this.registeredTableId = null;\r\n }\r\n return;\r\n }\r\n\r\n rowDragBus.register(tableId, this.createAdapter(tableId));\r\n this.registeredTableId = tableId;\r\n }\r\n\r\n /**\r\n * 当前是否 potential / dragging。\r\n */\r\n isActive(): boolean {\r\n return this.session.phase !== \"idle\";\r\n }\r\n\r\n isDragging(): boolean {\r\n return this.session.phase === \"dragging\";\r\n }\r\n\r\n isPotential(): boolean {\r\n return this.session.phase === \"potential\";\r\n }\r\n\r\n getSession(): ListTableRowDragSession {\r\n return this.session;\r\n }\r\n\r\n /**\r\n * 获取目标表当前行插入指示线。\r\n */\r\n getDropIndicator(): ListTableRowDragIndicator | null {\r\n return this.dropIndicator;\r\n }\r\n\r\n /**\r\n * mousedown 在可拖 body 行上时记录 potential。\r\n */\r\n notePotentialStart(params: {\r\n rowIndex: number;\r\n clientX: number;\r\n clientY: number;\r\n pointerX?: number;\r\n pointerY?: number;\r\n }): boolean {\r\n if (this.options.isBusyWithOtherDrag()) {\r\n return false;\r\n }\r\n if (this.options.isEditing()) {\r\n return false;\r\n }\r\n const rowDrag = this.options.getOptions().rowDrag;\r\n if (!rowDrag?.enabled) {\r\n return false;\r\n }\r\n\r\n const record = this.options.getDisplayData()[params.rowIndex];\r\n if (record === undefined) {\r\n return false;\r\n }\r\n if (\r\n rowDrag.canDragRow &&\r\n !rowDrag.canDragRow({ record, rowIndex: params.rowIndex })\r\n ) {\r\n return false;\r\n }\r\n\r\n this.session = noteRowDragPotential({\r\n session: createIdleRowDragSession(),\r\n rowIndex: params.rowIndex,\r\n clientX: params.clientX,\r\n clientY: params.clientY,\r\n });\r\n this.potentialPointer =\r\n typeof params.pointerX === \"number\" &&\r\n Number.isFinite(params.pointerX) &&\r\n typeof params.pointerY === \"number\" &&\r\n Number.isFinite(params.pointerY)\r\n ? { x: params.pointerX, y: params.pointerY }\r\n : null;\r\n return true;\r\n }\r\n\r\n /**\r\n * mousemove:阈值判断与拖拽移动。\r\n * @returns 是否消费该事件(dragging 时应阻止其他拖拽逻辑)\r\n */\r\n handlePointerMove(event: MouseEvent): boolean {\r\n if (this.session.phase === \"idle\") {\r\n return false;\r\n }\r\n\r\n if (this.session.phase === \"potential\") {\r\n const threshold =\r\n this.options.getOptions().rowDrag?.dragThreshold ??\r\n DEFAULT_ROW_DRAG_THRESHOLD;\r\n if (\r\n !isRowDragThresholdExceeded({\r\n session: this.session,\r\n clientX: event.clientX,\r\n clientY: event.clientY,\r\n threshold,\r\n })\r\n ) {\r\n this.session = moveRowDrag({\r\n session: this.session,\r\n clientX: event.clientX,\r\n clientY: event.clientY,\r\n });\r\n return true;\r\n }\r\n if (this.options.isBusyWithOtherDrag() || this.options.isEditing()) {\r\n this.cancel();\r\n return true;\r\n }\r\n this.beginFromPotential(event);\r\n return true;\r\n }\r\n\r\n const hit = rowDragBus.updatePointer(event.clientX, event.clientY);\r\n this.session = moveRowDrag({\r\n session: this.session,\r\n clientX: event.clientX,\r\n clientY: event.clientY,\r\n hoverZone: hit?.zone ?? null,\r\n hoverTableId: hit?.tableId ?? null,\r\n });\r\n this.preview?.updatePosition(event.clientX, event.clientY);\r\n return true;\r\n }\r\n\r\n /**\r\n * mouseup:提交或取消。\r\n * @returns 是否消费该事件\r\n */\r\n async handlePointerUp(event: MouseEvent): Promise<boolean> {\r\n if (this.session.phase === \"idle\") {\r\n return false;\r\n }\r\n\r\n if (this.session.phase === \"potential\") {\r\n this.session = endRowDragSession();\r\n this.potentialPointer = null;\r\n return true;\r\n }\r\n\r\n const payload = this.session.payload;\r\n if (!payload) {\r\n this.cancel();\r\n return true;\r\n }\r\n\r\n this.options.suppressNextClick();\r\n const releaseHit = rowDragBus.updatePointer(event.clientX, event.clientY);\r\n this.releasePreview(releaseHit);\r\n try {\r\n const result = await rowDragBus.commit({\r\n clientX: event.clientX,\r\n clientY: event.clientY,\r\n nativeEvent: event,\r\n resolveRows: async (activePayload) => activePayload.records,\r\n });\r\n\r\n if (result.accepted) {\r\n await this.notifySourceRemoveIfNeeded(payload, result.hit?.tableId);\r\n }\r\n } finally {\r\n rowDragBus.cancel(payload);\r\n this.teardownPreviewAndSession();\r\n this.options.requestRender();\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * 取消拖拽。\r\n */\r\n cancel(): void {\r\n if (this.session.phase === \"dragging\") {\r\n rowDragBus.cancel(this.session.payload ?? undefined);\r\n }\r\n this.teardownPreviewAndSession();\r\n this.options.requestRender();\r\n }\r\n\r\n destroy(): void {\r\n this.cancel();\r\n if (this.registeredTableId) {\r\n rowDragBus.unregister(this.registeredTableId);\r\n this.registeredTableId = null;\r\n }\r\n }\r\n\r\n private beginFromPotential(event: MouseEvent): void {\r\n const rowIndex = this.session.rowIndex;\r\n if (rowIndex == null) {\r\n this.cancel();\r\n return;\r\n }\r\n\r\n const payload = this.buildPayload(rowIndex);\r\n if (!payload) {\r\n this.cancel();\r\n return;\r\n }\r\n\r\n const previewCapture = this.capturePreview(rowIndex);\r\n if (previewCapture) {\r\n payload.previewDataUrl = previewCapture.dataUrl;\r\n }\r\n\r\n this.session = beginRowDrag({\r\n session: this.session,\r\n payload,\r\n clientX: event.clientX,\r\n clientY: event.clientY,\r\n });\r\n\r\n rowDragBus.begin(payload);\r\n this.showPreview(previewCapture, event.clientX, event.clientY);\r\n this.attachEscapeHandler();\r\n this.options.suppressNextClick();\r\n this.options.requestRender();\r\n }\r\n\r\n private buildPayload(rowIndex: number): ListTableRowDragPayload | null {\r\n const options = this.options.getOptions();\r\n const rowDrag = options.rowDrag;\r\n if (!rowDrag?.enabled) {\r\n return null;\r\n }\r\n const record = this.options.getDisplayData()[rowIndex];\r\n if (record === undefined) {\r\n return null;\r\n }\r\n\r\n const snapshot = this.options.getCurrentRenderSnapshot();\r\n const leafColumns = snapshot?.leafColumns ?? [];\r\n const payloadType = rowDrag.payloadType ?? DEFAULT_ROW_DRAG_PAYLOAD_TYPE;\r\n const tableId = this.options.getTableId();\r\n const rowKey = getRowKey(options, record, rowIndex);\r\n\r\n return {\r\n version: 1,\r\n type: payloadType,\r\n source: {\r\n tableId,\r\n payloadType,\r\n },\r\n rowKeys: [rowKey],\r\n records: [structuredCloneSafe(record)],\r\n columns: leafColumns.map((column) => ({\r\n key: column.key,\r\n dataIndex: column.dataIndex as\r\n | string\r\n | number\r\n | Array<string | number>\r\n | undefined,\r\n title: typeof column.title === \"string\" ? column.title : undefined,\r\n })),\r\n };\r\n }\r\n\r\n private capturePreview(rowIndex: number): RowDragPreviewCapture | null {\r\n const canvas = this.options.getCanvasElement();\r\n const snapshot = this.options.getCurrentRenderSnapshot();\r\n if (!canvas || !snapshot) {\r\n return null;\r\n }\r\n const rect = resolveRowScreenshotRectFromDescriptors({\r\n descriptors: this.options.getDescriptors(),\r\n rowIndex,\r\n tableWidth: snapshot.width,\r\n });\r\n if (!rect) {\r\n return null;\r\n }\r\n const dataUrl = captureRowScreenshotDataUrl({\r\n sourceCanvas: canvas,\r\n rect,\r\n contentZoom: this.options.getTableZoom(),\r\n devicePixelRatio:\r\n typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1,\r\n });\r\n if (!dataUrl) {\r\n return null;\r\n }\r\n\r\n const zoom = resolveValidZoom(this.options.getTableZoom());\r\n const bounds = canvas.getBoundingClientRect();\r\n const fallbackPointer = {\r\n x: (this.session.startClientX - bounds.left) / zoom,\r\n y: (this.session.startClientY - bounds.top) / zoom,\r\n };\r\n const pointer = this.potentialPointer ?? fallbackPointer;\r\n return {\r\n dataUrl,\r\n grabOffsetX: clamp((pointer.x - rect.x) * zoom, 0, rect.width * zoom),\r\n grabOffsetY: clamp((pointer.y - rect.y) * zoom, 0, rect.height * zoom),\r\n };\r\n }\r\n\r\n private showPreview(\r\n capture: RowDragPreviewCapture | null,\r\n clientX: number,\r\n clientY: number,\r\n ): void {\r\n this.preview?.destroy();\r\n this.preview = createRowDragPreview(\r\n capture\r\n ? {\r\n grabOffsetX: capture.grabOffsetX,\r\n grabOffsetY: capture.grabOffsetY,\r\n }\r\n : undefined,\r\n );\r\n if (capture) {\r\n this.preview.setDataUrl(capture.dataUrl);\r\n }\r\n this.preview.updatePosition(clientX, clientY);\r\n }\r\n\r\n private createAdapter(tableId: string): RowDragTargetAdapter {\r\n return {\r\n tableId,\r\n enabled: () => Boolean(this.options.getOptions().rowDrag?.droppable),\r\n hitTest: (clientX, clientY) => this.hitTestDropZone(clientX, clientY),\r\n canAccept: (payload, hit) => this.canAcceptPayload(payload, hit),\r\n onHoverChange: (hit) => {\r\n this.setDropIndicator(hit);\r\n },\r\n accept: async ({ payload, hit, rows, nativeEvent }) => {\r\n const rowDrag = this.options.getOptions().rowDrag;\r\n if (!rowDrag?.onDrop) {\r\n return;\r\n }\r\n const transformed = await resolveDropRows<RecordType>({\r\n payload: {\r\n ...payload,\r\n records: rows.length > 0 ? rows : payload.records,\r\n },\r\n transform: rowDrag.transform,\r\n });\r\n await rowDrag.onDrop({\r\n rows: transformed,\r\n zone: hit.zone,\r\n insertIndex: hit.insertIndex,\r\n source: payload.source,\r\n nativeEvent,\r\n });\r\n },\r\n };\r\n }\r\n\r\n private hitTestDropZone(clientX: number, clientY: number): RowDragHit | null {\r\n const wrapper = this.options.getWrapperElement();\r\n const snapshot = this.options.getCurrentRenderSnapshot();\r\n const rowDrag = this.options.getOptions().rowDrag;\r\n if (!wrapper || !snapshot || !rowDrag?.droppable) {\r\n return null;\r\n }\r\n\r\n const bounds = wrapper.getBoundingClientRect();\r\n if (\r\n clientX < bounds.left ||\r\n clientX > bounds.right ||\r\n clientY < bounds.top ||\r\n clientY > bounds.bottom\r\n ) {\r\n return null;\r\n }\r\n\r\n const acceptZones = rowDrag.acceptZones ?? [\"body\"];\r\n const zoom = resolveValidZoom(this.options.getTableZoom());\r\n const localY = (clientY - bounds.top) / zoom;\r\n const { bodyLayout, hasSummary } = snapshot;\r\n\r\n if (\r\n hasSummary &&\r\n acceptZones.includes(\"summary\") &&\r\n localY >= bodyLayout.summaryTop &&\r\n localY <= bodyLayout.summaryTop + bodyLayout.summaryHeight\r\n ) {\r\n return {\r\n tableId: this.options.getTableId(),\r\n zone: \"summary\",\r\n insertIndex: null,\r\n indicatorY: null,\r\n previewTarget: {\r\n left: bounds.left,\r\n top: bounds.top + bodyLayout.summaryTop * zoom,\r\n },\r\n };\r\n }\r\n\r\n const bodyTop = bodyLayout.scrollBodyTop - bodyLayout.topFrozenHeight;\r\n const bodyBottom = bodyLayout.summaryTop;\r\n if (acceptZones.includes(\"body\") && snapshot.displayRows.length === 0) {\r\n return {\r\n tableId: this.options.getTableId(),\r\n zone: \"body\",\r\n insertIndex: 0,\r\n indicatorY: bodyTop,\r\n previewTarget: {\r\n left: bounds.left,\r\n top: bounds.top + bodyTop * zoom,\r\n },\r\n };\r\n }\r\n if (\r\n acceptZones.includes(\"body\") &&\r\n localY >= bodyTop &&\r\n localY <= bodyBottom\r\n ) {\r\n const insertion = resolveRowDragInsertionPosition({\r\n descriptors: this.options.getDescriptors(),\r\n pointerY: localY,\r\n rowCount: snapshot.displayRows.length,\r\n bodyTop,\r\n bodyBottom,\r\n });\r\n return {\r\n tableId: this.options.getTableId(),\r\n zone: \"body\",\r\n insertIndex: insertion.insertIndex,\r\n indicatorY: insertion.indicatorY,\r\n previewTarget: {\r\n left: bounds.left,\r\n top: bounds.top + insertion.indicatorY * zoom,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private canAcceptPayload(\r\n payload: ListTableRowDragPayload,\r\n hit: RowDragHit,\r\n ): boolean {\r\n const rowDrag = this.options.getOptions().rowDrag;\r\n if (!rowDrag?.droppable) {\r\n return false;\r\n }\r\n\r\n const acceptZones = rowDrag.acceptZones ?? [\"body\"];\r\n if (!acceptZones.includes(hit.zone)) {\r\n return false;\r\n }\r\n\r\n const selfTableId = this.options.getTableId();\r\n if (payload.source.tableId === selfTableId && !rowDrag.allowSelfDrop) {\r\n return false;\r\n }\r\n\r\n const acceptTypes = rowDrag.acceptTypes ?? [\r\n rowDrag.payloadType ?? DEFAULT_ROW_DRAG_PAYLOAD_TYPE,\r\n ];\r\n if (!acceptTypes.includes(payload.type)) {\r\n return false;\r\n }\r\n\r\n if (\r\n rowDrag.canDrop &&\r\n !rowDrag.canDrop({\r\n payload,\r\n zone: hit.zone,\r\n insertIndex: hit.insertIndex,\r\n })\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private setDropIndicator(hit: RowDragHit | null): void {\r\n const next =\r\n hit?.zone === \"body\" && hit.indicatorY != null\r\n ? {\r\n insertIndex: hit.insertIndex ?? 0,\r\n y: hit.indicatorY,\r\n }\r\n : null;\r\n if (\r\n this.dropIndicator?.insertIndex === next?.insertIndex &&\r\n this.dropIndicator?.y === next?.y\r\n ) {\r\n return;\r\n }\r\n this.dropIndicator = next;\r\n this.options.requestRender();\r\n }\r\n\r\n private async notifySourceRemoveIfNeeded(\r\n payload: ListTableRowDragPayload,\r\n targetTableId?: string,\r\n ): Promise<void> {\r\n const rowDrag = this.options.getOptions().rowDrag;\r\n if (!rowDrag || rowDrag.mode !== \"move\") {\r\n return;\r\n }\r\n if (targetTableId === payload.source.tableId) {\r\n return;\r\n }\r\n if (!rowDrag.onDragEndRemove) {\r\n if (typeof console !== \"undefined\") {\r\n console.warn(\r\n \"[list-table] rowDrag.mode=move 但未提供 onDragEndRemove,降级为 copy。\",\r\n );\r\n }\r\n return;\r\n }\r\n await rowDrag.onDragEndRemove({\r\n keys: payload.rowKeys,\r\n records: payload.records,\r\n });\r\n }\r\n\r\n private attachEscapeHandler(): void {\r\n this.detachEscapeHandler();\r\n this.keydownHandler = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n this.cancel();\r\n }\r\n };\r\n window.addEventListener(\"keydown\", this.keydownHandler);\r\n }\r\n\r\n private detachEscapeHandler(): void {\r\n if (this.keydownHandler) {\r\n window.removeEventListener(\"keydown\", this.keydownHandler);\r\n this.keydownHandler = null;\r\n }\r\n }\r\n\r\n private releasePreview(hit: RowDragHit | null): void {\r\n const preview = this.preview;\r\n const target = hit?.previewTarget;\r\n if (!preview || !target) {\r\n return;\r\n }\r\n\r\n this.preview = null;\r\n void preview.releaseTo(target.left, target.top).finally(() => {\r\n preview.destroy();\r\n });\r\n }\r\n\r\n private teardownPreviewAndSession(): void {\r\n this.preview?.destroy();\r\n this.preview = null;\r\n this.detachEscapeHandler();\r\n this.session = endRowDragSession();\r\n this.potentialPointer = null;\r\n }\r\n}\r\n\r\n/**\r\n * 解析或生成 tableId。\r\n */\r\nexport function resolveListTableId(options: {\r\n tableId?: string;\r\n existing?: string | null;\r\n}): string {\r\n if (options.tableId && options.tableId.trim()) {\r\n return options.tableId;\r\n }\r\n if (options.existing) {\r\n return options.existing;\r\n }\r\n const id = `list-table-${nextGeneratedTableId}`;\r\n nextGeneratedTableId += 1;\r\n return id;\r\n}\r\n\r\n/**\r\n * 是否允许在给定 hit 上启动行拖拽 potential。\r\n */\r\nexport function canStartRowDragFromHit(params: {\r\n result: DebugHitTestResult;\r\n enabled: boolean;\r\n busy: boolean;\r\n editing: boolean;\r\n}): boolean {\r\n if (!params.enabled || params.busy || params.editing) {\r\n return false;\r\n }\r\n const area = params.result.area;\r\n if (area !== \"body\" && area !== \"body-content\" && area !== \"body-control\") {\r\n return false;\r\n }\r\n return typeof params.result.rowIndex === \"number\";\r\n}\r\n\r\nfunction structuredCloneSafe<T>(value: T): T {\r\n if (typeof structuredClone === \"function\") {\r\n try {\r\n return structuredClone(value);\r\n } catch {\r\n // fall through\r\n }\r\n }\r\n try {\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n } catch {\r\n return value;\r\n }\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nfunction resolveValidZoom(value: number): number {\r\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\r\n ? value\r\n : 1;\r\n}\r\n","import type { HoverState } from \"../../schema/state\";\nimport { getValueByDataIndex } from \"../../domain/data/get-value-by-data-index\";\nimport {\n DEFAULT_HEADER_ROW_HEIGHT,\n DEFAULT_ROW_HEIGHT,\n DEFAULT_SUMMARY_ROW_HEIGHT,\n FALLBACK_TABLE_HEIGHT,\n FALLBACK_TABLE_WIDTH,\n HORIZONTAL_SCROLL_STEP,\n} from \"../../domain/constants\";\nimport { findNormalizedColumnByKey } from \"../../features/column-reorder/column-reorder-feature\";\nimport {\n getHeaderNodeMovableLeafColumns,\n startColumnReorderDrag,\n updateColumnReorderDrag,\n commitColumnReorder,\n getHeaderNodeReorderBoundsByKey,\n} from \"../../features/column-reorder/column-reorder-feature\";\nimport {\n finishColumnResizeDrag,\n startColumnResizeDrag,\n updateColumnResizeDrag,\n} from \"../../features/column-resize/column-resize-feature\";\nimport {\n dragScrollbarScroll,\n jumpScrollbarScroll,\n resolveWheelScrollDelta,\n shouldApplyWheelDeltaImmediately,\n stepScrollbarScroll,\n} from \"../../features/scroll/scroll-feature\";\nimport { showHeaderContextMenu } from \"../../features/overlay/overlay-feature\";\nimport { showDragTooltip } from \"../../features/tooltip/tooltip-feature\";\nimport {\n canEditCell,\n shouldOpenCellEditorOnClick,\n} from \"../../features/editing/editing-utils\";\nimport {\n emitBodyCellContentClick,\n hydrateBodyContentHitResult,\n resolveHitCellContent,\n} from \"../../services/cell-content-action-service\";\nimport { resolveNextRowHighlightForContextMenu } from \"../../services/range-highlight-service\";\nimport { shouldCommitHeaderReorder } from \"../../domain/columns/header-reorder\";\nimport {\n EXPAND_COLUMN_KEY,\n ROW_SELECTION_COLUMN_KEY,\n} from \"../../domain/rows/row-selection\";\nimport { didHitResultChange } from \"../../shared/utils/hit-result\";\nimport type { ListTableEventHost } from \"../../adapters/event-host\";\nimport { canStartRowDragFromHit } from \"./row-drag-controller\";\nimport {\n resolveAdjacentCellSelection,\n resolveTabCellSelection,\n type ListTableCellNavigateDirection,\n} from \"../../interaction/selection\";\nimport { copyText, copyTextSync } from \"@canvas-components/utils\";\nimport {\n createListTableRangeCopyText,\n createListTableSelectionCopyText,\n} from \"../../services/clipboard-service\";\nimport type { ListTableColumn, ListTableSummaryType } from \"../../schema/column\";\n\n/**\n * 协调 ListTable 的 canvas/window 事件绑定与分发。\n */\nexport class ListTableEventController<RecordType> {\n private cellSelectionDrag: {\n startRowIndex: number;\n startColumnIndex: number;\n } | null = null;\n private cellSelectionDragged = false;\n private cellSelectionPointer: { clientX: number; clientY: number } | null =\n null;\n private cellSelectionAutoScrollTimer: number | null = null;\n private cellSelectionAutoScrollDirection: {\n horizontal: -1 | 0 | 1;\n vertical: -1 | 0 | 1;\n } = { horizontal: 0, vertical: 0 };\n private continuousScrollTimer: number | null = null;\n private readonly host: ListTableEventHost<RecordType>;\n\n constructor(host: ListTableEventHost<RecordType>) {\n this.host = host;\n }\n\n destroy() {\n this.stopContinuousScroll();\n this.stopCellSelectionAutoScroll();\n this.host.rowDragController.cancel();\n this.host.canvasHost.unbindWindowDragEvents();\n }\n\n isContinuousScrollActive() {\n return this.continuousScrollTimer != null;\n }\n\n bind() {\n this.host.canvasHost.bindCanvasEvents({\n keydown: this.handleKeyDown,\n wheel: this.handleWheel,\n mousemove: this.handleMouseMove,\n mouseleave: this.handleMouseLeave,\n click: this.handleClick,\n dblclick: this.handleDoubleClick,\n mousedown: this.handleMouseDown,\n contextmenu: this.handleContextMenu,\n });\n }\n\n readonly handleKeyDown = (event: KeyboardEvent) => {\n if (this.host.editingController.hasSession()) {\n return;\n }\n\n if (\n (event.ctrlKey || event.metaKey) &&\n !event.altKey &&\n (event.key.toLocaleLowerCase() === \"c\" || event.code === \"KeyC\")\n ) {\n const text = createListTableSelectionCopyText({\n rows: this.host.getDisplayData(),\n columns: this.host.leafColumns,\n selection: this.host.selection,\n rangeHighlight: this.host.rangeHighlight,\n highlightMode: this.host.options.highlightMode,\n });\n if (text == null) return;\n event.preventDefault();\n const ownerDocument =\n this.host.canvasElement?.ownerDocument ?? globalThis.document;\n if (!copyTextSync(text, ownerDocument)) {\n void copyText(text);\n }\n return;\n }\n\n const direction = resolveCellNavigateDirection(event.key);\n if (!direction && event.key !== \"Tab\") {\n this.handleCellTyping(event);\n return;\n }\n\n const navigationParams = {\n selection: this.host.selection,\n rowCount: this.host.getDisplayData().length,\n columnKeys: this.host.leafColumns\n .filter(\n (column) =>\n column.key !== ROW_SELECTION_COLUMN_KEY &&\n column.key !== EXPAND_COLUMN_KEY,\n )\n .map((column) => column.key),\n };\n const target = direction\n ? resolveAdjacentCellSelection({ ...navigationParams, direction })\n : resolveTabCellSelection({\n ...navigationParams,\n reverse: event.shiftKey,\n });\n if (!target) {\n return;\n }\n\n event.preventDefault();\n this.host.selection = target;\n this.host.clearSelectedHeader();\n this.host.summarySelected = false;\n this.host.updateRangeHighlightForBodyInteraction({\n rowIndex: target.rowIndex,\n columnKey: target.columnKey,\n shiftKey: false,\n });\n\n const renderTarget = () => {\n this.host.render();\n };\n const scrolled = this.host.editingController.ensureCellVisibleForEditing(\n target.rowIndex,\n target.columnKey,\n renderTarget,\n );\n if (!scrolled) {\n renderTarget();\n }\n };\n\n private handleCellTyping(event: KeyboardEvent) {\n if (\n event.key.length !== 1 ||\n event.ctrlKey ||\n event.metaKey ||\n event.altKey ||\n this.host.selection.rowIndex == null ||\n this.host.selection.columnKey == null\n ) {\n return;\n }\n\n const rowIndex = this.host.selection.rowIndex;\n const columnKey = this.host.selection.columnKey;\n const column = this.host.leafColumns.find((item) => item.key === columnKey);\n const record = this.host.getDisplayData()[rowIndex];\n const value =\n column && record && column.dataIndex != null\n ? getValueByDataIndex(record, column.dataIndex)\n : undefined;\n if (\n !column ||\n !record ||\n !canEditCell(column, { value, record, rowIndex })\n ) {\n return;\n }\n\n event.preventDefault();\n this.host.editingController.open(rowIndex, columnKey, event.key);\n }\n\n readonly handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n this.host.stopScrollToAnimation();\n this.host.stopCarouselScrollAnimation();\n this.host.bodyTooltipController.clear();\n this.host.headerContextMenu.hide();\n\n const snapshot = this.host.currentRenderSnapshot;\n const lineHeight = snapshot?.rowHeight ?? DEFAULT_ROW_HEIGHT;\n const pageWidth = Math.max(\n snapshot?.columnMetrics.availableCenterWidth ??\n this.host.canvasElement?.clientWidth ??\n FALLBACK_TABLE_WIDTH,\n lineHeight,\n );\n const pageHeight = Math.max(\n snapshot?.bodyLayout.scrollBodyHeight ??\n snapshot?.viewport.bodyHeight ??\n this.host.canvasElement?.clientHeight ??\n FALLBACK_TABLE_HEIGHT,\n lineHeight,\n );\n const delta = resolveWheelScrollDelta({\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n shiftKey: event.shiftKey,\n lineHeight,\n pageWidth,\n pageHeight,\n zoom: this.host.tableZoom,\n });\n if (delta.left === 0 && delta.top === 0) {\n return;\n }\n\n const baseScroll = this.host.animationController.getWheelScrollTarget() ??\n this.host.scroll ?? { left: 0, top: 0 };\n const maxScrollLeft = Math.max(\n snapshot?.viewport.maxScrollLeft ?? Number.POSITIVE_INFINITY,\n 0,\n );\n const maxScrollTop = Math.max(\n snapshot?.viewport.maxScrollTop ?? Number.POSITIVE_INFINITY,\n 0,\n );\n const nextTarget = {\n left: Math.min(Math.max(baseScroll.left + delta.left, 0), maxScrollLeft),\n top: Math.min(Math.max(baseScroll.top + delta.top, 0), maxScrollTop),\n };\n const immediate = shouldApplyWheelDeltaImmediately({\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n });\n\n this.host.filterPanel.hide();\n this.host.fixedPopup.hide();\n this.host.headerContextMenu.hide();\n this.host.markScrollbarActive();\n\n if (immediate) {\n this.host.stopWheelScrollSmoothing();\n if (!this.host.applyUserScroll(nextTarget)) {\n return;\n }\n this.host.scheduleRender();\n if (delta.top !== 0) {\n this.host.maybeLoadNextScrollPage();\n }\n return;\n }\n\n this.host.animationController.startWheelScrollSmoothing(nextTarget);\n };\n\n readonly handleMouseMove = (event: MouseEvent) => {\n this.host.pauseCarouselScrollByPointer();\n if (\n this.host.draggingScrollbar ||\n this.host.draggingResize ||\n !this.host.canvasElement\n ) {\n return;\n }\n\n const position = this.host.canvasHost.getPointerPosition(\n event.clientX,\n event.clientY,\n );\n const result = this.host.resolvePointerHit(position.x, position.y);\n const nextHover = {\n rowIndex: result.rowIndex ?? null,\n columnKey: result.columnKey ?? null,\n area: result.area,\n } satisfies HoverState;\n const hoverChanged =\n this.host.hover.rowIndex !== nextHover.rowIndex ||\n this.host.hover.columnKey !== nextHover.columnKey ||\n this.host.hover.area !== nextHover.area;\n const hitChanged = didHitResultChange(\n this.host.debugManager.getSnapshot()?.hitTest,\n result,\n );\n\n if (!hoverChanged && !hitChanged) {\n return;\n }\n\n this.host.hover = nextHover;\n this.host.bodyTooltipController.update(result, () =>\n this.host.updateTooltip(result),\n );\n\n // 拖拽手柄 hover 时切换光标\n this.host.canvasHost.setCursor(\n result.area === \"resize-handle\" ? \"col-resize\" : (result.cursor ?? \"\"),\n );\n\n this.host.scheduleRender(result);\n };\n\n readonly handleMouseDown = (event: MouseEvent) => {\n if (!this.host.canvasElement) {\n return;\n }\n if (event.button !== 0) {\n return;\n }\n this.host.canvasElement.focus?.({ preventScroll: true });\n this.host.stopScrollToAnimation();\n this.host.stopWheelScrollSmoothing();\n this.host.pauseCarouselScrollByPointer();\n this.host.stopCarouselScrollAnimation();\n this.host.headerContextMenu.hide();\n this.host.bodyTooltipController.clear();\n\n const position = this.host.canvasHost.getPointerPosition(\n event.clientX,\n event.clientY,\n );\n const rowDragPointer = resolveRowDragPointerPosition({\n event,\n fallback: position,\n zoom: this.host.tableZoom,\n });\n const result = this.host.resolvePointerHit(position.x, position.y);\n\n if (\n !this.host.options.rowDrag?.enabled &&\n (result.area === \"body\" || result.area === \"body-content\") &&\n typeof result.rowIndex === \"number\" &&\n result.columnKey\n ) {\n const columnIndex = this.host.leafColumns.findIndex(\n (column) => column.key === result.columnKey,\n );\n if (columnIndex >= 0) {\n this.host.rangeHighlight = {\n ...this.host.rangeHighlight,\n selectedCellRange: null,\n };\n this.cellSelectionDrag = {\n startRowIndex: result.rowIndex,\n startColumnIndex: columnIndex,\n };\n this.cellSelectionDragged = false;\n this.cellSelectionPointer = {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n this.host.canvasHost.bindWindowDragEvents(\n this.handleWindowMouseMove,\n this.handleWindowMouseUp,\n );\n }\n }\n\n // 拖拽改变列宽\n if (result.area === \"resize-handle\" && result.columnKey) {\n event.preventDefault();\n this.host.draggingResize = startColumnResizeDrag({\n options: this.host.options,\n leafColumns: this.host.leafColumns,\n columnKey: result.columnKey,\n pointerX: position.x,\n });\n if (!this.host.draggingResize) {\n return;\n }\n this.host.canvasHost.bindWindowDragEvents(\n this.handleWindowMouseMove,\n this.handleWindowMouseUp,\n );\n return;\n }\n\n // 拖拽表头排序\n const draggableColumn = result.columnKey\n ? findNormalizedColumnByKey(this.host.normalizedColumns, result.columnKey)\n : null;\n if (\n result.area === \"header\" &&\n result.columnKey &&\n this.host.options.draggable &&\n draggableColumn?.draggable !== false\n ) {\n const nextDraggingReorder = startColumnReorderDrag({\n result,\n options: this.host.options,\n normalizedColumns: this.host.normalizedColumns,\n headerTree: this.host.headerTree,\n headerRowsCache: this.host.headerRowsCache,\n pointerX: position.x,\n headerRowHeight: DEFAULT_HEADER_ROW_HEIGHT,\n getMovableLeafColumns: (node, hitRect) =>\n getHeaderNodeMovableLeafColumns({\n node,\n leafColumns: this.host.leafColumns,\n headerRowsCache: this.host.headerRowsCache,\n hitRect,\n }),\n });\n if (!nextDraggingReorder) {\n return;\n }\n event.preventDefault();\n this.host.draggingReorder = nextDraggingReorder;\n this.host.canvasHost.bindWindowDragEvents(\n this.handleWindowMouseMove,\n this.handleWindowMouseUp,\n );\n return;\n }\n\n // 行拖拽 potential(与列宽/表头/滚动条拖拽互斥,且仅 body 行)\n if (\n canStartRowDragFromHit({\n result,\n enabled: Boolean(this.host.options.rowDrag?.enabled),\n busy:\n this.host.draggingResize != null ||\n this.host.draggingReorder != null ||\n this.host.draggingScrollbar != null ||\n this.host.rowDragController.isActive(),\n editing: this.host.editingController.getSession() != null,\n })\n ) {\n const started = this.host.rowDragController.notePotentialStart({\n rowIndex: result.rowIndex as number,\n clientX: event.clientX,\n clientY: event.clientY,\n pointerX: rowDragPointer.x,\n pointerY: rowDragPointer.y,\n });\n if (started) {\n this.host.canvasHost.bindWindowDragEvents(\n this.handleWindowMouseMove,\n this.handleWindowMouseUp,\n );\n // 不 return:允许后续 click 路径在阈值内仍可点选(mouseup 会清 potential)\n }\n }\n\n if (\n result.area !== \"horizontal-scrollbar\" &&\n result.area !== \"vertical-scrollbar\"\n ) {\n return;\n }\n\n event.preventDefault();\n if (!this.host.wrapperElement) {\n return;\n }\n\n const viewport = this.host.debugManager.getSnapshot()?.viewport as\n | {\n maxScrollLeft: number;\n maxScrollTop: number;\n }\n | undefined;\n if (!viewport) {\n return;\n }\n\n if (result.scrollbarRole === \"decrease-button\") {\n this.stepScrollbar(result.area, -1, viewport);\n this.startContinuousScroll(result.area, -1, viewport);\n return;\n }\n\n if (result.scrollbarRole === \"increase-button\") {\n this.stepScrollbar(result.area, 1, viewport);\n this.startContinuousScroll(result.area, 1, viewport);\n return;\n }\n\n if (result.area === \"horizontal-scrollbar\") {\n const horizontalScrollbar = this.host.scrollbarLayout.horizontal;\n if (!horizontalScrollbar) {\n return;\n }\n const { thumb, track } = horizontalScrollbar;\n if (result.scrollbarRole === \"track\") {\n this.jumpScrollbar(\"horizontal\", position.x, track, thumb, viewport);\n return;\n }\n this.host.draggingScrollbar = {\n axis: \"horizontal\",\n pointerOffset: position.x - thumb.x,\n trackStart: track.x,\n trackLength: track.width,\n thumbLength: thumb.width,\n maxScroll: viewport.maxScrollLeft,\n };\n } else {\n const verticalScrollbar = this.host.scrollbarLayout.vertical;\n if (!verticalScrollbar) {\n return;\n }\n const { thumb, track } = verticalScrollbar;\n if (result.scrollbarRole === \"track\") {\n this.jumpScrollbar(\"vertical\", position.y, track, thumb, viewport);\n return;\n }\n this.host.draggingScrollbar = {\n axis: \"vertical\",\n pointerOffset: position.y - thumb.y,\n trackStart: track.y,\n trackLength: track.height,\n thumbLength: thumb.height,\n maxScroll: viewport.maxScrollTop,\n };\n }\n\n this.host.canvasHost.bindWindowDragEvents(\n this.handleWindowMouseMove,\n this.handleWindowMouseUp,\n );\n };\n\n readonly handleDoubleClick = (event: MouseEvent) => {\n if (!this.host.canvasElement) {\n return;\n }\n\n const position = this.host.canvasHost.getPointerPosition(\n event.clientX,\n event.clientY,\n );\n const result = this.host.resolvePointerHit(position.x, position.y);\n if (\n result.area !== \"body\" ||\n typeof result.rowIndex !== \"number\" ||\n !result.columnKey\n ) {\n return;\n }\n\n const column = this.host.leafColumns.find(\n (item) => item.key === result.columnKey,\n );\n const record = this.host.getDisplayData()[result.rowIndex];\n const value =\n column && record && column.dataIndex != null\n ? getValueByDataIndex(record, column.dataIndex)\n : undefined;\n if (\n !record ||\n !shouldOpenCellEditorOnClick(column, 2, {\n value,\n record,\n rowIndex: result.rowIndex,\n })\n ) {\n return;\n }\n\n this.host.editingController.open(result.rowIndex, result.columnKey);\n };\n\n readonly handleMouseLeave = () => {\n if (this.host.draggingScrollbar) {\n return;\n }\n\n this.stopContinuousScroll();\n this.host.bodyTooltipController.clear();\n this.host.resumeCarouselScrollByPointer();\n\n this.host.hover = {\n rowIndex: null,\n columnKey: null,\n area: \"empty\",\n };\n this.host.render();\n };\n\n readonly handleContextMenu = (event: MouseEvent) => {\n if (!this.host.canvasElement) {\n return;\n }\n\n const position = this.host.canvasHost.getPointerPosition(\n event.clientX,\n event.clientY,\n );\n const result = this.host.resolvePointerHit(position.x, position.y);\n const rawContextResult =\n typeof result.hitRowIndex === \"number\"\n ? { ...result, rowIndex: result.hitRowIndex }\n : result;\n const contextResult = hydrateBodyContentHitResult({\n result: rawContextResult,\n rows: this.host.getDisplayData(),\n leafColumns: this.host.leafColumns,\n });\n const hitContent = resolveHitCellContent({\n result: contextResult,\n rows: this.host.getDisplayData(),\n leafColumns: this.host.leafColumns,\n });\n const opened = showHeaderContextMenu({\n result: contextResult,\n event,\n options: this.host.options,\n headerContextMenu: this.host.headerContextMenu,\n filterPanel: this.host.filterPanel,\n fixedPopup: this.host.fixedPopup,\n hideBodyTooltip: () => {\n this.host.bodyTooltipController.clear();\n },\n getRows: () => this.host.getDisplayData(),\n getAllRows: () => this.host.options.dataSource,\n getColumns: () => this.host.leafColumns,\n getHeaderTree: () => this.host.headerTree,\n getFrozenRowPosition: (rowIndex) =>\n this.host.getFrozenRowPosition(rowIndex),\n startExportTask: (task, text) => {\n this.host.startExportTask(task, text);\n },\n contentDownload: this.host.resolveContentDownloadAction(hitContent),\n onSelectHeader: (columnKey, rect) => {\n this.host.clearBodySelection();\n this.host.updateRangeHighlightForHeaderContextMenu(columnKey);\n this.host.selectHeader(columnKey, rect);\n },\n onSelectBodyRow: (rowIndex, columnKey) => {\n this.host.selection = {\n rowIndex,\n columnKey,\n };\n this.host.clearSelectedHeader();\n this.host.rangeHighlight = resolveNextRowHighlightForContextMenu({\n current: this.host.rangeHighlight,\n rowIndex,\n });\n this.host.summarySelected = false;\n },\n getSelectionRange: () => this.host.rangeHighlight.selectedCellRange ?? null,\n onCopySelection: () => {\n this.copyListTableText(\n createListTableSelectionCopyText({\n rows: this.host.getDisplayData(),\n columns: this.host.leafColumns,\n selection: this.host.selection,\n rangeHighlight: this.host.rangeHighlight,\n highlightMode: this.host.options.highlightMode,\n }),\n );\n },\n onCopyCustomSelection: (range) => {\n this.copyListTableText(\n createListTableRangeCopyText({\n rows: this.host.getDisplayData(),\n columns: this.host.leafColumns,\n startRowIndex: range.startRow - 1,\n endRowIndex: range.endRow - 1,\n startColumnIndex: range.startColumn - 1,\n endColumnIndex: range.endColumn - 1,\n }),\n );\n },\n onFreezeRow: (rowIndex, position) => {\n this.host.freezeRow(rowIndex, position);\n },\n onUnfreezeRow: (rowIndex) => {\n this.host.unfreezeRow(rowIndex);\n },\n onToggleExpandRow: (rowIndex) => {\n this.host.collapseHighlightedRows(rowIndex);\n },\n hasCollapsedRows: this.host.collapsedRowKeys.length > 0,\n onExpandAllCollapsedRows: () => {\n this.host.expandAllCollapsedRows();\n },\n onResetFilter: () => {\n this.host.resetFilters();\n },\n onResetSort: () => {\n this.host.resetSort();\n },\n onResetHeader: () => {\n this.host.resetHeaderColumns();\n },\n onChangeDensity: (density) => {\n this.host.changeTableDensity(density);\n },\n zoom: this.host.tableZoom,\n onChangeZoom: (zoom) => {\n this.host.changeTableZoom(zoom);\n },\n onToggleCurrentColumn: (columnKey, visible) => {\n this.host.toggleHighlightedHeaderColumns(columnKey, visible);\n },\n onToggleColumn: (columnKey, visible) => {\n this.host.toggleHeaderColumnVisible(columnKey, visible);\n },\n onExpandAllCollapsedColumns: () => {\n this.host.expandAllCollapsedColumns();\n },\n summaryVisible: Boolean(this.host.currentRenderSnapshot?.hasSummary),\n onToggleSummary: () => {\n this.host.options.summaryRowHeight =\n this.host.currentRenderSnapshot?.hasSummary\n ? 0\n : DEFAULT_SUMMARY_ROW_HEIGHT;\n this.host.persistColumnConfig();\n this.host.render();\n },\n onChangeSummaryType: (columnKey, type) => {\n updateSummaryColumn(this.host.options.columns, columnKey, (summary) => ({\n ...summary,\n type,\n }));\n this.host.refreshRuntimeColumns();\n this.host.persistColumnConfig();\n this.host.render();\n },\n onChangeSummaryPrecision: (columnKey, precision) => {\n updateSummaryColumn(this.host.options.columns, columnKey, (summary) => ({\n ...summary,\n precision,\n }));\n this.host.refreshRuntimeColumns();\n this.host.persistColumnConfig();\n this.host.render();\n },\n onClose: () => {\n this.host.headerContextMenu.hide();\n this.host.render();\n },\n });\n if (opened) {\n this.host.render(contextResult);\n }\n };\n\n private copyListTableText(text: string | null) {\n if (text == null) {\n return;\n }\n const ownerDocument =\n this.host.canvasElement?.ownerDocument ?? globalThis.document;\n if (!copyTextSync(text, ownerDocument)) {\n void copyText(text);\n }\n }\n\n readonly handleClick = (event: MouseEvent) => {\n if (!this.host.canvasElement) {\n return;\n }\n\n const position = this.host.canvasHost.getPointerPosition(\n event.clientX,\n event.clientY,\n );\n const rawResult = this.host.resolvePointerHit(position.x, position.y);\n const result =\n event.shiftKey && rawResult.area === \"column-collapse-trigger\"\n ? this.host.resolvePointerHit(position.x, position.y, {\n excludeKinds: [\"column-collapse-trigger\"],\n })\n : rawResult;\n\n if (result.area !== \"filter-trigger\") {\n this.host.filterPanel.hide();\n }\n if (result.area !== \"fixed-trigger\") {\n this.host.fixedPopup.hide();\n }\n this.host.headerContextMenu.hide();\n this.host.bodyTooltipController.clear();\n\n if (\n result.area === \"body\" ||\n result.area === \"body-content\" ||\n result.area === \"expanded-row\"\n ) {\n this.host.selection = {\n rowIndex: result.rowIndex ?? null,\n columnKey: result.columnKey ?? null,\n };\n }\n\n if (this.host.suppressNextClick) {\n this.host.suppressNextClick = false;\n return;\n }\n\n this.host.summarySelected = result.area === \"summary\";\n\n if (\n (result.area === \"header\" ||\n result.area === \"header-selection\" ||\n result.area === \"sort-trigger\" ||\n result.area === \"filter-trigger\" ||\n result.area === \"fixed-trigger\" ||\n (event.shiftKey && result.area === \"column-collapse-trigger\")) &&\n result.columnKey\n ) {\n this.host.clearBodySelection();\n this.host.resetRangeHighlightForHeaderSelection(event.shiftKey);\n this.host.selectHeader(\n result.columnKey,\n result.area === \"header\" ? result.rect : null,\n );\n }\n\n if (result.area === \"summary\") {\n if (!result.columnKey) {\n this.host.render(result);\n this.host.updateTooltip(result);\n return;\n }\n\n this.host.selection = {\n rowIndex: null,\n columnKey: result.columnKey,\n };\n this.host.clearSelectedHeader();\n this.host.updateRangeHighlightForHeaderClick(result.columnKey, false);\n this.host.render(result);\n this.host.updateTooltip(result);\n return;\n }\n\n if (this.host.updateNestedTableHighlightFromClick(result)) {\n this.host.render(result);\n this.host.updateTooltip(result);\n return;\n }\n\n const isHeaderRangeGesture =\n event.shiftKey &&\n result.columnKey &&\n (result.area === \"header\" ||\n result.area === \"sort-trigger\" ||\n result.area === \"filter-trigger\" ||\n result.area === \"fixed-trigger\" ||\n result.area === \"column-collapse-trigger\");\n\n if (\n (result.area === \"body\" || result.area === \"body-content\") &&\n typeof result.rowIndex === \"number\" &&\n result.columnKey\n ) {\n this.host.clearSelectedHeader();\n this.host.updateRangeHighlightForBodyInteraction({\n rowIndex: result.rowIndex,\n columnKey: result.columnKey,\n shiftKey: event.shiftKey,\n rowSpan: result.rowSpan,\n });\n }\n\n if (\n (result.area === \"header\" ||\n result.area === \"sort-trigger\" ||\n result.area === \"filter-trigger\" ||\n result.area === \"fixed-trigger\" ||\n isHeaderRangeGesture) &&\n result.columnKey\n ) {\n this.host.rangeHighlight = {\n ...this.host.rangeHighlight,\n selectedCellRange: null,\n };\n this.host.updateRangeHighlightForHeaderClick(\n result.columnKey,\n event.shiftKey,\n );\n }\n\n if (isHeaderRangeGesture) {\n this.host.render(result);\n this.host.updateTooltip(result);\n return;\n }\n\n if (result.area === \"header-selection\") {\n this.host.toggleSelectAllVisibleRows();\n return;\n }\n\n if (\n result.area === \"collapse-trigger\" &&\n result.contentKey &&\n this.host.expandCollapsedRange(result.contentKey)\n ) {\n return;\n }\n\n if (\n result.area === \"column-collapse-trigger\" &&\n result.contentKey &&\n this.host.expandCollapsedColumnRange(result.contentKey)\n ) {\n return;\n }\n\n if (\n result.area === \"expand-trigger\" &&\n typeof result.rowIndex === \"number\" &&\n this.host.toggleRowExpand(result.rowIndex)\n ) {\n return;\n }\n\n if (\n (result.area === \"body-content\" || result.area === \"body-control\") &&\n emitBodyCellContentClick({\n result,\n event,\n rows: this.host.getDisplayData(),\n leafColumns: this.host.leafColumns,\n dangerConfirmAnchorRect: result.rect\n ? this.host.toViewportRect(result.rect)\n : {\n x: event.clientX,\n y: event.clientY,\n width: 0,\n height: 0,\n },\n onDangerConfirm: (request) => {\n this.host.showDangerConfirmRequest({\n ...request,\n onConfirm: () => {\n request.onConfirm();\n this.host.render(result);\n },\n });\n },\n onPreview: (content) => {\n this.host.showCellContentPreview(content);\n },\n })\n ) {\n this.host.render(result);\n return;\n }\n\n if (\n (result.area === \"body-control\" || result.area === \"body\") &&\n result.columnKey === ROW_SELECTION_COLUMN_KEY &&\n typeof result.rowIndex === \"number\"\n ) {\n const rows = this.host.getDisplayData();\n const record = rows[result.rowIndex];\n if (record) {\n this.host.toggleRowSelection(record, result.rowIndex);\n }\n return;\n }\n\n if (\n result.area === \"body\" &&\n typeof result.rowIndex === \"number\" &&\n this.host.options.expandable?.expandRowByClick &&\n result.columnKey !== ROW_SELECTION_COLUMN_KEY &&\n result.columnKey !== EXPAND_COLUMN_KEY &&\n this.host.toggleRowExpand(result.rowIndex)\n ) {\n return;\n }\n\n if (result.area === \"sort-trigger\" && result.columnKey) {\n this.host.toggleSort(result.columnKey);\n }\n\n if (result.area === \"filter-trigger\" && result.columnKey && result.rect) {\n this.host.toggleFilter(result.columnKey, result.rect);\n this.host.render(result);\n this.host.updateTooltip(result);\n return;\n }\n\n if (result.area === \"fixed-trigger\" && result.columnKey && result.rect) {\n this.host.showFixedPopup(result.columnKey, result.rect);\n this.host.render(result);\n this.host.updateTooltip(result);\n return;\n }\n\n if (\n (result.area === \"body\" || result.area === \"body-content\") &&\n typeof result.rowIndex === \"number\" &&\n result.columnKey\n ) {\n const column = this.host.leafColumns.find(\n (item) => item.key === result.columnKey,\n );\n const record = this.host.getDisplayData()[result.rowIndex];\n const value =\n column && record && column.dataIndex != null\n ? getValueByDataIndex(record, column.dataIndex)\n : undefined;\n if (\n record &&\n shouldOpenCellEditorOnClick(column, 1, {\n value,\n record,\n rowIndex: result.rowIndex,\n })\n ) {\n this.host.editingController.open(result.rowIndex, result.columnKey);\n return;\n }\n }\n\n this.host.render(result);\n this.host.updateTooltip(result);\n };\n\n readonly handleWindowMouseMove = (event: MouseEvent) => {\n if (!this.host.canvasElement) {\n return;\n }\n\n if (this.cellSelectionDrag) {\n this.cellSelectionPointer = {\n clientX: event.clientX,\n clientY: event.clientY,\n };\n this.updateCellSelectionFromPointer(event.clientX, event.clientY);\n this.updateCellSelectionAutoScroll();\n return;\n }\n\n // 行拖拽优先于列宽/表头/滚动条\n if (this.host.rowDragController.isActive()) {\n const consumed = this.host.rowDragController.handlePointerMove(event);\n if (consumed && this.host.rowDragController.isDragging()) {\n return;\n }\n }\n\n // 拖拽改变列宽\n if (this.host.draggingResize) {\n const dragPos = this.host.canvasHost.getPointerPosition(\n event.clientX,\n event.clientY,\n );\n const resizeResult = updateColumnResizeDrag({\n dragging: this.host.draggingResize,\n pointerX: dragPos.x,\n leafColumns: this.host.leafColumns,\n options: this.host.options,\n });\n if (resizeResult) {\n showDragTooltip({\n tooltip: this.host.tooltip,\n toViewportPoint: (x, y) => this.host.toViewportPoint(x, y),\n x: dragPos.x,\n y: dragPos.y,\n text: `${resizeResult.column.title}: ${resizeResult.nextWidth}px`,\n });\n }\n\n this.host.scheduleRender();\n return;\n }\n\n // 拖拽表头排序\n if (this.host.draggingReorder) {\n const dragPos = this.host.canvasHost.getPointerPosition(\n event.clientX,\n event.clientY,\n );\n const reorderResult = updateColumnReorderDrag({\n dragging: this.host.draggingReorder,\n pointerX: dragPos.x,\n headerTree: this.host.headerTree,\n getBounds: (columnKey) =>\n getHeaderNodeReorderBoundsByKey({\n columnKey,\n headerTree: this.host.headerTree,\n leafColumns: this.host.leafColumns,\n headerRowsCache: this.host.headerRowsCache,\n }),\n });\n this.host.draggingReorder = reorderResult.dragging;\n const tooltipText = reorderResult.tooltipText;\n if (tooltipText) {\n showDragTooltip({\n tooltip: this.host.tooltip,\n toViewportPoint: (x, y) => this.host.toViewportPoint(x, y),\n x: dragPos.x,\n y: dragPos.y,\n text: tooltipText,\n });\n }\n\n this.host.scheduleRender();\n return;\n }\n\n if (!this.host.draggingScrollbar) {\n return;\n }\n\n const position = this.host.canvasHost.getPointerPosition(\n event.clientX,\n event.clientY,\n );\n\n let nextScroll = this.host.scroll;\n if (this.host.draggingScrollbar.axis === \"horizontal\") {\n nextScroll = dragScrollbarScroll({\n current: this.host.scroll,\n dragging: this.host.draggingScrollbar,\n pointerValue: position.x,\n });\n } else {\n nextScroll = dragScrollbarScroll({\n current: this.host.scroll,\n dragging: this.host.draggingScrollbar,\n pointerValue: position.y,\n });\n }\n if (!this.host.applyUserScroll(nextScroll)) {\n return;\n }\n\n this.host.markScrollbarActive();\n this.host.scheduleRender();\n if (this.host.draggingScrollbar?.axis === \"vertical\") {\n this.host.maybeLoadNextScrollPage();\n }\n };\n\n startContinuousScroll(\n area: \"horizontal-scrollbar\" | \"vertical-scrollbar\",\n direction: -1 | 1,\n viewport: { maxScrollLeft: number; maxScrollTop: number },\n ) {\n this.stopContinuousScroll();\n\n this.continuousScrollTimer = window.setInterval(() => {\n this.stepScrollbar(area, direction, viewport);\n }, 80);\n\n this.host.canvasHost.bindWindowDragEvents(\n this.handleWindowMouseMove,\n this.handleWindowMouseUp,\n );\n }\n\n stopContinuousScroll() {\n if (this.continuousScrollTimer != null) {\n window.clearInterval(this.continuousScrollTimer);\n this.continuousScrollTimer = null;\n }\n }\n\n stepScrollbar(\n area: \"horizontal-scrollbar\" | \"vertical-scrollbar\",\n direction: -1 | 1,\n viewport: { maxScrollLeft: number; maxScrollTop: number },\n ) {\n const nextScroll = stepScrollbarScroll({\n current: this.host.scroll,\n area,\n direction,\n viewport,\n rowHeight:\n this.host.currentRenderSnapshot?.rowHeight ?? DEFAULT_ROW_HEIGHT,\n horizontalStep: HORIZONTAL_SCROLL_STEP,\n });\n if (!this.host.applyUserScroll(nextScroll)) {\n return;\n }\n\n this.host.markScrollbarActive();\n this.host.scheduleRender();\n if (area === \"vertical-scrollbar\") {\n this.host.maybeLoadNextScrollPage();\n }\n }\n\n jumpScrollbar(\n axis: \"horizontal\" | \"vertical\",\n pointerValue: number,\n track: { x: number; y: number; width: number; height: number },\n thumb: { x: number; y: number; width: number; height: number },\n viewport: { maxScrollLeft: number; maxScrollTop: number },\n ) {\n const nextScroll = jumpScrollbarScroll({\n current: this.host.scroll,\n axis,\n pointerValue,\n track,\n thumb,\n viewport,\n });\n if (!this.host.applyUserScroll(nextScroll)) {\n return;\n }\n\n this.host.markScrollbarActive();\n this.host.scheduleRender();\n if (axis === \"vertical\") {\n this.host.maybeLoadNextScrollPage();\n }\n }\n\n readonly handleWindowMouseUp = (event: MouseEvent) => {\n if (this.cellSelectionDrag) {\n const dragged = this.cellSelectionDragged;\n this.cellSelectionDrag = null;\n this.cellSelectionDragged = false;\n this.cellSelectionPointer = null;\n this.stopCellSelectionAutoScroll();\n this.host.canvasHost.unbindWindowDragEvents();\n if (dragged) {\n this.host.suppressNextClick = true;\n }\n this.host.render();\n return;\n }\n if (\n finishColumnResizeDrag({\n options: this.host.options,\n dragging: this.host.draggingResize,\n })\n ) {\n this.host.persistColumnConfig();\n }\n\n if (this.host.rowDragController.isActive()) {\n this.host.canvasHost.unbindWindowDragEvents();\n void this.host.rowDragController.handlePointerUp(event).finally(() => {\n this.finishWindowDragCleanup({ unbindWindowEvents: false });\n });\n return;\n }\n\n if (this.host.draggingReorder) {\n const { activated } = this.host.draggingReorder;\n if (activated && shouldCommitHeaderReorder(this.host.draggingReorder)) {\n const swapAnimation = commitColumnReorder({\n options: this.host.options,\n sourceKey: this.host.draggingReorder.columnKey,\n targetKey: this.host.draggingReorder.targetColumnKey,\n movableKeys: this.host.draggingReorder.siblingKeys,\n columnSegments: this.host.columnSegments,\n refreshLayout: () => {\n this.host.persistColumnConfig();\n this.host.suppressNextClick = true;\n return this.host.refreshColumnLayoutForReorder();\n },\n releaseAnimation: this.host.draggingReorder,\n });\n this.host.animationController.startSwapAnimation(swapAnimation);\n } else if (!activated && this.host.draggingReorder.columnKey) {\n // 点击表头保持选中高亮,重复点击同一列时不反选\n const columnKey = this.host.draggingReorder.columnKey;\n this.host.clearBodySelection();\n this.host.resetRangeHighlightForHeaderSelection(event.shiftKey);\n this.host.selectHeader(\n columnKey,\n this.host.draggingReorder.selectedHeaderRect,\n );\n this.host.updateRangeHighlightForHeaderClick(columnKey, event.shiftKey);\n this.host.suppressNextClick = true;\n this.host.render();\n }\n }\n\n this.finishWindowDragCleanup();\n };\n\n private finishWindowDragCleanup(options?: { unbindWindowEvents?: boolean }) {\n this.host.draggingScrollbar = null;\n this.host.draggingResize = null;\n this.host.draggingReorder = null;\n this.stopContinuousScroll();\n this.host.tooltip.hide();\n if (options?.unbindWindowEvents !== false) {\n this.host.canvasHost.unbindWindowDragEvents();\n }\n this.host.markScrollbarActive();\n this.host.render();\n }\n\n private updateCellSelectionFromPointer(clientX: number, clientY: number) {\n const drag = this.cellSelectionDrag;\n if (!drag || !this.host.canvasElement) {\n return;\n }\n\n const pointer = this.host.canvasHost.getPointerPosition(clientX, clientY);\n const snapshot = this.host.currentRenderSnapshot;\n const bodyTop = snapshot?.bodyLayout.scrollBodyTop ?? 0;\n const bodyBottom =\n bodyTop + (snapshot?.bodyLayout.scrollBodyHeight ?? Number.POSITIVE_INFINITY);\n const width = snapshot?.width ?? this.host.canvasElement.width;\n const position = {\n x: Math.min(Math.max(pointer.x, 0), Math.max(width - 1, 0)),\n y: Math.min(Math.max(pointer.y, bodyTop + 1), Math.max(bodyBottom - 1, bodyTop + 1)),\n };\n const result = this.host.resolvePointerHit(position.x, position.y);\n if (\n (result.area !== \"body\" && result.area !== \"body-content\") ||\n typeof result.rowIndex !== \"number\" ||\n !result.columnKey\n ) {\n return;\n }\n\n const columnIndex = this.host.leafColumns.findIndex(\n (column) => column.key === result.columnKey,\n );\n if (columnIndex < 0) {\n return;\n }\n\n this.cellSelectionDragged = true;\n this.host.rangeHighlight = {\n ...this.host.rangeHighlight,\n selectedCellRange: {\n startRowIndex: Math.min(drag.startRowIndex, result.rowIndex),\n endRowIndex: Math.max(drag.startRowIndex, result.rowIndex),\n startColumnIndex: Math.min(drag.startColumnIndex, columnIndex),\n endColumnIndex: Math.max(drag.startColumnIndex, columnIndex),\n },\n };\n this.host.scheduleRender(result);\n }\n\n private updateCellSelectionAutoScroll() {\n if (!this.cellSelectionDrag || !this.cellSelectionPointer || !this.host.canvasElement) {\n this.stopCellSelectionAutoScroll();\n return;\n }\n\n const rect = this.host.canvasElement.getBoundingClientRect();\n const snapshot = this.host.currentRenderSnapshot;\n const zoom = this.host.tableZoom || 1;\n const bodyTop = rect.top + (snapshot?.bodyLayout.scrollBodyTop ?? 0) * zoom;\n const bodyBottom =\n bodyTop + (snapshot?.bodyLayout.scrollBodyHeight ?? rect.height / zoom) * zoom;\n const bodyLeft = rect.left;\n const bodyRight = rect.left + (snapshot?.width ?? rect.width / zoom) * zoom;\n const edge = 28;\n const pointer = this.cellSelectionPointer;\n const nextDirection = {\n horizontal:\n pointer.clientX <= bodyLeft + edge\n ? -1\n : pointer.clientX >= bodyRight - edge\n ? 1\n : 0,\n vertical:\n pointer.clientY <= bodyTop + edge\n ? -1\n : pointer.clientY >= bodyBottom - edge\n ? 1\n : 0,\n } as const;\n\n if (\n nextDirection.horizontal === 0 &&\n nextDirection.vertical === 0\n ) {\n this.stopCellSelectionAutoScroll();\n return;\n }\n\n this.cellSelectionAutoScrollDirection = nextDirection;\n if (this.cellSelectionAutoScrollTimer != null) {\n return;\n }\n\n this.cellSelectionAutoScrollTimer = window.setInterval(() => {\n const viewport = this.host.currentRenderSnapshot?.viewport;\n if (!viewport || !this.cellSelectionPointer) {\n this.stopCellSelectionAutoScroll();\n return;\n }\n\n const direction = this.cellSelectionAutoScrollDirection;\n const scrollDirection =\n direction.vertical !== 0 ? direction.vertical : direction.horizontal;\n if (scrollDirection === 0) {\n this.stopCellSelectionAutoScroll();\n return;\n }\n const current = this.host.scroll;\n const next = stepScrollbarScroll({\n current,\n area:\n direction.vertical !== 0\n ? \"vertical-scrollbar\"\n : \"horizontal-scrollbar\",\n direction: scrollDirection,\n viewport,\n rowHeight: this.host.currentRenderSnapshot?.rowHeight ?? DEFAULT_ROW_HEIGHT,\n horizontalStep: HORIZONTAL_SCROLL_STEP,\n });\n if (this.host.applyUserScroll(next)) {\n this.host.markScrollbarActive();\n this.host.maybeLoadNextScrollPage();\n this.updateCellSelectionFromPointer(\n this.cellSelectionPointer.clientX,\n this.cellSelectionPointer.clientY,\n );\n }\n }, 60);\n }\n\n private stopCellSelectionAutoScroll() {\n if (this.cellSelectionAutoScrollTimer != null) {\n window.clearInterval(this.cellSelectionAutoScrollTimer);\n this.cellSelectionAutoScrollTimer = null;\n }\n this.cellSelectionAutoScrollDirection = { horizontal: 0, vertical: 0 };\n }\n}\n\nfunction resolveCellNavigateDirection(\n key: string,\n): ListTableCellNavigateDirection | null {\n if (key === \"ArrowUp\") return \"up\";\n if (key === \"ArrowDown\") return \"down\";\n if (key === \"ArrowLeft\") return \"left\";\n if (key === \"ArrowRight\") return \"right\";\n return null;\n}\n\n/**\n * 解析行拖拽开始点的画布局部坐标。\n * 原生 offset 坐标不依赖页面内定位容器,优先用于预览抓取偏移。\n */\nfunction resolveRowDragPointerPosition(params: {\n event: MouseEvent;\n fallback: { x: number; y: number };\n zoom: number;\n}) {\n const { event, fallback } = params;\n if (\n typeof event.offsetX !== \"number\" ||\n !Number.isFinite(event.offsetX) ||\n typeof event.offsetY !== \"number\" ||\n !Number.isFinite(event.offsetY)\n ) {\n return fallback;\n }\n const zoom =\n typeof params.zoom === \"number\" &&\n Number.isFinite(params.zoom) &&\n params.zoom > 0\n ? params.zoom\n : 1;\n return {\n x: event.offsetX / zoom,\n y: event.offsetY / zoom,\n };\n}\n\nfunction updateSummaryColumn<RecordType>(\n columns: ListTableColumn<RecordType>[],\n columnKey: string,\n update: (summary: { type?: ListTableSummaryType; precision?: number }) => {\n type?: ListTableSummaryType;\n precision?: number;\n },\n): boolean {\n for (const column of columns) {\n if (column.key === columnKey) {\n const current =\n column.summary && column.summary !== true\n ? {\n type: column.summary.type ?? (\"sum\" as const),\n precision: column.summary.precision,\n }\n : { type: \"sum\" as const };\n column.summary = { ...current, ...update(current) };\n return true;\n }\n if (\n column.children?.length &&\n updateSummaryColumn(column.children, columnKey, update)\n ) {\n return true;\n }\n }\n return false;\n}\n","import type {\r\n DebugHitTestResult,\r\n Rect,\r\n RenderCellDescriptor,\r\n} from \"../debug/debug-snapshot\";\r\nimport type { DebugManager } from \"../debug/debug-manager\";\r\nimport type {\r\n HeaderTreeNode,\r\n InternalLeafColumn,\r\n NormalizedColumn,\r\n} from \"../domain/columns/types\";\r\nimport type { HeaderCellLayout } from \"../domain/columns/header-layout-types\";\r\nimport type { ScrollbarLayout } from \"../domain/layout/scrollbar-types\";\r\nimport type { ScrollState } from \"../schema/state\";\r\nimport type { ListTableOptions } from \"../schema/table-options\";\r\nimport type { ListTableCanvasHost } from \"./canvas-host\";\r\nimport type { ListTableDomHost } from \"./dom-host\";\r\nimport type { BodyTooltipController } from \"../features/tooltip/body-tooltip-controller\";\r\nimport { updateHeaderActionTooltip } from \"../features/tooltip/tooltip-feature\";\r\nimport type { ListTableAnimationController } from \"../engine/controllers/animation-controller\";\r\nimport type { ListTableEditingController } from \"../engine/controllers/editing-controller\";\r\nimport type { ListTableRowDragController } from \"../engine/controllers/row-drag-controller\";\r\nimport type {\r\n DraggingReorderState,\r\n DraggingResizeState,\r\n DraggingScrollbarState,\r\n} from \"../domain/types\";\r\nimport type { ColumnSegments } from \"../domain/columns/column-layout\";\r\nimport type { ListTableEventHost } from \"./event-host\";\r\nimport type { ListTableSelectionController } from \"../engine/controllers/selection-controller\";\r\nimport type { ListTableHeaderActionController } from \"../engine/controllers/header-action-controller\";\r\nimport type { ListTableRowActionController } from \"../engine/controllers/row-action-controller\";\r\nimport type { ListTableContentActionController } from \"../engine/controllers/content-action-controller\";\r\nimport type { ListTablePersistenceController } from \"../engine/controllers/persistence-controller\";\r\nimport type { ListTableCarouselController } from \"../engine/controllers/carousel-controller\";\r\nimport type { ListTableOverlayController } from \"../engine/controllers/overlay-controller\";\r\nimport type { ListTableQueryController } from \"../engine/controllers/query-controller\";\r\nimport type { ListTableRenderController } from \"../engine/controllers/render-controller\";\r\nimport type { ListTableStoreFacade } from \"../engine/controllers/store-facade\";\r\n\r\n/**\r\n * createEventHost 所需的最小运行时桥接面。\r\n * 由 assembly 基于 ListTableCore 字段与局部 helper 组装,避免主类堆积纯转发方法。\r\n */\r\nexport interface ListTableEventHostBridge<RecordType> {\r\n options: ListTableOptions<RecordType>;\r\n canvasHost: ListTableCanvasHost;\r\n domHost: ListTableDomHost;\r\n debugManager: DebugManager;\r\n animationController: ListTableAnimationController<RecordType>;\r\n editingController: ListTableEditingController<RecordType>;\r\n rowDragController: ListTableRowDragController<RecordType>;\r\n bodyTooltipController: BodyTooltipController;\r\n storeFacade: ListTableStoreFacade<RecordType>;\r\n selectionController: ListTableSelectionController<RecordType>;\r\n overlayController: ListTableOverlayController<RecordType>;\r\n queryController: ListTableQueryController<RecordType>;\r\n renderController: ListTableRenderController<RecordType>;\r\n suppressNextClick: boolean;\r\n tableZoom: number;\r\n draggingScrollbar: DraggingScrollbarState | null;\r\n draggingResize: DraggingResizeState | null;\r\n draggingReorder: DraggingReorderState | null;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n normalizedColumns: NormalizedColumn<RecordType>[];\r\n headerTree: HeaderTreeNode<RecordType>[];\r\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>;\r\n columnSegments: ColumnSegments<RecordType>;\r\n scrollbarLayout: ScrollbarLayout;\r\n headerActionController: ListTableHeaderActionController<RecordType>;\r\n rowActionController: ListTableRowActionController<RecordType>;\r\n contentActionController: ListTableContentActionController<RecordType>;\r\n persistenceController: ListTablePersistenceController<RecordType>;\r\n carouselController: ListTableCarouselController<RecordType>;\r\n refreshRuntimeColumns: () => void;\r\n applyUserScroll(next: ScrollState): boolean;\r\n resolvePointerHit(\r\n x: number,\r\n y: number,\r\n options?: { excludeKinds?: RenderCellDescriptor[\"kind\"][] },\r\n ): DebugHitTestResult;\r\n}\r\n\r\n/**\r\n * 基于运行时桥接对象构建 Event Host。\r\n * 使用 structural bridge,避免 Event Controller 直接依赖主类私有类型。\r\n */\r\nexport function createListTableEventHost<RecordType>(\r\n core: ListTableEventHostBridge<RecordType>,\r\n): ListTableEventHost<RecordType> {\r\n return {\r\n get options() {\r\n return core.options;\r\n },\r\n get canvasHost() {\r\n return core.canvasHost;\r\n },\r\n get canvasElement() {\r\n return core.canvasHost.getCanvasElement();\r\n },\r\n get wrapperElement() {\r\n return core.domHost.getNodes()?.wrapperElement ?? null;\r\n },\r\n get debugManager() {\r\n return core.debugManager;\r\n },\r\n get animationController() {\r\n return core.animationController;\r\n },\r\n get editingController() {\r\n return core.editingController;\r\n },\r\n get rowDragController() {\r\n return core.rowDragController;\r\n },\r\n get bodyTooltipController() {\r\n return core.bodyTooltipController;\r\n },\r\n get filterPanel() {\r\n return core.overlayController.filterPanelAdapter;\r\n },\r\n get fixedPopup() {\r\n return core.overlayController.fixedPopupAdapter;\r\n },\r\n get headerContextMenu() {\r\n return core.overlayController.headerContextMenuAdapter;\r\n },\r\n get tooltip() {\r\n return core.overlayController.tooltipAdapter;\r\n },\r\n get currentRenderSnapshot() {\r\n return core.renderController.getCurrentRenderSnapshot();\r\n },\r\n get scroll() {\r\n return core.storeFacade.scroll;\r\n },\r\n set scroll(value) {\r\n core.storeFacade.scroll = value;\r\n },\r\n get hover() {\r\n return core.storeFacade.hover;\r\n },\r\n set hover(value) {\r\n core.storeFacade.hover = value;\r\n },\r\n get selection() {\r\n return core.storeFacade.selection;\r\n },\r\n set selection(value) {\r\n core.storeFacade.selection = value;\r\n },\r\n get rangeHighlight() {\r\n return core.storeFacade.rangeHighlight;\r\n },\r\n set rangeHighlight(value) {\r\n core.storeFacade.rangeHighlight = value;\r\n },\r\n get summarySelected() {\r\n return core.selectionController.isSummarySelected();\r\n },\r\n set summarySelected(value) {\r\n core.selectionController.setSummarySelected(value);\r\n },\r\n get suppressNextClick() {\r\n return core.suppressNextClick;\r\n },\r\n set suppressNextClick(value) {\r\n core.suppressNextClick = value;\r\n },\r\n get tableZoom() {\r\n return core.tableZoom;\r\n },\r\n get draggingScrollbar() {\r\n return core.draggingScrollbar;\r\n },\r\n set draggingScrollbar(value) {\r\n core.draggingScrollbar = value;\r\n },\r\n get draggingResize() {\r\n return core.draggingResize;\r\n },\r\n set draggingResize(value) {\r\n core.draggingResize = value;\r\n },\r\n get draggingReorder() {\r\n return core.draggingReorder;\r\n },\r\n set draggingReorder(value) {\r\n core.draggingReorder = value;\r\n },\r\n get leafColumns() {\r\n return core.leafColumns;\r\n },\r\n get normalizedColumns() {\r\n return core.normalizedColumns;\r\n },\r\n get headerTree() {\r\n return core.headerTree;\r\n },\r\n get headerRowsCache() {\r\n return core.headerRowsCache;\r\n },\r\n get columnSegments() {\r\n return core.columnSegments;\r\n },\r\n get scrollbarLayout() {\r\n return core.scrollbarLayout;\r\n },\r\n get collapsedRowKeys() {\r\n return core.storeFacade.collapsedRowKeys;\r\n },\r\n applyUserScroll: (next) => core.applyUserScroll(next),\r\n scheduleRender: (hitResult) => core.renderController.schedule(hitResult),\r\n render: (hitResult) => core.renderController.render(hitResult),\r\n resolvePointerHit: (x, y, options) => core.resolvePointerHit(x, y, options),\r\n markScrollbarActive: () => core.animationController.markScrollbarActive(),\r\n maybeLoadNextScrollPage: () =>\r\n core.rowActionController.maybeLoadNextScrollPage(),\r\n stopScrollToAnimation: () =>\r\n core.animationController.stopScrollToAnimation(),\r\n stopWheelScrollSmoothing: () =>\r\n core.animationController.stopWheelScrollSmoothing(),\r\n stopCarouselScrollAnimation: () =>\r\n core.animationController.stopCarouselScrollAnimation(),\r\n pauseCarouselScrollByPointer: () =>\r\n core.animationController.pauseCarouselScrollByPointer(),\r\n resumeCarouselScrollByPointer: () =>\r\n core.carouselController.resumeCarouselScrollByPointer(),\r\n updateTooltip: (result) => {\r\n updateHeaderActionTooltip({\r\n result,\r\n sortState: core.storeFacade.sortState,\r\n tooltip: core.overlayController.tooltipAdapter,\r\n toViewportPoint: (x, y) => core.domHost.toViewportPoint(x, y),\r\n });\r\n },\r\n getDisplayData: () => core.queryController.getDisplayData(),\r\n toViewportPoint: (x, y) => core.domHost.toViewportPoint(x, y),\r\n toViewportRect: (rect) => core.domHost.toViewportRect(rect),\r\n clearBodySelection: () => core.selectionController.clearBodySelection(),\r\n clearSelectedHeader: () => core.selectionController.clearSelectedHeader(),\r\n selectHeader: (columnKey, rect) =>\r\n core.selectionController.selectHeader(columnKey, rect),\r\n resetRangeHighlightForHeaderSelection: (shiftKey) =>\r\n core.selectionController.resetRangeHighlightForHeaderSelection(shiftKey),\r\n updateRangeHighlightForBodyInteraction: (params) =>\r\n core.selectionController.updateRangeHighlightForBodyInteraction(params),\r\n updateRangeHighlightForHeaderClick: (columnKey, shiftKey) =>\r\n core.selectionController.updateRangeHighlightForHeaderClick(\r\n columnKey,\r\n shiftKey,\r\n ),\r\n updateRangeHighlightForHeaderContextMenu: (columnKey) =>\r\n core.selectionController.updateRangeHighlightForHeaderContextMenu(\r\n columnKey,\r\n ),\r\n updateNestedTableHighlightFromClick: (result) =>\r\n core.animationController.updateNestedTableHighlightFromClick(result),\r\n toggleSort: (columnKey) =>\r\n core.headerActionController.toggleSort(columnKey),\r\n toggleFilter: (columnKey, anchorRect) =>\r\n core.headerActionController.toggleFilter(columnKey, anchorRect),\r\n showFixedPopup: (columnKey, anchorRect) =>\r\n core.headerActionController.showFixedPopup(columnKey, anchorRect),\r\n showCellContentPreview: (content) =>\r\n core.contentActionController.showCellContentPreview(content as never),\r\n showDangerConfirmRequest: (request) =>\r\n core.overlayController.showDangerConfirm(request),\r\n toggleSelectAllVisibleRows: () =>\r\n core.rowActionController.toggleSelectAllVisibleRows(),\r\n toggleRowSelection: (record, rowIndex) =>\r\n core.rowActionController.toggleRowSelection(record, rowIndex),\r\n toggleRowExpand: (rowIndex) =>\r\n core.rowActionController.toggleRowExpand(rowIndex),\r\n expandCollapsedRange: (contentKey) =>\r\n core.rowActionController.expandCollapsedRange(contentKey),\r\n expandCollapsedColumnRange: (contentKey) =>\r\n core.rowActionController.expandCollapsedColumnRange(contentKey),\r\n expandAllCollapsedRows: () =>\r\n core.rowActionController.expandAllCollapsedRows(),\r\n expandAllCollapsedColumns: () =>\r\n core.rowActionController.expandAllCollapsedColumns(),\r\n collapseHighlightedRows: (rowIndex) =>\r\n core.rowActionController.collapseHighlightedRows(rowIndex),\r\n freezeRow: (rowIndex, position) =>\r\n core.rowActionController.freezeRow(rowIndex, position),\r\n unfreezeRow: (rowIndex) => core.rowActionController.unfreezeRow(rowIndex),\r\n getFrozenRowPosition: (rowIndex) =>\r\n core.rowActionController.getFrozenRowPosition(rowIndex),\r\n resetFilters: () => core.headerActionController.resetFilters(),\r\n resetSort: () => core.headerActionController.resetSort(),\r\n resetHeaderColumns: () => core.headerActionController.resetHeaderColumns(),\r\n changeTableDensity: (density) =>\r\n core.headerActionController.changeTableDensity(density),\r\n changeTableZoom: (zoom) =>\r\n core.headerActionController.changeTableZoom(zoom),\r\n toggleHeaderColumnVisible: (columnKey, visible) =>\r\n core.headerActionController.toggleHeaderColumnVisible(columnKey, visible),\r\n toggleHighlightedHeaderColumns: (columnKey, visible) =>\n core.headerActionController.toggleHighlightedHeaderColumns(\n columnKey,\n visible,\n ),\n refreshRuntimeColumns: () => core.refreshRuntimeColumns(),\n refreshColumnLayoutForReorder: () => {\n core.refreshRuntimeColumns();\r\n const snapshot = core.renderController.measureCurrentSnapshot();\r\n return snapshot?.columnSegments ?? core.columnSegments;\r\n },\r\n persistColumnConfig: () => core.persistenceController.persistColumnConfig(),\r\n startExportTask: (task, text) =>\r\n core.contentActionController.startExportTask(task, text),\r\n resolveContentDownloadAction: (content) =>\r\n core.contentActionController.resolveContentDownloadAction(\r\n content as never,\r\n ),\r\n } as ListTableEventHost<RecordType>;\r\n}\r\n\r\n","import type { ListTableSortState } from \"../../schema/state\";\r\n\r\n/**\r\n * 切换排序状态。\r\n */\r\nexport function toggleSortingState(\r\n current: ListTableSortState,\r\n columnKey: string,\r\n): ListTableSortState {\r\n if (current.key === columnKey) {\r\n return {\r\n key: columnKey,\r\n order:\r\n current.order === \"ascend\"\r\n ? \"descend\"\r\n : current.order === \"descend\"\r\n ? null\r\n : \"ascend\",\r\n };\r\n }\r\n\r\n return {\r\n key: columnKey,\r\n order: \"ascend\",\r\n };\r\n}\r\n\r\n/**\r\n * 重置排序状态。\r\n */\r\nexport function resetSortingState(): ListTableSortState {\r\n return {\r\n key: null,\r\n order: null,\r\n };\r\n}\r\n","import type {\r\n ListTableFilterState,\r\n} from \"../../schema/state\";\r\nimport type { ListTableFilterValue } from \"../../ui/types\";\r\nimport { buildFilterStateValue } from \"../../services/query-service\";\r\nimport { isMeaningfulFilterValue } from \"../../shared/filter/filter-utils\";\r\n\r\n/**\r\n * 应用筛选值。\r\n */\r\nexport function applyFilteringValue(\r\n current: ListTableFilterState,\r\n columnKey: string,\r\n value: ListTableFilterValue,\r\n) {\r\n const nextValue = buildFilterStateValue(value);\r\n if (!isMeaningfulFilterValue(nextValue)) {\r\n const { [columnKey]: _removed, ...rest } = current;\r\n return rest;\r\n }\r\n\r\n return {\r\n ...current,\r\n [columnKey]: nextValue,\r\n };\r\n}\r\n\r\n/**\r\n * 重置单列筛选。\r\n */\r\nexport function resetFilteringValue(\r\n current: ListTableFilterState,\r\n columnKey: string,\r\n) {\r\n const { [columnKey]: _removed, ...rest } = current;\r\n return rest;\r\n}\r\n\r\n/**\r\n * 重置全部筛选。\r\n */\r\nexport function resetAllFilteringValues(): ListTableFilterState {\r\n return {};\r\n}\r\n","import type { ListTableFilterState, ListTableSortState } from \"../schema/state\";\r\nimport type { ListTableFilterValue } from \"../ui/types\";\r\nimport {\r\n applyFilteringValue,\r\n resetAllFilteringValues,\r\n resetFilteringValue,\r\n} from \"../features/filtering/filtering-feature\";\r\nimport { resetSortingState, toggleSortingState } from \"../features/sorting/sorting-feature\";\r\n\r\nexport interface ListTableQueryActionResult {\r\n sortState: ListTableSortState;\r\n filterState: ListTableFilterState;\r\n currentPage?: number;\r\n}\r\n\r\n/**\r\n * 切换排序状态。\r\n */\r\nexport function resolveSortToggleAction(\r\n sortState: ListTableSortState,\r\n columnKey: string,\r\n): ListTableQueryActionResult {\r\n return {\r\n sortState: toggleSortingState(sortState, columnKey),\r\n filterState: {} as ListTableFilterState,\r\n };\r\n}\r\n\r\n/**\r\n * 应用单列筛选值。\r\n */\r\nexport function resolveApplyFilterAction(params: {\r\n sortState: ListTableSortState;\r\n filterState: ListTableFilterState;\r\n columnKey: string;\r\n value: ListTableFilterValue;\r\n}) {\r\n return {\r\n sortState: params.sortState,\r\n filterState: applyFilteringValue(params.filterState, params.columnKey, params.value),\r\n } satisfies ListTableQueryActionResult;\r\n}\r\n\r\n/**\r\n * 重置单列筛选值。\r\n */\r\nexport function resolveResetFilterAction(params: {\r\n sortState: ListTableSortState;\r\n filterState: ListTableFilterState;\r\n columnKey: string;\r\n}) {\r\n return {\r\n sortState: params.sortState,\r\n filterState: resetFilteringValue(params.filterState, params.columnKey),\r\n } satisfies ListTableQueryActionResult;\r\n}\r\n\r\n/**\r\n * 重置所有筛选。\r\n */\r\nexport function resolveResetAllFiltersAction(\r\n sortState: ListTableSortState,\r\n): ListTableQueryActionResult {\r\n return {\r\n sortState,\r\n filterState: resetAllFilteringValues(),\r\n currentPage: 1,\r\n };\r\n}\r\n\r\n/**\r\n * 重置排序。\r\n */\r\nexport function resolveResetSortAction(\r\n filterState: ListTableFilterState,\r\n): ListTableQueryActionResult {\r\n return {\r\n sortState: resetSortingState(),\r\n filterState,\r\n };\r\n}\r\n","import type { ListTableOptions } from \"../schema/table-options\";\r\nimport {\r\n resetHeaderColumnsConfig,\r\n toggleHeaderColumnVisibility,\r\n} from \"../features/header-settings/header-settings-feature\";\r\nimport type { Rect } from \"../debug/debug-snapshot\";\r\n\r\nexport interface ResetHeaderColumnsActionResult {\r\n stretchColumns: ListTableOptions<unknown>[\"stretchColumns\"];\r\n scroll: {\r\n left: number;\r\n top: number;\r\n };\r\n selectedHeaderKey: null;\r\n selectedHeaderRect: null;\r\n}\r\n\r\n/**\r\n * 重置表头列配置动作。\r\n */\r\nexport function resolveResetHeaderColumnsAction<RecordType>(params: {\r\n columns: ListTableOptions<RecordType>[\"columns\"];\r\n initialColumns: ListTableOptions<RecordType>[\"columns\"];\r\n initialStretchColumns: ListTableOptions<RecordType>[\"stretchColumns\"];\r\n currentScrollTop: number;\r\n}): ResetHeaderColumnsActionResult {\r\n const resetState = resetHeaderColumnsConfig(params);\r\n return {\r\n stretchColumns: resetState.stretchColumns,\r\n scroll: resetState.scroll,\r\n selectedHeaderKey: null,\r\n selectedHeaderRect: null,\r\n };\r\n}\r\n\r\n/**\r\n * 切换表头列显隐动作。\r\n */\r\nexport function resolveToggleHeaderColumnVisibilityAction<RecordType>(params: {\r\n columns: ListTableOptions<RecordType>[\"columns\"];\r\n columnKey: string;\r\n visible: boolean;\r\n selectedHeaderKey: string | null;\r\n selectedHeaderRect: Rect | null;\r\n}) {\r\n return toggleHeaderColumnVisibility(params);\r\n}\r\n","import type { HeaderContextMenuDensity } from \"../../ui/types\";\r\n\r\n/**\r\n * 将上下文菜单密度映射为行高配置。\r\n */\r\nexport function resolveDensitySizes(density: HeaderContextMenuDensity) {\r\n if (density === \"comfortable\") {\r\n return {\r\n rowHeight: 48,\r\n headerRowHeight: 48,\r\n summaryRowHeight: 48,\r\n };\r\n }\r\n if (density === \"compact\") {\r\n return {\r\n rowHeight: 32,\r\n headerRowHeight: 32,\r\n summaryRowHeight: 32,\r\n };\r\n }\r\n return {\r\n rowHeight: 40,\r\n headerRowHeight: 40,\r\n summaryRowHeight: 40,\r\n };\r\n}\r\n","/**\r\n * 解析过滤面板可选数据源。\r\n * 优先使用 query 覆盖基表;remote 模式下用原始 dataSource;本地模式应用当前过滤。\r\n */\r\nexport function resolveFilterPanelDataSource<RecordType>(params: {\r\n queryRowsOverrideBase: RecordType[] | null | undefined;\r\n dataSource: RecordType[];\r\n isRemoteQuery: boolean;\r\n filterState: import(\"../../schema/state\").ListTableFilterState;\r\n leafColumns: import(\"../../domain/columns/types\").InternalLeafColumn<RecordType>[];\r\n filterRows: (\r\n rows: RecordType[],\r\n filterState: import(\"../../schema/state\").ListTableFilterState,\r\n leafColumns: import(\"../../domain/columns/types\").InternalLeafColumn<RecordType>[],\r\n ) => RecordType[];\r\n}) {\r\n if (params.queryRowsOverrideBase) {\r\n return params.queryRowsOverrideBase;\r\n }\r\n\r\n if (params.isRemoteQuery) {\r\n return params.dataSource;\r\n }\r\n\r\n return params.filterRows(\r\n params.dataSource,\r\n params.filterState,\r\n params.leafColumns,\r\n );\r\n}\r\n","import type { Rect } from \"../../debug/debug-snapshot\";\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\nimport type {\n ListTableFilterState,\n ListTableSortState,\n HoverState,\n ScrollState,\n} from \"../../schema/state\";\nimport type { ListTableOptions } from \"../../schema/table-options\";\nimport { applyHeaderFixedDirection } from \"../../features/header-settings/header-settings-feature\";\nimport { setHeaderColumnVisible } from \"../../features/header-settings/header-settings-feature\";\nimport { normalizeContextMenuZoom } from \"../../features/overlay/context-menu-builder\";\nimport { toggleFixedOverlay } from \"../../features/overlay/overlay-feature\";\nimport { toggleSortingState } from \"../../features/sorting/sorting-feature\";\nimport {\n resolveApplyFilterAction,\n resolveResetAllFiltersAction,\n resolveResetFilterAction,\n resolveResetSortAction,\n} from \"../../services/query-action-service\";\nimport {\n resolveResetHeaderColumnsAction,\n resolveToggleHeaderColumnVisibilityAction,\n} from \"../../services/header-settings-action-service\";\nimport {\n FILTER_PANEL_TEXTS,\n buildFilterPanelValue,\n getColumnFilterOptionsAsync,\n resolveFilterModes,\n filterRows,\n} from \"../../services/query-service\";\nimport { resolveDensitySizes } from \"../../shared/theme/density\";\nimport { resolveFilterPanelDataSource } from \"../../shared/filter/filter-panel-data\";\nimport type {\n ListTableFilterValue as FilterPanelValue,\n FilterPanelConfig,\n HeaderContextMenuDensity,\n ListTableFilterPanelAdapter,\n ListTableFixedPopupAdapter,\n ListTableHeaderContextMenuAdapter,\n} from \"../../ui/types\";\nimport type { ColumnSegments } from \"../../domain/columns/column-layout\";\nimport type { ListTableComponentPortal } from \"../../adapters/component-portal\";\nimport type { ListTableDomHost } from \"../../adapters/dom-host\";\nimport type { ListTableCanvasHost } from \"../../adapters/canvas-host\";\nimport type { ListTableOverlayController } from \"./overlay-controller\";\n\nexport interface ListTableHeaderActionControllerOptions<RecordType> {\n getOptions: () => ListTableOptions<RecordType>;\n setOptions: (options: ListTableOptions<RecordType>) => void;\n getInitialColumns: () => ListTableOptions<RecordType>[\"columns\"];\n getInitialStretchColumns: () => ListTableOptions<RecordType>[\"stretchColumns\"];\n getLeafColumns: () => InternalLeafColumn<RecordType>[];\n getColumnSegments: () => ColumnSegments<RecordType>;\n getSortState: () => ListTableSortState;\n setSortState: (value: ListTableSortState) => void;\n getFilterState: () => ListTableFilterState;\n setFilterState: (value: ListTableFilterState) => void;\n getHover: () => HoverState;\n getScroll: () => ScrollState;\n setScroll: (value: ScrollState) => void;\n getCurrentPage: () => number;\n setCurrentPage: (value: number) => void;\n getTableZoom: () => number;\n setTableZoom: (value: number) => void;\n getQueryRowsOverrideBase: () => RecordType[] | null;\n clearQueryRowsOverrideBase: () => void;\n getSelectedHeaderKey: () => string | null;\n getSelectedHeaderRect: () => Rect | null;\n setSelectedHeaderState: (\n selectedHeaderKey: string | null,\n selectedHeaderRect: Rect | null,\n ) => void;\n clearSelectedHeader: () => void;\n clearColumnRangeHighlight: () => void;\n resolveHighlightedColumnKeys: (columnKey: string) => string[];\n filterPanel: ListTableFilterPanelAdapter;\n fixedPopup: ListTableFixedPopupAdapter;\n headerContextMenu: ListTableHeaderContextMenuAdapter;\n overlayController: ListTableOverlayController<RecordType>;\n componentPortal: ListTableComponentPortal;\n domHost: ListTableDomHost;\n canvasHost: ListTableCanvasHost;\n toViewportRect: (rect: Rect) => Rect;\n showFilterPanel: (config: FilterPanelConfig) => void;\n hideFilterPanel: () => void;\n hideHeaderContextMenu: () => void;\n clearExpandedRows: () => void;\n clearCollapsedRows: () => void;\n persistColumnConfig: () => void;\n emitQueryChange: (action: \"sort\" | \"filter\" | \"paginate\") => void;\n applyFilterQueryAsync: () => void;\n refreshRuntimeColumns: () => void;\n startColumnVisibilityAnimation: (params: {\n previousLeafColumns: InternalLeafColumn<RecordType>[];\n previousSegments: ColumnSegments<RecordType>;\n }) => void;\n closeEditorIfOpen: () => void;\n isEditing: () => boolean;\n requestRender: () => void;\n}\n\n/**\n * 协调表头排序/过滤/固定/列显隐/密度/缩放等动作。\n */\nexport class ListTableHeaderActionController<RecordType> {\n private readonly options: ListTableHeaderActionControllerOptions<RecordType>;\n\n constructor(options: ListTableHeaderActionControllerOptions<RecordType>) {\n this.options = options;\n }\n\n toggleSort(columnKey: string) {\n if (this.options.isEditing()) {\n return;\n }\n this.options.clearQueryRowsOverrideBase();\n this.options.setSortState(\n toggleSortingState(this.options.getSortState(), columnKey),\n );\n this.options.clearExpandedRows();\n this.options.clearCollapsedRows();\n this.options.persistColumnConfig();\n this.options.emitQueryChange(\"sort\");\n }\n\n toggleFilter(columnKey: string, anchorRect: Rect) {\n if (this.options.isEditing()) {\n return;\n }\n if (\n this.options.filterPanel.isVisible() &&\n this.options.getHover().columnKey === columnKey\n ) {\n this.options.hideFilterPanel();\n return;\n }\n\n const column = this.options\n .getLeafColumns()\n .find((item) => item.key === columnKey);\n if (!column) {\n return;\n }\n\n const currentValue = this.options.getFilterState()[columnKey] ?? {\n keyword: \"\",\n mode: \"fuzzy\" as const,\n filterType: \"value\" as const,\n selectedKeys: [],\n };\n const buildPanelConfig = (\n panelOptions: FilterPanelConfig[\"options\"],\n loadOptions?: FilterPanelConfig[\"loadOptions\"],\n ): FilterPanelConfig => ({\n columnTitle: column.title ?? \"\",\n anchorRect: this.options.toViewportRect(anchorRect),\n value: buildFilterPanelValue(currentValue),\n filterOptionImmediateApply:\n this.options.getOptions().query?.filterOptionImmediateApply,\n modes: resolveFilterModes(column),\n options: panelOptions,\n loadOptions,\n texts: FILTER_PANEL_TEXTS,\n onApply: (value) => {\n this.applyFilterValue(columnKey, value);\n this.options.persistColumnConfig();\n },\n onReset: () => {\n this.resetFilterValue(columnKey);\n },\n onClose: () => {\n this.options.hideFilterPanel();\n },\n });\n this.options.showFilterPanel(\n buildPanelConfig([], (signal) =>\n getColumnFilterOptionsAsync({\n column,\n dataSource: resolveFilterPanelDataSource({\n queryRowsOverrideBase: this.options.getQueryRowsOverrideBase(),\n dataSource: this.options.getOptions().dataSource,\n isRemoteQuery: this.options.getOptions().query?.mode === \"remote\",\n filterState: this.options.getFilterState(),\n leafColumns: this.options.getLeafColumns(),\n filterRows,\n }),\n signal,\n }),\n ),\n );\n }\n\n showFixedPopup(columnKey: string, anchorRect: Rect) {\n toggleFixedOverlay({\n fixedPopup: this.options.fixedPopup,\n columnKey,\n anchorRect,\n leafColumns: this.options.getLeafColumns(),\n toViewportRect: (rect) => this.options.toViewportRect(rect),\n onSelect: (direction: \"left\" | \"right\" | \"none\") => {\n this.applyFixedDirection(columnKey, direction);\n },\n onClose: () => {\n this.options.requestRender();\n },\n });\n }\n\n applyFixedDirection(\n columnKey: string,\n direction: \"left\" | \"right\" | \"none\",\n ) {\n const nextScrollLeft = applyHeaderFixedDirection({\n options: this.options.getOptions(),\n columnKey,\n direction,\n currentScrollLeft: this.options.getScroll().left,\n initialColumns: this.options.getInitialColumns(),\n });\n this.options.persistColumnConfig();\n this.options.setScroll({\n ...this.options.getScroll(),\n left: nextScrollLeft,\n });\n this.options.refreshRuntimeColumns();\n }\n\n changeTableDensity(density: HeaderContextMenuDensity) {\n const nextSize = resolveDensitySizes(density);\n const options = this.options.getOptions();\n if (\n options.rowHeight === nextSize.rowHeight &&\n options.headerRowHeight === nextSize.headerRowHeight &&\n options.summaryRowHeight === nextSize.summaryRowHeight\n ) {\n this.options.hideHeaderContextMenu();\n return;\n }\n\n this.options.setOptions({\n ...options,\n rowHeight: nextSize.rowHeight,\n headerRowHeight: nextSize.headerRowHeight,\n summaryRowHeight: nextSize.summaryRowHeight,\n });\n this.options.hideHeaderContextMenu();\n this.options.requestRender();\n }\n\n changeTableZoom(zoom: number) {\n const next = normalizeContextMenuZoom(zoom);\n if (this.options.getTableZoom() === next) {\n // 连续调节时保持菜单打开。\n return;\n }\n // 缩放会改变布局与单元格视觉尺寸,先关闭编辑避免错位。\n this.options.closeEditorIfOpen();\n this.options.setTableZoom(next);\n this.options.domHost.setContentZoom(next);\n this.options.canvasHost.setContentZoom(next);\n // 保持菜单打开以便连续调节缩放;同步 config 中的 zoom 值。\n const headerContextMenuConfig =\n this.options.overlayController.getHeaderContextMenuConfig();\n if (headerContextMenuConfig) {\n const nextConfig = {\n ...headerContextMenuConfig,\n zoom: next,\n };\n this.options.overlayController.setHeaderContextMenuConfig(nextConfig);\n this.options.getOptions().ui?.onHeaderContextMenuRequest?.(nextConfig);\n if (!this.options.getOptions().ui?.onHeaderContextMenuRequest) {\n this.options.componentPortal.headerContextMenu.show(nextConfig);\n }\n }\n this.options.persistColumnConfig();\n this.options.requestRender();\n }\n\n resetFilters() {\n if (this.options.isEditing()) {\n return;\n }\n const next = resolveResetAllFiltersAction(this.options.getSortState());\n this.options.setFilterState(next.filterState);\n if (next.currentPage != null) {\n this.options.setCurrentPage(next.currentPage);\n }\n this.options.clearExpandedRows();\n this.options.clearCollapsedRows();\n this.options.headerContextMenu.hide();\n this.options.persistColumnConfig();\n this.options.applyFilterQueryAsync();\n }\n\n resetSort() {\n if (this.options.isEditing()) {\n return;\n }\n this.options.clearQueryRowsOverrideBase();\n const next = resolveResetSortAction(this.options.getFilterState());\n this.options.setSortState(next.sortState);\n this.options.clearExpandedRows();\n this.options.clearCollapsedRows();\n this.options.headerContextMenu.hide();\n this.options.persistColumnConfig();\n this.options.emitQueryChange(\"sort\");\n this.options.requestRender();\n }\n\n resetHeaderColumns() {\n const resetState = resolveResetHeaderColumnsAction({\n columns: this.options.getOptions().columns,\n initialColumns: this.options.getInitialColumns(),\n initialStretchColumns: this.options.getInitialStretchColumns(),\n currentScrollTop: this.options.getScroll().top,\n });\n this.options.getOptions().stretchColumns = resetState.stretchColumns;\n this.options.setSelectedHeaderState(null, null);\n this.options.setScroll(resetState.scroll);\n this.options.headerContextMenu.hide();\n this.options.refreshRuntimeColumns();\n this.options.persistColumnConfig();\n this.options.requestRender();\n }\n\n toggleHeaderColumnVisible(columnKey: string, visible: boolean) {\n const previousLeafColumns = this.options.getLeafColumns();\n const previousSegments = this.options.getColumnSegments();\n const resolved = resolveToggleHeaderColumnVisibilityAction({\n columns: this.options.getOptions().columns,\n columnKey,\n visible,\n selectedHeaderKey: this.options.getSelectedHeaderKey(),\n selectedHeaderRect: this.options.getSelectedHeaderRect(),\n });\n if (!resolved) {\n return;\n }\n\n this.options.setSelectedHeaderState(\n resolved.selectedHeaderKey,\n resolved.selectedHeaderRect,\n );\n this.options.refreshRuntimeColumns();\n this.options.persistColumnConfig();\n this.options.requestRender();\n this.options.startColumnVisibilityAnimation({\n previousLeafColumns,\n previousSegments,\n });\n this.options.headerContextMenu.updateColumns(resolved.menuItems);\n }\n\n toggleHighlightedHeaderColumns(columnKey: string, visible: boolean) {\n if (visible) {\n this.toggleHeaderColumnVisible(columnKey, true);\n return;\n }\n\n const columnKeys = this.options.resolveHighlightedColumnKeys(columnKey);\n if (columnKeys.length === 0) {\n return;\n }\n\n const previousLeafColumns = this.options.getLeafColumns();\n const previousSegments = this.options.getColumnSegments();\n let updated = false;\n columnKeys.forEach((key) => {\n updated =\n setHeaderColumnVisible(this.options.getOptions().columns, key, false) ||\n updated;\n });\n if (!updated) {\n return;\n }\n\n this.options.clearSelectedHeader();\n this.options.clearColumnRangeHighlight();\n this.options.refreshRuntimeColumns();\n this.options.persistColumnConfig();\n this.options.headerContextMenu.hide();\n this.options.requestRender();\n this.options.startColumnVisibilityAnimation({\n previousLeafColumns,\n previousSegments,\n });\n }\n\n applyFilterValue(columnKey: string, value: FilterPanelValue) {\n if (this.options.isEditing()) {\n return;\n }\n const next = resolveApplyFilterAction({\n sortState: this.options.getSortState(),\n filterState: this.options.getFilterState(),\n columnKey,\n value,\n });\n this.options.setFilterState(next.filterState);\n this.options.clearExpandedRows();\n this.options.clearCollapsedRows();\n if (!this.options.getOptions().query?.filterOptionImmediateApply) {\n this.options.filterPanel.hide();\n }\n this.options.applyFilterQueryAsync();\n }\n\n resetFilterValue(columnKey: string) {\n if (this.options.isEditing()) {\n return;\n }\n const next = resolveResetFilterAction({\n sortState: this.options.getSortState(),\n filterState: this.options.getFilterState(),\n columnKey,\n });\n this.options.setFilterState(next.filterState);\n this.options.clearExpandedRows();\n this.options.clearCollapsedRows();\n this.options.filterPanel.hide();\n this.options.applyFilterQueryAsync();\n }\n}\n","import type { ListTableOptions } from \"../../schema/table-options\";\r\nimport type { ListTableComponentPortal } from \"../../adapters/component-portal\";\r\nimport {\r\n createListTableOverlayRuntime,\r\n type ListTableOverlayRuntime,\r\n} from \"../runtime\";\r\nimport type {\r\n ListTableDangerConfirmRequest,\r\n ListTableTooltipRequest,\r\n FilterPanelConfig,\r\n FixedPopupConfig,\r\n HeaderContextMenuColumnItem,\r\n HeaderContextMenuConfig,\r\n ListTableFilterPanelAdapter,\r\n ListTableFixedPopupAdapter,\r\n ListTableHeaderContextMenuAdapter,\r\n ListTableTooltipAdapter,\r\n} from \"../../ui/types\";\r\n\r\nexport interface ListTableOverlayControllerOptions<RecordType> {\r\n getOptions: () => ListTableOptions<RecordType>;\r\n componentPortal: ListTableComponentPortal;\r\n getContentZoom: () => number;\r\n runtime?: ListTableOverlayRuntime;\r\n}\r\n\r\n/**\r\n * 协调 ListTable 的内置浮层与外部 UI 接管请求。\r\n */\r\nexport class ListTableOverlayController<RecordType> {\r\n private readonly getOptions: () => ListTableOptions<RecordType>;\r\n private readonly componentPortal: ListTableComponentPortal;\r\n private readonly getContentZoom: () => number;\r\n private readonly runtime: ListTableOverlayRuntime;\r\n\r\n readonly tooltipAdapter: ListTableTooltipAdapter;\r\n readonly filterPanelAdapter: ListTableFilterPanelAdapter;\r\n readonly fixedPopupAdapter: ListTableFixedPopupAdapter;\r\n readonly headerContextMenuAdapter: ListTableHeaderContextMenuAdapter;\r\n\r\n constructor(options: ListTableOverlayControllerOptions<RecordType>) {\r\n this.getOptions = options.getOptions;\r\n this.componentPortal = options.componentPortal;\r\n this.getContentZoom = options.getContentZoom;\r\n this.runtime = options.runtime ?? createListTableOverlayRuntime();\r\n this.tooltipAdapter = {\r\n mount: () => undefined,\r\n show: (x, y, content, variant) => {\r\n this.showTooltip({ x, y, content, variant });\r\n },\r\n hide: () => {\r\n this.hideTooltip();\r\n },\r\n destroy: () => undefined,\r\n };\r\n this.filterPanelAdapter = {\r\n mount: () => undefined,\r\n show: (config) => {\r\n this.showFilterPanel(config);\r\n },\r\n hide: () => {\r\n this.hideFilterPanel();\r\n },\r\n isVisible: () => this.isFilterPanelVisible(),\r\n destroy: () => undefined,\r\n };\r\n this.fixedPopupAdapter = {\r\n mount: () => undefined,\r\n show: (config) => {\r\n this.showFixedPopup(config);\r\n },\r\n hide: () => {\r\n this.hideFixedPopup();\r\n },\r\n isVisible: () => this.isFixedPopupVisible(),\r\n destroy: () => undefined,\r\n };\r\n this.headerContextMenuAdapter = {\r\n mount: () => undefined,\r\n show: (config) => {\r\n this.showHeaderContextMenu(config);\r\n },\r\n hide: () => {\r\n this.hideHeaderContextMenu();\r\n },\r\n isVisible: () => this.isHeaderContextMenuVisible(),\r\n updateColumns: (columns) => {\r\n this.updateHeaderContextMenuColumns(columns);\r\n },\r\n destroy: () => undefined,\r\n };\r\n }\r\n\r\n showTooltip(request: Omit<ListTableTooltipRequest, \"contentZoom\">) {\r\n const contentZoom = this.resolveContentZoom();\r\n const nextRequest = {\r\n ...request,\r\n contentZoom,\r\n };\r\n const options = this.getOptions();\r\n options.ui?.onTooltipRequest?.(nextRequest);\r\n if (!options.ui?.onTooltipRequest) {\r\n this.componentPortal.tooltip.show(\r\n nextRequest.x,\r\n nextRequest.y,\r\n nextRequest.content,\r\n nextRequest.variant,\r\n );\r\n }\r\n }\r\n\r\n hideTooltip() {\r\n this.getOptions().ui?.onTooltipRequest?.(null);\r\n this.componentPortal.tooltip.hide();\r\n }\r\n\r\n showLoading(text?: string) {\r\n this.getOptions().ui?.onLoadingRequest?.({ text });\r\n }\r\n\r\n hideLoading() {\r\n this.getOptions().ui?.onLoadingRequest?.(null);\r\n }\r\n\r\n showDangerConfirm(request: ListTableDangerConfirmRequest) {\r\n const onDangerConfirmRequest = this.getOptions().ui?.onDangerConfirmRequest;\r\n if (onDangerConfirmRequest) {\r\n onDangerConfirmRequest(request);\r\n return;\r\n }\r\n\r\n if (typeof globalThis.confirm === \"function\") {\r\n if (globalThis.confirm(request.title)) {\r\n request.onConfirm();\r\n } else {\r\n request.onCancel();\r\n }\r\n return;\r\n }\r\n\r\n request.onCancel();\r\n }\r\n\r\n showFilterPanel(config: FilterPanelConfig) {\r\n this.runtime.filterPanelVisible = true;\r\n const options = this.getOptions();\r\n options.ui?.onFilterPanelRequest?.(config);\r\n if (!options.ui?.onFilterPanelRequest) {\r\n this.componentPortal.filterPanel.show(config);\r\n }\r\n }\r\n\r\n hideFilterPanel() {\r\n this.runtime.filterPanelVisible = false;\r\n this.getOptions().ui?.onFilterPanelRequest?.(null);\r\n this.componentPortal.filterPanel.hide();\r\n }\r\n\r\n isFilterPanelVisible() {\r\n if (this.getOptions().ui?.onFilterPanelRequest) {\r\n return this.runtime.filterPanelVisible;\r\n }\r\n return this.componentPortal.filterPanel.isVisible();\r\n }\r\n\r\n showFixedPopup(config: FixedPopupConfig) {\r\n this.runtime.fixedPopupVisible = true;\r\n const options = this.getOptions();\r\n options.ui?.onFixedPopupRequest?.(config);\r\n if (!options.ui?.onFixedPopupRequest) {\r\n this.componentPortal.fixedPopup.show(config);\r\n }\r\n }\r\n\r\n hideFixedPopup() {\r\n this.runtime.fixedPopupVisible = false;\r\n this.getOptions().ui?.onFixedPopupRequest?.(null);\r\n this.componentPortal.fixedPopup.hide();\r\n }\r\n\r\n isFixedPopupVisible() {\r\n if (this.getOptions().ui?.onFixedPopupRequest) {\r\n return this.runtime.fixedPopupVisible;\r\n }\r\n return this.componentPortal.fixedPopup.isVisible();\r\n }\r\n\r\n showHeaderContextMenu(config: HeaderContextMenuConfig) {\r\n this.runtime.headerContextMenuVisible = true;\r\n this.runtime.headerContextMenuConfig = config;\r\n const options = this.getOptions();\r\n options.ui?.onHeaderContextMenuRequest?.(config);\r\n if (!options.ui?.onHeaderContextMenuRequest) {\r\n this.componentPortal.headerContextMenu.show(config);\r\n }\r\n }\r\n\r\n hideHeaderContextMenu() {\r\n this.runtime.headerContextMenuVisible = false;\r\n this.runtime.headerContextMenuConfig = null;\r\n this.getOptions().ui?.onHeaderContextMenuRequest?.(null);\r\n this.componentPortal.headerContextMenu.hide();\r\n }\r\n\r\n isHeaderContextMenuVisible() {\r\n if (this.getOptions().ui?.onHeaderContextMenuRequest) {\r\n return this.runtime.headerContextMenuVisible;\r\n }\r\n return this.componentPortal.headerContextMenu.isVisible();\r\n }\r\n\r\n updateHeaderContextMenuColumns(columns: HeaderContextMenuColumnItem[]) {\r\n const options = this.getOptions();\r\n if (\r\n options.ui?.onHeaderContextMenuRequest &&\r\n this.runtime.headerContextMenuConfig\r\n ) {\r\n const nextConfig = {\r\n ...this.runtime.headerContextMenuConfig,\r\n columns,\r\n };\r\n this.runtime.headerContextMenuConfig = nextConfig;\r\n options.ui.onHeaderContextMenuRequest(nextConfig);\r\n return;\r\n }\r\n this.componentPortal.headerContextMenu.updateColumns(columns);\r\n }\r\n\r\n getHeaderContextMenuConfig() {\r\n return this.runtime.headerContextMenuConfig;\r\n }\r\n\r\n setHeaderContextMenuConfig(config: HeaderContextMenuConfig | null) {\r\n this.runtime.headerContextMenuConfig = config;\r\n }\r\n\r\n hideAll() {\r\n this.hideTooltip();\r\n this.hideLoading();\r\n this.hideFilterPanel();\r\n this.hideFixedPopup();\r\n this.hideHeaderContextMenu();\r\n }\r\n\r\n destroy() {\r\n this.hideAll();\r\n }\r\n\r\n private resolveContentZoom() {\r\n const contentZoom = this.getContentZoom();\r\n return contentZoom > 0 ? contentZoom : 1;\r\n }\r\n}\r\n","/**\r\n * 列配置持久化数据结构。\r\n */\r\nexport interface StoredColumnConfig {\r\n /** 各列的宽度与固定方向。 */\r\n columns: Record<\n string,\n {\n width: number;\n fixed?: \"left\" | \"right\";\n hidden?: boolean;\n summary?: { type?: string; precision?: number } | false;\n }\n >;\n /** 排序状态。 */\r\n sort: { key: string | null; order: \"ascend\" | \"descend\" | null };\r\n /** 过滤状态。 */\r\n filters: Record<string, unknown>;\r\n /**\r\n * 表格内容缩放(1 = 100%)。\r\n */\r\n zoom?: number;\r\n}\r\n\r\nconst DATABASE_NAME = \"canvas_components_config\";\r\nconst STORE_NAME = \"column_config\";\r\nconst DB_VERSION = 1;\r\n\r\nlet dbPromise: Promise<IDBDatabase> | null = null;\r\n\r\nfunction openDatabase(): Promise<IDBDatabase> {\r\n if (dbPromise) return dbPromise;\r\n\r\n dbPromise = new Promise<IDBDatabase>((resolve, reject) => {\r\n const request = indexedDB.open(DATABASE_NAME, DB_VERSION);\r\n\r\n request.onupgradeneeded = () => {\r\n const db = request.result;\r\n if (!db.objectStoreNames.contains(STORE_NAME)) {\r\n db.createObjectStore(STORE_NAME);\r\n }\r\n };\r\n\r\n request.onsuccess = () => resolve(request.result);\r\n request.onerror = () => reject(request.error);\r\n });\r\n\r\n return dbPromise;\r\n}\r\n\r\n/**\r\n * 保存列配置。\r\n *\r\n * @param key 存储键。\r\n * @param config 配置对象。\r\n */\r\nexport async function saveColumnConfig(\r\n key: string,\r\n config: StoredColumnConfig,\r\n): Promise<void> {\r\n try {\r\n const db = await openDatabase();\r\n await new Promise<void>((resolve, reject) => {\r\n const transaction = db.transaction(STORE_NAME, \"readwrite\");\r\n const store = transaction.objectStore(STORE_NAME);\r\n const request = store.put(config, key);\r\n request.onsuccess = () => resolve();\r\n request.onerror = () => reject(request.error);\r\n });\r\n } catch (error) {\r\n console.error(\"[ListTable] Failed to save column config:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * 获取列配置。\r\n *\r\n * @param key 存储键。\r\n * @returns 配置对象。\r\n */\r\nexport async function getColumnConfig(\r\n key: string,\r\n): Promise<StoredColumnConfig | undefined> {\r\n try {\r\n const db = await openDatabase();\r\n return await new Promise<StoredColumnConfig | undefined>(\r\n (resolve, reject) => {\r\n const transaction = db.transaction(STORE_NAME, \"readonly\");\r\n const store = transaction.objectStore(STORE_NAME);\r\n const request = store.get(key);\r\n request.onsuccess = () => resolve(request.result ?? undefined);\r\n request.onerror = () => reject(request.error);\r\n },\r\n );\r\n } catch (error) {\r\n console.error(\"[ListTable] Failed to load column config:\", error);\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * 清除指定键的配置。\r\n *\r\n * @param key 存储键。\r\n */\r\nexport async function clearColumnConfig(key: string): Promise<void> {\r\n try {\r\n const db = await openDatabase();\r\n await new Promise<void>((resolve, reject) => {\r\n const transaction = db.transaction(STORE_NAME, \"readwrite\");\r\n const store = transaction.objectStore(STORE_NAME);\r\n const request = store.delete(key);\r\n request.onsuccess = () => resolve();\r\n request.onerror = () => reject(request.error);\r\n });\r\n } catch (error) {\r\n console.error(\"[ListTable] Failed to clear column config:\", error);\r\n }\r\n}\r\n","import type { ListTableFilterState, ListTableSortState } from \"../schema/state\";\r\nimport type { StoredColumnConfig } from \"../adapters/storage/indexeddb-column-config-storage\";\n\nexport type ListTableStoredColumnConfig = StoredColumnConfig & {\n /** 汇总栏高度;沿用列配置存储记录保存。 */\n summaryRowHeight?: number;\n};\n\r\ntype StoredColumnNode = {\n key?: string;\r\n width?: number;\r\n fixed?: \"left\" | \"right\";\r\n hidden?: boolean;\n summary?: boolean | { type?: string; precision?: number };\n children?: StoredColumnNode[];\r\n};\r\n\r\n/**\r\n * 应用持久化列配置到当前列树。\r\n */\r\nexport function applyStoredColumnConfig(\r\n columns: StoredColumnNode[],\r\n storedColumns: StoredColumnConfig[\"columns\"] | undefined,\r\n) {\r\n if (!storedColumns) {\r\n return;\r\n }\r\n\r\n const applyToColumns = (cols: StoredColumnNode[]) => {\r\n for (const col of cols) {\r\n if (!col.key) {\r\n continue;\r\n }\r\n const stored = storedColumns[col.key];\r\n if (stored) {\n col.width = stored.width;\r\n col.hidden = !!stored.hidden;\r\n if (stored.fixed) {\n col.fixed = stored.fixed;\r\n } else {\r\n delete (col as Record<string, unknown>).fixed;\r\n }\n if (stored.summary === false) {\n delete col.summary;\n } else if (stored.summary) {\n col.summary = {\n ...(typeof col.summary === \"object\" ? col.summary : null),\n type: stored.summary.type,\n precision: stored.summary.precision,\n };\n }\n }\r\n if (col.children?.length) {\r\n applyToColumns(col.children);\r\n }\r\n }\r\n };\r\n\r\n applyToColumns(columns);\r\n}\r\n\r\n/**\r\n * 构建当前列配置的持久化快照。\r\n */\r\nexport function buildStoredColumnConfig(\n columns: StoredColumnNode[],\n sortState: ListTableSortState,\n filterState: ListTableFilterState,\n zoom?: number,\n summaryRowHeight?: number,\n): ListTableStoredColumnConfig {\n const result: StoredColumnConfig[\"columns\"] = {};\r\n\r\n const collectColumns = (cols: StoredColumnNode[]) => {\r\n for (const col of cols) {\r\n if (!col.key) {\r\n continue;\r\n }\r\n result[col.key] = {\n width: col.width ?? 160,\r\n fixed: col.fixed,\r\n hidden: !!col.hidden,\n summary:\n col.summary === true\n ? { type: \"sum\" }\n : col.summary\n ? {\n type: col.summary.type,\n precision: col.summary.precision,\n }\n : false,\n };\r\n if (col.children?.length) {\r\n collectColumns(col.children);\r\n }\r\n }\r\n };\r\n\r\n collectColumns(columns);\r\n\r\n return {\n columns: result,\r\n sort: {\r\n key: sortState.key,\r\n order: sortState.order,\r\n },\r\n filters: filterState as Record<string, unknown>,\r\n ...(typeof zoom === \"number\" && Number.isFinite(zoom) && zoom > 0\n ? { zoom }\n : null),\n ...(typeof summaryRowHeight === \"number\" &&\n Number.isFinite(summaryRowHeight) &&\n summaryRowHeight >= 0\n ? { summaryRowHeight }\n : null),\n };\n}\n","import type { ListTableFilterState, ListTableSortState } from \"../schema/state\";\r\nimport { ensureColumnKeysInPlace } from \"../domain/columns/column-key\";\r\nimport { getColumnConfig, saveColumnConfig } from \"../adapters/storage/indexeddb-column-config-storage\";\r\nimport {\n applyStoredColumnConfig,\n buildStoredColumnConfig,\n type ListTableStoredColumnConfig,\n} from \"./column-config-service\";\nimport type { ListTableOptions } from \"../schema/table-options\";\r\n\r\n/**\r\n * 持久化当前列表表格列配置。\r\n */\r\nexport function persistListTableColumnConfig<RecordType>(params: {\r\n storageKey?: string;\r\n columns: ListTableOptions<RecordType>[\"columns\"];\r\n sortState: ListTableSortState;\r\n filterState: ListTableFilterState;\n zoom?: number;\n summaryRowHeight?: number;\n}) {\n const {\n storageKey,\n columns,\n sortState,\n filterState,\n zoom,\n summaryRowHeight,\n } = params;\n if (!storageKey) {\r\n return;\r\n }\r\n ensureColumnKeysInPlace(columns);\r\n\r\n saveColumnConfig(\r\n storageKey,\r\n buildStoredColumnConfig(\n columns,\n sortState,\n filterState,\n zoom,\n summaryRowHeight,\n ),\n );\r\n}\r\n\r\nexport interface LoadedListTableStoredConfig {\r\n sortState: ListTableSortState | null;\r\n filterState: ListTableFilterState | null;\n zoom: number | null;\n summaryRowHeight: number | null;\n}\r\n\r\n/**\r\n * 读取并应用持久化列配置。\r\n */\r\nexport async function loadListTableStoredConfig<RecordType>(params: {\r\n storageKey?: string;\r\n columns: ListTableOptions<RecordType>[\"columns\"];\r\n}) {\r\n const { storageKey, columns } = params;\r\n if (!storageKey) {\r\n return null;\r\n }\r\n ensureColumnKeysInPlace(columns);\r\n\r\n const stored = (await getColumnConfig(storageKey)) as\n | ListTableStoredColumnConfig\n | undefined;\n if (!stored) {\r\n return null;\r\n }\r\n\r\n applyStoredColumnConfig(columns, stored.columns);\r\n\r\n return {\r\n sortState: stored.sort?.key\r\n ? {\r\n key: stored.sort.key,\r\n order: stored.sort.order,\r\n }\r\n : null,\r\n filterState: stored.filters\r\n ? (stored.filters as ListTableFilterState)\r\n : null,\r\n zoom:\n typeof stored.zoom === \"number\" &&\r\n Number.isFinite(stored.zoom) &&\r\n stored.zoom > 0\r\n ? stored.zoom\n : null,\n summaryRowHeight:\n typeof stored.summaryRowHeight === \"number\" &&\n Number.isFinite(stored.summaryRowHeight) &&\n stored.summaryRowHeight >= 0\n ? stored.summaryRowHeight\n : null,\n } satisfies LoadedListTableStoredConfig;\n}\n","import type {\r\n ListTableFilterState,\r\n ListTableSortState,\r\n} from \"../../schema/state\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport { normalizeContextMenuZoom } from \"../../features/overlay/context-menu-builder\";\r\nimport {\r\n loadListTableStoredConfig,\r\n persistListTableColumnConfig,\r\n} from \"../../services/persistence-service\";\r\nimport type { ListTableDomHost } from \"../../adapters/dom-host\";\r\nimport type { ListTableCanvasHost } from \"../../adapters/canvas-host\";\r\n\r\nexport interface ListTablePersistenceControllerOptions<RecordType> {\r\n getOptions: () => ListTableOptions<RecordType>;\n setOptions: (value: ListTableOptions<RecordType>) => void;\n getSortState: () => ListTableSortState;\r\n setSortState: (value: ListTableSortState) => void;\r\n getFilterState: () => ListTableFilterState;\r\n setFilterState: (value: ListTableFilterState) => void;\r\n getTableZoom: () => number;\r\n setTableZoom: (value: number) => void;\r\n domHost: ListTableDomHost;\n canvasHost: ListTableCanvasHost;\n refreshRuntimeColumns: () => void;\n requestRender: () => void;\n}\r\n\r\n/**\r\n * 协调列配置持久化读取与写回。\r\n */\r\nexport class ListTablePersistenceController<RecordType> {\r\n private readonly options: ListTablePersistenceControllerOptions<RecordType>;\r\n\r\n constructor(options: ListTablePersistenceControllerOptions<RecordType>) {\r\n this.options = options;\r\n }\r\n\r\n async loadStoredConfig() {\r\n const tableOptions = this.options.getOptions();\r\n const stored = await loadListTableStoredConfig({\r\n storageKey: tableOptions.storageKey,\r\n columns: tableOptions.columns,\r\n });\r\n if (!stored) {\r\n return;\r\n }\r\n\r\n if (stored.sortState) {\r\n this.options.setSortState(stored.sortState);\r\n }\r\n if (stored.filterState) {\r\n this.options.setFilterState(stored.filterState);\r\n }\r\n\r\n if (stored.zoom != null) {\n const nextZoom = normalizeContextMenuZoom(stored.zoom);\r\n this.options.setTableZoom(nextZoom);\r\n this.options.domHost.setContentZoom(nextZoom);\r\n this.options.canvasHost.setContentZoom(nextZoom);\n }\n\n if (stored.summaryRowHeight != null) {\n const currentOptions = this.options.getOptions();\n if (currentOptions.summaryRowHeight !== stored.summaryRowHeight) {\n this.options.setOptions({\n ...currentOptions,\n summaryRowHeight: stored.summaryRowHeight,\n });\n }\n }\n\r\n this.options.refreshRuntimeColumns();\n this.options.requestRender();\n }\r\n\r\n persistColumnConfig() {\r\n const tableOptions = this.options.getOptions();\r\n persistListTableColumnConfig({\r\n storageKey: tableOptions.storageKey,\r\n columns: tableOptions.columns,\r\n sortState: this.options.getSortState(),\r\n filterState: this.options.getFilterState(),\n zoom: this.options.getTableZoom(),\n summaryRowHeight: tableOptions.summaryRowHeight,\n });\n }\r\n}\r\n","import type { InternalLeafColumn } from \"../domain/columns/types\";\r\nimport type { ListTableOptions } from \"../schema/table-options\";\r\nimport { getRowKey } from \"../domain/rows/row-selection\";\r\nimport {\r\n getBaseDisplayRows,\r\n getDisplayRows,\r\n sliceDisplayRowsFromBaseRows,\r\n type ListTableQueryRuntimeState,\r\n} from \"./query-service\";\r\nimport {\r\n flattenExpandableRows,\r\n type ListTableVisibleRow,\r\n} from \"./expandable-service\";\r\n\r\n/**\r\n * 获取列表表格基础显示数据。\r\n */\r\nexport function getListTableBaseDisplayData<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n query: ListTableQueryRuntimeState;\r\n queryRowsOverrideBase?: RecordType[] | null;\r\n}) {\r\n if (params.queryRowsOverrideBase) {\r\n return params.queryRowsOverrideBase;\r\n }\r\n\r\n return getBaseDisplayRows(params);\r\n}\r\n\r\n/**\r\n * 获取列表表格最终显示数据。\r\n */\r\nexport function getListTableDisplayData<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n query: ListTableQueryRuntimeState;\r\n queryRowsOverrideBase?: RecordType[] | null;\r\n}) {\r\n if (params.queryRowsOverrideBase) {\r\n return (\r\n getListTableDisplayRowsOverride({\r\n options: params.options,\r\n query: params.query,\r\n queryRowsOverrideBase: params.queryRowsOverrideBase,\r\n }) ?? params.queryRowsOverrideBase\r\n );\r\n }\r\n\r\n return getDisplayRows(params);\r\n}\r\n\r\n/**\r\n * 基于查询基础数据获取最终显示数据。\r\n */\r\nexport function getListTableDisplayDataFromBaseRows<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n rows: RecordType[];\r\n query: ListTableQueryRuntimeState;\r\n}) {\r\n return sliceDisplayRowsFromBaseRows(params);\r\n}\r\n\r\n/**\r\n * 获取异步查询基础数据对应的当前显示数据。\r\n */\r\nexport function getListTableDisplayRowsOverride<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n query: ListTableQueryRuntimeState;\r\n queryRowsOverrideBase: RecordType[] | null;\r\n}) {\r\n if (!params.queryRowsOverrideBase) {\r\n return null;\r\n }\r\n\r\n return getListTableDisplayDataFromBaseRows({\r\n options: params.options,\r\n rows: params.queryRowsOverrideBase,\r\n query: params.query,\r\n });\r\n}\r\n\r\n/**\r\n * 获取展开配置下的未折叠可见行。\r\n */\r\nexport function getListTableUncollapsedVisibleRows<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n rows: RecordType[];\r\n expandedRowKeys: Array<string | number>;\r\n}): ListTableVisibleRow<RecordType>[] {\r\n return flattenExpandableRows(params);\r\n}\r\n\r\n/**\r\n * 根据当前选中 key 解析选中行。\r\n */\r\nexport function getListTableSelectedRows<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: Array<string | number>;\r\n}) {\r\n const { options, selectedRowKeys } = params;\r\n return options.dataSource.filter((record, index) =>\r\n selectedRowKeys.includes(getRowKey(options, record, index)),\r\n );\r\n}\r\n","import type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport {\r\n getListTableBaseDisplayData,\r\n getListTableDisplayData,\r\n getListTableDisplayDataFromBaseRows,\r\n getListTableDisplayRowsOverride,\r\n} from \"../../services/data-source-service\";\r\nimport {\r\n emitListTableQueryChange,\r\n getBaseDisplayRowsAsync,\r\n type ListTableQueryRuntimeState,\r\n} from \"../../services/query-service\";\r\n\r\nexport type ListTableQueryAction = \"sort\" | \"filter\" | \"paginate\";\r\n\r\nexport interface ListTableQueryControllerOptions<RecordType> {\r\n getOptions: () => ListTableOptions<RecordType>;\r\n getLeafColumns: () => InternalLeafColumn<RecordType>[];\r\n getQueryRuntimeState: () => ListTableQueryRuntimeState;\r\n showLoading: (text?: string) => void;\r\n hideLoading: () => void;\r\n requestRender: () => void;\r\n}\r\n\r\n/**\r\n * 协调 ListTable 本地/远端查询与 filter 异步任务。\r\n */\r\nexport class ListTableQueryController<RecordType> {\r\n private readonly options: ListTableQueryControllerOptions<RecordType>;\r\n private queryRowsOverrideBase: RecordType[] | null = null;\r\n private queryTaskId = 0;\r\n private queryAbortController: AbortController | null = null;\r\n\r\n constructor(options: ListTableQueryControllerOptions<RecordType>) {\r\n this.options = options;\r\n }\r\n\r\n getQueryRowsOverrideBase() {\r\n return this.queryRowsOverrideBase;\r\n }\r\n\r\n setQueryRowsOverrideBase(rows: RecordType[] | null) {\r\n this.queryRowsOverrideBase = rows;\r\n }\r\n\r\n clearQueryRowsOverrideBase() {\r\n this.queryRowsOverrideBase = null;\r\n }\r\n\r\n getBaseDisplayData() {\r\n return getListTableBaseDisplayData({\r\n options: this.options.getOptions(),\r\n leafColumns: this.options.getLeafColumns(),\r\n query: this.options.getQueryRuntimeState(),\r\n queryRowsOverrideBase: this.queryRowsOverrideBase,\r\n });\r\n }\r\n\r\n getDisplayData() {\r\n return getListTableDisplayData({\r\n options: this.options.getOptions(),\r\n leafColumns: this.options.getLeafColumns(),\r\n query: this.options.getQueryRuntimeState(),\r\n queryRowsOverrideBase: this.queryRowsOverrideBase,\r\n });\r\n }\r\n\r\n getDisplayRowsOverride() {\r\n return getListTableDisplayRowsOverride({\r\n options: this.options.getOptions(),\r\n query: this.options.getQueryRuntimeState(),\r\n queryRowsOverrideBase: this.queryRowsOverrideBase,\r\n });\r\n }\r\n\r\n /**\r\n * 应用过滤查询:remote 直接 emit,local 异步计算 override。\r\n */\r\n applyFilterQueryAsync() {\r\n if (this.options.getOptions().query?.mode === \"remote\") {\r\n this.queryRowsOverrideBase = null;\r\n this.emitQueryChange(\"filter\");\r\n this.options.requestRender();\r\n return;\r\n }\r\n\r\n this.queryTaskId += 1;\r\n const taskId = this.queryTaskId;\r\n this.queryAbortController?.abort();\r\n this.queryAbortController = new AbortController();\r\n const { signal } = this.queryAbortController;\r\n const query = this.options.getQueryRuntimeState();\r\n this.options.showLoading(\"正在筛选数据…\");\r\n\r\n void getBaseDisplayRowsAsync({\r\n options: this.options.getOptions(),\r\n leafColumns: this.options.getLeafColumns(),\r\n query,\r\n signal,\r\n })\r\n .then((baseRows) => {\r\n if (signal.aborted || taskId !== this.queryTaskId) {\r\n return;\r\n }\r\n\r\n this.queryRowsOverrideBase = baseRows;\r\n this.options.hideLoading();\r\n this.emitQueryChangeWithResolvedRows(\"filter\", baseRows);\r\n this.options.requestRender();\r\n })\r\n .catch((error) => {\r\n if (signal.aborted) {\r\n this.options.hideLoading();\r\n return;\r\n }\r\n\r\n console.error(\"Failed to resolve filtered rows.\", error);\r\n this.queryRowsOverrideBase = null;\r\n this.options.hideLoading();\r\n this.options.requestRender();\r\n });\r\n }\r\n\r\n emitQueryChange(action: ListTableQueryAction) {\r\n emitListTableQueryChange({\r\n options: this.options.getOptions(),\r\n leafColumns: this.options.getLeafColumns(),\r\n query: this.options.getQueryRuntimeState(),\r\n action,\r\n currentDataSource: this.getDisplayData(),\r\n baseRowsOverride: this.queryRowsOverrideBase ?? undefined,\r\n filteredDataSourceOverride: this.queryRowsOverrideBase ?? undefined,\r\n });\r\n }\r\n\r\n emitQueryChangeWithResolvedRows(\r\n action: ListTableQueryAction,\r\n baseRows: RecordType[],\r\n ) {\r\n const query = this.options.getQueryRuntimeState();\r\n emitListTableQueryChange({\r\n options: this.options.getOptions(),\r\n leafColumns: this.options.getLeafColumns(),\r\n query,\r\n action,\r\n currentDataSource: getListTableDisplayDataFromBaseRows({\r\n options: this.options.getOptions(),\r\n rows: baseRows,\r\n query,\r\n }),\r\n baseRowsOverride: baseRows,\r\n filteredDataSourceOverride: baseRows,\r\n });\r\n }\r\n\r\n /**\r\n * 取消当前查询任务并清理 override / loading。\r\n */\r\n reset() {\r\n this.queryAbortController?.abort();\r\n this.queryAbortController = null;\r\n this.queryRowsOverrideBase = null;\r\n this.options.hideLoading();\r\n }\r\n\r\n destroy() {\r\n this.queryAbortController?.abort();\r\n this.queryAbortController = null;\r\n this.queryRowsOverrideBase = null;\r\n this.options.hideLoading();\r\n }\r\n}\r\n","import type {\r\n HeaderTreeNode,\r\n InternalLeafColumn,\r\n NormalizedColumn,\r\n} from \"./types\";\r\n\r\n/**\r\n * 构建表头树。\r\n *\r\n * @param columns 标准化列。\r\n * @param leafColumns 叶子列。\r\n * @returns 表头树与深度。\r\n */\r\nexport function buildHeaderTree<RecordType>(\r\n columns: NormalizedColumn<RecordType>[],\r\n leafColumns: InternalLeafColumn<RecordType>[],\r\n) {\r\n const maxDepth = getMaxDepth(columns);\r\n const tree = columns.map((column) =>\r\n buildHeaderNode(column, leafColumns, maxDepth),\r\n );\r\n\r\n return {\r\n tree,\r\n maxDepth,\r\n };\r\n}\r\n\r\nfunction buildHeaderNode<RecordType>(\r\n column: NormalizedColumn<RecordType>,\r\n leafColumns: InternalLeafColumn<RecordType>[],\r\n maxDepth: number,\r\n): HeaderTreeNode<RecordType> {\r\n const children =\r\n column.children?.map((child) =>\r\n buildHeaderNode(child, leafColumns, maxDepth),\r\n ) ?? [];\r\n\r\n if (children.length > 0) {\r\n const leafStartIndex = Math.min(\r\n ...children.map((child) => child.leafStartIndex),\r\n );\r\n const leafEndIndex = Math.max(\r\n ...children.map((child) => child.leafEndIndex),\r\n );\r\n return {\r\n key: column.key,\r\n title: column.title,\r\n titleContent: column.titleContent,\r\n depth: column.depth,\r\n colSpan: leafEndIndex - leafStartIndex + 1,\r\n rowSpan: 1,\r\n leafStartIndex,\r\n leafEndIndex,\r\n align: column.align ?? \"left\",\r\n fixed: column.fixed,\r\n style: column.headerStyle,\r\n column,\r\n children,\r\n };\r\n }\r\n\r\n const leaf = leafColumns.find((item) => item.key === column.key);\r\n const leafIndex = leaf?.leafIndex ?? 0;\r\n\r\n return {\r\n key: column.key,\r\n title: column.title,\r\n titleContent: column.titleContent,\r\n depth: column.depth,\r\n colSpan: 1,\r\n rowSpan: maxDepth - column.depth + 1,\r\n leafStartIndex: leafIndex,\r\n leafEndIndex: leafIndex,\r\n align: column.align ?? \"left\",\r\n fixed: column.fixed,\r\n style: column.headerStyle,\r\n column,\r\n children: [],\r\n };\r\n}\r\n\r\nfunction getMaxDepth<RecordType>(columns: NormalizedColumn<RecordType>[]) {\r\n let maxDepth = 0;\r\n\r\n const visit = (column: NormalizedColumn<RecordType>) => {\r\n maxDepth = Math.max(maxDepth, column.depth);\r\n column.children?.forEach(visit);\r\n };\r\n\r\n columns.forEach(visit);\r\n return maxDepth;\r\n}\r\n","import type { ScrollbarLayout } from \"./scrollbar-types\";\nimport type { ListTableScrollbarOptions } from \"../../schema/table-options\";\r\n\r\nconst DEFAULT_SCROLLBAR_THICKNESS = 10;\r\nconst DEFAULT_HORIZONTAL_LEFT = 0;\r\nconst DEFAULT_HORIZONTAL_RIGHT = 0;\r\nconst DEFAULT_HORIZONTAL_BOTTOM = 0;\r\nconst DEFAULT_VERTICAL_TOP = 6;\r\nconst DEFAULT_VERTICAL_RIGHT = 0;\r\nconst DEFAULT_VERTICAL_BOTTOM = 0;\r\nconst MIN_SCROLLBAR_THUMB_SIZE = 36;\r\n\r\n/**\r\n * 滚动条布局参数。\r\n */\r\nexport interface ComputeScrollbarLayoutParams {\r\n width: number;\r\n height: number;\r\n bodyTop: number;\r\n bodyHeight: number;\r\n centerVisibleWidth: number;\r\n centerContentWidth: number;\r\n scrollLeft: number;\r\n maxScrollLeft: number;\r\n totalBodyHeight: number;\r\n scrollTop: number;\r\n maxScrollTop: number;\r\n scrollbar?: ListTableScrollbarOptions;\r\n}\r\n\r\n/**\r\n * 计算画布滚动条布局。\r\n *\r\n * @param params 布局参数。\r\n * @returns 滚动条布局结果。\r\n */\r\nexport function computeScrollbarLayout(\r\n params: ComputeScrollbarLayoutParams,\r\n): ScrollbarLayout {\r\n const layout: ScrollbarLayout = {};\r\n const thickness = Math.max(\r\n params.scrollbar?.thickness ?? DEFAULT_SCROLLBAR_THICKNESS,\r\n 6,\r\n );\r\n const horizontalLeft = Math.max(\r\n params.scrollbar?.horizontalLeft ?? DEFAULT_HORIZONTAL_LEFT,\r\n 0,\r\n );\r\n const horizontalRight = Math.max(\r\n params.scrollbar?.horizontalRight ?? DEFAULT_HORIZONTAL_RIGHT,\r\n 0,\r\n );\r\n const horizontalBottom = Math.max(\r\n params.scrollbar?.horizontalBottom ?? DEFAULT_HORIZONTAL_BOTTOM,\r\n 0,\r\n );\r\n const verticalTop = Math.max(\r\n params.scrollbar?.verticalTop ?? DEFAULT_VERTICAL_TOP,\r\n 0,\r\n );\r\n const verticalRight = Math.max(\r\n params.scrollbar?.verticalRight ?? DEFAULT_VERTICAL_RIGHT,\r\n 0,\r\n );\r\n const verticalBottom = Math.max(\r\n params.scrollbar?.verticalBottom ?? DEFAULT_VERTICAL_BOTTOM,\r\n 0,\r\n );\r\n const horizontalTrackWidth = Math.max(\r\n params.width -\r\n horizontalLeft -\r\n horizontalRight -\r\n (params.maxScrollTop > 0 ? thickness : 0),\r\n 0,\r\n );\r\n const horizontalTrackY = params.height - thickness - horizontalBottom;\r\n\r\n if (params.maxScrollLeft > 0 && horizontalTrackWidth > 0) {\r\n const buttonSize = Math.min(thickness, horizontalTrackWidth / 3);\r\n const trackX = horizontalLeft + buttonSize;\r\n const trackWidth = Math.max(horizontalTrackWidth - buttonSize * 2, 0);\r\n const thumbWidth = Math.min(\r\n Math.max(\r\n (params.centerVisibleWidth / params.centerContentWidth) * trackWidth,\r\n MIN_SCROLLBAR_THUMB_SIZE,\r\n ),\r\n trackWidth,\r\n );\r\n const thumbOffset =\r\n params.maxScrollLeft === 0\r\n ? 0\r\n : (params.scrollLeft / params.maxScrollLeft) *\r\n (trackWidth - thumbWidth);\r\n layout.horizontal = {\r\n decreaseButton: {\r\n x: horizontalLeft,\r\n y: horizontalTrackY,\r\n width: buttonSize,\r\n height: thickness,\r\n },\r\n increaseButton: {\r\n x: horizontalLeft + horizontalTrackWidth - buttonSize,\r\n y: horizontalTrackY,\r\n width: buttonSize,\r\n height: thickness,\r\n },\r\n track: {\r\n x: trackX,\r\n y: horizontalTrackY,\r\n width: trackWidth,\r\n height: thickness,\r\n },\r\n thumb: {\r\n x: trackX + thumbOffset,\r\n y: horizontalTrackY,\r\n width: thumbWidth,\r\n height: thickness,\r\n },\r\n };\r\n }\r\n\r\n const verticalTrackHeight = Math.max(\r\n params.bodyHeight -\r\n verticalTop -\r\n verticalBottom -\r\n (params.maxScrollLeft > 0 ? thickness : 0),\r\n 0,\r\n );\r\n const verticalTrackX = params.width - thickness - verticalRight;\r\n const verticalTrackY = params.bodyTop + verticalTop;\r\n\r\n if (params.maxScrollTop > 0 && verticalTrackHeight > 0) {\r\n const buttonSize = Math.min(thickness, verticalTrackHeight / 3);\r\n const trackY = verticalTrackY + buttonSize;\r\n const trackHeight = Math.max(verticalTrackHeight - buttonSize * 2, 0);\r\n const thumbHeight = Math.min(\r\n Math.max(\r\n (params.bodyHeight / params.totalBodyHeight) * trackHeight,\r\n MIN_SCROLLBAR_THUMB_SIZE,\r\n ),\r\n trackHeight,\r\n );\r\n const thumbOffset =\r\n params.maxScrollTop === 0\r\n ? 0\r\n : (params.scrollTop / params.maxScrollTop) *\r\n (trackHeight - thumbHeight);\r\n layout.vertical = {\r\n decreaseButton: {\r\n x: verticalTrackX,\r\n y: verticalTrackY,\r\n width: thickness,\r\n height: buttonSize,\r\n },\r\n increaseButton: {\r\n x: verticalTrackX,\r\n y: verticalTrackY + verticalTrackHeight - buttonSize,\r\n width: thickness,\r\n height: buttonSize,\r\n },\r\n track: {\r\n x: verticalTrackX,\r\n y: trackY,\r\n width: thickness,\r\n height: trackHeight,\r\n },\r\n thumb: {\r\n x: verticalTrackX,\r\n y: trackY + thumbOffset,\r\n width: thickness,\r\n height: thumbHeight,\r\n },\r\n };\r\n }\r\n\r\n return layout;\r\n}\r\n\r\n","import type { ScrollState, ViewportState } from \"../../schema/state\";\r\n\r\n/**\r\n * 计算视口。\r\n *\r\n * @param params 输入参数。\r\n * @returns 视口状态。\r\n */\r\nexport function computeViewport(params: {\r\n width: number;\r\n height: number;\r\n headerHeight: number;\r\n bodyHeight?: number;\r\n totalWidth: number;\r\n totalBodyHeight: number;\r\n fixedWidthLeft: number;\r\n fixedWidthRight: number;\r\n scroll: ScrollState;\r\n}) {\r\n const bodyHeight = Math.max(\r\n params.bodyHeight ?? params.height - params.headerHeight,\r\n 0,\r\n );\r\n const centerVisibleWidth = Math.max(\r\n params.width - params.fixedWidthLeft - params.fixedWidthRight,\r\n 0,\r\n );\r\n const maxScrollLeft = Math.max(\r\n params.totalWidth -\r\n params.fixedWidthLeft -\r\n params.fixedWidthRight -\r\n centerVisibleWidth,\r\n 0,\r\n );\r\n const maxScrollTop = Math.max(params.totalBodyHeight - bodyHeight, 0);\r\n // 内容刚好贴合时忽略 1px 误差,避免出现“无内容可滚”的滚动条。\r\n const resolvedMaxScrollLeft = maxScrollLeft <= 1 ? 0 : maxScrollLeft;\r\n const resolvedMaxScrollTop = maxScrollTop <= 1 ? 0 : maxScrollTop;\r\n\r\n const viewport: ViewportState = {\r\n width: params.width,\r\n height: params.height,\r\n headerHeight: params.headerHeight,\r\n bodyHeight,\r\n totalWidth: params.totalWidth,\r\n totalBodyHeight: params.totalBodyHeight,\r\n maxScrollLeft: resolvedMaxScrollLeft,\r\n maxScrollTop: resolvedMaxScrollTop,\r\n };\r\n\r\n return {\r\n viewport,\r\n scroll: {\r\n left: clamp(params.scroll.left, 0, resolvedMaxScrollLeft),\r\n top: clamp(params.scroll.top, 0, resolvedMaxScrollTop),\r\n },\r\n centerVisibleWidth,\r\n };\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number) {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n","import type { ListTableRowKey } from \"./row-selection\";\r\nimport type { FrozenRowLayout, FrozenRowState } from \"./frozen-rows\";\r\nimport { resolveFrozenRows } from \"./frozen-rows\";\r\nimport { sumVisibleRowHeights } from \"./row-height\";\r\nimport type { ListTableVisibleRow } from \"../../services/expandable-service\";\r\n\r\ninterface ResolveBodyLayoutParams {\r\n height: number;\r\n headerHeight: number;\r\n summaryRowHeight: number;\r\n hasSummary: boolean;\r\n rowHeight: number;\r\n topFrozenHeight?: number;\r\n bottomFrozenHeight?: number;\r\n totalBodyHeight?: number;\r\n topFrozenRowCount: number;\r\n bottomFrozenRowCount: number;\r\n scrollRowCount: number;\r\n}\r\n\r\nexport interface BodyLayout {\r\n summaryHeight: number;\r\n bodyAreaHeight: number;\r\n topFrozenHeight: number;\r\n bottomFrozenHeight: number;\r\n scrollBodyHeight: number;\r\n scrollBodyTop: number;\r\n bottomFrozenTop: number;\r\n summaryTop: number;\r\n totalRowsAreaHeight: number;\r\n totalBodyHeight: number;\r\n}\r\n\r\nexport interface FrozenBodyRenderState<RecordType> {\r\n visibleRows: ListTableVisibleRow<RecordType>[];\r\n frozenRows: FrozenRowLayout<ListTableVisibleRow<RecordType>>;\r\n bodyLayout: BodyLayout;\r\n}\r\n\r\n/**\r\n * 计算表体、冻结行和汇总行的垂直布局。\r\n */\r\nexport function resolveBodyLayout(params: ResolveBodyLayoutParams): BodyLayout {\r\n const {\r\n height,\r\n headerHeight,\r\n summaryRowHeight,\r\n hasSummary,\r\n rowHeight,\r\n topFrozenRowCount,\r\n bottomFrozenRowCount,\r\n scrollRowCount,\r\n } = params;\r\n const summaryHeight = hasSummary ? summaryRowHeight : 0;\r\n const bodyAreaHeight = Math.max(height - headerHeight - summaryHeight, 0);\r\n const topFrozenHeight =\r\n params.topFrozenHeight ?? topFrozenRowCount * rowHeight;\r\n const bottomFrozenHeight =\r\n params.bottomFrozenHeight ?? bottomFrozenRowCount * rowHeight;\r\n const scrollBodyHeight = Math.max(\r\n bodyAreaHeight - topFrozenHeight - bottomFrozenHeight,\r\n 0,\r\n );\r\n const scrollBodyTop = headerHeight + topFrozenHeight;\r\n const bottomFrozenTop = scrollBodyTop + scrollBodyHeight;\r\n const summaryTop = bottomFrozenTop + bottomFrozenHeight;\r\n const totalRowsAreaHeight =\r\n topFrozenHeight + scrollBodyHeight + bottomFrozenHeight;\r\n\r\n return {\r\n summaryHeight,\r\n bodyAreaHeight,\r\n topFrozenHeight,\r\n bottomFrozenHeight,\r\n scrollBodyHeight,\r\n scrollBodyTop,\r\n bottomFrozenTop,\r\n summaryTop,\r\n totalRowsAreaHeight,\r\n totalBodyHeight: params.totalBodyHeight ?? scrollRowCount * rowHeight,\r\n };\r\n}\r\n\r\n/**\r\n * 根据显示数据和冻结行状态计算表体渲染状态。\r\n */\r\nexport function resolveFrozenBodyRenderState<RecordType>(params: {\r\n visibleRows: Array<ListTableVisibleRow<RecordType>>;\r\n frozenState: FrozenRowState;\r\n getRowKey: (\r\n record: ListTableVisibleRow<RecordType>,\r\n rowIndex: number,\r\n ) => ListTableRowKey | null | undefined;\r\n height: number;\r\n headerHeight: number;\r\n summaryRowHeight: number;\r\n hasSummary: boolean;\r\n rowHeight: number;\r\n}): FrozenBodyRenderState<RecordType> {\r\n const {\r\n visibleRows,\r\n frozenState,\r\n getRowKey,\r\n height,\r\n headerHeight,\r\n summaryRowHeight,\r\n hasSummary,\r\n rowHeight,\r\n } = params;\r\n const frozenRows = resolveFrozenRows({\r\n rows: visibleRows,\r\n state: frozenState,\r\n getRowKey,\r\n });\r\n\r\n return {\r\n visibleRows,\r\n frozenRows,\r\n bodyLayout: resolveBodyLayout({\r\n height,\r\n headerHeight,\r\n summaryRowHeight,\r\n hasSummary,\r\n rowHeight,\r\n topFrozenHeight: sumVisibleRowHeights({\r\n rows: frozenRows.top.rows,\r\n rowHeight,\r\n }),\r\n bottomFrozenHeight: sumVisibleRowHeights({\r\n rows: frozenRows.bottom.rows,\r\n rowHeight,\r\n }),\r\n totalBodyHeight: sumVisibleRowHeights({\r\n rows: frozenRows.scroll.rows,\r\n rowHeight,\r\n }),\r\n topFrozenRowCount: frozenRows.top.rows.length,\r\n bottomFrozenRowCount: frozenRows.bottom.rows.length,\r\n scrollRowCount: frozenRows.scroll.rows.length,\r\n }),\r\n };\r\n}\r\n","import { computeColumnWidths } from \"./compute-column-widths\";\r\nimport { splitFixedColumns } from \"./split-fixed-columns\";\r\nimport type { InternalLeafColumn } from \"./types\";\r\nimport type { SegmentColumn } from \"./segment-column\";\r\nimport { buildSegmentColumns } from \"./column-runtime\";\r\nimport type { SwapAnimationState } from \"../types\";\r\n\r\nexport interface ColumnMetrics<RecordType> {\r\n splitColumns: ReturnType<typeof splitFixedColumns<RecordType>>;\r\n totalWidth: number;\r\n fixedWidthLeft: number;\r\n fixedWidthRight: number;\r\n centerContentWidth: number;\r\n availableCenterWidth: number;\r\n rightStartX: number;\r\n}\r\n\r\nexport interface ColumnSegments<RecordType> {\r\n leftSegment: Array<SegmentColumn<RecordType>>;\r\n centerSegment: Array<SegmentColumn<RecordType>>;\r\n rightSegment: Array<SegmentColumn<RecordType>>;\r\n}\r\n\r\n/**\r\n * 计算列分段宽度和固定列位置。\r\n */\r\nexport function resolveColumnMetrics<RecordType>(params: {\r\n columns: InternalLeafColumn<RecordType>[];\r\n tableWidth: number;\r\n}): ColumnMetrics<RecordType> {\r\n const { columns, tableWidth } = params;\r\n const splitColumns = splitFixedColumns(columns);\r\n const totalWidth = computeColumnWidths(columns);\r\n const fixedWidthLeft = computeColumnWidths(splitColumns.left);\r\n const fixedWidthRight = computeColumnWidths(splitColumns.right);\r\n const centerContentWidth = computeColumnWidths(splitColumns.center);\r\n const availableCenterWidth = Math.max(\r\n tableWidth - fixedWidthLeft - fixedWidthRight,\r\n 0,\r\n );\r\n const hasHorizontalOverflow = centerContentWidth > availableCenterWidth;\r\n const rightStartX = hasHorizontalOverflow\r\n ? tableWidth - fixedWidthRight\r\n : fixedWidthLeft + centerContentWidth;\r\n\r\n return {\r\n splitColumns,\r\n totalWidth,\r\n fixedWidthLeft,\r\n fixedWidthRight,\r\n centerContentWidth,\r\n availableCenterWidth,\r\n rightStartX,\r\n };\r\n}\r\n\r\n/**\r\n * 构建列绘制分段,并应用列交换动画。\r\n */\r\nexport function resolveColumnSegments<RecordType>(params: {\r\n metrics: ColumnMetrics<RecordType>;\r\n scrollLeft: number;\r\n swapAnimation: SwapAnimationState | null;\r\n}): ColumnSegments<RecordType> {\r\n const { metrics, scrollLeft, swapAnimation } = params;\r\n const leftSegment = buildSegmentColumns(metrics.splitColumns.left, 0);\r\n const rightSegment = buildSegmentColumns(\r\n metrics.splitColumns.right,\r\n metrics.rightStartX,\r\n );\r\n const centerSegment = buildSegmentColumns(\r\n metrics.splitColumns.center,\r\n metrics.fixedWidthLeft - scrollLeft,\r\n );\r\n\r\n if (swapAnimation) {\r\n const elapsed = performance.now() - swapAnimation.startTime;\r\n const progress = Math.min(elapsed / swapAnimation.duration, 1);\r\n const eased = 1 - Math.pow(1 - progress, 3);\r\n const allSegments = [leftSegment, centerSegment, rightSegment];\r\n for (const segments of allSegments) {\r\n for (const column of segments) {\r\n const animation = swapAnimation.columns.get(column.key);\r\n if (animation) {\r\n column.drawX = animation.from + (animation.to - animation.from) * eased;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n leftSegment,\r\n centerSegment,\r\n rightSegment,\r\n };\r\n}\r\n\r\n","import type { InternalLeafColumn, HeaderTreeNode } from \"./types\";\r\nimport type { HeaderCellLayer, HeaderCellLayout } from \"./header-layout-types\";\r\n\r\nexport function buildHeaderLayouts<RecordType>(\r\n nodes: HeaderTreeNode<RecordType>[],\r\n leafColumns: InternalLeafColumn<RecordType>[],\r\n rightStartX: number,\r\n headerRowHeight: number,\r\n fixedWidthLeft: number,\r\n fixedWidthRight: number,\r\n scrollLeft: number,\r\n) {\r\n const rows = new Map<number, Array<HeaderCellLayout<RecordType>>>();\r\n const leftCols = leafColumns.filter((c) => c.fixed === \"left\");\r\n const centerCols = leafColumns.filter((c) => !c.fixed);\r\n const rightCols = leafColumns.filter((c) => c.fixed === \"right\");\r\n\r\n function segmentOffset(\r\n cols: InternalLeafColumn<RecordType>[],\r\n targetKey: string,\r\n ) {\r\n let offset = 0;\r\n for (const c of cols) {\r\n if (c.key === targetKey) return offset;\r\n offset += c.width;\r\n }\r\n return offset;\r\n }\r\n\r\n const getLeafX = (leafIndex: number) => {\r\n const leaf = leafColumns[leafIndex];\r\n if (!leaf) {\r\n return 0;\r\n }\r\n\r\n if (leaf.fixed === \"left\") {\r\n return segmentOffset(leftCols, leaf.key);\r\n }\r\n\r\n if (leaf.fixed === \"right\") {\r\n return rightStartX + segmentOffset(rightCols, leaf.key);\r\n }\r\n\r\n return fixedWidthLeft + segmentOffset(centerCols, leaf.key) - scrollLeft;\r\n };\r\n\r\n const visit = (node: HeaderTreeNode<RecordType>) => {\r\n const rowItems = rows.get(node.depth) ?? [];\r\n buildHeaderCellSegments(node, leafColumns, {\r\n getLeafX,\r\n centerClipLeft: fixedWidthLeft,\r\n centerClipRight: rightStartX,\r\n }).forEach((segment) => {\r\n rowItems.push({\r\n node,\r\n x: segment.x,\r\n y: node.depth * headerRowHeight,\r\n width: segment.width,\r\n height: node.rowSpan * headerRowHeight,\r\n layer: segment.layer,\r\n });\r\n });\r\n rows.set(node.depth, rowItems);\r\n node.children.forEach(visit);\r\n };\r\n\r\n nodes.forEach(visit);\r\n\r\n return Array.from(rows.entries())\r\n .sort((left, right) => left[0] - right[0])\r\n .map(([, value]) => value);\r\n}\r\n\r\nexport function buildHeaderCellSegments<RecordType>(\r\n node: HeaderTreeNode<RecordType>,\r\n leafColumns: InternalLeafColumn<RecordType>[],\r\n options: {\r\n getLeafX: (leafIndex: number) => number;\r\n centerClipLeft: number;\r\n centerClipRight: number;\r\n },\r\n) {\r\n const fragments: Array<{\r\n leafStartIndex: number;\r\n x: number;\r\n width: number;\r\n layer: HeaderCellLayer;\r\n }> = [];\r\n\r\n for (\r\n let leafIndex = node.leafStartIndex;\r\n leafIndex <= node.leafEndIndex;\r\n leafIndex += 1\r\n ) {\r\n const leaf = leafColumns[leafIndex];\r\n if (!leaf) {\r\n continue;\r\n }\r\n\r\n const fragment = resolveHeaderLeafFragment(\r\n leaf,\r\n leafIndex,\r\n options,\r\n );\r\n if (!fragment) {\r\n continue;\r\n }\r\n\r\n fragments.push(fragment);\r\n }\r\n\r\n return fragments\r\n .sort((left, right) => left.x - right.x)\r\n .reduce<typeof fragments>((result, fragment) => {\r\n const previous = result[result.length - 1];\r\n if (!previous || !canMergeHeaderSegments(previous, fragment)) {\r\n result.push({ ...fragment });\r\n return result;\r\n }\r\n\r\n previous.width = Math.max(\r\n previous.x + previous.width,\r\n fragment.x + fragment.width,\r\n ) - previous.x;\r\n previous.layer = resolveMergedHeaderLayer(previous.layer, fragment.layer);\r\n previous.leafStartIndex = Math.min(\r\n previous.leafStartIndex,\r\n fragment.leafStartIndex,\r\n );\r\n return result;\r\n }, []);\r\n}\r\n\r\nexport function resolveHeaderCellLayer(\r\n fixed: InternalLeafColumn<unknown>[\"fixed\"],\r\n): HeaderCellLayer {\r\n if (fixed === \"left\") {\r\n return \"left\";\r\n }\r\n\r\n if (fixed === \"right\") {\r\n return \"right\";\r\n }\r\n\r\n return \"center\";\r\n}\r\n\r\nfunction resolveHeaderLeafFragment<RecordType>(\r\n leaf: InternalLeafColumn<RecordType>,\r\n leafIndex: number,\r\n options: {\r\n getLeafX: (leafIndex: number) => number;\r\n centerClipLeft: number;\r\n centerClipRight: number;\r\n },\r\n) {\r\n const rawX = options.getLeafX(leafIndex);\r\n const rawRight = rawX + leaf.width;\r\n const layer = resolveHeaderCellLayer(leaf.fixed);\r\n\r\n if (layer !== \"center\") {\r\n return {\r\n leafStartIndex: leafIndex,\r\n x: rawX,\r\n width: leaf.width,\r\n layer,\r\n };\r\n }\r\n\r\n const x = Math.max(rawX, options.centerClipLeft);\r\n const right = Math.min(rawRight, options.centerClipRight);\r\n if (right <= x) {\r\n return null;\r\n }\r\n\r\n return {\r\n leafStartIndex: leafIndex,\r\n x,\r\n width: right - x,\r\n layer,\r\n };\r\n}\r\n\r\nfunction canMergeHeaderSegments(\r\n previous: { x: number; width: number },\r\n next: { x: number },\r\n) {\r\n return next.x <= previous.x + previous.width + 1;\r\n}\r\n\r\nfunction resolveMergedHeaderLayer(\r\n left: HeaderCellLayer,\r\n right: HeaderCellLayer,\r\n) {\r\n if (left === \"right\" || right === \"right\") {\r\n return \"right\";\r\n }\r\n\r\n if (left === \"left\" || right === \"left\") {\r\n return \"left\";\r\n }\r\n\r\n return \"center\";\r\n}\r\n\r\n","import type { ListTableRowKey } from \"../domain/rows/row-selection\";\r\nimport type { ListTableVisibleRow } from \"./expandable-service\";\r\n\r\n/**\r\n * 过滤被折叠的主行与其详情占位行。\r\n */\r\nexport function filterCollapsedVisibleRows<RecordType>(params: {\r\n visibleRows: ListTableVisibleRow<RecordType>[];\r\n collapsedRowKeys: Array<string | number>;\r\n}) {\r\n const collapsedKeySet = new Set(params.collapsedRowKeys);\r\n if (collapsedKeySet.size === 0) {\r\n return params.visibleRows;\r\n }\r\n\r\n return params.visibleRows.filter((row) => {\r\n if (row.kind === \"data\") {\r\n return !collapsedKeySet.has(row.rowKey);\r\n }\r\n\r\n return !collapsedKeySet.has(row.ownerRowKey);\r\n });\r\n}\r\n\r\n/**\r\n * 将主行范围加入折叠集合。\r\n */\r\nexport function resolveCollapsedRowKeysForCollapse<RecordType>(params: {\r\n visibleRows: ListTableVisibleRow<RecordType>[];\r\n currentCollapsedRowKeys: Array<string | number>;\r\n rowRange: { start: number; end: number } | null;\r\n}) {\r\n if (!params.rowRange) {\r\n return params.currentCollapsedRowKeys;\r\n }\r\n\r\n const nextKeys = new Set(params.currentCollapsedRowKeys);\r\n getDataRowsInRange(params.visibleRows, params.rowRange).forEach((row) => {\r\n nextKeys.add(row.rowKey);\r\n });\r\n\r\n return [...nextKeys];\r\n}\r\n\r\n/**\r\n * 根据折叠边界区间恢复主行。\r\n */\r\nexport function resolveCollapsedRowKeysForExpand<RecordType>(params: {\r\n visibleRows: ListTableVisibleRow<RecordType>[];\r\n currentCollapsedRowKeys: Array<string | number>;\r\n rowRange: { start: number; end: number };\r\n}) {\r\n const removeKeys = new Set<ListTableRowKey>();\r\n getDataRowsInRange(params.visibleRows, params.rowRange).forEach((row) => {\r\n removeKeys.add(row.rowKey);\r\n });\r\n\r\n return params.currentCollapsedRowKeys.filter((key) => !removeKeys.has(key));\r\n}\r\n\r\nfunction getDataRowsInRange<RecordType>(\r\n visibleRows: ListTableVisibleRow<RecordType>[],\r\n rowRange: { start: number; end: number },\r\n) {\r\n return visibleRows.filter(\r\n (\r\n row,\r\n ): row is Extract<ListTableVisibleRow<RecordType>, { kind: \"data\" }> =>\r\n row.kind === \"data\" &&\r\n row.dataRowIndex >= rowRange.start &&\r\n row.dataRowIndex <= rowRange.end,\r\n );\r\n}\r\n","import type {\r\n ListTableDebugSnapshot,\r\n DebugHitTestResult,\r\n RenderCellDescriptor,\r\n} from \"../debug/debug-snapshot\";\r\nimport { buildHeaderTree } from \"../domain/columns/build-header-tree\";\r\nimport { stretchColumnWidths } from \"../domain/columns/compute-column-widths\";\r\nimport { computeScrollbarLayout } from \"../domain/layout/compute-scrollbar-layout\";\r\nimport { computeViewport } from \"../domain/layout/compute-viewport\";\r\nimport { flattenLeafColumns } from \"../domain/columns/flatten-leaf-columns\";\r\nimport { normalizeColumns } from \"../domain/columns/normalize-columns\";\r\nimport { resolveBodyCellContents } from \"../rendering/cell-content/cell-content-renderer\";\r\nimport { measureBodyCellContentsHeight } from \"../rendering/cell-content/cell-content-renderer\";\r\nimport type {\r\n HeaderTreeNode,\r\n InternalLeafColumn,\r\n NormalizedColumn,\r\n} from \"../domain/columns/types\";\r\nimport type {\n HeaderCellLayer,\n HeaderCellLayout,\n} from \"../domain/columns/header-layout-types\";\nimport type { ScrollbarLayout } from \"../domain/layout/scrollbar-types\";\r\nimport type {\r\n ListTableSelectionState,\r\n HoverState,\r\n ScrollState,\r\n} from \"../schema/state\";\r\nimport type { ListTableTheme } from \"../schema/style\";\r\nimport type { ListTableOptions } from \"../schema/table-options\";\r\nimport {\r\n resolveBodyLayout,\r\n resolveFrozenBodyRenderState,\r\n type BodyLayout,\r\n} from \"../domain/rows/body-layout\";\r\nimport {\r\n resolveColumnMetrics,\r\n resolveColumnSegments,\r\n type ColumnMetrics,\r\n type ColumnSegments,\r\n} from \"../domain/columns/column-layout\";\r\nimport {\r\n DEFAULT_HEADER_ROW_HEIGHT,\r\n DEFAULT_ROW_HEIGHT,\r\n DEFAULT_SUMMARY_ROW_HEIGHT,\r\n} from \"../domain/constants\";\r\nimport {\n buildHeaderLayouts,\n resolveHeaderCellLayer,\n} from \"../domain/columns/header-layout\";\nimport { resolveScrollPageSize } from \"../domain/rows/pagination\";\r\nimport type { FrozenRowLayout, FrozenRowState } from \"../domain/rows/frozen-rows\";\r\nimport { getResolvedColumns, getRowKey } from \"../domain/rows/row-selection\";\r\nimport type { SwapAnimationState } from \"../domain/types\";\r\nimport {\r\n getBaseDisplayRows,\r\n getDisplayRows,\r\n type ListTableQueryRuntimeState,\r\n} from \"./query-service\";\r\nimport {\r\n flattenExpandableRows,\r\n resolveExpandableState,\r\n type ListTableVisibleRow,\r\n} from \"./expandable-service\";\r\nimport { filterCollapsedVisibleRows } from \"./collapsible-row-service\";\r\n\r\nconst AUTO_ROW_HEIGHT_SAMPLE_COUNT = 200;\r\n\r\nexport interface ListTableRenderSnapshot<RecordType> {\r\n width: number;\r\n height: number;\r\n rowHeight: number;\r\n headerRowHeight: number;\r\n summaryRowHeight: number;\r\n hasSummary: boolean;\r\n normalizedColumns: NormalizedColumn<RecordType>[];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n headerTree: HeaderTreeNode<RecordType>[];\r\n headerRows: Array<Array<HeaderCellLayout<RecordType>>>;\r\n bodyLayout: BodyLayout;\r\n displayRows: RecordType[];\r\n visibleRows: ListTableVisibleRow<RecordType>[];\r\n dataRowCount: number;\r\n collapsedRowCount: number;\r\n collapsedDataRowIndexes: number[];\r\n frozenRows: FrozenRowLayout<ListTableVisibleRow<RecordType>>;\r\n baseRows: RecordType[];\r\n columnMetrics: ColumnMetrics<RecordType>;\r\n columnSegments: ColumnSegments<RecordType>;\r\n scrollbarLayout: ScrollbarLayout;\r\n scroll: ScrollState;\r\n viewport: ReturnType<typeof computeViewport>[\"viewport\"];\r\n scrollPageSize: number;\r\n draggingResizeColumnKey: string | null;\r\n swapAnimation: SwapAnimationState | null;\r\n}\r\n\r\nexport interface BuildListTableRenderSnapshotParams<RecordType> {\n options: ListTableOptions<RecordType>;\r\n theme: ListTableTheme;\r\n width: number;\r\n height: number;\r\n scroll: ScrollState;\r\n selectedRowKeys: Array<string | number>;\r\n expandedRowKeys?: Array<string | number>;\r\n collapsedRowKeys?: Array<string | number>;\r\n query: ListTableQueryRuntimeState;\r\n frozenRows: FrozenRowState;\r\n draggingResize: boolean;\r\n draggingResizeColumnKey?: string | null;\r\n swapAnimation: SwapAnimationState | null;\r\n baseRowsOverride?: RecordType[] | null;\n displayRowsOverride?: RecordType[] | null;\n cache?: ListTableRenderCache<RecordType>;\n}\n\n/**\n * 渲染快照缓存。\n *\n * 缓存只由渲染控制器持有,避免跨表格实例共享数据。快照命中时仅重算\n * 滚动相关的视口、列分段和滚动条位置。\n */\nexport interface ListTableRenderCache<RecordType> {\n snapshot?: ListTableRenderSnapshot<RecordType>;\n inputs?: ListTableRenderCacheInputs<RecordType>;\n autoRowHeight?: AutoRowHeightCache<RecordType>;\n}\n\ninterface ListTableRenderCacheInputs<RecordType> {\n options: ListTableOptions<RecordType>;\n columnsSignature: string;\n theme: ListTableTheme;\n width: number;\n height: number;\n selectedRowKeys: Array<string | number>;\n expandedRowKeys?: Array<string | number>;\n collapsedRowKeys?: Array<string | number>;\n query: ListTableQueryRuntimeState;\n frozenRows: FrozenRowState;\n draggingResize: boolean;\n draggingResizeColumnKey?: string | null;\n baseRowsOverride?: RecordType[] | null;\n displayRowsOverride?: RecordType[] | null;\n}\n\ninterface AutoRowHeightCache<RecordType> {\n rows: RecordType[];\n sortState: ListTableQueryRuntimeState[\"sortState\"];\n filterState: ListTableQueryRuntimeState[\"filterState\"];\n columnSignature: string;\n themeSignature: string;\n value: number;\n}\n\r\n/**\r\n * 构建渲染前派生快照。\r\n */\r\nexport function buildListTableRenderSnapshot<RecordType>(\n params: BuildListTableRenderSnapshotParams<RecordType>,\n) {\n if (params.cache?.snapshot && isSameRenderCacheInputs(params.cache.inputs, params)) {\n return updateListTableRenderSnapshotScroll({\n snapshot: params.cache.snapshot,\n width: params.width,\n height: params.height,\n scroll: params.scroll,\n options: params.options,\n });\n }\n\n if (params.cache) {\n params.cache.inputs = createRenderCacheInputs(params);\n }\n\n const {\n options,\r\n theme,\r\n width,\r\n height,\r\n scroll,\r\n selectedRowKeys,\r\n query,\r\n frozenRows,\r\n draggingResize,\r\n draggingResizeColumnKey,\r\n swapAnimation,\r\n baseRowsOverride,\r\n displayRowsOverride,\r\n } = params;\r\n const normalizedColumns = normalizeColumns(\r\n getResolvedColumns(options, selectedRowKeys),\r\n );\r\n const leafColumns = flattenLeafColumns(normalizedColumns);\r\n\r\n if (options.stretchColumns !== false && width > 0 && !draggingResize) {\r\n stretchColumnWidths(leafColumns, width);\r\n }\r\n\r\n if (leafColumns.length === 0) {\r\n return null;\r\n }\r\n\r\n const headerInfo = buildHeaderTree(normalizedColumns, leafColumns);\r\n const queryRows = {\r\n baseRows:\r\n baseRowsOverride ??\r\n getBaseDisplayRows({\r\n options,\r\n leafColumns,\r\n query,\r\n }),\r\n displayRows:\r\n displayRowsOverride ??\r\n getDisplayRows({\r\n options,\r\n leafColumns,\r\n query,\r\n }),\r\n };\r\n const expandableState = resolveExpandableState({\r\n expandable: options.expandable,\r\n });\r\n const visibleRows = flattenExpandableRows({\r\n options,\r\n rows: queryRows.displayRows,\r\n expandedRowKeys: params.expandedRowKeys ?? expandableState.expandedRowKeys,\r\n });\r\n const lastVisibleRow = visibleRows[visibleRows.length - 1];\r\n const dataRowCount = lastVisibleRow\r\n ? lastVisibleRow.kind === \"data\"\r\n ? lastVisibleRow.dataRowIndex + 1\r\n : lastVisibleRow.ownerDataRowIndex + 1\r\n : 0;\r\n const collapsedRowKeys = params.collapsedRowKeys ?? [];\r\n const collapsedRowKeySet = new Set(collapsedRowKeys);\r\n const collapsedDataRowIndexes =\r\n collapsedRowKeySet.size === 0\r\n ? []\r\n : visibleRows\r\n .filter(\r\n (\r\n row,\r\n ): row is Extract<\r\n ListTableVisibleRow<RecordType>,\r\n { kind: \"data\" }\r\n > => row.kind === \"data\" && collapsedRowKeySet.has(row.rowKey),\r\n )\r\n .map((row) => row.dataRowIndex);\r\n const collapsedRowCount = collapsedDataRowIndexes.length;\r\n const filteredVisibleRows = filterCollapsedVisibleRows({\r\n visibleRows,\r\n collapsedRowKeys,\r\n });\r\n const rowHeight =\n options.rowHeight == null || options.rowHeight === \"auto\"\n ? resolveAutoRowHeight({\n rows: queryRows.displayRows,\n leafColumns,\n theme,\n cache: params.cache,\n })\n : (options.rowHeight ?? DEFAULT_ROW_HEIGHT);\r\n const headerRowHeight = options.headerRowHeight ?? DEFAULT_HEADER_ROW_HEIGHT;\r\n const summaryRowHeight =\r\n options.summaryRowHeight ?? DEFAULT_SUMMARY_ROW_HEIGHT;\r\n const headerHeight = (headerInfo.maxDepth + 1) * headerRowHeight;\n const hasConfiguredSummary = leafColumns.some(\n (col) => col.summary != null || col.summaryTitle != null,\n );\n const hasSummary =\n queryRows.displayRows.length > 0 &&\n options.summaryRowHeight !== 0 &&\n (options.summaryRowHeight != null || hasConfiguredSummary);\n const initialBodyLayout = resolveBodyLayout({\r\n height,\r\n headerHeight,\r\n summaryRowHeight,\r\n hasSummary,\r\n rowHeight,\r\n topFrozenRowCount: 0,\r\n bottomFrozenRowCount: 0,\r\n scrollRowCount: 0,\r\n });\r\n let scrollPageSize = resolveScrollPageSize({\r\n options,\r\n pageSize: query.pagination.pageSize,\r\n bodyHeight: initialBodyLayout.bodyAreaHeight,\r\n rowHeight,\r\n });\r\n const resolveCurrentBodyState = () =>\r\n resolveFrozenBodyRenderState({\r\n visibleRows: filteredVisibleRows,\r\n frozenState: frozenRows,\r\n getRowKey: (row) => (row.kind === \"data\" ? row.rowKey : null),\r\n height,\r\n headerHeight,\r\n summaryRowHeight,\r\n hasSummary,\r\n rowHeight,\r\n });\r\n let bodyState = resolveCurrentBodyState();\r\n scrollPageSize = resolveScrollPageSize({\r\n options,\r\n pageSize: query.pagination.pageSize,\r\n bodyHeight: bodyState.bodyLayout.scrollBodyHeight,\r\n rowHeight,\r\n });\r\n bodyState = resolveCurrentBodyState();\r\n const columnMetrics = resolveColumnMetrics({\r\n columns: leafColumns,\r\n tableWidth: width,\r\n });\r\n const viewportResult = computeViewport({\r\n width,\r\n height,\r\n headerHeight,\r\n bodyHeight: bodyState.bodyLayout.scrollBodyHeight,\r\n totalWidth: columnMetrics.totalWidth,\r\n totalBodyHeight: bodyState.bodyLayout.totalBodyHeight,\r\n fixedWidthLeft: columnMetrics.fixedWidthLeft,\r\n fixedWidthRight: columnMetrics.fixedWidthRight,\r\n scroll,\r\n });\r\n const nextScroll = viewportResult.scroll;\r\n const columnSegments = resolveColumnSegments({\r\n metrics: columnMetrics,\r\n scrollLeft: nextScroll.left,\r\n swapAnimation,\r\n });\r\n const scrollbarLayout = computeScrollbarLayout({\r\n width,\r\n height,\r\n bodyTop: bodyState.bodyLayout.scrollBodyTop,\r\n bodyHeight: bodyState.bodyLayout.scrollBodyHeight,\r\n centerVisibleWidth: columnMetrics.availableCenterWidth,\r\n centerContentWidth: columnMetrics.centerContentWidth,\r\n scrollLeft: nextScroll.left,\r\n maxScrollLeft: viewportResult.viewport.maxScrollLeft,\r\n totalBodyHeight: bodyState.bodyLayout.totalBodyHeight,\r\n scrollTop: nextScroll.top,\r\n maxScrollTop: viewportResult.viewport.maxScrollTop,\r\n scrollbar: options.scrollbar,\r\n });\r\n const headerRows = buildHeaderLayouts(\r\n headerInfo.tree,\r\n leafColumns,\r\n columnMetrics.rightStartX,\r\n headerRowHeight,\r\n columnMetrics.fixedWidthLeft,\r\n columnMetrics.fixedWidthRight,\r\n nextScroll.left,\r\n );\r\n if (swapAnimation) {\n applyColumnSegmentPositionsToHeaderRows({\n headerRows,\n leafColumns,\n columnSegments,\n });\n }\n\r\n const snapshot = {\n width,\r\n height,\r\n rowHeight,\r\n headerRowHeight,\r\n summaryRowHeight,\r\n hasSummary,\r\n normalizedColumns,\r\n leafColumns,\r\n headerTree: headerInfo.tree,\r\n headerRows,\r\n bodyLayout: bodyState.bodyLayout,\r\n displayRows: queryRows.displayRows,\r\n visibleRows: filteredVisibleRows,\r\n dataRowCount,\r\n collapsedRowCount,\r\n collapsedDataRowIndexes,\r\n frozenRows: bodyState.frozenRows,\r\n baseRows: queryRows.baseRows,\r\n columnMetrics,\r\n columnSegments,\r\n scrollbarLayout,\r\n scroll: nextScroll,\r\n viewport: viewportResult.viewport,\r\n scrollPageSize,\r\n draggingResizeColumnKey: draggingResizeColumnKey ?? null,\r\n swapAnimation,\n };\n\n if (params.cache) {\n params.cache.snapshot = snapshot;\n params.cache.inputs = createRenderCacheInputs(params);\n }\n\n return snapshot;\n}\n\n/**\n * 使用已有布局快照更新滚动相关字段。\n */\nexport function updateListTableRenderSnapshotScroll<RecordType>(params: {\n snapshot: ListTableRenderSnapshot<RecordType>;\n width: number;\n height: number;\n scroll: ScrollState;\n options: ListTableOptions<RecordType>;\n}) {\n const { snapshot, width, height, scroll, options } = params;\n const viewportResult = computeViewport({\n width,\n height,\n headerHeight: snapshot.bodyLayout.scrollBodyTop - snapshot.bodyLayout.topFrozenHeight,\n bodyHeight: snapshot.bodyLayout.scrollBodyHeight,\n totalWidth: snapshot.columnMetrics.totalWidth,\n totalBodyHeight: snapshot.bodyLayout.totalBodyHeight,\n fixedWidthLeft: snapshot.columnMetrics.fixedWidthLeft,\n fixedWidthRight: snapshot.columnMetrics.fixedWidthRight,\n scroll,\n });\n const nextScroll = viewportResult.scroll;\n const columnSegments = resolveColumnSegments({\n metrics: snapshot.columnMetrics,\n scrollLeft: nextScroll.left,\n swapAnimation: snapshot.swapAnimation,\n });\n const headerRows = buildHeaderLayouts(\n snapshot.headerTree,\n snapshot.leafColumns,\n snapshot.columnMetrics.rightStartX,\n snapshot.headerRowHeight,\n snapshot.columnMetrics.fixedWidthLeft,\n snapshot.columnMetrics.fixedWidthRight,\n nextScroll.left,\n );\n if (snapshot.swapAnimation) {\n applyColumnSegmentPositionsToHeaderRows({\n headerRows,\n leafColumns: snapshot.leafColumns,\n columnSegments,\n });\n }\n const scrollbarLayout = computeScrollbarLayout({\n width,\n height,\n bodyTop: snapshot.bodyLayout.scrollBodyTop,\n bodyHeight: snapshot.bodyLayout.scrollBodyHeight,\n centerVisibleWidth: snapshot.columnMetrics.availableCenterWidth,\n centerContentWidth: snapshot.columnMetrics.centerContentWidth,\n scrollLeft: nextScroll.left,\n maxScrollLeft: viewportResult.viewport.maxScrollLeft,\n totalBodyHeight: snapshot.bodyLayout.totalBodyHeight,\n scrollTop: nextScroll.top,\n maxScrollTop: viewportResult.viewport.maxScrollTop,\n scrollbar: options.scrollbar,\n });\n\n return {\n ...snapshot,\n width,\n height,\n columnSegments,\n headerRows,\n scrollbarLayout,\n scroll: nextScroll,\n viewport: viewportResult.viewport,\n };\n}\n\nfunction createRenderCacheInputs<RecordType>(\n params: BuildListTableRenderSnapshotParams<RecordType>,\n): ListTableRenderCacheInputs<RecordType> {\n return {\n options: params.options,\n columnsSignature: resolveColumnsSignature(params.options),\n theme: params.theme,\n width: params.width,\n height: params.height,\n selectedRowKeys: params.selectedRowKeys,\n expandedRowKeys: params.expandedRowKeys,\n collapsedRowKeys: params.collapsedRowKeys,\n query: params.query,\n frozenRows: params.frozenRows,\n draggingResize: params.draggingResize,\n draggingResizeColumnKey: params.draggingResizeColumnKey,\n baseRowsOverride: params.baseRowsOverride,\n displayRowsOverride: params.displayRowsOverride,\n };\n}\n\nfunction isSameRenderCacheInputs<RecordType>(\n previous: ListTableRenderCacheInputs<RecordType> | undefined,\n next: BuildListTableRenderSnapshotParams<RecordType>,\n) {\n if (!previous || next.swapAnimation) {\n return false;\n }\n\n return (\n previous.options === next.options &&\n previous.columnsSignature === resolveColumnsSignature(next.options) &&\n previous.theme === next.theme &&\n previous.width === next.width &&\n previous.height === next.height &&\n previous.selectedRowKeys === next.selectedRowKeys &&\n previous.expandedRowKeys === next.expandedRowKeys &&\n previous.collapsedRowKeys === next.collapsedRowKeys &&\n previous.query.sortState === next.query.sortState &&\n previous.query.filterState === next.query.filterState &&\n previous.query.pagination === next.query.pagination &&\n previous.frozenRows === next.frozenRows &&\n previous.draggingResize === next.draggingResize &&\n previous.draggingResizeColumnKey === next.draggingResizeColumnKey &&\n previous.baseRowsOverride === next.baseRowsOverride &&\n previous.displayRowsOverride === next.displayRowsOverride\n );\n}\n\nfunction resolveColumnsSignature<RecordType>(\n options: ListTableOptions<RecordType>,\n) {\n const visit = (columns: ListTableOptions<RecordType>[\"columns\"]): string =>\n columns\n .map((column) =>\n [\n column.key ?? \"\",\n column.dataIndex ?? \"\",\n column.title ?? \"\",\n column.width ?? \"\",\n column.minWidth ?? \"\",\n column.maxWidth ?? \"\",\n column.hidden ? \"1\" : \"0\",\n column.fixed ?? \"\",\n column.children ? visit(column.children) : \"\",\n ].join(\"~\"),\n )\n .join(\"|\");\n\n return visit(options.columns);\n}\n\r\n/**\n * 将列交换动画坐标回写到对应的表头分层片段。\n */\nexport function applyColumnSegmentPositionsToHeaderRows<RecordType>(params: {\n headerRows: Array<Array<HeaderCellLayout<RecordType>>>;\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n columnSegments: ColumnSegments<RecordType>;\r\n}) {\r\n const { headerRows, leafColumns, columnSegments } = params;\r\n const segmentPositionMap = new Map<string, { x: number; width: number }>();\r\n const segments = [\r\n columnSegments.leftSegment,\r\n columnSegments.centerSegment,\r\n columnSegments.rightSegment,\r\n ];\r\n segments.forEach((columns) => {\r\n columns.forEach((column) => {\r\n segmentPositionMap.set(column.key, {\r\n x: column.drawX,\r\n width: column.width,\r\n });\r\n });\r\n });\r\n\r\n if (segmentPositionMap.size === 0) {\r\n return;\r\n }\r\n\r\n headerRows.forEach((row) => {\r\n row.forEach((cell) => {\r\n const bounds = resolveHeaderCellAnimatedBounds({\n leafColumns,\n segmentPositionMap,\n leafStartIndex: cell.node.leafStartIndex,\n leafEndIndex: cell.node.leafEndIndex,\n layer: cell.layer,\n });\n if (!bounds) {\r\n return;\r\n }\r\n cell.x = bounds.x;\r\n cell.width = bounds.width;\r\n });\r\n });\r\n}\r\n\r\nfunction resolveHeaderCellAnimatedBounds<RecordType>(params: {\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n segmentPositionMap: Map<string, { x: number; width: number }>;\n leafStartIndex: number;\n leafEndIndex: number;\n layer: HeaderCellLayer;\n}) {\n const {\n leafColumns,\n segmentPositionMap,\n leafStartIndex,\n leafEndIndex,\n layer,\n } = params;\n let minX = Number.POSITIVE_INFINITY;\r\n let maxX = Number.NEGATIVE_INFINITY;\r\n\r\n for (let index = leafStartIndex; index <= leafEndIndex; index += 1) {\r\n const leafColumn = leafColumns[index];\r\n if (!leafColumn) {\n continue;\n }\n if (resolveHeaderCellLayer(leafColumn.fixed) !== layer) {\n continue;\n }\n const position = segmentPositionMap.get(leafColumn.key);\n if (!position) {\r\n continue;\r\n }\r\n minX = Math.min(minX, position.x);\r\n maxX = Math.max(maxX, position.x + position.width);\r\n }\r\n\r\n if (!Number.isFinite(minX) || !Number.isFinite(maxX) || maxX <= minX) {\r\n return null;\r\n }\r\n\r\n return {\n x: minX,\n width: maxX - minX,\n };\n}\n\nfunction resolveAutoRowHeight<RecordType>(params: {\n rows: RecordType[];\n leafColumns: InternalLeafColumn<RecordType>[];\n theme: ListTableTheme;\n cache?: ListTableRenderCache<RecordType>;\n}) {\n const { rows, leafColumns, theme, cache } = params;\n if (typeof document === \"undefined\") {\n return DEFAULT_ROW_HEIGHT;\n }\n\n const columnSignature = leafColumns\n .map((column) => `${column.key}:${column.width}:${column.dataIndex ?? \"\"}`)\n .join(\"|\");\n const themeSignature = `${theme.fontFamily}:${theme.fontSize}`;\n const cached = cache?.autoRowHeight;\n if (\n cached &&\n cached.rows === rows &&\n cached.sortState === cache.inputs?.query.sortState &&\n cached.filterState === cache.inputs?.query.filterState &&\n cached.columnSignature === columnSignature &&\n cached.themeSignature === themeSignature\n ) {\n return cached.value;\n }\n\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) {\r\n return DEFAULT_ROW_HEIGHT;\r\n }\r\n\r\n let maxHeight = DEFAULT_ROW_HEIGHT;\r\n const sampledRows = resolveAutoRowHeightMeasureRows(\r\n rows,\r\n AUTO_ROW_HEIGHT_SAMPLE_COUNT,\r\n );\r\n sampledRows.forEach((record, rowIndex) => {\r\n leafColumns.forEach((column) => {\r\n const contents = resolveBodyCellContents({\r\n record,\r\n rowIndex,\r\n column,\r\n });\r\n maxHeight = Math.max(\r\n maxHeight,\r\n measureBodyCellContentsHeight({\r\n ctx,\r\n contents,\r\n column,\r\n theme,\r\n }),\r\n );\r\n });\r\n });\r\n\r\n const value = Math.max(DEFAULT_ROW_HEIGHT, Math.ceil(maxHeight));\n if (cache) {\n cache.autoRowHeight = {\n rows,\n sortState: cache.inputs?.query.sortState ?? { key: null, order: null },\n filterState: cache.inputs?.query.filterState ?? {},\n columnSignature,\n themeSignature,\n value,\n };\n }\n return value;\n}\n\r\nexport function resolveAutoRowHeightMeasureRows<RecordType>(\r\n rows: RecordType[],\r\n sampleCount = AUTO_ROW_HEIGHT_SAMPLE_COUNT,\r\n) {\r\n if (rows.length <= sampleCount) {\r\n return rows;\r\n }\r\n\r\n return rows.slice(0, sampleCount);\r\n}\r\n\r\n/**\r\n * 构建调试快照。\r\n */\r\nexport function buildListTableDebugSnapshot<RecordType>(params: {\r\n snapshot: ListTableRenderSnapshot<RecordType>;\r\n hover: HoverState;\r\n selection: ListTableSelectionState;\r\n sort: unknown;\r\n filter: unknown;\r\n runtimeColumns: unknown;\r\n descriptors: RenderCellDescriptor[];\r\n hitTest: DebugHitTestResult;\r\n}) {\r\n const {\r\n snapshot,\r\n hover,\r\n selection,\r\n sort,\r\n filter,\r\n runtimeColumns,\r\n descriptors,\r\n hitTest,\r\n } = params;\r\n\r\n return {\r\n layout: {\r\n fixedWidthLeft: snapshot.columnMetrics.fixedWidthLeft,\r\n fixedWidthRight: snapshot.columnMetrics.fixedWidthRight,\r\n headerHeight: snapshot.headerRows.length * snapshot.headerRowHeight,\r\n totalWidth: snapshot.columnMetrics.totalWidth,\r\n totalBodyHeight: snapshot.bodyLayout.totalBodyHeight,\r\n },\r\n viewport: snapshot.viewport,\r\n scroll: snapshot.scroll,\r\n hover,\r\n selection,\r\n sort,\r\n filter,\r\n runtimeColumns,\r\n descriptors,\r\n hitTest: hitTest.area === \"empty\" ? undefined : hitTest,\r\n } satisfies ListTableDebugSnapshot;\r\n}\r\n\r\n","import type { ListTableOptions } from \"../../schema/table-options\";\r\nimport type { ListTablePaginationAdapter } from \"../../ui/types\";\r\nimport {\r\n getEffectivePageSize,\r\n getPaginationTotal,\r\n isScrollPaginationMode,\r\n type PaginationState,\r\n} from \"../../domain/rows/pagination\";\r\n\r\n/**\r\n * 渲染列表表格分页组件。\r\n */\r\nexport function renderListTablePagination<RecordType>(params: {\r\n element: HTMLDivElement | null;\r\n pagination: ListTablePaginationAdapter;\r\n options: ListTableOptions<RecordType>;\r\n total: number;\r\n state: PaginationState;\r\n onChange: (page: number, pageSize: number) => void;\r\n onPageSizeChange: (page: number, pageSize: number) => void;\r\n}) {\r\n const {\r\n element,\r\n pagination,\r\n options,\r\n total,\r\n state,\r\n onChange,\r\n onPageSizeChange,\r\n } = params;\r\n const paginationOptions = options.pagination;\r\n\r\n if (!element || !paginationOptions) {\r\n options.ui?.onPaginationRender?.(null);\r\n if (element) {\r\n element.style.display = \"none\";\r\n }\r\n return;\r\n }\r\n\r\n if (isScrollPaginationMode(options)) {\r\n options.ui?.onPaginationRender?.(null);\r\n element.style.display = \"none\";\r\n pagination.destroy();\r\n return;\r\n }\r\n\r\n const paginationConfig = {\r\n mode: paginationOptions.mode,\r\n current: state.currentPage,\r\n total: getPaginationTotal(options, total),\r\n pageSize: getEffectivePageSize(options, state),\r\n pageSizeOptions: paginationOptions.pageSizeOptions,\r\n disabled: paginationOptions.disabled,\r\n showSizeChanger: paginationOptions.showSizeChanger,\r\n showQuickJumper: paginationOptions.showQuickJumper,\r\n showLessItems: paginationOptions.showLessItems,\r\n simple: paginationOptions.simple,\r\n showTotal: paginationOptions.showTotal,\r\n onChange,\r\n onPageSizeChange,\r\n };\r\n\r\n if (options.ui?.onPaginationRender) {\r\n options.ui.onPaginationRender(paginationConfig);\r\n element.style.display = \"none\";\r\n pagination.destroy();\r\n return;\r\n }\r\n\r\n element.style.display = \"\";\r\n pagination.mount(element, paginationConfig);\r\n}\r\n","import type { ListTablePaginationState } from \"../../engine/store/state\";\r\n\r\n/**\r\n * 更新页码与 pageSize。\r\n */\r\nexport function updatePaginationState(\r\n current: ListTablePaginationState,\r\n next: Partial<ListTablePaginationState>,\r\n): ListTablePaginationState {\r\n return {\r\n ...current,\r\n ...next,\r\n };\r\n}\r\n","import type { ListTableOptions } from \"../schema/table-options\";\r\nimport { renderListTablePagination } from \"../rendering/pipeline/pagination-renderer\";\r\nimport { updatePaginationState } from \"../features/pagination/pagination-feature\";\r\nimport type { ListTableStore } from \"../engine/store/create-store\";\r\nimport { setPaginationAction } from \"../engine/store/actions\";\r\n\r\n/**\r\n * 同步分页视图与分页状态。\r\n */\r\nexport function syncListTablePagination<RecordType>(params: {\r\n element: HTMLDivElement | null;\r\n pagination: Parameters<typeof renderListTablePagination<RecordType>>[0][\"pagination\"];\r\n options: ListTableOptions<RecordType>;\r\n total: number;\r\n currentPage: number;\r\n pageSize: number;\r\n scrollPageSize: number;\r\n store: ListTableStore<RecordType>;\r\n emitQueryChange: (action: \"paginate\") => void;\r\n render: () => void;\r\n}) {\r\n const {\r\n element,\r\n pagination,\r\n options,\r\n total,\r\n currentPage,\r\n pageSize,\r\n scrollPageSize,\r\n store,\r\n emitQueryChange,\r\n render,\r\n } = params;\r\n renderListTablePagination({\r\n element,\r\n pagination,\r\n options,\r\n total,\r\n state: {\r\n currentPage,\r\n pageSize,\r\n scrollPageSize,\r\n },\r\n onChange: (page, nextPageSize) => {\r\n store.dispatch(setPaginationAction(updatePaginationState(\r\n store.getSnapshot().query.pagination,\r\n {\r\n currentPage: page,\r\n pageSize: nextPageSize,\r\n },\r\n )));\r\n if (options.pagination) {\r\n options.pagination.onChange?.(page, nextPageSize);\r\n }\r\n if (options.query?.onChange) {\r\n emitQueryChange(\"paginate\");\r\n } else {\r\n render();\r\n }\r\n },\r\n onPageSizeChange: (page, nextPageSize) => {\r\n store.dispatch(setPaginationAction(updatePaginationState(\r\n store.getSnapshot().query.pagination,\r\n {\r\n currentPage: page,\r\n pageSize: nextPageSize,\r\n },\r\n )));\r\n if (options.pagination) {\r\n options.pagination.onShowSizeChange?.(page, nextPageSize);\r\n }\r\n if (options.query?.onChange) {\r\n emitQueryChange(\"paginate\");\r\n } else {\r\n render();\r\n }\r\n },\r\n });\r\n}\r\n","export interface ListTableRenderHostSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * 解析画布宿主尺寸,带回退值。\r\n *\r\n * 宽高均以当前宿主节点为准,避免父链放大导致 bitmap 与 CSS 显示尺寸不一致而发糊。\r\n */\r\nexport function resolveListTableRenderHostSize(params: {\r\n canvasHostElement: HTMLElement | null;\r\n fallbackWidth: number;\r\n fallbackHeight: number;\r\n}): ListTableRenderHostSize {\r\n const { canvasHostElement, fallbackWidth, fallbackHeight } = params;\r\n return {\r\n width:\r\n canvasHostElement && canvasHostElement.clientWidth > 0\r\n ? canvasHostElement.clientWidth\r\n : fallbackWidth,\r\n height:\r\n canvasHostElement && canvasHostElement.clientHeight > 0\r\n ? canvasHostElement.clientHeight\r\n : fallbackHeight,\r\n };\r\n}\r\n","import type { Rect } from \"../../debug/debug-snapshot\";\r\nimport type { ListTableTheme } from \"../../schema/style\";\r\n\r\n/**\r\n * 绘制矩形边框。\r\n *\r\n * @param ctx 画布上下文。\r\n * @param rect 矩形区域。\r\n * @param theme 当前主题。\r\n */\r\nexport function drawGridRect(\r\n ctx: CanvasRenderingContext2D,\r\n rect: Rect,\r\n theme: ListTableTheme,\r\n borderColor = theme.borderColor,\r\n) {\r\n ctx.save();\r\n ctx.strokeStyle = borderColor;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n\r\n const showTop = rect.y > 0;\r\n const showLeft = rect.x > 0;\r\n\r\n if (showTop) {\r\n ctx.moveTo(rect.x, rect.y + 0.5);\r\n ctx.lineTo(rect.x + rect.width, rect.y + 0.5);\r\n }\r\n\r\n if (showLeft) {\r\n ctx.moveTo(rect.x + 0.5, rect.y);\r\n ctx.lineTo(rect.x + 0.5, rect.y + rect.height);\r\n }\r\n\r\n ctx.moveTo(rect.x + rect.width + 0.5, rect.y);\r\n ctx.lineTo(rect.x + rect.width + 0.5, rect.y + rect.height);\r\n ctx.moveTo(rect.x, rect.y + rect.height + 0.5);\r\n ctx.lineTo(rect.x + rect.width, rect.y + rect.height + 0.5);\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n","import type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport type { ListTableRangeHighlightState } from \"../../schema/state\";\nimport { ROW_SELECTION_COLUMN_KEY } from \"../../domain/rows/row-selection\";\nimport type { ListTableTheme } from \"../../schema/style\";\r\nimport type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\r\nimport { drawGridRect } from \"./draw-grid\";\r\nimport type { SegmentColumn } from \"../../domain/columns/segment-column\";\r\n\r\nconst EMPTY_RANGE_HIGHLIGHT: ListTableRangeHighlightState = {\r\n selectedRowAnchorIndex: null,\r\n selectedRowRange: null,\r\n selectedColumnAnchorKey: null,\r\n selectedColumnRange: null,\r\n};\r\n\r\n/**\r\n * 绘制汇总行参数。\r\n */\r\nexport interface DrawSummaryParams<RecordType> {\r\n ctx: CanvasRenderingContext2D;\r\n summaryValues?: Map<string, string> | null;\r\n summaryTop: number;\r\n summaryHeight: number;\r\n leftColumns: Array<SegmentColumn<RecordType>>;\r\n centerColumns: Array<SegmentColumn<RecordType>>;\r\n rightColumns: Array<SegmentColumn<RecordType>>;\r\n centerClipRect?: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n } | null;\r\n theme: ListTableTheme;\r\n descriptors?: RenderCellDescriptor[];\r\n selectedHeaderKey?: string | null;\r\n summarySelected?: boolean;\r\n rangeHighlight?: ListTableRangeHighlightState;\r\n inlineContentInset?: {\r\n columnKey: string | null;\r\n width: number;\r\n };\r\n /** 拖拽排序状态。 */\r\n dragReorder?: {\r\n sourceIndex: number;\r\n columnKey: string;\r\n sourceLeafStartIndex: number;\r\n sourceLeafEndIndex: number;\r\n sourceColumnKeys?: string[];\r\n currentX: number;\r\n } | null;\r\n}\r\n\r\n/**\r\n * 绘制汇总行。\r\n *\r\n * 汇总行固定在表格底部,不随垂直滚动移动。\r\n */\r\nexport function drawSummary<RecordType>(params: DrawSummaryParams<RecordType>) {\n const defaultTitleColumnKey = resolveDefaultSummaryTitleColumnKey([\n ...params.leftColumns,\n ...params.centerColumns,\n ...params.rightColumns,\n ]);\n drawSummarySegment(\n params,\n params.centerColumns,\n params.centerClipRect ?? null,\n defaultTitleColumnKey,\n );\n drawSummarySegment(params, params.leftColumns, null, defaultTitleColumnKey);\n drawSummarySegment(params, params.rightColumns, null, defaultTitleColumnKey);\n\r\n // 在汇总行上方绘制拖拽幽灵列\r\n if (params.dragReorder) {\r\n drawSummaryDragGhost(params);\r\n }\r\n}\r\n\r\nfunction drawSummarySegment<RecordType>(\r\n params: DrawSummaryParams<RecordType>,\r\n columns: Array<SegmentColumn<RecordType>>,\n clipRect?: { x: number; y: number; width: number; height: number } | null,\n defaultTitleColumnKey?: string,\n) {\r\n if (columns.length === 0) {\r\n return;\r\n }\r\n\r\n const { ctx, summaryTop, summaryHeight, theme } = params;\r\n ctx.save();\r\n\r\n const minX = columns[0].drawX;\r\n const totalWidth =\r\n columns[columns.length - 1].drawX +\r\n columns[columns.length - 1].width -\r\n minX;\r\n ctx.beginPath();\r\n ctx.rect(minX, summaryTop, totalWidth, summaryHeight);\r\n ctx.clip();\r\n\r\n columns.forEach((column) => {\r\n const rect = {\r\n x: column.drawX,\r\n y: summaryTop,\r\n width: column.width,\r\n height: summaryHeight,\r\n };\r\n\r\n drawSummaryCell(\r\n ctx,\r\n rect,\r\n column,\r\n theme,\r\n params.summaryValues,\r\n params.selectedHeaderKey,\r\n params.summarySelected,\r\n params.rangeHighlight,\r\n clipRect,\r\n params.descriptors,\r\n params.inlineContentInset,\n defaultTitleColumnKey,\n );\r\n });\r\n\r\n ctx.restore();\r\n}\r\n\r\nfunction drawSummaryCell<RecordType>(\r\n ctx: CanvasRenderingContext2D,\r\n rect: { x: number; y: number; width: number; height: number },\r\n column: InternalLeafColumn<RecordType>,\r\n theme: ListTableTheme,\r\n summaryValues?: Map<string, string> | null,\r\n selectedHeaderKey?: string | null,\r\n summarySelected?: boolean,\r\n rangeHighlight?: ListTableRangeHighlightState,\r\n clipRect?: { x: number; y: number; width: number; height: number } | null,\r\n descriptors?: RenderCellDescriptor[],\r\n inlineContentInset?: DrawSummaryParams<RecordType>[\"inlineContentInset\"],\n defaultTitleColumnKey?: string,\n) {\r\n ctx.save();\r\n\r\n // 汇总行背景使用表头色,视觉上更突出\r\n const isHeaderColumnSelected =\r\n selectedHeaderKey != null && column.key === selectedHeaderKey;\r\n const isColumnRangeSelected = isIndexInHighlightRange(\r\n column.leafIndex,\r\n (rangeHighlight ?? EMPTY_RANGE_HIGHLIGHT).selectedColumnRange,\r\n );\r\n ctx.fillStyle =\r\n summarySelected || isHeaderColumnSelected || isColumnRangeSelected\r\n ? theme.selectionBackgroundColor\r\n : theme.headerBackgroundColor;\r\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\r\n drawGridRect(ctx, rect, theme);\r\n\r\n const resolvedDisplayValue = resolveSummaryCellDisplayValue(\n column,\n summaryValues?.get(column.key),\n column.key === defaultTitleColumnKey ? \"合计\" : undefined,\n );\n\r\n ctx.fillStyle = theme.headerTextColor;\r\n ctx.font = `600 ${theme.fontSize}px ${theme.fontFamily}`;\r\n ctx.textBaseline = \"middle\";\r\n\r\n const align = column.align ?? \"left\";\r\n ctx.textAlign = align;\r\n\r\n const contentInsetStart =\r\n column.key === inlineContentInset?.columnKey\r\n ? inlineContentInset.width\r\n : 0;\r\n const contentRect = {\r\n ...rect,\r\n x: rect.x + contentInsetStart,\r\n width: Math.max(rect.width - contentInsetStart, 0),\r\n };\r\n const visibleRect = clipRect\r\n ? (intersectRects(contentRect, clipRect) ?? contentRect)\r\n : contentRect;\r\n const textX = resolveSummaryTextX({\r\n rect: contentRect,\r\n visibleRect,\r\n align,\r\n padding: 12,\r\n });\r\n const displayText = resolveSummaryDisplayText(ctx, {\r\n text: resolvedDisplayValue,\r\n visibleRect,\r\n padding: 12,\r\n });\r\n ctx.fillText(displayText, textX, rect.y + rect.height / 2);\r\n\r\n descriptors?.push({\r\n kind: \"summary\",\r\n rect,\r\n columnKey: column.key,\r\n });\r\n\r\n ctx.restore();\r\n}\n\n/** 统一汇总单元格展示为“汇总类型: 值”。 */\nexport function resolveSummaryCellDisplayValue<RecordType>(\n column: InternalLeafColumn<RecordType>,\n value: string | undefined,\n defaultTitle?: string,\n) {\n if (column.summaryTitle != null) {\n return column.summaryTitle;\n }\n if (defaultTitle && (column.summary == null || column.summary === false)) {\n return defaultTitle;\n }\n if (value == null || column.summary == null || column.summary === false) {\n return value ?? \"\";\n }\n const type = column.summary === true ? \"sum\" : (column.summary.type ?? \"sum\");\n const labels = {\n sum: \"求和\",\n avg: \"平均值\",\n count: \"计数\",\n unionCount: \"去重计数\",\n rowCount: \"行数\",\n mergedRowCount: \"合并行数\",\n min: \"最小值\",\n max: \"最大值\",\n } as const;\n return `${labels[type]}: ${value}`;\n}\n\nfunction resolveDefaultSummaryTitleColumnKey<RecordType>(\n columns: Array<SegmentColumn<RecordType>>,\n) {\n if (columns.some((column) => column.summaryTitle != null)) {\n return undefined;\n }\n return columns\n .filter((column) => column.key !== ROW_SELECTION_COLUMN_KEY)\n .sort((left, right) => left.leafIndex - right.leafIndex)[0]?.key;\n}\n\r\n/**\r\n * 在汇总行区域绘制拖拽幽灵列。\r\n */\r\nfunction drawSummaryDragGhost<RecordType>(\r\n params: DrawSummaryParams<RecordType>,\r\n) {\r\n const dragState = params.dragReorder;\r\n if (!dragState) return;\r\n\r\n const { ctx, summaryTop, summaryHeight, theme } = params;\r\n\r\n const allColumns = [\r\n ...params.leftColumns,\r\n ...params.centerColumns,\r\n ...params.rightColumns,\r\n ];\r\n const sourceColumns = allColumns.filter((column) =>\r\n isDragSourceColumn(column, dragState),\r\n );\r\n if (sourceColumns.length === 0) return;\r\n\r\n const ghostWidth = sourceColumns.reduce(\r\n (sum, column) => sum + column.width,\r\n 0,\r\n );\r\n const ghostX = dragState.currentX - ghostWidth / 2;\r\n\r\n ctx.save();\r\n ctx.globalAlpha = 0.85;\r\n ctx.fillStyle = theme.headerBackgroundColor;\r\n ctx.fillRect(ghostX, summaryTop, ghostWidth, summaryHeight);\r\n ctx.globalAlpha = 1;\r\n\r\n ctx.strokeStyle = \"#1677ff\";\r\n ctx.lineWidth = 1.5;\r\n ctx.strokeRect(ghostX, summaryTop, ghostWidth, summaryHeight);\r\n ctx.restore();\r\n}\r\n\r\nfunction isDragSourceColumn<RecordType>(\r\n column: SegmentColumn<RecordType>,\r\n dragState: NonNullable<DrawSummaryParams<RecordType>[\"dragReorder\"]>,\r\n) {\r\n if (dragState.sourceColumnKeys?.length) {\r\n return dragState.sourceColumnKeys.includes(column.key);\r\n }\r\n\r\n return (\r\n column.leafIndex >= dragState.sourceLeafStartIndex &&\r\n column.leafIndex <= dragState.sourceLeafEndIndex\r\n );\r\n}\r\nfunction getAlignedTextX(\r\n rect: { x: number; width: number },\r\n align: \"left\" | \"center\" | \"right\",\r\n padding: number,\r\n) {\r\n if (align === \"center\") {\r\n return rect.x + rect.width / 2;\r\n }\r\n\r\n if (align === \"right\") {\r\n return rect.x + rect.width - padding;\r\n }\r\n\r\n return rect.x + padding;\r\n}\r\n\r\nexport function resolveSummaryTextX(params: {\r\n rect: { x: number; y: number; width: number; height: number };\r\n visibleRect: { x: number; y: number; width: number; height: number };\r\n align: \"left\" | \"center\" | \"right\";\r\n padding: number;\r\n}) {\r\n const { rect, visibleRect, align, padding } = params;\r\n const minX = visibleRect.x + padding;\r\n const maxX = visibleRect.x + visibleRect.width - padding;\r\n const preferredX = getAlignedTextX(rect, align, padding);\r\n\r\n if (align === \"center\") {\r\n return clamp(preferredX, minX, maxX);\r\n }\r\n\r\n if (align === \"right\") {\r\n return Math.max(Math.min(preferredX, maxX), minX);\r\n }\r\n\r\n return Math.min(Math.max(preferredX, minX), maxX);\r\n}\r\n\r\nexport function resolveSummaryDisplayText(\r\n ctx: CanvasRenderingContext2D,\r\n params: {\r\n text: string;\r\n visibleRect: { x: number; y: number; width: number; height: number };\r\n padding: number;\r\n },\r\n) {\r\n const { text, visibleRect, padding } = params;\r\n const maxWidth = Math.max(visibleRect.width - padding * 2, 12);\r\n return ellipsisText(ctx, text, maxWidth);\r\n}\r\n\r\nfunction ellipsisText(\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n maxWidth: number,\r\n) {\r\n if (ctx.measureText(text).width <= maxWidth) {\r\n return text;\r\n }\r\n\r\n const ellipsis = \"...\";\r\n let content = text;\r\n\r\n while (content.length > 0) {\r\n content = content.slice(0, -1);\r\n const measured = ctx.measureText(`${content}${ellipsis}`).width;\r\n if (measured <= maxWidth) {\r\n return `${content}${ellipsis}`;\r\n }\r\n }\r\n\r\n return ellipsis;\r\n}\r\n\r\nfunction intersectRects(\r\n left: { x: number; y: number; width: number; height: number },\r\n right: { x: number; y: number; width: number; height: number },\r\n) {\r\n const x = Math.max(left.x, right.x);\r\n const y = Math.max(left.y, right.y);\r\n const maxX = Math.min(left.x + left.width, right.x + right.width);\r\n const maxY = Math.min(left.y + left.height, right.y + right.height);\r\n\r\n if (maxX <= x || maxY <= y) {\r\n return null;\r\n }\r\n\r\n return {\r\n x,\r\n y,\r\n width: maxX - x,\r\n height: maxY - y,\r\n };\r\n}\r\n\r\nfunction clamp(value: number, min: number, max: number) {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nfunction isIndexInHighlightRange(\r\n index: number,\r\n range: ListTableRangeHighlightState[\"selectedColumnRange\"],\r\n) {\r\n return Boolean(range && index >= range.start && index <= range.end);\r\n}\r\n\r\n","import type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\nimport type {\n AxisScrollbarLayout,\n ScrollbarLayout,\n ScrollbarRect,\n} from \"../../domain/layout/scrollbar-types\";\n\r\n/**\r\n * 绘制滚动条。\r\n *\r\n * @param ctx 画布上下文。\r\n * @param layout 滚动条布局。\r\n * @param descriptors 命中描述符。\r\n * @param opacity 绘制透明度,0~1。\r\n * @param interactive 是否写入命中描述符。\r\n */\r\nexport function drawScrollbars(\r\n ctx: CanvasRenderingContext2D,\r\n layout: ScrollbarLayout,\r\n descriptors: RenderCellDescriptor[],\r\n opacity = 1,\r\n interactive = true,\r\n) {\r\n const alpha = Number.isFinite(opacity) ? Math.min(Math.max(opacity, 0), 1) : 1;\r\n if (alpha <= 0.001) {\r\n return;\r\n }\r\n\r\n ctx.save();\r\n ctx.globalAlpha = alpha;\r\n\r\n if (layout.horizontal) {\r\n drawAxisScrollbar(ctx, layout.horizontal, \"horizontal\", descriptors, interactive);\r\n }\r\n\r\n if (layout.vertical) {\r\n drawAxisScrollbar(ctx, layout.vertical, \"vertical\", descriptors, interactive);\r\n }\r\n\r\n ctx.restore();\r\n}\r\n\r\nfunction drawAxisScrollbar(\r\n ctx: CanvasRenderingContext2D,\r\n layout: AxisScrollbarLayout,\r\n axis: \"horizontal\" | \"vertical\",\r\n descriptors: RenderCellDescriptor[],\r\n interactive: boolean,\r\n) {\r\n const kind =\r\n axis === \"horizontal\" ? \"horizontal-scrollbar\" : \"vertical-scrollbar\";\r\n\r\n if (interactive) {\r\n // Thumb first so hit-test finds it before overlapping track (same priority)\r\n descriptors.push({\r\n kind,\r\n rect: layout.thumb,\r\n columnKey: `__${axis}_scrollbar_thumb__`,\r\n scrollbarRole: \"thumb\",\r\n });\r\n descriptors.push({\r\n kind,\r\n rect: layout.track,\r\n columnKey: `__${axis}_scrollbar_track__`,\r\n scrollbarRole: \"track\",\r\n });\r\n descriptors.push({\r\n kind,\r\n rect: layout.decreaseButton,\r\n columnKey: `__${axis}_scrollbar_decrease__`,\r\n scrollbarRole: \"decrease-button\",\r\n });\r\n descriptors.push({\r\n kind,\r\n rect: layout.increaseButton,\r\n columnKey: `__${axis}_scrollbar_increase__`,\r\n scrollbarRole: \"increase-button\",\r\n });\r\n }\r\n\r\n // Visual paint order (bottom to top): track -> buttons -> thumb\r\n drawTrack(ctx, layout.track);\r\n drawButton(ctx, layout.decreaseButton, axis, \"decrease\");\r\n drawButton(ctx, layout.increaseButton, axis, \"increase\");\r\n drawThumb(ctx, layout.thumb);\r\n}\r\n\r\nfunction drawTrack(\r\n ctx: CanvasRenderingContext2D,\r\n rect: ScrollbarRect,\r\n) {\r\n ctx.save();\r\n ctx.fillStyle = \"rgba(148, 163, 184, 0.16)\";\r\n roundRect(ctx, rect.x, rect.y, rect.width, rect.height, rect.height / 2);\r\n ctx.fill();\r\n ctx.restore();\r\n}\r\n\r\nfunction drawThumb(\r\n ctx: CanvasRenderingContext2D,\r\n rect: ScrollbarRect,\r\n) {\r\n ctx.save();\r\n ctx.fillStyle = \"rgba(100, 116, 139, 0.8)\";\r\n roundRect(ctx, rect.x, rect.y, rect.width, rect.height, rect.height / 2);\r\n ctx.fill();\r\n ctx.restore();\r\n}\r\n\r\nfunction drawButton(\r\n ctx: CanvasRenderingContext2D,\r\n rect: ScrollbarRect,\r\n axis: \"horizontal\" | \"vertical\",\r\n direction: \"decrease\" | \"increase\",\r\n) {\r\n ctx.save();\r\n ctx.fillStyle = \"rgba(226, 232, 240, 0.92)\";\r\n ctx.strokeStyle = \"rgba(148, 163, 184, 0.65)\";\r\n ctx.lineWidth = 1;\r\n roundRect(ctx, rect.x, rect.y, rect.width, rect.height, rect.height / 2);\r\n ctx.fill();\r\n ctx.stroke();\r\n\r\n ctx.fillStyle = \"rgba(71, 85, 105, 0.88)\";\r\n ctx.beginPath();\r\n\r\n if (axis === \"horizontal\") {\r\n const centerY = rect.y + rect.height / 2;\r\n const iconWidth = rect.width * 0.28;\r\n const iconHeight = rect.height * 0.22;\r\n const centerX = rect.x + rect.width / 2;\r\n const tipX =\r\n direction === \"decrease\" ? centerX - iconWidth / 2 : centerX + iconWidth / 2;\r\n const tailX =\r\n direction === \"decrease\" ? centerX + iconWidth / 2 : centerX - iconWidth / 2;\r\n ctx.moveTo(tipX, centerY);\r\n ctx.lineTo(tailX, centerY - iconHeight);\r\n ctx.lineTo(tailX, centerY + iconHeight);\r\n } else {\r\n const centerX = rect.x + rect.width / 2;\r\n const iconWidth = rect.width * 0.22;\r\n const iconHeight = rect.height * 0.28;\r\n const centerY = rect.y + rect.height / 2;\r\n const tipY =\r\n direction === \"decrease\" ? centerY - iconHeight / 2 : centerY + iconHeight / 2;\r\n const tailY =\r\n direction === \"decrease\" ? centerY + iconHeight / 2 : centerY - iconHeight / 2;\r\n ctx.moveTo(centerX, tipY);\r\n ctx.lineTo(centerX - iconWidth, tailY);\r\n ctx.lineTo(centerX + iconWidth, tailY);\r\n }\r\n\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.restore();\r\n}\r\n\r\nfunction roundRect(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n radius: number,\r\n) {\r\n const nextRadius = Math.min(radius, width / 2, height / 2);\r\n ctx.beginPath();\r\n ctx.moveTo(x + nextRadius, y);\r\n ctx.arcTo(x + width, y, x + width, y + height, nextRadius);\r\n ctx.arcTo(x + width, y + height, x, y + height, nextRadius);\r\n ctx.arcTo(x, y + height, x, y, nextRadius);\r\n ctx.arcTo(x, y, x + width, y, nextRadius);\r\n ctx.closePath();\r\n}\r\n","const COLLAPSE_TRIGGER_BACKGROUND_COLOR = \"#ffffff\";\r\nconst COLLAPSE_TRIGGER_BORDER_COLOR = \"#cbd5e1\";\r\nconst COLLAPSE_TRIGGER_STROKE_COLOR = \"#64748b\";\r\n\r\nexport const COLLAPSE_TRIGGER_WIDTH = 20;\r\nexport const COLLAPSE_TRIGGER_HEIGHT = 14;\r\nexport const COLLAPSE_TRIGGER_GAP = 6;\r\nexport const COLLAPSE_TRIGGER_RADIUS = 7;\r\n\r\nexport interface CollapseTriggerRect {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/**\r\n * 计算折叠胶囊内部双折线的线段。\r\n */\r\nexport function resolveCollapseTriggerGlyphSegments(\r\n rect: CollapseTriggerRect,\r\n orientation: \"horizontal\" | \"vertical\",\r\n) {\r\n const centerX = rect.x + rect.width / 2;\r\n const centerY = rect.y + rect.height / 2;\r\n const horizontalSegments: readonly [\r\n readonly [\r\n { readonly x: number; readonly y: number },\r\n { readonly x: number; readonly y: number },\r\n { readonly x: number; readonly y: number },\r\n ],\r\n readonly [\r\n { readonly x: number; readonly y: number },\r\n { readonly x: number; readonly y: number },\r\n { readonly x: number; readonly y: number },\r\n ],\r\n ] = [\r\n [\r\n { x: centerX - 2, y: centerY - 3 },\r\n { x: centerX - 5, y: centerY },\r\n { x: centerX - 2, y: centerY + 3 },\r\n ],\r\n [\r\n { x: centerX + 2, y: centerY - 3 },\r\n { x: centerX + 5, y: centerY },\r\n { x: centerX + 2, y: centerY + 3 },\r\n ],\r\n ];\r\n\r\n if (orientation === \"horizontal\") {\r\n return horizontalSegments;\r\n }\r\n\r\n return [\r\n rotateSegment(horizontalSegments[0], centerX, centerY),\r\n rotateSegment(horizontalSegments[1], centerX, centerY),\r\n ] as const;\r\n}\r\n\r\nfunction rotateSegment(\r\n segment: readonly [\r\n { readonly x: number; readonly y: number },\r\n { readonly x: number; readonly y: number },\r\n { readonly x: number; readonly y: number },\r\n ],\r\n centerX: number,\r\n centerY: number,\r\n) {\r\n return [\r\n {\r\n x: centerX - (segment[0].y - centerY),\r\n y: centerY + (segment[0].x - centerX),\r\n },\r\n {\r\n x: centerX - (segment[1].y - centerY),\r\n y: centerY + (segment[1].x - centerX),\r\n },\r\n {\r\n x: centerX - (segment[2].y - centerY),\r\n y: centerY + (segment[2].x - centerX),\r\n },\r\n ] as const;\r\n}\r\n\r\n/**\r\n * 绘制折叠胶囊底板。\r\n */\r\nexport function drawCollapseTriggerCapsule(\r\n ctx: CanvasRenderingContext2D,\r\n rect: CollapseTriggerRect,\r\n) {\r\n ctx.save();\r\n ctx.fillStyle = COLLAPSE_TRIGGER_BACKGROUND_COLOR;\r\n ctx.strokeStyle = COLLAPSE_TRIGGER_BORDER_COLOR;\r\n ctx.lineWidth = 1;\r\n roundRectPath(\r\n ctx,\r\n rect.x,\r\n rect.y,\r\n rect.width,\r\n rect.height,\r\n COLLAPSE_TRIGGER_RADIUS,\r\n );\r\n ctx.fill();\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n\r\n/**\r\n * 绘制折叠胶囊内部图形。\r\n */\r\nexport function drawCollapseTriggerGlyph(\r\n ctx: CanvasRenderingContext2D,\r\n rect: CollapseTriggerRect,\r\n orientation: \"horizontal\" | \"vertical\",\r\n color = COLLAPSE_TRIGGER_STROKE_COLOR,\r\n) {\r\n const segments = resolveCollapseTriggerGlyphSegments(rect, orientation);\r\n\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = 1.5;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n segments.forEach((segment) => {\r\n ctx.beginPath();\r\n ctx.moveTo(segment[0].x, segment[0].y);\r\n ctx.lineTo(segment[1].x, segment[1].y);\r\n ctx.lineTo(segment[2].x, segment[2].y);\r\n ctx.stroke();\r\n });\r\n ctx.restore();\r\n}\r\n\r\nfunction roundRectPath(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n radius: number,\r\n) {\r\n const nextRadius = Math.min(radius, width / 2, height / 2);\r\n ctx.beginPath();\r\n ctx.moveTo(x + nextRadius, y);\r\n ctx.arcTo(x + width, y, x + width, y + height, nextRadius);\r\n ctx.arcTo(x + width, y + height, x, y + height, nextRadius);\r\n ctx.arcTo(x, y + height, x, y, nextRadius);\r\n ctx.arcTo(x, y, x + width, y, nextRadius);\r\n ctx.closePath();\r\n}\r\n","import type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\nimport { getValueByDataIndex } from \"../../domain/data/get-value-by-data-index\";\nimport type { SegmentColumn } from \"../../domain/columns/segment-column\";\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\nimport type {\n ListTableCellContent,\n ListTableCellSpan,\n} from \"../../schema/column\";\nimport type {\n ListTableRangeHighlightState,\n ListTableSelectionState,\n HoverState,\n ScrollState,\n} from \"../../schema/state\";\nimport type { ListTableTheme } from \"../../schema/style\";\nimport type { ListTableMergeCellOptions } from \"../../schema/table-options\";\nimport type { ListTableHighlightMode } from \"../../schema/table-options\";\nimport { isCellHighlightedByMode } from \"../../services/range-highlight-service\";\nimport {\n drawBodyCellContents,\n normalizeCellContents,\n resolveBodyCellContents,\n} from \"../cell-content/cell-content-renderer\";\nimport { measureNestedTableContentHeight } from \"../cell-content/draw-nested-table-content\";\nimport type { NestedTableHighlightState } from \"../cell-content/types\";\nimport {\n COLLAPSE_TRIGGER_GAP,\n COLLAPSE_TRIGGER_HEIGHT,\n COLLAPSE_TRIGGER_WIDTH,\n drawCollapseTriggerCapsule,\n drawCollapseTriggerGlyph,\n resolveCollapseTriggerGlyphSegments,\n} from \"./collapse-trigger\";\nimport { drawGridRect } from \"./draw-grid\";\nimport {\n hasExpandedVisibleRows,\n type ListTableVisibleRow,\n} from \"../../services/expandable-service\";\nimport {\n getVisibleRowHeight,\n sumVisibleRowHeights,\n} from \"../../domain/rows/row-height\";\n\nconst VALIDATION_ERROR_COLOR = \"#ff4d4f\";\nconst VALIDATION_TEXT_COLOR = \"#ffffff\";\nconst VALIDATION_MUTED_TEXT_COLOR = \"rgba(255, 255, 255, 0.72)\";\nconst ACTIVE_CELL_BORDER_COLOR = \"#1677ff\";\nconst ROW_COLLAPSE_TRIGGER_WIDTH = COLLAPSE_TRIGGER_HEIGHT;\nconst ROW_COLLAPSE_TRIGGER_HEIGHT = COLLAPSE_TRIGGER_WIDTH;\nconst COLLAPSE_TRIGGER_CLIP_OVERFLOW = ROW_COLLAPSE_TRIGGER_HEIGHT / 2;\nconst GRID_LINE_OFFSET = 0.5;\nconst CONTENT_HORIZONTAL_PADDING = 12;\nconst DEFAULT_EXPAND_INDENT_SIZE = 15;\nconst EXPAND_TRIGGER_SIZE = 14;\nconst EXPAND_TRIGGER_GAP = 6;\nconst EMPTY_RANGE_HIGHLIGHT: ListTableRangeHighlightState = {\n selectedRowAnchorIndex: null,\n selectedRowRange: null,\n selectedColumnAnchorKey: null,\n selectedColumnRange: null,\n};\n\n/**\n * 绘制表体参数。\n */\nexport interface DrawBodyParams<RecordType> {\n ctx: CanvasRenderingContext2D;\n rows: ListTableVisibleRow<RecordType>[];\n rowIndexMap?: number[];\n rowHeight: number;\n bodyTop: number;\n bodyHeight: number;\n leftColumns: Array<SegmentColumn<RecordType>>;\n centerColumns: Array<SegmentColumn<RecordType>>;\n rightColumns: Array<SegmentColumn<RecordType>>;\n centerClipRect?: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null;\n scroll: ScrollState;\n theme: ListTableTheme;\n rowBackgroundColor?: string;\n frozen?: boolean;\n striped?: boolean;\n hover: HoverState;\n selection: ListTableSelectionState;\n selectedHeaderKey?: string | null;\n rangeHighlight?: ListTableRangeHighlightState;\n /**\n * 点击高亮模式。\n * @default \"row\"\n */\n highlightMode?: ListTableHighlightMode;\n mergeCell?: ListTableMergeCellOptions;\n descriptors: RenderCellDescriptor[];\n collapseConfig?: {\n inlineColumnKey: string | null;\n totalRowCount?: number;\n reserveInlineSpace?: boolean;\n collapsedRowIndexes?: ReadonlySet<number>;\n };\n expandableConfig?: {\n indentSize?: number;\n showExpandIcon?: boolean;\n showExpandColumn?: boolean;\n triggerColumnKey: string;\n inlineColumnKey: string | null;\n getExpandAnimationProgress?: (\n rowKey: string | number,\n ) => number | undefined;\n };\n getCollapseRowOffset?: (rowKey: string | number) => number | undefined;\n getCollapseCellHeight?: (params: {\n rowIndex: number;\n columnKey: string;\n }) => number | undefined;\n /** 拖拽排序状态。 */\n dragReorder?: {\n sourceIndex: number;\n columnKey: string;\n sourceLeafStartIndex: number;\n sourceLeafEndIndex: number;\n sourceColumnKeys?: string[];\n currentX: number;\n } | null;\n getControlAnimationProgress?: (params: {\n rowIndex: number;\n columnKey: string;\n contentIndex: number;\n }) => number | undefined;\n getNestedTableHighlight?: (params: {\n rowIndex: number;\n columnKey: string;\n contentIndex: number;\n }) => NestedTableHighlightState | null | undefined;\n getValidationMessage?: (params: {\n record: RecordType;\n rowIndex: number;\n columnKey: string;\n }) => string | null;\n requestRender?: () => void;\n}\n\ninterface MergedBodyCell<RecordType> {\n rowIndex: number;\n sourceRowIndex: number;\n rowSpan: number;\n columnIndex: number;\n colSpan: number;\n column: SegmentColumn<RecordType>;\n record: RecordType;\n row: ListTableVisibleRow<RecordType>;\n}\n\ninterface CollapseBoundaryMarker {\n rangeStart: number;\n rangeEnd: number;\n position: \"top\" | \"bottom\";\n}\n\n/**\n * 绘制表体。\n *\n * @param params 绘制参数。\n */\nexport function drawBody<RecordType>(params: DrawBodyParams<RecordType>) {\n const rowOffsets = buildVisibleRowOffsets(params.rows, params.rowHeight);\n const { start: startRowIndex, end: endRowIndex } = resolveVisibleBodyRowRange(\n {\n rows: params.rows,\n rowHeight: params.rowHeight,\n bodyHeight: params.bodyHeight,\n scrollTop: params.scroll.top,\n rowOffsets,\n },\n );\n\n drawSegmentRows(\n params,\n \"center\",\n params.centerColumns,\n startRowIndex,\n endRowIndex,\n rowOffsets,\n );\n drawSegmentRows(\n params,\n \"left\",\n params.leftColumns,\n startRowIndex,\n endRowIndex,\n rowOffsets,\n );\n drawSegmentRows(\n params,\n \"right\",\n params.rightColumns,\n startRowIndex,\n endRowIndex,\n rowOffsets,\n );\n drawExpandedRowsOverlay(params, startRowIndex, endRowIndex, rowOffsets);\n\n // 在表体上方绘制拖拽幽灵列(整列半透明)\n if (params.dragReorder) {\n drawDragGhostColumn(params);\n }\n}\n\nfunction drawSegmentRows<RecordType>(\n params: DrawBodyParams<RecordType>,\n segment: \"left\" | \"center\" | \"right\",\n columns: Array<SegmentColumn<RecordType>>,\n startRowIndex: number,\n endRowIndex: number,\n rowOffsets: number[] | null,\n) {\n const { ctx } = params;\n ctx.save();\n\n if (columns.length > 0) {\n const minX = columns[0].drawX;\n const totalWidth =\n columns[columns.length - 1].drawX +\n columns[columns.length - 1].width -\n minX;\n const clipRect = resolveBodySegmentClipRect({\n minX,\n totalWidth,\n bodyTop: params.bodyTop,\n bodyHeight: params.bodyHeight,\n segment,\n centerClipRect: params.centerClipRect ?? null,\n });\n\n const visibleCells = shouldBuildMergedBodyCells(\n params.rows,\n columns,\n params.mergeCell,\n )\n ? buildMergedBodyCells(\n params.rows,\n columns,\n params.mergeCell,\n params.rowIndexMap,\n )\n : buildPlainVisibleBodyCells({\n rows: params.rows,\n columns,\n startRowIndex,\n endRowIndex,\n rowIndexMap: params.rowIndexMap,\n });\n\n const animatedCellHeights = new Map<MergedBodyCell<RecordType>, number>();\n let collapseAnimationOverflow = 0;\n visibleCells.forEach((cell) => {\n const baseHeight = getCellHeight({\n rows: params.rows,\n rowIndex: cell.rowIndex,\n rowSpan: cell.rowSpan,\n rowHeight: params.rowHeight,\n });\n const animatedHeight = params.getCollapseCellHeight?.({\n rowIndex: cell.sourceRowIndex,\n columnKey: cell.column.key,\n });\n if (\n typeof animatedHeight !== \"number\" ||\n Math.abs(animatedHeight - baseHeight) < 0.001\n ) {\n return;\n }\n animatedCellHeights.set(cell, animatedHeight);\n collapseAnimationOverflow = Math.max(\n collapseAnimationOverflow,\n animatedHeight - baseHeight,\n );\n });\n const renderClipRect = {\n ...clipRect,\n height: clipRect.height + Math.max(collapseAnimationOverflow, 0),\n };\n ctx.beginPath();\n ctx.rect(\n renderClipRect.x,\n renderClipRect.y,\n renderClipRect.width,\n renderClipRect.height,\n );\n ctx.clip();\n\n const orderedCells = [...visibleCells].sort(\n (left, right) =>\n Number(animatedCellHeights.has(left)) -\n Number(animatedCellHeights.has(right)),\n );\n orderedCells.forEach((cell) => {\n if (cell.row.kind === \"expanded\") {\n return;\n }\n\n const rowY =\n params.bodyTop +\n resolveVisibleRowOffset(rowOffsets, cell.rowIndex, params.rowHeight) -\n params.scroll.top +\n (params.getCollapseRowOffset?.(cell.row.rowKey) ?? 0);\n const baseHeight = getCellHeight({\n rows: params.rows,\n rowIndex: cell.rowIndex,\n rowSpan: cell.rowSpan,\n rowHeight: params.rowHeight,\n });\n const rect = {\n x: columns[cell.columnIndex]?.drawX ?? cell.column.drawX,\n y: rowY,\n width: getMergedCellWidth(columns, cell.columnIndex, cell.colSpan),\n height: animatedCellHeights.get(cell) ?? baseHeight,\n };\n\n if (\n rect.y + rect.height <= params.bodyTop ||\n rect.y >= params.bodyTop + params.bodyHeight\n ) {\n return;\n }\n\n const isHovered =\n params.hover.area === \"body\" &&\n params.hover.rowIndex === cell.sourceRowIndex &&\n params.hover.columnKey === cell.column.key;\n const isSelected =\n params.selection.rowIndex === cell.sourceRowIndex &&\n params.selection.columnKey === cell.column.key;\n const isRowRangeSelected =\n cell.row.kind === \"data\" &&\n isRowSpanInHighlightRange(\n cell.sourceRowIndex,\n cell.rowSpan,\n (params.rangeHighlight ?? EMPTY_RANGE_HIGHLIGHT).selectedRowRange,\n );\n const isColumnRangeSelected =\n cell.row.kind === \"data\" &&\n isIndexInHighlightRange(\n cell.column.leafIndex,\n (params.rangeHighlight ?? EMPTY_RANGE_HIGHLIGHT).selectedColumnRange,\n );\n const isHeaderColumnSelected =\n cell.row.kind === \"data\" &&\n params.selectedHeaderKey != null &&\n cell.column.key === params.selectedHeaderKey;\n const isRangeHighlighted = isCellHighlightedByMode({\n mode: params.highlightMode,\n isCellSelected: isSelected,\n isRowRangeSelected,\n isColumnRangeSelected,\n });\n const validationMessage =\n cell.row.kind === \"data\"\n ? (params.getValidationMessage?.({\n record: cell.record,\n rowIndex: cell.sourceRowIndex,\n columnKey: cell.column.key,\n }) ?? null)\n : null;\n const collapseBoundaryMarkers =\n cell.row.kind === \"data\"\n ? resolveCollapsedBoundaryMarkers({\n rows: params.rows,\n visibleRowIndex: cell.rowIndex,\n row: cell.row,\n column: cell.column,\n collapseConfig: params.collapseConfig,\n })\n : [];\n const cellDescriptorStartIndex = params.descriptors.length;\n\n const cellTooltip = drawBodyCell(\n ctx,\n rect,\n cell.record,\n cell.sourceRowIndex,\n cell.column,\n params.theme,\n params.rowBackgroundColor,\n params.striped === true,\n isHovered,\n isRangeHighlighted || isHeaderColumnSelected,\n params.frozen === true,\n params.descriptors,\n cell.row,\n params.expandableConfig,\n params.collapseConfig,\n collapseBoundaryMarkers,\n params.getNestedTableHighlight,\n params.getControlAnimationProgress,\n params.requestRender,\n validationMessage,\n intersectRects(rect, renderClipRect) ?? rect,\n );\n\n if (cell.row.kind === \"data\") {\n applyRowSpanToDescriptors(\n params.descriptors,\n cellDescriptorStartIndex,\n cell.sourceRowIndex,\n cell.column.key,\n cell.rowSpan,\n );\n }\n\n params.descriptors.push({\n kind: \"body\",\n rect,\n columnKey: cell.column.key,\n rowIndex: cell.sourceRowIndex,\n rowSpan: cell.rowSpan,\n fixed: cell.column.fixed,\n frozen: params.frozen,\n tooltipText: cellTooltip?.text,\n tooltipVariant: cellTooltip?.variant,\n });\n });\n }\n\n ctx.restore();\n}\n\n/**\n * 在单元格内容上方绘制活动单元格边框。\n */\nexport function drawActiveCellBorder(\n ctx: CanvasRenderingContext2D,\n rect: { x: number; y: number; width: number; height: number },\n) {\n const inset = 0.5;\n ctx.save();\n ctx.strokeStyle = ACTIVE_CELL_BORDER_COLOR;\n ctx.lineWidth = 1;\n ctx.strokeRect(\n rect.x + inset,\n rect.y + inset,\n Math.max(rect.width - inset * 2, 0),\n Math.max(rect.height - inset * 2, 0),\n );\n ctx.restore();\n}\n\nfunction drawExpandedRowsOverlay<RecordType>(\n params: DrawBodyParams<RecordType>,\n startRowIndex: number,\n endRowIndex: number,\n rowOffsets: number[] | null,\n) {\n const allColumns = [\n ...params.leftColumns,\n ...params.centerColumns,\n ...params.rightColumns,\n ];\n if (allColumns.length === 0) {\n return;\n }\n\n const overlayLayout = resolveExpandedRowsOverlayLayout({\n leftColumns: params.leftColumns,\n centerColumns: params.centerColumns,\n rightColumns: params.rightColumns,\n centerClipRect: params.centerClipRect,\n bodyTop: params.bodyTop,\n bodyHeight: params.bodyHeight,\n });\n\n params.ctx.save();\n params.ctx.beginPath();\n params.ctx.rect(\n overlayLayout.clipRect.x,\n overlayLayout.clipRect.y,\n overlayLayout.clipRect.width,\n overlayLayout.clipRect.height,\n );\n params.ctx.clip();\n\n for (let rowIndex = startRowIndex; rowIndex < endRowIndex; rowIndex += 1) {\n const row = params.rows[rowIndex];\n if (!row || row.kind !== \"expanded\") {\n continue;\n }\n\n const rect = {\n x: overlayLayout.layoutRect.x,\n y:\n params.bodyTop +\n resolveVisibleRowOffset(rowOffsets, rowIndex, params.rowHeight) -\n params.scroll.top +\n (params.getCollapseRowOffset?.(row.rowKey) ?? 0),\n width: overlayLayout.layoutRect.width,\n height: getVisibleRowHeight(row, params.rowHeight),\n };\n if (\n rect.y + rect.height <= params.bodyTop ||\n rect.y >= params.bodyTop + params.bodyHeight\n ) {\n continue;\n }\n\n const expandedRowAnimation = resolveExpandedRowAnimationLayout(\n rect,\n params.expandableConfig?.getExpandAnimationProgress?.(row.ownerRowKey),\n );\n drawAnimatedExpandedBodyCell({\n ctx: params.ctx,\n rect,\n visibleRect: expandedRowAnimation.visibleRect,\n progress: expandedRowAnimation.progress,\n row,\n theme: params.theme,\n rowBackgroundColor: params.rowBackgroundColor,\n striped: params.striped === true,\n descriptors: params.descriptors,\n clipRect: overlayLayout.clipRect,\n segment: \"center\",\n segments: {\n hasLeft: params.leftColumns.length > 0,\n hasCenter: true,\n },\n contentInset: resolveExpandedRowContentInset(params, row),\n getNestedTableHighlight: params.getNestedTableHighlight,\n });\n\n params.descriptors.push({\n kind: \"expanded-row\",\n rect:\n intersectRects(\n expandedRowAnimation.visibleRect,\n overlayLayout.clipRect,\n ) ?? expandedRowAnimation.visibleRect,\n columnKey: \"__expanded_row__\",\n rowIndex: row.ownerDataRowIndex,\n rowSpan: 1,\n frozen: params.frozen,\n });\n }\n\n params.ctx.restore();\n}\n\nexport function resolveExpandedRowsOverlayRect<RecordType>(params: {\n leftColumns: Array<SegmentColumn<RecordType>>;\n centerColumns: Array<SegmentColumn<RecordType>>;\n rightColumns: Array<SegmentColumn<RecordType>>;\n centerClipRect?: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null;\n bodyTop: number;\n bodyHeight: number;\n}) {\n return resolveExpandedRowsOverlayLayout(params).clipRect;\n}\n\nexport function resolveExpandedRowsOverlayLayout<RecordType>(params: {\n leftColumns: Array<SegmentColumn<RecordType>>;\n centerColumns: Array<SegmentColumn<RecordType>>;\n rightColumns: Array<SegmentColumn<RecordType>>;\n centerClipRect?: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null;\n bodyTop: number;\n bodyHeight: number;\n}) {\n const { centerClipRect, centerColumns, leftColumns, rightColumns } = params;\n const allColumns = [...leftColumns, ...centerColumns, ...rightColumns];\n const firstColumn = allColumns[0];\n const lastColumn = allColumns[allColumns.length - 1];\n if (!firstColumn || !lastColumn) {\n const emptyRect = {\n x: 0,\n y: params.bodyTop,\n width: 0,\n height: params.bodyHeight,\n };\n return {\n layoutRect: emptyRect,\n clipRect: emptyRect,\n };\n }\n\n const contentLeft = firstColumn.drawX;\n const contentRight = lastColumn.drawX + lastColumn.width;\n const visibleRight =\n centerClipRect == null\n ? contentRight\n : Math.max(\n centerClipRect.x + centerClipRect.width,\n ...rightColumns.map((column) => column.drawX + column.width),\n );\n\n return {\n layoutRect: {\n x: contentLeft,\n y: params.bodyTop,\n width: Math.max(contentRight - contentLeft, 0),\n height: params.bodyHeight,\n },\n clipRect: {\n x: contentLeft,\n y: params.bodyTop,\n width: Math.max(Math.min(contentRight, visibleRight) - contentLeft, 0),\n height: params.bodyHeight,\n },\n };\n}\n\nfunction applyRowSpanToDescriptors(\n descriptors: RenderCellDescriptor[],\n startIndex: number,\n rowIndex: number,\n columnKey: string,\n rowSpan: number,\n) {\n for (let index = startIndex; index < descriptors.length; index += 1) {\n const descriptor = descriptors[index];\n if (\n descriptor.rowIndex === rowIndex &&\n descriptor.columnKey === columnKey\n ) {\n descriptor.rowSpan = rowSpan;\n }\n }\n}\n\nfunction resolveExpandedRowContentInset<RecordType>(\n params: DrawBodyParams<RecordType>,\n row: Extract<ListTableVisibleRow<RecordType>, { kind: \"expanded\" }>,\n) {\n const indentSize =\n params.expandableConfig?.indentSize ?? DEFAULT_EXPAND_INDENT_SIZE;\n return (\n CONTENT_HORIZONTAL_PADDING +\n row.depth * indentSize +\n EXPAND_TRIGGER_SIZE +\n EXPAND_TRIGGER_GAP\n );\n}\n\nfunction resolveCollapsedBoundaryMarkers<RecordType>(params: {\n rows: ListTableVisibleRow<RecordType>[];\n visibleRowIndex: number;\n row: Extract<ListTableVisibleRow<RecordType>, { kind: \"data\" }>;\n column: SegmentColumn<RecordType>;\n collapseConfig: DrawBodyParams<RecordType>[\"collapseConfig\"];\n}) {\n const { rows, visibleRowIndex, row, column, collapseConfig } = params;\n if (!collapseConfig || column.key !== collapseConfig.inlineColumnKey) {\n return [] as CollapseBoundaryMarker[];\n }\n\n const markers: CollapseBoundaryMarker[] = [];\n const previousRow = findVisibleDataRow(rows, visibleRowIndex, -1);\n const nextRow = findVisibleDataRow(rows, visibleRowIndex, 1);\n const totalRowCount = collapseConfig.totalRowCount ?? 0;\n\n if (previousRow && row.dataRowIndex > previousRow.dataRowIndex + 1) {\n const rangeStart = previousRow.dataRowIndex + 1;\n const rangeEnd = row.dataRowIndex - 1;\n markers.push(\n ...findCollapsedRanges(collapseConfig, rangeStart, rangeEnd).map(\n (range) => ({ ...range, position: \"top\" as const }),\n ),\n );\n } else if (!previousRow && row.dataRowIndex > 0) {\n const rangeEnd = row.dataRowIndex - 1;\n const rangeStart = findCollapsedRangeStart(collapseConfig, rangeEnd);\n if (rangeStart != null) {\n markers.push({ rangeStart, rangeEnd, position: \"top\" });\n }\n }\n\n if (!nextRow && totalRowCount > 0 && row.dataRowIndex < totalRowCount - 1) {\n const rangeStart = row.dataRowIndex + 1;\n const rangeEnd = findCollapsedRangeEnd(\n collapseConfig,\n rangeStart,\n totalRowCount - 1,\n );\n if (rangeEnd != null) {\n markers.push({ rangeStart, rangeEnd, position: \"bottom\" });\n }\n }\n\n return markers;\n}\n\nfunction findCollapsedRangeStart(\n collapseConfig: NonNullable<DrawBodyParams<unknown>[\"collapseConfig\"]>,\n rangeEnd: number,\n) {\n const indexes = collapseConfig.collapsedRowIndexes;\n if (!indexes?.has(rangeEnd)) {\n return null;\n }\n\n let rangeStart = rangeEnd;\n while (rangeStart > 0 && indexes.has(rangeStart - 1)) {\n rangeStart -= 1;\n }\n return rangeStart;\n}\n\nfunction findCollapsedRangeEnd(\n collapseConfig: NonNullable<DrawBodyParams<unknown>[\"collapseConfig\"]>,\n rangeStart: number,\n maximumRangeEnd: number,\n) {\n const indexes = collapseConfig.collapsedRowIndexes;\n if (!indexes?.has(rangeStart)) {\n return null;\n }\n\n let rangeEnd = rangeStart;\n while (rangeEnd < maximumRangeEnd && indexes.has(rangeEnd + 1)) {\n rangeEnd += 1;\n }\n return rangeEnd;\n}\n\nfunction findCollapsedRanges(\n collapseConfig: NonNullable<DrawBodyParams<unknown>[\"collapseConfig\"]>,\n rangeStart: number,\n rangeEnd: number,\n) {\n const indexes = collapseConfig.collapsedRowIndexes;\n if (!indexes || rangeStart > rangeEnd) {\n return [];\n }\n\n const ranges: Array<{ rangeStart: number; rangeEnd: number }> = [];\n let collapsedRangeStart: number | null = null;\n for (let index = rangeStart; index <= rangeEnd; index += 1) {\n if (indexes.has(index)) {\n collapsedRangeStart ??= index;\n continue;\n }\n if (collapsedRangeStart != null) {\n ranges.push({ rangeStart: collapsedRangeStart, rangeEnd: index - 1 });\n collapsedRangeStart = null;\n }\n }\n if (collapsedRangeStart != null) {\n ranges.push({ rangeStart: collapsedRangeStart, rangeEnd });\n }\n return ranges;\n}\n\nfunction findVisibleDataRow<RecordType>(\n rows: ListTableVisibleRow<RecordType>[],\n startIndex: number,\n step: -1 | 1,\n) {\n let currentIndex = startIndex + step;\n while (currentIndex >= 0 && currentIndex < rows.length) {\n const row = rows[currentIndex];\n if (row?.kind === \"data\") {\n return row;\n }\n currentIndex += step;\n }\n\n return null;\n}\n\nfunction isIndexInHighlightRange(\n index: number,\n range: ListTableRangeHighlightState[\"selectedRowRange\"],\n) {\n return Boolean(range && index >= range.start && index <= range.end);\n}\n\n/**\n * 判断合并单元格覆盖的行是否与高亮区间相交。\n */\nexport function isRowSpanInHighlightRange(\n rowIndex: number,\n rowSpan: number,\n range: ListTableRangeHighlightState[\"selectedRowRange\"],\n) {\n if (!range) {\n return false;\n }\n\n const spanStart = rowIndex;\n const spanEnd = rowIndex + Math.max(Math.floor(rowSpan), 1) - 1;\n return spanStart <= range.end && spanEnd >= range.start;\n}\n\nfunction buildMergedBodyCells<RecordType>(\n rows: ListTableVisibleRow<RecordType>[],\n columns: Array<SegmentColumn<RecordType>>,\n mergeCell?: ListTableMergeCellOptions,\n rowIndexMap?: number[],\n) {\n if (hasExpandedVisibleRows(rows)) {\n return buildPlainVisibleBodyCells({\n rows,\n columns,\n startRowIndex: 0,\n endRowIndex: rows.length,\n rowIndexMap,\n });\n }\n\n const dataRows = rows.filter(\n (row): row is Extract<ListTableVisibleRow<RecordType>, { kind: \"data\" }> =>\n row.kind === \"data\",\n );\n const records = dataRows.map((row) => row.record);\n const sourceRowIndexMap = dataRows.map((row) => row.dataRowIndex);\n const mergedCells: Array<MergedBodyCell<RecordType>> = [];\n const covered = new Set<string>();\n const spanConfigMap = buildSpanConfigMap(records, columns, sourceRowIndexMap);\n const autoRowSpanMap = buildAutoRowSpanMap(\n records,\n columns,\n mergeCell?.row,\n spanConfigMap,\n sourceRowIndexMap,\n );\n const autoColSpanMap = buildAutoColSpanMap(\n records,\n columns,\n mergeCell?.column?.keys,\n spanConfigMap,\n );\n\n for (let rowIndex = 0; rowIndex < dataRows.length; rowIndex += 1) {\n const record = records[rowIndex];\n const sourceRowIndex = sourceRowIndexMap[rowIndex] ?? rowIndex;\n const row = dataRows[rowIndex];\n if (!record || !row) {\n continue;\n }\n\n for (let columnIndex = 0; columnIndex < columns.length; columnIndex += 1) {\n const column = columns[columnIndex];\n const coverKey = getCellCoverKey(rowIndex, column.key);\n if (!column || covered.has(coverKey)) {\n continue;\n }\n\n const value = getValueByDataIndex(record, column.dataIndex);\n const spanConfig =\n spanConfigMap.get(getCellCoverKey(rowIndex, column.key)) ??\n column.onCell?.(value, record, sourceRowIndex, column);\n const hasExplicitRowSpan = hasExplicitSpan(spanConfig, \"rowSpan\");\n const hasExplicitColSpan = hasExplicitSpan(spanConfig, \"colSpan\");\n const rawRowSpan = hasExplicitRowSpan\n ? (spanConfig?.rowSpan ?? 1)\n : (autoRowSpanMap.get(coverKey) ?? 1);\n const rawColSpan = hasExplicitColSpan\n ? (spanConfig?.colSpan ?? 1)\n : (autoColSpanMap.get(coverKey) ?? 1);\n\n if (rawRowSpan === 0 || rawColSpan === 0) {\n covered.add(coverKey);\n continue;\n }\n\n const rowSpan = clampSpan(\n rawRowSpan,\n resolveContiguousRowSpanLimit(sourceRowIndexMap, rowIndex),\n );\n const colSpan = clampSpan(rawColSpan, columns.length - columnIndex);\n\n mergedCells.push({\n rowIndex,\n sourceRowIndex,\n rowSpan,\n columnIndex,\n colSpan,\n column,\n record,\n row,\n });\n\n for (let rowOffset = 0; rowOffset < rowSpan; rowOffset += 1) {\n for (let columnOffset = 0; columnOffset < colSpan; columnOffset += 1) {\n if (rowOffset === 0 && columnOffset === 0) {\n continue;\n }\n const coveredColumn = columns[columnIndex + columnOffset];\n if (!coveredColumn) {\n continue;\n }\n covered.add(getCellCoverKey(rowIndex + rowOffset, coveredColumn.key));\n }\n }\n }\n }\n\n return mergedCells;\n}\n\nexport function buildPlainVisibleBodyCells<RecordType>(params: {\n rows: ListTableVisibleRow<RecordType>[];\n columns: Array<SegmentColumn<RecordType>>;\n startRowIndex: number;\n endRowIndex: number;\n rowIndexMap?: number[];\n}) {\n const { rows, columns, startRowIndex, endRowIndex } = params;\n const visibleCells: Array<MergedBodyCell<RecordType>> = [];\n\n for (let rowIndex = startRowIndex; rowIndex < endRowIndex; rowIndex += 1) {\n const row = rows[rowIndex];\n if (!row) {\n continue;\n }\n\n if (row.kind === \"expanded\") {\n const firstColumn = columns[0];\n if (!firstColumn) {\n continue;\n }\n\n visibleCells.push({\n rowIndex,\n sourceRowIndex: row.ownerDataRowIndex,\n rowSpan: 1,\n columnIndex: 0,\n colSpan: columns.length,\n column: firstColumn,\n record: row.record,\n row,\n });\n continue;\n }\n\n const sourceRowIndex = row.dataRowIndex;\n\n for (let columnIndex = 0; columnIndex < columns.length; columnIndex += 1) {\n const column = columns[columnIndex];\n if (!column) {\n continue;\n }\n\n visibleCells.push({\n rowIndex,\n sourceRowIndex,\n rowSpan: 1,\n columnIndex,\n colSpan: 1,\n column,\n record: row.record,\n row,\n });\n }\n }\n\n return visibleCells;\n}\n\nfunction buildSpanConfigMap<RecordType>(\n rows: RecordType[],\n columns: Array<SegmentColumn<RecordType>>,\n rowIndexMap?: number[],\n) {\n const spanConfigMap = new Map<string, ListTableCellSpan | null | undefined>();\n\n rows.forEach((record, rowIndex) => {\n const sourceRowIndex = rowIndexMap?.[rowIndex] ?? rowIndex;\n\n columns.forEach((column) => {\n const value = getValueByDataIndex(record, column.dataIndex);\n spanConfigMap.set(\n getCellCoverKey(rowIndex, column.key),\n column.onCell?.(value, record, sourceRowIndex, column),\n );\n });\n });\n\n return spanConfigMap;\n}\n\nfunction buildAutoRowSpanMap<RecordType>(\n rows: RecordType[],\n columns: Array<SegmentColumn<RecordType>>,\n rule: ListTableMergeCellOptions[\"row\"],\n spanConfigMap: Map<string, ListTableCellSpan | null | undefined>,\n sourceRowIndexMap: number[],\n) {\n const autoRowSpanMap = new Map<string, number>();\n const groupKeys = rule?.keys;\n const targetColumns = getTargetMergeColumns(\n columns,\n rule?.columns?.length ? rule.columns : groupKeys,\n );\n\n targetColumns.forEach((column) => {\n let rowIndex = 0;\n\n while (rowIndex < rows.length) {\n const currentCellKey = getCellCoverKey(rowIndex, column.key);\n if (hasExplicitSpan(spanConfigMap.get(currentCellKey), \"rowSpan\")) {\n rowIndex += 1;\n continue;\n }\n\n const currentGroupKey = getMergeGroupKey(rows[rowIndex], groupKeys);\n let rowSpan = 1;\n\n for (let index = rowIndex + 1; index < rows.length; index += 1) {\n if (\n sourceRowIndexMap[index] !==\n (sourceRowIndexMap[index - 1] ?? index - 1) + 1\n ) {\n break;\n }\n\n const nextCellKey = getCellCoverKey(index, column.key);\n if (hasExplicitSpan(spanConfigMap.get(nextCellKey), \"rowSpan\")) {\n break;\n }\n\n if (getMergeGroupKey(rows[index], groupKeys) !== currentGroupKey) {\n break;\n }\n\n rowSpan += 1;\n }\n\n if (rowSpan > 1) {\n autoRowSpanMap.set(currentCellKey, rowSpan);\n for (let index = rowIndex + 1; index < rowIndex + rowSpan; index += 1) {\n autoRowSpanMap.set(getCellCoverKey(index, column.key), 0);\n }\n }\n\n rowIndex += rowSpan;\n }\n });\n\n return autoRowSpanMap;\n}\n\nfunction resolveContiguousRowSpanLimit(\n sourceRowIndexMap: number[],\n rowIndex: number,\n) {\n let rowSpan = 1;\n for (let index = rowIndex + 1; index < sourceRowIndexMap.length; index += 1) {\n const previousSourceIndex = sourceRowIndexMap[index - 1];\n const sourceIndex = sourceRowIndexMap[index];\n if (\n typeof previousSourceIndex !== \"number\" ||\n sourceIndex !== previousSourceIndex + 1\n ) {\n break;\n }\n rowSpan += 1;\n }\n return rowSpan;\n}\n\nfunction buildAutoColSpanMap<RecordType>(\n rows: RecordType[],\n columns: Array<SegmentColumn<RecordType>>,\n keys: Array<SegmentColumn<RecordType>[\"dataIndex\"]> | undefined,\n spanConfigMap: Map<string, ListTableCellSpan | null | undefined>,\n) {\n const autoColSpanMap = new Map<string, number>();\n const targetColumnIndexes = new Set(\n getTargetMergeColumns(columns, keys).map((column) =>\n columns.indexOf(column),\n ),\n );\n\n rows.forEach((record, rowIndex) => {\n let columnIndex = 0;\n\n while (columnIndex < columns.length) {\n const column = columns[columnIndex];\n if (!column || !targetColumnIndexes.has(columnIndex)) {\n columnIndex += 1;\n continue;\n }\n\n const currentCellKey = getCellCoverKey(rowIndex, column.key);\n if (hasExplicitSpan(spanConfigMap.get(currentCellKey), \"colSpan\")) {\n columnIndex += 1;\n continue;\n }\n\n const currentValue = getValueByDataIndex(record, column.dataIndex);\n let colSpan = 1;\n\n for (let index = columnIndex + 1; index < columns.length; index += 1) {\n if (!targetColumnIndexes.has(index)) {\n break;\n }\n\n const nextColumn = columns[index];\n if (!nextColumn) {\n break;\n }\n\n const nextCellKey = getCellCoverKey(rowIndex, nextColumn.key);\n if (hasExplicitSpan(spanConfigMap.get(nextCellKey), \"colSpan\")) {\n break;\n }\n\n const nextValue = getValueByDataIndex(record, nextColumn.dataIndex);\n if (!isSameMergeValue(currentValue, nextValue)) {\n break;\n }\n\n colSpan += 1;\n }\n\n if (colSpan > 1) {\n autoColSpanMap.set(currentCellKey, colSpan);\n for (\n let index = columnIndex + 1;\n index < columnIndex + colSpan;\n index += 1\n ) {\n const coveredColumn = columns[index];\n if (!coveredColumn) {\n continue;\n }\n autoColSpanMap.set(getCellCoverKey(rowIndex, coveredColumn.key), 0);\n }\n }\n\n columnIndex += colSpan;\n }\n });\n\n return autoColSpanMap;\n}\n\nfunction getTargetMergeColumns<RecordType>(\n columns: Array<SegmentColumn<RecordType>>,\n keys: Array<SegmentColumn<RecordType>[\"dataIndex\"]> | undefined,\n) {\n if (!keys?.length) {\n return [];\n }\n\n return columns.filter((column) =>\n keys.some((key) => isSameDataIndex(column.dataIndex, key)),\n );\n}\n\nfunction getCellCoverKey(rowIndex: number, columnKey: string) {\n return `${rowIndex}::${columnKey}`;\n}\n\nfunction hasExplicitSpan(\n spanConfig: ListTableCellSpan | null | undefined,\n key: keyof ListTableCellSpan,\n) {\n return !!spanConfig && Object.prototype.hasOwnProperty.call(spanConfig, key);\n}\n\nfunction clampSpan(span: number, max: number) {\n if (!Number.isFinite(span)) {\n return 1;\n }\n\n return Math.max(1, Math.min(Math.floor(span), max));\n}\n\nfunction getMergeGroupKey<RecordType>(\n record: RecordType,\n keys: Array<SegmentColumn<RecordType>[\"dataIndex\"]> | undefined,\n) {\n if (!keys?.length) {\n return \"\";\n }\n\n return keys\n .map((key) => normalizeMergeValue(getValueByDataIndex(record, key)))\n .join(\"|\");\n}\n\nfunction normalizeMergeValue(value: unknown) {\n if (value == null) {\n return \"\";\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n\n return JSON.stringify(value) ?? \"\";\n}\n\nfunction isSameMergeValue(left: unknown, right: unknown) {\n return normalizeMergeValue(left) === normalizeMergeValue(right);\n}\n\nfunction isSameDataIndex(\n left: SegmentColumn<unknown>[\"dataIndex\"],\n right: SegmentColumn<unknown>[\"dataIndex\"],\n) {\n const leftPath = Array.isArray(left) ? left : [left];\n const rightPath = Array.isArray(right) ? right : [right];\n\n if (leftPath.length !== rightPath.length) {\n return false;\n }\n\n return leftPath.every((key, index) => key === rightPath[index]);\n}\n\nfunction getMergedCellWidth<RecordType>(\n columns: Array<SegmentColumn<RecordType>>,\n startIndex: number,\n colSpan: number,\n) {\n let width = 0;\n for (let index = startIndex; index < startIndex + colSpan; index += 1) {\n width += columns[index]?.width ?? 0;\n }\n return width;\n}\n\nfunction drawBodyCell<RecordType>(\n ctx: CanvasRenderingContext2D,\n rect: { x: number; y: number; width: number; height: number },\n record: RecordType,\n rowIndex: number,\n column: SegmentColumn<RecordType>,\n theme: ListTableTheme,\n rowBackgroundColor: string | undefined,\n striped: boolean,\n hovered: boolean,\n selected: boolean,\n frozen: boolean,\n descriptors: RenderCellDescriptor[],\n row: Extract<ListTableVisibleRow<RecordType>, { kind: \"data\" }>,\n expandableConfig: DrawBodyParams<RecordType>[\"expandableConfig\"],\n collapseConfig: DrawBodyParams<RecordType>[\"collapseConfig\"],\n collapseBoundaryMarkers: CollapseBoundaryMarker[],\n getNestedTableHighlight: DrawBodyParams<RecordType>[\"getNestedTableHighlight\"],\n getControlAnimationProgress: DrawBodyParams<RecordType>[\"getControlAnimationProgress\"],\n requestRender: DrawBodyParams<RecordType>[\"requestRender\"],\n validationMessage: string | null,\n visibleRect: { x: number; y: number; width: number; height: number },\n) {\n ctx.save();\n const paintStyle = resolveBodyCellPaintStyle({\n theme,\n rowIndex,\n striped,\n hovered,\n selected,\n validationMessage,\n rowBackgroundColor,\n cellBackgroundColor: column.cellStyle?.backgroundColor,\n });\n ctx.fillStyle = paintStyle.backgroundColor;\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\n\n const contents = resolveBodyCellContents({\n record,\n rowIndex,\n column,\n });\n const contentRect = resolveBodyCellContentRect({\n ctx,\n rect,\n row,\n column,\n theme: paintStyle.theme,\n expandableConfig,\n collapseConfig,\n collapseBoundaryMarkers,\n descriptors,\n });\n const descriptorStartIndex = descriptors.length;\n const tooltipText = drawBodyCellContents({\n ctx,\n rect: contentRect,\n visibleRect,\n contents,\n rowIndex,\n column,\n theme: paintStyle.theme,\n frozen,\n hovered,\n descriptors,\n getNestedTableHighlight,\n getControlAnimationProgress,\n requestRender,\n });\n if (validationMessage) {\n applyValidationTooltipToDescriptors(\n descriptors,\n descriptorStartIndex,\n validationMessage,\n );\n }\n drawGridRect(ctx, rect, theme, theme.borderColor);\n\n ctx.restore();\n return validationMessage\n ? {\n text: validationMessage,\n variant: \"error\" as const,\n }\n : tooltipText\n ? {\n text: tooltipText,\n variant: \"default\" as const,\n }\n : null;\n}\n\nfunction resolveBodyCellContentRect<RecordType>(params: {\n ctx: CanvasRenderingContext2D;\n rect: { x: number; y: number; width: number; height: number };\n row: Extract<ListTableVisibleRow<RecordType>, { kind: \"data\" }>;\n column: SegmentColumn<RecordType>;\n theme: ListTableTheme;\n expandableConfig: DrawBodyParams<RecordType>[\"expandableConfig\"];\n collapseConfig: DrawBodyParams<RecordType>[\"collapseConfig\"];\n collapseBoundaryMarkers: CollapseBoundaryMarker[];\n descriptors: RenderCellDescriptor[];\n}) {\n const {\n ctx,\n rect,\n row,\n column,\n theme,\n expandableConfig,\n collapseConfig,\n collapseBoundaryMarkers,\n descriptors,\n } = params;\n\n const indentSize = expandableConfig?.indentSize ?? DEFAULT_EXPAND_INDENT_SIZE;\n const indentWidth = row.depth * indentSize;\n const isExpandColumn =\n expandableConfig != null &&\n column.key === expandableConfig.triggerColumnKey;\n const isInlineExpandColumn =\n expandableConfig != null && column.key === expandableConfig.inlineColumnKey;\n const isCollapseInlineColumn = column.key === collapseConfig?.inlineColumnKey;\n const shouldReserveCollapseSpace =\n isCollapseInlineColumn && collapseConfig?.reserveInlineSpace === true;\n let leadingWidth = 0;\n\n if (isExpandColumn) {\n leadingWidth = CONTENT_HORIZONTAL_PADDING + indentWidth;\n } else if (isInlineExpandColumn) {\n leadingWidth = indentWidth;\n }\n if (shouldReserveCollapseSpace) {\n leadingWidth = Math.max(\n leadingWidth,\n CONTENT_HORIZONTAL_PADDING +\n ROW_COLLAPSE_TRIGGER_WIDTH +\n COLLAPSE_TRIGGER_GAP,\n );\n }\n\n const shouldRenderExpandColumnTrigger = isExpandColumn && row.expandable;\n const shouldRenderInlineTrigger =\n isInlineExpandColumn &&\n row.expandable &&\n expandableConfig?.showExpandColumn !== true;\n const shouldRenderExpandIcon = expandableConfig?.showExpandIcon !== false;\n\n if (\n shouldRenderExpandIcon &&\n (shouldRenderExpandColumnTrigger || shouldRenderInlineTrigger)\n ) {\n const triggerRect = drawExpandTrigger({\n ctx,\n rect,\n rowIndex: row.dataRowIndex,\n columnKey: column.key,\n depth: row.depth,\n expanded: row.expanded,\n animationProgress: expandableConfig.getExpandAnimationProgress?.(\n row.rowKey,\n ),\n indentSize,\n centered:\n shouldRenderExpandColumnTrigger &&\n !shouldRenderInlineTrigger &&\n row.depth === 0,\n color: theme.textColor,\n borderColor: theme.borderColor,\n descriptors,\n });\n leadingWidth = Math.max(\n leadingWidth,\n triggerRect.x + triggerRect.width - rect.x + EXPAND_TRIGGER_GAP,\n );\n }\n\n if (isCollapseInlineColumn && collapseBoundaryMarkers.length > 0) {\n collapseBoundaryMarkers.forEach((marker) => {\n const triggerRect = drawCollapseTrigger({\n ctx,\n rect,\n rangeStart: marker.rangeStart,\n rangeEnd: marker.rangeEnd,\n columnKey: column.key,\n verticalAlign: marker.position,\n color: theme.textColor,\n descriptors,\n });\n leadingWidth = Math.max(\n leadingWidth,\n triggerRect.x + triggerRect.width - rect.x + COLLAPSE_TRIGGER_GAP,\n );\n });\n }\n\n if (leadingWidth <= 0) {\n return rect;\n }\n\n return {\n ...rect,\n x: rect.x + leadingWidth,\n width: Math.max(rect.width - leadingWidth, 0),\n };\n}\n\nfunction drawExpandTrigger(params: {\n ctx: CanvasRenderingContext2D;\n rect: { x: number; y: number; width: number; height: number };\n rowIndex: number;\n columnKey: string;\n depth: number;\n expanded: boolean;\n animationProgress?: number;\n indentSize: number;\n centered?: boolean;\n verticalAlign?: \"top\" | \"center\" | \"bottom\";\n color: string;\n borderColor: string;\n descriptors: RenderCellDescriptor[];\n}) {\n const {\n ctx,\n rect,\n rowIndex,\n columnKey,\n depth,\n expanded,\n animationProgress,\n indentSize,\n centered,\n verticalAlign,\n color,\n borderColor,\n descriptors,\n } = params;\n const resolvedVerticalAlign = centered\n ? \"center\"\n : (verticalAlign ?? \"center\");\n const triggerRect = {\n x: centered\n ? rect.x + Math.max((rect.width - EXPAND_TRIGGER_SIZE) / 2, 0)\n : rect.x + CONTENT_HORIZONTAL_PADDING + depth * indentSize,\n y:\n resolvedVerticalAlign === \"top\"\n ? rect.y + 2\n : resolvedVerticalAlign === \"bottom\"\n ? rect.y + Math.max(rect.height - EXPAND_TRIGGER_SIZE - 2, 0)\n : rect.y + Math.max((rect.height - EXPAND_TRIGGER_SIZE) / 2, 0),\n width: EXPAND_TRIGGER_SIZE,\n height: EXPAND_TRIGGER_SIZE,\n };\n const lines = resolveExpandTriggerLines({\n rect: triggerRect,\n progress:\n typeof animationProgress === \"number\"\n ? animationProgress\n : expanded\n ? 1\n : 0,\n });\n\n ctx.save();\n ctx.fillStyle = \"#ffffff\";\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n appendRoundedRectPath(ctx, triggerRect, 2);\n ctx.fill();\n ctx.stroke();\n\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.lineCap = \"round\";\n ctx.beginPath();\n ctx.moveTo(lines.horizontal.start.x, lines.horizontal.start.y);\n ctx.lineTo(lines.horizontal.end.x, lines.horizontal.end.y);\n if (lines.vertical) {\n ctx.moveTo(lines.vertical.start.x, lines.vertical.start.y);\n ctx.lineTo(lines.vertical.end.x, lines.vertical.end.y);\n }\n ctx.stroke();\n ctx.restore();\n\n descriptors.push({\n kind: \"expand-trigger\",\n rect: triggerRect,\n rowIndex,\n columnKey,\n cursor: \"pointer\",\n });\n\n return triggerRect;\n}\n\nexport function resolveExpandTriggerLines(params: {\n rect: { x: number; y: number; width: number; height: number };\n progress: number;\n}) {\n const { rect } = params;\n const progress = Math.min(Math.max(params.progress, 0), 1);\n const centerX = rect.x + rect.width / 2;\n const centerY = rect.y + rect.height / 2;\n const halfLineLength = 3;\n const rotation = progress * (Math.PI / 2);\n const verticalOffsetX = Math.sin(rotation) * halfLineLength;\n const verticalOffsetY = Math.cos(rotation) * halfLineLength;\n return {\n horizontal: {\n start: { x: centerX - halfLineLength, y: centerY },\n end: { x: centerX + halfLineLength, y: centerY },\n },\n vertical: {\n start: {\n x: centerX - verticalOffsetX,\n y: centerY - verticalOffsetY,\n },\n end: {\n x: centerX + verticalOffsetX,\n y: centerY + verticalOffsetY,\n },\n },\n };\n}\n\nfunction appendRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: { x: number; y: number; width: number; height: number },\n radius: number,\n) {\n const resolvedRadius = Math.min(radius, rect.width / 2, rect.height / 2);\n ctx.moveTo(rect.x + resolvedRadius, rect.y);\n ctx.arcTo(\n rect.x + rect.width,\n rect.y,\n rect.x + rect.width,\n rect.y + rect.height,\n resolvedRadius,\n );\n ctx.arcTo(\n rect.x + rect.width,\n rect.y + rect.height,\n rect.x,\n rect.y + rect.height,\n resolvedRadius,\n );\n ctx.arcTo(rect.x, rect.y + rect.height, rect.x, rect.y, resolvedRadius);\n ctx.arcTo(rect.x, rect.y, rect.x + rect.width, rect.y, resolvedRadius);\n ctx.closePath();\n}\n\nfunction drawCollapseTrigger(params: {\n ctx: CanvasRenderingContext2D;\n rect: { x: number; y: number; width: number; height: number };\n rangeStart: number;\n rangeEnd: number;\n columnKey: string;\n verticalAlign: \"top\" | \"bottom\";\n color: string;\n descriptors: RenderCellDescriptor[];\n}) {\n const {\n ctx,\n rect,\n rangeStart,\n rangeEnd,\n columnKey,\n verticalAlign,\n color,\n descriptors,\n } = params;\n const triggerRect = {\n x: rect.x + CONTENT_HORIZONTAL_PADDING,\n y:\n verticalAlign === \"top\"\n ? rect.y + GRID_LINE_OFFSET - ROW_COLLAPSE_TRIGGER_HEIGHT / 2\n : rect.y +\n rect.height +\n GRID_LINE_OFFSET -\n ROW_COLLAPSE_TRIGGER_HEIGHT / 2,\n width: ROW_COLLAPSE_TRIGGER_WIDTH,\n height: ROW_COLLAPSE_TRIGGER_HEIGHT,\n };\n drawCollapseTriggerCapsule(ctx, triggerRect);\n drawCollapseTriggerGlyph(ctx, triggerRect, \"vertical\", color);\n\n descriptors.push({\n kind: \"collapse-trigger\",\n rect: triggerRect,\n rowIndex: rangeStart,\n columnKey,\n cursor: \"pointer\",\n contentKey: `${rangeStart}:${rangeEnd}`,\n });\n\n return triggerRect;\n}\n\nexport function resolveCollapseTriggerPolyline(params: {\n rect: { x: number; y: number; width: number; height: number };\n verticalAlign: \"top\" | \"bottom\";\n}) {\n const segments = resolveCollapseTriggerGlyphSegments(params.rect, \"vertical\");\n return params.verticalAlign === \"top\" ? segments[0] : segments[1];\n}\n\nexport function resolveBodyCellPaintStyle(params: {\n theme: ListTableTheme;\n rowIndex: number;\n striped: boolean;\n hovered: boolean;\n selected: boolean;\n validationMessage: string | null;\n rowBackgroundColor?: string;\n cellBackgroundColor?: string;\n}) {\n const {\n theme,\n rowIndex,\n striped,\n hovered,\n selected,\n validationMessage,\n rowBackgroundColor,\n cellBackgroundColor,\n } = params;\n const baseBackgroundColor =\n rowBackgroundColor ??\n cellBackgroundColor ??\n (striped && rowIndex % 2 === 1\n ? theme.stripedBackgroundColor\n : theme.backgroundColor);\n\n if (validationMessage) {\n return {\n backgroundColor: VALIDATION_ERROR_COLOR,\n theme: {\n ...theme,\n textColor: VALIDATION_TEXT_COLOR,\n mutedTextColor: VALIDATION_MUTED_TEXT_COLOR,\n },\n };\n }\n\n return {\n backgroundColor: selected\n ? theme.selectionBackgroundColor\n : hovered\n ? theme.hoverBackgroundColor\n : baseBackgroundColor,\n theme,\n };\n}\n\n/**\n * 在表体上方绘制拖拽幽灵列(整列半透明)。\n */\nfunction drawDragGhostColumn<RecordType>(params: DrawBodyParams<RecordType>) {\n const dragState = params.dragReorder;\n if (!dragState) return;\n\n const { ctx, rows, bodyTop, bodyHeight, theme } = params;\n\n // 从所有分段列中查找源列\n const allColumns = [\n ...params.leftColumns,\n ...params.centerColumns,\n ...params.rightColumns,\n ];\n const sourceColumns = allColumns.filter((column) =>\n isDragSourceColumn(column, dragState),\n );\n if (sourceColumns.length === 0 || rows.length === 0) return;\n\n const ghostWidth = sourceColumns.reduce(\n (sum, column) => sum + column.width,\n 0,\n );\n const ghostX = dragState.currentX - ghostWidth / 2;\n\n ctx.save();\n\n // 半透明列背景(与表头拖拽风格一致)\n ctx.globalAlpha = 0.85;\n ctx.fillStyle = theme.headerBackgroundColor;\n ctx.fillRect(ghostX, bodyTop, ghostWidth, bodyHeight);\n ctx.globalAlpha = 1;\n\n // 蓝色边框\n ctx.strokeStyle = \"#1677ff\";\n ctx.lineWidth = 1.5;\n ctx.strokeRect(ghostX, bodyTop, ghostWidth, bodyHeight);\n\n ctx.restore();\n}\n\nfunction isDragSourceColumn<RecordType>(\n column: SegmentColumn<RecordType>,\n dragState: NonNullable<DrawBodyParams<RecordType>[\"dragReorder\"]>,\n) {\n if (dragState.sourceColumnKeys?.length) {\n return dragState.sourceColumnKeys.includes(column.key);\n }\n\n return (\n column.leafIndex >= dragState.sourceLeafStartIndex &&\n column.leafIndex <= dragState.sourceLeafEndIndex\n );\n}\n\nfunction applyValidationTooltipToDescriptors(\n descriptors: RenderCellDescriptor[],\n startIndex: number,\n message: string,\n) {\n for (let index = startIndex; index < descriptors.length; index += 1) {\n const descriptor = descriptors[index];\n if (\n descriptor.kind !== \"body-content\" &&\n descriptor.kind !== \"body-control\"\n ) {\n continue;\n }\n descriptor.tooltipText = message;\n descriptor.tooltipVariant = \"error\";\n }\n}\n\nfunction shouldBuildMergedBodyCells<RecordType>(\n rows: ListTableVisibleRow<RecordType>[],\n columns: Array<SegmentColumn<RecordType>>,\n mergeCell?: ListTableMergeCellOptions,\n) {\n if (hasExpandedVisibleRows(rows)) {\n return false;\n }\n\n if (mergeCell?.row || mergeCell?.column) {\n return true;\n }\n\n return columns.some((column) => typeof column.onCell === \"function\");\n}\n\n/**\n * 计算展开内容行动画期间的可见区域。\n */\nexport function resolveExpandedRowAnimationLayout(\n rect: { x: number; y: number; width: number; height: number },\n animationProgress?: number,\n) {\n const progress =\n typeof animationProgress === \"number\" && Number.isFinite(animationProgress)\n ? Math.min(Math.max(animationProgress, 0), 1)\n : 1;\n\n return {\n progress,\n visibleRect: {\n ...rect,\n height: rect.height * progress,\n },\n };\n}\n\nfunction drawAnimatedExpandedBodyCell<RecordType>(params: {\n ctx: CanvasRenderingContext2D;\n rect: { x: number; y: number; width: number; height: number };\n visibleRect: { x: number; y: number; width: number; height: number };\n progress: number;\n row: Extract<ListTableVisibleRow<RecordType>, { kind: \"expanded\" }>;\n theme: ListTableTheme;\n rowBackgroundColor?: string;\n striped: boolean;\n descriptors: RenderCellDescriptor[];\n clipRect: { x: number; y: number; width: number; height: number };\n segment: \"left\" | \"center\" | \"right\";\n segments: { hasLeft: boolean; hasCenter: boolean };\n contentInset: number;\n getNestedTableHighlight: DrawBodyParams<RecordType>[\"getNestedTableHighlight\"];\n}) {\n const { ctx, rect, visibleRect, progress } = params;\n if (visibleRect.height <= 0) {\n return undefined;\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(visibleRect.x, visibleRect.y, visibleRect.width, visibleRect.height);\n ctx.clip();\n ctx.globalAlpha = progress;\n const contentVisibleRect = intersectRects(visibleRect, params.clipRect);\n if (!contentVisibleRect) {\n ctx.restore();\n return undefined;\n }\n\n const tooltip = drawExpandedBodyCell(\n ctx,\n rect,\n params.row,\n params.theme,\n params.rowBackgroundColor,\n params.striped,\n params.descriptors,\n contentVisibleRect,\n params.segment,\n params.segments,\n params.contentInset,\n params.getNestedTableHighlight,\n );\n ctx.restore();\n return tooltip;\n}\n\nfunction drawExpandedBodyCell<RecordType>(\n ctx: CanvasRenderingContext2D,\n rect: { x: number; y: number; width: number; height: number },\n row: Extract<ListTableVisibleRow<RecordType>, { kind: \"expanded\" }>,\n theme: ListTableTheme,\n rowBackgroundColor: string | undefined,\n striped: boolean,\n descriptors: RenderCellDescriptor[],\n visibleRect: { x: number; y: number; width: number; height: number },\n segment: \"left\" | \"center\" | \"right\",\n segments: { hasLeft: boolean; hasCenter: boolean },\n contentInset: number,\n getNestedTableHighlight: DrawBodyParams<RecordType>[\"getNestedTableHighlight\"],\n) {\n ctx.save();\n ctx.fillStyle =\n rowBackgroundColor ??\n (striped && row.ownerDataRowIndex % 2 === 1\n ? theme.stripedBackgroundColor\n : theme.backgroundColor);\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\n drawGridRect(ctx, rect, theme, theme.borderColor);\n\n const shouldRenderContent =\n (segment === \"center\" && segments.hasCenter) ||\n (segment === \"left\" && !segments.hasCenter && segments.hasLeft) ||\n (segment === \"right\" && !segments.hasCenter && !segments.hasLeft);\n\n if (shouldRenderContent) {\n const contents = normalizeCellContents(row.content.value as never);\n const contentRect = {\n ...rect,\n x: rect.x + contentInset,\n width: Math.max(rect.width - contentInset, 0),\n };\n const contentVisibleRect = intersectRects(visibleRect, contentRect);\n if (!contentVisibleRect) {\n ctx.restore();\n return null;\n }\n const virtualColumn = {\n key: \"__expanded_row__\",\n title: \"\",\n titleContent: [],\n dataIndex: \"__expanded_row__\",\n drawX: contentRect.x,\n width: contentRect.width,\n minWidth: contentRect.width,\n maxWidth: contentRect.width,\n depth: 0,\n parentKey: null,\n leafIndex: 0,\n align: \"left\" as const,\n } satisfies SegmentColumn<RecordType>;\n drawBodyCellContents({\n ctx,\n rect: contentRect,\n visibleRect: contentVisibleRect,\n contents,\n rowIndex: row.ownerDataRowIndex,\n column: virtualColumn,\n theme,\n frozen: false,\n hovered: false,\n descriptors,\n getNestedTableHighlight,\n getControlAnimationProgress: undefined,\n requestRender: undefined,\n skipNestedTableOuterBorders: resolveExpandedRowNestedTableSkipBorders(\n contents,\n contentRect,\n ),\n });\n }\n\n ctx.restore();\n return null;\n}\n\nfunction resolveExpandedRowNestedTableSkipBorders<RecordType>(\n contents: ListTableCellContent<RecordType>[],\n contentRect: { height: number },\n) {\n if (contents.length !== 1 || contents[0]?.type !== \"table\") {\n return undefined;\n }\n\n return {\n right: true,\n bottom: measureNestedTableContentHeight(contents[0]) >= contentRect.height,\n };\n}\n\nexport function resolveBodySegmentClipRect(params: {\n minX: number;\n totalWidth: number;\n bodyTop: number;\n bodyHeight: number;\n segment: \"left\" | \"center\" | \"right\";\n centerClipRect?: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null;\n}) {\n const { minX, totalWidth, bodyTop, bodyHeight, segment, centerClipRect } =\n params;\n if (segment === \"center\" && centerClipRect) {\n return {\n ...centerClipRect,\n y: centerClipRect.y - COLLAPSE_TRIGGER_CLIP_OVERFLOW,\n height: centerClipRect.height + COLLAPSE_TRIGGER_CLIP_OVERFLOW * 2,\n };\n }\n\n return {\n x: minX,\n y: bodyTop - COLLAPSE_TRIGGER_CLIP_OVERFLOW,\n width: totalWidth,\n height: bodyHeight + COLLAPSE_TRIGGER_CLIP_OVERFLOW * 2,\n };\n}\n\nfunction intersectRects(\n left: { x: number; y: number; width: number; height: number },\n right: { x: number; y: number; width: number; height: number },\n) {\n const x = Math.max(left.x, right.x);\n const y = Math.max(left.y, right.y);\n const maxX = Math.min(left.x + left.width, right.x + right.width);\n const maxY = Math.min(left.y + left.height, right.y + right.height);\n\n if (maxX <= x || maxY <= y) {\n return null;\n }\n\n return {\n x,\n y,\n width: maxX - x,\n height: maxY - y,\n };\n}\n\nfunction resolveVisibleBodyRowRange<RecordType>(params: {\n rows: ListTableVisibleRow<RecordType>[];\n rowHeight: number;\n bodyHeight: number;\n scrollTop: number;\n rowOffsets: number[] | null;\n}) {\n const { rows, rowHeight, bodyHeight, scrollTop, rowOffsets } = params;\n if (rows.length === 0 || rowHeight <= 0 || bodyHeight <= 0) {\n return {\n start: 0,\n end: 0,\n };\n }\n\n if (!rowOffsets) {\n const start = Math.max(Math.floor(scrollTop / rowHeight), 0);\n const visibleRowCount = Math.ceil(bodyHeight / rowHeight) + 1;\n return {\n start,\n end: Math.min(start + visibleRowCount, rows.length),\n };\n }\n\n let start = 0;\n while (start < rows.length) {\n const nextOffset = rowOffsets[start + 1] ?? 0;\n if (nextOffset > scrollTop) {\n break;\n }\n start += 1;\n }\n\n let end = start;\n let visibleHeight = (rowOffsets[start] ?? 0) - scrollTop;\n while (end < rows.length && visibleHeight < bodyHeight + rowHeight) {\n visibleHeight += getVisibleRowHeight(rows[end], rowHeight);\n end += 1;\n }\n\n return {\n start,\n end,\n };\n}\n\nfunction buildVisibleRowOffsets<RecordType>(\n rows: ListTableVisibleRow<RecordType>[],\n rowHeight: number,\n) {\n if (!hasExpandedVisibleRows(rows)) {\n return null;\n }\n\n const offsets = [0];\n rows.forEach((row) => {\n offsets.push(\n offsets[offsets.length - 1] + getVisibleRowHeight(row, rowHeight),\n );\n });\n return offsets;\n}\n\nfunction resolveVisibleRowOffset(\n rowOffsets: number[] | null,\n rowIndex: number,\n rowHeight: number,\n) {\n return rowOffsets?.[rowIndex] ?? rowIndex * rowHeight;\n}\n\nfunction getCellHeight<RecordType>(params: {\n rows: ListTableVisibleRow<RecordType>[];\n rowIndex: number;\n rowSpan: number;\n rowHeight: number;\n}) {\n return sumVisibleRowHeights({\n rows: params.rows,\n rowHeight: params.rowHeight,\n start: params.rowIndex,\n end: params.rowIndex + params.rowSpan,\n });\n}\n","import type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\nimport type { SegmentColumn } from \"../../domain/columns/segment-column\";\nimport { drawBody } from \"../primitives/draw-body\";\nimport type { NestedTableHighlightState } from \"../cell-content/types\";\nimport type {\n ListTableRangeHighlightState,\n ListTableSelectionState,\n HoverState,\n ScrollState,\n} from \"../../schema/state\";\nimport type { ListTableTheme } from \"../../schema/style\";\nimport type { ListTableMergeCellOptions } from \"../../schema/table-options\";\nimport type { ListTableHighlightMode } from \"../../schema/table-options\";\nimport type {\n FrozenRowLayout,\n RowSection,\n} from \"../../domain/rows/frozen-rows\";\nimport type { BodyDragReorderState } from \"../../domain/types\";\nimport type { Rect } from \"../../debug/debug-snapshot\";\nimport type { ListTableVisibleRow } from \"../../services/expandable-service\";\n\nexport interface DrawBodySectionParams<RecordType> {\n ctx: CanvasRenderingContext2D;\n section: RowSection<ListTableVisibleRow<RecordType>>;\n rowHeight: number;\n bodyTop: number;\n bodyHeight: number;\n leftColumns: Array<SegmentColumn<RecordType>>;\n centerColumns: Array<SegmentColumn<RecordType>>;\n rightColumns: Array<SegmentColumn<RecordType>>;\n centerClipRect?: Rect | null;\n scroll: ScrollState;\n scrollTop: number;\n theme: ListTableTheme;\n rowBackgroundColor?: string;\n frozen?: boolean;\n striped?: boolean;\n hover: HoverState;\n selection: ListTableSelectionState;\n selectedHeaderKey: string | null;\n rangeHighlight: ListTableRangeHighlightState;\n highlightMode?: ListTableHighlightMode;\n mergeCell?: ListTableMergeCellOptions;\n descriptors: RenderCellDescriptor[];\n collapseConfig?: {\n inlineColumnKey: string | null;\n totalRowCount?: number;\n reserveInlineSpace?: boolean;\n collapsedRowIndexes?: ReadonlySet<number>;\n };\n expandableConfig?: {\n indentSize?: number;\n showExpandIcon?: boolean;\n showExpandColumn?: boolean;\n triggerColumnKey: string;\n inlineColumnKey: string | null;\n getExpandAnimationProgress?: (\n rowKey: string | number,\n ) => number | undefined;\n };\n getCollapseRowOffset?: (rowKey: string | number) => number | undefined;\n getCollapseCellHeight?: (params: {\n rowIndex: number;\n columnKey: string;\n }) => number | undefined;\n dragReorder?: BodyDragReorderState | null;\n getControlAnimationProgress?: (params: {\n rowIndex: number;\n columnKey: string;\n contentIndex: number;\n }) => number | undefined;\n getNestedTableHighlight?: (params: {\n rowIndex: number;\n columnKey: string;\n contentIndex: number;\n }) => NestedTableHighlightState | null | undefined;\n getValidationMessage?: (params: {\n record: RecordType;\n rowIndex: number;\n columnKey: string;\n }) => string | null;\n requestRender?: () => void;\n}\n\nexport interface DrawListTableBodySectionsParams<RecordType> {\n ctx: CanvasRenderingContext2D;\n sections: FrozenRowLayout<ListTableVisibleRow<RecordType>>;\n rowHeight: number;\n width: number;\n headerHeight: number;\n topFrozenHeight: number;\n scrollBodyTop: number;\n scrollBodyHeight: number;\n bottomFrozenTop: number;\n bottomFrozenHeight: number;\n leftColumns: Array<SegmentColumn<RecordType>>;\n centerColumns: Array<SegmentColumn<RecordType>>;\n rightColumns: Array<SegmentColumn<RecordType>>;\n centerClipRect?: Rect | null;\n scroll: ScrollState;\n theme: ListTableTheme;\n striped?: boolean;\n hover: HoverState;\n selection: ListTableSelectionState;\n selectedHeaderKey: string | null;\n rangeHighlight: ListTableRangeHighlightState;\n highlightMode?: ListTableHighlightMode;\n mergeCell?: ListTableMergeCellOptions;\n descriptors: RenderCellDescriptor[];\n collapseConfig?: {\n inlineColumnKey: string | null;\n totalRowCount?: number;\n reserveInlineSpace?: boolean;\n collapsedRowIndexes?: ReadonlySet<number>;\n };\n expandableConfig?: {\n indentSize?: number;\n showExpandIcon?: boolean;\n showExpandColumn?: boolean;\n triggerColumnKey: string;\n inlineColumnKey: string | null;\n getExpandAnimationProgress?: (\n rowKey: string | number,\n ) => number | undefined;\n };\n getCollapseRowOffset?: (rowKey: string | number) => number | undefined;\n getCollapseCellHeight?: (params: {\n rowIndex: number;\n columnKey: string;\n }) => number | undefined;\n dragReorder?: BodyDragReorderState | null;\n getControlAnimationProgress?: (params: {\n rowIndex: number;\n columnKey: string;\n contentIndex: number;\n }) => number | undefined;\n getNestedTableHighlight?: (params: {\n rowIndex: number;\n columnKey: string;\n contentIndex: number;\n }) => NestedTableHighlightState | null | undefined;\n getValidationMessage?: (params: {\n record: RecordType;\n rowIndex: number;\n columnKey: string;\n }) => string | null;\n requestRender?: () => void;\n}\n\n/**\n * 绘制列表表格的全部表体区段。\n */\nexport function drawListTableBodySections<RecordType>(\n params: DrawListTableBodySectionsParams<RecordType>,\n) {\n const baseParams = {\n ctx: params.ctx,\n rowHeight: params.rowHeight,\n leftColumns: params.leftColumns,\n centerColumns: params.centerColumns,\n rightColumns: params.rightColumns,\n centerClipRect: params.centerClipRect,\n scroll: params.scroll,\n theme: params.theme,\n striped: params.striped,\n hover: params.hover,\n selection: params.selection,\n selectedHeaderKey: params.selectedHeaderKey,\n rangeHighlight: params.rangeHighlight,\n highlightMode: params.highlightMode,\n mergeCell: params.mergeCell,\n descriptors: params.descriptors,\n collapseConfig: params.collapseConfig,\n expandableConfig: params.expandableConfig,\n getCollapseRowOffset: params.getCollapseRowOffset,\n getCollapseCellHeight: params.getCollapseCellHeight,\n dragReorder: params.dragReorder,\n getControlAnimationProgress: params.getControlAnimationProgress,\n getNestedTableHighlight: params.getNestedTableHighlight,\n getValidationMessage: params.getValidationMessage,\n requestRender: params.requestRender,\n };\n\n drawBodySection({\n ...baseParams,\n section: params.sections.scroll,\n bodyTop: params.scrollBodyTop,\n bodyHeight: params.scrollBodyHeight,\n scrollTop: params.scroll.top,\n });\n drawBodySection({\n ...baseParams,\n section: params.sections.top,\n bodyTop: params.headerHeight,\n bodyHeight: params.topFrozenHeight,\n scrollTop: 0,\n rowBackgroundColor: params.theme.frozenRowBackgroundColor,\n frozen: true,\n collapseConfig: undefined,\n });\n drawBodySection({\n ...baseParams,\n section: params.sections.bottom,\n bodyTop: params.bottomFrozenTop,\n bodyHeight: params.bottomFrozenHeight,\n scrollTop: 0,\n rowBackgroundColor: params.theme.frozenRowBackgroundColor,\n frozen: true,\n collapseConfig: undefined,\n });\n\n if (params.topFrozenHeight > 0) {\n drawFrozenTopBottomBorder({\n ctx: params.ctx,\n width: params.width,\n y: params.headerHeight + params.topFrozenHeight,\n borderColor: params.theme.borderColor,\n });\n }\n}\n\n/**\n * 绘制一个表体行区段。\n */\nfunction drawBodySection<RecordType>(\n params: DrawBodySectionParams<RecordType>,\n) {\n const { section, bodyHeight } = params;\n if (section.rows.length === 0 || bodyHeight <= 0) {\n return;\n }\n\n drawBody({\n ctx: params.ctx,\n rows: section.rows,\n rowIndexMap: section.rowIndexMap,\n rowHeight: params.rowHeight,\n bodyTop: params.bodyTop,\n bodyHeight,\n leftColumns: params.leftColumns,\n centerColumns: params.centerColumns,\n rightColumns: params.rightColumns,\n centerClipRect: params.centerClipRect\n ? {\n x: params.centerClipRect.x,\n y: params.bodyTop,\n width: params.centerClipRect.width,\n height: bodyHeight,\n }\n : null,\n scroll: {\n ...params.scroll,\n top: params.scrollTop,\n },\n theme: params.theme,\n rowBackgroundColor: params.rowBackgroundColor,\n frozen: params.frozen,\n striped: params.striped,\n hover: params.hover,\n selection: params.selection,\n selectedHeaderKey: params.selectedHeaderKey,\n rangeHighlight: params.rangeHighlight,\n highlightMode: params.highlightMode,\n mergeCell: params.mergeCell,\n descriptors: params.descriptors,\n collapseConfig: params.collapseConfig,\n expandableConfig: params.expandableConfig,\n getCollapseRowOffset: params.getCollapseRowOffset,\n getCollapseCellHeight: params.getCollapseCellHeight,\n dragReorder: params.dragReorder,\n getControlAnimationProgress: params.getControlAnimationProgress,\n getNestedTableHighlight: params.getNestedTableHighlight,\n getValidationMessage: params.getValidationMessage,\n requestRender: params.requestRender,\n });\n}\n\n/**\n * 绘制顶部冻结行底部分隔线。\n */\nfunction drawFrozenTopBottomBorder(params: {\n ctx: CanvasRenderingContext2D;\n width: number;\n y: number;\n borderColor: string;\n}) {\n const { ctx, width, y, borderColor } = params;\n\n ctx.save();\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, y - 0.5);\n ctx.lineTo(width, y - 0.5);\n ctx.stroke();\n ctx.restore();\n}\n\n/**\n * 在最上层绘制拖拽列外框,确保边框不被其他层覆盖。\n */\nexport function drawDragOverlayFrame<RecordType>(params: {\n ctx: CanvasRenderingContext2D;\n columns: InternalLeafColumn<RecordType>[];\n dragReorder: BodyDragReorderState | null;\n headerHeight: number;\n bodyHeight: number;\n hasSummary: boolean;\n summaryRowHeight: number;\n}) {\n const {\n ctx,\n columns,\n dragReorder,\n headerHeight,\n bodyHeight,\n hasSummary,\n summaryRowHeight,\n } = params;\n if (!dragReorder) {\n return;\n }\n\n const sourceColumns = columns.filter((column) =>\n isDragSourceColumn(column, dragReorder),\n );\n if (sourceColumns.length === 0) {\n return;\n }\n\n const ghostWidth = sourceColumns.reduce(\n (sum, column) => sum + column.width,\n 0,\n );\n const ghostX = dragReorder.currentX - ghostWidth / 2;\n const ghostHeight =\n headerHeight + bodyHeight + (hasSummary ? summaryRowHeight : 0);\n\n ctx.save();\n ctx.strokeStyle = \"#1677ff\";\n ctx.lineWidth = 2;\n ctx.strokeRect(ghostX, 0, ghostWidth, ghostHeight);\n ctx.restore();\n}\n\n/**\n * 绘制固定左侧列的右边界,避免固定区和滚动区视觉粘连。\n */\nexport function drawFixedLeftBoundary(params: {\n ctx: CanvasRenderingContext2D;\n fixedWidthLeft: number;\n height: number;\n borderColor: string;\n skipRanges?: Array<{ start: number; end: number }>;\n}) {\n const { ctx, fixedWidthLeft, height, borderColor, skipRanges = [] } = params;\n if (fixedWidthLeft <= 0 || height <= 0) {\n return;\n }\n\n const x = Math.round(fixedWidthLeft) + 0.5;\n const ranges = mergeBoundarySkipRanges(skipRanges, height);\n\n ctx.save();\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n let startY = 0;\n ranges.forEach((range) => {\n if (range.start > startY) {\n ctx.moveTo(x, startY);\n ctx.lineTo(x, range.start);\n }\n startY = Math.max(startY, range.end);\n });\n if (startY < height) {\n ctx.moveTo(x, startY);\n ctx.lineTo(x, height);\n }\n ctx.stroke();\n ctx.restore();\n}\n\nfunction mergeBoundarySkipRanges(\n skipRanges: Array<{ start: number; end: number }>,\n height: number,\n) {\n const ranges = skipRanges\n .map((range) => ({\n start: Math.max(Math.min(range.start, height), 0),\n end: Math.max(Math.min(range.end, height), 0),\n }))\n .filter((range) => range.end > range.start)\n .sort((left, right) => left.start - right.start);\n\n return ranges.reduce<Array<{ start: number; end: number }>>(\n (result, range) => {\n const previous = result[result.length - 1];\n if (!previous || range.start > previous.end) {\n result.push({ ...range });\n return result;\n }\n\n previous.end = Math.max(previous.end, range.end);\n return result;\n },\n [],\n );\n}\n\nfunction isDragSourceColumn<RecordType>(\n column: InternalLeafColumn<RecordType>,\n dragReorder: BodyDragReorderState,\n) {\n if (dragReorder.sourceColumnKeys.length > 0) {\n return dragReorder.sourceColumnKeys.includes(column.key);\n }\n\n return (\n column.leafIndex >= dragReorder.sourceLeafStartIndex &&\n column.leafIndex <= dragReorder.sourceLeafEndIndex\n );\n}\n","import type { HeaderActionVisibilityState } from \"../../schema/state\";\r\n\r\nconst ACTION_GAP = 4;\r\nconst ACTION_SIZE = 14;\r\nconst ACTION_PADDING_INLINE = 10;\r\nconst HEADER_TEXT_PADDING = 12;\r\n\r\nexport function resolveHeaderTextLayout(params: {\r\n rect: { x: number; y: number; width: number; height: number };\r\n visibleRect: { x: number; y: number; width: number; height: number };\r\n align: \"left\" | \"center\" | \"right\";\r\n actionVisibilityState: HeaderActionVisibilityState;\r\n allowActions: boolean;\r\n hasFilter: boolean;\r\n contentWidth?: number;\r\n contentInsetStart?: number;\r\n contentInsetEnd?: number;\r\n}) {\r\n const {\r\n rect,\r\n visibleRect,\r\n align,\r\n actionVisibilityState,\r\n allowActions,\r\n hasFilter,\r\n contentInsetStart = 0,\r\n contentInsetEnd = 0,\r\n } = params;\r\n const contentRect = {\r\n x: rect.x + contentInsetStart,\r\n y: rect.y,\r\n width: Math.max(rect.width - contentInsetStart - contentInsetEnd, 0),\r\n height: rect.height,\r\n };\r\n const contentVisibleLeft = Math.max(visibleRect.x, contentRect.x);\r\n const contentVisibleRight = Math.min(\r\n visibleRect.x + visibleRect.width,\r\n contentRect.x + contentRect.width,\r\n );\r\n const contentVisibleRect = {\r\n ...visibleRect,\r\n x: contentVisibleLeft,\r\n width: Math.max(contentVisibleRight - contentVisibleLeft, 0),\r\n };\r\n const baseX = getStickyTextX(\r\n contentRect,\r\n contentVisibleRect,\r\n align,\r\n HEADER_TEXT_PADDING,\r\n );\r\n const baseLayout = {\r\n align,\r\n maxWidth: Math.max(\r\n contentVisibleRect.width - HEADER_TEXT_PADDING * 2,\r\n 12,\r\n ),\r\n x: baseX,\r\n } as const;\r\n\r\n if (!allowActions || !actionVisibilityState.visible || align === \"left\") {\r\n return baseLayout;\r\n }\r\n\r\n const actionLayout = getHeaderActionLayout({\r\n rect,\r\n hasFilter,\r\n trailingInset: contentInsetEnd,\r\n });\r\n const textRight = Math.min(\r\n contentVisibleRect.x +\r\n contentVisibleRect.width -\r\n HEADER_TEXT_PADDING,\r\n actionLayout.startX - HEADER_TEXT_PADDING,\r\n );\r\n const textLeft = contentVisibleRect.x + HEADER_TEXT_PADDING;\r\n\r\n return {\r\n align: \"right\" as const,\r\n maxWidth: Math.max(textRight - textLeft, 12),\r\n x: textRight,\r\n };\r\n}\r\n\r\nexport function getHeaderActionLayout(params: {\r\n rect: { x: number; y: number; width: number; height: number };\r\n hasFilter: boolean;\r\n trailingInset?: number;\r\n}) {\r\n const actionTypes: Array<\"sort\" | \"filter\" | \"fixed\"> = [\"sort\"];\r\n if (params.hasFilter) {\r\n actionTypes.push(\"filter\");\r\n }\r\n actionTypes.push(\"fixed\");\r\n\r\n const totalWidth =\r\n ACTION_SIZE * actionTypes.length +\r\n ACTION_GAP * Math.max(actionTypes.length - 1, 0);\r\n\r\n return {\r\n actionTypes,\r\n startX:\r\n params.rect.x +\r\n params.rect.width -\r\n ACTION_PADDING_INLINE -\r\n totalWidth -\r\n (params.trailingInset ?? 0),\r\n totalWidth,\r\n };\r\n}\r\n\r\nfunction getAlignedTextX(\r\n rect: { x: number; width: number },\r\n align: \"left\" | \"center\" | \"right\",\r\n padding: number,\r\n) {\r\n if (align === \"center\") {\r\n return rect.x + rect.width / 2;\r\n }\r\n\r\n if (align === \"right\") {\r\n return rect.x + rect.width - padding;\r\n }\r\n\r\n return rect.x + padding;\r\n}\r\n\r\nfunction getStickyTextX(\r\n rect: { x: number; width: number },\r\n visibleRect: { x: number; width: number },\r\n align: \"left\" | \"center\" | \"right\",\r\n padding: number,\r\n) {\r\n const minX = visibleRect.x + padding;\r\n const maxX = visibleRect.x + visibleRect.width - padding;\r\n const preferredX = getAlignedTextX(rect, align, padding);\r\n\r\n if (align === \"center\") {\r\n return clamp(preferredX, minX, maxX);\r\n }\r\n\r\n if (align === \"right\") {\r\n return Math.max(Math.min(preferredX, maxX), minX);\r\n }\r\n\r\n return Math.min(Math.max(preferredX, minX), maxX);\r\n}\r\nfunction clamp(value: number, min: number, max: number) {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n","import type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\nimport type {\n HeaderCellLayer,\n HeaderCellLayout,\n} from \"../../domain/columns/header-layout-types\";\nimport type { HeaderTreeNode } from \"../../domain/columns/types\";\nimport type { CollapsedHeaderColumnMarker } from \"../../features/header-settings/header-settings-feature\";\r\nimport type {\r\n ListTableRangeHighlightState,\r\n HeaderActionVisibilityState,\r\n} from \"../../schema/state\";\r\nimport type { ListTableTheme } from \"../../schema/style\";\r\nimport { drawSelectionControl } from \"../cell-content/cell-content-renderer\";\r\nimport {\r\n COLLAPSE_TRIGGER_GAP,\r\n COLLAPSE_TRIGGER_HEIGHT,\r\n COLLAPSE_TRIGGER_WIDTH,\r\n drawCollapseTriggerCapsule,\r\n drawCollapseTriggerGlyph,\r\n} from \"./collapse-trigger\";\r\nimport { drawGridRect } from \"./draw-grid\";\r\nimport { ensureImageLoaded } from \"../cell-content/draw-image-content\";\r\nimport {\r\n getHeaderActionLayout,\r\n resolveHeaderTextLayout,\r\n} from \"./header-text-layout\";\r\n\r\n/**\r\n * 表头绘制参数。\r\n */\r\nexport interface DrawHeaderParams<RecordType> {\r\n ctx: CanvasRenderingContext2D;\r\n headerRows: Array<Array<HeaderCellLayout<RecordType>>>;\r\n centerClipRect?: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n } | null;\r\n theme: ListTableTheme;\r\n descriptors: RenderCellDescriptor[];\r\n hoveredColumnKey: string | null;\r\n hoveredActionType: string | null;\r\n sortedColumnKey: string | null;\r\n sortOrder: \"ascend\" | \"descend\" | null;\r\n selectedHeaderKey: string | null;\r\n selectedHeaderRect?: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n } | null;\r\n rangeHighlight?: ListTableRangeHighlightState;\r\n filteredColumnKeys: Set<string>;\r\n filterableColumnKeys: Set<string>;\r\n fixedColumnKeys: Set<string>;\r\n /** 判断指定列是否允许拖拽改变宽度。 */\r\n isResizable: (columnKey: string) => boolean;\r\n /** 拖拽排序状态。 */\r\n dragReorder?: {\r\n columnKey: string;\r\n targetIndex: number;\r\n targetIndicatorX?: number;\r\n sourceRect?: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n };\r\n currentX: number;\r\n } | null;\r\n /** 叶子列宽度数组,用于计算拖拽目标位置。 */\r\n leafColumnWidths?: number[];\r\n /** 叶子列 key,用于解析左右列宽拖拽边界。 */\r\n leafColumnKeys?: string[];\r\n /** 表头固定左宽度。 */\r\n fixedWidthLeft?: number;\r\n /** 拖拽插入指示线高度,默认使用表头高度。 */\r\n dragIndicatorHeight?: number;\r\n rowSelection?: {\r\n columnKey: string;\r\n type: \"checkbox\" | \"radio\";\r\n checked: boolean;\r\n indeterminate: boolean;\r\n disabled: boolean;\r\n } | null;\r\n inlineContentInset?: {\r\n columnKey: string | null;\r\n width: number;\r\n };\r\n collapsedColumnMarkers?: CollapsedHeaderColumnMarker[];\r\n requestRender?: () => void;\r\n}\r\n\r\nconst ACTION_GAP = 4;\nconst ACTION_SIZE = 14;\r\nconst ACTION_PADDING_INLINE = 10;\r\nconst GRID_LINE_OFFSET = 0.5;\r\nconst FILTER_ICON_VIEWBOX_SIZE = 1024;\r\nconst FILTER_ICON_PATH = new Path2D(\r\n \"M922.366667 114.813333A53.04 53.04 0 0 0 874.666667 85.333333H149.333333a53.333333 53.333333 0 0 0-42.666666 85.333334l277.333333 369.78V917.333333a21.333333 21.333333 0 0 0 29.253333 19.806667l213.333334-85.333333A21.333333 21.333333 0 0 0 640 832V540.446667L917.333333 170.666667a53.04 53.04 0 0 0 5.033334-55.853334z\",\r\n);\r\nconst FIXED_PIN_VIEWBOX_SIZE = 1024;\r\nconst FIXED_PIN_PATH = new Path2D(\r\n \"M963.925333 326.997333L697.002667 60.074667a25.6 25.6 0 0 0-43.52 21.845333l14.506666 99.498667-273.066666 151.381333c-91.477333-45.738667-170.666667-36.693333-234.496 27.306667a25.941333 25.941333 0 0 0 0 36.352L327.68 563.2 57.685333 930.645333a25.6 25.6 0 0 0 35.84 35.669334l366.250667-270.677334 167.765333 167.936a25.941333 25.941333 0 0 0 36.352 0c79.530667-79.701333 58.538667-165.546667 26.965334-233.813333l152.064-273.066667 99.157333 14.165334a25.6 25.6 0 0 0 26.624-13.824 25.941333 25.941333 0 0 0-4.778667-30.037334z\",\r\n);\r\nconst EMPTY_RANGE_HIGHLIGHT: ListTableRangeHighlightState = {\r\n selectedRowAnchorIndex: null,\r\n selectedRowRange: null,\r\n selectedColumnAnchorKey: null,\r\n selectedColumnRange: null,\r\n};\r\n\r\n/**\r\n * 绘制表头。\r\n *\r\n * @param params 绘制参数。\r\n */\r\nexport function drawHeader<RecordType>(params: DrawHeaderParams<RecordType>) {\r\n drawHeaderLayer(params, \"center\");\r\n drawHeaderLayer(params, \"left\");\r\n drawHeaderLayer(params, \"right\");\r\n}\r\n\r\nfunction drawHeaderLayer<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n layer: HeaderCellLayer,\r\n) {\r\n const centerClipRect = params.centerClipRect ?? null;\r\n const dragState = params.dragReorder;\r\n\r\n params.headerRows.forEach((row) => {\r\n row.forEach((cell) => {\r\n if (cell.layer !== layer) {\r\n return;\r\n }\r\n\r\n if (layer === \"center\" && centerClipRect) {\r\n params.ctx.save();\r\n params.ctx.beginPath();\r\n params.ctx.rect(\r\n centerClipRect.x,\r\n centerClipRect.y,\r\n centerClipRect.width,\r\n centerClipRect.height,\r\n );\r\n params.ctx.clip();\r\n drawHeaderCell(params, cell, centerClipRect);\r\n params.ctx.restore();\r\n return;\r\n }\r\n\r\n drawHeaderCell(params, cell);\r\n });\r\n });\r\n\r\n if (layer === \"center\" && centerClipRect) {\r\n drawCenterHeaderBottomBorder(params, centerClipRect);\r\n }\r\n\r\n // 绘制拖拽幽灵和指示线\r\n if (dragState) {\r\n drawDragIndicator(params, dragState);\r\n }\r\n}\r\n\r\nfunction drawCenterHeaderBottomBorder<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n rect: { x: number; y: number; width: number; height: number },\r\n) {\r\n const { ctx, theme } = params;\r\n ctx.save();\r\n ctx.strokeStyle = theme.borderColor;\r\n ctx.lineWidth = 1;\r\n ctx.beginPath();\r\n ctx.moveTo(rect.x, rect.y + rect.height + 0.5);\r\n ctx.lineTo(rect.x + rect.width, rect.y + rect.height + 0.5);\r\n ctx.stroke();\r\n ctx.restore();\r\n}\r\n\r\nfunction drawHeaderCell<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n cell: HeaderCellLayout<RecordType>,\r\n clipRect?: { x: number; y: number; width: number; height: number } | null,\r\n) {\r\n const { ctx, theme, descriptors } = params;\r\n const rect = {\r\n x: cell.x,\r\n y: cell.y,\r\n width: cell.width,\r\n height: cell.height,\r\n };\r\n\r\n ctx.save();\r\n\r\n // 选中高亮\r\n const isSelected = isHeaderCellSelected(params, cell.node.key, rect);\r\n const isRangeSelected = isHeaderCellInRange(params.rangeHighlight, cell);\r\n ctx.fillStyle =\r\n isSelected || isRangeSelected\r\n ? theme.selectionBackgroundColor\r\n : (cell.node.style?.backgroundColor ?? theme.headerBackgroundColor);\r\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\r\n\r\n drawGridRect(ctx, rect, theme);\r\n\r\n ctx.fillStyle = cell.node.style?.color ?? theme.headerTextColor;\r\n ctx.font = `${theme.headerFontWeight} ${theme.fontSize}px ${theme.fontFamily}`;\r\n ctx.textBaseline = \"middle\";\r\n\r\n const visibleRect = clipRect ? intersectRects(rect, clipRect) : rect;\r\n if (!visibleRect) {\r\n ctx.restore();\r\n return;\r\n }\r\n const collapseMarkerSet = resolveCollapsedColumnMarkerSet(\r\n params.collapsedColumnMarkers,\r\n cell.node.key,\r\n );\r\n const isExpandSystemColumn =\r\n cell.node.children.length === 0 &&\r\n cell.node.column.meta?.systemType === \"expandable\";\r\n const visibleState = getHeaderActionVisibilityState(\r\n cell.node.key,\r\n params.hoveredColumnKey,\r\n params.sortedColumnKey,\r\n params.filteredColumnKeys,\r\n params.filterableColumnKeys,\r\n params.fixedColumnKeys,\r\n );\r\n const titleContent = cell.node.titleContent ?? [\r\n { type: \"text\" as const, text: cell.node.title },\r\n ];\r\n const textLayout = resolveHeaderTextLayout({\r\n rect,\r\n visibleRect,\r\n align: cell.node.align,\r\n actionVisibilityState: visibleState,\r\n allowActions: cell.node.children.length === 0,\r\n hasFilter: params.filterableColumnKeys.has(cell.node.key),\r\n contentWidth: measureHeaderContentWidth(ctx, titleContent),\r\n contentInsetStart: resolveHeaderContentInsetStart({\r\n columnKey: cell.node.key,\r\n hasChildren: cell.node.children.length > 0,\r\n inlineContentInset: params.inlineContentInset,\r\n collapseMarkerSet,\r\n }),\r\n contentInsetEnd:\r\n cell.node.children.length === 0 && collapseMarkerSet.hasRightMarker\r\n ? COLLAPSE_TRIGGER_WIDTH / 2 +\r\n COLLAPSE_TRIGGER_GAP +\r\n ACTION_PADDING_INLINE\r\n : 0,\r\n });\r\n const textY = rect.y + rect.height / 2;\r\n ctx.textAlign = textLayout.align;\r\n\r\n if (\r\n params.rowSelection?.columnKey === cell.node.key &&\r\n cell.node.children.length === 0\r\n ) {\r\n descriptors.push({\r\n kind: \"header\",\r\n rect,\r\n columnKey: cell.node.key,\r\n });\r\n if (params.rowSelection.type === \"checkbox\") {\r\n drawHeaderSelectionControl(params, rect);\r\n descriptors.push({\r\n kind: \"header-selection\",\r\n rect: getHeaderSelectionRect(rect),\r\n columnKey: cell.node.key,\r\n controlType: params.rowSelection.type,\r\n });\r\n }\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n if (isExpandSystemColumn) {\r\n descriptors.push({\r\n kind: \"header\",\r\n rect,\r\n columnKey: cell.node.key,\r\n });\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n drawHeaderContent(\r\n ctx,\r\n titleContent,\r\n textLayout.x,\r\n textY,\r\n textLayout.maxWidth,\r\n textLayout.align,\r\n params.requestRender,\r\n );\r\n descriptors.push({\r\n kind: \"header\",\r\n rect,\r\n columnKey: cell.node.key,\r\n });\r\n\r\n if (cell.node.children.length === 0) {\r\n drawCollapsedColumnMarkers(params, rect, cell.node.key, collapseMarkerSet);\r\n drawHeaderActions(params, rect, cell.node.key, visibleState);\r\n drawResizeHandles(params, rect, cell.node.key);\r\n }\r\n\r\n ctx.restore();\r\n}\r\n\r\nfunction measureHeaderContentWidth(\r\n ctx: CanvasRenderingContext2D,\r\n contents: HeaderTreeNode<unknown>[\"titleContent\"],\r\n) {\r\n const gap = 4;\r\n return (\r\n contents.reduce(\r\n (sum, content) =>\r\n sum +\r\n (content.type === \"img\"\r\n ? Math.max(content.width ?? content.height ?? 16, 1)\r\n : ctx.measureText(content.text).width),\r\n 0,\r\n ) + Math.max(contents.length - 1, 0) * gap\r\n );\r\n}\r\n\r\nfunction drawHeaderActions<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n rect: { x: number; y: number; width: number; height: number },\r\n columnKey: string,\r\n visibilityState: HeaderActionVisibilityState,\r\n) {\r\n if (!visibilityState.visible) {\r\n return;\r\n }\r\n\r\n const { ctx, descriptors } = params;\r\n const actionLayout = getHeaderActionLayout({\r\n rect,\r\n hasFilter: params.filterableColumnKeys.has(columnKey),\r\n trailingInset: resolveCollapsedColumnMarkerSet(\r\n params.collapsedColumnMarkers,\r\n columnKey,\r\n ).hasRightMarker\r\n ? COLLAPSE_TRIGGER_WIDTH / 2 +\r\n COLLAPSE_TRIGGER_GAP +\r\n ACTION_PADDING_INLINE\r\n : 0,\r\n });\r\n const { actionTypes, startX, totalWidth } = actionLayout;\r\n const centerY = rect.y + rect.height / 2;\r\n const headerSelected = isHeaderCellSelected(params, columnKey, rect);\r\n\r\n // 三个 icon 的背板,避免标题文字与 icon 重叠时视觉混杂\r\n ctx.save();\r\n ctx.fillStyle = headerSelected\r\n ? params.theme.selectionBackgroundColor\r\n : params.theme.headerBackgroundColor;\r\n ctx.beginPath();\r\n roundRect(\r\n ctx,\r\n startX,\r\n centerY - ACTION_SIZE / 2 - 2,\r\n totalWidth,\r\n ACTION_SIZE + 4,\r\n 4,\r\n );\r\n ctx.fill();\r\n ctx.restore();\r\n\r\n actionTypes.forEach((actionType, index) => {\r\n const x = startX + index * (ACTION_SIZE + ACTION_GAP);\r\n const actionRect = {\r\n x,\r\n y: centerY - ACTION_SIZE / 2,\r\n width: ACTION_SIZE,\r\n height: ACTION_SIZE,\r\n };\r\n\r\n // Per-icon hover: only the specific icon under the cursor gets a background\r\n const iconHovered =\r\n params.hoveredColumnKey === columnKey &&\r\n params.hoveredActionType ===\r\n (actionType === \"sort\"\r\n ? \"sort-trigger\"\r\n : actionType === \"filter\"\r\n ? \"filter-trigger\"\r\n : \"fixed-trigger\");\r\n\r\n drawActionIcon(\r\n ctx,\r\n actionRect,\r\n actionType,\r\n getActionActive(actionType, visibilityState),\r\n iconHovered,\r\n headerSelected,\r\n params.theme.selectionBackgroundColor,\r\n params.sortOrder,\r\n );\r\n\r\n descriptors.push({\r\n kind: \"header-action\",\r\n rect: actionRect,\r\n columnKey,\r\n actionType,\r\n visibilityState,\r\n });\r\n });\r\n}\r\n\r\nfunction resolveHeaderContentInsetStart(params: {\r\n columnKey: string;\r\n hasChildren: boolean;\r\n inlineContentInset?: {\r\n columnKey: string | null;\r\n width: number;\r\n };\r\n collapseMarkerSet: {\r\n left?: CollapsedHeaderColumnMarker;\r\n right?: CollapsedHeaderColumnMarker;\r\n hasLeftMarker: boolean;\r\n hasRightMarker: boolean;\r\n };\r\n}) {\r\n const inlineInset =\r\n !params.hasChildren &&\r\n params.columnKey === params.inlineContentInset?.columnKey\r\n ? params.inlineContentInset.width\r\n : 0;\r\n const collapseInset =\r\n !params.hasChildren && params.collapseMarkerSet.hasLeftMarker\r\n ? COLLAPSE_TRIGGER_WIDTH / 2 +\r\n COLLAPSE_TRIGGER_GAP +\r\n ACTION_PADDING_INLINE\r\n : 0;\r\n\r\n return Math.max(inlineInset, collapseInset);\r\n}\r\n\r\nfunction resolveCollapsedColumnMarkerSet(\r\n markers: CollapsedHeaderColumnMarker[] | undefined,\r\n columnKey: string,\r\n) {\r\n const matched = (markers ?? []).filter(\r\n (marker) => marker.columnKey === columnKey,\r\n );\r\n const left = matched.find((marker) => marker.align === \"left\");\r\n const right = matched.find((marker) => marker.align === \"right\");\r\n return {\r\n left,\r\n right,\r\n hasLeftMarker: !!left,\r\n hasRightMarker: !!right,\r\n };\r\n}\r\n\r\nfunction drawCollapsedColumnMarkers<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n rect: { x: number; y: number; width: number; height: number },\r\n columnKey: string,\r\n markerSet: {\r\n left?: CollapsedHeaderColumnMarker;\r\n right?: CollapsedHeaderColumnMarker;\r\n hasLeftMarker: boolean;\r\n hasRightMarker: boolean;\r\n },\r\n) {\r\n if (markerSet.left) {\r\n drawCollapsedColumnMarker(params, rect, columnKey, markerSet.left);\r\n }\r\n if (markerSet.right) {\r\n drawCollapsedColumnMarker(params, rect, columnKey, markerSet.right);\r\n }\r\n}\r\n\r\nfunction drawCollapsedColumnMarker<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n rect: { x: number; y: number; width: number; height: number },\r\n columnKey: string,\r\n marker: CollapsedHeaderColumnMarker,\r\n) {\r\n const triggerRect = {\r\n x:\r\n marker.align === \"left\"\r\n ? rect.x + GRID_LINE_OFFSET - COLLAPSE_TRIGGER_WIDTH / 2\r\n : rect.x + rect.width + GRID_LINE_OFFSET - COLLAPSE_TRIGGER_WIDTH / 2,\r\n y: rect.y + (rect.height - COLLAPSE_TRIGGER_HEIGHT) / 2,\r\n width: COLLAPSE_TRIGGER_WIDTH,\r\n height: COLLAPSE_TRIGGER_HEIGHT,\r\n };\r\n\r\n drawCollapseTriggerCapsule(params.ctx, triggerRect);\r\n drawCollapseTriggerGlyph(params.ctx, triggerRect, \"horizontal\");\r\n\r\n params.descriptors.push({\r\n kind: \"column-collapse-trigger\",\r\n rect: triggerRect,\r\n columnKey,\r\n cursor: \"pointer\",\r\n contentKey: `${marker.rangeStart}:${marker.rangeEnd}`,\r\n });\r\n}\r\n\r\nfunction isHeaderCellSelected<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n columnKey: string,\r\n rect: { x: number; y: number; width: number; height: number },\r\n) {\r\n if (params.selectedHeaderKey !== columnKey) {\r\n return false;\r\n }\r\n\r\n if (!params.selectedHeaderRect) {\r\n return true;\r\n }\r\n\r\n return isSameRect(params.selectedHeaderRect, rect);\r\n}\r\n\r\nfunction isHeaderCellInRange<RecordType>(\r\n rangeHighlight: ListTableRangeHighlightState | undefined,\r\n cell: HeaderCellLayout<RecordType>,\r\n) {\r\n const range = (rangeHighlight ?? EMPTY_RANGE_HIGHLIGHT).selectedColumnRange;\r\n if (!range) {\r\n return false;\r\n }\r\n\r\n return (\r\n cell.node.leafStartIndex <= range.end &&\r\n cell.node.leafEndIndex >= range.start\r\n );\r\n}\r\n\r\nfunction isSameRect(\r\n left: { x: number; y: number; width: number; height: number },\r\n right: { x: number; y: number; width: number; height: number },\r\n) {\r\n return (\r\n Math.abs(left.x - right.x) <= 1 &&\r\n Math.abs(left.y - right.y) <= 1 &&\r\n Math.abs(left.width - right.width) <= 1 &&\r\n Math.abs(left.height - right.height) <= 1\r\n );\r\n}\r\n\r\nfunction drawResizeHandles<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n rect: { x: number; y: number; width: number; height: number },\r\n columnKey: string,\r\n) {\r\n if (params.isResizable(columnKey)) {\r\n params.descriptors.push({\r\n kind: \"resize-handle\",\r\n rect: getResizeHandleRect(params, rect, \"right\"),\r\n columnKey,\r\n resizeEdge: \"right\",\r\n });\r\n }\r\n\r\n const leafIndex = params.leafColumnKeys?.indexOf(columnKey) ?? -1;\r\n const previousColumnKey =\r\n leafIndex > 0 ? params.leafColumnKeys?.[leafIndex - 1] : null;\r\n if (previousColumnKey && params.isResizable(previousColumnKey)) {\r\n params.descriptors.push({\r\n kind: \"resize-handle\",\r\n rect: getResizeHandleRect(params, rect, \"left\"),\r\n columnKey: previousColumnKey,\r\n resizeEdge: \"left\",\r\n });\r\n }\r\n}\r\n\r\nfunction getResizeHandleRect<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n rect: { x: number; y: number; width: number; height: number },\r\n edge: \"left\" | \"right\",\r\n) {\r\n const handleWidth = 5;\r\n return {\r\n x: edge === \"left\" ? rect.x : rect.x + rect.width - handleWidth,\r\n y: 0,\r\n width: handleWidth,\r\n height: params.dragIndicatorHeight ?? rect.y + rect.height,\r\n };\r\n}\r\n\r\nfunction drawHeaderSelectionControl<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n rect: { x: number; y: number; width: number; height: number },\r\n) {\r\n if (!params.rowSelection) {\r\n return;\r\n }\r\n\r\n const controlRect = getHeaderSelectionRect(rect);\r\n drawSelectionControl(\r\n params.ctx,\r\n controlRect,\r\n params.rowSelection.type,\r\n params.rowSelection.checked,\r\n params.rowSelection.disabled,\r\n params.rowSelection.indeterminate,\r\n );\r\n}\r\n\r\nfunction getHeaderSelectionRect(rect: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}) {\r\n const size = 16;\r\n return {\r\n x: rect.x + (rect.width - size) / 2,\r\n y: rect.y + (rect.height - size) / 2,\r\n width: size,\r\n height: size,\r\n };\r\n}\r\n\r\nfunction getHeaderActionVisibilityState(\r\n columnKey: string,\r\n hoveredColumnKey: string | null,\r\n sortedColumnKey: string | null,\r\n filteredColumnKeys: Set<string>,\r\n filterableColumnKeys: Set<string>,\r\n fixedColumnKeys: Set<string>,\r\n): HeaderActionVisibilityState {\r\n const hovered = hoveredColumnKey === columnKey;\r\n const sorted = sortedColumnKey === columnKey;\r\n const filtered =\r\n filterableColumnKeys.has(columnKey) && filteredColumnKeys.has(columnKey);\r\n const fixed = fixedColumnKeys.has(columnKey);\r\n\r\n return {\r\n hovered,\r\n sorted,\r\n filtered,\r\n fixed,\r\n visible: hovered || sorted || filtered || fixed,\r\n };\r\n}\r\n\r\nfunction getActionActive(\r\n actionType: \"sort\" | \"filter\" | \"fixed\",\r\n visibilityState: HeaderActionVisibilityState,\r\n) {\r\n switch (actionType) {\r\n case \"sort\":\r\n return visibilityState.sorted;\r\n case \"filter\":\r\n return visibilityState.filtered;\r\n case \"fixed\":\r\n return visibilityState.fixed;\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\nfunction drawActionIcon(\r\n ctx: CanvasRenderingContext2D,\r\n rect: { x: number; y: number; width: number; height: number },\r\n actionType: \"sort\" | \"filter\" | \"fixed\",\r\n active: boolean,\r\n hovered = false,\r\n selected = false,\r\n selectedBackgroundColor = \"#dbeafe\",\r\n sortOrder: \"ascend\" | \"descend\" | null = null,\r\n) {\r\n // Draw rounded background when hovered or active\r\n if (selected || hovered || active) {\r\n ctx.save();\r\n const bgColor = selected\r\n ? selectedBackgroundColor\r\n : active\r\n ? \"rgba(22, 119, 255, 0.08)\"\r\n : \"rgba(0, 0, 0, 0.06)\";\r\n ctx.fillStyle = bgColor;\r\n roundRect(ctx, rect.x, rect.y, rect.width, rect.height, 4);\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n\r\n const color = active ? \"#1677ff\" : \"#8c8c8c\";\r\n\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.fillStyle = color;\r\n\r\n if (actionType === \"sort\") {\r\n // Up arrow\r\n ctx.beginPath();\r\n ctx.fillStyle = sortOrder === \"ascend\" ? \"#1677ff\" : \"#8c8c8c\";\r\n ctx.moveTo(rect.x + rect.width / 2, rect.y + 1);\r\n ctx.lineTo(rect.x + rect.width - 2, rect.y + 6);\r\n ctx.lineTo(rect.x + 2, rect.y + 6);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n // Down arrow\r\n ctx.beginPath();\r\n ctx.fillStyle = sortOrder === \"descend\" ? \"#1677ff\" : \"#8c8c8c\";\r\n ctx.moveTo(rect.x + 2, rect.y + rect.height - 6);\r\n ctx.lineTo(rect.x + rect.width - 2, rect.y + rect.height - 6);\r\n ctx.lineTo(rect.x + rect.width / 2, rect.y + rect.height - 1);\r\n ctx.closePath();\r\n ctx.fill();\r\n } else if (actionType === \"filter\") {\r\n drawFilterIcon(ctx, rect);\r\n } else {\r\n drawFixedPinIcon(ctx, rect);\r\n }\r\n\r\n ctx.restore();\r\n}\r\n\r\nfunction drawFilterIcon(\r\n ctx: CanvasRenderingContext2D,\r\n rect: { x: number; y: number; width: number; height: number },\r\n) {\r\n const iconWidth = rect.width * 0.92;\r\n const iconHeight = rect.height * 0.7;\r\n const offsetX = rect.x + (rect.width - iconWidth) / 2;\r\n const offsetY = rect.y + (rect.height - iconHeight) / 2;\r\n\r\n ctx.save();\r\n ctx.translate(offsetX, offsetY);\r\n ctx.scale(\r\n iconWidth / FILTER_ICON_VIEWBOX_SIZE,\r\n iconHeight / FILTER_ICON_VIEWBOX_SIZE,\r\n );\r\n ctx.fill(FILTER_ICON_PATH);\r\n ctx.restore();\r\n}\r\n\r\nfunction drawFixedPinIcon(\r\n ctx: CanvasRenderingContext2D,\r\n rect: { x: number; y: number; width: number; height: number },\r\n) {\r\n const iconSize = Math.min(rect.width, rect.height) * 0.92;\r\n const offsetX = rect.x + (rect.width - iconSize) / 2;\r\n const offsetY = rect.y + (rect.height - iconSize) / 2;\r\n const scale = iconSize / FIXED_PIN_VIEWBOX_SIZE;\r\n\r\n ctx.save();\r\n ctx.translate(offsetX, offsetY);\r\n ctx.scale(scale, scale);\r\n ctx.fill(FIXED_PIN_PATH);\r\n ctx.restore();\r\n}\r\n\r\nfunction drawHeaderContent(\r\n ctx: CanvasRenderingContext2D,\r\n contents: HeaderTreeNode<unknown>[\"titleContent\"],\r\n x: number,\r\n y: number,\r\n maxWidth: number,\r\n align: \"left\" | \"center\" | \"right\",\r\n requestRender?: () => void,\r\n) {\r\n const gap = 4;\r\n const widths = contents.map((content) =>\r\n content.type === \"img\"\r\n ? Math.max(content.width ?? content.height ?? 16, 1)\r\n : ctx.measureText(content.text).width,\r\n );\r\n const totalWidth =\r\n widths.reduce((sum, width) => sum + width, 0) +\r\n Math.max(contents.length - 1, 0) * gap;\r\n const displayWidth = Math.min(totalWidth, Math.max(maxWidth, 0));\r\n let cursorX =\r\n align === \"center\"\r\n ? x - displayWidth / 2\r\n : align === \"right\"\r\n ? x - displayWidth\r\n : x;\r\n const maxX =\r\n align === \"right\"\r\n ? x\r\n : align === \"center\"\r\n ? x + maxWidth / 2\r\n : x + maxWidth;\r\n\r\n contents.forEach((content, index) => {\r\n const availableWidth = Math.max(maxX - cursorX, 0);\r\n if (availableWidth <= 0) return;\r\n if (content.type === \"img\") {\r\n const image = ensureImageLoaded(content.src, requestRender);\r\n const width = Math.min(widths[index] ?? 16, availableWidth);\r\n const height = Math.max(content.height ?? content.width ?? 16, 1);\r\n if (image) ctx.drawImage(image, cursorX, y - height / 2, width, height);\r\n cursorX += width + gap;\r\n return;\r\n }\r\n ctx.save();\r\n if (content.color) ctx.fillStyle = content.color;\r\n if (content.fontSize || content.fontWeight) {\r\n ctx.font = `${content.fontWeight ?? \"600\"} ${content.fontSize ?? 14}px sans-serif`;\r\n }\r\n ctx.textAlign = \"left\";\r\n const text = ellipsisText(ctx, content.text, availableWidth);\r\n ctx.fillText(text, cursorX, y);\r\n cursorX += Math.min(ctx.measureText(text).width, availableWidth) + gap;\r\n ctx.restore();\r\n });\r\n}\r\n\r\nfunction ellipsisText(\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n maxWidth: number,\r\n) {\r\n if (ctx.measureText(text).width <= maxWidth) {\r\n return text;\r\n }\r\n\r\n const ellipsis = \"...\";\r\n let content = text;\r\n\r\n while (content.length > 0) {\r\n content = content.slice(0, -1);\r\n const measured = ctx.measureText(`${content}${ellipsis}`).width;\r\n if (measured <= maxWidth) {\r\n return `${content}${ellipsis}`;\r\n }\r\n }\r\n\r\n return ellipsis;\r\n}\r\n\r\nfunction intersectRects(\r\n left: { x: number; y: number; width: number; height: number },\r\n right: { x: number; y: number; width: number; height: number },\r\n) {\r\n const x = Math.max(left.x, right.x);\r\n const y = Math.max(left.y, right.y);\r\n const maxX = Math.min(left.x + left.width, right.x + right.width);\r\n const maxY = Math.min(left.y + left.height, right.y + right.height);\r\n\r\n if (maxX <= x || maxY <= y) {\r\n return null;\r\n }\r\n\r\n return {\r\n x,\r\n y,\r\n width: maxX - x,\r\n height: maxY - y,\r\n };\r\n}\r\n\r\nfunction roundRect(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n radius: number,\r\n) {\r\n const r = Math.min(radius, width / 2, height / 2);\r\n ctx.beginPath();\r\n ctx.moveTo(x + r, y);\r\n ctx.arcTo(x + width, y, x + width, y + height, r);\r\n ctx.arcTo(x + width, y + height, x, y + height, r);\r\n ctx.arcTo(x, y + height, x, y, r);\r\n ctx.arcTo(x, y, x + width, y, r);\r\n ctx.closePath();\r\n}\r\n\r\n/**\r\n * 绘制拖拽排序的幽灵列与位置指示线。\r\n */\r\nfunction drawDragIndicator<RecordType>(\r\n params: DrawHeaderParams<RecordType>,\r\n dragState: NonNullable<DrawHeaderParams<RecordType>[\"dragReorder\"]>,\r\n) {\r\n const { ctx, theme, headerRows, fixedWidthLeft } = params;\r\n const widths = params.leafColumnWidths ?? [];\r\n if (widths.length === 0 && dragState.targetIndicatorX == null) {\r\n return;\r\n }\r\n\r\n // 找到源列在 headerRows 中的位置\r\n const sourceCell = findCellByKey(headerRows, dragState.columnKey);\r\n if (!sourceCell) {\r\n return;\r\n }\r\n\r\n const targetIndex = dragState.targetIndex;\r\n\r\n const indicatorX =\r\n dragState.targetIndicatorX ??\r\n resolveFallbackIndicatorX(targetIndex, widths, fixedWidthLeft);\r\n\r\n const fallbackIndicatorHeight =\r\n headerRows.length > 0\r\n ? Math.max(...headerRows[0].map((c) => c.y + c.height))\r\n : 40;\r\n const indicatorHeight = params.dragIndicatorHeight ?? fallbackIndicatorHeight;\r\n\r\n ctx.save();\r\n\r\n // 绘制拖拽幽灵(半透明表头)\r\n const ghostX = dragState.currentX;\r\n const sourceRect = dragState.sourceRect ?? {\r\n x: sourceCell.x,\r\n y: sourceCell.y,\r\n width: sourceCell.width,\r\n height: sourceCell.height,\r\n };\r\n const ghostY = sourceRect.y;\r\n const ghostWidth = sourceRect.width;\r\n const ghostHeight = sourceRect.height;\r\n\r\n ctx.globalAlpha = 0.85;\r\n ctx.fillStyle = theme.headerBackgroundColor;\r\n ctx.fillRect(ghostX - ghostWidth / 2, ghostY, ghostWidth, ghostHeight);\r\n ctx.strokeStyle = \"#1677ff\";\r\n ctx.lineWidth = 1.5;\r\n ctx.strokeRect(ghostX - ghostWidth / 2, ghostY, ghostWidth, ghostHeight);\r\n\r\n ctx.fillStyle = theme.headerTextColor;\r\n ctx.font = `${theme.headerFontWeight} ${theme.fontSize}px ${theme.fontFamily}`;\r\n ctx.textBaseline = \"middle\";\r\n ctx.textAlign = \"center\";\r\n ctx.fillText(sourceCell.node.title, ghostX, ghostY + ghostHeight / 2);\r\n ctx.restore();\r\n\r\n // 绘制指示线\r\n ctx.save();\r\n ctx.strokeStyle = \"#1677ff\";\r\n ctx.lineWidth = 2;\r\n ctx.beginPath();\r\n ctx.moveTo(indicatorX, 0);\r\n ctx.lineTo(indicatorX, indicatorHeight);\r\n ctx.stroke();\r\n\r\n // 指示线顶部小圆点\r\n ctx.fillStyle = \"#1677ff\";\r\n ctx.beginPath();\r\n ctx.arc(indicatorX, 6, 4, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n}\r\n\r\nfunction resolveFallbackIndicatorX(\r\n targetIndex: number,\r\n widths: number[],\r\n fixedWidthLeft?: number,\r\n) {\r\n let indicatorX = fixedWidthLeft ?? 0;\r\n const maxIdx = Math.min(targetIndex, widths.length);\r\n for (let i = 0; i < maxIdx; i += 1) {\r\n indicatorX += widths[i] ?? 0;\r\n }\r\n\r\n return indicatorX;\r\n}\r\n\r\n/**\r\n * 通过列 key 查找 header 中的单元格。\r\n */\r\nfunction findCellByKey<RecordType>(\r\n headerRows: Array<Array<HeaderCellLayout<RecordType>>>,\r\n columnKey: string,\r\n): HeaderCellLayout<RecordType> | null {\r\n for (const row of headerRows) {\r\n for (const cell of row) {\r\n if (cell.node.key === columnKey) {\r\n return cell;\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n","import type { RenderCellDescriptor, Rect } from \"../../debug/debug-snapshot\";\nimport type { HeaderCellLayout } from \"../../domain/columns/header-layout-types\";\nimport { drawHeader } from \"../primitives/draw-header\";\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport { resolveCollapsedHeaderColumnMarkers } from \"../../features/header-settings/header-settings-feature\";\r\nimport type {\r\n ListTableRangeHighlightState,\r\n ListTableSortState,\r\n HoverState,\r\n} from \"../../schema/state\";\r\nimport type { ListTableTheme } from \"../../schema/style\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport { getActiveFilterColumnKeys } from \"../../services/query-service\";\r\nimport {\r\n getHeaderSelectionState,\r\n ROW_SELECTION_COLUMN_KEY,\r\n} from \"../../domain/rows/row-selection\";\r\n\r\n/**\r\n * 绘制列表表格表头。\r\n */\r\nexport function drawListTableHeader<RecordType>(params: {\r\n ctx: CanvasRenderingContext2D;\r\n headerRows: Array<Array<HeaderCellLayout<RecordType>>>;\r\n availableCenterWidth: number;\r\n fixedWidthLeft: number;\r\n fixedWidthRight: number;\r\n headerHeight: number;\r\n theme: ListTableTheme;\r\n descriptors: RenderCellDescriptor[];\r\n hover: HoverState;\r\n sortState: ListTableSortState;\r\n selectedHeaderKey: string | null;\r\n selectedHeaderRect: Rect | null;\r\n rangeHighlight: ListTableRangeHighlightState;\r\n filterState: Parameters<typeof getActiveFilterColumnKeys>[0];\r\n leafColumns: InternalLeafColumn<RecordType>[];\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: Array<string | number>;\r\n displayData: RecordType[];\r\n dragIndicatorHeight?: number;\r\n inlineContentInset?: {\r\n columnKey: string | null;\r\n width: number;\r\n };\r\n draggingReorder:\r\n | {\r\n columnKey: string;\r\n targetIndex: number;\r\n targetIndicatorX: number;\r\n sourceRect: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n };\r\n currentX: number;\r\n }\r\n | null;\r\n requestRender?: () => void;\r\n}) {\r\n const {\r\n ctx,\r\n headerRows,\r\n availableCenterWidth,\r\n fixedWidthLeft,\r\n fixedWidthRight,\r\n headerHeight,\r\n theme,\r\n descriptors,\r\n hover,\r\n sortState,\r\n selectedHeaderKey,\r\n selectedHeaderRect,\r\n rangeHighlight,\r\n filterState,\r\n leafColumns,\r\n options,\r\n selectedRowKeys,\r\n displayData,\r\n dragIndicatorHeight,\r\n inlineContentInset,\r\n draggingReorder,\r\n requestRender,\r\n } = params;\r\n const centerClipRect: Rect | null = availableCenterWidth > 0\r\n ? {\r\n x: fixedWidthLeft,\r\n y: 0,\r\n width: availableCenterWidth,\r\n height: headerHeight,\r\n }\r\n : null;\r\n const collapsedColumnMarkers = resolveCollapsedHeaderColumnMarkers({\r\n columns: options.columns,\r\n visibleColumnKeys: leafColumns.map((column) => column.key),\r\n });\r\n\r\n drawHeader({\r\n ctx,\r\n headerRows,\r\n centerClipRect,\r\n theme,\r\n descriptors,\r\n hoveredColumnKey:\r\n hover.area === \"header\" ||\r\n hover.area === \"sort-trigger\" ||\r\n hover.area === \"filter-trigger\" ||\r\n hover.area === \"fixed-trigger\"\r\n ? hover.columnKey\r\n : null,\r\n hoveredActionType: hover.area,\r\n sortedColumnKey: sortState.key,\r\n sortOrder: sortState.order,\r\n selectedHeaderKey,\r\n selectedHeaderRect,\r\n rangeHighlight,\r\n filteredColumnKeys: new Set(getActiveFilterColumnKeys(filterState)),\r\n filterableColumnKeys: new Set(\r\n leafColumns\r\n .filter((column) => column.allowFilter === true)\r\n .map((column) => column.key),\r\n ),\r\n fixedColumnKeys: new Set(\r\n leafColumns\r\n .filter((column) => !!column.fixed)\r\n .map((column) => column.key),\r\n ),\r\n isResizable: (columnKey: string) => {\r\n if (options.resizable !== true) return false;\r\n const column = leafColumns.find((item) => item.key === columnKey);\r\n return column?.resizable !== false;\r\n },\r\n dragReorder: draggingReorder,\r\n leafColumnWidths: leafColumns.map((column) => column.width),\r\n leafColumnKeys: leafColumns.map((column) => column.key),\r\n fixedWidthLeft,\r\n dragIndicatorHeight,\r\n rowSelection: options.rowSelection\r\n ? {\r\n columnKey: ROW_SELECTION_COLUMN_KEY,\r\n ...getHeaderSelectionState({\r\n options,\r\n selectedRowKeys,\r\n displayData,\r\n }),\r\n }\r\n : null,\r\n inlineContentInset,\r\n collapsedColumnMarkers,\r\n requestRender,\r\n });\r\n}\r\n\r\n","import {\r\n EXPAND_COLUMN_KEY,\r\n ROW_SELECTION_COLUMN_KEY,\r\n} from \"../../domain/rows/row-selection\";\r\n\r\n/**\r\n * 解析折叠入口所在的左侧首个业务列。\r\n */\r\nexport function resolveInlineExpandColumnKey(\r\n columns: Array<{ key: string; drawX: number }>,\r\n) {\r\n return (\r\n columns.find(\r\n (column) =>\r\n column.key !== ROW_SELECTION_COLUMN_KEY &&\r\n column.key !== EXPAND_COLUMN_KEY,\r\n )?.key ?? null\r\n );\r\n}\r\n","/**\r\n * 仅在真实存在折叠行时启用折叠标记绘制。\r\n */\r\nexport function resolveCollapseRenderConfig(params: {\r\n collapsedRowCount: number;\r\n collapsedDataRowIndexes: number[];\r\n inlineColumnKey: string | null;\r\n totalRowCount: number;\r\n}) {\r\n if (params.collapsedRowCount <= 0) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n inlineColumnKey: params.inlineColumnKey,\r\n totalRowCount: params.totalRowCount,\r\n reserveInlineSpace: true,\r\n collapsedRowIndexes: new Set(params.collapsedDataRowIndexes),\r\n };\r\n}\r\n","/**\r\n * 绘制跨表行拖拽的目标插入位置指示线。\r\n */\r\nexport function drawRowDragInsertionIndicator(params: {\r\n ctx: CanvasRenderingContext2D;\r\n width: number;\r\n indicatorY: number;\r\n}) {\r\n const { ctx, width, indicatorY } = params;\r\n if (width <= 0 || !Number.isFinite(indicatorY)) {\r\n return;\r\n }\r\n const y = Math.round(indicatorY) + 0.5;\r\n const dotX = Math.min(6, width / 2);\r\n\r\n ctx.save();\r\n ctx.strokeStyle = \"#1677ff\";\r\n ctx.lineWidth = 2;\r\n ctx.beginPath();\r\n ctx.moveTo(0, y);\r\n ctx.lineTo(width, y);\r\n ctx.stroke();\r\n\r\n ctx.fillStyle = \"#1677ff\";\r\n ctx.beginPath();\r\n ctx.arc(dotX, y, 4, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n}\r\n","import type { Rect, RenderCellDescriptor } from \"../../debug/debug-snapshot\";\nimport type {\n ListTableRangeHighlightState,\n ListTableSelectionState,\n} from \"../../schema/state\";\nimport { drawActiveCellBorder } from \"../primitives/draw-body\";\n\nexport interface ActiveCellOverlayLayout {\n rect: Rect;\n clipRect: Rect;\n rangeRects: Array<{\n rect: Rect;\n clipRect: Rect;\n omitLeft?: boolean;\n omitRight?: boolean;\n }>;\n}\n\n/**\n * 解析活动单元格最终覆盖层的单元格矩形与分区裁剪矩形。\n */\nexport function resolveActiveCellOverlayLayout(params: {\n descriptors: RenderCellDescriptor[];\n selection: ListTableSelectionState;\n rangeHighlight?: ListTableRangeHighlightState;\n highlightMode?: \"cell\" | \"row\" | \"column\" | \"cross\";\n columnKeys?: string[];\n width: number;\n headerHeight: number;\n topFrozenHeight: number;\n scrollBodyTop: number;\n scrollBodyHeight: number;\n bottomFrozenTop: number;\n bottomFrozenHeight: number;\n fixedWidthLeft: number;\n fixedWidthRight: number;\n availableCenterWidth: number;\n}): ActiveCellOverlayLayout | null {\n const { selection } = params;\n const descriptor =\n selection.rowIndex != null && selection.columnKey != null\n ? params.descriptors.find(\n (item) =>\n item.kind === \"body\" &&\n item.rowIndex === selection.rowIndex &&\n item.columnKey === selection.columnKey,\n )\n : undefined;\n const rangeRects = resolveRangeHighlightLayouts({\n descriptors: params.descriptors,\n rangeHighlight: params.rangeHighlight,\n highlightMode: params.highlightMode,\n columnKeys: params.columnKeys ?? [],\n allowColumnRange: selection.rowIndex == null,\n resolveClipRect: (item) => resolveActiveCellSectionClipRect(item, params),\n });\n if (!descriptor && rangeRects.length === 0) {\n return null;\n }\n\n const clipRect = descriptor\n ? resolveActiveCellSectionClipRect(descriptor, params)\n : { x: 0, y: 0, width: 0, height: 0 };\n if (descriptor && (clipRect.width <= 0 || clipRect.height <= 0)) {\n return null;\n }\n\n return {\n rect: descriptor?.rect ?? { x: 0, y: 0, width: 0, height: 0 },\n clipRect,\n rangeRects,\n };\n}\n\n/**\n * 在表头、汇总及固定边界之上重绘活动单元格边框。\n */\nexport function drawActiveCellOverlay(params: {\n ctx: CanvasRenderingContext2D;\n layout: ActiveCellOverlayLayout | null;\n}) {\n if (!params.layout) {\n return;\n }\n\n const { ctx, layout } = params;\n layout.rangeRects.forEach(({ rect, clipRect, omitLeft, omitRight }) => {\n ctx.save();\n ctx.beginPath();\n ctx.rect(clipRect.x, clipRect.y, clipRect.width, clipRect.height);\n ctx.clip();\n drawRangeHighlightBorder(ctx, rect, { omitLeft, omitRight });\n ctx.restore();\n });\n // 区域选框已经负责绘制完整外框,避免活动单元格边框叠加到右下角。\n if (\n layout.rangeRects.length === 0 &&\n layout.rect.width > 0 &&\n layout.rect.height > 0\n ) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n layout.clipRect.x,\n layout.clipRect.y,\n layout.clipRect.width,\n layout.clipRect.height,\n );\n ctx.clip();\n drawActiveCellBorder(ctx, layout.rect);\n ctx.restore();\n }\n}\n\n/** 解析可视范围内的连续高亮区域,避免为每个单元格重复绘制内部边框。 */\nfunction resolveRangeHighlightLayouts(params: {\n descriptors: RenderCellDescriptor[];\n rangeHighlight?: ListTableRangeHighlightState;\n highlightMode?: \"cell\" | \"row\" | \"column\" | \"cross\";\n columnKeys: string[];\n allowColumnRange: boolean;\n resolveClipRect: (descriptor: RenderCellDescriptor) => Rect;\n}) {\n const rowRange = params.rangeHighlight?.selectedRowRange;\n const columnRange = params.rangeHighlight?.selectedColumnRange;\n const cellRange = params.rangeHighlight?.selectedCellRange;\n if (!cellRange && (!columnRange || !params.allowColumnRange)) {\n return [];\n }\n\n const bodyDescriptors = params.descriptors.filter(\n (item) =>\n item.kind === \"body\" &&\n item.columnKey != null &&\n item.rowIndex != null,\n );\n const selected = bodyDescriptors.filter((item) => {\n const rowSelected =\n rowRange != null &&\n item.rowIndex! >= rowRange.start &&\n item.rowIndex! <= rowRange.end;\n const columnIndex = params.columnKeys.indexOf(item.columnKey!);\n const columnSelected =\n columnRange != null &&\n columnIndex >= columnRange.start &&\n columnIndex <= columnRange.end;\n if (cellRange) {\n return (\n item.rowIndex! >= cellRange.startRowIndex &&\n item.rowIndex! <= cellRange.endRowIndex &&\n columnIndex >= cellRange.startColumnIndex &&\n columnIndex <= cellRange.endColumnIndex\n );\n }\n return params.allowColumnRange && columnSelected;\n });\n\n const groups = new Map<string, { rect: Rect; clipRect: Rect }>();\n selected.forEach((descriptor) => {\n const groupKey =\n cellRange\n ? `${descriptor.fixed ?? \"center\"}:${descriptor.frozen ? \"frozen\" : \"scroll\"}`\n : `column:${descriptor.fixed ?? \"center\"}:${descriptor.frozen ? \"frozen\" : \"scroll\"}`;\n const current = groups.get(groupKey);\n const rect = current\n ? {\n x: Math.min(current.rect.x, descriptor.rect.x),\n y: Math.min(current.rect.y, descriptor.rect.y),\n width:\n Math.max(\n current.rect.x + current.rect.width,\n descriptor.rect.x + descriptor.rect.width,\n ) - Math.min(current.rect.x, descriptor.rect.x),\n height:\n Math.max(\n current.rect.y + current.rect.height,\n descriptor.rect.y + descriptor.rect.height,\n ) - Math.min(current.rect.y, descriptor.rect.y),\n }\n : descriptor.rect;\n groups.set(groupKey, {\n rect,\n clipRect: current?.clipRect ?? params.resolveClipRect(descriptor),\n });\n });\n const ranges = [...groups.values()];\n const groupedByLayer = new Map<string, typeof ranges>();\n ranges.forEach((range) => {\n const key = `${range.rect.y}:${range.rect.height}`;\n const layer = groupedByLayer.get(key) ?? [];\n layer.push(range);\n groupedByLayer.set(key, layer);\n });\n\n return ranges.map((range) => {\n const layer = groupedByLayer.get(`${range.rect.y}:${range.rect.height}`) ?? [];\n const minX = Math.min(...layer.map((item) => item.rect.x));\n const maxX = Math.max(\n ...layer.map((item) => item.rect.x + item.rect.width),\n );\n return {\n ...range,\n omitLeft: range.rect.x > minX,\n omitRight: range.rect.x + range.rect.width < maxX,\n };\n });\n}\n\nfunction drawRangeHighlightBorder(\n ctx: CanvasRenderingContext2D,\n rect: Rect,\n edges: { omitLeft?: boolean; omitRight?: boolean } = {},\n) {\n ctx.save();\n ctx.strokeStyle = \"#1677ff\";\n ctx.lineWidth = 1;\n const left = rect.x + 0.5;\n const top = rect.y + 0.5;\n const right = rect.x + Math.max(rect.width - 0.5, 0);\n const bottom = rect.y + Math.max(rect.height - 0.5, 0);\n if (!edges.omitLeft && !edges.omitRight) {\n ctx.strokeRect(left, top, Math.max(right - left, 0), Math.max(bottom - top, 0));\n } else {\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(right, top);\n if (!edges.omitRight) {\n ctx.moveTo(right, top);\n ctx.lineTo(right, bottom);\n }\n if (!edges.omitLeft) {\n ctx.moveTo(left, bottom);\n ctx.lineTo(left, top);\n }\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n ctx.stroke();\n }\n ctx.restore();\n}\n\nfunction resolveActiveCellSectionClipRect(\n descriptor: RenderCellDescriptor,\n params: {\n width: number;\n headerHeight: number;\n topFrozenHeight: number;\n scrollBodyTop: number;\n scrollBodyHeight: number;\n bottomFrozenTop: number;\n bottomFrozenHeight: number;\n fixedWidthLeft: number;\n fixedWidthRight: number;\n availableCenterWidth: number;\n },\n): Rect {\n const horizontal =\n descriptor.fixed === \"left\"\n ? { x: 0, width: params.fixedWidthLeft }\n : descriptor.fixed === \"right\"\n ? {\n x: params.width - params.fixedWidthRight,\n width: params.fixedWidthRight,\n }\n : {\n x: params.fixedWidthLeft,\n width: params.availableCenterWidth,\n };\n\n if (!descriptor.frozen) {\n return {\n ...horizontal,\n y: params.scrollBodyTop,\n height: params.scrollBodyHeight,\n };\n }\n\n const isTopFrozen = descriptor.rect.y < params.scrollBodyTop;\n return {\n ...horizontal,\n y: isTopFrozen ? params.headerHeight : params.bottomFrozenTop,\n height: isTopFrozen ? params.topFrozenHeight : params.bottomFrozenHeight,\n };\n}\n","import type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\nimport { drawSummary } from \"../primitives/draw-summary\";\nimport { drawScrollbars } from \"../primitives/draw-scrollbars\";\nimport type { CanvasRenderer } from \"../canvas-renderer\";\nimport {\n drawDragOverlayFrame,\n drawFixedLeftBoundary,\n drawListTableBodySections,\n} from \"./body-section-renderer\";\nimport { drawListTableHeader } from \"./header-renderer\";\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\nimport type { NestedTableHighlightState } from \"../cell-content/types\";\nimport type { ListTableOptions } from \"../../schema/table-options\";\nimport type {\n ListTableFilterState,\n ListTableRangeHighlightState,\n ListTableSelectionState,\n ListTableSortState,\n HoverState,\n} from \"../../schema/state\";\nimport type { ListTableTheme } from \"../../schema/style\";\nimport { EXPAND_COLUMN_KEY } from \"../../domain/rows/row-selection\";\nimport { resolveInlineExpandColumnKey } from \"./inline-expand-column\";\nimport { resolveCollapseRenderConfig } from \"./collapse-render-config\";\nimport { drawRowDragInsertionIndicator } from \"./row-drag-indicator-renderer\";\nimport {\n drawActiveCellOverlay,\n resolveActiveCellOverlayLayout,\n} from \"./active-cell-overlay\";\n\nexport function executeListTableRenderPipeline<RecordType>(params: {\n renderer: CanvasRenderer;\n snapshot: ListTableRenderSnapshot<RecordType>;\n summaryValues?: Map<string, string> | null;\n descriptors: RenderCellDescriptor[];\n options: ListTableOptions<RecordType>;\n theme: ListTableTheme;\n hover: HoverState;\n selection: ListTableSelectionState;\n rangeHighlight: ListTableRangeHighlightState;\n sortState: ListTableSortState;\n filterState: ListTableFilterState;\n selectedRowKeys: Array<string | number>;\n selectedHeaderKey: string | null;\n summarySelected: boolean;\n selectedHeaderRect: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null;\n dragReorderState: {\n sourceIndex: number;\n columnKey: string;\n sourceLeafStartIndex: number;\n sourceLeafEndIndex: number;\n sourceColumnKeys: string[];\n currentX: number;\n } | null;\n headerDraggingIndicator: {\n columnKey: string;\n targetIndex: number;\n targetIndicatorX: number;\n sourceRect: { x: number; y: number; width: number; height: number };\n currentX: number;\n } | null;\n resizeDraggingIndicator: {\n columnKey: string;\n } | null;\n rowDragIndicator: { insertIndex: number; y: number } | null;\n scrollbarOpacity: number;\n isScrollbarInteractive: boolean;\n fixedLeftBoundarySkips: Array<{ start: number; end: number }>;\n getControlAnimationProgress?: (params: {\n rowIndex: number;\n columnKey: string;\n contentIndex: number;\n }) => number | undefined;\n getNestedTableHighlight?: (params: {\n rowIndex: number;\n columnKey: string;\n contentIndex: number;\n }) => NestedTableHighlightState | null | undefined;\n getExpandAnimationProgress?: (rowKey: string | number) => number | undefined;\n getCollapseRowOffset?: (rowKey: string | number) => number | undefined;\n getCollapseCellHeight?: (params: {\n rowIndex: number;\n columnKey: string;\n }) => number | undefined;\n getValidationMessage?: (params: {\n record: RecordType;\n rowIndex: number;\n columnKey: string;\n }) => string | null;\n requestRender?: () => void;\n}) {\n const {\n renderer,\n snapshot,\n summaryValues,\n descriptors,\n options,\n theme,\n hover,\n selection,\n rangeHighlight,\n sortState,\n filterState,\n selectedRowKeys,\n selectedHeaderKey,\n summarySelected,\n selectedHeaderRect,\n dragReorderState,\n headerDraggingIndicator,\n resizeDraggingIndicator,\n rowDragIndicator,\n scrollbarOpacity,\n isScrollbarInteractive,\n fixedLeftBoundarySkips,\n getControlAnimationProgress,\n getNestedTableHighlight,\n getExpandAnimationProgress,\n getCollapseCellHeight,\n getValidationMessage,\n requestRender,\n } = params;\n const ctx = renderer.getContext();\n const { width, height, bodyLayout, rowHeight, summaryRowHeight } = snapshot;\n const {\n bodyAreaHeight,\n topFrozenHeight,\n bottomFrozenHeight,\n scrollBodyHeight,\n scrollBodyTop,\n bottomFrozenTop,\n summaryTop,\n totalRowsAreaHeight,\n } = bodyLayout;\n const { leftSegment, centerSegment, rightSegment } = snapshot.columnSegments;\n const headerHeight = snapshot.headerRows.length * snapshot.headerRowHeight;\n const inlineExpandColumnKey = resolveInlineExpandColumnKey([\n ...leftSegment,\n ...centerSegment,\n ...rightSegment,\n ]);\n\n if (snapshot.displayRows.length === 0) {\n renderer.drawEmpty(\n width,\n bodyAreaHeight,\n options.emptyText ?? \"当前没有可展示的数据。\",\n headerHeight,\n );\n } else {\n drawListTableBodySections({\n ctx,\n sections: snapshot.frozenRows,\n rowHeight,\n width,\n headerHeight,\n topFrozenHeight,\n scrollBodyTop,\n scrollBodyHeight,\n bottomFrozenTop,\n bottomFrozenHeight,\n leftColumns: leftSegment,\n centerColumns: centerSegment,\n rightColumns: rightSegment,\n centerClipRect:\n snapshot.columnMetrics.availableCenterWidth > 0\n ? {\n x: snapshot.columnMetrics.fixedWidthLeft,\n y: scrollBodyTop,\n width: snapshot.columnMetrics.availableCenterWidth,\n height: scrollBodyHeight,\n }\n : null,\n scroll: snapshot.scroll,\n theme,\n striped: options.striped,\n hover,\n selection,\n selectedHeaderKey,\n rangeHighlight,\n highlightMode: options.highlightMode,\n mergeCell: options.query?.mergeCell,\n descriptors,\n collapseConfig: resolveCollapseRenderConfig({\n collapsedRowCount: snapshot.collapsedRowCount,\n collapsedDataRowIndexes: snapshot.collapsedDataRowIndexes,\n inlineColumnKey: inlineExpandColumnKey,\n totalRowCount: snapshot.dataRowCount,\n }),\n expandableConfig: options.expandable\n ? {\n indentSize: options.expandable.indentSize,\n showExpandIcon: options.expandable.showExpandIcon,\n showExpandColumn: options.expandable.showExpandColumn,\n triggerColumnKey: EXPAND_COLUMN_KEY,\n inlineColumnKey: inlineExpandColumnKey,\n getExpandAnimationProgress,\n }\n : undefined,\n dragReorder: dragReorderState,\n getControlAnimationProgress,\n getNestedTableHighlight,\n getCollapseRowOffset: params.getCollapseRowOffset,\n getCollapseCellHeight,\n getValidationMessage,\n requestRender,\n });\n\n if (snapshot.hasSummary) {\n drawSummary({\n ctx,\n summaryValues,\n summaryTop,\n summaryHeight: summaryRowHeight,\n leftColumns: leftSegment,\n centerColumns: centerSegment,\n rightColumns: rightSegment,\n centerClipRect:\n snapshot.columnMetrics.availableCenterWidth > 0\n ? {\n x: snapshot.columnMetrics.fixedWidthLeft,\n y: summaryTop,\n width: snapshot.columnMetrics.availableCenterWidth,\n height: summaryRowHeight,\n }\n : null,\n theme,\n descriptors,\n selectedHeaderKey,\n summarySelected,\n rangeHighlight,\n inlineContentInset:\n snapshot.collapsedRowCount > 0\n ? {\n columnKey: inlineExpandColumnKey,\n width: 32,\n }\n : undefined,\n dragReorder: dragReorderState,\n });\n\n descriptors.push({\n kind: \"summary\",\n rect: {\n x: 0,\n y: summaryTop,\n width,\n height: summaryRowHeight,\n },\n });\n }\n }\n\n drawListTableHeader({\n ctx,\n headerRows: snapshot.headerRows,\n availableCenterWidth: snapshot.columnMetrics.availableCenterWidth,\n fixedWidthLeft: snapshot.columnMetrics.fixedWidthLeft,\n fixedWidthRight: snapshot.columnMetrics.fixedWidthRight,\n headerHeight,\n theme,\n descriptors,\n hover,\n sortState,\n selectedHeaderKey,\n selectedHeaderRect,\n rangeHighlight,\n filterState,\n leafColumns: snapshot.leafColumns,\n options,\n selectedRowKeys,\n displayData: snapshot.displayRows,\n inlineContentInset:\n snapshot.collapsedRowCount > 0\n ? {\n columnKey: inlineExpandColumnKey,\n width: 32,\n }\n : undefined,\n dragIndicatorHeight: height,\n draggingReorder: headerDraggingIndicator,\n requestRender,\n });\n\n if (resizeDraggingIndicator) {\n drawColumnResizeIndicator({\n ctx,\n snapshot,\n columnKey: resizeDraggingIndicator.columnKey,\n });\n }\n\n drawFixedLeftBoundary({\n ctx,\n fixedWidthLeft: snapshot.columnMetrics.fixedWidthLeft,\n height,\n borderColor: theme.borderColor,\n skipRanges: fixedLeftBoundarySkips,\n });\n\n drawActiveCellOverlay({\n ctx,\n layout: resolveActiveCellOverlayLayout({\n descriptors,\n selection,\n width,\n headerHeight,\n topFrozenHeight,\n scrollBodyTop,\n scrollBodyHeight,\n bottomFrozenTop,\n bottomFrozenHeight,\n fixedWidthLeft: snapshot.columnMetrics.fixedWidthLeft,\n fixedWidthRight: snapshot.columnMetrics.fixedWidthRight,\n availableCenterWidth: snapshot.columnMetrics.availableCenterWidth,\n rangeHighlight,\n highlightMode: options.highlightMode,\n columnKeys: snapshot.leafColumns.map((column) => column.key),\n }),\n });\n\n if (rowDragIndicator) {\n drawRowDragInsertionIndicator({\n ctx,\n width,\n indicatorY: rowDragIndicator.y,\n });\n }\n\n drawScrollbars(\n ctx,\n snapshot.scrollbarLayout,\n descriptors,\n scrollbarOpacity,\n isScrollbarInteractive,\n );\n\n if (headerDraggingIndicator) {\n drawDragOverlayFrame({\n ctx,\n columns: snapshot.leafColumns,\n dragReorder: dragReorderState,\n headerHeight,\n bodyHeight: totalRowsAreaHeight,\n hasSummary: snapshot.hasSummary,\n summaryRowHeight,\n });\n }\n}\n\nfunction drawColumnResizeIndicator<RecordType>(params: {\n ctx: CanvasRenderingContext2D;\n snapshot: ListTableRenderSnapshot<RecordType>;\n columnKey: string;\n}) {\n const { ctx, snapshot, columnKey } = params;\n const sourceCell = snapshot.headerRows\n .flat()\n .find(\n (cell) => cell.node.key === columnKey && cell.node.children.length === 0,\n );\n if (!sourceCell) {\n return;\n }\n const indicatorX = sourceCell.x + sourceCell.width;\n const indicatorHeight = snapshot.height;\n\n ctx.save();\n ctx.strokeStyle = \"#1677ff\";\n ctx.lineWidth = 1.5;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n ctx.moveTo(indicatorX + 0.5, 0);\n ctx.lineTo(indicatorX + 0.5, indicatorHeight);\n ctx.stroke();\n ctx.restore();\n}\n","import type { HeaderCellLayout } from \"../../domain/columns/header-layout-types\";\nimport type {\r\n BodyDragReorderState,\r\n DraggingReorderState,\r\n} from \"../../domain/types\";\r\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\r\nimport { hasExpandedVisibleRows } from \"../../services/expandable-service\";\r\nimport {\r\n getVisibleRowHeight,\r\n sumVisibleRowHeights,\r\n} from \"../../domain/rows/row-height\";\r\n\r\nexport interface ListTableRenderScene {\r\n dragReorderState: BodyDragReorderState | null;\r\n headerDraggingIndicator: {\r\n columnKey: string;\r\n targetIndex: number;\r\n targetIndicatorX: number;\r\n sourceRect: { x: number; y: number; width: number; height: number };\r\n currentX: number;\r\n } | null;\r\n resizeDraggingIndicator: {\r\n columnKey: string;\r\n } | null;\r\n fixedLeftBoundarySkips: Array<{ start: number; end: number }>;\r\n}\r\n\r\n/**\r\n * 基于运行时交互状态构建渲染场景。\r\n */\r\nexport function buildListTableRenderScene<RecordType>(params: {\r\n snapshot: ListTableRenderSnapshot<RecordType>;\r\n draggingReorder: DraggingReorderState | null;\r\n}) {\r\n const { snapshot } = params;\r\n const draggingReorder =\r\n params.draggingReorder ?? resolveReleaseDraggingState(snapshot);\r\n return {\r\n dragReorderState: draggingReorder?.activated\r\n ? {\r\n sourceIndex: draggingReorder.sourceIndex,\r\n columnKey: draggingReorder.columnKey,\r\n sourceLeafStartIndex: draggingReorder.sourceLeafStartIndex,\r\n sourceLeafEndIndex: draggingReorder.sourceLeafEndIndex,\r\n sourceColumnKeys: draggingReorder.sourceColumnKeys,\r\n currentX: draggingReorder.currentX,\r\n }\r\n : null,\r\n headerDraggingIndicator: draggingReorder?.activated\r\n ? {\r\n columnKey: draggingReorder.columnKey,\r\n targetIndex: draggingReorder.targetIndex,\r\n targetIndicatorX: draggingReorder.targetIndicatorX,\r\n sourceRect: draggingReorder.sourceHeaderRect,\r\n currentX: draggingReorder.currentX,\r\n }\r\n : null,\r\n resizeDraggingIndicator: params.snapshot.draggingResizeColumnKey\r\n ? {\r\n columnKey: params.snapshot.draggingResizeColumnKey,\r\n }\r\n : null,\r\n fixedLeftBoundarySkips: [\r\n ...getFixedLeftBoundaryHeaderSkipRanges(\r\n snapshot.headerRows,\r\n snapshot.columnMetrics.fixedWidthLeft,\r\n ),\r\n ...getFixedLeftBoundaryExpandedRowSkipRanges(snapshot),\r\n ],\r\n } satisfies ListTableRenderScene;\r\n}\r\n\r\nfunction resolveReleaseDraggingState<RecordType>(\r\n snapshot: ListTableRenderSnapshot<RecordType>,\r\n) {\r\n const animation = snapshot.swapAnimation;\r\n const release = animation?.release;\r\n if (!animation || !release) {\r\n return null;\r\n }\r\n\r\n const progress = Math.min(\r\n Math.max((performance.now() - animation.startTime) / animation.duration, 0),\r\n 1,\r\n );\r\n const eased = 1 - Math.pow(1 - progress, 3);\r\n return {\r\n ...release.dragging,\r\n currentX: release.fromX + (release.toX - release.fromX) * eased,\r\n } satisfies DraggingReorderState;\r\n}\r\n\r\n/**\r\n * 收集固定左列边界需要跳过的表头段。\r\n */\r\nexport function getFixedLeftBoundaryHeaderSkipRanges<RecordType>(\r\n headerRows: Array<Array<HeaderCellLayout<RecordType>>>,\r\n fixedWidthLeft: number,\r\n) {\r\n if (fixedWidthLeft <= 0) {\r\n return [];\r\n }\r\n\r\n return headerRows.flatMap((row) =>\r\n row\r\n .filter(\r\n (cell) =>\r\n cell.x < fixedWidthLeft && cell.x + cell.width > fixedWidthLeft,\r\n )\r\n .map((cell) => ({\r\n start: cell.y,\r\n end: cell.y + cell.height,\r\n })),\r\n );\r\n}\r\n\r\n/**\r\n * 收集固定左列边界需要跳过的展开行表体段。\r\n */\r\nexport function getFixedLeftBoundaryExpandedRowSkipRanges<RecordType>(\r\n snapshot: ListTableRenderSnapshot<RecordType>,\r\n) {\r\n if (\r\n snapshot.columnMetrics.fixedWidthLeft <= 0 ||\r\n !hasExpandedVisibleRows(snapshot.frozenRows.scroll.rows)\r\n ) {\r\n return [];\r\n }\r\n\r\n return snapshot.frozenRows.scroll.rows.flatMap((row, rowIndex) => {\r\n if (row.kind !== \"expanded\") {\r\n return [];\r\n }\r\n\r\n const offset = sumVisibleRowHeights({\r\n rows: snapshot.frozenRows.scroll.rows,\r\n rowHeight: snapshot.rowHeight,\r\n end: rowIndex,\r\n });\r\n const start =\r\n snapshot.bodyLayout.scrollBodyTop + offset - snapshot.scroll.top;\r\n const end = start + getVisibleRowHeight(row, snapshot.rowHeight);\r\n const bodyStart = snapshot.bodyLayout.scrollBodyTop;\r\n const bodyEnd = bodyStart + snapshot.bodyLayout.scrollBodyHeight;\r\n\r\n return end > bodyStart && start < bodyEnd\r\n ? [\r\n {\r\n start: Math.max(start, bodyStart),\r\n end: Math.min(end, bodyEnd),\r\n },\r\n ]\r\n : [];\r\n });\r\n}\r\n\r\n","import type {\r\n RenderCellDescriptor,\r\n DebugHitTestResult,\r\n} from \"../debug/debug-snapshot\";\r\nimport type { CanvasRenderer } from \"../rendering/canvas-renderer\";\r\nimport type { NestedTableHighlightState } from \"../rendering/cell-content/types\";\r\nimport type { ListTableOptions } from \"../schema/table-options\";\r\nimport type {\r\n ListTableFilterState,\r\n ListTableRangeHighlightState,\r\n ListTableSelectionState,\r\n ListTableSortState,\r\n HoverState,\r\n} from \"../schema/state\";\r\nimport type { ListTableTheme } from \"../schema/style\";\r\nimport { executeListTableRenderPipeline } from \"../rendering/pipeline/render-pipeline\";\r\nimport { buildListTableRenderScene } from \"../rendering/pipeline/scene-builder\";\r\nimport {\r\n buildListTableDebugSnapshot,\r\n type ListTableRenderSnapshot,\r\n} from \"./layout-service\";\r\nimport type { DraggingReorderState } from \"../domain/types\";\r\nimport type { DebugManager } from \"../debug/debug-manager\";\r\n\r\n/**\r\n * 执行列表表格渲染与调试快照发布。\r\n */\r\nexport function publishListTableRender<RecordType>(params: {\r\n renderer: CanvasRenderer;\r\n snapshot: ListTableRenderSnapshot<RecordType>;\r\n summaryValues?: Map<string, string> | null;\r\n descriptors: RenderCellDescriptor[];\r\n options: ListTableOptions<RecordType>;\r\n theme: ListTableTheme;\r\n hover: HoverState;\r\n selection: ListTableSelectionState;\r\n rangeHighlight: ListTableRangeHighlightState;\r\n sortState: ListTableSortState;\r\n filterState: ListTableFilterState;\r\n selectedRowKeys: Array<string | number>;\r\n selectedHeaderKey: string | null;\r\n summarySelected: boolean;\r\n selectedHeaderRect: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n } | null;\r\n draggingReorder: DraggingReorderState | null;\r\n rowDragIndicator: { insertIndex: number; y: number } | null;\r\n scrollbarOpacity: number;\r\n isScrollbarInteractive: boolean;\r\n getControlAnimationProgress?: (params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n contentIndex: number;\r\n }) => number | undefined;\r\n getNestedTableHighlight?: (params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n contentIndex: number;\r\n }) => NestedTableHighlightState | null | undefined;\r\n getExpandAnimationProgress?: (rowKey: string | number) => number | undefined;\r\n getCollapseRowOffset?: (rowKey: string | number) => number | undefined;\r\n getCollapseCellHeight?: (params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n }) => number | undefined;\r\n getValidationMessage?: (params: {\r\n record: RecordType;\r\n rowIndex: number;\r\n columnKey: string;\r\n }) => string | null;\r\n requestRender?: () => void;\r\n runtimeColumns: unknown;\r\n hitResult: DebugHitTestResult;\r\n debugManager: DebugManager;\r\n}) {\r\n const {\r\n renderer,\r\n snapshot,\r\n summaryValues,\r\n descriptors,\r\n options,\r\n theme,\r\n hover,\r\n selection,\r\n rangeHighlight,\r\n sortState,\r\n filterState,\r\n selectedRowKeys,\r\n selectedHeaderKey,\r\n summarySelected,\r\n selectedHeaderRect,\r\n draggingReorder,\r\n rowDragIndicator,\r\n scrollbarOpacity,\r\n isScrollbarInteractive,\r\n getControlAnimationProgress,\r\n getNestedTableHighlight,\r\n getExpandAnimationProgress,\r\n getCollapseRowOffset,\r\n getCollapseCellHeight,\r\n getValidationMessage,\r\n requestRender,\r\n runtimeColumns,\r\n hitResult,\r\n debugManager,\r\n } = params;\r\n const scene = buildListTableRenderScene({\r\n snapshot,\r\n draggingReorder,\r\n });\r\n\r\n executeListTableRenderPipeline({\r\n renderer,\r\n snapshot,\r\n summaryValues,\r\n descriptors,\r\n options,\r\n theme,\r\n hover,\r\n selection,\r\n rangeHighlight,\r\n sortState,\r\n filterState,\r\n selectedRowKeys,\r\n selectedHeaderKey,\r\n summarySelected,\r\n selectedHeaderRect,\r\n dragReorderState: scene.dragReorderState,\r\n headerDraggingIndicator: scene.headerDraggingIndicator,\r\n resizeDraggingIndicator: scene.resizeDraggingIndicator,\r\n rowDragIndicator,\r\n scrollbarOpacity,\r\n isScrollbarInteractive,\r\n fixedLeftBoundarySkips: scene.fixedLeftBoundarySkips,\r\n getControlAnimationProgress,\r\n getNestedTableHighlight,\r\n getExpandAnimationProgress,\r\n getCollapseRowOffset,\r\n getCollapseCellHeight,\r\n getValidationMessage,\r\n requestRender,\r\n });\r\n\r\n const debugSnapshot = buildListTableDebugSnapshot({\r\n snapshot,\r\n hover,\r\n selection,\r\n sort: sortState,\r\n filter: filterState,\r\n runtimeColumns,\r\n descriptors,\r\n hitTest: hitResult,\r\n });\r\n debugManager.setSnapshot(debugSnapshot);\r\n renderer.drawDebug(debugSnapshot);\r\n}\r\n","import { normalizeColumns } from \"../../domain/columns/normalize-columns\";\r\nimport type { NormalizedColumn } from \"../../domain/columns/types\";\r\nimport type {\r\n DebugHitTestResult,\r\n Rect,\r\n RenderCellDescriptor,\r\n} from \"../../debug/debug-snapshot\";\r\nimport type { DebugManager } from \"../../debug/debug-manager\";\r\nimport type { CanvasRenderer } from \"../../rendering/canvas-renderer\";\r\nimport type { NestedTableHighlightState } from \"../../rendering/cell-content/types\";\r\nimport type {\r\n ListTableColumnRuntimeConfig,\r\n ListTableFilterState,\r\n ListTableRangeHighlightState,\r\n ListTableSelectionState,\r\n ListTableSortState,\r\n HoverState,\r\n ScrollState,\r\n} from \"../../schema/state\";\r\nimport type { ListTableTheme } from \"../../schema/style\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport {\r\n FALLBACK_TABLE_HEIGHT,\r\n FALLBACK_TABLE_WIDTH,\r\n resolveFittedTableHeight,\r\n resolveTableContentHeight,\r\n TABLE_CONTENT_BORDER_SIZE,\r\n} from \"../../domain/constants\";\r\nimport type { FrozenRowState } from \"../../domain/rows/frozen-rows\";\r\nimport { getResolvedColumns } from \"../../domain/rows/row-selection\";\r\nimport {\n buildListTableRenderSnapshot,\n type ListTableRenderCache,\n type ListTableRenderSnapshot,\n} from \"../../services/layout-service\";\nimport { syncListTablePagination } from \"../../services/pagination-service\";\r\nimport type { ListTableQueryRuntimeState } from \"../../services/query-service\";\r\nimport { resolveListTableRenderHostSize } from \"../../services/render-host-service\";\r\nimport { publishListTableRender } from \"../../services/render-service\";\r\nimport {\r\n projectRuntimeStateFromSnapshot,\r\n type ListTableRuntimeProjection,\r\n} from \"../../services/runtime-sync-service\";\r\nimport type { ListTableStore } from \"../store/create-store\";\r\nimport type { DraggingReorderState, SwapAnimationState } from \"../../domain/types\";\r\n\r\nexport interface ListTableRenderScheduler {\r\n requestAnimationFrame(callback: FrameRequestCallback): number;\r\n cancelAnimationFrame(id: number): void;\r\n}\r\n\r\nexport interface ListTableRenderPublishAccessors<RecordType> {\r\n scrollbarOpacity: number;\r\n isScrollbarInteractive: boolean;\r\n getControlAnimationProgress?: (params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n contentIndex: number;\r\n }) => number | undefined;\r\n getNestedTableHighlight?: (params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n contentIndex: number;\r\n }) => NestedTableHighlightState | null | undefined;\r\n getExpandAnimationProgress?: (rowKey: string | number) => number | undefined;\r\n getCollapseRowOffset?: (rowKey: string | number) => number | undefined;\r\n getCollapseCellHeight?: (params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n }) => number | undefined;\r\n getValidationMessage?: (params: {\r\n record: RecordType;\r\n rowIndex: number;\r\n columnKey: string;\r\n }) => string | null;\r\n}\r\n\r\nexport interface ListTableRenderPassResult<RecordType> {\r\n didRender: boolean;\r\n empty: boolean;\r\n snapshot: ListTableRenderSnapshot<RecordType> | null;\r\n descriptors: RenderCellDescriptor[];\r\n projection: ListTableRuntimeProjection<RecordType> | null;\r\n emptyNormalizedColumns: NormalizedColumn<RecordType>[] | null;\r\n}\r\n\r\nexport interface ListTableRenderControllerOptions<RecordType> {\r\n createDefaultHitResult: () => DebugHitTestResult;\r\n getCanvasHostElement: () => HTMLElement | null;\r\n getCanvasElement: () => HTMLCanvasElement | null;\r\n getContainerClientHeight: () => number;\r\n getPaginationElement: () => HTMLDivElement | null;\r\n getPagination: () => Parameters<\r\n typeof syncListTablePagination<RecordType>\r\n >[0][\"pagination\"];\r\n getRenderer: () => CanvasRenderer | null;\r\n getDebugManager: () => DebugManager;\r\n getOptions: () => ListTableOptions<RecordType>;\r\n getTheme: () => ListTableTheme;\r\n getScroll: () => ScrollState;\r\n getSelectedRowKeys: () => Array<string | number>;\r\n getExpandedRowKeys: () => Array<string | number>;\r\n getCollapsedRowKeys: () => Array<string | number>;\r\n getQueryRuntimeState: () => ListTableQueryRuntimeState;\r\n getFrozenRows: () => FrozenRowState;\r\n isDraggingResize: () => boolean;\r\n getDraggingResizeColumnKey: () => string | null;\r\n getSwapAnimation: () => SwapAnimationState | null;\r\n getBaseRowsOverride: () => RecordType[] | null;\r\n getDisplayRowsOverride: () => RecordType[] | null;\r\n getTableZoom: () => number;\r\n getHover: () => HoverState;\r\n getSelection: () => ListTableSelectionState;\r\n getRangeHighlight: () => ListTableRangeHighlightState;\r\n getSortState: () => ListTableSortState;\r\n getFilterState: () => ListTableFilterState;\r\n getSelectedHeaderKey: () => string | null;\r\n getSummarySelected: () => boolean;\r\n getSelectedHeaderRect: () => Rect | null;\r\n getDraggingReorder: () => DraggingReorderState | null;\r\n getRowDragIndicator: () => { insertIndex: number; y: number } | null;\r\n getRuntimeColumns: () => Record<string, ListTableColumnRuntimeConfig>;\r\n getCurrentPage: () => number;\r\n getPageSize: () => number;\r\n getScrollPageSize: () => number;\r\n getStore: () => ListTableStore<RecordType>;\r\n getSummaryValueMap: () => Map<string, string> | null | undefined;\r\n setFittedHeight: (height: number | null) => void;\r\n applyRenderResult: (result: ListTableRenderPassResult<RecordType>) => void;\r\n ensureSummaryValues: (snapshot: ListTableRenderSnapshot<RecordType>) => void;\r\n clearSummaryForEmptySnapshot: () => void;\r\n emitQueryChange: (action: \"paginate\") => void;\r\n onEmptySnapshot: () => void;\r\n beforePublish: (snapshot: ListTableRenderSnapshot<RecordType>) => void;\r\n getPublishAccessors: () => ListTableRenderPublishAccessors<RecordType>;\r\n afterPublish: () => void;\r\n requestImmediateRender: () => void;\r\n scheduler?: ListTableRenderScheduler;\r\n}\r\n\r\n/**\r\n * 协调 ListTable 渲染调度与主渲染流程。\r\n */\r\nexport class ListTableRenderController<RecordType> {\r\n private readonly options: ListTableRenderControllerOptions<RecordType>;\r\n private readonly scheduler: ListTableRenderScheduler;\r\n private renderFrameId: number | null = null;\r\n private pendingRenderHitResult: DebugHitTestResult | null = null;\r\n private currentRenderSnapshot: ListTableRenderSnapshot<RecordType> | null =\n null;\n private descriptors: RenderCellDescriptor[] = [];\n private readonly renderCache: ListTableRenderCache<RecordType> = {};\n\r\n constructor(options: ListTableRenderControllerOptions<RecordType>) {\r\n this.options = options;\r\n this.scheduler = options.scheduler ?? createDefaultRenderScheduler();\r\n }\r\n\r\n /**\r\n * 合并同帧多次渲染请求,并保留最后一次 hit result。\r\n */\r\n schedule(hitResult?: DebugHitTestResult) {\r\n if (hitResult) {\r\n this.pendingRenderHitResult = hitResult;\r\n }\r\n\r\n if (this.renderFrameId != null) {\r\n return;\r\n }\r\n\r\n this.renderFrameId = this.scheduler.requestAnimationFrame(() => {\r\n this.renderFrameId = null;\r\n const nextHitResult =\r\n this.pendingRenderHitResult ?? this.options.createDefaultHitResult();\r\n this.pendingRenderHitResult = null;\r\n this.render(nextHitResult);\r\n });\r\n }\r\n\r\n /**\r\n * 执行完整渲染主流程,并回写 runtime projection。\r\n */\r\n render(\r\n hitResult: DebugHitTestResult = this.options.createDefaultHitResult(),\r\n ): ListTableRenderPassResult<RecordType> {\r\n const canvasHostElement = this.options.getCanvasHostElement();\r\n const canvasElement = this.options.getCanvasElement();\r\n const renderer = this.options.getRenderer();\r\n if (!canvasHostElement || !canvasElement || !renderer) {\r\n return this.createSkippedResult();\r\n }\r\n\r\n // 先用挂载容器高度判断是否需要按内容收缩;\r\n // 最终绘制尺寸严格取画布宿主真实 client 像素,避免 bitmap 与 CSS 不一致导致发糊。\r\n this.syncFittedHostHeight();\r\n const { width, height } = resolveListTableRenderHostSize({\r\n canvasHostElement,\r\n fallbackWidth: FALLBACK_TABLE_WIDTH,\r\n fallbackHeight: FALLBACK_TABLE_HEIGHT,\r\n });\r\n const zoom = this.resolveZoom();\r\n // 宿主宽高是可视 CSS 像素;布局坐标系为 host/zoom。\r\n // setTransform(dpr*zoom) 把布局单位放大回填可视区域,避免 CSS scale 发糊。\r\n const layoutWidth = width / zoom;\r\n const layoutHeight = height / zoom;\r\n renderer.resize(width, height, zoom);\r\n\r\n const snapshot = this.buildSnapshot(layoutWidth, layoutHeight);\r\n if (!snapshot) {\r\n return this.renderEmptySnapshot({\r\n renderer,\r\n layoutWidth,\r\n layoutHeight,\r\n });\r\n }\r\n\r\n return this.renderSnapshot({\r\n renderer,\r\n snapshot,\r\n hitResult,\r\n layoutWidth,\r\n layoutHeight,\r\n });\r\n }\r\n\r\n /**\r\n * 根据内容高度决定是否收缩宿主;最终绘制仍以画布宿主 client 尺寸为准。\r\n */\r\n syncFittedHostHeight() {\r\n const canvasHostElement = this.options.getCanvasHostElement();\r\n if (!canvasHostElement) {\r\n return;\r\n }\r\n\r\n const hostSize = resolveListTableRenderHostSize({\r\n canvasHostElement,\r\n fallbackWidth: FALLBACK_TABLE_WIDTH,\r\n fallbackHeight: FALLBACK_TABLE_HEIGHT,\r\n });\r\n const availableHeight =\r\n this.options.getContainerClientHeight() > 0\r\n ? this.options.getContainerClientHeight()\r\n : hostSize.height;\r\n const zoom = this.resolveZoom();\r\n // 内容按布局坐标系测量;可用高度/适配高度使用可视 CSS 像素。\r\n const layoutWidth = hostSize.width / zoom;\r\n const layoutAvailableHeight = availableHeight / zoom;\r\n const measureSnapshot = this.buildSnapshot(\n layoutWidth,\n layoutAvailableHeight,\n false,\n );\r\n\r\n if (!measureSnapshot) {\r\n this.options.setFittedHeight(null);\r\n return;\r\n }\r\n\r\n const contentHeight = resolveTableContentHeight({\r\n headerHeight: Math.max(\r\n measureSnapshot.bodyLayout.scrollBodyTop -\r\n measureSnapshot.bodyLayout.topFrozenHeight,\r\n measureSnapshot.headerRowHeight,\r\n ),\r\n topFrozenHeight: measureSnapshot.bodyLayout.topFrozenHeight,\r\n totalBodyHeight: Math.max(\r\n measureSnapshot.bodyLayout.totalBodyHeight,\r\n measureSnapshot.displayRows.length === 0\r\n ? measureSnapshot.rowHeight\r\n : 0,\r\n ),\r\n bottomFrozenHeight: measureSnapshot.bodyLayout.bottomFrozenHeight,\r\n summaryHeight: measureSnapshot.bodyLayout.summaryHeight,\r\n });\r\n const paginationElement = this.options.getPaginationElement();\r\n const paginationHeight =\r\n paginationElement && paginationElement.style.display !== \"none\"\r\n ? paginationElement.offsetHeight\r\n : 0;\r\n const fittedHeight = resolveFittedTableHeight({\r\n availableHeight,\r\n contentHeight: contentHeight * zoom + paginationHeight,\r\n });\r\n this.options.setFittedHeight(\r\n fittedHeight == null ? null : fittedHeight + TABLE_CONTENT_BORDER_SIZE,\r\n );\r\n }\r\n\r\n getCurrentRenderSnapshot() {\r\n return this.currentRenderSnapshot;\r\n }\r\n\r\n getDescriptors() {\r\n return this.descriptors;\r\n }\r\n\r\n measureCurrentSnapshot() {\r\n const current = this.currentRenderSnapshot;\r\n if (current) {\r\n return this.buildSnapshot(current.width, current.height);\r\n }\r\n\r\n const canvasHostElement = this.options.getCanvasHostElement();\r\n if (!canvasHostElement) {\r\n return null;\r\n }\r\n\r\n const { width, height } = resolveListTableRenderHostSize({\r\n canvasHostElement,\r\n fallbackWidth: FALLBACK_TABLE_WIDTH,\r\n fallbackHeight: FALLBACK_TABLE_HEIGHT,\r\n });\r\n const zoom = this.resolveZoom();\r\n return this.buildSnapshot(width / zoom, height / zoom);\r\n }\r\n\r\n destroy() {\r\n if (this.renderFrameId != null) {\r\n this.scheduler.cancelAnimationFrame(this.renderFrameId);\r\n this.renderFrameId = null;\r\n }\r\n this.pendingRenderHitResult = null;\n this.currentRenderSnapshot = null;\n this.descriptors = [];\n this.renderCache.snapshot = undefined;\n this.renderCache.inputs = undefined;\n this.renderCache.autoRowHeight = undefined;\n }\r\n\r\n private renderEmptySnapshot(params: {\r\n renderer: CanvasRenderer;\r\n layoutWidth: number;\r\n layoutHeight: number;\r\n }): ListTableRenderPassResult<RecordType> {\r\n const { renderer, layoutWidth, layoutHeight } = params;\r\n const options = this.options.getOptions();\r\n this.options.onEmptySnapshot();\r\n const emptyNormalizedColumns = normalizeColumns(\r\n getResolvedColumns(options, this.options.getSelectedRowKeys()),\r\n );\r\n this.currentRenderSnapshot = null;\r\n this.descriptors = [];\r\n this.options.clearSummaryForEmptySnapshot();\r\n renderer.clear(layoutWidth, layoutHeight);\r\n renderer.drawEmpty(\r\n layoutWidth,\r\n layoutHeight,\r\n options.emptyText ?? \"当前没有可展示的列配置。\",\r\n );\r\n\r\n const result: ListTableRenderPassResult<RecordType> = {\r\n didRender: true,\r\n empty: true,\r\n snapshot: null,\r\n descriptors: [],\r\n projection: null,\r\n emptyNormalizedColumns,\r\n };\r\n this.options.applyRenderResult(result);\r\n return result;\r\n }\r\n\r\n private renderSnapshot(params: {\r\n renderer: CanvasRenderer;\r\n snapshot: ListTableRenderSnapshot<RecordType>;\r\n hitResult: DebugHitTestResult;\r\n layoutWidth: number;\r\n layoutHeight: number;\r\n }): ListTableRenderPassResult<RecordType> {\r\n const { renderer, snapshot, hitResult, layoutWidth, layoutHeight } = params;\r\n this.currentRenderSnapshot = snapshot;\r\n this.options.ensureSummaryValues(snapshot);\r\n renderer.clear(layoutWidth, layoutHeight);\r\n this.descriptors = [];\r\n this.options.beforePublish(snapshot);\r\n\r\n const projection = projectRuntimeStateFromSnapshot(snapshot);\r\n // 先投影 runtime(含 scroll/scrollPageSize),再同步分页,保持与主类原行为一致。\r\n const projectedResult: ListTableRenderPassResult<RecordType> = {\r\n didRender: true,\r\n empty: false,\r\n snapshot,\r\n descriptors: this.descriptors,\r\n projection,\r\n emptyNormalizedColumns: null,\r\n };\r\n this.options.applyRenderResult(projectedResult);\r\n\r\n syncListTablePagination({\r\n element: this.options.getPaginationElement(),\r\n pagination: this.options.getPagination(),\r\n options: this.options.getOptions(),\r\n total: snapshot.baseRows.length,\r\n currentPage: this.options.getCurrentPage(),\r\n pageSize: this.options.getPageSize(),\r\n scrollPageSize: this.options.getScrollPageSize(),\r\n store: this.options.getStore(),\r\n emitQueryChange: (action) => {\r\n this.options.emitQueryChange(action);\r\n },\r\n render: () => {\r\n this.options.requestImmediateRender();\r\n },\r\n });\r\n\r\n const publishAccessors = this.options.getPublishAccessors();\r\n publishListTableRender({\r\n renderer,\r\n snapshot,\r\n summaryValues: this.options.getSummaryValueMap(),\r\n descriptors: this.descriptors,\r\n options: this.options.getOptions(),\r\n theme: this.options.getTheme(),\r\n hover: this.options.getHover(),\r\n selection: this.options.getSelection(),\r\n rangeHighlight: this.options.getRangeHighlight(),\r\n sortState: this.options.getSortState(),\r\n filterState: this.options.getFilterState(),\r\n selectedRowKeys: this.options.getSelectedRowKeys(),\r\n selectedHeaderKey: this.options.getSelectedHeaderKey(),\r\n summarySelected: this.options.getSummarySelected(),\r\n selectedHeaderRect: this.options.getSelectedHeaderRect(),\r\n draggingReorder: this.options.getDraggingReorder(),\r\n rowDragIndicator: this.options.getRowDragIndicator(),\r\n scrollbarOpacity: publishAccessors.scrollbarOpacity,\r\n isScrollbarInteractive: publishAccessors.isScrollbarInteractive,\r\n getControlAnimationProgress: publishAccessors.getControlAnimationProgress,\r\n getNestedTableHighlight: publishAccessors.getNestedTableHighlight,\r\n getExpandAnimationProgress: publishAccessors.getExpandAnimationProgress,\r\n getCollapseRowOffset: publishAccessors.getCollapseRowOffset,\r\n getCollapseCellHeight: publishAccessors.getCollapseCellHeight,\r\n getValidationMessage: publishAccessors.getValidationMessage,\r\n requestRender: () => {\r\n this.options.requestImmediateRender();\r\n },\r\n runtimeColumns: this.options.getRuntimeColumns(),\r\n hitResult,\r\n debugManager: this.options.getDebugManager(),\r\n });\r\n this.options.afterPublish();\r\n // descriptors 可能在 publish 期间被 pipeline 填充,回传最新引用。\r\n projectedResult.descriptors = this.descriptors;\r\n return projectedResult;\r\n }\r\n\r\n private buildSnapshot(width: number, height: number, useCache = true) {\n return buildListTableRenderSnapshot({\r\n options: this.options.getOptions(),\r\n theme: this.options.getTheme(),\r\n width,\r\n height,\r\n scroll: this.options.getScroll(),\r\n selectedRowKeys: this.options.getSelectedRowKeys(),\r\n expandedRowKeys: this.options.getExpandedRowKeys(),\r\n collapsedRowKeys: this.options.getCollapsedRowKeys(),\r\n query: this.options.getQueryRuntimeState(),\r\n frozenRows: this.options.getFrozenRows(),\r\n draggingResize: this.options.isDraggingResize(),\r\n draggingResizeColumnKey: this.options.getDraggingResizeColumnKey(),\r\n swapAnimation: this.options.getSwapAnimation(),\r\n baseRowsOverride: this.options.getBaseRowsOverride(),\r\n displayRowsOverride: this.options.getDisplayRowsOverride(),\n cache: useCache ? this.renderCache : undefined,\n });\n }\r\n\r\n private resolveZoom() {\r\n const zoom = this.options.getTableZoom();\r\n return zoom > 0 ? zoom : 1;\r\n }\r\n\r\n private createSkippedResult(): ListTableRenderPassResult<RecordType> {\r\n return {\r\n didRender: false,\r\n empty: false,\r\n snapshot: this.currentRenderSnapshot,\r\n descriptors: this.descriptors,\r\n projection: null,\r\n emptyNormalizedColumns: null,\r\n };\r\n }\r\n}\r\n\r\nfunction createDefaultRenderScheduler(): ListTableRenderScheduler {\r\n return {\r\n requestAnimationFrame: (callback) => window.requestAnimationFrame(callback),\r\n cancelAnimationFrame: (id) => window.cancelAnimationFrame(id),\r\n };\r\n}\r\n","import type { ListTableOptions } from \"../../schema/table-options\";\r\nimport {\r\n freezeRowKey,\r\n getFrozenRowPosition,\r\n unfreezeRowKey,\r\n type FrozenRowPosition,\r\n type FrozenRowState,\r\n} from \"../../domain/rows/frozen-rows\";\r\nimport { getRowKey } from \"../../domain/rows/row-selection\";\r\n\r\n/**\r\n * 冻结指定显示行。\r\n */\r\nexport function freezeDisplayRow<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n displayRows: RecordType[];\r\n rowIndex: number;\r\n position: FrozenRowPosition;\r\n state: FrozenRowState;\r\n}) {\r\n const record = params.displayRows[params.rowIndex];\r\n if (!record) {\r\n return params.state;\r\n }\r\n\r\n return freezeRowKey(\r\n params.state,\r\n getRowKey(params.options, record, params.rowIndex),\r\n params.position,\r\n );\r\n}\r\n\r\n/**\r\n * 取消冻结指定显示行。\r\n */\r\nexport function unfreezeDisplayRow<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n displayRows: RecordType[];\r\n rowIndex: number;\r\n state: FrozenRowState;\r\n}) {\r\n const record = params.displayRows[params.rowIndex];\r\n if (!record) {\r\n return params.state;\r\n }\r\n\r\n return unfreezeRowKey(\r\n params.state,\r\n getRowKey(params.options, record, params.rowIndex),\r\n );\r\n}\r\n\r\n/**\r\n * 获取指定显示行冻结位置。\r\n */\r\nexport function getDisplayRowFrozenPosition<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n displayRows: RecordType[];\r\n rowIndex: number;\r\n state: FrozenRowState;\r\n}) {\r\n const record = params.displayRows[params.rowIndex];\r\n if (!record) {\r\n return null;\r\n }\r\n\r\n return getFrozenRowPosition(\r\n params.state,\r\n getRowKey(params.options, record, params.rowIndex),\r\n );\r\n}\r\n","import type { ListTableOptions } from \"../schema/table-options\";\r\nimport type { FrozenRowPosition, FrozenRowState } from \"../domain/rows/frozen-rows\";\r\nimport {\r\n freezeDisplayRow,\r\n getDisplayRowFrozenPosition,\r\n unfreezeDisplayRow,\r\n} from \"../features/frozen-rows/frozen-rows-feature\";\r\n\r\n/**\r\n * 冻结显示行。\r\n */\r\nexport function resolveFreezeRowAction<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n displayRows: RecordType[];\r\n rowIndex: number;\r\n position: FrozenRowPosition;\r\n state: FrozenRowState;\r\n}) {\r\n return freezeDisplayRow(params);\r\n}\r\n\r\n/**\r\n * 取消冻结显示行。\r\n */\r\nexport function resolveUnfreezeRowAction<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n displayRows: RecordType[];\r\n rowIndex: number;\r\n state: FrozenRowState;\r\n}) {\r\n return unfreezeDisplayRow(params);\r\n}\r\n\r\n/**\r\n * 获取显示行冻结位置。\r\n */\r\nexport function resolveFrozenRowPositionAction<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n displayRows: RecordType[];\r\n rowIndex: number;\r\n state: FrozenRowState;\r\n}) {\r\n return getDisplayRowFrozenPosition(params);\r\n}\r\n","import type { ListTableOptions } from \"../../schema/table-options\";\r\nimport {\r\n getSelectedRows,\r\n resolveToggleAllVisibleRowKeys,\r\n resolveToggledRowSelectionKeys,\r\n} from \"../../domain/rows/row-selection\";\r\n\r\nexport interface ToggleSingleRowSelectionResult<RecordType> {\r\n nextKeys: Array<string | number>;\r\n selectedRows: RecordType[];\r\n selected: boolean;\r\n}\r\n\r\n/**\r\n * 切换单行选择。\r\n */\r\nexport function toggleSingleRowSelection<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: Array<string | number>;\r\n record: RecordType;\r\n rowIndex: number;\r\n}): ToggleSingleRowSelectionResult<RecordType> | null {\r\n const resolved = resolveToggledRowSelectionKeys(params);\r\n if (!resolved || resolved.nextKeys === params.selectedRowKeys) {\r\n return null;\r\n }\r\n\r\n return {\r\n nextKeys: resolved.nextKeys,\r\n selectedRows: getSelectedRows(params.options, resolved.nextKeys),\r\n selected: resolved.selected,\r\n };\r\n}\r\n\r\n/**\r\n * 切换当前可见行全选。\r\n */\r\nexport function toggleAllVisibleRowSelection<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: Array<string | number>;\r\n displayData: RecordType[];\r\n}) {\r\n return resolveToggleAllVisibleRowKeys(params);\r\n}\r\n","import type { ListTableOptions } from \"../schema/table-options\";\r\nimport {\r\n getListTableSelectedRows,\r\n} from \"./data-source-service\";\r\n\r\nexport type ListTableSelectionChangeType =\r\n | \"single\"\r\n | \"all\"\r\n | \"invert\"\r\n | \"none\"\r\n | \"multiple\";\r\n\r\n/**\r\n * 触发行选择 onChange 回调。\r\n */\r\nexport function emitSelectionChange<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n nextKeys: Array<string | number>;\r\n changeType: ListTableSelectionChangeType;\r\n}) {\r\n const selectedRows = getListTableSelectedRows({\r\n options: params.options,\r\n selectedRowKeys: params.nextKeys,\r\n });\r\n params.options.rowSelection?.onChange?.(params.nextKeys, selectedRows, {\r\n type: params.changeType,\r\n });\r\n return selectedRows;\r\n}\r\n","import type { ListTableOptions } from \"../schema/table-options\";\r\nimport {\r\n toggleAllVisibleRowSelection,\r\n toggleSingleRowSelection,\r\n} from \"../features/row-selection/row-selection-feature\";\r\nimport { emitSelectionChange, type ListTableSelectionChangeType } from \"./selection-service\";\r\n\r\nexport interface ToggleSelectionActionResult<RecordType> {\r\n nextKeys: Array<string | number>;\r\n selectedRows: RecordType[];\r\n selected: boolean;\r\n}\r\n\r\n/**\r\n * 处理单行选择动作。\r\n */\r\nexport function resolveToggleSingleSelectionAction<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: Array<string | number>;\r\n record: RecordType;\r\n rowIndex: number;\r\n}) {\r\n return toggleSingleRowSelection(params);\r\n}\r\n\r\n/**\r\n * 处理当前可见行全选动作。\r\n */\r\nexport function resolveToggleAllVisibleSelectionAction<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n selectedRowKeys: Array<string | number>;\r\n displayData: RecordType[];\r\n}) {\r\n return toggleAllVisibleRowSelection(params);\r\n}\r\n\r\n/**\r\n * 应用选中 key 变更并触发行选择回调。\r\n */\r\nexport function applySelectionKeysChange<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n nextKeys: Array<string | number>;\r\n changeType: ListTableSelectionChangeType;\r\n}) {\r\n return emitSelectionChange(params);\r\n}\r\n","import type { ListTableOptions } from \"../schema/table-options\";\r\nimport {\r\n getEffectivePageSize,\r\n isScrollPaginationMode,\r\n resolveNextScrollPage,\r\n type PaginationState,\r\n} from \"../domain/rows/pagination\";\r\n\r\n/**\r\n * 推进滚动分页。\r\n */\r\nexport function resolveNextScrollPaginationPage<RecordType>(params: {\r\n options: ListTableOptions<RecordType>;\r\n paginationState: PaginationState;\r\n totalRows: number;\r\n scrollTop: number;\r\n maxScrollTop: number;\r\n rowHeight: number;\r\n}) {\r\n const { options } = params;\r\n if (!options.pagination || !isScrollPaginationMode(options)) {\r\n return null;\r\n }\r\n\r\n const nextPage = resolveNextScrollPage({\r\n options,\r\n state: params.paginationState,\r\n totalRows: params.totalRows,\r\n scrollTop: params.scrollTop,\r\n maxScrollTop: params.maxScrollTop,\r\n rowHeight: params.rowHeight,\r\n });\r\n if (!nextPage) {\r\n return null;\r\n }\r\n\r\n return {\r\n nextPage,\r\n pageSize: getEffectivePageSize(options, {\r\n currentPage: nextPage,\r\n pageSize: params.paginationState.pageSize,\r\n scrollPageSize: params.paginationState.scrollPageSize,\r\n }),\r\n };\r\n}\r\n","/**\r\n * 解析折叠触发器 contentKey 上的行/列区间。\r\n */\r\nexport function parseCollapsedRange(contentKey: string) {\r\n const [startText, endText] = contentKey.split(\":\");\r\n const start = Number(startText);\r\n const end = Number(endText);\r\n if (!Number.isInteger(start) || !Number.isInteger(end) || start > end) {\r\n return null;\r\n }\r\n\r\n return { start, end };\r\n}\r\n","/**\r\n * 根据列左边界与宽度计算右边界。\r\n */\r\nexport function fromBoundaryRightX(\r\n columnKey: string,\r\n positions: Map<string, number>,\r\n widths: Map<string, number>,\r\n) {\r\n const drawX = positions.get(columnKey);\r\n const width = widths.get(columnKey);\r\n if (drawX == null) {\r\n return undefined;\r\n }\r\n\r\n return drawX + (width ?? 0);\r\n}\r\n","import type { RenderCellDescriptor } from \"../../debug/debug-snapshot\";\r\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport type { ColumnSegments } from \"../../domain/columns/column-layout\";\r\nimport {\r\n getHeaderLeafColumnKeys,\r\n restoreAllHiddenHeaderColumns,\r\n restoreHeaderColumnRange,\r\n} from \"../../features/header-settings/header-settings-feature\";\r\nimport type { FrozenRowPosition, FrozenRowState } from \"../../domain/rows/frozen-rows\";\r\nimport {\r\n collectSegmentPositions,\r\n resolveSwapAnimationColumns,\r\n} from \"../../features/column-reorder/column-reorder-feature\";\r\nimport { captureRenderedVisibleRowPositions } from \"../../rendering/pipeline/visible-row\";\nimport {\r\n resolveExpandedRowsReset,\r\n resolveExpandedRowToggle,\r\n} from \"../../services/expandable-service\";\r\nimport {\r\n resolveCollapsedRowKeysForCollapse,\r\n resolveCollapsedRowKeysForExpand,\r\n} from \"../../services/collapsible-row-service\";\r\nimport {\r\n resolveFreezeRowAction,\r\n resolveFrozenRowPositionAction,\r\n resolveUnfreezeRowAction,\r\n} from \"../../services/frozen-row-action-service\";\r\nimport {\r\n applySelectionKeysChange,\r\n resolveToggleAllVisibleSelectionAction,\r\n resolveToggleSingleSelectionAction,\r\n} from \"../../services/selection-action-service\";\r\nimport { getListTableUncollapsedVisibleRows } from \"../../services/data-source-service\";\r\nimport { resolveNextScrollPaginationPage } from \"../../services/scroll-pagination-service\";\r\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\r\nimport { parseCollapsedRange } from \"../../domain/rows/collapse-range\";\r\nimport { fromBoundaryRightX } from \"../../domain/columns/column-boundary\";\r\nimport { resolveCollapsedRowRange } from \"../../shared/animations/collapse-animation\";\r\nimport { DEFAULT_ROW_HEIGHT } from \"../../domain/constants\";\r\nimport type { ListTableAnimationController } from \"./animation-controller\";\r\nimport type { ListTableRangeHighlightState } from \"../../schema/state\";\r\nimport type { ScrollState } from \"../../schema/state\";\r\n\r\nexport interface ListTableRowActionControllerOptions<RecordType> {\r\n getOptions: () => ListTableOptions<RecordType>;\r\n getLeafColumns: () => InternalLeafColumn<RecordType>[];\r\n getColumnSegments: () => ColumnSegments<RecordType>;\r\n getExpandedRowKeys: () => Array<string | number>;\r\n setExpandedRowKeys: (value: Array<string | number>) => void;\r\n getCollapsedRowKeys: () => Array<string | number>;\r\n setCollapsedRowKeys: (value: Array<string | number>) => void;\r\n getFrozenRows: () => FrozenRowState;\r\n setFrozenRows: (value: FrozenRowState) => void;\r\n getSelectedRowKeys: () => Array<string | number>;\r\n setSelectedRowKeys: (value: Array<string | number>) => void;\r\n getRangeHighlight: () => ListTableRangeHighlightState;\r\n getCurrentRenderSnapshot: () => ListTableRenderSnapshot<RecordType> | null;\r\n getDescriptors: () => RenderCellDescriptor[];\r\n getDisplayData: () => RecordType[];\r\n getBaseDisplayData: () => RecordType[];\r\n getCurrentPage: () => number;\r\n setCurrentPage: (value: number) => void;\r\n getPageSize: () => number;\r\n getScrollPageSize: () => number;\r\n getScroll: () => ScrollState;\r\n getMaxScrollTop: () => number | undefined;\r\n animationController: ListTableAnimationController<RecordType>;\r\n hideHeaderContextMenu: () => void;\r\n clearSelectedHeader: () => void;\r\n refreshRuntimeColumns: () => void;\r\n persistColumnConfig: () => void;\r\n emitQueryChange: (action: \"sort\" | \"filter\" | \"paginate\") => void;\r\n requestRender: () => void;\r\n}\r\n\r\n/**\r\n * 协调行展开/折叠、冻结、行选择与滚动分页等动作。\r\n */\r\nexport class ListTableRowActionController<RecordType> {\r\n private readonly options: ListTableRowActionControllerOptions<RecordType>;\r\n\r\n constructor(options: ListTableRowActionControllerOptions<RecordType>) {\r\n this.options = options;\r\n }\r\n\r\n freezeRow(rowIndex: number, position: FrozenRowPosition) {\r\n this.options.setFrozenRows(\r\n resolveFreezeRowAction({\r\n options: this.options.getOptions(),\r\n displayRows: this.options.getDisplayData(),\r\n rowIndex,\r\n position,\r\n state: this.options.getFrozenRows(),\r\n }),\r\n );\r\n this.options.hideHeaderContextMenu();\r\n this.options.requestRender();\r\n }\r\n\r\n unfreezeRow(rowIndex: number) {\r\n this.options.setFrozenRows(\r\n resolveUnfreezeRowAction({\r\n options: this.options.getOptions(),\r\n displayRows: this.options.getDisplayData(),\r\n rowIndex,\r\n state: this.options.getFrozenRows(),\r\n }),\r\n );\r\n this.options.hideHeaderContextMenu();\r\n this.options.requestRender();\r\n }\r\n\r\n getFrozenRowPosition(rowIndex: number): \"top\" | \"bottom\" | null {\r\n return resolveFrozenRowPositionAction({\r\n options: this.options.getOptions(),\r\n displayRows: this.options.getDisplayData(),\r\n rowIndex,\r\n state: this.options.getFrozenRows(),\r\n });\r\n }\r\n\r\n clearExpandedRows() {\r\n const resolved = resolveExpandedRowsReset({\r\n expandedRowKeys: this.options.getExpandedRowKeys(),\r\n expandable: this.options.getOptions().expandable,\r\n });\r\n if (!resolved.changed) {\r\n return false;\r\n }\r\n\r\n if (resolved.shouldSetState) {\r\n this.options.setExpandedRowKeys(resolved.nextExpandedRowKeys);\r\n }\r\n if (resolved.shouldNotify) {\r\n this.options\r\n .getOptions()\r\n .expandable?.onExpandedRowsChange?.(resolved.nextExpandedRowKeys);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n clearCollapsedRows() {\r\n if (this.options.getCollapsedRowKeys().length === 0) {\r\n return false;\r\n }\r\n\r\n this.options.setCollapsedRowKeys([]);\r\n return true;\r\n }\r\n\r\n expandAllCollapsedRows() {\r\n if (this.options.getCollapsedRowKeys().length === 0) {\r\n return false;\r\n }\r\n\r\n this.options.animationController.setPendingCollapseRowPositions(\r\n this.captureVisibleRowPositions(),\r\n );\r\n this.options.setCollapsedRowKeys([]);\r\n this.options.hideHeaderContextMenu();\r\n this.options.requestRender();\r\n return true;\r\n }\r\n\r\n expandAllCollapsedColumns() {\r\n const previousLeafColumns = this.options.getLeafColumns();\r\n const previousSegments = this.options.getColumnSegments();\r\n if (!restoreAllHiddenHeaderColumns(this.options.getOptions().columns)) {\r\n return false;\r\n }\r\n\r\n this.options.clearSelectedHeader();\r\n this.options.refreshRuntimeColumns();\r\n this.options.persistColumnConfig();\r\n this.options.hideHeaderContextMenu();\r\n this.options.requestRender();\r\n this.startColumnVisibilityAnimation({\r\n previousLeafColumns,\r\n previousSegments,\r\n });\r\n return true;\r\n }\r\n\r\n collapseHighlightedRows(rowIndex: number) {\r\n const rowRange = resolveCollapsedRowRange({\r\n rowIndex,\r\n selectedRowRange: this.options.getRangeHighlight().selectedRowRange,\r\n });\r\n if (!rowRange) {\r\n return false;\r\n }\r\n\r\n this.options.animationController.setPendingCollapseRowPositions(\r\n this.captureVisibleRowPositions(),\r\n );\r\n this.prepareCollapsedMergedCellAnimations(rowRange);\r\n this.options.setCollapsedRowKeys(\r\n resolveCollapsedRowKeysForCollapse({\r\n visibleRows: this.getUncollapsedVisibleRows(),\r\n currentCollapsedRowKeys: this.options.getCollapsedRowKeys(),\r\n rowRange,\r\n }),\r\n );\r\n this.options.hideHeaderContextMenu();\r\n this.options.requestRender();\r\n return true;\r\n }\r\n\r\n expandCollapsedRange(contentKey: string) {\r\n const rowRange = parseCollapsedRange(contentKey);\r\n if (!rowRange) {\r\n return false;\r\n }\r\n\r\n this.options.animationController.setPendingCollapseRowPositions(\r\n this.captureVisibleRowPositions(),\r\n );\r\n this.options.setCollapsedRowKeys(\r\n resolveCollapsedRowKeysForExpand({\r\n visibleRows: this.getUncollapsedVisibleRows(),\r\n currentCollapsedRowKeys: this.options.getCollapsedRowKeys(),\r\n rowRange,\r\n }),\r\n );\r\n this.options.requestRender();\r\n return true;\r\n }\r\n\r\n expandCollapsedColumnRange(contentKey: string) {\r\n const columnRange = parseCollapsedRange(contentKey);\r\n if (!columnRange) {\r\n return false;\r\n }\r\n\r\n const previousLeafColumns = this.options.getLeafColumns();\r\n const previousSegments = this.options.getColumnSegments();\r\n const updated = restoreHeaderColumnRange({\r\n columns: this.options.getOptions().columns,\r\n rangeStart: columnRange.start,\r\n rangeEnd: columnRange.end,\r\n });\r\n if (!updated) {\r\n return false;\r\n }\r\n\r\n this.options.refreshRuntimeColumns();\r\n this.options.persistColumnConfig();\r\n this.options.requestRender();\r\n this.startColumnVisibilityAnimation({\r\n previousLeafColumns,\r\n previousSegments,\r\n range: columnRange,\r\n });\r\n return true;\r\n }\r\n\r\n /**\r\n * 在列显隐变化后启动横向位置过渡动画。\r\n */\r\n startColumnVisibilityAnimation(params: {\r\n previousLeafColumns: InternalLeafColumn<RecordType>[];\r\n previousSegments: ColumnSegments<RecordType>;\r\n range?: { start: number; end: number };\r\n }) {\r\n const fromPositions = collectSegmentPositions([\r\n params.previousSegments.leftSegment,\r\n params.previousSegments.centerSegment,\r\n params.previousSegments.rightSegment,\r\n ]);\r\n if (fromPositions.size === 0) {\r\n return;\r\n }\r\n\r\n const currentSegments = this.options.getColumnSegments();\r\n const toPositions = collectSegmentPositions([\r\n currentSegments.leftSegment,\r\n currentSegments.centerSegment,\r\n currentSegments.rightSegment,\r\n ]);\r\n const animColumns = resolveSwapAnimationColumns(fromPositions, toPositions);\r\n this.appendExpandedColumnAnimations({\r\n animColumns,\r\n fromPositions,\r\n toPositions,\r\n previousLeafColumns: params.previousLeafColumns,\r\n range: params.range,\r\n });\r\n if (animColumns.size === 0) {\r\n return;\r\n }\r\n\r\n this.options.animationController.startSwapColumnAnimation(animColumns, 220);\r\n }\r\n\r\n toggleRowExpand(rowIndex: number) {\r\n const expandable = this.options.getOptions().expandable;\r\n if (!expandable) {\r\n return false;\r\n }\r\n\r\n const snapshot = this.options.getCurrentRenderSnapshot();\r\n const resolved = snapshot\r\n ? resolveExpandedRowToggle({\r\n visibleRows: snapshot.visibleRows,\r\n expandedRowKeys: this.options.getExpandedRowKeys(),\r\n rowIndex,\r\n })\r\n : null;\r\n if (!resolved) {\r\n return false;\r\n }\r\n\r\n if (expandable.expandedRowKeys === undefined) {\r\n this.options.animationController.setPendingCollapseRowPositions(\r\n this.captureVisibleRowPositions(),\r\n );\r\n this.options.setExpandedRowKeys(resolved.nextExpandedRowKeys);\r\n }\r\n expandable.onExpand?.(resolved.expanded, resolved.row.record);\r\n expandable.onExpandedRowsChange?.(resolved.nextExpandedRowKeys);\r\n this.options.requestRender();\r\n return true;\r\n }\r\n\r\n toggleRowSelection(record: RecordType, rowIndex: number) {\r\n const resolved = resolveToggleSingleSelectionAction({\r\n options: this.options.getOptions(),\r\n selectedRowKeys: this.options.getSelectedRowKeys(),\r\n record,\r\n rowIndex,\r\n });\r\n if (!resolved) {\r\n return;\r\n }\r\n\r\n this.updateSelectedRowKeys(resolved.nextKeys, \"single\");\r\n this.options.getOptions().rowSelection?.onSelect?.(\r\n record,\r\n !resolved.selected,\r\n resolved.selectedRows,\r\n );\r\n this.options.requestRender();\r\n }\r\n\r\n toggleSelectAllVisibleRows() {\r\n const nextKeys = resolveToggleAllVisibleSelectionAction({\r\n options: this.options.getOptions(),\r\n selectedRowKeys: this.options.getSelectedRowKeys(),\r\n displayData: this.options.getDisplayData(),\r\n });\r\n if (!nextKeys) {\r\n return;\r\n }\r\n\r\n this.updateSelectedRowKeys(nextKeys, \"all\");\r\n this.options.requestRender();\r\n }\r\n\r\n maybeLoadNextScrollPage() {\r\n const maxScrollTop = this.options.getMaxScrollTop();\r\n if (maxScrollTop == null) {\r\n return;\r\n }\r\n\r\n const resolved = resolveNextScrollPaginationPage({\r\n options: this.options.getOptions(),\r\n paginationState: {\r\n currentPage: this.options.getCurrentPage(),\r\n pageSize: this.options.getPageSize(),\r\n scrollPageSize: this.options.getScrollPageSize(),\r\n },\r\n totalRows: this.options.getBaseDisplayData().length,\r\n scrollTop: this.options.getScroll().top,\r\n maxScrollTop,\r\n rowHeight:\r\n this.options.getCurrentRenderSnapshot()?.rowHeight ?? DEFAULT_ROW_HEIGHT,\r\n });\r\n if (!resolved) {\r\n return;\r\n }\r\n\r\nthis.options.setCurrentPage(resolved.nextPage);\r\n const pagination = this.options.getOptions().pagination;\r\n if (pagination) {\r\n pagination.onChange?.(resolved.nextPage, resolved.pageSize);\r\n }\r\n if (this.options.getOptions().query?.onChange) {\r\n this.options.emitQueryChange(\"paginate\");\r\n return;\r\n }\r\n\r\n this.options.requestRender();\r\n }\r\n\r\n private updateSelectedRowKeys(\r\n nextKeys: Array<string | number>,\r\n changeType: \"single\" | \"all\" | \"invert\" | \"none\" | \"multiple\",\r\n ) {\r\n this.options.setSelectedRowKeys(nextKeys);\r\n applySelectionKeysChange({\r\n options: this.options.getOptions(),\r\n nextKeys,\r\n changeType,\r\n });\r\n }\r\n\r\n private getUncollapsedVisibleRows() {\r\n return getListTableUncollapsedVisibleRows({\r\n options: this.options.getOptions(),\r\n rows: this.options.getDisplayData(),\r\n expandedRowKeys: this.options.getExpandedRowKeys(),\r\n });\r\n }\r\n\r\n private captureVisibleRowPositions() {\r\n return captureRenderedVisibleRowPositions(\r\n this.options.getCurrentRenderSnapshot(),\r\n );\r\n }\r\n\r\n private appendExpandedColumnAnimations(params: {\r\n animColumns: Map<string, { from: number; to: number }>;\r\n fromPositions: Map<string, number>;\r\n toPositions: Map<string, number>;\r\n previousLeafColumns: InternalLeafColumn<RecordType>[];\r\n range?: { start: number; end: number };\r\n }) {\r\n if (!params.range) {\r\n return;\r\n }\r\n\r\n const allLeafKeys = getHeaderLeafColumnKeys(\r\n this.options.getOptions().columns,\r\n );\r\n const rangeKeys = allLeafKeys.slice(\r\n params.range.start,\r\n params.range.end + 1,\r\n );\r\n if (rangeKeys.length === 0) {\r\n return;\r\n }\r\n\r\n const previousWidthMap = new Map(\r\n params.previousLeafColumns.map((column) => [column.key, column.width]),\r\n );\r\n const leftBoundaryKey =\r\n params.range.start > 0 ? allLeafKeys[params.range.start - 1] : null;\r\n const rightBoundaryKey =\r\n params.range.end + 1 < allLeafKeys.length\r\n ? allLeafKeys[params.range.end + 1]\r\n : null;\r\n const leftBoundaryX =\r\n leftBoundaryKey != null\r\n ? fromBoundaryRightX(\r\n leftBoundaryKey,\r\n params.fromPositions,\r\n previousWidthMap,\r\n )\r\n : undefined;\r\n const rightBoundaryX =\r\n rightBoundaryKey != null\r\n ? params.fromPositions.get(rightBoundaryKey)\r\n : undefined;\r\n\r\n rangeKeys.forEach((key) => {\r\n const toX = params.toPositions.get(key);\r\n if (\r\n toX == null ||\r\n params.animColumns.has(key) ||\r\n params.fromPositions.has(key)\r\n ) {\r\n return;\r\n }\r\n\r\n const fallbackFrom = leftBoundaryX ?? rightBoundaryX ?? toX;\r\n if (Math.abs(fallbackFrom - toX) <= 1) {\r\n return;\r\n }\r\n\r\n params.animColumns.set(key, {\r\n from: fallbackFrom,\r\n to: toX,\r\n });\r\n });\r\n }\r\n\r\n private prepareCollapsedMergedCellAnimations(rowRange: {\r\n start: number;\r\n end: number;\r\n }) {\r\n const snapshot = this.options.getCurrentRenderSnapshot();\r\n if (!snapshot) {\r\n return;\r\n }\r\n\r\n const now = performance.now();\r\n this.options.getDescriptors().forEach((descriptor) => {\r\n if (\r\n descriptor.kind !== \"body\" ||\r\n typeof descriptor.rowIndex !== \"number\" ||\r\n !descriptor.columnKey ||\r\n (descriptor.rowSpan ?? 1) <= 1\r\n ) {\r\n return;\r\n }\r\n\r\n const spanStart = descriptor.rowIndex;\r\n const spanEnd = spanStart + (descriptor.rowSpan ?? 1) - 1;\r\n const overlapStart = Math.max(spanStart, rowRange.start);\r\n const overlapEnd = Math.min(spanEnd, rowRange.end);\r\n if (overlapStart > overlapEnd) {\r\n return;\r\n }\r\n\r\n const keepsLeadingRows = overlapStart > spanStart;\r\n const targetRowIndex = keepsLeadingRows ? spanStart : overlapEnd + 1;\r\n const targetRowSpan = keepsLeadingRows\r\n ? overlapStart - spanStart\r\n : spanEnd - overlapEnd;\r\n if (targetRowSpan <= 0) {\r\n return;\r\n }\r\n\r\n this.options.animationController.setCollapseCellHeightAnimation({\r\n rowIndex: targetRowIndex,\r\n columnKey: descriptor.columnKey,\r\n from: descriptor.rect.height,\r\n to: targetRowSpan * snapshot.rowHeight,\r\n startTime: now,\r\n duration: 240,\r\n });\r\n });\r\n }\r\n}\r\n","import type { ScrollState } from \"../../schema/state\";\r\nimport type { ListTableScrollToOptions } from \"../../types/instance\";\r\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\r\nimport {\r\n resolveScrollLeftForColIndex,\r\n resolveScrollToTarget,\r\n resolveScrollTopForRowIndex,\r\n resolveVisibleRowIndexForDataRow,\r\n} from \"../../services/scroll-to-service\";\r\nimport type { ListTableAnimationController } from \"./animation-controller\";\r\nimport type { ListTableEditingController } from \"./editing-controller\";\r\nimport type { ListTableRowActionController } from \"./row-action-controller\";\r\n\r\nexport interface ListTableScrollToControllerOptions<RecordType> {\r\n getScroll: () => ScrollState;\r\n setScroll: (value: ScrollState) => void;\r\n getCurrentRenderSnapshot: () => ListTableRenderSnapshot<RecordType> | null;\r\n animationController: ListTableAnimationController<RecordType>;\r\n editingController: ListTableEditingController<RecordType>;\r\n rowActionController: ListTableRowActionController<RecordType>;\r\n requestRender: () => void;\r\n}\r\n\r\n/**\r\n * 协调 `scrollTo` 目标计算与平滑/瞬时滚动执行。\r\n */\r\nexport class ListTableScrollToController<RecordType> {\r\n private readonly options: ListTableScrollToControllerOptions<RecordType>;\r\n\r\n constructor(options: ListTableScrollToControllerOptions<RecordType>) {\r\n this.options = options;\r\n }\r\n\r\n scrollTo(request: ListTableScrollToOptions) {\r\n const snapshot = this.options.getCurrentRenderSnapshot();\r\n if (!snapshot) {\r\n return;\r\n }\r\n\r\n const scroll = this.options.getScroll();\r\n const visibleRowIndex =\r\n request.rowIndex == null\r\n ? null\r\n : resolveVisibleRowIndexForDataRow({\r\n rowIndex: request.rowIndex,\r\n rowCount: snapshot.dataRowCount,\r\n frozenRows: snapshot.frozenRows,\r\n });\r\n const targetTop =\r\n visibleRowIndex == null\r\n ? null\r\n : resolveScrollTopForRowIndex({\r\n rowIndex: visibleRowIndex,\r\n rowCount: snapshot.visibleRows.length,\r\n rowHeight: snapshot.rowHeight,\r\n maxScrollTop: snapshot.viewport.maxScrollTop,\r\n frozenRows: snapshot.frozenRows,\r\n });\r\n const targetLeft =\r\n request.colIndex == null\r\n ? scroll.left\r\n : resolveScrollLeftForColIndex({\r\n colIndex: request.colIndex,\r\n leafColumns: snapshot.leafColumns,\r\n columnMetrics: snapshot.columnMetrics,\r\n maxScrollLeft: snapshot.viewport.maxScrollLeft,\r\n });\r\n const target = resolveScrollToTarget({\r\n currentLeft: scroll.left,\r\n currentTop: scroll.top,\r\n rowRequested: request.rowIndex != null,\r\n columnRequested: request.colIndex != null,\r\n targetTop,\r\n targetLeft,\r\n });\r\n if (!target) {\r\n return;\r\n }\r\n\r\n const nextTop = target.top;\r\n const nextLeft = target.left;\r\n if (\r\n Math.abs(nextTop - scroll.top) < 0.5 &&\r\n Math.abs(nextLeft - scroll.left) < 0.5\r\n ) {\r\n return;\r\n }\r\n\r\n this.options.animationController.stopScrollToAnimation();\r\n this.options.animationController.stopWheelScrollSmoothing();\r\n this.options.animationController.stopCarouselScrollAnimation();\r\n if (this.options.editingController.getSession()) {\r\n this.options.editingController.close(false);\r\n }\r\n\r\n if (request.behavior === \"smooth\") {\r\n this.options.animationController.startScrollToAnimation({\r\n targetLeft: nextLeft,\r\n targetTop: nextTop,\r\n });\r\n return;\r\n }\r\n\r\n this.options.setScroll({\r\n left: nextLeft,\r\n top: nextTop,\r\n });\r\n this.options.requestRender();\r\n this.options.rowActionController.maybeLoadNextScrollPage();\r\n }\r\n}\r\n","import type { HeaderCellLayout } from \"./header-layout-types\";\r\nimport type { InternalLeafColumn } from \"./types\";\r\n\r\n/**\r\n * 查找表头节点覆盖的叶子列区间。\r\n */\r\nexport function findHeaderLeafRange<RecordType>(params: {\r\n columnKey: string;\r\n headerRows: Array<Array<HeaderCellLayout<RecordType>>>;\r\n leafColumns: Array<Pick<InternalLeafColumn<RecordType>, \"key\">>;\r\n}) {\r\n const { columnKey, headerRows, leafColumns } = params;\r\n for (const row of headerRows) {\r\n for (const cell of row) {\r\n if (cell.node.key !== columnKey) {\r\n continue;\r\n }\r\n\r\n return {\r\n start: cell.node.leafStartIndex,\r\n end: cell.node.leafEndIndex,\r\n };\r\n }\r\n }\r\n\r\n const leafIndex = leafColumns.findIndex((column) => column.key === columnKey);\r\n if (leafIndex < 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n start: leafIndex,\r\n end: leafIndex,\r\n };\r\n}\r\n\r\n","import type { Rect } from \"../../debug/debug-snapshot\";\r\n\r\n/**\r\n * 克隆选中表头矩形。\r\n */\r\nexport function cloneSelectedHeaderRect(rect?: Rect | null): Rect | null {\r\n if (!rect) {\r\n return null;\r\n }\r\n return {\r\n x: rect.x,\r\n y: rect.y,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n}\r\n","import type { Rect } from \"../../debug/debug-snapshot\";\r\nimport type { InternalLeafColumn } from \"../../domain/columns/types\";\r\nimport type { HeaderCellLayout } from \"../../domain/columns/header-layout-types\";\nimport type {\r\n ListTableRangeHighlightState,\r\n ListTableSelectionState,\r\n} from \"../../schema/state\";\r\nimport type { ListTableOptions } from \"../../schema/table-options\";\r\nimport {\r\n resolveColumnKeysForContextMenuAction,\r\n resolveNextColumnHighlightByIndexRange,\r\n resolveNextColumnHighlightForContextMenu,\r\n resolveNextColumnHighlightForHeaderClick,\r\n resolveNextRowHighlightByIndexRange,\r\n resolveRangeHighlightForBodyInteraction,\r\n resolveRangeHighlightForHeaderSelection,\r\n} from \"../../services/range-highlight-service\";\r\nimport { findHeaderLeafRange } from \"../../domain/columns/header-leaf-range\";\r\nimport { cloneSelectedHeaderRect } from \"../../domain/rows/selection-state\";\r\nimport { EXPAND_COLUMN_KEY, ROW_SELECTION_COLUMN_KEY } from \"../../domain/rows/row-selection\";\r\n\r\nexport interface ListTableSelectionControllerOptions<RecordType> {\r\n getOptions: () => ListTableOptions<RecordType>;\r\n getLeafColumns: () => InternalLeafColumn<RecordType>[];\r\n getHeaderRowsCache: () => Array<Array<HeaderCellLayout<RecordType>>>;\r\n getSelection: () => ListTableSelectionState;\r\n setSelection: (value: ListTableSelectionState) => void;\r\n getRangeHighlight: () => ListTableRangeHighlightState;\r\n setRangeHighlight: (value: ListTableRangeHighlightState) => void;\r\n}\r\n\r\n/**\r\n * 协调 ListTable 表头/body 选择与 range highlight。\r\n */\r\nexport class ListTableSelectionController<RecordType> {\r\n private readonly options: ListTableSelectionControllerOptions<RecordType>;\r\n private selectedHeaderKey: string | null = null;\r\n private selectedHeaderRect: Rect | null = null;\r\n private summarySelected = false;\r\n\r\n constructor(options: ListTableSelectionControllerOptions<RecordType>) {\r\n this.options = options;\r\n }\r\n\r\n getSelectedHeaderKey() {\r\n return this.selectedHeaderKey;\r\n }\r\n\r\n getSelectedHeaderRect() {\r\n return this.selectedHeaderRect;\r\n }\r\n\r\n isSummarySelected() {\r\n return this.summarySelected;\r\n }\r\n\r\n setSummarySelected(value: boolean) {\r\n this.summarySelected = value;\r\n }\r\n\r\n selectHeader(columnKey: string, rect?: Rect | null) {\r\n this.selectedHeaderKey = columnKey;\r\n this.selectedHeaderRect = cloneSelectedHeaderRect(rect);\r\n }\r\n\r\n clearSelectedHeader() {\r\n this.selectedHeaderKey = null;\r\n this.selectedHeaderRect = null;\r\n }\r\n\r\n clearBodySelection() {\r\n this.options.setSelection({\r\n rowIndex: null,\r\n columnKey: null,\r\n });\r\n }\r\n\r\n setSelectedHeaderState(\r\n selectedHeaderKey: string | null,\r\n selectedHeaderRect: Rect | null,\r\n ) {\r\n this.selectedHeaderKey = selectedHeaderKey;\r\n this.selectedHeaderRect = selectedHeaderRect;\r\n }\r\n\r\n resetRangeHighlightForHeaderSelection(shiftKey: boolean) {\r\n this.options.setRangeHighlight(\r\n resolveRangeHighlightForHeaderSelection({\r\n current: this.options.getRangeHighlight(),\r\n shiftKey,\r\n }),\r\n );\r\n }\r\n\r\n updateRangeHighlightForBodyClick(\r\n rowIndex: number,\r\n shiftKey: boolean,\r\n rowSpan = 1,\r\n ) {\r\n this.options.setRangeHighlight(\r\n resolveNextRowHighlightByIndexRange({\r\n current: this.options.getRangeHighlight(),\r\n rangeStartIndex: rowIndex,\r\n rangeEndIndex: rowIndex + Math.max(Math.floor(rowSpan), 1) - 1,\r\n shiftKey,\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * 按高亮模式更新 body 点击后的区间高亮状态。\r\n */\r\n updateRangeHighlightForBodyInteraction(params: {\r\n rowIndex: number;\r\n columnKey: string;\r\n shiftKey: boolean;\r\n rowSpan?: number;\r\n }) {\r\n const leafColumns = this.options.getLeafColumns();\r\n const leafColumnKeys = leafColumns.map((column) => column.key);\r\n const columnRange = findHeaderLeafRange({\r\n columnKey: params.columnKey,\r\n headerRows: this.options.getHeaderRowsCache(),\r\n leafColumns,\r\n });\r\n this.options.setRangeHighlight(\r\n resolveRangeHighlightForBodyInteraction({\r\n current: this.options.getRangeHighlight(),\r\n mode: this.options.getOptions().highlightMode,\r\n rowIndex: params.rowIndex,\r\n columnKey: params.columnKey,\r\n shiftKey: params.shiftKey,\r\n rowSpan: params.rowSpan,\r\n leafColumnKeys,\r\n columnRange,\r\n selectionColumnKey: ROW_SELECTION_COLUMN_KEY,\r\n expandColumnKey: EXPAND_COLUMN_KEY,\r\n }),\r\n );\r\n }\r\n\r\n updateRangeHighlightForBodyColumnClick(\r\n columnKey: string,\r\n shiftKey: boolean,\r\n ) {\r\n const leafColumns = this.options.getLeafColumns();\r\n const leafColumnKeys = leafColumns.map((column) => column.key);\r\n const targetRange =\r\n findHeaderLeafRange({\r\n columnKey,\r\n headerRows: this.options.getHeaderRowsCache(),\r\n leafColumns,\r\n }) ??\r\n (() => {\r\n const leafIndex = leafColumnKeys.indexOf(columnKey);\r\n if (leafIndex < 0) {\r\n return null;\r\n }\r\n return { start: leafIndex, end: leafIndex };\r\n })();\r\n if (!targetRange) {\r\n return;\r\n }\r\n\r\n this.options.setRangeHighlight(\r\n resolveNextColumnHighlightByIndexRange({\r\n current: this.options.getRangeHighlight(),\r\n columnKey,\r\n leafColumnKeys,\r\n rangeStartIndex: targetRange.start,\r\n rangeEndIndex: targetRange.end,\r\n shiftKey,\r\n }),\r\n );\r\n }\r\n\r\n updateRangeHighlightForHeaderClick(columnKey: string, shiftKey: boolean) {\r\n const leafColumns = this.options.getLeafColumns();\r\n const targetRange = findHeaderLeafRange({\r\n columnKey,\r\n headerRows: this.options.getHeaderRowsCache(),\r\n leafColumns,\r\n });\r\n if (!targetRange) {\r\n return;\r\n }\r\n\r\n this.options.setRangeHighlight(\r\n resolveNextColumnHighlightForHeaderClick({\r\n current: this.options.getRangeHighlight(),\r\n columnKey,\r\n leafColumnKeys: leafColumns.map((column) => column.key),\r\n rangeStartIndex: targetRange.start,\r\n rangeEndIndex: targetRange.end,\r\n shiftKey,\r\n }),\r\n );\r\n }\r\n\r\n updateRangeHighlightForHeaderContextMenu(columnKey: string) {\r\n const leafColumns = this.options.getLeafColumns();\r\n const targetRange = findHeaderLeafRange({\r\n columnKey,\r\n headerRows: this.options.getHeaderRowsCache(),\r\n leafColumns,\r\n });\r\n if (!targetRange) {\r\n return;\r\n }\r\n\r\n this.options.setRangeHighlight(\r\n resolveNextColumnHighlightForContextMenu({\r\n current: this.options.getRangeHighlight(),\r\n columnKey,\r\n leafColumnKeys: leafColumns.map((column) => column.key),\r\n rangeStartIndex: targetRange.start,\r\n rangeEndIndex: targetRange.end,\r\n }),\r\n );\r\n }\r\n\r\n resolveHighlightedColumnKeys(columnKey: string) {\r\n const leafColumns = this.options.getLeafColumns();\r\n const targetRange = findHeaderLeafRange({\r\n columnKey,\r\n headerRows: this.options.getHeaderRowsCache(),\r\n leafColumns,\r\n });\r\n return resolveColumnKeysForContextMenuAction({\r\n current: this.options.getRangeHighlight(),\r\n columnKey,\r\n leafColumnKeys: leafColumns.map((column) => column.key),\r\n rangeStartIndex: targetRange?.start,\r\n rangeEndIndex: targetRange?.end,\r\n }).filter(\r\n (key) => key !== ROW_SELECTION_COLUMN_KEY && key !== EXPAND_COLUMN_KEY,\r\n );\r\n }\r\n\r\n clearColumnRangeHighlight() {\r\n const current = this.options.getRangeHighlight();\r\n this.options.setRangeHighlight({\r\n ...current,\r\n selectedColumnAnchorKey: null,\r\n selectedColumnRange: null,\r\n });\r\n }\r\n\r\n destroy() {\r\n this.clearSelectedHeader();\r\n this.summarySelected = false;\r\n }\r\n}\r\n\r\n","import { getValueByDataIndex } from \"../domain/data/get-value-by-data-index\";\r\nimport type { InternalLeafColumn } from \"../domain/columns/types\";\r\nimport type {\r\n ListTableColumn,\r\n ListTableSummaryConfig,\r\n} from \"../schema/column\";\r\n\r\nconst SUMMARY_ASYNC_BATCH_SIZE = 2_000;\r\nconst SUMMARY_ASYNC_FRAME_BUDGET = 8;\r\n\r\ninterface SummaryAccumulator<RecordType> {\r\n column: InternalLeafColumn<RecordType>;\r\n config: ListTableSummaryConfig<RecordType>;\r\n type: NonNullable<ListTableSummaryConfig<RecordType>[\"type\"]>;\r\n valueCount: number;\r\n numericCount: number;\r\n sum: number;\r\n min: number | null;\r\n max: number | null;\r\n uniqueValues: Set<string>;\r\n}\r\n\r\nexport async function computeSummaryValuesAsync<RecordType>(params: {\r\n rows: RecordType[];\r\n columns: InternalLeafColumn<RecordType>[];\r\n signal?: AbortSignal;\r\n}) {\r\n const { rows, columns, signal } = params;\r\n const summaryValues = new Map<string, string>();\r\n const accumulators: SummaryAccumulator<RecordType>[] = [];\r\n\r\n columns.forEach((column) => {\r\n const accumulator = createSummaryAccumulator(column);\r\n if (accumulator) {\r\n accumulators.push(accumulator);\r\n }\r\n });\r\n\r\n columns.forEach((column) => {\r\n if (column.summaryTitle != null) {\r\n summaryValues.set(column.key, column.summaryTitle);\r\n }\r\n });\r\n\r\n if (accumulators.length === 0) {\r\n return summaryValues;\r\n }\r\n\r\n for (let startIndex = 0; startIndex < rows.length; ) {\r\n if (signal?.aborted) {\r\n throw new Error(\"summary computation aborted\");\r\n }\r\n\r\n const frameStart = now();\r\n let endIndex = startIndex;\r\n while (endIndex < rows.length) {\r\n if (signal?.aborted) {\r\n throw new Error(\"summary computation aborted\");\r\n }\r\n\r\n const batchEndIndex = Math.min(\r\n endIndex + SUMMARY_ASYNC_BATCH_SIZE,\r\n rows.length,\r\n );\r\n for (\r\n let rowIndex = endIndex;\r\n rowIndex < batchEndIndex;\r\n rowIndex += 1\r\n ) {\r\n const record = rows[rowIndex];\r\n if (!record) {\r\n continue;\r\n }\r\n\r\n accumulators.forEach((item) => {\r\n updateSummaryAccumulator(item, record);\r\n });\r\n }\r\n\r\n endIndex = batchEndIndex;\r\n if (endIndex >= rows.length) {\r\n break;\r\n }\r\n\r\n if (now() - frameStart >= SUMMARY_ASYNC_FRAME_BUDGET) {\r\n break;\r\n }\r\n }\r\n\r\n if (endIndex < rows.length) {\r\n await yieldToMainThread();\r\n }\r\n\r\n startIndex = endIndex;\r\n }\r\n\r\n accumulators.forEach((item) => {\r\n summaryValues.set(\r\n item.column.key,\r\n finalizeSummaryValue(item, rows),\r\n );\r\n });\r\n\r\n return summaryValues;\r\n}\r\n\r\nfunction createSummaryAccumulator<RecordType>(\r\n column: InternalLeafColumn<RecordType>,\r\n) {\r\n const config = resolveSummaryConfig(column);\r\n if (!config) {\r\n return null;\r\n }\r\n\r\n return {\r\n column,\r\n config,\r\n type: config.type ?? \"sum\",\r\n valueCount: 0,\r\n numericCount: 0,\r\n sum: 0,\r\n min: null,\r\n max: null,\r\n uniqueValues: new Set<string>(),\r\n } satisfies SummaryAccumulator<RecordType>;\r\n}\r\n\r\nfunction updateSummaryAccumulator<RecordType>(\r\n item: SummaryAccumulator<RecordType>,\r\n record: RecordType,\r\n) {\r\n if (item.column.summaryTitle != null) {\r\n return;\r\n }\r\n\r\n if (item.type === \"rowCount\" || item.type === \"mergedRowCount\") {\r\n return;\r\n }\r\n\r\n const rawValue = normalizeSummaryValue(\r\n getColumnRawValue(record, item.column, item.config),\r\n );\r\n if (rawValue == null) {\r\n return;\r\n }\r\n\r\n item.valueCount += 1;\r\n if (item.type === \"unionCount\") {\r\n item.uniqueValues.add(String(rawValue));\r\n return;\r\n }\r\n\r\n if (item.type === \"count\") {\r\n return;\r\n }\r\n\r\n const numericValue = toNumber(rawValue);\r\n if (numericValue == null) {\r\n return;\r\n }\r\n\r\n item.numericCount += 1;\r\n item.sum += numericValue;\r\n item.min = item.min == null ? numericValue : Math.min(item.min, numericValue);\r\n item.max = item.max == null ? numericValue : Math.max(item.max, numericValue);\r\n}\r\n\r\nfunction finalizeSummaryValue<RecordType>(\r\n item: SummaryAccumulator<RecordType>,\r\n rows: RecordType[],\r\n) {\r\n if (item.column.summaryTitle != null) {\r\n return item.column.summaryTitle;\r\n }\r\n\r\n if (item.type === \"rowCount\") {\r\n return formatSummaryOutput(item, String(rows.length), rows);\r\n }\r\n\r\n if (item.type === \"mergedRowCount\") {\r\n return formatSummaryOutput(item, String(countMergedRows(rows)), rows);\r\n }\r\n\r\n if (item.type === \"count\") {\r\n return formatSummaryOutput(item, String(item.valueCount), rows);\r\n }\r\n\r\n if (item.type === \"unionCount\") {\r\n return formatSummaryOutput(item, String(item.uniqueValues.size), rows);\r\n }\r\n\r\n if (item.numericCount === 0) {\r\n if (item.type === \"min\" || item.type === \"max\") {\r\n return formatSummaryOutput(item, \"\", rows);\r\n }\r\n return formatSummaryOutput(item, \"0\", rows);\r\n }\r\n\r\n let result = item.sum;\r\n if (item.type === \"avg\") {\r\n result = item.sum / item.numericCount;\r\n } else if (item.type === \"min\") {\r\n result = item.min ?? 0;\r\n } else if (item.type === \"max\") {\r\n result = item.max ?? 0;\r\n }\r\n\r\n const rounded = roundByPrecision(result, item.config.precision);\r\n const formatted = formatNumber(rounded, item.config.precision);\r\n\r\n return formatSummaryOutput(item, formatted, rows);\r\n}\r\n\r\nfunction resolveSummaryConfig<RecordType>(\r\n column: InternalLeafColumn<RecordType>,\r\n): ListTableSummaryConfig<RecordType> | null {\r\n if (column.summary == null) {\r\n return null;\r\n }\r\n\r\n if (column.summary === true) {\r\n return { type: \"sum\" };\r\n }\r\n\r\n if (column.summary === false) {\r\n return null;\r\n }\r\n\r\n return { type: \"sum\", ...column.summary };\r\n}\r\n\r\nfunction getColumnRawValue<RecordType>(\r\n record: RecordType,\r\n column: InternalLeafColumn<RecordType>,\r\n config: ListTableSummaryConfig<RecordType>,\r\n): unknown {\r\n if (config.valueGetter) {\r\n return config.valueGetter(record);\r\n }\r\n\r\n const sortValue = column.sortValueGetter?.(record);\r\n if (sortValue != null && sortValue !== \"\") {\r\n return sortValue;\r\n }\r\n\r\n const filterValue = column.filterValueGetter?.(record);\r\n if (filterValue != null && filterValue !== \"\") {\r\n return filterValue;\r\n }\r\n\r\n return getValueByDataIndex(record, column.dataIndex);\r\n}\r\n\r\nfunction normalizeSummaryValue(value: unknown): string | number | null {\r\n if (value == null || value === \"\") {\r\n return null;\r\n }\r\n\r\n if (typeof value === \"number\" || typeof value === \"string\") {\r\n return value;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction toNumber(value: string | number | null): number | null {\r\n if (value == null) {\r\n return null;\r\n }\r\n\r\n if (typeof value === \"number\") {\r\n return Number.isNaN(value) ? null : value;\r\n }\r\n\r\n const parsed = Number(String(value).trim());\r\n return Number.isNaN(parsed) ? null : parsed;\r\n}\r\n\r\nfunction roundByPrecision(value: number, precision?: number): number {\r\n if (precision == null) {\r\n return value;\r\n }\r\n\r\n return Number(value.toFixed(precision));\r\n}\r\n\r\nfunction formatNumber(value: number, precision?: number): string {\r\n if (precision != null) {\r\n return value.toFixed(precision);\r\n }\r\n\r\n if (Number.isInteger(value)) {\r\n return String(value);\r\n }\r\n\r\n return value.toFixed(2);\r\n}\r\n\r\nfunction formatSummaryOutput<RecordType>(\r\n item: SummaryAccumulator<RecordType>,\r\n value: string,\r\n rows: RecordType[],\r\n) {\r\n if (item.config.formatter) {\r\n return item.config.formatter(\r\n value,\r\n rows,\r\n item.column as ListTableColumn<RecordType>,\r\n );\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction countMergedRows(rows: readonly unknown[]): number {\r\n return rows.reduce<number>((count, record) => {\r\n if (record == null || typeof record !== \"object\") {\r\n return count + 1;\r\n }\r\n\r\n const rowSpan = (record as Record<string, unknown>).rowSpan;\r\n if (typeof rowSpan !== \"number\") {\r\n return count + 1;\r\n }\r\n\r\n return rowSpan > 0 ? count + 1 : count;\r\n }, 0);\r\n}\r\n\r\nfunction yieldToMainThread() {\r\n return new Promise<void>((resolve) => {\r\n if (typeof requestAnimationFrame === \"function\") {\r\n requestAnimationFrame(() => resolve());\r\n return;\r\n }\r\n\r\n setTimeout(resolve, 0);\r\n });\r\n}\r\n\r\nfunction now() {\r\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\r\n return performance.now();\r\n }\r\n\r\n return Date.now();\r\n}\r\n","/**\r\n * 是否处于应暂停汇总计算的交互中。\r\n */\r\nexport function isSummaryInteractionActive(params: {\r\n draggingScrollbar: boolean;\r\n draggingResize: boolean;\r\n draggingReorder: boolean;\r\n scrollbarActiveUntil: number;\r\n now?: number;\r\n}) {\r\n const now = params.now ?? Date.now();\r\n return (\r\n params.draggingScrollbar ||\r\n params.draggingResize ||\r\n params.draggingReorder ||\r\n now < params.scrollbarActiveUntil\r\n );\r\n}\r\n","import type { InternalLeafColumn } from \"../columns/types\";\r\nimport type {\r\n ListTableFilterState,\r\n ListTableSortState,\r\n} from \"../../schema/state\";\r\n\r\n/**\r\n * 由列汇总配置生成缓存 key,配置未变时可跳过重算。\r\n */\r\nexport function buildSummaryConfigKey<RecordType>(\r\n columns: InternalLeafColumn<RecordType>[],\r\n) {\r\n return columns\r\n .map((column) => {\r\n const summaryType =\r\n column.summary == null\r\n ? \"\"\r\n : column.summary === true\r\n ? \"sum\"\r\n : column.summary === false\r\n ? \"\"\r\n : (column.summary.type ?? \"sum\");\r\n return [\r\n column.key,\r\n column.summaryTitle ?? \"\",\r\n summaryType,\r\n column.summary != null ? \"1\" : \"0\",\r\n typeof column.summary === \"object\" &&\r\n column.summary?.precision != null\r\n ? String(column.summary.precision)\r\n : \"\",\r\n typeof column.summary === \"object\" && column.summary?.valueGetter\r\n ? \"vg\"\r\n : \"\",\r\n typeof column.summary === \"object\" && column.summary?.formatter\r\n ? \"fmt\"\r\n : \"\",\r\n ].join(\":\");\r\n })\r\n .join(\"|\");\r\n}\r\n\r\n/**\r\n * 汇总窗口 key:分页本地模式按页区分,否则为全量。\r\n */\r\nexport function buildSummaryWindowKey(params: {\r\n hasPagination: boolean;\r\n isRemoteQuery: boolean;\r\n currentPage: number;\r\n pageSize: number;\r\n}) {\r\n if (!params.hasPagination || params.isRemoteQuery) {\r\n return \"all\";\r\n }\r\n\r\n return `${params.currentPage}:${params.pageSize}`;\r\n}\r\n\r\n/**\r\n * 汇总查询状态 key:排序/过滤变化时强制重算。\r\n */\r\nexport function buildSummaryQueryStateKey(params: {\r\n sortState: ListTableSortState;\r\n filterState: ListTableFilterState;\r\n}) {\r\n return JSON.stringify({\r\n sortKey: params.sortState.key,\r\n sortOrder: params.sortState.order,\r\n filters: params.filterState,\r\n });\r\n}\r\n","import type { ListTableOptions } from \"../../schema/table-options\";\r\nimport type { ListTableRenderSnapshot } from \"../../services/layout-service\";\r\nimport type { ListTableQueryRuntimeState } from \"../../services/query-service\";\r\nimport { computeSummaryValuesAsync } from \"../../services/summary-service\";\r\nimport { isSummaryInteractionActive } from \"../../domain/summary/summary-interaction\";\r\nimport {\r\n buildSummaryConfigKey,\r\n buildSummaryQueryStateKey,\r\n buildSummaryWindowKey,\r\n} from \"../../domain/summary/summary-key\";\r\n\r\nexport interface ListTableSummaryScheduler {\r\n setTimeout(callback: () => void, delay: number): number;\r\n clearTimeout(id: number): void;\r\n dateNow(): number;\r\n}\r\n\r\nexport interface ListTableSummaryControllerOptions<RecordType> {\r\n getOptions: () => ListTableOptions<RecordType>;\r\n getQueryRuntimeState: () => ListTableQueryRuntimeState;\r\n getCurrentPage: () => number;\r\n getPageSize: () => number;\r\n getQueryRowsOverrideBase: () => RecordType[] | null;\r\n getCurrentRenderSnapshot: () => ListTableRenderSnapshot<RecordType> | null;\r\n isDraggingScrollbar: () => boolean;\r\n isDraggingResize: () => boolean;\r\n isDraggingReorder: () => boolean;\r\n getScrollbarActiveUntil: () => number;\r\n requestRender: () => void;\r\n scheduler?: ListTableSummaryScheduler;\r\n}\r\n\r\n/**\r\n * 协调 ListTable summary 异步计算、缓存与交互暂停。\r\n */\r\nexport class ListTableSummaryController<RecordType> {\r\n private readonly options: ListTableSummaryControllerOptions<RecordType>;\r\n private readonly scheduler: ListTableSummaryScheduler;\r\n private summaryValueMap = new Map<string, string>();\r\n private summaryRowsSourceRef: RecordType[] | null = null;\r\n private summaryQueryStateKey: string | null = null;\r\n private summaryRowsWindowKey: string | null = null;\r\n private summaryConfigKey: string | null = null;\r\n private summaryReady = true;\r\n private summaryTaskId = 0;\r\n private summaryAbortController: AbortController | null = null;\r\n private summaryResumeTimer: number | null = null;\r\n\r\n constructor(options: ListTableSummaryControllerOptions<RecordType>) {\r\n this.options = options;\r\n this.scheduler = options.scheduler ?? createDefaultSummaryScheduler();\r\n }\r\n\r\n getSummaryValueMap() {\r\n return this.summaryValueMap;\r\n }\r\n\r\n isSummaryReady() {\r\n return this.summaryReady;\r\n }\r\n\r\n /**\r\n * 确保 snapshot 对应的 summary 值可用;必要时启动异步计算。\r\n */\r\n ensureSummaryValues(snapshot: ListTableRenderSnapshot<RecordType>) {\r\n if (!snapshot.hasSummary) {\r\n this.clearSummaryState();\r\n return;\r\n }\r\n\r\n const query = this.options.getQueryRuntimeState();\r\n const nextSummaryConfigKey = buildSummaryConfigKey(snapshot.leafColumns);\r\n const nextSummaryQueryStateKey = buildSummaryQueryStateKey({\r\n sortState: query.sortState,\r\n filterState: query.filterState,\r\n });\r\n const nextSummaryWindowKey = buildSummaryWindowKey({\r\n hasPagination: Boolean(this.options.getOptions().pagination),\r\n isRemoteQuery: this.options.getOptions().query?.mode === \"remote\",\r\n currentPage: this.options.getCurrentPage(),\r\n pageSize: this.options.getPageSize(),\r\n });\r\n const hasActiveSummaryTask = this.summaryAbortController != null;\r\n const shouldReuse =\r\n this.summaryRowsSourceRef === this.resolveSummarySourceRowsRef() &&\r\n this.summaryQueryStateKey === nextSummaryQueryStateKey &&\r\n this.summaryRowsWindowKey === nextSummaryWindowKey &&\r\n this.summaryConfigKey === nextSummaryConfigKey &&\r\n (this.summaryReady || hasActiveSummaryTask);\r\n if (shouldReuse) {\r\n return;\r\n }\r\n\r\n if (this.isSummaryInteractionActive()) {\r\n this.pauseSummaryComputationForInteraction();\r\n return;\r\n }\r\n\r\n this.summaryTaskId += 1;\r\n const taskId = this.summaryTaskId;\r\n this.summaryAbortController?.abort();\r\n this.summaryAbortController = new AbortController();\r\n const { signal } = this.summaryAbortController;\r\n\r\n this.summaryValueMap = new Map();\r\n this.summaryRowsSourceRef = this.resolveSummarySourceRowsRef();\r\n this.summaryQueryStateKey = nextSummaryQueryStateKey;\r\n this.summaryRowsWindowKey = nextSummaryWindowKey;\r\n this.summaryConfigKey = nextSummaryConfigKey;\r\n this.summaryReady = false;\r\n\r\n void computeSummaryValuesAsync({\r\n rows: snapshot.displayRows,\r\n columns: snapshot.leafColumns,\r\n signal,\r\n })\r\n .then((summaryValues) => {\r\n if (signal.aborted || taskId !== this.summaryTaskId) {\r\n return;\r\n }\r\n\r\n this.summaryValueMap = summaryValues;\r\n this.summaryReady = true;\r\n this.options.requestRender();\r\n })\r\n .catch((error) => {\r\n if (signal.aborted) {\r\n return;\r\n }\r\n\r\n console.error(\"Failed to resolve summary values.\", error);\r\n this.summaryValueMap = new Map();\r\n this.summaryReady = true;\r\n this.options.requestRender();\r\n });\r\n }\r\n\r\n pauseSummaryComputationForInteraction() {\r\n this.summaryAbortController?.abort();\r\n this.summaryAbortController = null;\r\n this.scheduleSummaryResume();\r\n }\r\n\r\n clearSummaryForEmptySnapshot() {\r\n this.clearSummaryState();\r\n }\r\n\r\n /**\r\n * 重置缓存与异步任务(用于 options 更新)。\r\n */\r\n reset() {\r\n this.summaryAbortController?.abort();\r\n this.summaryAbortController = null;\r\n this.clearResumeTimer();\r\n this.clearSummaryState();\r\n }\r\n\r\n destroy() {\r\n this.summaryAbortController?.abort();\r\n this.summaryAbortController = null;\r\n this.clearResumeTimer();\r\n this.clearSummaryState();\r\n }\r\n\r\n private scheduleSummaryResume(delay = 160) {\r\n this.clearResumeTimer();\r\n this.summaryResumeTimer = this.scheduler.setTimeout(() => {\r\n this.summaryResumeTimer = null;\r\n if (this.isSummaryInteractionActive()) {\r\n this.scheduleSummaryResume(delay);\r\n return;\r\n }\r\n\r\n const snapshot = this.options.getCurrentRenderSnapshot();\r\n if (!snapshot?.hasSummary) {\r\n return;\r\n }\r\n\r\n this.ensureSummaryValues(snapshot);\r\n }, delay);\r\n }\r\n\r\n private isSummaryInteractionActive() {\r\n return isSummaryInteractionActive({\r\n draggingScrollbar: this.options.isDraggingScrollbar(),\r\n draggingResize: this.options.isDraggingResize(),\r\n draggingReorder: this.options.isDraggingReorder(),\r\n scrollbarActiveUntil: this.options.getScrollbarActiveUntil(),\r\n now: this.scheduler.dateNow(),\r\n });\r\n }\r\n\r\n private resolveSummarySourceRowsRef() {\r\n return (\r\n this.options.getQueryRowsOverrideBase() ??\r\n this.options.getOptions().dataSource\r\n );\r\n }\r\n\r\n private clearSummaryState() {\r\n this.summaryAbortController?.abort();\r\n this.summaryAbortController = null;\r\n this.summaryValueMap = new Map();\r\n this.summaryRowsSourceRef = null;\r\n this.summaryQueryStateKey = null;\r\n this.summaryRowsWindowKey = null;\r\n this.summaryConfigKey = null;\r\n this.summaryReady = true;\r\n }\r\n\r\n private clearResumeTimer() {\r\n if (this.summaryResumeTimer != null) {\r\n this.scheduler.clearTimeout(this.summaryResumeTimer);\r\n this.summaryResumeTimer = null;\r\n }\r\n }\r\n}\r\n\r\nfunction createDefaultSummaryScheduler(): ListTableSummaryScheduler {\r\n return {\r\n setTimeout: (callback, delay) => window.setTimeout(callback, delay),\r\n clearTimeout: (id) => window.clearTimeout(id),\r\n dateNow: () => Date.now(),\r\n };\r\n}\r\n","import { DebugManager } from \"../debug/debug-manager\";\nimport type {\n DebugHitTestResult,\n Rect,\n RenderCellDescriptor,\n} from \"../debug/debug-snapshot\";\nimport { hitTest } from \"../interaction/hit-test\";\nimport type {\n HeaderTreeNode,\n InternalLeafColumn,\n NormalizedColumn,\n} from \"../domain/columns/types\";\nimport type { HeaderCellLayout } from \"../domain/columns/header-layout-types\";\nimport type { CanvasRenderer } from \"../rendering/canvas-renderer\";\nimport type { ScrollbarLayout } from \"../domain/layout/scrollbar-types\";\nimport type { ScrollState } from \"../schema/state\";\nimport type { ListTableOptions } from \"../schema/table-options\";\nimport type { ListTableCanvasHost } from \"../adapters/canvas-host\";\nimport type { ListTableComponentPortal } from \"../adapters/component-portal\";\nimport type { ListTableDomHost } from \"../adapters/dom-host\";\nimport type { ColumnSegments } from \"../domain/columns/column-layout\";\nimport { BODY_TOOLTIP_DELAY } from \"../domain/constants\";\nimport { BodyTooltipController } from \"../features/tooltip/body-tooltip-controller\";\nimport { applyScrollSessionChange } from \"../features/scroll/scroll-session\";\nimport { getRowKey } from \"../domain/rows/row-selection\";\nimport {\n applyListTableRenderPassResult,\n buildRuntimeColumnsMap,\n} from \"../services/runtime-sync-service\";\nimport { resolveListTablePointerHit } from \"../services/pointer-hit-service\";\nimport { resolveScrollbarVisibility } from \"../services/scrollbar-service\";\nimport { selectListTableQueryState } from \"./store/selectors\";\nimport type { ListTableStore } from \"./store/create-store\";\nimport type {\n DraggingReorderState,\n DraggingResizeState,\n DraggingScrollbarState,\n} from \"../domain/types\";\nimport { scaleRectByZoom } from \"../domain/layout/coordinate\";\nimport { ListTableAnimationController } from \"./controllers/animation-controller\";\nimport { ListTableCarouselController } from \"./controllers/carousel-controller\";\nimport { ListTableContentActionController } from \"./controllers/content-action-controller\";\nimport { ListTableEditingController } from \"./controllers/editing-controller\";\nimport { ListTableEventController } from \"./controllers/event-controller\";\nimport {\n createListTableEventHost,\n type ListTableEventHostBridge,\n} from \"../adapters/event-host-factory\";\nimport { ListTableHeaderActionController } from \"./controllers/header-action-controller\";\nimport { ListTableOverlayController } from \"./controllers/overlay-controller\";\nimport { ListTablePersistenceController } from \"./controllers/persistence-controller\";\nimport { ListTableQueryController } from \"./controllers/query-controller\";\nimport {\n ListTableRenderController,\n type ListTableRenderPassResult,\n} from \"./controllers/render-controller\";\nimport { ListTableRowActionController } from \"./controllers/row-action-controller\";\nimport { ListTableScrollToController } from \"./controllers/scroll-to-controller\";\nimport { ListTableSelectionController } from \"./controllers/selection-controller\";\nimport type { ListTableStoreFacade } from \"./controllers/store-facade\";\nimport { ListTableSummaryController } from \"./controllers/summary-controller\";\nimport {\n ListTableRowDragController,\n resolveListTableId,\n} from \"./controllers/row-drag-controller\";\n\n/**\n * ListTableCore constructor 装配宿主:仅暴露装配阶段需要读写的字段。\n */\nexport interface ListTableCoreAssemblyHost<RecordType> {\n options: ListTableOptions<RecordType>;\n initialColumns: ListTableOptions<RecordType>[\"columns\"];\n initialStretchColumns: ListTableOptions<RecordType>[\"stretchColumns\"];\n domHost: ListTableDomHost;\n canvasHost: ListTableCanvasHost;\n componentPortal: ListTableComponentPortal;\n store: ListTableStore<RecordType>;\n storeFacade: ListTableStoreFacade<RecordType>;\n tableZoom: number;\n container: HTMLElement;\n renderer: CanvasRenderer | null;\n normalizedColumns: NormalizedColumn<RecordType>[];\n leafColumns: InternalLeafColumn<RecordType>[];\n columnSegments: ColumnSegments<RecordType>;\n headerTree: HeaderTreeNode<RecordType>[];\n headerRowsCache: Array<Array<HeaderCellLayout<RecordType>>>;\n debugManager: DebugManager;\n scrollbarLayout: ScrollbarLayout;\n draggingScrollbar: DraggingScrollbarState | null;\n draggingResize: DraggingResizeState | null;\n draggingReorder: DraggingReorderState | null;\n suppressNextClick: boolean;\n\n animationController: ListTableAnimationController<RecordType>;\n overlayController: ListTableOverlayController<RecordType>;\n queryController: ListTableQueryController<RecordType>;\n summaryController: ListTableSummaryController<RecordType>;\n editingController: ListTableEditingController<RecordType>;\n eventController: ListTableEventController<RecordType>;\n selectionController: ListTableSelectionController<RecordType>;\n headerActionController: ListTableHeaderActionController<RecordType>;\n rowActionController: ListTableRowActionController<RecordType>;\n rowDragController: ListTableRowDragController<RecordType>;\n contentActionController: ListTableContentActionController<RecordType>;\n persistenceController: ListTablePersistenceController<RecordType>;\n carouselController: ListTableCarouselController<RecordType>;\n scrollToController: ListTableScrollToController<RecordType>;\n renderController: ListTableRenderController<RecordType>;\n bodyTooltipController: BodyTooltipController;\n /** 跨表拖拽稳定 tableId。 */\n tableId: string;\n}\n\n/**\n * 装配 ListTableCore 内部 controllers 与布局运行时初值。\n */\nexport function assembleListTableCoreControllers<RecordType>(\n core: ListTableCoreAssemblyHost<RecordType>,\n options: ListTableOptions<RecordType>,\n) {\n const getCanvasHostElement = () =>\n core.domHost.getNodes()?.canvasHostElement ?? null;\n const getCanvasElement = () => core.canvasHost.getCanvasElement();\n const getPaginationElement = () =>\n core.domHost.getNodes()?.paginationElement ?? null;\n const getPagination = () =>\n core.options.ui?.paginationAdapter ?? core.componentPortal.pagination;\n const getEditorFactory = () => core.options.ui?.editorFactory ?? null;\n const getCurrentRenderSnapshot = () =>\n core.renderController.getCurrentRenderSnapshot();\n const getDescriptors = () => core.renderController.getDescriptors();\n const getQueryRuntimeState = () =>\n selectListTableQueryState(core.store.getSnapshot());\n const getDisplayData = () => core.queryController.getDisplayData();\n const getBaseDisplayData = () => core.queryController.getBaseDisplayData();\n const getDisplayRowsOverride = () =>\n core.queryController.getDisplayRowsOverride();\n const toViewportPoint = (x: number, y: number) =>\n core.domHost.toViewportPoint(x, y);\n const toViewportRect = (rect: Rect) => core.domHost.toViewportRect(rect);\n const toHostRect = (rect: Rect) => scaleRectByZoom(rect, core.tableZoom);\n const getEditorClipRect = () => core.domHost.getCanvasViewportRect();\n const getEditorHostElement = () => core.domHost.getCanvasHostElement();\n const scheduleRender = (hitResult?: DebugHitTestResult) => {\n core.renderController.schedule(hitResult);\n };\n const render = (hitResult?: DebugHitTestResult) => {\n core.renderController.render(hitResult ?? hitTest(-1, -1, []));\n };\n const refreshRuntimeColumns = () => {\n core.storeFacade.runtimeColumns = buildRuntimeColumnsMap({\n options: core.options,\n selectedRowKeys: core.storeFacade.selectedRowKeys,\n });\n };\n const applyFilterQueryAsync = () => {\n core.queryController.applyFilterQueryAsync();\n };\n const emitQueryChange = (action: \"sort\" | \"filter\" | \"paginate\") => {\n core.queryController.emitQueryChange(action);\n };\n const applyUserScroll = (nextScroll: ScrollState) => {\n const result = applyScrollSessionChange({\n current: core.storeFacade.scroll,\n next: nextScroll,\n hasEditingSession: core.editingController.getSession() != null,\n });\n if (!result.changed) {\n return false;\n }\n if (result.shouldCloseEditor) {\n core.editingController.close(false);\n }\n core.storeFacade.scroll = nextScroll;\n return true;\n };\n const isScrollbarVisible = () =>\n resolveScrollbarVisibility({\n options: core.options,\n draggingScrollbar: core.draggingScrollbar != null,\n continuousScrollActive: core.eventController.isContinuousScrollActive(),\n hover: core.storeFacade.hover,\n scrollbarActiveUntil: core.animationController.getScrollbarActiveUntil(),\n now: Date.now(),\n });\n const applyRenderResult = (result: ListTableRenderPassResult<RecordType>) => {\n applyListTableRenderPassResult({\n didRender: result.didRender,\n empty: result.empty,\n emptyNormalizedColumns: result.emptyNormalizedColumns,\n projection: result.projection,\n layout: core,\n setScroll: (scroll) => {\n core.storeFacade.scroll = scroll;\n },\n setScrollPageSize: (value) => {\n core.storeFacade.scrollPageSize = value;\n },\n });\n };\n const resolvePointerHit = (\n x: number,\n y: number,\n options?: {\n excludeKinds?: RenderCellDescriptor[\"kind\"][];\n },\n ): DebugHitTestResult => {\n const { result, hitScrollbar } = resolveListTablePointerHit({\n x,\n y,\n descriptors: getDescriptors(),\n rows: getDisplayData(),\n leafColumns: core.leafColumns,\n scrollbarLayout: core.scrollbarLayout,\n scrollbarVisible: isScrollbarVisible(),\n options,\n });\n if (hitScrollbar) {\n core.animationController.markScrollbarActive();\n }\n return result;\n };\n\n core.animationController = new ListTableAnimationController({\n getScrollbarVisibleOption: () => core.options.scrollbar?.visible,\n isScrollbarVisible,\n getScroll: () => core.storeFacade.scroll,\n setScroll: (scroll) => {\n core.storeFacade.scroll = scroll;\n },\n applyScroll: applyUserScroll,\n getRowKey: (record, rowIndex) => getRowKey(core.options, record, rowIndex),\n requestRender: () => scheduleRender(),\n onScrollPageLoad: () => core.rowActionController.maybeLoadNextScrollPage(),\n onScrollbarActive: () => {\n core.summaryController.pauseSummaryComputationForInteraction();\n },\n });\n core.overlayController = new ListTableOverlayController({\n getOptions: () => core.options,\n componentPortal: core.componentPortal,\n getContentZoom: () => core.tableZoom,\n });\n core.queryController = new ListTableQueryController({\n getOptions: () => core.options,\n getLeafColumns: () => core.leafColumns,\n getQueryRuntimeState,\n showLoading: (text) => core.overlayController.showLoading(text),\n hideLoading: () => core.overlayController.hideLoading(),\n requestRender: () => render(),\n });\n core.summaryController = new ListTableSummaryController({\n getOptions: () => core.options,\n getQueryRuntimeState,\n getCurrentPage: () => core.storeFacade.currentPage,\n getPageSize: () => core.storeFacade.pageSize,\n getQueryRowsOverrideBase: () =>\n core.queryController.getQueryRowsOverrideBase(),\n getCurrentRenderSnapshot,\n isDraggingScrollbar: () => core.draggingScrollbar != null,\n isDraggingResize: () => core.draggingResize != null,\n isDraggingReorder: () => core.draggingReorder != null,\n getScrollbarActiveUntil: () =>\n core.animationController.getScrollbarActiveUntil(),\n requestRender: () => render(),\n });\n core.editingController = new ListTableEditingController({\n getOptions: () => core.options,\n getTheme: () => core.storeFacade.theme,\n getTableZoom: () => core.tableZoom,\n getLeafColumns: () => core.leafColumns,\n getDisplayData,\n getDescriptors,\n getCurrentRenderSnapshot,\n getScroll: () => core.storeFacade.scroll,\n setSelection: (value) => {\n core.storeFacade.selection = value;\n },\n getEditorFactory,\n toViewportRect,\n toHostRect,\n getEditorClipRect,\n getEditorHostElement,\n clearBodyTooltip: () => core.bodyTooltipController.clear(),\n startScrollToAnimation: (params) =>\n core.animationController.startScrollToAnimation(params),\n requestRender: () => render(),\n focusTable: () => {\n core.canvasHost.getCanvasElement()?.focus({ preventScroll: true });\n },\n });\n core.selectionController = new ListTableSelectionController({\n getOptions: () => core.options,\n getLeafColumns: () => core.leafColumns,\n getHeaderRowsCache: () => core.headerRowsCache,\n getSelection: () => core.storeFacade.selection,\n setSelection: (value) => {\n core.storeFacade.selection = value;\n },\n getRangeHighlight: () => core.storeFacade.rangeHighlight,\n setRangeHighlight: (value) => {\n core.storeFacade.rangeHighlight = value;\n },\n });\n core.rowActionController = new ListTableRowActionController({\n getOptions: () => core.options,\n getLeafColumns: () => core.leafColumns,\n getColumnSegments: () => core.columnSegments,\n getExpandedRowKeys: () => core.storeFacade.expandedRowKeys,\n setExpandedRowKeys: (value) => {\n core.storeFacade.expandedRowKeys = value;\n },\n getCollapsedRowKeys: () => core.storeFacade.collapsedRowKeys,\n setCollapsedRowKeys: (value) => {\n core.storeFacade.collapsedRowKeys = value;\n },\n getFrozenRows: () => core.storeFacade.frozenRows,\n setFrozenRows: (value) => {\n core.storeFacade.frozenRows = value;\n },\n getSelectedRowKeys: () => core.storeFacade.selectedRowKeys,\n setSelectedRowKeys: (value) => {\n core.storeFacade.selectedRowKeys = value;\n },\n getRangeHighlight: () => core.storeFacade.rangeHighlight,\n getCurrentRenderSnapshot,\n getDescriptors,\n getDisplayData,\n getBaseDisplayData,\n getCurrentPage: () => core.storeFacade.currentPage,\n setCurrentPage: (value) => {\n core.storeFacade.currentPage = value;\n },\n getPageSize: () => core.storeFacade.pageSize,\n getScrollPageSize: () => core.storeFacade.scrollPageSize,\n getScroll: () => core.storeFacade.scroll,\n getMaxScrollTop: () => {\n const viewport = core.debugManager.getSnapshot()?.viewport as\n | {\n maxScrollTop: number;\n }\n | undefined;\n return viewport?.maxScrollTop;\n },\n animationController: core.animationController,\n hideHeaderContextMenu: () => core.overlayController.hideHeaderContextMenu(),\n clearSelectedHeader: () => core.selectionController.clearSelectedHeader(),\n refreshRuntimeColumns,\n persistColumnConfig: () => core.persistenceController.persistColumnConfig(),\n emitQueryChange,\n requestRender: () => render(),\n });\n core.headerActionController = new ListTableHeaderActionController({\n getOptions: () => core.options,\n setOptions: (next) => {\n core.options = next;\n },\n getInitialColumns: () => core.initialColumns,\n getInitialStretchColumns: () => core.initialStretchColumns,\n getLeafColumns: () => core.leafColumns,\n getColumnSegments: () => core.columnSegments,\n getSortState: () => core.storeFacade.sortState,\n setSortState: (value) => {\n core.storeFacade.sortState = value;\n },\n getFilterState: () => core.storeFacade.filterState,\n setFilterState: (value) => {\n core.storeFacade.filterState = value;\n },\n getHover: () => core.storeFacade.hover,\n getScroll: () => core.storeFacade.scroll,\n setScroll: (value) => {\n core.storeFacade.scroll = value;\n },\n getCurrentPage: () => core.storeFacade.currentPage,\n setCurrentPage: (value) => {\n core.storeFacade.currentPage = value;\n },\n getTableZoom: () => core.tableZoom,\n setTableZoom: (value) => {\n core.tableZoom = value;\n },\n getQueryRowsOverrideBase: () =>\n core.queryController.getQueryRowsOverrideBase(),\n clearQueryRowsOverrideBase: () =>\n core.queryController.clearQueryRowsOverrideBase(),\n getSelectedHeaderKey: () => core.selectionController.getSelectedHeaderKey(),\n getSelectedHeaderRect: () =>\n core.selectionController.getSelectedHeaderRect(),\n setSelectedHeaderState: (key, rect) =>\n core.selectionController.setSelectedHeaderState(key, rect),\n clearSelectedHeader: () => core.selectionController.clearSelectedHeader(),\n clearColumnRangeHighlight: () =>\n core.selectionController.clearColumnRangeHighlight(),\n resolveHighlightedColumnKeys: (columnKey) =>\n core.selectionController.resolveHighlightedColumnKeys(columnKey),\n filterPanel: core.overlayController.filterPanelAdapter,\n fixedPopup: core.overlayController.fixedPopupAdapter,\n headerContextMenu: core.overlayController.headerContextMenuAdapter,\n overlayController: core.overlayController,\n componentPortal: core.componentPortal,\n domHost: core.domHost,\n canvasHost: core.canvasHost,\n toViewportRect,\n showFilterPanel: (config) => core.overlayController.showFilterPanel(config),\n hideFilterPanel: () => core.overlayController.hideFilterPanel(),\n hideHeaderContextMenu: () => core.overlayController.hideHeaderContextMenu(),\n clearExpandedRows: () => {\n core.rowActionController.clearExpandedRows();\n },\n clearCollapsedRows: () => {\n core.rowActionController.clearCollapsedRows();\n },\n persistColumnConfig: () => core.persistenceController.persistColumnConfig(),\n emitQueryChange,\n applyFilterQueryAsync,\n refreshRuntimeColumns,\n startColumnVisibilityAnimation: (params) =>\n core.rowActionController.startColumnVisibilityAnimation(params),\n closeEditorIfOpen: () => {\n if (core.editingController.getSession()) {\n core.editingController.close(false);\n }\n },\n isEditing: () => core.editingController.getSession() != null,\n requestRender: () => render(),\n });\n core.contentActionController = new ListTableContentActionController({\n getOptions: () => core.options,\n getLeafColumns: () => core.leafColumns,\n overlayController: core.overlayController,\n headerContextMenu: core.overlayController.headerContextMenuAdapter,\n });\n core.persistenceController = new ListTablePersistenceController({\n getOptions: () => core.options,\n setOptions: (value) => {\n core.options = value;\n },\n getSortState: () => core.storeFacade.sortState,\n setSortState: (value) => {\n core.storeFacade.sortState = value;\n },\n getFilterState: () => core.storeFacade.filterState,\n setFilterState: (value) => {\n core.storeFacade.filterState = value;\n },\n getTableZoom: () => core.tableZoom,\n setTableZoom: (value) => {\n core.tableZoom = value;\n },\n domHost: core.domHost,\n canvasHost: core.canvasHost,\n refreshRuntimeColumns,\n requestRender: () => render(),\n });\n core.carouselController = new ListTableCarouselController({\n getOptions: () => core.options,\n getScroll: () => core.storeFacade.scroll,\n setScroll: (value) => {\n core.storeFacade.scroll = value;\n },\n getCurrentRenderSnapshot,\n getDraggingScrollbar: () => core.draggingScrollbar,\n getDraggingResize: () => core.draggingResize,\n getDraggingReorder: () => core.draggingReorder,\n editingController: core.editingController,\n animationController: core.animationController,\n requestRender: () => render(),\n });\n core.scrollToController = new ListTableScrollToController({\n getScroll: () => core.storeFacade.scroll,\n setScroll: (value) => {\n core.storeFacade.scroll = value;\n },\n getCurrentRenderSnapshot,\n animationController: core.animationController,\n editingController: core.editingController,\n rowActionController: core.rowActionController,\n requestRender: () => render(),\n });\n\n core.tableId = resolveListTableId({\n tableId: options.tableId,\n existing: core.tableId,\n });\n core.rowDragController = new ListTableRowDragController({\n getOptions: () => core.options,\n getTableId: () => core.tableId,\n getCanvasElement: () => core.canvasHost.getCanvasElement(),\n getWrapperElement: () => core.domHost.getNodes()?.wrapperElement ?? null,\n getCurrentRenderSnapshot,\n getDescriptors,\n getDisplayData,\n getTableZoom: () => core.tableZoom,\n isBusyWithOtherDrag: () =>\n core.draggingResize != null ||\n core.draggingReorder != null ||\n core.draggingScrollbar != null,\n isEditing: () => core.editingController.getSession() != null,\n suppressNextClick: () => {\n core.suppressNextClick = true;\n },\n requestRender: () => render(),\n });\n core.rowDragController.syncRegistration();\n\n // renderController 先创建,供 event host 读取 snapshot/descriptors。\n core.renderController = new ListTableRenderController({\n createDefaultHitResult: () => hitTest(-1, -1, []),\n getCanvasHostElement,\n getCanvasElement,\n getContainerClientHeight: () => core.container.clientHeight,\n getPaginationElement,\n getPagination,\n getRenderer: () => core.renderer,\n getDebugManager: () => core.debugManager,\n getOptions: () => core.options,\n getTheme: () => core.storeFacade.theme,\n getScroll: () => core.storeFacade.scroll,\n getSelectedRowKeys: () => core.storeFacade.selectedRowKeys,\n getExpandedRowKeys: () => core.storeFacade.expandedRowKeys,\n getCollapsedRowKeys: () => core.storeFacade.collapsedRowKeys,\n getQueryRuntimeState,\n getFrozenRows: () => core.storeFacade.frozenRows,\n isDraggingResize: () => core.draggingResize != null,\n getDraggingResizeColumnKey: () => core.draggingResize?.columnKey ?? null,\n getSwapAnimation: () => core.animationController.getSwapAnimation(),\n getBaseRowsOverride: () => core.queryController.getQueryRowsOverrideBase(),\n getDisplayRowsOverride,\n getTableZoom: () => core.tableZoom,\n getHover: () => core.storeFacade.hover,\n getSelection: () => core.storeFacade.selection,\n getRangeHighlight: () => core.storeFacade.rangeHighlight,\n getSortState: () => core.storeFacade.sortState,\n getFilterState: () => core.storeFacade.filterState,\n getSelectedHeaderKey: () => core.selectionController.getSelectedHeaderKey(),\n getSummarySelected: () => core.selectionController.isSummarySelected(),\n getSelectedHeaderRect: () =>\n core.selectionController.getSelectedHeaderRect(),\n getDraggingReorder: () => core.draggingReorder,\n getRowDragIndicator: () => core.rowDragController.getDropIndicator(),\n getRuntimeColumns: () => core.storeFacade.runtimeColumns,\n getCurrentPage: () => core.storeFacade.currentPage,\n getPageSize: () => core.storeFacade.pageSize,\n getScrollPageSize: () => core.storeFacade.scrollPageSize,\n getStore: () => core.store,\n getSummaryValueMap: () => core.summaryController.getSummaryValueMap(),\n setFittedHeight: (height) => {\n core.domHost.setFittedHeight(height);\n },\n applyRenderResult,\n ensureSummaryValues: (snapshot) => {\n core.summaryController.ensureSummaryValues(snapshot);\n },\n clearSummaryForEmptySnapshot: () => {\n core.summaryController.clearSummaryForEmptySnapshot();\n },\n emitQueryChange,\n onEmptySnapshot: () => {\n core.animationController.stopCarouselScroll();\n core.animationController.stopExpandAnimations();\n core.animationController.stopCollapseAnimations();\n },\n beforePublish: (snapshot) => {\n if (core.animationController.shouldReconcileControlAnimations(snapshot)) {\n core.animationController.reconcileControlAnimations(snapshot);\n }\n core.animationController.reconcileExpandAnimations({\n expandableEnabled: Boolean(core.options.expandable),\n expandedRowKeys: core.storeFacade.expandedRowKeys,\n });\n core.animationController.reconcileCollapseAnimations(snapshot);\n },\n getPublishAccessors: () => ({\n scrollbarOpacity: core.animationController.syncScrollbarOpacity(),\n isScrollbarInteractive: isScrollbarVisible(),\n getControlAnimationProgress: (params) =>\n core.animationController.getControlAnimationProgress({\n ...params,\n snapshot: getCurrentRenderSnapshot(),\n }),\n getNestedTableHighlight: (params) =>\n core.animationController.getNestedTableHighlight(params),\n getExpandAnimationProgress: (rowKey) =>\n core.animationController.getExpandAnimationProgress(rowKey),\n getCollapseRowOffset: (rowKey) =>\n core.animationController.getCollapseRowOffset(rowKey),\n getCollapseCellHeight: (params) =>\n core.animationController.getCollapseCellHeight(params),\n getValidationMessage: ({ record, rowIndex, columnKey }) =>\n core.editingController.getValidationMessage(\n record,\n rowIndex,\n columnKey,\n ),\n }),\n afterPublish: () => {\n core.animationController.ensureControlAnimationFrame();\n core.animationController.ensureExpandAnimationFrame();\n core.animationController.ensureCollapseAnimationFrame();\n core.carouselController.syncCarouselScroll();\n },\n requestImmediateRender: () => {\n render();\n },\n });\n\n const eventHostBridge: ListTableEventHostBridge<RecordType> = {\n get options() {\n return core.options;\n },\n canvasHost: core.canvasHost,\n domHost: core.domHost,\n get debugManager() {\n return core.debugManager;\n },\n get animationController() {\n return core.animationController;\n },\n get editingController() {\n return core.editingController;\n },\n get rowDragController() {\n return core.rowDragController;\n },\n get bodyTooltipController() {\n return core.bodyTooltipController;\n },\n storeFacade: core.storeFacade,\n get selectionController() {\n return core.selectionController;\n },\n get overlayController() {\n return core.overlayController;\n },\n get queryController() {\n return core.queryController;\n },\n get renderController() {\n return core.renderController;\n },\n get suppressNextClick() {\n return core.suppressNextClick;\n },\n set suppressNextClick(value) {\n core.suppressNextClick = value;\n },\n get tableZoom() {\n return core.tableZoom;\n },\n get draggingScrollbar() {\n return core.draggingScrollbar;\n },\n set draggingScrollbar(value) {\n core.draggingScrollbar = value;\n },\n get draggingResize() {\n return core.draggingResize;\n },\n set draggingResize(value) {\n core.draggingResize = value;\n },\n get draggingReorder() {\n return core.draggingReorder;\n },\n set draggingReorder(value) {\n core.draggingReorder = value;\n },\n get leafColumns() {\n return core.leafColumns;\n },\n get normalizedColumns() {\n return core.normalizedColumns;\n },\n get headerTree() {\n return core.headerTree;\n },\n get headerRowsCache() {\n return core.headerRowsCache;\n },\n get columnSegments() {\n return core.columnSegments;\n },\n get scrollbarLayout() {\n return core.scrollbarLayout;\n },\n get headerActionController() {\n return core.headerActionController;\n },\n get rowActionController() {\n return core.rowActionController;\n },\n get contentActionController() {\n return core.contentActionController;\n },\n get persistenceController() {\n return core.persistenceController;\n },\n get carouselController() {\n return core.carouselController;\n },\n refreshRuntimeColumns,\n applyUserScroll,\n resolvePointerHit,\n };\n\n core.eventController = new ListTableEventController(\n createListTableEventHost(eventHostBridge),\n );\n core.bodyTooltipController = new BodyTooltipController({\n tooltip: core.overlayController.tooltipAdapter,\n delay: BODY_TOOLTIP_DELAY,\n toViewportPoint,\n });\n core.renderer = null;\n core.normalizedColumns = [];\n core.leafColumns = [];\n core.columnSegments = {\n leftSegment: [],\n centerSegment: [],\n rightSegment: [],\n };\n core.headerTree = [];\n core.headerRowsCache = [];\n core.debugManager = new DebugManager(options.debug);\n core.scrollbarLayout = {};\n core.draggingScrollbar = null;\n core.draggingResize = null;\n core.draggingReorder = null;\n core.suppressNextClick = false;\n core.tableZoom = 1;\n}\n","import { DebugManager } from \"../debug/debug-manager\";\r\nimport { ensureColumnKeysInPlace } from \"../domain/columns/column-key\";\r\nimport { CanvasRenderer } from \"../rendering/canvas-renderer\";\r\nimport type { ListTableOptions } from \"../schema/table-options\";\r\nimport { cloneColumns } from \"../features/header-settings/header-settings-feature\";\r\n\r\nimport { ListTableDomHost } from \"../adapters/dom-host\";\r\nimport { ListTableCanvasHost } from \"../adapters/canvas-host\";\r\nimport { ListTableComponentPortal } from \"../adapters/component-portal\";\r\n\r\nimport { areSameRowKeySet } from \"../domain/rows/row-key\";\r\nimport {\r\n createInitialListTableState,\r\n resolveListTableStateOnOptionsUpdate,\r\n} from \"./store/state\";\r\nimport { ListTableStore } from \"./store/create-store\";\r\nimport { replaceStateAction } from \"./store/actions\";\r\nimport { ListTableAnimationController } from \"./controllers/animation-controller\";\r\nimport { ListTableOverlayController } from \"./controllers/overlay-controller\";\r\nimport { ListTableQueryController } from \"./controllers/query-controller\";\r\nimport { ListTableRenderController } from \"./controllers/render-controller\";\r\nimport { ListTableSummaryController } from \"./controllers/summary-controller\";\r\nimport { ListTableEditingController } from \"./controllers/editing-controller\";\r\nimport { ListTableEventController } from \"./controllers/event-controller\";\r\nimport { ListTableSelectionController } from \"./controllers/selection-controller\";\r\nimport { ListTableContentActionController } from \"./controllers/content-action-controller\";\r\nimport { ListTableHeaderActionController } from \"./controllers/header-action-controller\";\r\nimport { ListTablePersistenceController } from \"./controllers/persistence-controller\";\r\nimport { ListTableScrollToController } from \"./controllers/scroll-to-controller\";\r\nimport { ListTableStoreFacade } from \"./controllers/store-facade\";\r\nimport {\r\n assembleListTableCoreControllers,\r\n type ListTableCoreAssemblyHost,\r\n} from \"./controller-assembly\";\r\nimport { captureRenderedVisibleRowPositions } from \"../rendering/pipeline/visible-row\";\r\nimport { buildRuntimeColumnsMap } from \"../services/runtime-sync-service\";\r\nimport type { ListTableScrollToOptions } from \"../types/instance\";\r\n\r\n/**\r\n * 列表表格核心。\r\n *\r\n * 职责收敛为:生命周期、controller 装配入口、主类方法实际读写的字段。\r\n * 布局缓存、拖拽态、initialColumns 等仅供 controller 协作的状态由 assembly 挂载,\r\n * 不在主类重复声明。\r\n */\r\nexport class ListTableCore<RecordType> {\r\n protected readonly container: HTMLElement;\r\n protected options: ListTableOptions<RecordType>;\r\n private readonly domHost: ListTableDomHost;\r\n private readonly canvasHost: ListTableCanvasHost;\r\n private readonly componentPortal: ListTableComponentPortal;\r\n private readonly store: ListTableStore<RecordType>;\r\n private readonly storeFacade: ListTableStoreFacade<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly animationController!: ListTableAnimationController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly overlayController!: ListTableOverlayController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly queryController!: ListTableQueryController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly summaryController!: ListTableSummaryController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly editingController!: ListTableEditingController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly eventController!: ListTableEventController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly selectionController!: ListTableSelectionController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly headerActionController!: ListTableHeaderActionController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly contentActionController!: ListTableContentActionController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly persistenceController!: ListTablePersistenceController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly scrollToController!: ListTableScrollToController<RecordType>;\r\n /** 由 assembleListTableCoreControllers 在构造阶段挂载。 */\r\n private readonly renderController!: ListTableRenderController<RecordType>;\r\n private debugManager!: DebugManager;\r\n\r\n /**\r\n * 创建列表核心。\r\n *\r\n * @param container 宿主容器。\r\n * @param options 配置项。\r\n */\r\n constructor(container: HTMLElement, options: ListTableOptions<RecordType>) {\r\n this.container = container;\r\n this.options = options;\r\n ensureColumnKeysInPlace(options.columns);\r\n this.domHost = new ListTableDomHost();\r\n this.canvasHost = new ListTableCanvasHost();\r\n this.store = new ListTableStore(createInitialListTableState(options));\r\n this.storeFacade = new ListTableStoreFacade(this.store);\r\n this.componentPortal = new ListTableComponentPortal();\r\n const host = this.asAssemblyHost();\r\n host.initialColumns = cloneColumns(options.columns);\r\n host.initialStretchColumns = options.stretchColumns;\r\n // assembly 会把控制器、布局缓存与交互态挂到当前实例(见 ListTableCoreAssemblyHost)。\r\n assembleListTableCoreControllers(host, options);\r\n this.debugManager = new DebugManager(options.debug);\r\n }\r\n\r\n /**\r\n * 挂载表格。\r\n */\r\n mount() {\r\n if (\r\n this.domHost.getNodes()?.wrapperElement ||\r\n this.canvasHost.getCanvasElement()\r\n ) {\r\n return;\r\n }\r\n\r\n const nodes = this.domHost.mount(this.container, this.storeFacade.theme, {\r\n width: this.options.width,\r\n height: this.options.height,\r\n });\r\n this.canvasHost.mount(nodes.canvasElement);\r\n this.componentPortal.mount(nodes.wrapperElement);\r\n this.asAssemblyHost().renderer = new CanvasRenderer(\r\n nodes.canvasElement,\r\n this.storeFacade.theme,\r\n this.options.debug ?? {},\r\n );\r\n\r\n this.eventController.bind();\r\n this.domHost.observeResize(() => {\r\n this.renderController.schedule();\r\n });\r\n this.refreshRuntimeColumns();\r\n this.renderController.render();\r\n\r\n // 异步加载持久化列配置\r\n this.persistenceController.loadStoredConfig();\r\n }\r\n\r\n /**\r\n * 更新配置。\r\n *\r\n * @param options 新配置。\r\n */\r\n updateOptions(options: ListTableOptions<RecordType>) {\r\n this.animationController.stopCarouselScroll();\r\n ensureColumnKeysInPlace(options.columns);\r\n if (\r\n options.expandable?.expandedRowKeys !== undefined &&\r\n !areSameRowKeySet(\r\n this.storeFacade.expandedRowKeys,\r\n options.expandable.expandedRowKeys,\r\n )\r\n ) {\r\n this.animationController.setPendingCollapseRowPositions(\r\n captureRenderedVisibleRowPositions(\r\n this.renderController.getCurrentRenderSnapshot(),\r\n ),\r\n );\r\n }\r\n this.queryController.reset();\r\n this.summaryController.reset();\r\n this.options = options;\r\n const host = this.asAssemblyHost();\r\n host.initialColumns = cloneColumns(options.columns);\r\n host.initialStretchColumns = options.stretchColumns;\r\n this.store.dispatch(\r\n replaceStateAction(\r\n resolveListTableStateOnOptionsUpdate(options, this.store.getSnapshot()),\r\n ),\r\n );\r\n this.domHost.applyTheme(this.storeFacade.theme, {\r\n width: options.width,\r\n height: options.height,\r\n });\r\n this.debugManager = new DebugManager(options.debug);\r\n this.hideFloatingOverlays({ includeLoading: true });\r\n this.refreshRuntimeColumns();\r\n this.renderController.render();\r\n\r\n // 异步加载持久化列配置\r\n this.persistenceController.loadStoredConfig();\r\n host.tableId = options.tableId?.trim() ? options.tableId : host.tableId;\r\n host.rowDragController.syncRegistration();\r\n }\r\n\r\n /**\r\n * 获取调试快照。\r\n *\r\n * @returns 调试快照。\r\n */\r\n getDebugSnapshot() {\r\n return this.debugManager.getSnapshot();\r\n }\r\n\r\n /**\r\n * 手动触发表格校验。\r\n *\r\n * 成功时返回当前表格数据,失败时抛出校验失败结果。\r\n */\r\n async validate(): Promise<RecordType[]> {\r\n return this.editingController.validateTable();\r\n }\r\n\r\n /**\r\n * 异步导出全部原始数据为 XLSX。\r\n */\r\n exportXlsx() {\r\n this.contentActionController.exportXlsx();\r\n }\r\n\r\n /**\r\n * 滚动到指定行。\r\n */\r\n scrollTo(options: ListTableScrollToOptions) {\r\n this.scrollToController.scrollTo(options);\r\n }\r\n\r\n /**\r\n * 重置排序状态。\r\n */\r\n resetSorter() {\r\n this.headerActionController.resetSort();\r\n }\r\n\r\n /**\r\n * 重置筛选状态。\r\n */\r\n resetFilter() {\r\n this.headerActionController.resetFilters();\r\n }\r\n\r\n /**\r\n * 销毁实例。\r\n */\r\n destroy() {\r\n this.eventController.destroy();\r\n this.selectionController.destroy();\r\n this.asAssemblyHost().rowDragController.destroy();\r\n this.animationController.stopAll();\r\n this.animationController.destroy();\r\n this.editingController.destroy();\r\n this.hideFloatingOverlays({ includeLoading: false });\r\n this.componentPortal.destroy();\r\n this.canvasHost.destroy();\r\n this.domHost.disconnectResizeObserver();\r\n this.renderController.destroy();\r\n this.queryController.destroy();\r\n this.summaryController.destroy();\r\n this.domHost.destroy();\r\n this.asAssemblyHost().renderer = null;\r\n }\r\n\r\n /**\r\n * 将当前实例视为装配宿主,用于读写仅由 assembly/controller 协作的字段。\r\n */\r\n private asAssemblyHost(): ListTableCoreAssemblyHost<RecordType> {\r\n return this as unknown as ListTableCoreAssemblyHost<RecordType>;\r\n }\r\n\r\n private hideFloatingOverlays(params?: { includeLoading?: boolean }) {\r\n this.componentPortal.hideFloatingLayers();\r\n if (params?.includeLoading) {\r\n this.overlayController.hideLoading();\r\n }\r\n this.overlayController.hideTooltip();\r\n this.overlayController.hideFilterPanel();\r\n this.overlayController.hideFixedPopup();\r\n this.overlayController.hideHeaderContextMenu();\r\n }\r\n\r\n private refreshRuntimeColumns() {\r\n this.storeFacade.runtimeColumns = buildRuntimeColumnsMap({\r\n options: this.options,\r\n selectedRowKeys: this.storeFacade.selectedRowKeys,\r\n });\r\n }\r\n}\r\n","import { ListTableCore } from \"./engine/list-table-engine\";\r\nimport type { ListTableDebugSnapshot } from \"./debug/debug-snapshot\";\r\nimport type { ListTableOptions } from \"./schema/table-options\";\r\nimport type { ListTableScrollToOptions } from \"./types/instance\";\r\n\r\n/**\r\n * ListTable 原生入口。\r\n */\r\nexport class ListTable<RecordType = Record<string, unknown>> {\r\n private readonly container: HTMLElement;\r\n private options: ListTableOptions<RecordType>;\r\n private core: ListTableCore<RecordType> | null;\r\n\r\n /**\r\n * 创建表格实例。\r\n *\r\n * @param container 宿主容器。\r\n * @param options 初始化参数。\r\n */\r\n constructor(\r\n container: HTMLElement,\r\n options: ListTableOptions<RecordType>,\r\n ) {\r\n this.container = container;\r\n this.options = options;\r\n this.core = null;\r\n }\r\n\r\n /**\r\n * 挂载表格。\r\n */\r\n mount() {\r\n if (this.core) {\r\n return;\r\n }\r\n\r\n this.core = new ListTableCore(this.container, this.options);\r\n this.core.mount();\r\n }\r\n\r\n /**\r\n * 更新配置。\r\n *\r\n * @param options 新配置。\r\n */\r\n updateOptions(options: ListTableOptions<RecordType>) {\r\n this.options = options;\r\n this.core?.updateOptions(options);\r\n }\r\n\r\n /**\r\n * 获取调试快照。\r\n *\r\n * @returns 调试快照。\r\n */\r\n getDebugSnapshot(): ListTableDebugSnapshot | null {\r\n return this.core?.getDebugSnapshot() ?? null;\r\n }\r\n\r\n /**\r\n * 手动触发表格校验。\r\n *\r\n * 成功时返回当前表格数据,失败时抛出校验失败结果。\r\n */\r\n validate(): Promise<RecordType[]> {\r\n if (!this.core) {\r\n return Promise.resolve([]);\r\n }\r\n\r\n return this.core.validate();\r\n }\r\n\r\n /**\r\n * 异步导出全部原始数据为 XLSX。\r\n */\r\n exportXlsx() {\r\n this.core?.exportXlsx();\r\n }\r\n\r\n /**\r\n * 滚动到指定行。\r\n */\r\n scrollTo(options: ListTableScrollToOptions) {\r\n this.core?.scrollTo(options);\r\n }\r\n\r\n /**\r\n * 重置排序状态。\r\n */\r\n resetSorter() {\r\n this.core?.resetSorter();\r\n }\r\n\r\n /**\r\n * 重置筛选状态。\r\n */\r\n resetFilter() {\r\n this.core?.resetFilter();\r\n }\r\n\r\n /**\r\n * 销毁实例。\r\n */\r\n destroy() {\r\n this.core?.destroy();\r\n this.core = null;\r\n }\r\n}\r\n"]}
|