@visactor/vtable-plugins 1.22.2 → 1.22.3
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/filter/filter-engine.js +3 -1
- package/cjs/filter/filter-engine.js.map +1 -1
- package/cjs/filter/filter-state-manager.d.ts +0 -1
- package/cjs/filter/filter-state-manager.js +1 -12
- package/cjs/filter/filter-state-manager.js.map +1 -1
- package/cjs/filter/filter.js +16 -3
- package/cjs/filter/filter.js.map +1 -1
- package/cjs/master-detail-plugin/config.d.ts +6 -1
- package/cjs/master-detail-plugin/config.js +54 -7
- package/cjs/master-detail-plugin/config.js.map +1 -1
- package/cjs/master-detail-plugin/core.d.ts +2 -1
- package/cjs/master-detail-plugin/core.js +31 -12
- package/cjs/master-detail-plugin/core.js.map +1 -1
- package/cjs/master-detail-plugin/events.js +1 -1
- package/cjs/master-detail-plugin/events.js.map +1 -1
- package/cjs/master-detail-plugin/subtable.d.ts +4 -0
- package/cjs/master-detail-plugin/subtable.js +42 -4
- package/cjs/master-detail-plugin/subtable.js.map +1 -1
- package/cjs/master-detail-plugin/types.d.ts +1 -1
- package/cjs/master-detail-plugin/types.js.map +1 -1
- package/cjs/table-carousel-animation.js +3 -3
- package/cjs/table-carousel-animation.js.map +1 -1
- package/cjs/table-series-number.d.ts +4 -0
- package/cjs/table-series-number.js +12 -4
- package/cjs/table-series-number.js.map +1 -1
- package/dist/vtable-plugins.js +240 -69
- package/dist/vtable-plugins.min.js +3 -3
- package/es/filter/filter-engine.js +3 -1
- package/es/filter/filter-engine.js.map +1 -1
- package/es/filter/filter-state-manager.d.ts +0 -1
- package/es/filter/filter-state-manager.js +1 -12
- package/es/filter/filter-state-manager.js.map +1 -1
- package/es/filter/filter.js +15 -3
- package/es/filter/filter.js.map +1 -1
- package/es/master-detail-plugin/config.d.ts +6 -1
- package/es/master-detail-plugin/config.js +54 -7
- package/es/master-detail-plugin/config.js.map +1 -1
- package/es/master-detail-plugin/core.d.ts +2 -1
- package/es/master-detail-plugin/core.js +30 -12
- package/es/master-detail-plugin/core.js.map +1 -1
- package/es/master-detail-plugin/events.js +1 -1
- package/es/master-detail-plugin/events.js.map +1 -1
- package/es/master-detail-plugin/subtable.d.ts +4 -0
- package/es/master-detail-plugin/subtable.js +41 -4
- package/es/master-detail-plugin/subtable.js.map +1 -1
- package/es/master-detail-plugin/types.d.ts +1 -1
- package/es/master-detail-plugin/types.js.map +1 -1
- package/es/table-carousel-animation.js +3 -3
- package/es/table-carousel-animation.js.map +1 -1
- package/es/table-series-number.d.ts +4 -0
- package/es/table-series-number.js +12 -4
- package/es/table-series-number.js.map +1 -1
- package/package.json +8 -8
|
@@ -15,7 +15,9 @@ export class FilterEngine {
|
|
|
15
15
|
fieldId: String(filter.field)
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
|
-
})), table.updateFilterRules([ ...this.filterFuncRule, ...this.filterValueRule ]
|
|
18
|
+
})), table.updateFilterRules([ ...this.filterFuncRule, ...this.filterValueRule ], {
|
|
19
|
+
clearRowHeightCache: !1
|
|
20
|
+
});
|
|
19
21
|
}
|
|
20
22
|
createFilterFunction(filter) {
|
|
21
23
|
const {field: field, operator: operator, condition: condition} = filter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filter/filter-engine.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,YAAY;IAAzB;QACE,mBAAc,GAAoD,EAAE,CAAC;QACrE,oBAAe,GAA4B,EAAE,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/filter/filter-engine.ts"],"names":[],"mappings":"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","file":"filter-engine.js","sourcesContent":["import type { ListTable, PivotTable, TYPES } from '@visactor/vtable';\nimport type { FilterState, FilterOperator, FilterConfig } from './types';\n\n/**\n * 筛选引擎,用于进行实际的筛选操作\n */\nexport class FilterEngine {\n filterFuncRule: (TYPES.FilterFuncRule & { fieldId?: string })[] = [];\n filterValueRule: TYPES.FilterValueRule[] = [];\n\n applyFilter(state: FilterState, table: ListTable | PivotTable) {\n const { filters } = state;\n this.filterFuncRule = [];\n this.filterValueRule = [];\n\n filters.forEach((filter, field) => {\n if (!filter.enable) {\n return;\n }\n\n if (filter.type === 'byValue') {\n this.filterValueRule.push({\n filterKey: String(filter.field),\n filteredValues: filter.values\n });\n } else if (filter.type === 'byCondition') {\n // 为条件筛选生成过滤函数\n const filterFunc = this.createFilterFunction(filter);\n this.filterFuncRule.push({\n filterFunc,\n fieldId: String(filter.field)\n });\n }\n });\n\n table.updateFilterRules([...this.filterFuncRule, ...this.filterValueRule], {\n clearRowHeightCache: false\n });\n }\n\n /**\n * 根据筛选配置创建筛选函数\n */\n private createFilterFunction(filter: FilterConfig): (record: any) => boolean {\n const { field, operator, condition } = filter;\n\n // 如果没有操作符或条件,返回一个总是通过的函数\n if (!operator || condition === undefined) {\n return () => true;\n }\n\n return (record: any) => {\n const value = record[field];\n\n if (value === null || value === undefined) {\n return false;\n }\n\n // 根据操作符生成对应的比较逻辑\n switch (operator) {\n case 'equals':\n return this.compareValues(value, condition) === 0;\n case 'notEquals':\n return this.compareValues(value, condition) !== 0;\n case 'greaterThan':\n return this.compareValues(value, condition) > 0;\n case 'lessThan':\n return this.compareValues(value, condition) < 0;\n case 'greaterThanOrEqual':\n return this.compareValues(value, condition) >= 0;\n case 'lessThanOrEqual':\n return this.compareValues(value, condition) <= 0;\n case 'between':\n // 范围条件需要是数组形式 [min, max]\n if (Array.isArray(condition) && condition.length === 2) {\n return this.compareValues(value, condition[0]) >= 0 && this.compareValues(value, condition[1]) <= 0;\n }\n return true;\n case 'notBetween':\n // 范围条件需要是数组形式 [min, max]\n if (Array.isArray(condition) && condition.length === 2) {\n return this.compareValues(value, condition[0]) < 0 || this.compareValues(value, condition[1]) > 0;\n }\n return true;\n case 'contains':\n return String(value).toLowerCase().includes(String(condition).toLowerCase());\n case 'notContains':\n return !String(value).toLowerCase().includes(String(condition).toLowerCase());\n case 'startsWith':\n return String(value).toLowerCase().startsWith(String(condition).toLowerCase());\n case 'notStartsWith':\n return !String(value).toLowerCase().startsWith(String(condition).toLowerCase());\n case 'endsWith':\n return String(value).toLowerCase().endsWith(String(condition).toLowerCase());\n case 'notEndsWith':\n return !String(value).toLowerCase().endsWith(String(condition).toLowerCase());\n case 'isChecked':\n return Boolean(value) === true;\n case 'isUnchecked':\n return Boolean(value) === false;\n default:\n return true;\n }\n };\n }\n\n /**\n * 比较两个值\n * 返回: -1 (value < condition), 0 (value === condition), 1 (value > condition)\n */\n private compareValues(value: any, condition: any): number {\n if (typeof value === 'number' && typeof condition === 'number') {\n return value === condition ? 0 : value > condition ? 1 : -1;\n }\n\n if (typeof value === 'boolean' && typeof condition === 'boolean') {\n return value === condition ? 0 : -1;\n }\n\n const valueStr = String(value).toLowerCase();\n const conditionStr = String(condition).toLowerCase();\n return valueStr === conditionStr ? 0 : valueStr > conditionStr ? 1 : -1;\n }\n\n clearAllFilter(table: ListTable | PivotTable) {\n this.filterFuncRule = [];\n this.filterValueRule = [];\n table.updateFilterRules([]);\n }\n\n clearFilter(table: ListTable | PivotTable, fieldId: string | number) {\n this.filterValueRule = this.filterValueRule.filter(rule => rule.filterKey !== fieldId);\n this.filterFuncRule = this.filterFuncRule.filter(rule => rule.fieldId !== fieldId);\n\n table.updateFilterRules([...this.filterFuncRule, ...this.filterValueRule]);\n }\n}\n"]}
|
|
@@ -74,18 +74,7 @@ export class FilterStateManager {
|
|
|
74
74
|
});
|
|
75
75
|
}
|
|
76
76
|
applyFilters() {
|
|
77
|
-
this.engine.applyFilter(this.state, this.table)
|
|
78
|
-
}
|
|
79
|
-
updateColumnIcons() {
|
|
80
|
-
const columns = this.table.columns;
|
|
81
|
-
if (!columns) return;
|
|
82
|
-
const plugin = this.table.pluginManager.getPluginByName("Filter");
|
|
83
|
-
if (!plugin || !plugin.pluginOptions) return;
|
|
84
|
-
const filterIcon = plugin.pluginOptions.filterIcon, filteringIcon = plugin.pluginOptions.filteringIcon;
|
|
85
|
-
columns.forEach(((col, index) => {
|
|
86
|
-
const field = col.field, filterConfig = this.state.filters.get(field);
|
|
87
|
-
!plugin.shouldEnableFilterForColumn || plugin.shouldEnableFilterForColumn(index, col) ? filterConfig && filterConfig.enable ? col.headerIcon = filteringIcon : col.headerIcon = filterIcon : col.headerIcon !== filterIcon && col.headerIcon !== filteringIcon || delete col.headerIcon;
|
|
88
|
-
})), this.table.updateColumns(columns);
|
|
77
|
+
this.engine.applyFilter(this.state, this.table);
|
|
89
78
|
}
|
|
90
79
|
shouldApplyFilter(action) {
|
|
91
80
|
return [ FilterActionType.REMOVE_FILTER, FilterActionType.ENABLE_FILTER, FilterActionType.DISABLE_FILTER, FilterActionType.CLEAR_ALL_FILTERS, FilterActionType.APPLY_FILTERS ].includes(action.type) || action.payload.enable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filter/filter-state-manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAO3C,MAAM,OAAO,kBAAkB;IAO7B,YAAY,KAA6B,EAAE,MAAoB;QAJvD,cAAS,GAAwC,EAAE,CAAC;QAK1D,IAAI,CAAC,KAAK,GAAG;YACX,OAAO,EAAE,IAAI,GAAG,EAAE;SACnB,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,cAAc,CAAC,OAAyB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAKD,qBAAqB;QACnB,MAAM,YAAY,GAAwB,EAAE,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3C,IAAI,MAAM,CAAC,MAAM,EAAE;gBACjB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC1B;QACH,CAAC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC;IAKD,kBAAkB;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAMD,qBAAqB;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAClD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;IACH,CAAC;IAED,QAAQ,CAAC,MAAoB;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE;YAClC,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,QAAsC;QAC9C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC9D,CAAC,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEO,MAAM,CAAC,KAAkB,EAAE,MAAoB;QACrD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,QAAQ,IAAI,EAAE;YACZ,KAAK,gBAAgB,CAAC,UAAU;gBAC9B,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,kCAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAK,OAAO,EAAG,CAAC;gBAC9E,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,kCAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAE,MAAM,EAAE,IAAI,IAAG,CAAC;gBAChF,MAAM;YACR,KAAK,gBAAgB,CAAC,cAAc;gBAClC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,kCAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAE,MAAM,EAAE,KAAK,IAAG,CAAC;gBACjF,MAAM;YACR,KAAK,gBAAgB,CAAC,iBAAiB;gBACrC,SAAS,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM;YACR,KAAK,gBAAgB,CAAC,aAAa;gBACjC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,gDAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAK,OAAO,KAAE,MAAM,EAAE,IAAI,IAAG,CAAC;gBAC5F,MAAM;SACT;QAED,uCAAY,KAAK,KAAE,OAAO,EAAE,SAAS,IAAG;IAC1C,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/filter/filter-state-manager.ts"],"names":[],"mappings":"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","file":"filter-state-manager.js","sourcesContent":["import type { ListTable, PivotTable } from '@visactor/vtable';\nimport type { ColumnDefine } from '@visactor/vtable/es/ts-types';\nimport type { FilterState, FilterAction, FilterConfig } from './types';\nimport { FilterActionType } from './types';\nimport type { FilterEngine } from './filter-engine';\nimport type { FilterPlugin } from '../filter';\n\n/**\n * 筛选状态管理器,用于管理筛选状态\n */\nexport class FilterStateManager {\n private state: FilterState;\n private engine: FilterEngine;\n private listeners: Array<(state: FilterState) => void> = [];\n\n private table: ListTable | PivotTable;\n\n constructor(table: ListTable | PivotTable, engine: FilterEngine) {\n this.state = {\n filters: new Map()\n };\n this.engine = engine;\n this.table = table;\n }\n\n getFilterState(fieldId?: string | number): FilterConfig {\n return this.state.filters.get(fieldId);\n }\n\n /**\n * 获取所有激活的筛选字段\n */\n getActiveFilterFields(): (string | number)[] {\n const activeFields: (string | number)[] = [];\n this.state.filters.forEach((config, field) => {\n if (config.enable) {\n activeFields.push(field);\n }\n });\n return activeFields;\n }\n\n /**\n * 获取所有筛选状态\n */\n getAllFilterStates(): FilterState {\n return this.state;\n }\n\n /**\n * 公共方法:重新应用当前所有激活的筛选状态\n * 用于在表格配置更新后恢复筛选显示\n */\n reapplyCurrentFilters(): void {\n const activeFields = this.getActiveFilterFields();\n if (activeFields.length > 0) {\n this.applyFilters();\n }\n }\n\n dispatch(action: FilterAction) {\n this.state = this.reduce(this.state, action);\n if (this.shouldApplyFilter(action)) {\n this.applyFilters();\n }\n this.notifyListeners();\n }\n\n subscribe(listener: (state: FilterState) => void): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners(): void {\n this.listeners.forEach(listener => listener(this.state));\n }\n\n private reduce(state: FilterState, action: FilterAction): FilterState {\n const { type, payload } = action;\n const newFilter = new Map(state.filters);\n switch (type) {\n case FilterActionType.ADD_FILTER:\n newFilter.set(payload.field, payload);\n break;\n case FilterActionType.REMOVE_FILTER:\n newFilter.delete(payload.field);\n break;\n case FilterActionType.UPDATE_FILTER:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), ...payload });\n break;\n case FilterActionType.ENABLE_FILTER:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: true });\n break;\n case FilterActionType.DISABLE_FILTER:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), enable: false });\n break;\n case FilterActionType.CLEAR_ALL_FILTERS:\n newFilter.clear();\n break;\n case FilterActionType.APPLY_FILTERS:\n newFilter.set(payload.field, { ...newFilter.get(payload.field), ...payload, enable: true });\n break;\n }\n\n return { ...state, filters: newFilter };\n }\n\n private applyFilters() {\n this.engine.applyFilter(this.state, this.table);\n }\n\n private shouldApplyFilter(action: FilterAction) {\n const shouldApplyActions = [\n FilterActionType.REMOVE_FILTER,\n FilterActionType.ENABLE_FILTER,\n FilterActionType.DISABLE_FILTER,\n FilterActionType.CLEAR_ALL_FILTERS,\n FilterActionType.APPLY_FILTERS\n ];\n return shouldApplyActions.includes(action.type) || action.payload.enable;\n }\n}\n"]}
|
package/es/filter/filter.js
CHANGED
|
@@ -37,7 +37,11 @@ export class FilterPlugin {
|
|
|
37
37
|
if (this.table = table, runtime === TABLE_EVENT_TYPE.BEFORE_INIT) this.filterEngine = new FilterEngine,
|
|
38
38
|
this.filterStateManager = new FilterStateManager(this.table, this.filterEngine),
|
|
39
39
|
this.filterToolbar = new FilterToolbar(this.table, this.filterStateManager), this.filterToolbar.render(document.body),
|
|
40
|
-
this.updateFilterIcons(eventArgs.options)
|
|
40
|
+
this.updateFilterIcons(eventArgs.options), this.filterStateManager.subscribe((() => {
|
|
41
|
+
this.updateFilterIcons(eventArgs.options), this.table.updateColumns(eventArgs.options.columns, {
|
|
42
|
+
clearRowHeightCache: !1
|
|
43
|
+
});
|
|
44
|
+
})); else if (runtime === TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION) this.pluginOptions = Object.assign(Object.assign({}, this.pluginOptions), eventArgs.options.plugins.find((plugin => plugin.id === this.id)).pluginOptions),
|
|
41
45
|
this.handleOptionUpdate(eventArgs.options); else if (runtime === TABLE_EVENT_TYPE.ICON_CLICK && "filter-icon" === eventArgs.name || "filtering-icon" === eventArgs.name) {
|
|
42
46
|
if (3 === (null === (_a = eventArgs.event) || void 0 === _a ? void 0 : _a.which) || 2 === (null === (_b = eventArgs.event) || void 0 === _b ? void 0 : _b.button) || 2 == (2 & (null === (_c = eventArgs.event) || void 0 === _c ? void 0 : _c.buttons))) return;
|
|
43
47
|
const col = eventArgs.col, row = eventArgs.row;
|
|
@@ -70,8 +74,16 @@ export class FilterPlugin {
|
|
|
70
74
|
}));
|
|
71
75
|
}
|
|
72
76
|
updateFilterIcons(options) {
|
|
73
|
-
|
|
74
|
-
|
|
77
|
+
const filterIcon = this.pluginOptions.filterIcon, filteringIcon = this.pluginOptions.filteringIcon, isIconEqual = (a, b) => a === b || a && b && "object" == typeof a && "object" == typeof b && a.name === b.name;
|
|
78
|
+
options.columns.forEach((column => {
|
|
79
|
+
var _a;
|
|
80
|
+
const shouldShow = this.shouldEnableFilterForColumn(column.field, column), isFiltering = !!(null === (_a = this.filterStateManager.getFilterState(column.field)) || void 0 === _a ? void 0 : _a.enable);
|
|
81
|
+
let icons = (icons => icons ? Array.isArray(icons) ? icons : [ icons ] : [])(column.headerIcon);
|
|
82
|
+
var list;
|
|
83
|
+
shouldShow ? isFiltering ? icons.some((icon => isIconEqual(icon, filteringIcon))) || (icons = icons.filter((icon => !isIconEqual(icon, filterIcon))),
|
|
84
|
+
icons.push(filteringIcon)) : icons.some((icon => isIconEqual(icon, filterIcon))) || (icons = icons.filter((icon => !isIconEqual(icon, filteringIcon))),
|
|
85
|
+
icons.push(filterIcon)) : icons = icons.filter((icon => !isIconEqual(icon, filterIcon))),
|
|
86
|
+
column.headerIcon = 0 === (list = icons).length ? void 0 : 1 === list.length ? list[0] : list;
|
|
75
87
|
}));
|
|
76
88
|
}
|
|
77
89
|
shouldEnableFilterForColumn(field, column) {
|
package/es/filter/filter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filter/filter.ts"],"names":[],"mappings":"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","file":"filter.js","sourcesContent":["import { TABLE_EVENT_TYPE, TYPES } from '@visactor/vtable';\nimport { FilterEngine } from './filter-engine';\nimport { FilterStateManager } from './filter-state-manager';\nimport { FilterToolbar } from './filter-toolbar';\nimport type { FilterOptions, FilterConfig, FilterState } from './types';\nimport { FilterActionType } from './types';\nimport type {\n ListTableConstructorOptions,\n pluginsDefinition,\n ListTable,\n PivotTable,\n BaseTableAPI,\n ColumnDefine\n} from '@visactor/vtable';\n\n/**\n * 筛选插件,负责初始化筛选引擎、状态管理器和工具栏\n */\nexport class FilterPlugin implements pluginsDefinition.IVTablePlugin {\n id = `filter`;\n name = 'Filter';\n runTime = [TABLE_EVENT_TYPE.BEFORE_INIT, TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION, TABLE_EVENT_TYPE.ICON_CLICK];\n\n pluginOptions: FilterOptions;\n\n table: ListTable | PivotTable;\n\n filterEngine: FilterEngine;\n filterStateManager: FilterStateManager;\n filterToolbar: FilterToolbar;\n\n constructor(pluginOptions: FilterOptions) {\n this.id = pluginOptions?.id ?? this.id;\n this.pluginOptions = pluginOptions;\n this.pluginOptions.filterIcon = pluginOptions.filterIcon ?? {\n name: 'filter-icon',\n type: 'svg',\n width: 12,\n height: 12,\n positionType: TYPES.IconPosition.right,\n cursor: 'pointer',\n svg: '<svg t=\"1752821809070\" class=\"icon\" viewBox=\"0 0 1664 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"12092\" width=\"200\" height=\"200\"><path d=\"M89.6 179.2A89.6 89.6 0 0 1 89.6 0h1408a89.6 89.6 0 0 1 0 179.2H89.6z m256 384a89.6 89.6 0 0 1 0-179.2h896a89.6 89.6 0 0 1 0 179.2h-896z m256 384a89.6 89.6 0 0 1 0-179.2h384a89.6 89.6 0 0 1 0 179.2h-384z\" fill=\"#93a2b9\" p-id=\"12093\"></path></svg>'\n };\n this.pluginOptions.filteringIcon = pluginOptions.filteringIcon ?? {\n name: 'filtering-icon',\n type: 'svg',\n width: 12,\n height: 12,\n positionType: TYPES.IconPosition.right,\n cursor: 'pointer',\n svg: '<svg t=\"1752821771292\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"11926\" width=\"200\" height=\"200\"><path d=\"M971.614323 53.05548L655.77935 412.054233C635.196622 435.434613 623.906096 465.509377 623.906096 496.583302v495.384307c0 28.975686-35.570152 43.063864-55.353551 21.781723l-159.865852-171.256294c-5.495389-5.895053-8.59279-13.688514-8.592789-21.781722V496.583302c0-31.073925-11.290526-61.148688-31.873254-84.429153L52.385677 53.05548C34.200936 32.472751 48.888611 0 76.365554 0h871.268892c27.476943 0 42.164618 32.472751 23.979877 53.05548z\" fill=\"#416eff\" p-id=\"11927\"></path></svg>'\n };\n if (!this.pluginOptions.filterModes || !this.pluginOptions.filterModes.length) {\n this.pluginOptions.filterModes = ['byValue', 'byCondition'];\n }\n }\n\n run(...args: any[]) {\n const eventArgs = args[0];\n const runtime = args[1];\n const table: BaseTableAPI = args[2];\n this.table = table as ListTable | PivotTable;\n\n if (runtime === TABLE_EVENT_TYPE.BEFORE_INIT) {\n this.filterEngine = new FilterEngine();\n this.filterStateManager = new FilterStateManager(this.table, this.filterEngine);\n this.filterToolbar = new FilterToolbar(this.table, this.filterStateManager);\n\n this.filterToolbar.render(document.body);\n this.updateFilterIcons(eventArgs.options);\n } else if (runtime === TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION) {\n this.pluginOptions = {\n ...this.pluginOptions,\n ...(eventArgs.options.plugins as FilterPlugin[]).find(plugin => plugin.id === this.id).pluginOptions\n };\n this.handleOptionUpdate(eventArgs.options);\n } else if (\n (runtime === TABLE_EVENT_TYPE.ICON_CLICK && eventArgs.name === 'filter-icon') ||\n eventArgs.name === 'filtering-icon'\n ) {\n const isRightClick =\n eventArgs.event?.which === 3 || eventArgs.event?.button === 2 || (eventArgs.event?.buttons & 2) === 2;\n // 如果是右键点击,直接返回不处理\n if (isRightClick) {\n return;\n }\n\n const col = eventArgs.col;\n const row = eventArgs.row;\n if (this.filterToolbar.isVisible) {\n this.filterToolbar.hide();\n } else {\n this.filterToolbar.show(col, row, this.pluginOptions.filterModes);\n }\n }\n }\n\n update() {\n if (this.filterStateManager) {\n this.reapplyActiveFilters();\n }\n }\n\n /**\n * 处理选项更新事件\n */\n private handleOptionUpdate(options: ListTableConstructorOptions): void {\n const currentActiveFields = this.filterStateManager ? this.filterStateManager.getActiveFilterFields() : [];\n\n // 验证筛选状态一致性\n if (this.filterStateManager && currentActiveFields.length > 0) {\n this.validateFilterStatesAfterUpdate(options, currentActiveFields);\n }\n\n // 更新筛选图标\n this.updateFilterIcons(options);\n }\n\n /**\n * 重新应用所有激活的筛选状态\n * 在 updateOption 后调用,因为 updateOption 会全量更新表格\n */\n private reapplyActiveFilters(): void {\n this.filterStateManager.reapplyCurrentFilters();\n }\n\n /**\n * 验证更新后的筛选状态一致性\n */\n private validateFilterStatesAfterUpdate(\n options: ListTableConstructorOptions,\n activeFields: (string | number)[]\n ): void {\n const columns = options.columns;\n const fieldsToRemove: (string | number)[] = [];\n\n activeFields.forEach(field => {\n const column = columns.find(col => col.field === field);\n\n // 检查该列是否仍然应该启用筛选\n if (!column || !this.shouldEnableFilterForColumn(field, column)) {\n fieldsToRemove.push(field);\n }\n });\n\n // 清除不再有效的筛选状态\n fieldsToRemove.forEach(field => {\n this.filterStateManager.dispatch({\n type: FilterActionType.REMOVE_FILTER,\n payload: { field }\n });\n });\n }\n\n /**\n * 更新所有列的筛选图标状态\n * 根据列的筛选启用状态,添加或移除筛选图标\n */\n private updateFilterIcons(options: ListTableConstructorOptions): void {\n const columns = options.columns; // TODO: 待处理多行的情况,待扩展透视表类型\n columns.forEach((col: ColumnDefine) => {\n // 检查是否应该为这一列启用筛选功能\n if (this.shouldEnableFilterForColumn(col.field as string | number, col)) {\n col.headerIcon = this.pluginOptions.filterIcon;\n } else {\n // 如果不应该启用筛选,则移除 headerIcon\n delete col.headerIcon;\n }\n });\n // (this.table as VTable.ListTable).updateColumns(columns);\n }\n\n /**\n * 判断指定列是否应该启用筛选功能\n */\n shouldEnableFilterForColumn(field: number | string, column: ColumnDefine): boolean {\n // 如果是空白列,不适用筛选\n if (!column.title) {\n return false;\n }\n\n // 首先检查列级别的 filter 属性(最高优先级)\n const columnWithFilter = column as any;\n if (columnWithFilter.filter !== undefined) {\n return !!columnWithFilter.filter;\n }\n\n // 如果有自定义的启用钩子函数,使用钩子函数的结果\n if (this.pluginOptions.enableFilter) {\n return this.pluginOptions.enableFilter(field, column);\n }\n\n // 如果没有钩子函数,使用默认启用配置\n if (this.pluginOptions.defaultEnabled !== undefined) {\n return this.pluginOptions.defaultEnabled;\n }\n\n // 默认情况,所有列都启用筛选\n return true;\n }\n\n /**\n * 获取当前的筛选状态\n * 用于保存配置时获取筛选状态\n */\n getFilterState(): any {\n if (!this.filterStateManager) {\n return null;\n }\n\n const state = this.filterStateManager.getAllFilterStates();\n const serializedState: Record<string | number, any> = {};\n\n // 将 Map 转换为普通对象以便序列化\n state.filters.forEach((config: FilterConfig, field: string | number) => {\n serializedState[field] = {\n enable: config.enable,\n field: config.field,\n type: config.type,\n values: config.values,\n operator: config.operator,\n condition: config.condition\n };\n });\n\n return {\n filters: serializedState\n };\n }\n\n /**\n * 设置筛选状态\n * 用于从保存的配置中恢复筛选状态\n */\n setFilterState(filterState: FilterState): void {\n if (!this.filterStateManager || !filterState || !filterState.filters) {\n console.warn('setFilterState: 无效的筛选状态或状态管理器未初始化');\n return;\n }\n\n // 清除当前所有筛选\n this.filterStateManager.dispatch({\n type: FilterActionType.CLEAR_ALL_FILTERS,\n payload: {}\n });\n\n const columns = (this.table as ListTable).columns;\n\n // 恢复每个筛选配置\n Object.entries(filterState.filters).forEach(([, config]: [string, any]) => {\n if (config.enable) {\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: config.field,\n type: config.type,\n values: config.values,\n operator: config.operator,\n condition: config.condition,\n enable: true\n }\n });\n }\n });\n }\n\n release() {\n this.table = null;\n this.filterEngine = null;\n this.filterStateManager = null;\n this.filterToolbar = null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/filter/filter.ts"],"names":[],"mappings":"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","file":"filter.js","sourcesContent":["import { TABLE_EVENT_TYPE, TYPES } from '@visactor/vtable';\nimport { FilterEngine } from './filter-engine';\nimport { FilterStateManager } from './filter-state-manager';\nimport { FilterToolbar } from './filter-toolbar';\nimport type { FilterOptions, FilterConfig, FilterState } from './types';\nimport { FilterActionType } from './types';\nimport type {\n ListTableConstructorOptions,\n pluginsDefinition,\n ListTable,\n PivotTable,\n BaseTableAPI,\n ColumnDefine\n} from '@visactor/vtable';\n\n/**\n * 筛选插件,负责初始化筛选引擎、状态管理器和工具栏\n */\nexport class FilterPlugin implements pluginsDefinition.IVTablePlugin {\n id = `filter`;\n name = 'Filter';\n runTime = [TABLE_EVENT_TYPE.BEFORE_INIT, TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION, TABLE_EVENT_TYPE.ICON_CLICK];\n\n pluginOptions: FilterOptions;\n\n table: ListTable | PivotTable;\n\n filterEngine: FilterEngine;\n filterStateManager: FilterStateManager;\n filterToolbar: FilterToolbar;\n\n constructor(pluginOptions: FilterOptions) {\n this.id = pluginOptions?.id ?? this.id;\n this.pluginOptions = pluginOptions;\n this.pluginOptions.filterIcon = pluginOptions.filterIcon ?? {\n name: 'filter-icon',\n type: 'svg',\n width: 12,\n height: 12,\n positionType: TYPES.IconPosition.right,\n cursor: 'pointer',\n svg: '<svg t=\"1752821809070\" class=\"icon\" viewBox=\"0 0 1664 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"12092\" width=\"200\" height=\"200\"><path d=\"M89.6 179.2A89.6 89.6 0 0 1 89.6 0h1408a89.6 89.6 0 0 1 0 179.2H89.6z m256 384a89.6 89.6 0 0 1 0-179.2h896a89.6 89.6 0 0 1 0 179.2h-896z m256 384a89.6 89.6 0 0 1 0-179.2h384a89.6 89.6 0 0 1 0 179.2h-384z\" fill=\"#93a2b9\" p-id=\"12093\"></path></svg>'\n };\n this.pluginOptions.filteringIcon = pluginOptions.filteringIcon ?? {\n name: 'filtering-icon',\n type: 'svg',\n width: 12,\n height: 12,\n positionType: TYPES.IconPosition.right,\n cursor: 'pointer',\n svg: '<svg t=\"1752821771292\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"11926\" width=\"200\" height=\"200\"><path d=\"M971.614323 53.05548L655.77935 412.054233C635.196622 435.434613 623.906096 465.509377 623.906096 496.583302v495.384307c0 28.975686-35.570152 43.063864-55.353551 21.781723l-159.865852-171.256294c-5.495389-5.895053-8.59279-13.688514-8.592789-21.781722V496.583302c0-31.073925-11.290526-61.148688-31.873254-84.429153L52.385677 53.05548C34.200936 32.472751 48.888611 0 76.365554 0h871.268892c27.476943 0 42.164618 32.472751 23.979877 53.05548z\" fill=\"#416eff\" p-id=\"11927\"></path></svg>'\n };\n if (!this.pluginOptions.filterModes || !this.pluginOptions.filterModes.length) {\n this.pluginOptions.filterModes = ['byValue', 'byCondition'];\n }\n }\n\n run(...args: any[]) {\n const eventArgs = args[0];\n const runtime = args[1];\n const table: BaseTableAPI = args[2];\n this.table = table as ListTable | PivotTable;\n\n if (runtime === TABLE_EVENT_TYPE.BEFORE_INIT) {\n this.filterEngine = new FilterEngine();\n this.filterStateManager = new FilterStateManager(this.table, this.filterEngine);\n this.filterToolbar = new FilterToolbar(this.table, this.filterStateManager);\n\n this.filterToolbar.render(document.body);\n this.updateFilterIcons(eventArgs.options);\n this.filterStateManager.subscribe(() => {\n this.updateFilterIcons(eventArgs.options);\n (this.table as ListTable).updateColumns(eventArgs.options.columns, {\n clearRowHeightCache: false\n });\n });\n } else if (runtime === TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION) {\n this.pluginOptions = {\n ...this.pluginOptions,\n ...(eventArgs.options.plugins as FilterPlugin[]).find(plugin => plugin.id === this.id).pluginOptions\n };\n this.handleOptionUpdate(eventArgs.options);\n } else if (\n (runtime === TABLE_EVENT_TYPE.ICON_CLICK && eventArgs.name === 'filter-icon') ||\n eventArgs.name === 'filtering-icon'\n ) {\n const isRightClick =\n eventArgs.event?.which === 3 || eventArgs.event?.button === 2 || (eventArgs.event?.buttons & 2) === 2;\n // 如果是右键点击,直接返回不处理\n if (isRightClick) {\n return;\n }\n\n const col = eventArgs.col;\n const row = eventArgs.row;\n if (this.filterToolbar.isVisible) {\n this.filterToolbar.hide();\n } else {\n this.filterToolbar.show(col, row, this.pluginOptions.filterModes);\n }\n }\n }\n\n update() {\n if (this.filterStateManager) {\n this.reapplyActiveFilters();\n }\n }\n\n /**\n * 处理选项更新事件\n */\n private handleOptionUpdate(options: ListTableConstructorOptions): void {\n const currentActiveFields = this.filterStateManager ? this.filterStateManager.getActiveFilterFields() : [];\n\n // 验证筛选状态一致性\n if (this.filterStateManager && currentActiveFields.length > 0) {\n this.validateFilterStatesAfterUpdate(options, currentActiveFields);\n }\n\n // 更新筛选图标\n this.updateFilterIcons(options);\n }\n\n /**\n * 重新应用所有激活的筛选状态\n * 在 updateOption 后调用,因为 updateOption 会全量更新表格\n */\n private reapplyActiveFilters(): void {\n this.filterStateManager.reapplyCurrentFilters();\n }\n\n /**\n * 验证更新后的筛选状态一致性\n */\n private validateFilterStatesAfterUpdate(\n options: ListTableConstructorOptions,\n activeFields: (string | number)[]\n ): void {\n const columns = options.columns;\n const fieldsToRemove: (string | number)[] = [];\n\n activeFields.forEach(field => {\n const column = columns.find(col => col.field === field);\n\n // 检查该列是否仍然应该启用筛选\n if (!column || !this.shouldEnableFilterForColumn(field, column)) {\n fieldsToRemove.push(field);\n }\n });\n\n // 清除不再有效的筛选状态\n fieldsToRemove.forEach(field => {\n this.filterStateManager.dispatch({\n type: FilterActionType.REMOVE_FILTER,\n payload: { field }\n });\n });\n }\n\n /**\n * 更新所有列的筛选图标状态\n * 根据列的筛选启用状态,添加或移除筛选图标\n */\n private updateFilterIcons(options) {\n const filterIcon = this.pluginOptions.filterIcon;\n const filteringIcon = this.pluginOptions.filteringIcon;\n\n const isIconEqual = (a, b) =>\n a === b || (a && b && typeof a === 'object' && typeof b === 'object' && a.name === b.name);\n\n const toIconList = icons => (icons ? (Array.isArray(icons) ? icons : [icons]) : []);\n\n const compactIcons = list => (list.length === 0 ? undefined : list.length === 1 ? list[0] : list);\n\n options.columns.forEach(column => {\n const shouldShow = this.shouldEnableFilterForColumn(column.field, column);\n const isFiltering = !!this.filterStateManager.getFilterState(column.field)?.enable;\n let icons = toIconList(column.headerIcon);\n\n if (shouldShow) {\n if (isFiltering) {\n if (!icons.some(icon => isIconEqual(icon, filteringIcon))) {\n icons = icons.filter(icon => !isIconEqual(icon, filterIcon));\n icons.push(filteringIcon);\n }\n } else {\n if (!icons.some(icon => isIconEqual(icon, filterIcon))) {\n icons = icons.filter(icon => !isIconEqual(icon, filteringIcon));\n icons.push(filterIcon);\n }\n }\n } else {\n icons = icons.filter(icon => !isIconEqual(icon, filterIcon));\n }\n\n column.headerIcon = compactIcons(icons);\n });\n }\n\n /**\n * 判断指定列是否应该启用筛选功能\n */\n shouldEnableFilterForColumn(field: number | string, column: ColumnDefine): boolean {\n // 如果是空白列,不适用筛选\n if (!column.title) {\n return false;\n }\n\n // 首先检查列级别的 filter 属性(最高优先级)\n const columnWithFilter = column as any;\n if (columnWithFilter.filter !== undefined) {\n return !!columnWithFilter.filter;\n }\n\n // 如果有自定义的启用钩子函数,使用钩子函数的结果\n if (this.pluginOptions.enableFilter) {\n return this.pluginOptions.enableFilter(field, column);\n }\n\n // 如果没有钩子函数,使用默认启用配置\n if (this.pluginOptions.defaultEnabled !== undefined) {\n return this.pluginOptions.defaultEnabled;\n }\n\n // 默认情况,所有列都启用筛选\n return true;\n }\n\n /**\n * 获取当前的筛选状态\n * 用于保存配置时获取筛选状态\n */\n getFilterState(): any {\n if (!this.filterStateManager) {\n return null;\n }\n\n const state = this.filterStateManager.getAllFilterStates();\n const serializedState: Record<string | number, any> = {};\n\n // 将 Map 转换为普通对象以便序列化\n state.filters.forEach((config: FilterConfig, field: string | number) => {\n serializedState[field] = {\n enable: config.enable,\n field: config.field,\n type: config.type,\n values: config.values,\n operator: config.operator,\n condition: config.condition\n };\n });\n\n return {\n filters: serializedState\n };\n }\n\n /**\n * 设置筛选状态\n * 用于从保存的配置中恢复筛选状态\n */\n setFilterState(filterState: FilterState): void {\n if (!this.filterStateManager || !filterState || !filterState.filters) {\n console.warn('setFilterState: 无效的筛选状态或状态管理器未初始化');\n return;\n }\n\n // 清除当前所有筛选\n this.filterStateManager.dispatch({\n type: FilterActionType.CLEAR_ALL_FILTERS,\n payload: {}\n });\n\n const columns = (this.table as ListTable).columns;\n\n // 恢复每个筛选配置\n Object.entries(filterState.filters).forEach(([, config]: [string, any]) => {\n if (config.enable) {\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: config.field,\n type: config.type,\n values: config.values,\n operator: config.operator,\n condition: config.condition,\n enable: true\n }\n });\n }\n });\n }\n\n release() {\n this.table = null;\n this.filterEngine = null;\n this.filterStateManager = null;\n this.filterToolbar = null;\n }\n}\n"]}
|
|
@@ -3,13 +3,18 @@ import type { DetailTableOptions, MasterDetailPluginOptions } from './types';
|
|
|
3
3
|
export declare class ConfigManager {
|
|
4
4
|
private pluginOptions;
|
|
5
5
|
private table;
|
|
6
|
+
private expandRowCallback?;
|
|
6
7
|
constructor(pluginOptions: MasterDetailPluginOptions, table: VTable.ListTable);
|
|
8
|
+
setExpandRowCallback(callback: (rowIndex: number) => void): void;
|
|
7
9
|
private hasChildren;
|
|
8
10
|
injectMasterDetailOptions(options: VTable.ListTableConstructorOptions): void;
|
|
9
|
-
private getDataCount;
|
|
10
11
|
private disableRefreshHierarchyState;
|
|
11
12
|
private setupInitializedListener;
|
|
12
13
|
private processRecordsHierarchyStates;
|
|
14
|
+
private performInitialExpansion;
|
|
15
|
+
private getExpandableRecords;
|
|
16
|
+
private startAsyncExpansion;
|
|
17
|
+
private isCellGroupCreated;
|
|
13
18
|
getDetailConfigForRecord(record: unknown, bodyRowIndex: number): DetailTableOptions | null;
|
|
14
19
|
private isRowExpanded;
|
|
15
20
|
setRowExpandedChecker(checker: (row: number) => boolean): void;
|
|
@@ -4,6 +4,9 @@ export class ConfigManager {
|
|
|
4
4
|
constructor(pluginOptions, table) {
|
|
5
5
|
this.pluginOptions = pluginOptions, this.table = table, this.isRowExpanded = () => !1;
|
|
6
6
|
}
|
|
7
|
+
setExpandRowCallback(callback) {
|
|
8
|
+
this.expandRowCallback = callback;
|
|
9
|
+
}
|
|
7
10
|
hasChildren(record) {
|
|
8
11
|
if (record && "object" == typeof record && "children" in record) {
|
|
9
12
|
const children = record.children;
|
|
@@ -35,10 +38,6 @@ export class ConfigManager {
|
|
|
35
38
|
}
|
|
36
39
|
this.disableRefreshHierarchyState();
|
|
37
40
|
}
|
|
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
41
|
disableRefreshHierarchyState() {
|
|
43
42
|
setTimeout((() => {
|
|
44
43
|
const tableWithPrivateMethod = this.table;
|
|
@@ -53,15 +52,63 @@ export class ConfigManager {
|
|
|
53
52
|
}));
|
|
54
53
|
}
|
|
55
54
|
processRecordsHierarchyStates(records) {
|
|
56
|
-
const HierarchyState = VTable.TYPES.HierarchyState;
|
|
55
|
+
const HierarchyState = VTable.TYPES.HierarchyState, headerExpandLevel = this.table.options.headerExpandLevel;
|
|
57
56
|
(recordList => {
|
|
58
57
|
recordList.forEach((record => {
|
|
59
58
|
if (record && "object" == typeof record) {
|
|
60
59
|
const recordObj = record;
|
|
61
|
-
(this.hasChildren(record) || !0 === recordObj.children) && (recordObj.hierarchyState = HierarchyState.collapse);
|
|
60
|
+
(this.hasChildren(record) || !0 === recordObj.children) && ("expand" === recordObj.hierarchyState ? recordObj.hierarchyState = HierarchyState.expand : "collapse" === recordObj.hierarchyState ? recordObj.hierarchyState = HierarchyState.collapse : recordObj.hierarchyState || (recordObj.hierarchyState = headerExpandLevel && headerExpandLevel > 1 ? HierarchyState.expand : HierarchyState.collapse));
|
|
62
61
|
}
|
|
63
62
|
}));
|
|
64
|
-
})(records);
|
|
63
|
+
})(records), this.performInitialExpansion();
|
|
64
|
+
}
|
|
65
|
+
performInitialExpansion() {
|
|
66
|
+
const expandableRecords = this.getExpandableRecords();
|
|
67
|
+
0 !== expandableRecords.length && this.startAsyncExpansion(expandableRecords);
|
|
68
|
+
}
|
|
69
|
+
getExpandableRecords() {
|
|
70
|
+
const dataSource = this.table.dataSource, allRecords = dataSource.source || dataSource._source || this.table.dataSource.records, HierarchyState = VTable.TYPES.HierarchyState, expandableRecords = [], tableWithInternalProps = this.table;
|
|
71
|
+
tableWithInternalProps.internalProps.expandedRecordIndices || (tableWithInternalProps.internalProps.expandedRecordIndices = []);
|
|
72
|
+
const expandedRecordIndices = tableWithInternalProps.internalProps.expandedRecordIndices;
|
|
73
|
+
for (let recordIndex = 0; recordIndex < allRecords.length; recordIndex++) {
|
|
74
|
+
const record = allRecords[recordIndex];
|
|
75
|
+
if (record && "object" == typeof record) {
|
|
76
|
+
const recordObj = record;
|
|
77
|
+
if ((this.hasChildren(record) || !0 === recordObj.children) && recordObj.hierarchyState === HierarchyState.expand) {
|
|
78
|
+
expandedRecordIndices.includes(recordIndex) || expandedRecordIndices.push(recordIndex);
|
|
79
|
+
try {
|
|
80
|
+
const bodyRowIndex = this.table.getBodyRowIndexByRecordIndex(recordIndex);
|
|
81
|
+
if (bodyRowIndex >= 0) {
|
|
82
|
+
const actualRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;
|
|
83
|
+
expandableRecords.push({
|
|
84
|
+
recordIndex: recordIndex,
|
|
85
|
+
actualRowIndex: actualRowIndex,
|
|
86
|
+
record: record
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
} catch (error) {}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return expandableRecords;
|
|
94
|
+
}
|
|
95
|
+
startAsyncExpansion(expandableRecords) {
|
|
96
|
+
let currentIndex = 0;
|
|
97
|
+
const processNextExpansion = () => {
|
|
98
|
+
if (currentIndex >= expandableRecords.length) return;
|
|
99
|
+
const {actualRowIndex: actualRowIndex} = expandableRecords[currentIndex];
|
|
100
|
+
this.isCellGroupCreated(actualRowIndex) ? (this.expandRowCallback && this.expandRowCallback(actualRowIndex),
|
|
101
|
+
currentIndex++, setTimeout(processNextExpansion, 0)) : setTimeout(processNextExpansion, 16);
|
|
102
|
+
};
|
|
103
|
+
setTimeout(processNextExpansion, 0);
|
|
104
|
+
}
|
|
105
|
+
isCellGroupCreated(rowIndex) {
|
|
106
|
+
try {
|
|
107
|
+
const cellGroup = this.table.scenegraph.getCell(0, rowIndex);
|
|
108
|
+
return cellGroup && "cell" === cellGroup.role;
|
|
109
|
+
} catch (error) {
|
|
110
|
+
return !1;
|
|
111
|
+
}
|
|
65
112
|
}
|
|
66
113
|
getDetailConfigForRecord(record, bodyRowIndex) {
|
|
67
114
|
const detailOptions = this.pluginOptions.detailTableOptions;
|
|
@@ -1 +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"]}
|
|
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 private expandRowCallback?: (rowIndex: number) => void;\r\n\r\n constructor(private pluginOptions: MasterDetailPluginOptions, private table: VTable.ListTable) {}\r\n\r\n /**\r\n * 设置展开行的回调函数\r\n */\r\n setExpandRowCallback(callback: (rowIndex: number) => void): void {\r\n this.expandRowCallback = callback;\r\n }\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 * 禁用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 headerExpandLevel = this.table.options.headerExpandLevel;\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) || recordObj.children === true) {\r\n // 优先级:records 中的 hierarchyState > headerExpandLevel\r\n if (recordObj.hierarchyState === 'expand') {\r\n // 明确设置为展开\r\n recordObj.hierarchyState = HierarchyState.expand;\r\n } else if (recordObj.hierarchyState === 'collapse') {\r\n // 明确设置为收起\r\n recordObj.hierarchyState = HierarchyState.collapse;\r\n } else if (!recordObj.hierarchyState) {\r\n // 没有明确设置,根据 headerExpandLevel 决定\r\n if (headerExpandLevel && headerExpandLevel > 1) {\r\n recordObj.hierarchyState = HierarchyState.expand;\r\n } else {\r\n recordObj.hierarchyState = HierarchyState.collapse;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n processRecords(records);\r\n this.performInitialExpansion();\r\n }\r\n\r\n /**\r\n * 遍历所有记录,根据 hierarchyState 状态执行初始展开\r\n * 与VTable的异步CellGroup创建过程同步,在每个CellGroup创建后检查是否需要展开\r\n */\r\n private performInitialExpansion(): void {\r\n // 获取需要展开的记录索引列表\r\n const expandableRecords = this.getExpandableRecords();\r\n if (expandableRecords.length === 0) {\r\n return;\r\n }\r\n\r\n // 开始异步展开过程,与VTable的渲染频率同步\r\n this.startAsyncExpansion(expandableRecords);\r\n }\r\n\r\n /**\r\n * 获取所有需要展开的记录信息\r\n */\r\n private getExpandableRecords(): Array<{ recordIndex: number; actualRowIndex: number; record: unknown }> {\r\n const dataSource = this.table.dataSource as unknown as {\r\n source?: unknown[];\r\n _source?: unknown[];\r\n records: unknown[];\r\n };\r\n const allRecords = dataSource.source || dataSource._source || this.table.dataSource.records;\r\n const HierarchyState = VTable.TYPES.HierarchyState;\r\n const expandableRecords: Array<{ recordIndex: number; actualRowIndex: number; record: unknown }> = [];\r\n\r\n // 获取插件内部属性来访问 expandedRecordIndices\r\n const tableWithInternalProps = this.table as unknown as {\r\n internalProps: { expandedRecordIndices: number[] };\r\n };\r\n if (!tableWithInternalProps.internalProps.expandedRecordIndices) {\r\n tableWithInternalProps.internalProps.expandedRecordIndices = [];\r\n }\r\n const expandedRecordIndices = tableWithInternalProps.internalProps.expandedRecordIndices;\r\n\r\n // 遍历所有记录,收集需要展开的行\r\n for (let recordIndex = 0; recordIndex < allRecords.length; recordIndex++) {\r\n const record = allRecords[recordIndex];\r\n if (record && typeof record === 'object') {\r\n const recordObj = record as Record<string, unknown>;\r\n // 检查是否需要展开\r\n if (\r\n (this.hasChildren(record) || recordObj.children === true) &&\r\n recordObj.hierarchyState === HierarchyState.expand\r\n ) {\r\n // 将记录索引添加到 expandedRecordIndices 中\r\n if (!expandedRecordIndices.includes(recordIndex)) {\r\n expandedRecordIndices.push(recordIndex);\r\n }\r\n // 尝试获取行索引\r\n try {\r\n const bodyRowIndex = this.table.getBodyRowIndexByRecordIndex(recordIndex);\r\n if (bodyRowIndex >= 0) {\r\n const actualRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;\r\n expandableRecords.push({ recordIndex, actualRowIndex, record });\r\n }\r\n } catch (error) {\r\n // 记录可能不在当前页面中,跳过\r\n }\r\n }\r\n }\r\n }\r\n\r\n return expandableRecords;\r\n }\r\n\r\n /**\r\n * 开始异步展开过程,与VTable的异步渲染同步\r\n */\r\n private startAsyncExpansion(\r\n expandableRecords: Array<{ recordIndex: number; actualRowIndex: number; record: unknown }>\r\n ): void {\r\n let currentIndex = 0;\r\n\r\n const processNextExpansion = (): void => {\r\n if (currentIndex >= expandableRecords.length) {\r\n return; // 所有展开操作完成\r\n }\r\n\r\n const { actualRowIndex } = expandableRecords[currentIndex];\r\n // 检查该行的CellGroup是否已经创建\r\n if (this.isCellGroupCreated(actualRowIndex)) {\r\n // CellGroup已创建,立即执行展开\r\n if (this.expandRowCallback) {\r\n this.expandRowCallback(actualRowIndex);\r\n }\r\n currentIndex++;\r\n // 立即处理下一个,避免不必要的延迟\r\n setTimeout(processNextExpansion, 0);\r\n } else {\r\n // CellGroup尚未创建,等待16ms后再检查(与VTable的异步渲染频率同步)\r\n setTimeout(processNextExpansion, 16);\r\n }\r\n };\r\n // 启动异步展开过程\r\n setTimeout(processNextExpansion, 0);\r\n }\r\n\r\n /**\r\n * 检查指定行的CellGroup是否已经创建\r\n */\r\n private isCellGroupCreated(rowIndex: number): boolean {\r\n try {\r\n // 检查第一列的CellGroup是否存在且有效\r\n const cellGroup = this.table.scenegraph.getCell(0, rowIndex);\r\n return cellGroup && cellGroup.role === 'cell';\r\n } catch (error) {\r\n return false;\r\n }\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"]}
|
|
@@ -24,6 +24,7 @@ export declare class MasterDetailPlugin implements VTable.plugins.IVTablePlugin
|
|
|
24
24
|
private updateOriginalHeightsAfterAdaptive;
|
|
25
25
|
private restoreExpandedStatesAfter;
|
|
26
26
|
expandRow(rowIndex: number, colIndex?: number): void;
|
|
27
|
+
private handleAutoHeightUpdate;
|
|
27
28
|
collapseRow(rowIndex: number, colIndex?: number): void;
|
|
28
29
|
private collapseRowToNoRealRecordIndex;
|
|
29
30
|
toggleRowExpand(rowIndex: number, colIndex?: number): void;
|
|
@@ -34,7 +35,6 @@ export declare class MasterDetailPlugin implements VTable.plugins.IVTablePlugin
|
|
|
34
35
|
private removeUnderlineFromRow;
|
|
35
36
|
private removeUnderlineFromCell;
|
|
36
37
|
private refreshRowIcon;
|
|
37
|
-
update(): void;
|
|
38
38
|
setRecordChildren(children: unknown[], col: number, row: number): void;
|
|
39
39
|
release(): void;
|
|
40
40
|
private clearAllSubTableVisibleSelections;
|
|
@@ -46,5 +46,6 @@ export declare class MasterDetailPlugin implements VTable.plugins.IVTablePlugin
|
|
|
46
46
|
subTable: VTable.ListTable;
|
|
47
47
|
record?: unknown;
|
|
48
48
|
}>;
|
|
49
|
+
private updateFrozenColumnShadowHeight;
|
|
49
50
|
private cleanupMasterDetailFeatures;
|
|
50
51
|
}
|
|
@@ -33,6 +33,7 @@ export class MasterDetailPlugin {
|
|
|
33
33
|
this.configManager = new ConfigManager(this.pluginOptions, this.table), this.eventManager = new EventManager(this.table);
|
|
34
34
|
const enableCheckboxCascade = null === (_a = this.pluginOptions.enableCheckboxCascade) || void 0 === _a || _a;
|
|
35
35
|
this.subTableManager = new SubTableManager(this.table, enableCheckboxCascade), this.configManager.setRowExpandedChecker((row => this.eventManager.isRowExpanded(row))),
|
|
36
|
+
this.configManager.setExpandRowCallback((rowIndex => this.expandRow(rowIndex))),
|
|
36
37
|
this.eventManager.setCallbacks({
|
|
37
38
|
onUpdateSubTablePositions: () => this.subTableManager.recalculateAllSubTablePositions(),
|
|
38
39
|
onUpdateSubTablePositionsForRow: () => this.subTableManager.updateSubTablePositionsForRowResize(),
|
|
@@ -43,7 +44,9 @@ export class MasterDetailPlugin {
|
|
|
43
44
|
getOriginalRowHeight: bodyRowIndex => getOriginalRowHeight(this.table, bodyRowIndex)
|
|
44
45
|
}), this.subTableManager.setCallbacks({
|
|
45
46
|
getDetailConfigForRecord: (record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)
|
|
46
|
-
})
|
|
47
|
+
}), this.subTableManager.setAutoHeightCallback(((bodyRowIndex, newTotalHeight) => {
|
|
48
|
+
this.handleAutoHeightUpdate(bodyRowIndex, newTotalHeight);
|
|
49
|
+
}));
|
|
47
50
|
}
|
|
48
51
|
setupMasterDetailFeatures() {
|
|
49
52
|
this.initInternalProps(), this.eventManager.bindEventHandlers(), this.setupUnifiedSelectionManagement(),
|
|
@@ -104,13 +107,23 @@ export class MasterDetailPlugin {
|
|
|
104
107
|
internalProps.expandedRecordIndices && (includesRecordIndex(internalProps.expandedRecordIndices, realRecordIndex) || internalProps.expandedRecordIndices.push(realRecordIndex)),
|
|
105
108
|
this.eventManager.addExpandedRow(rowIndex);
|
|
106
109
|
const originalHeight = this.table.getRowHeight(rowIndex);
|
|
107
|
-
|
|
108
|
-
|
|
110
|
+
if (internalProps.originalRowHeights) {
|
|
111
|
+
this.table.scenegraph.getCell(colIndex, rowIndex);
|
|
112
|
+
internalProps.originalRowHeights.set(bodyRowIndex, originalHeight);
|
|
113
|
+
}
|
|
114
|
+
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 = "auto" === height ? 300 : "number" == typeof height ? height : 300;
|
|
109
115
|
this.updateRowHeightForExpand(rowIndex, deltaHeight), this.table.scenegraph.updateContainerHeight(rowIndex, deltaHeight),
|
|
110
116
|
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
117
|
rowIndex !== this.table.rowCount - 1 && this.drawUnderlineForRow(rowIndex), this.refreshRowIcon(rowIndex, colIndex),
|
|
113
|
-
"adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode()
|
|
118
|
+
"adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode(),
|
|
119
|
+
this.updateFrozenColumnShadowHeight();
|
|
120
|
+
}
|
|
121
|
+
handleAutoHeightUpdate(bodyRowIndex, newTotalHeight) {
|
|
122
|
+
var _a;
|
|
123
|
+
try {
|
|
124
|
+
const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount, currentRowHeight = this.table.getRowHeight(rowIndex), originalHeight = (null === (_a = getInternalProps(this.table).originalRowHeights) || void 0 === _a ? void 0 : _a.get(bodyRowIndex)) || 0, heightDifference = newTotalHeight - (currentRowHeight - originalHeight);
|
|
125
|
+
this.updateRowHeightForExpand(rowIndex, heightDifference), this.table.scenegraph.updateContainerHeight(rowIndex, heightDifference);
|
|
126
|
+
} catch (error) {}
|
|
114
127
|
}
|
|
115
128
|
collapseRow(rowIndex, colIndex) {
|
|
116
129
|
const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = getInternalProps(this.table);
|
|
@@ -125,8 +138,9 @@ export class MasterDetailPlugin {
|
|
|
125
138
|
const deltaHeight = this.table.getRowHeight(rowIndex) - getOriginalRowHeight(this.table, bodyRowIndex);
|
|
126
139
|
this.updateRowHeightForExpand(rowIndex, -deltaHeight), internalProps._heightResizedRowMap.delete(rowIndex),
|
|
127
140
|
this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight), internalProps.originalRowHeights && internalProps.originalRowHeights.delete(bodyRowIndex),
|
|
128
|
-
rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.
|
|
129
|
-
|
|
141
|
+
rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.refreshRowIcon(rowIndex, colIndex),
|
|
142
|
+
"adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode(),
|
|
143
|
+
this.updateFrozenColumnShadowHeight();
|
|
130
144
|
}
|
|
131
145
|
collapseRowToNoRealRecordIndex(rowIndex) {
|
|
132
146
|
const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = getInternalProps(this.table);
|
|
@@ -135,8 +149,9 @@ export class MasterDetailPlugin {
|
|
|
135
149
|
const deltaHeight = this.table.getRowHeight(rowIndex) - getOriginalRowHeight(this.table, bodyRowIndex);
|
|
136
150
|
this.updateRowHeightForExpand(rowIndex, -deltaHeight), internalProps._heightResizedRowMap.delete(rowIndex),
|
|
137
151
|
this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight), internalProps.originalRowHeights && internalProps.originalRowHeights.delete(bodyRowIndex),
|
|
138
|
-
rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.
|
|
139
|
-
|
|
152
|
+
rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.refreshRowIcon(rowIndex),
|
|
153
|
+
"adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode(),
|
|
154
|
+
this.updateFrozenColumnShadowHeight();
|
|
140
155
|
}
|
|
141
156
|
toggleRowExpand(rowIndex, colIndex) {
|
|
142
157
|
this.eventManager.isRowExpanded(rowIndex) ? this.collapseRow(rowIndex, colIndex) : this.expandRow(rowIndex, colIndex);
|
|
@@ -206,9 +221,6 @@ export class MasterDetailPlugin {
|
|
|
206
221
|
this.table.scenegraph.updateHierarchyIcon(targetColumnIndex, rowIndex);
|
|
207
222
|
}
|
|
208
223
|
}
|
|
209
|
-
update() {
|
|
210
|
-
this.table && this.subTableManager.recalculateAllSubTablePositions(0, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)));
|
|
211
|
-
}
|
|
212
224
|
setRecordChildren(children, col, row) {
|
|
213
225
|
const recordIndex = this.table.getRecordIndexByCell(col, row);
|
|
214
226
|
if (null == recordIndex) return;
|
|
@@ -277,6 +289,12 @@ export class MasterDetailPlugin {
|
|
|
277
289
|
} catch (error) {}
|
|
278
290
|
return result;
|
|
279
291
|
}
|
|
292
|
+
updateFrozenColumnShadowHeight() {
|
|
293
|
+
try {
|
|
294
|
+
const frozenColCount = this.table.frozenColCount;
|
|
295
|
+
frozenColCount > 0 && this.table.scenegraph.component.setFrozenColumnShadow(frozenColCount - 1);
|
|
296
|
+
} catch (error) {}
|
|
297
|
+
}
|
|
280
298
|
cleanupMasterDetailFeatures() {
|
|
281
299
|
this.mainTableClickHandler && (this.table.off("click_cell", this.mainTableClickHandler),
|
|
282
300
|
this.mainTableClickHandler = void 0), this.tableAPIExtensions && (this.tableAPIExtensions.cleanup(),
|