@visactor/vtable-plugins 1.22.7 → 1.22.8-alpha.13

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 (69) hide show
  1. package/cjs/excel-edit-cell-keyboard.js +1 -0
  2. package/cjs/excel-edit-cell-keyboard.js.map +1 -1
  3. package/cjs/filter/condition-filter.d.ts +13 -2
  4. package/cjs/filter/condition-filter.js +69 -172
  5. package/cjs/filter/condition-filter.js.map +1 -1
  6. package/cjs/filter/constant.d.ts +7 -0
  7. package/cjs/filter/constant.js +124 -0
  8. package/cjs/filter/constant.js.map +1 -0
  9. package/cjs/filter/filter-engine.d.ts +3 -1
  10. package/cjs/filter/filter-engine.js +6 -4
  11. package/cjs/filter/filter-engine.js.map +1 -1
  12. package/cjs/filter/filter-state-manager.js +8 -2
  13. package/cjs/filter/filter-state-manager.js.map +1 -1
  14. package/cjs/filter/filter-toolbar.d.ts +9 -4
  15. package/cjs/filter/filter-toolbar.js +44 -27
  16. package/cjs/filter/filter-toolbar.js.map +1 -1
  17. package/cjs/filter/filter.d.ts +2 -0
  18. package/cjs/filter/filter.js +29 -15
  19. package/cjs/filter/filter.js.map +1 -1
  20. package/cjs/filter/styles.js +1 -1
  21. package/cjs/filter/styles.js.map +1 -1
  22. package/cjs/filter/types.d.ts +35 -0
  23. package/cjs/filter/types.js.map +1 -1
  24. package/cjs/filter/value-filter.d.ts +10 -2
  25. package/cjs/filter/value-filter.js +115 -57
  26. package/cjs/filter/value-filter.js.map +1 -1
  27. package/cjs/focus-highlight.js +1 -1
  28. package/cjs/focus-highlight.js.map +1 -1
  29. package/cjs/master-detail-plugin/checkbox.js +0 -1
  30. package/cjs/master-detail-plugin/config.js +2 -1
  31. package/cjs/master-detail-plugin/utils.js +1 -1
  32. package/cjs/table-series-number.js +1 -0
  33. package/cjs/table-series-number.js.map +1 -1
  34. package/dist/vtable-plugins.js +9839 -168
  35. package/dist/vtable-plugins.min.js +3 -3
  36. package/es/excel-edit-cell-keyboard.js +1 -0
  37. package/es/excel-edit-cell-keyboard.js.map +1 -1
  38. package/es/filter/condition-filter.d.ts +13 -2
  39. package/es/filter/condition-filter.js +67 -168
  40. package/es/filter/condition-filter.js.map +1 -1
  41. package/es/filter/constant.d.ts +7 -0
  42. package/es/filter/constant.js +120 -0
  43. package/es/filter/constant.js.map +1 -0
  44. package/es/filter/filter-engine.d.ts +3 -1
  45. package/es/filter/filter-engine.js +6 -4
  46. package/es/filter/filter-engine.js.map +1 -1
  47. package/es/filter/filter-state-manager.js +8 -2
  48. package/es/filter/filter-state-manager.js.map +1 -1
  49. package/es/filter/filter-toolbar.d.ts +9 -4
  50. package/es/filter/filter-toolbar.js +44 -24
  51. package/es/filter/filter-toolbar.js.map +1 -1
  52. package/es/filter/filter.d.ts +2 -0
  53. package/es/filter/filter.js +36 -16
  54. package/es/filter/filter.js.map +1 -1
  55. package/es/filter/styles.js +1 -1
  56. package/es/filter/styles.js.map +1 -1
  57. package/es/filter/types.d.ts +35 -0
  58. package/es/filter/types.js.map +1 -1
  59. package/es/filter/value-filter.d.ts +10 -2
  60. package/es/filter/value-filter.js +112 -54
  61. package/es/filter/value-filter.js.map +1 -1
  62. package/es/focus-highlight.js +1 -1
  63. package/es/focus-highlight.js.map +1 -1
  64. package/es/master-detail-plugin/checkbox.js +1 -2
  65. package/es/master-detail-plugin/config.js +2 -1
  66. package/es/master-detail-plugin/utils.js +1 -1
  67. package/es/table-series-number.js +1 -0
  68. package/es/table-series-number.js.map +1 -1
  69. package/package.json +7 -7
@@ -8,12 +8,18 @@ import { FilterToolbar } from "./filter-toolbar";
8
8
 
9
9
  import { FilterActionType } from "./types";
10
10
 
11
+ import { cloneDeep, merge } from "lodash";
12
+
13
+ import { filterStyles } from "./styles";
14
+
15
+ import { categories } from "./constant";
16
+
11
17
  export class FilterPlugin {
12
18
  constructor(pluginOptions) {
13
- var _a, _b, _c;
19
+ var _a, _b, _c, _d, _e;
14
20
  this.id = "filter", this.name = "Filter", this.runTime = [ TABLE_EVENT_TYPE.BEFORE_INIT, TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION, TABLE_EVENT_TYPE.ICON_CLICK, TABLE_EVENT_TYPE.SCROLL, TABLE_EVENT_TYPE.CHANGE_CELL_VALUE, TABLE_EVENT_TYPE.UPDATE_RECORD, TABLE_EVENT_TYPE.ADD_RECORD, TABLE_EVENT_TYPE.DELETE_RECORD ],
15
21
  this.id = null !== (_a = null == pluginOptions ? void 0 : pluginOptions.id) && void 0 !== _a ? _a : this.id,
16
- this.pluginOptions = pluginOptions, this.pluginOptions.filterIcon = null !== (_b = pluginOptions.filterIcon) && void 0 !== _b ? _b : {
22
+ this.pluginOptions = cloneDeep(pluginOptions), this.pluginOptions.filterIcon = null !== (_b = pluginOptions.filterIcon) && void 0 !== _b ? _b : {
17
23
  name: "filter-icon",
18
24
  type: "svg",
19
25
  width: 12,
@@ -29,30 +35,42 @@ export class FilterPlugin {
29
35
  positionType: TYPES.IconPosition.right,
30
36
  cursor: "pointer",
31
37
  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>'
32
- }, this.pluginOptions.filterModes && this.pluginOptions.filterModes.length || (this.pluginOptions.filterModes = [ "byValue", "byCondition" ]);
38
+ }, this.pluginOptions.filterModes && this.pluginOptions.filterModes.length || (this.pluginOptions.filterModes = [ "byValue", "byCondition" ]),
39
+ this.pluginOptions.styles = merge(filterStyles, null !== (_d = this.pluginOptions.styles) && void 0 !== _d ? _d : {}),
40
+ this.pluginOptions.conditionCategories = null !== (_e = pluginOptions.conditionCategories) && void 0 !== _e ? _e : categories;
33
41
  }
34
- run(...args) {
35
- var _a, _b, _c;
36
- const eventArgs = args[0], runtime = args[1], table = args[2];
37
- if (this.table = table, runtime === TABLE_EVENT_TYPE.BEFORE_INIT) this.filterEngine = new FilterEngine,
38
- this.filterStateManager = new FilterStateManager(this.table, this.filterEngine),
39
- this.filterToolbar = new FilterToolbar(this.table, this.filterStateManager), this.columns = eventArgs.options.columns,
40
- this.filterToolbar.render(document.body), this.updateFilterIcons(this.columns),
41
- this.filterStateManager.subscribe(((_, action) => {
42
+ initFilterPlugin(eventArgs) {
43
+ this.filterEngine = new FilterEngine(this.pluginOptions), this.filterStateManager = new FilterStateManager(this.table, this.filterEngine),
44
+ this.filterToolbar = new FilterToolbar(this.table, this.filterStateManager, this.pluginOptions),
45
+ this.columns = eventArgs.options.columns, this.filterToolbar.render(document.body),
46
+ this.updateFilterIcons(this.columns), this.filterStateManager.subscribe(((_, action) => {
42
47
  (null == action ? void 0 : action.type) !== FilterActionType.ADD_FILTER && (this.updateFilterIcons(this.columns),
43
48
  this.table.updateColumns(this.columns, {
44
49
  clearRowHeightCache: !1
45
50
  }));
46
- })); else if (runtime === TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION) this.pluginOptions = Object.assign(Object.assign({}, this.pluginOptions), eventArgs.options.plugins.find((plugin => plugin.id === this.id)).pluginOptions),
51
+ }));
52
+ }
53
+ run(...args) {
54
+ var _a, _b, _c, _d, _e;
55
+ const eventArgs = args[0], runtime = args[1], table = args[2];
56
+ if (this.table = table, runtime === TABLE_EVENT_TYPE.BEFORE_INIT) this.initFilterPlugin(eventArgs); else if (runtime === TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION) this.filterEngine && this.filterStateManager && this.filterToolbar || this.initFilterPlugin(eventArgs),
57
+ this.pluginOptions = Object.assign(Object.assign({}, this.pluginOptions), null === (_b = null === (_a = eventArgs.options.plugins) || void 0 === _a ? void 0 : _a.find((plugin => plugin.id === this.id))) || void 0 === _b ? void 0 : _b.pluginOptions),
47
58
  this.columns = eventArgs.options.columns, this.handleOptionUpdate(eventArgs.options); else if (runtime === TABLE_EVENT_TYPE.ICON_CLICK && "filter-icon" === eventArgs.name || "filtering-icon" === eventArgs.name) {
48
- 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;
59
+ if (3 === (null === (_c = eventArgs.event) || void 0 === _c ? void 0 : _c.which) || 2 === (null === (_d = eventArgs.event) || void 0 === _d ? void 0 : _d.button) || 2 == (2 & (null === (_e = eventArgs.event) || void 0 === _e ? void 0 : _e.buttons))) return;
49
60
  const col = eventArgs.col, row = eventArgs.row;
50
- this.filterToolbar.isVisible ? this.filterToolbar.hide() : this.filterToolbar.show(col, row, this.pluginOptions.filterModes);
61
+ this.filterToolbar.isVisible ? this.filterToolbar.hide(eventArgs.col, eventArgs.row) : (this.filterToolbar.show(col, row, this.pluginOptions.filterModes),
62
+ this.table.fireListeners(TABLE_EVENT_TYPE.FILTER_MENU_SHOW, {
63
+ col: eventArgs.col,
64
+ row: eventArgs.row
65
+ }));
51
66
  } else if (runtime === TABLE_EVENT_TYPE.SCROLL) "horizontal" === eventArgs.scrollDirection && this.filterToolbar.adjustMenuPosition(); else if (runtime === TABLE_EVENT_TYPE.CHANGE_CELL_VALUE) {
52
67
  const changedField = this.table.getHeaderField(eventArgs.col, eventArgs.row);
53
68
  this.syncFilterWithTableData(changedField);
54
69
  } else (runtime === TABLE_EVENT_TYPE.UPDATE_RECORD || runtime === TABLE_EVENT_TYPE.ADD_RECORD || runtime === TABLE_EVENT_TYPE.DELETE_RECORD) && this.syncFilterWithTableData();
55
70
  }
71
+ updatePluginOptions(pluginOptions) {
72
+ this.pluginOptions = merge(this.pluginOptions, pluginOptions), this.filterToolbar.updateStyles(this.pluginOptions.styles);
73
+ }
56
74
  update() {
57
75
  this.filterStateManager && this.reapplyActiveFilters();
58
76
  }
@@ -140,8 +158,10 @@ export class FilterPlugin {
140
158
  })));
141
159
  }
142
160
  release() {
143
- this.table = null, this.filterEngine = null, this.filterStateManager = null, this.filterToolbar.valueFilter.destroy(),
144
- this.filterToolbar = null;
161
+ this.columns.forEach((column => {
162
+ column.headerIcon = void 0;
163
+ })), this.table = null, this.filterEngine = null, this.filterStateManager = null,
164
+ this.filterToolbar.destroy(), this.filterToolbar = null;
145
165
  }
146
166
  }
147
167
  //# sourceMappingURL=filter.js.map
@@ -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, FilterAction } 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 TABLE_EVENT_TYPE.CHANGE_CELL_VALUE,\n TABLE_EVENT_TYPE.UPDATE_RECORD,\n TABLE_EVENT_TYPE.ADD_RECORD,\n TABLE_EVENT_TYPE.DELETE_RECORD\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((_: FilterState, action?: FilterAction) => {\n // 新增筛选配置时,不需要更新筛选图标以及表格\n if (action?.type === FilterActionType.ADD_FILTER) {\n return;\n }\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 } else if (runtime === TABLE_EVENT_TYPE.CHANGE_CELL_VALUE) {\n const changedField = this.table.getHeaderField(eventArgs.col, eventArgs.row);\n this.syncFilterWithTableData(changedField as string | number);\n } else if (runtime === TABLE_EVENT_TYPE.UPDATE_RECORD) {\n this.syncFilterWithTableData();\n } else if (runtime === TABLE_EVENT_TYPE.ADD_RECORD) {\n this.syncFilterWithTableData();\n } else if (runtime === TABLE_EVENT_TYPE.DELETE_RECORD) {\n this.syncFilterWithTableData();\n }\n }\n\n // 当用户的配置项更新时调用\n update() {\n if (this.filterStateManager) {\n this.reapplyActiveFilters();\n }\n }\n\n syncFilterWithTableData(field?: string | number) {\n const filterType = this.filterStateManager.getFilterState(field)?.type;\n if (filterType === 'byValue') {\n if (field !== null && field !== undefined) {\n this.filterToolbar.valueFilter.syncSingleStateFromTableData(field);\n return;\n }\n\n const columns = this.table.dataSource.columns;\n columns.forEach(({ field }) => {\n this.filterToolbar.valueFilter.syncSingleStateFromTableData(field as string | number);\n });\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: any, b: any) =>\n a === b || (a && b && typeof a === 'object' && typeof b === 'object' && a.name === b.name);\n\n const toIconList = (icons: any) => (icons ? (Array.isArray(icons) ? icons : [icons]) : []);\n\n const compactIcons = (list: any[]) => (list.length === 0 ? undefined : list.length === 1 ? list[0] : list);\n\n columns.forEach(column => {\n const shouldShow = this.shouldEnableFilterForColumn(column.field as string | number, column);\n const isFiltering = !!this.filterStateManager.getFilterState(column.field as string | number)?.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.valueFilter.destroy();\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, FilterAction } 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';\nimport { cloneDeep, merge } from 'lodash';\nimport { filterStyles } from './styles';\nimport { categories } from './constant';\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 TABLE_EVENT_TYPE.CHANGE_CELL_VALUE,\n TABLE_EVENT_TYPE.UPDATE_RECORD,\n TABLE_EVENT_TYPE.ADD_RECORD,\n TABLE_EVENT_TYPE.DELETE_RECORD\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 = cloneDeep(pluginOptions); // 不污染用户的配置, 以便上层业务做diff的时候使用\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 this.pluginOptions.styles = merge(filterStyles, this.pluginOptions.styles ?? {});\n this.pluginOptions.conditionCategories = pluginOptions.conditionCategories ?? categories;\n }\n\n initFilterPlugin(eventArgs: any) {\n this.filterEngine = new FilterEngine(this.pluginOptions);\n this.filterStateManager = new FilterStateManager(this.table, this.filterEngine);\n this.filterToolbar = new FilterToolbar(this.table, this.filterStateManager, this.pluginOptions);\n this.columns = eventArgs.options.columns;\n\n this.filterToolbar.render(document.body);\n this.updateFilterIcons(this.columns);\n this.filterStateManager.subscribe((_: FilterState, action?: FilterAction) => {\n // 新增筛选配置时,不需要更新筛选图标以及表格\n if (action?.type === FilterActionType.ADD_FILTER) {\n return;\n }\n this.updateFilterIcons(this.columns);\n (this.table as ListTable).updateColumns(this.columns, {\n clearRowHeightCache: false\n });\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.initFilterPlugin(eventArgs);\n } else if (runtime === TABLE_EVENT_TYPE.BEFORE_UPDATE_OPTION) {\n if (!this.filterEngine || !this.filterStateManager || !this.filterToolbar) {\n this.initFilterPlugin(eventArgs);\n }\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(eventArgs.col, eventArgs.row);\n } else {\n this.filterToolbar.show(col, row, this.pluginOptions.filterModes);\n this.table.fireListeners(TABLE_EVENT_TYPE.FILTER_MENU_SHOW, {\n col: eventArgs.col,\n row: eventArgs.row\n });\n }\n } else if (runtime === TABLE_EVENT_TYPE.SCROLL) {\n if (eventArgs.scrollDirection === 'horizontal') {\n this.filterToolbar.adjustMenuPosition();\n }\n } else if (runtime === TABLE_EVENT_TYPE.CHANGE_CELL_VALUE) {\n const changedField = this.table.getHeaderField(eventArgs.col, eventArgs.row);\n this.syncFilterWithTableData(changedField as string | number);\n } else if (runtime === TABLE_EVENT_TYPE.UPDATE_RECORD) {\n this.syncFilterWithTableData();\n } else if (runtime === TABLE_EVENT_TYPE.ADD_RECORD) {\n this.syncFilterWithTableData();\n } else if (runtime === TABLE_EVENT_TYPE.DELETE_RECORD) {\n this.syncFilterWithTableData();\n }\n }\n\n updatePluginOptions(pluginOptions: FilterOptions) {\n // TODO: 目前额外只处理了styles,其他的后续再处理\n this.pluginOptions = merge(this.pluginOptions, pluginOptions);\n // 更新筛选器UI样式\n this.filterToolbar.updateStyles(this.pluginOptions.styles);\n }\n\n // 当用户的配置项更新时调用\n update() {\n if (this.filterStateManager) {\n this.reapplyActiveFilters();\n }\n }\n\n syncFilterWithTableData(field?: string | number) {\n const filterType = this.filterStateManager.getFilterState(field)?.type;\n if (filterType === 'byValue') {\n if (field !== null && field !== undefined) {\n this.filterToolbar.valueFilter.syncSingleStateFromTableData(field);\n return;\n }\n\n const columns = this.table.dataSource.columns;\n columns.forEach(({ field }) => {\n this.filterToolbar.valueFilter.syncSingleStateFromTableData(field as string | number);\n });\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: any, b: any) =>\n a === b || (a && b && typeof a === 'object' && typeof b === 'object' && a.name === b.name);\n\n const toIconList = (icons: any) => (icons ? (Array.isArray(icons) ? icons : [icons]) : []);\n\n const compactIcons = (list: any[]) => (list.length === 0 ? undefined : list.length === 1 ? list[0] : list);\n\n columns.forEach(column => {\n const shouldShow = this.shouldEnableFilterForColumn(column.field as string | number, column);\n const isFiltering = !!this.filterStateManager.getFilterState(column.field as string | number)?.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.columns.forEach(column => {\n column.headerIcon = undefined;\n });\n this.table = null;\n this.filterEngine = null;\n this.filterStateManager = null;\n this.filterToolbar.destroy();\n this.filterToolbar = null;\n }\n}\n"]}
@@ -5,7 +5,7 @@ export const filterStyles = {
5
5
  backgroundColor: "white",
6
6
  border: "1px solid #ccc",
7
7
  boxShadow: "0 4px 8px rgba(0,0,0,0.15)",
8
- zIndex: "100"
8
+ zIndex: "99999"
9
9
  },
10
10
  filterPanel: {
11
11
  padding: "10px",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/filter/styles.ts"],"names":[],"mappings":"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","file":"styles.js","sourcesContent":["/**\n * 筛选组件样式定义\n */\nexport const filterStyles = {\n // 筛选菜单\n filterMenu: {\n display: 'none',\n position: 'absolute',\n backgroundColor: 'white',\n border: '1px solid #ccc',\n boxShadow: '0 4px 8px rgba(0,0,0,0.15)',\n zIndex: '100'\n },\n\n // 筛选面板\n filterPanel: {\n padding: '10px',\n display: 'block'\n },\n\n // 搜索容器\n searchContainer: {\n padding: '5px'\n },\n\n // 搜索输入框\n searchInput: {\n width: '100%',\n padding: '8px 10px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n fontSize: '14px',\n boxSizing: 'border-box'\n },\n\n // 选项容器\n optionsContainer: {\n maxHeight: '200px',\n overflowY: 'auto',\n marginTop: '10px'\n },\n\n // 筛选选项项\n optionItem: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 5px'\n },\n\n // 筛选选项标签\n optionLabel: {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n flexGrow: '1',\n fontWeight: 'normal'\n },\n\n // 复选框\n checkbox: {\n marginRight: '10px'\n },\n\n // 计数标签\n countSpan: {\n color: '#888',\n fontSize: '12px'\n },\n\n // 标签容器\n tabsContainer: {\n display: 'flex',\n justifyContent: 'space-around',\n borderBottom: '1px solid #e0e0e0'\n },\n\n // 标签样式\n tabStyle: (isActive: boolean) => ({\n backgroundColor: 'transparent',\n border: 'none',\n flex: '1',\n padding: '10px 15px',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: isActive ? 'bold' : 'normal',\n color: isActive ? '#007bff' : '#666',\n borderBottom: isActive ? '3px solid #007bff' : '2px solid transparent'\n }),\n\n // 页脚容器\n footerContainer: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '10px 15px',\n borderTop: '1px solid #e0e0e0',\n backgroundColor: '#f8f9fa'\n },\n\n footerButton: (isPrimary: boolean) => ({\n padding: '6px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n cursor: 'pointer',\n marginLeft: '5px',\n backgroundColor: isPrimary ? '#007bff' : 'white',\n color: isPrimary ? 'white' : '#333',\n borderColor: isPrimary ? '#007bff' : '#ccc'\n }),\n\n // 清除链接\n clearLink: {\n color: '#007bff',\n textDecoration: 'none'\n },\n\n // 按钮样式\n buttonStyle: (isPrimary: boolean = false) => ({\n padding: '6px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n cursor: 'pointer',\n marginLeft: '5px',\n backgroundColor: isPrimary ? '#007bff' : 'white',\n color: isPrimary ? 'white' : '#333',\n borderColor: isPrimary ? '#007bff' : '#ccc'\n }),\n\n // === 条件筛选相关样式 ===\n\n // 条件筛选容器\n conditionContainer: {\n marginBottom: '15px',\n padding: '10px'\n },\n\n // 表单标签样式\n formLabel: {\n display: 'block',\n marginBottom: '8px',\n fontWeight: 'bold'\n },\n\n // 操作符选择框样式\n operatorSelect: {\n width: '100%',\n padding: '8px',\n marginBottom: '15px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n boxSizing: 'border-box'\n },\n\n rangeInputContainer: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px'\n },\n\n addLabel: {\n display: 'none',\n padding: '0 5px'\n }\n};\n\n/**\n * 应用样式到DOM元素\n */\nexport function applyStyles(element: HTMLElement, styles: Record<string, string>) {\n Object.entries(styles).forEach(([prop, value]) => {\n element.style[prop as any] = value;\n });\n}\n\n/**\n * 创建DOM元素的辅助函数\n */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attributes: Record<string, string> = {},\n children: (HTMLElement | string)[] = []\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tag);\n\n Object.entries(attributes).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n\n children.forEach(child => {\n if (typeof child === 'string') {\n element.appendChild(document.createTextNode(child));\n } else {\n element.appendChild(child);\n }\n });\n\n return element;\n}\n"]}
1
+ {"version":3,"sources":["../src/filter/styles.ts"],"names":[],"mappings":"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","file":"styles.js","sourcesContent":["/**\n * 筛选组件样式定义\n */\nexport const filterStyles = {\n // 筛选菜单\n filterMenu: {\n display: 'none',\n position: 'absolute',\n backgroundColor: 'white',\n border: '1px solid #ccc',\n boxShadow: '0 4px 8px rgba(0,0,0,0.15)',\n zIndex: '99999'\n },\n\n // 筛选面板\n filterPanel: {\n padding: '10px',\n display: 'block'\n },\n\n // 搜索容器\n searchContainer: {\n padding: '5px'\n },\n\n // 搜索输入框\n searchInput: {\n width: '100%',\n padding: '8px 10px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n fontSize: '14px',\n boxSizing: 'border-box'\n },\n\n // 选项容器\n optionsContainer: {\n maxHeight: '200px',\n overflowY: 'auto',\n marginTop: '10px'\n },\n\n // 筛选选项项\n optionItem: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 5px'\n },\n\n // 筛选选项标签\n optionLabel: {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n flexGrow: '1',\n fontWeight: 'normal'\n },\n\n // 复选框\n checkbox: {\n marginRight: '10px'\n },\n\n // 计数标签\n countSpan: {\n color: '#888',\n fontSize: '12px'\n },\n\n // 标签容器\n tabsContainer: {\n display: 'flex',\n justifyContent: 'space-around',\n borderBottom: '1px solid #e0e0e0'\n },\n\n // 标签样式\n tabStyle: (isActive: boolean) => ({\n backgroundColor: 'transparent',\n border: 'none',\n flex: '1',\n padding: '10px 15px',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: isActive ? 'bold' : 'normal',\n color: isActive ? '#007bff' : '#666',\n borderBottom: isActive ? '3px solid #007bff' : '2px solid transparent'\n }),\n\n // 页脚容器\n footerContainer: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '10px 15px',\n borderTop: '1px solid #e0e0e0',\n backgroundColor: '#f8f9fa'\n },\n\n footerButton: (isPrimary: boolean) => ({\n padding: '6px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n cursor: 'pointer',\n marginLeft: '5px',\n backgroundColor: isPrimary ? '#007bff' : 'white',\n color: isPrimary ? 'white' : '#333',\n borderColor: isPrimary ? '#007bff' : '#ccc'\n }),\n\n // 清除链接\n clearLink: {\n color: '#007bff',\n textDecoration: 'none'\n },\n\n // 按钮样式\n buttonStyle: (isPrimary: boolean = false) => ({\n padding: '6px 12px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n cursor: 'pointer',\n marginLeft: '5px',\n backgroundColor: isPrimary ? '#007bff' : 'white',\n color: isPrimary ? 'white' : '#333',\n borderColor: isPrimary ? '#007bff' : '#ccc'\n }),\n\n // === 条件筛选相关样式 ===\n\n // 条件筛选容器\n conditionContainer: {\n marginBottom: '15px',\n padding: '10px'\n },\n\n // 表单标签样式\n formLabel: {\n display: 'block',\n marginBottom: '8px',\n fontWeight: 'bold'\n },\n\n // 操作符选择框样式\n operatorSelect: {\n width: '100%',\n padding: '8px',\n marginBottom: '15px',\n border: '1px solid #ccc',\n borderRadius: '4px',\n boxSizing: 'border-box'\n },\n\n rangeInputContainer: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px'\n },\n\n addLabel: {\n display: 'none',\n padding: '0 5px'\n }\n};\n\n/**\n * 应用样式到DOM元素\n */\nexport function applyStyles(element: HTMLElement, styles: Record<string, string>) {\n Object.entries(styles).forEach(([prop, value]) => {\n element.style[prop as any] = value;\n });\n}\n\n/**\n * 创建DOM元素的辅助函数\n */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attributes: Record<string, string> = {},\n children: (HTMLElement | string)[] = []\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tag);\n\n Object.entries(attributes).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n\n children.forEach(child => {\n if (typeof child === 'string') {\n element.appendChild(document.createTextNode(child));\n } else {\n element.appendChild(child);\n }\n });\n\n return element;\n}\n"]}
@@ -6,6 +6,15 @@ export interface FilterOptions {
6
6
  enableFilter?: (field: number | string, column: TYPES.ColumnDefine) => boolean;
7
7
  defaultEnabled?: boolean;
8
8
  filterModes?: FilterMode[];
9
+ styles?: FilterStyles;
10
+ conditionCategories?: FilterOperatorCategoryOption[];
11
+ checkboxItemFormat?: (rawValue: any, formatValue: any) => any;
12
+ syncFilterItemsState?: boolean;
13
+ onFilterRecordsEnd?: (records: any[]) => void;
14
+ }
15
+ export interface FilterOperatorCategoryOption {
16
+ value: FilterOperatorCategory;
17
+ label: string;
9
18
  }
10
19
  export type FilterMode = 'byValue' | 'byCondition';
11
20
  export interface FilterState {
@@ -54,3 +63,29 @@ export declare enum FilterOperatorCategory {
54
63
  RADIO = "radio"
55
64
  }
56
65
  export type FilterListener = (state: FilterState, action?: FilterAction) => void;
66
+ interface StaticStyles {
67
+ filterMenu?: Record<string, string>;
68
+ filterPanel?: Record<string, string>;
69
+ searchContainer?: Record<string, string>;
70
+ searchInput?: Record<string, string>;
71
+ optionsContainer?: Record<string, string>;
72
+ optionItem?: Record<string, string>;
73
+ optionLabel?: Record<string, string>;
74
+ checkbox?: Record<string, string>;
75
+ countSpan?: Record<string, string>;
76
+ tabsContainer?: Record<string, string>;
77
+ footerContainer?: Record<string, string>;
78
+ clearLink?: Record<string, string>;
79
+ conditionContainer?: Record<string, string>;
80
+ formLabel?: Record<string, string>;
81
+ operatorSelect?: Record<string, string>;
82
+ rangeInputContainer?: Record<string, string>;
83
+ addLabel?: Record<string, string>;
84
+ }
85
+ interface FunctionStyles {
86
+ tabStyle?: (isActive: boolean) => Record<string, string>;
87
+ footerButton?: (isPrimary: boolean) => Record<string, string>;
88
+ buttonStyle?: (isPrimary?: boolean) => Record<string, string>;
89
+ }
90
+ export type FilterStyles = StaticStyles & FunctionStyles;
91
+ export {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/filter/types.ts"],"names":[],"mappings":"AAiCA,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IAC1B,mEAAU,CAAA;IACV,yEAAa,CAAA;IACb,yEAAa,CAAA;IACb,yEAAa,CAAA;IACb,2EAAc,CAAA;IACd,iFAAiB,CAAA;IACjB,yEAAa,CAAA;AACf,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B;AA2CD,MAAM,CAAN,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC,qCAAW,CAAA;IACX,uCAAa,CAAA;IACb,2CAAiB,CAAA;IACjB,yCAAe,CAAA;IACf,+CAAqB,CAAA;IACrB,yCAAe,CAAA;AACjB,CAAC,EAPW,sBAAsB,KAAtB,sBAAsB,QAOjC","file":"types.js","sourcesContent":["import type { TYPES } from '@visactor/vtable';\n\nexport interface FilterOptions {\n /** 筛选器 ID,用于唯一标识筛选器 */\n id?: string;\n /** 筛选器图标 */\n filterIcon?: TYPES.ColumnIconOption;\n /** 筛选器激活图标 */\n filteringIcon?: TYPES.ColumnIconOption;\n /** 筛选功能启用钩子函数,返回指定列是否启用筛选功能 */\n enableFilter?: (field: number | string, column: TYPES.ColumnDefine) => boolean;\n /** 默认是否启用筛选(当 enableFilter 未定义时使用) */\n defaultEnabled?: boolean;\n /** 是否展示按条件筛选,按值筛选 UI */\n filterModes?: FilterMode[];\n}\n\nexport type FilterMode = 'byValue' | 'byCondition';\n\nexport interface FilterState {\n filters: Map<string | number, FilterConfig>;\n // activeFilters: string[]; // 激活的筛选器的 ID 列表\n}\n\nexport interface FilterConfig {\n enable: boolean; // 是否启用筛选\n field: string | number; // 对应表格列,同时作为筛选配置的唯一标识\n type: 'byValue' | 'byCondition'; // 筛选类型\n values?: any[]; // 按值筛选时的值列表\n operator?: FilterOperator; // 按条件筛选时的操作符\n condition?: any; // 按条件筛选时的具体条件\n}\n\nexport enum FilterActionType {\n ADD_FILTER,\n REMOVE_FILTER,\n UPDATE_FILTER,\n ENABLE_FILTER,\n DISABLE_FILTER,\n CLEAR_ALL_FILTERS,\n APPLY_FILTERS\n}\n\nexport interface FilterAction {\n type: FilterActionType;\n payload: any;\n}\n\nexport interface ValueFilterOptionDom {\n id: string;\n originalValue: any[];\n itemContainer: HTMLDivElement;\n checkbox: HTMLInputElement;\n countSpan: HTMLSpanElement;\n}\n\nexport type FilterOperator =\n // 通用\n | 'equals'\n | 'notEquals'\n // 数值\n | 'greaterThan'\n | 'lessThan'\n | 'greaterThanOrEqual'\n | 'lessThanOrEqual'\n | 'between'\n | 'notBetween'\n // 文本\n | 'contains'\n | 'notContains'\n | 'startsWith'\n | 'notStartsWith'\n | 'endsWith'\n | 'notEndsWith'\n // 复选框 | 单选框\n | 'isChecked'\n | 'isUnchecked';\n\nexport interface OperatorOption {\n value: FilterOperator;\n label: string;\n category: FilterOperatorCategory;\n}\n\nexport enum FilterOperatorCategory {\n ALL = 'all',\n TEXT = 'text',\n NUMBER = 'number',\n COLOR = 'color',\n CHECKBOX = 'checkbox',\n RADIO = 'radio'\n}\n\nexport type FilterListener = (state: FilterState, action?: FilterAction) => void;\n"]}
1
+ {"version":3,"sources":["../src/filter/types.ts"],"names":[],"mappings":"AAkDA,MAAM,CAAN,IAAY,gBAQX;AARD,WAAY,gBAAgB;IAC1B,mEAAU,CAAA;IACV,yEAAa,CAAA;IACb,yEAAa,CAAA;IACb,yEAAa,CAAA;IACb,2EAAc,CAAA;IACd,iFAAiB,CAAA;IACjB,yEAAa,CAAA;AACf,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,QAQ3B;AA2CD,MAAM,CAAN,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC,qCAAW,CAAA;IACX,uCAAa,CAAA;IACb,2CAAiB,CAAA;IACjB,yCAAe,CAAA;IACf,+CAAqB,CAAA;IACrB,yCAAe,CAAA;AACjB,CAAC,EAPW,sBAAsB,KAAtB,sBAAsB,QAOjC","file":"types.js","sourcesContent":["import type { TYPES } from '@visactor/vtable';\n\nexport interface FilterOptions {\n /** 筛选器 ID,用于唯一标识筛选器 */\n id?: string;\n /** 筛选器图标 */\n filterIcon?: TYPES.ColumnIconOption;\n /** 筛选器激活图标 */\n filteringIcon?: TYPES.ColumnIconOption;\n /** 筛选功能启用钩子函数,返回指定列是否启用筛选功能 */\n enableFilter?: (field: number | string, column: TYPES.ColumnDefine) => boolean;\n /** 默认是否启用筛选(当 enableFilter 未定义时使用) */\n defaultEnabled?: boolean;\n /** 是否展示按条件筛选,按值筛选 UI */\n filterModes?: FilterMode[];\n /** 筛选器样式 */\n styles?: FilterStyles;\n /** 自定义筛选分类 */\n conditionCategories?: FilterOperatorCategoryOption[];\n /** 筛选选项是否展示为原始值 */\n checkboxItemFormat?: (rawValue: any, formatValue: any) => any;\n /** 多个筛选器之间是否联动\n * @default true\n */\n syncFilterItemsState?: boolean;\n /** 筛选记录结束回调 */\n onFilterRecordsEnd?: (records: any[]) => void;\n}\n\nexport interface FilterOperatorCategoryOption {\n value: FilterOperatorCategory;\n label: string;\n}\n\nexport type FilterMode = 'byValue' | 'byCondition';\n\nexport interface FilterState {\n filters: Map<string | number, FilterConfig>;\n // activeFilters: string[]; // 激活的筛选器的 ID 列表\n}\n\nexport interface FilterConfig {\n enable: boolean; // 是否启用筛选\n field: string | number; // 对应表格列,同时作为筛选配置的唯一标识\n type: 'byValue' | 'byCondition'; // 筛选类型\n values?: any[]; // 按值筛选时的值列表\n operator?: FilterOperator; // 按条件筛选时的操作符\n condition?: any; // 按条件筛选时的具体条件\n}\n\nexport enum FilterActionType {\n ADD_FILTER,\n REMOVE_FILTER,\n UPDATE_FILTER,\n ENABLE_FILTER,\n DISABLE_FILTER,\n CLEAR_ALL_FILTERS,\n APPLY_FILTERS\n}\n\nexport interface FilterAction {\n type: FilterActionType;\n payload: any;\n}\n\nexport interface ValueFilterOptionDom {\n id: string;\n originalValue: any[];\n itemContainer: HTMLDivElement;\n checkbox: HTMLInputElement;\n countSpan: HTMLSpanElement;\n}\n\nexport type FilterOperator =\n // 通用\n | 'equals'\n | 'notEquals'\n // 数值\n | 'greaterThan'\n | 'lessThan'\n | 'greaterThanOrEqual'\n | 'lessThanOrEqual'\n | 'between'\n | 'notBetween'\n // 文本\n | 'contains'\n | 'notContains'\n | 'startsWith'\n | 'notStartsWith'\n | 'endsWith'\n | 'notEndsWith'\n // 复选框 | 单选框\n | 'isChecked'\n | 'isUnchecked';\n\nexport interface OperatorOption {\n value: FilterOperator;\n label: string;\n category: FilterOperatorCategory;\n}\n\nexport enum FilterOperatorCategory {\n ALL = 'all',\n TEXT = 'text',\n NUMBER = 'number',\n COLOR = 'color',\n CHECKBOX = 'checkbox',\n RADIO = 'radio'\n}\n\nexport type FilterListener = (state: FilterState, action?: FilterAction) => void;\n\n/**\n * 筛选组件样式类型定义\n */\n\n// 静态样式类型\ninterface StaticStyles {\n filterMenu?: Record<string, string>;\n filterPanel?: Record<string, string>;\n searchContainer?: Record<string, string>;\n searchInput?: Record<string, string>;\n optionsContainer?: Record<string, string>;\n optionItem?: Record<string, string>;\n optionLabel?: Record<string, string>;\n checkbox?: Record<string, string>;\n countSpan?: Record<string, string>;\n tabsContainer?: Record<string, string>;\n footerContainer?: Record<string, string>;\n clearLink?: Record<string, string>;\n conditionContainer?: Record<string, string>;\n formLabel?: Record<string, string>;\n operatorSelect?: Record<string, string>;\n rangeInputContainer?: Record<string, string>;\n addLabel?: Record<string, string>;\n}\n\n// 函数样式类型\ninterface FunctionStyles {\n tabStyle?: (isActive: boolean) => Record<string, string>;\n footerButton?: (isPrimary: boolean) => Record<string, string>;\n buttonStyle?: (isPrimary?: boolean) => Record<string, string>;\n}\n\n// 完整的筛选样式类型\nexport type FilterStyles = StaticStyles & FunctionStyles;\n"]}
@@ -1,8 +1,11 @@
1
- import { ListTable, PivotTable } from '@visactor/vtable';
1
+ import type { ListTable, PivotTable } from '@visactor/vtable';
2
+ import type { FilterOptions, FilterStyles } from './types';
2
3
  import type { FilterStateManager } from './filter-state-manager';
3
4
  export declare class ValueFilter {
4
5
  private table;
5
6
  private filterStateManager;
7
+ private pluginOptions;
8
+ private styles;
6
9
  private selectedField;
7
10
  private selectedKeys;
8
11
  private candidateKeys;
@@ -10,13 +13,17 @@ export declare class ValueFilter {
10
13
  private toUnformattedCache;
11
14
  private valueFilterOptionList;
12
15
  private filterByValuePanel;
16
+ private searchContainer;
17
+ private optionsContainer;
18
+ private selectAllItemDiv;
19
+ private selectAllLabel;
13
20
  private filterByValueSearchInput;
14
21
  private selectAllCheckbox;
15
22
  private totalCountSpan;
16
23
  private filterItemsContainer;
17
24
  private _onInputKeyUpHandler;
18
25
  private _onCheckboxChangeHandler;
19
- constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager);
26
+ constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager, pluginOptions: FilterOptions);
20
27
  setSelectedField(fieldId: string | number): void;
21
28
  private getFormatFnCache;
22
29
  private getRecords;
@@ -29,6 +36,7 @@ export declare class ValueFilter {
29
36
  applyFilter(fieldId?: string | number): void;
30
37
  clearFilter(fieldId: string | number): void;
31
38
  render(container: HTMLElement): void;
39
+ updateStyles(styles: FilterStyles): void;
32
40
  private renderFilterOptions;
33
41
  private bindEventForFilterByValue;
34
42
  show(): void;
@@ -1,14 +1,15 @@
1
- import { arrayEqual } from "@visactor/vutils";
1
+ import { arrayEqual, isValid } from "@visactor/vutils";
2
2
 
3
3
  import { FilterActionType } from "./types";
4
4
 
5
- import { applyStyles, filterStyles } from "./styles";
5
+ import { applyStyles } from "./styles";
6
6
 
7
7
  export class ValueFilter {
8
- constructor(table, filterStateManager) {
8
+ constructor(table, filterStateManager, pluginOptions) {
9
9
  this.selectedKeys = new Map, this.candidateKeys = new Map, this.formatFnCache = new Map,
10
10
  this.toUnformattedCache = new Map, this.valueFilterOptionList = new Map, this.table = table,
11
- this.filterStateManager = filterStateManager;
11
+ this.filterStateManager = filterStateManager, this.pluginOptions = pluginOptions,
12
+ this.styles = pluginOptions.styles || {};
12
13
  }
13
14
  setSelectedField(fieldId) {
14
15
  this.selectedField = fieldId;
@@ -30,34 +31,47 @@ export class ValueFilter {
30
31
  return records.reverse();
31
32
  }
32
33
  collectCandidateKeysForUnfilteredColumn(fieldId) {
33
- const countMap = new Map, records = this.getRecords(this.table, !1), formatFn = this.getFormatFnCache(fieldId), toUnformatted = new Map;
34
+ var _a, _b;
35
+ const syncFilterItemsState = null === (_b = null === (_a = this.pluginOptions) || void 0 === _a ? void 0 : _a.syncFilterItemsState) || void 0 === _b || _b, countMap = new Map;
36
+ let records = [];
37
+ records = syncFilterItemsState ? this.getRecords(this.table, !1) : this.table.internalProps.records;
38
+ const formatFn = this.getFormatFnCache(fieldId), toUnformatted = new Map;
34
39
  records.forEach((record => {
35
- const originalValue = record[fieldId], formattedValue = formatFn(record);
36
- if (null != formattedValue) {
37
- countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1);
38
- const unformattedSet = toUnformatted.get(formattedValue);
39
- null != unformattedSet ? unformattedSet.add(originalValue) : toUnformatted.set(formattedValue, new Set([ originalValue ]));
40
+ if (isValid(record)) {
41
+ const originalValue = record[fieldId], formattedValue = formatFn(record);
42
+ if (null != formattedValue) {
43
+ countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1);
44
+ const unformattedSet = toUnformatted.get(formattedValue);
45
+ null != unformattedSet ? unformattedSet.add(originalValue) : toUnformatted.set(formattedValue, new Set([ originalValue ]));
46
+ }
40
47
  }
41
48
  })), this.candidateKeys.set(fieldId, countMap), this.toUnformattedCache.set(fieldId, toUnformatted);
42
49
  }
43
50
  collectCandidateKeysForFilteredColumn(candidateField) {
44
- const filteredFields = this.filterStateManager.getActiveFilterFields().filter((field => field !== candidateField)), toUnformatted = new Map, formatFn = this.getFormatFnCache(candidateField), countMap = new Map;
45
- this.getRecords(this.table, !0).filter((record => filteredFields.every((field => {
46
- var _a;
47
- const filterType = null === (_a = this.filterStateManager.getFilterState(field)) || void 0 === _a ? void 0 : _a.type;
48
- "byValue" !== filterType && null != filterType && this.syncSingleStateFromTableData(field);
49
- return this.selectedKeys.get(field).has(record[field]);
50
- })))).forEach((record => {
51
- const originalValue = record[candidateField], formattedValue = formatFn(record);
52
- if (countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1), null != formattedValue) {
53
- const unformattedSet = toUnformatted.get(formattedValue);
54
- null != unformattedSet ? unformattedSet.add(originalValue) : toUnformatted.set(formattedValue, new Set([ originalValue ]));
51
+ var _a, _b;
52
+ const syncFilterItemsState = null === (_b = null === (_a = this.pluginOptions) || void 0 === _a ? void 0 : _a.syncFilterItemsState) || void 0 === _b || _b, filteredFields = this.filterStateManager.getActiveFilterFields().filter((field => field !== candidateField)), toUnformatted = new Map, formatFn = this.getFormatFnCache(candidateField), countMap = new Map;
53
+ let records = [];
54
+ if (syncFilterItemsState) {
55
+ this.getRecords(this.table, !0).filter((record => filteredFields.every((field => {
56
+ var _a;
57
+ const filterType = null === (_a = this.filterStateManager.getFilterState(field)) || void 0 === _a ? void 0 : _a.type;
58
+ "byValue" !== filterType && null != filterType && this.syncSingleStateFromTableData(field);
59
+ return this.selectedKeys.get(field).has(record[field]);
60
+ }))));
61
+ } else records = this.table.internalProps.records;
62
+ records.forEach((record => {
63
+ if (isValid(record)) {
64
+ const originalValue = record[candidateField], formattedValue = formatFn(record);
65
+ if (countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1), null != formattedValue) {
66
+ const unformattedSet = toUnformatted.get(formattedValue);
67
+ null != unformattedSet ? unformattedSet.add(originalValue) : toUnformatted.set(formattedValue, new Set([ originalValue ]));
68
+ }
55
69
  }
56
70
  })), this.candidateKeys.set(candidateField, countMap), this.toUnformattedCache.set(candidateField, toUnformatted);
57
71
  }
58
72
  toggleSelectAll(fieldId, selected) {
59
73
  this.valueFilterOptionList.get(fieldId).forEach((option => {
60
- option.checkbox.checked = selected;
74
+ "none" !== option.itemContainer.style.display && (option.checkbox.checked = selected);
61
75
  }));
62
76
  }
63
77
  syncSelectAllCheckbox(fieldId) {
@@ -72,39 +86,71 @@ export class ValueFilter {
72
86
  }
73
87
  }
74
88
  syncSingleStateFromTableData(fieldId) {
89
+ var _a, _b, _c;
75
90
  const selectedValues = new Set, originalValues = new Set;
76
- this.table.internalProps.dataSource.records.forEach((record => {
77
- selectedValues.add(record[fieldId]);
78
- }));
79
91
  this.table.internalProps.records.forEach((record => {
80
- originalValues.add(record[fieldId]);
92
+ isValid(record) && originalValues.add(record[fieldId]);
81
93
  }));
82
- !arrayEqual(Array.from(originalValues), Array.from(selectedValues)) && (this.selectedKeys.set(fieldId, selectedValues),
83
- this.filterStateManager.dispatch({
84
- type: FilterActionType.UPDATE_FILTER,
85
- payload: {
86
- field: fieldId,
87
- values: Array.from(selectedValues),
88
- enable: !0
94
+ const syncFilterItemsState = null === (_b = null === (_a = this.pluginOptions) || void 0 === _a ? void 0 : _a.syncFilterItemsState) || void 0 === _b || _b, hasFiltered = !arrayEqual(Array.from(originalValues), Array.from(selectedValues));
95
+ if (syncFilterItemsState) {
96
+ if (hasFiltered) {
97
+ this.selectedKeys.set(fieldId, selectedValues), this.filterStateManager.dispatch({
98
+ type: FilterActionType.UPDATE_FILTER,
99
+ payload: {
100
+ field: fieldId,
101
+ values: Array.from(selectedValues),
102
+ enable: !0
103
+ }
104
+ });
105
+ !arrayEqual(Array.from(originalValues), Array.from(selectedValues)) && (this.selectedKeys.set(fieldId, selectedValues),
106
+ this.filterStateManager.dispatch({
107
+ type: FilterActionType.ADD_FILTER,
108
+ payload: {
109
+ field: fieldId,
110
+ type: "byValue",
111
+ values: Array.from(selectedValues),
112
+ enable: !0
113
+ }
114
+ }));
89
115
  }
90
- }));
116
+ } else {
117
+ const selectedRules = null === (_c = this.filterStateManager.getFilterState(fieldId)) || void 0 === _c ? void 0 : _c.values;
118
+ if (selectedRules) {
119
+ !arrayEqual(Array.from(originalValues), selectedRules) && (this.selectedKeys.set(fieldId, new Set(selectedRules)),
120
+ this.filterStateManager.dispatch({
121
+ type: FilterActionType.ADD_FILTER,
122
+ payload: {
123
+ field: fieldId,
124
+ type: "byValue",
125
+ values: selectedRules,
126
+ enable: !0,
127
+ shouldKeepUnrelatedState: !0
128
+ }
129
+ }));
130
+ } else this.selectedKeys.set(fieldId, originalValues);
131
+ }
91
132
  }
92
133
  applyFilter(fieldId = this.selectedField) {
134
+ var _a, _b;
93
135
  const options = this.valueFilterOptionList.get(fieldId);
94
136
  if (!options || 0 === options.length) return;
95
137
  const selections = options.map((option => option.checkbox.checked ? option.originalValue : null)).filter((key => null !== key)).flat();
96
- this.selectedKeys.set(fieldId, new Set(selections)), selections.length > 0 && selections.length < this.valueFilterOptionList.get(fieldId).length ? this.filterStateManager.dispatch({
138
+ this.selectedKeys.set(fieldId, new Set(selections));
139
+ const syncFilterItemsState = null === (_b = null === (_a = this.pluginOptions) || void 0 === _a ? void 0 : _a.syncFilterItemsState) || void 0 === _b || _b;
140
+ selections.length >= 0 && selections.length < this.valueFilterOptionList.get(fieldId).length || !syncFilterItemsState ? this.filterStateManager.dispatch({
97
141
  type: FilterActionType.APPLY_FILTERS,
98
142
  payload: {
99
143
  field: fieldId,
100
144
  type: "byValue",
101
145
  values: selections,
102
- enable: !0
146
+ enable: !0,
147
+ shouldKeepUnrelatedState: !syncFilterItemsState
103
148
  }
104
149
  }) : this.filterStateManager.dispatch({
105
150
  type: FilterActionType.REMOVE_FILTER,
106
151
  payload: {
107
- field: fieldId
152
+ field: fieldId,
153
+ type: "byValue"
108
154
  }
109
155
  });
110
156
  }
@@ -117,26 +163,36 @@ export class ValueFilter {
117
163
  }), this.hide();
118
164
  }
119
165
  render(container) {
120
- this.filterByValuePanel = document.createElement("div"), applyStyles(this.filterByValuePanel, filterStyles.filterPanel);
121
- const searchContainer = document.createElement("div");
122
- applyStyles(searchContainer, filterStyles.searchContainer), this.filterByValueSearchInput = document.createElement("input"),
123
- this.filterByValueSearchInput.type = "text", this.filterByValueSearchInput.placeholder = "可使用空格分隔多个关键词",
124
- applyStyles(this.filterByValueSearchInput, filterStyles.searchInput), searchContainer.appendChild(this.filterByValueSearchInput);
125
- const optionsContainer = document.createElement("div");
126
- applyStyles(optionsContainer, filterStyles.optionsContainer);
127
- const selectAllItemDiv = document.createElement("div");
128
- applyStyles(selectAllItemDiv, filterStyles.optionItem);
129
- const selectAllLabel = document.createElement("label");
130
- applyStyles(selectAllLabel, filterStyles.optionLabel), this.selectAllCheckbox = document.createElement("input"),
131
- this.selectAllCheckbox.type = "checkbox", this.selectAllCheckbox.checked = !0, applyStyles(this.selectAllCheckbox, filterStyles.checkbox),
166
+ var _a;
167
+ const filterStyles = this.styles;
168
+ this.filterByValuePanel = document.createElement("div"), applyStyles(this.filterByValuePanel, filterStyles.filterPanel),
169
+ this.searchContainer = document.createElement("div"), applyStyles(this.searchContainer, this.styles.searchContainer),
170
+ this.filterByValueSearchInput = document.createElement("input"), this.filterByValueSearchInput.type = "text",
171
+ this.filterByValueSearchInput.placeholder = (null === (_a = filterStyles.searchInput) || void 0 === _a ? void 0 : _a.placeholder) || "可使用空格分隔多个关键词",
172
+ applyStyles(this.filterByValueSearchInput, filterStyles.searchInput), this.searchContainer.appendChild(this.filterByValueSearchInput),
173
+ this.optionsContainer = document.createElement("div"), applyStyles(this.optionsContainer, this.styles.optionsContainer),
174
+ this.selectAllItemDiv = document.createElement("div"), applyStyles(this.selectAllItemDiv, this.styles.optionItem),
175
+ this.selectAllLabel = document.createElement("label"), applyStyles(this.selectAllLabel, this.styles.optionLabel),
176
+ this.selectAllCheckbox = document.createElement("input"), this.selectAllCheckbox.type = "checkbox",
177
+ this.selectAllCheckbox.checked = !0, applyStyles(this.selectAllCheckbox, filterStyles.checkbox),
132
178
  this.totalCountSpan = document.createElement("span"), this.totalCountSpan.textContent = "",
133
- applyStyles(this.totalCountSpan, filterStyles.countSpan), selectAllLabel.append(this.selectAllCheckbox, " 全选"),
134
- selectAllItemDiv.append(selectAllLabel, this.totalCountSpan), this.filterItemsContainer = document.createElement("div"),
135
- optionsContainer.append(selectAllItemDiv, this.filterItemsContainer), this.filterByValuePanel.append(searchContainer, optionsContainer),
136
- container.appendChild(this.filterByValuePanel), this.bindEventForFilterByValue();
179
+ applyStyles(this.totalCountSpan, filterStyles.countSpan), this.selectAllLabel.append(this.selectAllCheckbox, " 全选"),
180
+ this.selectAllItemDiv.appendChild(this.selectAllLabel), this.filterItemsContainer = document.createElement("div"),
181
+ this.optionsContainer.append(this.selectAllItemDiv, this.filterItemsContainer),
182
+ this.filterByValuePanel.append(this.searchContainer, this.optionsContainer), container.appendChild(this.filterByValuePanel),
183
+ this.bindEventForFilterByValue();
184
+ }
185
+ updateStyles(styles) {
186
+ var _a;
187
+ applyStyles(this.filterByValuePanel, styles.filterPanel), applyStyles(this.searchContainer, styles.searchContainer),
188
+ this.filterByValueSearchInput.placeholder = (null === (_a = styles.searchInput) || void 0 === _a ? void 0 : _a.placeholder) || "可使用空格分隔多个关键词",
189
+ applyStyles(this.filterByValueSearchInput, styles.searchInput), applyStyles(this.optionsContainer, styles.optionsContainer),
190
+ applyStyles(this.selectAllItemDiv, styles.optionItem), applyStyles(this.selectAllLabel, styles.optionLabel),
191
+ applyStyles(this.selectAllCheckbox, styles.checkbox);
137
192
  }
138
193
  renderFilterOptions(field) {
139
194
  var _a, _b, _c;
195
+ const filterStyles = this.styles;
140
196
  this.filterItemsContainer.innerHTML = "", this.valueFilterOptionList.delete(field),
141
197
  this.valueFilterOptionList.set(field, []);
142
198
  let totalCount = 0, allChecked = !0, noneChecked = !0;
@@ -144,6 +200,7 @@ export class ValueFilter {
144
200
  if (!candidates || 0 === candidates.size) return;
145
201
  const candidatesArr = [ ...candidates.entries() ], sortedCandidatesArr = "number" == typeof candidatesArr[0][0] ? null === (_b = [ ...candidatesArr ]) || void 0 === _b ? void 0 : _b.sort((([a], [b]) => Number(a) - Number(b))) : null === (_c = [ ...candidatesArr ]) || void 0 === _c ? void 0 : _c.sort((([a], [b]) => String(a).localeCompare(String(b))));
146
202
  null == sortedCandidatesArr || sortedCandidatesArr.forEach((([val, count]) => {
203
+ var _a, _b;
147
204
  totalCount += count;
148
205
  const unformattedArr = Array.from(toUnformatted.get(val) || new Set), itemDiv = document.createElement("div");
149
206
  applyStyles(itemDiv, filterStyles.optionItem), itemDiv.style.display = "flex";
@@ -154,7 +211,8 @@ export class ValueFilter {
154
211
  applyStyles(checkbox, filterStyles.checkbox), checkbox.checked ? noneChecked = !1 : allChecked = !1;
155
212
  const countSpan = document.createElement("span");
156
213
  countSpan.textContent = String(count), applyStyles(countSpan, filterStyles.countSpan),
157
- label.append(checkbox, ` ${val}`), itemDiv.append(label, countSpan), this.filterItemsContainer.appendChild(itemDiv);
214
+ label.append(checkbox, ` ${(null === (_b = (_a = this.pluginOptions).checkboxItemFormat) || void 0 === _b ? void 0 : _b.call(_a, val, unformattedArr)) || val}`),
215
+ itemDiv.append(label, countSpan), this.filterItemsContainer.appendChild(itemDiv);
158
216
  const itemDom = {
159
217
  id: String(val),
160
218
  originalValue: unformattedArr,