@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/master-detail-plugin/checkbox.ts"],"names":[],"mappings":"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","file":"checkbox.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\r\nimport { getInternalProps, findCheckboxColumnIndex, setCellCheckboxStateByAttribute } from './utils';\r\n/**\r\n * 设置主从表checkbox联动功能\r\n */\r\nexport function bindMasterDetailCheckboxChange(\r\n table: VTable.ListTable,\r\n eventManager: { isRowExpanded: (row: number) => boolean; getExpandedRows: () => number[] }\r\n): () => void {\r\n const checkboxChangeHandler = (args: unknown) => {\r\n const { col, row, checked, field } = args as { col: number; row: number; checked: boolean; field: string };\r\n\r\n // 主表表头checkbox变化:同步更新所有已展开子表的对应字段\r\n if (table.isHeader(col, row)) {\r\n const internalProps = getInternalProps(table);\r\n const expandedRows = eventManager.getExpandedRows();\r\n expandedRows.forEach(expandedRow => {\r\n const bodyRowIndex = expandedRow - table.columnHeaderLevelCount;\r\n const subTableInstance = internalProps.subTableInstances?.get(bodyRowIndex);\r\n if (subTableInstance && field) {\r\n const fieldStr = typeof field === 'string' ? field : String(field);\r\n updateAllSubTableCheckboxes(subTableInstance, fieldStr, checked);\r\n }\r\n });\r\n return;\r\n }\r\n\r\n // 主表body行checkbox变化:如果该行已展开,则更新对应子表的所有checkbox\r\n const rowIndex = row;\r\n if (!eventManager.isRowExpanded(rowIndex)) {\r\n return;\r\n }\r\n const bodyRowIndex = row - table.columnHeaderLevelCount;\r\n const internalProps = getInternalProps(table);\r\n const subTableInstance = internalProps.subTableInstances?.get(bodyRowIndex);\r\n if (subTableInstance && field) {\r\n const fieldStr = typeof field === 'string' ? field : String(field);\r\n updateAllSubTableCheckboxes(subTableInstance, fieldStr, checked);\r\n }\r\n };\r\n\r\n // 增强主表的updateHeaderCheckedState方法,添加indeterminate状态处理\r\n const originalUpdateHeaderCheckedState = table.stateManager.updateHeaderCheckedState;\r\n table.stateManager.updateHeaderCheckedState = function (\r\n field: string | number,\r\n col: number,\r\n row: number\r\n ): boolean | 'indeterminate' {\r\n const stateManager = this;\r\n let allChecked = true;\r\n let allUnChecked = true;\r\n let hasChecked = false;\r\n let hasIndeterminate = false;\r\n\r\n stateManager.checkedState.forEach(\r\n (check_state: Record<string | number, boolean | 'indeterminate'>, index: string | number | number[]) => {\r\n if ((index as string).includes(',')) {\r\n index = (index as string).split(',').map(item => {\r\n return Number(item);\r\n }) as number[];\r\n } else {\r\n index = Number(index);\r\n }\r\n const tableIndex = stateManager.table.getTableIndexByRecordIndex(index as number);\r\n const mergeCell = (stateManager.table as VTable.ListTable).transpose\r\n ? stateManager.table.getCustomMerge(tableIndex, row)\r\n : stateManager.table.getCustomMerge(col, tableIndex);\r\n\r\n const data = stateManager.table.dataSource?.get(index as number);\r\n if (mergeCell || (!stateManager.table.internalProps.enableCheckboxCascade && data?.vtableMerge)) {\r\n // 不参与check状态的计算\r\n return;\r\n }\r\n\r\n const checkValue = check_state?.[field];\r\n // 主从表特判:处理indeterminate状态\r\n if (checkValue === 'indeterminate') {\r\n hasIndeterminate = true;\r\n hasChecked = true;\r\n allChecked = false;\r\n allUnChecked = false;\r\n } else if (checkValue !== true) {\r\n allChecked = false;\r\n } else {\r\n allUnChecked = false;\r\n hasChecked = true;\r\n }\r\n }\r\n );\r\n\r\n let result: boolean | 'indeterminate';\r\n if (hasIndeterminate) {\r\n result = 'indeterminate';\r\n } else if (allChecked) {\r\n result = true;\r\n } else if (allUnChecked) {\r\n result = false;\r\n } else if (hasChecked) {\r\n result = 'indeterminate';\r\n } else {\r\n result = false;\r\n }\r\n stateManager.headerCheckedState[field] = result;\r\n return result;\r\n };\r\n\r\n // 绑定主表复选框状态变化事件\r\n table.on('checkbox_state_change', checkboxChangeHandler);\r\n // 绑定子表复选框事件,实现反向联动\r\n const subTableCleanup = bindSubTableCheckboxEvents(table);\r\n // 返回清理函数,用于移除所有事件监听器和恢复原始方法\r\n return () => {\r\n table.off('checkbox_state_change', checkboxChangeHandler);\r\n // 恢复原始的updateHeaderCheckedState方法\r\n table.stateManager.updateHeaderCheckedState = originalUpdateHeaderCheckedState;\r\n subTableCleanup();\r\n };\r\n}\r\n\r\n/**\r\n * 绑定子表checkbox事件,实现子表到主表的反向联动\r\n */\r\nfunction bindSubTableCheckboxEvents(table: VTable.ListTable): () => void {\r\n const internalProps = getInternalProps(table);\r\n const originalSet = internalProps.subTableInstances.set;\r\n if (originalSet && internalProps.subTableInstances) {\r\n internalProps.subTableInstances.set = function (key: number, subTable: VTable.ListTable) {\r\n const result = originalSet.call(this, key, subTable);\r\n // 为新创建的子表绑定checkbox事件\r\n const checkboxHandler = (args: unknown) => {\r\n const { field } = args as { col: number; row: number; checked: boolean; field: string };\r\n updateMainTableRowCheckboxFromSubTable(table, subTable, key, field as string);\r\n };\r\n subTable.on('checkbox_state_change', checkboxHandler);\r\n const extendedSubTable = subTable as VTable.ListTable & { __checkboxHandler?: (args: unknown) => void };\r\n extendedSubTable.__checkboxHandler = checkboxHandler;\r\n return result;\r\n };\r\n // 返回清理函数\r\n return () => {\r\n if (internalProps.subTableInstances && originalSet) {\r\n internalProps.subTableInstances.set = originalSet;\r\n }\r\n };\r\n }\r\n // 如果没有设置成功,返回空的清理函数\r\n return () => {\r\n //\r\n };\r\n}\r\n\r\n/**\r\n * 根据子表状态更新主表对应展开行的checkbox状态\r\n */\r\nfunction updateMainTableRowCheckboxFromSubTable(\r\n mainTable: VTable.ListTable,\r\n subTable: VTable.ListTable,\r\n subTableKey: number,\r\n field: string\r\n) {\r\n // 将bodyRowIndex转换为主表rowIndex\r\n const mainTableRow = subTableKey + mainTable.columnHeaderLevelCount;\r\n let subTableState: boolean | 'indeterminate' = false;\r\n const headerState = subTable.stateManager.headerCheckedState[field];\r\n if (headerState !== undefined) {\r\n subTableState = headerState;\r\n }\r\n const mainTableCheckboxCol = findCheckboxColumnIndex(mainTable, field);\r\n if (mainTableCheckboxCol === -1) {\r\n return;\r\n }\r\n // 更新主表对应行的checkbox状态\r\n if (mainTable.stateManager) {\r\n mainTable.stateManager.setCheckedState(mainTableCheckboxCol, mainTableRow, field, subTableState);\r\n const cellType = mainTable.getCellType(mainTableCheckboxCol, mainTableRow);\r\n if (cellType === 'checkbox') {\r\n setCellCheckboxStateByAttribute(mainTableCheckboxCol, mainTableRow, subTableState, mainTable);\r\n }\r\n if (mainTable.internalProps.enableCheckboxCascade) {\r\n const oldHeaderCheckedState = mainTable.stateManager.headerCheckedState[field];\r\n const newHeaderCheckedState = mainTable.stateManager.updateHeaderCheckedState(field, mainTableCheckboxCol, 0);\r\n if (oldHeaderCheckedState !== newHeaderCheckedState) {\r\n const headerRow = 0;\r\n if (mainTable.isHeader(mainTableCheckboxCol, headerRow)) {\r\n mainTable.scenegraph.updateHeaderCheckboxCellState(mainTableCheckboxCol, headerRow, newHeaderCheckedState);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 更新子表的checkbox状态\r\n */\r\nfunction updateAllSubTableCheckboxes(subTable: VTable.ListTable, field: string, checked: boolean): void {\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n // 设置表头状态\r\n subTable.stateManager.headerCheckedState[field] = checked;\r\n const records = subTable.records || [];\r\n records.forEach((record, recordIndex) => {\r\n const indexKey = recordIndex.toString();\r\n (record as Record<string, unknown>)[field] = checked;\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] = checked;\r\n });\r\n // 使用缓存的列索引避免重复查找\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol >= 0) {\r\n subTable.scenegraph.updateHeaderCheckboxCellState(checkboxCol, 0, checked);\r\n for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {\r\n setCellCheckboxStateByAttribute(checkboxCol, row, checked, subTable);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as VTable from '@visactor/vtable';
|
|
2
|
+
import type { DetailTableOptions, MasterDetailPluginOptions } from './types';
|
|
3
|
+
export declare class ConfigManager {
|
|
4
|
+
private pluginOptions;
|
|
5
|
+
private table;
|
|
6
|
+
constructor(pluginOptions: MasterDetailPluginOptions, table: VTable.ListTable);
|
|
7
|
+
private hasChildren;
|
|
8
|
+
injectMasterDetailOptions(options: VTable.ListTableConstructorOptions): void;
|
|
9
|
+
private getDataCount;
|
|
10
|
+
private disableRefreshHierarchyState;
|
|
11
|
+
private setupInitializedListener;
|
|
12
|
+
private processRecordsHierarchyStates;
|
|
13
|
+
getDetailConfigForRecord(record: unknown, bodyRowIndex: number): DetailTableOptions | null;
|
|
14
|
+
private isRowExpanded;
|
|
15
|
+
setRowExpandedChecker(checker: (row: number) => boolean): void;
|
|
16
|
+
release(): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as VTable from "@visactor/vtable";
|
|
2
|
+
|
|
3
|
+
export class ConfigManager {
|
|
4
|
+
constructor(pluginOptions, table) {
|
|
5
|
+
this.pluginOptions = pluginOptions, this.table = table, this.isRowExpanded = () => !1;
|
|
6
|
+
}
|
|
7
|
+
hasChildren(record) {
|
|
8
|
+
if (record && "object" == typeof record && "children" in record) {
|
|
9
|
+
const children = record.children;
|
|
10
|
+
return Array.isArray(children) && children.length > 0;
|
|
11
|
+
}
|
|
12
|
+
return !1;
|
|
13
|
+
}
|
|
14
|
+
injectMasterDetailOptions(options) {
|
|
15
|
+
options.masterDetail = !0, options.customConfig || (options.customConfig = {}),
|
|
16
|
+
options.customConfig.scrollEventAlwaysTrigger = !0;
|
|
17
|
+
const originalCustomComputeRowHeight = options.customComputeRowHeight;
|
|
18
|
+
if (options.customComputeRowHeight = params => {
|
|
19
|
+
var _a;
|
|
20
|
+
const {row: row, table: table} = params;
|
|
21
|
+
if (this.isRowExpanded(row)) {
|
|
22
|
+
const expandedHeight = table.getRowHeight(row);
|
|
23
|
+
return Array.isArray(expandedHeight) ? null !== (_a = expandedHeight[0]) && void 0 !== _a ? _a : "auto" : expandedHeight;
|
|
24
|
+
}
|
|
25
|
+
if (originalCustomComputeRowHeight) {
|
|
26
|
+
const userResult = originalCustomComputeRowHeight(params);
|
|
27
|
+
if (null != userResult) return userResult;
|
|
28
|
+
}
|
|
29
|
+
}, options.columns && options.columns.length > 0) {
|
|
30
|
+
options.columns[0].tree = !0;
|
|
31
|
+
}
|
|
32
|
+
if (this.setupInitializedListener(), this.pluginOptions.detailTableOptions) {
|
|
33
|
+
const detailOptions = this.pluginOptions.detailTableOptions;
|
|
34
|
+
"function" == typeof detailOptions ? options.getDetailGridOptions = detailOptions : options.detailTableOptions = detailOptions;
|
|
35
|
+
}
|
|
36
|
+
this.disableRefreshHierarchyState();
|
|
37
|
+
}
|
|
38
|
+
getDataCount() {
|
|
39
|
+
var _a, _b, _c, _d, _e;
|
|
40
|
+
return this.table.pagination ? null !== (_c = null === (_b = null === (_a = this.table.dataSource) || void 0 === _a ? void 0 : _a.currentPagerIndexedData) || void 0 === _b ? void 0 : _b.length) && void 0 !== _c ? _c : 0 : null !== (_e = null === (_d = this.table.dataSource) || void 0 === _d ? void 0 : _d.sourceLength) && void 0 !== _e ? _e : 0;
|
|
41
|
+
}
|
|
42
|
+
disableRefreshHierarchyState() {
|
|
43
|
+
setTimeout((() => {
|
|
44
|
+
const tableWithPrivateMethod = this.table;
|
|
45
|
+
tableWithPrivateMethod && "function" == typeof tableWithPrivateMethod._refreshHierarchyState && (tableWithPrivateMethod._originalRefreshHierarchyState = tableWithPrivateMethod._refreshHierarchyState,
|
|
46
|
+
tableWithPrivateMethod._refreshHierarchyState = () => {});
|
|
47
|
+
}), 0);
|
|
48
|
+
}
|
|
49
|
+
setupInitializedListener() {
|
|
50
|
+
this.table.on("initialized", (() => {
|
|
51
|
+
const records = this.table.dataSource.records;
|
|
52
|
+
this.processRecordsHierarchyStates(records), this.table.renderWithRecreateCells();
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
processRecordsHierarchyStates(records) {
|
|
56
|
+
const HierarchyState = VTable.TYPES.HierarchyState;
|
|
57
|
+
(recordList => {
|
|
58
|
+
recordList.forEach((record => {
|
|
59
|
+
if (record && "object" == typeof record) {
|
|
60
|
+
const recordObj = record;
|
|
61
|
+
(this.hasChildren(record) || !0 === recordObj.children) && (recordObj.hierarchyState = HierarchyState.collapse);
|
|
62
|
+
}
|
|
63
|
+
}));
|
|
64
|
+
})(records);
|
|
65
|
+
}
|
|
66
|
+
getDetailConfigForRecord(record, bodyRowIndex) {
|
|
67
|
+
const detailOptions = this.pluginOptions.detailTableOptions;
|
|
68
|
+
return detailOptions ? "function" == typeof detailOptions ? detailOptions({
|
|
69
|
+
data: record,
|
|
70
|
+
bodyRowIndex: bodyRowIndex
|
|
71
|
+
}) : detailOptions : null;
|
|
72
|
+
}
|
|
73
|
+
setRowExpandedChecker(checker) {
|
|
74
|
+
this.isRowExpanded = checker;
|
|
75
|
+
}
|
|
76
|
+
release() {
|
|
77
|
+
this.isRowExpanded = () => !1, this.table = null, this.pluginOptions = null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/master-detail-plugin/config.ts"],"names":[],"mappings":"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","file":"config.js","sourcesContent":["import * as VTable from '@visactor/vtable';\r\nimport type { DetailTableOptions, MasterDetailPluginOptions } from './types';\r\n\r\n/**\r\n * 配置注入相关功能\r\n */\r\nexport class ConfigManager {\r\n constructor(private pluginOptions: MasterDetailPluginOptions, private table: VTable.ListTable) {}\r\n\r\n /**\r\n * 检查记录是否有子数据\r\n */\r\n private hasChildren(record: unknown): boolean {\r\n if (record && typeof record === 'object' && 'children' in record) {\r\n const children = record.children;\r\n return Array.isArray(children) && children.length > 0;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 注入主从表配置到表格选项中\r\n */\r\n injectMasterDetailOptions(options: VTable.ListTableConstructorOptions): void {\r\n // 启用主从表基础设施\r\n (options as VTable.ListTableConstructorOptions & { masterDetail: boolean }).masterDetail = true;\r\n if (!options.customConfig) {\r\n options.customConfig = {};\r\n }\r\n // 确保滚动事件始终触发,用于子表位置同步\r\n options.customConfig.scrollEventAlwaysTrigger = true;\r\n const originalCustomComputeRowHeight = options.customComputeRowHeight;\r\n // 这个customComputeRowHeight用来保持展开行的高度\r\n options.customComputeRowHeight = params => {\r\n const { row, table } = params;\r\n if (this.isRowExpanded(row)) {\r\n const expandedHeight = table.getRowHeight(row);\r\n if (Array.isArray(expandedHeight)) {\r\n return expandedHeight[0] ?? 'auto';\r\n }\r\n return expandedHeight as number | 'auto';\r\n }\r\n if (originalCustomComputeRowHeight) {\r\n const userResult = originalCustomComputeRowHeight(params);\r\n if (userResult !== undefined && userResult !== null) {\r\n return userResult;\r\n }\r\n }\r\n };\r\n\r\n // 设置第一列为树形结构,是为什么方便getHierarchyState等的判断,他们需要有tree的配置,这不会导致主从表变为tree的状态,因为在_setRecords的时候会直接强制设置为grid\r\n if (options.columns && options.columns.length > 0) {\r\n const firstColumn = options.columns[0] as VTable.TYPES.ColumnDefine;\r\n firstColumn.tree = true;\r\n }\r\n\r\n // 监听表格初始化完成事件,设置图标\r\n this.setupInitializedListener();\r\n\r\n // 注入子表配置\r\n if (this.pluginOptions.detailTableOptions) {\r\n const detailOptions = this.pluginOptions.detailTableOptions;\r\n // 判断是静态配置还是动态函数\r\n if (typeof detailOptions === 'function') {\r\n // 动态配置:根据数据和行索引返回不同的子表配置\r\n (\r\n options as VTable.ListTableConstructorOptions & {\r\n getDetailGridOptions: (params: { data: unknown; bodyRowIndex: number }) => DetailTableOptions;\r\n }\r\n ).getDetailGridOptions = detailOptions;\r\n } else {\r\n // 静态配置:所有子表使用相同配置\r\n (\r\n options as VTable.ListTableConstructorOptions & { detailTableOptions: DetailTableOptions }\r\n ).detailTableOptions = detailOptions;\r\n }\r\n }\r\n // 禁用 _refreshHierarchyState 方法\r\n this.disableRefreshHierarchyState();\r\n }\r\n\r\n /**\r\n * 获取数据数量\r\n */\r\n private getDataCount(): number {\r\n if (this.table.pagination) {\r\n return this.table.dataSource?.currentPagerIndexedData?.length ?? 0;\r\n }\r\n return this.table.dataSource?.sourceLength ?? 0;\r\n }\r\n\r\n /**\r\n * 禁用VTable的_refreshHierarchyState方法\r\n */\r\n private disableRefreshHierarchyState(): void {\r\n // 延迟执行,确保表格已经创建完成\r\n setTimeout(() => {\r\n const tableWithPrivateMethod = this.table as unknown as {\r\n _refreshHierarchyState?: () => void;\r\n _originalRefreshHierarchyState?: () => void;\r\n };\r\n if (tableWithPrivateMethod && typeof tableWithPrivateMethod._refreshHierarchyState === 'function') {\r\n tableWithPrivateMethod._originalRefreshHierarchyState = tableWithPrivateMethod._refreshHierarchyState;\r\n tableWithPrivateMethod._refreshHierarchyState = () => {\r\n // 禁用_refreshHierarchyState函数\r\n };\r\n }\r\n }, 0);\r\n }\r\n\r\n /**\r\n * 处理图标的显示\r\n */\r\n private setupInitializedListener(): void {\r\n // 监听表格初始化完成事件\r\n this.table.on('initialized', () => {\r\n const records = this.table.dataSource.records;\r\n this.processRecordsHierarchyStates(records);\r\n this.table.renderWithRecreateCells();\r\n });\r\n }\r\n\r\n /**\r\n * 处理图标的显示\r\n */\r\n private processRecordsHierarchyStates(records: unknown[]): void {\r\n const HierarchyState = VTable.TYPES.HierarchyState;\r\n const processRecords = (recordList: unknown[]) => {\r\n recordList.forEach(record => {\r\n if (record && typeof record === 'object') {\r\n const recordObj = record as Record<string, unknown>;\r\n // 处理普通的有子数据的记录\r\n if (this.hasChildren(record)) {\r\n recordObj.hierarchyState = HierarchyState.collapse;\r\n } else if (recordObj.children === true) {\r\n recordObj.hierarchyState = HierarchyState.collapse;\r\n }\r\n }\r\n });\r\n };\r\n processRecords(records);\r\n }\r\n\r\n /**\r\n * 获取详情配置\r\n */\r\n getDetailConfigForRecord(record: unknown, bodyRowIndex: number): DetailTableOptions | null {\r\n const detailOptions = this.pluginOptions.detailTableOptions;\r\n if (!detailOptions) {\r\n return null;\r\n }\r\n // 判断是函数还是静态配置\r\n if (typeof detailOptions === 'function') {\r\n return detailOptions({ data: record, bodyRowIndex: bodyRowIndex });\r\n }\r\n return detailOptions;\r\n }\r\n\r\n private isRowExpanded: (row: number) => boolean = () => false;\r\n\r\n /**\r\n * 设置行展开状态检查函数\r\n */\r\n setRowExpandedChecker(checker: (row: number) => boolean): void {\r\n this.isRowExpanded = checker;\r\n }\r\n\r\n /**\r\n * 释放所有资源和引用\r\n */\r\n release(): void {\r\n this.isRowExpanded = () => false;\r\n // 清理对表格的引用\r\n (this as unknown as { table: VTable.ListTable | null }).table = null;\r\n (this as unknown as { pluginOptions: MasterDetailPluginOptions | null }).pluginOptions = null;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as VTable from '@visactor/vtable';
|
|
2
|
+
import type { MasterDetailPluginOptions } from './types';
|
|
3
|
+
export declare class MasterDetailPlugin implements VTable.plugins.IVTablePlugin {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
runTime: ("sort_click" | "after_sort" | "before_init" | "initialized" | "after_update_cell_content_width" | "after_update_select_border_height")[];
|
|
7
|
+
pluginOptions: MasterDetailPluginOptions;
|
|
8
|
+
table: VTable.ListTable;
|
|
9
|
+
private configManager;
|
|
10
|
+
private eventManager;
|
|
11
|
+
private subTableManager;
|
|
12
|
+
private tableAPIExtensions;
|
|
13
|
+
private resizeObserver?;
|
|
14
|
+
private checkboxCascadeCleanup;
|
|
15
|
+
constructor(pluginOptions?: MasterDetailPluginOptions);
|
|
16
|
+
run(...args: unknown[]): boolean | void;
|
|
17
|
+
private initializeManagers;
|
|
18
|
+
private setupMasterDetailFeatures;
|
|
19
|
+
private mainTableClickHandler?;
|
|
20
|
+
private setupUnifiedSelectionManagement;
|
|
21
|
+
private initCheckboxCascade;
|
|
22
|
+
private initInternalProps;
|
|
23
|
+
private extendTableAPI;
|
|
24
|
+
private updateOriginalHeightsAfterAdaptive;
|
|
25
|
+
private restoreExpandedStatesAfter;
|
|
26
|
+
expandRow(rowIndex: number, colIndex?: number): void;
|
|
27
|
+
collapseRow(rowIndex: number, colIndex?: number): void;
|
|
28
|
+
private collapseRowToNoRealRecordIndex;
|
|
29
|
+
toggleRowExpand(rowIndex: number, colIndex?: number): void;
|
|
30
|
+
private updateRowHeightForExpand;
|
|
31
|
+
private drawUnderlineForRow;
|
|
32
|
+
private getRowCells;
|
|
33
|
+
private addUnderlineToCell;
|
|
34
|
+
private removeUnderlineFromRow;
|
|
35
|
+
private removeUnderlineFromCell;
|
|
36
|
+
private refreshRowIcon;
|
|
37
|
+
update(): void;
|
|
38
|
+
setRecordChildren(children: unknown[], col: number, row: number): void;
|
|
39
|
+
release(): void;
|
|
40
|
+
private clearAllSubTableVisibleSelections;
|
|
41
|
+
getAllSubTableInstances(): Map<number, VTable.ListTable> | null;
|
|
42
|
+
getSubTableByRowIndex(rowIndex: number): VTable.ListTable | null;
|
|
43
|
+
getSubTableByBodyRowIndex(bodyRowIndex: number): VTable.ListTable | null;
|
|
44
|
+
filterSubTables(predicate: (bodyRowIndex: number, subTable: VTable.ListTable, record?: unknown) => boolean): Array<{
|
|
45
|
+
bodyRowIndex: number;
|
|
46
|
+
subTable: VTable.ListTable;
|
|
47
|
+
record?: unknown;
|
|
48
|
+
}>;
|
|
49
|
+
private cleanupMasterDetailFeatures;
|
|
50
|
+
}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import * as VTable from "@visactor/vtable";
|
|
2
|
+
|
|
3
|
+
import { includesRecordIndex, findRecordIndexPosition } from "./types";
|
|
4
|
+
|
|
5
|
+
import { getInternalProps, getRecordByRowIndex, getOriginalRowHeight } from "./utils";
|
|
6
|
+
|
|
7
|
+
import { ConfigManager } from "./config";
|
|
8
|
+
|
|
9
|
+
import { EventManager } from "./events";
|
|
10
|
+
|
|
11
|
+
import { SubTableManager } from "./subtable";
|
|
12
|
+
|
|
13
|
+
import { TableAPIExtensions } from "./table-api-extensions";
|
|
14
|
+
|
|
15
|
+
import { bindMasterDetailCheckboxChange } from "./checkbox";
|
|
16
|
+
|
|
17
|
+
export class MasterDetailPlugin {
|
|
18
|
+
constructor(pluginOptions = {}) {
|
|
19
|
+
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 ],
|
|
20
|
+
this.pluginOptions = pluginOptions;
|
|
21
|
+
}
|
|
22
|
+
run(...args) {
|
|
23
|
+
const eventArgs = args[0], runTime = args[1], table = args[2];
|
|
24
|
+
if (runTime === VTable.TABLE_EVENT_TYPE.BEFORE_INIT) this.table = table, this.initializeManagers(),
|
|
25
|
+
this.configManager.injectMasterDetailOptions(eventArgs.options); else if (runTime === VTable.TABLE_EVENT_TYPE.INITIALIZED) this.setupMasterDetailFeatures(); else {
|
|
26
|
+
if (runTime === VTable.TABLE_EVENT_TYPE.SORT_CLICK) return this.eventManager.executeMasterDetailBeforeSort(),
|
|
27
|
+
!0;
|
|
28
|
+
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);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
initializeManagers() {
|
|
32
|
+
var _a;
|
|
33
|
+
this.configManager = new ConfigManager(this.pluginOptions, this.table), this.eventManager = new EventManager(this.table);
|
|
34
|
+
const enableCheckboxCascade = null === (_a = this.pluginOptions.enableCheckboxCascade) || void 0 === _a || _a;
|
|
35
|
+
this.subTableManager = new SubTableManager(this.table, enableCheckboxCascade), this.configManager.setRowExpandedChecker((row => this.eventManager.isRowExpanded(row))),
|
|
36
|
+
this.eventManager.setCallbacks({
|
|
37
|
+
onUpdateSubTablePositions: () => this.subTableManager.recalculateAllSubTablePositions(),
|
|
38
|
+
onUpdateSubTablePositionsForRow: () => this.subTableManager.updateSubTablePositionsForRowResize(),
|
|
39
|
+
onExpandRow: (rowIndex, colIndex) => this.expandRow(rowIndex, colIndex),
|
|
40
|
+
onCollapseRow: (rowIndex, colIndex) => this.collapseRow(rowIndex, colIndex),
|
|
41
|
+
onCollapseRowToNoRealRecordIndex: rowIndex => this.collapseRowToNoRealRecordIndex(rowIndex),
|
|
42
|
+
onToggleRowExpand: (rowIndex, colIndex) => this.toggleRowExpand(rowIndex, colIndex),
|
|
43
|
+
getOriginalRowHeight: bodyRowIndex => getOriginalRowHeight(this.table, bodyRowIndex)
|
|
44
|
+
}), this.subTableManager.setCallbacks({
|
|
45
|
+
getDetailConfigForRecord: (record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
setupMasterDetailFeatures() {
|
|
49
|
+
this.initInternalProps(), this.eventManager.bindEventHandlers(), this.setupUnifiedSelectionManagement(),
|
|
50
|
+
this.extendTableAPI(), this.initCheckboxCascade();
|
|
51
|
+
}
|
|
52
|
+
setupUnifiedSelectionManagement() {
|
|
53
|
+
this.mainTableClickHandler = () => {
|
|
54
|
+
this.clearAllSubTableVisibleSelections();
|
|
55
|
+
}, this.table.on("click_cell", this.mainTableClickHandler);
|
|
56
|
+
}
|
|
57
|
+
initCheckboxCascade() {
|
|
58
|
+
var _a;
|
|
59
|
+
(null === (_a = this.pluginOptions.enableCheckboxCascade) || void 0 === _a || _a) && (this.checkboxCascadeCleanup = bindMasterDetailCheckboxChange(this.table, this.eventManager));
|
|
60
|
+
}
|
|
61
|
+
initInternalProps() {
|
|
62
|
+
const internalProps = getInternalProps(this.table);
|
|
63
|
+
internalProps.expandedRecordIndices = [], internalProps.subTableInstances = new Map,
|
|
64
|
+
internalProps.originalRowHeights = new Map, internalProps.subTableCheckboxStates = new Map;
|
|
65
|
+
}
|
|
66
|
+
extendTableAPI() {
|
|
67
|
+
this.tableAPIExtensions = new TableAPIExtensions(this.table, this.configManager, this.eventManager, {
|
|
68
|
+
addUnderlineToCell: cellGroup => this.addUnderlineToCell(cellGroup),
|
|
69
|
+
updateOriginalHeightsAfterAdaptive: expandedRowsInfo => this.updateOriginalHeightsAfterAdaptive(expandedRowsInfo),
|
|
70
|
+
collapseRowToNoRealRecordIndex: rowIndex => this.collapseRowToNoRealRecordIndex(rowIndex),
|
|
71
|
+
expandRow: rowIndex => this.expandRow(rowIndex),
|
|
72
|
+
restoreExpandedStatesAfter: () => this.restoreExpandedStatesAfter(),
|
|
73
|
+
collapseRow: rowIndex => this.collapseRow(rowIndex),
|
|
74
|
+
updateSubTablePositions: () => this.subTableManager.recalculateAllSubTablePositions(),
|
|
75
|
+
updateRowHeightForExpand: (rowIndex, deltaHeight) => this.updateRowHeightForExpand(rowIndex, deltaHeight)
|
|
76
|
+
}), this.tableAPIExtensions.extendTableAPI();
|
|
77
|
+
}
|
|
78
|
+
updateOriginalHeightsAfterAdaptive(expandedRowsInfo) {
|
|
79
|
+
const internalProps = getInternalProps(this.table);
|
|
80
|
+
for (const [rowIndex, info] of expandedRowsInfo) {
|
|
81
|
+
const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount;
|
|
82
|
+
internalProps.originalRowHeights && internalProps.originalRowHeights.set(bodyRowIndex, info.baseHeight);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
restoreExpandedStatesAfter() {
|
|
86
|
+
const internalProps = getInternalProps(this.table);
|
|
87
|
+
if (!internalProps.expandedRecordIndices || 0 === internalProps.expandedRecordIndices.length) return;
|
|
88
|
+
this.table.dataSource._currentPagerIndexedData && internalProps.expandedRecordIndices.forEach((recordIndex => {
|
|
89
|
+
try {
|
|
90
|
+
const bodyRowIndex = this.table.getBodyRowIndexByRecordIndex(recordIndex);
|
|
91
|
+
if (bodyRowIndex >= 0) {
|
|
92
|
+
const targetRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;
|
|
93
|
+
this.expandRow(targetRowIndex);
|
|
94
|
+
}
|
|
95
|
+
} catch (error) {}
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
expandRow(rowIndex, colIndex) {
|
|
99
|
+
var _a;
|
|
100
|
+
const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = getInternalProps(this.table);
|
|
101
|
+
if (this.eventManager.isRowExpanded(rowIndex)) return;
|
|
102
|
+
const realRecordIndex = this.table.getRecordIndexByCell(0, rowIndex);
|
|
103
|
+
if (null == realRecordIndex) return;
|
|
104
|
+
internalProps.expandedRecordIndices && (includesRecordIndex(internalProps.expandedRecordIndices, realRecordIndex) || internalProps.expandedRecordIndices.push(realRecordIndex)),
|
|
105
|
+
this.eventManager.addExpandedRow(rowIndex);
|
|
106
|
+
const originalHeight = this.table.getRowHeight(rowIndex);
|
|
107
|
+
internalProps.originalRowHeights && internalProps.originalRowHeights.set(bodyRowIndex, originalHeight);
|
|
108
|
+
const record = 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;
|
|
109
|
+
this.updateRowHeightForExpand(rowIndex, deltaHeight), this.table.scenegraph.updateContainerHeight(rowIndex, deltaHeight),
|
|
110
|
+
internalProps._heightResizedRowMap.add(rowIndex), this.subTableManager.renderSubTable(bodyRowIndex, childrenData, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
|
|
111
|
+
this.subTableManager.recalculateAllSubTablePositions(bodyRowIndex + 1, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
|
|
112
|
+
rowIndex !== this.table.rowCount - 1 && this.drawUnderlineForRow(rowIndex), this.refreshRowIcon(rowIndex, colIndex),
|
|
113
|
+
"adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode();
|
|
114
|
+
}
|
|
115
|
+
collapseRow(rowIndex, colIndex) {
|
|
116
|
+
const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = getInternalProps(this.table);
|
|
117
|
+
if (!this.eventManager.isRowExpanded(rowIndex)) return;
|
|
118
|
+
const realRecordIndex = this.table.getRecordIndexByCell(0, rowIndex);
|
|
119
|
+
if (null == realRecordIndex) return;
|
|
120
|
+
if (this.subTableManager.removeSubTable(bodyRowIndex), internalProps.expandedRecordIndices) {
|
|
121
|
+
const index = findRecordIndexPosition(internalProps.expandedRecordIndices, realRecordIndex);
|
|
122
|
+
index > -1 && internalProps.expandedRecordIndices.splice(index, 1);
|
|
123
|
+
}
|
|
124
|
+
this.eventManager.removeExpandedRow(rowIndex);
|
|
125
|
+
const deltaHeight = this.table.getRowHeight(rowIndex) - getOriginalRowHeight(this.table, bodyRowIndex);
|
|
126
|
+
this.updateRowHeightForExpand(rowIndex, -deltaHeight), internalProps._heightResizedRowMap.delete(rowIndex),
|
|
127
|
+
this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight), internalProps.originalRowHeights && internalProps.originalRowHeights.delete(bodyRowIndex),
|
|
128
|
+
rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.subTableManager.recalculateAllSubTablePositions(bodyRowIndex + 1, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
|
|
129
|
+
this.refreshRowIcon(rowIndex, colIndex), "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode();
|
|
130
|
+
}
|
|
131
|
+
collapseRowToNoRealRecordIndex(rowIndex) {
|
|
132
|
+
const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = getInternalProps(this.table);
|
|
133
|
+
if (!this.eventManager.isRowExpanded(rowIndex)) return;
|
|
134
|
+
this.subTableManager.removeSubTable(bodyRowIndex), this.eventManager.removeExpandedRow(rowIndex);
|
|
135
|
+
const deltaHeight = this.table.getRowHeight(rowIndex) - getOriginalRowHeight(this.table, bodyRowIndex);
|
|
136
|
+
this.updateRowHeightForExpand(rowIndex, -deltaHeight), internalProps._heightResizedRowMap.delete(rowIndex),
|
|
137
|
+
this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight), internalProps.originalRowHeights && internalProps.originalRowHeights.delete(bodyRowIndex),
|
|
138
|
+
rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.subTableManager.recalculateAllSubTablePositions(bodyRowIndex + 1, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
|
|
139
|
+
this.refreshRowIcon(rowIndex), "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode();
|
|
140
|
+
}
|
|
141
|
+
toggleRowExpand(rowIndex, colIndex) {
|
|
142
|
+
this.eventManager.isRowExpanded(rowIndex) ? this.collapseRow(rowIndex, colIndex) : this.expandRow(rowIndex, colIndex);
|
|
143
|
+
}
|
|
144
|
+
updateRowHeightForExpand(rowIndex, deltaHeight) {
|
|
145
|
+
this.table._setRowHeight(rowIndex, this.table.getRowHeight(rowIndex) + deltaHeight, !0);
|
|
146
|
+
const rowStart = rowIndex + 1;
|
|
147
|
+
let rowEnd = 0;
|
|
148
|
+
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);
|
|
149
|
+
for (let colIndex = 0; colIndex < this.table.colCount; colIndex++) for (let rowIdx = rowStart; rowIdx <= rowEnd; rowIdx++) {
|
|
150
|
+
const cellGroup = this.table.scenegraph.highPerformanceGetCell(colIndex, rowIdx);
|
|
151
|
+
"cell" === cellGroup.role && cellGroup.setAttribute("y", cellGroup.attribute.y + deltaHeight);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
drawUnderlineForRow(rowIndex) {
|
|
155
|
+
if (!this.table.scenegraph) return;
|
|
156
|
+
const rowCells = this.getRowCells(rowIndex);
|
|
157
|
+
0 !== rowCells.length && (rowCells.forEach(((cellGroup, index) => {
|
|
158
|
+
cellGroup && cellGroup.attribute && this.addUnderlineToCell(cellGroup);
|
|
159
|
+
})), this.table.scenegraph.updateNextFrame());
|
|
160
|
+
}
|
|
161
|
+
getRowCells(rowIndex) {
|
|
162
|
+
const cells = [];
|
|
163
|
+
for (let col = 0; col < this.table.colCount; col++) {
|
|
164
|
+
const cellGroup = this.table.scenegraph.getCell(col, rowIndex);
|
|
165
|
+
cellGroup && "cell" === cellGroup.role && cells.push(cellGroup);
|
|
166
|
+
}
|
|
167
|
+
return cells;
|
|
168
|
+
}
|
|
169
|
+
addUnderlineToCell(cellGroup) {
|
|
170
|
+
var _a;
|
|
171
|
+
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" ]);
|
|
172
|
+
cellGroup._hasUnderline || (cellGroup._originalStrokeArrayWidth = [ ...currentStrokeArrayWidth ],
|
|
173
|
+
cellGroup._originalStrokeArrayColor = [ ...currentStrokeArrayColor ], cellGroup._hasUnderline = !0);
|
|
174
|
+
const originalStrokeArrayWidth = cellGroup._originalStrokeArrayWidth || currentStrokeArrayWidth, originalStrokeArrayColor = cellGroup._originalStrokeArrayColor || currentStrokeArrayColor, enhancedStrokeArrayWidth = [ ...originalStrokeArrayWidth ], enhancedStrokeArrayColor = [ ...originalStrokeArrayColor ], enhancedWidth = 2 * (.75 * (originalStrokeArrayWidth[2] || 1) + .75 * (originalStrokeArrayWidth[0] || 1));
|
|
175
|
+
if (enhancedStrokeArrayWidth[2] = enhancedWidth, "transparent" !== originalStrokeArrayColor[2] && originalStrokeArrayColor[2]) enhancedStrokeArrayColor[2] = originalStrokeArrayColor[2]; else {
|
|
176
|
+
const theme = this.table.theme;
|
|
177
|
+
enhancedStrokeArrayColor[2] = (null === (_a = null == theme ? void 0 : theme.bodyStyle) || void 0 === _a ? void 0 : _a.borderColor) || "#e1e4e8";
|
|
178
|
+
}
|
|
179
|
+
cellGroup.setAttributes({
|
|
180
|
+
strokeArrayWidth: enhancedStrokeArrayWidth,
|
|
181
|
+
strokeArrayColor: enhancedStrokeArrayColor,
|
|
182
|
+
stroke: !0
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
removeUnderlineFromRow(rowIndex) {
|
|
186
|
+
this.getRowCells(rowIndex).forEach(((cellGroup, index) => {
|
|
187
|
+
cellGroup && cellGroup._hasUnderline && this.removeUnderlineFromCell(cellGroup);
|
|
188
|
+
})), this.table.scenegraph.updateNextFrame();
|
|
189
|
+
}
|
|
190
|
+
removeUnderlineFromCell(cellGroup) {
|
|
191
|
+
cellGroup._hasUnderline && (cellGroup._originalStrokeArrayWidth && cellGroup._originalStrokeArrayColor && (cellGroup.setAttributes({
|
|
192
|
+
strokeArrayWidth: cellGroup._originalStrokeArrayWidth,
|
|
193
|
+
strokeArrayColor: cellGroup._originalStrokeArrayColor
|
|
194
|
+
}), delete cellGroup._originalStrokeArrayWidth, delete cellGroup._originalStrokeArrayColor),
|
|
195
|
+
cellGroup._hasUnderline = !1);
|
|
196
|
+
}
|
|
197
|
+
refreshRowIcon(rowIndex, colIndex) {
|
|
198
|
+
let targetColumnIndex;
|
|
199
|
+
if ("number" == typeof colIndex) targetColumnIndex = colIndex; else {
|
|
200
|
+
targetColumnIndex = !!this.table.options.rowSeriesNumber ? 1 : 0;
|
|
201
|
+
}
|
|
202
|
+
const record = this.table.getCellOriginRecord(targetColumnIndex, rowIndex);
|
|
203
|
+
if (record && "object" == typeof record) {
|
|
204
|
+
const recordObj = record, HierarchyState = VTable.TYPES.HierarchyState, isExpanded = this.eventManager.isRowExpanded(rowIndex);
|
|
205
|
+
recordObj.hierarchyState = isExpanded ? HierarchyState.expand : HierarchyState.collapse,
|
|
206
|
+
this.table.scenegraph.updateHierarchyIcon(targetColumnIndex, rowIndex);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
update() {
|
|
210
|
+
this.table && this.subTableManager.recalculateAllSubTablePositions(0, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)));
|
|
211
|
+
}
|
|
212
|
+
setRecordChildren(children, col, row) {
|
|
213
|
+
const recordIndex = this.table.getRecordIndexByCell(col, row);
|
|
214
|
+
if (null == recordIndex) return;
|
|
215
|
+
const realRecordIndex = "number" == typeof recordIndex ? recordIndex : recordIndex[0], record = this.table.dataSource.get(realRecordIndex);
|
|
216
|
+
record && (record.children = children, this.expandRow(row, col), this.table.scenegraph.updateCellContent(col, row));
|
|
217
|
+
}
|
|
218
|
+
release() {
|
|
219
|
+
var _a, _b, _c, _d, _e;
|
|
220
|
+
const internalProps = getInternalProps(this.table);
|
|
221
|
+
internalProps && (internalProps._isReleasing = !0);
|
|
222
|
+
try {
|
|
223
|
+
if (this.resizeObserver && (this.resizeObserver.disconnect(), this.resizeObserver = void 0),
|
|
224
|
+
this.checkboxCascadeCleanup) {
|
|
225
|
+
try {
|
|
226
|
+
this.checkboxCascadeCleanup();
|
|
227
|
+
} catch (error) {}
|
|
228
|
+
this.checkboxCascadeCleanup = void 0;
|
|
229
|
+
}
|
|
230
|
+
if (this.eventManager) try {
|
|
231
|
+
this.eventManager.cleanup();
|
|
232
|
+
} catch (error) {}
|
|
233
|
+
if (this.subTableManager) try {
|
|
234
|
+
this.subTableManager.cleanup();
|
|
235
|
+
} catch (error) {}
|
|
236
|
+
if (this.configManager) try {
|
|
237
|
+
this.configManager.release();
|
|
238
|
+
} catch (error) {}
|
|
239
|
+
if (this.cleanupMasterDetailFeatures(), this.table && internalProps) try {
|
|
240
|
+
null === (_a = internalProps.expandedRecordIndices) || void 0 === _a || _a.splice(0),
|
|
241
|
+
null === (_b = internalProps.subTableInstances) || void 0 === _b || _b.clear(),
|
|
242
|
+
null === (_c = internalProps.originalRowHeights) || void 0 === _c || _c.clear(),
|
|
243
|
+
null === (_d = internalProps.subTableCheckboxStates) || void 0 === _d || _d.clear(),
|
|
244
|
+
null === (_e = internalProps._heightResizedRowMap) || void 0 === _e || _e.clear();
|
|
245
|
+
} catch (error) {}
|
|
246
|
+
} catch (error) {} finally {
|
|
247
|
+
try {
|
|
248
|
+
this.configManager = null, this.eventManager = null, this.subTableManager = null,
|
|
249
|
+
this.tableAPIExtensions = null, this.table = null, this.pluginOptions = null;
|
|
250
|
+
} catch (error) {}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
clearAllSubTableVisibleSelections() {
|
|
254
|
+
var _a;
|
|
255
|
+
null === (_a = getInternalProps(this.table).subTableInstances) || void 0 === _a || _a.forEach((subTable => {
|
|
256
|
+
subTable && "function" == typeof subTable.clearSelected && subTable.clearSelected();
|
|
257
|
+
}));
|
|
258
|
+
}
|
|
259
|
+
getAllSubTableInstances() {
|
|
260
|
+
return this.subTableManager.getAllSubTableInstances();
|
|
261
|
+
}
|
|
262
|
+
getSubTableByRowIndex(rowIndex) {
|
|
263
|
+
const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount;
|
|
264
|
+
return this.subTableManager.getSubTableInstance(bodyRowIndex);
|
|
265
|
+
}
|
|
266
|
+
getSubTableByBodyRowIndex(bodyRowIndex) {
|
|
267
|
+
return this.subTableManager.getSubTableInstance(bodyRowIndex);
|
|
268
|
+
}
|
|
269
|
+
filterSubTables(predicate) {
|
|
270
|
+
const result = [], allSubTables = this.subTableManager.getAllSubTableInstances();
|
|
271
|
+
if (!allSubTables) return result;
|
|
272
|
+
for (const [bodyRowIndex, subTable] of allSubTables) try {
|
|
273
|
+
predicate(bodyRowIndex, subTable, getRecordByRowIndex(this.table, bodyRowIndex)) && result.push({
|
|
274
|
+
bodyRowIndex: bodyRowIndex,
|
|
275
|
+
subTable: subTable
|
|
276
|
+
});
|
|
277
|
+
} catch (error) {}
|
|
278
|
+
return result;
|
|
279
|
+
}
|
|
280
|
+
cleanupMasterDetailFeatures() {
|
|
281
|
+
this.mainTableClickHandler && (this.table.off("click_cell", this.mainTableClickHandler),
|
|
282
|
+
this.mainTableClickHandler = void 0), this.tableAPIExtensions && (this.tableAPIExtensions.cleanup(),
|
|
283
|
+
this.tableAPIExtensions = void 0);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
@@ -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"]}
|