@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.
Files changed (53) hide show
  1. package/cjs/filter/filter-engine.js +3 -1
  2. package/cjs/filter/filter-engine.js.map +1 -1
  3. package/cjs/filter/filter-state-manager.d.ts +0 -1
  4. package/cjs/filter/filter-state-manager.js +1 -12
  5. package/cjs/filter/filter-state-manager.js.map +1 -1
  6. package/cjs/filter/filter.js +16 -3
  7. package/cjs/filter/filter.js.map +1 -1
  8. package/cjs/master-detail-plugin/config.d.ts +6 -1
  9. package/cjs/master-detail-plugin/config.js +54 -7
  10. package/cjs/master-detail-plugin/config.js.map +1 -1
  11. package/cjs/master-detail-plugin/core.d.ts +2 -1
  12. package/cjs/master-detail-plugin/core.js +31 -12
  13. package/cjs/master-detail-plugin/core.js.map +1 -1
  14. package/cjs/master-detail-plugin/events.js +1 -1
  15. package/cjs/master-detail-plugin/events.js.map +1 -1
  16. package/cjs/master-detail-plugin/subtable.d.ts +4 -0
  17. package/cjs/master-detail-plugin/subtable.js +42 -4
  18. package/cjs/master-detail-plugin/subtable.js.map +1 -1
  19. package/cjs/master-detail-plugin/types.d.ts +1 -1
  20. package/cjs/master-detail-plugin/types.js.map +1 -1
  21. package/cjs/table-carousel-animation.js +3 -3
  22. package/cjs/table-carousel-animation.js.map +1 -1
  23. package/cjs/table-series-number.d.ts +4 -0
  24. package/cjs/table-series-number.js +12 -4
  25. package/cjs/table-series-number.js.map +1 -1
  26. package/dist/vtable-plugins.js +240 -69
  27. package/dist/vtable-plugins.min.js +3 -3
  28. package/es/filter/filter-engine.js +3 -1
  29. package/es/filter/filter-engine.js.map +1 -1
  30. package/es/filter/filter-state-manager.d.ts +0 -1
  31. package/es/filter/filter-state-manager.js +1 -12
  32. package/es/filter/filter-state-manager.js.map +1 -1
  33. package/es/filter/filter.js +15 -3
  34. package/es/filter/filter.js.map +1 -1
  35. package/es/master-detail-plugin/config.d.ts +6 -1
  36. package/es/master-detail-plugin/config.js +54 -7
  37. package/es/master-detail-plugin/config.js.map +1 -1
  38. package/es/master-detail-plugin/core.d.ts +2 -1
  39. package/es/master-detail-plugin/core.js +30 -12
  40. package/es/master-detail-plugin/core.js.map +1 -1
  41. package/es/master-detail-plugin/events.js +1 -1
  42. package/es/master-detail-plugin/events.js.map +1 -1
  43. package/es/master-detail-plugin/subtable.d.ts +4 -0
  44. package/es/master-detail-plugin/subtable.js +41 -4
  45. package/es/master-detail-plugin/subtable.js.map +1 -1
  46. package/es/master-detail-plugin/types.d.ts +1 -1
  47. package/es/master-detail-plugin/types.js.map +1 -1
  48. package/es/table-carousel-animation.js +3 -3
  49. package/es/table-carousel-animation.js.map +1 -1
  50. package/es/table-series-number.d.ts +4 -0
  51. package/es/table-series-number.js +12 -4
  52. package/es/table-series-number.js.map +1 -1
  53. package/package.json +8 -8
@@ -21,7 +21,9 @@ class FilterEngine {
21
21
  fieldId: String(filter.field)
22
22
  });
23
23
  }
24
- })), table.updateFilterRules([ ...this.filterFuncRule, ...this.filterValueRule ]);
24
+ })), table.updateFilterRules([ ...this.filterFuncRule, ...this.filterValueRule ], {
25
+ clearRowHeightCache: !1
26
+ });
25
27
  }
26
28
  createFilterFunction(filter) {
27
29
  const {field: field, operator: operator, condition: condition} = filter;
@@ -1 +1 @@
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 }\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"]}
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"]}
@@ -16,6 +16,5 @@ export declare class FilterStateManager {
16
16
  private notifyListeners;
17
17
  private reduce;
18
18
  private applyFilters;
19
- private updateColumnIcons;
20
19
  private shouldApplyFilter;
21
20
  }
@@ -80,18 +80,7 @@ class FilterStateManager {
80
80
  });
81
81
  }
82
82
  applyFilters() {
83
- this.engine.applyFilter(this.state, this.table), this.updateColumnIcons();
84
- }
85
- updateColumnIcons() {
86
- const columns = this.table.columns;
87
- if (!columns) return;
88
- const plugin = this.table.pluginManager.getPluginByName("Filter");
89
- if (!plugin || !plugin.pluginOptions) return;
90
- const filterIcon = plugin.pluginOptions.filterIcon, filteringIcon = plugin.pluginOptions.filteringIcon;
91
- columns.forEach(((col, index) => {
92
- const field = col.field, filterConfig = this.state.filters.get(field);
93
- !plugin.shouldEnableFilterForColumn || plugin.shouldEnableFilterForColumn(index, col) ? filterConfig && filterConfig.enable ? col.headerIcon = filteringIcon : col.headerIcon = filterIcon : col.headerIcon !== filterIcon && col.headerIcon !== filteringIcon || delete col.headerIcon;
94
- })), this.table.updateColumns(columns);
83
+ this.engine.applyFilter(this.state, this.table);
95
84
  }
96
85
  shouldApplyFilter(action) {
97
86
  return [ types_1.FilterActionType.REMOVE_FILTER, types_1.FilterActionType.ENABLE_FILTER, types_1.FilterActionType.DISABLE_FILTER, types_1.FilterActionType.CLEAR_ALL_FILTERS, types_1.FilterActionType.APPLY_FILTERS ].includes(action.type) || action.payload.enable;
@@ -1 +1 @@
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 this.updateColumnIcons();\n }\n\n /**\n * 更新列图标状态\n */\n private updateColumnIcons() {\n const columns = (this.table as ListTable).columns;\n if (!columns) {\n return;\n }\n\n const plugin = this.table.pluginManager.getPluginByName('Filter') as FilterPlugin;\n if (!plugin || !plugin.pluginOptions) {\n return;\n }\n\n const filterIcon = plugin.pluginOptions.filterIcon;\n const filteringIcon = plugin.pluginOptions.filteringIcon;\n\n // 遍历所有列,更新图标\n columns.forEach((col: ColumnDefine, index: number) => {\n const field = col.field as string;\n const filterConfig = this.state.filters.get(field);\n\n // 首先检查这一列是否应该启用筛选功能\n const shouldEnableFilter = plugin.shouldEnableFilterForColumn\n ? plugin.shouldEnableFilterForColumn(index, col)\n : true;\n\n if (shouldEnableFilter) {\n // 如果该列有激活的筛选,则使用filteringIcon\n if (filterConfig && filterConfig.enable) {\n col.headerIcon = filteringIcon;\n } else {\n col.headerIcon = filterIcon;\n }\n } else {\n // 如果不应该启用筛选,则移除筛选图标\n if (col.headerIcon === filterIcon || col.headerIcon === filteringIcon) {\n delete col.headerIcon;\n }\n }\n });\n\n // 更新表格列定义\n (this.table as ListTable).updateColumns(columns);\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"]}
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"]}
@@ -35,7 +35,12 @@ class FilterPlugin {
35
35
  if (this.table = table, runtime === vtable_1.TABLE_EVENT_TYPE.BEFORE_INIT) this.filterEngine = new filter_engine_1.FilterEngine,
36
36
  this.filterStateManager = new filter_state_manager_1.FilterStateManager(this.table, this.filterEngine),
37
37
  this.filterToolbar = new filter_toolbar_1.FilterToolbar(this.table, this.filterStateManager),
38
- this.filterToolbar.render(document.body), this.updateFilterIcons(eventArgs.options); else if (runtime === vtable_1.TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION) this.pluginOptions = Object.assign(Object.assign({}, this.pluginOptions), eventArgs.options.plugins.find((plugin => plugin.id === this.id)).pluginOptions),
38
+ this.filterToolbar.render(document.body), this.updateFilterIcons(eventArgs.options),
39
+ this.filterStateManager.subscribe((() => {
40
+ this.updateFilterIcons(eventArgs.options), this.table.updateColumns(eventArgs.options.columns, {
41
+ clearRowHeightCache: !1
42
+ });
43
+ })); else if (runtime === vtable_1.TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION) this.pluginOptions = Object.assign(Object.assign({}, this.pluginOptions), eventArgs.options.plugins.find((plugin => plugin.id === this.id)).pluginOptions),
39
44
  this.handleOptionUpdate(eventArgs.options); else if (runtime === vtable_1.TABLE_EVENT_TYPE.ICON_CLICK && "filter-icon" === eventArgs.name || "filtering-icon" === eventArgs.name) {
40
45
  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;
41
46
  const col = eventArgs.col, row = eventArgs.row;
@@ -68,8 +73,16 @@ class FilterPlugin {
68
73
  }));
69
74
  }
70
75
  updateFilterIcons(options) {
71
- options.columns.forEach((col => {
72
- this.shouldEnableFilterForColumn(col.field, col) ? col.headerIcon = this.pluginOptions.filterIcon : delete col.headerIcon;
76
+ 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;
77
+ options.columns.forEach((column => {
78
+ var _a;
79
+ const shouldShow = this.shouldEnableFilterForColumn(column.field, column), isFiltering = !!(null === (_a = this.filterStateManager.getFilterState(column.field)) || void 0 === _a ? void 0 : _a.enable);
80
+ let icons = (icons => icons ? Array.isArray(icons) ? icons : [ icons ] : [])(column.headerIcon);
81
+ var list;
82
+ shouldShow ? isFiltering ? icons.some((icon => isIconEqual(icon, filteringIcon))) || (icons = icons.filter((icon => !isIconEqual(icon, filterIcon))),
83
+ icons.push(filteringIcon)) : icons.some((icon => isIconEqual(icon, filterIcon))) || (icons = icons.filter((icon => !isIconEqual(icon, filteringIcon))),
84
+ icons.push(filterIcon)) : icons = icons.filter((icon => !isIconEqual(icon, filterIcon))),
85
+ column.headerIcon = 0 === (list = icons).length ? void 0 : 1 === list.length ? list[0] : list;
73
86
  }));
74
87
  }
75
88
  shouldEnableFilterForColumn(field, column) {
@@ -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;
@@ -35,6 +35,9 @@ class ConfigManager {
35
35
  constructor(pluginOptions, table) {
36
36
  this.pluginOptions = pluginOptions, this.table = table, this.isRowExpanded = () => !1;
37
37
  }
38
+ setExpandRowCallback(callback) {
39
+ this.expandRowCallback = callback;
40
+ }
38
41
  hasChildren(record) {
39
42
  if (record && "object" == typeof record && "children" in record) {
40
43
  const children = record.children;
@@ -66,10 +69,6 @@ class ConfigManager {
66
69
  }
67
70
  this.disableRefreshHierarchyState();
68
71
  }
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
72
  disableRefreshHierarchyState() {
74
73
  setTimeout((() => {
75
74
  const tableWithPrivateMethod = this.table;
@@ -84,15 +83,63 @@ class ConfigManager {
84
83
  }));
85
84
  }
86
85
  processRecordsHierarchyStates(records) {
87
- const HierarchyState = VTable.TYPES.HierarchyState;
86
+ const HierarchyState = VTable.TYPES.HierarchyState, headerExpandLevel = this.table.options.headerExpandLevel;
88
87
  (recordList => {
89
88
  recordList.forEach((record => {
90
89
  if (record && "object" == typeof record) {
91
90
  const recordObj = record;
92
- (this.hasChildren(record) || !0 === recordObj.children) && (recordObj.hierarchyState = HierarchyState.collapse);
91
+ (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));
93
92
  }
94
93
  }));
95
- })(records);
94
+ })(records), this.performInitialExpansion();
95
+ }
96
+ performInitialExpansion() {
97
+ const expandableRecords = this.getExpandableRecords();
98
+ 0 !== expandableRecords.length && this.startAsyncExpansion(expandableRecords);
99
+ }
100
+ getExpandableRecords() {
101
+ const dataSource = this.table.dataSource, allRecords = dataSource.source || dataSource._source || this.table.dataSource.records, HierarchyState = VTable.TYPES.HierarchyState, expandableRecords = [], tableWithInternalProps = this.table;
102
+ tableWithInternalProps.internalProps.expandedRecordIndices || (tableWithInternalProps.internalProps.expandedRecordIndices = []);
103
+ const expandedRecordIndices = tableWithInternalProps.internalProps.expandedRecordIndices;
104
+ for (let recordIndex = 0; recordIndex < allRecords.length; recordIndex++) {
105
+ const record = allRecords[recordIndex];
106
+ if (record && "object" == typeof record) {
107
+ const recordObj = record;
108
+ if ((this.hasChildren(record) || !0 === recordObj.children) && recordObj.hierarchyState === HierarchyState.expand) {
109
+ expandedRecordIndices.includes(recordIndex) || expandedRecordIndices.push(recordIndex);
110
+ try {
111
+ const bodyRowIndex = this.table.getBodyRowIndexByRecordIndex(recordIndex);
112
+ if (bodyRowIndex >= 0) {
113
+ const actualRowIndex = bodyRowIndex + this.table.columnHeaderLevelCount;
114
+ expandableRecords.push({
115
+ recordIndex: recordIndex,
116
+ actualRowIndex: actualRowIndex,
117
+ record: record
118
+ });
119
+ }
120
+ } catch (error) {}
121
+ }
122
+ }
123
+ }
124
+ return expandableRecords;
125
+ }
126
+ startAsyncExpansion(expandableRecords) {
127
+ let currentIndex = 0;
128
+ const processNextExpansion = () => {
129
+ if (currentIndex >= expandableRecords.length) return;
130
+ const {actualRowIndex: actualRowIndex} = expandableRecords[currentIndex];
131
+ this.isCellGroupCreated(actualRowIndex) ? (this.expandRowCallback && this.expandRowCallback(actualRowIndex),
132
+ currentIndex++, setTimeout(processNextExpansion, 0)) : setTimeout(processNextExpansion, 16);
133
+ };
134
+ setTimeout(processNextExpansion, 0);
135
+ }
136
+ isCellGroupCreated(rowIndex) {
137
+ try {
138
+ const cellGroup = this.table.scenegraph.getCell(0, rowIndex);
139
+ return cellGroup && "cell" === cellGroup.role;
140
+ } catch (error) {
141
+ return !1;
142
+ }
96
143
  }
97
144
  getDetailConfigForRecord(record, bodyRowIndex) {
98
145
  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
  }
@@ -52,6 +52,7 @@ class MasterDetailPlugin {
52
52
  const enableCheckboxCascade = null === (_a = this.pluginOptions.enableCheckboxCascade) || void 0 === _a || _a;
53
53
  this.subTableManager = new subtable_1.SubTableManager(this.table, enableCheckboxCascade),
54
54
  this.configManager.setRowExpandedChecker((row => this.eventManager.isRowExpanded(row))),
55
+ this.configManager.setExpandRowCallback((rowIndex => this.expandRow(rowIndex))),
55
56
  this.eventManager.setCallbacks({
56
57
  onUpdateSubTablePositions: () => this.subTableManager.recalculateAllSubTablePositions(),
57
58
  onUpdateSubTablePositionsForRow: () => this.subTableManager.updateSubTablePositionsForRowResize(),
@@ -62,7 +63,9 @@ class MasterDetailPlugin {
62
63
  getOriginalRowHeight: bodyRowIndex => (0, utils_1.getOriginalRowHeight)(this.table, bodyRowIndex)
63
64
  }), this.subTableManager.setCallbacks({
64
65
  getDetailConfigForRecord: (record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)
65
- });
66
+ }), this.subTableManager.setAutoHeightCallback(((bodyRowIndex, newTotalHeight) => {
67
+ this.handleAutoHeightUpdate(bodyRowIndex, newTotalHeight);
68
+ }));
66
69
  }
67
70
  setupMasterDetailFeatures() {
68
71
  this.initInternalProps(), this.eventManager.bindEventHandlers(), this.setupUnifiedSelectionManagement(),
@@ -125,13 +128,24 @@ class MasterDetailPlugin {
125
128
  internalProps.expandedRecordIndices && ((0, types_1.includesRecordIndex)(internalProps.expandedRecordIndices, realRecordIndex) || internalProps.expandedRecordIndices.push(realRecordIndex)),
126
129
  this.eventManager.addExpandedRow(rowIndex);
127
130
  const originalHeight = this.table.getRowHeight(rowIndex);
128
- internalProps.originalRowHeights && internalProps.originalRowHeights.set(bodyRowIndex, originalHeight);
129
- const record = (0, utils_1.getRecordByRowIndex)(this.table, bodyRowIndex), detailConfig = this.configManager.getDetailConfigForRecord(record, bodyRowIndex), height = (null === (_a = null == detailConfig ? void 0 : detailConfig.style) || void 0 === _a ? void 0 : _a.height) || 300, childrenData = Array.isArray(record.children) ? record.children : [], deltaHeight = height;
131
+ if (internalProps.originalRowHeights) {
132
+ this.table.scenegraph.getCell(colIndex, rowIndex);
133
+ internalProps.originalRowHeights.set(bodyRowIndex, originalHeight);
134
+ }
135
+ const record = (0, utils_1.getRecordByRowIndex)(this.table, bodyRowIndex), detailConfig = this.configManager.getDetailConfigForRecord(record, bodyRowIndex), height = (null === (_a = null == detailConfig ? void 0 : detailConfig.style) || void 0 === _a ? void 0 : _a.height) || 300, childrenData = Array.isArray(record.children) ? record.children : [], deltaHeight = "auto" === height ? 300 : "number" == typeof height ? height : 300;
130
136
  this.updateRowHeightForExpand(rowIndex, deltaHeight), this.table.scenegraph.updateContainerHeight(rowIndex, deltaHeight),
131
137
  internalProps._heightResizedRowMap.add(rowIndex), this.subTableManager.renderSubTable(bodyRowIndex, childrenData, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
132
- this.subTableManager.recalculateAllSubTablePositions(bodyRowIndex + 1, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
133
138
  rowIndex !== this.table.rowCount - 1 && this.drawUnderlineForRow(rowIndex), this.refreshRowIcon(rowIndex, colIndex),
134
- "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode();
139
+ "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode(),
140
+ this.updateFrozenColumnShadowHeight();
141
+ }
142
+ handleAutoHeightUpdate(bodyRowIndex, newTotalHeight) {
143
+ var _a;
144
+ try {
145
+ const rowIndex = bodyRowIndex + this.table.columnHeaderLevelCount, currentRowHeight = this.table.getRowHeight(rowIndex), originalHeight = (null === (_a = (0,
146
+ utils_1.getInternalProps)(this.table).originalRowHeights) || void 0 === _a ? void 0 : _a.get(bodyRowIndex)) || 0, heightDifference = newTotalHeight - (currentRowHeight - originalHeight);
147
+ this.updateRowHeightForExpand(rowIndex, heightDifference), this.table.scenegraph.updateContainerHeight(rowIndex, heightDifference);
148
+ } catch (error) {}
135
149
  }
136
150
  collapseRow(rowIndex, colIndex) {
137
151
  const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = (0,
@@ -147,8 +161,9 @@ class MasterDetailPlugin {
147
161
  const deltaHeight = this.table.getRowHeight(rowIndex) - (0, utils_1.getOriginalRowHeight)(this.table, bodyRowIndex);
148
162
  this.updateRowHeightForExpand(rowIndex, -deltaHeight), internalProps._heightResizedRowMap.delete(rowIndex),
149
163
  this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight), internalProps.originalRowHeights && internalProps.originalRowHeights.delete(bodyRowIndex),
150
- rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.subTableManager.recalculateAllSubTablePositions(bodyRowIndex + 1, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
151
- this.refreshRowIcon(rowIndex, colIndex), "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode();
164
+ rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.refreshRowIcon(rowIndex, colIndex),
165
+ "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode(),
166
+ this.updateFrozenColumnShadowHeight();
152
167
  }
153
168
  collapseRowToNoRealRecordIndex(rowIndex) {
154
169
  const bodyRowIndex = rowIndex - this.table.columnHeaderLevelCount, internalProps = (0,
@@ -158,8 +173,9 @@ class MasterDetailPlugin {
158
173
  const deltaHeight = this.table.getRowHeight(rowIndex) - (0, utils_1.getOriginalRowHeight)(this.table, bodyRowIndex);
159
174
  this.updateRowHeightForExpand(rowIndex, -deltaHeight), internalProps._heightResizedRowMap.delete(rowIndex),
160
175
  this.table.scenegraph.updateContainerHeight(rowIndex, -deltaHeight), internalProps.originalRowHeights && internalProps.originalRowHeights.delete(bodyRowIndex),
161
- rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.subTableManager.recalculateAllSubTablePositions(bodyRowIndex + 1, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex))),
162
- this.refreshRowIcon(rowIndex), "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode();
176
+ rowIndex !== this.table.rowCount - 1 && this.removeUnderlineFromRow(rowIndex), this.refreshRowIcon(rowIndex),
177
+ "adaptive" === this.table.heightMode && this.table.scenegraph.dealHeightMode(),
178
+ this.updateFrozenColumnShadowHeight();
163
179
  }
164
180
  toggleRowExpand(rowIndex, colIndex) {
165
181
  this.eventManager.isRowExpanded(rowIndex) ? this.collapseRow(rowIndex, colIndex) : this.expandRow(rowIndex, colIndex);
@@ -229,9 +245,6 @@ class MasterDetailPlugin {
229
245
  this.table.scenegraph.updateHierarchyIcon(targetColumnIndex, rowIndex);
230
246
  }
231
247
  }
232
- update() {
233
- this.table && this.subTableManager.recalculateAllSubTablePositions(0, void 0, ((record, bodyRowIndex) => this.configManager.getDetailConfigForRecord(record, bodyRowIndex)));
234
- }
235
248
  setRecordChildren(children, col, row) {
236
249
  const recordIndex = this.table.getRecordIndexByCell(col, row);
237
250
  if (null == recordIndex) return;
@@ -300,6 +313,12 @@ class MasterDetailPlugin {
300
313
  } catch (error) {}
301
314
  return result;
302
315
  }
316
+ updateFrozenColumnShadowHeight() {
317
+ try {
318
+ const frozenColCount = this.table.frozenColCount;
319
+ frozenColCount > 0 && this.table.scenegraph.component.setFrozenColumnShadow(frozenColCount - 1);
320
+ } catch (error) {}
321
+ }
303
322
  cleanupMasterDetailFeatures() {
304
323
  this.mainTableClickHandler && (this.table.off("click_cell", this.mainTableClickHandler),
305
324
  this.mainTableClickHandler = void 0), this.tableAPIExtensions && (this.tableAPIExtensions.cleanup(),