@svgrid/grid 3.0.2 → 3.0.4

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 (281) hide show
  1. package/README.md +2 -1
  2. package/dist/GridMenus.svelte +44 -2
  3. package/dist/SvChartMenu.svelte +69 -0
  4. package/dist/SvChartMenu.svelte.d.ts +11 -0
  5. package/dist/SvChartPanes.svelte +113 -0
  6. package/dist/SvChartPanes.svelte.d.ts +20 -0
  7. package/dist/SvGrid.controller.svelte.d.ts +110 -39
  8. package/dist/SvGrid.controller.svelte.js +655 -200
  9. package/dist/SvGrid.css +105 -2
  10. package/dist/SvGrid.svelte +386 -514
  11. package/dist/SvGrid.types.d.ts +210 -9
  12. package/dist/SvGridCellEditor.svelte +17 -0
  13. package/dist/SvGridChart.svelte +2257 -329
  14. package/dist/SvGridChart.svelte.d.ts +6 -106
  15. package/dist/SvGridChart.types.d.ts +338 -0
  16. package/dist/SvGridChart.types.js +1 -0
  17. package/dist/SvGridChartBuilder.svelte +323 -0
  18. package/dist/SvGridChartBuilder.svelte.d.ts +34 -0
  19. package/dist/SvGridChartPanel.svelte +221 -275
  20. package/dist/SvGridChartPickers.svelte +417 -0
  21. package/dist/SvGridChartPickers.svelte.d.ts +70 -0
  22. package/dist/SvGridChartView.svelte +13 -14
  23. package/dist/SvModal.svelte +7 -1
  24. package/dist/SvModal.svelte.d.ts +5 -0
  25. package/dist/ai.d.ts +40 -8
  26. package/dist/ai.js +135 -24
  27. package/dist/aria.d.ts +11 -0
  28. package/dist/build-api.js +108 -22
  29. package/dist/cdn/GridMenus-7kbpnnBW.js +635 -0
  30. package/dist/cdn/GridMenus-BL7ZgQvU.js +636 -0
  31. package/dist/cdn/SvChartMenu-Bl6PBbkT.js +58 -0
  32. package/dist/cdn/SvChartMenu-FBSMINA6.js +59 -0
  33. package/dist/cdn/{SvDateRangeInput-DMLKmGEc.js → SvDateRangeInput-BeU_TkbQ.js} +15 -14
  34. package/dist/cdn/{SvDateRangeInput-CaOuMs8O.js → SvDateRangeInput-yX8vzleW.js} +38 -37
  35. package/dist/cdn/{SvDateTimePicker-sonaH0oh.js → SvDateTimePicker-DQwt4UAs.js} +139 -180
  36. package/dist/cdn/SvDateTimePicker-vNU6bZ-q.js +775 -0
  37. package/dist/cdn/{SvGridCellEditor-CjEJMJKc.js → SvGridCellEditor-B1p-vCK5.js} +188 -178
  38. package/dist/cdn/{SvGridCellEditor-BWnTi2N7.js → SvGridCellEditor-D_0q4xAu.js} +98 -88
  39. package/dist/cdn/SvGridChart-C3EWAZaM.js +3574 -0
  40. package/dist/cdn/SvGridChart-DzLkSwCH.js +3572 -0
  41. package/dist/cdn/SvGridChartBuilder-BE2T1ykB.js +783 -0
  42. package/dist/cdn/SvGridChartBuilder-CfII62sZ.js +784 -0
  43. package/dist/cdn/SvGridChartPanel-CCX5_Wgd.js +675 -0
  44. package/dist/cdn/SvGridChartPanel-xf4sWVTo.js +699 -0
  45. package/dist/cdn/SvGridChartView-CfuXmY5I.js +48 -0
  46. package/dist/cdn/SvGridChartView-DYwabQWj.js +47 -0
  47. package/dist/cdn/SvMenuList-CLN8OuIK.js +452 -0
  48. package/dist/cdn/SvMenuList-DkGhNKjf.js +451 -0
  49. package/dist/cdn/SvModal-BAE-pjZX.js +396 -0
  50. package/dist/cdn/SvModal-CIZWCcad.js +397 -0
  51. package/dist/cdn/chart-Dz7SqMXH.js +4341 -0
  52. package/dist/cdn/chart-export-BXqueeWJ.js +135 -0
  53. package/dist/cdn/chart-export-pdf-DONFUnNY.js +110 -0
  54. package/dist/cdn/chart-panel-messages-CUbf2R4i.js +1052 -0
  55. package/dist/cdn/chart-panel-messages-CmNrMdsr.js +1053 -0
  56. package/dist/cdn/chart-summary-BJW_tg_X.js +138 -0
  57. package/dist/cdn/chart-trend-CaN9mDEV.js +50 -0
  58. package/dist/cdn/chart-validate-HcOVFAfJ.js +188 -0
  59. package/dist/cdn/{column-resize-DsfNXMom.js → column-resize-DpmOLfRp.js} +3 -3
  60. package/dist/cdn/{date-format-BnnHlqGw.js → date-format-CtquV-p3.js} +583 -603
  61. package/dist/cdn/{date-format-BNii4zeD.js → date-format-D6KFzU_W.js} +347 -367
  62. package/dist/cdn/dismissable-DAHetSNk.js +44 -0
  63. package/dist/cdn/editor-contract-LXgQJAgd.js +22 -0
  64. package/dist/cdn/focus-trap-BBOQYBma.js +65 -0
  65. package/dist/cdn/{row-resize-BRcimkUT.js → row-resize-niQCp040.js} +44 -36
  66. package/dist/cdn/{src-DNbz94Ct.js → src-BKhZ6eXd.js} +10227 -9787
  67. package/dist/cdn/{src-BJ2opd0j.js → src-V1uu8iE9.js} +6568 -6128
  68. package/dist/cdn/svgrid.js +26 -15
  69. package/dist/cdn/svgrid.svelte-external.js +26 -15
  70. package/dist/chart-axes.d.ts +53 -0
  71. package/dist/chart-axes.js +351 -0
  72. package/dist/chart-cartesian.d.ts +88 -0
  73. package/dist/chart-cartesian.js +1862 -0
  74. package/dist/chart-decimate.d.ts +51 -0
  75. package/dist/chart-decimate.js +199 -0
  76. package/dist/chart-export-pdf.d.ts +47 -0
  77. package/dist/chart-export-pdf.js +187 -0
  78. package/dist/chart-export.d.ts +2 -1
  79. package/dist/chart-export.js +18 -3
  80. package/dist/chart-financial.d.ts +91 -0
  81. package/dist/chart-financial.js +175 -0
  82. package/dist/chart-flow.d.ts +10 -0
  83. package/dist/chart-flow.js +298 -0
  84. package/dist/chart-format.d.ts +18 -0
  85. package/dist/chart-format.js +65 -0
  86. package/dist/chart-grid.d.ts +8 -0
  87. package/dist/chart-grid.js +190 -0
  88. package/dist/chart-hierarchy.d.ts +17 -0
  89. package/dist/chart-hierarchy.js +146 -0
  90. package/dist/chart-indicators.d.ts +115 -0
  91. package/dist/chart-indicators.js +389 -0
  92. package/dist/chart-messages.d.ts +95 -0
  93. package/dist/chart-messages.js +92 -0
  94. package/dist/chart-motion.d.ts +16 -0
  95. package/dist/chart-motion.js +141 -0
  96. package/dist/chart-panel-messages.d.ts +265 -0
  97. package/dist/chart-panel-messages.js +285 -0
  98. package/dist/chart-pivot.d.ts +87 -0
  99. package/dist/chart-pivot.js +156 -0
  100. package/dist/chart-polar.d.ts +25 -0
  101. package/dist/chart-polar.js +700 -0
  102. package/dist/chart-samples.d.ts +16 -0
  103. package/dist/chart-samples.js +153 -0
  104. package/dist/chart-scale.d.ts +113 -0
  105. package/dist/chart-scale.js +405 -0
  106. package/dist/chart-stats.d.ts +111 -0
  107. package/dist/chart-stats.js +419 -0
  108. package/dist/chart-stream.d.ts +45 -0
  109. package/dist/chart-stream.js +91 -0
  110. package/dist/chart-summary.d.ts +27 -0
  111. package/dist/chart-summary.js +205 -0
  112. package/dist/chart-sync.svelte.d.ts +32 -0
  113. package/dist/chart-sync.svelte.js +23 -0
  114. package/dist/chart-table.d.ts +35 -0
  115. package/dist/chart-table.js +165 -0
  116. package/dist/chart-trend.d.ts +19 -0
  117. package/dist/chart-trend.js +61 -0
  118. package/dist/chart-types.d.ts +1456 -0
  119. package/dist/chart-types.js +6 -0
  120. package/dist/chart-validate.d.ts +43 -0
  121. package/dist/chart-validate.js +272 -0
  122. package/dist/chart-zoom.d.ts +40 -0
  123. package/dist/chart-zoom.js +145 -0
  124. package/dist/chart.d.ts +186 -865
  125. package/dist/chart.js +460 -2204
  126. package/dist/clipboard.d.ts +1 -0
  127. package/dist/clipboard.js +137 -18
  128. package/dist/column-resize.d.ts +3 -0
  129. package/dist/column-resize.js +4 -1
  130. package/dist/columns.js +3 -0
  131. package/dist/command-context.d.ts +19 -0
  132. package/dist/command-context.js +116 -0
  133. package/dist/core.d.ts +7 -0
  134. package/dist/createPopoverSelect.svelte.d.ts +2 -2
  135. package/dist/editing.d.ts +2 -8
  136. package/dist/editing.js +262 -33
  137. package/dist/fill-patterns.d.ts +0 -5
  138. package/dist/fill-patterns.js +56 -2
  139. package/dist/grid-messages.d.ts +10 -3
  140. package/dist/grid-messages.js +5 -0
  141. package/dist/history.d.ts +83 -0
  142. package/dist/history.js +133 -0
  143. package/dist/index.d.ts +24 -6
  144. package/dist/index.js +20 -2
  145. package/dist/keyboard-handlers.js +88 -31
  146. package/dist/keyboard.d.ts +55 -0
  147. package/dist/keyboard.js +132 -0
  148. package/dist/menus.d.ts +3 -1
  149. package/dist/menus.js +7 -2
  150. package/dist/merges.d.ts +97 -0
  151. package/dist/merges.js +147 -0
  152. package/dist/row-resize.d.ts +3 -0
  153. package/dist/row-resize.js +14 -0
  154. package/dist/scroll-sync.d.ts +1 -0
  155. package/dist/scroll-sync.js +24 -0
  156. package/dist/selection.d.ts +16 -0
  157. package/dist/selection.js +108 -16
  158. package/dist/shortcut-registry.d.ts +145 -0
  159. package/dist/shortcut-registry.js +44 -0
  160. package/dist/svgrid-wrapper.types.d.ts +213 -22
  161. package/dist/virtualization/virtualizer.js +38 -17
  162. package/package.json +6 -1
  163. package/src/GridMenus.svelte +44 -2
  164. package/src/SvChartMenu.svelte +69 -0
  165. package/src/SvChartPanes.svelte +113 -0
  166. package/src/SvChartPanes.test.ts +66 -0
  167. package/src/SvGrid.controller.svelte.ts +629 -172
  168. package/src/SvGrid.css +105 -2
  169. package/src/SvGrid.svelte +386 -514
  170. package/src/SvGrid.types.ts +188 -8
  171. package/src/SvGridCellEditor.svelte +17 -0
  172. package/src/SvGridChart.svelte +2257 -329
  173. package/src/SvGridChart.test.ts +1419 -1
  174. package/src/SvGridChart.types.ts +336 -0
  175. package/src/SvGridChartBuilder.svelte +323 -0
  176. package/src/SvGridChartPanel.svelte +221 -275
  177. package/src/SvGridChartPickers.svelte +417 -0
  178. package/src/SvGridChartView.svelte +13 -14
  179. package/src/SvModal.svelte +7 -1
  180. package/src/SvModal.test.ts +9 -0
  181. package/src/ai.test.ts +57 -2
  182. package/src/ai.ts +166 -22
  183. package/src/aria.d.ts +11 -0
  184. package/src/build-api.coverage.test.ts +184 -0
  185. package/src/build-api.ts +107 -18
  186. package/src/chart-axes.test.ts +573 -0
  187. package/src/chart-axes.ts +342 -0
  188. package/src/chart-cartesian.ts +1863 -0
  189. package/src/chart-decimate.test.ts +249 -0
  190. package/src/chart-decimate.ts +186 -0
  191. package/src/chart-export-pdf.test.ts +91 -0
  192. package/src/chart-export-pdf.ts +207 -0
  193. package/src/chart-export.test.ts +14 -0
  194. package/src/chart-export.ts +13 -3
  195. package/src/chart-financial.ts +208 -0
  196. package/src/chart-flow.ts +286 -0
  197. package/src/chart-format.ts +67 -0
  198. package/src/chart-grid.ts +179 -0
  199. package/src/chart-hierarchy.ts +135 -0
  200. package/src/chart-indicators.test.ts +443 -0
  201. package/src/chart-indicators.ts +384 -0
  202. package/src/chart-messages.test.ts +21 -0
  203. package/src/chart-messages.ts +184 -0
  204. package/src/chart-motion.test.ts +71 -0
  205. package/src/chart-motion.ts +148 -0
  206. package/src/chart-panel-messages.test.ts +29 -0
  207. package/src/chart-panel-messages.ts +550 -0
  208. package/src/chart-pivot.test.ts +54 -0
  209. package/src/chart-pivot.ts +225 -0
  210. package/src/chart-polar.ts +674 -0
  211. package/src/chart-samples.ts +106 -0
  212. package/src/chart-scale.ts +394 -0
  213. package/src/chart-series-types.test.ts +714 -0
  214. package/src/chart-stats.ts +409 -0
  215. package/src/chart-stream.test.ts +75 -0
  216. package/src/chart-stream.ts +114 -0
  217. package/src/chart-summary.test.ts +90 -0
  218. package/src/chart-summary.ts +197 -0
  219. package/src/chart-sync.svelte.ts +41 -0
  220. package/src/chart-table.test.ts +76 -0
  221. package/src/chart-table.ts +178 -0
  222. package/src/chart-trend.ts +47 -0
  223. package/src/chart-types.ts +1309 -0
  224. package/src/chart-validate.test.ts +100 -0
  225. package/src/chart-validate.ts +247 -0
  226. package/src/chart-zoom.test.ts +137 -0
  227. package/src/chart-zoom.ts +124 -0
  228. package/src/chart.coverage.test.ts +81 -0
  229. package/src/chart.test.ts +56 -3
  230. package/src/chart.ts +557 -2784
  231. package/src/clipboard.test.ts +151 -0
  232. package/src/clipboard.ts +145 -16
  233. package/src/column-resize.ts +7 -1
  234. package/src/columns.ts +2 -0
  235. package/src/command-context.test.ts +200 -0
  236. package/src/command-context.ts +137 -0
  237. package/src/core.ts +7 -0
  238. package/src/editing.test.ts +281 -3
  239. package/src/editing.ts +256 -38
  240. package/src/fill-patterns.test.ts +35 -0
  241. package/src/fill-patterns.ts +56 -2
  242. package/src/grid-messages.ts +16 -3
  243. package/src/history.test.ts +196 -0
  244. package/src/history.ts +162 -0
  245. package/src/icon-seam.test.ts +3 -2
  246. package/src/index.ts +150 -2
  247. package/src/keyboard-handlers.coverage.test.ts +126 -6
  248. package/src/keyboard-handlers.ts +91 -30
  249. package/src/keyboard-shortcuts.seam.test.ts +200 -0
  250. package/src/keyboard.test.ts +124 -1
  251. package/src/keyboard.ts +142 -0
  252. package/src/menus.test.ts +26 -0
  253. package/src/menus.ts +10 -3
  254. package/src/merges.test.ts +112 -0
  255. package/src/merges.ts +168 -0
  256. package/src/pivot.grid.test.ts +40 -5
  257. package/src/row-resize.test.ts +44 -0
  258. package/src/row-resize.ts +17 -0
  259. package/src/scroll-sync.test.ts +42 -1
  260. package/src/scroll-sync.ts +25 -0
  261. package/src/selection.multi-range.test.ts +34 -0
  262. package/src/selection.test.ts +30 -2
  263. package/src/selection.ts +111 -19
  264. package/src/shortcut-registry.test.ts +97 -0
  265. package/src/shortcut-registry.ts +181 -0
  266. package/src/svgrid-wrapper.types.ts +184 -13
  267. package/src/svgrid.behavior.test.ts +135 -0
  268. package/src/svgrid.charting.test.ts +513 -3
  269. package/src/svgrid.context-menu.test.ts +31 -0
  270. package/src/svgrid.new-features.wrapper.test.ts +10 -3
  271. package/src/virtualization/virtualizer.ts +39 -17
  272. package/dist/cdn/GridMenus-DyFA-QxA.js +0 -602
  273. package/dist/cdn/GridMenus-M2XP9t0_.js +0 -603
  274. package/dist/cdn/SvDateTimePicker-CCbDZNZB.js +0 -816
  275. package/dist/cdn/SvGridChart-DAb9RbRs.js +0 -1480
  276. package/dist/cdn/SvGridChart-Yl-IXZFO.js +0 -1481
  277. package/dist/cdn/SvGridChartPanel-DayQpDsR.js +0 -834
  278. package/dist/cdn/SvGridChartPanel-aqf8n-vJ.js +0 -810
  279. package/dist/cdn/SvGridChartView-CxfakxR0.js +0 -56
  280. package/dist/cdn/SvGridChartView-Dm_YEx9L.js +0 -55
  281. package/dist/cdn/chart-CKJRCPOk.js +0 -1652
@@ -0,0 +1,550 @@
1
+ /**
2
+ * The grid's chart panel and chart builder, localized. Every string the panel
3
+ * chrome renders (the head and its actions, the export menu, the AI row, the
4
+ * pickers with their type / reducer / bucket / palette / indicator names and
5
+ * the "why this type cannot draw yet" sentences, the builder's tabs and
6
+ * Format fields, the saved-charts popover) is a key here with its English
7
+ * default. Pass any subset through `localization.text` on `<SvGrid>`; unset
8
+ * keys stay English.
9
+ *
10
+ * A module of its own rather than more keys in grid-messages.ts because that
11
+ * file's defaults are base-bundle code that every grid pays for, charting or
12
+ * not. This one loads with the panel, which is already a lazy chunk. The
13
+ * type joins `GridMessages` so `localization.text` accepts the keys.
14
+ *
15
+ * The chart's OWN strings (toolbar, context menu, what it says to assistive
16
+ * technology) are a different surface: `ChartMessages` in chart-messages.ts,
17
+ * passed as `localeText` on the chart or `charting.localeText` on the grid.
18
+ */
19
+ import { resolveMessages } from './editor-contract'
20
+
21
+ /** Every localizable chart panel and builder string. */
22
+ export type GridChartPanelMessages = {
23
+ // Panel head and actions
24
+ chartPanelTitle: string
25
+ chartClearFilter: string
26
+ chartExport: string
27
+ chartExportLabel: string
28
+ chartExportPng: string
29
+ chartExportSvg: string
30
+ chartExportPdf: string
31
+ chartExportCsv: string
32
+ chartExportCopy: string
33
+ chartExportPrint: string
34
+ chartExportDescribe: string
35
+ chartAi: string
36
+ chartAiLabel: string
37
+ chartAiPlaceholder: string
38
+ chartAiRun: string
39
+ chartAiThinking: string
40
+ chartAiExplain: string
41
+ chartAiExplainTitle: string
42
+ chartAiNoChart: string
43
+ chartAiNoExplanation: string
44
+ chartAiFailed: string
45
+ chartBuild: string
46
+ chartBuildLabel: string
47
+ chartBuildTitle: string
48
+ chartLinkBack: string
49
+ chartUnlink: string
50
+ chartLinkedTitle: string
51
+ chartUnlinkedTitle: string
52
+ chartAdd: string
53
+ chartSave: string
54
+ chartSaveLabel: string
55
+ chartSavedTitle: string
56
+ chartSaveName: string
57
+ chartSaveNamePlaceholder: string
58
+ chartSaveApply: string
59
+ /** The pickers' note in pivot mode, where the pivot on screen is the chart. */
60
+ chartPivotHint: string
61
+ chartSaveRemove: string
62
+ chartSavedEmpty: string
63
+ chartMaximize: string
64
+ chartRestore: string
65
+ chartDock: string
66
+ chartDockLabel: string
67
+ chartPopOut: string
68
+ chartPopOutLabel: string
69
+ chartClose: string
70
+ chartResize: string
71
+ chartResizeWindow: string
72
+ chartTabs: string
73
+ chartRemoveTab: string
74
+ chartRemove: string
75
+ chartEmptyColumns: string
76
+ chartEmptyData: string
77
+ // Pickers
78
+ chartType: string
79
+ chartDate: string
80
+ chartGroupBy: string
81
+ chartFrom: string
82
+ chartColumns: string
83
+ chartSplitBy: string
84
+ chartTo: string
85
+ chartRows: string
86
+ chartNone: string
87
+ chartValue: string
88
+ chartX: string
89
+ chartY: string
90
+ chartLow: string
91
+ chartHigh: string
92
+ chartOpen: string
93
+ chartClosePrice: string
94
+ chartVolume: string
95
+ chartMetric: string
96
+ chartTarget: string
97
+ chartAggregate: string
98
+ chartReduceSum: string
99
+ chartReduceAvg: string
100
+ chartReduceCount: string
101
+ chartReduceMin: string
102
+ chartReduceMax: string
103
+ chartReduceMedian: string
104
+ chartReduceP90: string
105
+ chartReduceFirst: string
106
+ chartReduceLast: string
107
+ chartReduceCountDistinct: string
108
+ chartBins: string
109
+ chartBinsTitle: string
110
+ chartShape: string
111
+ chartShapeFunnel: string
112
+ chartShapePyramid: string
113
+ chartShapeCone: string
114
+ chartCandles: string
115
+ chartCandlesClassic: string
116
+ chartCandlesHollow: string
117
+ chartCandlesHeikinAshi: string
118
+ chartIndicators: string
119
+ chartIndVolume: string
120
+ chartIndVolumeTitle: string
121
+ chartIndRsi: string
122
+ chartIndRsiTitle: string
123
+ chartIndMacd: string
124
+ chartIndMacdTitle: string
125
+ chartIndStochastic: string
126
+ chartIndStochasticTitle: string
127
+ chartIndAtr: string
128
+ chartIndAtrTitle: string
129
+ chartIndObv: string
130
+ chartIndObvTitle: string
131
+ chartIndSma: string
132
+ chartIndSmaTitle: string
133
+ chartIndEma: string
134
+ chartIndEmaTitle: string
135
+ chartIndBb: string
136
+ chartIndBbTitle: string
137
+ chartIndVwap: string
138
+ chartIndVwapTitle: string
139
+ chartFormat: string
140
+ chartFormatNumber: string
141
+ chartFormatCurrency: string
142
+ chartFormatPercent: string
143
+ chartStacked: string
144
+ chartStacked100: string
145
+ chartStacked100Title: string
146
+ chartHorizontal: string
147
+ chartHorizontalTitle: string
148
+ chartDonut: string
149
+ chartColours: string
150
+ chartPaletteTheme: string
151
+ chartPaletteOcean: string
152
+ chartPaletteSunset: string
153
+ chartPaletteForest: string
154
+ chartPaletteSlate: string
155
+ chartLabels: string
156
+ chartLogScale: string
157
+ chartLogScaleTitle: string
158
+ chartBucket: string
159
+ chartBucketTitle: string
160
+ chartBucketExact: string
161
+ chartBucketDay: string
162
+ chartBucketWeek: string
163
+ chartBucketMonth: string
164
+ chartBucketQuarter: string
165
+ chartBucketYear: string
166
+ chartDateAxis: string
167
+ chartDateAxisTitle: string
168
+ // Type names and their groups
169
+ chartGroupCompare: string
170
+ chartGroupPartOfWhole: string
171
+ chartGroupFlow: string
172
+ chartGroupDistribution: string
173
+ chartGroupSingleValue: string
174
+ chartGroupOverTime: string
175
+ chartTypeBar: string
176
+ chartTypeLine: string
177
+ chartTypeArea: string
178
+ chartTypeLollipop: string
179
+ chartTypePareto: string
180
+ chartTypeRangeBar: string
181
+ chartTypeRangeArea: string
182
+ chartTypeDumbbell: string
183
+ chartTypeRadialColumn: string
184
+ chartTypeRadialBar: string
185
+ chartTypeNightingale: string
186
+ chartTypePie: string
187
+ chartTypeTreemap: string
188
+ chartTypeSunburst: string
189
+ chartTypeFunnel: string
190
+ chartTypeWaterfall: string
191
+ chartTypeSankey: string
192
+ chartTypeChord: string
193
+ chartTypeRadar: string
194
+ chartTypeHeatmap: string
195
+ chartTypeScatter: string
196
+ chartTypeBoxplot: string
197
+ chartTypeHistogram: string
198
+ chartTypeGauge: string
199
+ chartTypeBullet: string
200
+ chartTypeCalendar: string
201
+ chartTypeStream: string
202
+ chartTypeCandlestick: string
203
+ chartTypeOhlc: string
204
+ // Why the chosen type cannot draw yet
205
+ chartIssueHeatmap: string
206
+ chartIssueSankey: string
207
+ chartIssueRadar: string
208
+ chartIssueFunnel: string
209
+ chartIssueChord: string
210
+ chartIssueStream: string
211
+ chartIssueSecondMeasure: string
212
+ chartIssueOhlcDate: string
213
+ chartIssueOhlcColumns: string
214
+ // Builder
215
+ chartBuilderTitle: string
216
+ chartBuilderTabType: string
217
+ chartBuilderTabData: string
218
+ chartBuilderTabFormat: string
219
+ chartBuilderLinked: string
220
+ chartBuilderFrozenAt: string
221
+ chartBuilderFollows: string
222
+ chartBuilderTitleField: string
223
+ chartBuilderSubtitle: string
224
+ chartBuilderCaption: string
225
+ chartBuilderLegend: string
226
+ chartLegendBottom: string
227
+ chartLegendTop: string
228
+ chartLegendLeft: string
229
+ chartLegendRight: string
230
+ chartLegendHidden: string
231
+ chartBuilderDataLabels: string
232
+ chartBuilderPanelSetting: string
233
+ chartLabelsTop: string
234
+ chartLabelsOutside: string
235
+ chartLabelsInside: string
236
+ chartLabelsCenter: string
237
+ chartLabelsHidden: string
238
+ chartBuilderSeriesLabels: string
239
+ chartBuilderCrosshairLabels: string
240
+ chartBuilderCompactBelow: string
241
+ chartBuilderCompactBelowTitle: string
242
+ chartBuilderValueAxis: string
243
+ chartBuilderRightAxis: string
244
+ chartBuilderCategoryAxis: string
245
+ chartBuilderMin: string
246
+ chartBuilderMax: string
247
+ chartBuilderAuto: string
248
+ chartBuilderOff: string
249
+ chartBuilderGridLines: string
250
+ chartBuilderAxisLabels: string
251
+ chartBuilderLabelsAuto: string
252
+ chartBuilderLabelsHorizontal: string
253
+ chartBuilderLabelsTilted: string
254
+ chartBuilderLabelsVertical: string
255
+ chartBuilderSeries: string
256
+ chartBuilderColor: string
257
+ chartBuilderSeriesType: string
258
+ chartBuilderAxis: string
259
+ chartBuilderMarker: string
260
+ chartBuilderWidth: string
261
+ chartBuilderStack: string
262
+ chartBuilderStackPlaceholder: string
263
+ chartBuilderSeriesColorLabel: string
264
+ chartBuilderSeriesTypeLabel: string
265
+ chartBuilderSeriesAxisLabel: string
266
+ chartBuilderSeriesMarkerLabel: string
267
+ chartBuilderSeriesWidthLabel: string
268
+ chartBuilderSeriesStackLabel: string
269
+ chartBuilderChartType: string
270
+ chartBuilderBar: string
271
+ chartBuilderLine: string
272
+ chartBuilderArea: string
273
+ chartBuilderLeft: string
274
+ chartBuilderRight: string
275
+ chartBuilderStyle: string
276
+ chartBuilderFontSize: string
277
+ chartBuilderFontFamily: string
278
+ chartBuilderBackground: string
279
+ chartBuilderTextColor: string
280
+ chartBuilderResetFormat: string
281
+ }
282
+
283
+ /** English defaults: the literal strings the panel and the builder shipped with. */
284
+ export const defaultChartPanelMessages: GridChartPanelMessages = {
285
+ chartPanelTitle: 'Chart',
286
+ chartClearFilter: 'Clear filter',
287
+ chartExport: 'Export',
288
+ chartExportLabel: 'Export chart',
289
+ chartExportPng: 'PNG image',
290
+ chartExportSvg: 'SVG vector',
291
+ chartExportPdf: 'PDF document',
292
+ chartExportCsv: 'CSV data',
293
+ chartExportCopy: 'Copy to clipboard',
294
+ chartExportPrint: 'Print',
295
+ chartExportDescribe: 'Describe chart',
296
+ chartAi: 'AI',
297
+ chartAiLabel: 'Chart with AI',
298
+ chartAiPlaceholder: 'Describe a chart, e.g. revenue by region stacked by product',
299
+ chartAiRun: 'Chart it',
300
+ chartAiThinking: 'Thinking...',
301
+ chartAiExplain: 'Explain',
302
+ chartAiExplainTitle: 'Explain this chart in plain words',
303
+ chartAiNoChart: "Couldn't build a chart from that request.",
304
+ chartAiNoExplanation: "Couldn't explain this chart.",
305
+ chartAiFailed: 'Something went wrong.',
306
+ chartBuild: 'Build',
307
+ chartBuildLabel: 'Open the chart builder',
308
+ chartBuildTitle: 'Chart builder: type gallery, data and format',
309
+ chartLinkBack: 'Link the chart back to the grid',
310
+ chartUnlink: 'Unlink the chart from the grid',
311
+ chartLinkedTitle: "Linked: the chart follows the grid's rows. Click to freeze it.",
312
+ chartUnlinkedTitle: 'Unlinked: the chart keeps the data it has. Click to follow the grid again.',
313
+ chartAdd: 'Add chart',
314
+ chartSave: 'Save',
315
+ chartSaveLabel: 'Saved charts',
316
+ chartSavedTitle: 'Saved charts',
317
+ chartSaveName: 'Save this chart as',
318
+ chartSaveNamePlaceholder: 'Name',
319
+ chartSaveApply: 'Apply',
320
+ chartPivotHint: 'Charting the pivot: its row groups are the categories and its column groups the series.',
321
+ chartSaveRemove: 'Remove',
322
+ chartSavedEmpty: 'No saved charts yet.',
323
+ chartMaximize: 'Maximize',
324
+ chartRestore: 'Restore',
325
+ chartDock: 'Dock',
326
+ chartDockLabel: 'Dock chart',
327
+ chartPopOut: 'Pop out',
328
+ chartPopOutLabel: 'Pop out chart',
329
+ chartClose: 'Close chart',
330
+ chartResize: 'Resize chart panel',
331
+ chartResizeWindow: 'Resize chart window',
332
+ chartTabs: 'Charts',
333
+ chartRemoveTab: 'Remove {title}',
334
+ chartRemove: 'Remove',
335
+ chartEmptyColumns: 'Charting needs at least one text column (to group by) and one numeric column (to measure).',
336
+ chartEmptyData: 'No data to chart.',
337
+ chartType: 'Type',
338
+ chartDate: 'Date',
339
+ chartGroupBy: 'Group by',
340
+ chartFrom: 'From',
341
+ chartColumns: 'Columns',
342
+ chartSplitBy: 'Split by',
343
+ chartTo: 'To',
344
+ chartRows: 'Rows',
345
+ chartNone: '(none)',
346
+ chartValue: 'Value',
347
+ chartX: 'X',
348
+ chartY: 'Y',
349
+ chartLow: 'Low',
350
+ chartHigh: 'High',
351
+ chartOpen: 'Open',
352
+ chartClosePrice: 'Close',
353
+ chartVolume: 'Volume',
354
+ chartMetric: 'Metric',
355
+ chartTarget: 'Target',
356
+ chartAggregate: 'Aggregate',
357
+ chartReduceSum: 'Sum',
358
+ chartReduceAvg: 'Average',
359
+ chartReduceCount: 'Count',
360
+ chartReduceMin: 'Min',
361
+ chartReduceMax: 'Max',
362
+ chartReduceMedian: 'Median',
363
+ chartReduceP90: '90th percentile',
364
+ chartReduceFirst: 'First',
365
+ chartReduceLast: 'Last',
366
+ chartReduceCountDistinct: 'Distinct count',
367
+ chartBins: 'Bins',
368
+ chartBinsTitle: 'How many bins the sample is split into',
369
+ chartShape: 'Shape',
370
+ chartShapeFunnel: 'Funnel',
371
+ chartShapePyramid: 'Pyramid',
372
+ chartShapeCone: 'Cone',
373
+ chartCandles: 'Candles',
374
+ chartCandlesClassic: 'Classic',
375
+ chartCandlesHollow: 'Hollow',
376
+ chartCandlesHeikinAshi: 'Heikin-Ashi',
377
+ chartIndicators: 'Indicators',
378
+ chartIndVolume: 'Volume',
379
+ chartIndVolumeTitle: 'Volume bars under the price',
380
+ chartIndRsi: 'RSI',
381
+ chartIndRsiTitle: 'Relative strength index, 14 bars',
382
+ chartIndMacd: 'MACD',
383
+ chartIndMacdTitle: 'MACD 12 / 26 / 9',
384
+ chartIndStochastic: 'Stoch',
385
+ chartIndStochasticTitle: 'Stochastic oscillator 14 / 3',
386
+ chartIndAtr: 'ATR',
387
+ chartIndAtrTitle: 'Average true range, 14 bars',
388
+ chartIndObv: 'OBV',
389
+ chartIndObvTitle: 'On-balance volume',
390
+ chartIndSma: 'SMA 20',
391
+ chartIndSmaTitle: '20-bar simple moving average on the price',
392
+ chartIndEma: 'EMA 20',
393
+ chartIndEmaTitle: '20-bar exponential moving average on the price',
394
+ chartIndBb: 'Bollinger',
395
+ chartIndBbTitle: 'Bollinger bands 20 / 2 on the price',
396
+ chartIndVwap: 'VWAP',
397
+ chartIndVwapTitle: 'Volume-weighted average price on the price',
398
+ chartFormat: 'Format',
399
+ chartFormatNumber: 'Number',
400
+ chartFormatCurrency: 'Currency',
401
+ chartFormatPercent: 'Percent',
402
+ chartStacked: 'Stacked',
403
+ chartStacked100: '100%',
404
+ chartStacked100Title: 'Normalise each category to 100 percent',
405
+ chartHorizontal: 'Horizontal',
406
+ chartHorizontalTitle: 'Bars grow rightwards - suits long category labels',
407
+ chartDonut: 'Donut',
408
+ chartColours: 'Colours',
409
+ chartPaletteTheme: 'Theme',
410
+ chartPaletteOcean: 'Ocean',
411
+ chartPaletteSunset: 'Sunset',
412
+ chartPaletteForest: 'Forest',
413
+ chartPaletteSlate: 'Slate',
414
+ chartLabels: 'Labels',
415
+ chartLogScale: 'Log scale',
416
+ chartLogScaleTitle: 'Logarithmic value axis - flattens wide-range data',
417
+ chartBucket: 'Bucket',
418
+ chartBucketTitle: 'Group the dates by calendar unit: one bar per month instead of one per day',
419
+ chartBucketExact: 'Exact',
420
+ chartBucketDay: 'Day',
421
+ chartBucketWeek: 'Week',
422
+ chartBucketMonth: 'Month',
423
+ chartBucketQuarter: 'Quarter',
424
+ chartBucketYear: 'Year',
425
+ chartDateAxis: 'Date axis',
426
+ chartDateAxisTitle: 'Space points by actual date - real time ticks and proportional gaps',
427
+ chartGroupCompare: 'Compare',
428
+ chartGroupPartOfWhole: 'Part of a whole',
429
+ chartGroupFlow: 'Flow',
430
+ chartGroupDistribution: 'Distribution',
431
+ chartGroupSingleValue: 'Single value',
432
+ chartGroupOverTime: 'Over time',
433
+ chartTypeBar: 'Bar',
434
+ chartTypeLine: 'Line',
435
+ chartTypeArea: 'Area',
436
+ chartTypeLollipop: 'Lollipop',
437
+ chartTypePareto: 'Pareto',
438
+ chartTypeRangeBar: 'Range bar',
439
+ chartTypeRangeArea: 'Range area',
440
+ chartTypeDumbbell: 'Dumbbell',
441
+ chartTypeRadialColumn: 'Radial column',
442
+ chartTypeRadialBar: 'Radial bar',
443
+ chartTypeNightingale: 'Nightingale',
444
+ chartTypePie: 'Pie',
445
+ chartTypeTreemap: 'Tree map',
446
+ chartTypeSunburst: 'Sunburst',
447
+ chartTypeFunnel: 'Funnel',
448
+ chartTypeWaterfall: 'Waterfall',
449
+ chartTypeSankey: 'Sankey',
450
+ chartTypeChord: 'Chord',
451
+ chartTypeRadar: 'Radar',
452
+ chartTypeHeatmap: 'Heat map',
453
+ chartTypeScatter: 'Scatter',
454
+ chartTypeBoxplot: 'Box plot',
455
+ chartTypeHistogram: 'Histogram',
456
+ chartTypeGauge: 'Gauge',
457
+ chartTypeBullet: 'Bullet',
458
+ chartTypeCalendar: 'Calendar',
459
+ chartTypeStream: 'Stream',
460
+ chartTypeCandlestick: 'Candlestick',
461
+ chartTypeOhlc: 'OHLC bars',
462
+ chartIssueHeatmap: 'Heat map needs a Split by column for its rows.',
463
+ chartIssueSankey: 'Sankey needs a Split by column: Group by is the source, Split by the target.',
464
+ chartIssueRadar: 'Radar needs at least 3 groups.',
465
+ chartIssueFunnel: 'Funnel needs at least 2 stages.',
466
+ chartIssueChord: 'Chord needs a Split by column: Group by and Split by are the two ends of each flow.',
467
+ chartIssueStream: 'Stream needs a Split by column: each split becomes a layer.',
468
+ chartIssueSecondMeasure: 'Pick a second measure for the high end of the range.',
469
+ chartIssueOhlcDate: 'Candlesticks need a date column.',
470
+ chartIssueOhlcColumns: 'Pick the Open, High, Low and Close columns.',
471
+ chartBuilderTitle: 'Chart builder',
472
+ chartBuilderTabType: 'Type',
473
+ chartBuilderTabData: 'Data',
474
+ chartBuilderTabFormat: 'Format',
475
+ chartBuilderLinked: 'Linked to the grid',
476
+ chartBuilderFrozenAt: 'Frozen at {time}; edits, filters and new rows no longer change it.',
477
+ chartBuilderFollows: "The chart follows the grid's rows, filters and edits.",
478
+ chartBuilderTitleField: 'Title',
479
+ chartBuilderSubtitle: 'Subtitle',
480
+ chartBuilderCaption: 'Caption',
481
+ chartBuilderLegend: 'Legend',
482
+ chartLegendBottom: 'Bottom',
483
+ chartLegendTop: 'Top',
484
+ chartLegendLeft: 'Left',
485
+ chartLegendRight: 'Right',
486
+ chartLegendHidden: 'Hidden',
487
+ chartBuilderDataLabels: 'Data labels',
488
+ chartBuilderPanelSetting: 'Panel setting',
489
+ chartLabelsTop: 'Top',
490
+ chartLabelsOutside: 'Outside',
491
+ chartLabelsInside: 'Inside',
492
+ chartLabelsCenter: 'Center',
493
+ chartLabelsHidden: 'Hidden',
494
+ chartBuilderSeriesLabels: 'Series labels',
495
+ chartBuilderCrosshairLabels: 'Crosshair labels',
496
+ chartBuilderCompactBelow: 'Compact under',
497
+ chartBuilderCompactBelowTitle: 'Below this width in px the chart drops its series and data labels, turns the category labels vertical and hides the legend',
498
+ chartBuilderValueAxis: 'Value axis',
499
+ chartBuilderRightAxis: 'Right axis',
500
+ chartBuilderCategoryAxis: 'Category axis',
501
+ chartBuilderMin: 'Min',
502
+ chartBuilderMax: 'Max',
503
+ chartBuilderAuto: 'auto',
504
+ chartBuilderOff: 'off',
505
+ chartBuilderGridLines: 'Grid lines',
506
+ chartBuilderAxisLabels: 'Labels',
507
+ chartBuilderLabelsAuto: 'Auto',
508
+ chartBuilderLabelsHorizontal: 'Horizontal',
509
+ chartBuilderLabelsTilted: 'Tilted',
510
+ chartBuilderLabelsVertical: 'Vertical',
511
+ chartBuilderSeries: 'Series',
512
+ chartBuilderColor: 'Color',
513
+ chartBuilderSeriesType: 'Type',
514
+ chartBuilderAxis: 'Axis',
515
+ chartBuilderMarker: 'Marker',
516
+ chartBuilderWidth: 'Width',
517
+ chartBuilderStack: 'Stack',
518
+ chartBuilderStackPlaceholder: 'own',
519
+ chartBuilderSeriesColorLabel: '{series} colour',
520
+ chartBuilderSeriesTypeLabel: '{series} type',
521
+ chartBuilderSeriesAxisLabel: '{series} axis',
522
+ chartBuilderSeriesMarkerLabel: '{series} marker',
523
+ chartBuilderSeriesWidthLabel: '{series} line width',
524
+ chartBuilderSeriesStackLabel: '{series} stack group',
525
+ chartBuilderChartType: 'Chart',
526
+ chartBuilderBar: 'Bar',
527
+ chartBuilderLine: 'Line',
528
+ chartBuilderArea: 'Area',
529
+ chartBuilderLeft: 'Left',
530
+ chartBuilderRight: 'Right',
531
+ chartBuilderStyle: 'Style',
532
+ chartBuilderFontSize: 'Font size',
533
+ chartBuilderFontFamily: 'Font',
534
+ chartBuilderBackground: 'Background',
535
+ chartBuilderTextColor: 'Text',
536
+ chartBuilderResetFormat: 'Reset format',
537
+ }
538
+
539
+ /**
540
+ * Merge a consumer's `localization.text` over the English defaults. The map
541
+ * usually carries the chrome keys too; only the chart panel keys are read.
542
+ */
543
+ export function resolveChartPanelMessages(overrides?: Partial<GridChartPanelMessages> | null): GridChartPanelMessages {
544
+ return resolveMessages(defaultChartPanelMessages, overrides)
545
+ }
546
+
547
+ /** Fill `{name}` placeholders in a message. */
548
+ export function chartPanelMessage(template: string, values: Record<string, string | number>): string {
549
+ return template.replace(/\{(\w+)\}/g, (_, k: string) => (k in values ? String(values[k]) : `{${k}}`))
550
+ }
@@ -0,0 +1,54 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { pivotChartType, pivotResultToChartSpec } from './chart-pivot'
3
+
4
+ /** A pivot result the way the engine writes it: regions over countries, quarters across. */
5
+ const result = {
6
+ rows: [
7
+ { __pivotId: 'r0', __pivotKind: 'subtotal', __pivotLabel: 'EMEA', __pivotParentId: null, pv_q1__rev: 300, pv_q2__rev: 340 },
8
+ { __pivotId: 'r1', __pivotKind: 'leaf', __pivotLabel: 'UK', __pivotParentId: 'r0', pv_q1__rev: 100, pv_q2__rev: 120 },
9
+ { __pivotId: 'r2', __pivotKind: 'leaf', __pivotLabel: 'Germany', __pivotParentId: 'r0', pv_q1__rev: 200, pv_q2__rev: 220 },
10
+ { __pivotId: 'r3', __pivotKind: 'subtotal', __pivotLabel: 'APAC', __pivotParentId: null, pv_q1__rev: 50, pv_q2__rev: null },
11
+ { __pivotId: 'r4', __pivotKind: 'leaf', __pivotLabel: 'Japan', __pivotParentId: 'r3', pv_q1__rev: 50, pv_q2__rev: null },
12
+ { __pivotId: 'r9', __pivotKind: 'grandTotal', __pivotLabel: 'Total', __pivotParentId: null, pv_q1__rev: 350, pv_q2__rev: 340 },
13
+ ],
14
+ columns: [
15
+ { id: '__pivotRowHeader', header: 'Region / Country' },
16
+ { id: 'pv_group_q1', header: 'Q1', columns: [{ id: 'pv_q1__rev', header: 'Revenue' }] },
17
+ { id: 'pv_group_q2', header: 'Q2', columns: [{ id: 'pv_q2__rev', header: 'Revenue' }] },
18
+ { id: 'pv_group__grand', header: 'Total', columns: [{ id: 'pv_grand__total', header: 'Revenue' }] },
19
+ ],
20
+ }
21
+
22
+ describe('pivotResultToChartSpec', () => {
23
+ it('reads leaves as categories under a grouped axis, column leaves as series, and skips totals', () => {
24
+ const spec = pivotResultToChartSpec(result, { type: 'line', format: { type: 'currency', currency: 'EUR' } })
25
+ expect(spec.type).toBe('line')
26
+ expect(spec.categories).toEqual(['UK', 'Germany', 'Japan'])
27
+ expect(spec.categoryGroups).toEqual([{ label: 'EMEA', span: 2 }, { label: 'APAC', span: 1 }])
28
+ expect(spec.series.map((s) => s.label)).toEqual(['Q1', 'Q2'])
29
+ expect(spec.series[0]!.values).toEqual([100, 200, 50])
30
+ // Japan has no Q2: a gap, not a zero.
31
+ expect(spec.series[1]!.values.slice(0, 2)).toEqual([120, 220])
32
+ expect(Number.isNaN(spec.series[1]!.values[2])).toBe(true)
33
+ expect(spec.valueFormat).toBe('currency')
34
+ expect(spec.currency).toBe('EUR')
35
+ expect(spec.yAxis?.title).toBe('Revenue')
36
+ })
37
+
38
+ it('keeps the totals when asked, stacks, and caps the categories', () => {
39
+ const spec = pivotResultToChartSpec(result, { includeTotals: true, stacked100: true, maxCategories: 2 })
40
+ expect(spec.series.map((s) => s.label)).toEqual(['Q1', 'Q2', 'Total'])
41
+ expect(spec.categories).toEqual(['UK', 'Germany'])
42
+ expect(spec.stacked).toBe(true)
43
+ expect(spec.stacked100).toBe(true)
44
+ })
45
+
46
+ it('draws a shape a pivot has as itself and the rest as bars', () => {
47
+ expect(pivotChartType('radar')).toBe('radar')
48
+ expect(pivotChartType('heatmap')).toBe('heatmap')
49
+ expect(pivotChartType('scatter')).toBe('bar')
50
+ expect(pivotChartType('candlestick')).toBe('bar')
51
+ expect(pivotChartType(undefined)).toBe('bar')
52
+ expect(pivotResultToChartSpec(result, { type: 'gauge' }).type).toBe('bar')
53
+ })
54
+ })