@visactor/vtable-plugins 1.19.9-alpha.2 → 1.20.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/README.md +7 -4
  2. package/cjs/add-row-column.d.ts +2 -2
  3. package/cjs/add-row-column.js +3 -3
  4. package/cjs/add-row-column.js.map +1 -1
  5. package/cjs/auto-fill/auto-fill-helper.d.ts +23 -0
  6. package/cjs/auto-fill/auto-fill-helper.js +83 -0
  7. package/cjs/auto-fill/auto-fill-helper.js.map +1 -0
  8. package/cjs/auto-fill/auto-fill-manager.d.ts +26 -0
  9. package/cjs/auto-fill/auto-fill-manager.js +244 -0
  10. package/cjs/auto-fill/auto-fill-manager.js.map +1 -0
  11. package/cjs/auto-fill/auto-fill-services.d.ts +12 -0
  12. package/cjs/auto-fill/auto-fill-services.js +27 -0
  13. package/cjs/auto-fill/auto-fill-services.js.map +1 -0
  14. package/cjs/auto-fill/date-tools.d.ts +5 -0
  15. package/cjs/auto-fill/date-tools.js +37 -0
  16. package/cjs/auto-fill/date-tools.js.map +1 -0
  17. package/cjs/auto-fill/index.d.ts +21 -0
  18. package/cjs/auto-fill/index.js +52 -0
  19. package/cjs/auto-fill/index.js.map +1 -0
  20. package/cjs/auto-fill/rules.d.ts +10 -0
  21. package/cjs/auto-fill/rules.js +196 -0
  22. package/cjs/auto-fill/rules.js.map +1 -0
  23. package/cjs/auto-fill/series-converters.d.ts +27 -0
  24. package/cjs/auto-fill/series-converters.js +90 -0
  25. package/cjs/auto-fill/series-converters.js.map +1 -0
  26. package/cjs/auto-fill/types.d.ts +67 -0
  27. package/cjs/auto-fill/types.js +20 -0
  28. package/cjs/auto-fill/types.js.map +1 -0
  29. package/cjs/auto-fill/utils/date.d.ts +5 -0
  30. package/cjs/auto-fill/utils/date.js +76 -0
  31. package/cjs/auto-fill/utils/date.js.map +1 -0
  32. package/cjs/auto-fill/utils/fill.d.ts +82 -0
  33. package/cjs/auto-fill/utils/fill.js +361 -0
  34. package/cjs/auto-fill/utils/fill.js.map +1 -0
  35. package/cjs/carousel-animation.d.ts +1 -1
  36. package/cjs/carousel-animation.js.map +1 -1
  37. package/cjs/column-series.js +1 -1
  38. package/cjs/column-series.js.map +1 -1
  39. package/cjs/context-menu.d.ts +34 -0
  40. package/cjs/context-menu.js +157 -0
  41. package/cjs/context-menu.js.map +1 -0
  42. package/cjs/contextmenu/handle-menu-helper.d.ts +23 -0
  43. package/cjs/contextmenu/handle-menu-helper.js +107 -0
  44. package/cjs/contextmenu/handle-menu-helper.js.map +1 -0
  45. package/cjs/contextmenu/index.d.ts +3 -0
  46. package/cjs/contextmenu/index.js +22 -0
  47. package/cjs/contextmenu/index.js.map +1 -0
  48. package/cjs/contextmenu/menu-manager.d.ts +27 -0
  49. package/cjs/contextmenu/menu-manager.js +139 -0
  50. package/cjs/contextmenu/menu-manager.js.map +1 -0
  51. package/cjs/contextmenu/styles.d.ts +106 -0
  52. package/cjs/contextmenu/styles.js +195 -0
  53. package/cjs/contextmenu/styles.js.map +1 -0
  54. package/cjs/contextmenu/types.d.ts +69 -0
  55. package/cjs/contextmenu/types.js +122 -0
  56. package/cjs/contextmenu/types.js.map +1 -0
  57. package/cjs/excel-edit-cell-keyboard.js +2 -2
  58. package/cjs/excel-edit-cell-keyboard.js.map +1 -1
  59. package/cjs/excel-import.js +8 -8
  60. package/cjs/excel-import.js.map +1 -1
  61. package/cjs/fillHandleUtils/autoFillHandle.js.map +1 -1
  62. package/cjs/fillHandleUtils/translateRowObj.js.map +1 -1
  63. package/cjs/filter/condition-filter.d.ts +30 -0
  64. package/cjs/filter/condition-filter.js +271 -0
  65. package/cjs/filter/condition-filter.js.map +1 -0
  66. package/cjs/filter/filter-engine.d.ts +13 -0
  67. package/cjs/filter/filter-engine.js +102 -0
  68. package/cjs/filter/filter-engine.js.map +1 -0
  69. package/cjs/filter/filter-state-manager.d.ts +21 -0
  70. package/cjs/filter/filter-state-manager.js +102 -0
  71. package/cjs/filter/filter-state-manager.js.map +1 -0
  72. package/cjs/filter/filter-toolbar.d.ts +31 -0
  73. package/cjs/filter/filter-toolbar.js +98 -0
  74. package/cjs/filter/filter-toolbar.js.map +1 -0
  75. package/cjs/filter/filter.d.ts +26 -0
  76. package/cjs/filter/filter.js +150 -0
  77. package/cjs/filter/filter.js.map +1 -0
  78. package/cjs/filter/index.d.ts +7 -0
  79. package/cjs/filter/index.js +66 -0
  80. package/cjs/filter/index.js.map +1 -0
  81. package/cjs/filter/styles.d.ts +126 -0
  82. package/cjs/filter/styles.js +145 -0
  83. package/cjs/filter/styles.js.map +1 -0
  84. package/cjs/filter/types.d.ts +55 -0
  85. package/cjs/filter/types.js +18 -0
  86. package/cjs/filter/types.js.map +1 -0
  87. package/cjs/filter/value-filter.d.ts +31 -0
  88. package/cjs/filter/value-filter.js +280 -0
  89. package/cjs/filter/value-filter.js.map +1 -0
  90. package/cjs/focus-highlight.js +1 -1
  91. package/cjs/focus-highlight.js.map +1 -1
  92. package/cjs/gantt-export-image.js.map +1 -1
  93. package/cjs/header-highlight.js.map +1 -1
  94. package/cjs/highlight-header-when-select-cell.d.ts +1 -2
  95. package/cjs/highlight-header-when-select-cell.js +1 -1
  96. package/cjs/highlight-header-when-select-cell.js.map +1 -1
  97. package/cjs/index.d.ts +4 -0
  98. package/cjs/index.js +3 -1
  99. package/cjs/index.js.map +1 -1
  100. package/cjs/invert-highlight.js.map +1 -1
  101. package/cjs/paste-add-row-column.d.ts +1 -0
  102. package/cjs/paste-add-row-column.js +3 -2
  103. package/cjs/paste-add-row-column.js.map +1 -1
  104. package/cjs/rotate-table.js +1 -1
  105. package/cjs/rotate-table.js.map +1 -1
  106. package/cjs/row-series.js +1 -1
  107. package/cjs/row-series.js.map +1 -1
  108. package/cjs/table-carousel-animation.js +2 -3
  109. package/cjs/table-carousel-animation.js.map +1 -1
  110. package/cjs/table-export/csv/index.js +1 -1
  111. package/cjs/table-export/csv/index.js.map +1 -1
  112. package/cjs/table-export/excel/index.js +0 -1
  113. package/cjs/table-export/excel/index.js.map +1 -1
  114. package/cjs/table-export/excel/style.js.map +1 -1
  115. package/cjs/table-export/index.js.map +1 -1
  116. package/cjs/table-export/util/color.js.map +1 -1
  117. package/cjs/table-export/util/download.js.map +1 -1
  118. package/cjs/table-export/util/encode.js.map +1 -1
  119. package/cjs/table-export/util/indent.js.map +1 -1
  120. package/cjs/table-export/util/pagination.js.map +1 -1
  121. package/cjs/table-export/util/promise.js.map +1 -1
  122. package/cjs/table-export/util/type.js +1 -1
  123. package/cjs/table-export/util/type.js.map +1 -1
  124. package/cjs/table-export.js +1 -2
  125. package/cjs/table-export.js.map +1 -1
  126. package/cjs/table-series-number.d.ts +41 -0
  127. package/cjs/table-series-number.js +261 -0
  128. package/cjs/table-series-number.js.map +1 -0
  129. package/cjs/types.d.ts +1 -0
  130. package/cjs/types.js +17 -1
  131. package/cjs/types.js.map +1 -1
  132. package/cjs/wps-fill-handle.js +1 -1
  133. package/cjs/wps-fill-handle.js.map +1 -1
  134. package/dist/vtable-plugins.js +7594 -1492
  135. package/dist/vtable-plugins.min.js +14 -14
  136. package/es/add-row-column.d.ts +2 -2
  137. package/es/add-row-column.js +3 -3
  138. package/es/add-row-column.js.map +1 -1
  139. package/es/auto-fill/auto-fill-helper.d.ts +23 -0
  140. package/es/auto-fill/auto-fill-helper.js +75 -0
  141. package/es/auto-fill/auto-fill-helper.js.map +1 -0
  142. package/es/auto-fill/auto-fill-manager.d.ts +26 -0
  143. package/es/auto-fill/auto-fill-manager.js +218 -0
  144. package/es/auto-fill/auto-fill-manager.js.map +1 -0
  145. package/es/auto-fill/auto-fill-services.d.ts +12 -0
  146. package/es/auto-fill/auto-fill-services.js +19 -0
  147. package/es/auto-fill/auto-fill-services.js.map +1 -0
  148. package/es/auto-fill/date-tools.d.ts +5 -0
  149. package/es/auto-fill/date-tools.js +29 -0
  150. package/es/auto-fill/date-tools.js.map +1 -0
  151. package/es/auto-fill/index.d.ts +21 -0
  152. package/es/auto-fill/index.js +21 -0
  153. package/es/auto-fill/index.js.map +1 -0
  154. package/es/auto-fill/rules.d.ts +10 -0
  155. package/es/auto-fill/rules.js +203 -0
  156. package/es/auto-fill/rules.js.map +1 -0
  157. package/es/auto-fill/series-converters.d.ts +27 -0
  158. package/es/auto-fill/series-converters.js +83 -0
  159. package/es/auto-fill/series-converters.js.map +1 -0
  160. package/es/auto-fill/types.d.ts +67 -0
  161. package/es/auto-fill/types.js +27 -0
  162. package/es/auto-fill/types.js.map +1 -0
  163. package/es/auto-fill/utils/date.d.ts +5 -0
  164. package/es/auto-fill/utils/date.js +68 -0
  165. package/es/auto-fill/utils/date.js.map +1 -0
  166. package/es/auto-fill/utils/fill.d.ts +82 -0
  167. package/es/auto-fill/utils/fill.js +347 -0
  168. package/es/auto-fill/utils/fill.js.map +1 -0
  169. package/es/carousel-animation.d.ts +1 -1
  170. package/es/carousel-animation.js.map +1 -1
  171. package/es/column-series.js +1 -1
  172. package/es/column-series.js.map +1 -1
  173. package/es/context-menu.d.ts +34 -0
  174. package/es/context-menu.js +129 -0
  175. package/es/context-menu.js.map +1 -0
  176. package/es/contextmenu/handle-menu-helper.d.ts +23 -0
  177. package/es/contextmenu/handle-menu-helper.js +99 -0
  178. package/es/contextmenu/handle-menu-helper.js.map +1 -0
  179. package/es/contextmenu/index.d.ts +3 -0
  180. package/es/contextmenu/index.js +6 -0
  181. package/es/contextmenu/index.js.map +1 -0
  182. package/es/contextmenu/menu-manager.d.ts +27 -0
  183. package/es/contextmenu/menu-manager.js +130 -0
  184. package/es/contextmenu/menu-manager.js.map +1 -0
  185. package/es/contextmenu/styles.d.ts +106 -0
  186. package/es/contextmenu/styles.js +197 -0
  187. package/es/contextmenu/styles.js.map +1 -0
  188. package/es/contextmenu/types.d.ts +69 -0
  189. package/es/contextmenu/types.js +121 -0
  190. package/es/contextmenu/types.js.map +1 -0
  191. package/es/excel-edit-cell-keyboard.js +2 -2
  192. package/es/excel-edit-cell-keyboard.js.map +1 -1
  193. package/es/excel-import.js +8 -8
  194. package/es/excel-import.js.map +1 -1
  195. package/es/fillHandleUtils/autoFillHandle.js.map +1 -1
  196. package/es/fillHandleUtils/translateRowObj.js.map +1 -1
  197. package/es/filter/condition-filter.d.ts +30 -0
  198. package/es/filter/condition-filter.js +262 -0
  199. package/es/filter/condition-filter.js.map +1 -0
  200. package/es/filter/filter-engine.d.ts +13 -0
  201. package/es/filter/filter-engine.js +94 -0
  202. package/es/filter/filter-engine.js.map +1 -0
  203. package/es/filter/filter-state-manager.d.ts +21 -0
  204. package/es/filter/filter-state-manager.js +94 -0
  205. package/es/filter/filter-state-manager.js.map +1 -0
  206. package/es/filter/filter-toolbar.d.ts +31 -0
  207. package/es/filter/filter-toolbar.js +90 -0
  208. package/es/filter/filter-toolbar.js.map +1 -0
  209. package/es/filter/filter.d.ts +26 -0
  210. package/es/filter/filter.js +125 -0
  211. package/es/filter/filter.js.map +1 -0
  212. package/es/filter/index.d.ts +7 -0
  213. package/es/filter/index.js +14 -0
  214. package/es/filter/index.js.map +1 -0
  215. package/es/filter/styles.d.ts +126 -0
  216. package/es/filter/styles.js +140 -0
  217. package/es/filter/styles.js.map +1 -0
  218. package/es/filter/types.d.ts +55 -0
  219. package/es/filter/types.js +17 -0
  220. package/es/filter/types.js.map +1 -0
  221. package/es/filter/value-filter.d.ts +31 -0
  222. package/es/filter/value-filter.js +275 -0
  223. package/es/filter/value-filter.js.map +1 -0
  224. package/es/focus-highlight.js +1 -1
  225. package/es/focus-highlight.js.map +1 -1
  226. package/es/gantt-export-image.js.map +1 -1
  227. package/es/header-highlight.js.map +1 -1
  228. package/es/highlight-header-when-select-cell.d.ts +1 -2
  229. package/es/highlight-header-when-select-cell.js +1 -1
  230. package/es/highlight-header-when-select-cell.js.map +1 -1
  231. package/es/index.d.ts +4 -0
  232. package/es/index.js +8 -0
  233. package/es/index.js.map +1 -1
  234. package/es/invert-highlight.js.map +1 -1
  235. package/es/paste-add-row-column.d.ts +1 -0
  236. package/es/paste-add-row-column.js +3 -2
  237. package/es/paste-add-row-column.js.map +1 -1
  238. package/es/rotate-table.js +1 -1
  239. package/es/rotate-table.js.map +1 -1
  240. package/es/row-series.js +1 -1
  241. package/es/row-series.js.map +1 -1
  242. package/es/table-carousel-animation.js +3 -3
  243. package/es/table-carousel-animation.js.map +1 -1
  244. package/es/table-export/csv/index.js +1 -1
  245. package/es/table-export/csv/index.js.map +1 -1
  246. package/es/table-export/excel/index.js +1 -2
  247. package/es/table-export/excel/index.js.map +1 -1
  248. package/es/table-export/excel/style.js.map +1 -1
  249. package/es/table-export/index.js.map +1 -1
  250. package/es/table-export/util/color.js.map +1 -1
  251. package/es/table-export/util/download.js.map +1 -1
  252. package/es/table-export/util/encode.js.map +1 -1
  253. package/es/table-export/util/indent.js.map +1 -1
  254. package/es/table-export/util/pagination.js.map +1 -1
  255. package/es/table-export/util/promise.js.map +1 -1
  256. package/es/table-export/util/type.js +1 -1
  257. package/es/table-export/util/type.js.map +1 -1
  258. package/es/table-export.js +1 -2
  259. package/es/table-export.js.map +1 -1
  260. package/es/table-series-number.d.ts +41 -0
  261. package/es/table-series-number.js +253 -0
  262. package/es/table-series-number.js.map +1 -0
  263. package/es/types.d.ts +1 -0
  264. package/es/types.js +2 -1
  265. package/es/types.js.map +1 -1
  266. package/es/wps-fill-handle.js +1 -1
  267. package/es/wps-fill-handle.js.map +1 -1
  268. package/package.json +8 -8
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+
3
+ function applyStyles(element, styles) {
4
+ Object.entries(styles).forEach((([prop, value]) => {
5
+ element.style[prop] = value;
6
+ }));
7
+ }
8
+
9
+ function createElement(tag, attributes = {}, children = []) {
10
+ const element = document.createElement(tag);
11
+ return Object.entries(attributes).forEach((([key, value]) => {
12
+ element.setAttribute(key, value);
13
+ })), children.forEach((child => {
14
+ "string" == typeof child ? element.appendChild(document.createTextNode(child)) : element.appendChild(child);
15
+ })), element;
16
+ }
17
+
18
+ Object.defineProperty(exports, "__esModule", {
19
+ value: !0
20
+ }), exports.createElement = exports.applyStyles = exports.filterStyles = void 0,
21
+ exports.filterStyles = {
22
+ filterMenu: {
23
+ display: "none",
24
+ position: "absolute",
25
+ backgroundColor: "white",
26
+ border: "1px solid #ccc",
27
+ boxShadow: "0 4px 8px rgba(0,0,0,0.15)",
28
+ zIndex: "100"
29
+ },
30
+ filterPanel: {
31
+ padding: "10px",
32
+ display: "block"
33
+ },
34
+ searchContainer: {
35
+ padding: "5px"
36
+ },
37
+ searchInput: {
38
+ width: "100%",
39
+ padding: "8px 10px",
40
+ border: "1px solid #ccc",
41
+ borderRadius: "4px",
42
+ fontSize: "14px",
43
+ boxSizing: "border-box"
44
+ },
45
+ optionsContainer: {
46
+ maxHeight: "200px",
47
+ overflowY: "auto",
48
+ marginTop: "10px"
49
+ },
50
+ optionItem: {
51
+ display: "flex",
52
+ justifyContent: "space-between",
53
+ alignItems: "center",
54
+ padding: "8px 5px"
55
+ },
56
+ optionLabel: {
57
+ display: "flex",
58
+ alignItems: "center",
59
+ cursor: "pointer",
60
+ flexGrow: "1",
61
+ fontWeight: "normal"
62
+ },
63
+ checkbox: {
64
+ marginRight: "10px"
65
+ },
66
+ countSpan: {
67
+ color: "#888",
68
+ fontSize: "12px"
69
+ },
70
+ tabsContainer: {
71
+ display: "flex",
72
+ justifyContent: "space-around",
73
+ borderBottom: "1px solid #e0e0e0"
74
+ },
75
+ tabStyle: isActive => ({
76
+ backgroundColor: "transparent",
77
+ border: "none",
78
+ flex: "1",
79
+ padding: "10px 15px",
80
+ cursor: "pointer",
81
+ fontSize: "14px",
82
+ fontWeight: isActive ? "bold" : "normal",
83
+ color: isActive ? "#007bff" : "#666",
84
+ borderBottom: isActive ? "3px solid #007bff" : "2px solid transparent"
85
+ }),
86
+ footerContainer: {
87
+ display: "flex",
88
+ justifyContent: "space-between",
89
+ alignItems: "center",
90
+ padding: "10px 15px",
91
+ borderTop: "1px solid #e0e0e0",
92
+ backgroundColor: "#f8f9fa"
93
+ },
94
+ footerButton: isPrimary => ({
95
+ padding: "6px 12px",
96
+ border: "1px solid #ccc",
97
+ borderRadius: "4px",
98
+ cursor: "pointer",
99
+ marginLeft: "5px",
100
+ backgroundColor: isPrimary ? "#007bff" : "white",
101
+ color: isPrimary ? "white" : "#333",
102
+ borderColor: isPrimary ? "#007bff" : "#ccc"
103
+ }),
104
+ clearLink: {
105
+ color: "#007bff",
106
+ textDecoration: "none"
107
+ },
108
+ buttonStyle: (isPrimary = !1) => ({
109
+ padding: "6px 12px",
110
+ border: "1px solid #ccc",
111
+ borderRadius: "4px",
112
+ cursor: "pointer",
113
+ marginLeft: "5px",
114
+ backgroundColor: isPrimary ? "#007bff" : "white",
115
+ color: isPrimary ? "white" : "#333",
116
+ borderColor: isPrimary ? "#007bff" : "#ccc"
117
+ }),
118
+ conditionContainer: {
119
+ marginBottom: "15px",
120
+ padding: "10px"
121
+ },
122
+ formLabel: {
123
+ display: "block",
124
+ marginBottom: "8px",
125
+ fontWeight: "bold"
126
+ },
127
+ operatorSelect: {
128
+ width: "100%",
129
+ padding: "8px",
130
+ marginBottom: "15px",
131
+ border: "1px solid #ccc",
132
+ borderRadius: "4px",
133
+ boxSizing: "border-box"
134
+ },
135
+ rangeInputContainer: {
136
+ display: "flex",
137
+ alignItems: "center",
138
+ gap: "8px"
139
+ },
140
+ addLabel: {
141
+ display: "none",
142
+ padding: "0 5px"
143
+ }
144
+ }, exports.applyStyles = applyStyles, exports.createElement = createElement;
145
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/filter/styles.ts"],"names":[],"mappings":";;;AAGa,QAAA,YAAY,GAAG;IAE1B,UAAU,EAAE;QACV,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,UAAU;QACpB,eAAe,EAAE,OAAO;QACxB,MAAM,EAAE,gBAAgB;QACxB,SAAS,EAAE,4BAA4B;QACvC,MAAM,EAAE,KAAK;KACd;IAGD,WAAW,EAAE;QACX,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,OAAO;KACjB;IAGD,eAAe,EAAE;QACf,OAAO,EAAE,KAAK;KACf;IAGD,WAAW,EAAE;QACX,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,gBAAgB;QACxB,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,YAAY;KACxB;IAGD,gBAAgB,EAAE;QAChB,SAAS,EAAE,OAAO;QAClB,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,MAAM;KAClB;IAGD,UAAU,EAAE;QACV,OAAO,EAAE,MAAM;QACf,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,SAAS;KACnB;IAGD,WAAW,EAAE;QACX,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,GAAG;QACb,UAAU,EAAE,QAAQ;KACrB;IAGD,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM;KACpB;IAGD,SAAS,EAAE;QACT,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;KACjB;IAGD,aAAa,EAAE;QACb,OAAO,EAAE,MAAM;QACf,cAAc,EAAE,cAAc;QAC9B,YAAY,EAAE,mBAAmB;KAClC;IAGD,QAAQ,EAAE,CAAC,QAAiB,EAAE,EAAE,CAAC,CAAC;QAChC,eAAe,EAAE,aAAa;QAC9B,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;QACxC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QACpC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,uBAAuB;KACvE,CAAC;IAGF,eAAe,EAAE;QACf,OAAO,EAAE,MAAM;QACf,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,mBAAmB;QAC9B,eAAe,EAAE,SAAS;KAC3B;IAED,YAAY,EAAE,CAAC,SAAkB,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,gBAAgB;QACxB,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,KAAK;QACjB,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QAChD,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACnC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;KAC5C,CAAC;IAGF,SAAS,EAAE;QACT,KAAK,EAAE,SAAS;QAChB,cAAc,EAAE,MAAM;KACvB;IAGD,WAAW,EAAE,CAAC,YAAqB,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,gBAAgB;QACxB,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,KAAK;QACjB,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QAChD,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACnC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;KAC5C,CAAC;IAKF,kBAAkB,EAAE;QAClB,YAAY,EAAE,MAAM;QACpB,OAAO,EAAE,MAAM;KAChB;IAGD,SAAS,EAAE;QACT,OAAO,EAAE,OAAO;QAChB,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,MAAM;KACnB;IAGD,cAAc,EAAE;QACd,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,KAAK;QACd,YAAY,EAAE,MAAM;QACpB,MAAM,EAAE,gBAAgB;QACxB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,YAAY;KACxB;IAED,mBAAmB,EAAE;QACnB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,GAAG,EAAE,KAAK;KACX;IAED,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,OAAO;KACjB;CACF,CAAC;AAKF,SAAgB,WAAW,CAAC,OAAoB,EAAE,MAA8B;IAC9E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QAC/C,OAAO,CAAC,KAAK,CAAC,IAAW,CAAC,GAAG,KAAK,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC;AAJD,kCAIC;AAKD,SAAgB,aAAa,CAC3B,GAAM,EACN,aAAqC,EAAE,EACvC,WAAqC,EAAE;IAEvC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAE5C,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAClD,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;SACrD;aAAM;YACL,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC5B;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AApBD,sCAoBC","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"]}
@@ -0,0 +1,55 @@
1
+ import type * as VTable from '@visactor/vtable';
2
+ export interface FilterOptions {
3
+ id?: string;
4
+ filterIcon?: VTable.TYPES.ColumnIconOption;
5
+ filteringIcon?: VTable.TYPES.ColumnIconOption;
6
+ enableFilter?: (field: number | string, column: VTable.TYPES.ColumnDefine) => boolean;
7
+ defaultEnabled?: boolean;
8
+ filterModes?: FilterMode[];
9
+ }
10
+ export type FilterMode = 'byValue' | 'byCondition';
11
+ export interface FilterState {
12
+ filters: Map<string | number, FilterConfig>;
13
+ }
14
+ export interface FilterConfig {
15
+ enable: boolean;
16
+ field: string | number;
17
+ type: 'byValue' | 'byCondition';
18
+ values?: any[];
19
+ operator?: FilterOperator;
20
+ condition?: any;
21
+ }
22
+ export declare enum FilterActionType {
23
+ ADD_FILTER = 0,
24
+ REMOVE_FILTER = 1,
25
+ UPDATE_FILTER = 2,
26
+ ENABLE_FILTER = 3,
27
+ DISABLE_FILTER = 4,
28
+ CLEAR_ALL_FILTERS = 5,
29
+ APPLY_FILTERS = 6
30
+ }
31
+ export interface FilterAction {
32
+ type: FilterActionType;
33
+ payload: any;
34
+ }
35
+ export interface ValueFilterOptionDom {
36
+ id: string;
37
+ originalValue: any;
38
+ itemContainer: HTMLDivElement;
39
+ checkbox: HTMLInputElement;
40
+ countSpan: HTMLSpanElement;
41
+ }
42
+ export type FilterOperator = 'equals' | 'notEquals' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between' | 'notBetween' | 'contains' | 'notContains' | 'startsWith' | 'notStartsWith' | 'endsWith' | 'notEndsWith' | 'isChecked' | 'isUnchecked';
43
+ export interface OperatorOption {
44
+ value: FilterOperator;
45
+ label: string;
46
+ category: FilterOperatorCategory;
47
+ }
48
+ export declare enum FilterOperatorCategory {
49
+ ALL = "all",
50
+ TEXT = "text",
51
+ NUMBER = "number",
52
+ COLOR = "color",
53
+ CHECKBOX = "checkbox",
54
+ RADIO = "radio"
55
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ var FilterActionType, FilterOperatorCategory;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: !0
7
+ }), exports.FilterOperatorCategory = exports.FilterActionType = void 0, function(FilterActionType) {
8
+ FilterActionType[FilterActionType.ADD_FILTER = 0] = "ADD_FILTER", FilterActionType[FilterActionType.REMOVE_FILTER = 1] = "REMOVE_FILTER",
9
+ FilterActionType[FilterActionType.UPDATE_FILTER = 2] = "UPDATE_FILTER", FilterActionType[FilterActionType.ENABLE_FILTER = 3] = "ENABLE_FILTER",
10
+ FilterActionType[FilterActionType.DISABLE_FILTER = 4] = "DISABLE_FILTER", FilterActionType[FilterActionType.CLEAR_ALL_FILTERS = 5] = "CLEAR_ALL_FILTERS",
11
+ FilterActionType[FilterActionType.APPLY_FILTERS = 6] = "APPLY_FILTERS";
12
+ }(FilterActionType = exports.FilterActionType || (exports.FilterActionType = {})),
13
+ function(FilterOperatorCategory) {
14
+ FilterOperatorCategory.ALL = "all", FilterOperatorCategory.TEXT = "text", FilterOperatorCategory.NUMBER = "number",
15
+ FilterOperatorCategory.COLOR = "color", FilterOperatorCategory.CHECKBOX = "checkbox",
16
+ FilterOperatorCategory.RADIO = "radio";
17
+ }(FilterOperatorCategory = exports.FilterOperatorCategory || (exports.FilterOperatorCategory = {}));
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/filter/types.ts"],"names":[],"mappings":";;;AAiCA,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,GAAhB,wBAAgB,KAAhB,wBAAgB,QAQ3B;AA2CD,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,GAAtB,8BAAsB,KAAtB,8BAAsB,QAOjC","file":"types.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\n\nexport interface FilterOptions {\n /** 筛选器 ID,用于唯一标识筛选器 */\n id?: string;\n /** 筛选器图标 */\n filterIcon?: VTable.TYPES.ColumnIconOption;\n /** 筛选器激活图标 */\n filteringIcon?: VTable.TYPES.ColumnIconOption;\n /** 筛选功能启用钩子函数,返回指定列是否启用筛选功能 */\n enableFilter?: (field: number | string, column: VTable.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"]}
@@ -0,0 +1,31 @@
1
+ import * as VTable from '@visactor/vtable';
2
+ import type { FilterStateManager } from './filter-state-manager';
3
+ export declare class ValueFilter {
4
+ private table;
5
+ private filterStateManager;
6
+ private uniqueKeys;
7
+ private displayToRawValueMap;
8
+ private selectedField;
9
+ private valueFilterOptionList;
10
+ private filterByValuePanel;
11
+ private filterByValueSearchInput;
12
+ private selectAllCheckbox;
13
+ private filterItemsContainer;
14
+ constructor(table: VTable.ListTable | VTable.PivotTable, filterStateManager: FilterStateManager);
15
+ private updateUI;
16
+ setSelectedField(fieldId: string | number): void;
17
+ collectUniqueColumnValues(fieldId: string | number): void;
18
+ private onValueSelect;
19
+ private toggleSelectAll;
20
+ private onSearch;
21
+ private initFilterStateFromTableData;
22
+ private syncCheckboxesWithFilterState;
23
+ private syncSelectAllWithFilterState;
24
+ applyFilter(fieldId?: string | number): void;
25
+ clearFilter(fieldId: string | number): void;
26
+ render(container: HTMLElement): void;
27
+ private renderFilterOptions;
28
+ bindEventForFilterByValue(): void;
29
+ show(): void;
30
+ hide(): void;
31
+ }
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.ValueFilter = void 0;
6
+
7
+ const vutils_1 = require("@visactor/vutils"), types_1 = require("./types"), styles_1 = require("./styles");
8
+
9
+ class ValueFilter {
10
+ constructor(table, filterStateManager) {
11
+ this.uniqueKeys = new Map, this.displayToRawValueMap = new Map, this.valueFilterOptionList = new Map,
12
+ this.table = table, this.filterStateManager = filterStateManager, this.filterStateManager.subscribe((state => {
13
+ const filterState = state.filters.get(this.selectedField);
14
+ filterState && "byValue" === filterState.type && this.updateUI(filterState);
15
+ }));
16
+ }
17
+ updateUI(filterState) {
18
+ this.syncCheckboxesWithFilterState(filterState), this.syncSelectAllWithFilterState(filterState);
19
+ }
20
+ setSelectedField(fieldId) {
21
+ this.selectedField = fieldId, this.collectUniqueColumnValues(fieldId);
22
+ }
23
+ collectUniqueColumnValues(fieldId) {
24
+ var _a;
25
+ const isEnable = null === (_a = this.filterStateManager.getFilterState(fieldId)) || void 0 === _a ? void 0 : _a.enable, displayValueMap = new Map, rawToDisplayMap = new Map, displayToRawMap = new Map;
26
+ let targetCol = -1, targetRow = -1;
27
+ for (let col = 0; col < this.table.colCount; col++) {
28
+ for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) if (!this.table.internalProps.layoutMap.isHeader(col, row)) {
29
+ const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);
30
+ if (bodyInfo && bodyInfo.field === fieldId) {
31
+ targetCol = col, targetRow = row;
32
+ break;
33
+ }
34
+ }
35
+ if (-1 !== targetCol) break;
36
+ }
37
+ if (isEnable) {
38
+ const records = this.table.internalProps.records, recordsLength = records.length;
39
+ for (let i = 0; i < recordsLength; i++) {
40
+ let rawValue, displayValue;
41
+ if (-1 !== targetCol) {
42
+ const row = this.table.columnHeaderLevelCount + i;
43
+ rawValue = records[i][fieldId];
44
+ const bodyInfo = this.table.internalProps.layoutMap.getBody(targetCol, row);
45
+ displayValue = bodyInfo && "fieldFormat" in bodyInfo && bodyInfo.fieldFormat && "function" == typeof bodyInfo.fieldFormat ? bodyInfo.fieldFormat({
46
+ [fieldId]: rawValue
47
+ }) : rawValue;
48
+ }
49
+ null != rawValue && (displayValueMap.set(displayValue, (displayValueMap.get(displayValue) || 0) + 1),
50
+ rawToDisplayMap.set(rawValue, displayValue), displayToRawMap.set(displayValue, rawValue));
51
+ }
52
+ } else {
53
+ const currentLength = this.table.internalProps.dataSource.length;
54
+ for (let i = 0; i < currentLength; i++) {
55
+ let rawValue, displayValue;
56
+ if (-1 !== targetCol) {
57
+ const row = this.table.columnHeaderLevelCount + i;
58
+ row < this.table.rowCount && (rawValue = this.table.getCellOriginValue(targetCol, row),
59
+ displayValue = this.table.getCellValue(targetCol, row));
60
+ } else rawValue = this.table.getFieldData(String(fieldId), -1 !== targetCol ? targetCol : 0, this.table.columnHeaderLevelCount + i),
61
+ displayValue = rawValue;
62
+ null != rawValue && (displayValueMap.set(displayValue, (displayValueMap.get(displayValue) || 0) + 1),
63
+ rawToDisplayMap.set(rawValue, displayValue), displayToRawMap.set(displayValue, rawValue));
64
+ }
65
+ }
66
+ this.displayToRawValueMap.set(fieldId, displayToRawMap);
67
+ const uniqueValues = Array.from(displayValueMap.entries()).map((([displayValue, count]) => ({
68
+ value: displayValue,
69
+ count: count,
70
+ rawValue: displayToRawMap.get(displayValue)
71
+ })));
72
+ this.uniqueKeys.set(fieldId, uniqueValues);
73
+ }
74
+ onValueSelect(fieldId, displayValue, selected) {
75
+ const displayToRawMap = this.displayToRawValueMap.get(fieldId), rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue, filter = this.filterStateManager.getFilterState(fieldId);
76
+ if (filter) {
77
+ const updatedValues = selected ? [ ...filter.values || [], rawValue ] : (filter.values || []).filter((v => v !== rawValue));
78
+ this.filterStateManager.dispatch({
79
+ type: types_1.FilterActionType.UPDATE_FILTER,
80
+ payload: {
81
+ field: fieldId,
82
+ values: updatedValues
83
+ }
84
+ });
85
+ } else this.filterStateManager.dispatch({
86
+ type: types_1.FilterActionType.ADD_FILTER,
87
+ payload: {
88
+ field: fieldId,
89
+ type: "byValue",
90
+ values: [ rawValue ]
91
+ }
92
+ });
93
+ }
94
+ toggleSelectAll(fieldId, selected) {
95
+ var _a;
96
+ const filter = this.filterStateManager.getFilterState(fieldId), rawValuesToUpdate = selected && (null === (_a = this.uniqueKeys.get(fieldId)) || void 0 === _a ? void 0 : _a.map((item => item.rawValue))) || [];
97
+ if (filter) {
98
+ const updatedValues = selected ? rawValuesToUpdate : [];
99
+ this.filterStateManager.dispatch({
100
+ type: types_1.FilterActionType.UPDATE_FILTER,
101
+ payload: {
102
+ field: fieldId,
103
+ values: updatedValues
104
+ }
105
+ });
106
+ } else this.filterStateManager.dispatch({
107
+ type: types_1.FilterActionType.ADD_FILTER,
108
+ payload: {
109
+ field: fieldId,
110
+ type: "byValue",
111
+ values: rawValuesToUpdate,
112
+ enable: !0
113
+ }
114
+ });
115
+ }
116
+ onSearch(fieldId, value) {
117
+ const filterKeywords = value.toUpperCase().split(" ").filter((s => s)), items = this.valueFilterOptionList.get(fieldId);
118
+ for (const item of items) {
119
+ const txtValue = item.id.toUpperCase() || "", match = filterKeywords.some((keyword => txtValue.includes(keyword)));
120
+ item.itemContainer.style.display = 0 === filterKeywords.length || match ? "flex" : "none";
121
+ }
122
+ }
123
+ initFilterStateFromTableData(fieldId) {
124
+ const filter = this.filterStateManager.getFilterState(fieldId), selectedRawValues = new Set, displayToRawMap = this.displayToRawValueMap.get(fieldId);
125
+ let targetCol = -1;
126
+ for (let col = 0; col < this.table.colCount; col++) {
127
+ for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) if (!this.table.internalProps.layoutMap.isHeader(col, row)) {
128
+ const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);
129
+ if (bodyInfo && bodyInfo.field === fieldId) {
130
+ targetCol = col;
131
+ break;
132
+ }
133
+ }
134
+ if (-1 !== targetCol) break;
135
+ }
136
+ const currentLength = this.table.internalProps.dataSource.length;
137
+ for (let i = 0; i < currentLength; i++) {
138
+ let displayValue, rawValue;
139
+ if (-1 !== targetCol) {
140
+ const row = this.table.columnHeaderLevelCount + i;
141
+ row < this.table.rowCount && (displayValue = this.table.getCellValue(targetCol, row),
142
+ rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue);
143
+ } else displayValue = this.table.getFieldData(String(fieldId), -1 !== targetCol ? targetCol : 0, this.table.columnHeaderLevelCount + i),
144
+ rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;
145
+ null != rawValue && selectedRawValues.add(rawValue);
146
+ }
147
+ (!filter || !(0, vutils_1.arrayEqual)(filter.values, Array.from(selectedRawValues))) && (filter ? this.filterStateManager.dispatch({
148
+ type: types_1.FilterActionType.UPDATE_FILTER,
149
+ payload: {
150
+ field: fieldId,
151
+ type: "byValue",
152
+ values: Array.from(selectedRawValues)
153
+ }
154
+ }) : this.filterStateManager.dispatch({
155
+ type: types_1.FilterActionType.ADD_FILTER,
156
+ payload: {
157
+ field: fieldId,
158
+ type: "byValue",
159
+ values: Array.from(selectedRawValues)
160
+ }
161
+ }));
162
+ }
163
+ syncCheckboxesWithFilterState(filter) {
164
+ if (!filter) return;
165
+ const selectedRawValues = filter.values || [], displayToRawMap = this.displayToRawValueMap.get(filter.field), optionDomList = this.valueFilterOptionList.get(filter.field);
166
+ null == optionDomList || optionDomList.forEach((optionDom => {
167
+ var _a, _b;
168
+ const displayValue = optionDom.originalValue, rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;
169
+ optionDom.checkbox.checked = selectedRawValues.some((v => v === rawValue));
170
+ const count = (null === (_b = null === (_a = this.uniqueKeys.get(filter.field)) || void 0 === _a ? void 0 : _a.find((key => String(key.value) === optionDom.id))) || void 0 === _b ? void 0 : _b.count) || 0;
171
+ optionDom.countSpan.textContent = String(count), optionDom.itemContainer.style.display = 0 === count ? "none" : "flex";
172
+ }));
173
+ }
174
+ syncSelectAllWithFilterState(filter) {
175
+ var _a;
176
+ if (!filter || !filter.values) return this.selectAllCheckbox.checked = !1, void (this.selectAllCheckbox.indeterminate = !1);
177
+ const uniqueValuesCount = (null === (_a = this.uniqueKeys.get(filter.field)) || void 0 === _a ? void 0 : _a.length) || 0;
178
+ 0 === uniqueValuesCount || 0 === filter.values.length ? (this.selectAllCheckbox.checked = !1,
179
+ this.selectAllCheckbox.indeterminate = !1) : filter.values.length === uniqueValuesCount ? (this.selectAllCheckbox.checked = !0,
180
+ this.selectAllCheckbox.indeterminate = !1) : (this.selectAllCheckbox.checked = !1,
181
+ this.selectAllCheckbox.indeterminate = !0);
182
+ }
183
+ applyFilter(fieldId = this.selectedField) {
184
+ var _a, _b;
185
+ const selectedKeys = (null === (_a = this.filterStateManager.getFilterState(fieldId)) || void 0 === _a ? void 0 : _a.values) || [];
186
+ selectedKeys.length > 0 && selectedKeys.length < (null === (_b = this.uniqueKeys.get(fieldId)) || void 0 === _b ? void 0 : _b.length) ? this.filterStateManager.dispatch({
187
+ type: types_1.FilterActionType.APPLY_FILTERS,
188
+ payload: {
189
+ field: fieldId,
190
+ type: "byValue",
191
+ values: selectedKeys,
192
+ enable: !0
193
+ }
194
+ }) : this.filterStateManager.dispatch({
195
+ type: types_1.FilterActionType.REMOVE_FILTER,
196
+ payload: {
197
+ field: fieldId
198
+ }
199
+ });
200
+ }
201
+ clearFilter(fieldId) {
202
+ this.filterStateManager.dispatch({
203
+ type: types_1.FilterActionType.REMOVE_FILTER,
204
+ payload: {
205
+ field: fieldId
206
+ }
207
+ }), this.hide();
208
+ }
209
+ render(container) {
210
+ this.filterByValuePanel = document.createElement("div"), (0, styles_1.applyStyles)(this.filterByValuePanel, styles_1.filterStyles.filterPanel);
211
+ const searchContainer = document.createElement("div");
212
+ (0, styles_1.applyStyles)(searchContainer, styles_1.filterStyles.searchContainer),
213
+ this.filterByValueSearchInput = document.createElement("input"), this.filterByValueSearchInput.type = "text",
214
+ this.filterByValueSearchInput.placeholder = "可使用空格分隔多个关键词", (0, styles_1.applyStyles)(this.filterByValueSearchInput, styles_1.filterStyles.searchInput),
215
+ searchContainer.appendChild(this.filterByValueSearchInput);
216
+ const optionsContainer = document.createElement("div");
217
+ (0, styles_1.applyStyles)(optionsContainer, styles_1.filterStyles.optionsContainer);
218
+ const selectAllItemDiv = document.createElement("div");
219
+ (0, styles_1.applyStyles)(selectAllItemDiv, styles_1.filterStyles.optionItem);
220
+ const selectAllLabel = document.createElement("label");
221
+ (0, styles_1.applyStyles)(selectAllLabel, styles_1.filterStyles.optionLabel), this.selectAllCheckbox = document.createElement("input"),
222
+ this.selectAllCheckbox.type = "checkbox", this.selectAllCheckbox.checked = !0, (0,
223
+ styles_1.applyStyles)(this.selectAllCheckbox, styles_1.filterStyles.checkbox), selectAllLabel.append(this.selectAllCheckbox, " 全选"),
224
+ selectAllItemDiv.appendChild(selectAllLabel), this.filterItemsContainer = document.createElement("div"),
225
+ optionsContainer.append(selectAllItemDiv, this.filterItemsContainer), this.filterByValuePanel.append(searchContainer, optionsContainer),
226
+ container.appendChild(this.filterByValuePanel), this.bindEventForFilterByValue();
227
+ }
228
+ renderFilterOptions(field) {
229
+ var _a, _b;
230
+ this.filterItemsContainer.innerHTML = "", this.valueFilterOptionList.delete(field),
231
+ this.valueFilterOptionList.set(field, []);
232
+ const selectedRawValues = (null === (_a = this.filterStateManager.getFilterState(field)) || void 0 === _a ? void 0 : _a.values) || [], selectedRawValueSet = new Set(selectedRawValues), itemDomList = [];
233
+ null === (_b = this.uniqueKeys.get(field)) || void 0 === _b || _b.forEach((({value: value, count: count, rawValue: rawValue}) => {
234
+ const itemDiv = document.createElement("div");
235
+ (0, styles_1.applyStyles)(itemDiv, styles_1.filterStyles.optionItem);
236
+ const label = document.createElement("label");
237
+ (0, styles_1.applyStyles)(label, styles_1.filterStyles.optionLabel);
238
+ const checkbox = document.createElement("input");
239
+ checkbox.type = "checkbox", checkbox.value = String(value), checkbox.checked = selectedRawValueSet.has(rawValue),
240
+ (0, styles_1.applyStyles)(checkbox, styles_1.filterStyles.checkbox);
241
+ const countSpan = document.createElement("span");
242
+ countSpan.textContent = String(count), (0, styles_1.applyStyles)(countSpan, styles_1.filterStyles.countSpan),
243
+ label.append(checkbox, ` ${value}`), itemDiv.append(label, countSpan), this.filterItemsContainer.appendChild(itemDiv);
244
+ const itemDom = {
245
+ id: String(value),
246
+ originalValue: value,
247
+ itemContainer: itemDiv,
248
+ checkbox: checkbox,
249
+ countSpan: countSpan
250
+ };
251
+ itemDomList.push(itemDom);
252
+ })), this.valueFilterOptionList.set(field, itemDomList);
253
+ }
254
+ bindEventForFilterByValue() {
255
+ this.filterByValuePanel.addEventListener("keyup", (event => {
256
+ const target = event.target;
257
+ if (target instanceof HTMLInputElement && "text" === target.type) {
258
+ const value = target.value;
259
+ this.onSearch(this.selectedField, value);
260
+ }
261
+ })), this.filterByValuePanel.addEventListener("change", (event => {
262
+ var _a, _b;
263
+ const target = event.target;
264
+ if (target instanceof HTMLInputElement && "checkbox" === target.type) if (target === this.selectAllCheckbox) this.toggleSelectAll(this.selectedField, this.selectAllCheckbox.checked); else {
265
+ const checkbox = target, checked = checkbox.checked, value = null === (_b = null === (_a = this.valueFilterOptionList.get(this.selectedField)) || void 0 === _a ? void 0 : _a.find((item => item.id === checkbox.value))) || void 0 === _b ? void 0 : _b.originalValue;
266
+ this.onValueSelect(this.selectedField, value, checked);
267
+ }
268
+ }));
269
+ }
270
+ show() {
271
+ this.initFilterStateFromTableData(this.selectedField), this.renderFilterOptions(this.selectedField),
272
+ this.filterByValuePanel.style.display = "block";
273
+ }
274
+ hide() {
275
+ this.filterByValuePanel.style.display = "none";
276
+ }
277
+ }
278
+
279
+ exports.ValueFilter = ValueFilter;
280
+ //# sourceMappingURL=value-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/filter/value-filter.ts"],"names":[],"mappings":"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","file":"value-filter.js","sourcesContent":["import * as VTable 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: VTable.ListTable | VTable.PivotTable;\n private filterStateManager: FilterStateManager;\n private uniqueKeys = new Map<string | number, Array<{ value: any; count: number; rawValue: any }>>();\n private displayToRawValueMap = new Map<string | number, Map<any, any>>();\n private selectedField: string | number;\n\n private valueFilterOptionList: Map<string | number, ValueFilterOptionDom[]> = new Map();\n private filterByValuePanel: HTMLElement;\n private filterByValueSearchInput: HTMLInputElement;\n private selectAllCheckbox: HTMLInputElement;\n private filterItemsContainer: HTMLElement;\n\n constructor(table: VTable.ListTable | VTable.PivotTable, filterStateManager: FilterStateManager) {\n this.table = table;\n this.filterStateManager = filterStateManager;\n\n this.filterStateManager.subscribe((state: FilterState) => {\n const filterState = state.filters.get(this.selectedField);\n if (filterState && filterState.type === 'byValue') {\n this.updateUI(filterState);\n }\n });\n }\n\n private updateUI(filterState: FilterConfig): void {\n this.syncCheckboxesWithFilterState(filterState);\n this.syncSelectAllWithFilterState(filterState);\n }\n\n setSelectedField(fieldId: string | number): void {\n this.selectedField = fieldId;\n this.collectUniqueColumnValues(fieldId);\n }\n\n collectUniqueColumnValues(fieldId: string | number): void {\n const isEnable = this.filterStateManager.getFilterState(fieldId)?.enable;\n const displayValueMap = new Map<any, number>();\n const rawToDisplayMap = new Map<any, any>();\n const displayToRawMap = new Map<any, any>();\n\n // 找到第一个匹配字段的列位置,用于获取格式化数据\n let targetCol = -1;\n let targetRow = -1;\n for (let col = 0; col < this.table.colCount; col++) {\n for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) {\n if (!this.table.internalProps.layoutMap.isHeader(col, row)) {\n const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);\n if (bodyInfo && bodyInfo.field === fieldId) {\n targetCol = col;\n targetRow = row;\n break;\n }\n }\n }\n if (targetCol !== -1) break;\n }\n\n if (isEnable) {\n // 如果已应用筛选,则从原始数据收集\n const records = this.table.internalProps.records;\n const recordsLength = records.length;\n\n for (let i = 0; i < recordsLength; i++) {\n let rawValue, displayValue;\n if (targetCol !== -1) {\n const row = this.table.columnHeaderLevelCount + i;\n const currentRecord = records[i];\n // 获取原始数据\n rawValue = currentRecord[fieldId];\n // 获取格式化显示数据\n const bodyInfo = this.table.internalProps.layoutMap.getBody(targetCol, row);\n if (bodyInfo && 'fieldFormat' in bodyInfo && bodyInfo.fieldFormat && typeof bodyInfo.fieldFormat === 'function') {\n // displayValue = bodyInfo.fieldFormat(rawValue, targetCol, row, this.table);\n displayValue = bodyInfo.fieldFormat({ [fieldId]: rawValue });\n } else {\n displayValue = rawValue;\n }\n }\n\n if (rawValue !== undefined && rawValue !== null) {\n displayValueMap.set(displayValue, (displayValueMap.get(displayValue) || 0) + 1);\n rawToDisplayMap.set(rawValue, displayValue);\n displayToRawMap.set(displayValue, rawValue);\n }\n }\n } else {\n // 如果未筛选,则从当前表格数据收集\n const dataSource = this.table.internalProps.dataSource;\n const currentLength = dataSource.length;\n\n for (let i = 0; i < currentLength; i++) {\n let rawValue, displayValue;\n if (targetCol !== -1) {\n const row = this.table.columnHeaderLevelCount + i;\n if (row < this.table.rowCount) {\n // 获取原始数据\n rawValue = this.table.getCellOriginValue(targetCol, row);\n // 获取格式化显示数据\n displayValue = this.table.getCellValue(targetCol, row);\n }\n } else {\n rawValue = this.table.getFieldData(String(fieldId), targetCol !== -1 ? targetCol : 0, this.table.columnHeaderLevelCount + i);\n displayValue = rawValue; // 如果没有格式化函数,显示值等于原始值\n }\n\n if (rawValue !== undefined && rawValue !== null) {\n displayValueMap.set(displayValue, (displayValueMap.get(displayValue) || 0) + 1);\n rawToDisplayMap.set(rawValue, displayValue);\n displayToRawMap.set(displayValue, rawValue);\n }\n }\n }\n\n // 保存显示值到原始值的映射关系\n this.displayToRawValueMap.set(fieldId, displayToRawMap);\n\n // 转换为所需格式,包含显示值、计数和原始值\n const uniqueValues = Array.from(displayValueMap.entries()).map(([displayValue, count]) => ({\n value: displayValue, // UI显示的格式化值\n count,\n rawValue: displayToRawMap.get(displayValue) // 对应的原始值\n }));\n\n this.uniqueKeys.set(fieldId, uniqueValues);\n }\n\n private onValueSelect(fieldId: string | number, displayValue: any, selected: boolean): void {\n // 获取显示值对应的原始值\n const displayToRawMap = this.displayToRawValueMap.get(fieldId);\n const rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n\n const filter = this.filterStateManager.getFilterState(fieldId);\n if (!filter) {\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: [rawValue] // 使用原始值\n }\n });\n } else {\n const updatedValues = selected\n ? [...(filter.values || []), rawValue] // 使用原始值\n : (filter.values || []).filter(v => v !== rawValue); // 使用原始值进行比较\n this.filterStateManager.dispatch({\n type: FilterActionType.UPDATE_FILTER,\n payload: {\n field: fieldId,\n values: updatedValues\n }\n });\n }\n }\n\n private toggleSelectAll(fieldId: string | number, selected: boolean): void {\n const filter = this.filterStateManager.getFilterState(fieldId);\n // 获取所有原始值用于全选/取消全选\n const rawValuesToUpdate = selected ? this.uniqueKeys.get(fieldId)?.map(item => item.rawValue) || [] : [];\n if (!filter) {\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: rawValuesToUpdate, // 使用原始值\n enable: true\n }\n });\n } else {\n const updatedValues = selected ? rawValuesToUpdate : [];\n this.filterStateManager.dispatch({\n type: FilterActionType.UPDATE_FILTER,\n payload: {\n field: fieldId,\n values: updatedValues // 使用原始值\n }\n });\n }\n }\n\n private onSearch(fieldId: string | number, value: string): void {\n const filterKeywords = value\n .toUpperCase()\n .split(' ')\n .filter(s => s);\n const items = this.valueFilterOptionList.get(fieldId);\n\n for (const item of items) {\n const txtValue = item.id.toUpperCase() || '';\n const match = filterKeywords.some(keyword => txtValue.includes(keyword));\n item.itemContainer.style.display = filterKeywords.length === 0 || match ? 'flex' : 'none';\n }\n }\n\n /**\n * 根据当前表格中的数据,更新 filter 的被选状态 selectedKeys\n */\n private initFilterStateFromTableData(fieldId: string | number): void {\n const filter = this.filterStateManager.getFilterState(fieldId);\n const selectedRawValues = new Set();\n const displayToRawMap = this.displayToRawValueMap.get(fieldId);\n\n // 找到第一个匹配字段的列位置,用于获取格式化数据\n let targetCol = -1;\n for (let col = 0; col < this.table.colCount; col++) {\n for (let row = this.table.columnHeaderLevelCount; row < this.table.rowCount; row++) {\n if (!this.table.internalProps.layoutMap.isHeader(col, row)) {\n const bodyInfo = this.table.internalProps.layoutMap.getBody(col, row);\n if (bodyInfo && bodyInfo.field === fieldId) {\n targetCol = col;\n break;\n }\n }\n }\n if (targetCol !== -1) break;\n }\n\n // 收集当前显示的数据对应的原始值\n const dataSource = this.table.internalProps.dataSource;\n const currentLength = dataSource.length;\n\n for (let i = 0; i < currentLength; i++) {\n let displayValue, rawValue;\n if (targetCol !== -1) {\n const row = this.table.columnHeaderLevelCount + i;\n if (row < this.table.rowCount) {\n // 获取格式化显示值\n displayValue = this.table.getCellValue(targetCol, row);\n // 通过映射获取对应的原始值\n rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n }\n } else {\n displayValue = this.table.getFieldData(String(fieldId), targetCol !== -1 ? targetCol : 0, this.table.columnHeaderLevelCount + i);\n rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n }\n\n if (rawValue !== undefined && rawValue !== null) {\n selectedRawValues.add(rawValue);\n }\n }\n\n const hasChanged = !filter || !arrayEqual(filter.values, Array.from(selectedRawValues));\n if (!hasChanged) {\n return;\n }\n if (filter) {\n this.filterStateManager.dispatch({\n type: FilterActionType.UPDATE_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: Array.from(selectedRawValues) // 使用原始值\n }\n });\n } else {\n this.filterStateManager.dispatch({\n type: FilterActionType.ADD_FILTER,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: Array.from(selectedRawValues) // 使用原始值\n }\n });\n }\n }\n\n /**\n * 根据 filter 的数据状态,更新 UI\n */\n private syncCheckboxesWithFilterState(filter: FilterConfig): void {\n if (!filter) {\n return;\n }\n const selectedRawValues = filter.values || [];\n const displayToRawMap = this.displayToRawValueMap.get(filter.field);\n const optionDomList = this.valueFilterOptionList.get(filter.field);\n\n optionDomList?.forEach(optionDom => {\n // optionDom.id 是显示值,需要转换为原始值进行比较\n const displayValue = optionDom.originalValue;\n const rawValue = displayToRawMap ? displayToRawMap.get(displayValue) : displayValue;\n\n // 检查原始值是否在选中的原始值列表中\n optionDom.checkbox.checked = selectedRawValues.some(v => v === rawValue);\n\n const count = this.uniqueKeys.get(filter.field)?.find(key => String(key.value) === optionDom.id)?.count || 0;\n optionDom.countSpan.textContent = String(count);\n optionDom.itemContainer.style.display = count === 0 ? 'none' : 'flex';\n });\n }\n\n /**\n * 根据 filter 的数据状态,更新 UI\n */\n private syncSelectAllWithFilterState(filter: FilterConfig): void {\n if (!filter || !filter.values) {\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = false;\n return;\n }\n\n const uniqueValuesCount = this.uniqueKeys.get(filter.field)?.length || 0;\n if (uniqueValuesCount === 0) {\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = false;\n } else if (filter.values.length === 0) {\n // 没有选中任何值\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = false;\n } else if (filter.values.length === uniqueValuesCount) {\n // 所有值都被选中\n this.selectAllCheckbox.checked = true;\n this.selectAllCheckbox.indeterminate = false;\n } else {\n // 部分值被选中\n this.selectAllCheckbox.checked = false;\n this.selectAllCheckbox.indeterminate = true;\n }\n }\n\n applyFilter(fieldId: string | number = this.selectedField): void {\n const selectedKeys = this.filterStateManager.getFilterState(fieldId)?.values || [];\n if (selectedKeys.length > 0 && selectedKeys.length < this.uniqueKeys.get(fieldId)?.length) {\n this.filterStateManager.dispatch({\n type: FilterActionType.APPLY_FILTERS,\n payload: {\n field: fieldId,\n type: 'byValue',\n values: selectedKeys,\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 selectAllLabel.append(this.selectAllCheckbox, ' 全选');\n selectAllItemDiv.appendChild(selectAllLabel);\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 const selectedRawValues = this.filterStateManager.getFilterState(field)?.values || [];\n // 为了优化复杂度,将原始值转换为Set进行快速查找\n const selectedRawValueSet = new Set(selectedRawValues);\n\n const itemDomList: ValueFilterOptionDom[] = [];\n this.uniqueKeys.get(field)?.forEach(({ value, count, rawValue }) => {\n const itemDiv = document.createElement('div');\n applyStyles(itemDiv, filterStyles.optionItem);\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(value); // 显示值作为checkbox的value\n // 使用原始值进行选中状态判断,优化为O(1)复杂度\n checkbox.checked = selectedRawValueSet.has(rawValue);\n applyStyles(checkbox, filterStyles.checkbox);\n\n const countSpan = document.createElement('span');\n countSpan.textContent = String(count);\n applyStyles(countSpan, filterStyles.countSpan);\n\n label.append(checkbox, ` ${value}`); // UI显示格式化值\n itemDiv.append(label, countSpan);\n this.filterItemsContainer.appendChild(itemDiv);\n\n const itemDom: ValueFilterOptionDom = {\n id: String(value), // 显示值作为id,用于UI交互\n originalValue: value,\n itemContainer: itemDiv,\n checkbox: checkbox,\n countSpan: countSpan\n };\n\n itemDomList.push(itemDom);\n });\n\n this.valueFilterOptionList.set(field, itemDomList);\n }\n\n bindEventForFilterByValue(): void {\n // 事件委托:搜索框的 keyup 事件\n this.filterByValuePanel.addEventListener('keyup', (event: KeyboardEvent) => {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.type === 'text') {\n const value = target.value;\n this.onSearch(this.selectedField, value);\n }\n });\n\n // 事件委托:复选框的 change 事件\n this.filterByValuePanel.addEventListener('change', (event: Event) => {\n const target = event.target;\n if (target instanceof HTMLInputElement && target.type === 'checkbox') {\n if (target === this.selectAllCheckbox) {\n this.toggleSelectAll(this.selectedField, this.selectAllCheckbox.checked);\n } else {\n const checkbox = target;\n const checked = checkbox.checked;\n const value = this.valueFilterOptionList\n .get(this.selectedField)\n ?.find(item => item.id === checkbox.value)?.originalValue;\n this.onValueSelect(this.selectedField, value, checked);\n }\n }\n });\n }\n\n show(): void {\n this.initFilterStateFromTableData(this.selectedField);\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"]}