@canvas-components/pivot-table 0.1.7 → 0.1.8
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/dist/index.cjs +431 -96
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -2
- package/dist/index.d.ts +30 -2
- package/dist/index.js +431 -96
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/domain/data/dimension-config.ts","../src/domain/data/dimension-key.ts","../src/domain/pivot/pivot-cell.ts","../src/domain/pivot/pivot-node.ts","../src/domain/pivot/build-dimension-tree.ts","../src/domain/aggregation/built-in-aggregators.ts","../src/domain/aggregation/aggregator-registry.ts","../src/domain/aggregation/aggregate-records.ts","../src/domain/filter/pivot-filter.ts","../src/services/pivot-model-service.ts","../src/domain/pivot/flatten-visible-tree.ts","../src/domain/layout/compute-scrollbar-layout.ts","../src/domain/layout/pivot-layout.ts","../src/features/export/pivot-export.ts","../src/engine/pivot-table-engine.ts","../src/adapters/dom-host.ts","../src/adapters/clipboard.ts","../src/adapters/canvas-host.ts","../src/rendering/draw-selection.ts","../src/schema/style.ts","../src/rendering/draw-scrollbars.ts","../src/rendering/draw-grid.ts","../src/domain/layout/sticky-row-header.ts","../src/rendering/canvas-renderer.ts","../src/domain/interaction/hit-test.ts","../src/features/clipboard/pivot-selection-copy.ts","../src/domain/interaction/resize-hit.ts","../src/domain/interaction/scrollbar-hit.ts","../src/domain/interaction/column-selection.ts","../src/domain/interaction/row-selection.ts","../src/domain/scroll/scroll-transition.ts","../src/pivot-table.ts","../src/domain/field/pivot-field-layout.ts"],"names":["getValueByDataIndex","sum","DEFAULT_ROW_DIMENSION_WIDTH","resolveNodePathKey","isPathRelated","isPathPrefix","resolveAddressIndexes","createAddress","clamp","axis","rootRect","now","thumbStart"],"mappings":"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","file":"index.js","sourcesContent":["import { stringifyDataIndex } from \"@canvas-components/utils\";\nimport type { PivotDimension } from \"../../schema/dimension\";\nimport type { PivotSortRule } from \"../../schema/sort\";\n\nconst DEFAULT_ROW_DIMENSION_WIDTH = 140;\n\n/** 解析维度稳定标识。 */\nexport function resolvePivotDimensionKey<RecordType>(\n dimension: PivotDimension<RecordType>,\n) {\n return dimension.key?.trim() || stringifyDataIndex(dimension.dataIndex);\n}\n\n/** 将与 ListTable 一致的标题配置转换为 Canvas 文本。 */\nexport function resolvePivotDimensionTitle<RecordType>(\n dimension: PivotDimension<RecordType>,\n) {\n const title = dimension.title;\n if (typeof title === \"string\") return title;\n if (!title) return resolvePivotDimensionKey(dimension);\n return (Array.isArray(title) ? title : [title])\n .map((item) => (item.type === \"text\" ? item.text : (item.alt ?? \"\")))\n .join(\"\");\n}\n\n/** 将 ListTable 风格 render 结果降级为 PivotTable 可绘制文本。 */\nexport function resolvePivotRenderText(result: unknown): string | undefined {\n if (result == null) return undefined;\n if (typeof result === \"string\" || typeof result === \"number\") {\n return String(result);\n }\n if (Array.isArray(result)) {\n return result\n .map(resolvePivotRenderText)\n .filter((item): item is string => item !== undefined)\n .join(\"\");\n }\n if (typeof result !== \"object\") return undefined;\n const content = result as { text?: unknown; value?: unknown; alt?: unknown };\n return resolvePivotRenderText(content.text ?? content.value ?? content.alt);\n}\n\n/** 解析受最小、最大宽度约束的行维度宽度。 */\nexport function resolvePivotDimensionWidth<RecordType>(\n dimension: PivotDimension<RecordType>,\n runtimeWidth?: number,\n fallbackWidth = DEFAULT_ROW_DIMENSION_WIDTH,\n) {\n const minimum = Math.max(dimension.minWidth ?? 48, 1);\n const maximum = Math.max(\n dimension.maxWidth ?? Number.POSITIVE_INFINITY,\n minimum,\n );\n return Math.min(\n Math.max(runtimeWidth ?? dimension.width ?? fallbackWidth, minimum),\n maximum,\n );\n}\n\n/** 将列级默认排序配置转换为 PivotTable 双轴排序状态。 */\nexport function resolvePivotDefaultSorts<RecordType>(params: {\n rows: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n}): PivotSortRule[] {\n return (\n [\n ...params.rows.map((dimension, index) => ({\n axis: \"row\" as const,\n dimension,\n index,\n })),\n ...params.columns.map((dimension, index) => ({\n axis: \"column\" as const,\n dimension,\n index,\n })),\n ] as const\n )\n .filter((item) => item.dimension.defaultSortOrder != null)\n .sort(\n (left, right) =>\n (left.dimension.sortPriority ?? left.index) -\n (right.dimension.sortPriority ?? right.index),\n )\n .map(({ axis, dimension }) => ({\n axis,\n dimensionKey: resolvePivotDimensionKey(dimension),\n direction: dimension.defaultSortOrder === \"descend\" ? \"desc\" : \"asc\",\n by: \"raw\",\n }));\n}\n","import type { PivotDimension } from \"../../schema/dimension\";\nimport type { ResolvedPivotDimensionValue } from \"../../schema/dimension\";\nimport { getValueByDataIndex } from \"@canvas-components/utils\";\nimport { resolvePivotRenderText } from \"./dimension-config\";\n\nconst EMPTY_DIMENSION_LABEL = \"(空)\";\n\n/** 将维度值编码成稳定且包含类型信息的键。 */\nexport function encodePivotDimensionValue(value: unknown): string {\n return stableSerialize(value, new WeakSet<object>());\n}\n\n/** 将维度路径编码成组合键。 */\nexport function encodePivotPath(values: readonly string[]) {\n return JSON.stringify(values);\n}\n\n/** 解析一条记录的维度成员。 */\nexport function resolvePivotDimensionValue<RecordType>(params: {\n record: RecordType;\n recordIndex: number;\n dimension: PivotDimension<RecordType>;\n}): ResolvedPivotDimensionValue {\n const { record, recordIndex, dimension } = params;\n const rawValue = getValueByDataIndex(record, dimension.dataIndex);\n const normalizedValue = rawValue == null || rawValue === \"\" ? null : rawValue;\n const valueKey = encodePivotDimensionValue(normalizedValue);\n const filterValue = dimension.filterValueGetter\n ? dimension.filterValueGetter(record)\n : rawValue;\n const filterOptionValue = dimension.filterOptionValueGetter\n ? dimension.filterOptionValueGetter(record)\n : filterValue;\n const formatted = resolvePivotRenderText(\n dimension.render?.(rawValue, record, recordIndex, dimension),\n );\n\n return {\n rawValue,\n normalizedValue,\n sortValue: dimension.sortValueGetter?.(record) ?? rawValue,\n filterValue,\n filterOptionValue,\n filterOptionKey: encodePivotDimensionValue(filterOptionValue),\n valueKey,\n label:\n formatted ??\n (normalizedValue == null\n ? EMPTY_DIMENSION_LABEL\n : String(normalizedValue)),\n };\n}\n\nfunction stableSerialize(value: unknown, visited: WeakSet<object>): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return `string:${JSON.stringify(value)}`;\n if (typeof value === \"boolean\") return `boolean:${value}`;\n if (typeof value === \"bigint\") return `bigint:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isNaN(value)) return \"number:NaN\";\n if (value === Number.POSITIVE_INFINITY) return \"number:Infinity\";\n if (value === Number.NEGATIVE_INFINITY) return \"number:-Infinity\";\n if (Object.is(value, -0)) return \"number:-0\";\n return `number:${value}`;\n }\n if (value instanceof Date) {\n return `date:${Number.isNaN(value.getTime()) ? \"invalid\" : value.toISOString()}`;\n }\n if (Array.isArray(value)) {\n return `array:[${value.map((item) => stableSerialize(item, visited)).join(\",\")}]`;\n }\n if (typeof value === \"object\") {\n if (visited.has(value)) {\n throw new Error(\"PivotTable 维度值不支持循环引用对象。\");\n }\n visited.add(value);\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([key, item]) =>\n `${JSON.stringify(key)}:${stableSerialize(item, visited)}`,\n );\n visited.delete(value);\n return `object:{${entries.join(\",\")}}`;\n }\n return `${typeof value}:${String(value)}`;\n}\n","/** 稀疏聚合结果单元格。 */\nexport interface PivotAggregateCell {\n key: string;\n rowPathKey: string;\n columnPathKey: string;\n indicatorKey: string;\n value: unknown;\n formattedValue: string;\n recordCount: number;\n recordIndexes: number[];\n}\n\n/** 创建稳定的聚合单元格键。 */\nexport function createPivotCellKey(\n rowPathKey: string,\n columnPathKey: string,\n indicatorKey: string,\n) {\n return JSON.stringify([rowPathKey, columnPathKey, indicatorKey]);\n}\n","import type { PivotAxis } from \"../../schema/events\";\n\n/** PivotTable 维度树节点类型。 */\nexport type PivotNodeKind =\n | \"root\"\n | \"dimension\"\n | \"subtotal\"\n | \"grandTotal\"\n | \"indicator\";\n\n/** PivotTable 行轴或列轴节点。 */\nexport interface PivotNode {\n id: string;\n axis: PivotAxis;\n kind: PivotNodeKind;\n dimensionKey: string | null;\n dimensionValueKey: string | null;\n rawValue: unknown;\n sortValue: unknown;\n label: string;\n depth: number;\n parentId: string | null;\n pathKey: string;\n indicatorKey?: string;\n children: PivotNode[];\n leafCount: number;\n}\n\n/** 创建稳定的 PivotTable 节点 ID。 */\nexport function createPivotNodeId(params: {\n axis: PivotAxis;\n kind: PivotNodeKind;\n pathKey: string;\n indicatorKey?: string;\n}) {\n return JSON.stringify([\n params.axis,\n params.kind,\n params.pathKey,\n params.indicatorKey ?? null,\n ]);\n}\n\n/** 创建小计聚合路径键。 */\nexport function createPivotSubtotalPathKey(\n axis: PivotAxis,\n parentPathKey: string,\n) {\n return JSON.stringify([\"__pivot_subtotal__\", axis, parentPathKey]);\n}\n\n/** 创建总计聚合路径键。 */\nexport function createPivotGrandTotalPathKey(axis: PivotAxis) {\n return JSON.stringify([\"__pivot_grand_total__\", axis]);\n}\n","import type { PivotDimension } from \"../../schema/dimension\";\nimport type { PivotAxis } from \"../../schema/events\";\nimport type { PivotTotalsOptions } from \"../../schema/totals\";\nimport type { PivotSortRule } from \"../../schema/sort\";\nimport type { PivotAggregateCell } from \"./pivot-cell\";\nimport { createPivotCellKey } from \"./pivot-cell\";\nimport { encodePivotPath } from \"../data/dimension-key\";\nimport type { PivotResolvedPath } from \"./pivot-model\";\nimport { resolvePivotDimensionKey } from \"../data/dimension-config\";\nimport {\n createPivotGrandTotalPathKey,\n createPivotNodeId,\n createPivotSubtotalPathKey,\n type PivotNode,\n} from \"./pivot-node\";\n\n/** 构建完整行轴或列轴维度树。 */\nexport function buildPivotDimensionTree<RecordType>(params: {\n axis: PivotAxis;\n dimensions: PivotDimension<RecordType>[];\n paths: Iterable<PivotResolvedPath>;\n totals?: PivotTotalsOptions;\n sorts?: PivotSortRule[];\n cells?: ReadonlyMap<string, PivotAggregateCell>;\n}) {\n const { axis, dimensions, paths, totals, sorts, cells } = params;\n const rootPathKey = encodePivotPath([]);\n const root: PivotNode = {\n id: createPivotNodeId({ axis, kind: \"root\", pathKey: rootPathKey }),\n axis,\n kind: \"root\",\n dimensionKey: null,\n dimensionValueKey: null,\n rawValue: null,\n sortValue: null,\n label: \"\",\n depth: -1,\n parentId: null,\n pathKey: rootPathKey,\n children: [],\n leafCount: 0,\n };\n for (const path of paths) {\n let parent = root;\n const valueKeys: string[] = [];\n path.values.forEach((value, depth) => {\n const dimension = dimensions[depth];\n if (!dimension) return;\n valueKeys.push(value.valueKey);\n const pathKey = encodePivotPath(valueKeys);\n let node = parent.children.find(\n (item) => item.kind === \"dimension\" && item.pathKey === pathKey,\n );\n if (!node) {\n node = {\n id: createPivotNodeId({ axis, kind: \"dimension\", pathKey }),\n axis,\n kind: \"dimension\",\n dimensionKey: resolvePivotDimensionKey(dimension),\n dimensionValueKey: value.valueKey,\n rawValue: value.rawValue,\n sortValue: value.sortValue,\n label: value.label,\n depth,\n parentId: parent.id,\n pathKey,\n children: [],\n leafCount: 1,\n };\n parent.children.push(node);\n }\n parent = node;\n });\n }\n\n sortPivotTree(root, dimensions, sorts, axis, cells);\n injectSubtotalNodes(root, axis, totals);\n injectGrandTotalNode(root, axis, totals);\n updateLeafCounts(root);\n return { root, nodeMap: indexPivotNodes(root) };\n}\n\nfunction sortPivotTree<RecordType>(\n node: PivotNode,\n dimensions: PivotDimension<RecordType>[],\n sorts: PivotSortRule[] | undefined,\n axis: PivotAxis,\n cells: ReadonlyMap<string, PivotAggregateCell> | undefined,\n) {\n node.children.sort((left, right) => {\n const dimension = dimensions[left.depth];\n const rule = sorts?.find(\n (item) =>\n item.axis === axis &&\n dimension != null &&\n item.dimensionKey === resolvePivotDimensionKey(dimension),\n );\n const result =\n rule?.by === \"indicator\" && rule.indicatorKey\n ? comparePivotValues(\n resolveIndicatorSortValue(left, axis, rule, cells),\n resolveIndicatorSortValue(right, axis, rule, cells),\n )\n : rule?.by === \"raw\"\n ? comparePivotValues(left.sortValue, right.sortValue)\n : left.label.localeCompare(right.label);\n return rule?.direction === \"desc\" ? -result : result;\n });\n node.children.forEach((child) =>\n sortPivotTree(child, dimensions, sorts, axis, cells),\n );\n}\n\nfunction resolveIndicatorSortValue(\n node: PivotNode,\n axis: PivotAxis,\n rule: PivotSortRule,\n cells: ReadonlyMap<string, PivotAggregateCell> | undefined,\n) {\n const rootPathKey = encodePivotPath([]);\n const rowPathKey =\n axis === \"row\" ? node.pathKey : (rule.counterpartPathKey ?? rootPathKey);\n const columnPathKey =\n axis === \"column\" ? node.pathKey : (rule.counterpartPathKey ?? rootPathKey);\n return cells?.get(\n createPivotCellKey(rowPathKey, columnPathKey, rule.indicatorKey!),\n )?.value;\n}\n\nfunction comparePivotValues(left: unknown, right: unknown) {\n if (typeof left === \"number\" && typeof right === \"number\")\n return left - right;\n return String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\n\nfunction injectSubtotalNodes(\n node: PivotNode,\n axis: PivotAxis,\n totals: PivotTotalsOptions | undefined,\n) {\n const enabled =\n axis === \"row\" ? totals?.showRowSubtotals : totals?.showColumnSubtotals;\n const position =\n axis === \"row\"\n ? (totals?.rowSubtotalPosition ?? \"after\")\n : (totals?.columnSubtotalPosition ?? \"after\");\n const dimensionChildren = node.children.filter(\n (child) => child.kind === \"dimension\",\n );\n dimensionChildren.forEach((child) =>\n injectSubtotalNodes(child, axis, totals),\n );\n if (!enabled || node.kind !== \"dimension\" || dimensionChildren.length === 0) {\n return;\n }\n const pathKey = createPivotSubtotalPathKey(axis, node.pathKey);\n const subtotal: PivotNode = {\n id: createPivotNodeId({ axis, kind: \"subtotal\", pathKey }),\n axis,\n kind: \"subtotal\",\n dimensionKey: node.dimensionKey,\n dimensionValueKey: null,\n rawValue: null,\n sortValue: null,\n label: resolveSubtotalLabel(totals, node),\n depth: node.depth + 1,\n parentId: node.id,\n pathKey,\n children: [],\n leafCount: 1,\n };\n if (position === \"before\") node.children.unshift(subtotal);\n else node.children.push(subtotal);\n}\n\nfunction injectGrandTotalNode(\n root: PivotNode,\n axis: PivotAxis,\n totals: PivotTotalsOptions | undefined,\n) {\n const enabled =\n axis === \"row\" ? totals?.showRowGrandTotal : totals?.showColumnGrandTotal;\n if (!enabled) return;\n const pathKey = createPivotGrandTotalPathKey(axis);\n const grandTotal: PivotNode = {\n id: createPivotNodeId({ axis, kind: \"grandTotal\", pathKey }),\n axis,\n kind: \"grandTotal\",\n dimensionKey: null,\n dimensionValueKey: null,\n rawValue: null,\n sortValue: null,\n label: totals?.grandTotalLabel ?? \"总计\",\n depth: 0,\n parentId: root.id,\n pathKey,\n children: [],\n leafCount: 1,\n };\n const position =\n axis === \"row\"\n ? (totals?.rowGrandTotalPosition ?? \"end\")\n : (totals?.columnGrandTotalPosition ?? \"end\");\n if (position === \"start\") root.children.unshift(grandTotal);\n else root.children.push(grandTotal);\n}\n\nfunction resolveSubtotalLabel(\n totals: PivotTotalsOptions | undefined,\n node: PivotNode,\n) {\n if (typeof totals?.subtotalLabel === \"function\") {\n return totals.subtotalLabel(node.dimensionKey ?? \"\", node.label);\n }\n return totals?.subtotalLabel ?? `${node.label} 小计`;\n}\n\nfunction updateLeafCounts(node: PivotNode): number {\n if (node.children.length === 0) {\n node.leafCount = node.kind === \"root\" ? 0 : 1;\n return node.leafCount;\n }\n node.leafCount = node.children.reduce(\n (count, child) => count + updateLeafCounts(child),\n 0,\n );\n return node.leafCount;\n}\n\nfunction indexPivotNodes(root: PivotNode) {\n const nodeMap = new Map<string, PivotNode>();\n const visit = (node: PivotNode) => {\n nodeMap.set(node.id, node);\n node.children.forEach(visit);\n };\n visit(root);\n return nodeMap;\n}\n","import type {\n PivotAggregator,\n PivotAggregatorRegistry,\n} from \"../../schema/aggregator\";\n\ninterface NumericAccumulator {\n count: number;\n numericCount: number;\n sum: number;\n min: number | null;\n max: number | null;\n distinctValues: Set<string>;\n}\n\n/** 创建内置 PivotTable 聚合器注册表。 */\nexport function createBuiltInPivotAggregators<RecordType>(): PivotAggregatorRegistry<RecordType> {\n return {\n sum: createNumericAggregator(\"sum\"),\n avg: createNumericAggregator(\"avg\"),\n count: createNumericAggregator(\"count\"),\n distinctCount: createNumericAggregator(\"distinctCount\"),\n min: createNumericAggregator(\"min\"),\n max: createNumericAggregator(\"max\"),\n };\n}\n\nfunction createNumericAggregator<RecordType>(\n type: \"sum\" | \"avg\" | \"count\" | \"distinctCount\" | \"min\" | \"max\",\n): PivotAggregator<NumericAccumulator, number | null, RecordType> {\n return {\n create: createAccumulator,\n add(state, value) {\n if (type === \"count\") {\n state.count += 1;\n return;\n }\n if (value == null || value === \"\") {\n return;\n }\n if (type === \"distinctCount\") {\n state.distinctValues.add(serializeDistinctValue(value));\n return;\n }\n const numericValue = toFiniteNumber(value);\n if (numericValue == null) {\n return;\n }\n state.numericCount += 1;\n state.sum += numericValue;\n state.min = state.min == null ? numericValue : Math.min(state.min, numericValue);\n state.max = state.max == null ? numericValue : Math.max(state.max, numericValue);\n },\n merge(state, source) {\n state.count += source.count;\n state.numericCount += source.numericCount;\n state.sum += source.sum;\n state.min = mergeMinimum(state.min, source.min);\n state.max = mergeMaximum(state.max, source.max);\n source.distinctValues.forEach((value) => state.distinctValues.add(value));\n },\n finalize(state) {\n if (type === \"count\") return state.count;\n if (type === \"distinctCount\") return state.distinctValues.size;\n if (type === \"sum\") return state.sum;\n if (type === \"avg\") {\n return state.numericCount === 0 ? null : state.sum / state.numericCount;\n }\n if (type === \"min\") return state.min;\n return state.max;\n },\n };\n}\n\nfunction createAccumulator(): NumericAccumulator {\n return {\n count: 0,\n numericCount: 0,\n sum: 0,\n min: null,\n max: null,\n distinctValues: new Set<string>(),\n };\n}\n\nfunction toFiniteNumber(value: unknown) {\n const numericValue = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(numericValue) ? numericValue : null;\n}\n\nfunction serializeDistinctValue(value: unknown) {\n return `${typeof value}:${String(value)}`;\n}\n\nfunction mergeMinimum(left: number | null, right: number | null) {\n if (left == null) return right;\n if (right == null) return left;\n return Math.min(left, right);\n}\n\nfunction mergeMaximum(left: number | null, right: number | null) {\n if (left == null) return right;\n if (right == null) return left;\n return Math.max(left, right);\n}\n","import type {\n PivotAggregator,\n PivotAggregatorRegistry,\n} from \"../../schema/aggregator\";\nimport type { PivotIndicator } from \"../../schema/indicator\";\nimport { createBuiltInPivotAggregators } from \"./built-in-aggregators\";\n\n/** 合并内置和自定义聚合器。 */\nexport function createPivotAggregatorRegistry<RecordType>(\n custom?: PivotAggregatorRegistry<RecordType>,\n): PivotAggregatorRegistry<RecordType> {\n return {\n ...createBuiltInPivotAggregators<RecordType>(),\n ...custom,\n };\n}\n\n/** 解析指标使用的聚合器。 */\nexport function resolvePivotIndicatorAggregator<RecordType>(\n indicator: PivotIndicator<RecordType>,\n registry: PivotAggregatorRegistry<RecordType>,\n): PivotAggregator<any, any, RecordType> {\n if (typeof indicator.aggregator === \"object\") {\n return indicator.aggregator;\n }\n const name = indicator.aggregator ?? \"sum\";\n const aggregator = registry[name];\n if (!aggregator) {\n throw new Error(`PivotTable 未注册聚合器:${name}`);\n }\n return aggregator;\n}\n","import type { PivotAggregatorRegistry } from \"../../schema/aggregator\";\nimport type { PivotDimension } from \"../../schema/dimension\";\nimport type { PivotIndicator } from \"../../schema/indicator\";\nimport type { PivotTotalsOptions } from \"../../schema/totals\";\nimport type { PivotSortRule } from \"../../schema/sort\";\nimport { getValueByDataIndex } from \"@canvas-components/utils\";\nimport {\n encodePivotPath,\n resolvePivotDimensionValue,\n} from \"../data/dimension-key\";\nimport { resolvePivotDimensionKey } from \"../data/dimension-config\";\nimport {\n createPivotCellKey,\n type PivotAggregateCell,\n} from \"../pivot/pivot-cell\";\nimport type { PivotModel, PivotResolvedPath } from \"../pivot/pivot-model\";\nimport { buildPivotDimensionTree } from \"../pivot/build-dimension-tree\";\nimport {\n createPivotGrandTotalPathKey,\n createPivotSubtotalPathKey,\n} from \"../pivot/pivot-node\";\nimport {\n createPivotAggregatorRegistry,\n resolvePivotIndicatorAggregator,\n} from \"./aggregator-registry\";\n\ninterface PendingAggregate<RecordType> {\n rowPathKey: string;\n columnPathKey: string;\n indicator: PivotIndicator<RecordType>;\n aggregator: ReturnType<typeof resolvePivotIndicatorAggregator<RecordType>>;\n state: unknown;\n recordIndexes: number[];\n}\n\n/** 将原始记录聚合成第一版稀疏 PivotModel。 */\nexport function aggregatePivotRecords<RecordType>(params: {\n records: RecordType[];\n rowDimensions: PivotDimension<RecordType>[];\n columnDimensions: PivotDimension<RecordType>[];\n indicators: PivotIndicator<RecordType>[];\n aggregators?: PivotAggregatorRegistry<RecordType>;\n totals?: PivotTotalsOptions;\n sorts?: PivotSortRule[];\n}): PivotModel<RecordType> {\n const {\n records,\n rowDimensions,\n columnDimensions,\n indicators,\n aggregators,\n totals,\n sorts,\n } = params;\n validatePivotConfiguration(rowDimensions, columnDimensions, indicators);\n const registry = createPivotAggregatorRegistry(aggregators);\n const rowPaths = new Map<string, PivotResolvedPath>();\n const columnPaths = new Map<string, PivotResolvedPath>();\n const pending = new Map<string, PendingAggregate<RecordType>>();\n\n records.forEach((record, recordIndex) => {\n const rowPath = resolvePath(record, recordIndex, rowDimensions);\n const columnPath = resolvePath(record, recordIndex, columnDimensions);\n rowPaths.set(rowPath.key, rowPath);\n columnPaths.set(columnPath.key, columnPath);\n\n const rowTargets = resolveAggregatePathTargets({\n axis: \"row\",\n path: rowPath,\n includeSubtotals: totals?.showRowSubtotals === true,\n includeGrandTotal: totals?.showRowGrandTotal === true,\n });\n const columnTargets = resolveAggregatePathTargets({\n axis: \"column\",\n path: columnPath,\n includeSubtotals: totals?.showColumnSubtotals === true,\n includeGrandTotal: totals?.showColumnGrandTotal === true,\n });\n\n rowTargets.forEach((rowPathKey) => {\n columnTargets.forEach((columnPathKey) => {\n indicators.forEach((indicator) => {\n addRecordToAggregate({\n pending,\n registry,\n rowPathKey,\n columnPathKey,\n indicator,\n record,\n recordIndex,\n });\n });\n });\n });\n });\n\n const cells = new Map<string, PivotAggregateCell>();\n pending.forEach((item, key) => {\n const value = item.aggregator.finalize(item.state);\n cells.set(key, {\n key,\n rowPathKey: item.rowPathKey,\n columnPathKey: item.columnPathKey,\n indicatorKey: item.indicator.key,\n value,\n formattedValue:\n item.indicator.formatter?.(value, {\n indicator: item.indicator,\n recordCount: item.recordIndexes.length,\n rowPathKey: item.rowPathKey,\n columnPathKey: item.columnPathKey,\n }) ?? formatAggregateValue(value, item.indicator.precision),\n recordCount: item.recordIndexes.length,\n recordIndexes: item.recordIndexes,\n });\n });\n\n const rowTree = buildPivotDimensionTree({\n axis: \"row\",\n dimensions: rowDimensions,\n paths: rowPaths.values(),\n totals,\n sorts,\n cells,\n });\n const columnTree = buildPivotDimensionTree({\n axis: \"column\",\n dimensions: columnDimensions,\n paths: columnPaths.values(),\n totals,\n sorts,\n cells,\n });\n\n return {\n records,\n rowPaths,\n columnPaths,\n cells,\n rowTree: rowTree.root,\n columnTree: columnTree.root,\n rowNodes: rowTree.nodeMap,\n columnNodes: columnTree.nodeMap,\n };\n}\n\nfunction addRecordToAggregate<RecordType>(params: {\n pending: Map<string, PendingAggregate<RecordType>>;\n registry: PivotAggregatorRegistry<RecordType>;\n rowPathKey: string;\n columnPathKey: string;\n indicator: PivotIndicator<RecordType>;\n record: RecordType;\n recordIndex: number;\n}) {\n const {\n pending,\n registry,\n rowPathKey,\n columnPathKey,\n indicator,\n record,\n recordIndex,\n } = params;\n const cellKey = createPivotCellKey(rowPathKey, columnPathKey, indicator.key);\n let target = pending.get(cellKey);\n if (!target) {\n const aggregator = resolvePivotIndicatorAggregator(indicator, registry);\n target = {\n rowPathKey,\n columnPathKey,\n indicator,\n aggregator,\n state: aggregator.create(),\n recordIndexes: [],\n };\n pending.set(cellKey, target);\n }\n const value = indicator.valueGetter\n ? indicator.valueGetter(record, recordIndex)\n : getValueByDataIndex(record, indicator.dataIndex);\n target.state =\n target.aggregator.add(target.state, value, {\n record,\n recordIndex,\n indicatorKey: indicator.key,\n }) ?? target.state;\n target.recordIndexes.push(recordIndex);\n}\n\nfunction resolveAggregatePathTargets(params: {\n axis: \"row\" | \"column\";\n path: PivotResolvedPath;\n includeSubtotals: boolean;\n includeGrandTotal: boolean;\n}) {\n const rootPathKey = encodePivotPath([]);\n const result = params.path.values.length\n ? params.path.values.map((_, depth) =>\n encodePivotPath(\n params.path.values.slice(0, depth + 1).map((value) => value.valueKey),\n ),\n )\n : [params.path.key];\n if (!result.includes(rootPathKey)) result.push(rootPathKey);\n if (params.includeSubtotals) {\n for (let depth = 1; depth < params.path.values.length; depth += 1) {\n const parentPathKey = encodePivotPath(\n params.path.values.slice(0, depth).map((value) => value.valueKey),\n );\n result.push(createPivotSubtotalPathKey(params.axis, parentPathKey));\n }\n }\n if (params.includeGrandTotal) {\n result.push(createPivotGrandTotalPathKey(params.axis));\n }\n return result;\n}\n\nfunction resolvePath<RecordType>(\n record: RecordType,\n recordIndex: number,\n dimensions: PivotDimension<RecordType>[],\n): PivotResolvedPath {\n const values = dimensions.map((dimension) =>\n resolvePivotDimensionValue({ record, recordIndex, dimension }),\n );\n return {\n key: encodePivotPath(values.map((value) => value.valueKey)),\n values,\n };\n}\n\nfunction validatePivotConfiguration<RecordType>(\n rowDimensions: PivotDimension<RecordType>[],\n columnDimensions: PivotDimension<RecordType>[],\n indicators: PivotIndicator<RecordType>[],\n) {\n const dimensionKeys = [...rowDimensions, ...columnDimensions].map(\n resolvePivotDimensionKey,\n );\n assertUniqueKeys(dimensionKeys, \"维度\");\n assertUniqueKeys(\n indicators.map((indicator) => indicator.key),\n \"指标\",\n );\n}\n\nfunction assertUniqueKeys(keys: string[], label: string) {\n const seen = new Set<string>();\n keys.forEach((key) => {\n if (!key.trim()) {\n throw new Error(`PivotTable ${label} key 不能为空。`);\n }\n if (seen.has(key)) {\n throw new Error(`PivotTable ${label} key 重复:${key}`);\n }\n seen.add(key);\n });\n}\n\nfunction formatAggregateValue(value: unknown, precision?: number) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return precision == null ? String(value) : value.toFixed(precision);\n }\n return value == null ? \"\" : String(value);\n}\n","import type { PivotDimension } from \"../../schema/dimension\";\nimport type {\n PivotDimensionFilter,\n PivotFilterCondition,\n PivotFilterState,\n} from \"../../schema/state\";\nimport type { PivotFilterAxis } from \"../../schema/events\";\nimport type { PivotFilterOptionItem } from \"../../ui/types\";\nimport {\n encodePivotDimensionValue,\n resolvePivotDimensionValue,\n} from \"../data/dimension-key\";\nimport { resolvePivotDimensionKey } from \"../data/dimension-config\";\n\n/** 创建空的行、列与报告字段过滤状态。 */\nexport function createEmptyPivotFilterState(): PivotFilterState {\n return { rows: {}, columns: {}, filters: {} };\n}\n\n/** 按当前行、列与报告字段条件过滤原始记录。 */\nexport function filterPivotRecords<RecordType>(params: {\n records: RecordType[];\n rows: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n filterDimensions?: PivotDimension<RecordType>[];\n filters?: PivotFilterState;\n exclude?: { axis: PivotFilterAxis; dimensionKey: string };\n}) {\n const filters = params.filters;\n if (!filters) return params.records;\n return params.records.filter(\n (record, recordIndex) =>\n matchesDimensions(\n record,\n recordIndex,\n params.rows,\n filters.rows,\n \"row\",\n params.exclude,\n ) &&\n matchesDimensions(\n record,\n recordIndex,\n params.columns,\n filters.columns,\n \"column\",\n params.exclude,\n ) &&\n matchesDimensions(\n record,\n recordIndex,\n params.filterDimensions ?? [],\n filters.filters ?? {},\n \"filter\",\n params.exclude,\n ),\n );\n}\n\n/** 统计指定维度在其他过滤条件下的候选成员。 */\nexport function getPivotDimensionFilterOptions<RecordType>(params: {\n records: RecordType[];\n rows: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n filterDimensions?: PivotDimension<RecordType>[];\n filters?: PivotFilterState;\n axis: PivotFilterAxis;\n dimensionKey: string;\n}): PivotFilterOptionItem[] {\n const dimensions =\n params.axis === \"row\"\n ? params.rows\n : params.axis === \"column\"\n ? params.columns\n : (params.filterDimensions ?? []);\n const dimension = dimensions.find(\n (item) => resolvePivotDimensionKey(item) === params.dimensionKey,\n );\n if (!dimension) return [];\n const records = filterPivotRecords({\n ...params,\n exclude: { axis: params.axis, dimensionKey: params.dimensionKey },\n });\n const counts = new Map<\n string,\n { label: string; count: number; blank: boolean }\n >();\n records.forEach((record, recordIndex) => {\n const value = resolvePivotDimensionValue({\n record,\n recordIndex,\n dimension,\n });\n const current = counts.get(value.filterOptionKey);\n if (current) current.count += 1;\n else {\n counts.set(value.filterOptionKey, {\n label: value.label,\n count: 1,\n blank:\n value.filterOptionValue == null || value.filterOptionValue === \"\",\n });\n }\n });\n const values = dimension.filterOptions?.length\n ? dimension.filterOptions\n .map((option) =>\n typeof option === \"string\"\n ? { label: option, rawValue: option }\n : { label: option.label, rawValue: option.value },\n )\n .filter((item) => item.rawValue != null && item.rawValue !== \"\")\n .map((item) => {\n const value = encodeFilterOptionValue(item.rawValue);\n return {\n label: item.label,\n value,\n count: counts.get(value)?.count ?? 0,\n kind: \"value\" as const,\n };\n })\n : Array.from(counts, ([value, item]) => ({ value, ...item }))\n .filter((item) => !item.blank)\n .map((item) => ({\n label: item.label,\n value: item.value,\n count: item.count,\n kind: \"value\" as const,\n }));\n const blankCount = Array.from(counts.values()).reduce(\n (sum, item) => sum + (item.blank ? item.count : 0),\n 0,\n );\n return [\n { label: \"全部\", value: \"__all__\", count: records.length, kind: \"all\" },\n { label: \"空\", value: \"__blank__\", count: blankCount, kind: \"blank\" },\n {\n label: \"非空\",\n value: \"__not_blank__\",\n count: records.length - blankCount,\n kind: \"notBlank\",\n },\n ...values,\n ];\n}\n\nfunction matchesDimensions<RecordType>(\n record: RecordType,\n recordIndex: number,\n dimensions: PivotDimension<RecordType>[],\n filters: Record<string, PivotDimensionFilter>,\n axis: PivotFilterAxis,\n exclude?: { axis: PivotFilterAxis; dimensionKey: string },\n) {\n return dimensions.every((dimension) => {\n const dimensionKey = resolvePivotDimensionKey(dimension);\n if (exclude?.axis === axis && exclude.dimensionKey === dimensionKey)\n return true;\n const filter = filters[dimensionKey];\n if (!filter) return true;\n const value = resolvePivotDimensionValue({\n record,\n recordIndex,\n dimension,\n });\n if (\n filter.selectedKeys &&\n !matchesSelectedKeys(\n filter.selectedKeys,\n value.filterOptionKey,\n value.filterOptionValue,\n )\n ) {\n return false;\n }\n if (\n !filter.selectedKeys?.length &&\n !matchesSearchKeyword(value.filterValue, filter)\n ) {\n return false;\n }\n return matchesFilterConditions(value.filterValue, filter);\n });\n}\n\nfunction encodeFilterOptionValue(value: unknown) {\n return encodePivotDimensionValue(value);\n}\n\nfunction matchesSelectedKeys(\n selectedKeys: string[],\n valueKey: string,\n optionValue: unknown,\n) {\n const blank = optionValue == null || optionValue === \"\";\n return (\n selectedKeys.includes(\"__all__\") ||\n selectedKeys.includes(valueKey) ||\n (blank && selectedKeys.includes(\"__blank__\")) ||\n (!blank && selectedKeys.includes(\"__not_blank__\"))\n );\n}\n\nfunction matchesSearchKeyword(value: unknown, filter: PivotDimensionFilter) {\n const keyword = filter.searchKeyword?.trim().toLocaleLowerCase() ?? \"\";\n if (!keyword) return true;\n const text = String(value ?? \"\").toLocaleLowerCase();\n return filter.searchExact ? text === keyword : text.includes(keyword);\n}\n\nfunction matchesFilterConditions(value: unknown, filter: PivotDimensionFilter) {\n const first = filter.condition;\n const second = filter.secondCondition;\n const firstActive = first && first.operator !== \"none\";\n const secondActive = second && second.operator !== \"none\";\n if (!firstActive && !secondActive) return true;\n if (!firstActive) return evaluateCondition(value, second!);\n if (!secondActive) return evaluateCondition(value, first);\n return filter.conditionRelation === \"or\"\n ? evaluateCondition(value, first) || evaluateCondition(value, second)\n : evaluateCondition(value, first) && evaluateCondition(value, second);\n}\n\nfunction evaluateCondition(value: unknown, condition: PivotFilterCondition) {\n const text = value == null ? \"\" : String(value);\n const expected = condition.value == null ? \"\" : String(condition.value);\n switch (condition.operator) {\n case \"none\":\n return true;\n case \"equals\":\n return text === expected;\n case \"notEquals\":\n return text !== expected;\n case \"contains\":\n return text.includes(expected);\n case \"notContains\":\n return !text.includes(expected);\n case \"startsWith\":\n return text.startsWith(expected);\n case \"notStartsWith\":\n return !text.startsWith(expected);\n case \"endsWith\":\n return text.endsWith(expected);\n case \"notEndsWith\":\n return !text.endsWith(expected);\n case \"greaterThan\":\n return compare(value, condition.value) > 0;\n case \"greaterThanOrEqual\":\n return compare(value, condition.value) >= 0;\n case \"lessThan\":\n return compare(value, condition.value) < 0;\n case \"lessThanOrEqual\":\n return compare(value, condition.value) <= 0;\n case \"between\":\n return (\n compare(value, condition.value) >= 0 &&\n compare(value, condition.secondValue) <= 0\n );\n case \"notBetween\":\n return (\n compare(value, condition.value) < 0 ||\n compare(value, condition.secondValue) > 0\n );\n case \"blank\":\n return value == null || value === \"\";\n case \"notBlank\":\n return value != null && value !== \"\";\n }\n}\n\nfunction compare(left: unknown, right: unknown) {\n if (typeof left === \"number\" && typeof right === \"number\")\n return left - right;\n return String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\n","import { aggregatePivotRecords } from \"../domain/aggregation/aggregate-records\";\nimport { createPivotCellKey } from \"../domain/pivot/pivot-cell\";\nimport type { PivotModel } from \"../domain/pivot/pivot-model\";\nimport type { PivotTableOptions } from \"../schema/options\";\nimport { filterPivotRecords } from \"../domain/filter/pivot-filter\";\n\n/** 根据当前配置构建 PivotModel。 */\nexport function buildPivotModel<RecordType>(\n options: PivotTableOptions<RecordType>,\n) {\n const records = filterPivotRecords({\n records: options.dataSource,\n rows: options.rows,\n columns: options.columns,\n filterDimensions: options.filterDimensions,\n filters: options.filters,\n });\n return aggregatePivotRecords({\n records,\n rowDimensions: options.rows,\n columnDimensions: options.columns,\n indicators: options.indicators,\n aggregators: options.aggregators,\n totals: options.totals,\n sorts: options.sorts,\n });\n}\n\n/** PivotModel 实例级缓存。 */\nexport class PivotModelCache<RecordType> {\n private options: PivotTableOptions<RecordType> | null = null;\n private model: PivotModel<RecordType> | null = null;\n private buildDurationMs = 0;\n private buildCount = 0;\n\n /** 配置的数据和领域输入未变化时复用聚合结果。 */\n getOrBuild(options: PivotTableOptions<RecordType>) {\n if (\n this.model &&\n this.options &&\n canReusePivotModel(this.options, options)\n ) {\n return this.model;\n }\n if (this.model && this.options) {\n const incremental = rebuildChangedIndicators({\n previousOptions: this.options,\n nextOptions: options,\n previousModel: this.model,\n });\n if (incremental) {\n this.options = options;\n this.model = incremental.model;\n this.buildDurationMs = incremental.buildDurationMs;\n this.buildCount += 1;\n return this.model;\n }\n }\n this.options = options;\n const startedAt = now();\n this.model = buildPivotModel(options);\n this.buildDurationMs = now() - startedAt;\n this.buildCount += 1;\n return this.model;\n }\n\n /** 清除缓存引用。 */\n clear() {\n this.options = null;\n this.model = null;\n }\n\n /** 获取最近一次模型构建指标。 */\n getMetrics() {\n return {\n buildDurationMs: this.buildDurationMs,\n buildCount: this.buildCount,\n };\n }\n}\n\nfunction rebuildChangedIndicators<RecordType>(params: {\n previousOptions: PivotTableOptions<RecordType>;\n nextOptions: PivotTableOptions<RecordType>;\n previousModel: PivotModel<RecordType>;\n}) {\n const { previousOptions, nextOptions, previousModel } = params;\n if (\n !canReusePivotStructure(previousOptions, nextOptions) ||\n nextOptions.indicators.length === 0 ||\n nextOptions.sorts?.some((sort) => sort.by === \"indicator\")\n ) {\n return null;\n }\n const previousIndicators = new Map(\n previousOptions.indicators.map((indicator) => [indicator.key, indicator]),\n );\n const changedIndicators = nextOptions.indicators.filter(\n (indicator) => previousIndicators.get(indicator.key) !== indicator,\n );\n const retainedKeys = new Set(\n nextOptions.indicators\n .filter(\n (indicator) => previousIndicators.get(indicator.key) === indicator,\n )\n .map((indicator) => indicator.key),\n );\n const startedAt = now();\n const cells = new Map(\n Array.from(previousModel.cells).filter(([, cell]) =>\n retainedKeys.has(cell.indicatorKey),\n ),\n );\n if (changedIndicators.length > 0) {\n const partialModel = buildPivotModel({\n ...nextOptions,\n indicators: changedIndicators,\n });\n partialModel.cells.forEach((cell, key) => cells.set(key, cell));\n }\n return {\n model: { ...previousModel, cells },\n buildDurationMs: now() - startedAt,\n };\n}\n\nfunction canReusePivotStructure<RecordType>(\n previous: PivotTableOptions<RecordType>,\n next: PivotTableOptions<RecordType>,\n) {\n return (\n previous.dataSource === next.dataSource &&\n previous.dataVersion === next.dataVersion &&\n previous.rows === next.rows &&\n previous.columns === next.columns &&\n previous.filterDimensions === next.filterDimensions &&\n previous.aggregators === next.aggregators &&\n previous.totals === next.totals &&\n previous.filters === next.filters &&\n previous.sorts === next.sorts\n );\n}\n\n/** 获取聚合单元格对应的原始记录。 */\nexport function getPivotCellRecords<RecordType>(params: {\n model: PivotModel<RecordType>;\n rowPathKey: string;\n columnPathKey: string;\n indicatorKey: string;\n}) {\n const { model, rowPathKey, columnPathKey, indicatorKey } = params;\n const cell = model.cells.get(\n createPivotCellKey(rowPathKey, columnPathKey, indicatorKey),\n );\n return (\n cell?.recordIndexes\n .map((index) => model.records[index])\n .filter((record): record is RecordType => record !== undefined) ?? []\n );\n}\n\nfunction canReusePivotModel<RecordType>(\n previous: PivotTableOptions<RecordType>,\n next: PivotTableOptions<RecordType>,\n) {\n return (\n previous.dataSource === next.dataSource &&\n previous.dataVersion === next.dataVersion &&\n previous.rows === next.rows &&\n previous.columns === next.columns &&\n previous.filterDimensions === next.filterDimensions &&\n previous.indicators === next.indicators &&\n previous.aggregators === next.aggregators &&\n previous.totals === next.totals &&\n previous.filters === next.filters &&\n previous.sorts === next.sorts\n );\n}\n\nfunction now() {\n return globalThis.performance?.now() ?? Date.now();\n}\n","import type { PivotNode } from \"./pivot-node\";\n\n/** 根据展开状态生成当前可见叶节点。 */\nexport function flattenVisiblePivotLeaves(params: {\n root: PivotNode;\n expandedNodeIds: ReadonlySet<string>;\n defaultExpandDepth?: number;\n}) {\n const { root, expandedNodeIds, defaultExpandDepth = 0 } = params;\n const result: PivotNode[] = [];\n const visit = (node: PivotNode) => {\n if (node.kind !== \"root\" && node.children.length === 0) {\n result.push(node);\n return;\n }\n const expanded =\n node.kind === \"root\" ||\n expandedNodeIds.has(node.id) ||\n node.depth < defaultExpandDepth;\n if (!expanded) {\n result.push(node);\n return;\n }\n node.children.forEach(visit);\n };\n visit(root);\n return result;\n}\n","import type { PivotScrollbarLayout } from \"./scrollbar-types\";\n\nconst SCROLLBAR_THICKNESS = 10;\nconst MIN_THUMB_SIZE = 36;\nconst VERTICAL_TOP_INSET = 6;\n\n/** 计算覆盖于 PivotTable Canvas 上的双轴滚动条布局。 */\nexport function computePivotScrollbarLayout(params: {\n width: number;\n height: number;\n bodyTop: number;\n bodyHeight: number;\n bodyWidth: number;\n totalBodyWidth: number;\n totalBodyHeight: number;\n scrollLeft: number;\n scrollTop: number;\n maxScrollLeft: number;\n maxScrollTop: number;\n}): PivotScrollbarLayout {\n const result: PivotScrollbarLayout = {};\n const hasHorizontal = params.maxScrollLeft > 0;\n const hasVertical = params.maxScrollTop > 0;\n\n if (hasHorizontal) {\n const fullWidth = Math.max(\n params.width - (hasVertical ? SCROLLBAR_THICKNESS : 0),\n 0,\n );\n const buttonSize = Math.min(SCROLLBAR_THICKNESS, fullWidth / 3);\n const trackWidth = Math.max(fullWidth - buttonSize * 2, 0);\n const thumbWidth = resolveThumbSize(\n params.bodyWidth,\n params.totalBodyWidth,\n trackWidth,\n );\n const thumbOffset = resolveThumbOffset(\n params.scrollLeft,\n params.maxScrollLeft,\n trackWidth,\n thumbWidth,\n );\n result.horizontal = {\n decreaseButton: {\n x: 0,\n y: params.height - SCROLLBAR_THICKNESS,\n width: buttonSize,\n height: SCROLLBAR_THICKNESS,\n },\n increaseButton: {\n x: fullWidth - buttonSize,\n y: params.height - SCROLLBAR_THICKNESS,\n width: buttonSize,\n height: SCROLLBAR_THICKNESS,\n },\n track: {\n x: buttonSize,\n y: params.height - SCROLLBAR_THICKNESS,\n width: trackWidth,\n height: SCROLLBAR_THICKNESS,\n },\n thumb: {\n x: buttonSize + thumbOffset,\n y: params.height - SCROLLBAR_THICKNESS,\n width: thumbWidth,\n height: SCROLLBAR_THICKNESS,\n },\n };\n }\n\n if (hasVertical) {\n const fullHeight = Math.max(\n params.bodyHeight -\n VERTICAL_TOP_INSET -\n (hasHorizontal ? SCROLLBAR_THICKNESS : 0),\n 0,\n );\n const buttonSize = Math.min(SCROLLBAR_THICKNESS, fullHeight / 3);\n const trackHeight = Math.max(fullHeight - buttonSize * 2, 0);\n const thumbHeight = resolveThumbSize(\n params.bodyHeight,\n params.totalBodyHeight,\n trackHeight,\n );\n const thumbOffset = resolveThumbOffset(\n params.scrollTop,\n params.maxScrollTop,\n trackHeight,\n thumbHeight,\n );\n const x = params.width - SCROLLBAR_THICKNESS;\n const y = params.bodyTop + VERTICAL_TOP_INSET;\n result.vertical = {\n decreaseButton: { x, y, width: SCROLLBAR_THICKNESS, height: buttonSize },\n increaseButton: {\n x,\n y: y + fullHeight - buttonSize,\n width: SCROLLBAR_THICKNESS,\n height: buttonSize,\n },\n track: {\n x,\n y: y + buttonSize,\n width: SCROLLBAR_THICKNESS,\n height: trackHeight,\n },\n thumb: {\n x,\n y: y + buttonSize + thumbOffset,\n width: SCROLLBAR_THICKNESS,\n height: thumbHeight,\n },\n };\n }\n\n return result;\n}\n\nfunction resolveThumbSize(viewport: number, content: number, track: number) {\n if (content <= 0 || track <= 0) return 0;\n return Math.min(Math.max((viewport / content) * track, MIN_THUMB_SIZE), track);\n}\n\nfunction resolveThumbOffset(\n scroll: number,\n maxScroll: number,\n track: number,\n thumb: number,\n) {\n if (maxScroll <= 0) return 0;\n return (scroll / maxScroll) * Math.max(track - thumb, 0);\n}\n","import { clamp } from \"@canvas-components/utils\";\nimport type { PivotModel } from \"../pivot/pivot-model\";\nimport type { PivotNode } from \"../pivot/pivot-node\";\nimport { createPivotCellKey } from \"../pivot/pivot-cell\";\nimport { encodePivotPath } from \"../data/dimension-key\";\nimport type { PivotTableOptions } from \"../../schema/options\";\nimport type { PivotDimensionFilter } from \"../../schema/state\";\nimport type {\n PivotAxisSlot,\n PivotBodyCellLayout,\n PivotHeaderCellLayout,\n PivotLayoutSnapshot,\n PivotReportFilterCellLayout,\n} from \"./types\";\nimport { computePivotScrollbarLayout } from \"./compute-scrollbar-layout\";\nimport {\n resolvePivotDimensionKey,\n resolvePivotDimensionTitle,\n resolvePivotDimensionWidth,\n} from \"../data/dimension-config\";\nimport { getPivotDimensionFilterOptions } from \"../filter/pivot-filter\";\n\nconst DEFAULT_ROW_HEIGHT = 40;\nconst DEFAULT_COLUMN_WIDTH = 120;\nconst DEFAULT_HEADER_SIZE = 40;\nconst DEFAULT_ROW_DIMENSION_WIDTH = 140;\n\n/** 构建四区 PivotTable 布局快照。 */\nexport function buildPivotLayoutSnapshot<RecordType>(params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n visibleRowNodes: PivotNode[];\n visibleColumnNodes: PivotNode[];\n width: number;\n height: number;\n scroll: { left: number; top: number };\n columnWidths?: ReadonlyMap<string, number>;\n expandedRowNodeIds?: ReadonlySet<string>;\n expandedColumnNodeIds?: ReadonlySet<string>;\n}): PivotLayoutSnapshot {\n const { model, options, visibleRowNodes, visibleColumnNodes, width, height } =\n params;\n const indicatorLayout = options.indicatorLayout ?? \"columns\";\n const rowHeight = options.rowHeight ?? DEFAULT_ROW_HEIGHT;\n const columnWidth = options.columnWidth ?? DEFAULT_COLUMN_WIDTH;\n const rowDimensionWidths = options.rows.map((dimension) =>\n resolvePivotDimensionWidth(dimension),\n );\n const hasIndicators = options.indicators.length > 0;\n if (indicatorLayout === \"rows\" && hasIndicators) {\n rowDimensionWidths.push(\n Math.max(\n ...options.indicators.map(\n (indicator) => indicator.width ?? DEFAULT_COLUMN_WIDTH,\n ),\n ),\n );\n }\n if (rowDimensionWidths.length === 0) {\n rowDimensionWidths.push(DEFAULT_ROW_DIMENSION_WIDTH);\n }\n const rowHeaderWidth = rowDimensionWidths.reduce(\n (sum, item) => sum + item,\n 0,\n );\n const columnHeaderLevels = Math.max(\n options.columns.length +\n (indicatorLayout === \"columns\" && hasIndicators ? 1 : 0),\n 1,\n );\n const columnHeaderHeight = columnHeaderLevels * DEFAULT_HEADER_SIZE;\n const reportFilterHeight =\n (options.filterDimensions?.length ?? 0) * rowHeight;\n const tableHeaderHeight = reportFilterHeight + columnHeaderHeight;\n const bodyWidth = Math.max(width - rowHeaderWidth, 0);\n const availableBodyHeight = Math.max(height - tableHeaderHeight, 0);\n const rowSlots = createPivotAxisSlots({\n nodes: visibleRowNodes,\n indicators: options.indicators.map((indicator) => indicator.key),\n includeIndicators: indicatorLayout === \"rows\",\n });\n const columnSlots = createPivotAxisSlots({\n nodes: visibleColumnNodes,\n indicators: options.indicators.map((indicator) => indicator.key),\n includeIndicators: indicatorLayout === \"columns\",\n });\n const columnWidths = columnSlots.map((slot) =>\n resolveColumnSlotWidth({\n slot,\n model,\n options,\n runtimeWidth: params.columnWidths?.get(slot.key),\n fallbackWidth: columnWidth,\n }),\n );\n const columnOffsets = createOffsets(columnWidths);\n const totalBodyWidth = columnOffsets[columnOffsets.length - 1] ?? 0;\n const totalBodyHeight = rowSlots.length * rowHeight;\n const tableWidth = rowHeaderWidth + Math.min(bodyWidth, totalBodyWidth);\n // 数据不足时按实际内容收缩表体,避免表格在容器内留下无意义的空白区域。\n const bodyHeight = Math.min(availableBodyHeight, totalBodyHeight);\n const fittedHeight = tableHeaderHeight + bodyHeight;\n const maxScrollLeft = Math.max(totalBodyWidth - bodyWidth, 0);\n const maxScrollTop = Math.max(totalBodyHeight - bodyHeight, 0);\n const scroll = {\n left: clamp(params.scroll.left, 0, maxScrollLeft),\n top: clamp(params.scroll.top, 0, maxScrollTop),\n };\n const visibleRowRange = resolveVisibleRange({\n count: rowSlots.length,\n itemSize: rowHeight,\n viewportSize: bodyHeight,\n offset: scroll.top,\n overscan: options.overscanRowCount ?? 1,\n });\n const visibleColumnRange = resolveVariableVisibleRange({\n offsets: columnOffsets,\n viewportSize: bodyWidth,\n offset: scroll.left,\n overscan: options.overscanColumnCount ?? 1,\n });\n const reportFilterCells = buildReportFilterCells({\n options,\n tableWidth,\n rowHeaderWidth,\n rowHeight,\n });\n const rowFieldHeaderCells = buildRowFieldHeaderCells({\n options,\n rowDimensionWidths,\n columnHeaderHeight,\n headerTop: reportFilterHeight,\n });\n const rowHeaderCells = buildRowHeaderCells({\n model,\n options,\n slots: rowSlots,\n range: visibleRowRange,\n rowHeight,\n rowDimensionWidths,\n columnHeaderHeight: tableHeaderHeight,\n scrollTop: scroll.top,\n expandedNodeIds: params.expandedRowNodeIds,\n dimensionCount: options.rows.length,\n indicators: options.indicators,\n });\n const columnHeaderCells = buildColumnHeaderCells({\n model,\n options,\n slots: columnSlots,\n range: visibleColumnRange,\n columnWidths,\n columnOffsets,\n rowHeaderWidth,\n scrollLeft: scroll.left,\n levels: columnHeaderLevels,\n headerTop: reportFilterHeight,\n expandedNodeIds: params.expandedColumnNodeIds,\n });\n const bodyCells = buildBodyCells({\n model,\n rowSlots,\n columnSlots,\n rowRange: visibleRowRange,\n columnRange: visibleColumnRange,\n rowHeight,\n columnWidths,\n columnOffsets,\n rowHeaderWidth,\n columnHeaderHeight: tableHeaderHeight,\n scroll,\n });\n const scrollbar = computePivotScrollbarLayout({\n width,\n height: fittedHeight,\n bodyTop: tableHeaderHeight,\n bodyHeight,\n bodyWidth,\n totalBodyWidth,\n totalBodyHeight,\n scrollLeft: scroll.left,\n scrollTop: scroll.top,\n maxScrollLeft,\n maxScrollTop,\n });\n\n return {\n width,\n tableWidth,\n height: fittedHeight,\n recordCount: model.records.length,\n rowHeight,\n columnWidth,\n columnWidths,\n columnOffsets,\n rowHeaderWidth,\n rowDimensionWidths,\n reportFilterHeight,\n columnHeaderHeight,\n reportFilterRect: {\n x: 0,\n y: 0,\n width: tableWidth,\n height: reportFilterHeight,\n },\n cornerRect: {\n x: 0,\n y: reportFilterHeight,\n width: rowHeaderWidth,\n height: columnHeaderHeight,\n },\n rowHeaderRect: {\n x: 0,\n y: tableHeaderHeight,\n width: rowHeaderWidth,\n height: bodyHeight,\n },\n columnHeaderRect: {\n x: rowHeaderWidth,\n y: reportFilterHeight,\n width: bodyWidth,\n height: columnHeaderHeight,\n },\n bodyRect: {\n x: rowHeaderWidth,\n y: tableHeaderHeight,\n width: bodyWidth,\n height: bodyHeight,\n },\n rowSlots,\n columnSlots,\n visibleRowRange,\n visibleColumnRange,\n reportFilterCells,\n rowFieldHeaderCells,\n rowHeaderCells,\n columnHeaderCells,\n bodyCells,\n scroll,\n viewport: { maxScrollLeft, maxScrollTop, totalBodyWidth, totalBodyHeight },\n scrollbar,\n };\n}\n\nfunction buildReportFilterCells<RecordType>(params: {\n options: PivotTableOptions<RecordType>;\n tableWidth: number;\n rowHeaderWidth: number;\n rowHeight: number;\n}): PivotReportFilterCellLayout[] {\n const dimensions = params.options.filterDimensions ?? [];\n const labelWidth = Math.min(\n params.rowHeaderWidth,\n Math.max(params.tableWidth - 80, 0),\n );\n return dimensions.map((dimension, index) => {\n const dimensionKey = resolvePivotDimensionKey(dimension);\n const filter = params.options.filters?.filters?.[dimensionKey];\n const rect = {\n x: 0,\n y: index * params.rowHeight,\n width: params.tableWidth,\n height: params.rowHeight,\n };\n return {\n dimensionKey,\n label: resolvePivotDimensionTitle(dimension),\n valueLabel: resolveReportFilterValueLabel({\n options: params.options,\n dimensionKey,\n filter,\n }),\n active: isReportFilterActive(filter),\n rect,\n labelRect: { ...rect, width: labelWidth },\n valueRect: {\n ...rect,\n x: labelWidth,\n width: Math.max(rect.width - labelWidth, 0),\n },\n };\n });\n}\n\nfunction resolveReportFilterValueLabel<RecordType>(params: {\n options: PivotTableOptions<RecordType>;\n dimensionKey: string;\n filter: PivotDimensionFilter | undefined;\n}) {\n const filter = params.filter;\n if (!filter) return \"(全部)\";\n if (filter.condition?.operator && filter.condition.operator !== \"none\") {\n return \"(条件筛选)\";\n }\n if (filter.searchKeyword) return `(搜索:${filter.searchKeyword})`;\n const selectedKeys = filter.selectedKeys ?? [];\n if (selectedKeys.length === 0) return \"(全部)\";\n const options = getPivotDimensionFilterOptions({\n records: params.options.dataSource,\n rows: params.options.rows,\n columns: params.options.columns,\n filterDimensions: params.options.filterDimensions,\n filters: params.options.filters,\n axis: \"filter\",\n dimensionKey: params.dimensionKey,\n });\n const selectedKeySet = new Set(selectedKeys);\n const selectableKeys = options\n .filter((option) => option.kind !== \"all\")\n .map((option) => option.value);\n if (\n selectedKeySet.has(\"__all__\") ||\n (selectableKeys.length > 0 &&\n selectableKeys.every((key) => selectedKeySet.has(key)))\n ) {\n return \"(全部)\";\n }\n if (selectedKeys.length > 1) return `(多项:${selectedKeys.length})`;\n return (\n options.find((option) => option.value === selectedKeys[0])?.label ??\n \"(1 项)\"\n );\n}\n\nfunction isReportFilterActive(filter: PivotDimensionFilter | undefined) {\n return Boolean(\n filter &&\n ((filter.selectedKeys?.length ?? 0) > 0 ||\n filter.searchKeyword ||\n (filter.condition?.operator && filter.condition.operator !== \"none\")),\n );\n}\n\nfunction buildRowFieldHeaderCells<RecordType>(params: {\n options: PivotTableOptions<RecordType>;\n rowDimensionWidths: number[];\n columnHeaderHeight: number;\n headerTop: number;\n}) {\n let x = 0;\n return params.options.rows.map((dimension, level) => {\n const dimensionKey = resolvePivotDimensionKey(dimension);\n const width = params.rowDimensionWidths[level] ?? 0;\n const cell: PivotHeaderCellLayout = {\n axis: \"row\",\n dimensionKey,\n nodeId: null,\n pathKey: encodePivotPath([]),\n indicatorKey: null,\n kind: \"dimension\",\n label: resolvePivotDimensionTitle(dimension),\n align: dimension.align,\n level,\n rowSpan: 1,\n columnSpan: 1,\n expandable: false,\n expanded: false,\n filterable: dimension.allowFilter ?? false,\n filterActive: isDimensionFilterActive(\n params.options.filters?.rows,\n dimensionKey,\n ),\n sortable: dimension.allowSort ?? false,\n sortDirection: resolveDimensionSort(params.options, \"row\", dimensionKey),\n rect: {\n x,\n y: params.headerTop,\n width,\n height: params.columnHeaderHeight,\n },\n };\n x += width;\n return cell;\n });\n}\n\n/** 根据轴节点和指标布局生成最终值槽位。 */\nexport function createPivotAxisSlots(params: {\n nodes: PivotNode[];\n indicators: string[];\n includeIndicators: boolean;\n}) {\n const baseNodes = params.nodes.length ? params.nodes : [null];\n if (!params.includeIndicators) {\n return baseNodes.map((node) => createAxisSlot(node, null));\n }\n if (params.indicators.length === 0) {\n return baseNodes.map((node) => createAxisSlot(node, null));\n }\n return baseNodes.flatMap((node) =>\n params.indicators.map((indicatorKey) => createAxisSlot(node, indicatorKey)),\n );\n}\n\nfunction createAxisSlot(\n node: PivotNode | null,\n indicatorKey: string | null,\n): PivotAxisSlot {\n return {\n key: JSON.stringify([node?.id ?? null, indicatorKey]),\n nodeId: node?.id ?? null,\n pathKey: node?.pathKey ?? encodePivotPath([]),\n indicatorKey,\n kind: node?.kind ?? \"empty\",\n };\n}\n\nfunction buildRowHeaderCells<RecordType>(params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n slots: PivotAxisSlot[];\n range: { start: number; end: number };\n rowHeight: number;\n rowDimensionWidths: number[];\n columnHeaderHeight: number;\n scrollTop: number;\n expandedNodeIds?: ReadonlySet<string>;\n dimensionCount: number;\n indicators: PivotTableOptions<RecordType>[\"indicators\"];\n}) {\n const cells: PivotHeaderCellLayout[] = [];\n for (\n let rowIndex = params.range.start;\n rowIndex < params.range.end;\n rowIndex += 1\n ) {\n const slot = params.slots[rowIndex];\n if (!slot) continue;\n const node = slot.nodeId ? params.model.rowNodes.get(slot.nodeId) : null;\n const chain = node\n ? resolveDimensionChain(node, params.model.rowNodes)\n : [];\n if (!node || node.kind === \"subtotal\" || node.kind === \"grandTotal\") {\n const dimensionSpan = Math.max(\n params.dimensionCount,\n slot.indicatorKey ? 0 : 1,\n );\n if (dimensionSpan > 0) {\n cells.push({\n axis: \"row\",\n nodeId: node?.id ?? null,\n pathKey: slot.pathKey,\n indicatorKey: slot.indicatorKey,\n kind: node?.kind ?? \"empty\",\n label: node?.label ?? \"\",\n level: 0,\n rowSpan: 1,\n columnSpan: dimensionSpan,\n expandable: false,\n expanded: false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x: 0,\n y:\n params.columnHeaderHeight +\n rowIndex * params.rowHeight -\n params.scrollTop,\n width: sum(params.rowDimensionWidths.slice(0, dimensionSpan)),\n height: params.rowHeight,\n },\n });\n }\n if (slot.indicatorKey) {\n cells.push(\n createRowIndicatorCell({\n slot,\n rowIndex,\n rowHeight: params.rowHeight,\n columnHeaderHeight: params.columnHeaderHeight,\n scrollTop: params.scrollTop,\n rowDimensionWidths: params.rowDimensionWidths,\n dimensionCount: params.dimensionCount,\n indicators: params.indicators,\n }),\n );\n }\n continue;\n }\n chain.forEach((chainNode, level) => {\n const x = sum(params.rowDimensionWidths.slice(0, level));\n const isLastVisibleNode = chainNode.id === node.id;\n const columnSpan = isLastVisibleNode\n ? Math.max(params.dimensionCount - level, 1)\n : 1;\n cells.push({\n axis: \"row\",\n nodeId: chainNode.id,\n pathKey: chainNode.pathKey,\n indicatorKey: slot.indicatorKey,\n kind: chainNode.kind,\n label: chainNode.label,\n align: resolveDimensionAlign(\n params.options.rows,\n chainNode.dimensionKey,\n ),\n level,\n rowSpan: 1,\n columnSpan,\n expandable: chainNode.children.length > 0,\n expanded: params.expandedNodeIds?.has(chainNode.id) ?? false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x,\n y:\n params.columnHeaderHeight +\n rowIndex * params.rowHeight -\n params.scrollTop,\n width: sum(\n params.rowDimensionWidths.slice(level, level + columnSpan),\n ),\n height: params.rowHeight,\n },\n });\n });\n if (slot.indicatorKey) {\n cells.push(\n createRowIndicatorCell({\n slot,\n rowIndex,\n rowHeight: params.rowHeight,\n columnHeaderHeight: params.columnHeaderHeight,\n scrollTop: params.scrollTop,\n rowDimensionWidths: params.rowDimensionWidths,\n dimensionCount: params.dimensionCount,\n indicators: params.indicators,\n }),\n );\n }\n }\n return stabilizeRowHeaderCellSpans(\n mergeAdjacentRowHeaderCells(cells, params.rowHeight),\n params,\n );\n}\n\nfunction createRowIndicatorCell<RecordType>(params: {\n slot: PivotAxisSlot;\n rowIndex: number;\n rowHeight: number;\n columnHeaderHeight: number;\n scrollTop: number;\n rowDimensionWidths: number[];\n dimensionCount: number;\n indicators: PivotTableOptions<RecordType>[\"indicators\"];\n}): PivotHeaderCellLayout {\n const indicatorKey = params.slot.indicatorKey!;\n return {\n axis: \"row\",\n nodeId: params.slot.nodeId,\n pathKey: params.slot.pathKey,\n indicatorKey,\n kind: \"indicator\",\n label:\n params.indicators.find((indicator) => indicator.key === indicatorKey)\n ?.title ?? indicatorKey,\n level: params.dimensionCount,\n rowSpan: 1,\n columnSpan: 1,\n expandable: false,\n expanded: false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x: sum(params.rowDimensionWidths.slice(0, params.dimensionCount)),\n y:\n params.columnHeaderHeight +\n params.rowIndex * params.rowHeight -\n params.scrollTop,\n width:\n params.rowDimensionWidths[params.dimensionCount] ??\n DEFAULT_COLUMN_WIDTH,\n height: params.rowHeight,\n },\n };\n}\n\nfunction buildColumnHeaderCells<RecordType>(params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n slots: PivotAxisSlot[];\n range: { start: number; end: number };\n columnWidths: number[];\n columnOffsets: number[];\n rowHeaderWidth: number;\n scrollLeft: number;\n levels: number;\n headerTop: number;\n expandedNodeIds?: ReadonlySet<string>;\n}) {\n const cells: PivotHeaderCellLayout[] = [];\n for (\n let columnIndex = params.range.start;\n columnIndex < params.range.end;\n columnIndex += 1\n ) {\n const slot = params.slots[columnIndex];\n if (!slot) continue;\n const node = slot.nodeId ? params.model.columnNodes.get(slot.nodeId) : null;\n const chain = node\n ? resolveDimensionChain(node, params.model.columnNodes)\n : [];\n const columnWidth =\n params.columnWidths[columnIndex] ?? DEFAULT_COLUMN_WIDTH;\n const x =\n params.rowHeaderWidth +\n (params.columnOffsets[columnIndex] ?? 0) -\n params.scrollLeft;\n if (!node || node.kind === \"subtotal\" || node.kind === \"grandTotal\") {\n cells.push({\n axis: \"column\",\n nodeId: node?.id ?? null,\n pathKey: slot.pathKey,\n indicatorKey: slot.indicatorKey,\n kind: node?.kind ?? \"empty\",\n label: node?.label ?? slot.indicatorKey ?? \"\",\n level: 0,\n rowSpan: params.levels - (slot.indicatorKey ? 1 : 0),\n columnSpan: 1,\n expandable: false,\n expanded: false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x,\n y: params.headerTop,\n width: columnWidth,\n height:\n DEFAULT_HEADER_SIZE * (params.levels - (slot.indicatorKey ? 1 : 0)),\n },\n });\n } else {\n chain.forEach((chainNode, level) => {\n cells.push({\n axis: \"column\",\n nodeId: chainNode.id,\n pathKey: chainNode.pathKey,\n indicatorKey: null,\n kind: chainNode.kind,\n label: chainNode.label,\n align: resolveDimensionAlign(\n params.options.columns,\n chainNode.dimensionKey,\n ),\n level,\n rowSpan: 1,\n columnSpan: 1,\n expandable: chainNode.children.length > 0,\n expanded: params.expandedNodeIds?.has(chainNode.id) ?? false,\n filterable: isDimensionFilterable(\n params.options.columns,\n chainNode.dimensionKey,\n ),\n filterActive: isDimensionFilterActive(\n params.options.filters?.columns,\n chainNode.dimensionKey,\n ),\n sortable: isDimensionSortable(\n params.options.columns,\n chainNode.dimensionKey,\n ),\n sortDirection: resolveDimensionSort(\n params.options,\n \"column\",\n chainNode.dimensionKey,\n ),\n rect: {\n x,\n y: params.headerTop + level * DEFAULT_HEADER_SIZE,\n width: columnWidth,\n height: DEFAULT_HEADER_SIZE,\n },\n });\n });\n }\n if (slot.indicatorKey) {\n const indicator = params.options.indicators.find(\n (item) => item.key === slot.indicatorKey,\n );\n cells.push({\n axis: \"column\",\n nodeId: node?.id ?? null,\n pathKey: node?.pathKey ?? slot.pathKey,\n indicatorKey: slot.indicatorKey,\n kind: \"indicator\",\n label: indicator?.title ?? slot.indicatorKey,\n level: params.levels - 1,\n rowSpan: 1,\n columnSpan: 1,\n expandable: false,\n expanded: false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x,\n y: params.headerTop + (params.levels - 1) * DEFAULT_HEADER_SIZE,\n width: columnWidth,\n height: DEFAULT_HEADER_SIZE,\n },\n });\n }\n }\n return stabilizeColumnHeaderCellSpans(\n mergeAdjacentColumnHeaderCells(cells),\n params,\n );\n}\n\nfunction buildBodyCells<RecordType>(params: {\n model: PivotModel<RecordType>;\n rowSlots: PivotAxisSlot[];\n columnSlots: PivotAxisSlot[];\n rowRange: { start: number; end: number };\n columnRange: { start: number; end: number };\n rowHeight: number;\n columnWidths: number[];\n columnOffsets: number[];\n rowHeaderWidth: number;\n columnHeaderHeight: number;\n scroll: { left: number; top: number };\n}) {\n const cells: PivotBodyCellLayout[] = [];\n for (\n let rowIndex = params.rowRange.start;\n rowIndex < params.rowRange.end;\n rowIndex += 1\n ) {\n const rowSlot = params.rowSlots[rowIndex];\n if (!rowSlot) continue;\n for (\n let columnIndex = params.columnRange.start;\n columnIndex < params.columnRange.end;\n columnIndex += 1\n ) {\n const columnSlot = params.columnSlots[columnIndex];\n if (!columnSlot) continue;\n const columnWidth =\n params.columnWidths[columnIndex] ?? DEFAULT_COLUMN_WIDTH;\n const indicatorKey = rowSlot.indicatorKey ?? columnSlot.indicatorKey;\n if (!indicatorKey) continue;\n const cell = params.model.cells.get(\n createPivotCellKey(rowSlot.pathKey, columnSlot.pathKey, indicatorKey),\n );\n cells.push({\n rowIndex,\n columnIndex,\n rowNodeId: rowSlot.nodeId,\n columnNodeId: columnSlot.nodeId,\n rowPathKey: rowSlot.pathKey,\n columnPathKey: columnSlot.pathKey,\n indicatorKey,\n value: cell?.value,\n formattedValue: cell?.formattedValue ?? \"\",\n rect: {\n x:\n params.rowHeaderWidth +\n (params.columnOffsets[columnIndex] ?? 0) -\n params.scroll.left,\n y:\n params.columnHeaderHeight +\n rowIndex * params.rowHeight -\n params.scroll.top,\n width: columnWidth,\n height: params.rowHeight,\n },\n });\n }\n }\n return cells;\n}\n\nfunction resolveDimensionChain(\n node: PivotNode,\n nodeMap: Map<string, PivotNode>,\n) {\n const chain: PivotNode[] = [];\n let current: PivotNode | undefined = node;\n while (current && current.kind !== \"root\") {\n if (current.kind === \"dimension\") chain.unshift(current);\n current = current.parentId ? nodeMap.get(current.parentId) : undefined;\n }\n return chain;\n}\n\nfunction mergeAdjacentRowHeaderCells(\n cells: PivotHeaderCellLayout[],\n rowHeight: number,\n) {\n const result: PivotHeaderCellLayout[] = [];\n cells.forEach((cell) => {\n const previous = result.find(\n (item) =>\n item.nodeId === cell.nodeId &&\n item.indicatorKey === cell.indicatorKey &&\n item.level === cell.level &&\n item.columnSpan === cell.columnSpan &&\n item.rect.y + item.rect.height === cell.rect.y,\n );\n if (\n previous &&\n previous.rect.x === cell.rect.x &&\n previous.rect.width === cell.rect.width\n ) {\n previous.rowSpan += 1;\n previous.rect.height += rowHeight;\n } else {\n result.push(cell);\n }\n });\n return result;\n}\n\nfunction stabilizeRowHeaderCellSpans<RecordType>(\n cells: PivotHeaderCellLayout[],\n params: {\n model: PivotModel<RecordType>;\n slots: PivotAxisSlot[];\n rowHeight: number;\n columnHeaderHeight: number;\n scrollTop: number;\n },\n) {\n const spanCache = new Map<string, { start: number; end: number }>();\n cells.forEach((cell) => {\n if (!cell.nodeId || cell.kind !== \"dimension\") return;\n const cacheKey = `${cell.nodeId}\\u0000${cell.indicatorKey ?? \"\"}`;\n let span = spanCache.get(cacheKey);\n if (!span) {\n const visibleSlotIndex = Math.round(\n (cell.rect.y - params.columnHeaderHeight + params.scrollTop) /\n params.rowHeight,\n );\n if (!slotContainsHeaderCell(params, visibleSlotIndex, cell)) return;\n let start = visibleSlotIndex;\n let end = visibleSlotIndex + 1;\n while (start > 0 && slotContainsHeaderCell(params, start - 1, cell)) {\n start -= 1;\n }\n while (\n end < params.slots.length &&\n slotContainsHeaderCell(params, end, cell)\n ) {\n end += 1;\n }\n span = { start, end };\n spanCache.set(cacheKey, span);\n }\n cell.rowSpan = span.end - span.start;\n cell.rect.y =\n params.columnHeaderHeight +\n span.start * params.rowHeight -\n params.scrollTop;\n cell.rect.height = cell.rowSpan * params.rowHeight;\n });\n return cells;\n}\n\nfunction slotContainsHeaderCell<RecordType>(\n params: {\n model: PivotModel<RecordType>;\n slots: PivotAxisSlot[];\n },\n slotIndex: number,\n cell: PivotHeaderCellLayout,\n) {\n const slot = params.slots[slotIndex];\n if (!slot || slot.indicatorKey !== cell.indicatorKey || !slot.nodeId) {\n return false;\n }\n const node = params.model.rowNodes.get(slot.nodeId);\n if (!node || node.kind === \"subtotal\" || node.kind === \"grandTotal\") {\n return false;\n }\n return resolveDimensionChain(node, params.model.rowNodes).some(\n (chainNode) => chainNode.id === cell.nodeId,\n );\n}\n\nfunction mergeAdjacentColumnHeaderCells(cells: PivotHeaderCellLayout[]) {\n const result: PivotHeaderCellLayout[] = [];\n cells.forEach((cell) => {\n const matching = result.find(\n (item) =>\n item.nodeId === cell.nodeId &&\n item.indicatorKey === cell.indicatorKey &&\n item.level === cell.level &&\n item.rect.x + item.rect.width === cell.rect.x,\n );\n if (matching) {\n matching.columnSpan += 1;\n matching.rect.width += cell.rect.width;\n } else {\n result.push(cell);\n }\n });\n return result;\n}\n\nfunction stabilizeColumnHeaderCellSpans<RecordType>(\n cells: PivotHeaderCellLayout[],\n params: {\n model: PivotModel<RecordType>;\n slots: PivotAxisSlot[];\n columnOffsets: number[];\n rowHeaderWidth: number;\n scrollLeft: number;\n },\n) {\n const spanCache = new Map<string, { start: number; end: number }>();\n cells.forEach((cell) => {\n if (!cell.nodeId || cell.kind !== \"dimension\") return;\n let span = spanCache.get(cell.nodeId);\n if (!span) {\n const contentX = cell.rect.x - params.rowHeaderWidth + params.scrollLeft;\n const visibleSlotIndex = params.columnOffsets.findIndex(\n (offset, index) =>\n index < params.slots.length && Math.abs(offset - contentX) < 0.01,\n );\n if (\n visibleSlotIndex < 0 ||\n !slotContainsColumnHeaderCell(params, visibleSlotIndex, cell)\n ) {\n return;\n }\n let start = visibleSlotIndex;\n let end = visibleSlotIndex + 1;\n while (\n start > 0 &&\n slotContainsColumnHeaderCell(params, start - 1, cell)\n ) {\n start -= 1;\n }\n while (\n end < params.slots.length &&\n slotContainsColumnHeaderCell(params, end, cell)\n ) {\n end += 1;\n }\n span = { start, end };\n spanCache.set(cell.nodeId, span);\n }\n cell.columnSpan = span.end - span.start;\n cell.rect.x =\n params.rowHeaderWidth +\n (params.columnOffsets[span.start] ?? 0) -\n params.scrollLeft;\n cell.rect.width =\n (params.columnOffsets[span.end] ?? 0) -\n (params.columnOffsets[span.start] ?? 0);\n });\n return cells;\n}\n\nfunction slotContainsColumnHeaderCell<RecordType>(\n params: {\n model: PivotModel<RecordType>;\n slots: PivotAxisSlot[];\n },\n slotIndex: number,\n cell: PivotHeaderCellLayout,\n) {\n const slot = params.slots[slotIndex];\n if (!slot?.nodeId) return false;\n const node = params.model.columnNodes.get(slot.nodeId);\n if (!node || node.kind === \"subtotal\" || node.kind === \"grandTotal\") {\n return false;\n }\n return resolveDimensionChain(node, params.model.columnNodes).some(\n (chainNode) => chainNode.id === cell.nodeId,\n );\n}\n\nfunction resolveVisibleRange(params: {\n count: number;\n itemSize: number;\n viewportSize: number;\n offset: number;\n overscan: number;\n}) {\n const start = Math.max(\n Math.floor(params.offset / params.itemSize) - params.overscan,\n 0,\n );\n const visibleCount =\n Math.ceil(params.viewportSize / params.itemSize) + params.overscan * 2;\n return { start, end: Math.min(start + visibleCount, params.count) };\n}\n\nfunction resolveVariableVisibleRange(params: {\n offsets: number[];\n viewportSize: number;\n offset: number;\n overscan: number;\n}) {\n const count = Math.max(params.offsets.length - 1, 0);\n let firstVisible = 0;\n while (\n firstVisible < count &&\n (params.offsets[firstVisible + 1] ?? 0) <= params.offset\n ) {\n firstVisible += 1;\n }\n const viewportEnd = params.offset + params.viewportSize;\n let end = firstVisible;\n while (end < count && (params.offsets[end] ?? 0) < viewportEnd) {\n end += 1;\n }\n return {\n start: Math.max(firstVisible - params.overscan, 0),\n end: Math.min(end + params.overscan, count),\n };\n}\n\nfunction createOffsets(widths: number[]) {\n const offsets = [0];\n widths.forEach((width) => {\n offsets.push((offsets[offsets.length - 1] ?? 0) + width);\n });\n return offsets;\n}\n\nfunction sum(values: number[]) {\n return values.reduce((total, value) => total + value, 0);\n}\n\nfunction isDimensionFilterable<RecordType>(\n dimensions: PivotTableOptions<RecordType>[\"rows\"],\n dimensionKey: string | null,\n) {\n return Boolean(\n dimensionKey &&\n dimensions.find(\n (dimension) => resolvePivotDimensionKey(dimension) === dimensionKey,\n )?.allowFilter,\n );\n}\n\nfunction resolveColumnSlotWidth<RecordType>(params: {\n slot: PivotAxisSlot;\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n runtimeWidth?: number;\n fallbackWidth: number;\n}) {\n const node = params.slot.nodeId\n ? params.model.columnNodes.get(params.slot.nodeId)\n : null;\n const dimension = node?.dimensionKey\n ? params.options.columns.find(\n (item) => resolvePivotDimensionKey(item) === node.dimensionKey,\n )\n : undefined;\n const indicatorWidth = params.slot.indicatorKey\n ? params.options.indicators.find(\n (item) => item.key === params.slot.indicatorKey,\n )?.width\n : undefined;\n const width =\n params.runtimeWidth ??\n indicatorWidth ??\n dimension?.width ??\n params.fallbackWidth;\n return dimension\n ? resolvePivotDimensionWidth(dimension, width, params.fallbackWidth)\n : width;\n}\n\nfunction resolveDimensionAlign<RecordType>(\n dimensions: PivotTableOptions<RecordType>[\"rows\"],\n dimensionKey: string | null,\n) {\n return dimensionKey\n ? dimensions.find(\n (dimension) => resolvePivotDimensionKey(dimension) === dimensionKey,\n )?.align\n : undefined;\n}\n\nfunction isDimensionFilterActive(\n filters: Record<string, unknown> | undefined,\n dimensionKey: string | null,\n) {\n return Boolean(dimensionKey && filters?.[dimensionKey]);\n}\n\nfunction isDimensionSortable<RecordType>(\n dimensions: PivotTableOptions<RecordType>[\"rows\"],\n dimensionKey: string | null,\n) {\n return Boolean(\n dimensionKey &&\n dimensions.find(\n (dimension) => resolvePivotDimensionKey(dimension) === dimensionKey,\n )?.allowSort,\n );\n}\n\nfunction resolveDimensionSort<RecordType>(\n options: PivotTableOptions<RecordType>,\n axis: \"row\" | \"column\",\n dimensionKey: string | null,\n) {\n return (\n options.sorts?.find(\n (item) => item.axis === axis && item.dimensionKey === dimensionKey,\n )?.direction ?? null\n );\n}\n","import * as XLSX from \"xlsx\";\nimport { serializeCsvRows } from \"@canvas-components/utils\";\nimport type { PivotModel } from \"../../domain/pivot/pivot-model\";\nimport type { PivotNode } from \"../../domain/pivot/pivot-node\";\nimport { createPivotCellKey } from \"../../domain/pivot/pivot-cell\";\nimport { createPivotAxisSlots } from \"../../domain/layout/pivot-layout\";\nimport type { PivotTableOptions } from \"../../schema/options\";\nimport { resolvePivotDimensionTitle } from \"../../domain/data/dimension-config\";\n\n/** PivotTable 导出矩阵。 */\nexport interface PivotExportMatrix {\n values: string[][];\n headerRowCount: number;\n rowHeaderColumnCount: number;\n merges: Array<{\n startRow: number;\n endRow: number;\n startColumn: number;\n endColumn: number;\n }>;\n}\n\n/** PivotTable 导出范围。 */\nexport interface PivotExportOptions {\n mode?: \"visible\" | \"all\";\n sheetName?: string;\n}\n\n/** 根据当前展开节点创建统一导出矩阵。 */\nexport function createPivotExportMatrix<RecordType>(params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n visibleRowNodes: PivotNode[];\n visibleColumnNodes: PivotNode[];\n}): PivotExportMatrix {\n const indicatorLayout = params.options.indicatorLayout ?? \"columns\";\n const indicators = params.options.indicators.map((item) => item.key);\n const hasIndicators = indicators.length > 0;\n const rowSlots = createPivotAxisSlots({\n nodes: params.visibleRowNodes,\n indicators,\n includeIndicators: indicatorLayout === \"rows\",\n });\n const columnSlots = createPivotAxisSlots({\n nodes: params.visibleColumnNodes,\n indicators,\n includeIndicators: indicatorLayout === \"columns\",\n });\n const rowHeaderColumnCount = Math.max(\n params.options.rows.length +\n (indicatorLayout === \"rows\" && hasIndicators ? 1 : 0),\n 1,\n );\n const headerRowCount = Math.max(\n params.options.columns.length +\n (indicatorLayout === \"columns\" && hasIndicators ? 1 : 0),\n 1,\n );\n const values: string[][] = Array.from(\n { length: headerRowCount },\n (_, level) => [\n ...Array.from({ length: rowHeaderColumnCount }, (_item, index) =>\n level === headerRowCount - 1\n ? resolveRowHeaderTitle(params.options, index, indicatorLayout)\n : \"\",\n ),\n ...columnSlots.map((slot) =>\n resolveColumnHeaderLabel(\n params,\n slot.nodeId,\n slot.indicatorKey,\n level,\n headerRowCount,\n ),\n ),\n ],\n );\n\n rowSlots.forEach((rowSlot) => {\n const rowHeaders = resolveRowHeaderLabels(\n params,\n rowSlot.nodeId,\n rowSlot.indicatorKey,\n rowHeaderColumnCount,\n );\n const row = [...rowHeaders];\n columnSlots.forEach((columnSlot) => {\n const indicatorKey = rowSlot.indicatorKey ?? columnSlot.indicatorKey;\n const cell = indicatorKey\n ? params.model.cells.get(\n createPivotCellKey(\n rowSlot.pathKey,\n columnSlot.pathKey,\n indicatorKey,\n ),\n )\n : undefined;\n row.push(cell?.formattedValue ?? \"\");\n });\n values.push(row);\n });\n\n return {\n values,\n headerRowCount,\n rowHeaderColumnCount,\n merges: resolveExportMerges(values, headerRowCount, rowHeaderColumnCount),\n };\n}\n\n/** 将导出矩阵序列化为 CSV。 */\nexport function exportPivotMatrixToCsv(matrix: PivotExportMatrix) {\n return serializeCsvRows(matrix.values, \"\\r\\n\");\n}\n\n/** 将导出矩阵序列化为 XLSX 字节。 */\nexport function exportPivotMatrixToXlsx(\n matrix: PivotExportMatrix,\n sheetName = \"数据透视表\",\n): Uint8Array {\n const worksheet = XLSX.utils.aoa_to_sheet(matrix.values);\n worksheet[\"!merges\"] = matrix.merges.map((merge) => ({\n s: { r: merge.startRow, c: merge.startColumn },\n e: { r: merge.endRow, c: merge.endColumn },\n }));\n const workbook = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName.slice(0, 31));\n return XLSX.write(workbook, { type: \"array\", bookType: \"xlsx\" });\n}\n\nfunction resolveColumnHeaderLabel<RecordType>(\n params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n },\n nodeId: string | null,\n indicatorKey: string | null,\n level: number,\n headerRowCount: number,\n) {\n if (indicatorKey && level === headerRowCount - 1) {\n return (\n params.options.indicators.find((item) => item.key === indicatorKey)\n ?.title ?? indicatorKey\n );\n }\n const node = nodeId ? params.model.columnNodes.get(nodeId) : undefined;\n if (!node) return \"\";\n if (node.kind !== \"dimension\") return level === 0 ? node.label : \"\";\n return resolveNodeChain(node, params.model.columnNodes)[level]?.label ?? \"\";\n}\n\nfunction resolveRowHeaderLabels<RecordType>(\n params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n },\n nodeId: string | null,\n indicatorKey: string | null,\n count: number,\n) {\n const node = nodeId ? params.model.rowNodes.get(nodeId) : undefined;\n const labels = Array.from({ length: count }, () => \"\");\n if (node?.kind === \"dimension\") {\n resolveNodeChain(node, params.model.rowNodes).forEach((item, index) => {\n labels[index] = item.label;\n });\n } else if (node) {\n labels[0] = node.label;\n }\n if (indicatorKey) {\n labels[count - 1] =\n params.options.indicators.find((item) => item.key === indicatorKey)\n ?.title ?? indicatorKey;\n }\n return labels;\n}\n\nfunction resolveRowHeaderTitle<RecordType>(\n options: PivotTableOptions<RecordType>,\n index: number,\n indicatorLayout: \"columns\" | \"rows\",\n) {\n if (indicatorLayout === \"rows\" && index === options.rows.length)\n return \"指标\";\n const dimension = options.rows[index];\n return dimension ? resolvePivotDimensionTitle(dimension) : \"\";\n}\n\nfunction resolveNodeChain(node: PivotNode, nodes: Map<string, PivotNode>) {\n const result: PivotNode[] = [];\n let current: PivotNode | undefined = node;\n while (current && current.kind !== \"root\") {\n if (current.kind === \"dimension\") result.unshift(current);\n current = current.parentId ? nodes.get(current.parentId) : undefined;\n }\n return result;\n}\n\nfunction resolveExportMerges(\n values: string[][],\n headerRowCount: number,\n rowHeaderColumnCount: number,\n) {\n const merges: PivotExportMatrix[\"merges\"] = [];\n for (let row = 0; row < headerRowCount; row += 1) {\n mergeRuns(values[row] ?? [], rowHeaderColumnCount, (start, end) => {\n merges.push({\n startRow: row,\n endRow: row,\n startColumn: start,\n endColumn: end,\n });\n });\n }\n for (let column = 0; column < rowHeaderColumnCount; column += 1) {\n const columnValues = values\n .slice(headerRowCount)\n .map((row) => row[column] ?? \"\");\n mergeRuns(columnValues, 0, (start, end) => {\n merges.push({\n startRow: headerRowCount + start,\n endRow: headerRowCount + end,\n startColumn: column,\n endColumn: column,\n });\n });\n }\n return merges;\n}\n\nfunction mergeRuns(\n values: string[],\n startIndex: number,\n onMerge: (start: number, end: number) => void,\n) {\n let runStart = startIndex;\n for (let index = startIndex + 1; index <= values.length; index += 1) {\n if (\n index < values.length &&\n values[index] &&\n values[index] === values[runStart]\n )\n continue;\n if (values[runStart] && index - runStart > 1) onMerge(runStart, index - 1);\n runStart = index;\n }\n}\n","import type { PivotModel } from \"../domain/pivot/pivot-model\";\nimport type { PivotTableOptions } from \"../schema/options\";\nimport {\n getPivotCellRecords,\n PivotModelCache,\n} from \"../services/pivot-model-service\";\nimport { flattenVisiblePivotLeaves } from \"../domain/pivot/flatten-visible-tree\";\nimport type { PivotAxis, PivotFilterAxis } from \"../schema/events\";\nimport { buildPivotLayoutSnapshot } from \"../domain/layout/pivot-layout\";\nimport type { PivotLayoutSnapshot } from \"../domain/layout/types\";\nimport type {\n PivotCellAddress,\n PivotSelectionState,\n PivotDimensionFilter,\n PivotFilterState,\n} from \"../schema/state\";\nimport {\n createEmptyPivotFilterState,\n getPivotDimensionFilterOptions,\n} from \"../domain/filter/pivot-filter\";\nimport { createPivotExportMatrix } from \"../features/export/pivot-export\";\nimport { encodePivotPath } from \"../domain/data/dimension-key\";\nimport { createPivotCellKey } from \"../domain/pivot/pivot-cell\";\nimport type { PivotTableStateSnapshot } from \"../schema/persistence\";\nimport type { PivotSortRule } from \"../schema/sort\";\nimport {\n resolvePivotDefaultSorts,\n resolvePivotDimensionKey,\n resolvePivotDimensionWidth,\n} from \"../domain/data/dimension-config\";\n\n/** PivotTable 纯原生核心协调器。 */\nexport class PivotTableCore<RecordType> {\n private options: PivotTableOptions<RecordType>;\n private model: PivotModel<RecordType> | null;\n private readonly modelCache = new PivotModelCache<RecordType>();\n private expandedRowNodeIds: Set<string>;\n private expandedColumnNodeIds: Set<string>;\n private expansionVersion = 0;\n private layoutCache: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n expansionVersion: number;\n width: number;\n height: number;\n scrollLeft: number;\n scrollTop: number;\n snapshot: PivotLayoutSnapshot;\n } | null = null;\n private selection: PivotSelectionState;\n private filters: PivotFilterState;\n private sorts: PivotSortRule[];\n private rowDimensionWidths = new Map<string, number>();\n private columnWidths = new Map<string, number>();\n private visibleNodeCache: {\n model: PivotModel<RecordType>;\n expansionVersion: number;\n rows: ReturnType<typeof flattenVisiblePivotLeaves>;\n columns: ReturnType<typeof flattenVisiblePivotLeaves>;\n } | null = null;\n\n constructor(options: PivotTableOptions<RecordType>) {\n this.options = options;\n this.filters =\n options.filters ??\n options.defaultFilters ??\n createEmptyPivotFilterState();\n this.sorts =\n options.sorts ??\n options.defaultSorts ??\n resolvePivotDefaultSorts(options);\n this.model = this.modelCache.getOrBuild(this.getEffectiveOptions(options));\n this.expandedRowNodeIds = new Set(\n options.expandedRowKeys ?? options.defaultExpandedRowKeys ?? [],\n );\n this.expandedColumnNodeIds = new Set(\n options.expandedColumnKeys ?? options.defaultExpandedColumnKeys ?? [],\n );\n if (\n options.expandedRowKeys === undefined &&\n options.defaultExpandedRowKeys === undefined\n ) {\n this.expandedRowNodeIds = resolveDefaultExpandedNodes(\n this.model.rowNodes,\n options.rows,\n );\n }\n if (\n options.expandedColumnKeys === undefined &&\n options.defaultExpandedColumnKeys === undefined\n ) {\n this.expandedColumnNodeIds = resolveDefaultExpandedNodes(\n this.model.columnNodes,\n options.columns,\n );\n }\n this.selection = options.selection ?? {\n activeCell: null,\n anchorCell: null,\n ranges: [],\n };\n }\n\n /** 更新配置并重建当前数据模型。 */\n updateOptions(options: PivotTableOptions<RecordType>) {\n this.options = options;\n if (options.filters) this.filters = options.filters;\n if (options.sorts) this.sorts = options.sorts;\n this.model = this.modelCache.getOrBuild(this.getEffectiveOptions(options));\n if (options.expandedRowKeys) {\n this.expandedRowNodeIds = new Set(options.expandedRowKeys);\n }\n if (options.expandedColumnKeys) {\n this.expandedColumnNodeIds = new Set(options.expandedColumnKeys);\n }\n if (options.expandedRowKeys || options.expandedColumnKeys) {\n this.expansionVersion += 1;\n this.visibleNodeCache = null;\n }\n if (options.selection) this.selection = options.selection;\n else if (options.expandedRowKeys || options.expandedColumnKeys) {\n this.normalizeSelectionToVisibleNodes();\n }\n this.layoutCache = null;\n }\n\n /** 获取当前只读 PivotModel。 */\n getPivotModel() {\n return this.model;\n }\n\n /** 获取当前展开状态下的行轴可见叶节点。 */\n getVisibleRowNodes() {\n return this.resolveVisibleNodeCache()?.rows ?? [];\n }\n\n /** 获取当前展开状态下的列轴可见叶节点。 */\n getVisibleColumnNodes() {\n return this.resolveVisibleNodeCache()?.columns ?? [];\n }\n\n /** 获取可复用的当前布局快照。 */\n getLayoutSnapshot(params: {\n width: number;\n height: number;\n scrollLeft: number;\n scrollTop: number;\n }) {\n if (!this.model) return null;\n const cached = this.layoutCache;\n if (\n cached &&\n cached.model === this.model &&\n cached.options === this.options &&\n cached.expansionVersion === this.expansionVersion &&\n cached.width === params.width &&\n cached.height === params.height &&\n cached.scrollLeft === params.scrollLeft &&\n cached.scrollTop === params.scrollTop\n ) {\n return cached.snapshot;\n }\n const snapshot = buildPivotLayoutSnapshot({\n model: this.model,\n options: this.createLayoutOptions(),\n visibleRowNodes: this.getVisibleRowNodes(),\n visibleColumnNodes: this.getVisibleColumnNodes(),\n width: params.width,\n height: params.height,\n scroll: { left: params.scrollLeft, top: params.scrollTop },\n columnWidths: this.columnWidths,\n expandedRowNodeIds: this.expandedRowNodeIds,\n expandedColumnNodeIds: this.expandedColumnNodeIds,\n });\n this.layoutCache = {\n model: this.model,\n options: this.options,\n expansionVersion: this.expansionVersion,\n width: params.width,\n height: params.height,\n scrollLeft: params.scrollLeft,\n scrollTop: params.scrollTop,\n snapshot,\n };\n return snapshot;\n }\n\n /** 获取当前值区选区。 */\n getSelection() {\n return this.selection;\n }\n\n /** 设置完整选区状态。 */\n setSelection(selection: PivotSelectionState) {\n if (this.options.selection === undefined) this.selection = selection;\n this.options.onSelectionChange?.({\n activeCell: selection.activeCell,\n activeNode: selection.activeNode,\n selection,\n });\n return selection;\n }\n\n /** 设置当前活动单元格,并可从锚点扩展为矩形选区。 */\n selectCell(address: PivotCellAddress, extend = false) {\n const anchor =\n extend && this.selection.anchorCell ? this.selection.anchorCell : address;\n const next: PivotSelectionState = {\n activeCell: address,\n anchorCell: anchor,\n ranges: [{ start: anchor, end: address }],\n activeNode: null,\n };\n if (this.options.selection === undefined) this.selection = next;\n this.options.onSelectionChange?.({\n activeCell: address,\n activeNode: null,\n selection: next,\n });\n return next;\n }\n\n /** 选中稳定的行轴或列轴维度节点。 */\n selectNode(axis: PivotAxis, nodeId: string) {\n const node = (\n axis === \"row\" ? this.model?.rowNodes : this.model?.columnNodes\n )?.get(nodeId);\n if (!node) return null;\n const next: PivotSelectionState = {\n activeCell: null,\n anchorCell: null,\n ranges: [],\n activeNode: { axis, nodeId },\n };\n if (this.options.selection === undefined) this.selection = next;\n this.options.onSelectionChange?.({\n activeCell: null,\n activeNode: next.activeNode,\n selection: next,\n });\n return next;\n }\n\n /** 判断节点当前是否展开。 */\n isNodeExpanded(axis: PivotAxis, nodeId: string) {\n return (\n axis === \"row\" ? this.expandedRowNodeIds : this.expandedColumnNodeIds\n ).has(nodeId);\n }\n\n /** 获取当前双轴过滤状态。 */\n getFilters() {\n return this.filters;\n }\n\n /** 获取当前运行时排序规则。 */\n getSorts() {\n return this.sorts;\n }\n\n /** 设置维度排序;null 表示恢复维度默认排序。 */\n setDimensionSort(\n axis: PivotAxis,\n dimensionKey: string,\n direction: PivotSortRule[\"direction\"] | null,\n ) {\n const next = this.sorts.filter(\n (item) => !(item.axis === axis && item.dimensionKey === dimensionKey),\n );\n const dimension = (\n axis === \"row\" ? this.options.rows : this.options.columns\n ).find((item) => resolvePivotDimensionKey(item) === dimensionKey);\n const resolvedDirection =\n direction ??\n (dimension?.defaultSortOrder === \"descend\"\n ? \"desc\"\n : dimension?.defaultSortOrder === \"ascend\"\n ? \"asc\"\n : null);\n if (resolvedDirection) {\n next.push({\n axis,\n dimensionKey,\n direction: resolvedDirection,\n by: \"raw\",\n });\n }\n if (this.options.sorts === undefined) {\n this.sorts = next;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n this.options.onSortChange?.({ sorts: next });\n return next;\n }\n\n /** 按指定指标聚合结果设置维度排序。 */\n setIndicatorSort(params: {\n axis: PivotAxis;\n dimensionKey: string;\n indicatorKey: string;\n direction: PivotSortRule[\"direction\"] | null;\n counterpartPathKey?: string;\n }) {\n const next = this.sorts.filter(\n (item) =>\n !(\n item.axis === params.axis && item.dimensionKey === params.dimensionKey\n ),\n );\n if (params.direction) {\n next.push({\n axis: params.axis,\n dimensionKey: params.dimensionKey,\n direction: params.direction,\n by: \"indicator\",\n indicatorKey: params.indicatorKey,\n counterpartPathKey: params.counterpartPathKey,\n });\n }\n if (this.options.sorts === undefined) {\n this.sorts = next;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n this.options.onSortChange?.({ sorts: next });\n return next;\n }\n\n /** 将全部运行时排序规则恢复为列级默认排序。 */\n resetSorts() {\n const defaults =\n this.options.defaultSorts ?? resolvePivotDefaultSorts(this.options);\n if (this.options.sorts === undefined) {\n this.sorts = defaults;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n this.options.onSortChange?.({ sorts: defaults });\n return defaults;\n }\n\n /** 设置行维度表头宽度,不失效聚合模型。 */\n setRowDimensionWidth(dimensionKey: string, width: number) {\n this.rowDimensionWidths.set(dimensionKey, Math.max(width, 48));\n this.layoutCache = null;\n }\n\n /** 设置指定值列宽度,不失效聚合模型。 */\n setColumnWidth(columnKey: string, width: number) {\n this.columnWidths.set(columnKey, Math.max(width, 56));\n this.layoutCache = null;\n }\n\n /** 获取当前布局宽度覆盖。 */\n getRuntimeWidths() {\n return {\n rowDimensionWidths: Object.fromEntries(this.rowDimensionWidths),\n columnWidths: Object.fromEntries(this.columnWidths),\n };\n }\n\n /** 获取模型、可见树、布局和缓存调试快照。 */\n getDebugSnapshot() {\n const model = this.model;\n return {\n records: model?.records.length ?? 0,\n rowNodeCount: model?.rowNodes.size ?? 0,\n columnNodeCount: model?.columnNodes.size ?? 0,\n aggregateCellCount: model?.cells.size ?? 0,\n visibleRowCount: this.getVisibleRowNodes().length,\n visibleColumnCount: this.getVisibleColumnNodes().length,\n renderedBodyCellCount: this.layoutCache?.snapshot.bodyCells.length ?? 0,\n ...this.modelCache.getMetrics(),\n };\n }\n\n /** 设置指定维度过滤,非受控模式下立即重建聚合模型。 */\n setDimensionFilter(\n axis: PivotFilterAxis,\n dimensionKey: string,\n filter: PivotDimensionFilter | null,\n ) {\n const stateKey = resolveFilterStateKey(axis);\n const axisFilters = this.filters[stateKey] ?? {};\n const nextAxisFilters = { ...axisFilters };\n if (filter) nextAxisFilters[dimensionKey] = filter;\n else delete nextAxisFilters[dimensionKey];\n const next = {\n ...this.filters,\n [stateKey]: nextAxisFilters,\n };\n if (this.options.filters === undefined) {\n this.filters = next;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n this.options.onFilterChange?.({ axis, dimensionKey, filter });\n return next;\n }\n\n /** 清除行轴、列轴和报告字段的全部过滤条件。 */\n resetFilters() {\n const previous = this.filters;\n if (this.options.filters === undefined) {\n this.filters = createEmptyPivotFilterState();\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n Object.keys(previous.rows).forEach((dimensionKey) =>\n this.options.onFilterChange?.({\n axis: \"row\",\n dimensionKey,\n filter: null,\n }),\n );\n Object.keys(previous.columns).forEach((dimensionKey) =>\n this.options.onFilterChange?.({\n axis: \"column\",\n dimensionKey,\n filter: null,\n }),\n );\n Object.keys(previous.filters ?? {}).forEach((dimensionKey) =>\n this.options.onFilterChange?.({\n axis: \"filter\",\n dimensionKey,\n filter: null,\n }),\n );\n return createEmptyPivotFilterState();\n }\n\n /** 获取排除当前维度自身条件后的过滤候选项。 */\n getDimensionFilterOptions(axis: PivotFilterAxis, dimensionKey: string) {\n return getPivotDimensionFilterOptions({\n records: this.options.dataSource,\n rows: this.options.rows,\n columns: this.options.columns,\n filterDimensions: this.options.filterDimensions,\n filters: this.filters,\n axis,\n dimensionKey,\n });\n }\n\n /** 创建与当前展开状态一致的导出矩阵。 */\n createExportMatrix(mode: \"visible\" | \"all\" = \"visible\") {\n return this.model\n ? createPivotExportMatrix({\n model: this.model,\n options: this.getEffectiveOptions(this.options),\n visibleRowNodes:\n mode === \"all\"\n ? collectAllPivotLeaves(this.model.rowTree)\n : this.getVisibleRowNodes(),\n visibleColumnNodes:\n mode === \"all\"\n ? collectAllPivotLeaves(this.model.columnTree)\n : this.getVisibleColumnNodes(),\n })\n : null;\n }\n\n /** 获取稳定地址对应的聚合值。 */\n getCellValue(address: PivotCellAddress) {\n if (!this.model) return undefined;\n const rowPathKey = address.rowNodeId\n ? this.model.rowNodes.get(address.rowNodeId)?.pathKey\n : encodePivotPath([]);\n const columnPathKey = address.columnNodeId\n ? this.model.columnNodes.get(address.columnNodeId)?.pathKey\n : encodePivotPath([]);\n if (!rowPathKey || !columnPathKey) return undefined;\n return this.model.cells.get(\n createPivotCellKey(rowPathKey, columnPathKey, address.indicatorKey),\n )?.value;\n }\n\n /** 创建不含 DOM 滚动位置的核心状态快照。 */\n createStateSnapshot(\n scroll: PivotTableStateSnapshot[\"scroll\"],\n ): PivotTableStateSnapshot {\n return {\n version: 1,\n expandedRowNodeIds: Array.from(this.expandedRowNodeIds),\n expandedColumnNodeIds: Array.from(this.expandedColumnNodeIds),\n filters: this.filters,\n sorts: this.sorts,\n selection: this.selection,\n scroll,\n rowDimensionWidths: Object.fromEntries(this.rowDimensionWidths),\n columnWidths: Object.fromEntries(this.columnWidths),\n };\n }\n\n /** 恢复未受控的核心状态,未知版本安全忽略。 */\n restoreStateSnapshot(snapshot: PivotTableStateSnapshot) {\n if (snapshot.version !== 1) return false;\n if (this.options.expandedRowKeys === undefined) {\n this.expandedRowNodeIds = new Set(snapshot.expandedRowNodeIds);\n }\n if (this.options.expandedColumnKeys === undefined) {\n this.expandedColumnNodeIds = new Set(snapshot.expandedColumnNodeIds);\n }\n if (this.options.filters === undefined) this.filters = snapshot.filters;\n if (this.options.sorts === undefined) this.sorts = snapshot.sorts;\n if (this.options.selection === undefined)\n this.selection = snapshot.selection;\n this.rowDimensionWidths = new Map(\n Object.entries(snapshot.rowDimensionWidths),\n );\n this.columnWidths = new Map(Object.entries(snapshot.columnWidths));\n this.expansionVersion += 1;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n return true;\n }\n\n /** 设置维度节点展开状态。 */\n setNodeExpanded(axis: PivotAxis, nodeId: string, expanded: boolean) {\n const nodeMap =\n axis === \"row\" ? this.model?.rowNodes : this.model?.columnNodes;\n const node = nodeMap?.get(nodeId);\n if (!node || node.kind !== \"dimension\" || node.children.length === 0) {\n return false;\n }\n const controlled =\n axis === \"row\"\n ? this.options.expandedRowKeys !== undefined\n : this.options.expandedColumnKeys !== undefined;\n const target =\n axis === \"row\" ? this.expandedRowNodeIds : this.expandedColumnNodeIds;\n if (!controlled) {\n if (expanded) target.add(nodeId);\n else target.delete(nodeId);\n this.expansionVersion += 1;\n this.visibleNodeCache = null;\n this.layoutCache = null;\n this.normalizeSelectionToVisibleNodes();\n }\n this.options.onExpansionChange?.({ axis, nodeId, expanded });\n return true;\n }\n\n /** 展开或收起指定轴全部可展开节点。 */\n setAllNodesExpanded(axis: PivotAxis, expanded: boolean) {\n const nodes =\n axis === \"row\" ? this.model?.rowNodes : this.model?.columnNodes;\n if (!nodes) return 0;\n const expandable = Array.from(nodes.values()).filter(\n (node) => node.kind === \"dimension\" && node.children.length > 0,\n );\n const controlled =\n axis === \"row\"\n ? this.options.expandedRowKeys !== undefined\n : this.options.expandedColumnKeys !== undefined;\n if (!controlled) {\n const target =\n axis === \"row\" ? this.expandedRowNodeIds : this.expandedColumnNodeIds;\n if (expanded) expandable.forEach((node) => target.add(node.id));\n else target.clear();\n this.expansionVersion += 1;\n this.visibleNodeCache = null;\n this.layoutCache = null;\n this.normalizeSelectionToVisibleNodes();\n }\n expandable.forEach((node) =>\n this.options.onExpansionChange?.({ axis, nodeId: node.id, expanded }),\n );\n return expandable.length;\n }\n\n /** 获取指定聚合单元格参与计算的原始记录。 */\n getCellRecords(params: {\n rowPathKey: string;\n columnPathKey: string;\n indicatorKey: string;\n }) {\n return this.model\n ? getPivotCellRecords({ model: this.model, ...params })\n : [];\n }\n\n /** 释放当前模型引用。 */\n destroy() {\n this.model = null;\n this.modelCache.clear();\n this.expandedRowNodeIds.clear();\n this.expandedColumnNodeIds.clear();\n this.selection = { activeCell: null, anchorCell: null, ranges: [] };\n this.filters = createEmptyPivotFilterState();\n this.sorts = [];\n this.layoutCache = null;\n this.visibleNodeCache = null;\n }\n\n private getEffectiveOptions(options: PivotTableOptions<RecordType>) {\n return { ...options, filters: this.filters, sorts: this.sorts };\n }\n\n private createLayoutOptions(): PivotTableOptions<RecordType> {\n return {\n ...this.getEffectiveOptions(this.options),\n rows: this.options.rows.map((dimension) => ({\n ...dimension,\n width: resolvePivotDimensionWidth(\n dimension,\n this.rowDimensionWidths.get(resolvePivotDimensionKey(dimension)),\n ),\n })),\n };\n }\n\n private resolveVisibleNodeCache() {\n if (!this.model) return null;\n if (\n this.visibleNodeCache?.model === this.model &&\n this.visibleNodeCache.expansionVersion === this.expansionVersion\n ) {\n return this.visibleNodeCache;\n }\n this.visibleNodeCache = {\n model: this.model,\n expansionVersion: this.expansionVersion,\n rows: flattenVisiblePivotLeaves({\n root: this.model.rowTree,\n expandedNodeIds: this.expandedRowNodeIds,\n }),\n columns: flattenVisiblePivotLeaves({\n root: this.model.columnTree,\n expandedNodeIds: this.expandedColumnNodeIds,\n }),\n };\n return this.visibleNodeCache;\n }\n\n private normalizeSelectionToVisibleNodes() {\n if (!this.model || this.options.selection !== undefined) return;\n const rowIds = new Set(this.getVisibleRowNodes().map((node) => node.id));\n const columnIds = new Set(\n this.getVisibleColumnNodes().map((node) => node.id),\n );\n const normalizeAddress = (address: PivotCellAddress | null) =>\n address\n ? {\n ...address,\n rowNodeId: normalizeNodeId(\n address.rowNodeId,\n rowIds,\n this.model!.rowNodes,\n ),\n columnNodeId: normalizeNodeId(\n address.columnNodeId,\n columnIds,\n this.model!.columnNodes,\n ),\n }\n : null;\n const activeCell = normalizeAddress(this.selection.activeCell);\n const anchorCell = normalizeAddress(this.selection.anchorCell);\n this.selection = {\n ...this.selection,\n activeCell,\n anchorCell,\n ranges:\n activeCell && anchorCell\n ? [\n {\n start: anchorCell,\n end: activeCell,\n kind: this.selection.ranges[0]?.kind,\n },\n ]\n : [],\n // 轴节点选择是稳定语义,不能因为节点暂时不在可视树中而改成父节点。\n // 绘制层会根据节点路径将它映射到当前可见的祖先或后代单元格。\n activeNode: this.selection.activeNode,\n };\n }\n}\n\nfunction resolveFilterStateKey(axis: PivotFilterAxis): keyof PivotFilterState {\n if (axis === \"row\") return \"rows\";\n if (axis === \"column\") return \"columns\";\n return \"filters\";\n}\n\nfunction normalizeNodeId(\n nodeId: string,\n visibleNodeIds: Set<string>,\n nodes: Map<string, import(\"../domain/pivot/pivot-node\").PivotNode>,\n) {\n if (!nodeId || visibleNodeIds.has(nodeId)) return nodeId;\n let node = nodes.get(nodeId);\n while (node?.parentId) {\n node = nodes.get(node.parentId);\n if (node && visibleNodeIds.has(node.id)) return node.id;\n }\n return \"\";\n}\n\nfunction collectAllPivotLeaves(\n root: import(\"../domain/pivot/pivot-node\").PivotNode,\n) {\n const result: import(\"../domain/pivot/pivot-node\").PivotNode[] = [];\n const visit = (node: import(\"../domain/pivot/pivot-node\").PivotNode) => {\n if (node.kind !== \"root\" && node.children.length === 0) {\n result.push(node);\n return;\n }\n node.children.forEach(visit);\n };\n root.children.forEach(visit);\n return result;\n}\n\nfunction resolveDefaultExpandedNodes<RecordType>(\n nodes: Map<string, import(\"../domain/pivot/pivot-node\").PivotNode>,\n dimensions: PivotTableOptions<RecordType>[\"rows\"],\n) {\n const result = new Set<string>();\n nodes.forEach((node) => {\n const depth = node.dimensionKey\n ? dimensions.find(\n (item) => resolvePivotDimensionKey(item) === node.dimensionKey,\n )?.defaultExpandDepth\n : undefined;\n if (\n node.kind === \"dimension\" &&\n node.children.length > 0 &&\n depth != null &&\n node.depth < depth\n ) {\n result.add(node.id);\n }\n });\n return result;\n}\n","/** PivotTable DOM 宿主。 */\nexport interface PivotDomHost {\n root: HTMLDivElement;\n canvas: HTMLCanvasElement;\n setFittedHeight: (height: number) => void;\n observeResize: (listener: (width: number, height: number) => void) => () => void;\n destroy: () => void;\n}\n\n/** 创建不依赖框架的 Canvas 与滚动宿主。 */\nexport function createPivotDomHost(container: HTMLElement): PivotDomHost {\n const previousPosition = container.style.position;\n const previousOverflow = container.style.overflow;\n const root = document.createElement(\"div\");\n const canvas = document.createElement(\"canvas\");\n\n container.style.position = container.style.position || \"relative\";\n container.style.overflow = \"hidden\";\n root.className = \"canvas-components-pivot-table\";\n root.tabIndex = 0;\n Object.assign(root.style, {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n right: \"0\",\n height: \"100%\",\n overflow: \"hidden\",\n touchAction: \"none\",\n });\n Object.assign(canvas.style, {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n display: \"block\",\n width: \"0px\",\n height: \"0px\",\n });\n root.append(canvas);\n container.append(root);\n\n return {\n root,\n canvas,\n setFittedHeight(height) {\n root.style.height = `${Math.max(Math.ceil(height), 1)}px`;\n },\n observeResize(listener) {\n const notify = () => {\n const rect = container.getBoundingClientRect();\n listener(rect.width, rect.height);\n };\n if (typeof ResizeObserver === \"undefined\") {\n globalThis.addEventListener(\"resize\", notify);\n notify();\n return () => globalThis.removeEventListener(\"resize\", notify);\n }\n const observer = new ResizeObserver(notify);\n observer.observe(container);\n notify();\n return () => observer.disconnect();\n },\n destroy() {\n root.remove();\n container.style.position = previousPosition;\n container.style.overflow = previousOverflow;\n },\n };\n}\n","import { copyText, copyTextSync } from \"@canvas-components/utils\";\n\n/** 将文本写入系统剪贴板,并在 Clipboard API 不可用时回退到 DOM 复制。 */\nexport async function writePivotClipboardText(\n text: string,\n ownerDocument: Document,\n) {\n const syncCopied = copyTextSync(text, ownerDocument);\n logPivotClipboard(\"sync-copy-result\", { copied: syncCopied });\n if (syncCopied) return true;\n\n const copied = await copyText(text, ownerDocument);\n logPivotClipboard(\"copy-result\", { copied });\n return copied;\n}\n\n/** 在当前用户激活事件中同步复制文本。 */\nexport function copyPivotClipboardTextSync(\n text: string,\n ownerDocument: Document,\n) {\n const copied = copyTextSync(text, ownerDocument);\n logPivotClipboard(\"sync-copy-result\", { copied });\n return copied;\n}\n\n/** 输出 PivotTable 剪贴板诊断日志。 */\nexport function logPivotClipboard(\n stage: string,\n detail: Record<string, unknown>,\n) {\n console.info(`[PivotTable:clipboard] ${stage}`, detail);\n}\n","/** Canvas 尺寸适配结果。 */\nexport interface PivotCanvasSize {\n width: number;\n height: number;\n pixelRatio: number;\n}\n\n/** 按 CSS 尺寸和 DPR 更新 Canvas 位图尺寸。 */\nexport function resizePivotCanvas(\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n): PivotCanvasSize {\n const pixelRatio = Math.max(globalThis.devicePixelRatio ?? 1, 1);\n const bitmapWidth = Math.max(Math.round(width * pixelRatio), 1);\n const bitmapHeight = Math.max(Math.round(height * pixelRatio), 1);\n if (canvas.width !== bitmapWidth) canvas.width = bitmapWidth;\n if (canvas.height !== bitmapHeight) canvas.height = bitmapHeight;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n const context = canvas.getContext(\"2d\");\n context?.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return { width, height, pixelRatio };\n}\n","import type { PivotLayoutSnapshot, PivotRect } from \"../domain/layout/types\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../schema/state\";\n\n/** 计算当前单元格范围或轴节点选区在表体坐标系中的外框。 */\nexport function resolvePivotSelectionRect(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n): PivotRect | null {\n const indexes = resolveSelectionIndexes(layout, selection);\n if (!indexes) return null;\n const kind = resolvePivotSelectionKind(selection);\n const startX =\n kind === \"row\" || kind === \"row-cell\"\n ? layout.rowHeaderRect.x\n : layout.bodyRect.x +\n (layout.columnOffsets[indexes.startColumnIndex] ?? 0) -\n layout.scroll.left;\n const endX =\n layout.bodyRect.x +\n (layout.columnOffsets[indexes.endColumnIndex] ?? 0) +\n (layout.columnWidths[indexes.endColumnIndex] ?? layout.columnWidth) -\n layout.scroll.left;\n const startY =\n kind === \"column\"\n ? layout.columnHeaderRect.y\n : layout.bodyRect.y +\n indexes.startRowIndex * layout.rowHeight -\n layout.scroll.top;\n const endY =\n layout.bodyRect.y +\n (indexes.endRowIndex + 1) * layout.rowHeight -\n layout.scroll.top;\n const clipRect = resolvePivotSelectionClipRect(layout, selection);\n const visibleStartX = Math.max(startX, clipRect.x);\n const visibleEndX = Math.min(endX, clipRect.x + clipRect.width);\n const visibleStartY = Math.max(startY, clipRect.y);\n const visibleEndY = Math.min(endY, clipRect.y + clipRect.height);\n if (visibleStartX >= visibleEndX || visibleStartY >= visibleEndY) return null;\n return {\n x: visibleStartX,\n y: visibleStartY,\n width: visibleEndX - visibleStartX,\n height: visibleEndY - visibleStartY,\n };\n}\n\n/** 获取不同来源选区允许覆盖的表头与表体裁剪区域。 */\nexport function resolvePivotSelectionClipRect(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n): PivotRect {\n const kind = resolvePivotSelectionKind(selection);\n if (kind === \"row\" || kind === \"row-cell\") {\n return {\n x: layout.rowHeaderRect.x,\n y: layout.bodyRect.y,\n width: layout.bodyRect.x + layout.bodyRect.width - layout.rowHeaderRect.x,\n height: layout.bodyRect.height,\n };\n }\n if (kind === \"column\") {\n return {\n x: layout.bodyRect.x,\n y: layout.columnHeaderRect.y,\n width: layout.bodyRect.width,\n height:\n layout.bodyRect.y + layout.bodyRect.height - layout.columnHeaderRect.y,\n };\n }\n return layout.bodyRect;\n}\n\n/** 判断当前选区是否为需要仅绘制外框的区域选择。 */\nexport function isPivotAreaSelection(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n) {\n if (selection?.activeNode) return true;\n if (selection?.ranges[0]?.kind === \"row-cell\") return true;\n const indexes = resolveSelectionIndexes(layout, selection);\n return Boolean(\n indexes &&\n (indexes.startRowIndex !== indexes.endRowIndex ||\n indexes.startColumnIndex !== indexes.endColumnIndex),\n );\n}\n\nfunction resolvePivotSelectionKind(\n selection: PivotSelectionState | null | undefined,\n) {\n const rangeKind = selection?.ranges[0]?.kind;\n if (\n rangeKind === \"row\" ||\n rangeKind === \"column\" ||\n rangeKind === \"row-cell\"\n ) {\n return rangeKind;\n }\n return selection?.activeNode?.axis ?? \"cell\";\n}\n\n/** 按 ListTable 的像素对齐规则在选区矩形内侧绘制边框。 */\nexport function drawPivotSelectionBorder(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.strokeRect(\n rect.x + 0.5,\n rect.y + 0.5,\n Math.max(rect.width - 1, 0),\n Math.max(rect.height - 1, 0),\n );\n context.restore();\n}\n\nfunction resolveSelectionIndexes(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n) {\n const range = selection?.ranges[0];\n if (range) {\n const start = resolveAddressIndexes(layout, range.start);\n const end = resolveAddressIndexes(layout, range.end);\n if (!start || !end) return null;\n return normalizeIndexes(\n start.rowIndex,\n end.rowIndex,\n start.columnIndex,\n end.columnIndex,\n );\n }\n const activeNode = selection?.activeNode;\n if (!activeNode) return null;\n const pathKey = resolveNodePathKey(activeNode.nodeId);\n if (!pathKey) return null;\n const relatedIndexes = (\n activeNode.axis === \"row\" ? layout.rowSlots : layout.columnSlots\n )\n .map((slot, index) => (isPathRelated(pathKey, slot.pathKey) ? index : -1))\n .filter((index) => index >= 0);\n if (relatedIndexes.length === 0) return null;\n if (activeNode.axis === \"row\") {\n return normalizeIndexes(\n relatedIndexes[0]!,\n relatedIndexes[relatedIndexes.length - 1]!,\n 0,\n layout.columnSlots.length - 1,\n );\n }\n return normalizeIndexes(\n 0,\n layout.rowSlots.length - 1,\n relatedIndexes[0]!,\n relatedIndexes[relatedIndexes.length - 1]!,\n );\n}\n\nfunction normalizeIndexes(\n firstRow: number,\n secondRow: number,\n firstColumn: number,\n secondColumn: number,\n) {\n if (firstRow < 0 || secondRow < 0 || firstColumn < 0 || secondColumn < 0) {\n return null;\n }\n return {\n startRowIndex: Math.min(firstRow, secondRow),\n endRowIndex: Math.max(firstRow, secondRow),\n startColumnIndex: Math.min(firstColumn, secondColumn),\n endColumnIndex: Math.max(firstColumn, secondColumn),\n };\n}\n\nfunction resolveAddressIndexes(\n layout: PivotLayoutSnapshot,\n address: PivotCellAddress,\n) {\n const rowIndex = layout.rowSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.rowNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n const columnIndex = layout.columnSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.columnNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n return rowIndex >= 0 && columnIndex >= 0 ? { rowIndex, columnIndex } : null;\n}\n\nfunction isPathRelated(firstPathKey: string, secondPathKey: string) {\n try {\n const first = JSON.parse(firstPathKey) as unknown;\n const second = JSON.parse(secondPathKey) as unknown;\n if (!Array.isArray(first) || !Array.isArray(second)) {\n return firstPathKey === secondPathKey;\n }\n return isPathPrefix(first, second) || isPathPrefix(second, first);\n } catch {\n return firstPathKey === secondPathKey;\n }\n}\n\nfunction isPathPrefix(parent: unknown[], child: unknown[]) {\n return (\n parent.length <= child.length &&\n parent.every((value, index) => Object.is(value, child[index]))\n );\n}\n\nfunction resolveNodePathKey(nodeId: string) {\n try {\n const decoded = JSON.parse(nodeId) as unknown;\n return Array.isArray(decoded) && typeof decoded[2] === \"string\"\n ? decoded[2]\n : null;\n } catch {\n return null;\n }\n}\n","/** PivotTable 单元格样式。 */\nexport interface PivotCellStyle {\n backgroundColor?: string;\n color?: string;\n fontSize?: number;\n fontWeight?: string;\n textAlign?: CanvasTextAlign;\n paddingInline?: number;\n paddingBlock?: number;\n borderColor?: string;\n borderWidth?: number;\n}\n\n/** PivotTable 主题。 */\nexport interface PivotTableTheme {\n backgroundColor: string;\n borderColor: string;\n textColor: string;\n mutedTextColor: string;\n rowHeaderBackgroundColor: string;\n columnHeaderBackgroundColor: string;\n cornerBackgroundColor: string;\n subtotalBackgroundColor: string;\n grandTotalBackgroundColor: string;\n hoverBackgroundColor: string;\n selectionBackgroundColor: string;\n selectionBorderColor: string;\n fontFamily: string;\n fontSize: number;\n}\n\n/** 默认 PivotTable 主题。 */\nexport const defaultPivotTableTheme: PivotTableTheme = {\n backgroundColor: \"#ffffff\",\n borderColor: \"#d9e1ec\",\n textColor: \"#1f2329\",\n mutedTextColor: \"#7a8798\",\n rowHeaderBackgroundColor: \"#f7f8fa\",\n columnHeaderBackgroundColor: \"#f5f8fc\",\n cornerBackgroundColor: \"#eef2f7\",\n subtotalBackgroundColor: \"#f8fafc\",\n grandTotalBackgroundColor: \"#edf4ff\",\n hoverBackgroundColor: \"#edf4ff\",\n selectionBackgroundColor: \"#dbeafe\",\n selectionBorderColor: \"#1677ff\",\n fontFamily:\n '\"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif',\n fontSize: 14,\n};\n","import type {\n PivotAxisScrollbarLayout,\n PivotScrollbarLayout,\n PivotScrollbarRect,\n} from \"../domain/layout/scrollbar-types\";\n\n/** 绘制 PivotTable Canvas 滚动条。 */\nexport function drawPivotScrollbars(\n context: CanvasRenderingContext2D,\n layout: PivotScrollbarLayout,\n) {\n context.save();\n if (layout.horizontal) {\n drawAxis(context, layout.horizontal, \"horizontal\");\n }\n if (layout.vertical) {\n drawAxis(context, layout.vertical, \"vertical\");\n }\n context.restore();\n}\n\nfunction drawAxis(\n context: CanvasRenderingContext2D,\n layout: PivotAxisScrollbarLayout,\n axis: \"horizontal\" | \"vertical\",\n) {\n drawTrack(context, layout.track);\n drawButton(context, layout.decreaseButton, axis, \"decrease\");\n drawButton(context, layout.increaseButton, axis, \"increase\");\n drawThumb(context, layout.thumb);\n}\n\nfunction drawTrack(context: CanvasRenderingContext2D, rect: PivotScrollbarRect) {\n context.fillStyle = \"rgba(148, 163, 184, 0.16)\";\n roundRect(context, rect, rect.height / 2);\n context.fill();\n}\n\nfunction drawThumb(context: CanvasRenderingContext2D, rect: PivotScrollbarRect) {\n context.fillStyle = \"rgba(100, 116, 139, 0.8)\";\n roundRect(context, rect, rect.height / 2);\n context.fill();\n}\n\nfunction drawButton(\n context: CanvasRenderingContext2D,\n rect: PivotScrollbarRect,\n axis: \"horizontal\" | \"vertical\",\n direction: \"decrease\" | \"increase\",\n) {\n context.fillStyle = \"rgba(226, 232, 240, 0.92)\";\n context.strokeStyle = \"rgba(148, 163, 184, 0.65)\";\n context.lineWidth = 1;\n roundRect(context, rect, rect.height / 2);\n context.fill();\n context.stroke();\n context.fillStyle = \"rgba(71, 85, 105, 0.88)\";\n context.beginPath();\n const centerX = rect.x + rect.width / 2;\n const centerY = rect.y + rect.height / 2;\n if (axis === \"horizontal\") {\n const tipX = centerX + (direction === \"decrease\" ? -1 : 1) * rect.width * 0.14;\n const tailX = centerX + (direction === \"decrease\" ? 1 : -1) * rect.width * 0.14;\n context.moveTo(tipX, centerY);\n context.lineTo(tailX, centerY - rect.height * 0.22);\n context.lineTo(tailX, centerY + rect.height * 0.22);\n } else {\n const tipY = centerY + (direction === \"decrease\" ? -1 : 1) * rect.height * 0.14;\n const tailY = centerY + (direction === \"decrease\" ? 1 : -1) * rect.height * 0.14;\n context.moveTo(centerX, tipY);\n context.lineTo(centerX - rect.width * 0.22, tailY);\n context.lineTo(centerX + rect.width * 0.22, tailY);\n }\n context.closePath();\n context.fill();\n}\n\nfunction roundRect(\n context: CanvasRenderingContext2D,\n rect: PivotScrollbarRect,\n radius: number,\n) {\n const nextRadius = Math.min(radius, rect.width / 2, rect.height / 2);\n context.beginPath();\n context.moveTo(rect.x + nextRadius, rect.y);\n context.arcTo(\n rect.x + rect.width,\n rect.y,\n rect.x + rect.width,\n rect.y + rect.height,\n nextRadius,\n );\n context.arcTo(\n rect.x + rect.width,\n rect.y + rect.height,\n rect.x,\n rect.y + rect.height,\n nextRadius,\n );\n context.arcTo(rect.x, rect.y + rect.height, rect.x, rect.y, nextRadius);\n context.arcTo(rect.x, rect.y, rect.x + rect.width, rect.y, nextRadius);\n context.closePath();\n}\n","import type { PivotRect } from \"../domain/layout/types\";\n\n/**\n * 绘制共享边界的单像素网格线。\n *\n * 相邻单元格的右/左边和下/上边使用完全相同的半像素坐标,\n * 避免两条平行线叠成局部粗线。\n */\nexport function drawPivotGridRect(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n options?: {\n skipTop?: boolean;\n skipRight?: boolean;\n skipBottom?: boolean;\n skipLeft?: boolean;\n },\n) {\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n if (!options?.skipTop) {\n context.moveTo(rect.x, rect.y + 0.5);\n context.lineTo(rect.x + rect.width, rect.y + 0.5);\n }\n if (!options?.skipLeft) {\n context.moveTo(rect.x + 0.5, rect.y);\n context.lineTo(rect.x + 0.5, rect.y + rect.height);\n }\n if (!options?.skipRight) {\n context.moveTo(rect.x + rect.width + 0.5, rect.y);\n context.lineTo(rect.x + rect.width + 0.5, rect.y + rect.height);\n }\n if (!options?.skipBottom) {\n context.moveTo(rect.x, rect.y + rect.height + 0.5);\n context.lineTo(rect.x + rect.width, rect.y + rect.height + 0.5);\n }\n context.stroke();\n context.restore();\n}\n\n/** 绘制不随内容滚动的可视区右边框。 */\nexport function drawPivotViewportRightBorder(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n const x = rect.x + rect.width - 0.5;\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(x, rect.y);\n context.lineTo(x, rect.y + rect.height);\n context.stroke();\n context.restore();\n}\n\n/** 绘制在 Canvas 内侧的表格底边框,避免内容高度收缩后被裁切。 */\nexport function drawPivotViewportBottomBorder(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n const y = rect.y + rect.height - 0.5;\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(rect.x, y);\n context.lineTo(rect.x + rect.width, y);\n context.stroke();\n context.restore();\n}\n\n/** 绘制固定表头区域不随内容滚动的默认边界。 */\nexport function drawPivotHeaderBoundaries(\n context: CanvasRenderingContext2D,\n options: {\n rowHeaderRight: number;\n columnHeaderBottom: number;\n width: number;\n height: number;\n },\n color: string,\n) {\n // 与单元格共享边界使用同一坐标,避免未滚动时形成相邻双线。\n const right = options.rowHeaderRight + 0.5;\n const bottom = options.columnHeaderBottom + 0.5;\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(right, 0);\n context.lineTo(right, options.height);\n context.moveTo(0, bottom);\n context.lineTo(options.width, bottom);\n context.stroke();\n context.restore();\n}\n\n/** 绘制表体首行首列的边界,避免固定表头交界处被选中层裁掉。 */\nexport function drawPivotBodyTopLeftBoundaries(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(rect.x + 0.5, rect.y);\n context.lineTo(rect.x + 0.5, rect.y + rect.height);\n context.moveTo(rect.x, rect.y + 0.5);\n context.lineTo(rect.x + rect.width, rect.y + 0.5);\n context.stroke();\n context.restore();\n}\n","import type { PivotRect } from \"./types\";\n\n/**\n * 计算合并行表头的吸附内容区域。\n *\n * 内容吸附在行表头顶部,并受所属合并单元格底边约束。\n */\nexport function resolveStickyRowHeaderContentRect(params: {\n cellRect: PivotRect;\n viewportTop: number;\n rowHeight: number;\n}): PivotRect {\n const height = Math.min(\n Math.max(params.rowHeight, 0),\n Math.max(params.cellRect.height, 0),\n );\n const cellBottom = params.cellRect.y + params.cellRect.height;\n const y = Math.min(\n Math.max(params.cellRect.y, params.viewportTop),\n cellBottom - height,\n );\n return {\n x: params.cellRect.x,\n y,\n width: params.cellRect.width,\n height,\n };\n}\n","import type {\n PivotBodyCellLayout,\n PivotHeaderCellLayout,\n PivotLayoutSnapshot,\n PivotRect,\n} from \"../domain/layout/types\";\nimport type { PivotTableOptions } from \"../schema/options\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../schema/state\";\nimport {\n drawPivotSelectionBorder,\n isPivotAreaSelection,\n resolvePivotSelectionClipRect,\n resolvePivotSelectionRect,\n} from \"./draw-selection\";\nimport { defaultPivotTableTheme, type PivotTableTheme } from \"../schema/style\";\nimport { drawPivotScrollbars } from \"./draw-scrollbars\";\nimport {\n drawPivotGridRect,\n drawPivotHeaderBoundaries,\n drawPivotViewportBottomBorder,\n drawPivotViewportRightBorder,\n} from \"./draw-grid\";\nimport { resolveStickyRowHeaderContentRect } from \"../domain/layout/sticky-row-header\";\n\n/** 单次 Canvas 绘制统计。 */\nexport interface PivotRenderStats {\n headerCellCount: number;\n bodyCellCount: number;\n}\n\n/** 绘制 PivotTable 四区内容。 */\nexport function renderPivotTable<RecordType>(params: {\n context: CanvasRenderingContext2D;\n layout: PivotLayoutSnapshot;\n options: PivotTableOptions<RecordType>;\n activeCell?: PivotCellAddress | null;\n hoverCell?: PivotCellAddress | null;\n selection?: PivotSelectionState | null;\n resizeGuideX?: number | null;\n}): PivotRenderStats {\n const { context, layout, options } = params;\n const theme: PivotTableTheme = {\n ...defaultPivotTableTheme,\n ...options.theme,\n };\n const visibleIndicatorMaxima = resolveVisibleIndicatorMaxima(layout);\n const highlightMode = options.highlightMode ?? \"row\";\n const activeNodePathKey = params.selection?.activeNode\n ? resolveNodePathKey(params.selection.activeNode.nodeId)\n : null;\n const selectionPathKeys = resolveSelectionPathKeys(\n layout,\n params.selection,\n activeNodePathKey,\n );\n const areaSelection = isPivotAreaSelection(layout, params.selection);\n context.clearRect(0, 0, layout.width, layout.height);\n context.font = `${theme.fontSize}px ${theme.fontFamily}`;\n context.textBaseline = \"middle\";\n\n withClip(context, layout.reportFilterRect, () => {\n layout.reportFilterCells.forEach((cell) =>\n drawReportFilterCell(context, cell, theme),\n );\n });\n withClip(context, layout.cornerRect, () => {\n fillRect(context, layout.cornerRect, theme.cornerBackgroundColor);\n drawCorner(context, layout, theme);\n });\n withClip(context, layout.rowHeaderRect, () => {\n layout.rowHeaderCells.forEach((cell) => {\n const contentRect = resolveStickyRowHeaderContentRect({\n cellRect: cell.rect,\n viewportTop: layout.rowHeaderRect.y,\n rowHeight: layout.rowHeight,\n });\n drawHeaderCell(\n context,\n cell,\n theme,\n !areaSelection && isHeaderSelected(cell, selectionPathKeys.row),\n contentRect,\n );\n });\n layout.rowHeaderCells.forEach((cell) =>\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipTop: true,\n skipLeft: cell.rect.x > 0,\n skipRight: isSameCoordinate(\n cell.rect.x + cell.rect.width,\n layout.rowHeaderRect.x + layout.rowHeaderRect.width,\n ),\n }),\n );\n });\n withClip(context, layout.columnHeaderRect, () => {\n layout.columnHeaderCells.forEach((cell) =>\n drawHeaderCell(\n context,\n cell,\n theme,\n !areaSelection && isHeaderSelected(cell, selectionPathKeys.column),\n ),\n );\n layout.columnHeaderCells.forEach((cell) =>\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipTop: cell.rect.y > 0,\n skipLeft: true,\n skipRight: isSameCoordinate(\n cell.rect.x + cell.rect.width,\n layout.tableWidth,\n ),\n skipBottom: isSameCoordinate(\n cell.rect.y + cell.rect.height,\n layout.columnHeaderRect.y + layout.columnHeaderRect.height,\n ),\n }),\n );\n });\n withClip(context, layout.bodyRect, () => {\n layout.bodyCells.forEach((cell) =>\n drawBodyCell(\n context,\n cell,\n options,\n theme,\n {\n active: !areaSelection && isCellAddress(cell, params.activeCell),\n hover: !areaSelection && isCellAddress(cell, params.hoverCell),\n highlighted:\n !areaSelection &&\n isCellHighlightedByMode(\n highlightMode,\n cell,\n params.selection,\n activeNodePathKey,\n ),\n },\n visibleIndicatorMaxima.get(cell.indicatorKey) ?? 0,\n ),\n );\n layout.bodyCells.forEach((cell) =>\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipTop: true,\n skipLeft: true,\n skipRight: isSameCoordinate(\n cell.rect.x + cell.rect.width,\n layout.tableWidth,\n ),\n }),\n );\n if (\n options.indicators.length === 0 ||\n layout.recordCount === 0 ||\n options.loading ||\n options.errorText\n ) {\n drawBodyStatus(context, layout, options, theme);\n }\n });\n\n const contentHeight = layout.height;\n drawPivotHeaderBoundaries(\n context,\n {\n rowHeaderRight: layout.rowHeaderRect.x + layout.rowHeaderRect.width,\n columnHeaderBottom:\n layout.columnHeaderRect.y + layout.columnHeaderRect.height,\n width: layout.tableWidth,\n height: contentHeight,\n },\n theme.borderColor,\n );\n if (options.debug) drawDebugOverlay(context, layout, theme);\n drawPivotScrollbars(context, layout.scrollbar);\n drawPivotViewportRightBorder(\n context,\n { x: 0, y: 0, width: layout.tableWidth, height: contentHeight },\n theme.borderColor,\n );\n drawPivotViewportBottomBorder(\n context,\n { x: 0, y: 0, width: layout.tableWidth, height: contentHeight },\n theme.borderColor,\n );\n const selectionRect = resolvePivotSelectionRect(layout, params.selection);\n if (selectionRect) {\n const selectionClipRect = resolvePivotSelectionClipRect(\n layout,\n params.selection,\n );\n withClip(context, selectionClipRect, () => {\n drawPivotSelectionBorder(\n context,\n selectionRect,\n theme.selectionBorderColor,\n );\n });\n }\n if (params.resizeGuideX != null) {\n drawPivotResizeGuide(context, params.resizeGuideX, contentHeight);\n }\n\n return {\n headerCellCount:\n layout.reportFilterCells.length +\n layout.rowFieldHeaderCells.length +\n layout.rowHeaderCells.length +\n layout.columnHeaderCells.length,\n bodyCellCount: layout.bodyCells.length,\n };\n}\n\n/** 绘制列宽拖拽指示线,样式与 ListTable 保持一致。 */\nexport function drawPivotResizeGuide(\n context: CanvasRenderingContext2D,\n x: number,\n height: number,\n) {\n context.save();\n context.strokeStyle = \"#1677ff\";\n context.lineWidth = 1.5;\n context.setLineDash([4, 4]);\n context.beginPath();\n context.moveTo(x + 0.5, 0);\n context.lineTo(x + 0.5, height);\n context.stroke();\n context.restore();\n}\n\nfunction drawBodyStatus<RecordType>(\n context: CanvasRenderingContext2D,\n layout: PivotLayoutSnapshot,\n options: PivotTableOptions<RecordType>,\n theme: PivotTableTheme,\n) {\n fillRect(context, layout.bodyRect, theme.backgroundColor);\n const text = options.errorText\n ? options.errorText\n : options.loading\n ? (options.loadingText ?? \"加载中\")\n : (options.emptyText ?? \"暂无数据\");\n drawText(\n context,\n text,\n layout.bodyRect,\n options.errorText ? \"#d03050\" : theme.mutedTextColor,\n 12,\n \"center\",\n );\n}\n\nfunction drawDebugOverlay(\n context: CanvasRenderingContext2D,\n layout: PivotLayoutSnapshot,\n theme: PivotTableTheme,\n) {\n context.save();\n context.setLineDash([4, 3]);\n [\n layout.reportFilterRect,\n layout.cornerRect,\n layout.rowHeaderRect,\n layout.columnHeaderRect,\n layout.bodyRect,\n ].forEach((rect) => strokeRect(context, rect, \"#f04438\"));\n context.setLineDash([]);\n context.font = `12px ${theme.fontFamily}`;\n context.textAlign = \"left\";\n context.textBaseline = \"top\";\n context.fillStyle = \"#f04438\";\n context.fillText(\n `rows ${layout.visibleRowRange.start}-${layout.visibleRowRange.end} / cols ${layout.visibleColumnRange.start}-${layout.visibleColumnRange.end} / cells ${layout.bodyCells.length}`,\n layout.bodyRect.x + 8,\n layout.bodyRect.y + 8,\n );\n context.restore();\n}\n\nfunction drawReportFilterCell(\n context: CanvasRenderingContext2D,\n cell: PivotLayoutSnapshot[\"reportFilterCells\"][number],\n theme: PivotTableTheme,\n) {\n fillRect(context, cell.rect, theme.backgroundColor);\n drawText(context, cell.label, cell.labelRect, theme.textColor, 10, \"left\");\n drawText(\n context,\n cell.valueLabel,\n { ...cell.valueRect, width: Math.max(cell.valueRect.width - 24, 0) },\n cell.active ? \"#1677ff\" : theme.textColor,\n 10,\n \"left\",\n );\n const separatorX = cell.valueRect.x + 0.5;\n context.save();\n context.strokeStyle = theme.borderColor;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(separatorX, cell.rect.y);\n context.lineTo(separatorX, cell.rect.y + cell.rect.height);\n context.stroke();\n context.fillStyle = cell.active ? \"#1677ff\" : theme.mutedTextColor;\n context.beginPath();\n const arrowX = cell.valueRect.x + cell.valueRect.width - 12;\n const arrowY = cell.valueRect.y + cell.valueRect.height / 2;\n context.moveTo(arrowX - 4, arrowY - 2);\n context.lineTo(arrowX + 4, arrowY - 2);\n context.lineTo(arrowX, arrowY + 3);\n context.closePath();\n context.fill();\n context.restore();\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipTop: cell.rect.y > 0,\n skipRight: true,\n });\n}\n\nfunction drawCorner(\n context: CanvasRenderingContext2D,\n layout: PivotLayoutSnapshot,\n theme: PivotTableTheme,\n) {\n layout.rowFieldHeaderCells.forEach((cell) =>\n drawHeaderCell(\n context,\n cell,\n theme,\n false,\n cell.rect,\n theme.cornerBackgroundColor,\n ),\n );\n if (layout.rowFieldHeaderCells.length === 0) {\n drawPivotGridRect(context, layout.cornerRect, theme.borderColor, {\n skipRight: true,\n skipBottom: true,\n });\n return;\n }\n layout.rowFieldHeaderCells.forEach((cell) =>\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipRight: true,\n skipBottom: true,\n }),\n );\n}\n\nfunction drawHeaderCell(\n context: CanvasRenderingContext2D,\n cell: PivotHeaderCellLayout,\n theme: PivotTableTheme,\n selected: boolean,\n contentRect = cell.rect,\n backgroundColor?: string,\n) {\n const background =\n backgroundColor ??\n (selected\n ? theme.selectionBackgroundColor\n : cell.kind === \"grandTotal\"\n ? theme.grandTotalBackgroundColor\n : cell.kind === \"subtotal\"\n ? theme.subtotalBackgroundColor\n : cell.axis === \"row\"\n ? theme.rowHeaderBackgroundColor\n : theme.columnHeaderBackgroundColor);\n fillRect(context, cell.rect, background);\n const iconPadding = cell.expandable ? 18 : 0;\n if (cell.expandable) {\n drawExpandIcon(context, contentRect, theme.mutedTextColor, cell.expanded);\n }\n if (cell.filterable) {\n drawFilterIcon(\n context,\n contentRect,\n cell.filterActive ? \"#3370ff\" : theme.mutedTextColor,\n );\n }\n if (cell.sortable) {\n drawSortIcon(\n context,\n contentRect,\n cell.sortDirection,\n cell.filterable ? 32 : 10,\n );\n }\n drawText(\n context,\n cell.label,\n {\n ...contentRect,\n width:\n contentRect.width -\n (cell.filterable ? 24 : 0) -\n (cell.sortable ? 24 : 0),\n },\n theme.textColor,\n 10 + iconPadding,\n cell.align ?? \"left\",\n );\n}\n\nfunction isHeaderSelected(\n cell: PivotHeaderCellLayout,\n selectedPathKey: string | null,\n) {\n if (!selectedPathKey || !cell.nodeId) {\n return false;\n }\n return Boolean(isPathRelated(selectedPathKey, cell.pathKey));\n}\n\nfunction drawBodyCell<RecordType>(\n context: CanvasRenderingContext2D,\n cell: PivotBodyCellLayout,\n options: PivotTableOptions<RecordType>,\n theme: PivotTableTheme,\n state: {\n active: boolean;\n hover: boolean;\n highlighted: boolean;\n },\n visibleMaximum: number,\n) {\n const indicator = options.indicators.find(\n (item) => item.key === cell.indicatorKey,\n );\n fillRect(\n context,\n cell.rect,\n state.highlighted || state.active\n ? theme.selectionBackgroundColor\n : state.hover\n ? theme.hoverBackgroundColor\n : theme.backgroundColor,\n );\n if (indicator?.cellType === \"progress\" && typeof cell.value === \"number\") {\n const ratio = Math.min(Math.max(cell.value, 0), 100) / 100;\n fillRect(\n context,\n { ...cell.rect, width: cell.rect.width * ratio },\n theme.selectionBackgroundColor,\n );\n }\n if (\n indicator?.cellType === \"chart\" &&\n typeof cell.value === \"number\" &&\n visibleMaximum > 0\n ) {\n const ratio = Math.min(Math.abs(cell.value) / visibleMaximum, 1);\n fillRect(\n context,\n {\n x: cell.rect.x + 8,\n y: cell.rect.y + cell.rect.height - 8,\n width: Math.max((cell.rect.width - 16) * ratio, 1),\n height: 3,\n },\n \"#3370ff\",\n );\n }\n drawText(\n context,\n resolveBodyDisplayText(cell, indicator),\n cell.rect,\n theme.textColor,\n 10,\n indicator?.align ?? \"right\",\n );\n}\n\nfunction resolveSelectionPathKeys(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n activeNodePathKey: string | null,\n) {\n const activeNode = selection?.activeNode;\n if (activeNode) {\n return {\n row: activeNode.axis === \"row\" ? activeNodePathKey : null,\n column: activeNode.axis === \"column\" ? activeNodePathKey : null,\n };\n }\n const activeCell = selection?.activeCell;\n if (!activeCell) {\n return { row: null, column: null };\n }\n return {\n row: resolveSlotPathKey(\n layout.rowSlots,\n activeCell.rowNodeId,\n activeCell.indicatorKey,\n ),\n column: resolveSlotPathKey(\n layout.columnSlots,\n activeCell.columnNodeId,\n activeCell.indicatorKey,\n ),\n };\n}\n\nfunction resolveSlotPathKey(\n slots: PivotLayoutSnapshot[\"rowSlots\"],\n nodeId: string,\n indicatorKey: string,\n) {\n return (\n slots.find(\n (slot) =>\n (slot.nodeId ?? \"\") === nodeId &&\n (!slot.indicatorKey || slot.indicatorKey === indicatorKey),\n )?.pathKey ?? null\n );\n}\n\nfunction isSameCoordinate(first: number, second: number) {\n return Math.abs(first - second) < 0.01;\n}\n\nfunction resolveBodyDisplayText<RecordType>(\n cell: PivotBodyCellLayout,\n indicator: PivotTableOptions<RecordType>[\"indicators\"][number] | undefined,\n) {\n if (!indicator || indicator.formatter || typeof cell.value !== \"number\") {\n return cell.formattedValue;\n }\n if (indicator.cellType === \"percent\") {\n return `${(cell.value * 100).toFixed(indicator.precision ?? 2)}%`;\n }\n if (indicator.cellType === \"money\") {\n return cell.value.toLocaleString(\"zh-CN\", {\n style: \"currency\",\n currency: \"CNY\",\n minimumFractionDigits: indicator.precision ?? 2,\n maximumFractionDigits: indicator.precision ?? 2,\n });\n }\n return cell.formattedValue;\n}\n\nfunction resolveVisibleIndicatorMaxima(layout: PivotLayoutSnapshot) {\n const maxima = new Map<string, number>();\n layout.bodyCells.forEach((cell) => {\n if (typeof cell.value !== \"number\" || !Number.isFinite(cell.value)) return;\n maxima.set(\n cell.indicatorKey,\n Math.max(maxima.get(cell.indicatorKey) ?? 0, Math.abs(cell.value)),\n );\n });\n return maxima;\n}\n\nfunction isCellAddress(\n cell: PivotBodyCellLayout,\n address: PivotCellAddress | null | undefined,\n) {\n return Boolean(\n address &&\n address.rowNodeId === (cell.rowNodeId ?? \"\") &&\n address.columnNodeId === (cell.columnNodeId ?? \"\") &&\n address.indicatorKey === cell.indicatorKey,\n );\n}\n\nfunction isCellHighlightedByMode(\n mode: \"cell\" | \"row\" | \"column\" | \"cross\",\n cell: PivotBodyCellLayout,\n selection: PivotSelectionState | null | undefined,\n activeNodePathKey: string | null,\n) {\n const activeNode = selection?.activeNode;\n if (\n activeNode &&\n activeNodePathKey &&\n isPathRelated(\n activeNodePathKey,\n activeNode.axis === \"row\" ? cell.rowPathKey : cell.columnPathKey,\n )\n ) {\n return true;\n }\n const activeCell = selection?.activeCell;\n if (!activeCell) return false;\n const sameCell = isCellAddress(cell, activeCell);\n const sameRow = cell.rowNodeId === activeCell.rowNodeId;\n const sameColumn = cell.columnNodeId === activeCell.columnNodeId;\n if (mode === \"cell\") return sameCell;\n if (mode === \"row\") return sameRow;\n if (mode === \"column\") return sameColumn;\n return sameRow || sameColumn;\n}\n\nfunction isPathRelated(firstPathKey: string, secondPathKey: string) {\n try {\n const first = JSON.parse(firstPathKey) as unknown;\n const second = JSON.parse(secondPathKey) as unknown;\n if (!Array.isArray(first) || !Array.isArray(second)) {\n return firstPathKey === secondPathKey;\n }\n return isPathPrefix(first, second) || isPathPrefix(second, first);\n } catch {\n return firstPathKey === secondPathKey;\n }\n}\n\nfunction isPathPrefix(parent: unknown[], child: unknown[]) {\n return (\n parent.length <= child.length &&\n parent.every((value, index) => Object.is(value, child[index]))\n );\n}\n\nfunction resolveNodePathKey(nodeId: string) {\n try {\n const decoded = JSON.parse(nodeId) as unknown;\n return Array.isArray(decoded) && typeof decoded[2] === \"string\"\n ? decoded[2]\n : null;\n } catch {\n return null;\n }\n}\n\nfunction drawExpandIcon(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n expanded: boolean,\n) {\n const x = rect.x + 10;\n const y = rect.y + rect.height / 2;\n context.beginPath();\n if (expanded) {\n context.moveTo(x - 1, y - 2);\n context.lineTo(x + 4, y + 3);\n context.lineTo(x + 9, y - 2);\n } else {\n context.moveTo(x, y - 4);\n context.lineTo(x + 5, y);\n context.lineTo(x, y + 4);\n }\n context.strokeStyle = color;\n context.stroke();\n}\n\nfunction drawFilterIcon(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n const right = rect.x + rect.width - 10;\n const top = rect.y + rect.height / 2 - 5;\n context.beginPath();\n context.moveTo(right - 10, top);\n context.lineTo(right, top);\n context.lineTo(right - 4, top + 5);\n context.lineTo(right - 4, top + 10);\n context.lineTo(right - 6, top + 9);\n context.lineTo(right - 6, top + 5);\n context.closePath();\n context.fillStyle = color;\n context.fill();\n}\n\nfunction drawSortIcon(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n direction: \"asc\" | \"desc\" | null,\n rightPadding: number,\n) {\n const size = 14;\n const iconRect = {\n x: rect.x + rect.width - rightPadding - 5 - size / 2,\n y: rect.y + (rect.height - size) / 2,\n width: size,\n height: size,\n };\n\n context.save();\n context.beginPath();\n context.fillStyle = direction === \"asc\" ? \"#1677ff\" : \"#8c8c8c\";\n context.moveTo(iconRect.x + iconRect.width / 2, iconRect.y + 1);\n context.lineTo(iconRect.x + iconRect.width - 2, iconRect.y + 6);\n context.lineTo(iconRect.x + 2, iconRect.y + 6);\n context.closePath();\n context.fill();\n\n context.beginPath();\n context.fillStyle = direction === \"desc\" ? \"#1677ff\" : \"#8c8c8c\";\n context.moveTo(iconRect.x + 2, iconRect.y + iconRect.height - 6);\n context.lineTo(\n iconRect.x + iconRect.width - 2,\n iconRect.y + iconRect.height - 6,\n );\n context.lineTo(\n iconRect.x + iconRect.width / 2,\n iconRect.y + iconRect.height - 1,\n );\n context.closePath();\n context.fill();\n context.restore();\n}\n\nfunction drawText(\n context: CanvasRenderingContext2D,\n text: string,\n rect: PivotRect,\n color: string,\n padding: number,\n align: \"left\" | \"center\" | \"right\",\n) {\n const availableWidth = Math.max(rect.width - padding * 2, 0);\n const value = truncateText(context, text, availableWidth);\n context.fillStyle = color;\n context.textAlign = align;\n const x =\n align === \"right\"\n ? rect.x + rect.width - padding\n : align === \"center\"\n ? rect.x + rect.width / 2\n : rect.x + padding;\n context.fillText(value, x, rect.y + rect.height / 2, availableWidth);\n}\n\nfunction truncateText(\n context: CanvasRenderingContext2D,\n text: string,\n maxWidth: number,\n) {\n if (context.measureText(text).width <= maxWidth) return text;\n const suffix = \"...\";\n let value = text;\n while (value && context.measureText(`${value}${suffix}`).width > maxWidth) {\n value = value.slice(0, -1);\n }\n return value ? `${value}${suffix}` : \"\";\n}\n\nfunction withClip(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n draw: () => void,\n) {\n context.save();\n context.beginPath();\n context.rect(rect.x, rect.y, rect.width, rect.height);\n context.clip();\n draw();\n context.restore();\n}\n\nfunction fillRect(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n context.fillStyle = color;\n context.fillRect(rect.x, rect.y, rect.width, rect.height);\n}\n\nfunction strokeRect(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.strokeRect(\n rect.x + 0.5,\n rect.y + 0.5,\n Math.max(rect.width - 1, 0),\n Math.max(rect.height - 1, 0),\n );\n}\n","import type {\n PivotBodyCellLayout,\n PivotHeaderCellLayout,\n PivotLayoutSnapshot,\n PivotReportFilterCellLayout,\n} from \"../layout/types\";\n\n/** PivotTable 命中区域。 */\nexport type PivotHitRegion =\n | \"reportFilter\"\n | \"corner\"\n | \"rowHeader\"\n | \"columnHeader\"\n | \"body\";\n\n/** PivotTable 命中结果。 */\nexport interface PivotHitTestResult {\n region: PivotHitRegion;\n headerCell?: PivotHeaderCellLayout;\n reportFilterCell?: PivotReportFilterCellLayout;\n bodyCell?: PivotBodyCellLayout;\n onExpandIcon: boolean;\n onFilterIcon: boolean;\n onSortIcon: boolean;\n}\n\n/** 在当前布局快照中执行四区命中。 */\nexport function hitTestPivotLayout(\n layout: PivotLayoutSnapshot,\n x: number,\n y: number,\n): PivotHitTestResult | null {\n const reportFilterCell = layout.reportFilterCells.find((cell) =>\n contains(cell.rect, x, y),\n );\n if (reportFilterCell) {\n return {\n region: \"reportFilter\",\n reportFilterCell,\n onExpandIcon: false,\n onFilterIcon: contains(reportFilterCell.valueRect, x, y),\n onSortIcon: false,\n };\n }\n const bodyCell = layout.bodyCells.find((cell) => contains(cell.rect, x, y));\n if (bodyCell) {\n return {\n region: \"body\",\n bodyCell,\n onExpandIcon: false,\n onFilterIcon: false,\n onSortIcon: false,\n };\n }\n const rowHeaderCell = layout.rowHeaderCells.find((cell) =>\n contains(cell.rect, x, y),\n );\n if (rowHeaderCell) {\n return {\n region: \"rowHeader\",\n headerCell: rowHeaderCell,\n onExpandIcon: rowHeaderCell.expandable && x <= rowHeaderCell.rect.x + 28,\n onFilterIcon:\n rowHeaderCell.filterable &&\n x >= rowHeaderCell.rect.x + rowHeaderCell.rect.width - 28,\n onSortIcon: isSortIconHit(rowHeaderCell, x),\n };\n }\n const columnHeaderCell = layout.columnHeaderCells.find((cell) =>\n contains(cell.rect, x, y),\n );\n if (columnHeaderCell) {\n return {\n region: \"columnHeader\",\n headerCell: columnHeaderCell,\n onExpandIcon:\n columnHeaderCell.expandable && x <= columnHeaderCell.rect.x + 28,\n onFilterIcon:\n columnHeaderCell.filterable &&\n x >= columnHeaderCell.rect.x + columnHeaderCell.rect.width - 28,\n onSortIcon: isSortIconHit(columnHeaderCell, x),\n };\n }\n const rowFieldHeaderCell = layout.rowFieldHeaderCells.find((cell) =>\n contains(cell.rect, x, y),\n );\n if (rowFieldHeaderCell) {\n return {\n region: \"corner\",\n headerCell: rowFieldHeaderCell,\n onExpandIcon: false,\n onFilterIcon:\n rowFieldHeaderCell.filterable &&\n x >= rowFieldHeaderCell.rect.x + rowFieldHeaderCell.rect.width - 28,\n onSortIcon: isSortIconHit(rowFieldHeaderCell, x),\n };\n }\n if (contains(layout.cornerRect, x, y)) {\n return {\n region: \"corner\",\n onExpandIcon: false,\n onFilterIcon: false,\n onSortIcon: false,\n };\n }\n return null;\n}\n\nfunction isSortIconHit(cell: PivotHeaderCellLayout, x: number) {\n if (!cell.sortable) return false;\n const rightOffset = cell.filterable ? 28 : 0;\n const right = cell.rect.x + cell.rect.width - rightOffset;\n return x >= right - 28 && x < right;\n}\n\nfunction contains(\n rect: { x: number; y: number; width: number; height: number },\n x: number,\n y: number,\n) {\n return (\n x >= rect.x &&\n x < rect.x + rect.width &&\n y >= rect.y &&\n y < rect.y + rect.height\n );\n}\n","import type { PivotModel } from \"../../domain/pivot/pivot-model\";\nimport { createPivotCellKey } from \"../../domain/pivot/pivot-cell\";\nimport type { PivotLayoutSnapshot } from \"../../domain/layout/types\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../../schema/state\";\n\n/** 根据当前单元格、行节点或列节点选区生成剪贴板文本。 */\nexport function createPivotSelectionText<RecordType>(params: {\n layout: PivotLayoutSnapshot;\n model: PivotModel<RecordType>;\n selection: PivotSelectionState;\n}) {\n const activeNode = params.selection.activeNode;\n if (activeNode) {\n return createNodeSelectionText({ ...params, activeNode });\n }\n return createCellSelectionText(params);\n}\n\n/** 按指定的零基行列范围生成剪贴板 TSV 文本。 */\nexport function createPivotRangeSelectionText<RecordType>(params: {\n layout: PivotLayoutSnapshot;\n model: PivotModel<RecordType>;\n startRowIndex: number;\n endRowIndex: number;\n startColumnIndex: number;\n endColumnIndex: number;\n}) {\n const startRowIndex = Math.max(\n 0,\n Math.min(params.startRowIndex, params.endRowIndex),\n );\n const endRowIndex = Math.min(\n params.layout.rowSlots.length - 1,\n Math.max(params.startRowIndex, params.endRowIndex),\n );\n const startColumnIndex = Math.max(\n 0,\n Math.min(params.startColumnIndex, params.endColumnIndex),\n );\n const endColumnIndex = Math.min(\n params.layout.columnSlots.length - 1,\n Math.max(params.startColumnIndex, params.endColumnIndex),\n );\n if (startRowIndex > endRowIndex || startColumnIndex > endColumnIndex) {\n return \"\";\n }\n const lines: string[] = [];\n for (let rowIndex = startRowIndex; rowIndex <= endRowIndex; rowIndex += 1) {\n const rowSlot = params.layout.rowSlots[rowIndex];\n if (!rowSlot) continue;\n const values: string[] = [];\n for (\n let columnIndex = startColumnIndex;\n columnIndex <= endColumnIndex;\n columnIndex += 1\n ) {\n const columnSlot = params.layout.columnSlots[columnIndex];\n if (columnSlot) {\n values.push(resolveCellText(params.model, rowSlot, columnSlot));\n }\n }\n lines.push(values.join(\"\\t\"));\n }\n return lines.join(\"\\n\");\n}\n\n/** 将当前单元格选区转换为零基行列范围。 */\nexport function resolvePivotSelectionRange(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState,\n) {\n const range = selection.ranges[0];\n if (!range) return null;\n const start = resolveAddressIndexes(layout, range.start);\n const end = resolveAddressIndexes(layout, range.end);\n if (!start || !end) return null;\n return {\n startRowIndex: Math.min(start.rowIndex, end.rowIndex),\n endRowIndex: Math.max(start.rowIndex, end.rowIndex),\n startColumnIndex: Math.min(start.columnIndex, end.columnIndex),\n endColumnIndex: Math.max(start.columnIndex, end.columnIndex),\n };\n}\n\nfunction createNodeSelectionText<RecordType>(params: {\n layout: PivotLayoutSnapshot;\n model: PivotModel<RecordType>;\n selection: PivotSelectionState;\n activeNode: NonNullable<PivotSelectionState[\"activeNode\"]>;\n}) {\n const nodeMap =\n params.activeNode.axis === \"row\"\n ? params.model.rowNodes\n : params.model.columnNodes;\n const node = nodeMap.get(params.activeNode.nodeId);\n if (!node) return \"\";\n\n if (params.activeNode.axis === \"row\") {\n return params.layout.rowSlots\n .filter((slot) => isPathRelated(node.pathKey, slot.pathKey))\n .flatMap((rowSlot) =>\n params.layout.columnSlots.map((columnSlot) =>\n resolveCellText(params.model, rowSlot, columnSlot),\n ),\n )\n .join(\" \");\n }\n\n const columnSlots = params.layout.columnSlots.filter((slot) =>\n isPathRelated(node.pathKey, slot.pathKey),\n );\n return params.layout.rowSlots\n .map((rowSlot) =>\n columnSlots\n .map((columnSlot) => resolveCellText(params.model, rowSlot, columnSlot))\n .join(\" \"),\n )\n .join(\"\\n\");\n}\n\nfunction createCellSelectionText<RecordType>(params: {\n layout: PivotLayoutSnapshot;\n model: PivotModel<RecordType>;\n selection: PivotSelectionState;\n}) {\n const range = resolvePivotSelectionRange(params.layout, params.selection);\n if (!range) return \"\";\n return createPivotRangeSelectionText({ ...params, ...range });\n}\n\nfunction resolveCellText<RecordType>(\n model: PivotModel<RecordType>,\n rowSlot: PivotLayoutSnapshot[\"rowSlots\"][number],\n columnSlot: PivotLayoutSnapshot[\"columnSlots\"][number],\n) {\n const indicatorKey = rowSlot.indicatorKey ?? columnSlot.indicatorKey;\n if (!indicatorKey) return \"\";\n return (\n model.cells.get(\n createPivotCellKey(rowSlot.pathKey, columnSlot.pathKey, indicatorKey),\n )?.formattedValue ?? \"\"\n );\n}\n\nfunction resolveAddressIndexes(\n layout: PivotLayoutSnapshot,\n address: PivotCellAddress,\n) {\n const rowIndex = layout.rowSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.rowNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n const columnIndex = layout.columnSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.columnNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n return rowIndex >= 0 && columnIndex >= 0 ? { rowIndex, columnIndex } : null;\n}\n\nfunction isPathRelated(firstPathKey: string, secondPathKey: string) {\n try {\n const first = JSON.parse(firstPathKey) as unknown;\n const second = JSON.parse(secondPathKey) as unknown;\n if (!Array.isArray(first) || !Array.isArray(second)) {\n return firstPathKey === secondPathKey;\n }\n return isPathPrefix(first, second) || isPathPrefix(second, first);\n } catch {\n return firstPathKey === secondPathKey;\n }\n}\n\nfunction isPathPrefix(parent: unknown[], child: unknown[]) {\n return (\n parent.length <= child.length &&\n parent.every((value, index) => Object.is(value, child[index]))\n );\n}\n","import type { PivotLayoutSnapshot } from \"../layout/types\";\n\n/** PivotTable 表头宽度调整命中。 */\nexport type PivotResizeHit =\n | { kind: \"rowDimension\"; index: number }\n | { kind: \"valueColumn\"; index: number };\n\n/** 命中行维度或值列的宽度调整边界。 */\nexport function hitTestPivotResize(\n layout: PivotLayoutSnapshot,\n x: number,\n y: number,\n tolerance = 4,\n): PivotResizeHit | null {\n if (x <= layout.rowHeaderWidth) {\n let boundary = 0;\n for (let index = 0; index < layout.rowDimensionWidths.length; index += 1) {\n boundary += layout.rowDimensionWidths[index] ?? 0;\n if (Math.abs(x - boundary) <= tolerance) {\n return { kind: \"rowDimension\", index };\n }\n }\n }\n if (\n y >= layout.reportFilterHeight &&\n y <= layout.reportFilterHeight + layout.columnHeaderHeight &&\n x >= layout.rowHeaderWidth\n ) {\n const relative = x - layout.rowHeaderWidth + layout.scroll.left;\n for (let index = 1; index < layout.columnOffsets.length; index += 1) {\n const boundary = layout.columnOffsets[index] ?? 0;\n if (Math.abs(relative - boundary) <= tolerance) {\n return { kind: \"valueColumn\", index: index - 1 };\n }\n }\n }\n return null;\n}\n","import { isPointInRect } from \"@canvas-components/utils\";\nimport type {\n PivotAxisScrollbarLayout,\n PivotScrollbarAxis,\n PivotScrollbarLayout,\n PivotScrollbarRole,\n} from \"../layout/scrollbar-types\";\n\n/** 命中 PivotTable Canvas 滚动条。 */\nexport function hitTestPivotScrollbar(\n layout: PivotScrollbarLayout,\n x: number,\n y: number,\n): { axis: PivotScrollbarAxis; role: PivotScrollbarRole } | null {\n for (const axis of [\"horizontal\", \"vertical\"] as const) {\n const axisLayout = layout[axis];\n if (!axisLayout) continue;\n const role = resolveRole(axisLayout, x, y);\n if (role) return { axis, role };\n }\n return null;\n}\n\nfunction resolveRole(\n layout: PivotAxisScrollbarLayout,\n x: number,\n y: number,\n): PivotScrollbarRole | null {\n if (isPointInRect(x, y, layout.thumb)) return \"thumb\";\n if (isPointInRect(x, y, layout.decreaseButton)) return \"decrease-button\";\n if (isPointInRect(x, y, layout.increaseButton)) return \"increase-button\";\n if (isPointInRect(x, y, layout.track)) return \"track\";\n return null;\n}\n","import type {\n PivotHeaderCellLayout,\n PivotLayoutSnapshot,\n} from \"../layout/types\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../../schema/state\";\n\n/** 根据指标列表头创建覆盖全部可见行的精确列选区。 */\nexport function createPivotValueColumnSelection(\n layout: PivotLayoutSnapshot,\n header: PivotHeaderCellLayout,\n): PivotSelectionState | null {\n if (header.axis !== \"column\" || !header.indicatorKey) return null;\n const columnSlot = layout.columnSlots.find(\n (slot) =>\n slot.pathKey === header.pathKey &&\n slot.indicatorKey === header.indicatorKey,\n );\n const firstRow = layout.rowSlots[0];\n const lastRow = layout.rowSlots[layout.rowSlots.length - 1];\n const indicatorKey = columnSlot?.indicatorKey;\n if (!columnSlot || !firstRow || !lastRow || !indicatorKey) return null;\n const start = createAddress(firstRow, columnSlot, indicatorKey);\n const end = createAddress(lastRow, columnSlot, indicatorKey);\n return {\n activeCell: start,\n anchorCell: start,\n ranges: [{ start, end, kind: \"column\" }],\n activeNode: null,\n };\n}\n\nfunction createAddress(\n rowSlot: PivotLayoutSnapshot[\"rowSlots\"][number],\n columnSlot: PivotLayoutSnapshot[\"columnSlots\"][number],\n indicatorKey: string,\n): PivotCellAddress {\n return {\n rowNodeId: rowSlot.nodeId ?? \"\",\n columnNodeId: columnSlot.nodeId ?? \"\",\n indicatorKey,\n };\n}\n","import type { PivotLayoutSnapshot } from \"../layout/types\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../../schema/state\";\n\n/** 根据表体纵坐标解析稳定的行槽索引。 */\nexport function resolvePivotRowIndexAtY(\n layout: PivotLayoutSnapshot,\n y: number,\n) {\n if (layout.rowSlots.length === 0 || layout.rowHeight <= 0) return null;\n const index = Math.floor(\n (y - layout.bodyRect.y + layout.scroll.top) / layout.rowHeight,\n );\n return Math.min(Math.max(index, 0), layout.rowSlots.length - 1);\n}\n\n/** 创建从行头覆盖到指定值列的选区;未指定值列时覆盖整行。 */\nexport function createPivotRowRangeSelection(\n layout: PivotLayoutSnapshot,\n startRowIndex: number,\n endRowIndex: number,\n endColumnIndex?: number,\n): PivotSelectionState | null {\n const startRow = layout.rowSlots[startRowIndex];\n const endRow = layout.rowSlots[endRowIndex];\n const firstColumn = layout.columnSlots[0];\n const lastColumn =\n layout.columnSlots[endColumnIndex ?? layout.columnSlots.length - 1];\n if (!startRow || !endRow || !firstColumn || !lastColumn) return null;\n const start = createAddress(startRow, firstColumn);\n const end = createAddress(endRow, lastColumn);\n if (!start || !end) return null;\n return {\n activeCell: end,\n anchorCell: start,\n ranges: [{ start, end, kind: endColumnIndex == null ? \"row\" : \"row-cell\" }],\n activeNode: null,\n };\n}\n\nfunction createAddress(\n rowSlot: PivotLayoutSnapshot[\"rowSlots\"][number],\n columnSlot: PivotLayoutSnapshot[\"columnSlots\"][number],\n): PivotCellAddress | null {\n const indicatorKey = rowSlot.indicatorKey ?? columnSlot.indicatorKey;\n if (!indicatorKey) return null;\n return {\n rowNodeId: rowSlot.nodeId ?? \"\",\n columnNodeId: columnSlot.nodeId ?? \"\",\n indicatorKey,\n };\n}\n","export interface PivotScrollPosition {\n left: number;\n top: number;\n}\n\nconst DELTA_MODE_PIXEL = 0;\nconst DELTA_MODE_LINE = 1;\nconst DELTA_MODE_PAGE = 2;\n\n/** 将滚轮事件转换为 PivotTable 布局像素,并柔化离散鼠标步进。 */\nexport function resolvePivotWheelScrollDelta(params: {\n deltaX: number;\n deltaY: number;\n deltaMode: number;\n shiftKey: boolean;\n lineHeight: number;\n pageWidth: number;\n pageHeight: number;\n}) {\n const rawX = softenWheelDelta({\n delta: normalizeWheelDelta(\n params.deltaX,\n params.deltaMode,\n params.lineHeight,\n params.pageWidth,\n ),\n deltaMode: params.deltaMode,\n lineHeight: params.lineHeight,\n });\n const rawY = softenWheelDelta({\n delta: normalizeWheelDelta(\n params.deltaY,\n params.deltaMode,\n params.lineHeight,\n params.pageHeight,\n ),\n deltaMode: params.deltaMode,\n lineHeight: params.lineHeight,\n });\n return params.shiftKey\n ? { left: rawX + rawY, top: 0 }\n : { left: rawX, top: rawY };\n}\n\n/** 判断是否为应立即跟手的触控板像素流。 */\nexport function shouldApplyPivotWheelDeltaImmediately(params: {\n deltaX: number;\n deltaY: number;\n deltaMode: number;\n}) {\n return (\n params.deltaMode === DELTA_MODE_PIXEL &&\n Math.abs(params.deltaX) < 40 &&\n Math.abs(params.deltaY) < 40\n );\n}\n\n/** 计算平滑滚轮动画的下一帧位置。 */\nexport function advancePivotWheelScrollSmoothing(params: {\n current: PivotScrollPosition;\n target: PivotScrollPosition;\n deltaMs: number;\n timeConstantMs?: number;\n}) {\n const timeConstant = Math.max(params.timeConstantMs ?? 92, 1);\n const deltaMs = Math.max(Math.min(params.deltaMs, 64), 0);\n const alpha = 1 - Math.exp(-deltaMs / timeConstant);\n const nextLeft =\n params.current.left + (params.target.left - params.current.left) * alpha;\n const nextTop =\n params.current.top + (params.target.top - params.current.top) * alpha;\n const done =\n Math.abs(params.target.left - nextLeft) < 0.35 &&\n Math.abs(params.target.top - nextTop) < 0.35;\n return {\n nextScroll: done\n ? { ...params.target }\n : { left: nextLeft, top: nextTop },\n done,\n };\n}\n\nfunction normalizeWheelDelta(\n delta: number,\n deltaMode: number,\n lineHeight: number,\n pageSize: number,\n) {\n const value = Number.isFinite(delta) ? delta : 0;\n if (deltaMode === DELTA_MODE_LINE) {\n return value * Math.max(lineHeight, 1);\n }\n if (deltaMode === DELTA_MODE_PAGE) {\n return value * Math.max(pageSize, 1);\n }\n return value;\n}\n\nfunction softenWheelDelta(params: {\n delta: number;\n deltaMode: number;\n lineHeight: number;\n}) {\n const { delta } = params;\n if (delta === 0) return 0;\n const absolute = Math.abs(delta);\n const lineHeight = Math.max(params.lineHeight, 1);\n if (\n params.deltaMode === DELTA_MODE_PIXEL &&\n absolute >= 80 &&\n absolute <= 160\n ) {\n return delta * 0.42;\n }\n if (params.deltaMode === DELTA_MODE_LINE) {\n const maxStep = Math.max(lineHeight * 0.75, 24);\n return absolute <= maxStep\n ? delta * 0.72\n : Math.sign(delta) * (maxStep + (absolute - maxStep) * 0.35);\n }\n const threshold = Math.max(lineHeight * 1.25, 48);\n return absolute <= threshold\n ? delta\n : Math.sign(delta) * (threshold + (absolute - threshold) * 0.4);\n}\n","import { clamp } from \"@canvas-components/utils\";\nimport { PivotTableCore } from \"./engine/pivot-table-engine\";\nimport type { PivotTableOptions } from \"./schema/options\";\nimport { createPivotDomHost, type PivotDomHost } from \"./adapters/dom-host\";\nimport {\n copyPivotClipboardTextSync,\n logPivotClipboard,\n writePivotClipboardText,\n} from \"./adapters/clipboard\";\nimport { resizePivotCanvas } from \"./adapters/canvas-host\";\nimport {\n renderPivotTable,\n type PivotRenderStats,\n} from \"./rendering/canvas-renderer\";\nimport type { PivotLayoutSnapshot } from \"./domain/layout/types\";\nimport {\n hitTestPivotLayout,\n type PivotHitTestResult,\n} from \"./domain/interaction/hit-test\";\nimport type { PivotCellAddress, PivotSelectionState } from \"./schema/state\";\nimport type { PivotAxis, PivotFilterAxis } from \"./schema/events\";\nimport type { PivotDimensionFilter } from \"./schema/state\";\nimport {\n createPivotRangeSelectionText,\n createPivotSelectionText,\n resolvePivotSelectionRange,\n} from \"./features/clipboard/pivot-selection-copy\";\nimport {\n hitTestPivotResize,\n type PivotResizeHit,\n} from \"./domain/interaction/resize-hit\";\nimport {\n exportPivotMatrixToCsv,\n exportPivotMatrixToXlsx,\n type PivotExportOptions,\n} from \"./features/export/pivot-export\";\nimport type { PivotTableStateSnapshot } from \"./schema/persistence\";\nimport { hitTestPivotScrollbar } from \"./domain/interaction/scrollbar-hit\";\nimport type { PivotScrollbarAxis } from \"./domain/layout/scrollbar-types\";\nimport { createPivotValueColumnSelection } from \"./domain/interaction/column-selection\";\nimport {\n createPivotRowRangeSelection,\n resolvePivotRowIndexAtY,\n} from \"./domain/interaction/row-selection\";\nimport {\n advancePivotWheelScrollSmoothing,\n resolvePivotWheelScrollDelta,\n shouldApplyPivotWheelDeltaImmediately,\n type PivotScrollPosition,\n} from \"./domain/scroll/scroll-transition\";\nimport {\n resolvePivotDimensionKey,\n resolvePivotDimensionTitle,\n} from \"./domain/data/dimension-config\";\n\n/** PivotTable 原生实例入口。 */\nexport class PivotTable<RecordType = Record<string, unknown>> {\n private readonly container: HTMLElement;\n private options: PivotTableOptions<RecordType>;\n private core: PivotTableCore<RecordType> | null = null;\n private host: PivotDomHost | null = null;\n private stopResizeObserver: (() => void) | null = null;\n private frameId: number | null = null;\n private width = 0;\n private height = 0;\n private layout: PivotLayoutSnapshot | null = null;\n private renderStats: PivotRenderStats | null = null;\n private hoverCell: PivotCellAddress | null = null;\n private tooltipText: string | null = null;\n private scroll = { left: 0, top: 0 };\n private wheelScrollTarget: PivotScrollPosition | null = null;\n private wheelScrollFrameId: number | null = null;\n private wheelScrollLastTime = 0;\n private resizeSession: {\n hit: PivotResizeHit;\n pointerId: number;\n startX: number;\n startWidth: number;\n } | null = null;\n private resizeGuideX: number | null = null;\n private suppressNextClick = false;\n private scrollbarDrag: {\n axis: PivotScrollbarAxis;\n pointerId: number;\n pointerOffset: number;\n trackStart: number;\n trackLength: number;\n thumbLength: number;\n } | null = null;\n private cellSelectionDrag: {\n pointerId: number;\n anchor: PivotCellAddress;\n lastAddress: PivotCellAddress;\n lastKind: \"cell\" | \"row-cell\";\n } | null = null;\n private rowHeaderSelectionDrag: {\n pointerId: number;\n startRowIndex: number;\n lastRowIndex: number;\n lastColumnIndex: number | null;\n startClientX: number;\n startClientY: number;\n dragged: boolean;\n } | null = null;\n\n constructor(container: HTMLElement, options: PivotTableOptions<RecordType>) {\n this.container = container;\n this.options = options;\n }\n\n /** 挂载 PivotTable。 */\n mount() {\n if (this.core) return;\n this.core = new PivotTableCore(this.options);\n this.host = createPivotDomHost(this.container);\n this.host.root.addEventListener(\"pointermove\", this.handlePointerMove);\n this.host.root.addEventListener(\"pointerleave\", this.handlePointerLeave);\n this.host.root.addEventListener(\"click\", this.handleClick);\n this.container.ownerDocument.addEventListener(\n \"keydown\",\n this.handleDocumentKeyDown,\n true,\n );\n this.host.root.addEventListener(\"copy\", this.handleCopy);\n this.host.root.addEventListener(\"wheel\", this.handleWheel, {\n passive: false,\n });\n this.host.root.addEventListener(\"contextmenu\", this.handleContextMenu);\n this.host.root.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.host.root.addEventListener(\"pointerup\", this.handlePointerUp);\n this.host.root.addEventListener(\"pointercancel\", this.handlePointerUp);\n this.stopResizeObserver = this.host.observeResize((width, height) => {\n this.width = width;\n this.height = height;\n this.scheduleRender();\n });\n this.container.dataset.pivotTableMounted = \"true\";\n }\n\n /** 更新 PivotTable 配置。 */\n updateOptions(options: PivotTableOptions<RecordType>) {\n this.options = options;\n this.core?.updateOptions(options);\n this.scheduleRender();\n }\n\n /** 获取当前数据透视模型。 */\n getPivotModel() {\n return this.core?.getPivotModel() ?? null;\n }\n\n /** 获取当前可见行轴节点。 */\n getVisibleRowNodes() {\n return this.core?.getVisibleRowNodes() ?? [];\n }\n\n /** 获取当前可见列轴节点。 */\n getVisibleColumnNodes() {\n return this.core?.getVisibleColumnNodes() ?? [];\n }\n\n /** 获取最近一次布局快照。 */\n getLayoutSnapshot() {\n return this.layout;\n }\n\n /** 获取最近一次绘制统计。 */\n getRenderStats() {\n return this.renderStats;\n }\n\n /** 获取核心调试快照。 */\n getDebugSnapshot() {\n return this.core?.getDebugSnapshot() ?? null;\n }\n\n /** 获取当前选区。 */\n getSelection() {\n return this.core?.getSelection() ?? null;\n }\n\n /** 设置完整选区状态。 */\n setSelection(selection: PivotSelectionState) {\n const next = this.core?.setSelection(selection) ?? null;\n if (next) this.scheduleRender();\n return next;\n }\n\n /** 获取当前过滤状态。 */\n getFilters() {\n return this.core?.getFilters() ?? null;\n }\n\n /** 获取当前排序规则。 */\n getSorts() {\n return this.core?.getSorts() ?? [];\n }\n\n /** 清除全部排序规则。 */\n resetSorters() {\n const sorts = this.core?.resetSorts() ?? [];\n this.scheduleRender();\n return sorts;\n }\n\n /** 设置指定维度排序。 */\n setDimensionSort(\n axis: PivotAxis,\n dimensionKey: string,\n direction: \"asc\" | \"desc\" | null,\n ) {\n const sorts =\n this.core?.setDimensionSort(axis, dimensionKey, direction) ?? [];\n this.scheduleRender();\n return sorts;\n }\n\n /** 按指标聚合结果设置维度排序。 */\n setIndicatorSort(\n params: Parameters<PivotTableCore<RecordType>[\"setIndicatorSort\"]>[0],\n ) {\n const sorts = this.core?.setIndicatorSort(params) ?? [];\n this.scheduleRender();\n return sorts;\n }\n\n /** 设置指定轴维度过滤。 */\n setDimensionFilter(\n axis: PivotFilterAxis,\n dimensionKey: string,\n filter: PivotDimensionFilter | null,\n ) {\n const filters =\n this.core?.setDimensionFilter(axis, dimensionKey, filter) ?? null;\n if (filters) this.scheduleRender();\n return filters;\n }\n\n /** 获取指定轴维度的过滤候选项。 */\n getDimensionFilterOptions(axis: PivotFilterAxis, dimensionKey: string) {\n return this.core?.getDimensionFilterOptions(axis, dimensionKey) ?? [];\n }\n\n /** 清除全部维度过滤。 */\n resetFilters() {\n const filters = this.core?.resetFilters() ?? null;\n if (filters) this.scheduleRender();\n return filters;\n }\n\n /** 导出当前可见透视结果 CSV。 */\n exportCsv(options: PivotExportOptions = {}) {\n const matrix = this.core?.createExportMatrix(options.mode);\n return matrix ? exportPivotMatrixToCsv(matrix) : \"\";\n }\n\n /** 导出当前可见透视结果 XLSX 字节。 */\n exportXlsx(options: PivotExportOptions = {}) {\n const matrix = this.core?.createExportMatrix(options.mode);\n return matrix\n ? exportPivotMatrixToXlsx(matrix, options.sheetName)\n : new Uint8Array();\n }\n\n /** 获取可序列化状态快照。 */\n getState(): PivotTableStateSnapshot | null {\n if (!this.core) return null;\n return this.core.createStateSnapshot({\n left: this.scroll.left,\n top: this.scroll.top,\n });\n }\n\n /** 恢复版本兼容的状态快照。 */\n restoreState(snapshot: PivotTableStateSnapshot) {\n const restored = this.core?.restoreStateSnapshot(snapshot) ?? false;\n if (!restored) return false;\n this.stopWheelScrollSmoothing();\n this.scroll = { ...snapshot.scroll };\n this.scheduleRender();\n return true;\n }\n\n /** 选中指定值单元格。 */\n selectCell(address: PivotCellAddress, extend = false) {\n const selection = this.core?.selectCell(address, extend) ?? null;\n if (selection) {\n this.scrollToCell(address);\n this.scheduleRender();\n }\n return selection;\n }\n\n /** 选中行轴或列轴维度节点。 */\n selectNode(axis: PivotAxis, nodeId: string) {\n const selection = this.core?.selectNode(axis, nodeId) ?? null;\n if (selection) this.scheduleRender();\n return selection;\n }\n\n /** 将指定稳定地址滚动到可视区域。 */\n scrollToCell(address: PivotCellAddress) {\n if (!this.layout || !this.host) return false;\n this.stopWheelScrollSmoothing();\n const rowIndex = this.layout.rowSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.rowNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n const columnIndex = this.layout.columnSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.columnNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n if (rowIndex < 0 || columnIndex < 0) return false;\n const top = resolveVisibleOffset({\n current: this.scroll.top,\n itemStart: rowIndex * this.layout.rowHeight,\n itemSize: this.layout.rowHeight,\n viewportSize: this.layout.bodyRect.height,\n });\n const left = resolveVisibleOffset({\n current: this.scroll.left,\n itemStart: this.layout.columnOffsets[columnIndex] ?? 0,\n itemSize:\n this.layout.columnWidths[columnIndex] ?? this.layout.columnWidth,\n viewportSize: this.layout.bodyRect.width,\n });\n this.applyScrollPosition(left, top);\n return true;\n }\n\n /** 设置行轴节点展开状态。 */\n setRowNodeExpanded(nodeId: string, expanded: boolean) {\n const changed =\n this.core?.setNodeExpanded(\"row\", nodeId, expanded) ?? false;\n if (changed) this.scheduleRender();\n return changed;\n }\n\n /** 展开行轴节点。 */\n expandRowNode(nodeId: string) {\n return this.setRowNodeExpanded(nodeId, true);\n }\n\n /** 收起行轴节点。 */\n collapseRowNode(nodeId: string) {\n return this.setRowNodeExpanded(nodeId, false);\n }\n\n /** 设置列轴节点展开状态。 */\n setColumnNodeExpanded(nodeId: string, expanded: boolean) {\n const changed =\n this.core?.setNodeExpanded(\"column\", nodeId, expanded) ?? false;\n if (changed) this.scheduleRender();\n return changed;\n }\n\n /** 展开列轴节点。 */\n expandColumnNode(nodeId: string) {\n return this.setColumnNodeExpanded(nodeId, true);\n }\n\n /** 收起列轴节点。 */\n collapseColumnNode(nodeId: string) {\n return this.setColumnNodeExpanded(nodeId, false);\n }\n\n /** 展开指定范围内的全部维度节点。 */\n expandAll(axis: PivotAxis | \"both\" = \"both\") {\n const count =\n (axis === \"column\"\n ? 0\n : (this.core?.setAllNodesExpanded(\"row\", true) ?? 0)) +\n (axis === \"row\"\n ? 0\n : (this.core?.setAllNodesExpanded(\"column\", true) ?? 0));\n if (count > 0) this.scheduleRender();\n return count;\n }\n\n /** 收起指定范围内的全部维度节点。 */\n collapseAll(axis: PivotAxis | \"both\" = \"both\") {\n const count =\n (axis === \"column\"\n ? 0\n : (this.core?.setAllNodesExpanded(\"row\", false) ?? 0)) +\n (axis === \"row\"\n ? 0\n : (this.core?.setAllNodesExpanded(\"column\", false) ?? 0));\n if (count > 0) this.scheduleRender();\n return count;\n }\n\n /** 获取稳定地址对应的聚合值。 */\n getCellValue(address: PivotCellAddress) {\n return this.core?.getCellValue(address);\n }\n\n /** 获取指定聚合单元格对应的原始记录。 */\n getCellRecords(params: {\n rowPathKey: string;\n columnPathKey: string;\n indicatorKey: string;\n }) {\n return this.core?.getCellRecords(params) ?? [];\n }\n\n /** 销毁 PivotTable。 */\n destroy() {\n if (this.frameId !== null) cancelAnimationFrame(this.frameId);\n this.frameId = null;\n this.stopWheelScrollSmoothing();\n this.stopResizeObserver?.();\n this.stopResizeObserver = null;\n this.host?.root.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.host?.root.removeEventListener(\n \"pointerleave\",\n this.handlePointerLeave,\n );\n this.host?.root.removeEventListener(\"click\", this.handleClick);\n this.container.ownerDocument.removeEventListener(\n \"keydown\",\n this.handleDocumentKeyDown,\n true,\n );\n this.host?.root.removeEventListener(\"copy\", this.handleCopy);\n this.host?.root.removeEventListener(\"wheel\", this.handleWheel);\n this.host?.root.removeEventListener(\"contextmenu\", this.handleContextMenu);\n this.host?.root.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.host?.root.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.host?.root.removeEventListener(\"pointercancel\", this.handlePointerUp);\n this.cellSelectionDrag = null;\n this.rowHeaderSelectionDrag = null;\n this.resizeGuideX = null;\n this.host?.destroy();\n this.host = null;\n this.core?.destroy();\n this.core = null;\n this.layout = null;\n this.renderStats = null;\n this.hoverCell = null;\n delete this.container.dataset.pivotTableMounted;\n }\n\n private readonly handlePointerMove = (event: PointerEvent) => {\n if (this.scrollbarDrag) {\n this.updateScrollbarDrag(event);\n return;\n }\n if (this.resizeSession) {\n if (this.host && this.layout) {\n const rootRect = this.host.root.getBoundingClientRect();\n this.resizeGuideX = clamp(\n event.clientX - rootRect.left,\n 0,\n this.layout.tableWidth,\n );\n }\n this.applyResize(event.clientX - this.resizeSession.startX);\n this.suppressNextClick = true;\n return;\n }\n if (this.cellSelectionDrag?.pointerId === event.pointerId) {\n this.updateCellSelectionDrag(event);\n return;\n }\n if (this.rowHeaderSelectionDrag?.pointerId === event.pointerId) {\n this.updateRowHeaderSelectionDrag(event);\n return;\n }\n const scrollbarHit = this.resolveScrollbarHit(event);\n const resizeHit = scrollbarHit ? null : this.resolveResizeHit(event);\n if (this.host) {\n this.host.root.style.cursor = scrollbarHit\n ? scrollbarHit.role === \"thumb\"\n ? \"grab\"\n : \"pointer\"\n : resizeHit\n ? \"col-resize\"\n : \"\";\n }\n if (scrollbarHit) {\n if (this.tooltipText) this.options.ui?.onTooltipRequest?.(null);\n this.tooltipText = null;\n if (this.hoverCell) {\n this.hoverCell = null;\n this.scheduleRender();\n }\n return;\n }\n const hit = this.resolveHit(event);\n this.updateTooltip(hit, event);\n const hoverCell = hit?.bodyCell ? toCellAddress(hit.bodyCell) : null;\n if (isSameAddress(this.hoverCell, hoverCell)) return;\n this.hoverCell = hoverCell;\n this.scheduleRender();\n };\n\n private readonly handlePointerLeave = () => {\n if (\n this.host &&\n !this.resizeSession &&\n !this.scrollbarDrag &&\n !this.cellSelectionDrag &&\n !this.rowHeaderSelectionDrag\n ) {\n this.host.root.style.cursor = \"\";\n }\n if (!this.hoverCell) return;\n this.hoverCell = null;\n this.tooltipText = null;\n this.options.ui?.onTooltipRequest?.(null);\n this.scheduleRender();\n };\n\n private readonly handleClick = (event: MouseEvent) => {\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n return;\n }\n const hit = this.resolveHit(event);\n if (!hit) return;\n this.host?.root.focus({ preventScroll: true });\n if (hit.reportFilterCell && hit.onFilterIcon) {\n this.openReportFilterPanel(hit.reportFilterCell);\n return;\n }\n if (hit.bodyCell) {\n this.selectCell(toCellAddress(hit.bodyCell), event.shiftKey);\n return;\n }\n const header = hit.headerCell;\n if (header && hit.onFilterIcon) {\n this.openFilterPanel(hit);\n return;\n }\n if (header && hit.onSortIcon) {\n const axis = header.axis;\n const model = this.core?.getPivotModel();\n const node = header.nodeId\n ? (axis === \"row\" ? model?.rowNodes : model?.columnNodes)?.get(\n header.nodeId,\n )\n : undefined;\n const dimensionKey = header.dimensionKey ?? node?.dimensionKey;\n if (!dimensionKey) return;\n const current = this.core\n ?.getSorts()\n .find(\n (item) => item.axis === axis && item.dimensionKey === dimensionKey,\n )?.direction;\n this.setDimensionSort(\n axis,\n dimensionKey,\n current === \"asc\" ? \"desc\" : current === \"desc\" ? null : \"asc\",\n );\n return;\n }\n if (\n hit.region === \"columnHeader\" &&\n header?.indicatorKey &&\n this.selectValueColumn(header)\n ) {\n return;\n }\n if (!header?.nodeId) return;\n const axis = hit.region === \"rowHeader\" ? \"row\" : \"column\";\n if (!hit.onExpandIcon) {\n this.selectNode(axis, header.nodeId);\n return;\n }\n const expanded = this.core?.isNodeExpanded(axis, header.nodeId) ?? false;\n this.core?.setNodeExpanded(axis, header.nodeId, !expanded);\n this.scheduleRender();\n return;\n };\n\n private readonly handleDocumentKeyDown = (event: KeyboardEvent) => {\n const root = this.host?.root;\n const activeElement = this.container.ownerDocument.activeElement;\n const belongsToTable = Boolean(\n root &&\n (activeElement === root ||\n (activeElement instanceof Element && root.contains(activeElement))),\n );\n const isCopyShortcut =\n (event.ctrlKey || event.metaKey) &&\n !event.altKey &&\n (event.key.toLocaleLowerCase() === \"c\" || event.code === \"KeyC\");\n if (isCopyShortcut) {\n logPivotClipboard(\"keydown-captured\", {\n belongsToTable,\n key: event.key,\n code: event.code,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n defaultPrevented: event.defaultPrevented,\n activeElement: describeElement(activeElement),\n eventTarget: describeElement(event.target),\n protocol: this.container.ownerDocument.location?.protocol ?? \"unknown\",\n isSecureContext:\n this.container.ownerDocument.defaultView?.isSecureContext ?? false,\n });\n }\n if (!belongsToTable) return;\n if (isCopyShortcut) {\n const text = this.createSelectionTsv();\n const selection = this.core?.getSelection() ?? null;\n logPivotClipboard(\"selection-resolved\", {\n hasLayout: Boolean(this.layout),\n selection,\n textLength: text.length,\n textPreview: text.slice(0, 120),\n });\n if (!text) {\n logPivotClipboard(\"copy-aborted\", { reason: \"empty-selection-text\" });\n return;\n }\n event.preventDefault();\n const copied = copyPivotClipboardTextSync(\n text,\n this.container.ownerDocument,\n );\n if (!copied) {\n void writePivotClipboardText(text, this.container.ownerDocument).then(\n (fallbackCopied) =>\n logPivotClipboard(\"fallback-complete\", {\n copied: fallbackCopied,\n }),\n );\n }\n return;\n }\n const direction = resolveNavigationDirection(event.key);\n if (!direction || !this.layout || !this.core) return;\n const active = this.core.getSelection().activeCell;\n if (!active) return;\n const next = resolveAdjacentAddress(this.layout, active, direction);\n if (!next) return;\n event.preventDefault();\n this.selectCell(next, event.shiftKey);\n };\n\n private readonly handleCopy = (event: ClipboardEvent) => {\n const text = this.createSelectionTsv();\n logPivotClipboard(\"copy-event\", {\n textLength: text.length,\n hasClipboardData: Boolean(event.clipboardData),\n });\n if (!text) return;\n event.preventDefault();\n event.clipboardData?.setData(\"text/plain\", text);\n };\n\n private readonly handleWheel = (event: WheelEvent) => {\n if (!this.layout) return;\n const delta = resolvePivotWheelScrollDelta({\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n shiftKey: event.shiftKey,\n lineHeight: this.layout.rowHeight,\n pageWidth: this.layout.bodyRect.width,\n pageHeight: this.layout.bodyRect.height,\n });\n if (delta.left === 0 && delta.top === 0) return;\n const base = this.wheelScrollTarget ?? this.scroll;\n const target = {\n left: clamp(\n base.left + delta.left,\n 0,\n this.layout.viewport.maxScrollLeft,\n ),\n top: clamp(base.top + delta.top, 0, this.layout.viewport.maxScrollTop),\n };\n if (target.left === base.left && target.top === base.top) return;\n event.preventDefault();\n if (\n shouldApplyPivotWheelDeltaImmediately({\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n })\n ) {\n this.stopWheelScrollSmoothing();\n this.applyScrollPosition(target.left, target.top);\n return;\n }\n this.startWheelScrollSmoothing(target);\n };\n\n private startWheelScrollSmoothing(target: PivotScrollPosition) {\n this.wheelScrollTarget = target;\n if (this.wheelScrollFrameId !== null) return;\n this.wheelScrollLastTime = performance.now();\n this.wheelScrollFrameId = requestAnimationFrame((time) => {\n this.advanceWheelScrollSmoothing(time);\n });\n }\n\n private stopWheelScrollSmoothing() {\n if (this.wheelScrollFrameId !== null) {\n cancelAnimationFrame(this.wheelScrollFrameId);\n this.wheelScrollFrameId = null;\n }\n this.wheelScrollTarget = null;\n this.wheelScrollLastTime = 0;\n }\n\n private advanceWheelScrollSmoothing(time: number) {\n this.wheelScrollFrameId = null;\n const target = this.wheelScrollTarget;\n if (!target) return;\n const now = time > 0 ? time : this.wheelScrollLastTime + 16;\n const { nextScroll, done } = advancePivotWheelScrollSmoothing({\n current: this.scroll,\n target,\n deltaMs: now - this.wheelScrollLastTime,\n });\n this.wheelScrollLastTime = now;\n this.applyScrollPosition(nextScroll.left, nextScroll.top);\n if (done) {\n this.wheelScrollTarget = null;\n return;\n }\n this.wheelScrollFrameId = requestAnimationFrame((nextTime) => {\n this.advanceWheelScrollSmoothing(nextTime);\n });\n }\n\n private readonly handleContextMenu = (event: MouseEvent) => {\n const hit = this.resolveHit(event);\n if (!hit?.bodyCell || !this.core || !this.layout) return;\n event.preventDefault();\n const address = toCellAddress(hit.bodyCell);\n const currentRange = resolvePivotSelectionRange(\n this.layout,\n this.core.getSelection(),\n );\n const insideCurrentRange = Boolean(\n currentRange &&\n hit.bodyCell.rowIndex >= currentRange.startRowIndex &&\n hit.bodyCell.rowIndex <= currentRange.endRowIndex &&\n hit.bodyCell.columnIndex >= currentRange.startColumnIndex &&\n hit.bodyCell.columnIndex <= currentRange.endColumnIndex,\n );\n if (!insideCurrentRange) this.selectCell(address);\n const selectionRange = resolvePivotSelectionRange(\n this.layout,\n this.core.getSelection(),\n );\n const records = this.core.getCellRecords({\n rowPathKey: hit.bodyCell.rowPathKey,\n columnPathKey: hit.bodyCell.columnPathKey,\n indicatorKey: hit.bodyCell.indicatorKey,\n });\n this.options.ui?.onContextMenuRequest?.({\n x: event.clientX,\n y: event.clientY,\n recordCount: records.length,\n onCopy: () => {\n const model = this.core?.getPivotModel();\n const text = model\n ? createPivotRangeSelectionText({\n layout: this.layout!,\n model,\n startRowIndex: hit.bodyCell!.rowIndex,\n endRowIndex: hit.bodyCell!.rowIndex,\n startColumnIndex: hit.bodyCell!.columnIndex,\n endColumnIndex: hit.bodyCell!.columnIndex,\n })\n : \"\";\n if (text) {\n void writePivotClipboardText(text, this.container.ownerDocument);\n }\n },\n onCopySelection: selectionRange\n ? () => {\n const text = this.createSelectionTsv();\n if (text) {\n void writePivotClipboardText(text, this.container.ownerDocument);\n }\n }\n : undefined,\n customSelection: {\n startRow: (selectionRange?.startRowIndex ?? hit.bodyCell.rowIndex) + 1,\n startColumn:\n (selectionRange?.startColumnIndex ?? hit.bodyCell.columnIndex) + 1,\n endRow: (selectionRange?.endRowIndex ?? hit.bodyCell.rowIndex) + 1,\n endColumn:\n (selectionRange?.endColumnIndex ?? hit.bodyCell.columnIndex) + 1,\n rowCount: this.layout.rowSlots.length,\n columnCount: this.layout.columnSlots.length,\n },\n onCopyCustomSelection: (range) => {\n const model = this.core?.getPivotModel();\n if (!model || !this.layout) return;\n const text = createPivotRangeSelectionText({\n layout: this.layout,\n model,\n startRowIndex: range.startRow - 1,\n endRowIndex: range.endRow - 1,\n startColumnIndex: range.startColumn - 1,\n endColumnIndex: range.endColumn - 1,\n });\n if (text) {\n void writePivotClipboardText(text, this.container.ownerDocument);\n }\n },\n onExportCsv: () =>\n downloadBlob(\n new Blob([this.exportCsv()], { type: \"text/csv;charset=utf-8\" }),\n \"pivot-table.csv\",\n ),\n onExportXlsx: () =>\n downloadBlob(\n new Blob([toArrayBuffer(this.exportXlsx())], {\n type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n }),\n \"pivot-table.xlsx\",\n ),\n onClose: () => this.options.ui?.onContextMenuRequest?.(null),\n });\n };\n\n private updateTooltip(hit: PivotHitTestResult | null, event: PointerEvent) {\n if (!this.host) return;\n const cell = hit?.bodyCell ?? hit?.headerCell;\n const text = hit?.bodyCell?.formattedValue ?? hit?.headerCell?.label ?? \"\";\n if (!cell || !text) {\n if (this.tooltipText) this.options.ui?.onTooltipRequest?.(null);\n this.tooltipText = null;\n return;\n }\n const context = this.host.canvas.getContext(\"2d\");\n const truncated = Boolean(\n context &&\n context.measureText(text).width > Math.max(cell.rect.width - 20, 0),\n );\n if (!truncated) {\n if (this.tooltipText) this.options.ui?.onTooltipRequest?.(null);\n this.tooltipText = null;\n return;\n }\n if (this.tooltipText === text) return;\n this.tooltipText = text;\n this.options.ui?.onTooltipRequest?.({\n x: event.clientX,\n y: event.clientY,\n text,\n onClose: () => this.options.ui?.onTooltipRequest?.(null),\n });\n }\n\n private readonly handlePointerDown = (event: PointerEvent) => {\n if (!this.layout || !this.host) return;\n this.stopWheelScrollSmoothing();\n const scrollbarHit = this.resolveScrollbarHit(event);\n if (scrollbarHit && event.button === 0) {\n this.beginScrollbarInteraction(event, scrollbarHit);\n return;\n }\n const hit = this.resolveResizeHit(event);\n if (!hit) {\n const cellHit = this.resolveHit(event);\n if (event.button !== 0) return;\n if (cellHit?.bodyCell) {\n const address = toCellAddress(cellHit.bodyCell);\n this.host.root.focus({ preventScroll: true });\n const selection = this.selectCell(address, event.shiftKey);\n this.cellSelectionDrag = {\n pointerId: event.pointerId,\n anchor: selection?.anchorCell ?? address,\n lastAddress: address,\n lastKind: \"cell\",\n };\n event.preventDefault();\n this.host.root.setPointerCapture(event.pointerId);\n this.suppressNextClick = true;\n return;\n }\n if (\n cellHit?.region === \"rowHeader\" &&\n cellHit.headerCell &&\n !cellHit.onExpandIcon &&\n !cellHit.onFilterIcon &&\n !cellHit.onSortIcon\n ) {\n const rootRect = this.host.root.getBoundingClientRect();\n const rowIndex = resolvePivotRowIndexAtY(\n this.layout,\n event.clientY - rootRect.top,\n );\n if (rowIndex == null) return;\n this.host.root.focus({ preventScroll: true });\n this.rowHeaderSelectionDrag = {\n pointerId: event.pointerId,\n startRowIndex: rowIndex,\n lastRowIndex: rowIndex,\n lastColumnIndex: null,\n startClientX: event.clientX,\n startClientY: event.clientY,\n dragged: false,\n };\n const selection = createPivotRowRangeSelection(\n this.layout,\n rowIndex,\n rowIndex,\n );\n if (selection) this.setSelection(selection);\n this.host.root.setPointerCapture(event.pointerId);\n }\n return;\n }\n event.preventDefault();\n const startWidth =\n hit.kind === \"rowDimension\"\n ? (this.layout.rowDimensionWidths[hit.index] ?? 140)\n : (this.layout.columnWidths[hit.index] ?? this.layout.columnWidth);\n this.resizeSession = {\n hit,\n pointerId: event.pointerId,\n startX: event.clientX,\n startWidth,\n };\n const rootRect = this.host.root.getBoundingClientRect();\n this.resizeGuideX = clamp(\n event.clientX - rootRect.left,\n 0,\n this.layout.tableWidth,\n );\n this.scheduleRender();\n this.suppressNextClick = true;\n this.host.root.setPointerCapture(event.pointerId);\n };\n\n private readonly handlePointerUp = (event: PointerEvent) => {\n if (!this.host) return;\n const endedCellSelection =\n this.cellSelectionDrag?.pointerId === event.pointerId;\n if (endedCellSelection) this.cellSelectionDrag = null;\n const endedRowHeaderSelection =\n this.rowHeaderSelectionDrag?.pointerId === event.pointerId;\n if (endedRowHeaderSelection) {\n if (this.rowHeaderSelectionDrag?.dragged) this.suppressNextClick = true;\n this.rowHeaderSelectionDrag = null;\n }\n if (this.scrollbarDrag?.pointerId === event.pointerId) {\n this.scrollbarDrag = null;\n }\n if (\n !this.resizeSession &&\n !this.scrollbarDrag &&\n !endedCellSelection &&\n !endedRowHeaderSelection &&\n !this.host.root.hasPointerCapture(event.pointerId)\n )\n return;\n if (this.host.root.hasPointerCapture(event.pointerId)) {\n this.host.root.releasePointerCapture(event.pointerId);\n }\n this.resizeSession = null;\n if (this.resizeGuideX != null) {\n this.resizeGuideX = null;\n this.scheduleRender();\n }\n this.host.root.style.cursor = \"\";\n };\n\n private updateCellSelectionDrag(event: PointerEvent) {\n const drag = this.cellSelectionDrag;\n if (!drag || !this.layout || !this.host) return;\n const rootRect = this.host.root.getBoundingClientRect();\n const localX = event.clientX - rootRect.left;\n const kind =\n localX >= this.layout.rowHeaderRect.x && localX < this.layout.bodyRect.x\n ? \"row-cell\"\n : \"cell\";\n const x = clamp(\n localX,\n this.layout.bodyRect.x,\n this.layout.bodyRect.x + Math.max(this.layout.bodyRect.width - 1, 0),\n );\n const y = clamp(\n event.clientY - rootRect.top,\n this.layout.bodyRect.y,\n this.layout.bodyRect.y + Math.max(this.layout.bodyRect.height - 1, 0),\n );\n const hit = hitTestPivotLayout(this.layout, x, y);\n if (!hit?.bodyCell) return;\n const address = toCellAddress(hit.bodyCell);\n if (isSameAddress(drag.lastAddress, address) && drag.lastKind === kind) {\n return;\n }\n drag.lastAddress = address;\n drag.lastKind = kind;\n this.setSelection({\n activeCell: address,\n anchorCell: drag.anchor,\n ranges: [{ start: drag.anchor, end: address, kind }],\n activeNode: null,\n });\n }\n\n private updateRowHeaderSelectionDrag(event: PointerEvent) {\n const drag = this.rowHeaderSelectionDrag;\n if (!drag || !this.layout || !this.host) return;\n const rootRect = this.host.root.getBoundingClientRect();\n const rowIndex = resolvePivotRowIndexAtY(\n this.layout,\n event.clientY - rootRect.top,\n );\n if (rowIndex == null) return;\n const localX = event.clientX - rootRect.left;\n if (\n !drag.dragged &&\n Math.hypot(\n event.clientX - drag.startClientX,\n event.clientY - drag.startClientY,\n ) >= 3\n ) {\n drag.dragged = true;\n this.suppressNextClick = true;\n }\n let endColumnIndex: number | null = null;\n if (localX >= this.layout.bodyRect.x) {\n const x = clamp(\n localX,\n this.layout.bodyRect.x,\n this.layout.bodyRect.x + Math.max(this.layout.bodyRect.width - 1, 0),\n );\n const y = clamp(\n event.clientY - rootRect.top,\n this.layout.bodyRect.y,\n this.layout.bodyRect.y + Math.max(this.layout.bodyRect.height - 1, 0),\n );\n endColumnIndex =\n hitTestPivotLayout(this.layout, x, y)?.bodyCell?.columnIndex ?? null;\n }\n if (\n rowIndex === drag.lastRowIndex &&\n endColumnIndex === drag.lastColumnIndex\n ) {\n return;\n }\n const selection = createPivotRowRangeSelection(\n this.layout,\n drag.startRowIndex,\n rowIndex,\n endColumnIndex ?? undefined,\n );\n if (!selection) return;\n drag.lastRowIndex = rowIndex;\n drag.lastColumnIndex = endColumnIndex;\n this.suppressNextClick = true;\n this.setSelection(selection);\n }\n\n private selectValueColumn(\n header: PivotLayoutSnapshot[\"columnHeaderCells\"][number],\n ) {\n if (!this.layout) return false;\n const selection = createPivotValueColumnSelection(this.layout, header);\n if (!selection) return false;\n this.setSelection(selection);\n return true;\n }\n\n private beginScrollbarInteraction(\n event: PointerEvent,\n hit: NonNullable<ReturnType<typeof hitTestPivotScrollbar>>,\n ) {\n if (!this.layout || !this.host) return;\n const axisLayout = this.layout.scrollbar[hit.axis];\n if (!axisLayout) return;\n event.preventDefault();\n this.suppressNextClick = true;\n\n if (hit.role === \"decrease-button\" || hit.role === \"increase-button\") {\n this.stepScrollbar(hit.axis, hit.role === \"decrease-button\" ? -1 : 1);\n return;\n }\n\n const rootRect = this.host.root.getBoundingClientRect();\n const pointer =\n hit.axis === \"horizontal\"\n ? event.clientX - rootRect.left\n : event.clientY - rootRect.top;\n if (hit.role === \"track\") {\n const thumbStart =\n hit.axis === \"horizontal\" ? axisLayout.thumb.x : axisLayout.thumb.y;\n const direction = pointer < thumbStart ? -1 : 1;\n this.applyScrollPosition(\n this.scroll.left +\n (hit.axis === \"horizontal\"\n ? direction * this.layout.bodyRect.width\n : 0),\n this.scroll.top +\n (hit.axis === \"vertical\"\n ? direction * this.layout.bodyRect.height\n : 0),\n );\n return;\n }\n\n const thumbStart =\n hit.axis === \"horizontal\" ? axisLayout.thumb.x : axisLayout.thumb.y;\n this.scrollbarDrag = {\n axis: hit.axis,\n pointerId: event.pointerId,\n pointerOffset: pointer - thumbStart,\n trackStart:\n hit.axis === \"horizontal\" ? axisLayout.track.x : axisLayout.track.y,\n trackLength:\n hit.axis === \"horizontal\"\n ? axisLayout.track.width\n : axisLayout.track.height,\n thumbLength:\n hit.axis === \"horizontal\"\n ? axisLayout.thumb.width\n : axisLayout.thumb.height,\n };\n this.host.root.style.cursor = \"grabbing\";\n this.host.root.setPointerCapture(event.pointerId);\n }\n\n private updateScrollbarDrag(event: PointerEvent) {\n const dragging = this.scrollbarDrag;\n if (!dragging || !this.layout || !this.host) return;\n const rootRect = this.host.root.getBoundingClientRect();\n const pointer =\n dragging.axis === \"horizontal\"\n ? event.clientX - rootRect.left\n : event.clientY - rootRect.top;\n const movableLength = Math.max(\n dragging.trackLength - dragging.thumbLength,\n 0,\n );\n const thumbStart = Math.min(\n Math.max(pointer - dragging.pointerOffset, dragging.trackStart),\n dragging.trackStart + movableLength,\n );\n const ratio =\n movableLength <= 0\n ? 0\n : (thumbStart - dragging.trackStart) / movableLength;\n const maxScroll =\n dragging.axis === \"horizontal\"\n ? this.layout.viewport.maxScrollLeft\n : this.layout.viewport.maxScrollTop;\n this.applyScrollPosition(\n dragging.axis === \"horizontal\" ? ratio * maxScroll : this.scroll.left,\n dragging.axis === \"vertical\" ? ratio * maxScroll : this.scroll.top,\n );\n }\n\n private stepScrollbar(axis: PivotScrollbarAxis, direction: -1 | 1) {\n if (!this.layout) return;\n const horizontalStep =\n this.layout.columnWidths[this.layout.visibleColumnRange.start] ??\n this.layout.columnWidth;\n this.applyScrollPosition(\n this.scroll.left +\n (axis === \"horizontal\" ? direction * horizontalStep : 0),\n this.scroll.top +\n (axis === \"vertical\" ? direction * this.layout.rowHeight : 0),\n );\n }\n\n private applyScrollPosition(left: number, top: number) {\n if (!this.layout) return;\n const next = {\n left: clamp(left, 0, this.layout.viewport.maxScrollLeft),\n top: clamp(top, 0, this.layout.viewport.maxScrollTop),\n };\n if (next.left === this.scroll.left && next.top === this.scroll.top) return;\n this.scroll = next;\n this.scheduleRender();\n }\n\n private applyResize(deltaX: number) {\n const session = this.resizeSession;\n if (!session || !this.core) return;\n const width = session.startWidth + deltaX;\n if (session.hit.kind === \"valueColumn\") {\n const slot = this.layout?.columnSlots[session.hit.index];\n if (!slot) return;\n this.core.setColumnWidth(slot.key, width);\n } else {\n const dimension = this.options.rows[session.hit.index];\n if (!dimension) return;\n this.core.setRowDimensionWidth(\n resolvePivotDimensionKey(dimension),\n width,\n );\n }\n this.scheduleRender();\n }\n\n private openFilterPanel(hit: PivotHitTestResult) {\n const header = hit.headerCell;\n if (!header || !this.core || !this.host) return;\n const model = this.core.getPivotModel();\n const axis = header.axis;\n const node = header.nodeId\n ? (axis === \"row\" ? model?.rowNodes : model?.columnNodes)?.get(\n header.nodeId,\n )\n : undefined;\n const dimensionKey = header.dimensionKey ?? node?.dimensionKey;\n if (!dimensionKey) return;\n const dimension = (\n axis === \"row\" ? this.options.rows : this.options.columns\n ).find((item) => resolvePivotDimensionKey(item) === dimensionKey);\n if (!dimension?.allowFilter) return;\n this.requestFilterPanel({\n axis,\n dimensionKey,\n title: resolvePivotDimensionTitle(dimension),\n rect: header.rect,\n });\n }\n\n private openReportFilterPanel(\n cell: PivotLayoutSnapshot[\"reportFilterCells\"][number],\n ) {\n const dimension = this.options.filterDimensions?.find(\n (item) => resolvePivotDimensionKey(item) === cell.dimensionKey,\n );\n if (!dimension) return;\n this.requestFilterPanel({\n axis: \"filter\",\n dimensionKey: cell.dimensionKey,\n title: resolvePivotDimensionTitle(dimension),\n rect: cell.valueRect,\n });\n }\n\n private requestFilterPanel(params: {\n axis: PivotFilterAxis;\n dimensionKey: string;\n title: string;\n rect: { x: number; y: number; width: number };\n }) {\n if (!this.core || !this.host) return;\n const { axis, dimensionKey } = params;\n const rootRect = this.host.root.getBoundingClientRect();\n const current =\n (axis === \"row\"\n ? this.core.getFilters().rows\n : axis === \"column\"\n ? this.core.getFilters().columns\n : (this.core.getFilters().filters ?? {}))[dimensionKey] ?? {};\n this.options.ui?.onFilterPanelRequest?.({\n axis,\n dimensionKey,\n title: params.title,\n x: rootRect.left + params.rect.x,\n y: rootRect.top + params.rect.y,\n width: params.rect.width,\n options: this.core.getDimensionFilterOptions(axis, dimensionKey),\n value: current,\n filterOptionImmediateApply: this.options.filterOptionImmediateApply,\n onApply: (value) => this.setDimensionFilter(axis, dimensionKey, value),\n onApplyCondition: ({ condition, secondCondition, relation }) => {\n this.setDimensionFilter(axis, dimensionKey, {\n ...current,\n condition,\n secondCondition,\n conditionRelation: relation,\n });\n },\n onReset: () => this.setDimensionFilter(axis, dimensionKey, null),\n onCancel: () => this.options.ui?.onFilterPanelRequest?.(null),\n });\n }\n\n private resolveHit(\n event: MouseEvent | PointerEvent,\n ): PivotHitTestResult | null {\n if (!this.host || !this.layout) return null;\n const rect = this.host.root.getBoundingClientRect();\n return hitTestPivotLayout(\n this.layout,\n event.clientX - rect.left,\n event.clientY - rect.top,\n );\n }\n\n private resolveResizeHit(event: MouseEvent | PointerEvent) {\n if (!this.host || !this.layout) return null;\n const rect = this.host.root.getBoundingClientRect();\n return hitTestPivotResize(\n this.layout,\n event.clientX - rect.left,\n event.clientY - rect.top,\n );\n }\n\n private resolveScrollbarHit(event: MouseEvent | PointerEvent) {\n if (!this.host || !this.layout) return null;\n const rect = this.host.root.getBoundingClientRect();\n return hitTestPivotScrollbar(\n this.layout.scrollbar,\n event.clientX - rect.left,\n event.clientY - rect.top,\n );\n }\n\n private createSelectionTsv() {\n if (!this.layout || !this.core) return \"\";\n const model = this.core.getPivotModel();\n if (!model) return \"\";\n return createPivotSelectionText({\n layout: this.layout,\n model,\n selection: this.core.getSelection(),\n });\n }\n\n private scheduleRender() {\n if (this.frameId !== null) return;\n this.frameId = requestAnimationFrame(() => {\n this.frameId = null;\n this.render();\n });\n }\n\n private render() {\n if (!this.core || !this.host || this.width <= 0 || this.height <= 0) return;\n const layout = this.core.getLayoutSnapshot({\n width: this.width,\n height: this.height,\n scrollLeft: this.scroll.left,\n scrollTop: this.scroll.top,\n });\n if (!layout) return;\n this.layout = layout;\n this.scroll = { ...layout.scroll };\n if (this.wheelScrollTarget) {\n this.wheelScrollTarget = {\n left: clamp(\n this.wheelScrollTarget.left,\n 0,\n layout.viewport.maxScrollLeft,\n ),\n top: clamp(this.wheelScrollTarget.top, 0, layout.viewport.maxScrollTop),\n };\n }\n this.host.setFittedHeight(layout.height);\n resizePivotCanvas(this.host.canvas, this.width, layout.height);\n const context = this.host.canvas.getContext(\"2d\");\n if (!context) return;\n this.renderStats = renderPivotTable({\n context,\n layout,\n options: this.options,\n activeCell: this.core.getSelection().activeCell,\n hoverCell: this.hoverCell,\n selection: this.core.getSelection(),\n resizeGuideX: this.resizeGuideX,\n });\n }\n}\n\nfunction describeElement(value: EventTarget | null) {\n if (!(value instanceof Element)) return String(value);\n const id = value.id ? `#${value.id}` : \"\";\n const className =\n typeof value.className === \"string\" && value.className\n ? `.${value.className.trim().replace(/\\s+/g, \".\")}`\n : \"\";\n return `${value.tagName.toLocaleLowerCase()}${id}${className}`;\n}\n\nfunction toCellAddress(cell: {\n rowNodeId: string | null;\n columnNodeId: string | null;\n indicatorKey: string;\n}): PivotCellAddress {\n return {\n rowNodeId: cell.rowNodeId ?? \"\",\n columnNodeId: cell.columnNodeId ?? \"\",\n indicatorKey: cell.indicatorKey,\n };\n}\n\nfunction isSameAddress(\n left: PivotCellAddress | null,\n right: PivotCellAddress | null,\n) {\n return Boolean(\n left === right ||\n (left &&\n right &&\n left.rowNodeId === right.rowNodeId &&\n left.columnNodeId === right.columnNodeId &&\n left.indicatorKey === right.indicatorKey),\n );\n}\n\nfunction resolveNavigationDirection(key: string) {\n if (key === \"ArrowUp\") return { row: -1, column: 0 };\n if (key === \"ArrowDown\") return { row: 1, column: 0 };\n if (key === \"ArrowLeft\") return { row: 0, column: -1 };\n if (key === \"ArrowRight\") return { row: 0, column: 1 };\n return null;\n}\n\nfunction resolveAdjacentAddress(\n layout: PivotLayoutSnapshot,\n address: PivotCellAddress,\n direction: { row: number; column: number },\n) {\n const indexes = resolveAddressIndexes(layout, address);\n if (!indexes) return null;\n const rowIndex = Math.min(\n Math.max(indexes.rowIndex + direction.row, 0),\n layout.rowSlots.length - 1,\n );\n const columnIndex = Math.min(\n Math.max(indexes.columnIndex + direction.column, 0),\n layout.columnSlots.length - 1,\n );\n const rowSlot = layout.rowSlots[rowIndex];\n const columnSlot = layout.columnSlots[columnIndex];\n const indicatorKey = rowSlot?.indicatorKey ?? columnSlot?.indicatorKey;\n if (!rowSlot || !columnSlot || !indicatorKey) return null;\n return {\n rowNodeId: rowSlot.nodeId ?? \"\",\n columnNodeId: columnSlot.nodeId ?? \"\",\n indicatorKey,\n };\n}\n\nfunction resolveAddressIndexes(\n layout: PivotLayoutSnapshot,\n address: PivotCellAddress,\n) {\n const rowIndex = layout.rowSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.rowNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n const columnIndex = layout.columnSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.columnNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n return rowIndex >= 0 && columnIndex >= 0 ? { rowIndex, columnIndex } : null;\n}\n\nfunction resolveVisibleOffset(params: {\n current: number;\n itemStart: number;\n itemSize: number;\n viewportSize: number;\n}) {\n if (params.itemStart < params.current) return params.itemStart;\n const itemEnd = params.itemStart + params.itemSize;\n const viewportEnd = params.current + params.viewportSize;\n return itemEnd > viewportEnd ? itemEnd - params.viewportSize : params.current;\n}\n\nfunction downloadBlob(blob: Blob, fileName: string) {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nfunction toArrayBuffer(value: Uint8Array) {\n const buffer = new ArrayBuffer(value.byteLength);\n new Uint8Array(buffer).set(value);\n return buffer;\n}\n","import type { PivotDimension } from \"../../schema/dimension\";\nimport type { BuiltInPivotAggregatorName } from \"../../schema/aggregator\";\nimport type {\n PivotField,\n PivotFieldArea,\n PivotFieldLayout,\n} from \"../../schema/field\";\nimport type { PivotIndicator } from \"../../schema/indicator\";\nimport {\n resolvePivotDimensionKey,\n resolvePivotDimensionTitle,\n} from \"../data/dimension-config\";\n\n/** 创建四个区域均为空的字段布局。 */\nexport function createEmptyPivotFieldLayout(): PivotFieldLayout {\n return { filters: [], columns: [], rows: [], values: [] };\n}\n\n/** 根据当前透视配置创建字段区域布局。 */\nexport function createPivotFieldLayout<RecordType>(params: {\n filterDimensions?: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n rows: PivotDimension<RecordType>[];\n indicators: PivotIndicator<RecordType>[];\n}): PivotFieldLayout {\n return {\n filters: (params.filterDimensions ?? []).map(resolvePivotDimensionKey),\n columns: params.columns.map(resolvePivotDimensionKey),\n rows: params.rows.map(resolvePivotDimensionKey),\n values: params.indicators.map((indicator) => indicator.key),\n };\n}\n\n/** 合并自定义字段与当前透视配置,生成稳定字段目录。 */\nexport function createPivotFieldCatalog<RecordType>(params: {\n fields?: PivotField<RecordType>[];\n filterDimensions?: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n rows: PivotDimension<RecordType>[];\n indicators: PivotIndicator<RecordType>[];\n}) {\n const result = new Map<string, PivotField<RecordType>>();\n params.fields?.forEach((field) => {\n result.set(resolvePivotDimensionKey(field), field);\n });\n const addDimension = (\n dimension: PivotDimension<RecordType>,\n defaultArea: PivotFieldArea,\n ) => {\n const key = resolvePivotDimensionKey(dimension);\n const current = result.get(key);\n result.set(key, { ...current, ...dimension, key, defaultArea });\n };\n params.filterDimensions?.forEach((field) => addDimension(field, \"filter\"));\n params.columns.forEach((field) => addDimension(field, \"column\"));\n params.rows.forEach((field) => addDimension(field, \"row\"));\n params.indicators.forEach((indicator) => {\n const current = result.get(indicator.key);\n result.set(indicator.key, {\n ...current,\n key: indicator.key,\n title: current?.title ?? indicator.title ?? indicator.key,\n dataIndex: current?.dataIndex ?? indicator.dataIndex ?? indicator.key,\n defaultArea: \"value\",\n indicator: {\n ...current?.indicator,\n ...indicator,\n title: indicator.title,\n dataIndex: indicator.dataIndex,\n },\n });\n });\n return Array.from(result.values());\n}\n\n/**\n * 将字段移动到指定区域和位置。\n *\n * 筛选器、行和列区域中的字段互斥;值区域独立,可复用维度字段。\n */\nexport function movePivotField(\n layout: PivotFieldLayout,\n fieldKey: string,\n area: PivotFieldArea,\n index?: number,\n sourceArea?: PivotFieldArea,\n): PivotFieldLayout {\n const grouped = removePivotFieldFromTargetGroup(layout, fieldKey, area);\n const next = sourceArea\n ? removePivotFieldFromArea(grouped, fieldKey, sourceArea)\n : grouped;\n const targetKey = areaToLayoutKey(area);\n const target = [...next[targetKey]];\n const insertIndex = Math.max(\n 0,\n Math.min(index ?? target.length, target.length),\n );\n target.splice(insertIndex, 0, fieldKey);\n return { ...next, [targetKey]: target };\n}\n\nfunction removePivotFieldFromArea(\n layout: PivotFieldLayout,\n fieldKey: string,\n area: PivotFieldArea,\n): PivotFieldLayout {\n const areaKey = areaToLayoutKey(area);\n return {\n ...layout,\n [areaKey]: layout[areaKey].filter((key) => key !== fieldKey),\n };\n}\n\nfunction removePivotFieldFromTargetGroup(\n layout: PivotFieldLayout,\n fieldKey: string,\n area: PivotFieldArea,\n): PivotFieldLayout {\n if (area === \"value\") {\n return {\n ...layout,\n values: layout.values.filter((key) => key !== fieldKey),\n };\n }\n return {\n ...layout,\n filters: layout.filters.filter((key) => key !== fieldKey),\n columns: layout.columns.filter((key) => key !== fieldKey),\n rows: layout.rows.filter((key) => key !== fieldKey),\n };\n}\n\n/** 从全部区域中移除字段。 */\nexport function removePivotField(\n layout: PivotFieldLayout,\n fieldKey: string,\n): PivotFieldLayout {\n return {\n filters: layout.filters.filter((key) => key !== fieldKey),\n columns: layout.columns.filter((key) => key !== fieldKey),\n rows: layout.rows.filter((key) => key !== fieldKey),\n values: layout.values.filter((key) => key !== fieldKey),\n };\n}\n\n/** 将字段布局转换为 PivotTable 原生配置。 */\nexport function resolvePivotFieldLayoutOptions<RecordType>(\n fields: PivotField<RecordType>[],\n layout: PivotFieldLayout,\n) {\n const catalog = new Map(\n fields.map((field) => [resolvePivotDimensionKey(field), field]),\n );\n const dimensions = (keys: string[]) =>\n keys\n .map((key) => catalog.get(key))\n .filter((field): field is PivotField<RecordType> => field != null)\n .map(toPivotDimension);\n const indicators = layout.values\n .map((key) => catalog.get(key))\n .filter((field): field is PivotField<RecordType> => field != null)\n .map(toPivotIndicator);\n return {\n filterDimensions: dimensions(layout.filters),\n columns: dimensions(layout.columns),\n rows: dimensions(layout.rows),\n indicators,\n };\n}\n\n/** 返回字段当前所在的区域。 */\nexport function findPivotFieldArea(\n layout: PivotFieldLayout,\n fieldKey: string,\n): PivotFieldArea | null {\n if (layout.filters.includes(fieldKey)) return \"filter\";\n if (layout.columns.includes(fieldKey)) return \"column\";\n if (layout.rows.includes(fieldKey)) return \"row\";\n if (layout.values.includes(fieldKey)) return \"value\";\n return null;\n}\n\nfunction toPivotDimension<RecordType>(field: PivotField<RecordType>) {\n const {\n defaultArea: _defaultArea,\n indicator: _indicator,\n ...dimension\n } = field;\n return dimension;\n}\n\nfunction toPivotIndicator<RecordType>(\n field: PivotField<RecordType>,\n): PivotIndicator<RecordType> {\n const indicator: PivotIndicator<RecordType> = {\n key: resolvePivotDimensionKey(field),\n dataIndex: field.dataIndex,\n ...field.indicator,\n };\n return {\n ...indicator,\n title: resolvePivotValueFieldTitle(field),\n };\n}\n\n/** 生成包含汇总类型的值字段标题。 */\nexport function resolvePivotValueFieldTitle<RecordType>(\n field: PivotField<RecordType>,\n) {\n return `${resolveAggregatorTitle(field.indicator?.aggregator)}项:${\n field.indicator?.title ?? resolvePivotDimensionTitle(field)\n }`;\n}\n\nfunction resolveAggregatorTitle<RecordType>(\n aggregator: PivotIndicator<RecordType>[\"aggregator\"],\n) {\n if (typeof aggregator === \"string\") {\n return (\n builtInAggregatorTitles[aggregator as BuiltInPivotAggregatorName] ??\n aggregator\n );\n }\n return aggregator ? \"自定义汇总\" : \"求和\";\n}\n\nconst builtInAggregatorTitles: Record<BuiltInPivotAggregatorName, string> = {\n sum: \"求和\",\n avg: \"平均值\",\n count: \"计数\",\n distinctCount: \"去重计数\",\n min: \"最小值\",\n max: \"最大值\",\n};\n\nfunction areaToLayoutKey(area: PivotFieldArea): keyof PivotFieldLayout {\n if (area === \"filter\") return \"filters\";\n if (area === \"column\") return \"columns\";\n if (area === \"row\") return \"rows\";\n return \"values\";\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/domain/data/dimension-config.ts","../src/domain/data/dimension-key.ts","../src/domain/pivot/pivot-cell.ts","../src/domain/pivot/pivot-node.ts","../src/domain/pivot/build-dimension-tree.ts","../src/domain/aggregation/built-in-aggregators.ts","../src/domain/aggregation/aggregator-registry.ts","../src/domain/aggregation/aggregate-records.ts","../src/domain/filter/pivot-filter.ts","../src/services/pivot-model-service.ts","../src/domain/pivot/flatten-visible-tree.ts","../src/domain/layout/compute-scrollbar-layout.ts","../src/domain/layout/pivot-layout.ts","../src/features/export/pivot-export.ts","../src/engine/pivot-table-engine.ts","../src/adapters/dom-host.ts","../src/adapters/canvas-host.ts","../src/rendering/draw-selection.ts","../src/schema/style.ts","../src/rendering/draw-scrollbars.ts","../src/rendering/draw-grid.ts","../src/domain/layout/sticky-row-header.ts","../src/rendering/canvas-renderer.ts","../src/domain/interaction/hit-test.ts","../src/interaction/text-selection.ts","../src/features/clipboard/pivot-selection-copy.ts","../src/domain/interaction/resize-hit.ts","../src/domain/interaction/scrollbar-hit.ts","../src/domain/interaction/column-selection.ts","../src/domain/interaction/row-selection.ts","../src/domain/scroll/scroll-transition.ts","../src/pivot-table.ts","../src/domain/field/pivot-field-layout.ts"],"names":["getValueByDataIndex","sum","DEFAULT_ROW_DIMENSION_WIDTH","resolveNodePathKey","isPathRelated","isPathPrefix","resolveAddressIndexes","createAddress","clamp","axis","rootRect","now","thumbStart"],"mappings":"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","file":"index.js","sourcesContent":["import { stringifyDataIndex } from \"@canvas-components/utils\";\nimport type { PivotDimension } from \"../../schema/dimension\";\nimport type { PivotSortRule } from \"../../schema/sort\";\n\nconst DEFAULT_ROW_DIMENSION_WIDTH = 140;\n\n/** 解析维度稳定标识。 */\nexport function resolvePivotDimensionKey<RecordType>(\n dimension: PivotDimension<RecordType>,\n) {\n return dimension.key?.trim() || stringifyDataIndex(dimension.dataIndex);\n}\n\n/** 将与 ListTable 一致的标题配置转换为 Canvas 文本。 */\nexport function resolvePivotDimensionTitle<RecordType>(\n dimension: PivotDimension<RecordType>,\n) {\n const title = dimension.title;\n if (typeof title === \"string\") return title;\n if (!title) return resolvePivotDimensionKey(dimension);\n return (Array.isArray(title) ? title : [title])\n .map((item) => (item.type === \"text\" ? item.text : (item.alt ?? \"\")))\n .join(\"\");\n}\n\n/** 将 ListTable 风格 render 结果降级为 PivotTable 可绘制文本。 */\nexport function resolvePivotRenderText(result: unknown): string | undefined {\n if (result == null) return undefined;\n if (typeof result === \"string\" || typeof result === \"number\") {\n return String(result);\n }\n if (Array.isArray(result)) {\n return result\n .map(resolvePivotRenderText)\n .filter((item): item is string => item !== undefined)\n .join(\"\");\n }\n if (typeof result !== \"object\") return undefined;\n const content = result as { text?: unknown; value?: unknown; alt?: unknown };\n return resolvePivotRenderText(content.text ?? content.value ?? content.alt);\n}\n\n/** 解析受最小、最大宽度约束的行维度宽度。 */\nexport function resolvePivotDimensionWidth<RecordType>(\n dimension: PivotDimension<RecordType>,\n runtimeWidth?: number,\n fallbackWidth = DEFAULT_ROW_DIMENSION_WIDTH,\n) {\n const minimum = Math.max(dimension.minWidth ?? 48, 1);\n const maximum = Math.max(\n dimension.maxWidth ?? Number.POSITIVE_INFINITY,\n minimum,\n );\n return Math.min(\n Math.max(runtimeWidth ?? dimension.width ?? fallbackWidth, minimum),\n maximum,\n );\n}\n\n/** 将列级默认排序配置转换为 PivotTable 双轴排序状态。 */\nexport function resolvePivotDefaultSorts<RecordType>(params: {\n rows: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n}): PivotSortRule[] {\n return (\n [\n ...params.rows.map((dimension, index) => ({\n axis: \"row\" as const,\n dimension,\n index,\n })),\n ...params.columns.map((dimension, index) => ({\n axis: \"column\" as const,\n dimension,\n index,\n })),\n ] as const\n )\n .filter((item) => item.dimension.defaultSortOrder != null)\n .sort(\n (left, right) =>\n (left.dimension.sortPriority ?? left.index) -\n (right.dimension.sortPriority ?? right.index),\n )\n .map(({ axis, dimension }) => ({\n axis,\n dimensionKey: resolvePivotDimensionKey(dimension),\n direction: dimension.defaultSortOrder === \"descend\" ? \"desc\" : \"asc\",\n by: \"raw\",\n }));\n}\n","import type { PivotDimension } from \"../../schema/dimension\";\nimport type { ResolvedPivotDimensionValue } from \"../../schema/dimension\";\nimport { getValueByDataIndex } from \"@canvas-components/utils\";\nimport { resolvePivotRenderText } from \"./dimension-config\";\n\nconst EMPTY_DIMENSION_LABEL = \"(空)\";\n\n/** 将维度值编码成稳定且包含类型信息的键。 */\nexport function encodePivotDimensionValue(value: unknown): string {\n return stableSerialize(value, new WeakSet<object>());\n}\n\n/** 将维度路径编码成组合键。 */\nexport function encodePivotPath(values: readonly string[]) {\n return JSON.stringify(values);\n}\n\n/** 解析一条记录的维度成员。 */\nexport function resolvePivotDimensionValue<RecordType>(params: {\n record: RecordType;\n recordIndex: number;\n dimension: PivotDimension<RecordType>;\n}): ResolvedPivotDimensionValue {\n const { record, recordIndex, dimension } = params;\n const rawValue = getValueByDataIndex(record, dimension.dataIndex);\n const normalizedValue = rawValue == null || rawValue === \"\" ? null : rawValue;\n const valueKey = encodePivotDimensionValue(normalizedValue);\n const filterValue = dimension.filterValueGetter\n ? dimension.filterValueGetter(record)\n : rawValue;\n const filterOptionValue = dimension.filterOptionValueGetter\n ? dimension.filterOptionValueGetter(record)\n : filterValue;\n const formatted = resolvePivotRenderText(\n dimension.render?.(rawValue, record, recordIndex, dimension),\n );\n\n return {\n rawValue,\n normalizedValue,\n sortValue: dimension.sortValueGetter?.(record) ?? rawValue,\n filterValue,\n filterOptionValue,\n filterOptionKey: encodePivotDimensionValue(filterOptionValue),\n valueKey,\n label:\n formatted ??\n (normalizedValue == null\n ? EMPTY_DIMENSION_LABEL\n : String(normalizedValue)),\n };\n}\n\nfunction stableSerialize(value: unknown, visited: WeakSet<object>): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return `string:${JSON.stringify(value)}`;\n if (typeof value === \"boolean\") return `boolean:${value}`;\n if (typeof value === \"bigint\") return `bigint:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isNaN(value)) return \"number:NaN\";\n if (value === Number.POSITIVE_INFINITY) return \"number:Infinity\";\n if (value === Number.NEGATIVE_INFINITY) return \"number:-Infinity\";\n if (Object.is(value, -0)) return \"number:-0\";\n return `number:${value}`;\n }\n if (value instanceof Date) {\n return `date:${Number.isNaN(value.getTime()) ? \"invalid\" : value.toISOString()}`;\n }\n if (Array.isArray(value)) {\n return `array:[${value.map((item) => stableSerialize(item, visited)).join(\",\")}]`;\n }\n if (typeof value === \"object\") {\n if (visited.has(value)) {\n throw new Error(\"PivotTable 维度值不支持循环引用对象。\");\n }\n visited.add(value);\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([key, item]) =>\n `${JSON.stringify(key)}:${stableSerialize(item, visited)}`,\n );\n visited.delete(value);\n return `object:{${entries.join(\",\")}}`;\n }\n return `${typeof value}:${String(value)}`;\n}\n","/** 稀疏聚合结果单元格。 */\nexport interface PivotAggregateCell {\n key: string;\n rowPathKey: string;\n columnPathKey: string;\n indicatorKey: string;\n value: unknown;\n formattedValue: string;\n recordCount: number;\n recordIndexes: number[];\n}\n\n/** 创建稳定的聚合单元格键。 */\nexport function createPivotCellKey(\n rowPathKey: string,\n columnPathKey: string,\n indicatorKey: string,\n) {\n return JSON.stringify([rowPathKey, columnPathKey, indicatorKey]);\n}\n","import type { PivotAxis } from \"../../schema/events\";\n\n/** PivotTable 维度树节点类型。 */\nexport type PivotNodeKind =\n | \"root\"\n | \"dimension\"\n | \"subtotal\"\n | \"grandTotal\"\n | \"indicator\";\n\n/** PivotTable 行轴或列轴节点。 */\nexport interface PivotNode {\n id: string;\n axis: PivotAxis;\n kind: PivotNodeKind;\n dimensionKey: string | null;\n dimensionValueKey: string | null;\n rawValue: unknown;\n sortValue: unknown;\n label: string;\n depth: number;\n parentId: string | null;\n pathKey: string;\n indicatorKey?: string;\n children: PivotNode[];\n leafCount: number;\n}\n\n/** 创建稳定的 PivotTable 节点 ID。 */\nexport function createPivotNodeId(params: {\n axis: PivotAxis;\n kind: PivotNodeKind;\n pathKey: string;\n indicatorKey?: string;\n}) {\n return JSON.stringify([\n params.axis,\n params.kind,\n params.pathKey,\n params.indicatorKey ?? null,\n ]);\n}\n\n/** 创建小计聚合路径键。 */\nexport function createPivotSubtotalPathKey(\n axis: PivotAxis,\n parentPathKey: string,\n) {\n return JSON.stringify([\"__pivot_subtotal__\", axis, parentPathKey]);\n}\n\n/** 创建总计聚合路径键。 */\nexport function createPivotGrandTotalPathKey(axis: PivotAxis) {\n return JSON.stringify([\"__pivot_grand_total__\", axis]);\n}\n","import type { PivotDimension } from \"../../schema/dimension\";\nimport type { PivotAxis } from \"../../schema/events\";\nimport type { PivotTotalsOptions } from \"../../schema/totals\";\nimport type { PivotSortRule } from \"../../schema/sort\";\nimport type { PivotAggregateCell } from \"./pivot-cell\";\nimport { createPivotCellKey } from \"./pivot-cell\";\nimport { encodePivotPath } from \"../data/dimension-key\";\nimport type { PivotResolvedPath } from \"./pivot-model\";\nimport { resolvePivotDimensionKey } from \"../data/dimension-config\";\nimport {\n createPivotGrandTotalPathKey,\n createPivotNodeId,\n createPivotSubtotalPathKey,\n type PivotNode,\n} from \"./pivot-node\";\n\n/** 构建完整行轴或列轴维度树。 */\nexport function buildPivotDimensionTree<RecordType>(params: {\n axis: PivotAxis;\n dimensions: PivotDimension<RecordType>[];\n paths: Iterable<PivotResolvedPath>;\n totals?: PivotTotalsOptions;\n sorts?: PivotSortRule[];\n cells?: ReadonlyMap<string, PivotAggregateCell>;\n}) {\n const { axis, dimensions, paths, totals, sorts, cells } = params;\n const rootPathKey = encodePivotPath([]);\n const root: PivotNode = {\n id: createPivotNodeId({ axis, kind: \"root\", pathKey: rootPathKey }),\n axis,\n kind: \"root\",\n dimensionKey: null,\n dimensionValueKey: null,\n rawValue: null,\n sortValue: null,\n label: \"\",\n depth: -1,\n parentId: null,\n pathKey: rootPathKey,\n children: [],\n leafCount: 0,\n };\n for (const path of paths) {\n let parent = root;\n const valueKeys: string[] = [];\n path.values.forEach((value, depth) => {\n const dimension = dimensions[depth];\n if (!dimension) return;\n valueKeys.push(value.valueKey);\n const pathKey = encodePivotPath(valueKeys);\n let node = parent.children.find(\n (item) => item.kind === \"dimension\" && item.pathKey === pathKey,\n );\n if (!node) {\n node = {\n id: createPivotNodeId({ axis, kind: \"dimension\", pathKey }),\n axis,\n kind: \"dimension\",\n dimensionKey: resolvePivotDimensionKey(dimension),\n dimensionValueKey: value.valueKey,\n rawValue: value.rawValue,\n sortValue: value.sortValue,\n label: value.label,\n depth,\n parentId: parent.id,\n pathKey,\n children: [],\n leafCount: 1,\n };\n parent.children.push(node);\n }\n parent = node;\n });\n }\n\n sortPivotTree(root, dimensions, sorts, axis, cells);\n injectSubtotalNodes(root, axis, totals);\n injectGrandTotalNode(root, axis, totals);\n updateLeafCounts(root);\n return { root, nodeMap: indexPivotNodes(root) };\n}\n\nfunction sortPivotTree<RecordType>(\n node: PivotNode,\n dimensions: PivotDimension<RecordType>[],\n sorts: PivotSortRule[] | undefined,\n axis: PivotAxis,\n cells: ReadonlyMap<string, PivotAggregateCell> | undefined,\n) {\n node.children.sort((left, right) => {\n const dimension = dimensions[left.depth];\n const rule = sorts?.find(\n (item) =>\n item.axis === axis &&\n dimension != null &&\n item.dimensionKey === resolvePivotDimensionKey(dimension),\n );\n const result =\n rule?.by === \"indicator\" && rule.indicatorKey\n ? comparePivotValues(\n resolveIndicatorSortValue(left, axis, rule, cells),\n resolveIndicatorSortValue(right, axis, rule, cells),\n )\n : rule?.by === \"raw\"\n ? comparePivotValues(left.sortValue, right.sortValue)\n : left.label.localeCompare(right.label);\n return rule?.direction === \"desc\" ? -result : result;\n });\n node.children.forEach((child) =>\n sortPivotTree(child, dimensions, sorts, axis, cells),\n );\n}\n\nfunction resolveIndicatorSortValue(\n node: PivotNode,\n axis: PivotAxis,\n rule: PivotSortRule,\n cells: ReadonlyMap<string, PivotAggregateCell> | undefined,\n) {\n const rootPathKey = encodePivotPath([]);\n const rowPathKey =\n axis === \"row\" ? node.pathKey : (rule.counterpartPathKey ?? rootPathKey);\n const columnPathKey =\n axis === \"column\" ? node.pathKey : (rule.counterpartPathKey ?? rootPathKey);\n return cells?.get(\n createPivotCellKey(rowPathKey, columnPathKey, rule.indicatorKey!),\n )?.value;\n}\n\nfunction comparePivotValues(left: unknown, right: unknown) {\n if (typeof left === \"number\" && typeof right === \"number\")\n return left - right;\n return String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\n\nfunction injectSubtotalNodes(\n node: PivotNode,\n axis: PivotAxis,\n totals: PivotTotalsOptions | undefined,\n) {\n const enabled =\n axis === \"row\" ? totals?.showRowSubtotals : totals?.showColumnSubtotals;\n const position =\n axis === \"row\"\n ? (totals?.rowSubtotalPosition ?? \"after\")\n : (totals?.columnSubtotalPosition ?? \"after\");\n const dimensionChildren = node.children.filter(\n (child) => child.kind === \"dimension\",\n );\n dimensionChildren.forEach((child) =>\n injectSubtotalNodes(child, axis, totals),\n );\n if (!enabled || node.kind !== \"dimension\" || dimensionChildren.length === 0) {\n return;\n }\n const pathKey = createPivotSubtotalPathKey(axis, node.pathKey);\n const subtotal: PivotNode = {\n id: createPivotNodeId({ axis, kind: \"subtotal\", pathKey }),\n axis,\n kind: \"subtotal\",\n dimensionKey: node.dimensionKey,\n dimensionValueKey: null,\n rawValue: null,\n sortValue: null,\n label: resolveSubtotalLabel(totals, node),\n depth: node.depth + 1,\n parentId: node.id,\n pathKey,\n children: [],\n leafCount: 1,\n };\n if (position === \"before\") node.children.unshift(subtotal);\n else node.children.push(subtotal);\n}\n\nfunction injectGrandTotalNode(\n root: PivotNode,\n axis: PivotAxis,\n totals: PivotTotalsOptions | undefined,\n) {\n const enabled =\n axis === \"row\" ? totals?.showRowGrandTotal : totals?.showColumnGrandTotal;\n if (!enabled) return;\n const pathKey = createPivotGrandTotalPathKey(axis);\n const grandTotal: PivotNode = {\n id: createPivotNodeId({ axis, kind: \"grandTotal\", pathKey }),\n axis,\n kind: \"grandTotal\",\n dimensionKey: null,\n dimensionValueKey: null,\n rawValue: null,\n sortValue: null,\n label: totals?.grandTotalLabel ?? \"总计\",\n depth: 0,\n parentId: root.id,\n pathKey,\n children: [],\n leafCount: 1,\n };\n const position =\n axis === \"row\"\n ? (totals?.rowGrandTotalPosition ?? \"end\")\n : (totals?.columnGrandTotalPosition ?? \"end\");\n if (position === \"start\") root.children.unshift(grandTotal);\n else root.children.push(grandTotal);\n}\n\nfunction resolveSubtotalLabel(\n totals: PivotTotalsOptions | undefined,\n node: PivotNode,\n) {\n if (typeof totals?.subtotalLabel === \"function\") {\n return totals.subtotalLabel(node.dimensionKey ?? \"\", node.label);\n }\n return totals?.subtotalLabel ?? `${node.label} 小计`;\n}\n\nfunction updateLeafCounts(node: PivotNode): number {\n if (node.children.length === 0) {\n node.leafCount = node.kind === \"root\" ? 0 : 1;\n return node.leafCount;\n }\n node.leafCount = node.children.reduce(\n (count, child) => count + updateLeafCounts(child),\n 0,\n );\n return node.leafCount;\n}\n\nfunction indexPivotNodes(root: PivotNode) {\n const nodeMap = new Map<string, PivotNode>();\n const visit = (node: PivotNode) => {\n nodeMap.set(node.id, node);\n node.children.forEach(visit);\n };\n visit(root);\n return nodeMap;\n}\n","import type {\n PivotAggregator,\n PivotAggregatorRegistry,\n} from \"../../schema/aggregator\";\n\ninterface NumericAccumulator {\n count: number;\n numericCount: number;\n sum: number;\n min: number | null;\n max: number | null;\n distinctValues: Set<string>;\n}\n\n/** 创建内置 PivotTable 聚合器注册表。 */\nexport function createBuiltInPivotAggregators<RecordType>(): PivotAggregatorRegistry<RecordType> {\n return {\n sum: createNumericAggregator(\"sum\"),\n avg: createNumericAggregator(\"avg\"),\n count: createNumericAggregator(\"count\"),\n distinctCount: createNumericAggregator(\"distinctCount\"),\n min: createNumericAggregator(\"min\"),\n max: createNumericAggregator(\"max\"),\n };\n}\n\nfunction createNumericAggregator<RecordType>(\n type: \"sum\" | \"avg\" | \"count\" | \"distinctCount\" | \"min\" | \"max\",\n): PivotAggregator<NumericAccumulator, number | null, RecordType> {\n return {\n create: createAccumulator,\n add(state, value) {\n if (type === \"count\") {\n state.count += 1;\n return;\n }\n if (value == null || value === \"\") {\n return;\n }\n if (type === \"distinctCount\") {\n state.distinctValues.add(serializeDistinctValue(value));\n return;\n }\n const numericValue = toFiniteNumber(value);\n if (numericValue == null) {\n return;\n }\n state.numericCount += 1;\n state.sum += numericValue;\n state.min = state.min == null ? numericValue : Math.min(state.min, numericValue);\n state.max = state.max == null ? numericValue : Math.max(state.max, numericValue);\n },\n merge(state, source) {\n state.count += source.count;\n state.numericCount += source.numericCount;\n state.sum += source.sum;\n state.min = mergeMinimum(state.min, source.min);\n state.max = mergeMaximum(state.max, source.max);\n source.distinctValues.forEach((value) => state.distinctValues.add(value));\n },\n finalize(state) {\n if (type === \"count\") return state.count;\n if (type === \"distinctCount\") return state.distinctValues.size;\n if (type === \"sum\") return state.sum;\n if (type === \"avg\") {\n return state.numericCount === 0 ? null : state.sum / state.numericCount;\n }\n if (type === \"min\") return state.min;\n return state.max;\n },\n };\n}\n\nfunction createAccumulator(): NumericAccumulator {\n return {\n count: 0,\n numericCount: 0,\n sum: 0,\n min: null,\n max: null,\n distinctValues: new Set<string>(),\n };\n}\n\nfunction toFiniteNumber(value: unknown) {\n const numericValue = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(numericValue) ? numericValue : null;\n}\n\nfunction serializeDistinctValue(value: unknown) {\n return `${typeof value}:${String(value)}`;\n}\n\nfunction mergeMinimum(left: number | null, right: number | null) {\n if (left == null) return right;\n if (right == null) return left;\n return Math.min(left, right);\n}\n\nfunction mergeMaximum(left: number | null, right: number | null) {\n if (left == null) return right;\n if (right == null) return left;\n return Math.max(left, right);\n}\n","import type {\n PivotAggregator,\n PivotAggregatorRegistry,\n} from \"../../schema/aggregator\";\nimport type { PivotIndicator } from \"../../schema/indicator\";\nimport { createBuiltInPivotAggregators } from \"./built-in-aggregators\";\n\n/** 合并内置和自定义聚合器。 */\nexport function createPivotAggregatorRegistry<RecordType>(\n custom?: PivotAggregatorRegistry<RecordType>,\n): PivotAggregatorRegistry<RecordType> {\n return {\n ...createBuiltInPivotAggregators<RecordType>(),\n ...custom,\n };\n}\n\n/** 解析指标使用的聚合器。 */\nexport function resolvePivotIndicatorAggregator<RecordType>(\n indicator: PivotIndicator<RecordType>,\n registry: PivotAggregatorRegistry<RecordType>,\n): PivotAggregator<any, any, RecordType> {\n if (typeof indicator.aggregator === \"object\") {\n return indicator.aggregator;\n }\n const name = indicator.aggregator ?? \"sum\";\n const aggregator = registry[name];\n if (!aggregator) {\n throw new Error(`PivotTable 未注册聚合器:${name}`);\n }\n return aggregator;\n}\n","import type { PivotAggregatorRegistry } from \"../../schema/aggregator\";\nimport type { PivotDimension } from \"../../schema/dimension\";\nimport type { PivotIndicator } from \"../../schema/indicator\";\nimport type { PivotTotalsOptions } from \"../../schema/totals\";\nimport type { PivotSortRule } from \"../../schema/sort\";\nimport { getValueByDataIndex } from \"@canvas-components/utils\";\nimport {\n encodePivotPath,\n resolvePivotDimensionValue,\n} from \"../data/dimension-key\";\nimport { resolvePivotDimensionKey } from \"../data/dimension-config\";\nimport {\n createPivotCellKey,\n type PivotAggregateCell,\n} from \"../pivot/pivot-cell\";\nimport type { PivotModel, PivotResolvedPath } from \"../pivot/pivot-model\";\nimport { buildPivotDimensionTree } from \"../pivot/build-dimension-tree\";\nimport {\n createPivotGrandTotalPathKey,\n createPivotSubtotalPathKey,\n} from \"../pivot/pivot-node\";\nimport {\n createPivotAggregatorRegistry,\n resolvePivotIndicatorAggregator,\n} from \"./aggregator-registry\";\n\ninterface PendingAggregate<RecordType> {\n rowPathKey: string;\n columnPathKey: string;\n indicator: PivotIndicator<RecordType>;\n aggregator: ReturnType<typeof resolvePivotIndicatorAggregator<RecordType>>;\n state: unknown;\n recordIndexes: number[];\n}\n\n/** 将原始记录聚合成第一版稀疏 PivotModel。 */\nexport function aggregatePivotRecords<RecordType>(params: {\n records: RecordType[];\n rowDimensions: PivotDimension<RecordType>[];\n columnDimensions: PivotDimension<RecordType>[];\n indicators: PivotIndicator<RecordType>[];\n aggregators?: PivotAggregatorRegistry<RecordType>;\n totals?: PivotTotalsOptions;\n sorts?: PivotSortRule[];\n}): PivotModel<RecordType> {\n const {\n records,\n rowDimensions,\n columnDimensions,\n indicators,\n aggregators,\n totals,\n sorts,\n } = params;\n validatePivotConfiguration(rowDimensions, columnDimensions, indicators);\n const registry = createPivotAggregatorRegistry(aggregators);\n const rowPaths = new Map<string, PivotResolvedPath>();\n const columnPaths = new Map<string, PivotResolvedPath>();\n const pending = new Map<string, PendingAggregate<RecordType>>();\n\n records.forEach((record, recordIndex) => {\n const rowPath = resolvePath(record, recordIndex, rowDimensions);\n const columnPath = resolvePath(record, recordIndex, columnDimensions);\n rowPaths.set(rowPath.key, rowPath);\n columnPaths.set(columnPath.key, columnPath);\n\n const rowTargets = resolveAggregatePathTargets({\n axis: \"row\",\n path: rowPath,\n includeSubtotals: totals?.showRowSubtotals === true,\n includeGrandTotal: totals?.showRowGrandTotal === true,\n });\n const columnTargets = resolveAggregatePathTargets({\n axis: \"column\",\n path: columnPath,\n includeSubtotals: totals?.showColumnSubtotals === true,\n includeGrandTotal: totals?.showColumnGrandTotal === true,\n });\n\n rowTargets.forEach((rowPathKey) => {\n columnTargets.forEach((columnPathKey) => {\n indicators.forEach((indicator) => {\n addRecordToAggregate({\n pending,\n registry,\n rowPathKey,\n columnPathKey,\n indicator,\n record,\n recordIndex,\n });\n });\n });\n });\n });\n\n const cells = new Map<string, PivotAggregateCell>();\n pending.forEach((item, key) => {\n const value = item.aggregator.finalize(item.state);\n cells.set(key, {\n key,\n rowPathKey: item.rowPathKey,\n columnPathKey: item.columnPathKey,\n indicatorKey: item.indicator.key,\n value,\n formattedValue:\n item.indicator.formatter?.(value, {\n indicator: item.indicator,\n recordCount: item.recordIndexes.length,\n rowPathKey: item.rowPathKey,\n columnPathKey: item.columnPathKey,\n }) ?? formatAggregateValue(value, item.indicator.precision),\n recordCount: item.recordIndexes.length,\n recordIndexes: item.recordIndexes,\n });\n });\n\n const rowTree = buildPivotDimensionTree({\n axis: \"row\",\n dimensions: rowDimensions,\n paths: rowPaths.values(),\n totals,\n sorts,\n cells,\n });\n const columnTree = buildPivotDimensionTree({\n axis: \"column\",\n dimensions: columnDimensions,\n paths: columnPaths.values(),\n totals,\n sorts,\n cells,\n });\n\n return {\n records,\n rowPaths,\n columnPaths,\n cells,\n rowTree: rowTree.root,\n columnTree: columnTree.root,\n rowNodes: rowTree.nodeMap,\n columnNodes: columnTree.nodeMap,\n };\n}\n\nfunction addRecordToAggregate<RecordType>(params: {\n pending: Map<string, PendingAggregate<RecordType>>;\n registry: PivotAggregatorRegistry<RecordType>;\n rowPathKey: string;\n columnPathKey: string;\n indicator: PivotIndicator<RecordType>;\n record: RecordType;\n recordIndex: number;\n}) {\n const {\n pending,\n registry,\n rowPathKey,\n columnPathKey,\n indicator,\n record,\n recordIndex,\n } = params;\n const cellKey = createPivotCellKey(rowPathKey, columnPathKey, indicator.key);\n let target = pending.get(cellKey);\n if (!target) {\n const aggregator = resolvePivotIndicatorAggregator(indicator, registry);\n target = {\n rowPathKey,\n columnPathKey,\n indicator,\n aggregator,\n state: aggregator.create(),\n recordIndexes: [],\n };\n pending.set(cellKey, target);\n }\n const value = indicator.valueGetter\n ? indicator.valueGetter(record, recordIndex)\n : getValueByDataIndex(record, indicator.dataIndex);\n target.state =\n target.aggregator.add(target.state, value, {\n record,\n recordIndex,\n indicatorKey: indicator.key,\n }) ?? target.state;\n target.recordIndexes.push(recordIndex);\n}\n\nfunction resolveAggregatePathTargets(params: {\n axis: \"row\" | \"column\";\n path: PivotResolvedPath;\n includeSubtotals: boolean;\n includeGrandTotal: boolean;\n}) {\n const rootPathKey = encodePivotPath([]);\n const result = params.path.values.length\n ? params.path.values.map((_, depth) =>\n encodePivotPath(\n params.path.values.slice(0, depth + 1).map((value) => value.valueKey),\n ),\n )\n : [params.path.key];\n if (!result.includes(rootPathKey)) result.push(rootPathKey);\n if (params.includeSubtotals) {\n for (let depth = 1; depth < params.path.values.length; depth += 1) {\n const parentPathKey = encodePivotPath(\n params.path.values.slice(0, depth).map((value) => value.valueKey),\n );\n result.push(createPivotSubtotalPathKey(params.axis, parentPathKey));\n }\n }\n if (params.includeGrandTotal) {\n result.push(createPivotGrandTotalPathKey(params.axis));\n }\n return result;\n}\n\nfunction resolvePath<RecordType>(\n record: RecordType,\n recordIndex: number,\n dimensions: PivotDimension<RecordType>[],\n): PivotResolvedPath {\n const values = dimensions.map((dimension) =>\n resolvePivotDimensionValue({ record, recordIndex, dimension }),\n );\n return {\n key: encodePivotPath(values.map((value) => value.valueKey)),\n values,\n };\n}\n\nfunction validatePivotConfiguration<RecordType>(\n rowDimensions: PivotDimension<RecordType>[],\n columnDimensions: PivotDimension<RecordType>[],\n indicators: PivotIndicator<RecordType>[],\n) {\n const dimensionKeys = [...rowDimensions, ...columnDimensions].map(\n resolvePivotDimensionKey,\n );\n assertUniqueKeys(dimensionKeys, \"维度\");\n assertUniqueKeys(\n indicators.map((indicator) => indicator.key),\n \"指标\",\n );\n}\n\nfunction assertUniqueKeys(keys: string[], label: string) {\n const seen = new Set<string>();\n keys.forEach((key) => {\n if (!key.trim()) {\n throw new Error(`PivotTable ${label} key 不能为空。`);\n }\n if (seen.has(key)) {\n throw new Error(`PivotTable ${label} key 重复:${key}`);\n }\n seen.add(key);\n });\n}\n\nfunction formatAggregateValue(value: unknown, precision?: number) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return precision == null ? String(value) : value.toFixed(precision);\n }\n return value == null ? \"\" : String(value);\n}\n","import type { PivotDimension } from \"../../schema/dimension\";\nimport type {\n PivotDimensionFilter,\n PivotFilterCondition,\n PivotFilterState,\n} from \"../../schema/state\";\nimport type { PivotFilterAxis } from \"../../schema/events\";\nimport type { PivotFilterOptionItem } from \"../../ui/types\";\nimport {\n encodePivotDimensionValue,\n resolvePivotDimensionValue,\n} from \"../data/dimension-key\";\nimport { resolvePivotDimensionKey } from \"../data/dimension-config\";\n\n/** 创建空的行、列与报告字段过滤状态。 */\nexport function createEmptyPivotFilterState(): PivotFilterState {\n return { rows: {}, columns: {}, filters: {} };\n}\n\n/** 按当前行、列与报告字段条件过滤原始记录。 */\nexport function filterPivotRecords<RecordType>(params: {\n records: RecordType[];\n rows: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n filterDimensions?: PivotDimension<RecordType>[];\n filters?: PivotFilterState;\n exclude?: { axis: PivotFilterAxis; dimensionKey: string };\n}) {\n const filters = params.filters;\n if (!filters) return params.records;\n return params.records.filter(\n (record, recordIndex) =>\n matchesDimensions(\n record,\n recordIndex,\n params.rows,\n filters.rows,\n \"row\",\n params.exclude,\n ) &&\n matchesDimensions(\n record,\n recordIndex,\n params.columns,\n filters.columns,\n \"column\",\n params.exclude,\n ) &&\n matchesDimensions(\n record,\n recordIndex,\n params.filterDimensions ?? [],\n filters.filters ?? {},\n \"filter\",\n params.exclude,\n ),\n );\n}\n\n/** 统计指定维度在其他过滤条件下的候选成员。 */\nexport function getPivotDimensionFilterOptions<RecordType>(params: {\n records: RecordType[];\n rows: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n filterDimensions?: PivotDimension<RecordType>[];\n filters?: PivotFilterState;\n axis: PivotFilterAxis;\n dimensionKey: string;\n}): PivotFilterOptionItem[] {\n const dimensions =\n params.axis === \"row\"\n ? params.rows\n : params.axis === \"column\"\n ? params.columns\n : (params.filterDimensions ?? []);\n const dimension = dimensions.find(\n (item) => resolvePivotDimensionKey(item) === params.dimensionKey,\n );\n if (!dimension) return [];\n const records = filterPivotRecords({\n ...params,\n exclude: { axis: params.axis, dimensionKey: params.dimensionKey },\n });\n const counts = new Map<\n string,\n { label: string; count: number; blank: boolean }\n >();\n records.forEach((record, recordIndex) => {\n const value = resolvePivotDimensionValue({\n record,\n recordIndex,\n dimension,\n });\n const current = counts.get(value.filterOptionKey);\n if (current) current.count += 1;\n else {\n counts.set(value.filterOptionKey, {\n label: value.label,\n count: 1,\n blank:\n value.filterOptionValue == null || value.filterOptionValue === \"\",\n });\n }\n });\n const values = dimension.filterOptions?.length\n ? dimension.filterOptions\n .map((option) =>\n typeof option === \"string\"\n ? { label: option, rawValue: option }\n : { label: option.label, rawValue: option.value },\n )\n .filter((item) => item.rawValue != null && item.rawValue !== \"\")\n .map((item) => {\n const value = encodeFilterOptionValue(item.rawValue);\n return {\n label: item.label,\n value,\n count: counts.get(value)?.count ?? 0,\n kind: \"value\" as const,\n };\n })\n : Array.from(counts, ([value, item]) => ({ value, ...item }))\n .filter((item) => !item.blank)\n .map((item) => ({\n label: item.label,\n value: item.value,\n count: item.count,\n kind: \"value\" as const,\n }));\n const blankCount = Array.from(counts.values()).reduce(\n (sum, item) => sum + (item.blank ? item.count : 0),\n 0,\n );\n return [\n { label: \"全部\", value: \"__all__\", count: records.length, kind: \"all\" },\n { label: \"空\", value: \"__blank__\", count: blankCount, kind: \"blank\" },\n {\n label: \"非空\",\n value: \"__not_blank__\",\n count: records.length - blankCount,\n kind: \"notBlank\",\n },\n ...values,\n ];\n}\n\nfunction matchesDimensions<RecordType>(\n record: RecordType,\n recordIndex: number,\n dimensions: PivotDimension<RecordType>[],\n filters: Record<string, PivotDimensionFilter>,\n axis: PivotFilterAxis,\n exclude?: { axis: PivotFilterAxis; dimensionKey: string },\n) {\n return dimensions.every((dimension) => {\n const dimensionKey = resolvePivotDimensionKey(dimension);\n if (exclude?.axis === axis && exclude.dimensionKey === dimensionKey)\n return true;\n const filter = filters[dimensionKey];\n if (!filter) return true;\n const value = resolvePivotDimensionValue({\n record,\n recordIndex,\n dimension,\n });\n if (\n filter.selectedKeys &&\n !matchesSelectedKeys(\n filter.selectedKeys,\n value.filterOptionKey,\n value.filterOptionValue,\n )\n ) {\n return false;\n }\n if (\n !filter.selectedKeys?.length &&\n !matchesSearchKeyword(value.filterValue, filter)\n ) {\n return false;\n }\n return matchesFilterConditions(value.filterValue, filter);\n });\n}\n\nfunction encodeFilterOptionValue(value: unknown) {\n return encodePivotDimensionValue(value);\n}\n\nfunction matchesSelectedKeys(\n selectedKeys: string[],\n valueKey: string,\n optionValue: unknown,\n) {\n const blank = optionValue == null || optionValue === \"\";\n return (\n selectedKeys.includes(\"__all__\") ||\n selectedKeys.includes(valueKey) ||\n (blank && selectedKeys.includes(\"__blank__\")) ||\n (!blank && selectedKeys.includes(\"__not_blank__\"))\n );\n}\n\nfunction matchesSearchKeyword(value: unknown, filter: PivotDimensionFilter) {\n const keyword = filter.searchKeyword?.trim().toLocaleLowerCase() ?? \"\";\n if (!keyword) return true;\n const text = String(value ?? \"\").toLocaleLowerCase();\n return filter.searchExact ? text === keyword : text.includes(keyword);\n}\n\nfunction matchesFilterConditions(value: unknown, filter: PivotDimensionFilter) {\n const first = filter.condition;\n const second = filter.secondCondition;\n const firstActive = first && first.operator !== \"none\";\n const secondActive = second && second.operator !== \"none\";\n if (!firstActive && !secondActive) return true;\n if (!firstActive) return evaluateCondition(value, second!);\n if (!secondActive) return evaluateCondition(value, first);\n return filter.conditionRelation === \"or\"\n ? evaluateCondition(value, first) || evaluateCondition(value, second)\n : evaluateCondition(value, first) && evaluateCondition(value, second);\n}\n\nfunction evaluateCondition(value: unknown, condition: PivotFilterCondition) {\n const text = value == null ? \"\" : String(value);\n const expected = condition.value == null ? \"\" : String(condition.value);\n switch (condition.operator) {\n case \"none\":\n return true;\n case \"equals\":\n return text === expected;\n case \"notEquals\":\n return text !== expected;\n case \"contains\":\n return text.includes(expected);\n case \"notContains\":\n return !text.includes(expected);\n case \"startsWith\":\n return text.startsWith(expected);\n case \"notStartsWith\":\n return !text.startsWith(expected);\n case \"endsWith\":\n return text.endsWith(expected);\n case \"notEndsWith\":\n return !text.endsWith(expected);\n case \"greaterThan\":\n return compare(value, condition.value) > 0;\n case \"greaterThanOrEqual\":\n return compare(value, condition.value) >= 0;\n case \"lessThan\":\n return compare(value, condition.value) < 0;\n case \"lessThanOrEqual\":\n return compare(value, condition.value) <= 0;\n case \"between\":\n return (\n compare(value, condition.value) >= 0 &&\n compare(value, condition.secondValue) <= 0\n );\n case \"notBetween\":\n return (\n compare(value, condition.value) < 0 ||\n compare(value, condition.secondValue) > 0\n );\n case \"blank\":\n return value == null || value === \"\";\n case \"notBlank\":\n return value != null && value !== \"\";\n }\n}\n\nfunction compare(left: unknown, right: unknown) {\n if (typeof left === \"number\" && typeof right === \"number\")\n return left - right;\n return String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\n","import { aggregatePivotRecords } from \"../domain/aggregation/aggregate-records\";\nimport { createPivotCellKey } from \"../domain/pivot/pivot-cell\";\nimport type { PivotModel } from \"../domain/pivot/pivot-model\";\nimport type { PivotTableOptions } from \"../schema/options\";\nimport { filterPivotRecords } from \"../domain/filter/pivot-filter\";\n\n/** 根据当前配置构建 PivotModel。 */\nexport function buildPivotModel<RecordType>(\n options: PivotTableOptions<RecordType>,\n) {\n const records = filterPivotRecords({\n records: options.dataSource,\n rows: options.rows,\n columns: options.columns,\n filterDimensions: options.filterDimensions,\n filters: options.filters,\n });\n return aggregatePivotRecords({\n records,\n rowDimensions: options.rows,\n columnDimensions: options.columns,\n indicators: options.indicators,\n aggregators: options.aggregators,\n totals: options.totals,\n sorts: options.sorts,\n });\n}\n\n/** PivotModel 实例级缓存。 */\nexport class PivotModelCache<RecordType> {\n private options: PivotTableOptions<RecordType> | null = null;\n private model: PivotModel<RecordType> | null = null;\n private buildDurationMs = 0;\n private buildCount = 0;\n\n /** 配置的数据和领域输入未变化时复用聚合结果。 */\n getOrBuild(options: PivotTableOptions<RecordType>) {\n if (\n this.model &&\n this.options &&\n canReusePivotModel(this.options, options)\n ) {\n return this.model;\n }\n if (this.model && this.options) {\n const incremental = rebuildChangedIndicators({\n previousOptions: this.options,\n nextOptions: options,\n previousModel: this.model,\n });\n if (incremental) {\n this.options = options;\n this.model = incremental.model;\n this.buildDurationMs = incremental.buildDurationMs;\n this.buildCount += 1;\n return this.model;\n }\n }\n this.options = options;\n const startedAt = now();\n this.model = buildPivotModel(options);\n this.buildDurationMs = now() - startedAt;\n this.buildCount += 1;\n return this.model;\n }\n\n /** 清除缓存引用。 */\n clear() {\n this.options = null;\n this.model = null;\n }\n\n /** 获取最近一次模型构建指标。 */\n getMetrics() {\n return {\n buildDurationMs: this.buildDurationMs,\n buildCount: this.buildCount,\n };\n }\n}\n\nfunction rebuildChangedIndicators<RecordType>(params: {\n previousOptions: PivotTableOptions<RecordType>;\n nextOptions: PivotTableOptions<RecordType>;\n previousModel: PivotModel<RecordType>;\n}) {\n const { previousOptions, nextOptions, previousModel } = params;\n if (\n !canReusePivotStructure(previousOptions, nextOptions) ||\n nextOptions.indicators.length === 0 ||\n nextOptions.sorts?.some((sort) => sort.by === \"indicator\")\n ) {\n return null;\n }\n const previousIndicators = new Map(\n previousOptions.indicators.map((indicator) => [indicator.key, indicator]),\n );\n const changedIndicators = nextOptions.indicators.filter(\n (indicator) => previousIndicators.get(indicator.key) !== indicator,\n );\n const retainedKeys = new Set(\n nextOptions.indicators\n .filter(\n (indicator) => previousIndicators.get(indicator.key) === indicator,\n )\n .map((indicator) => indicator.key),\n );\n const startedAt = now();\n const cells = new Map(\n Array.from(previousModel.cells).filter(([, cell]) =>\n retainedKeys.has(cell.indicatorKey),\n ),\n );\n if (changedIndicators.length > 0) {\n const partialModel = buildPivotModel({\n ...nextOptions,\n indicators: changedIndicators,\n });\n partialModel.cells.forEach((cell, key) => cells.set(key, cell));\n }\n return {\n model: { ...previousModel, cells },\n buildDurationMs: now() - startedAt,\n };\n}\n\nfunction canReusePivotStructure<RecordType>(\n previous: PivotTableOptions<RecordType>,\n next: PivotTableOptions<RecordType>,\n) {\n return (\n previous.dataSource === next.dataSource &&\n previous.dataVersion === next.dataVersion &&\n previous.rows === next.rows &&\n previous.columns === next.columns &&\n previous.filterDimensions === next.filterDimensions &&\n previous.aggregators === next.aggregators &&\n previous.totals === next.totals &&\n previous.filters === next.filters &&\n previous.sorts === next.sorts\n );\n}\n\n/** 获取聚合单元格对应的原始记录。 */\nexport function getPivotCellRecords<RecordType>(params: {\n model: PivotModel<RecordType>;\n rowPathKey: string;\n columnPathKey: string;\n indicatorKey: string;\n}) {\n const { model, rowPathKey, columnPathKey, indicatorKey } = params;\n const cell = model.cells.get(\n createPivotCellKey(rowPathKey, columnPathKey, indicatorKey),\n );\n return (\n cell?.recordIndexes\n .map((index) => model.records[index])\n .filter((record): record is RecordType => record !== undefined) ?? []\n );\n}\n\nfunction canReusePivotModel<RecordType>(\n previous: PivotTableOptions<RecordType>,\n next: PivotTableOptions<RecordType>,\n) {\n return (\n previous.dataSource === next.dataSource &&\n previous.dataVersion === next.dataVersion &&\n previous.rows === next.rows &&\n previous.columns === next.columns &&\n previous.filterDimensions === next.filterDimensions &&\n previous.indicators === next.indicators &&\n previous.aggregators === next.aggregators &&\n previous.totals === next.totals &&\n previous.filters === next.filters &&\n previous.sorts === next.sorts\n );\n}\n\nfunction now() {\n return globalThis.performance?.now() ?? Date.now();\n}\n","import type { PivotNode } from \"./pivot-node\";\n\n/** 根据展开状态生成当前可见叶节点。 */\nexport function flattenVisiblePivotLeaves(params: {\n root: PivotNode;\n expandedNodeIds: ReadonlySet<string>;\n defaultExpandDepth?: number;\n}) {\n const { root, expandedNodeIds, defaultExpandDepth = 0 } = params;\n const result: PivotNode[] = [];\n const visit = (node: PivotNode) => {\n if (node.kind !== \"root\" && node.children.length === 0) {\n result.push(node);\n return;\n }\n const expanded =\n node.kind === \"root\" ||\n expandedNodeIds.has(node.id) ||\n node.depth < defaultExpandDepth;\n if (!expanded) {\n result.push(node);\n return;\n }\n node.children.forEach(visit);\n };\n visit(root);\n return result;\n}\n","import type { PivotScrollbarLayout } from \"./scrollbar-types\";\n\nconst SCROLLBAR_THICKNESS = 10;\nconst MIN_THUMB_SIZE = 36;\nconst VERTICAL_TOP_INSET = 6;\n\n/** 计算覆盖于 PivotTable Canvas 上的双轴滚动条布局。 */\nexport function computePivotScrollbarLayout(params: {\n width: number;\n height: number;\n bodyTop: number;\n bodyHeight: number;\n bodyWidth: number;\n totalBodyWidth: number;\n totalBodyHeight: number;\n scrollLeft: number;\n scrollTop: number;\n maxScrollLeft: number;\n maxScrollTop: number;\n}): PivotScrollbarLayout {\n const result: PivotScrollbarLayout = {};\n const hasHorizontal = params.maxScrollLeft > 0;\n const hasVertical = params.maxScrollTop > 0;\n\n if (hasHorizontal) {\n const fullWidth = Math.max(\n params.width - (hasVertical ? SCROLLBAR_THICKNESS : 0),\n 0,\n );\n const buttonSize = Math.min(SCROLLBAR_THICKNESS, fullWidth / 3);\n const trackWidth = Math.max(fullWidth - buttonSize * 2, 0);\n const thumbWidth = resolveThumbSize(\n params.bodyWidth,\n params.totalBodyWidth,\n trackWidth,\n );\n const thumbOffset = resolveThumbOffset(\n params.scrollLeft,\n params.maxScrollLeft,\n trackWidth,\n thumbWidth,\n );\n result.horizontal = {\n decreaseButton: {\n x: 0,\n y: params.height - SCROLLBAR_THICKNESS,\n width: buttonSize,\n height: SCROLLBAR_THICKNESS,\n },\n increaseButton: {\n x: fullWidth - buttonSize,\n y: params.height - SCROLLBAR_THICKNESS,\n width: buttonSize,\n height: SCROLLBAR_THICKNESS,\n },\n track: {\n x: buttonSize,\n y: params.height - SCROLLBAR_THICKNESS,\n width: trackWidth,\n height: SCROLLBAR_THICKNESS,\n },\n thumb: {\n x: buttonSize + thumbOffset,\n y: params.height - SCROLLBAR_THICKNESS,\n width: thumbWidth,\n height: SCROLLBAR_THICKNESS,\n },\n };\n }\n\n if (hasVertical) {\n const fullHeight = Math.max(\n params.bodyHeight -\n VERTICAL_TOP_INSET -\n (hasHorizontal ? SCROLLBAR_THICKNESS : 0),\n 0,\n );\n const buttonSize = Math.min(SCROLLBAR_THICKNESS, fullHeight / 3);\n const trackHeight = Math.max(fullHeight - buttonSize * 2, 0);\n const thumbHeight = resolveThumbSize(\n params.bodyHeight,\n params.totalBodyHeight,\n trackHeight,\n );\n const thumbOffset = resolveThumbOffset(\n params.scrollTop,\n params.maxScrollTop,\n trackHeight,\n thumbHeight,\n );\n const x = params.width - SCROLLBAR_THICKNESS;\n const y = params.bodyTop + VERTICAL_TOP_INSET;\n result.vertical = {\n decreaseButton: { x, y, width: SCROLLBAR_THICKNESS, height: buttonSize },\n increaseButton: {\n x,\n y: y + fullHeight - buttonSize,\n width: SCROLLBAR_THICKNESS,\n height: buttonSize,\n },\n track: {\n x,\n y: y + buttonSize,\n width: SCROLLBAR_THICKNESS,\n height: trackHeight,\n },\n thumb: {\n x,\n y: y + buttonSize + thumbOffset,\n width: SCROLLBAR_THICKNESS,\n height: thumbHeight,\n },\n };\n }\n\n return result;\n}\n\nfunction resolveThumbSize(viewport: number, content: number, track: number) {\n if (content <= 0 || track <= 0) return 0;\n return Math.min(Math.max((viewport / content) * track, MIN_THUMB_SIZE), track);\n}\n\nfunction resolveThumbOffset(\n scroll: number,\n maxScroll: number,\n track: number,\n thumb: number,\n) {\n if (maxScroll <= 0) return 0;\n return (scroll / maxScroll) * Math.max(track - thumb, 0);\n}\n","import { clamp } from \"@canvas-components/utils\";\nimport type { PivotModel } from \"../pivot/pivot-model\";\nimport type { PivotNode } from \"../pivot/pivot-node\";\nimport { createPivotCellKey } from \"../pivot/pivot-cell\";\nimport { encodePivotPath } from \"../data/dimension-key\";\nimport type { PivotTableOptions } from \"../../schema/options\";\nimport type { PivotDimensionFilter } from \"../../schema/state\";\nimport type {\n PivotAxisSlot,\n PivotBodyCellLayout,\n PivotHeaderCellLayout,\n PivotLayoutSnapshot,\n PivotReportFilterCellLayout,\n} from \"./types\";\nimport { computePivotScrollbarLayout } from \"./compute-scrollbar-layout\";\nimport {\n resolvePivotDimensionKey,\n resolvePivotDimensionTitle,\n resolvePivotDimensionWidth,\n} from \"../data/dimension-config\";\nimport { getPivotDimensionFilterOptions } from \"../filter/pivot-filter\";\n\nconst DEFAULT_ROW_HEIGHT = 40;\nconst DEFAULT_COLUMN_WIDTH = 120;\nconst DEFAULT_HEADER_SIZE = 40;\nconst DEFAULT_ROW_DIMENSION_WIDTH = 140;\n\n/** 构建四区 PivotTable 布局快照。 */\nexport function buildPivotLayoutSnapshot<RecordType>(params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n visibleRowNodes: PivotNode[];\n visibleColumnNodes: PivotNode[];\n width: number;\n height: number;\n scroll: { left: number; top: number };\n columnWidths?: ReadonlyMap<string, number>;\n expandedRowNodeIds?: ReadonlySet<string>;\n expandedColumnNodeIds?: ReadonlySet<string>;\n}): PivotLayoutSnapshot {\n const { model, options, visibleRowNodes, visibleColumnNodes, width, height } =\n params;\n const indicatorLayout = options.indicatorLayout ?? \"columns\";\n const rowHeight = options.rowHeight ?? DEFAULT_ROW_HEIGHT;\n const columnWidth = options.columnWidth ?? DEFAULT_COLUMN_WIDTH;\n const rowDimensionWidths = options.rows.map((dimension) =>\n resolvePivotDimensionWidth(dimension),\n );\n const hasIndicators = options.indicators.length > 0;\n if (indicatorLayout === \"rows\" && hasIndicators) {\n rowDimensionWidths.push(\n Math.max(\n ...options.indicators.map(\n (indicator) => indicator.width ?? DEFAULT_COLUMN_WIDTH,\n ),\n ),\n );\n }\n if (rowDimensionWidths.length === 0) {\n rowDimensionWidths.push(DEFAULT_ROW_DIMENSION_WIDTH);\n }\n const rowHeaderWidth = rowDimensionWidths.reduce(\n (sum, item) => sum + item,\n 0,\n );\n const columnHeaderLevels = Math.max(\n options.columns.length +\n (indicatorLayout === \"columns\" && hasIndicators ? 1 : 0),\n 1,\n );\n const columnHeaderHeight = columnHeaderLevels * DEFAULT_HEADER_SIZE;\n const reportFilterHeight =\n (options.filterDimensions?.length ?? 0) * rowHeight;\n const tableHeaderHeight = reportFilterHeight + columnHeaderHeight;\n const bodyWidth = Math.max(width - rowHeaderWidth, 0);\n const availableBodyHeight = Math.max(height - tableHeaderHeight, 0);\n const rowSlots = createPivotAxisSlots({\n nodes: visibleRowNodes,\n indicators: options.indicators.map((indicator) => indicator.key),\n includeIndicators: indicatorLayout === \"rows\",\n });\n const columnSlots = createPivotAxisSlots({\n nodes: visibleColumnNodes,\n indicators: options.indicators.map((indicator) => indicator.key),\n includeIndicators: indicatorLayout === \"columns\",\n });\n const columnWidths = columnSlots.map((slot) =>\n resolveColumnSlotWidth({\n slot,\n model,\n options,\n runtimeWidth: params.columnWidths?.get(slot.key),\n fallbackWidth: columnWidth,\n }),\n );\n const columnOffsets = createOffsets(columnWidths);\n const totalBodyWidth = columnOffsets[columnOffsets.length - 1] ?? 0;\n const totalBodyHeight = rowSlots.length * rowHeight;\n const tableWidth = rowHeaderWidth + Math.min(bodyWidth, totalBodyWidth);\n // 数据不足时按实际内容收缩表体,避免表格在容器内留下无意义的空白区域。\n const bodyHeight = Math.min(availableBodyHeight, totalBodyHeight);\n const fittedHeight = tableHeaderHeight + bodyHeight;\n const maxScrollLeft = Math.max(totalBodyWidth - bodyWidth, 0);\n const maxScrollTop = Math.max(totalBodyHeight - bodyHeight, 0);\n const scroll = {\n left: clamp(params.scroll.left, 0, maxScrollLeft),\n top: clamp(params.scroll.top, 0, maxScrollTop),\n };\n const visibleRowRange = resolveVisibleRange({\n count: rowSlots.length,\n itemSize: rowHeight,\n viewportSize: bodyHeight,\n offset: scroll.top,\n overscan: options.overscanRowCount ?? 1,\n });\n const visibleColumnRange = resolveVariableVisibleRange({\n offsets: columnOffsets,\n viewportSize: bodyWidth,\n offset: scroll.left,\n overscan: options.overscanColumnCount ?? 1,\n });\n const reportFilterCells = buildReportFilterCells({\n options,\n tableWidth,\n rowHeaderWidth,\n rowHeight,\n });\n const rowFieldHeaderCells = buildRowFieldHeaderCells({\n options,\n rowDimensionWidths,\n columnHeaderHeight,\n headerTop: reportFilterHeight,\n });\n const rowHeaderCells = buildRowHeaderCells({\n model,\n options,\n slots: rowSlots,\n range: visibleRowRange,\n rowHeight,\n rowDimensionWidths,\n columnHeaderHeight: tableHeaderHeight,\n scrollTop: scroll.top,\n expandedNodeIds: params.expandedRowNodeIds,\n dimensionCount: options.rows.length,\n indicators: options.indicators,\n });\n const columnHeaderCells = buildColumnHeaderCells({\n model,\n options,\n slots: columnSlots,\n range: visibleColumnRange,\n columnWidths,\n columnOffsets,\n rowHeaderWidth,\n scrollLeft: scroll.left,\n levels: columnHeaderLevels,\n headerTop: reportFilterHeight,\n expandedNodeIds: params.expandedColumnNodeIds,\n });\n const bodyCells = buildBodyCells({\n model,\n rowSlots,\n columnSlots,\n rowRange: visibleRowRange,\n columnRange: visibleColumnRange,\n rowHeight,\n columnWidths,\n columnOffsets,\n rowHeaderWidth,\n columnHeaderHeight: tableHeaderHeight,\n scroll,\n });\n const scrollbar = computePivotScrollbarLayout({\n width,\n height: fittedHeight,\n bodyTop: tableHeaderHeight,\n bodyHeight,\n bodyWidth,\n totalBodyWidth,\n totalBodyHeight,\n scrollLeft: scroll.left,\n scrollTop: scroll.top,\n maxScrollLeft,\n maxScrollTop,\n });\n\n return {\n width,\n tableWidth,\n height: fittedHeight,\n recordCount: model.records.length,\n rowHeight,\n columnWidth,\n columnWidths,\n columnOffsets,\n rowHeaderWidth,\n rowDimensionWidths,\n reportFilterHeight,\n columnHeaderHeight,\n reportFilterRect: {\n x: 0,\n y: 0,\n width: tableWidth,\n height: reportFilterHeight,\n },\n cornerRect: {\n x: 0,\n y: reportFilterHeight,\n width: rowHeaderWidth,\n height: columnHeaderHeight,\n },\n rowHeaderRect: {\n x: 0,\n y: tableHeaderHeight,\n width: rowHeaderWidth,\n height: bodyHeight,\n },\n columnHeaderRect: {\n x: rowHeaderWidth,\n y: reportFilterHeight,\n width: bodyWidth,\n height: columnHeaderHeight,\n },\n bodyRect: {\n x: rowHeaderWidth,\n y: tableHeaderHeight,\n width: bodyWidth,\n height: bodyHeight,\n },\n rowSlots,\n columnSlots,\n visibleRowRange,\n visibleColumnRange,\n reportFilterCells,\n rowFieldHeaderCells,\n rowHeaderCells,\n columnHeaderCells,\n bodyCells,\n scroll,\n viewport: { maxScrollLeft, maxScrollTop, totalBodyWidth, totalBodyHeight },\n scrollbar,\n };\n}\n\nfunction buildReportFilterCells<RecordType>(params: {\n options: PivotTableOptions<RecordType>;\n tableWidth: number;\n rowHeaderWidth: number;\n rowHeight: number;\n}): PivotReportFilterCellLayout[] {\n const dimensions = params.options.filterDimensions ?? [];\n const labelWidth = Math.min(\n params.rowHeaderWidth,\n Math.max(params.tableWidth - 80, 0),\n );\n return dimensions.map((dimension, index) => {\n const dimensionKey = resolvePivotDimensionKey(dimension);\n const filter = params.options.filters?.filters?.[dimensionKey];\n const rect = {\n x: 0,\n y: index * params.rowHeight,\n width: params.tableWidth,\n height: params.rowHeight,\n };\n return {\n dimensionKey,\n label: resolvePivotDimensionTitle(dimension),\n valueLabel: resolveReportFilterValueLabel({\n options: params.options,\n dimensionKey,\n filter,\n }),\n active: isReportFilterActive(filter),\n rect,\n labelRect: { ...rect, width: labelWidth },\n valueRect: {\n ...rect,\n x: labelWidth,\n width: Math.max(rect.width - labelWidth, 0),\n },\n };\n });\n}\n\nfunction resolveReportFilterValueLabel<RecordType>(params: {\n options: PivotTableOptions<RecordType>;\n dimensionKey: string;\n filter: PivotDimensionFilter | undefined;\n}) {\n const filter = params.filter;\n if (!filter) return \"(全部)\";\n if (filter.condition?.operator && filter.condition.operator !== \"none\") {\n return \"(条件筛选)\";\n }\n if (filter.searchKeyword) return `(搜索:${filter.searchKeyword})`;\n const selectedKeys = filter.selectedKeys ?? [];\n if (selectedKeys.length === 0) return \"(全部)\";\n const options = getPivotDimensionFilterOptions({\n records: params.options.dataSource,\n rows: params.options.rows,\n columns: params.options.columns,\n filterDimensions: params.options.filterDimensions,\n filters: params.options.filters,\n axis: \"filter\",\n dimensionKey: params.dimensionKey,\n });\n const selectedKeySet = new Set(selectedKeys);\n const selectableKeys = options\n .filter((option) => option.kind !== \"all\")\n .map((option) => option.value);\n if (\n selectedKeySet.has(\"__all__\") ||\n (selectableKeys.length > 0 &&\n selectableKeys.every((key) => selectedKeySet.has(key)))\n ) {\n return \"(全部)\";\n }\n if (selectedKeys.length > 1) return `(多项:${selectedKeys.length})`;\n return (\n options.find((option) => option.value === selectedKeys[0])?.label ??\n \"(1 项)\"\n );\n}\n\nfunction isReportFilterActive(filter: PivotDimensionFilter | undefined) {\n return Boolean(\n filter &&\n ((filter.selectedKeys?.length ?? 0) > 0 ||\n filter.searchKeyword ||\n (filter.condition?.operator && filter.condition.operator !== \"none\")),\n );\n}\n\nfunction buildRowFieldHeaderCells<RecordType>(params: {\n options: PivotTableOptions<RecordType>;\n rowDimensionWidths: number[];\n columnHeaderHeight: number;\n headerTop: number;\n}) {\n let x = 0;\n return params.options.rows.map((dimension, level) => {\n const dimensionKey = resolvePivotDimensionKey(dimension);\n const width = params.rowDimensionWidths[level] ?? 0;\n const cell: PivotHeaderCellLayout = {\n axis: \"row\",\n dimensionKey,\n nodeId: null,\n pathKey: encodePivotPath([]),\n indicatorKey: null,\n kind: \"dimension\",\n label: resolvePivotDimensionTitle(dimension),\n align: dimension.align,\n level,\n rowSpan: 1,\n columnSpan: 1,\n expandable: false,\n expanded: false,\n filterable: dimension.allowFilter ?? false,\n filterActive: isDimensionFilterActive(\n params.options.filters?.rows,\n dimensionKey,\n ),\n sortable: dimension.allowSort ?? false,\n sortDirection: resolveDimensionSort(params.options, \"row\", dimensionKey),\n rect: {\n x,\n y: params.headerTop,\n width,\n height: params.columnHeaderHeight,\n },\n };\n x += width;\n return cell;\n });\n}\n\n/** 根据轴节点和指标布局生成最终值槽位。 */\nexport function createPivotAxisSlots(params: {\n nodes: PivotNode[];\n indicators: string[];\n includeIndicators: boolean;\n}) {\n const baseNodes = params.nodes.length ? params.nodes : [null];\n if (!params.includeIndicators) {\n return baseNodes.map((node) => createAxisSlot(node, null));\n }\n if (params.indicators.length === 0) {\n return baseNodes.map((node) => createAxisSlot(node, null));\n }\n return baseNodes.flatMap((node) =>\n params.indicators.map((indicatorKey) => createAxisSlot(node, indicatorKey)),\n );\n}\n\nfunction createAxisSlot(\n node: PivotNode | null,\n indicatorKey: string | null,\n): PivotAxisSlot {\n return {\n key: JSON.stringify([node?.id ?? null, indicatorKey]),\n nodeId: node?.id ?? null,\n pathKey: node?.pathKey ?? encodePivotPath([]),\n indicatorKey,\n kind: node?.kind ?? \"empty\",\n };\n}\n\nfunction buildRowHeaderCells<RecordType>(params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n slots: PivotAxisSlot[];\n range: { start: number; end: number };\n rowHeight: number;\n rowDimensionWidths: number[];\n columnHeaderHeight: number;\n scrollTop: number;\n expandedNodeIds?: ReadonlySet<string>;\n dimensionCount: number;\n indicators: PivotTableOptions<RecordType>[\"indicators\"];\n}) {\n const cells: PivotHeaderCellLayout[] = [];\n for (\n let rowIndex = params.range.start;\n rowIndex < params.range.end;\n rowIndex += 1\n ) {\n const slot = params.slots[rowIndex];\n if (!slot) continue;\n const node = slot.nodeId ? params.model.rowNodes.get(slot.nodeId) : null;\n const chain = node\n ? resolveDimensionChain(node, params.model.rowNodes)\n : [];\n if (!node || node.kind === \"subtotal\" || node.kind === \"grandTotal\") {\n const dimensionSpan = Math.max(\n params.dimensionCount,\n slot.indicatorKey ? 0 : 1,\n );\n if (dimensionSpan > 0) {\n cells.push({\n axis: \"row\",\n nodeId: node?.id ?? null,\n pathKey: slot.pathKey,\n indicatorKey: slot.indicatorKey,\n kind: node?.kind ?? \"empty\",\n label: node?.label ?? \"\",\n level: 0,\n rowSpan: 1,\n columnSpan: dimensionSpan,\n expandable: false,\n expanded: false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x: 0,\n y:\n params.columnHeaderHeight +\n rowIndex * params.rowHeight -\n params.scrollTop,\n width: sum(params.rowDimensionWidths.slice(0, dimensionSpan)),\n height: params.rowHeight,\n },\n });\n }\n if (slot.indicatorKey) {\n cells.push(\n createRowIndicatorCell({\n slot,\n rowIndex,\n rowHeight: params.rowHeight,\n columnHeaderHeight: params.columnHeaderHeight,\n scrollTop: params.scrollTop,\n rowDimensionWidths: params.rowDimensionWidths,\n dimensionCount: params.dimensionCount,\n indicators: params.indicators,\n }),\n );\n }\n continue;\n }\n chain.forEach((chainNode, level) => {\n const x = sum(params.rowDimensionWidths.slice(0, level));\n const isLastVisibleNode = chainNode.id === node.id;\n const columnSpan = isLastVisibleNode\n ? Math.max(params.dimensionCount - level, 1)\n : 1;\n cells.push({\n axis: \"row\",\n nodeId: chainNode.id,\n pathKey: chainNode.pathKey,\n indicatorKey: slot.indicatorKey,\n kind: chainNode.kind,\n label: chainNode.label,\n align: resolveDimensionAlign(\n params.options.rows,\n chainNode.dimensionKey,\n ),\n level,\n rowSpan: 1,\n columnSpan,\n expandable: chainNode.children.length > 0,\n expanded: params.expandedNodeIds?.has(chainNode.id) ?? false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x,\n y:\n params.columnHeaderHeight +\n rowIndex * params.rowHeight -\n params.scrollTop,\n width: sum(\n params.rowDimensionWidths.slice(level, level + columnSpan),\n ),\n height: params.rowHeight,\n },\n });\n });\n if (slot.indicatorKey) {\n cells.push(\n createRowIndicatorCell({\n slot,\n rowIndex,\n rowHeight: params.rowHeight,\n columnHeaderHeight: params.columnHeaderHeight,\n scrollTop: params.scrollTop,\n rowDimensionWidths: params.rowDimensionWidths,\n dimensionCount: params.dimensionCount,\n indicators: params.indicators,\n }),\n );\n }\n }\n return stabilizeRowHeaderCellSpans(\n mergeAdjacentRowHeaderCells(cells, params.rowHeight),\n params,\n );\n}\n\nfunction createRowIndicatorCell<RecordType>(params: {\n slot: PivotAxisSlot;\n rowIndex: number;\n rowHeight: number;\n columnHeaderHeight: number;\n scrollTop: number;\n rowDimensionWidths: number[];\n dimensionCount: number;\n indicators: PivotTableOptions<RecordType>[\"indicators\"];\n}): PivotHeaderCellLayout {\n const indicatorKey = params.slot.indicatorKey!;\n return {\n axis: \"row\",\n nodeId: params.slot.nodeId,\n pathKey: params.slot.pathKey,\n indicatorKey,\n kind: \"indicator\",\n label:\n params.indicators.find((indicator) => indicator.key === indicatorKey)\n ?.title ?? indicatorKey,\n level: params.dimensionCount,\n rowSpan: 1,\n columnSpan: 1,\n expandable: false,\n expanded: false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x: sum(params.rowDimensionWidths.slice(0, params.dimensionCount)),\n y:\n params.columnHeaderHeight +\n params.rowIndex * params.rowHeight -\n params.scrollTop,\n width:\n params.rowDimensionWidths[params.dimensionCount] ??\n DEFAULT_COLUMN_WIDTH,\n height: params.rowHeight,\n },\n };\n}\n\nfunction buildColumnHeaderCells<RecordType>(params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n slots: PivotAxisSlot[];\n range: { start: number; end: number };\n columnWidths: number[];\n columnOffsets: number[];\n rowHeaderWidth: number;\n scrollLeft: number;\n levels: number;\n headerTop: number;\n expandedNodeIds?: ReadonlySet<string>;\n}) {\n const cells: PivotHeaderCellLayout[] = [];\n for (\n let columnIndex = params.range.start;\n columnIndex < params.range.end;\n columnIndex += 1\n ) {\n const slot = params.slots[columnIndex];\n if (!slot) continue;\n const node = slot.nodeId ? params.model.columnNodes.get(slot.nodeId) : null;\n const chain = node\n ? resolveDimensionChain(node, params.model.columnNodes)\n : [];\n const columnWidth =\n params.columnWidths[columnIndex] ?? DEFAULT_COLUMN_WIDTH;\n const x =\n params.rowHeaderWidth +\n (params.columnOffsets[columnIndex] ?? 0) -\n params.scrollLeft;\n if (!node || node.kind === \"subtotal\" || node.kind === \"grandTotal\") {\n cells.push({\n axis: \"column\",\n nodeId: node?.id ?? null,\n pathKey: slot.pathKey,\n indicatorKey: slot.indicatorKey,\n kind: node?.kind ?? \"empty\",\n label: node?.label ?? slot.indicatorKey ?? \"\",\n level: 0,\n rowSpan: params.levels - (slot.indicatorKey ? 1 : 0),\n columnSpan: 1,\n expandable: false,\n expanded: false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x,\n y: params.headerTop,\n width: columnWidth,\n height:\n DEFAULT_HEADER_SIZE * (params.levels - (slot.indicatorKey ? 1 : 0)),\n },\n });\n } else {\n chain.forEach((chainNode, level) => {\n cells.push({\n axis: \"column\",\n nodeId: chainNode.id,\n pathKey: chainNode.pathKey,\n indicatorKey: null,\n kind: chainNode.kind,\n label: chainNode.label,\n align: resolveDimensionAlign(\n params.options.columns,\n chainNode.dimensionKey,\n ),\n level,\n rowSpan: 1,\n columnSpan: 1,\n expandable: chainNode.children.length > 0,\n expanded: params.expandedNodeIds?.has(chainNode.id) ?? false,\n filterable: isDimensionFilterable(\n params.options.columns,\n chainNode.dimensionKey,\n ),\n filterActive: isDimensionFilterActive(\n params.options.filters?.columns,\n chainNode.dimensionKey,\n ),\n sortable: isDimensionSortable(\n params.options.columns,\n chainNode.dimensionKey,\n ),\n sortDirection: resolveDimensionSort(\n params.options,\n \"column\",\n chainNode.dimensionKey,\n ),\n rect: {\n x,\n y: params.headerTop + level * DEFAULT_HEADER_SIZE,\n width: columnWidth,\n height: DEFAULT_HEADER_SIZE,\n },\n });\n });\n }\n if (slot.indicatorKey) {\n const indicator = params.options.indicators.find(\n (item) => item.key === slot.indicatorKey,\n );\n cells.push({\n axis: \"column\",\n nodeId: node?.id ?? null,\n pathKey: node?.pathKey ?? slot.pathKey,\n indicatorKey: slot.indicatorKey,\n kind: \"indicator\",\n label: indicator?.title ?? slot.indicatorKey,\n level: params.levels - 1,\n rowSpan: 1,\n columnSpan: 1,\n expandable: false,\n expanded: false,\n filterable: false,\n filterActive: false,\n sortable: false,\n sortDirection: null,\n rect: {\n x,\n y: params.headerTop + (params.levels - 1) * DEFAULT_HEADER_SIZE,\n width: columnWidth,\n height: DEFAULT_HEADER_SIZE,\n },\n });\n }\n }\n return stabilizeColumnHeaderCellSpans(\n mergeAdjacentColumnHeaderCells(cells),\n params,\n );\n}\n\nfunction buildBodyCells<RecordType>(params: {\n model: PivotModel<RecordType>;\n rowSlots: PivotAxisSlot[];\n columnSlots: PivotAxisSlot[];\n rowRange: { start: number; end: number };\n columnRange: { start: number; end: number };\n rowHeight: number;\n columnWidths: number[];\n columnOffsets: number[];\n rowHeaderWidth: number;\n columnHeaderHeight: number;\n scroll: { left: number; top: number };\n}) {\n const cells: PivotBodyCellLayout[] = [];\n for (\n let rowIndex = params.rowRange.start;\n rowIndex < params.rowRange.end;\n rowIndex += 1\n ) {\n const rowSlot = params.rowSlots[rowIndex];\n if (!rowSlot) continue;\n for (\n let columnIndex = params.columnRange.start;\n columnIndex < params.columnRange.end;\n columnIndex += 1\n ) {\n const columnSlot = params.columnSlots[columnIndex];\n if (!columnSlot) continue;\n const columnWidth =\n params.columnWidths[columnIndex] ?? DEFAULT_COLUMN_WIDTH;\n const indicatorKey = rowSlot.indicatorKey ?? columnSlot.indicatorKey;\n if (!indicatorKey) continue;\n const cell = params.model.cells.get(\n createPivotCellKey(rowSlot.pathKey, columnSlot.pathKey, indicatorKey),\n );\n cells.push({\n rowIndex,\n columnIndex,\n rowNodeId: rowSlot.nodeId,\n columnNodeId: columnSlot.nodeId,\n rowPathKey: rowSlot.pathKey,\n columnPathKey: columnSlot.pathKey,\n indicatorKey,\n value: cell?.value,\n formattedValue: cell?.formattedValue ?? \"\",\n rect: {\n x:\n params.rowHeaderWidth +\n (params.columnOffsets[columnIndex] ?? 0) -\n params.scroll.left,\n y:\n params.columnHeaderHeight +\n rowIndex * params.rowHeight -\n params.scroll.top,\n width: columnWidth,\n height: params.rowHeight,\n },\n });\n }\n }\n return cells;\n}\n\nfunction resolveDimensionChain(\n node: PivotNode,\n nodeMap: Map<string, PivotNode>,\n) {\n const chain: PivotNode[] = [];\n let current: PivotNode | undefined = node;\n while (current && current.kind !== \"root\") {\n if (current.kind === \"dimension\") chain.unshift(current);\n current = current.parentId ? nodeMap.get(current.parentId) : undefined;\n }\n return chain;\n}\n\nfunction mergeAdjacentRowHeaderCells(\n cells: PivotHeaderCellLayout[],\n rowHeight: number,\n) {\n const result: PivotHeaderCellLayout[] = [];\n cells.forEach((cell) => {\n const previous = result.find(\n (item) =>\n item.nodeId === cell.nodeId &&\n item.indicatorKey === cell.indicatorKey &&\n item.level === cell.level &&\n item.columnSpan === cell.columnSpan &&\n item.rect.y + item.rect.height === cell.rect.y,\n );\n if (\n previous &&\n previous.rect.x === cell.rect.x &&\n previous.rect.width === cell.rect.width\n ) {\n previous.rowSpan += 1;\n previous.rect.height += rowHeight;\n } else {\n result.push(cell);\n }\n });\n return result;\n}\n\nfunction stabilizeRowHeaderCellSpans<RecordType>(\n cells: PivotHeaderCellLayout[],\n params: {\n model: PivotModel<RecordType>;\n slots: PivotAxisSlot[];\n rowHeight: number;\n columnHeaderHeight: number;\n scrollTop: number;\n },\n) {\n const spanCache = new Map<string, { start: number; end: number }>();\n cells.forEach((cell) => {\n if (!cell.nodeId || cell.kind !== \"dimension\") return;\n const cacheKey = `${cell.nodeId}\\u0000${cell.indicatorKey ?? \"\"}`;\n let span = spanCache.get(cacheKey);\n if (!span) {\n const visibleSlotIndex = Math.round(\n (cell.rect.y - params.columnHeaderHeight + params.scrollTop) /\n params.rowHeight,\n );\n if (!slotContainsHeaderCell(params, visibleSlotIndex, cell)) return;\n let start = visibleSlotIndex;\n let end = visibleSlotIndex + 1;\n while (start > 0 && slotContainsHeaderCell(params, start - 1, cell)) {\n start -= 1;\n }\n while (\n end < params.slots.length &&\n slotContainsHeaderCell(params, end, cell)\n ) {\n end += 1;\n }\n span = { start, end };\n spanCache.set(cacheKey, span);\n }\n cell.rowSpan = span.end - span.start;\n cell.rect.y =\n params.columnHeaderHeight +\n span.start * params.rowHeight -\n params.scrollTop;\n cell.rect.height = cell.rowSpan * params.rowHeight;\n });\n return cells;\n}\n\nfunction slotContainsHeaderCell<RecordType>(\n params: {\n model: PivotModel<RecordType>;\n slots: PivotAxisSlot[];\n },\n slotIndex: number,\n cell: PivotHeaderCellLayout,\n) {\n const slot = params.slots[slotIndex];\n if (!slot || slot.indicatorKey !== cell.indicatorKey || !slot.nodeId) {\n return false;\n }\n const node = params.model.rowNodes.get(slot.nodeId);\n if (!node || node.kind === \"subtotal\" || node.kind === \"grandTotal\") {\n return false;\n }\n return resolveDimensionChain(node, params.model.rowNodes).some(\n (chainNode) => chainNode.id === cell.nodeId,\n );\n}\n\nfunction mergeAdjacentColumnHeaderCells(cells: PivotHeaderCellLayout[]) {\n const result: PivotHeaderCellLayout[] = [];\n cells.forEach((cell) => {\n const matching = result.find(\n (item) =>\n item.nodeId === cell.nodeId &&\n item.indicatorKey === cell.indicatorKey &&\n item.level === cell.level &&\n item.rect.x + item.rect.width === cell.rect.x,\n );\n if (matching) {\n matching.columnSpan += 1;\n matching.rect.width += cell.rect.width;\n } else {\n result.push(cell);\n }\n });\n return result;\n}\n\nfunction stabilizeColumnHeaderCellSpans<RecordType>(\n cells: PivotHeaderCellLayout[],\n params: {\n model: PivotModel<RecordType>;\n slots: PivotAxisSlot[];\n columnOffsets: number[];\n rowHeaderWidth: number;\n scrollLeft: number;\n },\n) {\n const spanCache = new Map<string, { start: number; end: number }>();\n cells.forEach((cell) => {\n if (!cell.nodeId || cell.kind !== \"dimension\") return;\n let span = spanCache.get(cell.nodeId);\n if (!span) {\n const contentX = cell.rect.x - params.rowHeaderWidth + params.scrollLeft;\n const visibleSlotIndex = params.columnOffsets.findIndex(\n (offset, index) =>\n index < params.slots.length && Math.abs(offset - contentX) < 0.01,\n );\n if (\n visibleSlotIndex < 0 ||\n !slotContainsColumnHeaderCell(params, visibleSlotIndex, cell)\n ) {\n return;\n }\n let start = visibleSlotIndex;\n let end = visibleSlotIndex + 1;\n while (\n start > 0 &&\n slotContainsColumnHeaderCell(params, start - 1, cell)\n ) {\n start -= 1;\n }\n while (\n end < params.slots.length &&\n slotContainsColumnHeaderCell(params, end, cell)\n ) {\n end += 1;\n }\n span = { start, end };\n spanCache.set(cell.nodeId, span);\n }\n cell.columnSpan = span.end - span.start;\n cell.rect.x =\n params.rowHeaderWidth +\n (params.columnOffsets[span.start] ?? 0) -\n params.scrollLeft;\n cell.rect.width =\n (params.columnOffsets[span.end] ?? 0) -\n (params.columnOffsets[span.start] ?? 0);\n });\n return cells;\n}\n\nfunction slotContainsColumnHeaderCell<RecordType>(\n params: {\n model: PivotModel<RecordType>;\n slots: PivotAxisSlot[];\n },\n slotIndex: number,\n cell: PivotHeaderCellLayout,\n) {\n const slot = params.slots[slotIndex];\n if (!slot?.nodeId) return false;\n const node = params.model.columnNodes.get(slot.nodeId);\n if (!node || node.kind === \"subtotal\" || node.kind === \"grandTotal\") {\n return false;\n }\n return resolveDimensionChain(node, params.model.columnNodes).some(\n (chainNode) => chainNode.id === cell.nodeId,\n );\n}\n\nfunction resolveVisibleRange(params: {\n count: number;\n itemSize: number;\n viewportSize: number;\n offset: number;\n overscan: number;\n}) {\n const start = Math.max(\n Math.floor(params.offset / params.itemSize) - params.overscan,\n 0,\n );\n const visibleCount =\n Math.ceil(params.viewportSize / params.itemSize) + params.overscan * 2;\n return { start, end: Math.min(start + visibleCount, params.count) };\n}\n\nfunction resolveVariableVisibleRange(params: {\n offsets: number[];\n viewportSize: number;\n offset: number;\n overscan: number;\n}) {\n const count = Math.max(params.offsets.length - 1, 0);\n let firstVisible = 0;\n while (\n firstVisible < count &&\n (params.offsets[firstVisible + 1] ?? 0) <= params.offset\n ) {\n firstVisible += 1;\n }\n const viewportEnd = params.offset + params.viewportSize;\n let end = firstVisible;\n while (end < count && (params.offsets[end] ?? 0) < viewportEnd) {\n end += 1;\n }\n return {\n start: Math.max(firstVisible - params.overscan, 0),\n end: Math.min(end + params.overscan, count),\n };\n}\n\nfunction createOffsets(widths: number[]) {\n const offsets = [0];\n widths.forEach((width) => {\n offsets.push((offsets[offsets.length - 1] ?? 0) + width);\n });\n return offsets;\n}\n\nfunction sum(values: number[]) {\n return values.reduce((total, value) => total + value, 0);\n}\n\nfunction isDimensionFilterable<RecordType>(\n dimensions: PivotTableOptions<RecordType>[\"rows\"],\n dimensionKey: string | null,\n) {\n return Boolean(\n dimensionKey &&\n dimensions.find(\n (dimension) => resolvePivotDimensionKey(dimension) === dimensionKey,\n )?.allowFilter,\n );\n}\n\nfunction resolveColumnSlotWidth<RecordType>(params: {\n slot: PivotAxisSlot;\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n runtimeWidth?: number;\n fallbackWidth: number;\n}) {\n const node = params.slot.nodeId\n ? params.model.columnNodes.get(params.slot.nodeId)\n : null;\n const dimension = node?.dimensionKey\n ? params.options.columns.find(\n (item) => resolvePivotDimensionKey(item) === node.dimensionKey,\n )\n : undefined;\n const indicatorWidth = params.slot.indicatorKey\n ? params.options.indicators.find(\n (item) => item.key === params.slot.indicatorKey,\n )?.width\n : undefined;\n const width =\n params.runtimeWidth ??\n indicatorWidth ??\n dimension?.width ??\n params.fallbackWidth;\n return dimension\n ? resolvePivotDimensionWidth(dimension, width, params.fallbackWidth)\n : width;\n}\n\nfunction resolveDimensionAlign<RecordType>(\n dimensions: PivotTableOptions<RecordType>[\"rows\"],\n dimensionKey: string | null,\n) {\n return dimensionKey\n ? dimensions.find(\n (dimension) => resolvePivotDimensionKey(dimension) === dimensionKey,\n )?.align\n : undefined;\n}\n\nfunction isDimensionFilterActive(\n filters: Record<string, unknown> | undefined,\n dimensionKey: string | null,\n) {\n return Boolean(dimensionKey && filters?.[dimensionKey]);\n}\n\nfunction isDimensionSortable<RecordType>(\n dimensions: PivotTableOptions<RecordType>[\"rows\"],\n dimensionKey: string | null,\n) {\n return Boolean(\n dimensionKey &&\n dimensions.find(\n (dimension) => resolvePivotDimensionKey(dimension) === dimensionKey,\n )?.allowSort,\n );\n}\n\nfunction resolveDimensionSort<RecordType>(\n options: PivotTableOptions<RecordType>,\n axis: \"row\" | \"column\",\n dimensionKey: string | null,\n) {\n return (\n options.sorts?.find(\n (item) => item.axis === axis && item.dimensionKey === dimensionKey,\n )?.direction ?? null\n );\n}\n","import * as XLSX from \"xlsx\";\nimport { serializeCsvRows } from \"@canvas-components/utils\";\nimport type { PivotModel } from \"../../domain/pivot/pivot-model\";\nimport type { PivotNode } from \"../../domain/pivot/pivot-node\";\nimport { createPivotCellKey } from \"../../domain/pivot/pivot-cell\";\nimport { createPivotAxisSlots } from \"../../domain/layout/pivot-layout\";\nimport type { PivotTableOptions } from \"../../schema/options\";\nimport { resolvePivotDimensionTitle } from \"../../domain/data/dimension-config\";\n\n/** PivotTable 导出矩阵。 */\nexport interface PivotExportMatrix {\n values: string[][];\n headerRowCount: number;\n rowHeaderColumnCount: number;\n merges: Array<{\n startRow: number;\n endRow: number;\n startColumn: number;\n endColumn: number;\n }>;\n}\n\n/** PivotTable 导出范围。 */\nexport interface PivotExportOptions {\n mode?: \"visible\" | \"all\";\n sheetName?: string;\n}\n\n/** 根据当前展开节点创建统一导出矩阵。 */\nexport function createPivotExportMatrix<RecordType>(params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n visibleRowNodes: PivotNode[];\n visibleColumnNodes: PivotNode[];\n}): PivotExportMatrix {\n const indicatorLayout = params.options.indicatorLayout ?? \"columns\";\n const indicators = params.options.indicators.map((item) => item.key);\n const hasIndicators = indicators.length > 0;\n const rowSlots = createPivotAxisSlots({\n nodes: params.visibleRowNodes,\n indicators,\n includeIndicators: indicatorLayout === \"rows\",\n });\n const columnSlots = createPivotAxisSlots({\n nodes: params.visibleColumnNodes,\n indicators,\n includeIndicators: indicatorLayout === \"columns\",\n });\n const rowHeaderColumnCount = Math.max(\n params.options.rows.length +\n (indicatorLayout === \"rows\" && hasIndicators ? 1 : 0),\n 1,\n );\n const headerRowCount = Math.max(\n params.options.columns.length +\n (indicatorLayout === \"columns\" && hasIndicators ? 1 : 0),\n 1,\n );\n const values: string[][] = Array.from(\n { length: headerRowCount },\n (_, level) => [\n ...Array.from({ length: rowHeaderColumnCount }, (_item, index) =>\n level === headerRowCount - 1\n ? resolveRowHeaderTitle(params.options, index, indicatorLayout)\n : \"\",\n ),\n ...columnSlots.map((slot) =>\n resolveColumnHeaderLabel(\n params,\n slot.nodeId,\n slot.indicatorKey,\n level,\n headerRowCount,\n ),\n ),\n ],\n );\n\n rowSlots.forEach((rowSlot) => {\n const rowHeaders = resolveRowHeaderLabels(\n params,\n rowSlot.nodeId,\n rowSlot.indicatorKey,\n rowHeaderColumnCount,\n );\n const row = [...rowHeaders];\n columnSlots.forEach((columnSlot) => {\n const indicatorKey = rowSlot.indicatorKey ?? columnSlot.indicatorKey;\n const cell = indicatorKey\n ? params.model.cells.get(\n createPivotCellKey(\n rowSlot.pathKey,\n columnSlot.pathKey,\n indicatorKey,\n ),\n )\n : undefined;\n row.push(cell?.formattedValue ?? \"\");\n });\n values.push(row);\n });\n\n return {\n values,\n headerRowCount,\n rowHeaderColumnCount,\n merges: resolveExportMerges(values, headerRowCount, rowHeaderColumnCount),\n };\n}\n\n/** 将导出矩阵序列化为 CSV。 */\nexport function exportPivotMatrixToCsv(matrix: PivotExportMatrix) {\n return serializeCsvRows(matrix.values, \"\\r\\n\");\n}\n\n/** 将导出矩阵序列化为 XLSX 字节。 */\nexport function exportPivotMatrixToXlsx(\n matrix: PivotExportMatrix,\n sheetName = \"数据透视表\",\n): Uint8Array {\n const worksheet = XLSX.utils.aoa_to_sheet(matrix.values);\n worksheet[\"!merges\"] = matrix.merges.map((merge) => ({\n s: { r: merge.startRow, c: merge.startColumn },\n e: { r: merge.endRow, c: merge.endColumn },\n }));\n const workbook = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName.slice(0, 31));\n return XLSX.write(workbook, { type: \"array\", bookType: \"xlsx\" });\n}\n\nfunction resolveColumnHeaderLabel<RecordType>(\n params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n },\n nodeId: string | null,\n indicatorKey: string | null,\n level: number,\n headerRowCount: number,\n) {\n if (indicatorKey && level === headerRowCount - 1) {\n return (\n params.options.indicators.find((item) => item.key === indicatorKey)\n ?.title ?? indicatorKey\n );\n }\n const node = nodeId ? params.model.columnNodes.get(nodeId) : undefined;\n if (!node) return \"\";\n if (node.kind !== \"dimension\") return level === 0 ? node.label : \"\";\n return resolveNodeChain(node, params.model.columnNodes)[level]?.label ?? \"\";\n}\n\nfunction resolveRowHeaderLabels<RecordType>(\n params: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n },\n nodeId: string | null,\n indicatorKey: string | null,\n count: number,\n) {\n const node = nodeId ? params.model.rowNodes.get(nodeId) : undefined;\n const labels = Array.from({ length: count }, () => \"\");\n if (node?.kind === \"dimension\") {\n resolveNodeChain(node, params.model.rowNodes).forEach((item, index) => {\n labels[index] = item.label;\n });\n } else if (node) {\n labels[0] = node.label;\n }\n if (indicatorKey) {\n labels[count - 1] =\n params.options.indicators.find((item) => item.key === indicatorKey)\n ?.title ?? indicatorKey;\n }\n return labels;\n}\n\nfunction resolveRowHeaderTitle<RecordType>(\n options: PivotTableOptions<RecordType>,\n index: number,\n indicatorLayout: \"columns\" | \"rows\",\n) {\n if (indicatorLayout === \"rows\" && index === options.rows.length)\n return \"指标\";\n const dimension = options.rows[index];\n return dimension ? resolvePivotDimensionTitle(dimension) : \"\";\n}\n\nfunction resolveNodeChain(node: PivotNode, nodes: Map<string, PivotNode>) {\n const result: PivotNode[] = [];\n let current: PivotNode | undefined = node;\n while (current && current.kind !== \"root\") {\n if (current.kind === \"dimension\") result.unshift(current);\n current = current.parentId ? nodes.get(current.parentId) : undefined;\n }\n return result;\n}\n\nfunction resolveExportMerges(\n values: string[][],\n headerRowCount: number,\n rowHeaderColumnCount: number,\n) {\n const merges: PivotExportMatrix[\"merges\"] = [];\n for (let row = 0; row < headerRowCount; row += 1) {\n mergeRuns(values[row] ?? [], rowHeaderColumnCount, (start, end) => {\n merges.push({\n startRow: row,\n endRow: row,\n startColumn: start,\n endColumn: end,\n });\n });\n }\n for (let column = 0; column < rowHeaderColumnCount; column += 1) {\n const columnValues = values\n .slice(headerRowCount)\n .map((row) => row[column] ?? \"\");\n mergeRuns(columnValues, 0, (start, end) => {\n merges.push({\n startRow: headerRowCount + start,\n endRow: headerRowCount + end,\n startColumn: column,\n endColumn: column,\n });\n });\n }\n return merges;\n}\n\nfunction mergeRuns(\n values: string[],\n startIndex: number,\n onMerge: (start: number, end: number) => void,\n) {\n let runStart = startIndex;\n for (let index = startIndex + 1; index <= values.length; index += 1) {\n if (\n index < values.length &&\n values[index] &&\n values[index] === values[runStart]\n )\n continue;\n if (values[runStart] && index - runStart > 1) onMerge(runStart, index - 1);\n runStart = index;\n }\n}\n","import type { PivotModel } from \"../domain/pivot/pivot-model\";\nimport type { PivotTableOptions } from \"../schema/options\";\nimport {\n getPivotCellRecords,\n PivotModelCache,\n} from \"../services/pivot-model-service\";\nimport { flattenVisiblePivotLeaves } from \"../domain/pivot/flatten-visible-tree\";\nimport type { PivotAxis, PivotFilterAxis } from \"../schema/events\";\nimport { buildPivotLayoutSnapshot } from \"../domain/layout/pivot-layout\";\nimport type { PivotLayoutSnapshot } from \"../domain/layout/types\";\nimport type {\n PivotCellAddress,\n PivotSelectionState,\n PivotDimensionFilter,\n PivotFilterState,\n} from \"../schema/state\";\nimport {\n createEmptyPivotFilterState,\n getPivotDimensionFilterOptions,\n} from \"../domain/filter/pivot-filter\";\nimport { createPivotExportMatrix } from \"../features/export/pivot-export\";\nimport { encodePivotPath } from \"../domain/data/dimension-key\";\nimport { createPivotCellKey } from \"../domain/pivot/pivot-cell\";\nimport type { PivotTableStateSnapshot } from \"../schema/persistence\";\nimport type { PivotSortRule } from \"../schema/sort\";\nimport {\n resolvePivotDefaultSorts,\n resolvePivotDimensionKey,\n resolvePivotDimensionWidth,\n} from \"../domain/data/dimension-config\";\n\n/** PivotTable 纯原生核心协调器。 */\nexport class PivotTableCore<RecordType> {\n private options: PivotTableOptions<RecordType>;\n private model: PivotModel<RecordType> | null;\n private readonly modelCache = new PivotModelCache<RecordType>();\n private expandedRowNodeIds: Set<string>;\n private expandedColumnNodeIds: Set<string>;\n private expansionVersion = 0;\n private layoutCache: {\n model: PivotModel<RecordType>;\n options: PivotTableOptions<RecordType>;\n expansionVersion: number;\n width: number;\n height: number;\n scrollLeft: number;\n scrollTop: number;\n snapshot: PivotLayoutSnapshot;\n } | null = null;\n private selection: PivotSelectionState;\n private filters: PivotFilterState;\n private sorts: PivotSortRule[];\n private rowDimensionWidths = new Map<string, number>();\n private columnWidths = new Map<string, number>();\n private visibleNodeCache: {\n model: PivotModel<RecordType>;\n expansionVersion: number;\n rows: ReturnType<typeof flattenVisiblePivotLeaves>;\n columns: ReturnType<typeof flattenVisiblePivotLeaves>;\n } | null = null;\n\n constructor(options: PivotTableOptions<RecordType>) {\n this.options = options;\n this.filters =\n options.filters ??\n options.defaultFilters ??\n createEmptyPivotFilterState();\n this.sorts =\n options.sorts ??\n options.defaultSorts ??\n resolvePivotDefaultSorts(options);\n this.model = this.modelCache.getOrBuild(this.getEffectiveOptions(options));\n this.expandedRowNodeIds = new Set(\n options.expandedRowKeys ?? options.defaultExpandedRowKeys ?? [],\n );\n this.expandedColumnNodeIds = new Set(\n options.expandedColumnKeys ?? options.defaultExpandedColumnKeys ?? [],\n );\n if (\n options.expandedRowKeys === undefined &&\n options.defaultExpandedRowKeys === undefined\n ) {\n this.expandedRowNodeIds = resolveDefaultExpandedNodes(\n this.model.rowNodes,\n options.rows,\n );\n }\n if (\n options.expandedColumnKeys === undefined &&\n options.defaultExpandedColumnKeys === undefined\n ) {\n this.expandedColumnNodeIds = resolveDefaultExpandedNodes(\n this.model.columnNodes,\n options.columns,\n );\n }\n this.selection = options.selection ?? {\n activeCell: null,\n anchorCell: null,\n ranges: [],\n };\n }\n\n /** 更新配置并重建当前数据模型。 */\n updateOptions(options: PivotTableOptions<RecordType>) {\n this.options = options;\n if (options.filters) this.filters = options.filters;\n if (options.sorts) this.sorts = options.sorts;\n this.model = this.modelCache.getOrBuild(this.getEffectiveOptions(options));\n if (options.expandedRowKeys) {\n this.expandedRowNodeIds = new Set(options.expandedRowKeys);\n }\n if (options.expandedColumnKeys) {\n this.expandedColumnNodeIds = new Set(options.expandedColumnKeys);\n }\n if (options.expandedRowKeys || options.expandedColumnKeys) {\n this.expansionVersion += 1;\n this.visibleNodeCache = null;\n }\n if (options.selection) this.selection = options.selection;\n else if (options.expandedRowKeys || options.expandedColumnKeys) {\n this.normalizeSelectionToVisibleNodes();\n }\n this.layoutCache = null;\n }\n\n /** 获取当前只读 PivotModel。 */\n getPivotModel() {\n return this.model;\n }\n\n /** 获取当前展开状态下的行轴可见叶节点。 */\n getVisibleRowNodes() {\n return this.resolveVisibleNodeCache()?.rows ?? [];\n }\n\n /** 获取当前展开状态下的列轴可见叶节点。 */\n getVisibleColumnNodes() {\n return this.resolveVisibleNodeCache()?.columns ?? [];\n }\n\n /** 获取可复用的当前布局快照。 */\n getLayoutSnapshot(params: {\n width: number;\n height: number;\n scrollLeft: number;\n scrollTop: number;\n }) {\n if (!this.model) return null;\n const cached = this.layoutCache;\n if (\n cached &&\n cached.model === this.model &&\n cached.options === this.options &&\n cached.expansionVersion === this.expansionVersion &&\n cached.width === params.width &&\n cached.height === params.height &&\n cached.scrollLeft === params.scrollLeft &&\n cached.scrollTop === params.scrollTop\n ) {\n return cached.snapshot;\n }\n const snapshot = buildPivotLayoutSnapshot({\n model: this.model,\n options: this.createLayoutOptions(),\n visibleRowNodes: this.getVisibleRowNodes(),\n visibleColumnNodes: this.getVisibleColumnNodes(),\n width: params.width,\n height: params.height,\n scroll: { left: params.scrollLeft, top: params.scrollTop },\n columnWidths: this.columnWidths,\n expandedRowNodeIds: this.expandedRowNodeIds,\n expandedColumnNodeIds: this.expandedColumnNodeIds,\n });\n this.layoutCache = {\n model: this.model,\n options: this.options,\n expansionVersion: this.expansionVersion,\n width: params.width,\n height: params.height,\n scrollLeft: params.scrollLeft,\n scrollTop: params.scrollTop,\n snapshot,\n };\n return snapshot;\n }\n\n /** 获取当前值区选区。 */\n getSelection() {\n return this.selection;\n }\n\n /** 设置完整选区状态。 */\n setSelection(selection: PivotSelectionState) {\n if (this.options.selection === undefined) this.selection = selection;\n this.options.onSelectionChange?.({\n activeCell: selection.activeCell,\n activeNode: selection.activeNode,\n selection,\n });\n return selection;\n }\n\n /** 设置当前活动单元格,并可从锚点扩展为矩形选区。 */\n selectCell(address: PivotCellAddress, extend = false) {\n const anchor =\n extend && this.selection.anchorCell ? this.selection.anchorCell : address;\n const next: PivotSelectionState = {\n activeCell: address,\n anchorCell: anchor,\n ranges: [{ start: anchor, end: address }],\n activeNode: null,\n };\n if (this.options.selection === undefined) this.selection = next;\n this.options.onSelectionChange?.({\n activeCell: address,\n activeNode: null,\n selection: next,\n });\n return next;\n }\n\n /** 选中稳定的行轴或列轴维度节点。 */\n selectNode(axis: PivotAxis, nodeId: string) {\n const node = (\n axis === \"row\" ? this.model?.rowNodes : this.model?.columnNodes\n )?.get(nodeId);\n if (!node) return null;\n const next: PivotSelectionState = {\n activeCell: null,\n anchorCell: null,\n ranges: [],\n activeNode: { axis, nodeId },\n };\n if (this.options.selection === undefined) this.selection = next;\n this.options.onSelectionChange?.({\n activeCell: null,\n activeNode: next.activeNode,\n selection: next,\n });\n return next;\n }\n\n /** 判断节点当前是否展开。 */\n isNodeExpanded(axis: PivotAxis, nodeId: string) {\n return (\n axis === \"row\" ? this.expandedRowNodeIds : this.expandedColumnNodeIds\n ).has(nodeId);\n }\n\n /** 获取当前双轴过滤状态。 */\n getFilters() {\n return this.filters;\n }\n\n /** 获取当前运行时排序规则。 */\n getSorts() {\n return this.sorts;\n }\n\n /** 设置维度排序;null 表示恢复维度默认排序。 */\n setDimensionSort(\n axis: PivotAxis,\n dimensionKey: string,\n direction: PivotSortRule[\"direction\"] | null,\n ) {\n const next = this.sorts.filter(\n (item) => !(item.axis === axis && item.dimensionKey === dimensionKey),\n );\n const dimension = (\n axis === \"row\" ? this.options.rows : this.options.columns\n ).find((item) => resolvePivotDimensionKey(item) === dimensionKey);\n const resolvedDirection =\n direction ??\n (dimension?.defaultSortOrder === \"descend\"\n ? \"desc\"\n : dimension?.defaultSortOrder === \"ascend\"\n ? \"asc\"\n : null);\n if (resolvedDirection) {\n next.push({\n axis,\n dimensionKey,\n direction: resolvedDirection,\n by: \"raw\",\n });\n }\n if (this.options.sorts === undefined) {\n this.sorts = next;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n this.options.onSortChange?.({ sorts: next });\n return next;\n }\n\n /** 按指定指标聚合结果设置维度排序。 */\n setIndicatorSort(params: {\n axis: PivotAxis;\n dimensionKey: string;\n indicatorKey: string;\n direction: PivotSortRule[\"direction\"] | null;\n counterpartPathKey?: string;\n }) {\n const next = this.sorts.filter(\n (item) =>\n !(\n item.axis === params.axis && item.dimensionKey === params.dimensionKey\n ),\n );\n if (params.direction) {\n next.push({\n axis: params.axis,\n dimensionKey: params.dimensionKey,\n direction: params.direction,\n by: \"indicator\",\n indicatorKey: params.indicatorKey,\n counterpartPathKey: params.counterpartPathKey,\n });\n }\n if (this.options.sorts === undefined) {\n this.sorts = next;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n this.options.onSortChange?.({ sorts: next });\n return next;\n }\n\n /** 将全部运行时排序规则恢复为列级默认排序。 */\n resetSorts() {\n const defaults =\n this.options.defaultSorts ?? resolvePivotDefaultSorts(this.options);\n if (this.options.sorts === undefined) {\n this.sorts = defaults;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n this.options.onSortChange?.({ sorts: defaults });\n return defaults;\n }\n\n /** 设置行维度表头宽度,不失效聚合模型。 */\n setRowDimensionWidth(dimensionKey: string, width: number) {\n this.rowDimensionWidths.set(dimensionKey, Math.max(width, 48));\n this.layoutCache = null;\n }\n\n /** 设置指定值列宽度,不失效聚合模型。 */\n setColumnWidth(columnKey: string, width: number) {\n this.columnWidths.set(columnKey, Math.max(width, 56));\n this.layoutCache = null;\n }\n\n /** 获取当前布局宽度覆盖。 */\n getRuntimeWidths() {\n return {\n rowDimensionWidths: Object.fromEntries(this.rowDimensionWidths),\n columnWidths: Object.fromEntries(this.columnWidths),\n };\n }\n\n /** 获取模型、可见树、布局和缓存调试快照。 */\n getDebugSnapshot() {\n const model = this.model;\n return {\n records: model?.records.length ?? 0,\n rowNodeCount: model?.rowNodes.size ?? 0,\n columnNodeCount: model?.columnNodes.size ?? 0,\n aggregateCellCount: model?.cells.size ?? 0,\n visibleRowCount: this.getVisibleRowNodes().length,\n visibleColumnCount: this.getVisibleColumnNodes().length,\n renderedBodyCellCount: this.layoutCache?.snapshot.bodyCells.length ?? 0,\n ...this.modelCache.getMetrics(),\n };\n }\n\n /** 设置指定维度过滤,非受控模式下立即重建聚合模型。 */\n setDimensionFilter(\n axis: PivotFilterAxis,\n dimensionKey: string,\n filter: PivotDimensionFilter | null,\n ) {\n const stateKey = resolveFilterStateKey(axis);\n const axisFilters = this.filters[stateKey] ?? {};\n const nextAxisFilters = { ...axisFilters };\n if (filter) nextAxisFilters[dimensionKey] = filter;\n else delete nextAxisFilters[dimensionKey];\n const next = {\n ...this.filters,\n [stateKey]: nextAxisFilters,\n };\n if (this.options.filters === undefined) {\n this.filters = next;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n this.options.onFilterChange?.({ axis, dimensionKey, filter });\n return next;\n }\n\n /** 清除行轴、列轴和报告字段的全部过滤条件。 */\n resetFilters() {\n const previous = this.filters;\n if (this.options.filters === undefined) {\n this.filters = createEmptyPivotFilterState();\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n }\n Object.keys(previous.rows).forEach((dimensionKey) =>\n this.options.onFilterChange?.({\n axis: \"row\",\n dimensionKey,\n filter: null,\n }),\n );\n Object.keys(previous.columns).forEach((dimensionKey) =>\n this.options.onFilterChange?.({\n axis: \"column\",\n dimensionKey,\n filter: null,\n }),\n );\n Object.keys(previous.filters ?? {}).forEach((dimensionKey) =>\n this.options.onFilterChange?.({\n axis: \"filter\",\n dimensionKey,\n filter: null,\n }),\n );\n return createEmptyPivotFilterState();\n }\n\n /** 获取排除当前维度自身条件后的过滤候选项。 */\n getDimensionFilterOptions(axis: PivotFilterAxis, dimensionKey: string) {\n return getPivotDimensionFilterOptions({\n records: this.options.dataSource,\n rows: this.options.rows,\n columns: this.options.columns,\n filterDimensions: this.options.filterDimensions,\n filters: this.filters,\n axis,\n dimensionKey,\n });\n }\n\n /** 创建与当前展开状态一致的导出矩阵。 */\n createExportMatrix(mode: \"visible\" | \"all\" = \"visible\") {\n return this.model\n ? createPivotExportMatrix({\n model: this.model,\n options: this.getEffectiveOptions(this.options),\n visibleRowNodes:\n mode === \"all\"\n ? collectAllPivotLeaves(this.model.rowTree)\n : this.getVisibleRowNodes(),\n visibleColumnNodes:\n mode === \"all\"\n ? collectAllPivotLeaves(this.model.columnTree)\n : this.getVisibleColumnNodes(),\n })\n : null;\n }\n\n /** 获取稳定地址对应的聚合值。 */\n getCellValue(address: PivotCellAddress) {\n if (!this.model) return undefined;\n const rowPathKey = address.rowNodeId\n ? this.model.rowNodes.get(address.rowNodeId)?.pathKey\n : encodePivotPath([]);\n const columnPathKey = address.columnNodeId\n ? this.model.columnNodes.get(address.columnNodeId)?.pathKey\n : encodePivotPath([]);\n if (!rowPathKey || !columnPathKey) return undefined;\n return this.model.cells.get(\n createPivotCellKey(rowPathKey, columnPathKey, address.indicatorKey),\n )?.value;\n }\n\n /** 创建不含 DOM 滚动位置的核心状态快照。 */\n createStateSnapshot(\n scroll: PivotTableStateSnapshot[\"scroll\"],\n ): PivotTableStateSnapshot {\n return {\n version: 1,\n expandedRowNodeIds: Array.from(this.expandedRowNodeIds),\n expandedColumnNodeIds: Array.from(this.expandedColumnNodeIds),\n filters: this.filters,\n sorts: this.sorts,\n selection: this.selection,\n scroll,\n rowDimensionWidths: Object.fromEntries(this.rowDimensionWidths),\n columnWidths: Object.fromEntries(this.columnWidths),\n };\n }\n\n /** 恢复未受控的核心状态,未知版本安全忽略。 */\n restoreStateSnapshot(snapshot: PivotTableStateSnapshot) {\n if (snapshot.version !== 1) return false;\n if (this.options.expandedRowKeys === undefined) {\n this.expandedRowNodeIds = new Set(snapshot.expandedRowNodeIds);\n }\n if (this.options.expandedColumnKeys === undefined) {\n this.expandedColumnNodeIds = new Set(snapshot.expandedColumnNodeIds);\n }\n if (this.options.filters === undefined) this.filters = snapshot.filters;\n if (this.options.sorts === undefined) this.sorts = snapshot.sorts;\n if (this.options.selection === undefined)\n this.selection = snapshot.selection;\n this.rowDimensionWidths = new Map(\n Object.entries(snapshot.rowDimensionWidths),\n );\n this.columnWidths = new Map(Object.entries(snapshot.columnWidths));\n this.expansionVersion += 1;\n this.model = this.modelCache.getOrBuild(\n this.getEffectiveOptions(this.options),\n );\n this.layoutCache = null;\n return true;\n }\n\n /** 设置维度节点展开状态。 */\n setNodeExpanded(axis: PivotAxis, nodeId: string, expanded: boolean) {\n const nodeMap =\n axis === \"row\" ? this.model?.rowNodes : this.model?.columnNodes;\n const node = nodeMap?.get(nodeId);\n if (!node || node.kind !== \"dimension\" || node.children.length === 0) {\n return false;\n }\n const controlled =\n axis === \"row\"\n ? this.options.expandedRowKeys !== undefined\n : this.options.expandedColumnKeys !== undefined;\n const target =\n axis === \"row\" ? this.expandedRowNodeIds : this.expandedColumnNodeIds;\n if (!controlled) {\n if (expanded) target.add(nodeId);\n else target.delete(nodeId);\n this.expansionVersion += 1;\n this.visibleNodeCache = null;\n this.layoutCache = null;\n this.normalizeSelectionToVisibleNodes();\n }\n this.options.onExpansionChange?.({ axis, nodeId, expanded });\n return true;\n }\n\n /** 展开或收起指定轴全部可展开节点。 */\n setAllNodesExpanded(axis: PivotAxis, expanded: boolean) {\n const nodes =\n axis === \"row\" ? this.model?.rowNodes : this.model?.columnNodes;\n if (!nodes) return 0;\n const expandable = Array.from(nodes.values()).filter(\n (node) => node.kind === \"dimension\" && node.children.length > 0,\n );\n const controlled =\n axis === \"row\"\n ? this.options.expandedRowKeys !== undefined\n : this.options.expandedColumnKeys !== undefined;\n if (!controlled) {\n const target =\n axis === \"row\" ? this.expandedRowNodeIds : this.expandedColumnNodeIds;\n if (expanded) expandable.forEach((node) => target.add(node.id));\n else target.clear();\n this.expansionVersion += 1;\n this.visibleNodeCache = null;\n this.layoutCache = null;\n this.normalizeSelectionToVisibleNodes();\n }\n expandable.forEach((node) =>\n this.options.onExpansionChange?.({ axis, nodeId: node.id, expanded }),\n );\n return expandable.length;\n }\n\n /** 获取指定聚合单元格参与计算的原始记录。 */\n getCellRecords(params: {\n rowPathKey: string;\n columnPathKey: string;\n indicatorKey: string;\n }) {\n return this.model\n ? getPivotCellRecords({ model: this.model, ...params })\n : [];\n }\n\n /** 释放当前模型引用。 */\n destroy() {\n this.model = null;\n this.modelCache.clear();\n this.expandedRowNodeIds.clear();\n this.expandedColumnNodeIds.clear();\n this.selection = { activeCell: null, anchorCell: null, ranges: [] };\n this.filters = createEmptyPivotFilterState();\n this.sorts = [];\n this.layoutCache = null;\n this.visibleNodeCache = null;\n }\n\n private getEffectiveOptions(options: PivotTableOptions<RecordType>) {\n return { ...options, filters: this.filters, sorts: this.sorts };\n }\n\n private createLayoutOptions(): PivotTableOptions<RecordType> {\n return {\n ...this.getEffectiveOptions(this.options),\n rows: this.options.rows.map((dimension) => ({\n ...dimension,\n width: resolvePivotDimensionWidth(\n dimension,\n this.rowDimensionWidths.get(resolvePivotDimensionKey(dimension)),\n ),\n })),\n };\n }\n\n private resolveVisibleNodeCache() {\n if (!this.model) return null;\n if (\n this.visibleNodeCache?.model === this.model &&\n this.visibleNodeCache.expansionVersion === this.expansionVersion\n ) {\n return this.visibleNodeCache;\n }\n this.visibleNodeCache = {\n model: this.model,\n expansionVersion: this.expansionVersion,\n rows: flattenVisiblePivotLeaves({\n root: this.model.rowTree,\n expandedNodeIds: this.expandedRowNodeIds,\n }),\n columns: flattenVisiblePivotLeaves({\n root: this.model.columnTree,\n expandedNodeIds: this.expandedColumnNodeIds,\n }),\n };\n return this.visibleNodeCache;\n }\n\n private normalizeSelectionToVisibleNodes() {\n if (!this.model || this.options.selection !== undefined) return;\n const rowIds = new Set(this.getVisibleRowNodes().map((node) => node.id));\n const columnIds = new Set(\n this.getVisibleColumnNodes().map((node) => node.id),\n );\n const normalizeAddress = (address: PivotCellAddress | null) =>\n address\n ? {\n ...address,\n rowNodeId: normalizeNodeId(\n address.rowNodeId,\n rowIds,\n this.model!.rowNodes,\n ),\n columnNodeId: normalizeNodeId(\n address.columnNodeId,\n columnIds,\n this.model!.columnNodes,\n ),\n }\n : null;\n const activeCell = normalizeAddress(this.selection.activeCell);\n const anchorCell = normalizeAddress(this.selection.anchorCell);\n this.selection = {\n ...this.selection,\n activeCell,\n anchorCell,\n ranges:\n activeCell && anchorCell\n ? [\n {\n start: anchorCell,\n end: activeCell,\n kind: this.selection.ranges[0]?.kind,\n },\n ]\n : [],\n // 轴节点选择是稳定语义,不能因为节点暂时不在可视树中而改成父节点。\n // 绘制层会根据节点路径将它映射到当前可见的祖先或后代单元格。\n activeNode: this.selection.activeNode,\n };\n }\n}\n\nfunction resolveFilterStateKey(axis: PivotFilterAxis): keyof PivotFilterState {\n if (axis === \"row\") return \"rows\";\n if (axis === \"column\") return \"columns\";\n return \"filters\";\n}\n\nfunction normalizeNodeId(\n nodeId: string,\n visibleNodeIds: Set<string>,\n nodes: Map<string, import(\"../domain/pivot/pivot-node\").PivotNode>,\n) {\n if (!nodeId || visibleNodeIds.has(nodeId)) return nodeId;\n let node = nodes.get(nodeId);\n while (node?.parentId) {\n node = nodes.get(node.parentId);\n if (node && visibleNodeIds.has(node.id)) return node.id;\n }\n return \"\";\n}\n\nfunction collectAllPivotLeaves(\n root: import(\"../domain/pivot/pivot-node\").PivotNode,\n) {\n const result: import(\"../domain/pivot/pivot-node\").PivotNode[] = [];\n const visit = (node: import(\"../domain/pivot/pivot-node\").PivotNode) => {\n if (node.kind !== \"root\" && node.children.length === 0) {\n result.push(node);\n return;\n }\n node.children.forEach(visit);\n };\n root.children.forEach(visit);\n return result;\n}\n\nfunction resolveDefaultExpandedNodes<RecordType>(\n nodes: Map<string, import(\"../domain/pivot/pivot-node\").PivotNode>,\n dimensions: PivotTableOptions<RecordType>[\"rows\"],\n) {\n const result = new Set<string>();\n nodes.forEach((node) => {\n const depth = node.dimensionKey\n ? dimensions.find(\n (item) => resolvePivotDimensionKey(item) === node.dimensionKey,\n )?.defaultExpandDepth\n : undefined;\n if (\n node.kind === \"dimension\" &&\n node.children.length > 0 &&\n depth != null &&\n node.depth < depth\n ) {\n result.add(node.id);\n }\n });\n return result;\n}\n","/** PivotTable DOM 宿主。 */\nexport interface PivotDomHost {\n root: HTMLDivElement;\n canvas: HTMLCanvasElement;\n setFittedHeight: (height: number) => void;\n observeResize: (listener: (width: number, height: number) => void) => () => void;\n destroy: () => void;\n}\n\n/** 创建不依赖框架的 Canvas 与滚动宿主。 */\nexport function createPivotDomHost(container: HTMLElement): PivotDomHost {\n const previousPosition = container.style.position;\n const previousOverflow = container.style.overflow;\n const root = document.createElement(\"div\");\n const canvas = document.createElement(\"canvas\");\n\n container.style.position = container.style.position || \"relative\";\n container.style.overflow = \"hidden\";\n root.className = \"canvas-components-pivot-table\";\n root.tabIndex = 0;\n Object.assign(root.style, {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n right: \"0\",\n height: \"100%\",\n overflow: \"hidden\",\n touchAction: \"none\",\n });\n Object.assign(canvas.style, {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n display: \"block\",\n width: \"0px\",\n height: \"0px\",\n });\n root.append(canvas);\n container.append(root);\n\n return {\n root,\n canvas,\n setFittedHeight(height) {\n root.style.height = `${Math.max(Math.ceil(height), 1)}px`;\n },\n observeResize(listener) {\n const notify = () => {\n const rect = container.getBoundingClientRect();\n listener(rect.width, rect.height);\n };\n if (typeof ResizeObserver === \"undefined\") {\n globalThis.addEventListener(\"resize\", notify);\n notify();\n return () => globalThis.removeEventListener(\"resize\", notify);\n }\n const observer = new ResizeObserver(notify);\n observer.observe(container);\n notify();\n return () => observer.disconnect();\n },\n destroy() {\n root.remove();\n container.style.position = previousPosition;\n container.style.overflow = previousOverflow;\n },\n };\n}\n","/** Canvas 尺寸适配结果。 */\nexport interface PivotCanvasSize {\n width: number;\n height: number;\n pixelRatio: number;\n}\n\n/** 按 CSS 尺寸和 DPR 更新 Canvas 位图尺寸。 */\nexport function resizePivotCanvas(\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n): PivotCanvasSize {\n const pixelRatio = Math.max(globalThis.devicePixelRatio ?? 1, 1);\n const bitmapWidth = Math.max(Math.round(width * pixelRatio), 1);\n const bitmapHeight = Math.max(Math.round(height * pixelRatio), 1);\n if (canvas.width !== bitmapWidth) canvas.width = bitmapWidth;\n if (canvas.height !== bitmapHeight) canvas.height = bitmapHeight;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n const context = canvas.getContext(\"2d\");\n context?.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return { width, height, pixelRatio };\n}\n","import type { PivotLayoutSnapshot, PivotRect } from \"../domain/layout/types\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../schema/state\";\n\n/** 计算当前单元格范围或轴节点选区在表体坐标系中的外框。 */\nexport function resolvePivotSelectionRect(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n): PivotRect | null {\n const indexes = resolveSelectionIndexes(layout, selection);\n if (!indexes) return null;\n const kind = resolvePivotSelectionKind(selection);\n const startX =\n kind === \"row\" || kind === \"row-cell\"\n ? layout.rowHeaderRect.x\n : layout.bodyRect.x +\n (layout.columnOffsets[indexes.startColumnIndex] ?? 0) -\n layout.scroll.left;\n const endX =\n layout.bodyRect.x +\n (layout.columnOffsets[indexes.endColumnIndex] ?? 0) +\n (layout.columnWidths[indexes.endColumnIndex] ?? layout.columnWidth) -\n layout.scroll.left;\n const startY =\n kind === \"column\"\n ? layout.columnHeaderRect.y\n : layout.bodyRect.y +\n indexes.startRowIndex * layout.rowHeight -\n layout.scroll.top;\n const endY =\n layout.bodyRect.y +\n (indexes.endRowIndex + 1) * layout.rowHeight -\n layout.scroll.top;\n const clipRect = resolvePivotSelectionClipRect(layout, selection);\n const visibleStartX = Math.max(startX, clipRect.x);\n const visibleEndX = Math.min(endX, clipRect.x + clipRect.width);\n const visibleStartY = Math.max(startY, clipRect.y);\n const visibleEndY = Math.min(endY, clipRect.y + clipRect.height);\n if (visibleStartX >= visibleEndX || visibleStartY >= visibleEndY) return null;\n return {\n x: visibleStartX,\n y: visibleStartY,\n width: visibleEndX - visibleStartX,\n height: visibleEndY - visibleStartY,\n };\n}\n\n/** 获取不同来源选区允许覆盖的表头与表体裁剪区域。 */\nexport function resolvePivotSelectionClipRect(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n): PivotRect {\n const kind = resolvePivotSelectionKind(selection);\n if (kind === \"row\" || kind === \"row-cell\") {\n return {\n x: layout.rowHeaderRect.x,\n y: layout.bodyRect.y,\n width: layout.bodyRect.x + layout.bodyRect.width - layout.rowHeaderRect.x,\n height: layout.bodyRect.height,\n };\n }\n if (kind === \"column\") {\n return {\n x: layout.bodyRect.x,\n y: layout.columnHeaderRect.y,\n width: layout.bodyRect.width,\n height:\n layout.bodyRect.y + layout.bodyRect.height - layout.columnHeaderRect.y,\n };\n }\n return layout.bodyRect;\n}\n\n/** 判断当前选区是否为需要仅绘制外框的区域选择。 */\nexport function isPivotAreaSelection(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n) {\n if (selection?.activeNode) return true;\n if (selection?.ranges[0]?.kind === \"row-cell\") return true;\n const indexes = resolveSelectionIndexes(layout, selection);\n return Boolean(\n indexes &&\n (indexes.startRowIndex !== indexes.endRowIndex ||\n indexes.startColumnIndex !== indexes.endColumnIndex),\n );\n}\n\nfunction resolvePivotSelectionKind(\n selection: PivotSelectionState | null | undefined,\n) {\n const rangeKind = selection?.ranges[0]?.kind;\n if (\n rangeKind === \"row\" ||\n rangeKind === \"column\" ||\n rangeKind === \"row-cell\"\n ) {\n return rangeKind;\n }\n return selection?.activeNode?.axis ?? \"cell\";\n}\n\n/** 按 ListTable 的像素对齐规则在选区矩形内侧绘制边框。 */\nexport function drawPivotSelectionBorder(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.strokeRect(\n rect.x + 0.5,\n rect.y + 0.5,\n Math.max(rect.width - 1, 0),\n Math.max(rect.height - 1, 0),\n );\n context.restore();\n}\n\nfunction resolveSelectionIndexes(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n) {\n const range = selection?.ranges[0];\n if (range) {\n const start = resolveAddressIndexes(layout, range.start);\n const end = resolveAddressIndexes(layout, range.end);\n if (!start || !end) return null;\n return normalizeIndexes(\n start.rowIndex,\n end.rowIndex,\n start.columnIndex,\n end.columnIndex,\n );\n }\n const activeNode = selection?.activeNode;\n if (!activeNode) return null;\n const pathKey = resolveNodePathKey(activeNode.nodeId);\n if (!pathKey) return null;\n const relatedIndexes = (\n activeNode.axis === \"row\" ? layout.rowSlots : layout.columnSlots\n )\n .map((slot, index) => (isPathRelated(pathKey, slot.pathKey) ? index : -1))\n .filter((index) => index >= 0);\n if (relatedIndexes.length === 0) return null;\n if (activeNode.axis === \"row\") {\n return normalizeIndexes(\n relatedIndexes[0]!,\n relatedIndexes[relatedIndexes.length - 1]!,\n 0,\n layout.columnSlots.length - 1,\n );\n }\n return normalizeIndexes(\n 0,\n layout.rowSlots.length - 1,\n relatedIndexes[0]!,\n relatedIndexes[relatedIndexes.length - 1]!,\n );\n}\n\nfunction normalizeIndexes(\n firstRow: number,\n secondRow: number,\n firstColumn: number,\n secondColumn: number,\n) {\n if (firstRow < 0 || secondRow < 0 || firstColumn < 0 || secondColumn < 0) {\n return null;\n }\n return {\n startRowIndex: Math.min(firstRow, secondRow),\n endRowIndex: Math.max(firstRow, secondRow),\n startColumnIndex: Math.min(firstColumn, secondColumn),\n endColumnIndex: Math.max(firstColumn, secondColumn),\n };\n}\n\nfunction resolveAddressIndexes(\n layout: PivotLayoutSnapshot,\n address: PivotCellAddress,\n) {\n const rowIndex = layout.rowSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.rowNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n const columnIndex = layout.columnSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.columnNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n return rowIndex >= 0 && columnIndex >= 0 ? { rowIndex, columnIndex } : null;\n}\n\nfunction isPathRelated(firstPathKey: string, secondPathKey: string) {\n try {\n const first = JSON.parse(firstPathKey) as unknown;\n const second = JSON.parse(secondPathKey) as unknown;\n if (!Array.isArray(first) || !Array.isArray(second)) {\n return firstPathKey === secondPathKey;\n }\n return isPathPrefix(first, second) || isPathPrefix(second, first);\n } catch {\n return firstPathKey === secondPathKey;\n }\n}\n\nfunction isPathPrefix(parent: unknown[], child: unknown[]) {\n return (\n parent.length <= child.length &&\n parent.every((value, index) => Object.is(value, child[index]))\n );\n}\n\nfunction resolveNodePathKey(nodeId: string) {\n try {\n const decoded = JSON.parse(nodeId) as unknown;\n return Array.isArray(decoded) && typeof decoded[2] === \"string\"\n ? decoded[2]\n : null;\n } catch {\n return null;\n }\n}\n","/** PivotTable 单元格样式。 */\nexport interface PivotCellStyle {\n backgroundColor?: string;\n color?: string;\n fontSize?: number;\n fontWeight?: string;\n textAlign?: CanvasTextAlign;\n paddingInline?: number;\n paddingBlock?: number;\n borderColor?: string;\n borderWidth?: number;\n}\n\n/** PivotTable 主题。 */\nexport interface PivotTableTheme {\n backgroundColor: string;\n borderColor: string;\n textColor: string;\n mutedTextColor: string;\n rowHeaderBackgroundColor: string;\n columnHeaderBackgroundColor: string;\n cornerBackgroundColor: string;\n subtotalBackgroundColor: string;\n grandTotalBackgroundColor: string;\n hoverBackgroundColor: string;\n selectionBackgroundColor: string;\n selectionBorderColor: string;\n fontFamily: string;\n fontSize: number;\n}\n\n/** 默认 PivotTable 主题。 */\nexport const defaultPivotTableTheme: PivotTableTheme = {\n backgroundColor: \"#ffffff\",\n borderColor: \"#d9e1ec\",\n textColor: \"#1f2329\",\n mutedTextColor: \"#7a8798\",\n rowHeaderBackgroundColor: \"#f7f8fa\",\n columnHeaderBackgroundColor: \"#f5f8fc\",\n cornerBackgroundColor: \"#eef2f7\",\n subtotalBackgroundColor: \"#f8fafc\",\n grandTotalBackgroundColor: \"#edf4ff\",\n hoverBackgroundColor: \"#edf4ff\",\n selectionBackgroundColor: \"#dbeafe\",\n selectionBorderColor: \"#1677ff\",\n fontFamily:\n '\"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif',\n fontSize: 14,\n};\n","import type {\n PivotAxisScrollbarLayout,\n PivotScrollbarLayout,\n PivotScrollbarRect,\n} from \"../domain/layout/scrollbar-types\";\n\n/** 绘制 PivotTable Canvas 滚动条。 */\nexport function drawPivotScrollbars(\n context: CanvasRenderingContext2D,\n layout: PivotScrollbarLayout,\n) {\n context.save();\n if (layout.horizontal) {\n drawAxis(context, layout.horizontal, \"horizontal\");\n }\n if (layout.vertical) {\n drawAxis(context, layout.vertical, \"vertical\");\n }\n context.restore();\n}\n\nfunction drawAxis(\n context: CanvasRenderingContext2D,\n layout: PivotAxisScrollbarLayout,\n axis: \"horizontal\" | \"vertical\",\n) {\n drawTrack(context, layout.track);\n drawButton(context, layout.decreaseButton, axis, \"decrease\");\n drawButton(context, layout.increaseButton, axis, \"increase\");\n drawThumb(context, layout.thumb);\n}\n\nfunction drawTrack(context: CanvasRenderingContext2D, rect: PivotScrollbarRect) {\n context.fillStyle = \"rgba(148, 163, 184, 0.16)\";\n roundRect(context, rect, rect.height / 2);\n context.fill();\n}\n\nfunction drawThumb(context: CanvasRenderingContext2D, rect: PivotScrollbarRect) {\n context.fillStyle = \"rgba(100, 116, 139, 0.8)\";\n roundRect(context, rect, rect.height / 2);\n context.fill();\n}\n\nfunction drawButton(\n context: CanvasRenderingContext2D,\n rect: PivotScrollbarRect,\n axis: \"horizontal\" | \"vertical\",\n direction: \"decrease\" | \"increase\",\n) {\n context.fillStyle = \"rgba(226, 232, 240, 0.92)\";\n context.strokeStyle = \"rgba(148, 163, 184, 0.65)\";\n context.lineWidth = 1;\n roundRect(context, rect, rect.height / 2);\n context.fill();\n context.stroke();\n context.fillStyle = \"rgba(71, 85, 105, 0.88)\";\n context.beginPath();\n const centerX = rect.x + rect.width / 2;\n const centerY = rect.y + rect.height / 2;\n if (axis === \"horizontal\") {\n const tipX = centerX + (direction === \"decrease\" ? -1 : 1) * rect.width * 0.14;\n const tailX = centerX + (direction === \"decrease\" ? 1 : -1) * rect.width * 0.14;\n context.moveTo(tipX, centerY);\n context.lineTo(tailX, centerY - rect.height * 0.22);\n context.lineTo(tailX, centerY + rect.height * 0.22);\n } else {\n const tipY = centerY + (direction === \"decrease\" ? -1 : 1) * rect.height * 0.14;\n const tailY = centerY + (direction === \"decrease\" ? 1 : -1) * rect.height * 0.14;\n context.moveTo(centerX, tipY);\n context.lineTo(centerX - rect.width * 0.22, tailY);\n context.lineTo(centerX + rect.width * 0.22, tailY);\n }\n context.closePath();\n context.fill();\n}\n\nfunction roundRect(\n context: CanvasRenderingContext2D,\n rect: PivotScrollbarRect,\n radius: number,\n) {\n const nextRadius = Math.min(radius, rect.width / 2, rect.height / 2);\n context.beginPath();\n context.moveTo(rect.x + nextRadius, rect.y);\n context.arcTo(\n rect.x + rect.width,\n rect.y,\n rect.x + rect.width,\n rect.y + rect.height,\n nextRadius,\n );\n context.arcTo(\n rect.x + rect.width,\n rect.y + rect.height,\n rect.x,\n rect.y + rect.height,\n nextRadius,\n );\n context.arcTo(rect.x, rect.y + rect.height, rect.x, rect.y, nextRadius);\n context.arcTo(rect.x, rect.y, rect.x + rect.width, rect.y, nextRadius);\n context.closePath();\n}\n","import type { PivotRect } from \"../domain/layout/types\";\n\n/**\n * 绘制共享边界的单像素网格线。\n *\n * 相邻单元格的右/左边和下/上边使用完全相同的半像素坐标,\n * 避免两条平行线叠成局部粗线。\n */\nexport function drawPivotGridRect(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n options?: {\n skipTop?: boolean;\n skipRight?: boolean;\n skipBottom?: boolean;\n skipLeft?: boolean;\n },\n) {\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n if (!options?.skipTop) {\n context.moveTo(rect.x, rect.y + 0.5);\n context.lineTo(rect.x + rect.width, rect.y + 0.5);\n }\n if (!options?.skipLeft) {\n context.moveTo(rect.x + 0.5, rect.y);\n context.lineTo(rect.x + 0.5, rect.y + rect.height);\n }\n if (!options?.skipRight) {\n context.moveTo(rect.x + rect.width + 0.5, rect.y);\n context.lineTo(rect.x + rect.width + 0.5, rect.y + rect.height);\n }\n if (!options?.skipBottom) {\n context.moveTo(rect.x, rect.y + rect.height + 0.5);\n context.lineTo(rect.x + rect.width, rect.y + rect.height + 0.5);\n }\n context.stroke();\n context.restore();\n}\n\n/** 绘制不随内容滚动的可视区右边框。 */\nexport function drawPivotViewportRightBorder(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n const x = rect.x + rect.width - 0.5;\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(x, rect.y);\n context.lineTo(x, rect.y + rect.height);\n context.stroke();\n context.restore();\n}\n\n/** 绘制在 Canvas 内侧的表格底边框,避免内容高度收缩后被裁切。 */\nexport function drawPivotViewportBottomBorder(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n const y = rect.y + rect.height - 0.5;\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(rect.x, y);\n context.lineTo(rect.x + rect.width, y);\n context.stroke();\n context.restore();\n}\n\n/** 绘制固定表头区域不随内容滚动的默认边界。 */\nexport function drawPivotHeaderBoundaries(\n context: CanvasRenderingContext2D,\n options: {\n rowHeaderRight: number;\n columnHeaderBottom: number;\n width: number;\n height: number;\n },\n color: string,\n) {\n // 与单元格共享边界使用同一坐标,避免未滚动时形成相邻双线。\n const right = options.rowHeaderRight + 0.5;\n const bottom = options.columnHeaderBottom + 0.5;\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(right, 0);\n context.lineTo(right, options.height);\n context.moveTo(0, bottom);\n context.lineTo(options.width, bottom);\n context.stroke();\n context.restore();\n}\n\n/** 绘制表体首行首列的边界,避免固定表头交界处被选中层裁掉。 */\nexport function drawPivotBodyTopLeftBoundaries(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n context.save();\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(rect.x + 0.5, rect.y);\n context.lineTo(rect.x + 0.5, rect.y + rect.height);\n context.moveTo(rect.x, rect.y + 0.5);\n context.lineTo(rect.x + rect.width, rect.y + 0.5);\n context.stroke();\n context.restore();\n}\n","import type { PivotRect } from \"./types\";\n\n/**\n * 计算合并行表头的吸附内容区域。\n *\n * 内容吸附在行表头顶部,并受所属合并单元格底边约束。\n */\nexport function resolveStickyRowHeaderContentRect(params: {\n cellRect: PivotRect;\n viewportTop: number;\n rowHeight: number;\n}): PivotRect {\n const height = Math.min(\n Math.max(params.rowHeight, 0),\n Math.max(params.cellRect.height, 0),\n );\n const cellBottom = params.cellRect.y + params.cellRect.height;\n const y = Math.min(\n Math.max(params.cellRect.y, params.viewportTop),\n cellBottom - height,\n );\n return {\n x: params.cellRect.x,\n y,\n width: params.cellRect.width,\n height,\n };\n}\n","import type {\n PivotBodyCellLayout,\n PivotHeaderCellLayout,\n PivotLayoutSnapshot,\n PivotRect,\n} from \"../domain/layout/types\";\nimport type { PivotTableOptions } from \"../schema/options\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../schema/state\";\nimport {\n drawPivotSelectionBorder,\n isPivotAreaSelection,\n resolvePivotSelectionClipRect,\n resolvePivotSelectionRect,\n} from \"./draw-selection\";\nimport { defaultPivotTableTheme, type PivotTableTheme } from \"../schema/style\";\nimport { drawPivotScrollbars } from \"./draw-scrollbars\";\nimport {\n drawPivotGridRect,\n drawPivotHeaderBoundaries,\n drawPivotViewportBottomBorder,\n drawPivotViewportRightBorder,\n} from \"./draw-grid\";\nimport { resolveStickyRowHeaderContentRect } from \"../domain/layout/sticky-row-header\";\n\n/** 单次 Canvas 绘制统计。 */\nexport interface PivotRenderStats {\n headerCellCount: number;\n bodyCellCount: number;\n}\n\n/** 绘制 PivotTable 四区内容。 */\nexport function renderPivotTable<RecordType>(params: {\n context: CanvasRenderingContext2D;\n layout: PivotLayoutSnapshot;\n options: PivotTableOptions<RecordType>;\n activeCell?: PivotCellAddress | null;\n hoverCell?: PivotCellAddress | null;\n selection?: PivotSelectionState | null;\n resizeGuideX?: number | null;\n}): PivotRenderStats {\n const { context, layout, options } = params;\n const theme: PivotTableTheme = {\n ...defaultPivotTableTheme,\n ...options.theme,\n };\n const visibleIndicatorMaxima = resolveVisibleIndicatorMaxima(layout);\n const highlightMode = options.highlightMode ?? \"row\";\n const activeNodePathKey = params.selection?.activeNode\n ? resolveNodePathKey(params.selection.activeNode.nodeId)\n : null;\n const selectionPathKeys = resolveSelectionPathKeys(\n layout,\n params.selection,\n activeNodePathKey,\n );\n const areaSelection = isPivotAreaSelection(layout, params.selection);\n context.clearRect(0, 0, layout.width, layout.height);\n context.font = `${theme.fontSize}px ${theme.fontFamily}`;\n context.textBaseline = \"middle\";\n\n withClip(context, layout.reportFilterRect, () => {\n layout.reportFilterCells.forEach((cell) =>\n drawReportFilterCell(context, cell, theme),\n );\n });\n withClip(context, layout.cornerRect, () => {\n fillRect(context, layout.cornerRect, theme.cornerBackgroundColor);\n drawCorner(context, layout, theme, params.selection?.textSelection);\n });\n withClip(context, layout.rowHeaderRect, () => {\n layout.rowHeaderCells.forEach((cell) => {\n const contentRect = resolveStickyRowHeaderContentRect({\n cellRect: cell.rect,\n viewportTop: layout.rowHeaderRect.y,\n rowHeight: layout.rowHeight,\n });\n drawHeaderCell(\n context,\n cell,\n theme,\n !areaSelection && isHeaderSelected(cell, selectionPathKeys.row),\n contentRect,\n undefined,\n params.selection?.textSelection,\n );\n });\n layout.rowHeaderCells.forEach((cell) =>\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipTop: true,\n skipLeft: cell.rect.x > 0,\n skipRight: isSameCoordinate(\n cell.rect.x + cell.rect.width,\n layout.rowHeaderRect.x + layout.rowHeaderRect.width,\n ),\n }),\n );\n });\n withClip(context, layout.columnHeaderRect, () => {\n layout.columnHeaderCells.forEach((cell) =>\n drawHeaderCell(\n context,\n cell,\n theme,\n !areaSelection && isHeaderSelected(cell, selectionPathKeys.column),\n cell.rect,\n undefined,\n params.selection?.textSelection,\n ),\n );\n layout.columnHeaderCells.forEach((cell) =>\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipTop: cell.rect.y > 0,\n skipLeft: true,\n skipRight: isSameCoordinate(\n cell.rect.x + cell.rect.width,\n layout.tableWidth,\n ),\n skipBottom: isSameCoordinate(\n cell.rect.y + cell.rect.height,\n layout.columnHeaderRect.y + layout.columnHeaderRect.height,\n ),\n }),\n );\n });\n withClip(context, layout.bodyRect, () => {\n layout.bodyCells.forEach((cell) =>\n drawBodyCell(\n context,\n cell,\n options,\n theme,\n {\n active: !areaSelection && isCellAddress(cell, params.activeCell),\n hover: !areaSelection && isCellAddress(cell, params.hoverCell),\n highlighted:\n !areaSelection &&\n isCellHighlightedByMode(\n highlightMode,\n cell,\n params.selection,\n activeNodePathKey,\n ),\n },\n visibleIndicatorMaxima.get(cell.indicatorKey) ?? 0,\n params.selection?.textSelection,\n ),\n );\n layout.bodyCells.forEach((cell) =>\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipTop: true,\n skipLeft: true,\n skipRight: isSameCoordinate(\n cell.rect.x + cell.rect.width,\n layout.tableWidth,\n ),\n }),\n );\n if (\n options.indicators.length === 0 ||\n layout.recordCount === 0 ||\n options.loading ||\n options.errorText\n ) {\n drawBodyStatus(context, layout, options, theme);\n }\n });\n\n const contentHeight = layout.height;\n drawPivotHeaderBoundaries(\n context,\n {\n rowHeaderRight: layout.rowHeaderRect.x + layout.rowHeaderRect.width,\n columnHeaderBottom:\n layout.columnHeaderRect.y + layout.columnHeaderRect.height,\n width: layout.tableWidth,\n height: contentHeight,\n },\n theme.borderColor,\n );\n if (options.debug) drawDebugOverlay(context, layout, theme);\n drawPivotScrollbars(context, layout.scrollbar);\n drawPivotViewportRightBorder(\n context,\n { x: 0, y: 0, width: layout.tableWidth, height: contentHeight },\n theme.borderColor,\n );\n drawPivotViewportBottomBorder(\n context,\n { x: 0, y: 0, width: layout.tableWidth, height: contentHeight },\n theme.borderColor,\n );\n const selectionRect = resolvePivotSelectionRect(layout, params.selection);\n if (selectionRect) {\n const selectionClipRect = resolvePivotSelectionClipRect(\n layout,\n params.selection,\n );\n withClip(context, selectionClipRect, () => {\n drawPivotSelectionBorder(\n context,\n selectionRect,\n theme.selectionBorderColor,\n );\n });\n }\n if (params.resizeGuideX != null) {\n drawPivotResizeGuide(context, params.resizeGuideX, contentHeight);\n }\n\n return {\n headerCellCount:\n layout.reportFilterCells.length +\n layout.rowFieldHeaderCells.length +\n layout.rowHeaderCells.length +\n layout.columnHeaderCells.length,\n bodyCellCount: layout.bodyCells.length,\n };\n}\n\n/** 绘制列宽拖拽指示线,样式与 ListTable 保持一致。 */\nexport function drawPivotResizeGuide(\n context: CanvasRenderingContext2D,\n x: number,\n height: number,\n) {\n context.save();\n context.strokeStyle = \"#1677ff\";\n context.lineWidth = 1.5;\n context.setLineDash([4, 4]);\n context.beginPath();\n context.moveTo(x + 0.5, 0);\n context.lineTo(x + 0.5, height);\n context.stroke();\n context.restore();\n}\n\nfunction drawBodyStatus<RecordType>(\n context: CanvasRenderingContext2D,\n layout: PivotLayoutSnapshot,\n options: PivotTableOptions<RecordType>,\n theme: PivotTableTheme,\n) {\n fillRect(context, layout.bodyRect, theme.backgroundColor);\n const text = options.errorText\n ? options.errorText\n : options.loading\n ? (options.loadingText ?? \"加载中\")\n : (options.emptyText ?? \"暂无数据\");\n drawText(\n context,\n text,\n layout.bodyRect,\n options.errorText ? \"#d03050\" : theme.mutedTextColor,\n 12,\n \"center\",\n );\n}\n\nfunction drawDebugOverlay(\n context: CanvasRenderingContext2D,\n layout: PivotLayoutSnapshot,\n theme: PivotTableTheme,\n) {\n context.save();\n context.setLineDash([4, 3]);\n [\n layout.reportFilterRect,\n layout.cornerRect,\n layout.rowHeaderRect,\n layout.columnHeaderRect,\n layout.bodyRect,\n ].forEach((rect) => strokeRect(context, rect, \"#f04438\"));\n context.setLineDash([]);\n context.font = `12px ${theme.fontFamily}`;\n context.textAlign = \"left\";\n context.textBaseline = \"top\";\n context.fillStyle = \"#f04438\";\n context.fillText(\n `rows ${layout.visibleRowRange.start}-${layout.visibleRowRange.end} / cols ${layout.visibleColumnRange.start}-${layout.visibleColumnRange.end} / cells ${layout.bodyCells.length}`,\n layout.bodyRect.x + 8,\n layout.bodyRect.y + 8,\n );\n context.restore();\n}\n\nfunction drawReportFilterCell(\n context: CanvasRenderingContext2D,\n cell: PivotLayoutSnapshot[\"reportFilterCells\"][number],\n theme: PivotTableTheme,\n) {\n fillRect(context, cell.rect, theme.backgroundColor);\n drawText(context, cell.label, cell.labelRect, theme.textColor, 10, \"left\");\n drawText(\n context,\n cell.valueLabel,\n { ...cell.valueRect, width: Math.max(cell.valueRect.width - 24, 0) },\n cell.active ? \"#1677ff\" : theme.textColor,\n 10,\n \"left\",\n );\n const separatorX = cell.valueRect.x + 0.5;\n context.save();\n context.strokeStyle = theme.borderColor;\n context.lineWidth = 1;\n context.beginPath();\n context.moveTo(separatorX, cell.rect.y);\n context.lineTo(separatorX, cell.rect.y + cell.rect.height);\n context.stroke();\n context.fillStyle = cell.active ? \"#1677ff\" : theme.mutedTextColor;\n context.beginPath();\n const arrowX = cell.valueRect.x + cell.valueRect.width - 12;\n const arrowY = cell.valueRect.y + cell.valueRect.height / 2;\n context.moveTo(arrowX - 4, arrowY - 2);\n context.lineTo(arrowX + 4, arrowY - 2);\n context.lineTo(arrowX, arrowY + 3);\n context.closePath();\n context.fill();\n context.restore();\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipTop: cell.rect.y > 0,\n skipRight: true,\n });\n}\n\nfunction drawCorner(\n context: CanvasRenderingContext2D,\n layout: PivotLayoutSnapshot,\n theme: PivotTableTheme,\n textSelection?: PivotSelectionState[\"textSelection\"],\n) {\n layout.rowFieldHeaderCells.forEach((cell) =>\n drawHeaderCell(\n context,\n cell,\n theme,\n false,\n cell.rect,\n theme.cornerBackgroundColor,\n textSelection,\n ),\n );\n if (layout.rowFieldHeaderCells.length === 0) {\n drawPivotGridRect(context, layout.cornerRect, theme.borderColor, {\n skipRight: true,\n skipBottom: true,\n });\n return;\n }\n layout.rowFieldHeaderCells.forEach((cell) =>\n drawPivotGridRect(context, cell.rect, theme.borderColor, {\n skipRight: true,\n skipBottom: true,\n }),\n );\n}\n\nfunction drawHeaderCell(\n context: CanvasRenderingContext2D,\n cell: PivotHeaderCellLayout,\n theme: PivotTableTheme,\n selected: boolean,\n contentRect = cell.rect,\n backgroundColor?: string,\n textSelection?: PivotSelectionState[\"textSelection\"],\n) {\n const background =\n backgroundColor ??\n (selected\n ? theme.selectionBackgroundColor\n : cell.kind === \"grandTotal\"\n ? theme.grandTotalBackgroundColor\n : cell.kind === \"subtotal\"\n ? theme.subtotalBackgroundColor\n : cell.axis === \"row\"\n ? theme.rowHeaderBackgroundColor\n : theme.columnHeaderBackgroundColor);\n fillRect(context, cell.rect, background);\n const iconPadding = cell.expandable ? 18 : 0;\n if (cell.expandable) {\n drawExpandIcon(context, contentRect, theme.mutedTextColor, cell.expanded);\n }\n if (cell.filterable) {\n drawFilterIcon(\n context,\n contentRect,\n cell.filterActive ? \"#3370ff\" : theme.mutedTextColor,\n );\n }\n if (cell.sortable) {\n drawSortIcon(\n context,\n contentRect,\n cell.sortDirection,\n cell.filterable ? 32 : 10,\n );\n }\n drawHeaderTextSelectionBackground(\n context,\n cell,\n contentRect,\n textSelection,\n theme.fontSize,\n );\n drawText(\n context,\n cell.label,\n {\n ...contentRect,\n width:\n contentRect.width -\n (cell.filterable ? 24 : 0) -\n (cell.sortable ? 24 : 0),\n },\n theme.textColor,\n 10 + iconPadding,\n cell.align ?? \"left\",\n );\n}\n\nfunction drawHeaderTextSelectionBackground(\n context: CanvasRenderingContext2D,\n cell: PivotHeaderCellLayout,\n contentRect: PivotRect,\n selection: PivotSelectionState[\"textSelection\"],\n fontSize: number,\n) {\n if (!selection) return;\n const index = selection.fragments.findIndex(\n (fragment) =>\n fragment.region === \"header\" &&\n fragment.key === `header:${cell.axis}:${cell.nodeId ?? \"\"}:${cell.label}`,\n );\n if (index < 0) return;\n const range = resolveTextSelectionRange(selection, index, cell.label.length);\n if (!range) return;\n const width = context.measureText(cell.label).width;\n const align = cell.align ?? \"left\";\n const origin =\n align === \"right\"\n ? contentRect.x + contentRect.width - 10 - width\n : align === \"center\"\n ? contentRect.x + contentRect.width / 2 - width / 2\n : contentRect.x + 10 + (cell.expandable ? 18 : 0);\n context.save();\n context.fillStyle = \"#99c2ff\";\n context.fillRect(\n origin + context.measureText(cell.label.slice(0, range.start)).width,\n contentRect.y + (contentRect.height - fontSize) / 2,\n context.measureText(cell.label.slice(range.start, range.end)).width,\n fontSize,\n );\n context.restore();\n}\n\nfunction resolveTextSelectionRange(\n selection: NonNullable<PivotSelectionState[\"textSelection\"]>,\n index: number,\n length: number,\n) {\n const forward = selection.anchorFragmentIndex <= selection.focusFragmentIndex;\n const startIndex = forward\n ? selection.anchorFragmentIndex\n : selection.focusFragmentIndex;\n const endIndex = forward\n ? selection.focusFragmentIndex\n : selection.anchorFragmentIndex;\n if (index < startIndex || index > endIndex) return null;\n const start =\n index === startIndex\n ? forward\n ? selection.anchorOffset\n : selection.focusOffset\n : 0;\n const end =\n index === endIndex\n ? forward\n ? selection.focusOffset\n : selection.anchorOffset\n : length;\n return {\n start: Math.max(0, Math.min(start, length)),\n end: Math.max(0, Math.min(end, length)),\n };\n}\n\nfunction isHeaderSelected(\n cell: PivotHeaderCellLayout,\n selectedPathKey: string | null,\n) {\n if (!selectedPathKey || !cell.nodeId) {\n return false;\n }\n return Boolean(isPathRelated(selectedPathKey, cell.pathKey));\n}\n\nfunction drawBodyCell<RecordType>(\n context: CanvasRenderingContext2D,\n cell: PivotBodyCellLayout,\n options: PivotTableOptions<RecordType>,\n theme: PivotTableTheme,\n state: {\n active: boolean;\n hover: boolean;\n highlighted: boolean;\n },\n visibleMaximum: number,\n textSelection?: PivotSelectionState[\"textSelection\"],\n) {\n const indicator = options.indicators.find(\n (item) => item.key === cell.indicatorKey,\n );\n fillRect(\n context,\n cell.rect,\n state.highlighted || state.active\n ? theme.selectionBackgroundColor\n : state.hover\n ? theme.hoverBackgroundColor\n : theme.backgroundColor,\n );\n if (indicator?.cellType === \"progress\" && typeof cell.value === \"number\") {\n const ratio = Math.min(Math.max(cell.value, 0), 100) / 100;\n fillRect(\n context,\n { ...cell.rect, width: cell.rect.width * ratio },\n theme.selectionBackgroundColor,\n );\n }\n if (\n indicator?.cellType === \"chart\" &&\n typeof cell.value === \"number\" &&\n visibleMaximum > 0\n ) {\n const ratio = Math.min(Math.abs(cell.value) / visibleMaximum, 1);\n fillRect(\n context,\n {\n x: cell.rect.x + 8,\n y: cell.rect.y + cell.rect.height - 8,\n width: Math.max((cell.rect.width - 16) * ratio, 1),\n height: 3,\n },\n \"#3370ff\",\n );\n }\n const text = resolveBodyDisplayText(cell, indicator);\n const padding = 10;\n const align = indicator?.align ?? \"right\";\n drawTextSelectionBackground(\n context,\n cell,\n text,\n align,\n padding,\n textSelection,\n theme.fontSize,\n );\n drawText(\n context,\n text,\n cell.rect,\n theme.textColor,\n 10,\n indicator?.align ?? \"right\",\n );\n}\n\nfunction drawTextSelectionBackground(\n context: CanvasRenderingContext2D,\n cell: PivotBodyCellLayout,\n text: string,\n align: \"left\" | \"center\" | \"right\",\n padding: number,\n selection: PivotSelectionState[\"textSelection\"],\n fontSize: number,\n) {\n if (!selection) return;\n const index = selection.fragments.findIndex(\n (fragment) =>\n fragment.rowIndex === cell.rowIndex &&\n fragment.columnIndex === cell.columnIndex &&\n fragment.text === text,\n );\n if (index < 0) return;\n const forward =\n selection.anchorFragmentIndex < selection.focusFragmentIndex ||\n (selection.anchorFragmentIndex === selection.focusFragmentIndex &&\n selection.anchorOffset <= selection.focusOffset);\n const startIndex = forward\n ? selection.anchorFragmentIndex\n : selection.focusFragmentIndex;\n const endIndex = forward\n ? selection.focusFragmentIndex\n : selection.anchorFragmentIndex;\n if (index < startIndex || index > endIndex) return;\n const start =\n index === startIndex\n ? forward\n ? selection.anchorOffset\n : selection.focusOffset\n : 0;\n const end =\n index === endIndex\n ? forward\n ? selection.focusOffset\n : selection.anchorOffset\n : text.length;\n if (start >= end) return;\n const availableWidth = Math.max(cell.rect.width - padding * 2, 0);\n const shown = truncateText(context, text, availableWidth);\n const textWidth = context.measureText(shown).width;\n const origin =\n align === \"right\"\n ? cell.rect.x + cell.rect.width - padding - textWidth\n : align === \"center\"\n ? cell.rect.x + cell.rect.width / 2 - textWidth / 2\n : cell.rect.x + padding;\n context.save();\n context.fillStyle = \"#99c2ff\";\n context.fillRect(\n origin + context.measureText(shown.slice(0, start)).width,\n cell.rect.y + (cell.rect.height - fontSize) / 2,\n context.measureText(shown.slice(start, end)).width,\n fontSize,\n );\n context.restore();\n}\n\nfunction resolveSelectionPathKeys(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState | null | undefined,\n activeNodePathKey: string | null,\n) {\n const activeNode = selection?.activeNode;\n if (activeNode) {\n return {\n row: activeNode.axis === \"row\" ? activeNodePathKey : null,\n column: activeNode.axis === \"column\" ? activeNodePathKey : null,\n };\n }\n const activeCell = selection?.activeCell;\n if (!activeCell) {\n return { row: null, column: null };\n }\n return {\n row: resolveSlotPathKey(\n layout.rowSlots,\n activeCell.rowNodeId,\n activeCell.indicatorKey,\n ),\n column: resolveSlotPathKey(\n layout.columnSlots,\n activeCell.columnNodeId,\n activeCell.indicatorKey,\n ),\n };\n}\n\nfunction resolveSlotPathKey(\n slots: PivotLayoutSnapshot[\"rowSlots\"],\n nodeId: string,\n indicatorKey: string,\n) {\n return (\n slots.find(\n (slot) =>\n (slot.nodeId ?? \"\") === nodeId &&\n (!slot.indicatorKey || slot.indicatorKey === indicatorKey),\n )?.pathKey ?? null\n );\n}\n\nfunction isSameCoordinate(first: number, second: number) {\n return Math.abs(first - second) < 0.01;\n}\n\nfunction resolveBodyDisplayText<RecordType>(\n cell: PivotBodyCellLayout,\n indicator: PivotTableOptions<RecordType>[\"indicators\"][number] | undefined,\n) {\n if (!indicator || indicator.formatter || typeof cell.value !== \"number\") {\n return cell.formattedValue;\n }\n if (indicator.cellType === \"percent\") {\n return `${(cell.value * 100).toFixed(indicator.precision ?? 2)}%`;\n }\n if (indicator.cellType === \"money\") {\n return cell.value.toLocaleString(\"zh-CN\", {\n style: \"currency\",\n currency: \"CNY\",\n minimumFractionDigits: indicator.precision ?? 2,\n maximumFractionDigits: indicator.precision ?? 2,\n });\n }\n return cell.formattedValue;\n}\n\nfunction resolveVisibleIndicatorMaxima(layout: PivotLayoutSnapshot) {\n const maxima = new Map<string, number>();\n layout.bodyCells.forEach((cell) => {\n if (typeof cell.value !== \"number\" || !Number.isFinite(cell.value)) return;\n maxima.set(\n cell.indicatorKey,\n Math.max(maxima.get(cell.indicatorKey) ?? 0, Math.abs(cell.value)),\n );\n });\n return maxima;\n}\n\nfunction isCellAddress(\n cell: PivotBodyCellLayout,\n address: PivotCellAddress | null | undefined,\n) {\n return Boolean(\n address &&\n address.rowNodeId === (cell.rowNodeId ?? \"\") &&\n address.columnNodeId === (cell.columnNodeId ?? \"\") &&\n address.indicatorKey === cell.indicatorKey,\n );\n}\n\nfunction isCellHighlightedByMode(\n mode: \"cell\" | \"row\" | \"column\" | \"cross\",\n cell: PivotBodyCellLayout,\n selection: PivotSelectionState | null | undefined,\n activeNodePathKey: string | null,\n) {\n const activeNode = selection?.activeNode;\n if (\n activeNode &&\n activeNodePathKey &&\n isPathRelated(\n activeNodePathKey,\n activeNode.axis === \"row\" ? cell.rowPathKey : cell.columnPathKey,\n )\n ) {\n return true;\n }\n const activeCell = selection?.activeCell;\n if (!activeCell) return false;\n const sameCell = isCellAddress(cell, activeCell);\n const sameRow = cell.rowNodeId === activeCell.rowNodeId;\n const sameColumn = cell.columnNodeId === activeCell.columnNodeId;\n if (mode === \"cell\") return sameCell;\n if (mode === \"row\") return sameRow;\n if (mode === \"column\") return sameColumn;\n return sameRow || sameColumn;\n}\n\nfunction isPathRelated(firstPathKey: string, secondPathKey: string) {\n try {\n const first = JSON.parse(firstPathKey) as unknown;\n const second = JSON.parse(secondPathKey) as unknown;\n if (!Array.isArray(first) || !Array.isArray(second)) {\n return firstPathKey === secondPathKey;\n }\n return isPathPrefix(first, second) || isPathPrefix(second, first);\n } catch {\n return firstPathKey === secondPathKey;\n }\n}\n\nfunction isPathPrefix(parent: unknown[], child: unknown[]) {\n return (\n parent.length <= child.length &&\n parent.every((value, index) => Object.is(value, child[index]))\n );\n}\n\nfunction resolveNodePathKey(nodeId: string) {\n try {\n const decoded = JSON.parse(nodeId) as unknown;\n return Array.isArray(decoded) && typeof decoded[2] === \"string\"\n ? decoded[2]\n : null;\n } catch {\n return null;\n }\n}\n\nfunction drawExpandIcon(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n expanded: boolean,\n) {\n const x = rect.x + 10;\n const y = rect.y + rect.height / 2;\n context.beginPath();\n if (expanded) {\n context.moveTo(x - 1, y - 2);\n context.lineTo(x + 4, y + 3);\n context.lineTo(x + 9, y - 2);\n } else {\n context.moveTo(x, y - 4);\n context.lineTo(x + 5, y);\n context.lineTo(x, y + 4);\n }\n context.strokeStyle = color;\n context.stroke();\n}\n\nfunction drawFilterIcon(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n const right = rect.x + rect.width - 10;\n const top = rect.y + rect.height / 2 - 5;\n context.beginPath();\n context.moveTo(right - 10, top);\n context.lineTo(right, top);\n context.lineTo(right - 4, top + 5);\n context.lineTo(right - 4, top + 10);\n context.lineTo(right - 6, top + 9);\n context.lineTo(right - 6, top + 5);\n context.closePath();\n context.fillStyle = color;\n context.fill();\n}\n\nfunction drawSortIcon(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n direction: \"asc\" | \"desc\" | null,\n rightPadding: number,\n) {\n const size = 14;\n const iconRect = {\n x: rect.x + rect.width - rightPadding - 5 - size / 2,\n y: rect.y + (rect.height - size) / 2,\n width: size,\n height: size,\n };\n\n context.save();\n context.beginPath();\n context.fillStyle = direction === \"asc\" ? \"#1677ff\" : \"#8c8c8c\";\n context.moveTo(iconRect.x + iconRect.width / 2, iconRect.y + 1);\n context.lineTo(iconRect.x + iconRect.width - 2, iconRect.y + 6);\n context.lineTo(iconRect.x + 2, iconRect.y + 6);\n context.closePath();\n context.fill();\n\n context.beginPath();\n context.fillStyle = direction === \"desc\" ? \"#1677ff\" : \"#8c8c8c\";\n context.moveTo(iconRect.x + 2, iconRect.y + iconRect.height - 6);\n context.lineTo(\n iconRect.x + iconRect.width - 2,\n iconRect.y + iconRect.height - 6,\n );\n context.lineTo(\n iconRect.x + iconRect.width / 2,\n iconRect.y + iconRect.height - 1,\n );\n context.closePath();\n context.fill();\n context.restore();\n}\n\nfunction drawText(\n context: CanvasRenderingContext2D,\n text: string,\n rect: PivotRect,\n color: string,\n padding: number,\n align: \"left\" | \"center\" | \"right\",\n) {\n const availableWidth = Math.max(rect.width - padding * 2, 0);\n const value = truncateText(context, text, availableWidth);\n context.fillStyle = color;\n context.textAlign = align;\n const x =\n align === \"right\"\n ? rect.x + rect.width - padding\n : align === \"center\"\n ? rect.x + rect.width / 2\n : rect.x + padding;\n context.fillText(value, x, rect.y + rect.height / 2, availableWidth);\n}\n\nfunction truncateText(\n context: CanvasRenderingContext2D,\n text: string,\n maxWidth: number,\n) {\n if (context.measureText(text).width <= maxWidth) return text;\n const suffix = \"...\";\n let value = text;\n while (value && context.measureText(`${value}${suffix}`).width > maxWidth) {\n value = value.slice(0, -1);\n }\n return value ? `${value}${suffix}` : \"\";\n}\n\nfunction withClip(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n draw: () => void,\n) {\n context.save();\n context.beginPath();\n context.rect(rect.x, rect.y, rect.width, rect.height);\n context.clip();\n draw();\n context.restore();\n}\n\nfunction fillRect(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n context.fillStyle = color;\n context.fillRect(rect.x, rect.y, rect.width, rect.height);\n}\n\nfunction strokeRect(\n context: CanvasRenderingContext2D,\n rect: PivotRect,\n color: string,\n) {\n context.strokeStyle = color;\n context.lineWidth = 1;\n context.strokeRect(\n rect.x + 0.5,\n rect.y + 0.5,\n Math.max(rect.width - 1, 0),\n Math.max(rect.height - 1, 0),\n );\n}\n","import type {\n PivotBodyCellLayout,\n PivotHeaderCellLayout,\n PivotLayoutSnapshot,\n PivotReportFilterCellLayout,\n} from \"../layout/types\";\n\n/** PivotTable 命中区域。 */\nexport type PivotHitRegion =\n | \"reportFilter\"\n | \"corner\"\n | \"rowHeader\"\n | \"columnHeader\"\n | \"body\";\n\n/** PivotTable 命中结果。 */\nexport interface PivotHitTestResult {\n region: PivotHitRegion;\n headerCell?: PivotHeaderCellLayout;\n reportFilterCell?: PivotReportFilterCellLayout;\n bodyCell?: PivotBodyCellLayout;\n onExpandIcon: boolean;\n onFilterIcon: boolean;\n onSortIcon: boolean;\n}\n\n/** 在当前布局快照中执行四区命中。 */\nexport function hitTestPivotLayout(\n layout: PivotLayoutSnapshot,\n x: number,\n y: number,\n): PivotHitTestResult | null {\n const reportFilterCell = layout.reportFilterCells.find((cell) =>\n contains(cell.rect, x, y),\n );\n if (reportFilterCell) {\n return {\n region: \"reportFilter\",\n reportFilterCell,\n onExpandIcon: false,\n onFilterIcon: contains(reportFilterCell.valueRect, x, y),\n onSortIcon: false,\n };\n }\n const bodyCell = layout.bodyCells.find((cell) => contains(cell.rect, x, y));\n if (bodyCell) {\n return {\n region: \"body\",\n bodyCell,\n onExpandIcon: false,\n onFilterIcon: false,\n onSortIcon: false,\n };\n }\n const rowHeaderCell = layout.rowHeaderCells.find((cell) =>\n contains(cell.rect, x, y),\n );\n if (rowHeaderCell) {\n return {\n region: \"rowHeader\",\n headerCell: rowHeaderCell,\n onExpandIcon: rowHeaderCell.expandable && x <= rowHeaderCell.rect.x + 28,\n onFilterIcon:\n rowHeaderCell.filterable &&\n x >= rowHeaderCell.rect.x + rowHeaderCell.rect.width - 28,\n onSortIcon: isSortIconHit(rowHeaderCell, x),\n };\n }\n const columnHeaderCell = layout.columnHeaderCells.find((cell) =>\n contains(cell.rect, x, y),\n );\n if (columnHeaderCell) {\n return {\n region: \"columnHeader\",\n headerCell: columnHeaderCell,\n onExpandIcon:\n columnHeaderCell.expandable && x <= columnHeaderCell.rect.x + 28,\n onFilterIcon:\n columnHeaderCell.filterable &&\n x >= columnHeaderCell.rect.x + columnHeaderCell.rect.width - 28,\n onSortIcon: isSortIconHit(columnHeaderCell, x),\n };\n }\n const rowFieldHeaderCell = layout.rowFieldHeaderCells.find((cell) =>\n contains(cell.rect, x, y),\n );\n if (rowFieldHeaderCell) {\n return {\n region: \"corner\",\n headerCell: rowFieldHeaderCell,\n onExpandIcon: false,\n onFilterIcon:\n rowFieldHeaderCell.filterable &&\n x >= rowFieldHeaderCell.rect.x + rowFieldHeaderCell.rect.width - 28,\n onSortIcon: isSortIconHit(rowFieldHeaderCell, x),\n };\n }\n if (contains(layout.cornerRect, x, y)) {\n return {\n region: \"corner\",\n onExpandIcon: false,\n onFilterIcon: false,\n onSortIcon: false,\n };\n }\n return null;\n}\n\nfunction isSortIconHit(cell: PivotHeaderCellLayout, x: number) {\n if (!cell.sortable) return false;\n const rightOffset = cell.filterable ? 28 : 0;\n const right = cell.rect.x + cell.rect.width - rightOffset;\n return x >= right - 28 && x < right;\n}\n\nfunction contains(\n rect: { x: number; y: number; width: number; height: number },\n x: number,\n y: number,\n) {\n return (\n x >= rect.x &&\n x < rect.x + rect.width &&\n y >= rect.y &&\n y < rect.y + rect.height\n );\n}\n","import type { PivotSelectionState } from \"../schema/state\";\n\n/** PivotTable 可复制的单元格文本片段。 */\nexport interface PivotTextSelectionFragment {\n rowIndex: number;\n columnIndex: number;\n text: string;\n}\n\n/** 将 Canvas 横坐标解析为最近的字符偏移。 */\nexport function resolvePivotTextOffset(params: {\n text: string;\n pointerX: number;\n textOriginX: number;\n measureText: (text: string) => number;\n}) {\n const boundaries = [0];\n let offset = 0;\n for (const character of params.text) {\n offset += character.length;\n boundaries.push(offset);\n }\n const relativeX = params.pointerX - params.textOriginX;\n if (relativeX <= 0 || boundaries.length === 1) return 0;\n if (relativeX >= params.measureText(params.text)) return params.text.length;\n let low = 1;\n let high = boundaries.length - 1;\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n const boundary = boundaries[middle] ?? params.text.length;\n if (params.measureText(params.text.slice(0, boundary)) < relativeX) {\n low = middle + 1;\n } else {\n high = middle;\n }\n }\n const end = boundaries[low] ?? params.text.length;\n const start = boundaries[Math.max(low - 1, 0)] ?? 0;\n const startWidth = params.measureText(params.text.slice(0, start));\n const endWidth = params.measureText(params.text.slice(0, end));\n return relativeX - startWidth <= endWidth - relativeX ? start : end;\n}\n\n/** 获取当前 Canvas 文本选区内容;空选区返回 null。 */\nexport function getPivotSelectedText(selection: PivotSelectionState) {\n const textSelection = selection.textSelection;\n if (!textSelection) return null;\n const forward =\n textSelection.anchorFragmentIndex < textSelection.focusFragmentIndex ||\n (textSelection.anchorFragmentIndex === textSelection.focusFragmentIndex &&\n textSelection.anchorOffset <= textSelection.focusOffset);\n const startIndex = forward\n ? textSelection.anchorFragmentIndex\n : textSelection.focusFragmentIndex;\n const endIndex = forward\n ? textSelection.focusFragmentIndex\n : textSelection.anchorFragmentIndex;\n const startOffset = forward\n ? textSelection.anchorOffset\n : textSelection.focusOffset;\n const endOffset = forward\n ? textSelection.focusOffset\n : textSelection.anchorOffset;\n const selected = textSelection.fragments\n .slice(startIndex, endIndex + 1)\n .map((fragment, index) => {\n const absoluteIndex = startIndex + index;\n const start = absoluteIndex === startIndex ? startOffset : 0;\n const end = absoluteIndex === endIndex ? endOffset : fragment.text.length;\n return {\n fragment,\n text: fragment.text.slice(\n Math.max(0, Math.min(start, fragment.text.length)),\n Math.max(0, Math.min(end, fragment.text.length)),\n ),\n };\n });\n return (\n selected.reduce((result, item, index) => {\n const previous = selected[index - 1]?.fragment;\n const separator = previous\n ? previous.rowIndex === item.fragment.rowIndex\n ? \"\\t\"\n : \"\\n\"\n : \"\";\n return `${result}${separator}${item.text}`;\n }, \"\") || null\n );\n}\n","import type { PivotModel } from \"../../domain/pivot/pivot-model\";\nimport { createPivotCellKey } from \"../../domain/pivot/pivot-cell\";\nimport type { PivotLayoutSnapshot } from \"../../domain/layout/types\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../../schema/state\";\n\n/** 根据当前单元格、行节点或列节点选区生成剪贴板文本。 */\nexport function createPivotSelectionText<RecordType>(params: {\n layout: PivotLayoutSnapshot;\n model: PivotModel<RecordType>;\n selection: PivotSelectionState;\n}) {\n const activeNode = params.selection.activeNode;\n if (activeNode) {\n return createNodeSelectionText({ ...params, activeNode });\n }\n return createCellSelectionText(params);\n}\n\n/** 按指定的零基行列范围生成剪贴板 TSV 文本。 */\nexport function createPivotRangeSelectionText<RecordType>(params: {\n layout: PivotLayoutSnapshot;\n model: PivotModel<RecordType>;\n startRowIndex: number;\n endRowIndex: number;\n startColumnIndex: number;\n endColumnIndex: number;\n}) {\n const startRowIndex = Math.max(\n 0,\n Math.min(params.startRowIndex, params.endRowIndex),\n );\n const endRowIndex = Math.min(\n params.layout.rowSlots.length - 1,\n Math.max(params.startRowIndex, params.endRowIndex),\n );\n const startColumnIndex = Math.max(\n 0,\n Math.min(params.startColumnIndex, params.endColumnIndex),\n );\n const endColumnIndex = Math.min(\n params.layout.columnSlots.length - 1,\n Math.max(params.startColumnIndex, params.endColumnIndex),\n );\n if (startRowIndex > endRowIndex || startColumnIndex > endColumnIndex) {\n return \"\";\n }\n const lines: string[] = [];\n for (let rowIndex = startRowIndex; rowIndex <= endRowIndex; rowIndex += 1) {\n const rowSlot = params.layout.rowSlots[rowIndex];\n if (!rowSlot) continue;\n const values: string[] = [];\n for (\n let columnIndex = startColumnIndex;\n columnIndex <= endColumnIndex;\n columnIndex += 1\n ) {\n const columnSlot = params.layout.columnSlots[columnIndex];\n if (columnSlot) {\n values.push(resolveCellText(params.model, rowSlot, columnSlot));\n }\n }\n lines.push(values.join(\"\\t\"));\n }\n return lines.join(\"\\n\");\n}\n\n/** 将当前单元格选区转换为零基行列范围。 */\nexport function resolvePivotSelectionRange(\n layout: PivotLayoutSnapshot,\n selection: PivotSelectionState,\n) {\n const range = selection.ranges[0];\n if (!range) return null;\n const start = resolveAddressIndexes(layout, range.start);\n const end = resolveAddressIndexes(layout, range.end);\n if (!start || !end) return null;\n return {\n startRowIndex: Math.min(start.rowIndex, end.rowIndex),\n endRowIndex: Math.max(start.rowIndex, end.rowIndex),\n startColumnIndex: Math.min(start.columnIndex, end.columnIndex),\n endColumnIndex: Math.max(start.columnIndex, end.columnIndex),\n };\n}\n\nfunction createNodeSelectionText<RecordType>(params: {\n layout: PivotLayoutSnapshot;\n model: PivotModel<RecordType>;\n selection: PivotSelectionState;\n activeNode: NonNullable<PivotSelectionState[\"activeNode\"]>;\n}) {\n const nodeMap =\n params.activeNode.axis === \"row\"\n ? params.model.rowNodes\n : params.model.columnNodes;\n const node = nodeMap.get(params.activeNode.nodeId);\n if (!node) return \"\";\n\n if (params.activeNode.axis === \"row\") {\n return params.layout.rowSlots\n .filter((slot) => isPathRelated(node.pathKey, slot.pathKey))\n .flatMap((rowSlot) =>\n params.layout.columnSlots.map((columnSlot) =>\n resolveCellText(params.model, rowSlot, columnSlot),\n ),\n )\n .join(\" \");\n }\n\n const columnSlots = params.layout.columnSlots.filter((slot) =>\n isPathRelated(node.pathKey, slot.pathKey),\n );\n return params.layout.rowSlots\n .map((rowSlot) =>\n columnSlots\n .map((columnSlot) => resolveCellText(params.model, rowSlot, columnSlot))\n .join(\" \"),\n )\n .join(\"\\n\");\n}\n\nfunction createCellSelectionText<RecordType>(params: {\n layout: PivotLayoutSnapshot;\n model: PivotModel<RecordType>;\n selection: PivotSelectionState;\n}) {\n const range = resolvePivotSelectionRange(params.layout, params.selection);\n if (!range) return \"\";\n return createPivotRangeSelectionText({ ...params, ...range });\n}\n\nfunction resolveCellText<RecordType>(\n model: PivotModel<RecordType>,\n rowSlot: PivotLayoutSnapshot[\"rowSlots\"][number],\n columnSlot: PivotLayoutSnapshot[\"columnSlots\"][number],\n) {\n const indicatorKey = rowSlot.indicatorKey ?? columnSlot.indicatorKey;\n if (!indicatorKey) return \"\";\n return (\n model.cells.get(\n createPivotCellKey(rowSlot.pathKey, columnSlot.pathKey, indicatorKey),\n )?.formattedValue ?? \"\"\n );\n}\n\nfunction resolveAddressIndexes(\n layout: PivotLayoutSnapshot,\n address: PivotCellAddress,\n) {\n const rowIndex = layout.rowSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.rowNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n const columnIndex = layout.columnSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.columnNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n return rowIndex >= 0 && columnIndex >= 0 ? { rowIndex, columnIndex } : null;\n}\n\nfunction isPathRelated(firstPathKey: string, secondPathKey: string) {\n try {\n const first = JSON.parse(firstPathKey) as unknown;\n const second = JSON.parse(secondPathKey) as unknown;\n if (!Array.isArray(first) || !Array.isArray(second)) {\n return firstPathKey === secondPathKey;\n }\n return isPathPrefix(first, second) || isPathPrefix(second, first);\n } catch {\n return firstPathKey === secondPathKey;\n }\n}\n\nfunction isPathPrefix(parent: unknown[], child: unknown[]) {\n return (\n parent.length <= child.length &&\n parent.every((value, index) => Object.is(value, child[index]))\n );\n}\n","import type { PivotLayoutSnapshot } from \"../layout/types\";\n\n/** PivotTable 表头宽度调整命中。 */\nexport type PivotResizeHit =\n | { kind: \"rowDimension\"; index: number }\n | { kind: \"valueColumn\"; index: number };\n\n/** 命中行维度或值列的宽度调整边界。 */\nexport function hitTestPivotResize(\n layout: PivotLayoutSnapshot,\n x: number,\n y: number,\n tolerance = 4,\n): PivotResizeHit | null {\n if (x <= layout.rowHeaderWidth) {\n let boundary = 0;\n for (let index = 0; index < layout.rowDimensionWidths.length; index += 1) {\n boundary += layout.rowDimensionWidths[index] ?? 0;\n if (Math.abs(x - boundary) <= tolerance) {\n return { kind: \"rowDimension\", index };\n }\n }\n }\n if (\n y >= layout.reportFilterHeight &&\n y <= layout.reportFilterHeight + layout.columnHeaderHeight &&\n x >= layout.rowHeaderWidth\n ) {\n const relative = x - layout.rowHeaderWidth + layout.scroll.left;\n for (let index = 1; index < layout.columnOffsets.length; index += 1) {\n const boundary = layout.columnOffsets[index] ?? 0;\n if (Math.abs(relative - boundary) <= tolerance) {\n return { kind: \"valueColumn\", index: index - 1 };\n }\n }\n }\n return null;\n}\n","import { isPointInRect } from \"@canvas-components/utils\";\nimport type {\n PivotAxisScrollbarLayout,\n PivotScrollbarAxis,\n PivotScrollbarLayout,\n PivotScrollbarRole,\n} from \"../layout/scrollbar-types\";\n\n/** 命中 PivotTable Canvas 滚动条。 */\nexport function hitTestPivotScrollbar(\n layout: PivotScrollbarLayout,\n x: number,\n y: number,\n): { axis: PivotScrollbarAxis; role: PivotScrollbarRole } | null {\n for (const axis of [\"horizontal\", \"vertical\"] as const) {\n const axisLayout = layout[axis];\n if (!axisLayout) continue;\n const role = resolveRole(axisLayout, x, y);\n if (role) return { axis, role };\n }\n return null;\n}\n\nfunction resolveRole(\n layout: PivotAxisScrollbarLayout,\n x: number,\n y: number,\n): PivotScrollbarRole | null {\n if (isPointInRect(x, y, layout.thumb)) return \"thumb\";\n if (isPointInRect(x, y, layout.decreaseButton)) return \"decrease-button\";\n if (isPointInRect(x, y, layout.increaseButton)) return \"increase-button\";\n if (isPointInRect(x, y, layout.track)) return \"track\";\n return null;\n}\n","import type {\n PivotHeaderCellLayout,\n PivotLayoutSnapshot,\n} from \"../layout/types\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../../schema/state\";\n\n/** 根据指标列表头创建覆盖全部可见行的精确列选区。 */\nexport function createPivotValueColumnSelection(\n layout: PivotLayoutSnapshot,\n header: PivotHeaderCellLayout,\n): PivotSelectionState | null {\n if (header.axis !== \"column\" || !header.indicatorKey) return null;\n const columnSlot = layout.columnSlots.find(\n (slot) =>\n slot.pathKey === header.pathKey &&\n slot.indicatorKey === header.indicatorKey,\n );\n const firstRow = layout.rowSlots[0];\n const lastRow = layout.rowSlots[layout.rowSlots.length - 1];\n const indicatorKey = columnSlot?.indicatorKey;\n if (!columnSlot || !firstRow || !lastRow || !indicatorKey) return null;\n const start = createAddress(firstRow, columnSlot, indicatorKey);\n const end = createAddress(lastRow, columnSlot, indicatorKey);\n return {\n activeCell: start,\n anchorCell: start,\n ranges: [{ start, end, kind: \"column\" }],\n activeNode: null,\n };\n}\n\nfunction createAddress(\n rowSlot: PivotLayoutSnapshot[\"rowSlots\"][number],\n columnSlot: PivotLayoutSnapshot[\"columnSlots\"][number],\n indicatorKey: string,\n): PivotCellAddress {\n return {\n rowNodeId: rowSlot.nodeId ?? \"\",\n columnNodeId: columnSlot.nodeId ?? \"\",\n indicatorKey,\n };\n}\n","import type { PivotLayoutSnapshot } from \"../layout/types\";\nimport type { PivotCellAddress, PivotSelectionState } from \"../../schema/state\";\n\n/** 根据表体纵坐标解析稳定的行槽索引。 */\nexport function resolvePivotRowIndexAtY(\n layout: PivotLayoutSnapshot,\n y: number,\n) {\n if (layout.rowSlots.length === 0 || layout.rowHeight <= 0) return null;\n const index = Math.floor(\n (y - layout.bodyRect.y + layout.scroll.top) / layout.rowHeight,\n );\n return Math.min(Math.max(index, 0), layout.rowSlots.length - 1);\n}\n\n/** 创建从行头覆盖到指定值列的选区;未指定值列时覆盖整行。 */\nexport function createPivotRowRangeSelection(\n layout: PivotLayoutSnapshot,\n startRowIndex: number,\n endRowIndex: number,\n endColumnIndex?: number,\n): PivotSelectionState | null {\n const startRow = layout.rowSlots[startRowIndex];\n const endRow = layout.rowSlots[endRowIndex];\n const firstColumn = layout.columnSlots[0];\n const lastColumn =\n layout.columnSlots[endColumnIndex ?? layout.columnSlots.length - 1];\n if (!startRow || !endRow || !firstColumn || !lastColumn) return null;\n const start = createAddress(startRow, firstColumn);\n const end = createAddress(endRow, lastColumn);\n if (!start || !end) return null;\n return {\n activeCell: end,\n anchorCell: start,\n ranges: [{ start, end, kind: endColumnIndex == null ? \"row\" : \"row-cell\" }],\n activeNode: null,\n };\n}\n\nfunction createAddress(\n rowSlot: PivotLayoutSnapshot[\"rowSlots\"][number],\n columnSlot: PivotLayoutSnapshot[\"columnSlots\"][number],\n): PivotCellAddress | null {\n const indicatorKey = rowSlot.indicatorKey ?? columnSlot.indicatorKey;\n if (!indicatorKey) return null;\n return {\n rowNodeId: rowSlot.nodeId ?? \"\",\n columnNodeId: columnSlot.nodeId ?? \"\",\n indicatorKey,\n };\n}\n","export interface PivotScrollPosition {\n left: number;\n top: number;\n}\n\nconst DELTA_MODE_PIXEL = 0;\nconst DELTA_MODE_LINE = 1;\nconst DELTA_MODE_PAGE = 2;\n\n/** 将滚轮事件转换为 PivotTable 布局像素,并柔化离散鼠标步进。 */\nexport function resolvePivotWheelScrollDelta(params: {\n deltaX: number;\n deltaY: number;\n deltaMode: number;\n shiftKey: boolean;\n lineHeight: number;\n pageWidth: number;\n pageHeight: number;\n}) {\n const rawX = softenWheelDelta({\n delta: normalizeWheelDelta(\n params.deltaX,\n params.deltaMode,\n params.lineHeight,\n params.pageWidth,\n ),\n deltaMode: params.deltaMode,\n lineHeight: params.lineHeight,\n });\n const rawY = softenWheelDelta({\n delta: normalizeWheelDelta(\n params.deltaY,\n params.deltaMode,\n params.lineHeight,\n params.pageHeight,\n ),\n deltaMode: params.deltaMode,\n lineHeight: params.lineHeight,\n });\n return params.shiftKey\n ? { left: rawX + rawY, top: 0 }\n : { left: rawX, top: rawY };\n}\n\n/** 判断是否为应立即跟手的触控板像素流。 */\nexport function shouldApplyPivotWheelDeltaImmediately(params: {\n deltaX: number;\n deltaY: number;\n deltaMode: number;\n}) {\n return (\n params.deltaMode === DELTA_MODE_PIXEL &&\n Math.abs(params.deltaX) < 40 &&\n Math.abs(params.deltaY) < 40\n );\n}\n\n/** 计算平滑滚轮动画的下一帧位置。 */\nexport function advancePivotWheelScrollSmoothing(params: {\n current: PivotScrollPosition;\n target: PivotScrollPosition;\n deltaMs: number;\n timeConstantMs?: number;\n}) {\n const timeConstant = Math.max(params.timeConstantMs ?? 92, 1);\n const deltaMs = Math.max(Math.min(params.deltaMs, 64), 0);\n const alpha = 1 - Math.exp(-deltaMs / timeConstant);\n const nextLeft =\n params.current.left + (params.target.left - params.current.left) * alpha;\n const nextTop =\n params.current.top + (params.target.top - params.current.top) * alpha;\n const done =\n Math.abs(params.target.left - nextLeft) < 0.35 &&\n Math.abs(params.target.top - nextTop) < 0.35;\n return {\n nextScroll: done\n ? { ...params.target }\n : { left: nextLeft, top: nextTop },\n done,\n };\n}\n\nfunction normalizeWheelDelta(\n delta: number,\n deltaMode: number,\n lineHeight: number,\n pageSize: number,\n) {\n const value = Number.isFinite(delta) ? delta : 0;\n if (deltaMode === DELTA_MODE_LINE) {\n return value * Math.max(lineHeight, 1);\n }\n if (deltaMode === DELTA_MODE_PAGE) {\n return value * Math.max(pageSize, 1);\n }\n return value;\n}\n\nfunction softenWheelDelta(params: {\n delta: number;\n deltaMode: number;\n lineHeight: number;\n}) {\n const { delta } = params;\n if (delta === 0) return 0;\n const absolute = Math.abs(delta);\n const lineHeight = Math.max(params.lineHeight, 1);\n if (\n params.deltaMode === DELTA_MODE_PIXEL &&\n absolute >= 80 &&\n absolute <= 160\n ) {\n return delta * 0.42;\n }\n if (params.deltaMode === DELTA_MODE_LINE) {\n const maxStep = Math.max(lineHeight * 0.75, 24);\n return absolute <= maxStep\n ? delta * 0.72\n : Math.sign(delta) * (maxStep + (absolute - maxStep) * 0.35);\n }\n const threshold = Math.max(lineHeight * 1.25, 48);\n return absolute <= threshold\n ? delta\n : Math.sign(delta) * (threshold + (absolute - threshold) * 0.4);\n}\n","import { clamp, copyText, copyTextSync } from \"@canvas-components/utils\";\nimport { PivotTableCore } from \"./engine/pivot-table-engine\";\nimport type { PivotTableOptions } from \"./schema/options\";\nimport { createPivotDomHost, type PivotDomHost } from \"./adapters/dom-host\";\nimport { resizePivotCanvas } from \"./adapters/canvas-host\";\nimport {\n renderPivotTable,\n type PivotRenderStats,\n} from \"./rendering/canvas-renderer\";\nimport type { PivotLayoutSnapshot } from \"./domain/layout/types\";\nimport {\n hitTestPivotLayout,\n type PivotHitTestResult,\n} from \"./domain/interaction/hit-test\";\nimport type { PivotCellAddress, PivotSelectionState } from \"./schema/state\";\nimport {\n getPivotSelectedText,\n resolvePivotTextOffset,\n} from \"./interaction/text-selection\";\nimport type { PivotAxis, PivotFilterAxis } from \"./schema/events\";\nimport type { PivotDimensionFilter } from \"./schema/state\";\nimport {\n createPivotRangeSelectionText,\n createPivotSelectionText,\n resolvePivotSelectionRange,\n} from \"./features/clipboard/pivot-selection-copy\";\nimport {\n hitTestPivotResize,\n type PivotResizeHit,\n} from \"./domain/interaction/resize-hit\";\nimport {\n exportPivotMatrixToCsv,\n exportPivotMatrixToXlsx,\n type PivotExportOptions,\n} from \"./features/export/pivot-export\";\nimport type { PivotTableStateSnapshot } from \"./schema/persistence\";\nimport { hitTestPivotScrollbar } from \"./domain/interaction/scrollbar-hit\";\nimport type { PivotScrollbarAxis } from \"./domain/layout/scrollbar-types\";\nimport { createPivotValueColumnSelection } from \"./domain/interaction/column-selection\";\nimport {\n createPivotRowRangeSelection,\n resolvePivotRowIndexAtY,\n} from \"./domain/interaction/row-selection\";\nimport {\n advancePivotWheelScrollSmoothing,\n resolvePivotWheelScrollDelta,\n shouldApplyPivotWheelDeltaImmediately,\n type PivotScrollPosition,\n} from \"./domain/scroll/scroll-transition\";\nimport {\n resolvePivotDimensionKey,\n resolvePivotDimensionTitle,\n} from \"./domain/data/dimension-config\";\n\n/** PivotTable 原生实例入口。 */\nexport class PivotTable<RecordType = Record<string, unknown>> {\n private readonly container: HTMLElement;\n private options: PivotTableOptions<RecordType>;\n private core: PivotTableCore<RecordType> | null = null;\n private host: PivotDomHost | null = null;\n private stopResizeObserver: (() => void) | null = null;\n private frameId: number | null = null;\n private width = 0;\n private height = 0;\n private layout: PivotLayoutSnapshot | null = null;\n private renderStats: PivotRenderStats | null = null;\n private hoverCell: PivotCellAddress | null = null;\n private tooltipText: string | null = null;\n private scroll = { left: 0, top: 0 };\n private wheelScrollTarget: PivotScrollPosition | null = null;\n private wheelScrollFrameId: number | null = null;\n private wheelScrollLastTime = 0;\n private resizeSession: {\n hit: PivotResizeHit;\n pointerId: number;\n startX: number;\n startWidth: number;\n } | null = null;\n private resizeGuideX: number | null = null;\n private suppressNextClick = false;\n private scrollbarDrag: {\n axis: PivotScrollbarAxis;\n pointerId: number;\n pointerOffset: number;\n trackStart: number;\n trackLength: number;\n thumbLength: number;\n } | null = null;\n private cellSelectionDrag: {\n pointerId: number;\n anchor: PivotCellAddress;\n lastAddress: PivotCellAddress;\n lastKind: \"cell\" | \"row-cell\";\n } | null = null;\n private textSelectionDrag: {\n pointerId: number;\n anchorFragmentIndex: number;\n anchorOffset: number;\n dragged: boolean;\n } | null = null;\n private headerTextSelectionDrag: {\n pointerId: number;\n fragments: Array<{\n key: string;\n text: string;\n originX: number;\n rowIndex?: number;\n columnIndex?: number;\n }>;\n anchorFragmentIndex: number;\n anchorOffset: number;\n dragged: boolean;\n } | null = null;\n private rowHeaderSelectionDrag: {\n pointerId: number;\n startRowIndex: number;\n lastRowIndex: number;\n lastColumnIndex: number | null;\n startClientX: number;\n startClientY: number;\n dragged: boolean;\n } | null = null;\n\n constructor(container: HTMLElement, options: PivotTableOptions<RecordType>) {\n this.container = container;\n this.options = options;\n }\n\n /** 挂载 PivotTable。 */\n mount() {\n if (this.core) return;\n this.core = new PivotTableCore(this.options);\n this.host = createPivotDomHost(this.container);\n this.host.root.addEventListener(\"pointermove\", this.handlePointerMove);\n this.host.root.addEventListener(\"pointerleave\", this.handlePointerLeave);\n this.host.root.addEventListener(\"click\", this.handleClick);\n this.host.root.addEventListener(\"keydown\", this.handleKeyDown);\n this.host.root.addEventListener(\"wheel\", this.handleWheel, {\n passive: false,\n });\n this.host.root.addEventListener(\"contextmenu\", this.handleContextMenu);\n this.host.root.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.host.root.addEventListener(\"pointerup\", this.handlePointerUp);\n this.host.root.addEventListener(\"pointercancel\", this.handlePointerUp);\n this.stopResizeObserver = this.host.observeResize((width, height) => {\n this.width = width;\n this.height = height;\n this.scheduleRender();\n });\n this.container.dataset.pivotTableMounted = \"true\";\n }\n\n /** 更新 PivotTable 配置。 */\n updateOptions(options: PivotTableOptions<RecordType>) {\n this.options = options;\n this.core?.updateOptions(options);\n this.scheduleRender();\n }\n\n /** 获取当前数据透视模型。 */\n getPivotModel() {\n return this.core?.getPivotModel() ?? null;\n }\n\n /** 获取当前可见行轴节点。 */\n getVisibleRowNodes() {\n return this.core?.getVisibleRowNodes() ?? [];\n }\n\n /** 获取当前可见列轴节点。 */\n getVisibleColumnNodes() {\n return this.core?.getVisibleColumnNodes() ?? [];\n }\n\n /** 获取最近一次布局快照。 */\n getLayoutSnapshot() {\n return this.layout;\n }\n\n /** 获取最近一次绘制统计。 */\n getRenderStats() {\n return this.renderStats;\n }\n\n /** 获取核心调试快照。 */\n getDebugSnapshot() {\n return this.core?.getDebugSnapshot() ?? null;\n }\n\n /** 获取当前选区。 */\n getSelection() {\n return this.core?.getSelection() ?? null;\n }\n\n /** 设置完整选区状态。 */\n setSelection(selection: PivotSelectionState) {\n const next = this.core?.setSelection(selection) ?? null;\n if (next) this.scheduleRender();\n return next;\n }\n\n /** 获取当前过滤状态。 */\n getFilters() {\n return this.core?.getFilters() ?? null;\n }\n\n /** 获取当前排序规则。 */\n getSorts() {\n return this.core?.getSorts() ?? [];\n }\n\n /** 清除全部排序规则。 */\n resetSorters() {\n const sorts = this.core?.resetSorts() ?? [];\n this.scheduleRender();\n return sorts;\n }\n\n /** 设置指定维度排序。 */\n setDimensionSort(\n axis: PivotAxis,\n dimensionKey: string,\n direction: \"asc\" | \"desc\" | null,\n ) {\n const sorts =\n this.core?.setDimensionSort(axis, dimensionKey, direction) ?? [];\n this.scheduleRender();\n return sorts;\n }\n\n /** 按指标聚合结果设置维度排序。 */\n setIndicatorSort(\n params: Parameters<PivotTableCore<RecordType>[\"setIndicatorSort\"]>[0],\n ) {\n const sorts = this.core?.setIndicatorSort(params) ?? [];\n this.scheduleRender();\n return sorts;\n }\n\n /** 设置指定轴维度过滤。 */\n setDimensionFilter(\n axis: PivotFilterAxis,\n dimensionKey: string,\n filter: PivotDimensionFilter | null,\n ) {\n const filters =\n this.core?.setDimensionFilter(axis, dimensionKey, filter) ?? null;\n if (filters) this.scheduleRender();\n return filters;\n }\n\n /** 获取指定轴维度的过滤候选项。 */\n getDimensionFilterOptions(axis: PivotFilterAxis, dimensionKey: string) {\n return this.core?.getDimensionFilterOptions(axis, dimensionKey) ?? [];\n }\n\n /** 清除全部维度过滤。 */\n resetFilters() {\n const filters = this.core?.resetFilters() ?? null;\n if (filters) this.scheduleRender();\n return filters;\n }\n\n /** 导出当前可见透视结果 CSV。 */\n exportCsv(options: PivotExportOptions = {}) {\n const matrix = this.core?.createExportMatrix(options.mode);\n return matrix ? exportPivotMatrixToCsv(matrix) : \"\";\n }\n\n /** 导出当前可见透视结果 XLSX 字节。 */\n exportXlsx(options: PivotExportOptions = {}) {\n const matrix = this.core?.createExportMatrix(options.mode);\n return matrix\n ? exportPivotMatrixToXlsx(matrix, options.sheetName)\n : new Uint8Array();\n }\n\n /** 获取可序列化状态快照。 */\n getState(): PivotTableStateSnapshot | null {\n if (!this.core) return null;\n return this.core.createStateSnapshot({\n left: this.scroll.left,\n top: this.scroll.top,\n });\n }\n\n /** 恢复版本兼容的状态快照。 */\n restoreState(snapshot: PivotTableStateSnapshot) {\n const restored = this.core?.restoreStateSnapshot(snapshot) ?? false;\n if (!restored) return false;\n this.stopWheelScrollSmoothing();\n this.scroll = { ...snapshot.scroll };\n this.scheduleRender();\n return true;\n }\n\n /** 选中指定值单元格。 */\n selectCell(address: PivotCellAddress, extend = false) {\n const selection = this.core?.selectCell(address, extend) ?? null;\n if (selection) {\n this.scrollToCell(address);\n this.scheduleRender();\n }\n return selection;\n }\n\n /** 选中行轴或列轴维度节点。 */\n selectNode(axis: PivotAxis, nodeId: string) {\n const selection = this.core?.selectNode(axis, nodeId) ?? null;\n if (selection) this.scheduleRender();\n return selection;\n }\n\n /** 将指定稳定地址滚动到可视区域。 */\n scrollToCell(address: PivotCellAddress) {\n if (!this.layout || !this.host) return false;\n this.stopWheelScrollSmoothing();\n const rowIndex = this.layout.rowSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.rowNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n const columnIndex = this.layout.columnSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.columnNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n if (rowIndex < 0 || columnIndex < 0) return false;\n const top = resolveVisibleOffset({\n current: this.scroll.top,\n itemStart: rowIndex * this.layout.rowHeight,\n itemSize: this.layout.rowHeight,\n viewportSize: this.layout.bodyRect.height,\n });\n const left = resolveVisibleOffset({\n current: this.scroll.left,\n itemStart: this.layout.columnOffsets[columnIndex] ?? 0,\n itemSize:\n this.layout.columnWidths[columnIndex] ?? this.layout.columnWidth,\n viewportSize: this.layout.bodyRect.width,\n });\n this.applyScrollPosition(left, top);\n return true;\n }\n\n /** 设置行轴节点展开状态。 */\n setRowNodeExpanded(nodeId: string, expanded: boolean) {\n const changed =\n this.core?.setNodeExpanded(\"row\", nodeId, expanded) ?? false;\n if (changed) this.scheduleRender();\n return changed;\n }\n\n /** 展开行轴节点。 */\n expandRowNode(nodeId: string) {\n return this.setRowNodeExpanded(nodeId, true);\n }\n\n /** 收起行轴节点。 */\n collapseRowNode(nodeId: string) {\n return this.setRowNodeExpanded(nodeId, false);\n }\n\n /** 设置列轴节点展开状态。 */\n setColumnNodeExpanded(nodeId: string, expanded: boolean) {\n const changed =\n this.core?.setNodeExpanded(\"column\", nodeId, expanded) ?? false;\n if (changed) this.scheduleRender();\n return changed;\n }\n\n /** 展开列轴节点。 */\n expandColumnNode(nodeId: string) {\n return this.setColumnNodeExpanded(nodeId, true);\n }\n\n /** 收起列轴节点。 */\n collapseColumnNode(nodeId: string) {\n return this.setColumnNodeExpanded(nodeId, false);\n }\n\n /** 展开指定范围内的全部维度节点。 */\n expandAll(axis: PivotAxis | \"both\" = \"both\") {\n const count =\n (axis === \"column\"\n ? 0\n : (this.core?.setAllNodesExpanded(\"row\", true) ?? 0)) +\n (axis === \"row\"\n ? 0\n : (this.core?.setAllNodesExpanded(\"column\", true) ?? 0));\n if (count > 0) this.scheduleRender();\n return count;\n }\n\n /** 收起指定范围内的全部维度节点。 */\n collapseAll(axis: PivotAxis | \"both\" = \"both\") {\n const count =\n (axis === \"column\"\n ? 0\n : (this.core?.setAllNodesExpanded(\"row\", false) ?? 0)) +\n (axis === \"row\"\n ? 0\n : (this.core?.setAllNodesExpanded(\"column\", false) ?? 0));\n if (count > 0) this.scheduleRender();\n return count;\n }\n\n /** 获取稳定地址对应的聚合值。 */\n getCellValue(address: PivotCellAddress) {\n return this.core?.getCellValue(address);\n }\n\n /** 获取指定聚合单元格对应的原始记录。 */\n getCellRecords(params: {\n rowPathKey: string;\n columnPathKey: string;\n indicatorKey: string;\n }) {\n return this.core?.getCellRecords(params) ?? [];\n }\n\n /** 销毁 PivotTable。 */\n destroy() {\n if (this.frameId !== null) cancelAnimationFrame(this.frameId);\n this.frameId = null;\n this.stopWheelScrollSmoothing();\n this.stopResizeObserver?.();\n this.stopResizeObserver = null;\n this.host?.root.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.host?.root.removeEventListener(\n \"pointerleave\",\n this.handlePointerLeave,\n );\n this.host?.root.removeEventListener(\"click\", this.handleClick);\n this.host?.root.removeEventListener(\"keydown\", this.handleKeyDown);\n this.host?.root.removeEventListener(\"wheel\", this.handleWheel);\n this.host?.root.removeEventListener(\"contextmenu\", this.handleContextMenu);\n this.host?.root.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.host?.root.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.host?.root.removeEventListener(\"pointercancel\", this.handlePointerUp);\n this.cellSelectionDrag = null;\n this.rowHeaderSelectionDrag = null;\n this.resizeGuideX = null;\n this.host?.destroy();\n this.host = null;\n this.core?.destroy();\n this.core = null;\n this.layout = null;\n this.renderStats = null;\n this.hoverCell = null;\n delete this.container.dataset.pivotTableMounted;\n }\n\n private readonly handlePointerMove = (event: PointerEvent) => {\n if (this.scrollbarDrag) {\n this.updateScrollbarDrag(event);\n return;\n }\n if (this.resizeSession) {\n if (this.host && this.layout) {\n const rootRect = this.host.root.getBoundingClientRect();\n this.resizeGuideX = clamp(\n event.clientX - rootRect.left,\n 0,\n this.layout.tableWidth,\n );\n }\n this.applyResize(event.clientX - this.resizeSession.startX);\n this.suppressNextClick = true;\n return;\n }\n if (this.cellSelectionDrag?.pointerId === event.pointerId) {\n if (this.textSelectionDrag?.pointerId === event.pointerId) {\n this.updateTextSelectionDrag(event);\n if (this.textSelectionDrag.dragged) return;\n }\n this.updateCellSelectionDrag(event);\n return;\n }\n if (this.headerTextSelectionDrag?.pointerId === event.pointerId) {\n this.updateHeaderTextSelectionDrag(event);\n return;\n }\n if (this.rowHeaderSelectionDrag?.pointerId === event.pointerId) {\n if (this.headerTextSelectionDrag?.pointerId === event.pointerId) {\n this.updateHeaderTextSelectionDrag(event);\n if (this.headerTextSelectionDrag.dragged) return;\n }\n this.updateRowHeaderSelectionDrag(event);\n return;\n }\n const scrollbarHit = this.resolveScrollbarHit(event);\n const resizeHit = scrollbarHit ? null : this.resolveResizeHit(event);\n if (this.host) {\n this.host.root.style.cursor = scrollbarHit\n ? scrollbarHit.role === \"thumb\"\n ? \"grab\"\n : \"pointer\"\n : resizeHit\n ? \"col-resize\"\n : \"\";\n }\n if (scrollbarHit) {\n if (this.tooltipText) this.options.ui?.onTooltipRequest?.(null);\n this.tooltipText = null;\n if (this.hoverCell) {\n this.hoverCell = null;\n this.scheduleRender();\n }\n return;\n }\n const hit = this.resolveHit(event);\n this.updateTooltip(hit, event);\n const hoverCell = hit?.bodyCell ? toCellAddress(hit.bodyCell) : null;\n if (isSameAddress(this.hoverCell, hoverCell)) return;\n this.hoverCell = hoverCell;\n this.scheduleRender();\n };\n\n private readonly handlePointerLeave = () => {\n if (\n this.host &&\n !this.resizeSession &&\n !this.scrollbarDrag &&\n !this.cellSelectionDrag &&\n !this.rowHeaderSelectionDrag\n ) {\n this.host.root.style.cursor = \"\";\n }\n if (!this.hoverCell) return;\n this.hoverCell = null;\n this.tooltipText = null;\n this.options.ui?.onTooltipRequest?.(null);\n this.scheduleRender();\n };\n\n private readonly handleClick = (event: MouseEvent) => {\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n return;\n }\n const hit = this.resolveHit(event);\n if (!hit) return;\n this.host?.root.focus({ preventScroll: true });\n if (hit.reportFilterCell && hit.onFilterIcon) {\n this.openReportFilterPanel(hit.reportFilterCell);\n return;\n }\n if (hit.reportFilterCell) return;\n if (hit.bodyCell) {\n this.selectCell(toCellAddress(hit.bodyCell), event.shiftKey);\n return;\n }\n const header = hit.headerCell;\n if (header && hit.onFilterIcon) {\n this.openFilterPanel(hit);\n return;\n }\n if (header && hit.onSortIcon) {\n const axis = header.axis;\n const model = this.core?.getPivotModel();\n const node = header.nodeId\n ? (axis === \"row\" ? model?.rowNodes : model?.columnNodes)?.get(\n header.nodeId,\n )\n : undefined;\n const dimensionKey = header.dimensionKey ?? node?.dimensionKey;\n if (!dimensionKey) return;\n const current = this.core\n ?.getSorts()\n .find(\n (item) => item.axis === axis && item.dimensionKey === dimensionKey,\n )?.direction;\n this.setDimensionSort(\n axis,\n dimensionKey,\n current === \"asc\" ? \"desc\" : current === \"desc\" ? null : \"asc\",\n );\n return;\n }\n if (\n hit.region === \"columnHeader\" &&\n header?.indicatorKey &&\n this.selectValueColumn(header)\n ) {\n return;\n }\n if (!header?.nodeId) return;\n const axis = hit.region === \"rowHeader\" ? \"row\" : \"column\";\n if (!hit.onExpandIcon) {\n this.selectNode(axis, header.nodeId);\n return;\n }\n const expanded = this.core?.isNodeExpanded(axis, header.nodeId) ?? false;\n this.core?.setNodeExpanded(axis, header.nodeId, !expanded);\n this.scheduleRender();\n return;\n };\n\n private readonly handleKeyDown = (event: KeyboardEvent) => {\n const isCopyShortcut =\n (event.ctrlKey || event.metaKey) &&\n !event.altKey &&\n (event.key.toLocaleLowerCase() === \"c\" || event.code === \"KeyC\");\n if (isCopyShortcut) {\n const text =\n getPivotSelectedText(\n this.core?.getSelection() ?? {\n activeCell: null,\n anchorCell: null,\n ranges: [],\n },\n ) ?? this.createSelectionTsv();\n if (!text) {\n return;\n }\n event.preventDefault();\n const ownerDocument =\n this.host?.canvas.ownerDocument ?? globalThis.document;\n if (!copyTextSync(text, ownerDocument)) {\n void copyText(text, ownerDocument);\n }\n return;\n }\n const direction = resolveNavigationDirection(event.key);\n if (!direction || !this.layout || !this.core) return;\n const active = this.core.getSelection().activeCell;\n if (!active) return;\n const next = resolveAdjacentAddress(this.layout, active, direction);\n if (!next) return;\n event.preventDefault();\n this.selectCell(next, event.shiftKey);\n };\n\n private readonly handleWheel = (event: WheelEvent) => {\n if (!this.layout) return;\n const delta = resolvePivotWheelScrollDelta({\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n shiftKey: event.shiftKey,\n lineHeight: this.layout.rowHeight,\n pageWidth: this.layout.bodyRect.width,\n pageHeight: this.layout.bodyRect.height,\n });\n if (delta.left === 0 && delta.top === 0) return;\n const base = this.wheelScrollTarget ?? this.scroll;\n const target = {\n left: clamp(\n base.left + delta.left,\n 0,\n this.layout.viewport.maxScrollLeft,\n ),\n top: clamp(base.top + delta.top, 0, this.layout.viewport.maxScrollTop),\n };\n if (target.left === base.left && target.top === base.top) return;\n event.preventDefault();\n if (\n shouldApplyPivotWheelDeltaImmediately({\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n })\n ) {\n this.stopWheelScrollSmoothing();\n this.applyScrollPosition(target.left, target.top);\n return;\n }\n this.startWheelScrollSmoothing(target);\n };\n\n private startWheelScrollSmoothing(target: PivotScrollPosition) {\n this.wheelScrollTarget = target;\n if (this.wheelScrollFrameId !== null) return;\n this.wheelScrollLastTime = performance.now();\n this.wheelScrollFrameId = requestAnimationFrame((time) => {\n this.advanceWheelScrollSmoothing(time);\n });\n }\n\n private stopWheelScrollSmoothing() {\n if (this.wheelScrollFrameId !== null) {\n cancelAnimationFrame(this.wheelScrollFrameId);\n this.wheelScrollFrameId = null;\n }\n this.wheelScrollTarget = null;\n this.wheelScrollLastTime = 0;\n }\n\n private advanceWheelScrollSmoothing(time: number) {\n this.wheelScrollFrameId = null;\n const target = this.wheelScrollTarget;\n if (!target) return;\n const now = time > 0 ? time : this.wheelScrollLastTime + 16;\n const { nextScroll, done } = advancePivotWheelScrollSmoothing({\n current: this.scroll,\n target,\n deltaMs: now - this.wheelScrollLastTime,\n });\n this.wheelScrollLastTime = now;\n this.applyScrollPosition(nextScroll.left, nextScroll.top);\n if (done) {\n this.wheelScrollTarget = null;\n return;\n }\n this.wheelScrollFrameId = requestAnimationFrame((nextTime) => {\n this.advanceWheelScrollSmoothing(nextTime);\n });\n }\n\n private readonly handleContextMenu = (event: MouseEvent) => {\n const hit = this.resolveHit(event);\n if (!hit?.bodyCell || !this.core || !this.layout) return;\n event.preventDefault();\n const address = toCellAddress(hit.bodyCell);\n const currentRange = resolvePivotSelectionRange(\n this.layout,\n this.core.getSelection(),\n );\n const insideCurrentRange = Boolean(\n currentRange &&\n hit.bodyCell.rowIndex >= currentRange.startRowIndex &&\n hit.bodyCell.rowIndex <= currentRange.endRowIndex &&\n hit.bodyCell.columnIndex >= currentRange.startColumnIndex &&\n hit.bodyCell.columnIndex <= currentRange.endColumnIndex,\n );\n if (!insideCurrentRange) this.selectCell(address);\n const selectionRange = resolvePivotSelectionRange(\n this.layout,\n this.core.getSelection(),\n );\n const records = this.core.getCellRecords({\n rowPathKey: hit.bodyCell.rowPathKey,\n columnPathKey: hit.bodyCell.columnPathKey,\n indicatorKey: hit.bodyCell.indicatorKey,\n });\n this.options.ui?.onContextMenuRequest?.({\n x: event.clientX,\n y: event.clientY,\n recordCount: records.length,\n onCopy: () => {\n const model = this.core?.getPivotModel();\n const text = model\n ? createPivotRangeSelectionText({\n layout: this.layout!,\n model,\n startRowIndex: hit.bodyCell!.rowIndex,\n endRowIndex: hit.bodyCell!.rowIndex,\n startColumnIndex: hit.bodyCell!.columnIndex,\n endColumnIndex: hit.bodyCell!.columnIndex,\n })\n : \"\";\n if (text) {\n this.copyPivotText(text);\n }\n },\n onCopySelection: selectionRange\n ? () => {\n const text = this.createSelectionTsv();\n if (text) {\n this.copyPivotText(text);\n }\n }\n : undefined,\n customSelection: {\n startRow: (selectionRange?.startRowIndex ?? hit.bodyCell.rowIndex) + 1,\n startColumn:\n (selectionRange?.startColumnIndex ?? hit.bodyCell.columnIndex) + 1,\n endRow: (selectionRange?.endRowIndex ?? hit.bodyCell.rowIndex) + 1,\n endColumn:\n (selectionRange?.endColumnIndex ?? hit.bodyCell.columnIndex) + 1,\n rowCount: this.layout.rowSlots.length,\n columnCount: this.layout.columnSlots.length,\n },\n onCopyCustomSelection: (range) => {\n const model = this.core?.getPivotModel();\n if (!model || !this.layout) return;\n const text = createPivotRangeSelectionText({\n layout: this.layout,\n model,\n startRowIndex: range.startRow - 1,\n endRowIndex: range.endRow - 1,\n startColumnIndex: range.startColumn - 1,\n endColumnIndex: range.endColumn - 1,\n });\n if (text) {\n this.copyPivotText(text);\n }\n },\n onExportCsv: () =>\n downloadBlob(\n new Blob([this.exportCsv()], { type: \"text/csv;charset=utf-8\" }),\n \"pivot-table.csv\",\n ),\n onExportXlsx: () =>\n downloadBlob(\n new Blob([toArrayBuffer(this.exportXlsx())], {\n type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n }),\n \"pivot-table.xlsx\",\n ),\n onClose: () => this.options.ui?.onContextMenuRequest?.(null),\n });\n };\n\n private updateTooltip(hit: PivotHitTestResult | null, event: PointerEvent) {\n if (!this.host) return;\n const cell = hit?.bodyCell ?? hit?.headerCell;\n const text = hit?.bodyCell?.formattedValue ?? hit?.headerCell?.label ?? \"\";\n if (!cell || !text) {\n if (this.tooltipText) this.options.ui?.onTooltipRequest?.(null);\n this.tooltipText = null;\n return;\n }\n const context = this.host.canvas.getContext(\"2d\");\n const truncated = Boolean(\n context &&\n context.measureText(text).width > Math.max(cell.rect.width - 20, 0),\n );\n if (!truncated) {\n if (this.tooltipText) this.options.ui?.onTooltipRequest?.(null);\n this.tooltipText = null;\n return;\n }\n if (this.tooltipText === text) return;\n this.tooltipText = text;\n this.options.ui?.onTooltipRequest?.({\n x: event.clientX,\n y: event.clientY,\n text,\n onClose: () => this.options.ui?.onTooltipRequest?.(null),\n });\n }\n\n private readonly handlePointerDown = (event: PointerEvent) => {\n if (!this.layout || !this.host) return;\n this.stopWheelScrollSmoothing();\n const scrollbarHit = this.resolveScrollbarHit(event);\n if (scrollbarHit && event.button === 0) {\n this.beginScrollbarInteraction(event, scrollbarHit);\n return;\n }\n const hit = this.resolveResizeHit(event);\n if (!hit) {\n const cellHit = this.resolveHit(event);\n if (event.button !== 0) return;\n if (cellHit?.bodyCell) {\n const address = toCellAddress(cellHit.bodyCell);\n this.host.root.focus({ preventScroll: true });\n const selection = this.selectCell(address, event.shiftKey);\n const text = this.resolveBodyText(cellHit.bodyCell);\n const textOriginX = this.resolveBodyTextOriginX(cellHit.bodyCell, text);\n const anchorOffset = text\n ? resolvePivotTextOffset({\n text,\n pointerX:\n event.clientX - this.host.root.getBoundingClientRect().left,\n textOriginX,\n measureText: (value) => this.measurePivotText(value),\n })\n : 0;\n const anchorFragmentIndex = this.resolveTextFragmentIndex(\n `body:${cellHit.bodyCell.rowIndex}:${cellHit.bodyCell.columnIndex}`,\n this.createTextSelectionFragments(\"column\"),\n );\n this.textSelectionDrag = text\n ? {\n pointerId: event.pointerId,\n anchorFragmentIndex,\n anchorOffset,\n dragged: false,\n }\n : null;\n this.cellSelectionDrag = {\n pointerId: event.pointerId,\n anchor: selection?.anchorCell ?? address,\n lastAddress: address,\n lastKind: \"cell\",\n };\n event.preventDefault();\n this.host.root.setPointerCapture(event.pointerId);\n this.suppressNextClick = true;\n return;\n }\n if (\n cellHit?.headerCell &&\n !cellHit.onExpandIcon &&\n !cellHit.onFilterIcon &&\n !cellHit.onSortIcon\n ) {\n const header = cellHit.headerCell;\n const text = header.label;\n const rootRect = this.host.root.getBoundingClientRect();\n const originX = header.rect.x + 10 + (header.expandable ? 18 : 0);\n const fragments = this.createTextSelectionFragments(header.axis);\n const key = `header:${header.axis}:${header.nodeId ?? \"\"}:${header.label}`;\n const anchorFragmentIndex = fragments.findIndex(\n (fragment) => fragment.key === key,\n );\n this.host.root.focus({ preventScroll: true });\n if (header.nodeId) {\n this.selectNode(header.axis, header.nodeId);\n }\n this.textSelectionDrag = null;\n this.headerTextSelectionDrag = {\n pointerId: event.pointerId,\n fragments,\n anchorFragmentIndex: Math.max(anchorFragmentIndex, 0),\n anchorOffset: resolvePivotTextOffset({\n text,\n pointerX: event.clientX - rootRect.left,\n textOriginX: originX,\n measureText: (value) => this.measurePivotText(value),\n }),\n dragged: false,\n };\n event.preventDefault();\n this.host.root.setPointerCapture(event.pointerId);\n return;\n }\n if (\n cellHit?.region === \"rowHeader\" &&\n cellHit.headerCell &&\n !cellHit.onExpandIcon &&\n !cellHit.onFilterIcon &&\n !cellHit.onSortIcon\n ) {\n const rootRect = this.host.root.getBoundingClientRect();\n const rowIndex = resolvePivotRowIndexAtY(\n this.layout,\n event.clientY - rootRect.top,\n );\n if (rowIndex == null) return;\n this.host.root.focus({ preventScroll: true });\n this.rowHeaderSelectionDrag = {\n pointerId: event.pointerId,\n startRowIndex: rowIndex,\n lastRowIndex: rowIndex,\n lastColumnIndex: null,\n startClientX: event.clientX,\n startClientY: event.clientY,\n dragged: false,\n };\n const selection = createPivotRowRangeSelection(\n this.layout,\n rowIndex,\n rowIndex,\n );\n if (selection) this.setSelection(selection);\n this.host.root.setPointerCapture(event.pointerId);\n }\n return;\n }\n event.preventDefault();\n const startWidth =\n hit.kind === \"rowDimension\"\n ? (this.layout.rowDimensionWidths[hit.index] ?? 140)\n : (this.layout.columnWidths[hit.index] ?? this.layout.columnWidth);\n this.resizeSession = {\n hit,\n pointerId: event.pointerId,\n startX: event.clientX,\n startWidth,\n };\n const rootRect = this.host.root.getBoundingClientRect();\n this.resizeGuideX = clamp(\n event.clientX - rootRect.left,\n 0,\n this.layout.tableWidth,\n );\n this.scheduleRender();\n this.suppressNextClick = true;\n this.host.root.setPointerCapture(event.pointerId);\n };\n\n private readonly handlePointerUp = (event: PointerEvent) => {\n if (!this.host) return;\n const endedCellSelection =\n this.cellSelectionDrag?.pointerId === event.pointerId;\n if (endedCellSelection) this.cellSelectionDrag = null;\n if (this.textSelectionDrag?.pointerId === event.pointerId) {\n if (this.textSelectionDrag.dragged) this.suppressNextClick = true;\n this.textSelectionDrag = null;\n }\n if (this.headerTextSelectionDrag?.pointerId === event.pointerId) {\n if (this.headerTextSelectionDrag.dragged) this.suppressNextClick = true;\n this.headerTextSelectionDrag = null;\n }\n const endedRowHeaderSelection =\n this.rowHeaderSelectionDrag?.pointerId === event.pointerId;\n if (endedRowHeaderSelection) {\n if (this.rowHeaderSelectionDrag?.dragged) this.suppressNextClick = true;\n this.rowHeaderSelectionDrag = null;\n }\n if (this.scrollbarDrag?.pointerId === event.pointerId) {\n this.scrollbarDrag = null;\n }\n if (\n !this.resizeSession &&\n !this.scrollbarDrag &&\n !endedCellSelection &&\n !endedRowHeaderSelection &&\n !this.host.root.hasPointerCapture(event.pointerId)\n )\n return;\n if (this.host.root.hasPointerCapture(event.pointerId)) {\n this.host.root.releasePointerCapture(event.pointerId);\n }\n this.resizeSession = null;\n if (this.resizeGuideX != null) {\n this.resizeGuideX = null;\n this.scheduleRender();\n }\n this.host.root.style.cursor = \"\";\n };\n\n private updateCellSelectionDrag(event: PointerEvent) {\n const drag = this.cellSelectionDrag;\n if (!drag || !this.layout || !this.host) return;\n const rootRect = this.host.root.getBoundingClientRect();\n const localX = event.clientX - rootRect.left;\n const kind =\n localX >= this.layout.rowHeaderRect.x && localX < this.layout.bodyRect.x\n ? \"row-cell\"\n : \"cell\";\n const x = clamp(\n localX,\n this.layout.bodyRect.x,\n this.layout.bodyRect.x + Math.max(this.layout.bodyRect.width - 1, 0),\n );\n const y = clamp(\n event.clientY - rootRect.top,\n this.layout.bodyRect.y,\n this.layout.bodyRect.y + Math.max(this.layout.bodyRect.height - 1, 0),\n );\n const hit = hitTestPivotLayout(this.layout, x, y);\n if (!hit?.bodyCell) return;\n const address = toCellAddress(hit.bodyCell);\n if (isSameAddress(drag.lastAddress, address) && drag.lastKind === kind) {\n return;\n }\n drag.lastAddress = address;\n drag.lastKind = kind;\n this.setSelection({\n activeCell: address,\n anchorCell: drag.anchor,\n ranges: [{ start: drag.anchor, end: address, kind }],\n activeNode: null,\n });\n }\n\n private updateTextSelectionDrag(event: PointerEvent) {\n const drag = this.textSelectionDrag;\n if (!drag || !this.layout || !this.host) return;\n const rootRect = this.host.root.getBoundingClientRect();\n const x = event.clientX - rootRect.left;\n const y = event.clientY - rootRect.top;\n const hitResult = hitTestPivotLayout(this.layout, x, y);\n const hit = hitResult?.bodyCell;\n const header = hitResult?.headerCell;\n if (!hit && !header) return;\n const fragments = this.createTextSelectionFragments(\n header?.axis ?? \"column\",\n );\n const focusKey = header\n ? `header:${header.axis}:${header.nodeId ?? \"\"}:${header.label}`\n : `body:${hit?.rowIndex}:${hit?.columnIndex}`;\n const focusIndex = this.resolveTextFragmentIndex(focusKey, fragments);\n const text = header ? header.label : this.resolveBodyText(hit!);\n if (!text || focusIndex < 0) return;\n const textOriginX = header\n ? header.rect.x + 10 + (header.expandable ? 18 : 0)\n : this.resolveBodyTextOriginX(hit!, text);\n const focusOffset = resolvePivotTextOffset({\n text,\n pointerX: x,\n textOriginX,\n measureText: (value) => this.measurePivotText(value),\n });\n if (\n focusIndex === drag.anchorFragmentIndex &&\n focusOffset === drag.anchorOffset\n )\n return;\n drag.dragged = true;\n this.setSelection({\n activeCell: hit\n ? toCellAddress(hit)\n : (this.core?.getSelection().activeCell ?? null),\n anchorCell:\n this.core?.getSelection().anchorCell ??\n (hit ? toCellAddress(hit) : null),\n ranges: this.core?.getSelection().ranges ?? [],\n activeNode: null,\n textSelection: {\n fragments: fragments.map((fragment) => ({\n rowIndex: fragment.rowIndex ?? -1,\n columnIndex: fragment.columnIndex ?? -1,\n text: fragment.text,\n region: fragment.key.startsWith(\"header:\") ? \"header\" : \"body\",\n key: fragment.key,\n })),\n anchorFragmentIndex: drag.anchorFragmentIndex,\n focusFragmentIndex: focusIndex,\n anchorOffset: drag.anchorOffset,\n focusOffset,\n },\n });\n }\n\n private updateHeaderTextSelectionDrag(event: PointerEvent) {\n const drag = this.headerTextSelectionDrag;\n if (!drag || !this.host || !this.layout) return;\n const rootRect = this.host.root.getBoundingClientRect();\n const localX = event.clientX - rootRect.left;\n const localY = event.clientY - rootRect.top;\n const hit = hitTestPivotLayout(this.layout, localX, localY);\n const header = hit?.headerCell;\n const body = hit?.bodyCell;\n if (!header && !body) return;\n const key = header\n ? `header:${header.axis}:${header.nodeId ?? \"\"}:${header.label}`\n : `body:${body?.rowIndex}:${body?.columnIndex}`;\n const focusFragmentIndex = drag.fragments.findIndex(\n (fragment) => fragment.key === key,\n );\n if (focusFragmentIndex < 0) return;\n const focusFragment = drag.fragments[focusFragmentIndex];\n const focusOffset = resolvePivotTextOffset({\n text: focusFragment.text,\n pointerX: localX,\n textOriginX: focusFragment.originX,\n measureText: (value) => this.measurePivotText(value),\n });\n if (\n focusFragmentIndex === drag.anchorFragmentIndex &&\n focusOffset === drag.anchorOffset\n )\n return;\n drag.dragged = true;\n const selection = this.core?.getSelection();\n if (!selection) return;\n this.setSelection({\n ...selection,\n textSelection: {\n fragments: drag.fragments.map((fragment) => ({\n rowIndex: fragment.rowIndex ?? -1,\n columnIndex: fragment.columnIndex ?? -1,\n text: fragment.text,\n region: \"header\",\n key: fragment.key,\n })),\n anchorFragmentIndex: drag.anchorFragmentIndex,\n focusFragmentIndex,\n anchorOffset: drag.anchorOffset,\n focusOffset,\n },\n });\n }\n\n private createTextSelectionFragments(axis: \"row\" | \"column\") {\n const bodyFragments = (this.layout?.bodyCells ?? [])\n .map((cell) => ({\n key: `body:${cell.rowIndex}:${cell.columnIndex}`,\n text: this.resolveBodyText(cell),\n originX: this.resolveBodyTextOriginX(cell, this.resolveBodyText(cell)),\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n }))\n .filter((fragment) => fragment.text.length > 0);\n if (this.layout) {\n const columnHeaders = this.createHeaderTextFragments(\"column\");\n const rowHeaders = this.layout.rowHeaderCells\n .filter((cell) => cell.label)\n .map((cell) => ({\n key: `header:${cell.axis}:${cell.nodeId ?? \"\"}:${cell.label}`,\n text: cell.label,\n rowIndex: undefined,\n columnIndex: undefined,\n originX: cell.rect.x + 10,\n }));\n const rows = Array.from(\n { length: this.layout.rowSlots.length },\n (_, rowIndex) => [\n rowHeaders[rowIndex],\n ...bodyFragments.filter((fragment) => fragment.rowIndex === rowIndex),\n ],\n ).flat();\n if (axis === \"column\") {\n return [...columnHeaders, ...rows].filter(\n (fragment): fragment is NonNullable<typeof fragment> =>\n Boolean(fragment),\n );\n }\n const rowHeadersTitle = this.layout.rowFieldHeaderCells\n .filter((cell) => cell.label)\n .map((cell) => ({\n key: `header:${cell.axis}:${cell.nodeId ?? \"\"}:${cell.label}`,\n text: cell.label,\n rowIndex: undefined,\n columnIndex: undefined,\n originX: cell.rect.x + 10 + (cell.expandable ? 18 : 0),\n }));\n return [...rowHeadersTitle, ...columnHeaders, ...rows].filter(\n (fragment): fragment is NonNullable<typeof fragment> =>\n Boolean(fragment),\n );\n }\n return [...this.createHeaderTextFragments(axis), ...bodyFragments];\n }\n\n private createHeaderTextFragments(axis?: \"row\" | \"column\") {\n if (!this.layout) return [];\n return (\n axis === \"column\"\n ? this.layout.columnHeaderCells\n : [...this.layout.rowHeaderCells, ...this.layout.rowFieldHeaderCells]\n )\n .filter((cell) => cell.label)\n .map((cell) => ({\n key: `header:${cell.axis}:${cell.nodeId ?? \"\"}:${cell.label}`,\n text: cell.label,\n rowIndex: undefined,\n columnIndex: undefined,\n originX: cell.rect.x + 10 + (cell.expandable ? 18 : 0),\n }));\n }\n\n private resolveBodyText(cell: PivotLayoutSnapshot[\"bodyCells\"][number]) {\n const indicator = this.options.indicators.find(\n (item) => item.key === cell.indicatorKey,\n );\n if (!indicator || indicator.formatter || typeof cell.value !== \"number\")\n return cell.formattedValue;\n if (indicator.cellType === \"percent\")\n return `${(cell.value * 100).toFixed(indicator.precision ?? 2)}%`;\n if (indicator.cellType === \"money\")\n return cell.value.toLocaleString(\"zh-CN\", {\n style: \"currency\",\n currency: \"CNY\",\n minimumFractionDigits: indicator.precision ?? 2,\n maximumFractionDigits: indicator.precision ?? 2,\n });\n return cell.formattedValue;\n }\n\n private createBodyTextFragments() {\n return (this.layout?.bodyCells ?? [])\n .map((cell) => ({\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n text: this.resolveBodyText(cell),\n }))\n .filter((fragment) => fragment.text.length > 0);\n }\n\n private resolveTextFragmentIndex(\n key: string,\n fragments: Array<{ key: string }>,\n ) {\n return fragments.findIndex((fragment) => fragment.key === key);\n }\n\n private resolveBodyFragmentIndex(\n cell: PivotLayoutSnapshot[\"bodyCells\"][number],\n ) {\n if (!this.layout) return -1;\n return (\n this.layout.bodyCells\n .slice(0, this.layout.bodyCells.indexOf(cell) + 1)\n .filter((item) => this.resolveBodyText(item).length > 0).length - 1\n );\n }\n\n private resolveBodyTextOriginX(\n cell: PivotLayoutSnapshot[\"bodyCells\"][number],\n text: string,\n ) {\n const indicator = this.options.indicators.find(\n (item) => item.key === cell.indicatorKey,\n );\n const width = this.measurePivotText(text);\n const align = indicator?.align ?? \"right\";\n return align === \"right\"\n ? cell.rect.x + cell.rect.width - 10 - width\n : align === \"center\"\n ? cell.rect.x + cell.rect.width / 2 - width / 2\n : cell.rect.x + 10;\n }\n\n private measurePivotText(text: string) {\n const context = this.host?.canvas.getContext(\"2d\");\n if (!context) return text.length * 8;\n context.font = `${this.options.theme?.fontSize ?? 13}px ${this.options.theme?.fontFamily ?? \"sans-serif\"}`;\n return context.measureText(text).width;\n }\n\n private updateRowHeaderSelectionDrag(event: PointerEvent) {\n const drag = this.rowHeaderSelectionDrag;\n if (!drag || !this.layout || !this.host) return;\n const rootRect = this.host.root.getBoundingClientRect();\n const rowIndex = resolvePivotRowIndexAtY(\n this.layout,\n event.clientY - rootRect.top,\n );\n if (rowIndex == null) return;\n const localX = event.clientX - rootRect.left;\n if (\n !drag.dragged &&\n Math.hypot(\n event.clientX - drag.startClientX,\n event.clientY - drag.startClientY,\n ) >= 3\n ) {\n drag.dragged = true;\n this.suppressNextClick = true;\n }\n let endColumnIndex: number | null = null;\n if (localX >= this.layout.bodyRect.x) {\n const x = clamp(\n localX,\n this.layout.bodyRect.x,\n this.layout.bodyRect.x + Math.max(this.layout.bodyRect.width - 1, 0),\n );\n const y = clamp(\n event.clientY - rootRect.top,\n this.layout.bodyRect.y,\n this.layout.bodyRect.y + Math.max(this.layout.bodyRect.height - 1, 0),\n );\n endColumnIndex =\n hitTestPivotLayout(this.layout, x, y)?.bodyCell?.columnIndex ?? null;\n }\n if (\n rowIndex === drag.lastRowIndex &&\n endColumnIndex === drag.lastColumnIndex\n ) {\n return;\n }\n const selection = createPivotRowRangeSelection(\n this.layout,\n drag.startRowIndex,\n rowIndex,\n endColumnIndex ?? undefined,\n );\n if (!selection) return;\n drag.lastRowIndex = rowIndex;\n drag.lastColumnIndex = endColumnIndex;\n this.suppressNextClick = true;\n this.setSelection(selection);\n }\n\n private selectValueColumn(\n header: PivotLayoutSnapshot[\"columnHeaderCells\"][number],\n ) {\n if (!this.layout) return false;\n const selection = createPivotValueColumnSelection(this.layout, header);\n if (!selection) return false;\n this.setSelection(selection);\n return true;\n }\n\n private beginScrollbarInteraction(\n event: PointerEvent,\n hit: NonNullable<ReturnType<typeof hitTestPivotScrollbar>>,\n ) {\n if (!this.layout || !this.host) return;\n const axisLayout = this.layout.scrollbar[hit.axis];\n if (!axisLayout) return;\n event.preventDefault();\n this.suppressNextClick = true;\n\n if (hit.role === \"decrease-button\" || hit.role === \"increase-button\") {\n this.stepScrollbar(hit.axis, hit.role === \"decrease-button\" ? -1 : 1);\n return;\n }\n\n const rootRect = this.host.root.getBoundingClientRect();\n const pointer =\n hit.axis === \"horizontal\"\n ? event.clientX - rootRect.left\n : event.clientY - rootRect.top;\n if (hit.role === \"track\") {\n const thumbStart =\n hit.axis === \"horizontal\" ? axisLayout.thumb.x : axisLayout.thumb.y;\n const direction = pointer < thumbStart ? -1 : 1;\n this.applyScrollPosition(\n this.scroll.left +\n (hit.axis === \"horizontal\"\n ? direction * this.layout.bodyRect.width\n : 0),\n this.scroll.top +\n (hit.axis === \"vertical\"\n ? direction * this.layout.bodyRect.height\n : 0),\n );\n return;\n }\n\n const thumbStart =\n hit.axis === \"horizontal\" ? axisLayout.thumb.x : axisLayout.thumb.y;\n this.scrollbarDrag = {\n axis: hit.axis,\n pointerId: event.pointerId,\n pointerOffset: pointer - thumbStart,\n trackStart:\n hit.axis === \"horizontal\" ? axisLayout.track.x : axisLayout.track.y,\n trackLength:\n hit.axis === \"horizontal\"\n ? axisLayout.track.width\n : axisLayout.track.height,\n thumbLength:\n hit.axis === \"horizontal\"\n ? axisLayout.thumb.width\n : axisLayout.thumb.height,\n };\n this.host.root.style.cursor = \"grabbing\";\n this.host.root.setPointerCapture(event.pointerId);\n }\n\n private updateScrollbarDrag(event: PointerEvent) {\n const dragging = this.scrollbarDrag;\n if (!dragging || !this.layout || !this.host) return;\n const rootRect = this.host.root.getBoundingClientRect();\n const pointer =\n dragging.axis === \"horizontal\"\n ? event.clientX - rootRect.left\n : event.clientY - rootRect.top;\n const movableLength = Math.max(\n dragging.trackLength - dragging.thumbLength,\n 0,\n );\n const thumbStart = Math.min(\n Math.max(pointer - dragging.pointerOffset, dragging.trackStart),\n dragging.trackStart + movableLength,\n );\n const ratio =\n movableLength <= 0\n ? 0\n : (thumbStart - dragging.trackStart) / movableLength;\n const maxScroll =\n dragging.axis === \"horizontal\"\n ? this.layout.viewport.maxScrollLeft\n : this.layout.viewport.maxScrollTop;\n this.applyScrollPosition(\n dragging.axis === \"horizontal\" ? ratio * maxScroll : this.scroll.left,\n dragging.axis === \"vertical\" ? ratio * maxScroll : this.scroll.top,\n );\n }\n\n private stepScrollbar(axis: PivotScrollbarAxis, direction: -1 | 1) {\n if (!this.layout) return;\n const horizontalStep =\n this.layout.columnWidths[this.layout.visibleColumnRange.start] ??\n this.layout.columnWidth;\n this.applyScrollPosition(\n this.scroll.left +\n (axis === \"horizontal\" ? direction * horizontalStep : 0),\n this.scroll.top +\n (axis === \"vertical\" ? direction * this.layout.rowHeight : 0),\n );\n }\n\n private applyScrollPosition(left: number, top: number) {\n if (!this.layout) return;\n const next = {\n left: clamp(left, 0, this.layout.viewport.maxScrollLeft),\n top: clamp(top, 0, this.layout.viewport.maxScrollTop),\n };\n if (next.left === this.scroll.left && next.top === this.scroll.top) return;\n this.scroll = next;\n this.scheduleRender();\n }\n\n private applyResize(deltaX: number) {\n const session = this.resizeSession;\n if (!session || !this.core) return;\n const width = session.startWidth + deltaX;\n if (session.hit.kind === \"valueColumn\") {\n const slot = this.layout?.columnSlots[session.hit.index];\n if (!slot) return;\n this.core.setColumnWidth(slot.key, width);\n } else {\n const dimension = this.options.rows[session.hit.index];\n if (!dimension) return;\n this.core.setRowDimensionWidth(\n resolvePivotDimensionKey(dimension),\n width,\n );\n }\n this.scheduleRender();\n }\n\n private openFilterPanel(hit: PivotHitTestResult) {\n const header = hit.headerCell;\n if (!header || !this.core || !this.host) return;\n const model = this.core.getPivotModel();\n const axis = header.axis;\n const node = header.nodeId\n ? (axis === \"row\" ? model?.rowNodes : model?.columnNodes)?.get(\n header.nodeId,\n )\n : undefined;\n const dimensionKey = header.dimensionKey ?? node?.dimensionKey;\n if (!dimensionKey) return;\n const dimension = (\n axis === \"row\" ? this.options.rows : this.options.columns\n ).find((item) => resolvePivotDimensionKey(item) === dimensionKey);\n if (!dimension?.allowFilter) return;\n this.requestFilterPanel({\n axis,\n dimensionKey,\n title: resolvePivotDimensionTitle(dimension),\n rect: header.rect,\n });\n }\n\n private openReportFilterPanel(\n cell: PivotLayoutSnapshot[\"reportFilterCells\"][number],\n ) {\n const dimension = this.options.filterDimensions?.find(\n (item) => resolvePivotDimensionKey(item) === cell.dimensionKey,\n );\n if (!dimension) return;\n this.requestFilterPanel({\n axis: \"filter\",\n dimensionKey: cell.dimensionKey,\n title: resolvePivotDimensionTitle(dimension),\n rect: cell.valueRect,\n });\n }\n\n private requestFilterPanel(params: {\n axis: PivotFilterAxis;\n dimensionKey: string;\n title: string;\n rect: { x: number; y: number; width: number };\n }) {\n if (!this.core || !this.host) return;\n const { axis, dimensionKey } = params;\n const rootRect = this.host.root.getBoundingClientRect();\n const current =\n (axis === \"row\"\n ? this.core.getFilters().rows\n : axis === \"column\"\n ? this.core.getFilters().columns\n : (this.core.getFilters().filters ?? {}))[dimensionKey] ?? {};\n this.options.ui?.onFilterPanelRequest?.({\n axis,\n dimensionKey,\n title: params.title,\n x: rootRect.left + params.rect.x,\n y: rootRect.top + params.rect.y,\n width: params.rect.width,\n options: this.core.getDimensionFilterOptions(axis, dimensionKey),\n value: current,\n filterOptionImmediateApply: this.options.filterOptionImmediateApply,\n onApply: (value) => this.setDimensionFilter(axis, dimensionKey, value),\n onApplyCondition: ({ condition, secondCondition, relation }) => {\n this.setDimensionFilter(axis, dimensionKey, {\n ...current,\n condition,\n secondCondition,\n conditionRelation: relation,\n });\n },\n onReset: () => this.setDimensionFilter(axis, dimensionKey, null),\n onCancel: () => this.options.ui?.onFilterPanelRequest?.(null),\n });\n }\n\n private resolveHit(\n event: MouseEvent | PointerEvent,\n ): PivotHitTestResult | null {\n if (!this.host || !this.layout) return null;\n const rect = this.host.root.getBoundingClientRect();\n return hitTestPivotLayout(\n this.layout,\n event.clientX - rect.left,\n event.clientY - rect.top,\n );\n }\n\n private resolveResizeHit(event: MouseEvent | PointerEvent) {\n if (!this.host || !this.layout) return null;\n const rect = this.host.root.getBoundingClientRect();\n return hitTestPivotResize(\n this.layout,\n event.clientX - rect.left,\n event.clientY - rect.top,\n );\n }\n\n private resolveScrollbarHit(event: MouseEvent | PointerEvent) {\n if (!this.host || !this.layout) return null;\n const rect = this.host.root.getBoundingClientRect();\n return hitTestPivotScrollbar(\n this.layout.scrollbar,\n event.clientX - rect.left,\n event.clientY - rect.top,\n );\n }\n\n private createSelectionTsv() {\n if (!this.layout || !this.core) return \"\";\n const model = this.core.getPivotModel();\n if (!model) return \"\";\n return createPivotSelectionText({\n layout: this.layout,\n model,\n selection: this.core.getSelection(),\n });\n }\n\n /** 复制表格选区文本;同步复制失败时回退到异步实现。 */\n private copyPivotText(text: string | null) {\n if (!text) return;\n const ownerDocument =\n this.host?.canvas.ownerDocument ?? globalThis.document;\n if (!copyTextSync(text, ownerDocument)) {\n void copyText(text, ownerDocument);\n }\n }\n\n private scheduleRender() {\n if (this.frameId !== null) return;\n this.frameId = requestAnimationFrame(() => {\n this.frameId = null;\n this.render();\n });\n }\n\n private render() {\n if (!this.core || !this.host || this.width <= 0 || this.height <= 0) return;\n const layout = this.core.getLayoutSnapshot({\n width: this.width,\n height: this.height,\n scrollLeft: this.scroll.left,\n scrollTop: this.scroll.top,\n });\n if (!layout) return;\n this.layout = layout;\n this.scroll = { ...layout.scroll };\n if (this.wheelScrollTarget) {\n this.wheelScrollTarget = {\n left: clamp(\n this.wheelScrollTarget.left,\n 0,\n layout.viewport.maxScrollLeft,\n ),\n top: clamp(this.wheelScrollTarget.top, 0, layout.viewport.maxScrollTop),\n };\n }\n this.host.setFittedHeight(layout.height);\n resizePivotCanvas(this.host.canvas, this.width, layout.height);\n const context = this.host.canvas.getContext(\"2d\");\n if (!context) return;\n this.renderStats = renderPivotTable({\n context,\n layout,\n options: this.options,\n activeCell: this.core.getSelection().activeCell,\n hoverCell: this.hoverCell,\n selection: this.core.getSelection(),\n resizeGuideX: this.resizeGuideX,\n });\n }\n}\n\nfunction toCellAddress(cell: {\n rowNodeId: string | null;\n columnNodeId: string | null;\n indicatorKey: string;\n}): PivotCellAddress {\n return {\n rowNodeId: cell.rowNodeId ?? \"\",\n columnNodeId: cell.columnNodeId ?? \"\",\n indicatorKey: cell.indicatorKey,\n };\n}\n\nfunction isSameAddress(\n left: PivotCellAddress | null,\n right: PivotCellAddress | null,\n) {\n return Boolean(\n left === right ||\n (left &&\n right &&\n left.rowNodeId === right.rowNodeId &&\n left.columnNodeId === right.columnNodeId &&\n left.indicatorKey === right.indicatorKey),\n );\n}\n\nfunction resolveNavigationDirection(key: string) {\n if (key === \"ArrowUp\") return { row: -1, column: 0 };\n if (key === \"ArrowDown\") return { row: 1, column: 0 };\n if (key === \"ArrowLeft\") return { row: 0, column: -1 };\n if (key === \"ArrowRight\") return { row: 0, column: 1 };\n return null;\n}\n\nfunction resolveAdjacentAddress(\n layout: PivotLayoutSnapshot,\n address: PivotCellAddress,\n direction: { row: number; column: number },\n) {\n const indexes = resolveAddressIndexes(layout, address);\n if (!indexes) return null;\n const rowIndex = Math.min(\n Math.max(indexes.rowIndex + direction.row, 0),\n layout.rowSlots.length - 1,\n );\n const columnIndex = Math.min(\n Math.max(indexes.columnIndex + direction.column, 0),\n layout.columnSlots.length - 1,\n );\n const rowSlot = layout.rowSlots[rowIndex];\n const columnSlot = layout.columnSlots[columnIndex];\n const indicatorKey = rowSlot?.indicatorKey ?? columnSlot?.indicatorKey;\n if (!rowSlot || !columnSlot || !indicatorKey) return null;\n return {\n rowNodeId: rowSlot.nodeId ?? \"\",\n columnNodeId: columnSlot.nodeId ?? \"\",\n indicatorKey,\n };\n}\n\nfunction resolveAddressIndexes(\n layout: PivotLayoutSnapshot,\n address: PivotCellAddress,\n) {\n const rowIndex = layout.rowSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.rowNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n const columnIndex = layout.columnSlots.findIndex(\n (slot) =>\n (slot.nodeId ?? \"\") === address.columnNodeId &&\n (!slot.indicatorKey || slot.indicatorKey === address.indicatorKey),\n );\n return rowIndex >= 0 && columnIndex >= 0 ? { rowIndex, columnIndex } : null;\n}\n\nfunction resolveVisibleOffset(params: {\n current: number;\n itemStart: number;\n itemSize: number;\n viewportSize: number;\n}) {\n if (params.itemStart < params.current) return params.itemStart;\n const itemEnd = params.itemStart + params.itemSize;\n const viewportEnd = params.current + params.viewportSize;\n return itemEnd > viewportEnd ? itemEnd - params.viewportSize : params.current;\n}\n\nfunction downloadBlob(blob: Blob, fileName: string) {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nfunction toArrayBuffer(value: Uint8Array) {\n const buffer = new ArrayBuffer(value.byteLength);\n new Uint8Array(buffer).set(value);\n return buffer;\n}\n","import type { PivotDimension } from \"../../schema/dimension\";\nimport type { BuiltInPivotAggregatorName } from \"../../schema/aggregator\";\nimport type {\n PivotField,\n PivotFieldArea,\n PivotFieldLayout,\n} from \"../../schema/field\";\nimport type { PivotIndicator } from \"../../schema/indicator\";\nimport {\n resolvePivotDimensionKey,\n resolvePivotDimensionTitle,\n} from \"../data/dimension-config\";\n\n/** 创建四个区域均为空的字段布局。 */\nexport function createEmptyPivotFieldLayout(): PivotFieldLayout {\n return { filters: [], columns: [], rows: [], values: [] };\n}\n\n/** 根据当前透视配置创建字段区域布局。 */\nexport function createPivotFieldLayout<RecordType>(params: {\n filterDimensions?: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n rows: PivotDimension<RecordType>[];\n indicators: PivotIndicator<RecordType>[];\n}): PivotFieldLayout {\n return {\n filters: (params.filterDimensions ?? []).map(resolvePivotDimensionKey),\n columns: params.columns.map(resolvePivotDimensionKey),\n rows: params.rows.map(resolvePivotDimensionKey),\n values: params.indicators.map((indicator) => indicator.key),\n };\n}\n\n/** 合并自定义字段与当前透视配置,生成稳定字段目录。 */\nexport function createPivotFieldCatalog<RecordType>(params: {\n fields?: PivotField<RecordType>[];\n filterDimensions?: PivotDimension<RecordType>[];\n columns: PivotDimension<RecordType>[];\n rows: PivotDimension<RecordType>[];\n indicators: PivotIndicator<RecordType>[];\n}) {\n const result = new Map<string, PivotField<RecordType>>();\n params.fields?.forEach((field) => {\n result.set(resolvePivotDimensionKey(field), field);\n });\n const addDimension = (\n dimension: PivotDimension<RecordType>,\n defaultArea: PivotFieldArea,\n ) => {\n const key = resolvePivotDimensionKey(dimension);\n const current = result.get(key);\n result.set(key, { ...current, ...dimension, key, defaultArea });\n };\n params.filterDimensions?.forEach((field) => addDimension(field, \"filter\"));\n params.columns.forEach((field) => addDimension(field, \"column\"));\n params.rows.forEach((field) => addDimension(field, \"row\"));\n params.indicators.forEach((indicator) => {\n const current = result.get(indicator.key);\n result.set(indicator.key, {\n ...current,\n key: indicator.key,\n title: current?.title ?? indicator.title ?? indicator.key,\n dataIndex: current?.dataIndex ?? indicator.dataIndex ?? indicator.key,\n defaultArea: \"value\",\n indicator: {\n ...current?.indicator,\n ...indicator,\n title: indicator.title,\n dataIndex: indicator.dataIndex,\n },\n });\n });\n return Array.from(result.values());\n}\n\n/**\n * 将字段移动到指定区域和位置。\n *\n * 筛选器、行和列区域中的字段互斥;值区域独立,可复用维度字段。\n */\nexport function movePivotField(\n layout: PivotFieldLayout,\n fieldKey: string,\n area: PivotFieldArea,\n index?: number,\n sourceArea?: PivotFieldArea,\n): PivotFieldLayout {\n const grouped = removePivotFieldFromTargetGroup(layout, fieldKey, area);\n const next = sourceArea\n ? removePivotFieldFromArea(grouped, fieldKey, sourceArea)\n : grouped;\n const targetKey = areaToLayoutKey(area);\n const target = [...next[targetKey]];\n const insertIndex = Math.max(\n 0,\n Math.min(index ?? target.length, target.length),\n );\n target.splice(insertIndex, 0, fieldKey);\n return { ...next, [targetKey]: target };\n}\n\nfunction removePivotFieldFromArea(\n layout: PivotFieldLayout,\n fieldKey: string,\n area: PivotFieldArea,\n): PivotFieldLayout {\n const areaKey = areaToLayoutKey(area);\n return {\n ...layout,\n [areaKey]: layout[areaKey].filter((key) => key !== fieldKey),\n };\n}\n\nfunction removePivotFieldFromTargetGroup(\n layout: PivotFieldLayout,\n fieldKey: string,\n area: PivotFieldArea,\n): PivotFieldLayout {\n if (area === \"value\") {\n return {\n ...layout,\n values: layout.values.filter((key) => key !== fieldKey),\n };\n }\n return {\n ...layout,\n filters: layout.filters.filter((key) => key !== fieldKey),\n columns: layout.columns.filter((key) => key !== fieldKey),\n rows: layout.rows.filter((key) => key !== fieldKey),\n };\n}\n\n/** 从全部区域中移除字段。 */\nexport function removePivotField(\n layout: PivotFieldLayout,\n fieldKey: string,\n): PivotFieldLayout {\n return {\n filters: layout.filters.filter((key) => key !== fieldKey),\n columns: layout.columns.filter((key) => key !== fieldKey),\n rows: layout.rows.filter((key) => key !== fieldKey),\n values: layout.values.filter((key) => key !== fieldKey),\n };\n}\n\n/** 将字段布局转换为 PivotTable 原生配置。 */\nexport function resolvePivotFieldLayoutOptions<RecordType>(\n fields: PivotField<RecordType>[],\n layout: PivotFieldLayout,\n) {\n const catalog = new Map(\n fields.map((field) => [resolvePivotDimensionKey(field), field]),\n );\n const dimensions = (keys: string[]) =>\n keys\n .map((key) => catalog.get(key))\n .filter((field): field is PivotField<RecordType> => field != null)\n .map(toPivotDimension);\n const indicators = layout.values\n .map((key) => catalog.get(key))\n .filter((field): field is PivotField<RecordType> => field != null)\n .map(toPivotIndicator);\n return {\n filterDimensions: dimensions(layout.filters),\n columns: dimensions(layout.columns),\n rows: dimensions(layout.rows),\n indicators,\n };\n}\n\n/** 返回字段当前所在的区域。 */\nexport function findPivotFieldArea(\n layout: PivotFieldLayout,\n fieldKey: string,\n): PivotFieldArea | null {\n if (layout.filters.includes(fieldKey)) return \"filter\";\n if (layout.columns.includes(fieldKey)) return \"column\";\n if (layout.rows.includes(fieldKey)) return \"row\";\n if (layout.values.includes(fieldKey)) return \"value\";\n return null;\n}\n\nfunction toPivotDimension<RecordType>(field: PivotField<RecordType>) {\n const {\n defaultArea: _defaultArea,\n indicator: _indicator,\n ...dimension\n } = field;\n return dimension;\n}\n\nfunction toPivotIndicator<RecordType>(\n field: PivotField<RecordType>,\n): PivotIndicator<RecordType> {\n const indicator: PivotIndicator<RecordType> = {\n key: resolvePivotDimensionKey(field),\n dataIndex: field.dataIndex,\n ...field.indicator,\n };\n return {\n ...indicator,\n title: resolvePivotValueFieldTitle(field),\n };\n}\n\n/** 生成包含汇总类型的值字段标题。 */\nexport function resolvePivotValueFieldTitle<RecordType>(\n field: PivotField<RecordType>,\n) {\n return `${resolveAggregatorTitle(field.indicator?.aggregator)}项:${\n field.indicator?.title ?? resolvePivotDimensionTitle(field)\n }`;\n}\n\nfunction resolveAggregatorTitle<RecordType>(\n aggregator: PivotIndicator<RecordType>[\"aggregator\"],\n) {\n if (typeof aggregator === \"string\") {\n return (\n builtInAggregatorTitles[aggregator as BuiltInPivotAggregatorName] ??\n aggregator\n );\n }\n return aggregator ? \"自定义汇总\" : \"求和\";\n}\n\nconst builtInAggregatorTitles: Record<BuiltInPivotAggregatorName, string> = {\n sum: \"求和\",\n avg: \"平均值\",\n count: \"计数\",\n distinctCount: \"去重计数\",\n min: \"最小值\",\n max: \"最大值\",\n};\n\nfunction areaToLayoutKey(area: PivotFieldArea): keyof PivotFieldLayout {\n if (area === \"filter\") return \"filters\";\n if (area === \"column\") return \"columns\";\n if (area === \"row\") return \"rows\";\n return \"values\";\n}\n"]}
|