@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.
- package/cjs/add-row-column.js +2 -2
- package/cjs/add-row-column.js.map +1 -1
- package/cjs/auto-fill/utils/date.js +1 -1
- package/cjs/auto-fill/utils/fill.js +1 -1
- package/cjs/column-series.js +1 -1
- package/cjs/column-series.js.map +1 -1
- package/cjs/contextmenu/handle-menu-helper.js +16 -9
- package/cjs/contextmenu/handle-menu-helper.js.map +1 -1
- package/cjs/contextmenu/menu-manager.js +1 -2
- package/cjs/contextmenu/styles.js +2 -1
- package/cjs/highlight-header-when-select-cell.js +1 -1
- package/cjs/highlight-header-when-select-cell.js.map +1 -1
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +4 -4
- package/cjs/index.js.map +1 -1
- package/cjs/master-detail-plugin/checkbox.d.ts +5 -0
- package/cjs/master-detail-plugin/checkbox.js +105 -0
- package/cjs/master-detail-plugin/checkbox.js.map +1 -0
- package/cjs/master-detail-plugin/config.d.ts +17 -0
- package/cjs/master-detail-plugin/config.js +113 -0
- package/cjs/master-detail-plugin/config.js.map +1 -0
- package/cjs/master-detail-plugin/core.d.ts +50 -0
- package/cjs/master-detail-plugin/core.js +310 -0
- package/cjs/master-detail-plugin/core.js.map +1 -0
- package/cjs/master-detail-plugin/events.d.ts +59 -0
- package/cjs/master-detail-plugin/events.js +265 -0
- package/cjs/master-detail-plugin/events.js.map +1 -0
- package/cjs/master-detail-plugin/index.d.ts +4 -0
- package/cjs/master-detail-plugin/index.js +15 -0
- package/cjs/master-detail-plugin/index.js.map +1 -0
- package/cjs/master-detail-plugin/subtable.d.ts +39 -0
- package/cjs/master-detail-plugin/subtable.js +457 -0
- package/cjs/master-detail-plugin/subtable.js.map +1 -0
- package/cjs/master-detail-plugin/table-api-extensions.d.ts +59 -0
- package/cjs/master-detail-plugin/table-api-extensions.js +462 -0
- package/cjs/master-detail-plugin/table-api-extensions.js.map +1 -0
- package/cjs/master-detail-plugin/types.d.ts +61 -0
- package/cjs/master-detail-plugin/types.js +20 -0
- package/cjs/master-detail-plugin/types.js.map +1 -0
- package/cjs/master-detail-plugin/utils.d.ts +8 -0
- package/cjs/master-detail-plugin/utils.js +62 -0
- package/cjs/master-detail-plugin/utils.js.map +1 -0
- package/cjs/master-detail-plugin.d.ts +1 -0
- package/cjs/master-detail-plugin.js +15 -0
- package/cjs/master-detail-plugin.js.map +1 -0
- package/cjs/paste-add-row-column.js +2 -2
- package/cjs/paste-add-row-column.js.map +1 -1
- package/cjs/row-series.js +1 -2
- package/cjs/table-carousel-animation.js +2 -1
- package/cjs/table-export/csv/index.js +1 -1
- package/cjs/table-export/util/color.js +2 -1
- package/cjs/table-export/util/download.js +1 -1
- package/cjs/table-export/util/encode.js +1 -1
- package/cjs/table-export/util/indent.js +1 -1
- package/cjs/table-export/util/pagination.js +1 -1
- package/cjs/table-export/util/promise.js +1 -1
- package/cjs/table-export/util/type.js +1 -1
- package/dist/vtable-plugins.js +2885 -240
- package/dist/vtable-plugins.min.js +3 -3
- package/es/add-row-column.js +2 -2
- package/es/add-row-column.js.map +1 -1
- package/es/auto-fill/utils/date.js +1 -1
- package/es/auto-fill/utils/fill.js +1 -1
- package/es/column-series.js +1 -1
- package/es/column-series.js.map +1 -1
- package/es/contextmenu/handle-menu-helper.js +16 -9
- package/es/contextmenu/handle-menu-helper.js.map +1 -1
- package/es/contextmenu/menu-manager.js +1 -2
- package/es/contextmenu/styles.js +2 -1
- package/es/highlight-header-when-select-cell.js +1 -1
- package/es/highlight-header-when-select-cell.js.map +1 -1
- package/es/index.d.ts +1 -0
- package/es/index.js +2 -0
- package/es/index.js.map +1 -1
- package/es/master-detail-plugin/checkbox.d.ts +5 -0
- package/es/master-detail-plugin/checkbox.js +94 -0
- package/es/master-detail-plugin/checkbox.js.map +1 -0
- package/es/master-detail-plugin/config.d.ts +17 -0
- package/es/master-detail-plugin/config.js +80 -0
- package/es/master-detail-plugin/config.js.map +1 -0
- package/es/master-detail-plugin/core.d.ts +50 -0
- package/es/master-detail-plugin/core.js +285 -0
- package/es/master-detail-plugin/core.js.map +1 -0
- package/es/master-detail-plugin/events.d.ts +59 -0
- package/es/master-detail-plugin/events.js +232 -0
- package/es/master-detail-plugin/events.js.map +1 -0
- package/es/master-detail-plugin/index.d.ts +4 -0
- package/es/master-detail-plugin/index.js +4 -0
- package/es/master-detail-plugin/index.js.map +1 -0
- package/es/master-detail-plugin/subtable.d.ts +39 -0
- package/es/master-detail-plugin/subtable.js +426 -0
- package/es/master-detail-plugin/subtable.js.map +1 -0
- package/es/master-detail-plugin/table-api-extensions.d.ts +59 -0
- package/es/master-detail-plugin/table-api-extensions.js +445 -0
- package/es/master-detail-plugin/table-api-extensions.js.map +1 -0
- package/es/master-detail-plugin/types.d.ts +61 -0
- package/es/master-detail-plugin/types.js +12 -0
- package/es/master-detail-plugin/types.js.map +1 -0
- package/es/master-detail-plugin/utils.d.ts +8 -0
- package/es/master-detail-plugin/utils.js +52 -0
- package/es/master-detail-plugin/utils.js.map +1 -0
- package/es/master-detail-plugin.d.ts +1 -0
- package/es/master-detail-plugin.js +2 -0
- package/es/master-detail-plugin.js.map +1 -0
- package/es/paste-add-row-column.js +2 -2
- package/es/paste-add-row-column.js.map +1 -1
- package/es/row-series.js +1 -2
- package/es/table-carousel-animation.js +2 -1
- package/es/table-export/csv/index.js +1 -1
- package/es/table-export/util/color.js +2 -1
- package/es/table-export/util/download.js +1 -1
- package/es/table-export/util/encode.js +1 -1
- package/es/table-export/util/indent.js +1 -1
- package/es/table-export/util/pagination.js +1 -1
- package/es/table-export/util/promise.js +1 -1
- package/es/table-export/util/type.js +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,457 @@
|
|
|
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
|
+
}, __rest = this && this.__rest || function(s, e) {
|
|
27
|
+
var t = {};
|
|
28
|
+
for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0 && (t[p] = s[p]);
|
|
29
|
+
if (null != s && "function" == typeof Object.getOwnPropertySymbols) {
|
|
30
|
+
var i = 0;
|
|
31
|
+
for (p = Object.getOwnPropertySymbols(s); i < p.length; i++) e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]) && (t[p[i]] = s[p[i]]);
|
|
32
|
+
}
|
|
33
|
+
return t;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
Object.defineProperty(exports, "__esModule", {
|
|
37
|
+
value: !0
|
|
38
|
+
}), exports.SubTableManager = void 0;
|
|
39
|
+
|
|
40
|
+
const VTable = __importStar(require("@visactor/vtable")), utils_1 = require("./utils");
|
|
41
|
+
|
|
42
|
+
class SubTableManager {
|
|
43
|
+
constructor(table, enableCheckboxCascade = !0) {
|
|
44
|
+
this.table = table, this.enableCheckboxCascade = enableCheckboxCascade, this.timers = new Set,
|
|
45
|
+
this.columnRangeCache = null;
|
|
46
|
+
}
|
|
47
|
+
saveSubTableCheckboxState(bodyRowIndex, subTable) {
|
|
48
|
+
if (!subTable.stateManager) return;
|
|
49
|
+
const internalProps = (0, utils_1.getInternalProps)(this.table);
|
|
50
|
+
internalProps.subTableCheckboxStates || (internalProps.subTableCheckboxStates = new Map);
|
|
51
|
+
const subTableState = {
|
|
52
|
+
checkedState: Object.fromEntries(Array.from(subTable.stateManager.checkedState.entries()).map((([recordKey, fieldStates]) => [ recordKey, Object.assign({}, fieldStates) ]))),
|
|
53
|
+
headerCheckedState: Object.assign({}, subTable.stateManager.headerCheckedState)
|
|
54
|
+
};
|
|
55
|
+
internalProps.subTableCheckboxStates.set(bodyRowIndex, subTableState);
|
|
56
|
+
}
|
|
57
|
+
restoreSubTableCheckboxState(bodyRowIndex, subTable) {
|
|
58
|
+
var _a;
|
|
59
|
+
let savedState = null === (_a = (0, utils_1.getInternalProps)(this.table).subTableCheckboxStates) || void 0 === _a ? void 0 : _a.get(bodyRowIndex);
|
|
60
|
+
if (subTable.stateManager) {
|
|
61
|
+
if (savedState || (savedState = {
|
|
62
|
+
checkedState: {},
|
|
63
|
+
headerCheckedState: {}
|
|
64
|
+
}), savedState.checkedState && Object.keys(savedState.checkedState).forEach((recordKey => {
|
|
65
|
+
const fieldStates = savedState.checkedState[recordKey];
|
|
66
|
+
subTable.stateManager.checkedState.set(recordKey, fieldStates);
|
|
67
|
+
})), savedState.headerCheckedState && Object.keys(savedState.headerCheckedState).forEach((field => {
|
|
68
|
+
subTable.stateManager.headerCheckedState[field] = savedState.headerCheckedState[field];
|
|
69
|
+
})), this.enableCheckboxCascade) {
|
|
70
|
+
const parentRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;
|
|
71
|
+
if ((0, utils_1.getRecordByRowIndex)(this.table, bodyRowIndex) && this.table.stateManager) {
|
|
72
|
+
const parentDataIndex = this.table.getRecordIndexByCell(0, parentRowIndex);
|
|
73
|
+
if (null != parentDataIndex) {
|
|
74
|
+
const parentIndexKey = parentDataIndex.toString(), parentCheckedStates = this.table.stateManager.checkedState.get(parentIndexKey);
|
|
75
|
+
parentCheckedStates && Object.keys(parentCheckedStates).forEach((field => {
|
|
76
|
+
const parentState = parentCheckedStates[field];
|
|
77
|
+
if (!0 === parentState || !1 === parentState) {
|
|
78
|
+
subTable.stateManager.headerCheckedState[field] = parentState;
|
|
79
|
+
(subTable.records || []).forEach(((record, recordIndex) => {
|
|
80
|
+
const indexKey = recordIndex.toString();
|
|
81
|
+
let recordStates = subTable.stateManager.checkedState.get(indexKey);
|
|
82
|
+
recordStates || (recordStates = {}, subTable.stateManager.checkedState.set(indexKey, recordStates)),
|
|
83
|
+
recordStates[field] = parentState, record[field] = parentState;
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
this.safeSetTimeout((() => {
|
|
91
|
+
this.updateSubTableCheckboxVisualState(subTable);
|
|
92
|
+
}), 0);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
safeSetTimeout(callback, delay) {
|
|
96
|
+
const id = setTimeout((() => {
|
|
97
|
+
this.timers.delete(id);
|
|
98
|
+
try {
|
|
99
|
+
callback();
|
|
100
|
+
} catch (error) {}
|
|
101
|
+
}), delay);
|
|
102
|
+
return this.timers.add(id), id;
|
|
103
|
+
}
|
|
104
|
+
cleanupAllTimers() {
|
|
105
|
+
this.timers.forEach((id => clearTimeout(id))), this.timers.clear();
|
|
106
|
+
}
|
|
107
|
+
updateSubTableCheckboxVisualState(subTable, savedState) {
|
|
108
|
+
if (!subTable.stateManager) return;
|
|
109
|
+
const headerStates = (null == savedState ? void 0 : savedState.headerCheckedState) || subTable.stateManager.headerCheckedState, recordStates = (null == savedState ? void 0 : savedState.checkedState) || {};
|
|
110
|
+
Object.keys(headerStates).forEach((field => {
|
|
111
|
+
const headerState = headerStates[field], checkboxCol = (0, utils_1.findCheckboxColumnIndex)(subTable, field);
|
|
112
|
+
if (-1 !== checkboxCol) {
|
|
113
|
+
const headerRow = 0;
|
|
114
|
+
subTable.isHeader(checkboxCol, headerRow) && subTable.scenegraph.updateHeaderCheckboxCellState(checkboxCol, headerRow, headerState);
|
|
115
|
+
}
|
|
116
|
+
})), (null == savedState ? void 0 : savedState.checkedState) ? Object.keys(recordStates).forEach((recordKey => {
|
|
117
|
+
const fieldStates = recordStates[recordKey], recordIndex = Number(recordKey);
|
|
118
|
+
Object.keys(fieldStates).forEach((field => {
|
|
119
|
+
const checkboxState = fieldStates[field], checkboxCol = (0, utils_1.findCheckboxColumnIndex)(subTable, field);
|
|
120
|
+
if (-1 !== checkboxCol) for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {
|
|
121
|
+
if (subTable.getRecordIndexByCell(checkboxCol, row) === recordIndex) {
|
|
122
|
+
(0, utils_1.setCellCheckboxStateByAttribute)(checkboxCol, row, checkboxState, subTable);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}));
|
|
127
|
+
})) : subTable.stateManager.checkedState.forEach(((fieldStates, recordKey) => {
|
|
128
|
+
const recordIndex = Number(recordKey);
|
|
129
|
+
Object.keys(fieldStates).forEach((field => {
|
|
130
|
+
const checkboxState = fieldStates[field], checkboxCol = (0, utils_1.findCheckboxColumnIndex)(subTable, field);
|
|
131
|
+
if (-1 !== checkboxCol) for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {
|
|
132
|
+
if (subTable.getRecordIndexByCell(checkboxCol, row) === recordIndex) {
|
|
133
|
+
(0, utils_1.setCellCheckboxStateByAttribute)(checkboxCol, row, checkboxState, subTable);
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}));
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
renderSubTable(bodyRowIndex, childrenData, getDetailConfig) {
|
|
141
|
+
const internalProps = (0, utils_1.getInternalProps)(this.table), record = (0, utils_1.getRecordByRowIndex)(this.table, bodyRowIndex);
|
|
142
|
+
if (!record) return;
|
|
143
|
+
if (!childrenData || 0 === childrenData.length) return;
|
|
144
|
+
const detailConfig = getDetailConfig(record, bodyRowIndex), childViewBox = this.calculateSubTableViewBox(bodyRowIndex, detailConfig);
|
|
145
|
+
if (!childViewBox) return;
|
|
146
|
+
const containerWidth = childViewBox.x2 - childViewBox.x1, containerHeight = childViewBox.y2 - childViewBox.y1, parentOptions = this.table.options, baseSubTableOptions = {
|
|
147
|
+
viewBox: childViewBox,
|
|
148
|
+
canvas: this.table.canvas,
|
|
149
|
+
records: childrenData,
|
|
150
|
+
columns: (null == detailConfig ? void 0 : detailConfig.columns) || [],
|
|
151
|
+
widthMode: "adaptive",
|
|
152
|
+
showHeader: !0,
|
|
153
|
+
canvasWidth: containerWidth,
|
|
154
|
+
canvasHeight: containerHeight,
|
|
155
|
+
theme: parentOptions.theme
|
|
156
|
+
}, _a = detailConfig || {}, {style: _style} = _a, userDetailConfig = __rest(_a, [ "style" ]), subTableOptions = Object.assign(Object.assign({}, baseSubTableOptions), userDetailConfig), subTable = new VTable.ListTable(this.table.container, subTableOptions);
|
|
157
|
+
internalProps.subTableInstances.set(bodyRowIndex, subTable), this.restoreSubTableCheckboxState(bodyRowIndex, subTable);
|
|
158
|
+
const afterRenderHandler = () => {
|
|
159
|
+
internalProps.subTableInstances && internalProps.subTableInstances.has(bodyRowIndex) && subTable.render();
|
|
160
|
+
};
|
|
161
|
+
this.table.on("after_render", afterRenderHandler), subTable.__afterRenderHandler = afterRenderHandler,
|
|
162
|
+
this.setupScrollEventIsolation(subTable), this.setupUnifiedSelectionManagement(bodyRowIndex, subTable),
|
|
163
|
+
this.setupSubTableCanvasClipping(subTable, bodyRowIndex), this.setupAntiFlickerMechanism(subTable),
|
|
164
|
+
this.setupSubTableEventForwarding(bodyRowIndex, subTable), subTable.render();
|
|
165
|
+
}
|
|
166
|
+
getColumnRange() {
|
|
167
|
+
if (this.columnRangeCache) return this.columnRangeCache;
|
|
168
|
+
const frozenColCount = this.table.frozenColCount || 0, rightFrozenColCount = this.table.rightFrozenColCount || 0, totalColCount = this.table.colCount;
|
|
169
|
+
let startCol = frozenColCount, endCol = totalColCount - rightFrozenColCount - 1;
|
|
170
|
+
return 0 === frozenColCount && 0 === rightFrozenColCount && (startCol = 0, endCol = totalColCount - 1),
|
|
171
|
+
startCol >= totalColCount || endCol < startCol ? null : (this.columnRangeCache = {
|
|
172
|
+
startCol: startCol,
|
|
173
|
+
endCol: endCol
|
|
174
|
+
}, this.columnRangeCache);
|
|
175
|
+
}
|
|
176
|
+
calculateSubTableViewBox(bodyRowIndex, detailConfig, height) {
|
|
177
|
+
var _a, _b, _c;
|
|
178
|
+
const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount, detailRowRect = this.table.getCellRangeRelativeRect({
|
|
179
|
+
col: 0,
|
|
180
|
+
row: rowIndex
|
|
181
|
+
});
|
|
182
|
+
if (!detailRowRect) return null;
|
|
183
|
+
const originalHeight = (null === (_a = (0, utils_1.getInternalProps)(this.table).originalRowHeights) || void 0 === _a ? void 0 : _a.get(bodyRowIndex)) || 0, columnRange = this.getColumnRange();
|
|
184
|
+
if (!columnRange) return null;
|
|
185
|
+
const {startCol: startCol, endCol: endCol} = columnRange, firstColRect = this.table.getCellRangeRelativeRect({
|
|
186
|
+
col: startCol,
|
|
187
|
+
row: rowIndex
|
|
188
|
+
}), lastColRect = this.table.getCellRangeRelativeRect({
|
|
189
|
+
col: endCol,
|
|
190
|
+
row: rowIndex
|
|
191
|
+
});
|
|
192
|
+
if (!firstColRect || !lastColRect) return null;
|
|
193
|
+
const [marginTop, marginRight, marginBottom, marginLeft] = (0, utils_1.parseMargin)(null === (_b = null == detailConfig ? void 0 : detailConfig.style) || void 0 === _b ? void 0 : _b.margin), configHeight = height || ((null === (_c = null == detailConfig ? void 0 : detailConfig.style) || void 0 === _c ? void 0 : _c.height) || 300);
|
|
194
|
+
if (configHeight <= marginTop + marginBottom) return {
|
|
195
|
+
x1: firstColRect.left + marginLeft,
|
|
196
|
+
y1: detailRowRect.top + originalHeight,
|
|
197
|
+
x2: lastColRect.right - marginRight,
|
|
198
|
+
y2: detailRowRect.top + originalHeight
|
|
199
|
+
};
|
|
200
|
+
const viewBox = {
|
|
201
|
+
x1: firstColRect.left + marginLeft,
|
|
202
|
+
y1: detailRowRect.top + originalHeight + marginTop,
|
|
203
|
+
x2: lastColRect.right - marginRight,
|
|
204
|
+
y2: detailRowRect.top + originalHeight - marginBottom + configHeight
|
|
205
|
+
};
|
|
206
|
+
return viewBox.x2 <= viewBox.x1 || viewBox.y2 <= viewBox.y1 ? null : viewBox;
|
|
207
|
+
}
|
|
208
|
+
removeSubTable(bodyRowIndex) {
|
|
209
|
+
var _a;
|
|
210
|
+
const internalProps = (0, utils_1.getInternalProps)(this.table), subTable = null === (_a = internalProps.subTableInstances) || void 0 === _a ? void 0 : _a.get(bodyRowIndex);
|
|
211
|
+
if (subTable) {
|
|
212
|
+
if (this.saveSubTableCheckboxState(bodyRowIndex, subTable), this.cleanupSubTableEventHandlers(subTable),
|
|
213
|
+
"function" == typeof subTable.release) try {
|
|
214
|
+
subTable.release();
|
|
215
|
+
} catch (error) {}
|
|
216
|
+
internalProps.subTableInstances.delete(bodyRowIndex);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
cleanupSubTableEventHandlers(subTable) {
|
|
220
|
+
var _a, _b, _c, _d;
|
|
221
|
+
this.cleanupSubTableEventForwarding(subTable);
|
|
222
|
+
const afterRenderHandler = subTable.__afterRenderHandler;
|
|
223
|
+
afterRenderHandler && (this.table.off("after_render", afterRenderHandler), delete subTable.__afterRenderHandler);
|
|
224
|
+
const selectionHandler = subTable.__selectionHandler;
|
|
225
|
+
selectionHandler && (subTable.off("click_cell", selectionHandler), delete subTable.__selectionHandler);
|
|
226
|
+
const extendedSubTable = subTable;
|
|
227
|
+
(null === (_b = null === (_a = subTable.scenegraph) || void 0 === _a ? void 0 : _a.stage) || void 0 === _b ? void 0 : _b.defaultLayer) && extendedSubTable.__originalRenderMethod && (subTable.scenegraph.stage.defaultLayer.render = extendedSubTable.__originalRenderMethod,
|
|
228
|
+
delete extendedSubTable.__originalRenderMethod), (null === (_d = null === (_c = subTable.scenegraph) || void 0 === _c ? void 0 : _c.stage) || void 0 === _d ? void 0 : _d.defaultLayer) && extendedSubTable.__originalDrawMethod && (subTable.scenegraph.stage.defaultLayer.draw = extendedSubTable.__originalDrawMethod,
|
|
229
|
+
delete extendedSubTable.__originalDrawMethod);
|
|
230
|
+
const scrollHandler = extendedSubTable.__scrollHandler;
|
|
231
|
+
scrollHandler && (this.table.off("can_scroll", scrollHandler), delete extendedSubTable.__scrollHandler);
|
|
232
|
+
const subTableScrollHandler = extendedSubTable.__subTableScrollHandler;
|
|
233
|
+
subTableScrollHandler && (subTable.off("can_scroll", subTableScrollHandler), delete extendedSubTable.__subTableScrollHandler);
|
|
234
|
+
const clipInterval = extendedSubTable.__clipInterval;
|
|
235
|
+
clipInterval && (clearInterval(clipInterval), delete extendedSubTable.__clipInterval);
|
|
236
|
+
const antiFlickerHandler = extendedSubTable.__antiFlickerHandler;
|
|
237
|
+
antiFlickerHandler && (this.table.off("after_render", antiFlickerHandler), delete extendedSubTable.__antiFlickerHandler);
|
|
238
|
+
const checkboxHandler = extendedSubTable.__checkboxHandler;
|
|
239
|
+
checkboxHandler && (subTable.off("checkbox_state_change", checkboxHandler), delete extendedSubTable.__checkboxHandler);
|
|
240
|
+
}
|
|
241
|
+
setupScrollEventIsolation(subTable) {
|
|
242
|
+
const isMouseInChildTableArea = event => {
|
|
243
|
+
const rect = this.table.canvas.getBoundingClientRect(), x = event.clientX - rect.left, y = event.clientY - rect.top, currentViewBox = subTable.options.viewBox;
|
|
244
|
+
if (!currentViewBox) return !1;
|
|
245
|
+
return x >= currentViewBox.x1 && x <= currentViewBox.x2 && y >= currentViewBox.y1 && y <= currentViewBox.y2;
|
|
246
|
+
}, shouldSubTableScroll = event => {
|
|
247
|
+
if (!(event && event instanceof WheelEvent)) return !0;
|
|
248
|
+
const deltaY = event.deltaY, isScrollingDown = deltaY > 0, isScrollingUp = deltaY < 0;
|
|
249
|
+
return !(subTable.scrollTop <= 0 && isScrollingUp) && (!(() => {
|
|
250
|
+
const totalContentHeight = subTable.getAllRowsHeight(), viewportHeight = subTable.scenegraph.height, scrollTop = subTable.scrollTop;
|
|
251
|
+
if (totalContentHeight <= viewportHeight) return !0;
|
|
252
|
+
const maxScrollTop = totalContentHeight - viewportHeight;
|
|
253
|
+
return Math.abs(scrollTop - maxScrollTop) <= 1;
|
|
254
|
+
})() || !isScrollingDown);
|
|
255
|
+
};
|
|
256
|
+
let subTableCanScroll = !1;
|
|
257
|
+
const handleParentScroll = parentArgs => {
|
|
258
|
+
const args = parentArgs;
|
|
259
|
+
return args.event && isMouseInChildTableArea(args.event) && shouldSubTableScroll(args.event) ? (subTableCanScroll = !0,
|
|
260
|
+
!1) : (subTableCanScroll = !1, !0);
|
|
261
|
+
};
|
|
262
|
+
this.table.on("can_scroll", handleParentScroll);
|
|
263
|
+
const handleSubTableScroll = parentArgs => void 0 === parentArgs.event || subTableCanScroll;
|
|
264
|
+
subTable.on("can_scroll", handleSubTableScroll);
|
|
265
|
+
const extendedSubTable = subTable;
|
|
266
|
+
extendedSubTable.__scrollHandler = handleParentScroll, extendedSubTable.__subTableScrollHandler = handleSubTableScroll;
|
|
267
|
+
}
|
|
268
|
+
setupUnifiedSelectionManagement(bodyRowIndex, subTable) {
|
|
269
|
+
const selectionHandler = () => {
|
|
270
|
+
this.clearAllSelectionsExcept(bodyRowIndex);
|
|
271
|
+
};
|
|
272
|
+
subTable.on("click_cell", selectionHandler), subTable.__selectionHandler = selectionHandler;
|
|
273
|
+
}
|
|
274
|
+
calculateGroupLevelOffset(rowIndex) {
|
|
275
|
+
try {
|
|
276
|
+
const recordIndex = this.table.getRecordShowIndexByCell(0, rowIndex), indexKey = this.table.dataSource.getIndexKey(recordIndex);
|
|
277
|
+
if (!Array.isArray(indexKey) || indexKey.length <= 1) return 0;
|
|
278
|
+
let totalOffset = 0;
|
|
279
|
+
for (let r = this.table.columnHeaderLevelCount; r < rowIndex; r++) try {
|
|
280
|
+
const record = this.table.getRecordByCell(0, r);
|
|
281
|
+
if (record && "object" == typeof record && "vtableMergeName" in record) {
|
|
282
|
+
const groupRecordIndex = this.table.getRecordShowIndexByCell(0, r), groupIndexKey = this.table.dataSource.getIndexKey(groupRecordIndex), normalizedGroupKey = Array.isArray(groupIndexKey) ? groupIndexKey : [ groupIndexKey ];
|
|
283
|
+
this.isAncestorGroup(normalizedGroupKey, indexKey) && (totalOffset += this.table.getRowHeight(r));
|
|
284
|
+
}
|
|
285
|
+
} catch (e) {}
|
|
286
|
+
return totalOffset;
|
|
287
|
+
} catch (error) {
|
|
288
|
+
return 0;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
isAncestorGroup(groupKey, targetKey) {
|
|
292
|
+
if (groupKey.length >= targetKey.length) return !1;
|
|
293
|
+
for (let i = 0; i < groupKey.length; i++) if (groupKey[i] !== targetKey[i]) return !1;
|
|
294
|
+
return !0;
|
|
295
|
+
}
|
|
296
|
+
setupSubTableCanvasClipping(subTable, bodyRowIndex) {
|
|
297
|
+
var _a;
|
|
298
|
+
if (!(null === (_a = subTable.scenegraph) || void 0 === _a ? void 0 : _a.stage)) return;
|
|
299
|
+
const stage = subTable.scenegraph.stage, extendedSubTable = subTable, calculateClipRegion = () => {
|
|
300
|
+
var _a;
|
|
301
|
+
try {
|
|
302
|
+
const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount, frozenRowsHeight = this.table.getFrozenRowsHeight(), frozenColsWidth = this.table.getFrozenColsWidth(), rightFrozenColsWidth = this.table.getRightFrozenColsWidth(), bottomFrozenRowsHeight = this.table.getBottomFrozenRowsHeight(), tableWidth = this.table.tableNoFrameWidth, tableHeight = this.table.tableNoFrameHeight, isFrozenDataRow = rowIndex < this.table.frozenRowCount && rowIndex >= this.table.columnHeaderLevelCount, isBottomFrozenDataRow = rowIndex >= this.table.rowCount - this.table.bottomFrozenRowCount, groupLevelOffset = this.calculateGroupLevelOffset(rowIndex), record = (0,
|
|
303
|
+
utils_1.getRecordByRowIndex)(this.table, bodyRowIndex), detailConfig = record && this.getDetailConfigForRecord ? this.getDetailConfigForRecord(record, bodyRowIndex) : null, [, marginRight, , marginLeft] = (0,
|
|
304
|
+
utils_1.parseMargin)(null === (_a = null == detailConfig ? void 0 : detailConfig.style) || void 0 === _a ? void 0 : _a.margin);
|
|
305
|
+
let clipY = 0;
|
|
306
|
+
let clipHeight = tableHeight;
|
|
307
|
+
return isFrozenDataRow ? (clipY = groupLevelOffset, clipHeight = tableHeight - bottomFrozenRowsHeight - groupLevelOffset) : isBottomFrozenDataRow ? (clipY = groupLevelOffset,
|
|
308
|
+
clipHeight = tableHeight - groupLevelOffset) : (clipY = frozenRowsHeight + groupLevelOffset,
|
|
309
|
+
clipHeight = tableHeight - frozenRowsHeight - bottomFrozenRowsHeight - groupLevelOffset),
|
|
310
|
+
{
|
|
311
|
+
clipX: frozenColsWidth + marginLeft,
|
|
312
|
+
clipY: clipY,
|
|
313
|
+
clipWidth: tableWidth - frozenColsWidth - rightFrozenColsWidth - marginLeft / 2 - marginRight / 2,
|
|
314
|
+
clipHeight: clipHeight
|
|
315
|
+
};
|
|
316
|
+
} catch (error) {
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
}, window = stage.window;
|
|
320
|
+
if (!window || "function" != typeof window.getContext) return;
|
|
321
|
+
const context = window.getContext();
|
|
322
|
+
if (!context) return;
|
|
323
|
+
const wrapRenderMethod = (obj, methodName, originalMethodKey) => {
|
|
324
|
+
const originalMethod = obj[methodName];
|
|
325
|
+
"function" == typeof originalMethod && (extendedSubTable[originalMethodKey] = originalMethod,
|
|
326
|
+
obj[methodName] = function(...args) {
|
|
327
|
+
context.save();
|
|
328
|
+
try {
|
|
329
|
+
const clipRegion = calculateClipRegion();
|
|
330
|
+
if (clipRegion && clipRegion.clipWidth > 0 && clipRegion.clipHeight > 0) {
|
|
331
|
+
const dpr = window.dpr || window.devicePixelRatio || 1;
|
|
332
|
+
context.beginPath(), context.rect(clipRegion.clipX * dpr, clipRegion.clipY * dpr, clipRegion.clipWidth * dpr, clipRegion.clipHeight * dpr),
|
|
333
|
+
context.clip();
|
|
334
|
+
}
|
|
335
|
+
return originalMethod.apply(this, args);
|
|
336
|
+
} finally {
|
|
337
|
+
context.restore();
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
};
|
|
341
|
+
stage.defaultLayer && (wrapRenderMethod(stage.defaultLayer, "render", "__originalRenderMethod"),
|
|
342
|
+
wrapRenderMethod(stage.defaultLayer, "draw", "__originalDrawMethod"));
|
|
343
|
+
}
|
|
344
|
+
setupAntiFlickerMechanism(subTable) {
|
|
345
|
+
var _a;
|
|
346
|
+
try {
|
|
347
|
+
const originalUpdateNextFrame = null === (_a = subTable.scenegraph) || void 0 === _a ? void 0 : _a.updateNextFrame;
|
|
348
|
+
if (!originalUpdateNextFrame) return;
|
|
349
|
+
const parentTable = this.table, syncRender = () => {
|
|
350
|
+
subTable && originalUpdateNextFrame && originalUpdateNextFrame.call(subTable.scenegraph);
|
|
351
|
+
};
|
|
352
|
+
parentTable.on("after_render", syncRender);
|
|
353
|
+
subTable.__antiFlickerHandler = syncRender;
|
|
354
|
+
} catch (error) {}
|
|
355
|
+
}
|
|
356
|
+
updateSubTablePositionsForRowResize() {
|
|
357
|
+
const internalProps = (0, utils_1.getInternalProps)(this.table);
|
|
358
|
+
internalProps.subTableInstances && (internalProps.subTableInstances.forEach(((subTable, bodyRowIndex) => {
|
|
359
|
+
try {
|
|
360
|
+
const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount, scenegraph = this.table.scenegraph;
|
|
361
|
+
let cellGroup = null;
|
|
362
|
+
scenegraph && "function" == typeof scenegraph.highPerformanceGetCell ? cellGroup = scenegraph.highPerformanceGetCell(0, rowIndex) : scenegraph && "function" == typeof scenegraph.getCell && (cellGroup = scenegraph.getCell(0, rowIndex));
|
|
363
|
+
const cellHeight = cellGroup && cellGroup.attribute && "number" == typeof cellGroup.attribute.height ? cellGroup.attribute.height : -1;
|
|
364
|
+
internalProps.originalRowHeights && "number" == typeof cellHeight && -1 !== cellHeight && internalProps.originalRowHeights.set(bodyRowIndex, cellHeight);
|
|
365
|
+
} catch (e) {}
|
|
366
|
+
})), this.recalculateAllSubTablePositions());
|
|
367
|
+
}
|
|
368
|
+
recalculateAllSubTablePositions(start, end, getDetailConfig) {
|
|
369
|
+
var _a;
|
|
370
|
+
this.columnRangeCache = null;
|
|
371
|
+
const internalProps = (0, utils_1.getInternalProps)(this.table);
|
|
372
|
+
null === (_a = internalProps.subTableInstances) || void 0 === _a || _a.forEach(((subTable, bodyRowIndex) => {
|
|
373
|
+
var _a, _b;
|
|
374
|
+
if (void 0 !== start && bodyRowIndex < start) return;
|
|
375
|
+
if (void 0 !== end && bodyRowIndex > end) return;
|
|
376
|
+
const record = (0, utils_1.getRecordByRowIndex)(this.table, bodyRowIndex), detailConfig = getDetailConfig ? getDetailConfig(record, bodyRowIndex) : this.getDetailConfigForRecord ? this.getDetailConfigForRecord(record, bodyRowIndex) : null, rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount, originalHeight = (null === (_a = internalProps.originalRowHeights) || void 0 === _a ? void 0 : _a.get(bodyRowIndex)) || 0, detailHeight = this.table.getRowHeight(rowIndex) - originalHeight, newViewBox = this.calculateSubTableViewBox(bodyRowIndex, detailConfig, detailHeight);
|
|
377
|
+
if (newViewBox) {
|
|
378
|
+
const newContainerWidth = newViewBox.x2 - newViewBox.x1, newContainerHeight = newViewBox.y2 - newViewBox.y1;
|
|
379
|
+
subTable.options.viewBox = newViewBox;
|
|
380
|
+
const subTableOptions = subTable.options;
|
|
381
|
+
subTableOptions.canvasWidth === newContainerWidth && subTableOptions.canvasHeight === newContainerHeight || (subTableOptions.canvasWidth = newContainerWidth,
|
|
382
|
+
subTableOptions.canvasHeight = newContainerHeight, subTable.resize()), (null === (_b = subTable.scenegraph) || void 0 === _b ? void 0 : _b.stage) && subTable.scenegraph.stage.setViewBox(newViewBox, !1);
|
|
383
|
+
}
|
|
384
|
+
}));
|
|
385
|
+
}
|
|
386
|
+
cleanup() {
|
|
387
|
+
if (!this.table) return;
|
|
388
|
+
this.cleanupAllTimers();
|
|
389
|
+
const internalProps = (0, utils_1.getInternalProps)(this.table);
|
|
390
|
+
internalProps && internalProps.subTableInstances && (internalProps.subTableInstances.forEach(((subTable, bodyRowIndex) => {
|
|
391
|
+
this.removeSubTable(bodyRowIndex);
|
|
392
|
+
})), internalProps.subTableInstances.clear()), this.columnRangeCache = null, this.getDetailConfigForRecord = void 0,
|
|
393
|
+
this.table = null;
|
|
394
|
+
}
|
|
395
|
+
getAllSubTableInstances() {
|
|
396
|
+
return (0, utils_1.getInternalProps)(this.table).subTableInstances;
|
|
397
|
+
}
|
|
398
|
+
getSubTableInstance(bodyRowIndex) {
|
|
399
|
+
var _a;
|
|
400
|
+
return (null === (_a = (0, utils_1.getInternalProps)(this.table).subTableInstances) || void 0 === _a ? void 0 : _a.get(bodyRowIndex)) || null;
|
|
401
|
+
}
|
|
402
|
+
setCallbacks(callbacks) {
|
|
403
|
+
this.getDetailConfigForRecord = callbacks.getDetailConfigForRecord;
|
|
404
|
+
}
|
|
405
|
+
setupSubTableEventForwarding(bodyRowIndex, subTable) {
|
|
406
|
+
const masterRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;
|
|
407
|
+
Object.values(VTable.TABLE_EVENT_TYPE).forEach((eventType => {
|
|
408
|
+
var _a;
|
|
409
|
+
if (eventType) {
|
|
410
|
+
const handler = (...args) => {
|
|
411
|
+
this.forwardSubTableEvent(eventType, bodyRowIndex, masterRowIndex, subTable, args);
|
|
412
|
+
};
|
|
413
|
+
subTable.on(eventType, handler);
|
|
414
|
+
const subTableWithHandlers = subTable;
|
|
415
|
+
subTableWithHandlers.__eventHandlers || (subTableWithHandlers.__eventHandlers = new Map);
|
|
416
|
+
const handlers = subTableWithHandlers.__eventHandlers;
|
|
417
|
+
handlers.has(eventType) || handlers.set(eventType, []), null === (_a = handlers.get(eventType)) || void 0 === _a || _a.push(handler);
|
|
418
|
+
}
|
|
419
|
+
}));
|
|
420
|
+
}
|
|
421
|
+
forwardSubTableEvent(eventType, bodyRowIndex, masterRowIndex, subTable, originalArgs) {
|
|
422
|
+
const subTableEventInfo = {
|
|
423
|
+
eventType: eventType,
|
|
424
|
+
masterBodyRowIndex: bodyRowIndex,
|
|
425
|
+
masterRowIndex: masterRowIndex,
|
|
426
|
+
subTable: subTable,
|
|
427
|
+
originalEventArgs: originalArgs
|
|
428
|
+
};
|
|
429
|
+
this.table.fireListeners(VTable.TABLE_EVENT_TYPE.PLUGIN_EVENT, {
|
|
430
|
+
plugin: {
|
|
431
|
+
name: "Master Detail Plugin"
|
|
432
|
+
},
|
|
433
|
+
event: originalArgs[0],
|
|
434
|
+
pluginEventInfo: subTableEventInfo
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
clearMainTableSelectionInternal() {
|
|
438
|
+
"function" == typeof this.table.clearSelected && this.table.clearSelected();
|
|
439
|
+
}
|
|
440
|
+
clearAllSelectionsExcept(exceptRecordIndex) {
|
|
441
|
+
var _a;
|
|
442
|
+
this.clearMainTableSelectionInternal();
|
|
443
|
+
null === (_a = (0, utils_1.getInternalProps)(this.table).subTableInstances) || void 0 === _a || _a.forEach(((subTable, rowIndex) => {
|
|
444
|
+
rowIndex !== exceptRecordIndex && subTable && "function" == typeof subTable.clearSelected && subTable.clearSelected();
|
|
445
|
+
}));
|
|
446
|
+
}
|
|
447
|
+
cleanupSubTableEventForwarding(subTable) {
|
|
448
|
+
const subTableWithHandlers = subTable;
|
|
449
|
+
if (subTableWithHandlers.__eventHandlers) {
|
|
450
|
+
for (const [eventType, handlers] of subTableWithHandlers.__eventHandlers) for (const handler of handlers) subTable.off(eventType, handler);
|
|
451
|
+
delete subTableWithHandlers.__eventHandlers;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
exports.SubTableManager = SubTableManager;
|
|
457
|
+
//# sourceMappingURL=subtable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/master-detail-plugin/subtable.ts"],"names":[],"mappings":"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","file":"subtable.js","sourcesContent":["import * as VTable from '@visactor/vtable';\r\nimport type { DetailTableOptions, SubTableCheckboxState, SubTableEventInfo } from './types';\r\nimport {\r\n getInternalProps,\r\n getRecordByRowIndex,\r\n parseMargin,\r\n setCellCheckboxStateByAttribute,\r\n findCheckboxColumnIndex\r\n} from './utils';\r\n\r\n/**\r\n * 子表管理相关功能\r\n */\r\nexport class SubTableManager {\r\n private timers: Set<NodeJS.Timeout> = new Set();\r\n constructor(private table: VTable.ListTable, private enableCheckboxCascade: boolean = true) {}\r\n private saveSubTableCheckboxState(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n const internalProps = getInternalProps(this.table);\r\n if (!internalProps.subTableCheckboxStates) {\r\n internalProps.subTableCheckboxStates = new Map();\r\n }\r\n const subTableState: SubTableCheckboxState = {\r\n checkedState: Object.fromEntries(\r\n Array.from(subTable.stateManager.checkedState.entries()).map(([recordKey, fieldStates]) => [\r\n recordKey,\r\n { ...fieldStates }\r\n ])\r\n ),\r\n headerCheckedState: { ...subTable.stateManager.headerCheckedState }\r\n };\r\n internalProps.subTableCheckboxStates.set(bodyRowIndex, subTableState);\r\n }\r\n\r\n /**\r\n * 恢复子表的checkbox状态\r\n * 先恢复之前保存的状态,然后根据enableCheckboxCascade决定是否应用父表状态覆盖\r\n */\r\n private restoreSubTableCheckboxState(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n const internalProps = getInternalProps(this.table);\r\n let savedState = internalProps.subTableCheckboxStates?.get(bodyRowIndex);\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n if (!savedState) {\r\n savedState = {\r\n checkedState: {},\r\n headerCheckedState: {}\r\n };\r\n }\r\n\r\n // 恢复保存的状态到子表状态管理器\r\n if (savedState.checkedState) {\r\n Object.keys(savedState.checkedState).forEach(recordKey => {\r\n const fieldStates = savedState.checkedState[recordKey];\r\n subTable.stateManager.checkedState.set(recordKey, fieldStates);\r\n });\r\n }\r\n if (savedState.headerCheckedState) {\r\n Object.keys(savedState.headerCheckedState).forEach(field => {\r\n subTable.stateManager.headerCheckedState[field] = savedState.headerCheckedState[field];\r\n });\r\n }\r\n\r\n // 如果启用了checkbox级联,应用父表状态覆盖子表状态\r\n if (this.enableCheckboxCascade) {\r\n const parentRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const parentRecord = getRecordByRowIndex(this.table, bodyRowIndex);\r\n if (parentRecord && this.table.stateManager) {\r\n const parentDataIndex = this.table.getRecordIndexByCell(0, parentRowIndex);\r\n if (parentDataIndex !== undefined && parentDataIndex !== null) {\r\n const parentIndexKey = parentDataIndex.toString();\r\n const parentCheckedStates = this.table.stateManager.checkedState.get(parentIndexKey);\r\n if (parentCheckedStates) {\r\n Object.keys(parentCheckedStates).forEach(field => {\r\n const parentState = parentCheckedStates[field];\r\n if (parentState === true || parentState === false) {\r\n subTable.stateManager.headerCheckedState[field] = parentState;\r\n const records = subTable.records || [];\r\n records.forEach((record, recordIndex) => {\r\n const indexKey = recordIndex.toString();\r\n let recordStates = subTable.stateManager.checkedState.get(indexKey);\r\n if (!recordStates) {\r\n recordStates = {};\r\n subTable.stateManager.checkedState.set(indexKey, recordStates);\r\n }\r\n recordStates[field] = parentState;\r\n (record as Record<string, unknown>)[field] = parentState;\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 使用安全的定时器管理\r\n this.safeSetTimeout(() => {\r\n this.updateSubTableCheckboxVisualState(subTable);\r\n }, 0);\r\n }\r\n\r\n private safeSetTimeout(callback: () => void, delay: number): NodeJS.Timeout {\r\n const id = setTimeout(() => {\r\n this.timers.delete(id);\r\n try {\r\n callback();\r\n } catch (error) {\r\n console.warn('Timer callback error:', error);\r\n }\r\n }, delay);\r\n this.timers.add(id);\r\n return id;\r\n }\r\n /**\r\n * 清理所有定时器\r\n */\r\n private cleanupAllTimers(): void {\r\n this.timers.forEach(id => clearTimeout(id));\r\n this.timers.clear();\r\n }\r\n /**\r\n * 更新子表checkbox的视觉状态\r\n */\r\n private updateSubTableCheckboxVisualState(subTable: VTable.ListTable, savedState?: SubTableCheckboxState): void {\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n\r\n // 如果提供了保存的状态,使用保存的状态;否则使用当前状态管理器中的状态\r\n const headerStates = savedState?.headerCheckedState || subTable.stateManager.headerCheckedState;\r\n const recordStates = savedState?.checkedState || {};\r\n\r\n // 更新表头checkbox视觉状态\r\n Object.keys(headerStates).forEach(field => {\r\n const headerState = headerStates[field];\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol !== -1) {\r\n const headerRow = 0;\r\n if (subTable.isHeader(checkboxCol, headerRow)) {\r\n subTable.scenegraph.updateHeaderCheckboxCellState(checkboxCol, headerRow, headerState);\r\n }\r\n }\r\n });\r\n\r\n // 更新body区域checkbox视觉状态\r\n if (savedState?.checkedState) {\r\n // 使用保存的状态\r\n Object.keys(recordStates).forEach(recordKey => {\r\n const fieldStates = recordStates[recordKey];\r\n const recordIndex = Number(recordKey);\r\n Object.keys(fieldStates).forEach(field => {\r\n const checkboxState = fieldStates[field];\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol !== -1) {\r\n // 查找对应的行\r\n for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {\r\n const dataIndex = subTable.getRecordIndexByCell(checkboxCol, row);\r\n if (dataIndex === recordIndex) {\r\n setCellCheckboxStateByAttribute(checkboxCol, row, checkboxState, subTable);\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n } else {\r\n // 使用状态管理器中的状态\r\n subTable.stateManager.checkedState.forEach((fieldStates, recordKey) => {\r\n const recordIndex = Number(recordKey);\r\n Object.keys(fieldStates).forEach(field => {\r\n const checkboxState = fieldStates[field];\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol !== -1) {\r\n // 查找对应的行\r\n for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {\r\n const dataIndex = subTable.getRecordIndexByCell(checkboxCol, row);\r\n if (dataIndex === recordIndex) {\r\n setCellCheckboxStateByAttribute(checkboxCol, row, checkboxState, subTable);\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 渲染子表\r\n *\r\n * 为指定的主表行创建并渲染子表实例。这是子表管理器的核心方法,包含以下步骤:\r\n * 1. 获取记录数据和详细配置\r\n * 2. 创建子表实例并设置配置选项\r\n * 3. 配置子表的视图区域(viewBox)和样式\r\n * 4. 设置滚动隔离和选中状态管理\r\n * 5. 恢复子表的复选框状态\r\n * 6. 将子表添加到主表的场景图中\r\n *\r\n * @param bodyRowIndex - 主表body区域的行索引\r\n * @param childrenData - 子表的数据数组\r\n * @param getDetailConfig - 获取详细配置的回调函数\r\n */\r\n renderSubTable(\r\n bodyRowIndex: number,\r\n childrenData: unknown[],\r\n getDetailConfig: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null\r\n ): void {\r\n const internalProps = getInternalProps(this.table);\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n if (!record) {\r\n return;\r\n }\r\n // 如果没有子数据,不渲染子表\r\n if (!childrenData || childrenData.length === 0) {\r\n return;\r\n }\r\n const detailConfig = getDetailConfig(record, bodyRowIndex);\r\n const childViewBox = this.calculateSubTableViewBox(bodyRowIndex, detailConfig);\r\n if (!childViewBox) {\r\n return;\r\n }\r\n const containerWidth = childViewBox.x2 - childViewBox.x1;\r\n const containerHeight = childViewBox.y2 - childViewBox.y1;\r\n // 创建子表配置,首先使用父表的重要属性作为基础\r\n const parentOptions = (this.table as { options: VTable.ListTableConstructorOptions }).options;\r\n const baseSubTableOptions: VTable.ListTableConstructorOptions = {\r\n viewBox: childViewBox,\r\n canvas: this.table.canvas,\r\n records: childrenData,\r\n columns: detailConfig?.columns || [],\r\n widthMode: 'adaptive',\r\n showHeader: true,\r\n canvasWidth: containerWidth,\r\n canvasHeight: containerHeight,\r\n // 继承父表的theme\r\n theme: parentOptions.theme\r\n };\r\n const { style: _style, ...userDetailConfig } = detailConfig || {};\r\n const subTableOptions = {\r\n ...baseSubTableOptions,\r\n ...userDetailConfig\r\n };\r\n const subTable = new VTable.ListTable(this.table.container, subTableOptions);\r\n internalProps.subTableInstances.set(bodyRowIndex, subTable);\r\n\r\n // 恢复子表的checkbox状态(如果之前有保存的状态)\r\n this.restoreSubTableCheckboxState(bodyRowIndex, subTable);\r\n // 确保子表内容在父表重绘后保持在上层\r\n const afterRenderHandler = () => {\r\n if (internalProps.subTableInstances && internalProps.subTableInstances.has(bodyRowIndex)) {\r\n subTable.render();\r\n }\r\n };\r\n this.table.on('after_render', afterRenderHandler);\r\n (subTable as VTable.ListTable & { __afterRenderHandler: () => void }).__afterRenderHandler = afterRenderHandler;\r\n this.setupScrollEventIsolation(subTable);\r\n this.setupUnifiedSelectionManagement(bodyRowIndex, subTable);\r\n this.setupSubTableCanvasClipping(subTable, bodyRowIndex);\r\n this.setupAntiFlickerMechanism(subTable);\r\n // 设置子表事件监听\r\n this.setupSubTableEventForwarding(bodyRowIndex, subTable);\r\n subTable.render();\r\n }\r\n\r\n // 缓存列范围计算结果\r\n private columnRangeCache: { startCol: number; endCol: number } | null = null;\r\n\r\n /**\r\n * 获取列范围\r\n */\r\n private getColumnRange(): { startCol: number; endCol: number } | null {\r\n if (this.columnRangeCache) {\r\n return this.columnRangeCache;\r\n }\r\n\r\n const frozenColCount = this.table.frozenColCount || 0;\r\n const rightFrozenColCount = this.table.rightFrozenColCount || 0;\r\n const totalColCount = this.table.colCount;\r\n let startCol = frozenColCount;\r\n let endCol = totalColCount - rightFrozenColCount - 1;\r\n // 如果没有冻结列,则使用全部列\r\n if (frozenColCount === 0 && rightFrozenColCount === 0) {\r\n startCol = 0;\r\n endCol = totalColCount - 1;\r\n }\r\n // 确保列索引有效\r\n if (startCol >= totalColCount || endCol < startCol) {\r\n return null;\r\n }\r\n\r\n this.columnRangeCache = { startCol, endCol };\r\n return this.columnRangeCache;\r\n }\r\n\r\n /**\r\n * 计算子表的viewBox区域\r\n */\r\n private calculateSubTableViewBox(\r\n bodyRowIndex: number,\r\n detailConfig?: DetailTableOptions | null,\r\n height?: number\r\n ): { x1: number; y1: number; x2: number; y2: number } | null {\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const detailRowRect = this.table.getCellRangeRelativeRect({ col: 0, row: rowIndex });\r\n if (!detailRowRect) {\r\n return null;\r\n }\r\n const internalProps = getInternalProps(this.table);\r\n const originalHeight = internalProps.originalRowHeights?.get(bodyRowIndex) || 0;\r\n const columnRange = this.getColumnRange();\r\n if (!columnRange) {\r\n return null;\r\n }\r\n const { startCol, endCol } = columnRange;\r\n const firstColRect = this.table.getCellRangeRelativeRect({ col: startCol, row: rowIndex });\r\n const lastColRect = this.table.getCellRangeRelativeRect({ col: endCol, row: rowIndex });\r\n if (!firstColRect || !lastColRect) {\r\n return null;\r\n }\r\n // 解析margin配置 [上, 右, 下, 左]\r\n const [marginTop, marginRight, marginBottom, marginLeft] = parseMargin(detailConfig?.style?.margin);\r\n const configHeight = height ? height : detailConfig?.style?.height || 300;\r\n // 如果配置的高度小于垂直margin总和,则不渲染子表\r\n if (configHeight <= marginTop + marginBottom) {\r\n return {\r\n x1: firstColRect.left + marginLeft,\r\n y1: detailRowRect.top + originalHeight,\r\n x2: lastColRect.right - marginRight,\r\n y2: detailRowRect.top + originalHeight\r\n };\r\n }\r\n const viewBox = {\r\n x1: firstColRect.left + marginLeft,\r\n y1: detailRowRect.top + originalHeight + marginTop,\r\n x2: lastColRect.right - marginRight,\r\n y2: detailRowRect.top + originalHeight - marginBottom + configHeight\r\n };\r\n // 确保viewBox有效\r\n if (viewBox.x2 <= viewBox.x1 || viewBox.y2 <= viewBox.y1) {\r\n return null;\r\n }\r\n return viewBox;\r\n }\r\n\r\n /**\r\n * 移除子表\r\n */\r\n removeSubTable(bodyRowIndex: number): void {\r\n const internalProps = getInternalProps(this.table);\r\n const subTable = internalProps.subTableInstances?.get(bodyRowIndex);\r\n if (subTable) {\r\n // 在删除子表前,保存其checkbox状态\r\n this.saveSubTableCheckboxState(bodyRowIndex, subTable);\r\n // 清理所有事件处理器和引用\r\n this.cleanupSubTableEventHandlers(subTable);\r\n // 释放子表资源\r\n if (typeof subTable.release === 'function') {\r\n try {\r\n subTable.release();\r\n } catch (error) {\r\n console.warn('Failed to release sub table:', error);\r\n }\r\n }\r\n internalProps.subTableInstances.delete(bodyRowIndex);\r\n }\r\n }\r\n\r\n /**\r\n * 清理子表的事件处理器和引用\r\n */\r\n private cleanupSubTableEventHandlers(subTable: VTable.ListTable): void {\r\n // 清理事件转发处理器\r\n this.cleanupSubTableEventForwarding(subTable);\r\n\r\n // 清理after_render事件处理器\r\n const afterRenderHandler = (subTable as VTable.ListTable & { __afterRenderHandler?: () => void })\r\n .__afterRenderHandler;\r\n if (afterRenderHandler) {\r\n this.table.off('after_render', afterRenderHandler);\r\n delete (subTable as VTable.ListTable & { __afterRenderHandler?: () => void }).__afterRenderHandler;\r\n }\r\n\r\n // 清理selection事件处理器\r\n const selectionHandler = (subTable as VTable.ListTable & { __selectionHandler?: () => void }).__selectionHandler;\r\n if (selectionHandler) {\r\n subTable.off('click_cell', selectionHandler);\r\n delete (subTable as VTable.ListTable & { __selectionHandler?: () => void }).__selectionHandler;\r\n }\r\n\r\n // 恢复原始的canvas方法\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __originalRenderMethod?: (...args: unknown[]) => unknown;\r\n __originalDrawMethod?: (...args: unknown[]) => unknown;\r\n __scrollHandler?: (args: unknown) => boolean;\r\n __subTableScrollHandler?: () => boolean;\r\n __clipInterval?: number;\r\n __antiFlickerHandler?: () => void;\r\n };\r\n\r\n // 恢复原始的render和draw方法\r\n if (subTable.scenegraph?.stage?.defaultLayer && extendedSubTable.__originalRenderMethod) {\r\n (subTable.scenegraph.stage.defaultLayer as Record<string, unknown>).render =\r\n extendedSubTable.__originalRenderMethod;\r\n delete extendedSubTable.__originalRenderMethod;\r\n }\r\n\r\n if (subTable.scenegraph?.stage?.defaultLayer && extendedSubTable.__originalDrawMethod) {\r\n (subTable.scenegraph.stage.defaultLayer as Record<string, unknown>).draw = extendedSubTable.__originalDrawMethod;\r\n delete extendedSubTable.__originalDrawMethod;\r\n }\r\n const scrollHandler = extendedSubTable.__scrollHandler;\r\n if (scrollHandler) {\r\n this.table.off('can_scroll', scrollHandler);\r\n delete extendedSubTable.__scrollHandler;\r\n }\r\n\r\n const subTableScrollHandler = extendedSubTable.__subTableScrollHandler;\r\n if (subTableScrollHandler) {\r\n subTable.off('can_scroll', subTableScrollHandler);\r\n delete extendedSubTable.__subTableScrollHandler;\r\n }\r\n\r\n // 清理定时器\r\n const clipInterval = extendedSubTable.__clipInterval;\r\n if (clipInterval) {\r\n clearInterval(clipInterval);\r\n delete extendedSubTable.__clipInterval;\r\n }\r\n\r\n // 清理anti-flicker事件处理器\r\n const antiFlickerHandler = extendedSubTable.__antiFlickerHandler;\r\n if (antiFlickerHandler) {\r\n this.table.off('after_render', antiFlickerHandler);\r\n delete extendedSubTable.__antiFlickerHandler;\r\n }\r\n\r\n // 清理checkbox事件处理器\r\n const checkboxHandler = (extendedSubTable as VTable.ListTable & { __checkboxHandler?: (args: unknown) => void })\r\n .__checkboxHandler;\r\n if (checkboxHandler) {\r\n subTable.off('checkbox_state_change', checkboxHandler);\r\n delete (extendedSubTable as VTable.ListTable & { __checkboxHandler?: (args: unknown) => void }).__checkboxHandler;\r\n }\r\n }\r\n\r\n /**\r\n * 设置滚动事件隔离\r\n */\r\n private setupScrollEventIsolation(subTable: VTable.ListTable): void {\r\n // 检测鼠标是否在子表区域内\r\n const isMouseInChildTableArea = (event: MouseEvent) => {\r\n const rect = this.table.canvas.getBoundingClientRect();\r\n const x = event.clientX - rect.left;\r\n const y = event.clientY - rect.top;\r\n const currentViewBox = (subTable as { options: { viewBox?: { x1: number; y1: number; x2: number; y2: number } } })\r\n .options.viewBox;\r\n if (!currentViewBox) {\r\n return false;\r\n }\r\n const isInArea =\r\n x >= currentViewBox.x1 && x <= currentViewBox.x2 && y >= currentViewBox.y1 && y <= currentViewBox.y2;\r\n return isInArea;\r\n };\r\n\r\n const isSubTableAtBottom = () => {\r\n const totalContentHeight = subTable.getAllRowsHeight();\r\n const viewportHeight = subTable.scenegraph.height;\r\n const scrollTop = subTable.scrollTop;\r\n if (totalContentHeight <= viewportHeight) {\r\n return true;\r\n }\r\n const maxScrollTop = totalContentHeight - viewportHeight;\r\n // 使用小的容差值来处理浮点数精度问题\r\n const isAtBottom = Math.abs(scrollTop - maxScrollTop) <= 1;\r\n return isAtBottom;\r\n };\r\n // 判断子表在滚动边界时是否应该继续滚动\r\n const shouldSubTableScroll = (event: MouseEvent) => {\r\n if (!event || !(event instanceof WheelEvent)) {\r\n return true;\r\n }\r\n const deltaY = event.deltaY;\r\n const isScrollingDown = deltaY > 0;\r\n const isScrollingUp = deltaY < 0;\r\n const currentScrollTop = subTable.scrollTop;\r\n // 如果滚动条在最上面且向上滚动,返回false\r\n if (currentScrollTop <= 0 && isScrollingUp) {\r\n return false;\r\n }\r\n // 如果滚动条在最下面且向下滚动,返回false\r\n if (isSubTableAtBottom() && isScrollingDown) {\r\n return false;\r\n }\r\n // 其他情况允许滚动\r\n return true;\r\n };\r\n let subTableCanScroll = false;\r\n\r\n const handleParentScroll = (parentArgs: unknown) => {\r\n const args = parentArgs as { event?: MouseEvent };\r\n\r\n if (args.event && isMouseInChildTableArea(args.event)) {\r\n // 使用边界检查函数判断子表是否应该滚动\r\n if (shouldSubTableScroll(args.event)) {\r\n subTableCanScroll = true;\r\n return false;\r\n }\r\n subTableCanScroll = false;\r\n return true;\r\n }\r\n subTableCanScroll = false;\r\n return true;\r\n };\r\n this.table.on('can_scroll', handleParentScroll);\r\n\r\n const handleSubTableScroll = (parentArgs: unknown) => {\r\n const args = parentArgs as { event?: MouseEvent };\r\n if (args.event === undefined) {\r\n return true;\r\n }\r\n return subTableCanScroll;\r\n };\r\n\r\n subTable.on('can_scroll', handleSubTableScroll);\r\n\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __scrollHandler?: (args: unknown) => boolean;\r\n __subTableScrollHandler?: (args: unknown) => boolean;\r\n };\r\n extendedSubTable.__scrollHandler = handleParentScroll;\r\n extendedSubTable.__subTableScrollHandler = handleSubTableScroll;\r\n }\r\n\r\n /**\r\n * 设置统一选中状态管理\r\n */\r\n private setupUnifiedSelectionManagement(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n // 这里设置子表的选择事件\r\n const selectionHandler = () => {\r\n this.clearAllSelectionsExcept(bodyRowIndex);\r\n };\r\n subTable.on('click_cell', selectionHandler);\r\n (subTable as VTable.ListTable & { __selectionHandler: () => void }).__selectionHandler = selectionHandler;\r\n }\r\n\r\n /**\r\n * 计算当前行所在分组层级的偏移高度\r\n * @param rowIndex 当前行索引\r\n * @returns 需要偏移的高度(所有父级分组行的高度总和)\r\n */\r\n private calculateGroupLevelOffset(rowIndex: number): number {\r\n try {\r\n // 获取当前行的记录索引和indexKey\r\n const recordIndex = this.table.getRecordShowIndexByCell(0, rowIndex);\r\n const indexKey = this.table.dataSource.getIndexKey(recordIndex);\r\n if (!Array.isArray(indexKey) || indexKey.length <= 1) {\r\n return 0;\r\n }\r\n\r\n let totalOffset = 0;\r\n for (let r = this.table.columnHeaderLevelCount; r < rowIndex; r++) {\r\n try {\r\n const record = this.table.getRecordByCell(0, r);\r\n // 检查是否是分组行\r\n if (record && typeof record === 'object' && 'vtableMergeName' in record) {\r\n const groupRecordIndex = this.table.getRecordShowIndexByCell(0, r);\r\n const groupIndexKey = this.table.dataSource.getIndexKey(groupRecordIndex);\r\n const normalizedGroupKey = Array.isArray(groupIndexKey) ? groupIndexKey : [groupIndexKey];\r\n // 检查这个分组行是否是当前行的祖先\r\n if (this.isAncestorGroup(normalizedGroupKey, indexKey)) {\r\n totalOffset += this.table.getRowHeight(r);\r\n }\r\n }\r\n } catch (e) {\r\n // 忽略单行错误,继续处理\r\n }\r\n }\r\n return totalOffset;\r\n } catch (error) {\r\n return 0;\r\n }\r\n }\r\n\r\n /**\r\n * 检查分组是否是目标行的祖先分组\r\n * @param groupKey 分组的indexKey\r\n * @param targetKey 目标行的indexKey\r\n * @returns 是否是祖先关系\r\n */\r\n private isAncestorGroup(groupKey: number[], targetKey: number[]): boolean {\r\n // 祖先分组的层级必须小于目标行的层级\r\n if (groupKey.length >= targetKey.length) {\r\n return false;\r\n }\r\n // 检查前缀是否匹配\r\n for (let i = 0; i < groupKey.length; i++) {\r\n if (groupKey[i] !== targetKey[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * 设置子表canvas裁剪,实现真正的clip截断效果\r\n */\r\n private setupSubTableCanvasClipping(subTable: VTable.ListTable, bodyRowIndex: number): void {\r\n // 获取子表的渲染stage\r\n if (!subTable.scenegraph?.stage) {\r\n return;\r\n }\r\n const stage = subTable.scenegraph.stage;\r\n // 存储原始方法的引用,以便后续恢复\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __originalRenderMethod?: (...args: unknown[]) => unknown;\r\n __originalDrawMethod?: (...args: unknown[]) => unknown;\r\n };\r\n // 计算裁剪区域的函数\r\n const calculateClipRegion = () => {\r\n try {\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const frozenRowsHeight = this.table.getFrozenRowsHeight();\r\n const frozenColsWidth = this.table.getFrozenColsWidth();\r\n const rightFrozenColsWidth = this.table.getRightFrozenColsWidth();\r\n const bottomFrozenRowsHeight = this.table.getBottomFrozenRowsHeight();\r\n const tableWidth = this.table.tableNoFrameWidth;\r\n const tableHeight = this.table.tableNoFrameHeight;\r\n const isFrozenDataRow = rowIndex < this.table.frozenRowCount && rowIndex >= this.table.columnHeaderLevelCount;\r\n const isBottomFrozenDataRow = rowIndex >= this.table.rowCount - this.table.bottomFrozenRowCount;\r\n\r\n // 计算当前子表所在分组的层级偏移\r\n const groupLevelOffset = this.calculateGroupLevelOffset(rowIndex);\r\n\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n const detailConfig =\r\n record && this.getDetailConfigForRecord ? this.getDetailConfigForRecord(record, bodyRowIndex) : null;\r\n const [, marginRight, , marginLeft] = parseMargin(detailConfig?.style?.margin);\r\n const clipX = frozenColsWidth + marginLeft;\r\n let clipY = 0;\r\n const clipWidth = tableWidth - frozenColsWidth - rightFrozenColsWidth - marginLeft / 2 - marginRight / 2;\r\n let clipHeight = tableHeight;\r\n if (isFrozenDataRow) {\r\n clipY = groupLevelOffset;\r\n clipHeight = tableHeight - bottomFrozenRowsHeight - groupLevelOffset;\r\n } else if (isBottomFrozenDataRow) {\r\n clipY = groupLevelOffset;\r\n clipHeight = tableHeight - groupLevelOffset;\r\n } else {\r\n clipY = frozenRowsHeight + groupLevelOffset;\r\n clipHeight = tableHeight - frozenRowsHeight - bottomFrozenRowsHeight - groupLevelOffset;\r\n }\r\n return { clipX, clipY, clipWidth, clipHeight };\r\n } catch (error) {\r\n return null;\r\n }\r\n };\r\n // 获取canvas context\r\n const window = stage.window;\r\n if (!window || typeof window.getContext !== 'function') {\r\n return;\r\n }\r\n const context = window.getContext();\r\n if (!context) {\r\n return;\r\n }\r\n const wrapRenderMethod = (obj: Record<string, unknown>, methodName: string, originalMethodKey: string) => {\r\n const originalMethod = obj[methodName] as (...args: unknown[]) => unknown;\r\n if (typeof originalMethod === 'function') {\r\n // 存储原始方法\r\n (extendedSubTable as unknown as Record<string, unknown>)[originalMethodKey] = originalMethod;\r\n obj[methodName] = function (...args: unknown[]) {\r\n context.save();\r\n try {\r\n const clipRegion = calculateClipRegion();\r\n if (clipRegion && clipRegion.clipWidth > 0 && clipRegion.clipHeight > 0) {\r\n const dpr =\r\n (window as { dpr?: number; devicePixelRatio?: number }).dpr ||\r\n (window as { dpr?: number; devicePixelRatio?: number }).devicePixelRatio ||\r\n 1;\r\n context.beginPath();\r\n context.rect(\r\n clipRegion.clipX * dpr,\r\n clipRegion.clipY * dpr,\r\n clipRegion.clipWidth * dpr,\r\n clipRegion.clipHeight * dpr\r\n );\r\n context.clip();\r\n }\r\n return originalMethod.apply(this, args);\r\n } finally {\r\n context.restore();\r\n }\r\n };\r\n }\r\n };\r\n if (stage.defaultLayer) {\r\n wrapRenderMethod(stage.defaultLayer, 'render', '__originalRenderMethod');\r\n wrapRenderMethod(stage.defaultLayer, 'draw', '__originalDrawMethod');\r\n }\r\n }\r\n\r\n private setupAntiFlickerMechanism(subTable: VTable.ListTable): void {\r\n try {\r\n const originalUpdateNextFrame = (subTable as unknown as { scenegraph?: { updateNextFrame?: () => void } })\r\n .scenegraph?.updateNextFrame;\r\n if (!originalUpdateNextFrame) {\r\n return;\r\n }\r\n const parentTable = this.table;\r\n const syncRender = () => {\r\n if (subTable && originalUpdateNextFrame) {\r\n originalUpdateNextFrame.call((subTable as unknown as { scenegraph: unknown }).scenegraph);\r\n }\r\n };\r\n parentTable.on('after_render', syncRender);\r\n const extendedSubTable = subTable as VTable.ListTable & {\r\n __antiFlickerHandler?: () => void;\r\n };\r\n extendedSubTable.__antiFlickerHandler = syncRender;\r\n } catch (error) {\r\n console.warn('Failed to setup anti-flicker mechanism:', error);\r\n }\r\n }\r\n\r\n updateSubTablePositionsForRowResize(): void {\r\n const internalProps = getInternalProps(this.table);\r\n if (!internalProps.subTableInstances) {\r\n return;\r\n }\r\n internalProps.subTableInstances.forEach((subTable, bodyRowIndex) => {\r\n try {\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const scenegraph = this.table.scenegraph;\r\n let cellGroup: { attribute?: { height?: number } } | null = null;\r\n if (scenegraph && typeof scenegraph.highPerformanceGetCell === 'function') {\r\n cellGroup = scenegraph.highPerformanceGetCell(0, rowIndex);\r\n } else if (scenegraph && typeof scenegraph.getCell === 'function') {\r\n cellGroup = scenegraph.getCell(0, rowIndex);\r\n }\r\n const cellHeight: number =\r\n cellGroup && cellGroup.attribute && typeof cellGroup.attribute.height === 'number'\r\n ? cellGroup.attribute.height\r\n : -1;\r\n if (internalProps.originalRowHeights && typeof cellHeight === 'number' && cellHeight !== -1) {\r\n internalProps.originalRowHeights.set(bodyRowIndex, cellHeight);\r\n }\r\n } catch (e) {\r\n // 保持原有逻辑继续执行\r\n }\r\n });\r\n this.recalculateAllSubTablePositions();\r\n }\r\n\r\n /**\r\n * 重新计算子表位置\r\n * @param start 开始的bodyRowIndex,默认为最小值\r\n * @param end 结束的bodyRowIndex,默认为最大值\r\n */\r\n recalculateAllSubTablePositions(\r\n start?: number,\r\n end?: number,\r\n getDetailConfig?: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null\r\n ): void {\r\n // 清理列范围缓存,确保使用最新的列宽度信息\r\n this.columnRangeCache = null;\r\n const internalProps = getInternalProps(this.table);\r\n internalProps.subTableInstances?.forEach((subTable, bodyRowIndex) => {\r\n // 如果指定了范围,只处理范围内的子表\r\n if (start !== undefined && bodyRowIndex < start) {\r\n return;\r\n }\r\n if (end !== undefined && bodyRowIndex > end) {\r\n return;\r\n }\r\n // 获取记录和配置\r\n const record = getRecordByRowIndex(this.table, bodyRowIndex);\r\n const detailConfig = getDetailConfig\r\n ? getDetailConfig(record, bodyRowIndex)\r\n : this.getDetailConfigForRecord\r\n ? this.getDetailConfigForRecord(record, bodyRowIndex)\r\n : null;\r\n\r\n // 重新计算子表的 viewBox\r\n const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n const originalHeight = internalProps.originalRowHeights?.get(bodyRowIndex) || 0;\r\n const currentRowHeight = this.table.getRowHeight(rowIndex);\r\n const detailHeight = currentRowHeight - originalHeight;\r\n const newViewBox = this.calculateSubTableViewBox(bodyRowIndex, detailConfig, detailHeight);\r\n if (newViewBox) {\r\n const newContainerWidth = newViewBox.x2 - newViewBox.x1;\r\n const newContainerHeight = newViewBox.y2 - newViewBox.y1;\r\n (subTable as { options: { viewBox?: { x1: number; y1: number; x2: number; y2: number } } }).options.viewBox =\r\n newViewBox;\r\n const subTableOptions = subTable.options as VTable.ListTableConstructorOptions;\r\n if (subTableOptions.canvasWidth !== newContainerWidth || subTableOptions.canvasHeight !== newContainerHeight) {\r\n subTableOptions.canvasWidth = newContainerWidth;\r\n subTableOptions.canvasHeight = newContainerHeight;\r\n subTable.resize();\r\n }\r\n if (subTable.scenegraph?.stage) {\r\n (subTable.scenegraph.stage as { setViewBox: (viewBox: unknown, flag: boolean) => void }).setViewBox(\r\n newViewBox,\r\n false\r\n );\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 清理所有子表\r\n */\r\n cleanup(): void {\r\n if (!this.table) {\r\n return;\r\n }\r\n // 首先清理所有定时器\r\n this.cleanupAllTimers();\r\n const internalProps = getInternalProps(this.table);\r\n if (internalProps && internalProps.subTableInstances) {\r\n internalProps.subTableInstances.forEach((subTable, bodyRowIndex) => {\r\n this.removeSubTable(bodyRowIndex);\r\n });\r\n internalProps.subTableInstances.clear();\r\n }\r\n // 清理缓存\r\n this.columnRangeCache = null;\r\n // 清理回调函数引用,避免循环引用\r\n this.getDetailConfigForRecord = undefined;\r\n // 清理表格引用\r\n (this as unknown as { table: unknown }).table = null;\r\n }\r\n\r\n /**\r\n * 获取所有子表实例\r\n * @returns Map<bodyRowIndex, VTable.ListTable>\r\n */\r\n getAllSubTableInstances(): Map<number, VTable.ListTable> | undefined {\r\n const internalProps = getInternalProps(this.table);\r\n return internalProps.subTableInstances;\r\n }\r\n\r\n /**\r\n * 根据bodyRowIndex获取指定的子表实例\r\n * @param bodyRowIndex body行索引\r\n * @returns 子表实例,如果不存在则返回null\r\n */\r\n getSubTableInstance(bodyRowIndex: number): VTable.ListTable | null {\r\n const internalProps = getInternalProps(this.table);\r\n return internalProps.subTableInstances?.get(bodyRowIndex) || null;\r\n }\r\n\r\n private getDetailConfigForRecord?: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null;\r\n\r\n /**\r\n * 设置回调函数\r\n */\r\n setCallbacks(callbacks: {\r\n getDetailConfigForRecord?: (record: unknown, bodyRowIndex: number) => DetailTableOptions | null;\r\n }): void {\r\n this.getDetailConfigForRecord = callbacks.getDetailConfigForRecord;\r\n }\r\n\r\n /**\r\n * 设置子表事件转发\r\n */\r\n private setupSubTableEventForwarding(bodyRowIndex: number, subTable: VTable.ListTable): void {\r\n const masterRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n Object.values(VTable.TABLE_EVENT_TYPE).forEach(eventType => {\r\n if (eventType) {\r\n const handler = (...args: unknown[]) => {\r\n this.forwardSubTableEvent(eventType, bodyRowIndex, masterRowIndex, subTable, args);\r\n };\r\n\r\n subTable.on(eventType, handler);\r\n\r\n // 保存处理器引用以便后续清理\r\n const subTableWithHandlers = subTable as unknown as { __eventHandlers?: Map<string, unknown[]> };\r\n if (!subTableWithHandlers.__eventHandlers) {\r\n subTableWithHandlers.__eventHandlers = new Map();\r\n }\r\n const handlers = subTableWithHandlers.__eventHandlers;\r\n if (!handlers.has(eventType)) {\r\n handlers.set(eventType, []);\r\n }\r\n handlers.get(eventType)?.push(handler);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 转发子表事件到主表\r\n */\r\n private forwardSubTableEvent(\r\n eventType: string,\r\n bodyRowIndex: number,\r\n masterRowIndex: number,\r\n subTable: VTable.ListTable,\r\n originalArgs: unknown[]\r\n ): void {\r\n // 构建子表事件信息,直接使用VTable原生事件类型\r\n const subTableEventInfo: SubTableEventInfo = {\r\n eventType: eventType as keyof typeof VTable.TABLE_EVENT_TYPE,\r\n masterBodyRowIndex: bodyRowIndex,\r\n masterRowIndex: masterRowIndex,\r\n subTable: subTable,\r\n originalEventArgs: originalArgs\r\n };\r\n // 直接触发到主表的插件事件\r\n this.table.fireListeners(VTable.TABLE_EVENT_TYPE.PLUGIN_EVENT, {\r\n plugin: { name: 'Master Detail Plugin' },\r\n event: originalArgs[0], // 原始事件对象\r\n pluginEventInfo: subTableEventInfo\r\n });\r\n }\r\n\r\n /**\r\n * 直接清除主表选中\r\n */\r\n private clearMainTableSelectionInternal(): void {\r\n if (typeof (this.table as { clearSelected?: () => void }).clearSelected === 'function') {\r\n (this.table as { clearSelected: () => void }).clearSelected();\r\n }\r\n }\r\n\r\n /**\r\n * 清除除指定子表外的所有选中状态\r\n */\r\n private clearAllSelectionsExcept(exceptRecordIndex: number): void {\r\n // 清除父表选中状态\r\n this.clearMainTableSelectionInternal();\r\n // 清除其他子表的选中状态\r\n const internalProps = getInternalProps(this.table);\r\n internalProps.subTableInstances?.forEach((subTable, rowIndex) => {\r\n if (\r\n rowIndex !== exceptRecordIndex &&\r\n subTable &&\r\n typeof (subTable as { clearSelected?: () => void }).clearSelected === 'function'\r\n ) {\r\n (subTable as { clearSelected: () => void }).clearSelected();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 清理子表事件转发\r\n */\r\n private cleanupSubTableEventForwarding(subTable: VTable.ListTable): void {\r\n const subTableWithHandlers = subTable as unknown as { __eventHandlers?: Map<string, unknown[]> };\r\n if (subTableWithHandlers.__eventHandlers) {\r\n // 移除所有事件监听器\r\n for (const [eventType, handlers] of subTableWithHandlers.__eventHandlers) {\r\n for (const handler of handlers) {\r\n subTable.off(eventType, handler as (...args: unknown[]) => void);\r\n }\r\n }\r\n // 清理引用\r\n delete subTableWithHandlers.__eventHandlers;\r\n }\r\n }\r\n}\r\n"]}
|