@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,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.bindMasterDetailCheckboxChange = void 0;
|
|
6
|
+
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
|
|
9
|
+
function bindMasterDetailCheckboxChange(table, eventManager) {
|
|
10
|
+
const checkboxChangeHandler = args => {
|
|
11
|
+
var _a;
|
|
12
|
+
const {col: col, row: row, checked: checked, field: field} = args;
|
|
13
|
+
if (table.isHeader(col, row)) {
|
|
14
|
+
const internalProps = (0, utils_1.getInternalProps)(table);
|
|
15
|
+
return void eventManager.getExpandedRows().forEach((expandedRow => {
|
|
16
|
+
var _a;
|
|
17
|
+
const bodyRowIndex = expandedRow - table.columnHeaderLevelCount, subTableInstance = null === (_a = internalProps.subTableInstances) || void 0 === _a ? void 0 : _a.get(bodyRowIndex);
|
|
18
|
+
if (subTableInstance && field) {
|
|
19
|
+
updateAllSubTableCheckboxes(subTableInstance, "string" == typeof field ? field : String(field), checked);
|
|
20
|
+
}
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
const rowIndex = row;
|
|
24
|
+
if (!eventManager.isRowExpanded(rowIndex)) return;
|
|
25
|
+
const bodyRowIndex = row - table.columnHeaderLevelCount, subTableInstance = null === (_a = (0,
|
|
26
|
+
utils_1.getInternalProps)(table).subTableInstances) || void 0 === _a ? void 0 : _a.get(bodyRowIndex);
|
|
27
|
+
if (subTableInstance && field) {
|
|
28
|
+
updateAllSubTableCheckboxes(subTableInstance, "string" == typeof field ? field : String(field), checked);
|
|
29
|
+
}
|
|
30
|
+
}, originalUpdateHeaderCheckedState = table.stateManager.updateHeaderCheckedState;
|
|
31
|
+
table.stateManager.updateHeaderCheckedState = function(field, col, row) {
|
|
32
|
+
const stateManager = this;
|
|
33
|
+
let result, allChecked = !0, allUnChecked = !0, hasChecked = !1, hasIndeterminate = !1;
|
|
34
|
+
return stateManager.checkedState.forEach(((check_state, index) => {
|
|
35
|
+
var _a;
|
|
36
|
+
index = index.includes(",") ? index.split(",").map((item => Number(item))) : Number(index);
|
|
37
|
+
const tableIndex = stateManager.table.getTableIndexByRecordIndex(index), mergeCell = stateManager.table.transpose ? stateManager.table.getCustomMerge(tableIndex, row) : stateManager.table.getCustomMerge(col, tableIndex), data = null === (_a = stateManager.table.dataSource) || void 0 === _a ? void 0 : _a.get(index);
|
|
38
|
+
if (mergeCell || !stateManager.table.internalProps.enableCheckboxCascade && (null == data ? void 0 : data.vtableMerge)) return;
|
|
39
|
+
const checkValue = null == check_state ? void 0 : check_state[field];
|
|
40
|
+
"indeterminate" === checkValue ? (hasIndeterminate = !0, hasChecked = !0, allChecked = !1,
|
|
41
|
+
allUnChecked = !1) : !0 !== checkValue ? allChecked = !1 : (allUnChecked = !1, hasChecked = !0);
|
|
42
|
+
})), result = hasIndeterminate ? "indeterminate" : !!allChecked || !allUnChecked && (!!hasChecked && "indeterminate"),
|
|
43
|
+
stateManager.headerCheckedState[field] = result, result;
|
|
44
|
+
}, table.on("checkbox_state_change", checkboxChangeHandler);
|
|
45
|
+
const subTableCleanup = bindSubTableCheckboxEvents(table);
|
|
46
|
+
return () => {
|
|
47
|
+
table.off("checkbox_state_change", checkboxChangeHandler), table.stateManager.updateHeaderCheckedState = originalUpdateHeaderCheckedState,
|
|
48
|
+
subTableCleanup();
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function bindSubTableCheckboxEvents(table) {
|
|
53
|
+
const internalProps = (0, utils_1.getInternalProps)(table), originalSet = internalProps.subTableInstances.set;
|
|
54
|
+
return originalSet && internalProps.subTableInstances ? (internalProps.subTableInstances.set = function(key, subTable) {
|
|
55
|
+
const result = originalSet.call(this, key, subTable), checkboxHandler = args => {
|
|
56
|
+
const {field: field} = args;
|
|
57
|
+
updateMainTableRowCheckboxFromSubTable(table, subTable, key, field);
|
|
58
|
+
};
|
|
59
|
+
subTable.on("checkbox_state_change", checkboxHandler);
|
|
60
|
+
return subTable.__checkboxHandler = checkboxHandler, result;
|
|
61
|
+
}, () => {
|
|
62
|
+
internalProps.subTableInstances && originalSet && (internalProps.subTableInstances.set = originalSet);
|
|
63
|
+
}) : () => {};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function updateMainTableRowCheckboxFromSubTable(mainTable, subTable, subTableKey, field) {
|
|
67
|
+
const mainTableRow = subTableKey + mainTable.columnHeaderLevelCount;
|
|
68
|
+
let subTableState = !1;
|
|
69
|
+
const headerState = subTable.stateManager.headerCheckedState[field];
|
|
70
|
+
void 0 !== headerState && (subTableState = headerState);
|
|
71
|
+
const mainTableCheckboxCol = (0, utils_1.findCheckboxColumnIndex)(mainTable, field);
|
|
72
|
+
if (-1 !== mainTableCheckboxCol && mainTable.stateManager) {
|
|
73
|
+
mainTable.stateManager.setCheckedState(mainTableCheckboxCol, mainTableRow, field, subTableState);
|
|
74
|
+
if ("checkbox" === mainTable.getCellType(mainTableCheckboxCol, mainTableRow) && (0,
|
|
75
|
+
utils_1.setCellCheckboxStateByAttribute)(mainTableCheckboxCol, mainTableRow, subTableState, mainTable),
|
|
76
|
+
mainTable.internalProps.enableCheckboxCascade) {
|
|
77
|
+
const oldHeaderCheckedState = mainTable.stateManager.headerCheckedState[field], newHeaderCheckedState = mainTable.stateManager.updateHeaderCheckedState(field, mainTableCheckboxCol, 0);
|
|
78
|
+
if (oldHeaderCheckedState !== newHeaderCheckedState) {
|
|
79
|
+
const headerRow = 0;
|
|
80
|
+
mainTable.isHeader(mainTableCheckboxCol, headerRow) && mainTable.scenegraph.updateHeaderCheckboxCellState(mainTableCheckboxCol, headerRow, newHeaderCheckedState);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function updateAllSubTableCheckboxes(subTable, field, checked) {
|
|
87
|
+
if (!subTable.stateManager) return;
|
|
88
|
+
subTable.stateManager.headerCheckedState[field] = checked;
|
|
89
|
+
(subTable.records || []).forEach(((record, recordIndex) => {
|
|
90
|
+
const indexKey = recordIndex.toString();
|
|
91
|
+
record[field] = checked;
|
|
92
|
+
let recordStates = subTable.stateManager.checkedState.get(indexKey);
|
|
93
|
+
recordStates || (recordStates = {}, subTable.stateManager.checkedState.set(indexKey, recordStates)),
|
|
94
|
+
recordStates[field] = checked;
|
|
95
|
+
}));
|
|
96
|
+
const checkboxCol = (0, utils_1.findCheckboxColumnIndex)(subTable, field);
|
|
97
|
+
if (checkboxCol >= 0) {
|
|
98
|
+
subTable.scenegraph.updateHeaderCheckboxCellState(checkboxCol, 0, checked);
|
|
99
|
+
for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) (0,
|
|
100
|
+
utils_1.setCellCheckboxStateByAttribute)(checkboxCol, row, checked, subTable);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=checkbox.js.map
|
|
105
|
+
exports.bindMasterDetailCheckboxChange = bindMasterDetailCheckboxChange;
|
|
@@ -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,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
|
|
4
|
+
void 0 === k2 && (k2 = k);
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
|
|
7
|
+
enumerable: !0,
|
|
8
|
+
get: function() {
|
|
9
|
+
return m[k];
|
|
10
|
+
}
|
|
11
|
+
}), Object.defineProperty(o, k2, desc);
|
|
12
|
+
} : function(o, m, k, k2) {
|
|
13
|
+
void 0 === k2 && (k2 = k), o[k2] = m[k];
|
|
14
|
+
}), __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", {
|
|
16
|
+
enumerable: !0,
|
|
17
|
+
value: v
|
|
18
|
+
});
|
|
19
|
+
} : function(o, v) {
|
|
20
|
+
o.default = v;
|
|
21
|
+
}), __importStar = this && this.__importStar || function(mod) {
|
|
22
|
+
if (mod && mod.__esModule) return mod;
|
|
23
|
+
var result = {};
|
|
24
|
+
if (null != mod) for (var k in mod) "default" !== k && Object.prototype.hasOwnProperty.call(mod, k) && __createBinding(result, mod, k);
|
|
25
|
+
return __setModuleDefault(result, mod), result;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
Object.defineProperty(exports, "__esModule", {
|
|
29
|
+
value: !0
|
|
30
|
+
}), exports.ConfigManager = void 0;
|
|
31
|
+
|
|
32
|
+
const VTable = __importStar(require("@visactor/vtable"));
|
|
33
|
+
|
|
34
|
+
class ConfigManager {
|
|
35
|
+
constructor(pluginOptions, table) {
|
|
36
|
+
this.pluginOptions = pluginOptions, this.table = table, this.isRowExpanded = () => !1;
|
|
37
|
+
}
|
|
38
|
+
hasChildren(record) {
|
|
39
|
+
if (record && "object" == typeof record && "children" in record) {
|
|
40
|
+
const children = record.children;
|
|
41
|
+
return Array.isArray(children) && children.length > 0;
|
|
42
|
+
}
|
|
43
|
+
return !1;
|
|
44
|
+
}
|
|
45
|
+
injectMasterDetailOptions(options) {
|
|
46
|
+
options.masterDetail = !0, options.customConfig || (options.customConfig = {}),
|
|
47
|
+
options.customConfig.scrollEventAlwaysTrigger = !0;
|
|
48
|
+
const originalCustomComputeRowHeight = options.customComputeRowHeight;
|
|
49
|
+
if (options.customComputeRowHeight = params => {
|
|
50
|
+
var _a;
|
|
51
|
+
const {row: row, table: table} = params;
|
|
52
|
+
if (this.isRowExpanded(row)) {
|
|
53
|
+
const expandedHeight = table.getRowHeight(row);
|
|
54
|
+
return Array.isArray(expandedHeight) ? null !== (_a = expandedHeight[0]) && void 0 !== _a ? _a : "auto" : expandedHeight;
|
|
55
|
+
}
|
|
56
|
+
if (originalCustomComputeRowHeight) {
|
|
57
|
+
const userResult = originalCustomComputeRowHeight(params);
|
|
58
|
+
if (null != userResult) return userResult;
|
|
59
|
+
}
|
|
60
|
+
}, options.columns && options.columns.length > 0) {
|
|
61
|
+
options.columns[0].tree = !0;
|
|
62
|
+
}
|
|
63
|
+
if (this.setupInitializedListener(), this.pluginOptions.detailTableOptions) {
|
|
64
|
+
const detailOptions = this.pluginOptions.detailTableOptions;
|
|
65
|
+
"function" == typeof detailOptions ? options.getDetailGridOptions = detailOptions : options.detailTableOptions = detailOptions;
|
|
66
|
+
}
|
|
67
|
+
this.disableRefreshHierarchyState();
|
|
68
|
+
}
|
|
69
|
+
getDataCount() {
|
|
70
|
+
var _a, _b, _c, _d, _e;
|
|
71
|
+
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;
|
|
72
|
+
}
|
|
73
|
+
disableRefreshHierarchyState() {
|
|
74
|
+
setTimeout((() => {
|
|
75
|
+
const tableWithPrivateMethod = this.table;
|
|
76
|
+
tableWithPrivateMethod && "function" == typeof tableWithPrivateMethod._refreshHierarchyState && (tableWithPrivateMethod._originalRefreshHierarchyState = tableWithPrivateMethod._refreshHierarchyState,
|
|
77
|
+
tableWithPrivateMethod._refreshHierarchyState = () => {});
|
|
78
|
+
}), 0);
|
|
79
|
+
}
|
|
80
|
+
setupInitializedListener() {
|
|
81
|
+
this.table.on("initialized", (() => {
|
|
82
|
+
const records = this.table.dataSource.records;
|
|
83
|
+
this.processRecordsHierarchyStates(records), this.table.renderWithRecreateCells();
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
processRecordsHierarchyStates(records) {
|
|
87
|
+
const HierarchyState = VTable.TYPES.HierarchyState;
|
|
88
|
+
(recordList => {
|
|
89
|
+
recordList.forEach((record => {
|
|
90
|
+
if (record && "object" == typeof record) {
|
|
91
|
+
const recordObj = record;
|
|
92
|
+
(this.hasChildren(record) || !0 === recordObj.children) && (recordObj.hierarchyState = HierarchyState.collapse);
|
|
93
|
+
}
|
|
94
|
+
}));
|
|
95
|
+
})(records);
|
|
96
|
+
}
|
|
97
|
+
getDetailConfigForRecord(record, bodyRowIndex) {
|
|
98
|
+
const detailOptions = this.pluginOptions.detailTableOptions;
|
|
99
|
+
return detailOptions ? "function" == typeof detailOptions ? detailOptions({
|
|
100
|
+
data: record,
|
|
101
|
+
bodyRowIndex: bodyRowIndex
|
|
102
|
+
}) : detailOptions : null;
|
|
103
|
+
}
|
|
104
|
+
setRowExpandedChecker(checker) {
|
|
105
|
+
this.isRowExpanded = checker;
|
|
106
|
+
}
|
|
107
|
+
release() {
|
|
108
|
+
this.isRowExpanded = () => !1, this.table = null, this.pluginOptions = null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
exports.ConfigManager = ConfigManager;
|
|
113
|
+
//# 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
|
+
}
|