@visactor/vtable-plugins 1.22.3-alpha.0 → 1.22.4-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) 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-toolbar.d.ts +3 -0
  7. package/cjs/filter/filter-toolbar.js +13 -6
  8. package/cjs/filter/filter-toolbar.js.map +1 -1
  9. package/cjs/filter/filter.d.ts +4 -3
  10. package/cjs/filter/filter.js +24 -14
  11. package/cjs/filter/filter.js.map +1 -1
  12. package/cjs/master-detail-plugin/config.d.ts +6 -1
  13. package/cjs/master-detail-plugin/config.js +54 -7
  14. package/cjs/master-detail-plugin/config.js.map +1 -1
  15. package/cjs/master-detail-plugin/core.d.ts +2 -1
  16. package/cjs/master-detail-plugin/core.js +31 -12
  17. package/cjs/master-detail-plugin/core.js.map +1 -1
  18. package/cjs/master-detail-plugin/events.js +1 -1
  19. package/cjs/master-detail-plugin/events.js.map +1 -1
  20. package/cjs/master-detail-plugin/subtable.d.ts +4 -0
  21. package/cjs/master-detail-plugin/subtable.js +42 -4
  22. package/cjs/master-detail-plugin/subtable.js.map +1 -1
  23. package/cjs/master-detail-plugin/types.d.ts +1 -1
  24. package/cjs/master-detail-plugin/types.js.map +1 -1
  25. package/cjs/table-carousel-animation.js +3 -3
  26. package/cjs/table-carousel-animation.js.map +1 -1
  27. package/cjs/table-series-number.d.ts +4 -0
  28. package/cjs/table-series-number.js +12 -4
  29. package/cjs/table-series-number.js.map +1 -1
  30. package/dist/vtable-plugins.js +290 -85
  31. package/dist/vtable-plugins.min.js +2 -2
  32. package/es/filter/filter-engine.js +3 -1
  33. package/es/filter/filter-engine.js.map +1 -1
  34. package/es/filter/filter-state-manager.d.ts +0 -1
  35. package/es/filter/filter-state-manager.js +1 -12
  36. package/es/filter/filter-state-manager.js.map +1 -1
  37. package/es/filter/filter-toolbar.d.ts +3 -0
  38. package/es/filter/filter-toolbar.js +13 -6
  39. package/es/filter/filter-toolbar.js.map +1 -1
  40. package/es/filter/filter.d.ts +4 -3
  41. package/es/filter/filter.js +25 -15
  42. package/es/filter/filter.js.map +1 -1
  43. package/es/master-detail-plugin/config.d.ts +6 -1
  44. package/es/master-detail-plugin/config.js +54 -7
  45. package/es/master-detail-plugin/config.js.map +1 -1
  46. package/es/master-detail-plugin/core.d.ts +2 -1
  47. package/es/master-detail-plugin/core.js +30 -12
  48. package/es/master-detail-plugin/core.js.map +1 -1
  49. package/es/master-detail-plugin/events.js +1 -1
  50. package/es/master-detail-plugin/events.js.map +1 -1
  51. package/es/master-detail-plugin/subtable.d.ts +4 -0
  52. package/es/master-detail-plugin/subtable.js +41 -4
  53. package/es/master-detail-plugin/subtable.js.map +1 -1
  54. package/es/master-detail-plugin/types.d.ts +1 -1
  55. package/es/master-detail-plugin/types.js.map +1 -1
  56. package/es/table-carousel-animation.js +3 -3
  57. package/es/table-carousel-animation.js.map +1 -1
  58. package/es/table-series-number.d.ts +4 -0
  59. package/es/table-series-number.js +12 -4
  60. package/es/table-series-number.js.map +1 -1
  61. 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"]}
@@ -14,6 +14,8 @@ export declare class FilterToolbar {
14
14
  filterModes: FilterMode[];
15
15
  private filterMenu;
16
16
  private filterMenuWidth;
17
+ private currentCol?;
18
+ private currentRow?;
17
19
  private filterTabByValue;
18
20
  private filterTabByCondition;
19
21
  private clearFilterOptionLink;
@@ -26,6 +28,7 @@ export declare class FilterToolbar {
26
28
  private clearFilter;
27
29
  render(container: HTMLElement): void;
28
30
  attachEventListeners(): void;
31
+ adjustMenuPosition(col?: number | null, row?: number | null, providedLeft?: number | null, providedTop?: number | null): void;
29
32
  show(col: number, row: number, filterModes: FilterMode[]): void;
30
33
  hide(): void;
31
34
  }
@@ -72,15 +72,22 @@ class FilterToolbar {
72
72
  e.stopPropagation();
73
73
  }));
74
74
  }
75
- show(col, row, filterModes) {
76
- this.filterModes = filterModes, this.filterModes.includes("byValue") ? this.filterModes.includes("byCondition") || (this.filterTabByCondition.style.display = "none",
77
- setTimeout((() => this.onTabSwitch("byValue")), 0)) : (this.filterTabByValue.style.display = "none",
78
- setTimeout((() => this.onTabSwitch("byCondition")), 0));
75
+ adjustMenuPosition(col, row, providedLeft, providedTop) {
76
+ if ("number" == typeof providedLeft && "number" == typeof providedTop) return this.filterMenu.style.display = this.isVisible ? "block" : "none",
77
+ this.filterMenu.style.left = `${providedLeft}px`, void (this.filterMenu.style.top = `${providedTop}px`);
78
+ const effectiveCol = "number" == typeof col ? col : this.currentCol, effectiveRow = "number" == typeof row ? row : this.currentRow;
79
+ if ("number" != typeof effectiveCol || "number" != typeof effectiveRow) return;
80
+ this.currentCol = effectiveCol, this.currentRow = effectiveRow;
79
81
  let left = 0, top = 0;
80
- const canvasBounds = this.table.canvas.getBoundingClientRect(), cell = this.table.getMergeCellRect(col, row);
82
+ const canvasBounds = this.table.canvas.getBoundingClientRect(), cell = this.table.getCellRelativeRect(effectiveCol, effectiveRow);
81
83
  cell.right < this.filterMenuWidth ? (left = cell.left + canvasBounds.left, top = cell.bottom + canvasBounds.top) : (left = cell.right + canvasBounds.left - this.filterMenuWidth,
82
- top = cell.bottom + canvasBounds.top), this.filterMenu.style.display = "block",
84
+ top = cell.bottom + canvasBounds.top), this.filterMenu.style.display = this.isVisible ? "block" : "none",
83
85
  this.filterMenu.style.left = `${left}px`, this.filterMenu.style.top = `${top}px`;
86
+ }
87
+ show(col, row, filterModes) {
88
+ this.filterModes = filterModes, this.filterModes.includes("byValue") ? this.filterModes.includes("byCondition") || (this.filterTabByCondition.style.display = "none",
89
+ this.onTabSwitch("byValue")) : (this.filterTabByValue.style.display = "none", this.onTabSwitch("byCondition")),
90
+ this.adjustMenuPosition(col, row), this.filterMenu.style.display = "block";
84
91
  const field = this.table.internalProps.layoutMap.getHeaderField(col, row);
85
92
  this.updateSelectedField(field);
86
93
  const currentFilter = this.filterStateManager.getFilterState(field);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/filter/filter-toolbar.ts"],"names":[],"mappings":"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","file":"filter-toolbar.js","sourcesContent":["import type { ListTable, PivotTable } from '@visactor/vtable';\nimport type { FilterStateManager } from './filter-state-manager';\nimport { ValueFilter } from './value-filter';\nimport { ConditionFilter } from './condition-filter';\nimport { applyStyles, filterStyles } from './styles';\nimport type { FilterMode } from './types';\n\n/**\n * 筛选工具栏,管理按值和按条件筛选组件\n */\nexport class FilterToolbar {\n table: ListTable | PivotTable;\n filterStateManager: FilterStateManager;\n valueFilter: ValueFilter | null = null;\n conditionFilter: ConditionFilter | null = null;\n activeTab: 'byValue' | 'byCondition' = 'byValue';\n isVisible: boolean = false;\n selectedField: string | number | null = null;\n filterModes: FilterMode[] = [];\n\n private filterMenu: HTMLElement;\n private filterMenuWidth: number;\n private filterTabByValue: HTMLButtonElement;\n private filterTabByCondition: HTMLButtonElement;\n private clearFilterOptionLink: HTMLAnchorElement;\n private cancelFilterButton: HTMLButtonElement;\n private applyFilterButton: HTMLButtonElement;\n\n constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n this.valueFilter = new ValueFilter(this.table, this.filterStateManager);\n this.conditionFilter = new ConditionFilter(this.table, this.filterStateManager);\n\n this.filterMenuWidth = 300; // 待优化,可能需要自适应内容的宽度\n }\n\n private onTabSwitch(tab: 'byValue' | 'byCondition'): void {\n this.activeTab = tab;\n if (tab === 'byValue') {\n this.valueFilter.show();\n this.conditionFilter.hide();\n } else {\n this.conditionFilter.show();\n this.valueFilter.hide();\n }\n\n const isValueTab = tab === 'byValue';\n applyStyles(this.filterTabByValue, filterStyles.tabStyle(isValueTab));\n applyStyles(this.filterTabByCondition, filterStyles.tabStyle(!isValueTab));\n }\n\n private updateSelectedField(field: string | number): void {\n this.selectedField = field;\n // 通知筛选组件更新选中字段\n if (this.valueFilter) {\n this.valueFilter.setSelectedField(field);\n }\n if (this.conditionFilter) {\n this.conditionFilter.setSelectedField(field);\n }\n }\n\n private applyFilter(field: string | number): void {\n if (this.activeTab === 'byValue') {\n this.valueFilter.applyFilter(field);\n } else if (this.activeTab === 'byCondition') {\n this.conditionFilter.applyFilter(field);\n }\n this.hide();\n }\n\n private clearFilter(field: string | number): void {\n if (this.valueFilter) {\n this.valueFilter.clearFilter(field);\n }\n if (this.conditionFilter) {\n this.conditionFilter.clearFilter(field);\n }\n this.hide();\n }\n\n render(container: HTMLElement): void {\n // === 主容器 ===\n this.filterMenu = document.createElement('div');\n applyStyles(this.filterMenu, filterStyles.filterMenu);\n this.filterMenu.style.width = `${this.filterMenuWidth}px`;\n\n // === 筛选 Tab ===\n const filterTabsContainer = document.createElement('div');\n applyStyles(filterTabsContainer, filterStyles.tabsContainer);\n\n this.filterTabByValue = document.createElement('button');\n this.filterTabByValue.innerText = '按值筛选';\n applyStyles(this.filterTabByValue, filterStyles.tabStyle(true));\n\n this.filterTabByCondition = document.createElement('button');\n this.filterTabByCondition.innerText = '按条件筛选';\n applyStyles(this.filterTabByCondition, filterStyles.tabStyle(false));\n\n filterTabsContainer.append(this.filterTabByValue, this.filterTabByCondition);\n\n // === 页脚(清除、取消、确定 筛选按钮) ===\n const footerContainer = document.createElement('div');\n applyStyles(footerContainer, filterStyles.footerContainer);\n\n this.clearFilterOptionLink = document.createElement('a');\n this.clearFilterOptionLink.href = '#';\n this.clearFilterOptionLink.innerText = '清除筛选';\n applyStyles(this.clearFilterOptionLink, filterStyles.clearLink);\n\n const footerButtons = document.createElement('div');\n this.cancelFilterButton = document.createElement('button');\n this.cancelFilterButton.innerText = '取消';\n applyStyles(this.cancelFilterButton, filterStyles.footerButton(false));\n\n this.applyFilterButton = document.createElement('button');\n this.applyFilterButton.innerText = '确认';\n applyStyles(this.applyFilterButton, filterStyles.footerButton(true));\n\n footerButtons.append(this.cancelFilterButton, this.applyFilterButton);\n footerContainer.append(this.clearFilterOptionLink, footerButtons);\n\n // --- 筛选器头部 Tab ---\n this.filterMenu.append(filterTabsContainer);\n\n // --- 筛选器内容 ---\n this.valueFilter.render(this.filterMenu);\n this.conditionFilter.render(this.filterMenu);\n\n // --- 筛选器页脚 ---\n this.filterMenu.append(footerContainer);\n\n container.appendChild(this.filterMenu); // 将筛选器添加到 DOM 中\n this.attachEventListeners();\n }\n\n attachEventListeners() {\n // 按值筛选/按条件筛选的事件监听\n this.filterTabByValue.addEventListener('click', () => {\n this.onTabSwitch('byValue');\n });\n\n this.filterTabByCondition.addEventListener('click', () => {\n this.onTabSwitch('byCondition');\n });\n\n this.cancelFilterButton.addEventListener('click', () => this.hide());\n\n this.clearFilterOptionLink.addEventListener('click', e => {\n e.preventDefault();\n this.clearFilter(this.selectedField);\n });\n\n this.applyFilterButton.addEventListener('click', () => {\n this.applyFilter(this.selectedField);\n });\n\n // 点击空白处整个筛选菜单可消失\n document.addEventListener('click', () => {\n if (this.isVisible) {\n this.hide();\n }\n });\n\n this.filterMenu.addEventListener('click', e => {\n e.stopPropagation();\n });\n }\n\n show(col: number, row: number, filterModes: FilterMode[]): void {\n this.filterModes = filterModes;\n if (!this.filterModes.includes('byValue')) {\n this.filterTabByValue.style.display = 'none';\n setTimeout(() => this.onTabSwitch('byCondition'), 0);\n } else if (!this.filterModes.includes('byCondition')) {\n this.filterTabByCondition.style.display = 'none';\n setTimeout(() => this.onTabSwitch('byValue'), 0);\n }\n\n let left: number = 0;\n let top: number = 0;\n const canvasBounds = this.table.canvas.getBoundingClientRect();\n const cell = this.table.getMergeCellRect(col, row);\n if (cell.right < this.filterMenuWidth) {\n // 无法把筛选菜单完整地显示在左侧,那么显示在右侧\n left = cell.left + canvasBounds.left;\n top = cell.bottom + canvasBounds.top;\n } else {\n // 筛选菜单默认显示在左侧\n left = cell.right + canvasBounds.left - this.filterMenuWidth;\n top = cell.bottom + canvasBounds.top;\n }\n\n this.filterMenu.style.display = 'block';\n this.filterMenu.style.left = `${left}px`;\n this.filterMenu.style.top = `${top}px`;\n\n const field = this.table.internalProps.layoutMap.getHeaderField(col, row) as string | number;\n this.updateSelectedField(field);\n\n // 根据当前筛选配置自动选择正确的筛选标签页\n const currentFilter = this.filterStateManager.getFilterState(field);\n if (currentFilter && currentFilter.type === 'byCondition') {\n this.onTabSwitch('byCondition');\n } else {\n this.onTabSwitch('byValue');\n }\n\n // 确保在事件冒泡完成后才设置 isVisible 为 true\n setTimeout(() => {\n this.isVisible = true;\n }, 0);\n }\n\n hide(): void {\n this.filterMenu.style.display = 'none';\n this.isVisible = false;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/filter/filter-toolbar.ts"],"names":[],"mappings":"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","file":"filter-toolbar.js","sourcesContent":["import type { ListTable, PivotTable } from '@visactor/vtable';\nimport type { FilterStateManager } from './filter-state-manager';\nimport { ValueFilter } from './value-filter';\nimport { ConditionFilter } from './condition-filter';\nimport { applyStyles, filterStyles } from './styles';\nimport type { FilterMode } from './types';\n\n/**\n * 筛选工具栏,管理按值和按条件筛选组件\n */\nexport class FilterToolbar {\n table: ListTable | PivotTable;\n filterStateManager: FilterStateManager;\n valueFilter: ValueFilter | null = null;\n conditionFilter: ConditionFilter | null = null;\n activeTab: 'byValue' | 'byCondition' = 'byValue';\n isVisible: boolean = false;\n selectedField: string | number | null = null;\n filterModes: FilterMode[] = [];\n\n private filterMenu: HTMLElement;\n private filterMenuWidth: number;\n private currentCol?: number | null;\n private currentRow?: number | null;\n private filterTabByValue: HTMLButtonElement;\n private filterTabByCondition: HTMLButtonElement;\n private clearFilterOptionLink: HTMLAnchorElement;\n private cancelFilterButton: HTMLButtonElement;\n private applyFilterButton: HTMLButtonElement;\n\n constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n this.valueFilter = new ValueFilter(this.table, this.filterStateManager);\n this.conditionFilter = new ConditionFilter(this.table, this.filterStateManager);\n\n this.filterMenuWidth = 300; // 待优化,可能需要自适应内容的宽度\n }\n\n private onTabSwitch(tab: 'byValue' | 'byCondition'): void {\n this.activeTab = tab;\n if (tab === 'byValue') {\n this.valueFilter.show();\n this.conditionFilter.hide();\n } else {\n this.conditionFilter.show();\n this.valueFilter.hide();\n }\n\n const isValueTab = tab === 'byValue';\n applyStyles(this.filterTabByValue, filterStyles.tabStyle(isValueTab));\n applyStyles(this.filterTabByCondition, filterStyles.tabStyle(!isValueTab));\n }\n\n private updateSelectedField(field: string | number): void {\n this.selectedField = field;\n // 通知筛选组件更新选中字段\n if (this.valueFilter) {\n this.valueFilter.setSelectedField(field);\n }\n if (this.conditionFilter) {\n this.conditionFilter.setSelectedField(field);\n }\n }\n\n private applyFilter(field: string | number): void {\n if (this.activeTab === 'byValue') {\n this.valueFilter.applyFilter(field);\n } else if (this.activeTab === 'byCondition') {\n this.conditionFilter.applyFilter(field);\n }\n this.hide();\n }\n\n private clearFilter(field: string | number): void {\n if (this.valueFilter) {\n this.valueFilter.clearFilter(field);\n }\n if (this.conditionFilter) {\n this.conditionFilter.clearFilter(field);\n }\n this.hide();\n }\n\n render(container: HTMLElement): void {\n // === 主容器 ===\n this.filterMenu = document.createElement('div');\n applyStyles(this.filterMenu, filterStyles.filterMenu);\n this.filterMenu.style.width = `${this.filterMenuWidth}px`;\n\n // === 筛选 Tab ===\n const filterTabsContainer = document.createElement('div');\n applyStyles(filterTabsContainer, filterStyles.tabsContainer);\n\n this.filterTabByValue = document.createElement('button');\n this.filterTabByValue.innerText = '按值筛选';\n applyStyles(this.filterTabByValue, filterStyles.tabStyle(true));\n\n this.filterTabByCondition = document.createElement('button');\n this.filterTabByCondition.innerText = '按条件筛选';\n applyStyles(this.filterTabByCondition, filterStyles.tabStyle(false));\n\n filterTabsContainer.append(this.filterTabByValue, this.filterTabByCondition);\n\n // === 页脚(清除、取消、确定 筛选按钮) ===\n const footerContainer = document.createElement('div');\n applyStyles(footerContainer, filterStyles.footerContainer);\n\n this.clearFilterOptionLink = document.createElement('a');\n this.clearFilterOptionLink.href = '#';\n this.clearFilterOptionLink.innerText = '清除筛选';\n applyStyles(this.clearFilterOptionLink, filterStyles.clearLink);\n\n const footerButtons = document.createElement('div');\n this.cancelFilterButton = document.createElement('button');\n this.cancelFilterButton.innerText = '取消';\n applyStyles(this.cancelFilterButton, filterStyles.footerButton(false));\n\n this.applyFilterButton = document.createElement('button');\n this.applyFilterButton.innerText = '确认';\n applyStyles(this.applyFilterButton, filterStyles.footerButton(true));\n\n footerButtons.append(this.cancelFilterButton, this.applyFilterButton);\n footerContainer.append(this.clearFilterOptionLink, footerButtons);\n\n // --- 筛选器头部 Tab ---\n this.filterMenu.append(filterTabsContainer);\n\n // --- 筛选器内容 ---\n this.valueFilter.render(this.filterMenu);\n this.conditionFilter.render(this.filterMenu);\n\n // --- 筛选器页脚 ---\n this.filterMenu.append(footerContainer);\n\n container.appendChild(this.filterMenu); // 将筛选器添加到 DOM 中\n this.attachEventListeners();\n }\n\n attachEventListeners() {\n // 按值筛选/按条件筛选的事件监听\n this.filterTabByValue.addEventListener('click', () => {\n this.onTabSwitch('byValue');\n });\n\n this.filterTabByCondition.addEventListener('click', () => {\n this.onTabSwitch('byCondition');\n });\n\n this.cancelFilterButton.addEventListener('click', () => this.hide());\n\n this.clearFilterOptionLink.addEventListener('click', e => {\n e.preventDefault();\n this.clearFilter(this.selectedField);\n });\n\n this.applyFilterButton.addEventListener('click', () => {\n this.applyFilter(this.selectedField);\n });\n\n // 点击空白处整个筛选菜单可消失\n document.addEventListener('click', () => {\n if (this.isVisible) {\n this.hide();\n }\n });\n\n this.filterMenu.addEventListener('click', e => {\n e.stopPropagation();\n });\n }\n\n adjustMenuPosition(\n col?: number | null,\n row?: number | null,\n providedLeft?: number | null,\n providedTop?: number | null\n ) {\n if (typeof providedLeft === 'number' && typeof providedTop === 'number') {\n this.filterMenu.style.display = this.isVisible ? 'block' : 'none';\n this.filterMenu.style.left = `${providedLeft}px`;\n this.filterMenu.style.top = `${providedTop}px`;\n return;\n }\n\n // 明晰的参数 > 记忆的数字\n const effectiveCol = typeof col === 'number' ? col : this.currentCol;\n const effectiveRow = typeof row === 'number' ? row : this.currentRow;\n\n if (typeof effectiveCol !== 'number' || typeof effectiveRow !== 'number') {\n return;\n }\n\n this.currentCol = effectiveCol;\n this.currentRow = effectiveRow;\n\n let left: number = 0;\n let top: number = 0;\n\n const canvasBounds = this.table.canvas.getBoundingClientRect();\n const cell = this.table.getCellRelativeRect(effectiveCol, effectiveRow);\n\n if (cell.right < this.filterMenuWidth) {\n // 无法把筛选菜单完整地显示在左侧,那么显示在右侧\n left = cell.left + canvasBounds.left;\n top = cell.bottom + canvasBounds.top;\n } else {\n // 筛选菜单默认显示在左侧\n left = cell.right + canvasBounds.left - this.filterMenuWidth;\n top = cell.bottom + canvasBounds.top;\n }\n\n this.filterMenu.style.display = this.isVisible ? 'block' : 'none';\n this.filterMenu.style.left = `${left}px`;\n this.filterMenu.style.top = `${top}px`;\n }\n\n show(col: number, row: number, filterModes: FilterMode[]): void {\n this.filterModes = filterModes;\n if (!this.filterModes.includes('byValue')) {\n this.filterTabByValue.style.display = 'none';\n this.onTabSwitch('byCondition');\n } else if (!this.filterModes.includes('byCondition')) {\n this.filterTabByCondition.style.display = 'none';\n this.onTabSwitch('byValue');\n }\n\n this.adjustMenuPosition(col, row);\n this.filterMenu.style.display = 'block';\n\n const field = this.table.internalProps.layoutMap.getHeaderField(col, row) as string | number;\n this.updateSelectedField(field);\n\n // 根据当前筛选配置自动选择正确的筛选标签页\n const currentFilter = this.filterStateManager.getFilterState(field);\n if (currentFilter && currentFilter.type === 'byCondition') {\n this.onTabSwitch('byCondition');\n } else {\n this.onTabSwitch('byValue');\n }\n\n // 确保在事件冒泡完成后才设置 isVisible 为 true\n setTimeout(() => {\n this.isVisible = true;\n }, 0);\n }\n\n hide(): void {\n this.filterMenu.style.display = 'none';\n this.isVisible = false;\n }\n}\n"]}
@@ -2,13 +2,14 @@ import { FilterEngine } from './filter-engine';
2
2
  import { FilterStateManager } from './filter-state-manager';
3
3
  import { FilterToolbar } from './filter-toolbar';
4
4
  import type { FilterOptions, FilterState } from './types';
5
- import type { pluginsDefinition, ListTable, PivotTable, ColumnDefine } from '@visactor/vtable';
5
+ import type { pluginsDefinition, ListTable, PivotTable, ColumnDefine, ColumnsDefine } from '@visactor/vtable';
6
6
  export declare class FilterPlugin implements pluginsDefinition.IVTablePlugin {
7
7
  id: string;
8
8
  name: string;
9
- runTime: ("icon_click" | "before_init" | "before_update_option")[];
9
+ runTime: ("scroll" | "icon_click" | "before_init" | "before_update_option")[];
10
10
  pluginOptions: FilterOptions;
11
11
  table: ListTable | PivotTable;
12
+ columns: ColumnsDefine;
12
13
  filterEngine: FilterEngine;
13
14
  filterStateManager: FilterStateManager;
14
15
  filterToolbar: FilterToolbar;
@@ -21,6 +22,6 @@ export declare class FilterPlugin implements pluginsDefinition.IVTablePlugin {
21
22
  private updateFilterIcons;
22
23
  shouldEnableFilterForColumn(field: number | string, column: ColumnDefine): boolean;
23
24
  getFilterState(): any;
24
- setFilterState(filterState: FilterState): void;
25
+ setFilterState(filterState?: FilterState): void;
25
26
  release(): void;
26
27
  }
@@ -9,7 +9,7 @@ const vtable_1 = require("@visactor/vtable"), filter_engine_1 = require("./filte
9
9
  class FilterPlugin {
10
10
  constructor(pluginOptions) {
11
11
  var _a, _b, _c;
12
- this.id = "filter", this.name = "Filter", this.runTime = [ vtable_1.TABLE_EVENT_TYPE.BEFORE_INIT, vtable_1.TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION, vtable_1.TABLE_EVENT_TYPE.ICON_CLICK ],
12
+ this.id = "filter", this.name = "Filter", this.runTime = [ vtable_1.TABLE_EVENT_TYPE.BEFORE_INIT, vtable_1.TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION, vtable_1.TABLE_EVENT_TYPE.ICON_CLICK, vtable_1.TABLE_EVENT_TYPE.SCROLL ],
13
13
  this.id = null !== (_a = null == pluginOptions ? void 0 : pluginOptions.id) && void 0 !== _a ? _a : this.id,
14
14
  this.pluginOptions = pluginOptions, this.pluginOptions.filterIcon = null !== (_b = pluginOptions.filterIcon) && void 0 !== _b ? _b : {
15
15
  name: "filter-icon",
@@ -35,12 +35,17 @@ 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),
39
- this.handleOptionUpdate(eventArgs.options); else if (runtime === vtable_1.TABLE_EVENT_TYPE.ICON_CLICK && "filter-icon" === eventArgs.name || "filtering-icon" === eventArgs.name) {
38
+ this.columns = eventArgs.options.columns, this.filterToolbar.render(document.body),
39
+ this.updateFilterIcons(this.columns), this.filterStateManager.subscribe((() => {
40
+ this.updateFilterIcons(this.columns), this.table.updateColumns(this.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),
44
+ this.columns = eventArgs.options.columns, 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;
42
47
  this.filterToolbar.isVisible ? this.filterToolbar.hide() : this.filterToolbar.show(col, row, this.pluginOptions.filterModes);
43
- }
48
+ } else runtime === vtable_1.TABLE_EVENT_TYPE.SCROLL && "horizontal" === eventArgs.scrollDirection && this.filterToolbar.adjustMenuPosition();
44
49
  }
45
50
  update() {
46
51
  this.filterStateManager && this.reapplyActiveFilters();
@@ -48,7 +53,7 @@ class FilterPlugin {
48
53
  handleOptionUpdate(options) {
49
54
  const currentActiveFields = this.filterStateManager ? this.filterStateManager.getActiveFilterFields() : [];
50
55
  this.filterStateManager && currentActiveFields.length > 0 && this.validateFilterStatesAfterUpdate(options, currentActiveFields),
51
- this.updateFilterIcons(options);
56
+ this.updateFilterIcons(options.columns);
52
57
  }
53
58
  reapplyActiveFilters() {
54
59
  this.filterStateManager.reapplyCurrentFilters();
@@ -67,9 +72,17 @@ class FilterPlugin {
67
72
  });
68
73
  }));
69
74
  }
70
- updateFilterIcons(options) {
71
- options.columns.forEach((col => {
72
- this.shouldEnableFilterForColumn(col.field, col) ? col.headerIcon = this.pluginOptions.filterIcon : delete col.headerIcon;
75
+ updateFilterIcons(columns = []) {
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
+ 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) {
@@ -94,13 +107,10 @@ class FilterPlugin {
94
107
  };
95
108
  }
96
109
  setFilterState(filterState) {
97
- if (!this.filterStateManager || !filterState || !filterState.filters) return;
98
- this.filterStateManager.dispatch({
110
+ this.filterStateManager && (this.filterStateManager.dispatch({
99
111
  type: types_1.FilterActionType.CLEAR_ALL_FILTERS,
100
112
  payload: {}
101
- });
102
- this.table.columns;
103
- Object.entries(filterState.filters).forEach((([, config]) => {
113
+ }), filterState && filterState.filters && Object.entries(filterState.filters).forEach((([, config]) => {
104
114
  config.enable && this.filterStateManager.dispatch({
105
115
  type: types_1.FilterActionType.ADD_FILTER,
106
116
  payload: {
@@ -112,7 +122,7 @@ class FilterPlugin {
112
122
  enable: !0
113
123
  }
114
124
  });
115
- }));
125
+ })));
116
126
  }
117
127
  release() {
118
128
  this.table = null, this.filterEngine = null, this.filterStateManager = null, this.filterToolbar = null;
@@ -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 ColumnsDefine\n} from '@visactor/vtable';\n\n/**\n * 筛选插件,负责初始化筛选引擎、状态管理器和工具栏\n */\nexport class FilterPlugin implements pluginsDefinition.IVTablePlugin {\n id = `filter`;\n name = 'Filter';\n runTime = [\n TABLE_EVENT_TYPE.BEFORE_INIT,\n TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION,\n TABLE_EVENT_TYPE.ICON_CLICK,\n TABLE_EVENT_TYPE.SCROLL\n ];\n\n pluginOptions: FilterOptions;\n\n table: ListTable | PivotTable;\n columns: ColumnsDefine;\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 this.columns = eventArgs.options.columns;\n\n this.filterToolbar.render(document.body);\n this.updateFilterIcons(this.columns);\n this.filterStateManager.subscribe(() => {\n this.updateFilterIcons(this.columns);\n (this.table as ListTable).updateColumns(this.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.columns = eventArgs.options.columns;\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 } else if (runtime === TABLE_EVENT_TYPE.SCROLL) {\n if (eventArgs.scrollDirection === 'horizontal') {\n this.filterToolbar.adjustMenuPosition();\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.columns);\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(columns: ColumnsDefine = []) {\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 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) {\n console.warn('setFilterState: 状态管理器未初始化');\n return;\n }\n\n // 清除当前所有筛选\n this.filterStateManager.dispatch({\n type: FilterActionType.CLEAR_ALL_FILTERS,\n payload: {}\n });\n\n // 若传入参数为空,则重置筛选状态\n if (!filterState || !filterState.filters) {\n return;\n }\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;