@visactor/vtable-plugins 1.21.1 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/cjs/add-row-column.js +2 -2
  2. package/cjs/add-row-column.js.map +1 -1
  3. package/cjs/auto-fill/utils/date.js +1 -1
  4. package/cjs/auto-fill/utils/fill.js +1 -1
  5. package/cjs/column-series.js +1 -1
  6. package/cjs/column-series.js.map +1 -1
  7. package/cjs/contextmenu/handle-menu-helper.js +16 -9
  8. package/cjs/contextmenu/handle-menu-helper.js.map +1 -1
  9. package/cjs/contextmenu/menu-manager.js +1 -2
  10. package/cjs/contextmenu/styles.js +2 -1
  11. package/cjs/highlight-header-when-select-cell.js +1 -1
  12. package/cjs/highlight-header-when-select-cell.js.map +1 -1
  13. package/cjs/index.d.ts +1 -0
  14. package/cjs/index.js +4 -4
  15. package/cjs/index.js.map +1 -1
  16. package/cjs/master-detail-plugin/checkbox.d.ts +5 -0
  17. package/cjs/master-detail-plugin/checkbox.js +105 -0
  18. package/cjs/master-detail-plugin/checkbox.js.map +1 -0
  19. package/cjs/master-detail-plugin/config.d.ts +17 -0
  20. package/cjs/master-detail-plugin/config.js +113 -0
  21. package/cjs/master-detail-plugin/config.js.map +1 -0
  22. package/cjs/master-detail-plugin/core.d.ts +50 -0
  23. package/cjs/master-detail-plugin/core.js +310 -0
  24. package/cjs/master-detail-plugin/core.js.map +1 -0
  25. package/cjs/master-detail-plugin/events.d.ts +59 -0
  26. package/cjs/master-detail-plugin/events.js +265 -0
  27. package/cjs/master-detail-plugin/events.js.map +1 -0
  28. package/cjs/master-detail-plugin/index.d.ts +4 -0
  29. package/cjs/master-detail-plugin/index.js +15 -0
  30. package/cjs/master-detail-plugin/index.js.map +1 -0
  31. package/cjs/master-detail-plugin/subtable.d.ts +39 -0
  32. package/cjs/master-detail-plugin/subtable.js +457 -0
  33. package/cjs/master-detail-plugin/subtable.js.map +1 -0
  34. package/cjs/master-detail-plugin/table-api-extensions.d.ts +59 -0
  35. package/cjs/master-detail-plugin/table-api-extensions.js +462 -0
  36. package/cjs/master-detail-plugin/table-api-extensions.js.map +1 -0
  37. package/cjs/master-detail-plugin/types.d.ts +61 -0
  38. package/cjs/master-detail-plugin/types.js +20 -0
  39. package/cjs/master-detail-plugin/types.js.map +1 -0
  40. package/cjs/master-detail-plugin/utils.d.ts +8 -0
  41. package/cjs/master-detail-plugin/utils.js +62 -0
  42. package/cjs/master-detail-plugin/utils.js.map +1 -0
  43. package/cjs/master-detail-plugin.d.ts +1 -0
  44. package/cjs/master-detail-plugin.js +15 -0
  45. package/cjs/master-detail-plugin.js.map +1 -0
  46. package/cjs/paste-add-row-column.js +2 -2
  47. package/cjs/paste-add-row-column.js.map +1 -1
  48. package/cjs/row-series.js +1 -2
  49. package/cjs/table-carousel-animation.js +2 -1
  50. package/cjs/table-export/csv/index.js +1 -1
  51. package/cjs/table-export/util/color.js +2 -1
  52. package/cjs/table-export/util/download.js +1 -1
  53. package/cjs/table-export/util/encode.js +1 -1
  54. package/cjs/table-export/util/indent.js +1 -1
  55. package/cjs/table-export/util/pagination.js +1 -1
  56. package/cjs/table-export/util/promise.js +1 -1
  57. package/cjs/table-export/util/type.js +1 -1
  58. package/dist/vtable-plugins.js +2885 -240
  59. package/dist/vtable-plugins.min.js +3 -3
  60. package/es/add-row-column.js +2 -2
  61. package/es/add-row-column.js.map +1 -1
  62. package/es/auto-fill/utils/date.js +1 -1
  63. package/es/auto-fill/utils/fill.js +1 -1
  64. package/es/column-series.js +1 -1
  65. package/es/column-series.js.map +1 -1
  66. package/es/contextmenu/handle-menu-helper.js +16 -9
  67. package/es/contextmenu/handle-menu-helper.js.map +1 -1
  68. package/es/contextmenu/menu-manager.js +1 -2
  69. package/es/contextmenu/styles.js +2 -1
  70. package/es/highlight-header-when-select-cell.js +1 -1
  71. package/es/highlight-header-when-select-cell.js.map +1 -1
  72. package/es/index.d.ts +1 -0
  73. package/es/index.js +2 -0
  74. package/es/index.js.map +1 -1
  75. package/es/master-detail-plugin/checkbox.d.ts +5 -0
  76. package/es/master-detail-plugin/checkbox.js +94 -0
  77. package/es/master-detail-plugin/checkbox.js.map +1 -0
  78. package/es/master-detail-plugin/config.d.ts +17 -0
  79. package/es/master-detail-plugin/config.js +80 -0
  80. package/es/master-detail-plugin/config.js.map +1 -0
  81. package/es/master-detail-plugin/core.d.ts +50 -0
  82. package/es/master-detail-plugin/core.js +285 -0
  83. package/es/master-detail-plugin/core.js.map +1 -0
  84. package/es/master-detail-plugin/events.d.ts +59 -0
  85. package/es/master-detail-plugin/events.js +232 -0
  86. package/es/master-detail-plugin/events.js.map +1 -0
  87. package/es/master-detail-plugin/index.d.ts +4 -0
  88. package/es/master-detail-plugin/index.js +4 -0
  89. package/es/master-detail-plugin/index.js.map +1 -0
  90. package/es/master-detail-plugin/subtable.d.ts +39 -0
  91. package/es/master-detail-plugin/subtable.js +426 -0
  92. package/es/master-detail-plugin/subtable.js.map +1 -0
  93. package/es/master-detail-plugin/table-api-extensions.d.ts +59 -0
  94. package/es/master-detail-plugin/table-api-extensions.js +445 -0
  95. package/es/master-detail-plugin/table-api-extensions.js.map +1 -0
  96. package/es/master-detail-plugin/types.d.ts +61 -0
  97. package/es/master-detail-plugin/types.js +12 -0
  98. package/es/master-detail-plugin/types.js.map +1 -0
  99. package/es/master-detail-plugin/utils.d.ts +8 -0
  100. package/es/master-detail-plugin/utils.js +52 -0
  101. package/es/master-detail-plugin/utils.js.map +1 -0
  102. package/es/master-detail-plugin.d.ts +1 -0
  103. package/es/master-detail-plugin.js +2 -0
  104. package/es/master-detail-plugin.js.map +1 -0
  105. package/es/paste-add-row-column.js +2 -2
  106. package/es/paste-add-row-column.js.map +1 -1
  107. package/es/row-series.js +1 -2
  108. package/es/table-carousel-animation.js +2 -1
  109. package/es/table-export/csv/index.js +1 -1
  110. package/es/table-export/util/color.js +2 -1
  111. package/es/table-export/util/download.js +1 -1
  112. package/es/table-export/util/encode.js +1 -1
  113. package/es/table-export/util/indent.js +1 -1
  114. package/es/table-export/util/pagination.js +1 -1
  115. package/es/table-export/util/promise.js +1 -1
  116. package/es/table-export/util/type.js +1 -1
  117. package/package.json +6 -6
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+
3
+ var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
4
+ void 0 === k2 && (k2 = k);
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
7
+ enumerable: !0,
8
+ get: function() {
9
+ return m[k];
10
+ }
11
+ }), Object.defineProperty(o, k2, desc);
12
+ } : function(o, m, k, k2) {
13
+ void 0 === k2 && (k2 = k), o[k2] = m[k];
14
+ }), __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function(o, v) {
15
+ Object.defineProperty(o, "default", {
16
+ enumerable: !0,
17
+ value: v
18
+ });
19
+ } : function(o, v) {
20
+ o.default = v;
21
+ }), __importStar = this && this.__importStar || function(mod) {
22
+ if (mod && mod.__esModule) return mod;
23
+ var result = {};
24
+ if (null != mod) for (var k in mod) "default" !== k && Object.prototype.hasOwnProperty.call(mod, k) && __createBinding(result, mod, k);
25
+ return __setModuleDefault(result, mod), result;
26
+ };
27
+
28
+ Object.defineProperty(exports, "__esModule", {
29
+ value: !0
30
+ }), exports.MasterDetailPlugin = void 0;
31
+
32
+ const VTable = __importStar(require("@visactor/vtable")), types_1 = require("./types"), utils_1 = require("./utils"), config_1 = require("./config"), events_1 = require("./events"), subtable_1 = require("./subtable"), table_api_extensions_1 = require("./table-api-extensions"), checkbox_1 = require("./checkbox");
33
+
34
+ class MasterDetailPlugin {
35
+ constructor(pluginOptions = {}) {
36
+ this.id = "Master Detail Plugin", this.name = "Master Detail Plugin", this.runTime = [ VTable.TABLE_EVENT_TYPE.BEFORE_INIT, VTable.TABLE_EVENT_TYPE.INITIALIZED, VTable.TABLE_EVENT_TYPE.SORT_CLICK, VTable.TABLE_EVENT_TYPE.AFTER_SORT, VTable.TABLE_EVENT_TYPE.AFTER_UPDATE_CELL_CONTENT_WIDTH, VTable.TABLE_EVENT_TYPE.AFTER_UPDATE_SELECT_BORDER_HEIGHT ],
37
+ this.pluginOptions = pluginOptions;
38
+ }
39
+ run(...args) {
40
+ const eventArgs = args[0], runTime = args[1], table = args[2];
41
+ if (runTime === VTable.TABLE_EVENT_TYPE.BEFORE_INIT) this.table = table, this.initializeManagers(),
42
+ this.configManager.injectMasterDetailOptions(eventArgs.options); else if (runTime === VTable.TABLE_EVENT_TYPE.INITIALIZED) this.setupMasterDetailFeatures(); else {
43
+ if (runTime === VTable.TABLE_EVENT_TYPE.SORT_CLICK) return this.eventManager.executeMasterDetailBeforeSort(),
44
+ !0;
45
+ runTime === VTable.TABLE_EVENT_TYPE.AFTER_SORT ? this.eventManager.executeMasterDetailAfterSort() : runTime === VTable.TABLE_EVENT_TYPE.AFTER_UPDATE_CELL_CONTENT_WIDTH ? this.eventManager.handleAfterUpdateCellContentWidth(eventArgs) : runTime === VTable.TABLE_EVENT_TYPE.AFTER_UPDATE_SELECT_BORDER_HEIGHT && this.eventManager.handleAfterUpdateSelectBorderHeight(eventArgs);
46
+ }
47
+ }
48
+ initializeManagers() {
49
+ var _a;
50
+ this.configManager = new config_1.ConfigManager(this.pluginOptions, this.table),
51
+ this.eventManager = new events_1.EventManager(this.table);
52
+ const enableCheckboxCascade = null === (_a = this.pluginOptions.enableCheckboxCascade) || void 0 === _a || _a;
53
+ this.subTableManager = new subtable_1.SubTableManager(this.table, enableCheckboxCascade),
54
+ this.configManager.setRowExpandedChecker((row => this.eventManager.isRowExpanded(row))),
55
+ this.eventManager.setCallbacks({
56
+ onUpdateSubTablePositions: () => this.subTableManager.recalculateAllSubTablePositions(),
57
+ onUpdateSubTablePositionsForRow: () => this.subTableManager.updateSubTablePositionsForRowResize(),
58
+ onExpandRow: (rowIndex, colIndex) => this.expandRow(rowIndex, colIndex),
59
+ onCollapseRow: (rowIndex, colIndex) => this.collapseRow(rowIndex, colIndex),
60
+ onCollapseRowToNoRealRecordIndex: rowIndex => this.collapseRowToNoRealRecordIndex(rowIndex),
61
+ onToggleRowExpand: (rowIndex, colIndex) => this.toggleRowExpand(rowIndex, colIndex),
62
+ getOriginalRowHeight: bodyRowIndex => (0, utils_1.getOriginalRowHeight)(this.table, bodyRowIndex)
63
+ }), this.subTableManager.setCallbacks({
64
+ getDetailConfigForRecord: (record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)
65
+ });
66
+ }
67
+ setupMasterDetailFeatures() {
68
+ this.initInternalProps(), this.eventManager.bindEventHandlers(), this.setupUnifiedSelectionManagement(),
69
+ this.extendTableAPI(), this.initCheckboxCascade();
70
+ }
71
+ setupUnifiedSelectionManagement() {
72
+ this.mainTableClickHandler = () => {
73
+ this.clearAllSubTableVisibleSelections();
74
+ }, this.table.on("click_cell", this.mainTableClickHandler);
75
+ }
76
+ initCheckboxCascade() {
77
+ var _a;
78
+ (null === (_a = this.pluginOptions.enableCheckboxCascade) || void 0 === _a || _a) && (this.checkboxCascadeCleanup = (0,
79
+ checkbox_1.bindMasterDetailCheckboxChange)(this.table, this.eventManager));
80
+ }
81
+ initInternalProps() {
82
+ const internalProps = (0, utils_1.getInternalProps)(this.table);
83
+ internalProps.expandedRecordIndices = [], internalProps.subTableInstances = new Map,
84
+ internalProps.originalRowHeights = new Map, internalProps.subTableCheckboxStates = new Map;
85
+ }
86
+ extendTableAPI() {
87
+ this.tableAPIExtensions = new table_api_extensions_1.TableAPIExtensions(this.table, this.configManager, this.eventManager, {
88
+ addUnderlineToCell: cellGroup => this.addUnderlineToCell(cellGroup),
89
+ updateOriginalHeightsAfterAdaptive: expandedRowsInfo => this.updateOriginalHeightsAfterAdaptive(expandedRowsInfo),
90
+ collapseRowToNoRealRecordIndex: rowIndex => this.collapseRowToNoRealRecordIndex(rowIndex),
91
+ expandRow: rowIndex => this.expandRow(rowIndex),
92
+ restoreExpandedStatesAfter: () => this.restoreExpandedStatesAfter(),
93
+ collapseRow: rowIndex => this.collapseRow(rowIndex),
94
+ updateSubTablePositions: () => this.subTableManager.recalculateAllSubTablePositions(),
95
+ updateRowHeightForExpand: (rowIndex, deltaHeight) => this.updateRowHeightForExpand(rowIndex, deltaHeight)
96
+ }), this.tableAPIExtensions.extendTableAPI();
97
+ }
98
+ updateOriginalHeightsAfterAdaptive(expandedRowsInfo) {
99
+ const internalProps = (0, utils_1.getInternalProps)(this.table);
100
+ for (const [rowIndex, info] of expandedRowsInfo) {
101
+ const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount;
102
+ internalProps.originalRowHeights && internalProps.originalRowHeights.set(bodyRowIndex, info.baseHeight);
103
+ }
104
+ }
105
+ restoreExpandedStatesAfter() {
106
+ const internalProps = (0, utils_1.getInternalProps)(this.table);
107
+ if (!internalProps.expandedRecordIndices || 0 === internalProps.expandedRecordIndices.length) return;
108
+ this.table.dataSource._currentPagerIndexedData && internalProps.expandedRecordIndices.forEach((recordIndex => {
109
+ try {
110
+ const bodyRowIndex = this.table.getBodyRowIndexByRecordIndex(recordIndex);
111
+ if (bodyRowIndex >= 0) {
112
+ const targetRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;
113
+ this.expandRow(targetRowIndex);
114
+ }
115
+ } catch (error) {}
116
+ }));
117
+ }
118
+ expandRow(rowIndex, colIndex) {
119
+ var _a;
120
+ const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = (0,
121
+ utils_1.getInternalProps)(this.table);
122
+ if (this.eventManager.isRowExpanded(rowIndex)) return;
123
+ const realRecordIndex = this.table.getRecordIndexByCell(0, rowIndex);
124
+ if (null == realRecordIndex) return;
125
+ internalProps.expandedRecordIndices && ((0, types_1.includesRecordIndex)(internalProps.expandedRecordIndices, realRecordIndex) || internalProps.expandedRecordIndices.push(realRecordIndex)),
126
+ this.eventManager.addExpandedRow(rowIndex);
127
+ const originalHeight = this.table.getRowHeight(rowIndex);
128
+ internalProps.originalRowHeights && internalProps.originalRowHeights.set(bodyRowIndex, originalHeight);
129
+ const record = (0, utils_1.getRecordByRowIndex)(this.table, bodyRowIndex), detailConfig = this.configManager.getDetailConfigForRecord(record, bodyRowIndex), height = (null === (_a = null == detailConfig ? void 0 : detailConfig.style) || void 0 === _a ? void 0 : _a.height) || 300, childrenData = Array.isArray(record.children) ? record.children : [], deltaHeight = height;
130
+ this.updateRowHeightForExpand(rowIndex, deltaHeight), this.table.scenegraph.updateContainerHeight(rowIndex, deltaHeight),
131
+ internalProps._heightResizedRowMap.add(rowIndex), this.subTableManager.renderSubTable(bodyRowIndex, childrenData, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
132
+ this.subTableManager.recalculateAllSubTablePositions(bodyRowIndex + 1, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
133
+ rowIndex !== this.table.rowCount - 1 && this.drawUnderlineForRow(rowIndex), this.refreshRowIcon(rowIndex, colIndex),
134
+ "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode();
135
+ }
136
+ collapseRow(rowIndex, colIndex) {
137
+ const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = (0,
138
+ utils_1.getInternalProps)(this.table);
139
+ if (!this.eventManager.isRowExpanded(rowIndex)) return;
140
+ const realRecordIndex = this.table.getRecordIndexByCell(0, rowIndex);
141
+ if (null == realRecordIndex) return;
142
+ if (this.subTableManager.removeSubTable(bodyRowIndex), internalProps.expandedRecordIndices) {
143
+ const index = (0, types_1.findRecordIndexPosition)(internalProps.expandedRecordIndices, realRecordIndex);
144
+ index > -1 && internalProps.expandedRecordIndices.splice(index, 1);
145
+ }
146
+ this.eventManager.removeExpandedRow(rowIndex);
147
+ const deltaHeight = this.table.getRowHeight(rowIndex) - (0, utils_1.getOriginalRowHeight)(this.table, bodyRowIndex);
148
+ this.updateRowHeightForExpand(rowIndex, -deltaHeight), internalProps._heightResizedRowMap.delete(rowIndex),
149
+ this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight), internalProps.originalRowHeights && internalProps.originalRowHeights.delete(bodyRowIndex),
150
+ rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.subTableManager.recalculateAllSubTablePositions(bodyRowIndex + 1, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
151
+ this.refreshRowIcon(rowIndex, colIndex), "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode();
152
+ }
153
+ collapseRowToNoRealRecordIndex(rowIndex) {
154
+ const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = (0,
155
+ utils_1.getInternalProps)(this.table);
156
+ if (!this.eventManager.isRowExpanded(rowIndex)) return;
157
+ this.subTableManager.removeSubTable(bodyRowIndex), this.eventManager.removeExpandedRow(rowIndex);
158
+ const deltaHeight = this.table.getRowHeight(rowIndex) - (0, utils_1.getOriginalRowHeight)(this.table, bodyRowIndex);
159
+ this.updateRowHeightForExpand(rowIndex, -deltaHeight), internalProps._heightResizedRowMap.delete(rowIndex),
160
+ this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight), internalProps.originalRowHeights && internalProps.originalRowHeights.delete(bodyRowIndex),
161
+ rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.subTableManager.recalculateAllSubTablePositions(bodyRowIndex + 1, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
162
+ this.refreshRowIcon(rowIndex), "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode();
163
+ }
164
+ toggleRowExpand(rowIndex, colIndex) {
165
+ this.eventManager.isRowExpanded(rowIndex) ? this.collapseRow(rowIndex, colIndex) : this.expandRow(rowIndex, colIndex);
166
+ }
167
+ updateRowHeightForExpand(rowIndex, deltaHeight) {
168
+ this.table._setRowHeight(rowIndex, this.table.getRowHeight(rowIndex) + deltaHeight, !0);
169
+ const rowStart = rowIndex + 1;
170
+ let rowEnd = 0;
171
+ rowEnd = rowIndex < this.table.frozenRowCount ? this.table.frozenRowCount - 1 : rowIndex >= this.table.rowCount - this.table.bottomFrozenRowCount ? this.table.rowCount - 1 : Math.min(this.table.scenegraph.proxy.rowEnd, this.table.rowCount - this.table.bottomFrozenRowCount - 1);
172
+ for (let colIndex = 0; colIndex < this.table.colCount; colIndex++) for (let rowIdx = rowStart; rowIdx <= rowEnd; rowIdx++) {
173
+ const cellGroup = this.table.scenegraph.highPerformanceGetCell(colIndex, rowIdx);
174
+ "cell" === cellGroup.role && cellGroup.setAttribute("y", cellGroup.attribute.y + deltaHeight);
175
+ }
176
+ }
177
+ drawUnderlineForRow(rowIndex) {
178
+ if (!this.table.scenegraph) return;
179
+ const rowCells = this.getRowCells(rowIndex);
180
+ 0 !== rowCells.length && (rowCells.forEach(((cellGroup, index) => {
181
+ cellGroup && cellGroup.attribute && this.addUnderlineToCell(cellGroup);
182
+ })), this.table.scenegraph.updateNextFrame());
183
+ }
184
+ getRowCells(rowIndex) {
185
+ const cells = [];
186
+ for (let col = 0; col < this.table.colCount; col++) {
187
+ const cellGroup = this.table.scenegraph.getCell(col, rowIndex);
188
+ cellGroup && "cell" === cellGroup.role && cells.push(cellGroup);
189
+ }
190
+ return cells;
191
+ }
192
+ addUnderlineToCell(cellGroup) {
193
+ var _a;
194
+ const currentAttr = cellGroup.attribute, currentStrokeArrayWidth = currentAttr.strokeArrayWidth || (currentAttr.lineWidth ? [ currentAttr.lineWidth, currentAttr.lineWidth, currentAttr.lineWidth, currentAttr.lineWidth ] : [ 1, 1, 1, 1 ]), currentStrokeArrayColor = currentAttr.strokeArrayColor || (currentAttr.stroke ? [ currentAttr.stroke, currentAttr.stroke, currentAttr.stroke, currentAttr.stroke ] : [ "transparent", "transparent", "transparent", "transparent" ]);
195
+ cellGroup._hasUnderline || (cellGroup._originalStrokeArrayWidth = [ ...currentStrokeArrayWidth ],
196
+ cellGroup._originalStrokeArrayColor = [ ...currentStrokeArrayColor ], cellGroup._hasUnderline = !0);
197
+ const originalStrokeArrayWidth = cellGroup._originalStrokeArrayWidth || currentStrokeArrayWidth, originalStrokeArrayColor = cellGroup._originalStrokeArrayColor || currentStrokeArrayColor, enhancedStrokeArrayWidth = [ ...originalStrokeArrayWidth ], enhancedStrokeArrayColor = [ ...originalStrokeArrayColor ], enhancedWidth = 2 * (.75 * (originalStrokeArrayWidth[2] || 1) + .75 * (originalStrokeArrayWidth[0] || 1));
198
+ if (enhancedStrokeArrayWidth[2] = enhancedWidth, "transparent" !== originalStrokeArrayColor[2] && originalStrokeArrayColor[2]) enhancedStrokeArrayColor[2] = originalStrokeArrayColor[2]; else {
199
+ const theme = this.table.theme;
200
+ enhancedStrokeArrayColor[2] = (null === (_a = null == theme ? void 0 : theme.bodyStyle) || void 0 === _a ? void 0 : _a.borderColor) || "#e1e4e8";
201
+ }
202
+ cellGroup.setAttributes({
203
+ strokeArrayWidth: enhancedStrokeArrayWidth,
204
+ strokeArrayColor: enhancedStrokeArrayColor,
205
+ stroke: !0
206
+ });
207
+ }
208
+ removeUnderlineFromRow(rowIndex) {
209
+ this.getRowCells(rowIndex).forEach(((cellGroup, index) => {
210
+ cellGroup && cellGroup._hasUnderline && this.removeUnderlineFromCell(cellGroup);
211
+ })), this.table.scenegraph.updateNextFrame();
212
+ }
213
+ removeUnderlineFromCell(cellGroup) {
214
+ cellGroup._hasUnderline && (cellGroup._originalStrokeArrayWidth && cellGroup._originalStrokeArrayColor && (cellGroup.setAttributes({
215
+ strokeArrayWidth: cellGroup._originalStrokeArrayWidth,
216
+ strokeArrayColor: cellGroup._originalStrokeArrayColor
217
+ }), delete cellGroup._originalStrokeArrayWidth, delete cellGroup._originalStrokeArrayColor),
218
+ cellGroup._hasUnderline = !1);
219
+ }
220
+ refreshRowIcon(rowIndex, colIndex) {
221
+ let targetColumnIndex;
222
+ if ("number" == typeof colIndex) targetColumnIndex = colIndex; else {
223
+ targetColumnIndex = !!this.table.options.rowSeriesNumber ? 1 : 0;
224
+ }
225
+ const record = this.table.getCellOriginRecord(targetColumnIndex, rowIndex);
226
+ if (record && "object" == typeof record) {
227
+ const recordObj = record, HierarchyState = VTable.TYPES.HierarchyState, isExpanded = this.eventManager.isRowExpanded(rowIndex);
228
+ recordObj.hierarchyState = isExpanded ? HierarchyState.expand : HierarchyState.collapse,
229
+ this.table.scenegraph.updateHierarchyIcon(targetColumnIndex, rowIndex);
230
+ }
231
+ }
232
+ update() {
233
+ this.table && this.subTableManager.recalculateAllSubTablePositions(0, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)));
234
+ }
235
+ setRecordChildren(children, col, row) {
236
+ const recordIndex = this.table.getRecordIndexByCell(col, row);
237
+ if (null == recordIndex) return;
238
+ const realRecordIndex = "number" == typeof recordIndex ? recordIndex : recordIndex[0], record = this.table.dataSource.get(realRecordIndex);
239
+ record && (record.children = children, this.expandRow(row, col), this.table.scenegraph.updateCellContent(col, row));
240
+ }
241
+ release() {
242
+ var _a, _b, _c, _d, _e;
243
+ const internalProps = (0, utils_1.getInternalProps)(this.table);
244
+ internalProps && (internalProps._isReleasing = !0);
245
+ try {
246
+ if (this.resizeObserver && (this.resizeObserver.disconnect(), this.resizeObserver = void 0),
247
+ this.checkboxCascadeCleanup) {
248
+ try {
249
+ this.checkboxCascadeCleanup();
250
+ } catch (error) {}
251
+ this.checkboxCascadeCleanup = void 0;
252
+ }
253
+ if (this.eventManager) try {
254
+ this.eventManager.cleanup();
255
+ } catch (error) {}
256
+ if (this.subTableManager) try {
257
+ this.subTableManager.cleanup();
258
+ } catch (error) {}
259
+ if (this.configManager) try {
260
+ this.configManager.release();
261
+ } catch (error) {}
262
+ if (this.cleanupMasterDetailFeatures(), this.table && internalProps) try {
263
+ null === (_a = internalProps.expandedRecordIndices) || void 0 === _a || _a.splice(0),
264
+ null === (_b = internalProps.subTableInstances) || void 0 === _b || _b.clear(),
265
+ null === (_c = internalProps.originalRowHeights) || void 0 === _c || _c.clear(),
266
+ null === (_d = internalProps.subTableCheckboxStates) || void 0 === _d || _d.clear(),
267
+ null === (_e = internalProps._heightResizedRowMap) || void 0 === _e || _e.clear();
268
+ } catch (error) {}
269
+ } catch (error) {} finally {
270
+ try {
271
+ this.configManager = null, this.eventManager = null, this.subTableManager = null,
272
+ this.tableAPIExtensions = null, this.table = null, this.pluginOptions = null;
273
+ } catch (error) {}
274
+ }
275
+ }
276
+ clearAllSubTableVisibleSelections() {
277
+ var _a;
278
+ null === (_a = (0, utils_1.getInternalProps)(this.table).subTableInstances) || void 0 === _a || _a.forEach((subTable => {
279
+ subTable && "function" == typeof subTable.clearSelected && subTable.clearSelected();
280
+ }));
281
+ }
282
+ getAllSubTableInstances() {
283
+ return this.subTableManager.getAllSubTableInstances();
284
+ }
285
+ getSubTableByRowIndex(rowIndex) {
286
+ const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount;
287
+ return this.subTableManager.getSubTableInstance(bodyRowIndex);
288
+ }
289
+ getSubTableByBodyRowIndex(bodyRowIndex) {
290
+ return this.subTableManager.getSubTableInstance(bodyRowIndex);
291
+ }
292
+ filterSubTables(predicate) {
293
+ const result = [], allSubTables = this.subTableManager.getAllSubTableInstances();
294
+ if (!allSubTables) return result;
295
+ for (const [bodyRowIndex, subTable] of allSubTables) try {
296
+ predicate(bodyRowIndex, subTable, (0, utils_1.getRecordByRowIndex)(this.table, bodyRowIndex)) && result.push({
297
+ bodyRowIndex: bodyRowIndex,
298
+ subTable: subTable
299
+ });
300
+ } catch (error) {}
301
+ return result;
302
+ }
303
+ cleanupMasterDetailFeatures() {
304
+ this.mainTableClickHandler && (this.table.off("click_cell", this.mainTableClickHandler),
305
+ this.mainTableClickHandler = void 0), this.tableAPIExtensions && (this.tableAPIExtensions.cleanup(),
306
+ this.tableAPIExtensions = void 0);
307
+ }
308
+ }
309
+
310
+ exports.MasterDetailPlugin = MasterDetailPlugin;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/master-detail-plugin/core.ts"],"names":[],"mappings":"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","file":"core.js","sourcesContent":["import * as VTable from '@visactor/vtable';\r\nimport type { Group } from '@visactor/vtable/es/scenegraph/graphic/group';\r\nimport type { MasterDetailPluginOptions } from './types';\r\nimport { includesRecordIndex, findRecordIndexPosition } from './types';\r\nimport { getInternalProps, getRecordByRowIndex, getOriginalRowHeight } from './utils';\r\nimport { ConfigManager } from './config';\r\nimport { EventManager } from './events';\r\nimport { SubTableManager } from './subtable';\r\nimport { TableAPIExtensions } from './table-api-extensions';\r\nimport { bindMasterDetailCheckboxChange } from './checkbox';\r\n\r\n/**\r\n * 主从表插件核心类\r\n */\r\nexport class MasterDetailPlugin implements VTable.plugins.IVTablePlugin {\r\n id = `Master Detail Plugin`;\r\n name = 'Master Detail Plugin';\r\n runTime = [\r\n VTable.TABLE_EVENT_TYPE.BEFORE_INIT,\r\n VTable.TABLE_EVENT_TYPE.INITIALIZED,\r\n VTable.TABLE_EVENT_TYPE.SORT_CLICK,\r\n VTable.TABLE_EVENT_TYPE.AFTER_SORT,\r\n VTable.TABLE_EVENT_TYPE.AFTER_UPDATE_CELL_CONTENT_WIDTH,\r\n VTable.TABLE_EVENT_TYPE.AFTER_UPDATE_SELECT_BORDER_HEIGHT\r\n ];\r\n\r\n pluginOptions: MasterDetailPluginOptions;\r\n table: VTable.ListTable;\r\n private configManager: ConfigManager;\r\n private eventManager: EventManager;\r\n private subTableManager: SubTableManager;\r\n private tableAPIExtensions: TableAPIExtensions;\r\n private resizeObserver?: ResizeObserver;\r\n private checkboxCascadeCleanup: () => void;\r\n\r\n constructor(pluginOptions: MasterDetailPluginOptions = {}) {\r\n this.pluginOptions = pluginOptions;\r\n }\r\n run(...args: unknown[]): boolean | void {\r\n const eventArgs = args[0];\r\n const runTime = args[1];\r\n const table = args[2] as VTable.ListTable;\r\n\r\n if (runTime === VTable.TABLE_EVENT_TYPE.BEFORE_INIT) {\r\n this.table = table;\r\n this.initializeManagers();\r\n this.configManager.injectMasterDetailOptions(\r\n (eventArgs as { options: VTable.ListTableConstructorOptions }).options\r\n );\r\n } else if (runTime === VTable.TABLE_EVENT_TYPE.INITIALIZED) {\r\n this.setupMasterDetailFeatures();\r\n } else if (runTime === VTable.TABLE_EVENT_TYPE.SORT_CLICK) {\r\n // 排序前处理:保存展开状态并收起所有行\r\n this.eventManager.executeMasterDetailBeforeSort();\r\n return true;\r\n } else if (runTime === VTable.TABLE_EVENT_TYPE.AFTER_SORT) {\r\n // 排序后处理:恢复展开状态\r\n this.eventManager.executeMasterDetailAfterSort();\r\n } else if (runTime === VTable.TABLE_EVENT_TYPE.AFTER_UPDATE_CELL_CONTENT_WIDTH) {\r\n // 单元格内容处理\r\n this.eventManager.handleAfterUpdateCellContentWidth(eventArgs as any);\r\n } else if (runTime === VTable.TABLE_EVENT_TYPE.AFTER_UPDATE_SELECT_BORDER_HEIGHT) {\r\n // 高亮处理\r\n this.eventManager.handleAfterUpdateSelectBorderHeight(eventArgs as any);\r\n }\r\n }\r\n\r\n /**\r\n * 初始化管理器\r\n */\r\n private initializeManagers(): void {\r\n this.configManager = new ConfigManager(this.pluginOptions, this.table);\r\n this.eventManager = new EventManager(this.table);\r\n const enableCheckboxCascade = this.pluginOptions.enableCheckboxCascade ?? true;\r\n this.subTableManager = new SubTableManager(this.table, enableCheckboxCascade);\r\n\r\n // 设置配置管理器的行展开状态检查函数\r\n this.configManager.setRowExpandedChecker((row: number) => this.eventManager.isRowExpanded(row));\r\n\r\n // 设置事件管理器的回调函数\r\n this.eventManager.setCallbacks({\r\n onUpdateSubTablePositions: () => this.subTableManager.recalculateAllSubTablePositions(),\r\n onUpdateSubTablePositionsForRow: () => this.subTableManager.updateSubTablePositionsForRowResize(),\r\n onExpandRow: (rowIndex: number, colIndex?: number) => this.expandRow(rowIndex, colIndex),\r\n onCollapseRow: (rowIndex: number, colIndex?: number) => this.collapseRow(rowIndex, colIndex),\r\n onCollapseRowToNoRealRecordIndex: (rowIndex: number) => this.collapseRowToNoRealRecordIndex(rowIndex),\r\n onToggleRowExpand: (rowIndex: number, colIndex?: number) => this.toggleRowExpand(rowIndex, colIndex),\r\n getOriginalRowHeight: (bodyRowIndex: number) => getOriginalRowHeight(this.table, bodyRowIndex)\r\n });\r\n\r\n // 设置子表管理器的回调函数\r\n this.subTableManager.setCallbacks({\r\n getDetailConfigForRecord: (record, bodyRowIndex) =>\r\n this.configManager.getDetailConfigForRecord(record, bodyRowIndex)\r\n });\r\n }\r\n\r\n /**\r\n * 设置主从表功能\r\n */\r\n private setupMasterDetailFeatures(): void {\r\n // 初始化内部属性\r\n this.initInternalProps();\r\n // 绑定事件处理器\r\n this.eventManager.bindEventHandlers();\r\n // 设置统一选择状态管理\r\n this.setupUnifiedSelectionManagement();\r\n // 扩展表格 API\r\n this.extendTableAPI();\r\n // 初始化checkbox联动功能\r\n this.initCheckboxCascade();\r\n }\r\n\r\n // 主表点击事件处理器引用\r\n private mainTableClickHandler?: () => void;\r\n\r\n /**\r\n * 设置统一选中状态管理\r\n */\r\n private setupUnifiedSelectionManagement(): void {\r\n // 绑定主表的点击事件,清除所有子表选中状态\r\n this.mainTableClickHandler = () => {\r\n this.clearAllSubTableVisibleSelections();\r\n };\r\n this.table.on('click_cell', this.mainTableClickHandler);\r\n }\r\n\r\n /**\r\n * 初始化checkbox联动功能\r\n * 设置主从表之间的复选框状态同步,并保存清理函数以便后续释放资源\r\n */\r\n private initCheckboxCascade(): void {\r\n // 检查是否启用checkbox级联功能,默认为 true\r\n const enableCheckboxCascade = this.pluginOptions.enableCheckboxCascade ?? true;\r\n if (enableCheckboxCascade) {\r\n // 设置checkbox联动并保存清理函数\r\n this.checkboxCascadeCleanup = bindMasterDetailCheckboxChange(this.table, this.eventManager);\r\n }\r\n }\r\n\r\n /**\r\n * 初始化内部属性\r\n */\r\n private initInternalProps(): void {\r\n const internalProps = getInternalProps(this.table);\r\n internalProps.expandedRecordIndices = [];\r\n internalProps.subTableInstances = new Map();\r\n internalProps.originalRowHeights = new Map();\r\n internalProps.subTableCheckboxStates = new Map();\r\n }\r\n\r\n /**\r\n * 扩展表格 API\r\n */\r\n private extendTableAPI(): void {\r\n // 创建 TableAPIExtensions 实例\r\n this.tableAPIExtensions = new TableAPIExtensions(this.table, this.configManager, this.eventManager, {\r\n addUnderlineToCell: (cellGroup: Group) => this.addUnderlineToCell(cellGroup),\r\n updateOriginalHeightsAfterAdaptive: (\r\n expandedRowsInfo: Map<number, { baseHeight: number; detailHeight: number }>\r\n ) => this.updateOriginalHeightsAfterAdaptive(expandedRowsInfo),\r\n collapseRowToNoRealRecordIndex: (rowIndex: number) => this.collapseRowToNoRealRecordIndex(rowIndex),\r\n expandRow: (rowIndex: number) => this.expandRow(rowIndex),\r\n restoreExpandedStatesAfter: () => this.restoreExpandedStatesAfter(),\r\n collapseRow: (rowIndex: number) => this.collapseRow(rowIndex),\r\n updateSubTablePositions: () => this.subTableManager.recalculateAllSubTablePositions(),\r\n updateRowHeightForExpand: (rowIndex: number, deltaHeight: number) =>\r\n this.updateRowHeightForExpand(rowIndex, deltaHeight)\r\n });\r\n\r\n // 执行API扩展\r\n this.tableAPIExtensions.extendTableAPI();\r\n }\r\n\r\n /**\r\n * 在 adaptive 处理后更新原始高度缓存\r\n */\r\n private updateOriginalHeightsAfterAdaptive(\r\n expandedRowsInfo: Map<number, { baseHeight: number; detailHeight: number }>\r\n ): void {\r\n const internalProps = getInternalProps(this.table);\r\n // 更新展开行的原始高度缓存\r\n for (const [rowIndex, info] of expandedRowsInfo) {\r\n const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount;\r\n if (internalProps.originalRowHeights) {\r\n // 将新的基础高度设置为原始高度\r\n internalProps.originalRowHeights.set(bodyRowIndex, info.baseHeight);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 分页后恢复展开状态\r\n */\r\n private restoreExpandedStatesAfter(): void {\r\n const internalProps = getInternalProps(this.table);\r\n if (!internalProps.expandedRecordIndices || internalProps.expandedRecordIndices.length === 0) {\r\n return;\r\n }\r\n const currentPagerData = this.table.dataSource._currentPagerIndexedData;\r\n if (!currentPagerData) {\r\n return;\r\n }\r\n internalProps.expandedRecordIndices.forEach(recordIndex => {\r\n try {\r\n const bodyRowIndex = this.table.getBodyRowIndexByRecordIndex(recordIndex);\r\n if (bodyRowIndex >= 0) {\r\n const targetRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n this.expandRow(targetRowIndex);\r\n }\r\n } catch (error) {\r\n console.warn(`处理记录索引 ${recordIndex} 时出错:`, error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 展开行\r\n * @param rowIndex 行索引\r\n * @param colIndex 列索引\r\n */\r\n expandRow(rowIndex: number, colIndex?: number): void {\r\n const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount;\r\n const internalProps = getInternalProps(this.table);\r\n if (this.eventManager.isRowExpanded(rowIndex)) {\r\n return;\r\n }\r\n\r\n const realRecordIndex = this.table.getRecordIndexByCell(0, rowIndex);\r\n if (realRecordIndex === undefined || realRecordIndex === null) {\r\n return;\r\n }\r\n // 更新展开行的数据源\r\n if (internalProps.expandedRecordIndices) {\r\n if (!includesRecordIndex(internalProps.expandedRecordIndices, realRecordIndex)) {\r\n internalProps.expandedRecordIndices.push(realRecordIndex);\r\n }\r\n }\r\n // 更新展开状态数组\r\n this.eventManager.addExpandedRow(rowIndex);\r\n\r\n const originalHeight = this.table.getRowHeight(rowIndex);\r\n if (internalProps.originalRowHeights) {\r\n internalProps.originalRowHeights.set(bodyRowIndex, originalHeight);\r\n }\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n const detailConfig = this.configManager.getDetailConfigForRecord(record, bodyRowIndex);\r\n const height = detailConfig?.style?.height || 300;\r\n\r\n const childrenData = Array.isArray(record.children) ? record.children : [];\r\n\r\n const deltaHeight = height;\r\n this.updateRowHeightForExpand(rowIndex, deltaHeight);\r\n this.table.scenegraph.updateContainerHeight(rowIndex, deltaHeight);\r\n internalProps._heightResizedRowMap.add(rowIndex);\r\n this.subTableManager.renderSubTable(bodyRowIndex, childrenData, (record, bodyRowIndex) =>\r\n this.configManager.getDetailConfigForRecord(record, bodyRowIndex)\r\n );\r\n this.subTableManager.recalculateAllSubTablePositions(\r\n bodyRowIndex + 1,\r\n undefined,\r\n (record: unknown, bodyRowIndex: number) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)\r\n );\r\n if (rowIndex !== this.table.rowCount - 1) {\r\n this.drawUnderlineForRow(rowIndex);\r\n }\r\n this.refreshRowIcon(rowIndex, colIndex);\r\n if (this.table.heightMode === 'adaptive') {\r\n this.table.scenegraph.dealHeightMode();\r\n }\r\n }\r\n\r\n /**\r\n * 收起行\r\n * @param rowIndex 行索引\r\n * @param colIndex 列索引\r\n */\r\n collapseRow(rowIndex: number, colIndex?: number): void {\r\n const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount;\r\n const internalProps = getInternalProps(this.table);\r\n\r\n if (!this.eventManager.isRowExpanded(rowIndex)) {\r\n return;\r\n }\r\n\r\n const realRecordIndex = this.table.getRecordIndexByCell(0, rowIndex);\r\n if (realRecordIndex === undefined || realRecordIndex === null) {\r\n return;\r\n }\r\n // 更新展开行的数据源\r\n this.subTableManager.removeSubTable(bodyRowIndex);\r\n if (internalProps.expandedRecordIndices) {\r\n const index = findRecordIndexPosition(internalProps.expandedRecordIndices, realRecordIndex);\r\n if (index > -1) {\r\n internalProps.expandedRecordIndices.splice(index, 1);\r\n }\r\n }\r\n\r\n // 更新展开状态数组\r\n this.eventManager.removeExpandedRow(rowIndex);\r\n\r\n const currentHeight = this.table.getRowHeight(rowIndex);\r\n const originalHeight = getOriginalRowHeight(this.table, bodyRowIndex);\r\n const deltaHeight = currentHeight - originalHeight;\r\n this.updateRowHeightForExpand(rowIndex, -deltaHeight);\r\n internalProps._heightResizedRowMap.delete(rowIndex);\r\n this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight);\r\n if (internalProps.originalRowHeights) {\r\n internalProps.originalRowHeights.delete(bodyRowIndex);\r\n }\r\n if (rowIndex !== this.table.rowCount - 1) {\r\n this.removeUnderlineFromRow(rowIndex);\r\n }\r\n this.subTableManager.recalculateAllSubTablePositions(\r\n bodyRowIndex + 1,\r\n undefined,\r\n (record: unknown, bodyRowIndex: number) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)\r\n );\r\n this.refreshRowIcon(rowIndex, colIndex);\r\n if (this.table.heightMode === 'adaptive') {\r\n this.table.scenegraph.dealHeightMode();\r\n }\r\n }\r\n\r\n /**\r\n * 收起行(不修改expandedRecordIndices)\r\n */\r\n private collapseRowToNoRealRecordIndex(rowIndex: number): void {\r\n const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount;\r\n const internalProps = getInternalProps(this.table);\r\n\r\n if (!this.eventManager.isRowExpanded(rowIndex)) {\r\n return;\r\n }\r\n this.subTableManager.removeSubTable(bodyRowIndex);\r\n this.eventManager.removeExpandedRow(rowIndex);\r\n const currentHeight = this.table.getRowHeight(rowIndex);\r\n const originalHeight = getOriginalRowHeight(this.table, bodyRowIndex);\r\n const deltaHeight = currentHeight - originalHeight;\r\n this.updateRowHeightForExpand(rowIndex, -deltaHeight);\r\n internalProps._heightResizedRowMap.delete(rowIndex);\r\n this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight);\r\n if (internalProps.originalRowHeights) {\r\n internalProps.originalRowHeights.delete(bodyRowIndex);\r\n }\r\n\r\n if (rowIndex !== this.table.rowCount - 1) {\r\n this.removeUnderlineFromRow(rowIndex);\r\n }\r\n this.subTableManager.recalculateAllSubTablePositions(\r\n bodyRowIndex + 1,\r\n undefined,\r\n (record: unknown, bodyRowIndex: number) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)\r\n );\r\n this.refreshRowIcon(rowIndex);\r\n if (this.table.heightMode === 'adaptive') {\r\n this.table.scenegraph.dealHeightMode();\r\n }\r\n }\r\n\r\n /**\r\n * 切换行展开状态\r\n * @param rowIndex 行索引\r\n * @param colIndex 列索引\r\n */\r\n toggleRowExpand(rowIndex: number, colIndex?: number): void {\r\n if (this.eventManager.isRowExpanded(rowIndex)) {\r\n this.collapseRow(rowIndex, colIndex);\r\n } else {\r\n this.expandRow(rowIndex, colIndex);\r\n }\r\n }\r\n\r\n /**\r\n * 更新行高用于展开\r\n */\r\n private updateRowHeightForExpand(rowIndex: number, deltaHeight: number): void {\r\n this.table._setRowHeight(rowIndex, this.table.getRowHeight(rowIndex) + deltaHeight, true);\r\n\r\n // 更新以下行的位置\r\n const rowStart = rowIndex + 1;\r\n let rowEnd = 0;\r\n\r\n if (rowIndex < this.table.frozenRowCount) {\r\n rowEnd = this.table.frozenRowCount - 1;\r\n } else if (rowIndex >= this.table.rowCount - this.table.bottomFrozenRowCount) {\r\n rowEnd = this.table.rowCount - 1;\r\n } else {\r\n rowEnd = Math.min(\r\n (this.table.scenegraph as { proxy: { rowEnd: number } }).proxy.rowEnd,\r\n this.table.rowCount - this.table.bottomFrozenRowCount - 1\r\n );\r\n }\r\n\r\n for (let colIndex = 0; colIndex < this.table.colCount; colIndex++) {\r\n for (let rowIdx = rowStart; rowIdx <= rowEnd; rowIdx++) {\r\n const cellGroup = this.table.scenegraph.highPerformanceGetCell(colIndex, rowIdx);\r\n if (cellGroup.role === 'cell') {\r\n cellGroup.setAttribute('y', cellGroup.attribute.y + deltaHeight);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 为指定行绘制下划线\r\n */\r\n private drawUnderlineForRow(rowIndex: number): void {\r\n const sceneGraph = this.table.scenegraph;\r\n if (!sceneGraph) {\r\n return;\r\n }\r\n // 获取指定行的所有cell\r\n const rowCells = this.getRowCells(rowIndex);\r\n if (rowCells.length === 0) {\r\n return;\r\n }\r\n rowCells.forEach((cellGroup: Group, index: number) => {\r\n if (cellGroup && cellGroup.attribute) {\r\n this.addUnderlineToCell(cellGroup);\r\n }\r\n });\r\n // 触发重新渲染\r\n this.table.scenegraph.updateNextFrame();\r\n }\r\n\r\n /**\r\n * 获取指定行的所有cell元素\r\n */\r\n private getRowCells(rowIndex: number): Group[] {\r\n const cells: Group[] = [];\r\n for (let col = 0; col < this.table.colCount; col++) {\r\n const cellGroup = this.table.scenegraph.getCell(col, rowIndex);\r\n if (cellGroup && cellGroup.role === 'cell') {\r\n cells.push(cellGroup);\r\n }\r\n }\r\n return cells;\r\n }\r\n\r\n /**\r\n * 为cell添加下划线\r\n */\r\n private addUnderlineToCell(cellGroup: any): void {\r\n const currentAttr = cellGroup.attribute;\r\n const currentStrokeArrayWidth =\r\n currentAttr.strokeArrayWidth ||\r\n (currentAttr.lineWidth\r\n ? [currentAttr.lineWidth, currentAttr.lineWidth, currentAttr.lineWidth, currentAttr.lineWidth]\r\n : [1, 1, 1, 1]);\r\n const currentStrokeArrayColor =\r\n currentAttr.strokeArrayColor ||\r\n (currentAttr.stroke\r\n ? [currentAttr.stroke, currentAttr.stroke, currentAttr.stroke, currentAttr.stroke]\r\n : ['transparent', 'transparent', 'transparent', 'transparent']);\r\n const isAlreadyEnhanced = cellGroup._hasUnderline;\r\n if (!isAlreadyEnhanced) {\r\n cellGroup._originalStrokeArrayWidth = [...currentStrokeArrayWidth];\r\n cellGroup._originalStrokeArrayColor = [...currentStrokeArrayColor];\r\n cellGroup._hasUnderline = true;\r\n }\r\n const originalStrokeArrayWidth = cellGroup._originalStrokeArrayWidth || currentStrokeArrayWidth;\r\n const originalStrokeArrayColor = cellGroup._originalStrokeArrayColor || currentStrokeArrayColor;\r\n const enhancedStrokeArrayWidth = [...originalStrokeArrayWidth];\r\n const enhancedStrokeArrayColor = [...originalStrokeArrayColor];\r\n const enhancedWidth = ((originalStrokeArrayWidth[2] || 1) * 0.75 + (originalStrokeArrayWidth[0] || 1) * 0.75) * 2;\r\n enhancedStrokeArrayWidth[2] = enhancedWidth;\r\n if (originalStrokeArrayColor[2] === 'transparent' || !originalStrokeArrayColor[2]) {\r\n const theme = this.table.theme;\r\n enhancedStrokeArrayColor[2] = theme?.bodyStyle?.borderColor || '#e1e4e8';\r\n } else {\r\n enhancedStrokeArrayColor[2] = originalStrokeArrayColor[2];\r\n }\r\n cellGroup.setAttributes({\r\n strokeArrayWidth: enhancedStrokeArrayWidth,\r\n strokeArrayColor: enhancedStrokeArrayColor,\r\n stroke: true\r\n });\r\n }\r\n\r\n /**\r\n * 删除展开行的下划线\r\n */\r\n private removeUnderlineFromRow(rowIndex: number): void {\r\n const rowCells = this.getRowCells(rowIndex);\r\n rowCells.forEach((cellGroup: any, index: number) => {\r\n if (cellGroup && cellGroup._hasUnderline) {\r\n this.removeUnderlineFromCell(cellGroup);\r\n }\r\n });\r\n this.table.scenegraph.updateNextFrame();\r\n }\r\n\r\n /**\r\n * 从cell中删除下划线\r\n */\r\n private removeUnderlineFromCell(cellGroup: any): void {\r\n if (cellGroup._hasUnderline) {\r\n // 恢复原始的strokeArray样式\r\n if (cellGroup._originalStrokeArrayWidth && cellGroup._originalStrokeArrayColor) {\r\n cellGroup.setAttributes({\r\n strokeArrayWidth: cellGroup._originalStrokeArrayWidth,\r\n strokeArrayColor: cellGroup._originalStrokeArrayColor\r\n });\r\n delete cellGroup._originalStrokeArrayWidth;\r\n delete cellGroup._originalStrokeArrayColor;\r\n }\r\n // 清除下划线标记\r\n cellGroup._hasUnderline = false;\r\n }\r\n }\r\n\r\n /**\r\n * 刷新行图标\r\n * @param rowIndex 行索引\r\n * @param colIndex 列索引\r\n */\r\n private refreshRowIcon(rowIndex: number, colIndex?: number): void {\r\n let targetColumnIndex: number;\r\n if (typeof colIndex === 'number') {\r\n targetColumnIndex = colIndex;\r\n } else {\r\n const hasRowSeriesNumber = !!this.table.options.rowSeriesNumber;\r\n targetColumnIndex = hasRowSeriesNumber ? 1 : 0;\r\n }\r\n\r\n const record = this.table.getCellOriginRecord(targetColumnIndex, rowIndex);\r\n if (record && typeof record === 'object') {\r\n const recordObj = record as Record<string, unknown>;\r\n const HierarchyState = VTable.TYPES.HierarchyState;\r\n const isExpanded = this.eventManager.isRowExpanded(rowIndex);\r\n recordObj.hierarchyState = isExpanded ? HierarchyState.expand : HierarchyState.collapse;\r\n this.table.scenegraph.updateHierarchyIcon(targetColumnIndex, rowIndex);\r\n }\r\n }\r\n\r\n update(): void {\r\n if (this.table) {\r\n this.subTableManager.recalculateAllSubTablePositions(0, undefined, (record: unknown, bodyRowIndex: number) =>\r\n this.configManager.getDetailConfigForRecord(record, bodyRowIndex)\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 设置记录的子数据并展开\r\n */\r\n setRecordChildren(children: unknown[], col: number, row: number): void {\r\n // 获取原始记录数据\r\n const recordIndex = this.table.getRecordIndexByCell(col, row);\r\n if (recordIndex === undefined || recordIndex === null) {\r\n console.warn('Invalid row, cannot get record index');\r\n return;\r\n }\r\n\r\n const realRecordIndex = typeof recordIndex === 'number' ? recordIndex : recordIndex[0];\r\n const record = this.table.dataSource.get(realRecordIndex);\r\n if (!record) {\r\n console.warn('Cannot find record for index:', realRecordIndex);\r\n return;\r\n }\r\n\r\n // 直接修改原始记录的 children 属性\r\n (record as Record<string, unknown>).children = children;\r\n this.expandRow(row, col);\r\n this.table.scenegraph.updateCellContent(col, row);\r\n }\r\n\r\n release(): void {\r\n // 设置释放标志\r\n const internalProps = getInternalProps(this.table);\r\n if (internalProps) {\r\n (internalProps as { _isReleasing?: boolean })._isReleasing = true;\r\n }\r\n\r\n try {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n\r\n // 清理checkbox联动功能\r\n if (this.checkboxCascadeCleanup) {\r\n try {\r\n this.checkboxCascadeCleanup();\r\n } catch (error) {\r\n console.warn('Error during checkbox cascade cleanup:', error);\r\n }\r\n this.checkboxCascadeCleanup = undefined;\r\n }\r\n\r\n // 清理事件管理器\r\n if (this.eventManager) {\r\n try {\r\n this.eventManager.cleanup();\r\n } catch (error) {\r\n console.warn('Error during event manager cleanup:', error);\r\n }\r\n }\r\n\r\n // 清理子表管理器\r\n if (this.subTableManager) {\r\n try {\r\n this.subTableManager.cleanup();\r\n } catch (error) {\r\n console.warn('Error during sub table manager cleanup:', error);\r\n }\r\n }\r\n\r\n // 清理配置管理器\r\n if (this.configManager) {\r\n try {\r\n this.configManager.release();\r\n } catch (error) {\r\n console.warn('Error during config manager cleanup:', error);\r\n }\r\n }\r\n\r\n // 清理主从表功能\r\n this.cleanupMasterDetailFeatures();\r\n\r\n // 清理内部属性\r\n if (this.table && internalProps) {\r\n try {\r\n // 清理Map和Set,防止内存泄露\r\n internalProps.expandedRecordIndices?.splice(0);\r\n internalProps.subTableInstances?.clear();\r\n internalProps.originalRowHeights?.clear();\r\n internalProps.subTableCheckboxStates?.clear();\r\n internalProps._heightResizedRowMap?.clear();\r\n } catch (error) {\r\n console.warn('Error clearing internal props:', error);\r\n }\r\n }\r\n } catch (error) {\r\n console.warn('Error during release:', error);\r\n } finally {\r\n // 避免循环引用\r\n try {\r\n (this as unknown as { configManager: unknown }).configManager = null;\r\n (this as unknown as { eventManager: unknown }).eventManager = null;\r\n (this as unknown as { subTableManager: unknown }).subTableManager = null;\r\n (this as unknown as { tableAPIExtensions: unknown }).tableAPIExtensions = null;\r\n (this as unknown as { table: unknown }).table = null;\r\n (this as unknown as { pluginOptions: unknown }).pluginOptions = null;\r\n } catch (error) {\r\n console.warn('Error clearing references:', error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有子表的可见选中状态\r\n */\r\n private clearAllSubTableVisibleSelections(): void {\r\n const internalProps = getInternalProps(this.table);\r\n internalProps.subTableInstances?.forEach(subTable => {\r\n if (subTable && typeof (subTable as { clearSelected?: () => void }).clearSelected === 'function') {\r\n (subTable as { clearSelected: () => void }).clearSelected();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 获取所有子表实例\r\n * @returns 子表实例的Map,键为bodyRowIndex,值为VTable实例\r\n */\r\n getAllSubTableInstances(): Map<number, VTable.ListTable> | null {\r\n return this.subTableManager.getAllSubTableInstances();\r\n }\r\n\r\n /**\r\n * 根据主表行号获取子表实例\r\n * @param rowIndex 主表行索引(包含表头)\r\n * @returns 子表实例,如果不存在则返回null\r\n */\r\n getSubTableByRowIndex(rowIndex: number): VTable.ListTable | null {\r\n const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount;\r\n return this.subTableManager.getSubTableInstance(bodyRowIndex);\r\n }\r\n\r\n /**\r\n * 根据主表body行号获取子表实例\r\n * @param bodyRowIndex 主表body行索引(不包含表头)\r\n * @returns 子表实例,如果不存在则返回null\r\n */\r\n getSubTableByBodyRowIndex(bodyRowIndex: number): VTable.ListTable | null {\r\n return this.subTableManager.getSubTableInstance(bodyRowIndex);\r\n }\r\n\r\n /**\r\n * 根据条件筛选子表实例\r\n * @param predicate 筛选条件函数\r\n * @returns 符合条件的子表实例数组\r\n */\r\n filterSubTables(\r\n predicate: (bodyRowIndex: number, subTable: VTable.ListTable, record?: unknown) => boolean\r\n ): Array<{ bodyRowIndex: number; subTable: VTable.ListTable; record?: unknown }> {\r\n const result: Array<{ bodyRowIndex: number; subTable: VTable.ListTable }> = [];\r\n const allSubTables = this.subTableManager.getAllSubTableInstances();\r\n if (!allSubTables) {\r\n return result;\r\n }\r\n\r\n for (const [bodyRowIndex, subTable] of allSubTables) {\r\n try {\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n if (predicate(bodyRowIndex, subTable, record)) {\r\n result.push({ bodyRowIndex, subTable });\r\n }\r\n } catch (error) {\r\n console.warn(`筛选子表时出错:`, error);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * 清理主从表功能\r\n */\r\n private cleanupMasterDetailFeatures(): void {\r\n // 清理主表事件处理器\r\n if (this.mainTableClickHandler) {\r\n this.table.off('click_cell', this.mainTableClickHandler);\r\n this.mainTableClickHandler = undefined;\r\n }\r\n // 清理表格 API 扩展\r\n if (this.tableAPIExtensions) {\r\n this.tableAPIExtensions.cleanup();\r\n this.tableAPIExtensions = undefined;\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,59 @@
1
+ import * as VTable from '@visactor/vtable';
2
+ export declare class EventManager {
3
+ private table;
4
+ private expandedRows;
5
+ private originalResize;
6
+ private eventHandlers;
7
+ private allExpandedRowsBeforeMove;
8
+ private isCleanedUp;
9
+ constructor(table: VTable.ListTable);
10
+ bindEventHandlers(): void;
11
+ private wrapTableResizeMethod;
12
+ handleAfterUpdateCellContentWidth(eventData: {
13
+ col: number;
14
+ row: number;
15
+ cellHeight: number;
16
+ cellGroup: any;
17
+ padding: [number, number, number, number];
18
+ textBaseline: CanvasTextBaseline;
19
+ }): void;
20
+ private fixCustomMergeCellTextPosition;
21
+ private isCustomMergeCell;
22
+ handleAfterUpdateSelectBorderHeight(eventData: {
23
+ startRow: number;
24
+ endRow: number;
25
+ currentHeight: number;
26
+ selectComp: {
27
+ rect: any;
28
+ fillhandle?: any;
29
+ role: string;
30
+ };
31
+ }): void;
32
+ executeMasterDetailBeforeSort(): void;
33
+ executeMasterDetailAfterSort(): void;
34
+ getExpandedRows(): number[];
35
+ setExpandedRows(rows: number[]): void;
36
+ addExpandedRow(rowIndex: number): void;
37
+ removeExpandedRow(rowIndex: number): void;
38
+ isRowExpanded(rowIndex: number): boolean;
39
+ private bindTreeHierarchyStateChange;
40
+ private getRecordByRowIndex;
41
+ private bindRowMoveEvents;
42
+ cleanup(): void;
43
+ private onUpdateSubTablePositions?;
44
+ private onUpdateSubTablePositionsForRow?;
45
+ private onExpandRow?;
46
+ private onCollapseRow?;
47
+ private onCollapseRowToNoRealRecordIndex?;
48
+ private onToggleRowExpand?;
49
+ private getOriginalRowHeight?;
50
+ setCallbacks(callbacks: {
51
+ onUpdateSubTablePositions?: () => void;
52
+ onUpdateSubTablePositionsForRow?: () => void;
53
+ onExpandRow?: (rowIndex: number, colIndex?: number) => void;
54
+ onCollapseRow?: (rowIndex: number, colIndex?: number) => void;
55
+ onCollapseRowToNoRealRecordIndex?: (rowIndex: number) => void;
56
+ onToggleRowExpand?: (rowIndex: number, colIndex?: number) => void;
57
+ getOriginalRowHeight?: (bodyRowIndex: number) => number;
58
+ }): void;
59
+ }