@visactor/vtable-plugins 1.22.6 → 1.22.7-alpha.1

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 (65) hide show
  1. package/cjs/auto-fill/date-tools.js +1 -2
  2. package/cjs/contextmenu/index.js +2 -1
  3. package/cjs/filter/condition-filter.d.ts +12 -2
  4. package/cjs/filter/condition-filter.js +40 -144
  5. package/cjs/filter/condition-filter.js.map +1 -1
  6. package/cjs/filter/constants.d.ts +7 -0
  7. package/cjs/filter/constants.js +124 -0
  8. package/cjs/filter/constants.js.map +1 -0
  9. package/cjs/filter/filter-state-manager.d.ts +14 -0
  10. package/cjs/filter/filter-state-manager.js +35 -1
  11. package/cjs/filter/filter-state-manager.js.map +1 -1
  12. package/cjs/filter/filter-toolbar.d.ts +9 -4
  13. package/cjs/filter/filter-toolbar.js +54 -32
  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 +30 -14
  17. package/cjs/filter/filter.js.map +1 -1
  18. package/cjs/filter/styles.d.ts +2 -124
  19. package/cjs/filter/styles.js.map +1 -1
  20. package/cjs/filter/types.d.ts +33 -0
  21. package/cjs/filter/types.js.map +1 -1
  22. package/cjs/filter/value-filter.d.ts +23 -15
  23. package/cjs/filter/value-filter.js +247 -116
  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/gantt-export-image.js.map +1 -1
  28. package/cjs/master-detail-plugin/checkbox.js +0 -1
  29. package/cjs/master-detail-plugin/config.js +2 -1
  30. package/cjs/master-detail-plugin/config.js.map +1 -1
  31. package/cjs/master-detail-plugin/utils.js +1 -1
  32. package/dist/vtable-plugins.js +10105 -320
  33. package/dist/vtable-plugins.min.js +3 -3
  34. package/es/auto-fill/date-tools.js +1 -2
  35. package/es/contextmenu/index.js +2 -1
  36. package/es/filter/condition-filter.d.ts +12 -2
  37. package/es/filter/condition-filter.js +39 -141
  38. package/es/filter/condition-filter.js.map +1 -1
  39. package/es/filter/constants.d.ts +7 -0
  40. package/es/filter/constants.js +120 -0
  41. package/es/filter/constants.js.map +1 -0
  42. package/es/filter/filter-state-manager.d.ts +14 -0
  43. package/es/filter/filter-state-manager.js +35 -1
  44. package/es/filter/filter-state-manager.js.map +1 -1
  45. package/es/filter/filter-toolbar.d.ts +9 -4
  46. package/es/filter/filter-toolbar.js +57 -31
  47. package/es/filter/filter-toolbar.js.map +1 -1
  48. package/es/filter/filter.d.ts +2 -0
  49. package/es/filter/filter.js +36 -15
  50. package/es/filter/filter.js.map +1 -1
  51. package/es/filter/styles.d.ts +2 -124
  52. package/es/filter/styles.js.map +1 -1
  53. package/es/filter/types.d.ts +33 -0
  54. package/es/filter/types.js.map +1 -1
  55. package/es/filter/value-filter.d.ts +23 -15
  56. package/es/filter/value-filter.js +250 -118
  57. package/es/filter/value-filter.js.map +1 -1
  58. package/es/focus-highlight.js +1 -1
  59. package/es/focus-highlight.js.map +1 -1
  60. package/es/gantt-export-image.js.map +1 -1
  61. package/es/master-detail-plugin/checkbox.js +1 -2
  62. package/es/master-detail-plugin/config.js +2 -1
  63. package/es/master-detail-plugin/config.js.map +1 -1
  64. package/es/master-detail-plugin/utils.js +1 -1
  65. package/package.json +8 -8
@@ -1,126 +1,4 @@
1
- export declare const filterStyles: {
2
- filterMenu: {
3
- display: string;
4
- position: string;
5
- backgroundColor: string;
6
- border: string;
7
- boxShadow: string;
8
- zIndex: string;
9
- };
10
- filterPanel: {
11
- padding: string;
12
- display: string;
13
- };
14
- searchContainer: {
15
- padding: string;
16
- };
17
- searchInput: {
18
- width: string;
19
- padding: string;
20
- border: string;
21
- borderRadius: string;
22
- fontSize: string;
23
- boxSizing: string;
24
- };
25
- optionsContainer: {
26
- maxHeight: string;
27
- overflowY: string;
28
- marginTop: string;
29
- };
30
- optionItem: {
31
- display: string;
32
- justifyContent: string;
33
- alignItems: string;
34
- padding: string;
35
- };
36
- optionLabel: {
37
- display: string;
38
- alignItems: string;
39
- cursor: string;
40
- flexGrow: string;
41
- fontWeight: string;
42
- };
43
- checkbox: {
44
- marginRight: string;
45
- };
46
- countSpan: {
47
- color: string;
48
- fontSize: string;
49
- };
50
- tabsContainer: {
51
- display: string;
52
- justifyContent: string;
53
- borderBottom: string;
54
- };
55
- tabStyle: (isActive: boolean) => {
56
- backgroundColor: string;
57
- border: string;
58
- flex: string;
59
- padding: string;
60
- cursor: string;
61
- fontSize: string;
62
- fontWeight: string;
63
- color: string;
64
- borderBottom: string;
65
- };
66
- footerContainer: {
67
- display: string;
68
- justifyContent: string;
69
- alignItems: string;
70
- padding: string;
71
- borderTop: string;
72
- backgroundColor: string;
73
- };
74
- footerButton: (isPrimary: boolean) => {
75
- padding: string;
76
- border: string;
77
- borderRadius: string;
78
- cursor: string;
79
- marginLeft: string;
80
- backgroundColor: string;
81
- color: string;
82
- borderColor: string;
83
- };
84
- clearLink: {
85
- color: string;
86
- textDecoration: string;
87
- };
88
- buttonStyle: (isPrimary?: boolean) => {
89
- padding: string;
90
- border: string;
91
- borderRadius: string;
92
- cursor: string;
93
- marginLeft: string;
94
- backgroundColor: string;
95
- color: string;
96
- borderColor: string;
97
- };
98
- conditionContainer: {
99
- marginBottom: string;
100
- padding: string;
101
- };
102
- formLabel: {
103
- display: string;
104
- marginBottom: string;
105
- fontWeight: string;
106
- };
107
- operatorSelect: {
108
- width: string;
109
- padding: string;
110
- marginBottom: string;
111
- border: string;
112
- borderRadius: string;
113
- boxSizing: string;
114
- };
115
- rangeInputContainer: {
116
- display: string;
117
- alignItems: string;
118
- gap: string;
119
- };
120
- addLabel: {
121
- display: string;
122
- padding: string;
123
- };
124
- };
1
+ import type { FilterStyles } from './types';
2
+ export declare const filterStyles: FilterStyles;
125
3
  export declare function applyStyles(element: HTMLElement, styles: Record<string, string>): void;
126
4
  export declare function createElement<K extends keyof HTMLElementTagNameMap>(tag: K, attributes?: Record<string, string>, children?: (HTMLElement | string)[]): HTMLElementTagNameMap[K];
@@ -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 */\n\nimport type { FilterStyles } from './types';\n\nexport const filterStyles: 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"]}
@@ -6,6 +6,9 @@ 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
+ syncCheckboxCheckedState?: boolean;
9
12
  }
10
13
  export type FilterMode = 'byValue' | 'byCondition';
11
14
  export interface FilterState {
@@ -53,4 +56,34 @@ export declare enum FilterOperatorCategory {
53
56
  CHECKBOX = "checkbox",
54
57
  RADIO = "radio"
55
58
  }
59
+ export interface FilterOperatorCategoryOption {
60
+ value: FilterOperatorCategory;
61
+ label: string;
62
+ }
63
+ interface StaticStyles {
64
+ filterMenu?: Record<string, string>;
65
+ filterPanel?: Record<string, string>;
66
+ searchContainer?: Record<string, string>;
67
+ searchInput?: Record<string, string>;
68
+ optionsContainer?: Record<string, string>;
69
+ optionItem?: Record<string, string>;
70
+ optionLabel?: Record<string, string>;
71
+ checkbox?: Record<string, string>;
72
+ countSpan?: Record<string, string>;
73
+ tabsContainer?: Record<string, string>;
74
+ footerContainer?: Record<string, string>;
75
+ clearLink?: Record<string, string>;
76
+ conditionContainer?: Record<string, string>;
77
+ formLabel?: Record<string, string>;
78
+ operatorSelect?: Record<string, string>;
79
+ rangeInputContainer?: Record<string, string>;
80
+ addLabel?: Record<string, string>;
81
+ }
82
+ interface FunctionStyles {
83
+ tabStyle?: (isActive: boolean) => Record<string, string>;
84
+ footerButton?: (isPrimary: boolean) => Record<string, string>;
85
+ buttonStyle?: (isPrimary?: boolean) => Record<string, string>;
86
+ }
87
+ export type FilterStyles = StaticStyles & FunctionStyles;
56
88
  export type FilterListener = (state: FilterState, action?: FilterAction) => void;
89
+ 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":"AA2CA,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 // customFilterData?: (dataSource: any[]) => boolean;\n /** 多个筛选器之间是否联动\n * @default true\n */\n syncCheckboxCheckedState?: boolean;\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 interface FilterOperatorCategoryOption {\n value: FilterOperatorCategory;\n label: string;\n}\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\n// 事件监听类型\nexport type FilterListener = (state: FilterState, action?: FilterAction) => void;\n"]}
@@ -1,37 +1,45 @@
1
- import { ListTable, PivotTable } from '@visactor/vtable';
1
+ import type { ListTable, PivotTable } from '@visactor/vtable';
2
+ import type { FilterConfig, FilterStyles, FilterOptions } 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;
9
+ private uniqueKeys;
10
+ private displayToRawValueMap;
6
11
  private selectedField;
7
- private selectedKeys;
8
- private candidateKeys;
9
- private formatFnCache;
10
- private toUnformattedCache;
11
12
  private valueFilterOptionList;
12
13
  private filterByValuePanel;
14
+ private searchContainer;
15
+ private optionsContainer;
16
+ private selectAllItemDiv;
17
+ private selectAllLabel;
13
18
  private filterByValueSearchInput;
14
19
  private selectAllCheckbox;
15
- private totalCountSpan;
16
20
  private filterItemsContainer;
17
- private _onInputKeyUpHandler;
18
- private _onCheckboxChangeHandler;
19
- constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager);
21
+ constructor(table: ListTable | PivotTable, filterStateManager: FilterStateManager, pluginOptions: FilterOptions);
22
+ updateUI(filterState: FilterConfig): void;
20
23
  setSelectedField(fieldId: string | number): void;
21
- private getFormatFnCache;
22
- private collectCandidateKeysForUnfilteredColumn;
23
- private collectCandidateKeysForFilteredColumn;
24
+ collectUniqueColumnValues(fieldId: string | number, forceCollect?: boolean): void;
25
+ private updateCandidateCounts;
26
+ private onValueSelect;
27
+ private isValueVisible;
24
28
  private toggleSelectAll;
25
- private syncSelectAllCheckbox;
26
29
  private onSearch;
27
30
  private initFilterStateFromTableData;
31
+ private syncCheckboxesWithFilterState;
32
+ private syncSelectAllWithFilterState;
28
33
  applyFilter(fieldId?: string | number): void;
29
34
  clearFilter(fieldId: string | number): void;
30
35
  render(container: HTMLElement): void;
36
+ updatePluginOptions(pluginOptions: FilterOptions): void;
37
+ updateStyles(styles: FilterStyles): void;
31
38
  private renderFilterOptions;
32
- private bindEventForFilterByValue;
39
+ bindEventForFilterByValue(): void;
40
+ updateCheckboxUI(field: string | number): void;
41
+ updateCheckboxState(field: string | number): void;
33
42
  show(): void;
34
43
  hide(): void;
35
44
  clearSearchInputValue(): void;
36
- destroy(): void;
37
45
  }