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,873 @@
1
+ import { GridEventType } from '../types/event.types';
2
+ import { createDiv } from './dom-utils';
3
+ // ── Enums ────────────────────────────────────────────────────────────────────
4
+ /**
5
+ * Identifiers for the nine sections of the column context menu.
6
+ *
7
+ * Pass a subset to {@link ColumnMenuOptions.sections} to restrict which sections
8
+ * are rendered — for example, `[ColumnMenuSection.SORT, ColumnMenuSection.PIN]`.
9
+ */
10
+ export var ColumnMenuSection;
11
+ (function (ColumnMenuSection) {
12
+ /** Sort Ascending / Sort Descending / Clear Sort */
13
+ ColumnMenuSection["SORT"] = "sort";
14
+ /** Quick Filter / Advanced Filter / Clear Filter */
15
+ ColumnMenuSection["FILTER"] = "filter";
16
+ /** Pin submenu: Pin Left / Pin Right / Unpin */
17
+ ColumnMenuSection["PIN"] = "pin";
18
+ /** Move Left / Move Right / Move to Start / Move to End */
19
+ ColumnMenuSection["MOVE"] = "move";
20
+ /** Resize submenu: Auto Size / Auto Size All / Fit to Grid / Reset Width */
21
+ ColumnMenuSection["RESIZE"] = "resize";
22
+ /** Visibility submenu: Hide Column / Column Chooser */
23
+ ColumnMenuSection["VISIBILITY"] = "visibility";
24
+ /** Group by Column + Aggregate submenu */
25
+ ColumnMenuSection["DATA"] = "data";
26
+ /** Clipboard submenu: Copy Header / Copy Column / Copy Values */
27
+ ColumnMenuSection["CLIPBOARD"] = "clipboard";
28
+ /** Column submenu: Rename / Duplicate / Freeze / Lock / Reset */
29
+ ColumnMenuSection["COLUMN"] = "column";
30
+ })(ColumnMenuSection || (ColumnMenuSection = {}));
31
+ /**
32
+ * Aggregate functions available in the Data → Aggregate submenu.
33
+ */
34
+ export var AggregateFunction;
35
+ (function (AggregateFunction) {
36
+ AggregateFunction["SUM"] = "sum";
37
+ AggregateFunction["AVG"] = "avg";
38
+ AggregateFunction["MIN"] = "min";
39
+ AggregateFunction["MAX"] = "max";
40
+ AggregateFunction["COUNT"] = "count";
41
+ })(AggregateFunction || (AggregateFunction = {}));
42
+ // ── Section group layout ─────────────────────────────────────────────────────
43
+ /**
44
+ * Sections that share the same separator group. A horizontal divider is
45
+ * inserted between groups but **not** between sections within the same group.
46
+ *
47
+ * Grouping: Sort | Filter | Pin+Move | Resize | Visibility | Data | Clipboard | Column
48
+ */
49
+ const SECTION_GROUPS = [
50
+ [ColumnMenuSection.SORT],
51
+ [ColumnMenuSection.FILTER],
52
+ [ColumnMenuSection.PIN, ColumnMenuSection.MOVE],
53
+ [ColumnMenuSection.RESIZE],
54
+ [ColumnMenuSection.VISIBILITY],
55
+ [ColumnMenuSection.DATA],
56
+ [ColumnMenuSection.CLIPBOARD],
57
+ [ColumnMenuSection.COLUMN],
58
+ ];
59
+ // ── Class ────────────────────────────────────────────────────────────────────
60
+ /**
61
+ * Full-featured column context menu for PhotonGrid flat column headers.
62
+ *
63
+ * ### Sections
64
+ * Nine configurable sections are supported (see {@link ColumnMenuSection}):
65
+ * Sort, Filter, Pin (submenu), Move, Resize (submenu), Visibility (submenu),
66
+ * Data (Group by + Aggregate submenu), Clipboard (submenu), Column (submenu).
67
+ *
68
+ * ### Submenus
69
+ * Parent items (Pin, Resize, Visibility, Clipboard, Column, and Aggregate)
70
+ * reveal fly-out submenus on hover. Submenus are automatically flipped
71
+ * horizontally when they would overflow the viewport's right edge.
72
+ *
73
+ * ### CSS
74
+ * All visual styling is driven by theme CSS variables (`--pg-colors-*`,
75
+ * `--pg-typography-*`, etc.) — no inline style declarations.
76
+ *
77
+ * ### Usage
78
+ * ```ts
79
+ * const menu = new ColumnMenu(columnModel, sortEngine, eventBus, iconRenderer, onAction);
80
+ * menu.setMenuCallbacks({ onAutoSize: (id) => api.autoSizeColumn(id), … });
81
+ * menu.setMenuOptions({ sections: [ColumnMenuSection.SORT, ColumnMenuSection.PIN] });
82
+ *
83
+ * // Trigger from ⋯ button
84
+ * menuBtn.addEventListener('click', () => menu.show(colDef, menuBtn));
85
+ * // Trigger from right-click
86
+ * th.addEventListener('contextmenu', (e) => { e.preventDefault(); menu.show(colDef, th, e.clientX, e.clientY); });
87
+ * ```
88
+ */
89
+ export class ColumnMenu {
90
+ constructor(columnModel, sortEngine, eventBus, iconRenderer, onAction) {
91
+ this.columnModel = columnModel;
92
+ this.sortEngine = sortEngine;
93
+ this.eventBus = eventBus;
94
+ this.iconRenderer = iconRenderer;
95
+ this.onAction = onAction;
96
+ this.el = null;
97
+ this.anchorEl = null;
98
+ this.outsideClickFn = null;
99
+ this.escKeyFn = null;
100
+ this.openSubmenuTimer = null;
101
+ this.closeSubmenuTimer = null;
102
+ this.activeSubmenuEl = null;
103
+ /**
104
+ * Maps each submenu to the parent item that opens it. Needed because
105
+ * submenus are portaled to `document.body` (see {@link openSubmenu}) rather
106
+ * than left nested inside their parent item, so `.closest()` can no longer
107
+ * find the owning item once a submenu is detached.
108
+ */
109
+ this.submenuParents = new Map();
110
+ this.groupCallbacks = null;
111
+ this.menuCallbacks = {};
112
+ this.menuOptions = {};
113
+ }
114
+ // ── Public API ────────────────────────────────────────────────────────────
115
+ /**
116
+ * Register callbacks for operations that are delegated outside the menu class.
117
+ * Call this once after construction — all callbacks are optional.
118
+ */
119
+ setMenuCallbacks(callbacks) {
120
+ this.menuCallbacks = callbacks;
121
+ }
122
+ /**
123
+ * Configure which sections appear and whether right-click is supported.
124
+ * Call this once after construction or whenever options change.
125
+ */
126
+ setMenuOptions(options) {
127
+ this.menuOptions = options;
128
+ }
129
+ /**
130
+ * Register row-grouping integration callbacks.
131
+ * Required to enable the "Group by Column" item in the Data section.
132
+ */
133
+ setGroupCallbacks(callbacks) {
134
+ this.groupCallbacks = callbacks;
135
+ }
136
+ /**
137
+ * Show the context menu for `colDef`.
138
+ *
139
+ * @param colDef - Column the menu operates on.
140
+ * @param anchorEl - Element that triggered the menu (⋯ button or column header).
141
+ * @param clientX - Viewport X for right-click positioning; omit for button positioning.
142
+ * @param clientY - Viewport Y for right-click positioning; omit for button positioning.
143
+ */
144
+ show(colDef, anchorEl, clientX, clientY) {
145
+ this.hide();
146
+ this.anchorEl = anchorEl;
147
+ anchorEl.classList.add('pg-th__menu-btn--active');
148
+ const menu = this.buildMenu(colDef);
149
+ document.body.appendChild(menu);
150
+ this.el = menu;
151
+ this.positionMenu(anchorEl, clientX, clientY);
152
+ requestAnimationFrame(() => {
153
+ this.outsideClickFn = (e) => {
154
+ const target = e.target;
155
+ // A portaled-open submenu (see openSubmenu) lives outside `this.el`
156
+ // in the DOM, so it must be checked separately or clicks inside it
157
+ // would be misread as "outside the menu" and close everything.
158
+ if (this.el?.contains(target))
159
+ return;
160
+ if (this.activeSubmenuEl?.contains(target))
161
+ return;
162
+ this.hide();
163
+ };
164
+ this.escKeyFn = (e) => {
165
+ if (e.key === 'Escape')
166
+ this.hide();
167
+ };
168
+ document.addEventListener('mousedown', this.outsideClickFn);
169
+ document.addEventListener('keydown', this.escKeyFn);
170
+ });
171
+ }
172
+ /** Hide and remove the menu from the DOM. */
173
+ hide() {
174
+ if (this.outsideClickFn) {
175
+ document.removeEventListener('mousedown', this.outsideClickFn);
176
+ this.outsideClickFn = null;
177
+ }
178
+ if (this.escKeyFn) {
179
+ document.removeEventListener('keydown', this.escKeyFn);
180
+ this.escKeyFn = null;
181
+ }
182
+ this.clearSubmenuTimers();
183
+ // The active submenu, if any, is a portaled child of document.body (not
184
+ // of this.el), so it must be removed explicitly or it would leak.
185
+ this.activeSubmenuEl?.remove();
186
+ this.activeSubmenuEl = null;
187
+ this.submenuParents.clear();
188
+ this.anchorEl?.classList.remove('pg-th__menu-btn--active');
189
+ this.anchorEl = null;
190
+ this.el?.remove();
191
+ this.el = null;
192
+ }
193
+ /** Destroy the instance and release all resources. */
194
+ destroy() {
195
+ this.hide();
196
+ }
197
+ // ── Private: menu construction ────────────────────────────────────────────
198
+ buildMenu(colDef) {
199
+ const menu = createDiv('pg-col-ctx-menu');
200
+ menu.setAttribute('role', 'menu');
201
+ menu.setAttribute('tabindex', '-1');
202
+ const enabledSections = new Set(this.menuOptions.sections ?? Object.values(ColumnMenuSection));
203
+ const allSections = this.buildAllSections(colDef);
204
+ const sectionMap = new Map(allSections.map((s) => [s.key, s]));
205
+ let firstGroupRendered = true;
206
+ for (const group of SECTION_GROUPS) {
207
+ const visibleInGroup = group.filter((key) => enabledSections.has(key) && (sectionMap.get(key)?.items.length ?? 0) > 0);
208
+ if (visibleInGroup.length === 0)
209
+ continue;
210
+ if (!firstGroupRendered) {
211
+ menu.appendChild(this.createSeparator());
212
+ }
213
+ firstGroupRendered = false;
214
+ for (const key of visibleInGroup) {
215
+ const section = sectionMap.get(key);
216
+ for (const item of section.items) {
217
+ menu.appendChild(item.kind === 'parent'
218
+ ? this.buildParentItem(item, colDef)
219
+ : this.buildLeafItem(item));
220
+ }
221
+ }
222
+ }
223
+ return menu;
224
+ }
225
+ // ── Private: item DOM builders ────────────────────────────────────────────
226
+ buildLeafItem(item) {
227
+ const el = createDiv('pg-col-ctx-menu__item');
228
+ el.setAttribute('role', 'menuitem');
229
+ el.setAttribute('tabindex', '-1');
230
+ if (item.active)
231
+ el.classList.add('pg-col-ctx-menu__item--active');
232
+ if (item.disabled)
233
+ el.classList.add('pg-col-ctx-menu__item--disabled');
234
+ el.appendChild(this.createIcon(item.icon));
235
+ el.appendChild(this.createLabel(item.label));
236
+ if (!item.disabled) {
237
+ el.addEventListener('click', (e) => {
238
+ e.stopPropagation();
239
+ item.action();
240
+ this.hide();
241
+ });
242
+ }
243
+ return el;
244
+ }
245
+ buildParentItem(item, colDef) {
246
+ const el = createDiv('pg-col-ctx-menu__item pg-col-ctx-menu__item--has-submenu');
247
+ el.setAttribute('role', 'menuitem');
248
+ el.setAttribute('aria-haspopup', 'true');
249
+ el.setAttribute('aria-expanded', 'false');
250
+ el.setAttribute('tabindex', '-1');
251
+ el.appendChild(this.createIcon(item.icon));
252
+ el.appendChild(this.createLabel(item.label));
253
+ const chevron = createDiv('pg-col-ctx-menu__item-chevron');
254
+ chevron.innerHTML = this.iconRenderer.renderToString('chevronRight', 12);
255
+ el.appendChild(chevron);
256
+ // The submenu is intentionally NOT appended to `el` here — it is portaled
257
+ // to document.body only while open (see openSubmenu), so it can render
258
+ // outside the scroll-clipped menu body without being cut off on the X
259
+ // axis. It is still built eagerly so hover has no construction delay.
260
+ const submenu = this.buildSubmenu(item.children, colDef);
261
+ this.submenuParents.set(submenu, el);
262
+ this.attachSubmenuListeners(el, submenu);
263
+ return el;
264
+ }
265
+ buildSubmenu(children, _colDef) {
266
+ const submenu = createDiv('pg-col-ctx-menu__submenu');
267
+ submenu.setAttribute('role', 'menu');
268
+ for (const child of children) {
269
+ submenu.appendChild(this.buildLeafItem(child));
270
+ }
271
+ return submenu;
272
+ }
273
+ // ── Private: submenu hover logic ─────────────────────────────────────────
274
+ /**
275
+ * Wire the open/close hover behaviour for a parent item + its submenu.
276
+ * Uses a short open delay (60 ms) and a close grace period (150 ms) to
277
+ * prevent flicker when the mouse transitions between the item and the submenu.
278
+ */
279
+ attachSubmenuListeners(el, submenu) {
280
+ el.addEventListener('mouseenter', () => {
281
+ this.clearSubmenuTimers();
282
+ if (this.activeSubmenuEl && this.activeSubmenuEl !== submenu) {
283
+ this.closeSubmenu(this.activeSubmenuEl);
284
+ }
285
+ this.openSubmenuTimer = setTimeout(() => this.openSubmenu(submenu, el), 60);
286
+ });
287
+ el.addEventListener('mouseleave', (e) => {
288
+ if (this.activeSubmenuEl === submenu && submenu.contains(e.relatedTarget))
289
+ return;
290
+ this.clearSubmenuTimers();
291
+ this.closeSubmenuTimer = setTimeout(() => {
292
+ if (!submenu.matches(':hover') && !el.matches(':hover'))
293
+ this.closeSubmenu(submenu);
294
+ }, 150);
295
+ });
296
+ submenu.addEventListener('mouseenter', () => {
297
+ this.clearSubmenuTimers();
298
+ });
299
+ submenu.addEventListener('mouseleave', (e) => {
300
+ if (el.contains(e.relatedTarget))
301
+ return;
302
+ this.clearSubmenuTimers();
303
+ this.closeSubmenuTimer = setTimeout(() => {
304
+ if (!submenu.matches(':hover') && !el.matches(':hover'))
305
+ this.closeSubmenu(submenu);
306
+ }, 150);
307
+ });
308
+ }
309
+ /**
310
+ * Portal a submenu into document.body and position it in viewport
311
+ * coordinates. Portaling (rather than nesting it under its parent item)
312
+ * keeps it clear of the parent menu's `overflow-y: auto` clipping, so a
313
+ * fly-out can render correctly even while the menu body is scrolled.
314
+ */
315
+ openSubmenu(submenu, parentItem) {
316
+ document.body.appendChild(submenu);
317
+ this.activeSubmenuEl = submenu;
318
+ submenu.classList.add('pg-col-ctx-menu__submenu--open');
319
+ parentItem.setAttribute('aria-expanded', 'true');
320
+ this.adjustSubmenuPosition(submenu, parentItem);
321
+ }
322
+ /** Close and detach a portaled submenu opened via {@link openSubmenu}. */
323
+ closeSubmenu(submenu) {
324
+ submenu.classList.remove('pg-col-ctx-menu__submenu--open');
325
+ submenu.remove();
326
+ this.submenuParents.get(submenu)?.setAttribute('aria-expanded', 'false');
327
+ if (this.activeSubmenuEl === submenu)
328
+ this.activeSubmenuEl = null;
329
+ }
330
+ clearSubmenuTimers() {
331
+ if (this.openSubmenuTimer !== null) {
332
+ clearTimeout(this.openSubmenuTimer);
333
+ this.openSubmenuTimer = null;
334
+ }
335
+ if (this.closeSubmenuTimer !== null) {
336
+ clearTimeout(this.closeSubmenuTimer);
337
+ this.closeSubmenuTimer = null;
338
+ }
339
+ }
340
+ // ── Private: section builders ─────────────────────────────────────────────
341
+ buildAllSections(colDef) {
342
+ return [
343
+ this.buildSortSection(colDef),
344
+ this.buildFilterSection(colDef),
345
+ this.buildPinSection(colDef),
346
+ this.buildMoveSection(colDef),
347
+ this.buildResizeSection(colDef),
348
+ this.buildVisibilitySection(colDef),
349
+ this.buildDataSection(colDef),
350
+ this.buildClipboardSection(colDef),
351
+ this.buildColumnSection(colDef),
352
+ ];
353
+ }
354
+ /**
355
+ * Sort section — three flat items: Sort Ascending, Sort Descending, Clear Sort.
356
+ */
357
+ buildSortSection(colDef) {
358
+ const currentSort = this.sortEngine.isSorted(colDef.colId);
359
+ return {
360
+ key: ColumnMenuSection.SORT,
361
+ items: colDef.sortable === false ? [] : [
362
+ {
363
+ kind: 'leaf',
364
+ label: 'Sort Ascending',
365
+ icon: 'sortAsc',
366
+ active: currentSort === 'asc',
367
+ action: () => {
368
+ this.sortEngine.sort(colDef.colId, colDef.field, 'asc');
369
+ this.columnModel.setColumnSort(colDef.colId, 'asc');
370
+ this.onAction('sort', colDef.colId);
371
+ },
372
+ },
373
+ {
374
+ kind: 'leaf',
375
+ label: 'Sort Descending',
376
+ icon: 'sortDesc',
377
+ active: currentSort === 'desc',
378
+ action: () => {
379
+ this.sortEngine.sort(colDef.colId, colDef.field, 'desc');
380
+ this.columnModel.setColumnSort(colDef.colId, 'desc');
381
+ this.onAction('sort', colDef.colId);
382
+ },
383
+ },
384
+ {
385
+ kind: 'leaf',
386
+ label: 'Clear Sort',
387
+ icon: 'close',
388
+ disabled: !currentSort,
389
+ action: () => {
390
+ this.sortEngine.clearColumnSort(colDef.colId);
391
+ this.columnModel.setColumnSort(colDef.colId, null);
392
+ this.onAction('sort', colDef.colId);
393
+ },
394
+ },
395
+ ],
396
+ };
397
+ }
398
+ /**
399
+ * Filter section — three flat items: Quick Filter, Advanced Filter, Clear Filter.
400
+ */
401
+ buildFilterSection(colDef) {
402
+ const filterActive = colDef.filterActive === true;
403
+ return {
404
+ key: ColumnMenuSection.FILTER,
405
+ items: colDef.filterable === false ? [] : [
406
+ {
407
+ kind: 'leaf',
408
+ label: 'Quick Filter…',
409
+ icon: 'search',
410
+ action: () => {
411
+ this.menuCallbacks.onQuickFilter?.(colDef.colId);
412
+ this.onAction('quick-filter', colDef.colId);
413
+ },
414
+ },
415
+ {
416
+ kind: 'leaf',
417
+ label: 'Advanced Filter…',
418
+ icon: 'filter',
419
+ action: () => {
420
+ const anchor = this.anchorEl ?? document.createElement('div');
421
+ this.menuCallbacks.onOpenAdvancedFilter?.(colDef, anchor);
422
+ this.onAction('advanced-filter', colDef.colId);
423
+ },
424
+ },
425
+ {
426
+ kind: 'leaf',
427
+ label: 'Clear Filter',
428
+ icon: 'close',
429
+ disabled: !filterActive,
430
+ action: () => {
431
+ this.eventBus.emit(GridEventType.COLUMN_FILTER_CHANGED, {
432
+ colId: colDef.colId,
433
+ field: colDef.field,
434
+ term: '',
435
+ });
436
+ this.onAction('clear-filter', colDef.colId);
437
+ },
438
+ },
439
+ ],
440
+ };
441
+ }
442
+ /**
443
+ * Pin section — a single parent item whose submenu has Pin Left / Pin Right / Unpin.
444
+ */
445
+ buildPinSection(colDef) {
446
+ return {
447
+ key: ColumnMenuSection.PIN,
448
+ items: [
449
+ {
450
+ kind: 'parent',
451
+ label: 'Pin',
452
+ icon: 'pin',
453
+ children: [
454
+ {
455
+ kind: 'leaf',
456
+ label: 'Pin Left',
457
+ icon: 'pin',
458
+ active: colDef.pinned === 'left',
459
+ action: () => {
460
+ this.columnModel.setColumnPin(colDef.colId, 'left');
461
+ this.onAction('pin', colDef.colId);
462
+ },
463
+ },
464
+ {
465
+ kind: 'leaf',
466
+ label: 'Pin Right',
467
+ icon: 'pin',
468
+ active: colDef.pinned === 'right',
469
+ action: () => {
470
+ this.columnModel.setColumnPin(colDef.colId, 'right');
471
+ this.onAction('pin', colDef.colId);
472
+ },
473
+ },
474
+ {
475
+ kind: 'leaf',
476
+ label: 'Unpin',
477
+ icon: 'unpin',
478
+ active: !colDef.pinned,
479
+ action: () => {
480
+ this.columnModel.setColumnPin(colDef.colId, null);
481
+ this.onAction('pin', colDef.colId);
482
+ },
483
+ },
484
+ ],
485
+ },
486
+ ],
487
+ };
488
+ }
489
+ /**
490
+ * Move section — four flat items. Shares a separator group with Pin.
491
+ * Items are disabled when the column is already at the respective edge.
492
+ */
493
+ buildMoveSection(colDef) {
494
+ const cols = this.columnModel.getVisibleColumns();
495
+ const idx = cols.findIndex((c) => c.colId === colDef.colId);
496
+ const isFirst = idx <= 0;
497
+ const isLast = idx >= cols.length - 1;
498
+ return {
499
+ key: ColumnMenuSection.MOVE,
500
+ items: [
501
+ {
502
+ kind: 'leaf',
503
+ label: 'Move Column to Left',
504
+ icon: 'chevronLeft',
505
+ disabled: isFirst,
506
+ action: () => {
507
+ this.menuCallbacks.onMoveLeft?.(colDef.colId);
508
+ this.onAction('move-left', colDef.colId);
509
+ },
510
+ },
511
+ {
512
+ kind: 'leaf',
513
+ label: 'Move Column to Right',
514
+ icon: 'chevronRight',
515
+ disabled: isLast,
516
+ action: () => {
517
+ this.menuCallbacks.onMoveRight?.(colDef.colId);
518
+ this.onAction('move-right', colDef.colId);
519
+ },
520
+ },
521
+ {
522
+ kind: 'leaf',
523
+ label: 'Move to Start',
524
+ icon: 'pageFirst',
525
+ disabled: isFirst,
526
+ action: () => {
527
+ this.menuCallbacks.onMoveStart?.(colDef.colId);
528
+ this.onAction('move-start', colDef.colId);
529
+ },
530
+ },
531
+ {
532
+ kind: 'leaf',
533
+ label: 'Move to End',
534
+ icon: 'pageLast',
535
+ disabled: isLast,
536
+ action: () => {
537
+ this.menuCallbacks.onMoveEnd?.(colDef.colId);
538
+ this.onAction('move-end', colDef.colId);
539
+ },
540
+ },
541
+ ],
542
+ };
543
+ }
544
+ /**
545
+ * Resize section — a single parent item whose submenu has four resize operations.
546
+ */
547
+ buildResizeSection(colDef) {
548
+ return {
549
+ key: ColumnMenuSection.RESIZE,
550
+ items: [
551
+ {
552
+ kind: 'parent',
553
+ label: 'Resize',
554
+ icon: 'expand',
555
+ children: [
556
+ {
557
+ kind: 'leaf',
558
+ label: 'Auto Size',
559
+ icon: 'columns',
560
+ action: () => {
561
+ this.menuCallbacks.onAutoSize?.(colDef.colId);
562
+ this.onAction('autosize', colDef.colId);
563
+ },
564
+ },
565
+ {
566
+ kind: 'leaf',
567
+ label: 'Auto Size All',
568
+ icon: 'columns',
569
+ action: () => {
570
+ this.menuCallbacks.onAutoSizeAll?.();
571
+ this.onAction('autosize-all', colDef.colId);
572
+ },
573
+ },
574
+ {
575
+ kind: 'leaf',
576
+ label: 'Fit to Grid',
577
+ icon: 'expand',
578
+ action: () => {
579
+ this.menuCallbacks.onFitToGrid?.();
580
+ this.onAction('fit-to-grid', colDef.colId);
581
+ },
582
+ },
583
+ {
584
+ kind: 'leaf',
585
+ label: 'Reset Width',
586
+ icon: 'refresh',
587
+ action: () => {
588
+ this.menuCallbacks.onResetWidth?.(colDef.colId);
589
+ this.onAction('reset-width', colDef.colId);
590
+ },
591
+ },
592
+ ],
593
+ },
594
+ ],
595
+ };
596
+ }
597
+ /**
598
+ * Visibility section — a single parent item: Hide Column + Column Chooser.
599
+ */
600
+ buildVisibilitySection(colDef) {
601
+ return {
602
+ key: ColumnMenuSection.VISIBILITY,
603
+ items: [
604
+ {
605
+ kind: 'parent',
606
+ label: 'Visibility',
607
+ icon: 'eye',
608
+ children: [
609
+ {
610
+ kind: 'leaf',
611
+ label: 'Hide Column',
612
+ icon: 'eyeOff',
613
+ action: () => {
614
+ this.columnModel.setColumnVisible(colDef.colId, false);
615
+ this.onAction('hide', colDef.colId);
616
+ },
617
+ },
618
+ {
619
+ kind: 'leaf',
620
+ label: 'Column Chooser…',
621
+ icon: 'columns',
622
+ action: () => {
623
+ this.menuCallbacks.onOpenColumnChooser?.();
624
+ this.onAction('column-chooser', colDef.colId);
625
+ },
626
+ },
627
+ ],
628
+ },
629
+ ],
630
+ };
631
+ }
632
+ /**
633
+ * Data section — Group by Column (flat leaf) + Aggregate (parent with submenu).
634
+ * "Group by Column" is omitted when the column is not `groupable` or when no
635
+ * {@link GroupCallbacks} have been registered.
636
+ */
637
+ buildDataSection(colDef) {
638
+ const items = [];
639
+ if (colDef.groupable !== false && this.groupCallbacks) {
640
+ const grouped = this.groupCallbacks.isGrouped(colDef.colId);
641
+ items.push({
642
+ kind: 'leaf',
643
+ label: grouped ? 'Remove Grouping' : 'Group by Column',
644
+ icon: 'group',
645
+ active: grouped,
646
+ action: () => {
647
+ if (grouped)
648
+ this.groupCallbacks.removeGroup(colDef.colId);
649
+ else
650
+ this.groupCallbacks.addGroup(colDef.colId);
651
+ this.onAction('group', colDef.colId);
652
+ },
653
+ });
654
+ }
655
+ items.push({
656
+ kind: 'parent',
657
+ label: 'Aggregate',
658
+ icon: 'sigma',
659
+ children: [
660
+ AggregateFunction.SUM,
661
+ AggregateFunction.AVG,
662
+ AggregateFunction.MIN,
663
+ AggregateFunction.MAX,
664
+ AggregateFunction.COUNT,
665
+ ].map((func) => ({
666
+ kind: 'leaf',
667
+ label: func.charAt(0).toUpperCase() + func.slice(1),
668
+ icon: 'sigma',
669
+ active: colDef.aggFunc === func,
670
+ action: () => {
671
+ this.menuCallbacks.onAggregate?.(colDef, func);
672
+ this.onAction(`aggregate-${func}`, colDef.colId);
673
+ },
674
+ })),
675
+ });
676
+ return { key: ColumnMenuSection.DATA, items };
677
+ }
678
+ /**
679
+ * Clipboard section — a single parent item: Copy Header / Copy Column / Copy Values.
680
+ */
681
+ buildClipboardSection(colDef) {
682
+ return {
683
+ key: ColumnMenuSection.CLIPBOARD,
684
+ items: [
685
+ {
686
+ kind: 'parent',
687
+ label: 'Clipboard',
688
+ icon: 'copy',
689
+ children: [
690
+ {
691
+ kind: 'leaf',
692
+ label: 'Copy Header',
693
+ icon: 'copy',
694
+ action: () => {
695
+ this.menuCallbacks.onCopyHeader?.(colDef);
696
+ this.onAction('copy-header', colDef.colId);
697
+ },
698
+ },
699
+ {
700
+ kind: 'leaf',
701
+ label: 'Copy Column',
702
+ icon: 'copy',
703
+ action: () => {
704
+ this.menuCallbacks.onCopyColumn?.(colDef);
705
+ this.onAction('copy-column', colDef.colId);
706
+ },
707
+ },
708
+ {
709
+ kind: 'leaf',
710
+ label: 'Copy Values',
711
+ icon: 'copy',
712
+ action: () => {
713
+ this.menuCallbacks.onCopyValues?.(colDef);
714
+ this.onAction('copy-values', colDef.colId);
715
+ },
716
+ },
717
+ ],
718
+ },
719
+ ],
720
+ };
721
+ }
722
+ /**
723
+ * Column section — a single parent item: Rename / Duplicate / Freeze / Lock / Reset.
724
+ */
725
+ buildColumnSection(colDef) {
726
+ return {
727
+ key: ColumnMenuSection.COLUMN,
728
+ items: [
729
+ {
730
+ kind: 'parent',
731
+ label: 'Column',
732
+ icon: 'settings',
733
+ children: [
734
+ {
735
+ kind: 'leaf',
736
+ label: 'Rename',
737
+ icon: 'edit',
738
+ action: () => {
739
+ this.menuCallbacks.onRename?.(colDef);
740
+ this.onAction('rename', colDef.colId);
741
+ },
742
+ },
743
+ {
744
+ kind: 'leaf',
745
+ label: 'Duplicate',
746
+ icon: 'copy',
747
+ action: () => {
748
+ this.menuCallbacks.onDuplicate?.(colDef);
749
+ this.onAction('duplicate', colDef.colId);
750
+ },
751
+ },
752
+ {
753
+ kind: 'leaf',
754
+ label: 'Freeze Position',
755
+ icon: 'pin',
756
+ action: () => {
757
+ this.menuCallbacks.onFreezePosition?.(colDef);
758
+ this.onAction('freeze', colDef.colId);
759
+ },
760
+ },
761
+ {
762
+ kind: 'leaf',
763
+ label: 'Lock Column',
764
+ icon: 'lock',
765
+ action: () => {
766
+ this.menuCallbacks.onLockColumn?.(colDef);
767
+ this.onAction('lock', colDef.colId);
768
+ },
769
+ },
770
+ {
771
+ kind: 'leaf',
772
+ label: 'Reset Column',
773
+ icon: 'refresh',
774
+ action: () => {
775
+ this.menuCallbacks.onResetColumn?.(colDef);
776
+ this.onAction('reset-column', colDef.colId);
777
+ },
778
+ },
779
+ ],
780
+ },
781
+ ],
782
+ };
783
+ }
784
+ // ── Private: DOM helpers ─────────────────────────────────────────────────
785
+ createSeparator() {
786
+ const sep = createDiv('pg-col-ctx-menu__separator');
787
+ sep.setAttribute('role', 'separator');
788
+ return sep;
789
+ }
790
+ createIcon(iconName) {
791
+ const el = createDiv('pg-col-ctx-menu__item-icon');
792
+ el.innerHTML = this.iconRenderer.renderToString(iconName, 14);
793
+ return el;
794
+ }
795
+ createLabel(text) {
796
+ const el = createDiv('pg-col-ctx-menu__item-label');
797
+ el.textContent = text;
798
+ return el;
799
+ }
800
+ // ── Private: positioning ─────────────────────────────────────────────────
801
+ /**
802
+ * Position the menu relative to the anchor element (button click) or at the
803
+ * cursor (right-click). The menu is clamped to the visible viewport.
804
+ */
805
+ positionMenu(anchorEl, clientX, clientY) {
806
+ const menu = this.el;
807
+ if (!menu)
808
+ return;
809
+ const vw = window.innerWidth;
810
+ const vh = window.innerHeight;
811
+ const menuW = menu.offsetWidth || 220;
812
+ // Clamp against the menu's own max-height (calc(100% - 200px), see
813
+ // base-styles.ts) rather than its unclamped scrollHeight — content past
814
+ // that cap scrolls internally instead of needing the menu to flip above
815
+ // the anchor to "fit".
816
+ const menuH = Math.min(menu.scrollHeight || 400, vh - 200);
817
+ let left;
818
+ let top;
819
+ if (clientX !== undefined && clientY !== undefined) {
820
+ left = clientX;
821
+ top = clientY;
822
+ }
823
+ else {
824
+ const rect = anchorEl.getBoundingClientRect();
825
+ left = rect.right - menuW;
826
+ top = rect.bottom + 2;
827
+ }
828
+ // Clamp to viewport with 4px gutters
829
+ if (left + menuW > vw)
830
+ left = vw - menuW - 4;
831
+ if (left < 4)
832
+ left = 4;
833
+ if (top + menuH > vh)
834
+ top = (clientY ?? anchorEl.getBoundingClientRect().top) - menuH - 2;
835
+ if (top < 4)
836
+ top = 4;
837
+ menu.style.left = `${left}px`;
838
+ menu.style.top = `${top}px`;
839
+ }
840
+ /**
841
+ * Position a fly-out submenu in viewport coordinates: opens to the right of
842
+ * the parent item, flipping to the left when it would overflow the
843
+ * viewport's right edge, and clamped upward when it would overflow the
844
+ * bottom. Called once each time the submenu becomes visible.
845
+ *
846
+ * The submenu is a `position: fixed` element portaled to document.body
847
+ * (see {@link openSubmenu}), so coordinates are absolute viewport
848
+ * positions rather than offsets relative to the parent item.
849
+ */
850
+ adjustSubmenuPosition(submenu, parentItem) {
851
+ const parentRect = parentItem.getBoundingClientRect();
852
+ const submenuW = submenu.offsetWidth || 180;
853
+ const submenuH = submenu.scrollHeight || 200;
854
+ const vw = window.innerWidth;
855
+ const vh = window.innerHeight;
856
+ // Default: open to the right of the parent item, top-aligned with it.
857
+ let left = parentRect.right;
858
+ let top = parentRect.top - 4;
859
+ if (left + submenuW > vw) {
860
+ // Not enough room on the right — open to the left instead.
861
+ left = parentRect.left - submenuW;
862
+ }
863
+ if (left < 4)
864
+ left = 4;
865
+ if (top + submenuH > vh)
866
+ top = vh - submenuH - 4;
867
+ if (top < 4)
868
+ top = 4;
869
+ submenu.style.left = `${left}px`;
870
+ submenu.style.top = `${top}px`;
871
+ }
872
+ }
873
+ //# sourceMappingURL=column-menu.js.map