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,13 @@
1
+ import type { ColumnDef } from '../../types/column.types';
2
+ import type { RowNode } from '../../types/row.types';
3
+ import type { CardinalityInfo } from './types';
4
+ /**
5
+ * Counts distinct values for a single column and classifies cardinality.
6
+ * Used by the RecommendationEngine to choose between pie (low cardinality)
7
+ * and bar charts (high cardinality).
8
+ */
9
+ export declare class CardinalityAnalyzer {
10
+ /** @param topN Max number of top-frequency values to return */
11
+ analyze(column: ColumnDef, rows: RowNode[], topN?: number): CardinalityInfo;
12
+ }
13
+ //# sourceMappingURL=cardinality-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardinality-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/cardinality-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,gEAAgE;IAChE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,SAAK,GAAG,eAAe;CAqBxE"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Counts distinct values for a single column and classifies cardinality.
3
+ * Used by the RecommendationEngine to choose between pie (low cardinality)
4
+ * and bar charts (high cardinality).
5
+ */
6
+ export class CardinalityAnalyzer {
7
+ /** @param topN Max number of top-frequency values to return */
8
+ analyze(column, rows, topN = 20) {
9
+ const freq = new Map();
10
+ for (const row of rows) {
11
+ if (row.type !== 'data')
12
+ continue;
13
+ const raw = row.data[column.field];
14
+ const key = raw == null ? '' : String(raw);
15
+ freq.set(key, (freq.get(key) ?? 0) + 1);
16
+ }
17
+ const topValues = Array.from(freq.entries())
18
+ .sort((a, b) => b[1] - a[1])
19
+ .slice(0, topN)
20
+ .map(([k]) => k);
21
+ return {
22
+ uniqueCount: freq.size,
23
+ isHighCardinality: freq.size > 20,
24
+ topValues,
25
+ };
26
+ }
27
+ }
28
+ //# sourceMappingURL=cardinality-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardinality-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/cardinality-analyzer.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IAC9B,gEAAgE;IAChE,OAAO,CAAC,MAAiB,EAAE,IAAe,EAAE,IAAI,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAClC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;aACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;aACd,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnB,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,IAAI;YACtB,iBAAiB,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE;YACjC,SAAS;SACV,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { ColumnDef } from '../../types/column.types';
2
+ import type { RowNode } from '../../types/row.types';
3
+ import type { DimensionInfo } from './types';
4
+ /**
5
+ * Identifies categorical/ordinal columns in the selection and computes
6
+ * cardinality metadata needed by downstream analyzers and the
7
+ * RecommendationEngine.
8
+ */
9
+ export declare class DimensionAnalyzer {
10
+ analyze(columns: ColumnDef[], rows: RowNode[]): DimensionInfo[];
11
+ }
12
+ //# sourceMappingURL=dimension-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/dimension-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE;CA2BhE"}
@@ -0,0 +1,33 @@
1
+ import { DIMENSION_TYPES, DATE_TYPES, MAX_CATEGORIES } from './types';
2
+ /**
3
+ * Identifies categorical/ordinal columns in the selection and computes
4
+ * cardinality metadata needed by downstream analyzers and the
5
+ * RecommendationEngine.
6
+ */
7
+ export class DimensionAnalyzer {
8
+ analyze(columns, rows) {
9
+ const dimCols = columns.filter((c) => DIMENSION_TYPES.has(c.type));
10
+ return dimCols.map((col) => {
11
+ const seen = new Set();
12
+ for (const row of rows) {
13
+ if (row.type !== 'data')
14
+ continue;
15
+ const raw = row.data[col.field];
16
+ seen.add(raw == null ? '' : String(raw));
17
+ }
18
+ const isDate = DATE_TYPES.has(col.type);
19
+ const isBoolean = col.type === 'boolean';
20
+ const isHighCardinality = seen.size > 20;
21
+ const uniqueValues = Array.from(seen).slice(0, MAX_CATEGORIES);
22
+ return {
23
+ column: col,
24
+ role: isDate ? 'date' : isBoolean ? 'boolean' : 'category',
25
+ uniqueValues,
26
+ uniqueCount: seen.size,
27
+ isHighCardinality,
28
+ isDate,
29
+ };
30
+ });
31
+ }
32
+ }
33
+ //# sourceMappingURL=dimension-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/dimension-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGtE;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAC5B,OAAO,CAAC,OAAoB,EAAE,IAAe;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC;QAE7E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;oBAAE,SAAS;gBAClC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;YACzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACzC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAE/D,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;gBAC1D,YAAY;gBACZ,WAAW,EAAE,IAAI,CAAC,IAAI;gBACtB,iBAAiB;gBACjB,MAAM;aACP,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { MeasureInfo, AnalyzedChart } from './types';
2
+ /**
3
+ * Produces a frequency-distribution dataset from a single numeric column.
4
+ * Bin count is determined by Sturges' formula: ceil(log2(n) + 1).
5
+ * The output is consumed by a column-grouped chart in the renderer.
6
+ */
7
+ export declare class HistogramAnalyzer {
8
+ analyze(measures: MeasureInfo[]): AnalyzedChart | null;
9
+ private fmtRange;
10
+ }
11
+ //# sourceMappingURL=histogram-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/histogram-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG1D;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,aAAa,GAAG,IAAI;IA+BtD,OAAO,CAAC,QAAQ;CAOjB"}
@@ -0,0 +1,43 @@
1
+ import { APEX_COLORS } from './types';
2
+ /**
3
+ * Produces a frequency-distribution dataset from a single numeric column.
4
+ * Bin count is determined by Sturges' formula: ceil(log2(n) + 1).
5
+ * The output is consumed by a column-grouped chart in the renderer.
6
+ */
7
+ export class HistogramAnalyzer {
8
+ analyze(measures) {
9
+ if (!measures.length)
10
+ return null;
11
+ const measure = measures[0];
12
+ const values = measure.allValues.filter((v) => !isNaN(v));
13
+ if (!values.length)
14
+ return null;
15
+ // Sturges' formula, clamped between 5 and 20 bins
16
+ const binCount = Math.min(Math.max(Math.ceil(Math.log2(values.length) + 1), 5), 20);
17
+ const range = measure.max - measure.min || 1;
18
+ const binSize = range / binCount;
19
+ const bins = [];
20
+ for (let i = 0; i < binCount; i++) {
21
+ bins.push({ start: measure.min + i * binSize, end: measure.min + (i + 1) * binSize, count: 0 });
22
+ }
23
+ for (const v of values) {
24
+ const idx = Math.min(Math.floor((v - measure.min) / binSize), binCount - 1);
25
+ if (idx >= 0)
26
+ bins[idx].count++;
27
+ }
28
+ return {
29
+ title: `${measure.column.header} Distribution`,
30
+ data: {
31
+ labels: bins.map((b) => this.fmtRange(b.start, b.end)),
32
+ datasets: [{ label: 'Frequency', data: bins.map((b) => b.count), color: APEX_COLORS[0] }],
33
+ },
34
+ };
35
+ }
36
+ fmtRange(start, end) {
37
+ const f = (n) => n >= 1000000 ? `${(n / 1000000).toFixed(1)}M`
38
+ : n >= 1000 ? `${(n / 1000).toFixed(1)}K`
39
+ : Number.isInteger(n) ? String(n) : n.toFixed(1);
40
+ return `${f(start)}–${f(end)}`;
41
+ }
42
+ }
43
+ //# sourceMappingURL=histogram-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/histogram-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { RowNode } from '../../types/row.types';
2
+ import type { ColumnDef } from '../../types/column.types';
3
+ import type { CellRange } from '../../types/grid.types';
4
+ import { CardinalityAnalyzer } from './cardinality-analyzer';
5
+ import type { AnalyzedChart, ChartRecommendation } from './types';
6
+ export type { AnalyzedChart, ChartRecommendation };
7
+ /**
8
+ * Top-level orchestrator that mirrors AG Grid's chart-range analysis pipeline:
9
+ *
10
+ * selection → DimensionAnalyzer + MeasureAnalyzer
11
+ * → RecommendationEngine (best chart type)
12
+ * → chart-specific Analyzer (data shaping)
13
+ * → AnalyzedChart (title + ChartData)
14
+ *
15
+ * Public API
16
+ * ----------
17
+ * analyze(ranges, rows, columns)
18
+ * Returns the best-fit chart data for the current selection, or null when
19
+ * the selection contains no numeric columns.
20
+ *
21
+ * analyzeForType(chartType, ranges, rows, columns)
22
+ * Returns chart data shaped for the explicitly-requested chart type.
23
+ *
24
+ * recommend(ranges, rows, columns)
25
+ * Returns a ranked list of ChartRecommendation objects so a UI can suggest
26
+ * chart types to the user (future use / API extension).
27
+ */
28
+ export declare class ChartAnalyzer {
29
+ private readonly dimensionAnalyzer;
30
+ private readonly measureAnalyzer;
31
+ readonly cardinalityAnalyzer: CardinalityAnalyzer;
32
+ private readonly aggregationAnalyzer;
33
+ private readonly histogramAnalyzer;
34
+ private readonly scatterAnalyzer;
35
+ private readonly bubbleAnalyzer;
36
+ private readonly pieAnalyzer;
37
+ private readonly barAnalyzer;
38
+ private readonly lineAnalyzer;
39
+ private readonly recommendationEngine;
40
+ /**
41
+ * Analyse a cell selection and return data shaped for the best chart type
42
+ * recommended by the RecommendationEngine, or null if no numeric data.
43
+ */
44
+ analyze(ranges: CellRange[], rows: RowNode[], columns: ColumnDef[]): AnalyzedChart | null;
45
+ /**
46
+ * Analyse a cell selection and return data shaped for the explicitly
47
+ * requested chart type. Returns null if there are no numeric columns.
48
+ */
49
+ analyzeForType(chartType: string, ranges: CellRange[], rows: RowNode[], columns: ColumnDef[]): AnalyzedChart | null;
50
+ /**
51
+ * Return a ranked list of chart-type recommendations for the current
52
+ * selection. Useful for a "Recommended charts" panel (not yet in the UI).
53
+ */
54
+ recommend(ranges: CellRange[], rows: RowNode[], columns: ColumnDef[]): ChartRecommendation[];
55
+ private buildContext;
56
+ private dispatch;
57
+ }
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKxD,OAAO,EAAE,mBAAmB,EAAE,MAAO,wBAAwB,CAAC;AAU9D,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAA8B,MAAM,SAAS,CAAC;AAE9F,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAa;IAExB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAC9D,QAAQ,CAAS,mBAAmB,sBAA8B;IAClE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA8B;IAClE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;IAC3D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8B;IAInE;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,GAAG,IAAI;IAYzF;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,GAAG,IAAI;IAUnH;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,mBAAmB,EAAE;IAQ5F,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,QAAQ;CAoCjB"}
@@ -0,0 +1,130 @@
1
+ import { normalizeRange } from '../../cell-selection/selection-range';
2
+ import { DimensionAnalyzer } from './dimension-analyzer';
3
+ import { MeasureAnalyzer } from './measure-analyzer';
4
+ import { CardinalityAnalyzer } from './cardinality-analyzer';
5
+ import { AggregationAnalyzer } from './aggregation-analyzer';
6
+ import { HistogramAnalyzer } from './histogram-analyzer';
7
+ import { ScatterAnalyzer } from './scatter-analyzer';
8
+ import { BubbleAnalyzer } from './bubble-analyzer';
9
+ import { PieAnalyzer } from './pie-analyzer';
10
+ import { BarAnalyzer } from './bar-analyzer';
11
+ import { LineAnalyzer } from './line-analyzer';
12
+ import { RecommendationEngine } from './recommendation-engine';
13
+ /**
14
+ * Top-level orchestrator that mirrors AG Grid's chart-range analysis pipeline:
15
+ *
16
+ * selection → DimensionAnalyzer + MeasureAnalyzer
17
+ * → RecommendationEngine (best chart type)
18
+ * → chart-specific Analyzer (data shaping)
19
+ * → AnalyzedChart (title + ChartData)
20
+ *
21
+ * Public API
22
+ * ----------
23
+ * analyze(ranges, rows, columns)
24
+ * Returns the best-fit chart data for the current selection, or null when
25
+ * the selection contains no numeric columns.
26
+ *
27
+ * analyzeForType(chartType, ranges, rows, columns)
28
+ * Returns chart data shaped for the explicitly-requested chart type.
29
+ *
30
+ * recommend(ranges, rows, columns)
31
+ * Returns a ranked list of ChartRecommendation objects so a UI can suggest
32
+ * chart types to the user (future use / API extension).
33
+ */
34
+ export class ChartAnalyzer {
35
+ constructor() {
36
+ // ── Sub-analyzers ────────────────────────────────────────────────────────
37
+ this.dimensionAnalyzer = new DimensionAnalyzer();
38
+ this.measureAnalyzer = new MeasureAnalyzer();
39
+ this.cardinalityAnalyzer = new CardinalityAnalyzer(); // public for potential external use
40
+ this.aggregationAnalyzer = new AggregationAnalyzer();
41
+ this.histogramAnalyzer = new HistogramAnalyzer();
42
+ this.scatterAnalyzer = new ScatterAnalyzer();
43
+ this.bubbleAnalyzer = new BubbleAnalyzer();
44
+ this.pieAnalyzer = new PieAnalyzer();
45
+ this.barAnalyzer = new BarAnalyzer();
46
+ this.lineAnalyzer = new LineAnalyzer();
47
+ this.recommendationEngine = new RecommendationEngine();
48
+ }
49
+ // ── Public API ───────────────────────────────────────────────────────────
50
+ /**
51
+ * Analyse a cell selection and return data shaped for the best chart type
52
+ * recommended by the RecommendationEngine, or null if no numeric data.
53
+ */
54
+ analyze(ranges, rows, columns) {
55
+ const ctx = this.buildContext(ranges, rows, columns);
56
+ if (!ctx)
57
+ return null;
58
+ const { dimensions, measures, selectedRows } = ctx;
59
+ if (!measures.length)
60
+ return null;
61
+ const recs = this.recommendationEngine.recommend(dimensions, measures);
62
+ const bestType = recs[0]?.chartType ?? 'column-grouped';
63
+ return this.dispatch(bestType, dimensions, measures, selectedRows);
64
+ }
65
+ /**
66
+ * Analyse a cell selection and return data shaped for the explicitly
67
+ * requested chart type. Returns null if there are no numeric columns.
68
+ */
69
+ analyzeForType(chartType, ranges, rows, columns) {
70
+ const ctx = this.buildContext(ranges, rows, columns);
71
+ if (!ctx)
72
+ return null;
73
+ const { dimensions, measures, selectedRows } = ctx;
74
+ if (!measures.length)
75
+ return null;
76
+ return this.dispatch(chartType, dimensions, measures, selectedRows);
77
+ }
78
+ /**
79
+ * Return a ranked list of chart-type recommendations for the current
80
+ * selection. Useful for a "Recommended charts" panel (not yet in the UI).
81
+ */
82
+ recommend(ranges, rows, columns) {
83
+ const ctx = this.buildContext(ranges, rows, columns);
84
+ if (!ctx)
85
+ return [];
86
+ return this.recommendationEngine.recommend(ctx.dimensions, ctx.measures);
87
+ }
88
+ // ── Private helpers ──────────────────────────────────────────────────────
89
+ buildContext(ranges, rows, columns) {
90
+ if (!ranges.length || !rows.length || !columns.length)
91
+ return null;
92
+ const norm = normalizeRange(ranges[0]);
93
+ const selectedCols = columns.slice(norm.startColIndex, norm.endColIndex + 1);
94
+ const selectedRows = rows
95
+ .slice(norm.startRowIndex, norm.endRowIndex + 1)
96
+ .filter((r) => r.type === 'data');
97
+ if (!selectedRows.length || !selectedCols.length)
98
+ return null;
99
+ const dimensions = this.dimensionAnalyzer.analyze(selectedCols, selectedRows);
100
+ const measures = this.measureAnalyzer.analyze(selectedCols, selectedRows);
101
+ return { dimensions, measures, selectedRows, selectedCols };
102
+ }
103
+ dispatch(chartType, dimensions, measures, rows) {
104
+ switch (chartType) {
105
+ case 'pie':
106
+ case 'doughnut':
107
+ return this.pieAnalyzer.analyze(dimensions, measures, rows, this.aggregationAnalyzer);
108
+ case 'scatter':
109
+ return this.scatterAnalyzer.analyze(dimensions, measures, rows);
110
+ case 'bubble':
111
+ return this.bubbleAnalyzer.analyze(dimensions, measures, rows);
112
+ case 'line':
113
+ case 'area':
114
+ return this.lineAnalyzer.analyze(dimensions, measures, rows, this.aggregationAnalyzer);
115
+ case 'column-grouped':
116
+ case 'column-stacked':
117
+ case 'column-100stacked': {
118
+ // Single measure + no dimension → histogram (frequency distribution)
119
+ if (dimensions.length === 0 && measures.length === 1) {
120
+ return this.histogramAnalyzer.analyze(measures);
121
+ }
122
+ return this.barAnalyzer.analyze(dimensions, measures, rows, this.aggregationAnalyzer);
123
+ }
124
+ default:
125
+ // bar-grouped, bar-stacked, bar-100stacked, funnel, polar
126
+ return this.barAnalyzer.analyze(dimensions, measures, rows, this.aggregationAnalyzer);
127
+ }
128
+ }
129
+ }
130
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { RowNode } from '../../types/row.types';
2
+ import type { DimensionInfo, MeasureInfo, AnalyzedChart } from './types';
3
+ import type { AggregationAnalyzer } from './aggregation-analyzer';
4
+ /**
5
+ * Builds data for line and area charts.
6
+ *
7
+ * Strategy:
8
+ * • date dimension present → aggregate measures over the date axis;
9
+ * produces a proper time-series with X labels from the date column.
10
+ * • category dimension → same aggregation, labels from the dimension.
11
+ * • no dimension → use row-index labels (1, 2, 3…), each row
12
+ * is a separate data point with no aggregation.
13
+ *
14
+ * Titles:
15
+ * • one measure + date dim → "Revenue over Date"
16
+ * • one measure + category → "Revenue by Category"
17
+ * • multiple measures → "Revenue & Profit"
18
+ */
19
+ export declare class LineAnalyzer {
20
+ private static readonly MAX_POINTS_NO_DIM;
21
+ analyze(dimensions: DimensionInfo[], measures: MeasureInfo[], rows: RowNode[], agg: AggregationAnalyzer): AnalyzedChart | null;
22
+ }
23
+ //# sourceMappingURL=line-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/line-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;;;;;;;;;GAcG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAM;IAE/C,OAAO,CACL,UAAU,EAAE,aAAa,EAAE,EAC3B,QAAQ,EAAE,WAAW,EAAE,EACvB,IAAI,EAAE,OAAO,EAAE,EACf,GAAG,EAAE,mBAAmB,GACvB,aAAa,GAAG,IAAI;CAkDxB"}
@@ -0,0 +1,61 @@
1
+ import { APEX_COLORS } from './types';
2
+ /**
3
+ * Builds data for line and area charts.
4
+ *
5
+ * Strategy:
6
+ * • date dimension present → aggregate measures over the date axis;
7
+ * produces a proper time-series with X labels from the date column.
8
+ * • category dimension → same aggregation, labels from the dimension.
9
+ * • no dimension → use row-index labels (1, 2, 3…), each row
10
+ * is a separate data point with no aggregation.
11
+ *
12
+ * Titles:
13
+ * • one measure + date dim → "Revenue over Date"
14
+ * • one measure + category → "Revenue by Category"
15
+ * • multiple measures → "Revenue & Profit"
16
+ */
17
+ export class LineAnalyzer {
18
+ analyze(dimensions, measures, rows, agg) {
19
+ if (!measures.length)
20
+ return null;
21
+ // Prefer date dimension for a true time-series; fall back to first dimension
22
+ const dim = dimensions.find((d) => d.isDate) ?? dimensions[0] ?? null;
23
+ if (!dim) {
24
+ // Raw row-index series — good for trending visualisation without categories
25
+ const dataRows = rows.filter((r) => r.type === 'data').slice(0, LineAnalyzer.MAX_POINTS_NO_DIM);
26
+ const title = measures.map((m) => m.column.header).join(' & ');
27
+ return {
28
+ title,
29
+ data: {
30
+ labels: dataRows.map((_, i) => String(i + 1)),
31
+ datasets: measures.map((m, i) => ({
32
+ label: m.column.header,
33
+ data: dataRows.map((r) => {
34
+ const v = Number(r.data[m.column.field]);
35
+ return isNaN(v) ? 0 : v;
36
+ }),
37
+ color: APEX_COLORS[i % APEX_COLORS.length],
38
+ })),
39
+ },
40
+ };
41
+ }
42
+ const aggregated = agg.aggregate(dim.column, measures.map((m) => m.column), rows);
43
+ const connector = dim.isDate ? 'over' : 'by';
44
+ const title = measures.length === 1
45
+ ? `${measures[0].column.header} ${connector} ${dim.column.header}`
46
+ : measures.map((m) => m.column.header).join(' & ');
47
+ return {
48
+ title,
49
+ data: {
50
+ labels: aggregated.labels,
51
+ datasets: measures.map((m, i) => ({
52
+ label: m.column.header,
53
+ data: aggregated.seriesData.get(m.column.field) ?? [],
54
+ color: APEX_COLORS[i % APEX_COLORS.length],
55
+ })),
56
+ },
57
+ };
58
+ }
59
+ }
60
+ LineAnalyzer.MAX_POINTS_NO_DIM = 50;
61
+ //# sourceMappingURL=line-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/line-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ColumnDef } from '../../types/column.types';
2
+ import type { RowNode } from '../../types/row.types';
3
+ import type { MeasureInfo } from './types';
4
+ /**
5
+ * Identifies numeric columns (number, currency, percentage) and computes
6
+ * descriptive statistics used by chart-specific analyzers.
7
+ */
8
+ export declare class MeasureAnalyzer {
9
+ analyze(columns: ColumnDef[], rows: RowNode[]): MeasureInfo[];
10
+ }
11
+ //# sourceMappingURL=measure-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/measure-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE;CAsC9D"}
@@ -0,0 +1,44 @@
1
+ import { MEASURE_TYPES } from './types';
2
+ /**
3
+ * Identifies numeric columns (number, currency, percentage) and computes
4
+ * descriptive statistics used by chart-specific analyzers.
5
+ */
6
+ export class MeasureAnalyzer {
7
+ analyze(columns, rows) {
8
+ const measCols = columns.filter((c) => MEASURE_TYPES.has(c.type));
9
+ return measCols.map((col) => {
10
+ const allValues = [];
11
+ for (const row of rows) {
12
+ if (row.type !== 'data')
13
+ continue;
14
+ const v = Number(row.data[col.field]);
15
+ if (!isNaN(v))
16
+ allValues.push(v);
17
+ }
18
+ if (!allValues.length) {
19
+ return { column: col, min: 0, max: 0, sum: 0, avg: 0, count: 0, hasNegatives: false, allValues };
20
+ }
21
+ let min = allValues[0];
22
+ let max = allValues[0];
23
+ let sum = 0;
24
+ for (const v of allValues) {
25
+ if (v < min)
26
+ min = v;
27
+ if (v > max)
28
+ max = v;
29
+ sum += v;
30
+ }
31
+ return {
32
+ column: col,
33
+ min,
34
+ max,
35
+ sum,
36
+ avg: sum / allValues.length,
37
+ count: allValues.length,
38
+ hasNegatives: min < 0,
39
+ allValues,
40
+ };
41
+ });
42
+ }
43
+ }
44
+ //# sourceMappingURL=measure-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/measure-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC;;;GAGG;AACH,MAAM,OAAO,eAAe;IAC1B,OAAO,CAAC,OAAoB,EAAE,IAAe;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC;QAE5E,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;oBAAE,SAAS;gBAClC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACtB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACnG,CAAC;YAED,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,GAAG,GAAG,CAAC,CAAC;YAEZ,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,GAAG;oBAAE,GAAG,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,GAAG,GAAG;oBAAE,GAAG,GAAG,CAAC,CAAC;gBACrB,GAAG,IAAI,CAAC,CAAC;YACX,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,GAAG;gBACH,GAAG;gBACH,GAAG;gBACH,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC,MAAM;gBAC3B,KAAK,EAAE,SAAS,CAAC,MAAM;gBACvB,YAAY,EAAE,GAAG,GAAG,CAAC;gBACrB,SAAS;aACV,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { RowNode } from '../../types/row.types';
2
+ import type { DimensionInfo, MeasureInfo, AnalyzedChart } from './types';
3
+ import type { AggregationAnalyzer } from './aggregation-analyzer';
4
+ /**
5
+ * Builds pie / doughnut chart data.
6
+ *
7
+ * Strategy:
8
+ * • 1 dimension + 1 measure → aggregate measure by dimension, top-N slices
9
+ * with an "Other (n)" remainder slice when the category count exceeds
10
+ * PIE_MAX_SLICES.
11
+ * • No dimension → treat the first PIE_MAX_SLICES rows as individual slices.
12
+ *
13
+ * Slices are sorted by value (descending) so the largest segment always
14
+ * appears first at the 12-o'clock position in the renderer.
15
+ */
16
+ export declare class PieAnalyzer {
17
+ analyze(dimensions: DimensionInfo[], measures: MeasureInfo[], rows: RowNode[], agg: AggregationAnalyzer): AnalyzedChart | null;
18
+ }
19
+ //# sourceMappingURL=pie-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/pie-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,OAAO,CACL,UAAU,EAAE,aAAa,EAAE,EAC3B,QAAQ,EAAE,WAAW,EAAE,EACvB,IAAI,EAAE,OAAO,EAAE,EACf,GAAG,EAAE,mBAAmB,GACvB,aAAa,GAAG,IAAI;CAsDxB"}
@@ -0,0 +1,64 @@
1
+ import { APEX_COLORS, PIE_MAX_SLICES } from './types';
2
+ /**
3
+ * Builds pie / doughnut chart data.
4
+ *
5
+ * Strategy:
6
+ * • 1 dimension + 1 measure → aggregate measure by dimension, top-N slices
7
+ * with an "Other (n)" remainder slice when the category count exceeds
8
+ * PIE_MAX_SLICES.
9
+ * • No dimension → treat the first PIE_MAX_SLICES rows as individual slices.
10
+ *
11
+ * Slices are sorted by value (descending) so the largest segment always
12
+ * appears first at the 12-o'clock position in the renderer.
13
+ */
14
+ export class PieAnalyzer {
15
+ analyze(dimensions, measures, rows, agg) {
16
+ if (!measures.length)
17
+ return null;
18
+ const dim = dimensions[0] ?? null;
19
+ const measure = measures[0];
20
+ if (!dim) {
21
+ // Dimensionless: show raw values of the first measure
22
+ const sliceRows = rows.filter((r) => r.type === 'data').slice(0, PIE_MAX_SLICES);
23
+ return {
24
+ title: `${measure.column.header} Distribution`,
25
+ data: {
26
+ labels: sliceRows.map((_, i) => `Row ${i + 1}`),
27
+ datasets: [{
28
+ label: measure.column.header,
29
+ data: sliceRows.map((r) => {
30
+ const v = Number(r.data[measure.column.field]);
31
+ return isNaN(v) ? 0 : v;
32
+ }),
33
+ color: APEX_COLORS[0],
34
+ }],
35
+ },
36
+ };
37
+ }
38
+ // Aggregate measure by dimension
39
+ const aggregated = agg.aggregate(dim.column, [measure.column], rows);
40
+ const measureData = aggregated.seriesData.get(measure.column.field) ?? [];
41
+ // Pair labels with values, sort descending
42
+ const pairs = aggregated.labels
43
+ .map((label, i) => ({ label, value: measureData[i] ?? 0 }))
44
+ .sort((a, b) => b.value - a.value);
45
+ let topSlices = pairs.slice(0, PIE_MAX_SLICES);
46
+ const remainder = pairs.slice(PIE_MAX_SLICES);
47
+ if (remainder.length > 0) {
48
+ const otherSum = remainder.reduce((s, p) => s + p.value, 0);
49
+ topSlices.push({ label: `Other (${remainder.length})`, value: otherSum });
50
+ }
51
+ return {
52
+ title: `${measure.column.header} by ${dim.column.header}`,
53
+ data: {
54
+ labels: topSlices.map((s) => s.label),
55
+ datasets: [{
56
+ label: measure.column.header,
57
+ data: topSlices.map((s) => s.value),
58
+ color: APEX_COLORS[0],
59
+ }],
60
+ },
61
+ };
62
+ }
63
+ }
64
+ //# sourceMappingURL=pie-analyzer.js.map