@visactor/vtable-plugins 1.22.7-alpha.5 → 1.22.7-alpha.7

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/contextmenu/index.js +2 -1
  2. package/cjs/fillHandleUtils/translateRowObj.js +1 -2
  3. package/cjs/filter/condition-filter.d.ts +12 -2
  4. package/cjs/filter/condition-filter.js +42 -147
  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 +5 -3
  11. package/cjs/filter/filter-engine.js.map +1 -1
  12. package/cjs/filter/filter-toolbar.d.ts +9 -4
  13. package/cjs/filter/filter-toolbar.js +52 -30
  14. package/cjs/filter/filter-toolbar.js.map +1 -1
  15. package/cjs/filter/filter.d.ts +2 -0
  16. package/cjs/filter/filter.js +28 -14
  17. package/cjs/filter/filter.js.map +1 -1
  18. package/cjs/filter/styles.js +1 -1
  19. package/cjs/filter/styles.js.map +1 -1
  20. package/cjs/filter/types.d.ts +35 -0
  21. package/cjs/filter/types.js.map +1 -1
  22. package/cjs/filter/value-filter.d.ts +12 -2
  23. package/cjs/filter/value-filter.js +106 -46
  24. package/cjs/filter/value-filter.js.map +1 -1
  25. package/cjs/focus-highlight.js +1 -1
  26. package/cjs/focus-highlight.js.map +1 -1
  27. package/cjs/master-detail-plugin/checkbox.js +0 -1
  28. package/cjs/master-detail-plugin/config.js +2 -1
  29. package/cjs/master-detail-plugin/utils.js +1 -1
  30. package/dist/vtable-plugins.js +9799 -148
  31. package/dist/vtable-plugins.min.js +3 -3
  32. package/es/contextmenu/index.js +2 -1
  33. package/es/fillHandleUtils/translateRowObj.js +1 -2
  34. package/es/filter/condition-filter.d.ts +12 -2
  35. package/es/filter/condition-filter.js +40 -143
  36. package/es/filter/condition-filter.js.map +1 -1
  37. package/es/filter/constant.d.ts +7 -0
  38. package/es/filter/constant.js +120 -0
  39. package/es/filter/constant.js.map +1 -0
  40. package/es/filter/filter-engine.d.ts +3 -1
  41. package/es/filter/filter-engine.js +5 -3
  42. package/es/filter/filter-engine.js.map +1 -1
  43. package/es/filter/filter-toolbar.d.ts +9 -4
  44. package/es/filter/filter-toolbar.js +52 -27
  45. package/es/filter/filter-toolbar.js.map +1 -1
  46. package/es/filter/filter.d.ts +2 -0
  47. package/es/filter/filter.js +35 -15
  48. package/es/filter/filter.js.map +1 -1
  49. package/es/filter/styles.js +1 -1
  50. package/es/filter/styles.js.map +1 -1
  51. package/es/filter/types.d.ts +35 -0
  52. package/es/filter/types.js.map +1 -1
  53. package/es/filter/value-filter.d.ts +12 -2
  54. package/es/filter/value-filter.js +104 -43
  55. package/es/filter/value-filter.js.map +1 -1
  56. package/es/focus-highlight.js +1 -1
  57. package/es/focus-highlight.js.map +1 -1
  58. package/es/master-detail-plugin/checkbox.js +1 -2
  59. package/es/master-detail-plugin/config.js +2 -1
  60. package/es/master-detail-plugin/utils.js +1 -1
  61. package/package.json +8 -8
@@ -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[]) => any[];\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,16 +13,22 @@ 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 collectCandidateKeysForUnfilteredColumn;
30
+ syncRulesAndCandidateKeys(): void;
31
+ syncSelectedKeys(): void;
23
32
  private collectCandidateKeysForFilteredColumn;
24
33
  private toggleSelectAll;
25
34
  private syncSelectAllCheckbox;
@@ -28,6 +37,7 @@ export declare class ValueFilter {
28
37
  applyFilter(fieldId?: string | number): void;
29
38
  clearFilter(fieldId: string | number): void;
30
39
  render(container: HTMLElement): void;
40
+ updateStyles(styles: FilterStyles): void;
31
41
  private renderFilterOptions;
32
42
  private bindEventForFilterByValue;
33
43
  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;
@@ -21,23 +22,63 @@ export class ValueFilter {
21
22
  this.formatFnCache.set(fieldId, formatFn), formatFn;
22
23
  }
23
24
  collectCandidateKeysForUnfilteredColumn(fieldId) {
24
- const countMap = new Map, records = this.table.internalProps.dataSource.records, formatFn = this.getFormatFnCache(fieldId), toUnformatted = new Map;
25
+ var _a, _b;
26
+ const syncFilterItemsState = null === (_b = null === (_a = this.pluginOptions) || void 0 === _a ? void 0 : _a.syncFilterItemsState) || void 0 === _b || _b, countMap = new Map;
27
+ let records = [];
28
+ records = syncFilterItemsState ? this.table.internalProps.dataSource.records : this.table.internalProps.records;
29
+ const formatFn = this.getFormatFnCache(fieldId), toUnformatted = new Map;
25
30
  records.forEach((record => {
26
- const originalValue = record[fieldId], formattedValue = formatFn(record);
27
- if (null != formattedValue) {
28
- countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1);
29
- const unformattedSet = toUnformatted.get(formattedValue);
30
- null != unformattedSet ? unformattedSet.add(originalValue) : toUnformatted.set(formattedValue, new Set([ originalValue ]));
31
+ if (isValid(record)) {
32
+ const originalValue = record[fieldId], formattedValue = formatFn(record);
33
+ if (null != formattedValue) {
34
+ countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1);
35
+ const unformattedSet = toUnformatted.get(formattedValue);
36
+ null != unformattedSet ? unformattedSet.add(originalValue) : toUnformatted.set(formattedValue, new Set([ originalValue ]));
37
+ }
31
38
  }
32
39
  })), this.candidateKeys.set(fieldId, countMap), this.toUnformattedCache.set(fieldId, toUnformatted);
33
40
  }
41
+ syncRulesAndCandidateKeys() {
42
+ const currentRecords = this.table.internalProps.dataSource.records, filteredFields = this.filterStateManager.getActiveFilterFields();
43
+ currentRecords.forEach((record => {
44
+ filteredFields.forEach((candidateField => {
45
+ var _a, _b;
46
+ const formatFn = this.getFormatFnCache(candidateField);
47
+ if (isValid(record)) {
48
+ const originalValue = record[candidateField], formattedValue = formatFn(record);
49
+ !(this.toUnformattedCache.get(candidateField) || new Map).has(formattedValue) && (null === (_b = null === (_a = this.filterStateManager.getFilterState(candidateField)) || void 0 === _a ? void 0 : _a.values) || void 0 === _b ? void 0 : _b.length) > 0 && (this.filterStateManager.getFilterState(candidateField).values.push(originalValue),
50
+ this.selectedKeys.get(candidateField).add(originalValue));
51
+ }
52
+ }));
53
+ }));
54
+ }
55
+ syncSelectedKeys() {
56
+ const currentRecords = this.table.internalProps.dataSource.records, filteredFields = this.filterStateManager.getActiveFilterFields();
57
+ currentRecords.forEach((record => {
58
+ filteredFields.forEach((candidateField => {
59
+ var _a;
60
+ if (isValid(record)) {
61
+ const originalValue = record[candidateField];
62
+ "byCondition" === (null === (_a = this.filterStateManager.getFilterState(candidateField)) || void 0 === _a ? void 0 : _a.type) && (this.selectedKeys.get(candidateField) || this.selectedKeys.set(candidateField, new Set),
63
+ this.selectedKeys.get(candidateField).add(originalValue));
64
+ }
65
+ }));
66
+ }));
67
+ }
34
68
  collectCandidateKeysForFilteredColumn(candidateField) {
35
- const filteredFields = this.filterStateManager.getActiveFilterFields().filter((field => field !== candidateField)), toUnformatted = new Map, formatFn = this.getFormatFnCache(candidateField), countMap = new Map;
36
- this.table.internalProps.records.filter((record => filteredFields.every((field => this.selectedKeys.get(field).has(record[field]))))).forEach((record => {
37
- const originalValue = record[candidateField], formattedValue = formatFn(record);
38
- if (countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1), null != formattedValue) {
39
- const unformattedSet = toUnformatted.get(formattedValue);
40
- null != unformattedSet ? unformattedSet.add(originalValue) : toUnformatted.set(formattedValue, new Set([ originalValue ]));
69
+ var _a, _b;
70
+ 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;
71
+ let records = [];
72
+ if (syncFilterItemsState) {
73
+ records = this.table.internalProps.records.filter((record => filteredFields.every((field => this.selectedKeys.get(field).has(record[field])))));
74
+ } else records = this.table.internalProps.records;
75
+ records.forEach((record => {
76
+ if (isValid(record)) {
77
+ const originalValue = record[candidateField], formattedValue = formatFn(record);
78
+ if (countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1), null != formattedValue) {
79
+ const unformattedSet = toUnformatted.get(formattedValue);
80
+ null != unformattedSet ? unformattedSet.add(originalValue) : toUnformatted.set(formattedValue, new Set([ originalValue ]));
81
+ }
41
82
  }
42
83
  })), this.candidateKeys.set(candidateField, countMap), this.toUnformattedCache.set(candidateField, toUnformatted);
43
84
  }
@@ -58,16 +99,24 @@ export class ValueFilter {
58
99
  }
59
100
  }
60
101
  initFilterStateFromTableData(fieldId) {
61
- if (this.filterStateManager.getActiveFilterFields()) return;
62
- const selectedValues = new Set, originalValues = new Set;
63
- this.table.internalProps.dataSource.records.forEach((record => {
64
- selectedValues.add(record[fieldId]);
65
- }));
102
+ var _a, _b, _c, _d;
103
+ const isHasFilteredState = this.filterStateManager.getActiveFilterFields(), isValueFilter = "byValue" === (null === (_a = this.filterStateManager.getFilterState(fieldId)) || void 0 === _a ? void 0 : _a.type);
104
+ if (isHasFilteredState && isValueFilter) return;
105
+ let selectedValues = new Set;
106
+ const originalValues = new Set;
66
107
  this.table.internalProps.records.forEach((record => {
67
- originalValues.add(record[fieldId]);
108
+ isValid(record) && originalValues.add(record[fieldId]);
68
109
  }));
69
- !arrayEqual(Array.from(originalValues), Array.from(selectedValues)) && (this.selectedKeys.set(fieldId, selectedValues),
70
- this.filterStateManager.dispatch({
110
+ if (null === (_c = null === (_b = this.pluginOptions) || void 0 === _b ? void 0 : _b.syncFilterItemsState) || void 0 === _c || _c) {
111
+ this.table.internalProps.dataSource.records.forEach((record => {
112
+ isValid(record) && selectedValues.add(record[fieldId]);
113
+ }));
114
+ } else {
115
+ const selectedFromRules = (null === (_d = this.filterStateManager.getFilterState(fieldId)) || void 0 === _d ? void 0 : _d.values) || originalValues;
116
+ selectedValues = new Set(selectedFromRules);
117
+ }
118
+ this.selectedKeys.set(fieldId, selectedValues);
119
+ !arrayEqual(Array.from(originalValues), Array.from(selectedValues)) && this.filterStateManager.dispatch({
71
120
  type: FilterActionType.ADD_FILTER,
72
121
  payload: {
73
122
  field: fieldId,
@@ -75,13 +124,13 @@ export class ValueFilter {
75
124
  values: Array.from(selectedValues),
76
125
  enable: !0
77
126
  }
78
- }));
127
+ });
79
128
  }
80
129
  applyFilter(fieldId = this.selectedField) {
81
130
  const options = this.valueFilterOptionList.get(fieldId);
82
131
  if (!options || 0 === options.length) return;
83
132
  const selections = options.map((option => option.checkbox.checked ? option.originalValue : null)).filter((key => null !== key)).flat();
84
- this.selectedKeys.set(fieldId, new Set(selections)), selections.length > 0 && selections.length < this.valueFilterOptionList.get(fieldId).length ? this.filterStateManager.dispatch({
133
+ this.selectedKeys.set(fieldId, new Set(selections)), selections.length >= 0 && selections.length < this.valueFilterOptionList.get(fieldId).length ? this.filterStateManager.dispatch({
85
134
  type: FilterActionType.APPLY_FILTERS,
86
135
  payload: {
87
136
  field: fieldId,
@@ -105,26 +154,36 @@ export class ValueFilter {
105
154
  }), this.hide();
106
155
  }
107
156
  render(container) {
108
- this.filterByValuePanel = document.createElement("div"), applyStyles(this.filterByValuePanel, filterStyles.filterPanel);
109
- const searchContainer = document.createElement("div");
110
- applyStyles(searchContainer, filterStyles.searchContainer), this.filterByValueSearchInput = document.createElement("input"),
111
- this.filterByValueSearchInput.type = "text", this.filterByValueSearchInput.placeholder = "可使用空格分隔多个关键词",
112
- applyStyles(this.filterByValueSearchInput, filterStyles.searchInput), searchContainer.appendChild(this.filterByValueSearchInput);
113
- const optionsContainer = document.createElement("div");
114
- applyStyles(optionsContainer, filterStyles.optionsContainer);
115
- const selectAllItemDiv = document.createElement("div");
116
- applyStyles(selectAllItemDiv, filterStyles.optionItem);
117
- const selectAllLabel = document.createElement("label");
118
- applyStyles(selectAllLabel, filterStyles.optionLabel), this.selectAllCheckbox = document.createElement("input"),
119
- this.selectAllCheckbox.type = "checkbox", this.selectAllCheckbox.checked = !0, applyStyles(this.selectAllCheckbox, filterStyles.checkbox),
157
+ var _a;
158
+ const filterStyles = this.styles;
159
+ this.filterByValuePanel = document.createElement("div"), applyStyles(this.filterByValuePanel, filterStyles.filterPanel),
160
+ this.searchContainer = document.createElement("div"), applyStyles(this.searchContainer, this.styles.searchContainer),
161
+ this.filterByValueSearchInput = document.createElement("input"), this.filterByValueSearchInput.type = "text",
162
+ this.filterByValueSearchInput.placeholder = (null === (_a = filterStyles.searchInput) || void 0 === _a ? void 0 : _a.placeholder) || "可使用空格分隔多个关键词",
163
+ applyStyles(this.filterByValueSearchInput, filterStyles.searchInput), this.searchContainer.appendChild(this.filterByValueSearchInput),
164
+ this.optionsContainer = document.createElement("div"), applyStyles(this.optionsContainer, this.styles.optionsContainer),
165
+ this.selectAllItemDiv = document.createElement("div"), applyStyles(this.selectAllItemDiv, this.styles.optionItem),
166
+ this.selectAllLabel = document.createElement("label"), applyStyles(this.selectAllLabel, this.styles.optionLabel),
167
+ this.selectAllCheckbox = document.createElement("input"), this.selectAllCheckbox.type = "checkbox",
168
+ this.selectAllCheckbox.checked = !0, applyStyles(this.selectAllCheckbox, filterStyles.checkbox),
120
169
  this.totalCountSpan = document.createElement("span"), this.totalCountSpan.textContent = "",
121
- applyStyles(this.totalCountSpan, filterStyles.countSpan), selectAllLabel.append(this.selectAllCheckbox, " 全选"),
122
- selectAllItemDiv.append(selectAllLabel, this.totalCountSpan), this.filterItemsContainer = document.createElement("div"),
123
- optionsContainer.append(selectAllItemDiv, this.filterItemsContainer), this.filterByValuePanel.append(searchContainer, optionsContainer),
124
- container.appendChild(this.filterByValuePanel), this.bindEventForFilterByValue();
170
+ applyStyles(this.totalCountSpan, filterStyles.countSpan), this.selectAllLabel.append(this.selectAllCheckbox, " 全选"),
171
+ this.selectAllItemDiv.appendChild(this.selectAllLabel), this.filterItemsContainer = document.createElement("div"),
172
+ this.optionsContainer.append(this.selectAllItemDiv, this.filterItemsContainer),
173
+ this.filterByValuePanel.append(this.searchContainer, this.optionsContainer), container.appendChild(this.filterByValuePanel),
174
+ this.bindEventForFilterByValue();
175
+ }
176
+ updateStyles(styles) {
177
+ var _a;
178
+ applyStyles(this.filterByValuePanel, styles.filterPanel), applyStyles(this.searchContainer, styles.searchContainer),
179
+ this.filterByValueSearchInput.placeholder = (null === (_a = styles.searchInput) || void 0 === _a ? void 0 : _a.placeholder) || "可使用空格分隔多个关键词",
180
+ applyStyles(this.filterByValueSearchInput, styles.searchInput), applyStyles(this.optionsContainer, styles.optionsContainer),
181
+ applyStyles(this.selectAllItemDiv, styles.optionItem), applyStyles(this.selectAllLabel, styles.optionLabel),
182
+ applyStyles(this.selectAllCheckbox, styles.checkbox);
125
183
  }
126
184
  renderFilterOptions(field) {
127
185
  var _a, _b, _c;
186
+ const filterStyles = this.styles;
128
187
  this.filterItemsContainer.innerHTML = "", this.valueFilterOptionList.delete(field),
129
188
  this.valueFilterOptionList.set(field, []);
130
189
  let totalCount = 0, allChecked = !0, noneChecked = !0;
@@ -132,6 +191,7 @@ export class ValueFilter {
132
191
  if (!candidates || 0 === candidates.size) return;
133
192
  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))));
134
193
  null == sortedCandidatesArr || sortedCandidatesArr.forEach((([val, count]) => {
194
+ var _a, _b;
135
195
  totalCount += count;
136
196
  const unformattedArr = Array.from(toUnformatted.get(val) || new Set), itemDiv = document.createElement("div");
137
197
  applyStyles(itemDiv, filterStyles.optionItem), itemDiv.style.display = "flex";
@@ -142,7 +202,8 @@ export class ValueFilter {
142
202
  applyStyles(checkbox, filterStyles.checkbox), checkbox.checked ? noneChecked = !1 : allChecked = !1;
143
203
  const countSpan = document.createElement("span");
144
204
  countSpan.textContent = String(count), applyStyles(countSpan, filterStyles.countSpan),
145
- label.append(checkbox, ` ${val}`), itemDiv.append(label, countSpan), this.filterItemsContainer.appendChild(itemDiv);
205
+ label.append(checkbox, ` ${(null === (_b = (_a = this.pluginOptions).checkboxItemFormat) || void 0 === _b ? void 0 : _b.call(_a, val, unformattedArr)) || val}`),
206
+ itemDiv.append(label, countSpan), this.filterItemsContainer.appendChild(itemDiv);
146
207
  const itemDom = {
147
208
  id: String(val),
148
209
  originalValue: unformattedArr,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/filter/value-filter.ts"],"names":[],"mappings":"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","file":"value-filter.js","sourcesContent":["import { ListTable, PivotTable } from '@visactor/vtable';\nimport { arrayEqual } from '@visactor/vutils';\nimport type { FilterConfig, ValueFilterOptionDom, FilterState } from './types';\nimport { FilterActionType } from './types';\nimport type { FilterStateManager } from './filter-state-manager';\nimport { applyStyles, filterStyles } from './styles';\n\nexport class ValueFilter {\n private table: ListTable | PivotTable;\n private filterStateManager: FilterStateManager;\n private selectedField: string | number;\n private selectedKeys = new Map<string | number, Set<string | number>>(); // 存储 format 之前的原始数据\n private candidateKeys = new Map<string | number, Map<string | number, number>>(); // 存储 format 后的数据\n private formatFnCache = new Map<string | number, (record: any) => string | number>();\n private toUnformattedCache = new Map<string | number, Map<any, Set<any>>>();\n\n private valueFilterOptionList: Map<string | number, ValueFilterOptionDom[]> = new Map();\n private filterByValuePanel: HTMLElement;\n private filterByValueSearchInput: HTMLInputElement;\n private selectAllCheckbox: HTMLInputElement;\n private totalCountSpan: HTMLSpanElement;\n private filterItemsContainer: HTMLElement;\n\n private _onInputKeyUpHandler: (event: KeyboardEvent) => void;\n private _onCheckboxChangeHandler: (event: Event) => void;\n\n constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n }\n\n setSelectedField(fieldId: string | number): void {\n this.selectedField = fieldId;\n }\n\n private getFormatFnCache(fieldId: string | number) {\n let formatFn = this.formatFnCache.get(fieldId);\n if (formatFn !== null && formatFn !== undefined) {\n return formatFn;\n }\n\n const headerAddress = this.table.internalProps.layoutMap.getHeaderCellAddressByField(String(fieldId));\n const bodyInfo = this.table.internalProps.layoutMap.getBody(headerAddress?.col, headerAddress?.row);\n if (bodyInfo && 'fieldFormat' in bodyInfo && typeof bodyInfo.fieldFormat === 'function') {\n formatFn = bodyInfo.fieldFormat;\n } else if (bodyInfo && 'format' in bodyInfo && typeof bodyInfo.format === 'function') {\n formatFn = bodyInfo.format;\n } else {\n formatFn = (record: any) => record[fieldId];\n }\n\n this.formatFnCache.set(fieldId, formatFn);\n return formatFn;\n }\n\n /**\n * 为未应用筛选的列,收集候选值集合\n */\n private collectCandidateKeysForUnfilteredColumn(fieldId: string | number): void {\n const countMap = new Map<any, number>(); // 计算每个候选值的计数\n const records = this.table.internalProps.dataSource.records; // 未筛选:使用当前表格数据\n const formatFn = this.getFormatFnCache(fieldId);\n const toUnformatted = new Map();\n\n records.forEach(record => {\n const originalValue = record[fieldId];\n const formattedValue = formatFn(record);\n if (formattedValue !== undefined && formattedValue !== null) {\n countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1);\n\n const unformattedSet = toUnformatted.get(formattedValue);\n if (unformattedSet !== undefined && unformattedSet !== null) {\n unformattedSet.add(originalValue);\n } else {\n toUnformatted.set(formattedValue, new Set([originalValue]));\n }\n }\n });\n\n this.candidateKeys.set(fieldId, countMap);\n this.toUnformattedCache.set(fieldId, toUnformatted);\n }\n\n /**\n * 为已应用筛选的列,收集候选值集合\n */\n private collectCandidateKeysForFilteredColumn(candidateField: string | number): void {\n const filteredFields = this.filterStateManager.getActiveFilterFields().filter(field => field !== candidateField);\n const toUnformatted = new Map();\n const formatFn = this.getFormatFnCache(candidateField);\n\n const countMap = new Map<any, number>(); // 计算每个候选值的计数\n const recordsList = this.table.internalProps.records; // 已筛选:使用原始表格数据\n const records = recordsList.filter(record =>\n filteredFields.every(field => {\n const set = this.selectedKeys.get(field);\n return set.has(record[field]);\n })\n );\n\n records.forEach(record => {\n const originalValue = record[candidateField];\n const formattedValue = formatFn(record);\n countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1);\n if (formattedValue !== undefined && formattedValue !== null) {\n const unformattedSet = toUnformatted.get(formattedValue);\n if (unformattedSet !== undefined && unformattedSet !== null) {\n unformattedSet.add(originalValue);\n } else {\n toUnformatted.set(formattedValue, new Set([originalValue]));\n }\n }\n });\n\n this.candidateKeys.set(candidateField, countMap);\n this.toUnformattedCache.set(candidateField, toUnformatted);\n }\n\n private toggleSelectAll(fieldId: string | number, selected: boolean): void {\n const options = this.valueFilterOptionList.get(fieldId);\n options.forEach(option => {\n option.checkbox.checked = selected;\n });\n }\n\n private syncSelectAllCheckbox(fieldId: string | number): void {\n const options = this.valueFilterOptionList.get(fieldId) || [];\n const allChecked = options.every(o => o.checkbox.checked);\n const noneChecked = options.every(o => !o.checkbox.checked);\n\n this.selectAllCheckbox.checked = allChecked;\n this.selectAllCheckbox.indeterminate = !allChecked && !noneChecked;\n }\n\n private onSearch(fieldId: string | number, value: string): void {\n // 更新UI显示\n const items = this.valueFilterOptionList.get(fieldId);\n const filterKeywords = value\n .toUpperCase()\n .split(' ')\n .filter(s => s);\n\n for (const item of items) {\n const txtValue = item.id.toUpperCase() || '';\n const match = filterKeywords.some(keyword => txtValue.includes(keyword));\n const isVisible = filterKeywords.length === 0 || match;\n\n item.itemContainer.style.display = isVisible ? 'flex' : 'none';\n }\n }\n\n /**\n * 根据当前表格中的数据,更新 filter 的被选状态\n */\n private initFilterStateFromTableData(fieldId: string | number): void {\n const isHasFilteredState = this.filterStateManager.getActiveFilterFields();\n if (isHasFilteredState) {\n return;\n }\n\n const selectedValues = new Set<any>();\n const originalValues = new Set<any>();\n\n const currentRecords = this.table.internalProps.dataSource.records; // 当前数据\n currentRecords.forEach(record => {\n selectedValues.add(record[fieldId]);\n });\n\n const originalRecords = this.table.internalProps.records; // 原始数据\n originalRecords.forEach(record => {\n originalValues.add(record[fieldId]);\n });\n\n const hasFiltered = !arrayEqual(Array.from(originalValues), Array.from(selectedValues));\n if (hasFiltered) {\n this.selectedKeys.set(fieldId, selectedValues);\n\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: Array.from(selectedValues),\n enable: true\n }\n });\n }\n }\n\n applyFilter(fieldId: string | number = this.selectedField): void {\n const options = this.valueFilterOptionList.get(fieldId);\n if (!options || options.length === 0) {\n return;\n }\n\n const selections = options\n .map(option => {\n if (option.checkbox.checked) {\n return option.originalValue;\n }\n return null;\n })\n .filter(key => key !== null)\n .flat();\n\n this.selectedKeys.set(fieldId, new Set(selections));\n\n if (selections.length > 0 && selections.length < this.valueFilterOptionList.get(fieldId).length) {\n this.filterStateManager.dispatch({\n type: FilterActionType.APPLY_FILTERS,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: selections,\n enable: true\n }\n });\n } else {\n this.filterStateManager.dispatch({\n type: FilterActionType.REMOVE_FILTER,\n payload: {\n field: fieldId\n }\n });\n }\n }\n\n clearFilter(fieldId: string | number): void {\n this.filterStateManager.dispatch({\n type: FilterActionType.REMOVE_FILTER,\n payload: {\n field: fieldId\n }\n });\n\n this.hide();\n }\n\n render(container: HTMLElement): void {\n // === 按值筛选的菜单内容 ===\n this.filterByValuePanel = document.createElement('div');\n applyStyles(this.filterByValuePanel, filterStyles.filterPanel);\n\n // -- 搜索栏 ---\n const searchContainer = document.createElement('div');\n applyStyles(searchContainer, filterStyles.searchContainer);\n\n this.filterByValueSearchInput = document.createElement('input');\n this.filterByValueSearchInput.type = 'text';\n this.filterByValueSearchInput.placeholder = '可使用空格分隔多个关键词';\n applyStyles(this.filterByValueSearchInput, filterStyles.searchInput);\n\n searchContainer.appendChild(this.filterByValueSearchInput);\n\n // --- 筛选选项 ---\n const optionsContainer = document.createElement('div');\n applyStyles(optionsContainer, filterStyles.optionsContainer);\n\n const selectAllItemDiv = document.createElement('div');\n applyStyles(selectAllItemDiv, filterStyles.optionItem);\n\n const selectAllLabel = document.createElement('label');\n applyStyles(selectAllLabel, filterStyles.optionLabel);\n\n this.selectAllCheckbox = document.createElement('input');\n this.selectAllCheckbox.type = 'checkbox';\n this.selectAllCheckbox.checked = true; // 默认全选\n applyStyles(this.selectAllCheckbox, filterStyles.checkbox);\n\n this.totalCountSpan = document.createElement('span');\n this.totalCountSpan.textContent = '';\n applyStyles(this.totalCountSpan, filterStyles.countSpan);\n\n selectAllLabel.append(this.selectAllCheckbox, ' 全选');\n selectAllItemDiv.append(selectAllLabel, this.totalCountSpan);\n\n this.filterItemsContainer = document.createElement('div'); // 筛选条目的容器,后续应动态 appendChild\n\n optionsContainer.append(selectAllItemDiv, this.filterItemsContainer);\n this.filterByValuePanel.append(searchContainer, optionsContainer);\n\n container.appendChild(this.filterByValuePanel);\n\n this.bindEventForFilterByValue();\n }\n\n private renderFilterOptions(field: string | number): void {\n this.filterItemsContainer.innerHTML = '';\n this.valueFilterOptionList.delete(field);\n this.valueFilterOptionList.set(field, []);\n\n let totalCount = 0;\n let allChecked = true;\n let noneChecked = true;\n const selectedKeysSet = this.selectedKeys.get(field);\n const itemDomList: ValueFilterOptionDom[] = [];\n const isFiltered = this.filterStateManager.getFilterState(field)?.enable;\n const toUnformatted = this.toUnformattedCache.get(field);\n\n const candidates = this.candidateKeys.get(field);\n if (!candidates || candidates.size === 0) {\n return;\n }\n const candidatesArr = [...candidates.entries()] as [string, number][] | [number, number][];\n const sortedCandidatesArr =\n typeof candidatesArr[0][0] === 'number'\n ? [...candidatesArr]?.sort(([a], [b]) => Number(a) - Number(b))\n : [...candidatesArr]?.sort(([a], [b]) => String(a).localeCompare(String(b)));\n\n sortedCandidatesArr?.forEach(([val, count]) => {\n totalCount += count;\n const unformattedArr = Array.from(toUnformatted.get(val) || new Set());\n const itemDiv = document.createElement('div');\n applyStyles(itemDiv, filterStyles.optionItem);\n itemDiv.style.display = 'flex';\n\n const label = document.createElement('label');\n applyStyles(label, filterStyles.optionLabel);\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.value = String(val); // 显示值作为checkbox的value\n checkbox.checked = isFiltered ? unformattedArr.some(v => selectedKeysSet?.has(v)) : true;\n applyStyles(checkbox, filterStyles.checkbox);\n\n if (checkbox.checked) {\n noneChecked = false;\n } else {\n allChecked = false;\n }\n\n const countSpan = document.createElement('span');\n countSpan.textContent = String(count);\n applyStyles(countSpan, filterStyles.countSpan);\n\n label.append(checkbox, ` ${val}`); // UI显示格式化值\n itemDiv.append(label, countSpan);\n this.filterItemsContainer.appendChild(itemDiv);\n\n const itemDom: ValueFilterOptionDom = {\n id: String(val), // 显示值作为id,用于UI交互\n originalValue: unformattedArr,\n itemContainer: itemDiv,\n checkbox: checkbox,\n countSpan: countSpan\n };\n\n itemDomList.push(itemDom);\n });\n\n this.valueFilterOptionList.set(field, itemDomList);\n this.selectAllCheckbox.checked = allChecked;\n this.selectAllCheckbox.indeterminate = !allChecked && !noneChecked;\n this.totalCountSpan.textContent = String(totalCount);\n }\n\n private bindEventForFilterByValue(): void {\n this._onInputKeyUpHandler = (event: KeyboardEvent) => {\n const target = event.target as EventTarget;\n if (target instanceof HTMLInputElement && target.type === 'text') {\n const value = target.value;\n this.onSearch(this.selectedField, value);\n }\n };\n\n this._onCheckboxChangeHandler = (event: Event) => {\n const target = event.target as EventTarget;\n if (target instanceof HTMLInputElement && target.type === 'checkbox') {\n if (target === this.selectAllCheckbox) {\n this.toggleSelectAll(this.selectedField, this.selectAllCheckbox.checked);\n } else {\n this.syncSelectAllCheckbox(this.selectedField);\n }\n }\n };\n\n this.filterByValuePanel.addEventListener('keyup', this._onInputKeyUpHandler);\n this.filterByValuePanel.addEventListener('change', this._onCheckboxChangeHandler);\n }\n\n show(): void {\n // 1. 收集候选值列表(根据筛选状态选择数据源)\n const isFiltered = this.filterStateManager.getFilterState(this.selectedField)?.enable;\n if (!isFiltered) {\n this.collectCandidateKeysForUnfilteredColumn(this.selectedField);\n } else {\n this.collectCandidateKeysForFilteredColumn(this.selectedField);\n }\n\n // 2. 初始化筛选状态(必须在 renderFilterOptions 之前执行)\n this.initFilterStateFromTableData(this.selectedField);\n\n // 3. 清空搜索框\n if (this.filterByValueSearchInput) {\n this.filterByValueSearchInput.value = '';\n }\n\n // 4. 渲染选项(此时状态已经初始化完成)\n this.renderFilterOptions(this.selectedField);\n this.filterByValuePanel.style.display = 'block';\n }\n\n hide(): void {\n this.filterByValuePanel.style.display = 'none';\n }\n\n clearSearchInputValue(): void {\n this.filterByValueSearchInput.value = '';\n }\n\n destroy(): void {\n if (this.filterByValuePanel) {\n if (this._onInputKeyUpHandler) {\n this.filterByValuePanel.removeEventListener('keyup', this._onInputKeyUpHandler);\n }\n if (this._onCheckboxChangeHandler) {\n this.filterByValuePanel.removeEventListener('change', this._onCheckboxChangeHandler);\n }\n }\n this._onInputKeyUpHandler = undefined as any;\n this._onCheckboxChangeHandler = undefined as any;\n\n if (this.filterByValuePanel) {\n const parent = this.filterByValuePanel.parentElement;\n if (parent) {\n parent.removeChild(this.filterByValuePanel);\n } else {\n // if not attached, ensure it's removed\n this.filterByValuePanel.remove();\n }\n }\n\n // clear DOM contents to release child references\n if (this.filterItemsContainer) {\n this.filterItemsContainer.innerHTML = '';\n }\n if (this.filterByValueSearchInput) {\n this.filterByValueSearchInput.value = '';\n }\n\n // Clear in-memory caches and collections to avoid unbounded growth\n this.selectedKeys && this.selectedKeys.clear();\n this.candidateKeys && this.candidateKeys.clear();\n this.formatFnCache && this.formatFnCache.clear();\n this.toUnformattedCache && this.toUnformattedCache.clear();\n this.valueFilterOptionList && this.valueFilterOptionList.clear();\n\n // Nullify references (use casts to avoid TS strict errors at assignment)\n (this.filterByValuePanel as any) = undefined;\n (this.filterByValueSearchInput as any) = undefined;\n (this.selectAllCheckbox as any) = undefined;\n (this.totalCountSpan as any) = undefined;\n (this.filterItemsContainer as any) = undefined;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/filter/value-filter.ts"],"names":[],"mappings":"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","file":"value-filter.js","sourcesContent":["import type { ListTable, PivotTable } from '@visactor/vtable';\nimport { arrayEqual, isValid } from '@visactor/vutils';\nimport type { ValueFilterOptionDom, FilterState, FilterOptions, FilterStyles } from './types';\nimport { FilterActionType } from './types';\nimport type { FilterStateManager } from './filter-state-manager';\nimport { applyStyles } from './styles';\n\nexport class ValueFilter {\n private table: ListTable | PivotTable;\n private filterStateManager: FilterStateManager;\n private pluginOptions: FilterOptions;\n private styles: Record<any, any>;\n private selectedField: string | number;\n private selectedKeys = new Map<string | number, Set<string | number>>(); // 存储 format 之前的原始数据\n private candidateKeys = new Map<string | number, Map<string | number, number>>(); // 存储 format 后的数据\n private formatFnCache = new Map<string | number, (record: any) => string | number>();\n private toUnformattedCache = new Map<string | number, Map<any, Set<any>>>();\n\n private valueFilterOptionList: Map<string | number, ValueFilterOptionDom[]> = new Map();\n\n private filterByValuePanel: HTMLElement;\n private searchContainer: HTMLElement;\n private optionsContainer: HTMLElement;\n private selectAllItemDiv: HTMLElement;\n private selectAllLabel: HTMLElement;\n private filterByValueSearchInput: HTMLInputElement;\n private selectAllCheckbox: HTMLInputElement;\n private totalCountSpan: HTMLSpanElement;\n private filterItemsContainer: HTMLElement;\n\n private _onInputKeyUpHandler: (event: KeyboardEvent) => void;\n private _onCheckboxChangeHandler: (event: Event) => void;\n\n constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager, pluginOptions: FilterOptions) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n this.pluginOptions = pluginOptions;\n this.styles = pluginOptions.styles || {};\n }\n\n setSelectedField(fieldId: string | number): void {\n this.selectedField = fieldId;\n }\n\n private getFormatFnCache(fieldId: string | number) {\n let formatFn = this.formatFnCache.get(fieldId);\n if (formatFn !== null && formatFn !== undefined) {\n return formatFn;\n }\n\n const headerAddress = this.table.internalProps.layoutMap.getHeaderCellAddressByField(String(fieldId));\n const bodyInfo = this.table.internalProps.layoutMap.getBody(headerAddress?.col, headerAddress?.row);\n if (bodyInfo && 'fieldFormat' in bodyInfo && typeof bodyInfo.fieldFormat === 'function') {\n formatFn = bodyInfo.fieldFormat;\n } else if (bodyInfo && 'format' in bodyInfo && typeof bodyInfo.format === 'function') {\n formatFn = bodyInfo.format;\n } else {\n formatFn = (record: any) => record[fieldId];\n }\n\n this.formatFnCache.set(fieldId, formatFn);\n return formatFn;\n }\n\n /**\n * 为未应用筛选的列,收集候选值集合\n */\n private collectCandidateKeysForUnfilteredColumn(fieldId: string | number): void {\n const syncFilterItemsState = this.pluginOptions?.syncFilterItemsState ?? true;\n const countMap = new Map<any, number>(); // 计算每个候选值的计数\n let records = [];\n // 如果各个筛选器之间不联动, 则永远从原数据中获取候选值\n if (!syncFilterItemsState) {\n records = this.table.internalProps.records;\n } else {\n records = this.table.internalProps.dataSource.records; // 未筛选:使用当前表格数据\n }\n const formatFn = this.getFormatFnCache(fieldId);\n const toUnformatted = new Map();\n\n records.forEach(record => {\n // 空行不做处理\n if (isValid(record)) {\n const originalValue = record[fieldId];\n const formattedValue = formatFn(record);\n if (formattedValue !== undefined && formattedValue !== null) {\n countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1);\n\n const unformattedSet = toUnformatted.get(formattedValue);\n if (unformattedSet !== undefined && unformattedSet !== null) {\n unformattedSet.add(originalValue);\n } else {\n toUnformatted.set(formattedValue, new Set([originalValue]));\n }\n }\n }\n });\n\n this.candidateKeys.set(fieldId, countMap);\n this.toUnformattedCache.set(fieldId, toUnformatted);\n }\n\n syncRulesAndCandidateKeys() {\n // 处于值筛选状态, 表格更新时:\n // 可能会插入新数据, 此时需要更新筛选结果和候选值:\n // 1. 更新筛选结果\n // - 出现了之前没有出现过的选项\n // - 筛选器出于被筛选状态(有值)\n // - 则将该选项添加到筛选器中\n // 2. 更新候选值\n const currentRecords = this.table.internalProps.dataSource.records; // 此时还没做筛选, 当前数据 = 原始表格数据\n const filteredFields = this.filterStateManager.getActiveFilterFields();\n currentRecords.forEach(record => {\n filteredFields.forEach(candidateField => {\n const formatFn = this.getFormatFnCache(candidateField);\n\n // 空行不做处理\n if (isValid(record)) {\n const originalValue = record[candidateField];\n const formattedValue = formatFn(record);\n const lastToUnformatted = this.toUnformattedCache.get(candidateField) || new Map();\n if (\n !lastToUnformatted.has(formattedValue) &&\n this.filterStateManager.getFilterState(candidateField)?.values?.length > 0\n ) {\n this.filterStateManager.getFilterState(candidateField).values.push(originalValue);\n this.selectedKeys.get(candidateField).add(originalValue);\n }\n }\n });\n });\n }\n\n syncSelectedKeys() {\n // 处于条件筛选状态, 表格更新时:\n // 值筛选面板需要同步筛选结果\n const currentRecords = this.table.internalProps.dataSource.records; // 此时还没做筛选, 当前数据 = 原始表格数据\n const filteredFields = this.filterStateManager.getActiveFilterFields();\n currentRecords.forEach(record => {\n filteredFields.forEach(candidateField => {\n // 空行不做处理\n if (isValid(record)) {\n const originalValue = record[candidateField];\n if (this.filterStateManager.getFilterState(candidateField)?.type === 'byCondition') {\n if (!this.selectedKeys.get(candidateField)) {\n this.selectedKeys.set(candidateField, new Set());\n }\n this.selectedKeys.get(candidateField).add(originalValue);\n }\n }\n });\n });\n }\n\n /**\n * 为已应用筛选的列,收集候选值集合\n */\n private collectCandidateKeysForFilteredColumn(candidateField: string | number): void {\n const syncFilterItemsState = this.pluginOptions?.syncFilterItemsState ?? true;\n const filteredFields = this.filterStateManager.getActiveFilterFields().filter(field => field !== candidateField);\n const toUnformatted = new Map();\n const formatFn = this.getFormatFnCache(candidateField);\n\n const countMap = new Map<any, number>(); // 计算每个候选值的计数\n let records = [];\n // 如果各个筛选器之间不联动, 则永远从原数据中获取候选值\n if (!syncFilterItemsState) {\n records = this.table.internalProps.records;\n } else {\n const recordsList = this.table.internalProps.records; // 已筛选:使用原始表格数据\n records = recordsList.filter(record =>\n filteredFields.every(field => {\n const set = this.selectedKeys.get(field);\n return set.has(record[field]);\n })\n );\n }\n\n records.forEach(record => {\n // 空行不做处理\n if (isValid(record)) {\n const originalValue = record[candidateField];\n const formattedValue = formatFn(record);\n countMap.set(formattedValue, (countMap.get(formattedValue) || 0) + 1);\n if (formattedValue !== undefined && formattedValue !== null) {\n const unformattedSet = toUnformatted.get(formattedValue);\n if (unformattedSet !== undefined && unformattedSet !== null) {\n unformattedSet.add(originalValue);\n } else {\n toUnformatted.set(formattedValue, new Set([originalValue]));\n }\n }\n }\n });\n\n this.candidateKeys.set(candidateField, countMap);\n this.toUnformattedCache.set(candidateField, toUnformatted);\n }\n\n private toggleSelectAll(fieldId: string | number, selected: boolean): void {\n const options = this.valueFilterOptionList.get(fieldId);\n options.forEach(option => {\n option.checkbox.checked = selected;\n });\n }\n\n private syncSelectAllCheckbox(fieldId: string | number): void {\n const options = this.valueFilterOptionList.get(fieldId) || [];\n const allChecked = options.every(o => o.checkbox.checked);\n const noneChecked = options.every(o => !o.checkbox.checked);\n\n this.selectAllCheckbox.checked = allChecked;\n this.selectAllCheckbox.indeterminate = !allChecked && !noneChecked;\n }\n\n private onSearch(fieldId: string | number, value: string): void {\n // 更新UI显示\n const items = this.valueFilterOptionList.get(fieldId);\n const filterKeywords = value\n .toUpperCase()\n .split(' ')\n .filter(s => s);\n\n for (const item of items) {\n const txtValue = item.id.toUpperCase() || '';\n const match = filterKeywords.some(keyword => txtValue.includes(keyword));\n const isVisible = filterKeywords.length === 0 || match;\n\n item.itemContainer.style.display = isVisible ? 'flex' : 'none';\n }\n }\n\n /**\n * 根据当前表格中的数据,更新 filter 的被选状态\n */\n private initFilterStateFromTableData(fieldId: string | number): void {\n const isHasFilteredState = this.filterStateManager.getActiveFilterFields();\n const isValueFilter = this.filterStateManager.getFilterState(fieldId)?.type === 'byValue';\n if (isHasFilteredState && isValueFilter) {\n return;\n }\n\n let selectedValues = new Set<any>();\n const originalValues = new Set<any>();\n const originalRecords = this.table.internalProps.records; // 原始数据\n originalRecords.forEach(record => {\n // 空行不做处理\n if (isValid(record)) {\n originalValues.add(record[fieldId]);\n }\n });\n\n const syncFilterItemsState = this.pluginOptions?.syncFilterItemsState ?? true;\n if (syncFilterItemsState) {\n const currentRecords = this.table.internalProps.dataSource.records; // 当前数据\n currentRecords.forEach(record => {\n // 空行不做处理\n if (isValid(record)) {\n selectedValues.add(record[fieldId]);\n }\n });\n } else {\n const selectedFromRules = this.filterStateManager.getFilterState(fieldId)?.values || originalValues; // 如果按值筛选没有状态, 则默认选中所有值\n selectedValues = new Set(selectedFromRules);\n }\n this.selectedKeys.set(fieldId, selectedValues);\n const hasFiltered = !arrayEqual(Array.from(originalValues), Array.from(selectedValues));\n if (hasFiltered) {\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: Array.from(selectedValues),\n enable: true\n }\n });\n }\n }\n\n applyFilter(fieldId: string | number = this.selectedField): void {\n const options = this.valueFilterOptionList.get(fieldId);\n if (!options || options.length === 0) {\n return;\n }\n\n const selections = options\n .map(option => {\n if (option.checkbox.checked) {\n return option.originalValue;\n }\n return null;\n })\n .filter(key => key !== null)\n .flat();\n\n this.selectedKeys.set(fieldId, new Set(selections));\n\n if (selections.length >= 0 && selections.length < this.valueFilterOptionList.get(fieldId).length) {\n this.filterStateManager.dispatch({\n type: FilterActionType.APPLY_FILTERS,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: selections,\n enable: true\n }\n });\n } else {\n this.filterStateManager.dispatch({\n type: FilterActionType.REMOVE_FILTER,\n payload: {\n field: fieldId\n }\n });\n }\n }\n\n clearFilter(fieldId: string | number): void {\n this.filterStateManager.dispatch({\n type: FilterActionType.REMOVE_FILTER,\n payload: {\n field: fieldId\n }\n });\n\n this.hide();\n }\n\n render(container: HTMLElement): void {\n const filterStyles = this.styles;\n // === 按值筛选的菜单内容 ===\n this.filterByValuePanel = document.createElement('div');\n applyStyles(this.filterByValuePanel, filterStyles.filterPanel);\n\n // -- 搜索栏 ---\n this.searchContainer = document.createElement('div');\n applyStyles(this.searchContainer, this.styles.searchContainer);\n\n this.filterByValueSearchInput = document.createElement('input');\n this.filterByValueSearchInput.type = 'text';\n this.filterByValueSearchInput.placeholder = filterStyles.searchInput?.placeholder || '可使用空格分隔多个关键词';\n applyStyles(this.filterByValueSearchInput, filterStyles.searchInput);\n\n this.searchContainer.appendChild(this.filterByValueSearchInput);\n\n // --- 筛选选项 ---\n this.optionsContainer = document.createElement('div');\n applyStyles(this.optionsContainer, this.styles.optionsContainer);\n\n this.selectAllItemDiv = document.createElement('div');\n applyStyles(this.selectAllItemDiv, this.styles.optionItem);\n\n this.selectAllLabel = document.createElement('label');\n applyStyles(this.selectAllLabel, this.styles.optionLabel);\n\n this.selectAllCheckbox = document.createElement('input');\n this.selectAllCheckbox.type = 'checkbox';\n this.selectAllCheckbox.checked = true; // 默认全选\n applyStyles(this.selectAllCheckbox, filterStyles.checkbox);\n\n this.totalCountSpan = document.createElement('span');\n this.totalCountSpan.textContent = '';\n applyStyles(this.totalCountSpan, filterStyles.countSpan);\n\n this.selectAllLabel.append(this.selectAllCheckbox, ' 全选');\n this.selectAllItemDiv.appendChild(this.selectAllLabel);\n\n this.filterItemsContainer = document.createElement('div'); // 筛选条目的容器,后续应动态 appendChild\n\n this.optionsContainer.append(this.selectAllItemDiv, this.filterItemsContainer);\n this.filterByValuePanel.append(this.searchContainer, this.optionsContainer);\n\n container.appendChild(this.filterByValuePanel);\n\n this.bindEventForFilterByValue();\n }\n\n updateStyles(styles: FilterStyles): void {\n applyStyles(this.filterByValuePanel, styles.filterPanel);\n applyStyles(this.searchContainer, styles.searchContainer);\n this.filterByValueSearchInput.placeholder = styles.searchInput?.placeholder || '可使用空格分隔多个关键词';\n applyStyles(this.filterByValueSearchInput, styles.searchInput);\n applyStyles(this.optionsContainer, styles.optionsContainer);\n applyStyles(this.selectAllItemDiv, styles.optionItem);\n applyStyles(this.selectAllLabel, styles.optionLabel);\n applyStyles(this.selectAllCheckbox, styles.checkbox);\n }\n\n private renderFilterOptions(field: string | number): void {\n const filterStyles = this.styles;\n this.filterItemsContainer.innerHTML = '';\n this.valueFilterOptionList.delete(field);\n this.valueFilterOptionList.set(field, []);\n\n let totalCount = 0;\n let allChecked = true;\n let noneChecked = true;\n const selectedKeysSet = this.selectedKeys.get(field);\n const itemDomList: ValueFilterOptionDom[] = [];\n const isFiltered = this.filterStateManager.getFilterState(field)?.enable;\n const toUnformatted = this.toUnformattedCache.get(field);\n\n const candidates = this.candidateKeys.get(field);\n if (!candidates || candidates.size === 0) {\n return;\n }\n const candidatesArr = [...candidates.entries()] as [string, number][] | [number, number][];\n const sortedCandidatesArr =\n typeof candidatesArr[0][0] === 'number'\n ? [...candidatesArr]?.sort(([a], [b]) => Number(a) - Number(b))\n : [...candidatesArr]?.sort(([a], [b]) => String(a).localeCompare(String(b)));\n\n sortedCandidatesArr?.forEach(([val, count]) => {\n totalCount += count;\n const unformattedArr = Array.from(toUnformatted.get(val) || new Set());\n const itemDiv = document.createElement('div');\n applyStyles(itemDiv, filterStyles.optionItem);\n itemDiv.style.display = 'flex';\n\n const label = document.createElement('label');\n applyStyles(label, filterStyles.optionLabel);\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.value = String(val); // 显示值作为checkbox的value\n checkbox.checked = isFiltered ? unformattedArr.some(v => selectedKeysSet?.has(v)) : true;\n applyStyles(checkbox, filterStyles.checkbox);\n\n if (checkbox.checked) {\n noneChecked = false;\n } else {\n allChecked = false;\n }\n\n const countSpan = document.createElement('span');\n countSpan.textContent = String(count);\n applyStyles(countSpan, filterStyles.countSpan);\n\n label.append(checkbox, ` ${this.pluginOptions.checkboxItemFormat?.(val, unformattedArr) || val}`); // UI显示格式化值 或 用户二次加工的值\n itemDiv.append(label, countSpan);\n this.filterItemsContainer.appendChild(itemDiv);\n\n const itemDom: ValueFilterOptionDom = {\n id: String(val), // 显示值作为id,用于UI交互\n originalValue: unformattedArr,\n itemContainer: itemDiv,\n checkbox: checkbox,\n countSpan: countSpan\n };\n\n itemDomList.push(itemDom);\n });\n\n this.valueFilterOptionList.set(field, itemDomList);\n this.selectAllCheckbox.checked = allChecked;\n this.selectAllCheckbox.indeterminate = !allChecked && !noneChecked;\n this.totalCountSpan.textContent = String(totalCount);\n }\n\n private bindEventForFilterByValue(): void {\n this._onInputKeyUpHandler = (event: KeyboardEvent) => {\n const target = event.target as EventTarget;\n if (target instanceof HTMLInputElement && target.type === 'text') {\n const value = target.value;\n this.onSearch(this.selectedField, value);\n }\n };\n\n this._onCheckboxChangeHandler = (event: Event) => {\n const target = event.target as EventTarget;\n if (target instanceof HTMLInputElement && target.type === 'checkbox') {\n if (target === this.selectAllCheckbox) {\n this.toggleSelectAll(this.selectedField, this.selectAllCheckbox.checked);\n } else {\n this.syncSelectAllCheckbox(this.selectedField);\n }\n }\n };\n\n this.filterByValuePanel.addEventListener('keyup', this._onInputKeyUpHandler);\n this.filterByValuePanel.addEventListener('change', this._onCheckboxChangeHandler);\n }\n\n show(): void {\n // 1. 收集候选值列表(根据筛选状态选择数据源)\n const isFiltered = this.filterStateManager.getFilterState(this.selectedField)?.enable;\n if (!isFiltered) {\n this.collectCandidateKeysForUnfilteredColumn(this.selectedField);\n } else {\n this.collectCandidateKeysForFilteredColumn(this.selectedField);\n }\n\n // 2. 初始化筛选状态(必须在 renderFilterOptions 之前执行)\n this.initFilterStateFromTableData(this.selectedField);\n\n // 3. 清空搜索框\n if (this.filterByValueSearchInput) {\n this.filterByValueSearchInput.value = '';\n }\n\n // 4. 渲染选项(此时状态已经初始化完成)\n this.renderFilterOptions(this.selectedField);\n this.filterByValuePanel.style.display = 'block';\n }\n\n hide(): void {\n this.filterByValuePanel.style.display = 'none';\n }\n\n clearSearchInputValue(): void {\n this.filterByValueSearchInput.value = '';\n }\n\n destroy(): void {\n if (this.filterByValuePanel) {\n if (this._onInputKeyUpHandler) {\n this.filterByValuePanel.removeEventListener('keyup', this._onInputKeyUpHandler);\n }\n if (this._onCheckboxChangeHandler) {\n this.filterByValuePanel.removeEventListener('change', this._onCheckboxChangeHandler);\n }\n }\n this._onInputKeyUpHandler = undefined as any;\n this._onCheckboxChangeHandler = undefined as any;\n\n if (this.filterByValuePanel) {\n const parent = this.filterByValuePanel.parentElement;\n if (parent) {\n parent.removeChild(this.filterByValuePanel);\n } else {\n // if not attached, ensure it's removed\n this.filterByValuePanel.remove();\n }\n }\n\n // clear DOM contents to release child references\n if (this.filterItemsContainer) {\n this.filterItemsContainer.innerHTML = '';\n }\n if (this.filterByValueSearchInput) {\n this.filterByValueSearchInput.value = '';\n }\n\n // Clear in-memory caches and collections to avoid unbounded growth\n this.selectedKeys && this.selectedKeys.clear();\n this.candidateKeys && this.candidateKeys.clear();\n this.formatFnCache && this.formatFnCache.clear();\n this.toUnformattedCache && this.toUnformattedCache.clear();\n this.valueFilterOptionList && this.valueFilterOptionList.clear();\n\n // Nullify references (use casts to avoid TS strict errors at assignment)\n (this.filterByValuePanel as any) = undefined;\n (this.filterByValueSearchInput as any) = undefined;\n (this.selectAllCheckbox as any) = undefined;\n (this.totalCountSpan as any) = undefined;\n (this.filterItemsContainer as any) = undefined;\n }\n}\n"]}
@@ -89,7 +89,7 @@ export class FocusHighlightPlugin {
89
89
  }));
90
90
  }
91
91
  update() {
92
- this.setFocusHighlightRange(this.range, !0);
92
+ this.table && this.setFocusHighlightRange(this.range, !0);
93
93
  }
94
94
  }
95
95
  //# sourceMappingURL=focus-highlight.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/focus-highlight.ts"],"names":[],"mappings":"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","file":"focus-highlight.js","sourcesContent":["import type { INode } from '@visactor/vtable/es/vrender';\nimport { createRect } from '@visactor/vtable/es/vrender';\nimport type { Group } from '@visactor/vtable/es/scenegraph/graphic/group';\nimport { isSameRange } from '@visactor/vtable/es/tools/cell-range';\nimport type { CellAddress, CellRange } from '@visactor/vtable/es/ts-types';\nimport type { pluginsDefinition } from '@visactor/vtable';\nimport type { BaseTableAPI } from '@visactor/vtable/es/ts-types/base-table';\nimport { cellInRange } from '@visactor/vtable/es/tools/helper';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nexport interface FocusHighlightPluginOptions {\n id?: string;\n fill?: string;\n opacity?: number;\n highlightRange?: CellAddress | CellRange; //初始化聚焦高亮范围\n}\n\nexport class FocusHighlightPlugin implements pluginsDefinition.IVTablePlugin {\n id = `focus-highlight`;\n name = 'Focus Highlight';\n runTime = [TABLE_EVENT_TYPE.INITIALIZED, TABLE_EVENT_TYPE.SELECTED_CELL, TABLE_EVENT_TYPE.SELECTED_CLEAR];\n table: BaseTableAPI;\n range?: CellRange;\n pluginOptions: FocusHighlightPluginOptions;\n\n constructor(\n options: FocusHighlightPluginOptions = {\n fill: '#000',\n opacity: 0.5,\n highlightRange: undefined\n }\n ) {\n this.id = options.id ?? this.id;\n this.pluginOptions = Object.assign(\n {\n fill: '#000',\n opacity: 0.5\n },\n options\n );\n }\n run(...args: any[]) {\n if (!this.table) {\n this.table = args[2] as BaseTableAPI;\n }\n if (args[1] === TABLE_EVENT_TYPE.INITIALIZED) {\n this.pluginOptions.highlightRange && this.setFocusHighlightRange(this.pluginOptions.highlightRange);\n } else if (args[1] === TABLE_EVENT_TYPE.SELECTED_CELL) {\n const posCell = this.table.stateManager.select.cellPos;\n if (this.table.isHeader(posCell.col, posCell.row)) {\n this.setFocusHighlightRange(undefined);\n } else {\n const ranges = this.table.stateManager.select.ranges;\n const min_col = 0;\n const max_col = this.table.colCount - 1;\n const min_row = Math.min(ranges[0].start.row, ranges[0].end.row);\n const max_row = Math.max(ranges[0].start.row, ranges[0].end.row);\n this.setFocusHighlightRange({\n start: { col: min_col, row: min_row },\n end: { col: max_col, row: max_row }\n });\n }\n } else if (args[1] === TABLE_EVENT_TYPE.SELECTED_CLEAR) {\n this.setFocusHighlightRange(undefined);\n }\n }\n\n setFocusHighlightRange(range?: CellAddress | CellRange, forceUpdate: boolean = false) {\n let cellRange: CellRange;\n if (range && 'start' in range && 'end' in range) {\n cellRange = range as CellRange;\n } else if (range) {\n cellRange = {\n start: range as CellAddress,\n end: range as CellAddress\n };\n }\n if (isSameRange(this.range, cellRange) && !forceUpdate) {\n return;\n }\n\n this.range = cellRange;\n if (!range) {\n // reset highlight\n this.deleteAllCellGroupShadow();\n } else {\n // update highlight\n this.updateCellGroupShadow();\n }\n\n this.table.scenegraph.updateNextFrame();\n }\n\n deleteAllCellGroupShadow() {\n if (!this.table.isPivotTable()) {\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rowHeaderGroup);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.leftBottomCornerGroup);\n }\n this.updateCellGroupShadowInContainer(this.table.scenegraph.bodyGroup);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rightFrozenGroup);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.bottomFrozenGroup);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rightBottomCornerGroup);\n }\n\n updateCellGroupShadow() {\n if (!this.table.isPivotTable()) {\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rowHeaderGroup, this.range);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.leftBottomCornerGroup, this.range);\n }\n this.updateCellGroupShadowInContainer(this.table.scenegraph.bodyGroup, this.range);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rightFrozenGroup, this.range);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.bottomFrozenGroup), this.range;\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rightBottomCornerGroup, this.range);\n }\n updateCellGroupShadowInContainer(container: Group, range?: CellAddress | CellRange) {\n let cellRange: CellRange;\n if (range && 'start' in range && 'end' in range) {\n cellRange = range;\n } else if (range) {\n cellRange = {\n start: range as CellAddress,\n end: range as CellAddress\n };\n }\n container.forEachChildrenSkipChild((item: INode) => {\n const column = item as unknown as Group;\n if (column.role === 'column') {\n column.forEachChildrenSkipChild((item: INode) => {\n const cell = item as unknown as Group;\n if (cell.role !== 'cell') {\n return;\n }\n cell.attachShadow(cell.shadowRoot);\n const shadowGroup = cell.shadowRoot;\n if (!cellRange) {\n // no highlight\n shadowGroup.removeAllChild();\n } else if (cellInRange(cellRange, cell.col, cell.row)) {\n // inside highlight\n shadowGroup.removeAllChild();\n } else if (!shadowGroup.firstChild) {\n // outside highlight\n const shadowRect = createRect({\n x: 0,\n y: 0,\n width: cell.attribute.width,\n height: cell.attribute.height,\n fill: this.pluginOptions.fill,\n opacity: this.pluginOptions.opacity\n });\n shadowRect.name = 'shadow-rect';\n shadowGroup.appendChild(shadowRect);\n }\n });\n }\n });\n }\n update() {\n this.setFocusHighlightRange(this.range, true);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/focus-highlight.ts"],"names":[],"mappings":"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","file":"focus-highlight.js","sourcesContent":["import type { INode } from '@visactor/vtable/es/vrender';\nimport { createRect } from '@visactor/vtable/es/vrender';\nimport type { Group } from '@visactor/vtable/es/scenegraph/graphic/group';\nimport { isSameRange } from '@visactor/vtable/es/tools/cell-range';\nimport type { CellAddress, CellRange } from '@visactor/vtable/es/ts-types';\nimport type { pluginsDefinition } from '@visactor/vtable';\nimport type { BaseTableAPI } from '@visactor/vtable/es/ts-types/base-table';\nimport { cellInRange } from '@visactor/vtable/es/tools/helper';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nexport interface FocusHighlightPluginOptions {\n id?: string;\n fill?: string;\n opacity?: number;\n highlightRange?: CellAddress | CellRange; //初始化聚焦高亮范围\n}\n\nexport class FocusHighlightPlugin implements pluginsDefinition.IVTablePlugin {\n id = `focus-highlight`;\n name = 'Focus Highlight';\n runTime = [TABLE_EVENT_TYPE.INITIALIZED, TABLE_EVENT_TYPE.SELECTED_CELL, TABLE_EVENT_TYPE.SELECTED_CLEAR];\n table: BaseTableAPI;\n range?: CellRange;\n pluginOptions: FocusHighlightPluginOptions;\n\n constructor(\n options: FocusHighlightPluginOptions = {\n fill: '#000',\n opacity: 0.5,\n highlightRange: undefined\n }\n ) {\n this.id = options.id ?? this.id;\n this.pluginOptions = Object.assign(\n {\n fill: '#000',\n opacity: 0.5\n },\n options\n );\n }\n run(...args: any[]) {\n if (!this.table) {\n this.table = args[2] as BaseTableAPI;\n }\n if (args[1] === TABLE_EVENT_TYPE.INITIALIZED) {\n this.pluginOptions.highlightRange && this.setFocusHighlightRange(this.pluginOptions.highlightRange);\n } else if (args[1] === TABLE_EVENT_TYPE.SELECTED_CELL) {\n const posCell = this.table.stateManager.select.cellPos;\n if (this.table.isHeader(posCell.col, posCell.row)) {\n this.setFocusHighlightRange(undefined);\n } else {\n const ranges = this.table.stateManager.select.ranges;\n const min_col = 0;\n const max_col = this.table.colCount - 1;\n const min_row = Math.min(ranges[0].start.row, ranges[0].end.row);\n const max_row = Math.max(ranges[0].start.row, ranges[0].end.row);\n this.setFocusHighlightRange({\n start: { col: min_col, row: min_row },\n end: { col: max_col, row: max_row }\n });\n }\n } else if (args[1] === TABLE_EVENT_TYPE.SELECTED_CLEAR) {\n this.setFocusHighlightRange(undefined);\n }\n }\n\n setFocusHighlightRange(range?: CellAddress | CellRange, forceUpdate: boolean = false) {\n let cellRange: CellRange;\n if (range && 'start' in range && 'end' in range) {\n cellRange = range as CellRange;\n } else if (range) {\n cellRange = {\n start: range as CellAddress,\n end: range as CellAddress\n };\n }\n if (isSameRange(this.range, cellRange) && !forceUpdate) {\n return;\n }\n\n this.range = cellRange;\n if (!range) {\n // reset highlight\n this.deleteAllCellGroupShadow();\n } else {\n // update highlight\n this.updateCellGroupShadow();\n }\n\n this.table.scenegraph.updateNextFrame();\n }\n\n deleteAllCellGroupShadow() {\n if (!this.table.isPivotTable()) {\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rowHeaderGroup);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.leftBottomCornerGroup);\n }\n this.updateCellGroupShadowInContainer(this.table.scenegraph.bodyGroup);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rightFrozenGroup);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.bottomFrozenGroup);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rightBottomCornerGroup);\n }\n\n updateCellGroupShadow() {\n if (!this.table.isPivotTable()) {\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rowHeaderGroup, this.range);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.leftBottomCornerGroup, this.range);\n }\n this.updateCellGroupShadowInContainer(this.table.scenegraph.bodyGroup, this.range);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rightFrozenGroup, this.range);\n this.updateCellGroupShadowInContainer(this.table.scenegraph.bottomFrozenGroup), this.range;\n this.updateCellGroupShadowInContainer(this.table.scenegraph.rightBottomCornerGroup, this.range);\n }\n updateCellGroupShadowInContainer(container: Group, range?: CellAddress | CellRange) {\n let cellRange: CellRange;\n if (range && 'start' in range && 'end' in range) {\n cellRange = range;\n } else if (range) {\n cellRange = {\n start: range as CellAddress,\n end: range as CellAddress\n };\n }\n container.forEachChildrenSkipChild((item: INode) => {\n const column = item as unknown as Group;\n if (column.role === 'column') {\n column.forEachChildrenSkipChild((item: INode) => {\n const cell = item as unknown as Group;\n if (cell.role !== 'cell') {\n return;\n }\n cell.attachShadow(cell.shadowRoot);\n const shadowGroup = cell.shadowRoot;\n if (!cellRange) {\n // no highlight\n shadowGroup.removeAllChild();\n } else if (cellInRange(cellRange, cell.col, cell.row)) {\n // inside highlight\n shadowGroup.removeAllChild();\n } else if (!shadowGroup.firstChild) {\n // outside highlight\n const shadowRect = createRect({\n x: 0,\n y: 0,\n width: cell.attribute.width,\n height: cell.attribute.height,\n fill: this.pluginOptions.fill,\n opacity: this.pluginOptions.opacity\n });\n shadowRect.name = 'shadow-rect';\n shadowGroup.appendChild(shadowRect);\n }\n });\n }\n });\n }\n update() {\n if (this.table) {\n this.setFocusHighlightRange(this.range, true);\n }\n }\n}\n"]}
@@ -90,5 +90,4 @@ function updateAllSubTableCheckboxes(subTable, field, checked) {
90
90
  subTable.scenegraph.updateHeaderCheckboxCellState(checkboxCol, 0, checked);
91
91
  for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) setCellCheckboxStateByAttribute(checkboxCol, row, checked, subTable);
92
92
  }
93
- }
94
- //# sourceMappingURL=checkbox.js.map
93
+ }
@@ -123,4 +123,5 @@ export class ConfigManager {
123
123
  release() {
124
124
  this.isRowExpanded = () => !1, this.table = null, this.pluginOptions = null;
125
125
  }
126
- }
126
+ }
127
+ //# sourceMappingURL=config.js.map
@@ -49,4 +49,4 @@ export function setCellCheckboxStateByAttribute(col, row, checked, table) {
49
49
  }));
50
50
  }));
51
51
  }
52
- //# sourceMappingURL=utils.js.map
52
+ //# sourceMappingURL=utils.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vtable-plugins",
3
- "version": "1.22.7-alpha.5",
3
+ "version": "1.22.7-alpha.7",
4
4
  "description": "The search util of VTable",
5
5
  "author": {
6
6
  "name": "VisActor",
@@ -42,8 +42,8 @@
42
42
  "@types/file-saver": "2.0.7"
43
43
  },
44
44
  "peerDependencies": {
45
- "@visactor/vtable": "1.22.7-alpha.5",
46
- "@visactor/vtable-gantt": "1.22.7-alpha.5"
45
+ "@visactor/vtable-gantt": "1.22.7-alpha.7",
46
+ "@visactor/vtable": "1.22.7-alpha.7"
47
47
  },
48
48
  "peerDependenciesMeta": {
49
49
  "@visactor/vtable-gantt": {
@@ -53,10 +53,10 @@
53
53
  "devDependencies": {
54
54
  "cross-env": "^7.0.3",
55
55
  "increase-memory-limit": "^1.0.7",
56
- "@visactor/vtable": "1.22.7-alpha.5",
57
- "@visactor/vtable-editors": "1.22.7-alpha.5",
58
- "@visactor/vtable-gantt": "1.22.7-alpha.5",
59
- "@visactor/vchart": "2.0.11-alpha.3",
56
+ "@visactor/vtable": "1.22.7-alpha.7",
57
+ "@visactor/vtable-editors": "1.22.7-alpha.7",
58
+ "@visactor/vtable-gantt": "1.22.7-alpha.7",
59
+ "@visactor/vchart": "2.0.8-alpha.5",
60
60
  "@rushstack/eslint-patch": "~1.1.4",
61
61
  "react": "^18.0.0",
62
62
  "react-dom": "^18.0.0",
@@ -98,8 +98,8 @@
98
98
  "@types/react-is": "^17.0.3",
99
99
  "rollup-plugin-node-resolve": "5.2.0",
100
100
  "@types/lodash": "4.14.182",
101
- "@internal/bundler": "0.0.1",
102
101
  "@internal/ts-config": "0.0.1",
102
+ "@internal/bundler": "0.0.1",
103
103
  "@internal/eslint-config": "0.0.1"
104
104
  },
105
105
  "scripts": {