photon-grid-core 0.0.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 (555) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +0 -0
  3. package/cell-selection/active-grid-registry.d.ts +37 -0
  4. package/cell-selection/active-grid-registry.d.ts.map +1 -0
  5. package/cell-selection/active-grid-registry.js +25 -0
  6. package/cell-selection/active-grid-registry.js.map +1 -0
  7. package/cell-selection/cell-selection-engine.d.ts +336 -0
  8. package/cell-selection/cell-selection-engine.d.ts.map +1 -0
  9. package/cell-selection/cell-selection-engine.js +1534 -0
  10. package/cell-selection/cell-selection-engine.js.map +1 -0
  11. package/cell-selection/selection-range.d.ts +16 -0
  12. package/cell-selection/selection-range.d.ts.map +1 -0
  13. package/cell-selection/selection-range.js +48 -0
  14. package/cell-selection/selection-range.js.map +1 -0
  15. package/cell-selection/selection-renderer.d.ts +24 -0
  16. package/cell-selection/selection-renderer.d.ts.map +1 -0
  17. package/cell-selection/selection-renderer.js +107 -0
  18. package/cell-selection/selection-renderer.js.map +1 -0
  19. package/chart/chart-analyzer/aggregation-analyzer.d.ts +18 -0
  20. package/chart/chart-analyzer/aggregation-analyzer.d.ts.map +1 -0
  21. package/chart/chart-analyzer/aggregation-analyzer.js +63 -0
  22. package/chart/chart-analyzer/aggregation-analyzer.js.map +1 -0
  23. package/chart/chart-analyzer/bar-analyzer.d.ts +19 -0
  24. package/chart/chart-analyzer/bar-analyzer.d.ts.map +1 -0
  25. package/chart/chart-analyzer/bar-analyzer.js +56 -0
  26. package/chart/chart-analyzer/bar-analyzer.js.map +1 -0
  27. package/chart/chart-analyzer/bubble-analyzer.d.ts +16 -0
  28. package/chart/chart-analyzer/bubble-analyzer.d.ts.map +1 -0
  29. package/chart/chart-analyzer/bubble-analyzer.js +61 -0
  30. package/chart/chart-analyzer/bubble-analyzer.js.map +1 -0
  31. package/chart/chart-analyzer/cardinality-analyzer.d.ts +13 -0
  32. package/chart/chart-analyzer/cardinality-analyzer.d.ts.map +1 -0
  33. package/chart/chart-analyzer/cardinality-analyzer.js +28 -0
  34. package/chart/chart-analyzer/cardinality-analyzer.js.map +1 -0
  35. package/chart/chart-analyzer/dimension-analyzer.d.ts +12 -0
  36. package/chart/chart-analyzer/dimension-analyzer.d.ts.map +1 -0
  37. package/chart/chart-analyzer/dimension-analyzer.js +33 -0
  38. package/chart/chart-analyzer/dimension-analyzer.js.map +1 -0
  39. package/chart/chart-analyzer/histogram-analyzer.d.ts +11 -0
  40. package/chart/chart-analyzer/histogram-analyzer.d.ts.map +1 -0
  41. package/chart/chart-analyzer/histogram-analyzer.js +43 -0
  42. package/chart/chart-analyzer/histogram-analyzer.js.map +1 -0
  43. package/chart/chart-analyzer/index.d.ts +58 -0
  44. package/chart/chart-analyzer/index.d.ts.map +1 -0
  45. package/chart/chart-analyzer/index.js +130 -0
  46. package/chart/chart-analyzer/index.js.map +1 -0
  47. package/chart/chart-analyzer/line-analyzer.d.ts +23 -0
  48. package/chart/chart-analyzer/line-analyzer.d.ts.map +1 -0
  49. package/chart/chart-analyzer/line-analyzer.js +61 -0
  50. package/chart/chart-analyzer/line-analyzer.js.map +1 -0
  51. package/chart/chart-analyzer/measure-analyzer.d.ts +11 -0
  52. package/chart/chart-analyzer/measure-analyzer.d.ts.map +1 -0
  53. package/chart/chart-analyzer/measure-analyzer.js +44 -0
  54. package/chart/chart-analyzer/measure-analyzer.js.map +1 -0
  55. package/chart/chart-analyzer/pie-analyzer.d.ts +19 -0
  56. package/chart/chart-analyzer/pie-analyzer.d.ts.map +1 -0
  57. package/chart/chart-analyzer/pie-analyzer.js +64 -0
  58. package/chart/chart-analyzer/pie-analyzer.js.map +1 -0
  59. package/chart/chart-analyzer/recommendation-engine.d.ts +18 -0
  60. package/chart/chart-analyzer/recommendation-engine.d.ts.map +1 -0
  61. package/chart/chart-analyzer/recommendation-engine.js +82 -0
  62. package/chart/chart-analyzer/recommendation-engine.js.map +1 -0
  63. package/chart/chart-analyzer/scatter-analyzer.d.ts +16 -0
  64. package/chart/chart-analyzer/scatter-analyzer.d.ts.map +1 -0
  65. package/chart/chart-analyzer/scatter-analyzer.js +70 -0
  66. package/chart/chart-analyzer/scatter-analyzer.js.map +1 -0
  67. package/chart/chart-analyzer/types.d.ts +52 -0
  68. package/chart/chart-analyzer/types.d.ts.map +1 -0
  69. package/chart/chart-analyzer/types.js +10 -0
  70. package/chart/chart-analyzer/types.js.map +1 -0
  71. package/chart/chart-analyzer.d.ts +12 -0
  72. package/chart/chart-analyzer.d.ts.map +1 -0
  73. package/chart/chart-analyzer.js +77 -0
  74. package/chart/chart-analyzer.js.map +1 -0
  75. package/chart/chart-data-transformer.d.ts +26 -0
  76. package/chart/chart-data-transformer.d.ts.map +1 -0
  77. package/chart/chart-data-transformer.js +93 -0
  78. package/chart/chart-data-transformer.js.map +1 -0
  79. package/chart/chart-engine.d.ts +38 -0
  80. package/chart/chart-engine.d.ts.map +1 -0
  81. package/chart/chart-engine.js +96 -0
  82. package/chart/chart-engine.js.map +1 -0
  83. package/chart/chart-panel.d.ts +54 -0
  84. package/chart/chart-panel.d.ts.map +1 -0
  85. package/chart/chart-panel.js +350 -0
  86. package/chart/chart-panel.js.map +1 -0
  87. package/chart/chart-renderer.d.ts +93 -0
  88. package/chart/chart-renderer.d.ts.map +1 -0
  89. package/chart/chart-renderer.js +1330 -0
  90. package/chart/chart-renderer.js.map +1 -0
  91. package/chart/sparkline/sparkline-renderer.d.ts +269 -0
  92. package/chart/sparkline/sparkline-renderer.d.ts.map +1 -0
  93. package/chart/sparkline/sparkline-renderer.js +875 -0
  94. package/chart/sparkline/sparkline-renderer.js.map +1 -0
  95. package/chart/sparkline/sparkline.types.d.ts +214 -0
  96. package/chart/sparkline/sparkline.types.d.ts.map +1 -0
  97. package/chart/sparkline/sparkline.types.js +8 -0
  98. package/chart/sparkline/sparkline.types.js.map +1 -0
  99. package/column-groups/column-group-drag-handler.d.ts +169 -0
  100. package/column-groups/column-group-drag-handler.d.ts.map +1 -0
  101. package/column-groups/column-group-drag-handler.js +517 -0
  102. package/column-groups/column-group-drag-handler.js.map +1 -0
  103. package/column-groups/column-group-header-builder.d.ts +106 -0
  104. package/column-groups/column-group-header-builder.d.ts.map +1 -0
  105. package/column-groups/column-group-header-builder.js +311 -0
  106. package/column-groups/column-group-header-builder.js.map +1 -0
  107. package/column-groups/column-group-model.d.ts +248 -0
  108. package/column-groups/column-group-model.d.ts.map +1 -0
  109. package/column-groups/column-group-model.js +668 -0
  110. package/column-groups/column-group-model.js.map +1 -0
  111. package/column-groups/column-group-state-manager.d.ts +110 -0
  112. package/column-groups/column-group-state-manager.d.ts.map +1 -0
  113. package/column-groups/column-group-state-manager.js +153 -0
  114. package/column-groups/column-group-state-manager.js.map +1 -0
  115. package/column-groups/column-group.types.d.ts +250 -0
  116. package/column-groups/column-group.types.d.ts.map +1 -0
  117. package/column-groups/column-group.types.js +20 -0
  118. package/column-groups/column-group.types.js.map +1 -0
  119. package/column-groups/display-group-builder.d.ts +91 -0
  120. package/column-groups/display-group-builder.d.ts.map +1 -0
  121. package/column-groups/display-group-builder.js +225 -0
  122. package/column-groups/display-group-builder.js.map +1 -0
  123. package/column-groups/display-group-drag-handler.d.ts +205 -0
  124. package/column-groups/display-group-drag-handler.d.ts.map +1 -0
  125. package/column-groups/display-group-drag-handler.js +536 -0
  126. package/column-groups/display-group-drag-handler.js.map +1 -0
  127. package/column-groups/display-group-engine.d.ts +310 -0
  128. package/column-groups/display-group-engine.d.ts.map +1 -0
  129. package/column-groups/display-group-engine.js +549 -0
  130. package/column-groups/display-group-engine.js.map +1 -0
  131. package/column-groups/display-group-header-builder.d.ts +94 -0
  132. package/column-groups/display-group-header-builder.d.ts.map +1 -0
  133. package/column-groups/display-group-header-builder.js +224 -0
  134. package/column-groups/display-group-header-builder.js.map +1 -0
  135. package/column-groups/display-group.types.d.ts +140 -0
  136. package/column-groups/display-group.types.d.ts.map +1 -0
  137. package/column-groups/display-group.types.js +2 -0
  138. package/column-groups/display-group.types.js.map +1 -0
  139. package/column-groups/index.d.ts +25 -0
  140. package/column-groups/index.d.ts.map +1 -0
  141. package/column-groups/index.js +26 -0
  142. package/column-groups/index.js.map +1 -0
  143. package/column-groups/logical-group-registry.d.ts +77 -0
  144. package/column-groups/logical-group-registry.d.ts.map +1 -0
  145. package/column-groups/logical-group-registry.js +118 -0
  146. package/column-groups/logical-group-registry.js.map +1 -0
  147. package/core/column-model.d.ts +30 -0
  148. package/core/column-model.d.ts.map +1 -0
  149. package/core/column-model.js +203 -0
  150. package/core/column-model.js.map +1 -0
  151. package/core/grid-api.d.ts +187 -0
  152. package/core/grid-api.d.ts.map +1 -0
  153. package/core/grid-api.js +569 -0
  154. package/core/grid-api.js.map +1 -0
  155. package/core/grid-context.d.ts +61 -0
  156. package/core/grid-context.d.ts.map +1 -0
  157. package/core/grid-context.js +2 -0
  158. package/core/grid-context.js.map +1 -0
  159. package/core/grid-core.d.ts +49 -0
  160. package/core/grid-core.d.ts.map +1 -0
  161. package/core/grid-core.js +675 -0
  162. package/core/grid-core.js.map +1 -0
  163. package/core/grid-store.d.ts +62 -0
  164. package/core/grid-store.d.ts.map +1 -0
  165. package/core/grid-store.js +104 -0
  166. package/core/grid-store.js.map +1 -0
  167. package/core/row-model.d.ts +32 -0
  168. package/core/row-model.d.ts.map +1 -0
  169. package/core/row-model.js +150 -0
  170. package/core/row-model.js.map +1 -0
  171. package/drag-drop/drag-autoscroll.d.ts +14 -0
  172. package/drag-drop/drag-autoscroll.d.ts.map +1 -0
  173. package/drag-drop/drag-autoscroll.js +66 -0
  174. package/drag-drop/drag-autoscroll.js.map +1 -0
  175. package/drag-drop/drag-drop-engine.d.ts +55 -0
  176. package/drag-drop/drag-drop-engine.d.ts.map +1 -0
  177. package/drag-drop/drag-drop-engine.js +179 -0
  178. package/drag-drop/drag-drop-engine.js.map +1 -0
  179. package/drag-drop/drag-preview.d.ts +32 -0
  180. package/drag-drop/drag-preview.d.ts.map +1 -0
  181. package/drag-drop/drag-preview.js +74 -0
  182. package/drag-drop/drag-preview.js.map +1 -0
  183. package/engines/aggregation/aggregation-engine.d.ts +66 -0
  184. package/engines/aggregation/aggregation-engine.d.ts.map +1 -0
  185. package/engines/aggregation/aggregation-engine.js +149 -0
  186. package/engines/aggregation/aggregation-engine.js.map +1 -0
  187. package/engines/clipboard/clipboard-engine.d.ts +89 -0
  188. package/engines/clipboard/clipboard-engine.d.ts.map +1 -0
  189. package/engines/clipboard/clipboard-engine.js +323 -0
  190. package/engines/clipboard/clipboard-engine.js.map +1 -0
  191. package/engines/editing/cell-editor-engine.d.ts +62 -0
  192. package/engines/editing/cell-editor-engine.d.ts.map +1 -0
  193. package/engines/editing/cell-editor-engine.js +359 -0
  194. package/engines/editing/cell-editor-engine.js.map +1 -0
  195. package/engines/editing/custom-dropdown-editor.d.ts +99 -0
  196. package/engines/editing/custom-dropdown-editor.d.ts.map +1 -0
  197. package/engines/editing/custom-dropdown-editor.js +355 -0
  198. package/engines/editing/custom-dropdown-editor.js.map +1 -0
  199. package/engines/editing/value-parser.d.ts +12 -0
  200. package/engines/editing/value-parser.d.ts.map +1 -0
  201. package/engines/editing/value-parser.js +125 -0
  202. package/engines/editing/value-parser.js.map +1 -0
  203. package/engines/export/export-engine.d.ts +16 -0
  204. package/engines/export/export-engine.d.ts.map +1 -0
  205. package/engines/export/export-engine.js +99 -0
  206. package/engines/export/export-engine.js.map +1 -0
  207. package/engines/filter/filter-condition.d.ts +7 -0
  208. package/engines/filter/filter-condition.d.ts.map +1 -0
  209. package/engines/filter/filter-condition.js +126 -0
  210. package/engines/filter/filter-condition.js.map +1 -0
  211. package/engines/filter/filter-engine.d.ts +35 -0
  212. package/engines/filter/filter-engine.d.ts.map +1 -0
  213. package/engines/filter/filter-engine.js +150 -0
  214. package/engines/filter/filter-engine.js.map +1 -0
  215. package/engines/filter/filter-panel.d.ts +103 -0
  216. package/engines/filter/filter-panel.d.ts.map +1 -0
  217. package/engines/filter/filter-panel.js +645 -0
  218. package/engines/filter/filter-panel.js.map +1 -0
  219. package/engines/grouping/group-node.d.ts +21 -0
  220. package/engines/grouping/group-node.d.ts.map +1 -0
  221. package/engines/grouping/group-node.js +96 -0
  222. package/engines/grouping/group-node.js.map +1 -0
  223. package/engines/grouping/grouping-engine.d.ts +33 -0
  224. package/engines/grouping/grouping-engine.d.ts.map +1 -0
  225. package/engines/grouping/grouping-engine.js +118 -0
  226. package/engines/grouping/grouping-engine.js.map +1 -0
  227. package/engines/master-detail/master-detail-engine.d.ts +77 -0
  228. package/engines/master-detail/master-detail-engine.d.ts.map +1 -0
  229. package/engines/master-detail/master-detail-engine.js +199 -0
  230. package/engines/master-detail/master-detail-engine.js.map +1 -0
  231. package/engines/pagination/pagination-engine.d.ts +33 -0
  232. package/engines/pagination/pagination-engine.d.ts.map +1 -0
  233. package/engines/pagination/pagination-engine.js +110 -0
  234. package/engines/pagination/pagination-engine.js.map +1 -0
  235. package/engines/selection/row-selection-engine.d.ts +26 -0
  236. package/engines/selection/row-selection-engine.d.ts.map +1 -0
  237. package/engines/selection/row-selection-engine.js +145 -0
  238. package/engines/selection/row-selection-engine.js.map +1 -0
  239. package/engines/sort/sort-comparator.d.ts +43 -0
  240. package/engines/sort/sort-comparator.d.ts.map +1 -0
  241. package/engines/sort/sort-comparator.js +113 -0
  242. package/engines/sort/sort-comparator.js.map +1 -0
  243. package/engines/sort/sort-engine.d.ts +67 -0
  244. package/engines/sort/sort-engine.d.ts.map +1 -0
  245. package/engines/sort/sort-engine.js +178 -0
  246. package/engines/sort/sort-engine.js.map +1 -0
  247. package/engines/summary/summary-engine.d.ts +17 -0
  248. package/engines/summary/summary-engine.d.ts.map +1 -0
  249. package/engines/summary/summary-engine.js +72 -0
  250. package/engines/summary/summary-engine.js.map +1 -0
  251. package/engines/tree/tree-data-service.d.ts +117 -0
  252. package/engines/tree/tree-data-service.d.ts.map +1 -0
  253. package/engines/tree/tree-data-service.js +296 -0
  254. package/engines/tree/tree-data-service.js.map +1 -0
  255. package/engines/tree/tree-expansion-service.d.ts +35 -0
  256. package/engines/tree/tree-expansion-service.d.ts.map +1 -0
  257. package/engines/tree/tree-expansion-service.js +84 -0
  258. package/engines/tree/tree-expansion-service.js.map +1 -0
  259. package/engines/tree/tree-node.d.ts +40 -0
  260. package/engines/tree/tree-node.d.ts.map +1 -0
  261. package/engines/tree/tree-node.js +199 -0
  262. package/engines/tree/tree-node.js.map +1 -0
  263. package/engines/tree/tree-selection-service.d.ts +35 -0
  264. package/engines/tree/tree-selection-service.d.ts.map +1 -0
  265. package/engines/tree/tree-selection-service.js +72 -0
  266. package/engines/tree/tree-selection-service.js.map +1 -0
  267. package/engines/undo-redo/undo-redo-engine.d.ts +114 -0
  268. package/engines/undo-redo/undo-redo-engine.d.ts.map +1 -0
  269. package/engines/undo-redo/undo-redo-engine.js +165 -0
  270. package/engines/undo-redo/undo-redo-engine.js.map +1 -0
  271. package/event-bus/event-bus.d.ts +21 -0
  272. package/event-bus/event-bus.d.ts.map +1 -0
  273. package/event-bus/event-bus.js +106 -0
  274. package/event-bus/event-bus.js.map +1 -0
  275. package/icons/icon-registry.d.ts +19 -0
  276. package/icons/icon-registry.d.ts.map +1 -0
  277. package/icons/icon-registry.js +37 -0
  278. package/icons/icon-registry.js.map +1 -0
  279. package/icons/icon-renderer.d.ts +18 -0
  280. package/icons/icon-renderer.d.ts.map +1 -0
  281. package/icons/icon-renderer.js +75 -0
  282. package/icons/icon-renderer.js.map +1 -0
  283. package/icons/icon-sets/core-icons.d.ts +2 -0
  284. package/icons/icon-sets/core-icons.d.ts.map +1 -0
  285. package/icons/icon-sets/core-icons.js +48 -0
  286. package/icons/icon-sets/core-icons.js.map +1 -0
  287. package/index.d.ts +72 -0
  288. package/index.d.ts.map +1 -0
  289. package/index.js +54 -0
  290. package/index.js.map +1 -0
  291. package/package.json +64 -0
  292. package/photon-ai/builtins/filter.commands.d.ts +4 -0
  293. package/photon-ai/builtins/filter.commands.d.ts.map +1 -0
  294. package/photon-ai/builtins/filter.commands.js +189 -0
  295. package/photon-ai/builtins/filter.commands.js.map +1 -0
  296. package/photon-ai/builtins/grouping.commands.d.ts +4 -0
  297. package/photon-ai/builtins/grouping.commands.d.ts.map +1 -0
  298. package/photon-ai/builtins/grouping.commands.js +115 -0
  299. package/photon-ai/builtins/grouping.commands.js.map +1 -0
  300. package/photon-ai/builtins/index.d.ts +10 -0
  301. package/photon-ai/builtins/index.d.ts.map +1 -0
  302. package/photon-ai/builtins/index.js +26 -0
  303. package/photon-ai/builtins/index.js.map +1 -0
  304. package/photon-ai/builtins/info.commands.d.ts +4 -0
  305. package/photon-ai/builtins/info.commands.d.ts.map +1 -0
  306. package/photon-ai/builtins/info.commands.js +201 -0
  307. package/photon-ai/builtins/info.commands.js.map +1 -0
  308. package/photon-ai/builtins/move.commands.d.ts +4 -0
  309. package/photon-ai/builtins/move.commands.d.ts.map +1 -0
  310. package/photon-ai/builtins/move.commands.js +53 -0
  311. package/photon-ai/builtins/move.commands.js.map +1 -0
  312. package/photon-ai/builtins/pin.commands.d.ts +4 -0
  313. package/photon-ai/builtins/pin.commands.d.ts.map +1 -0
  314. package/photon-ai/builtins/pin.commands.js +106 -0
  315. package/photon-ai/builtins/pin.commands.js.map +1 -0
  316. package/photon-ai/builtins/selection.commands.d.ts +4 -0
  317. package/photon-ai/builtins/selection.commands.d.ts.map +1 -0
  318. package/photon-ai/builtins/selection.commands.js +102 -0
  319. package/photon-ai/builtins/selection.commands.js.map +1 -0
  320. package/photon-ai/builtins/sort.commands.d.ts +4 -0
  321. package/photon-ai/builtins/sort.commands.d.ts.map +1 -0
  322. package/photon-ai/builtins/sort.commands.js +67 -0
  323. package/photon-ai/builtins/sort.commands.js.map +1 -0
  324. package/photon-ai/builtins/visibility.commands.d.ts +4 -0
  325. package/photon-ai/builtins/visibility.commands.d.ts.map +1 -0
  326. package/photon-ai/builtins/visibility.commands.js +75 -0
  327. package/photon-ai/builtins/visibility.commands.js.map +1 -0
  328. package/photon-ai/command-builder.d.ts +21 -0
  329. package/photon-ai/command-builder.d.ts.map +1 -0
  330. package/photon-ai/command-builder.js +18 -0
  331. package/photon-ai/command-builder.js.map +1 -0
  332. package/photon-ai/command-executor.d.ts +15 -0
  333. package/photon-ai/command-executor.d.ts.map +1 -0
  334. package/photon-ai/command-executor.js +26 -0
  335. package/photon-ai/command-executor.js.map +1 -0
  336. package/photon-ai/entity-resolver.d.ts +121 -0
  337. package/photon-ai/entity-resolver.d.ts.map +1 -0
  338. package/photon-ai/entity-resolver.js +393 -0
  339. package/photon-ai/entity-resolver.js.map +1 -0
  340. package/photon-ai/fuzzy-match.d.ts +12 -0
  341. package/photon-ai/fuzzy-match.d.ts.map +1 -0
  342. package/photon-ai/fuzzy-match.js +37 -0
  343. package/photon-ai/fuzzy-match.js.map +1 -0
  344. package/photon-ai/index.d.ts +15 -0
  345. package/photon-ai/index.d.ts.map +1 -0
  346. package/photon-ai/index.js +13 -0
  347. package/photon-ai/index.js.map +1 -0
  348. package/photon-ai/intent-parser.d.ts +20 -0
  349. package/photon-ai/intent-parser.d.ts.map +1 -0
  350. package/photon-ai/intent-parser.js +52 -0
  351. package/photon-ai/intent-parser.js.map +1 -0
  352. package/photon-ai/photon-ai-memory.d.ts +42 -0
  353. package/photon-ai/photon-ai-memory.d.ts.map +1 -0
  354. package/photon-ai/photon-ai-memory.js +86 -0
  355. package/photon-ai/photon-ai-memory.js.map +1 -0
  356. package/photon-ai/photon-ai-panel.d.ts +54 -0
  357. package/photon-ai/photon-ai-panel.d.ts.map +1 -0
  358. package/photon-ai/photon-ai-panel.js +191 -0
  359. package/photon-ai/photon-ai-panel.js.map +1 -0
  360. package/photon-ai/photon-ai-registry.d.ts +25 -0
  361. package/photon-ai/photon-ai-registry.d.ts.map +1 -0
  362. package/photon-ai/photon-ai-registry.js +41 -0
  363. package/photon-ai/photon-ai-registry.js.map +1 -0
  364. package/photon-ai/photon-ai-service.d.ts +71 -0
  365. package/photon-ai/photon-ai-service.d.ts.map +1 -0
  366. package/photon-ai/photon-ai-service.js +165 -0
  367. package/photon-ai/photon-ai-service.js.map +1 -0
  368. package/photon-ai/photon-ai.types.d.ts +100 -0
  369. package/photon-ai/photon-ai.types.d.ts.map +1 -0
  370. package/photon-ai/photon-ai.types.js +2 -0
  371. package/photon-ai/photon-ai.types.js.map +1 -0
  372. package/photon-ai/query-splitter.d.ts +22 -0
  373. package/photon-ai/query-splitter.d.ts.map +1 -0
  374. package/photon-ai/query-splitter.js +81 -0
  375. package/photon-ai/query-splitter.js.map +1 -0
  376. package/photon-ai/text-normalizer.d.ts +33 -0
  377. package/photon-ai/text-normalizer.d.ts.map +1 -0
  378. package/photon-ai/text-normalizer.js +132 -0
  379. package/photon-ai/text-normalizer.js.map +1 -0
  380. package/renderer/auto-scroller.d.ts +78 -0
  381. package/renderer/auto-scroller.d.ts.map +1 -0
  382. package/renderer/auto-scroller.js +141 -0
  383. package/renderer/auto-scroller.js.map +1 -0
  384. package/renderer/body-renderer.d.ts +191 -0
  385. package/renderer/body-renderer.d.ts.map +1 -0
  386. package/renderer/body-renderer.js +806 -0
  387. package/renderer/body-renderer.js.map +1 -0
  388. package/renderer/cell-renderer.d.ts +26 -0
  389. package/renderer/cell-renderer.d.ts.map +1 -0
  390. package/renderer/cell-renderer.js +201 -0
  391. package/renderer/cell-renderer.js.map +1 -0
  392. package/renderer/column-menu.d.ts +285 -0
  393. package/renderer/column-menu.d.ts.map +1 -0
  394. package/renderer/column-menu.js +873 -0
  395. package/renderer/column-menu.js.map +1 -0
  396. package/renderer/column-style-manager.d.ts +38 -0
  397. package/renderer/column-style-manager.d.ts.map +1 -0
  398. package/renderer/column-style-manager.js +110 -0
  399. package/renderer/column-style-manager.js.map +1 -0
  400. package/renderer/detail-row-renderer.d.ts +153 -0
  401. package/renderer/detail-row-renderer.d.ts.map +1 -0
  402. package/renderer/detail-row-renderer.js +388 -0
  403. package/renderer/detail-row-renderer.js.map +1 -0
  404. package/renderer/dom-utils.d.ts +22 -0
  405. package/renderer/dom-utils.d.ts.map +1 -0
  406. package/renderer/dom-utils.js +132 -0
  407. package/renderer/dom-utils.js.map +1 -0
  408. package/renderer/footer-renderer.d.ts +25 -0
  409. package/renderer/footer-renderer.d.ts.map +1 -0
  410. package/renderer/footer-renderer.js +168 -0
  411. package/renderer/footer-renderer.js.map +1 -0
  412. package/renderer/grid-renderer.d.ts +295 -0
  413. package/renderer/grid-renderer.d.ts.map +1 -0
  414. package/renderer/grid-renderer.js +1456 -0
  415. package/renderer/grid-renderer.js.map +1 -0
  416. package/renderer/group-context-menu.d.ts +79 -0
  417. package/renderer/group-context-menu.d.ts.map +1 -0
  418. package/renderer/group-context-menu.js +238 -0
  419. package/renderer/group-context-menu.js.map +1 -0
  420. package/renderer/group-drop-zone.d.ts +56 -0
  421. package/renderer/group-drop-zone.d.ts.map +1 -0
  422. package/renderer/group-drop-zone.js +376 -0
  423. package/renderer/group-drop-zone.js.map +1 -0
  424. package/renderer/header-renderer.d.ts +264 -0
  425. package/renderer/header-renderer.d.ts.map +1 -0
  426. package/renderer/header-renderer.js +1321 -0
  427. package/renderer/header-renderer.js.map +1 -0
  428. package/renderer/overlay-renderer.d.ts +16 -0
  429. package/renderer/overlay-renderer.d.ts.map +1 -0
  430. package/renderer/overlay-renderer.js +64 -0
  431. package/renderer/overlay-renderer.js.map +1 -0
  432. package/renderer/renderer-resolver.d.ts +18 -0
  433. package/renderer/renderer-resolver.d.ts.map +1 -0
  434. package/renderer/renderer-resolver.js +18 -0
  435. package/renderer/renderer-resolver.js.map +1 -0
  436. package/renderer/row-animator.d.ts +72 -0
  437. package/renderer/row-animator.d.ts.map +1 -0
  438. package/renderer/row-animator.js +175 -0
  439. package/renderer/row-animator.js.map +1 -0
  440. package/renderer/row-drag-renderer.d.ts +58 -0
  441. package/renderer/row-drag-renderer.d.ts.map +1 -0
  442. package/renderer/row-drag-renderer.js +395 -0
  443. package/renderer/row-drag-renderer.js.map +1 -0
  444. package/renderer/row-offset-search.d.ts +17 -0
  445. package/renderer/row-offset-search.d.ts.map +1 -0
  446. package/renderer/row-offset-search.js +31 -0
  447. package/renderer/row-offset-search.js.map +1 -0
  448. package/renderer/row-position-sheet.d.ts +11 -0
  449. package/renderer/row-position-sheet.d.ts.map +1 -0
  450. package/renderer/row-position-sheet.js +29 -0
  451. package/renderer/row-position-sheet.js.map +1 -0
  452. package/renderer/scroll-controller.d.ts +58 -0
  453. package/renderer/scroll-controller.d.ts.map +1 -0
  454. package/renderer/scroll-controller.js +200 -0
  455. package/renderer/scroll-controller.js.map +1 -0
  456. package/renderer/sticky-row-tracker.d.ts +40 -0
  457. package/renderer/sticky-row-tracker.d.ts.map +1 -0
  458. package/renderer/sticky-row-tracker.js +63 -0
  459. package/renderer/sticky-row-tracker.js.map +1 -0
  460. package/renderer/tooltip-renderer.d.ts +36 -0
  461. package/renderer/tooltip-renderer.d.ts.map +1 -0
  462. package/renderer/tooltip-renderer.js +133 -0
  463. package/renderer/tooltip-renderer.js.map +1 -0
  464. package/renderer/tree-cell-renderer.d.ts +37 -0
  465. package/renderer/tree-cell-renderer.d.ts.map +1 -0
  466. package/renderer/tree-cell-renderer.js +75 -0
  467. package/renderer/tree-cell-renderer.js.map +1 -0
  468. package/renderer/tree-sticky-row-tracker.d.ts +62 -0
  469. package/renderer/tree-sticky-row-tracker.d.ts.map +1 -0
  470. package/renderer/tree-sticky-row-tracker.js +120 -0
  471. package/renderer/tree-sticky-row-tracker.js.map +1 -0
  472. package/renderer/virtual-scroll-renderer.d.ts +37 -0
  473. package/renderer/virtual-scroll-renderer.d.ts.map +1 -0
  474. package/renderer/virtual-scroll-renderer.js +133 -0
  475. package/renderer/virtual-scroll-renderer.js.map +1 -0
  476. package/styles/base-styles.d.ts +3 -0
  477. package/styles/base-styles.d.ts.map +1 -0
  478. package/styles/base-styles.js +3045 -0
  479. package/styles/base-styles.js.map +1 -0
  480. package/styles/themes/theme-alpine.d.ts +2 -0
  481. package/styles/themes/theme-alpine.d.ts.map +1 -0
  482. package/styles/themes/theme-alpine.js +120 -0
  483. package/styles/themes/theme-alpine.js.map +1 -0
  484. package/styles/themes/theme-balham.d.ts +2 -0
  485. package/styles/themes/theme-balham.d.ts.map +1 -0
  486. package/styles/themes/theme-balham.js +120 -0
  487. package/styles/themes/theme-balham.js.map +1 -0
  488. package/styles/themes/theme-dark.d.ts +2 -0
  489. package/styles/themes/theme-dark.d.ts.map +1 -0
  490. package/styles/themes/theme-dark.js +216 -0
  491. package/styles/themes/theme-dark.js.map +1 -0
  492. package/styles/themes/theme-material.d.ts +2 -0
  493. package/styles/themes/theme-material.d.ts.map +1 -0
  494. package/styles/themes/theme-material.js +134 -0
  495. package/styles/themes/theme-material.js.map +1 -0
  496. package/styles/themes/theme-quartz.d.ts +2 -0
  497. package/styles/themes/theme-quartz.d.ts.map +1 -0
  498. package/styles/themes/theme-quartz.js +120 -0
  499. package/styles/themes/theme-quartz.js.map +1 -0
  500. package/theme/css-var-injector.d.ts +10 -0
  501. package/theme/css-var-injector.d.ts.map +1 -0
  502. package/theme/css-var-injector.js +63 -0
  503. package/theme/css-var-injector.js.map +1 -0
  504. package/theme/theme-manager.d.ts +20 -0
  505. package/theme/theme-manager.d.ts.map +1 -0
  506. package/theme/theme-manager.js +79 -0
  507. package/theme/theme-manager.js.map +1 -0
  508. package/theme/themes/dark-theme.d.ts +3 -0
  509. package/theme/themes/dark-theme.d.ts.map +1 -0
  510. package/theme/themes/dark-theme.js +149 -0
  511. package/theme/themes/dark-theme.js.map +1 -0
  512. package/theme/themes/light-theme.d.ts +3 -0
  513. package/theme/themes/light-theme.d.ts.map +1 -0
  514. package/theme/themes/light-theme.js +149 -0
  515. package/theme/themes/light-theme.js.map +1 -0
  516. package/types/column.types.d.ts +195 -0
  517. package/types/column.types.d.ts.map +1 -0
  518. package/types/column.types.js +2 -0
  519. package/types/column.types.js.map +1 -0
  520. package/types/event.types.d.ts +213 -0
  521. package/types/event.types.d.ts.map +1 -0
  522. package/types/event.types.js +67 -0
  523. package/types/event.types.js.map +1 -0
  524. package/types/filter.types.d.ts +42 -0
  525. package/types/filter.types.d.ts.map +1 -0
  526. package/types/filter.types.js +2 -0
  527. package/types/filter.types.js.map +1 -0
  528. package/types/grid.types.d.ts +214 -0
  529. package/types/grid.types.d.ts.map +1 -0
  530. package/types/grid.types.js +2 -0
  531. package/types/grid.types.js.map +1 -0
  532. package/types/master-detail.types.d.ts +112 -0
  533. package/types/master-detail.types.d.ts.map +1 -0
  534. package/types/master-detail.types.js +2 -0
  535. package/types/master-detail.types.js.map +1 -0
  536. package/types/photon-ai.types.d.ts +19 -0
  537. package/types/photon-ai.types.d.ts.map +1 -0
  538. package/types/photon-ai.types.js +2 -0
  539. package/types/photon-ai.types.js.map +1 -0
  540. package/types/renderer.types.d.ts +156 -0
  541. package/types/renderer.types.d.ts.map +1 -0
  542. package/types/renderer.types.js +19 -0
  543. package/types/renderer.types.js.map +1 -0
  544. package/types/row.types.d.ts +127 -0
  545. package/types/row.types.d.ts.map +1 -0
  546. package/types/row.types.js +9 -0
  547. package/types/row.types.js.map +1 -0
  548. package/types/theme.types.d.ts +159 -0
  549. package/types/theme.types.d.ts.map +1 -0
  550. package/types/theme.types.js +2 -0
  551. package/types/theme.types.js.map +1 -0
  552. package/types/tree-data.types.d.ts +94 -0
  553. package/types/tree-data.types.d.ts.map +1 -0
  554. package/types/tree-data.types.js +2 -0
  555. package/types/tree-data.types.js.map +1 -0
@@ -0,0 +1,645 @@
1
+ import { resolveColumnRenderer } from '../../renderer/renderer-resolver';
2
+ // ─── Operator tables (by column type) ────────────────────────────────────────
3
+ const STRING_OPERATORS = [
4
+ { label: 'Contains', operator: 'contains' },
5
+ { label: 'Does not contain', operator: 'notContains' },
6
+ { label: 'Equals', operator: 'equals' },
7
+ { label: 'Does not equal', operator: 'notEquals' },
8
+ { label: 'Starts with', operator: 'startsWith' },
9
+ { label: 'Ends with', operator: 'endsWith' },
10
+ { label: 'Blank', operator: 'blank' },
11
+ { label: 'Not blank', operator: 'notBlank' },
12
+ ];
13
+ const NUMBER_OPERATORS = [
14
+ { label: 'Equals', operator: 'equals' },
15
+ { label: 'Does not equal', operator: 'notEquals' },
16
+ { label: 'Greater than', operator: 'greaterThan' },
17
+ { label: 'Greater than or equal to', operator: 'greaterThanOrEqual' },
18
+ { label: 'Less than', operator: 'lessThan' },
19
+ { label: 'Less than or equal to', operator: 'lessThanOrEqual' },
20
+ { label: 'Between', operator: 'inRange' },
21
+ { label: 'Blank', operator: 'blank' },
22
+ { label: 'Not blank', operator: 'notBlank' },
23
+ ];
24
+ const DATE_OPERATORS = [
25
+ { label: 'Equals', operator: 'equals' },
26
+ { label: 'Does not equal', operator: 'notEquals' },
27
+ { label: 'Before', operator: 'before' },
28
+ { label: 'After', operator: 'after' },
29
+ { label: 'Between', operator: 'inRange' },
30
+ { label: 'Blank', operator: 'blank' },
31
+ { label: 'Not blank', operator: 'notBlank' },
32
+ ];
33
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
34
+ function getOperators(colType) {
35
+ switch (colType) {
36
+ case 'number':
37
+ case 'currency':
38
+ case 'percentage': return NUMBER_OPERATORS;
39
+ case 'date':
40
+ case 'time': return DATE_OPERATORS;
41
+ default: return STRING_OPERATORS;
42
+ }
43
+ }
44
+ function getInputType(colType) {
45
+ switch (colType) {
46
+ case 'number':
47
+ case 'currency':
48
+ case 'percentage': return 'number';
49
+ case 'date': return 'date';
50
+ case 'time': return 'time';
51
+ default: return 'text';
52
+ }
53
+ }
54
+ function isSetType(colType) {
55
+ return colType === 'dropdown' || colType === 'array';
56
+ }
57
+ /** Operators that require no value input (blank / notBlank). */
58
+ function isNoValueOperator(op) {
59
+ return op === 'blank' || op === 'notBlank';
60
+ }
61
+ /** Operators that require two value inputs (inRange / Between). */
62
+ function isRangeOperator(op) {
63
+ return op === 'inRange';
64
+ }
65
+ // ─── Virtual-scroll constants ─────────────────────────────────────────────────
66
+ /** Fixed item height in px — must match `.pg-filter-set__item` in CSS. */
67
+ const VS_ITEM_HEIGHT = 28;
68
+ /** Maximum number of items visible without scrolling. */
69
+ const VS_MAX_VISIBLE = 9;
70
+ /** Number of extra items rendered above/below the viewport. */
71
+ const VS_BUFFER = 3;
72
+ /** Debounce delay (ms) for condition-filter inputs. */
73
+ const DEBOUNCE_MS = 200;
74
+ // ─── FilterPanel ──────────────────────────────────────────────────────────────
75
+ /**
76
+ * Floating filter panel rendered below a column header cell.
77
+ *
78
+ * The panel is appended to the grid's wrapper element (`pg-grid`) so that it
79
+ * clips correctly and participates in the grid's z-index context.
80
+ *
81
+ * ### Lifecycle
82
+ * ```
83
+ * const panel = new FilterPanel(config);
84
+ * panel.open(); // renders + positions + attaches global listeners
85
+ * // ... user interacts, onFilterChange is called in real-time ...
86
+ * panel.destroy(); // unmounts and calls onClose
87
+ * ```
88
+ *
89
+ * The caller should keep track of the open panel instance and call `destroy()`
90
+ * before opening a new panel for another column.
91
+ */
92
+ export class FilterPanel {
93
+ constructor(config) {
94
+ this.config = config;
95
+ this.panelEl = null;
96
+ this.val1 = '';
97
+ this.val1To = '';
98
+ this.logicMode = 'none';
99
+ this.val2 = '';
100
+ this.val2To = '';
101
+ this.setSearchTerm = '';
102
+ // ── DOM references (populated during build) ───────────────────────────────
103
+ this.vsContainerEl = null;
104
+ this.vsInnerEl = null;
105
+ this.logicRowEl = null;
106
+ this.cond2RowEl = null;
107
+ this.selectAllCbEl = null;
108
+ // ── Lifecycle helpers ─────────────────────────────────────────────────────
109
+ this.debounceTimer = null;
110
+ const type = config.colDef.type ?? 'string';
111
+ const ops = getOperators(type);
112
+ this.op1 = ops[0].operator;
113
+ this.op2 = ops[0].operator;
114
+ this.allOptions = config.uniqueOptions;
115
+ this.displayOptions = [...this.allOptions];
116
+ const cf = config.currentFilter;
117
+ if (cf) {
118
+ if (isSetType(type)) {
119
+ this.selectedValues = new Set((cf.selectedIds ?? []).map(String));
120
+ }
121
+ else {
122
+ this.selectedValues = new Set();
123
+ if (cf.conditions.length >= 1) {
124
+ this.op1 = cf.conditions[0].operator;
125
+ this.val1 = cf.conditions[0].value != null ? String(cf.conditions[0].value) : '';
126
+ this.val1To = cf.conditions[0].valueTo != null ? String(cf.conditions[0].valueTo) : '';
127
+ }
128
+ const c2Existing = cf.conditions.length >= 2
129
+ ? cf.conditions[1]
130
+ : null;
131
+ if (c2Existing) {
132
+ this.logicMode = (cf.logic ?? 'and');
133
+ this.op2 = c2Existing.operator;
134
+ this.val2 = c2Existing.value != null ? String(c2Existing.value) : '';
135
+ this.val2To = c2Existing.valueTo != null ? String(c2Existing.valueTo) : '';
136
+ }
137
+ }
138
+ }
139
+ else {
140
+ // Set filter: all options selected by default (= no filter)
141
+ this.selectedValues = new Set(this.allOptions.map((o) => o.value));
142
+ }
143
+ this.boundClickOutside = this.handleClickOutside.bind(this);
144
+ this.boundEscapeKey = this.handleEscapeKey.bind(this);
145
+ }
146
+ /**
147
+ * Renders the panel DOM, appends it to the container, positions it below the
148
+ * anchor element, and attaches global click-outside / Escape listeners.
149
+ */
150
+ open() {
151
+ const type = this.config.colDef.type ?? 'string';
152
+ const panel = document.createElement('div');
153
+ panel.className = 'pg-filter-panel';
154
+ panel.setAttribute('role', 'dialog');
155
+ panel.setAttribute('aria-label', `Filter: ${this.config.colDef.header}`);
156
+ const customFilterFn = resolveColumnRenderer(this.config.colDef, 'filter');
157
+ const isCustom = !!customFilterFn;
158
+ if (customFilterFn) {
159
+ const params = {
160
+ colDef: this.config.colDef,
161
+ anchorEl: this.config.anchorEl,
162
+ currentFilter: this.config.currentFilter,
163
+ uniqueOptions: this.config.uniqueOptions,
164
+ onFilterChange: this.config.onFilterChange,
165
+ onClose: () => this.destroy(),
166
+ api: null,
167
+ };
168
+ panel.appendChild(customFilterFn(params));
169
+ }
170
+ else if (isSetType(type)) {
171
+ panel.appendChild(this.buildSetFilter());
172
+ }
173
+ else {
174
+ panel.appendChild(this.buildConditionFilter(type));
175
+ }
176
+ // A custom filter renderer owns its own apply/clear affordances via the
177
+ // callbacks it already received — the default footer only applies to
178
+ // Photon Grid's own condition/set filter UI.
179
+ if (!isCustom) {
180
+ panel.appendChild(this.buildFooter());
181
+ }
182
+ this.panelEl = panel;
183
+ this.config.containerEl.appendChild(panel);
184
+ this.position();
185
+ // After insertion, render the virtual list (needs client dimensions)
186
+ if (!isCustom && isSetType(type) && this.vsContainerEl) {
187
+ this.renderVirtualList();
188
+ }
189
+ // Defer global listeners so the click that opened the panel is not caught
190
+ requestAnimationFrame(() => {
191
+ document.addEventListener('mousedown', this.boundClickOutside, true);
192
+ document.addEventListener('keydown', this.boundEscapeKey, true);
193
+ });
194
+ }
195
+ /** Removes the panel from the DOM and fires the `onClose` callback. */
196
+ destroy() {
197
+ this.clearDebounce();
198
+ document.removeEventListener('mousedown', this.boundClickOutside, true);
199
+ document.removeEventListener('keydown', this.boundEscapeKey, true);
200
+ this.panelEl?.remove();
201
+ this.panelEl = null;
202
+ this.config.onClose();
203
+ }
204
+ // ─── Condition filter ─────────────────────────────────────────────────────
205
+ buildConditionFilter(colType) {
206
+ const wrap = document.createElement('div');
207
+ wrap.className = 'pg-filter-cond-wrap';
208
+ // Condition 1
209
+ const cond1 = this.buildConditionRow(colType, 1);
210
+ wrap.appendChild(cond1);
211
+ // Logic toggle row (AND / OR / None) — shown after first value is entered
212
+ const logicRow = document.createElement('div');
213
+ logicRow.className = 'pg-filter-logic';
214
+ if (!this.hasConditionValue(1))
215
+ logicRow.classList.add('pg-filter-logic--hidden');
216
+ for (const mode of ['and', 'or', 'none']) {
217
+ const btn = document.createElement('button');
218
+ btn.type = 'button';
219
+ btn.className = 'pg-filter-logic__btn';
220
+ btn.textContent = mode === 'none' ? 'None' : mode.toUpperCase();
221
+ if (this.logicMode === mode)
222
+ btn.classList.add('pg-filter-logic__btn--active');
223
+ btn.addEventListener('click', () => {
224
+ this.logicMode = mode;
225
+ // Update active state
226
+ logicRow.querySelectorAll('.pg-filter-logic__btn').forEach((b) => {
227
+ b.classList.toggle('pg-filter-logic__btn--active', b.textContent === (mode === 'none' ? 'None' : mode.toUpperCase()));
228
+ });
229
+ // Show/hide condition 2
230
+ if (this.cond2RowEl) {
231
+ this.cond2RowEl.classList.toggle('pg-filter-cond__row--hidden', mode === 'none');
232
+ }
233
+ this.scheduleEmit();
234
+ });
235
+ logicRow.appendChild(btn);
236
+ }
237
+ this.logicRowEl = logicRow;
238
+ wrap.appendChild(logicRow);
239
+ // Condition 2
240
+ const cond2 = this.buildConditionRow(colType, 2);
241
+ if (this.logicMode === 'none')
242
+ cond2.classList.add('pg-filter-cond__row--hidden');
243
+ this.cond2RowEl = cond2;
244
+ wrap.appendChild(cond2);
245
+ return wrap;
246
+ }
247
+ buildConditionRow(colType, index) {
248
+ const ops = getOperators(colType);
249
+ const inputType = getInputType(colType);
250
+ const currentOp = index === 1 ? this.op1 : this.op2;
251
+ const currentVal = index === 1 ? this.val1 : this.val2;
252
+ const currentValTo = index === 1 ? this.val1To : this.val2To;
253
+ const row = document.createElement('div');
254
+ row.className = 'pg-filter-cond__row';
255
+ // Operator select
256
+ const select = document.createElement('select');
257
+ select.className = 'pg-filter-cond__select';
258
+ select.setAttribute('aria-label', 'Filter operator');
259
+ for (const op of ops) {
260
+ const opt = document.createElement('option');
261
+ opt.value = op.operator;
262
+ opt.textContent = op.label;
263
+ if (op.operator === currentOp)
264
+ opt.selected = true;
265
+ select.appendChild(opt);
266
+ }
267
+ // Value inputs
268
+ const valWrap = document.createElement('div');
269
+ valWrap.className = 'pg-filter-cond__inputs';
270
+ const input1 = document.createElement('input');
271
+ input1.type = inputType;
272
+ input1.className = 'pg-filter-cond__input';
273
+ input1.placeholder = 'Filter value…';
274
+ input1.value = currentVal;
275
+ input1.setAttribute('aria-label', 'Filter value');
276
+ const rangeSep = document.createElement('span');
277
+ rangeSep.className = 'pg-filter-cond__range-sep';
278
+ rangeSep.textContent = 'and';
279
+ const input2 = document.createElement('input');
280
+ input2.type = inputType;
281
+ input2.className = 'pg-filter-cond__input';
282
+ input2.placeholder = 'To value…';
283
+ input2.value = currentValTo;
284
+ input2.setAttribute('aria-label', 'Filter to value');
285
+ // Store DOM refs for condition 1
286
+ if (index === 1) {
287
+ this.val1 = currentVal;
288
+ this.val1To = currentValTo;
289
+ }
290
+ else {
291
+ this.val2 = currentVal;
292
+ this.val2To = currentValTo;
293
+ }
294
+ // Apply initial visibility
295
+ const isRange = isRangeOperator(currentOp);
296
+ const isNoVal = isNoValueOperator(currentOp);
297
+ valWrap.classList.toggle('pg-filter-cond__inputs--hidden', isNoVal);
298
+ valWrap.classList.toggle('pg-filter-cond__inputs--range', isRange);
299
+ rangeSep.classList.toggle('pg-filter-cond__range-sep--hidden', !isRange);
300
+ input2.classList.toggle('pg-filter-cond__input--hidden', !isRange);
301
+ valWrap.appendChild(input1);
302
+ valWrap.appendChild(rangeSep);
303
+ valWrap.appendChild(input2);
304
+ // Operator change handler
305
+ select.addEventListener('change', () => {
306
+ const op = select.value;
307
+ if (index === 1)
308
+ this.op1 = op;
309
+ else
310
+ this.op2 = op;
311
+ const noVal = isNoValueOperator(op);
312
+ const range = isRangeOperator(op);
313
+ valWrap.classList.toggle('pg-filter-cond__inputs--hidden', noVal);
314
+ valWrap.classList.toggle('pg-filter-cond__inputs--range', range);
315
+ rangeSep.classList.toggle('pg-filter-cond__range-sep--hidden', !range);
316
+ input2.classList.toggle('pg-filter-cond__input--hidden', !range);
317
+ this.scheduleEmit();
318
+ });
319
+ // Value change handlers
320
+ input1.addEventListener('input', () => {
321
+ const v = input1.value;
322
+ if (index === 1) {
323
+ this.val1 = v;
324
+ // Show/hide logic row after first value
325
+ if (this.logicRowEl) {
326
+ this.logicRowEl.classList.toggle('pg-filter-logic--hidden', !v && !isNoValueOperator(this.op1));
327
+ }
328
+ }
329
+ else {
330
+ this.val2 = v;
331
+ }
332
+ this.scheduleEmit();
333
+ });
334
+ input2.addEventListener('input', () => {
335
+ if (index === 1)
336
+ this.val1To = input2.value;
337
+ else
338
+ this.val2To = input2.value;
339
+ this.scheduleEmit();
340
+ });
341
+ row.appendChild(select);
342
+ row.appendChild(valWrap);
343
+ return row;
344
+ }
345
+ hasConditionValue(index) {
346
+ const op = index === 1 ? this.op1 : this.op2;
347
+ const val = index === 1 ? this.val1 : this.val2;
348
+ return isNoValueOperator(op) || val.trim() !== '';
349
+ }
350
+ // ─── Set filter ───────────────────────────────────────────────────────────
351
+ buildSetFilter() {
352
+ const wrap = document.createElement('div');
353
+ wrap.className = 'pg-filter-set';
354
+ // ── Search input ───────────────────────────────────────────────────────
355
+ const searchWrap = document.createElement('div');
356
+ searchWrap.className = 'pg-filter-set__search';
357
+ const searchInput = document.createElement('input');
358
+ searchInput.type = 'text';
359
+ searchInput.className = 'pg-filter-set__search-input';
360
+ searchInput.placeholder = 'Search values…';
361
+ searchInput.setAttribute('aria-label', 'Search filter values');
362
+ searchInput.value = this.setSearchTerm;
363
+ searchInput.addEventListener('input', () => {
364
+ this.setSearchTerm = searchInput.value;
365
+ this.applySetSearch();
366
+ });
367
+ searchWrap.appendChild(searchInput);
368
+ wrap.appendChild(searchWrap);
369
+ wrap.appendChild(this.buildDivider());
370
+ // ── Select All ─────────────────────────────────────────────────────────
371
+ const selectAllLabel = document.createElement('label');
372
+ selectAllLabel.className = 'pg-filter-set__item pg-filter-set__item--select-all';
373
+ const selectAllCb = document.createElement('input');
374
+ selectAllCb.type = 'checkbox';
375
+ selectAllCb.className = 'pg-filter-set__checkbox';
376
+ selectAllCb.setAttribute('aria-label', 'Select all');
377
+ this.updateSelectAllState(selectAllCb);
378
+ selectAllCb.addEventListener('change', () => {
379
+ if (selectAllCb.checked) {
380
+ // Select all currently visible + all hidden (full selection = no filter)
381
+ this.selectedValues = new Set(this.allOptions.map((o) => o.value));
382
+ }
383
+ else {
384
+ this.selectedValues = new Set();
385
+ }
386
+ this.renderVirtualList();
387
+ this.updateSelectAllState(selectAllCb);
388
+ this.emitFilter();
389
+ });
390
+ this.selectAllCbEl = selectAllCb;
391
+ const selectAllText = document.createElement('span');
392
+ selectAllText.className = 'pg-filter-set__item-label';
393
+ selectAllText.textContent = '(Select All)';
394
+ selectAllLabel.appendChild(selectAllCb);
395
+ selectAllLabel.appendChild(selectAllText);
396
+ wrap.appendChild(selectAllLabel);
397
+ wrap.appendChild(this.buildDivider());
398
+ // ── Virtual scroll list ────────────────────────────────────────────────
399
+ const visibleCount = Math.min(this.allOptions.length, VS_MAX_VISIBLE);
400
+ const containerH = visibleCount * VS_ITEM_HEIGHT;
401
+ const vsContainer = document.createElement('div');
402
+ vsContainer.className = 'pg-filter-set__list';
403
+ vsContainer.style.height = `${containerH}px`;
404
+ const vsInner = document.createElement('div');
405
+ vsInner.className = 'pg-filter-set__list-inner';
406
+ vsInner.style.height = `${this.displayOptions.length * VS_ITEM_HEIGHT}px`;
407
+ vsContainer.appendChild(vsInner);
408
+ vsContainer.addEventListener('scroll', () => this.renderVirtualList(), { passive: true });
409
+ this.vsContainerEl = vsContainer;
410
+ this.vsInnerEl = vsInner;
411
+ wrap.appendChild(vsContainer);
412
+ return wrap;
413
+ }
414
+ buildDivider() {
415
+ const d = document.createElement('div');
416
+ d.className = 'pg-filter-set__divider';
417
+ return d;
418
+ }
419
+ applySetSearch() {
420
+ const term = this.setSearchTerm.toLowerCase().trim();
421
+ this.displayOptions = term
422
+ ? this.allOptions.filter((o) => o.label.toLowerCase().includes(term))
423
+ : [...this.allOptions];
424
+ if (this.vsInnerEl) {
425
+ this.vsInnerEl.style.height = `${this.displayOptions.length * VS_ITEM_HEIGHT}px`;
426
+ }
427
+ if (this.vsContainerEl) {
428
+ this.vsContainerEl.scrollTop = 0;
429
+ }
430
+ this.renderVirtualList();
431
+ this.updateSelectAllState(this.selectAllCbEl);
432
+ }
433
+ renderVirtualList() {
434
+ if (!this.vsContainerEl || !this.vsInnerEl)
435
+ return;
436
+ const scrollTop = this.vsContainerEl.scrollTop;
437
+ const containerH = this.vsContainerEl.clientHeight || VS_MAX_VISIBLE * VS_ITEM_HEIGHT;
438
+ const firstIdx = Math.max(0, Math.floor(scrollTop / VS_ITEM_HEIGHT) - VS_BUFFER);
439
+ const lastIdx = Math.min(this.displayOptions.length, Math.ceil((scrollTop + containerH) / VS_ITEM_HEIGHT) + VS_BUFFER);
440
+ this.vsInnerEl.innerHTML = '';
441
+ for (let i = firstIdx; i < lastIdx; i++) {
442
+ const opt = this.displayOptions[i];
443
+ const item = this.buildSetItem(opt, i);
444
+ this.vsInnerEl.appendChild(item);
445
+ }
446
+ }
447
+ buildSetItem(opt, index) {
448
+ const label = document.createElement('label');
449
+ label.className = 'pg-filter-set__item';
450
+ label.style.top = `${index * VS_ITEM_HEIGHT}px`;
451
+ const cb = document.createElement('input');
452
+ cb.type = 'checkbox';
453
+ cb.className = 'pg-filter-set__checkbox';
454
+ cb.checked = this.selectedValues.has(opt.value);
455
+ cb.addEventListener('change', () => {
456
+ if (cb.checked) {
457
+ this.selectedValues.add(opt.value);
458
+ }
459
+ else {
460
+ this.selectedValues.delete(opt.value);
461
+ }
462
+ this.updateSelectAllState(this.selectAllCbEl);
463
+ this.emitFilter();
464
+ });
465
+ const text = document.createElement('span');
466
+ text.className = 'pg-filter-set__item-label';
467
+ const optionFn = resolveColumnRenderer(this.config.colDef, 'option');
468
+ if (optionFn) {
469
+ const rendered = optionFn({
470
+ option: { value: opt.value, label: opt.label },
471
+ index,
472
+ selected: cb.checked,
473
+ highlighted: false,
474
+ colDef: this.config.colDef,
475
+ api: null,
476
+ });
477
+ if (typeof rendered === 'string')
478
+ text.innerHTML = rendered;
479
+ else
480
+ text.appendChild(rendered);
481
+ }
482
+ else {
483
+ text.textContent = opt.label || '(Blank)';
484
+ if (!opt.label)
485
+ text.classList.add('pg-filter-set__item-label--blank');
486
+ }
487
+ label.appendChild(cb);
488
+ label.appendChild(text);
489
+ return label;
490
+ }
491
+ updateSelectAllState(cb) {
492
+ if (!cb)
493
+ return;
494
+ const total = this.displayOptions.length || this.allOptions.length;
495
+ const selectedCount = this.searchTerm
496
+ ? this.displayOptions.filter((o) => this.selectedValues.has(o.value)).length
497
+ : this.selectedValues.size;
498
+ cb.checked = selectedCount >= total;
499
+ cb.indeterminate = selectedCount > 0 && selectedCount < total;
500
+ }
501
+ get searchTerm() { return this.setSearchTerm; }
502
+ // ─── Footer ───────────────────────────────────────────────────────────────
503
+ buildFooter() {
504
+ const footer = document.createElement('div');
505
+ footer.className = 'pg-filter-panel__footer';
506
+ const clearBtn = document.createElement('button');
507
+ clearBtn.type = 'button';
508
+ clearBtn.className = 'pg-filter-panel__clear-btn';
509
+ clearBtn.textContent = 'Clear Filter';
510
+ clearBtn.addEventListener('click', () => {
511
+ this.config.onFilterChange(null);
512
+ this.destroy();
513
+ });
514
+ footer.appendChild(clearBtn);
515
+ return footer;
516
+ }
517
+ // ─── Filter building ──────────────────────────────────────────────────────
518
+ buildColumnFilter() {
519
+ const colDef = this.config.colDef;
520
+ const type = colDef.type ?? 'string';
521
+ if (isSetType(type)) {
522
+ // All selected = no filter
523
+ if (this.selectedValues.size >= this.allOptions.length)
524
+ return null;
525
+ if (this.selectedValues.size === 0) {
526
+ // Nothing selected — filter passes nothing
527
+ return {
528
+ colId: colDef.colId,
529
+ field: colDef.field,
530
+ type: 'dropdown',
531
+ logic: 'and',
532
+ conditions: [{ operator: 'equals', value: '__NO_MATCH__' }],
533
+ selectedIds: [],
534
+ };
535
+ }
536
+ return {
537
+ colId: colDef.colId,
538
+ field: colDef.field,
539
+ type: 'dropdown',
540
+ logic: 'and',
541
+ conditions: [{ operator: 'in', value: null }],
542
+ selectedIds: Array.from(this.selectedValues),
543
+ };
544
+ }
545
+ // ── Condition filter ───────────────────────────────────────────────────
546
+ const filterType = this.getFilterDataType(type);
547
+ const c1 = this.buildConditionObject(this.op1, this.val1, this.val1To);
548
+ if (!c1)
549
+ return null;
550
+ const hasCond2 = this.logicMode !== 'none';
551
+ const c2 = hasCond2 ? this.buildConditionObject(this.op2, this.val2, this.val2To) : null;
552
+ if (!c2) {
553
+ return {
554
+ colId: colDef.colId,
555
+ field: colDef.field,
556
+ type: filterType,
557
+ logic: 'and',
558
+ conditions: [c1],
559
+ };
560
+ }
561
+ return {
562
+ colId: colDef.colId,
563
+ field: colDef.field,
564
+ type: filterType,
565
+ logic: this.logicMode,
566
+ conditions: [c1, c2],
567
+ };
568
+ }
569
+ buildConditionObject(op, val, valTo) {
570
+ if (isNoValueOperator(op))
571
+ return { operator: op, value: null };
572
+ if (val.trim() === '')
573
+ return null;
574
+ if (isRangeOperator(op)) {
575
+ return { operator: op, value: val.trim(), valueTo: valTo.trim() };
576
+ }
577
+ return { operator: op, value: val.trim() };
578
+ }
579
+ getFilterDataType(colType) {
580
+ switch (colType) {
581
+ case 'number':
582
+ case 'currency':
583
+ case 'percentage': return 'number';
584
+ case 'date':
585
+ case 'time': return 'date';
586
+ case 'boolean': return 'boolean';
587
+ case 'dropdown': return 'dropdown';
588
+ case 'array': return 'array';
589
+ default: return 'string';
590
+ }
591
+ }
592
+ // ─── Emit helpers ─────────────────────────────────────────────────────────
593
+ scheduleEmit() {
594
+ this.clearDebounce();
595
+ this.debounceTimer = setTimeout(() => this.emitFilter(), DEBOUNCE_MS);
596
+ }
597
+ emitFilter() {
598
+ const filter = this.buildColumnFilter();
599
+ this.config.onFilterChange(filter);
600
+ }
601
+ clearDebounce() {
602
+ if (this.debounceTimer !== null) {
603
+ clearTimeout(this.debounceTimer);
604
+ this.debounceTimer = null;
605
+ }
606
+ }
607
+ // ─── Positioning ──────────────────────────────────────────────────────────
608
+ position() {
609
+ if (!this.panelEl)
610
+ return;
611
+ const anchorRect = this.config.anchorEl.getBoundingClientRect();
612
+ const containerRect = this.config.containerEl.getBoundingClientRect();
613
+ let top = anchorRect.bottom - containerRect.top;
614
+ let left = anchorRect.left - containerRect.left;
615
+ // Force a layout so we can read dimensions
616
+ const panelW = this.panelEl.offsetWidth || 280;
617
+ const containerW = containerRect.width;
618
+ // Clamp right edge
619
+ if (left + panelW > containerW) {
620
+ left = Math.max(0, containerW - panelW);
621
+ }
622
+ // Clamp bottom edge — flip upward if needed
623
+ const panelH = this.panelEl.offsetHeight || 300;
624
+ const remainingH = containerRect.height - top;
625
+ if (remainingH < panelH && top > panelH) {
626
+ top = anchorRect.top - containerRect.top - panelH;
627
+ }
628
+ this.panelEl.style.top = `${Math.max(0, top)}px`;
629
+ this.panelEl.style.left = `${Math.max(0, left)}px`;
630
+ }
631
+ // ─── Global event handlers ────────────────────────────────────────────────
632
+ handleClickOutside(e) {
633
+ const target = e.target;
634
+ if (this.panelEl?.contains(target) || this.config.anchorEl?.contains(target))
635
+ return;
636
+ this.destroy();
637
+ }
638
+ handleEscapeKey(e) {
639
+ if (e.key === 'Escape') {
640
+ e.stopPropagation();
641
+ this.destroy();
642
+ }
643
+ }
644
+ }
645
+ //# sourceMappingURL=filter-panel.js.map