@carto/ps-react-ui 4.7.1 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. package/dist/category-DwaeYjpX.js +656 -0
  2. package/dist/category-DwaeYjpX.js.map +1 -0
  3. package/dist/change-column-Cidl_M-4.js +1110 -0
  4. package/dist/change-column-Cidl_M-4.js.map +1 -0
  5. package/dist/data-zoom-layout-BH0LPwSy.js +28 -0
  6. package/dist/data-zoom-layout-BH0LPwSy.js.map +1 -0
  7. package/dist/echart-CU0KmClP.js +176 -0
  8. package/dist/echart-CU0KmClP.js.map +1 -0
  9. package/dist/exports-Cx-f6m6U.js +63 -0
  10. package/dist/exports-Cx-f6m6U.js.map +1 -0
  11. package/dist/formula-DuC0NQLH.js +79 -0
  12. package/dist/formula-DuC0NQLH.js.map +1 -0
  13. package/dist/markdown-BD1jcknS.js +8326 -0
  14. package/dist/markdown-BD1jcknS.js.map +1 -0
  15. package/dist/merge-options-DCkkHZIf.js +34 -0
  16. package/dist/merge-options-DCkkHZIf.js.map +1 -0
  17. package/dist/{styles-BYTyKQFP.js → option-builders-F-c9ELi1.js} +25 -45
  18. package/dist/option-builders-F-c9ELi1.js.map +1 -0
  19. package/dist/png-item-CS4z1iSH.js +45 -0
  20. package/dist/png-item-CS4z1iSH.js.map +1 -0
  21. package/dist/range-DsqTjSpg.js +186 -0
  22. package/dist/range-DsqTjSpg.js.map +1 -0
  23. package/dist/spread-CTuIXZSM.js +67 -0
  24. package/dist/spread-CTuIXZSM.js.map +1 -0
  25. package/dist/style-DVnT6HC1.js +131 -0
  26. package/dist/style-DVnT6HC1.js.map +1 -0
  27. package/dist/styles-cohnxh9F.js +23 -0
  28. package/dist/styles-cohnxh9F.js.map +1 -0
  29. package/dist/table-HIpXuq4G.js +390 -0
  30. package/dist/table-HIpXuq4G.js.map +1 -0
  31. package/dist/transforms-Cdx4fkU5.js +106 -0
  32. package/dist/transforms-Cdx4fkU5.js.map +1 -0
  33. package/dist/types/widgets/echart/utils.test.d.ts +1 -0
  34. package/dist/types/widgets/formula/config.test.d.ts +1 -0
  35. package/dist/types/widgets/stores/widget-store-branches.test.d.ts +1 -0
  36. package/dist/types/widgets/table/config.test.d.ts +1 -0
  37. package/dist/types/widgets-v2/actions/brush-toggle/brush-toggle.d.ts +56 -0
  38. package/dist/types/widgets-v2/actions/brush-toggle/index.d.ts +3 -0
  39. package/dist/types/widgets-v2/actions/brush-toggle/labels.d.ts +5 -0
  40. package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +12 -0
  41. package/dist/types/widgets-v2/actions/brush-toggle/transforms.d.ts +11 -0
  42. package/dist/types/widgets-v2/actions/brush-toggle/transforms.test.d.ts +1 -0
  43. package/dist/types/widgets-v2/actions/change-column/change-column-icon.d.ts +2 -0
  44. package/dist/types/widgets-v2/actions/change-column/change-column.d.ts +29 -0
  45. package/dist/types/widgets-v2/actions/change-column/index.d.ts +3 -0
  46. package/dist/types/widgets-v2/actions/change-column/labels.d.ts +5 -0
  47. package/dist/types/widgets-v2/actions/change-column/sortable-column-item.d.ts +14 -0
  48. package/dist/types/widgets-v2/actions/change-column/style.d.ts +33 -0
  49. package/dist/types/widgets-v2/actions/change-column/types.d.ts +10 -0
  50. package/dist/types/widgets-v2/actions/download/download.d.ts +18 -0
  51. package/dist/types/widgets-v2/actions/download/exports.d.ts +37 -0
  52. package/dist/types/widgets-v2/actions/download/icons.d.ts +12 -0
  53. package/dist/types/widgets-v2/actions/download/index.d.ts +6 -0
  54. package/dist/types/widgets-v2/actions/download/labels.d.ts +11 -0
  55. package/dist/types/widgets-v2/actions/download/png-item.d.ts +24 -0
  56. package/dist/types/widgets-v2/actions/download/style.d.ts +1 -0
  57. package/dist/types/widgets-v2/actions/download/types.d.ts +35 -0
  58. package/dist/types/widgets-v2/actions/fullscreen/fullscreen.d.ts +59 -0
  59. package/dist/types/widgets-v2/actions/fullscreen/index.d.ts +3 -0
  60. package/dist/types/widgets-v2/actions/fullscreen/labels.d.ts +5 -0
  61. package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +48 -0
  62. package/dist/types/widgets-v2/actions/fullscreen/types.d.ts +14 -0
  63. package/dist/types/widgets-v2/actions/index.d.ts +9 -0
  64. package/dist/types/widgets-v2/actions/lock-selection/index.d.ts +3 -0
  65. package/dist/types/widgets-v2/actions/lock-selection/labels.d.ts +6 -0
  66. package/dist/types/widgets-v2/actions/lock-selection/lock-selection.d.ts +36 -0
  67. package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +12 -0
  68. package/dist/types/widgets-v2/actions/lock-selection/transforms.d.ts +6 -0
  69. package/dist/types/widgets-v2/actions/relative-data/index.d.ts +3 -0
  70. package/dist/types/widgets-v2/actions/relative-data/labels.d.ts +5 -0
  71. package/dist/types/widgets-v2/actions/relative-data/relative-data.d.ts +39 -0
  72. package/dist/types/widgets-v2/actions/relative-data/style.d.ts +12 -0
  73. package/dist/types/widgets-v2/actions/relative-data/transforms.d.ts +30 -0
  74. package/dist/types/widgets-v2/actions/relative-data/transforms.test.d.ts +1 -0
  75. package/dist/types/widgets-v2/actions/searcher/filter.d.ts +6 -0
  76. package/dist/types/widgets-v2/actions/searcher/index.d.ts +4 -0
  77. package/dist/types/widgets-v2/actions/searcher/labels.d.ts +7 -0
  78. package/dist/types/widgets-v2/actions/searcher/searcher-toggle.d.ts +23 -0
  79. package/dist/types/widgets-v2/actions/searcher/searcher.d.ts +11 -0
  80. package/dist/types/widgets-v2/actions/searcher/style.d.ts +16 -0
  81. package/dist/types/widgets-v2/actions/stack-toggle/index.d.ts +3 -0
  82. package/dist/types/widgets-v2/actions/stack-toggle/labels.d.ts +5 -0
  83. package/dist/types/widgets-v2/actions/stack-toggle/stack-toggle.d.ts +10 -0
  84. package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +12 -0
  85. package/dist/types/widgets-v2/actions/stack-toggle/transforms.d.ts +13 -0
  86. package/dist/types/widgets-v2/actions/stack-toggle/transforms.test.d.ts +1 -0
  87. package/dist/types/widgets-v2/actions/zoom-toggle/index.d.ts +3 -0
  88. package/dist/types/widgets-v2/actions/zoom-toggle/labels.d.ts +5 -0
  89. package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +12 -0
  90. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.d.ts +51 -0
  91. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.test.d.ts +1 -0
  92. package/dist/types/widgets-v2/actions/zoom-toggle/zoom-toggle.d.ts +35 -0
  93. package/dist/types/widgets-v2/bar/download.d.ts +24 -0
  94. package/dist/types/widgets-v2/bar/index.d.ts +4 -0
  95. package/dist/types/widgets-v2/bar/options.d.ts +43 -0
  96. package/dist/types/widgets-v2/bar/options.test.d.ts +1 -0
  97. package/dist/types/widgets-v2/bar/skeleton.d.ts +6 -0
  98. package/dist/types/widgets-v2/bar/types.d.ts +41 -0
  99. package/dist/types/widgets-v2/category/category-ui.d.ts +81 -0
  100. package/dist/types/widgets-v2/category/category.d.ts +48 -0
  101. package/dist/types/widgets-v2/category/components/category-bar-stacked.d.ts +28 -0
  102. package/dist/types/widgets-v2/category/components/category-bar.d.ts +23 -0
  103. package/dist/types/widgets-v2/category/components/category-legend.d.ts +18 -0
  104. package/dist/types/widgets-v2/category/components/category-row-multi.d.ts +31 -0
  105. package/dist/types/widgets-v2/category/components/category-row-other.d.ts +13 -0
  106. package/dist/types/widgets-v2/category/components/category-row-single.d.ts +28 -0
  107. package/dist/types/widgets-v2/category/components/category-row-stacked.d.ts +38 -0
  108. package/dist/types/widgets-v2/category/download.d.ts +16 -0
  109. package/dist/types/widgets-v2/category/download.test.d.ts +1 -0
  110. package/dist/types/widgets-v2/category/index.d.ts +10 -0
  111. package/dist/types/widgets-v2/category/skeleton.d.ts +11 -0
  112. package/dist/types/widgets-v2/category/style.d.ts +166 -0
  113. package/dist/types/widgets-v2/category/types.d.ts +49 -0
  114. package/dist/types/widgets-v2/echart/echart-ui.d.ts +44 -0
  115. package/dist/types/widgets-v2/echart/echart.d.ts +75 -0
  116. package/dist/types/widgets-v2/echart/index.d.ts +4 -0
  117. package/dist/types/widgets-v2/echart/shared-resize-observer.d.ts +5 -0
  118. package/dist/types/widgets-v2/echart/shared-resize-observer.test.d.ts +1 -0
  119. package/dist/types/widgets-v2/echart/style.d.ts +6 -0
  120. package/dist/types/widgets-v2/echart/use-chart-selection.d.ts +51 -0
  121. package/dist/types/widgets-v2/formula/delta.d.ts +22 -0
  122. package/dist/types/widgets-v2/formula/download.d.ts +20 -0
  123. package/dist/types/widgets-v2/formula/formula-ui.d.ts +20 -0
  124. package/dist/types/widgets-v2/formula/formula.d.ts +8 -0
  125. package/dist/types/widgets-v2/formula/index.d.ts +11 -0
  126. package/dist/types/widgets-v2/formula/note.d.ts +11 -0
  127. package/dist/types/widgets-v2/formula/prefix.d.ts +12 -0
  128. package/dist/types/widgets-v2/formula/series.d.ts +16 -0
  129. package/dist/types/widgets-v2/formula/skeleton.d.ts +4 -0
  130. package/dist/types/widgets-v2/formula/style.d.ts +29 -0
  131. package/dist/types/widgets-v2/formula/suffix.d.ts +12 -0
  132. package/dist/types/widgets-v2/formula/types.d.ts +40 -0
  133. package/dist/types/widgets-v2/formula/value.d.ts +14 -0
  134. package/dist/types/widgets-v2/histogram/download.d.ts +17 -0
  135. package/dist/types/widgets-v2/histogram/download.test.d.ts +1 -0
  136. package/dist/types/widgets-v2/histogram/index.d.ts +5 -0
  137. package/dist/types/widgets-v2/histogram/options.d.ts +42 -0
  138. package/dist/types/widgets-v2/histogram/options.test.d.ts +1 -0
  139. package/dist/types/widgets-v2/histogram/skeleton.d.ts +9 -0
  140. package/dist/types/widgets-v2/histogram/transforms.d.ts +17 -0
  141. package/dist/types/widgets-v2/histogram/transforms.test.d.ts +1 -0
  142. package/dist/types/widgets-v2/histogram/types.d.ts +47 -0
  143. package/dist/types/widgets-v2/index.d.ts +107 -0
  144. package/dist/types/widgets-v2/markdown/download.d.ts +16 -0
  145. package/dist/types/widgets-v2/markdown/download.test.d.ts +1 -0
  146. package/dist/types/widgets-v2/markdown/index.d.ts +6 -0
  147. package/dist/types/widgets-v2/markdown/markdown-content.d.ts +34 -0
  148. package/dist/types/widgets-v2/markdown/markdown-ui.d.ts +12 -0
  149. package/dist/types/widgets-v2/markdown/markdown.d.ts +6 -0
  150. package/dist/types/widgets-v2/markdown/skeleton.d.ts +4 -0
  151. package/dist/types/widgets-v2/markdown/style.d.ts +61 -0
  152. package/dist/types/widgets-v2/markdown/types.d.ts +4 -0
  153. package/dist/types/widgets-v2/note/labels.d.ts +5 -0
  154. package/dist/types/widgets-v2/note/style.d.ts +26 -0
  155. package/dist/types/widgets-v2/note/widget-note.d.ts +46 -0
  156. package/dist/types/widgets-v2/pie/download.d.ts +17 -0
  157. package/dist/types/widgets-v2/pie/download.test.d.ts +1 -0
  158. package/dist/types/widgets-v2/pie/index.d.ts +4 -0
  159. package/dist/types/widgets-v2/pie/options.d.ts +35 -0
  160. package/dist/types/widgets-v2/pie/options.test.d.ts +1 -0
  161. package/dist/types/widgets-v2/pie/skeleton.d.ts +4 -0
  162. package/dist/types/widgets-v2/pie/types.d.ts +50 -0
  163. package/dist/types/widgets-v2/provider/widget-provider.d.ts +32 -0
  164. package/dist/types/widgets-v2/range/index.d.ts +4 -0
  165. package/dist/types/widgets-v2/range/range-ui.d.ts +19 -0
  166. package/dist/types/widgets-v2/range/range.d.ts +19 -0
  167. package/dist/types/widgets-v2/range/skeleton.d.ts +9 -0
  168. package/dist/types/widgets-v2/range/style.d.ts +40 -0
  169. package/dist/types/widgets-v2/range/types.d.ts +37 -0
  170. package/dist/types/widgets-v2/scatterplot/download.d.ts +16 -0
  171. package/dist/types/widgets-v2/scatterplot/download.test.d.ts +1 -0
  172. package/dist/types/widgets-v2/scatterplot/index.d.ts +5 -0
  173. package/dist/types/widgets-v2/scatterplot/options.d.ts +42 -0
  174. package/dist/types/widgets-v2/scatterplot/options.test.d.ts +1 -0
  175. package/dist/types/widgets-v2/scatterplot/skeleton.d.ts +12 -0
  176. package/dist/types/widgets-v2/scatterplot/transforms.d.ts +17 -0
  177. package/dist/types/widgets-v2/scatterplot/transforms.test.d.ts +1 -0
  178. package/dist/types/widgets-v2/scatterplot/types.d.ts +50 -0
  179. package/dist/types/widgets-v2/selection-summary/labels.d.ts +6 -0
  180. package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +22 -0
  181. package/dist/types/widgets-v2/selection-summary/style.d.ts +23 -0
  182. package/dist/types/widgets-v2/spread/download.d.ts +15 -0
  183. package/dist/types/widgets-v2/spread/download.test.d.ts +1 -0
  184. package/dist/types/widgets-v2/spread/index.d.ts +6 -0
  185. package/dist/types/widgets-v2/spread/separator.d.ts +7 -0
  186. package/dist/types/widgets-v2/spread/skeleton.d.ts +9 -0
  187. package/dist/types/widgets-v2/spread/spread-ui.d.ts +18 -0
  188. package/dist/types/widgets-v2/spread/spread.d.ts +5 -0
  189. package/dist/types/widgets-v2/spread/types.d.ts +25 -0
  190. package/dist/types/widgets-v2/state/labels.d.ts +7 -0
  191. package/dist/types/widgets-v2/state/labels.test.d.ts +1 -0
  192. package/dist/types/widgets-v2/state/style.d.ts +19 -0
  193. package/dist/types/widgets-v2/state/widget-state.d.ts +19 -0
  194. package/dist/types/widgets-v2/stores/index.d.ts +8 -0
  195. package/dist/types/widgets-v2/stores/pipeline-middleware.d.ts +5 -0
  196. package/dist/types/widgets-v2/stores/pipeline-middleware.test.d.ts +1 -0
  197. package/dist/types/widgets-v2/stores/transforms.d.ts +4 -0
  198. package/dist/types/widgets-v2/stores/transforms.test.d.ts +1 -0
  199. package/dist/types/widgets-v2/stores/types.d.ts +55 -0
  200. package/dist/types/widgets-v2/stores/use-echart-instance.d.ts +15 -0
  201. package/dist/types/widgets-v2/stores/use-transform-enabled.d.ts +17 -0
  202. package/dist/types/widgets-v2/stores/use-transform.d.ts +12 -0
  203. package/dist/types/widgets-v2/stores/widget-context.d.ts +2 -0
  204. package/dist/types/widgets-v2/stores/widget-store-registry.d.ts +74 -0
  205. package/dist/types/widgets-v2/stores/widget-store-registry.test.d.ts +1 -0
  206. package/dist/types/widgets-v2/subheader/style.d.ts +10 -0
  207. package/dist/types/widgets-v2/subheader/subheader.d.ts +11 -0
  208. package/dist/types/widgets-v2/table/download.d.ts +18 -0
  209. package/dist/types/widgets-v2/table/download.test.d.ts +1 -0
  210. package/dist/types/widgets-v2/table/helpers.d.ts +32 -0
  211. package/dist/types/widgets-v2/table/helpers.test.d.ts +1 -0
  212. package/dist/types/widgets-v2/table/index.d.ts +7 -0
  213. package/dist/types/widgets-v2/table/labels.d.ts +22 -0
  214. package/dist/types/widgets-v2/table/skeleton.d.ts +22 -0
  215. package/dist/types/widgets-v2/table/style.d.ts +44 -0
  216. package/dist/types/widgets-v2/table/table-ui.d.ts +38 -0
  217. package/dist/types/widgets-v2/table/table.d.ts +50 -0
  218. package/dist/types/widgets-v2/table/types.d.ts +37 -0
  219. package/dist/types/widgets-v2/test-utils.d.ts +52 -0
  220. package/dist/types/widgets-v2/timeseries/download.d.ts +17 -0
  221. package/dist/types/widgets-v2/timeseries/download.test.d.ts +1 -0
  222. package/dist/types/widgets-v2/timeseries/index.d.ts +4 -0
  223. package/dist/types/widgets-v2/timeseries/options.d.ts +39 -0
  224. package/dist/types/widgets-v2/timeseries/options.test.d.ts +1 -0
  225. package/dist/types/widgets-v2/timeseries/skeleton.d.ts +8 -0
  226. package/dist/types/widgets-v2/timeseries/types.d.ts +56 -0
  227. package/dist/types/widgets-v2/toolbox/labels.d.ts +5 -0
  228. package/dist/types/widgets-v2/toolbox/style.d.ts +30 -0
  229. package/dist/types/widgets-v2/toolbox/toolbox.d.ts +49 -0
  230. package/dist/types/widgets-v2/utils/data-zoom-layout.d.ts +11 -0
  231. package/dist/types/widgets-v2/utils/index.d.ts +2 -0
  232. package/dist/types/widgets-v2/utils/merge-options.d.ts +12 -0
  233. package/dist/types/widgets-v2/utils/merge-options.test.d.ts +1 -0
  234. package/dist/types/widgets-v2/wrapper/index.d.ts +4 -0
  235. package/dist/types/widgets-v2/wrapper/labels.d.ts +6 -0
  236. package/dist/types/widgets-v2/wrapper/style.d.ts +111 -0
  237. package/dist/types/widgets-v2/wrapper/widget-actions.d.ts +22 -0
  238. package/dist/types/widgets-v2/wrapper/widget-content.d.ts +12 -0
  239. package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +51 -0
  240. package/dist/use-transform-DXPN3nY7.js +110 -0
  241. package/dist/use-transform-DXPN3nY7.js.map +1 -0
  242. package/dist/widget-context-DTGO0Yta.js +13 -0
  243. package/dist/widget-context-DTGO0Yta.js.map +1 -0
  244. package/dist/widget-store-registry-_W4Z4xp-.js +178 -0
  245. package/dist/widget-store-registry-_W4Z4xp-.js.map +1 -0
  246. package/dist/widgets/bar.js +14 -13
  247. package/dist/widgets/bar.js.map +1 -1
  248. package/dist/widgets/histogram.js +8 -7
  249. package/dist/widgets/histogram.js.map +1 -1
  250. package/dist/widgets/pie.js +19 -18
  251. package/dist/widgets/pie.js.map +1 -1
  252. package/dist/widgets/scatterplot.js +8 -7
  253. package/dist/widgets/scatterplot.js.map +1 -1
  254. package/dist/widgets/timeseries.js +11 -10
  255. package/dist/widgets/timeseries.js.map +1 -1
  256. package/dist/widgets/utils.js +8 -7
  257. package/dist/widgets/utils.js.map +1 -1
  258. package/dist/widgets-v2/actions.js +43 -0
  259. package/dist/widgets-v2/actions.js.map +1 -0
  260. package/dist/widgets-v2/bar.js +327 -0
  261. package/dist/widgets-v2/bar.js.map +1 -0
  262. package/dist/widgets-v2/category.js +104 -0
  263. package/dist/widgets-v2/category.js.map +1 -0
  264. package/dist/widgets-v2/echart.js +57 -0
  265. package/dist/widgets-v2/echart.js.map +1 -0
  266. package/dist/widgets-v2/formula.js +74 -0
  267. package/dist/widgets-v2/formula.js.map +1 -0
  268. package/dist/widgets-v2/histogram.js +350 -0
  269. package/dist/widgets-v2/histogram.js.map +1 -0
  270. package/dist/widgets-v2/markdown.js +68 -0
  271. package/dist/widgets-v2/markdown.js.map +1 -0
  272. package/dist/widgets-v2/pie.js +381 -0
  273. package/dist/widgets-v2/pie.js.map +1 -0
  274. package/dist/widgets-v2/range.js +52 -0
  275. package/dist/widgets-v2/range.js.map +1 -0
  276. package/dist/widgets-v2/scatterplot.js +405 -0
  277. package/dist/widgets-v2/scatterplot.js.map +1 -0
  278. package/dist/widgets-v2/spread.js +72 -0
  279. package/dist/widgets-v2/spread.js.map +1 -0
  280. package/dist/widgets-v2/stores.js +42 -0
  281. package/dist/widgets-v2/stores.js.map +1 -0
  282. package/dist/widgets-v2/table.js +78 -0
  283. package/dist/widgets-v2/table.js.map +1 -0
  284. package/dist/widgets-v2/timeseries.js +352 -0
  285. package/dist/widgets-v2/timeseries.js.map +1 -0
  286. package/dist/widgets-v2/utils.js +7 -0
  287. package/dist/widgets-v2/utils.js.map +1 -0
  288. package/dist/widgets-v2.js +953 -0
  289. package/dist/widgets-v2.js.map +1 -0
  290. package/package.json +73 -5
  291. package/src/components/lasso-tool/chip.test.tsx +176 -0
  292. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +171 -0
  293. package/src/components/lasso-tool/lasso-tool.test.tsx +198 -0
  294. package/src/components/list-data/list-data.test.tsx +73 -0
  295. package/src/components/no-data-alert/no-data-alert.test.tsx +38 -0
  296. package/src/components/responsive-drawer/responsive-drawer.test.tsx +68 -0
  297. package/src/widgets/actions/brush-toggle/brush-overlay.test.tsx +465 -0
  298. package/src/widgets/actions/brush-toggle/brush-toggle.test.tsx +208 -0
  299. package/src/widgets/actions/change-column/change-column-dnd.test.tsx +193 -0
  300. package/src/widgets/actions/change-column/sortable-column-item.test.tsx +124 -0
  301. package/src/widgets/actions/zoom-toggle/zoom-toggle.test.tsx +322 -0
  302. package/src/widgets/category/components/category-rows.test.tsx +213 -0
  303. package/src/widgets/echart/utils.test.ts +277 -0
  304. package/src/widgets/formula/config.test.ts +37 -0
  305. package/src/widgets/range/components/range-item.test.tsx +243 -0
  306. package/src/widgets/stores/widget-store-branches.test.ts +275 -0
  307. package/src/widgets/table/config.test.ts +65 -0
  308. package/src/widgets/utils/chart-config/option-builders.test.ts +188 -0
  309. package/src/widgets-v2/PERFORMANCE.md +189 -0
  310. package/src/widgets-v2/actions/brush-toggle/brush-toggle.test.tsx +180 -0
  311. package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +154 -0
  312. package/src/widgets-v2/actions/brush-toggle/index.ts +3 -0
  313. package/src/widgets-v2/actions/brush-toggle/labels.ts +9 -0
  314. package/src/widgets-v2/actions/brush-toggle/style.ts +11 -0
  315. package/src/widgets-v2/actions/brush-toggle/transforms.test.ts +47 -0
  316. package/src/widgets-v2/actions/brush-toggle/transforms.ts +31 -0
  317. package/src/widgets-v2/actions/change-column/change-column-icon.tsx +14 -0
  318. package/src/widgets-v2/actions/change-column/change-column.test.tsx +59 -0
  319. package/src/widgets-v2/actions/change-column/change-column.tsx +180 -0
  320. package/src/widgets-v2/actions/change-column/index.ts +7 -0
  321. package/src/widgets-v2/actions/change-column/labels.ts +9 -0
  322. package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +56 -0
  323. package/src/widgets-v2/actions/change-column/style.ts +32 -0
  324. package/src/widgets-v2/actions/change-column/types.ts +11 -0
  325. package/src/widgets-v2/actions/download/download.test.tsx +327 -0
  326. package/src/widgets-v2/actions/download/download.tsx +144 -0
  327. package/src/widgets-v2/actions/download/exports.test.tsx +198 -0
  328. package/src/widgets-v2/actions/download/exports.ts +115 -0
  329. package/src/widgets-v2/actions/download/icons.tsx +26 -0
  330. package/src/widgets-v2/actions/download/index.ts +13 -0
  331. package/src/widgets-v2/actions/download/labels.ts +16 -0
  332. package/src/widgets-v2/actions/download/png-item.test.tsx +72 -0
  333. package/src/widgets-v2/actions/download/png-item.tsx +52 -0
  334. package/src/widgets-v2/actions/download/style.ts +3 -0
  335. package/src/widgets-v2/actions/download/types.ts +32 -0
  336. package/src/widgets-v2/actions/fullscreen/fullscreen.test.tsx +150 -0
  337. package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +230 -0
  338. package/src/widgets-v2/actions/fullscreen/index.ts +7 -0
  339. package/src/widgets-v2/actions/fullscreen/labels.ts +9 -0
  340. package/src/widgets-v2/actions/fullscreen/style.ts +59 -0
  341. package/src/widgets-v2/actions/fullscreen/types.ts +15 -0
  342. package/src/widgets-v2/actions/index.ts +82 -0
  343. package/src/widgets-v2/actions/lock-selection/index.ts +10 -0
  344. package/src/widgets-v2/actions/lock-selection/labels.ts +11 -0
  345. package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +187 -0
  346. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +130 -0
  347. package/src/widgets-v2/actions/lock-selection/style.ts +11 -0
  348. package/src/widgets-v2/actions/lock-selection/transforms.ts +27 -0
  349. package/src/widgets-v2/actions/relative-data/index.ts +3 -0
  350. package/src/widgets-v2/actions/relative-data/labels.ts +9 -0
  351. package/src/widgets-v2/actions/relative-data/relative-data.test.tsx +71 -0
  352. package/src/widgets-v2/actions/relative-data/relative-data.tsx +107 -0
  353. package/src/widgets-v2/actions/relative-data/style.ts +11 -0
  354. package/src/widgets-v2/actions/relative-data/transforms.test.ts +151 -0
  355. package/src/widgets-v2/actions/relative-data/transforms.ts +70 -0
  356. package/src/widgets-v2/actions/searcher/filter.ts +28 -0
  357. package/src/widgets-v2/actions/searcher/index.ts +8 -0
  358. package/src/widgets-v2/actions/searcher/labels.ts +13 -0
  359. package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +91 -0
  360. package/src/widgets-v2/actions/searcher/searcher.test.tsx +92 -0
  361. package/src/widgets-v2/actions/searcher/searcher.tsx +112 -0
  362. package/src/widgets-v2/actions/searcher/style.ts +15 -0
  363. package/src/widgets-v2/actions/stack-toggle/index.ts +3 -0
  364. package/src/widgets-v2/actions/stack-toggle/labels.ts +9 -0
  365. package/src/widgets-v2/actions/stack-toggle/stack-toggle.test.tsx +61 -0
  366. package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +54 -0
  367. package/src/widgets-v2/actions/stack-toggle/style.ts +11 -0
  368. package/src/widgets-v2/actions/stack-toggle/transforms.test.ts +43 -0
  369. package/src/widgets-v2/actions/stack-toggle/transforms.ts +25 -0
  370. package/src/widgets-v2/actions/zoom-toggle/index.ts +9 -0
  371. package/src/widgets-v2/actions/zoom-toggle/labels.ts +9 -0
  372. package/src/widgets-v2/actions/zoom-toggle/style.ts +11 -0
  373. package/src/widgets-v2/actions/zoom-toggle/transforms.test.ts +148 -0
  374. package/src/widgets-v2/actions/zoom-toggle/transforms.ts +171 -0
  375. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.test.tsx +107 -0
  376. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +106 -0
  377. package/src/widgets-v2/bar/download.test.tsx +91 -0
  378. package/src/widgets-v2/bar/download.tsx +66 -0
  379. package/src/widgets-v2/bar/index.ts +10 -0
  380. package/src/widgets-v2/bar/options.test.ts +317 -0
  381. package/src/widgets-v2/bar/options.ts +326 -0
  382. package/src/widgets-v2/bar/skeleton.test.tsx +19 -0
  383. package/src/widgets-v2/bar/skeleton.tsx +69 -0
  384. package/src/widgets-v2/bar/types.ts +46 -0
  385. package/src/widgets-v2/category/category-ui.test.tsx +746 -0
  386. package/src/widgets-v2/category/category-ui.tsx +389 -0
  387. package/src/widgets-v2/category/category.relative-data.test.tsx +107 -0
  388. package/src/widgets-v2/category/category.stack-toggle.test.tsx +85 -0
  389. package/src/widgets-v2/category/category.test.tsx +305 -0
  390. package/src/widgets-v2/category/category.tsx +121 -0
  391. package/src/widgets-v2/category/components/category-bar-stacked.test.tsx +121 -0
  392. package/src/widgets-v2/category/components/category-bar-stacked.tsx +73 -0
  393. package/src/widgets-v2/category/components/category-bar.test.tsx +64 -0
  394. package/src/widgets-v2/category/components/category-bar.tsx +49 -0
  395. package/src/widgets-v2/category/components/category-legend.test.tsx +51 -0
  396. package/src/widgets-v2/category/components/category-legend.tsx +39 -0
  397. package/src/widgets-v2/category/components/category-row-multi.tsx +86 -0
  398. package/src/widgets-v2/category/components/category-row-other.test.tsx +28 -0
  399. package/src/widgets-v2/category/components/category-row-other.tsx +33 -0
  400. package/src/widgets-v2/category/components/category-row-single.tsx +76 -0
  401. package/src/widgets-v2/category/components/category-row-stacked.test.tsx +244 -0
  402. package/src/widgets-v2/category/components/category-row-stacked.tsx +99 -0
  403. package/src/widgets-v2/category/download.test.ts +71 -0
  404. package/src/widgets-v2/category/download.ts +54 -0
  405. package/src/widgets-v2/category/index.ts +32 -0
  406. package/src/widgets-v2/category/skeleton.test.tsx +26 -0
  407. package/src/widgets-v2/category/skeleton.tsx +74 -0
  408. package/src/widgets-v2/category/style.ts +290 -0
  409. package/src/widgets-v2/category/types.ts +54 -0
  410. package/src/widgets-v2/echart/echart-ui.test.tsx +232 -0
  411. package/src/widgets-v2/echart/echart-ui.tsx +184 -0
  412. package/src/widgets-v2/echart/echart.test.tsx +229 -0
  413. package/src/widgets-v2/echart/echart.tsx +199 -0
  414. package/src/widgets-v2/echart/index.ts +22 -0
  415. package/src/widgets-v2/echart/shared-resize-observer.test.ts +91 -0
  416. package/src/widgets-v2/echart/shared-resize-observer.ts +56 -0
  417. package/src/widgets-v2/echart/style.ts +8 -0
  418. package/src/widgets-v2/echart/use-chart-selection.test.tsx +118 -0
  419. package/src/widgets-v2/echart/use-chart-selection.ts +115 -0
  420. package/src/widgets-v2/formula/delta.tsx +61 -0
  421. package/src/widgets-v2/formula/download.test.tsx +65 -0
  422. package/src/widgets-v2/formula/download.tsx +69 -0
  423. package/src/widgets-v2/formula/formula-ui.test.tsx +91 -0
  424. package/src/widgets-v2/formula/formula-ui.tsx +66 -0
  425. package/src/widgets-v2/formula/formula.test.tsx +50 -0
  426. package/src/widgets-v2/formula/formula.tsx +34 -0
  427. package/src/widgets-v2/formula/index.ts +17 -0
  428. package/src/widgets-v2/formula/note.tsx +25 -0
  429. package/src/widgets-v2/formula/prefix.tsx +25 -0
  430. package/src/widgets-v2/formula/series.tsx +67 -0
  431. package/src/widgets-v2/formula/skeleton.test.tsx +21 -0
  432. package/src/widgets-v2/formula/skeleton.tsx +27 -0
  433. package/src/widgets-v2/formula/style.ts +31 -0
  434. package/src/widgets-v2/formula/subcomponents.test.tsx +107 -0
  435. package/src/widgets-v2/formula/suffix.tsx +25 -0
  436. package/src/widgets-v2/formula/types.ts +44 -0
  437. package/src/widgets-v2/formula/value.tsx +31 -0
  438. package/src/widgets-v2/histogram/download.test.ts +94 -0
  439. package/src/widgets-v2/histogram/download.ts +60 -0
  440. package/src/widgets-v2/histogram/index.ts +10 -0
  441. package/src/widgets-v2/histogram/options.test.ts +304 -0
  442. package/src/widgets-v2/histogram/options.ts +337 -0
  443. package/src/widgets-v2/histogram/skeleton.test.tsx +16 -0
  444. package/src/widgets-v2/histogram/skeleton.tsx +70 -0
  445. package/src/widgets-v2/histogram/transforms.test.ts +46 -0
  446. package/src/widgets-v2/histogram/transforms.ts +30 -0
  447. package/src/widgets-v2/histogram/types.ts +51 -0
  448. package/src/widgets-v2/index.ts +201 -0
  449. package/src/widgets-v2/markdown/download.test.ts +66 -0
  450. package/src/widgets-v2/markdown/download.ts +53 -0
  451. package/src/widgets-v2/markdown/index.ts +6 -0
  452. package/src/widgets-v2/markdown/markdown-content.test.tsx +155 -0
  453. package/src/widgets-v2/markdown/markdown-content.tsx +72 -0
  454. package/src/widgets-v2/markdown/markdown-ui.test.tsx +75 -0
  455. package/src/widgets-v2/markdown/markdown-ui.tsx +55 -0
  456. package/src/widgets-v2/markdown/markdown.test.tsx +39 -0
  457. package/src/widgets-v2/markdown/markdown.tsx +17 -0
  458. package/src/widgets-v2/markdown/skeleton.test.tsx +15 -0
  459. package/src/widgets-v2/markdown/skeleton.tsx +32 -0
  460. package/src/widgets-v2/markdown/style.ts +53 -0
  461. package/src/widgets-v2/markdown/types.ts +4 -0
  462. package/src/widgets-v2/note/labels.ts +9 -0
  463. package/src/widgets-v2/note/style.ts +26 -0
  464. package/src/widgets-v2/note/widget-note.test.tsx +158 -0
  465. package/src/widgets-v2/note/widget-note.tsx +172 -0
  466. package/src/widgets-v2/pie/download.test.ts +78 -0
  467. package/src/widgets-v2/pie/download.ts +55 -0
  468. package/src/widgets-v2/pie/index.ts +10 -0
  469. package/src/widgets-v2/pie/options.test.ts +585 -0
  470. package/src/widgets-v2/pie/options.ts +509 -0
  471. package/src/widgets-v2/pie/skeleton.test.tsx +17 -0
  472. package/src/widgets-v2/pie/skeleton.tsx +32 -0
  473. package/src/widgets-v2/pie/types.ts +55 -0
  474. package/src/widgets-v2/provider/widget-provider.test.tsx +119 -0
  475. package/src/widgets-v2/provider/widget-provider.tsx +111 -0
  476. package/src/widgets-v2/range/index.ts +4 -0
  477. package/src/widgets-v2/range/range-ui.test.tsx +130 -0
  478. package/src/widgets-v2/range/range-ui.tsx +211 -0
  479. package/src/widgets-v2/range/range.test.tsx +68 -0
  480. package/src/widgets-v2/range/range.tsx +46 -0
  481. package/src/widgets-v2/range/skeleton.test.tsx +17 -0
  482. package/src/widgets-v2/range/skeleton.tsx +47 -0
  483. package/src/widgets-v2/range/style.ts +41 -0
  484. package/src/widgets-v2/range/types.ts +37 -0
  485. package/src/widgets-v2/scatterplot/download.test.ts +71 -0
  486. package/src/widgets-v2/scatterplot/download.ts +54 -0
  487. package/src/widgets-v2/scatterplot/index.ts +11 -0
  488. package/src/widgets-v2/scatterplot/options.test.ts +399 -0
  489. package/src/widgets-v2/scatterplot/options.ts +421 -0
  490. package/src/widgets-v2/scatterplot/skeleton.test.tsx +17 -0
  491. package/src/widgets-v2/scatterplot/skeleton.tsx +84 -0
  492. package/src/widgets-v2/scatterplot/transforms.test.ts +97 -0
  493. package/src/widgets-v2/scatterplot/transforms.ts +38 -0
  494. package/src/widgets-v2/scatterplot/types.ts +55 -0
  495. package/src/widgets-v2/selection-summary/labels.ts +11 -0
  496. package/src/widgets-v2/selection-summary/selection-summary.test.tsx +53 -0
  497. package/src/widgets-v2/selection-summary/selection-summary.tsx +62 -0
  498. package/src/widgets-v2/selection-summary/style.ts +23 -0
  499. package/src/widgets-v2/spread/download.test.ts +64 -0
  500. package/src/widgets-v2/spread/download.ts +59 -0
  501. package/src/widgets-v2/spread/index.ts +6 -0
  502. package/src/widgets-v2/spread/separator.tsx +11 -0
  503. package/src/widgets-v2/spread/skeleton.test.tsx +17 -0
  504. package/src/widgets-v2/spread/skeleton.tsx +38 -0
  505. package/src/widgets-v2/spread/spread-ui.test.tsx +108 -0
  506. package/src/widgets-v2/spread/spread-ui.tsx +52 -0
  507. package/src/widgets-v2/spread/spread.test.tsx +50 -0
  508. package/src/widgets-v2/spread/spread.tsx +31 -0
  509. package/src/widgets-v2/spread/types.ts +27 -0
  510. package/src/widgets-v2/state/labels.test.ts +33 -0
  511. package/src/widgets-v2/state/labels.ts +20 -0
  512. package/src/widgets-v2/state/style.ts +25 -0
  513. package/src/widgets-v2/state/widget-state.test.tsx +294 -0
  514. package/src/widgets-v2/state/widget-state.tsx +184 -0
  515. package/src/widgets-v2/stores/index.ts +49 -0
  516. package/src/widgets-v2/stores/pipeline-middleware.test.ts +187 -0
  517. package/src/widgets-v2/stores/pipeline-middleware.ts +91 -0
  518. package/src/widgets-v2/stores/transforms.test.ts +162 -0
  519. package/src/widgets-v2/stores/transforms.ts +70 -0
  520. package/src/widgets-v2/stores/types.ts +64 -0
  521. package/src/widgets-v2/stores/use-echart-instance.test.tsx +91 -0
  522. package/src/widgets-v2/stores/use-echart-instance.ts +29 -0
  523. package/src/widgets-v2/stores/use-transform-enabled.test.tsx +127 -0
  524. package/src/widgets-v2/stores/use-transform-enabled.ts +25 -0
  525. package/src/widgets-v2/stores/use-transform.test.tsx +262 -0
  526. package/src/widgets-v2/stores/use-transform.ts +158 -0
  527. package/src/widgets-v2/stores/widget-context.test.tsx +58 -0
  528. package/src/widgets-v2/stores/widget-context.ts +15 -0
  529. package/src/widgets-v2/stores/widget-store-registry.test.ts +292 -0
  530. package/src/widgets-v2/stores/widget-store-registry.ts +248 -0
  531. package/src/widgets-v2/subheader/style.ts +12 -0
  532. package/src/widgets-v2/subheader/subheader.test.tsx +30 -0
  533. package/src/widgets-v2/subheader/subheader.tsx +16 -0
  534. package/src/widgets-v2/table/download.test.ts +75 -0
  535. package/src/widgets-v2/table/download.ts +47 -0
  536. package/src/widgets-v2/table/helpers.test.ts +214 -0
  537. package/src/widgets-v2/table/helpers.ts +136 -0
  538. package/src/widgets-v2/table/index.ts +23 -0
  539. package/src/widgets-v2/table/labels.tsx +41 -0
  540. package/src/widgets-v2/table/skeleton.test.tsx +26 -0
  541. package/src/widgets-v2/table/skeleton.tsx +65 -0
  542. package/src/widgets-v2/table/style.ts +46 -0
  543. package/src/widgets-v2/table/table-ui.test.tsx +200 -0
  544. package/src/widgets-v2/table/table-ui.tsx +331 -0
  545. package/src/widgets-v2/table/table.test.tsx +119 -0
  546. package/src/widgets-v2/table/table.tsx +174 -0
  547. package/src/widgets-v2/table/types.ts +44 -0
  548. package/src/widgets-v2/test-utils.ts +107 -0
  549. package/src/widgets-v2/timeseries/download.test.ts +95 -0
  550. package/src/widgets-v2/timeseries/download.ts +86 -0
  551. package/src/widgets-v2/timeseries/index.ts +10 -0
  552. package/src/widgets-v2/timeseries/options.test.ts +379 -0
  553. package/src/widgets-v2/timeseries/options.ts +341 -0
  554. package/src/widgets-v2/timeseries/skeleton.test.tsx +13 -0
  555. package/src/widgets-v2/timeseries/skeleton.tsx +76 -0
  556. package/src/widgets-v2/timeseries/types.ts +61 -0
  557. package/src/widgets-v2/toolbox/labels.ts +9 -0
  558. package/src/widgets-v2/toolbox/style.ts +33 -0
  559. package/src/widgets-v2/toolbox/toolbox.test.tsx +200 -0
  560. package/src/widgets-v2/toolbox/toolbox.tsx +309 -0
  561. package/src/widgets-v2/utils/data-zoom-layout.ts +26 -0
  562. package/src/widgets-v2/utils/index.ts +2 -0
  563. package/src/widgets-v2/utils/merge-options.test.ts +52 -0
  564. package/src/widgets-v2/utils/merge-options.ts +50 -0
  565. package/src/widgets-v2/wrapper/index.ts +14 -0
  566. package/src/widgets-v2/wrapper/labels.ts +11 -0
  567. package/src/widgets-v2/wrapper/style.ts +134 -0
  568. package/src/widgets-v2/wrapper/widget-actions.test.tsx +52 -0
  569. package/src/widgets-v2/wrapper/widget-actions.tsx +43 -0
  570. package/src/widgets-v2/wrapper/widget-content.test.tsx +27 -0
  571. package/src/widgets-v2/wrapper/widget-content.tsx +29 -0
  572. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +159 -0
  573. package/src/widgets-v2/wrapper/widget-wrapper.tsx +178 -0
  574. package/dist/styles-BYTyKQFP.js.map +0 -1
@@ -0,0 +1,174 @@
1
+ import { useCallback, useMemo } from 'react'
2
+ import {
3
+ getWidgetStore,
4
+ useWidget,
5
+ useWidgetId,
6
+ useWidgetShallow,
7
+ } from '../stores'
8
+ import { TableUI, type TableUIProps } from './table-ui'
9
+ import {
10
+ DEFAULT_TABLE_PAGE_SIZE,
11
+ type TableColumn,
12
+ type TableRow,
13
+ type TableSortState,
14
+ type TableWidgetState,
15
+ } from './types'
16
+ import { deriveVisibleRows, resolveColumns } from './helpers'
17
+
18
+ export interface TableProps<T extends TableRow = TableRow> extends Pick<
19
+ TableUIProps<T>,
20
+ 'pageSizeOptions' | 'selectable' | 'labels' | 'emptyContent' | 'size'
21
+ > {
22
+ /**
23
+ * Column definitions. Order can be overridden by ChangeColumn via the
24
+ * `columnOrder` field on the extended widget state.
25
+ */
26
+ columns: readonly TableColumn[]
27
+ /**
28
+ * When set, render only the first `visibleColumns` entries **after**
29
+ * applying the user's `columnOrder` from the store. Useful for showing
30
+ * a compact projection while letting consumers (e.g. `Widget.ChangeColumn`)
31
+ * see the full column list. When omitted, every column renders.
32
+ */
33
+ visibleColumns?: number
34
+ /** Initial page size (only on first mount; afterwards lives on the store). */
35
+ initialPageSize?: number
36
+ /** Selected row ids (destination-owned). */
37
+ selection?: readonly (string | number)[]
38
+ onSelectionChange?: (next: readonly (string | number)[]) => void
39
+ onRowClick?: (row: T) => void
40
+ onRowHover?: (row: T | null) => void
41
+ /**
42
+ * When `true`, the bridge stops sorting and paginating locally and
43
+ * renders `data` as-is — the consumer is then responsible for
44
+ * refetching the slice that matches the active `page` / `pageSize` /
45
+ * `sort` from the outbound callbacks below. `total` is required in
46
+ * this mode (the server already knows the full row count; the
47
+ * widget can't infer it from a partial page).
48
+ */
49
+ remote?: boolean
50
+ /**
51
+ * Server-reported total row count. Required when `remote === true`;
52
+ * ignored in local mode (where the bridge derives total from the
53
+ * sorted result of `deriveVisibleRows`).
54
+ */
55
+ total?: number
56
+ /** Fires after the store-level sort write so the consumer can refetch. */
57
+ onSortChange?: (next: TableSortState) => void
58
+ /** Fires after the store-level page write so the consumer can refetch. */
59
+ onPageChange?: (page: number) => void
60
+ /** Fires after the store-level pageSize write so the consumer can refetch. */
61
+ onPageSizeChange?: (pageSize: number) => void
62
+ }
63
+
64
+ /**
65
+ * Bridge component — reads the widget store's `data`, applies sort + pagination
66
+ * locally, and feeds `<TableUI />`. Sort, page, and pageSize live on the
67
+ * extended widget state ({@link TableWidgetState}).
68
+ */
69
+ export function Table<T extends TableRow = TableRow>({
70
+ columns,
71
+ visibleColumns,
72
+ initialPageSize = DEFAULT_TABLE_PAGE_SIZE,
73
+ selection,
74
+ onSelectionChange,
75
+ onRowClick,
76
+ onRowHover,
77
+ remote = false,
78
+ total: remoteTotal,
79
+ onSortChange,
80
+ onPageChange,
81
+ onPageSizeChange,
82
+ ...uiProps
83
+ }: TableProps<T>) {
84
+ const id = useWidgetId()
85
+ const data = useWidget(id, (s) => s.data as readonly T[] | undefined)
86
+ const ui = useWidgetShallow<
87
+ {
88
+ sort: TableSortState | undefined
89
+ page: number
90
+ pageSize: number
91
+ columnOrder: readonly string[] | undefined
92
+ },
93
+ TableWidgetState
94
+ >(id, (s) => ({
95
+ sort: s.sort,
96
+ page: s.page ?? 0,
97
+ pageSize: s.pageSize ?? initialPageSize,
98
+ columnOrder: s.columnOrder,
99
+ }))
100
+
101
+ const orderedColumns = useMemo(() => {
102
+ const reordered = resolveColumns(columns, ui.columnOrder)
103
+ return visibleColumns == null
104
+ ? reordered
105
+ : reordered.slice(0, visibleColumns)
106
+ }, [columns, ui.columnOrder, visibleColumns])
107
+
108
+ // In remote mode the consumer already paginated / sorted server-side,
109
+ // so pass `data` and `total` straight through. Local mode keeps the
110
+ // bridge-driven sort + slice via `deriveVisibleRows`.
111
+ const { rows, totalRows } = useMemo(() => {
112
+ if (remote) {
113
+ return {
114
+ rows: data ?? [],
115
+ totalRows: remoteTotal ?? 0,
116
+ }
117
+ }
118
+ const { sorted, visible } = deriveVisibleRows(data ?? [], {
119
+ sort: ui.sort,
120
+ page: ui.page,
121
+ pageSize: ui.pageSize,
122
+ })
123
+ return { rows: visible, totalRows: sorted.length }
124
+ }, [remote, data, remoteTotal, ui.sort, ui.page, ui.pageSize])
125
+
126
+ const handleSortChange = useCallback(
127
+ (next: TableSortState) => {
128
+ getWidgetStore(id).setState({
129
+ sort: next,
130
+ page: 0,
131
+ } as Partial<TableWidgetState>)
132
+ onSortChange?.(next)
133
+ },
134
+ [id, onSortChange],
135
+ )
136
+
137
+ const handlePageChange = useCallback(
138
+ (page: number) => {
139
+ getWidgetStore(id).setState({ page } as Partial<TableWidgetState>)
140
+ onPageChange?.(page)
141
+ },
142
+ [id, onPageChange],
143
+ )
144
+
145
+ const handlePageSizeChange = useCallback(
146
+ (pageSize: number) => {
147
+ getWidgetStore(id).setState({
148
+ pageSize,
149
+ page: 0,
150
+ } as Partial<TableWidgetState>)
151
+ onPageSizeChange?.(pageSize)
152
+ },
153
+ [id, onPageSizeChange],
154
+ )
155
+
156
+ return (
157
+ <TableUI
158
+ {...uiProps}
159
+ columns={orderedColumns}
160
+ rows={rows}
161
+ total={totalRows}
162
+ page={ui.page}
163
+ pageSize={ui.pageSize}
164
+ sort={ui.sort}
165
+ selection={selection}
166
+ onSortChange={handleSortChange}
167
+ onPageChange={handlePageChange}
168
+ onPageSizeChange={handlePageSizeChange}
169
+ onSelectionChange={onSelectionChange}
170
+ onRowClick={onRowClick}
171
+ onRowHover={onRowHover}
172
+ />
173
+ )
174
+ }
@@ -0,0 +1,44 @@
1
+ import type { ReactNode } from 'react'
2
+ import type { WidgetState } from '../stores'
3
+
4
+ /** Single row of tabular data. Must have an `id` for selection / keying. */
5
+ export interface TableRow extends Record<string, unknown> {
6
+ id: string | number
7
+ }
8
+
9
+ export type TableWidgetData = readonly TableRow[]
10
+
11
+ export type TableSortDirection = 'asc' | 'desc'
12
+
13
+ export interface TableSortState {
14
+ columnId: string | null
15
+ direction: TableSortDirection
16
+ }
17
+
18
+ export interface TableColumn {
19
+ /** Unique column identifier; matches the field name on each row. */
20
+ id: string
21
+ /** Header label. */
22
+ label: ReactNode
23
+ align?: 'left' | 'center' | 'right'
24
+ width?: number | string
25
+ sortable?: boolean
26
+ /** Custom cell renderer. Falls back to a string-cast of the raw value. */
27
+ formatter?: (value: unknown, row: TableRow) => ReactNode
28
+ }
29
+
30
+ /**
31
+ * State extension carrying Table-specific UI state on the per-widget store.
32
+ * Per R12: widget-specific UI state lives in widget-specific extensions of
33
+ * `WidgetState`, not on the base type.
34
+ */
35
+ export interface TableWidgetState extends WidgetState {
36
+ /** Optional reordered column list driven by ChangeColumn. Falls back to props. */
37
+ columnOrder?: readonly string[]
38
+ sort?: TableSortState
39
+ page: number
40
+ pageSize: number
41
+ }
42
+
43
+ export const DEFAULT_TABLE_PAGE_SIZE = 10
44
+ export const DEFAULT_TABLE_PAGE_SIZE_OPTIONS = [10, 25, 50, 100] as const
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Shared test helpers for widgets-v2 unit tests.
3
+ *
4
+ * Keep this file small: only utilities used by 3+ tests live here. One-off
5
+ * mocks remain inline in their test files to stay legible.
6
+ *
7
+ * NOTE: this file is intentionally `.ts` (not `.tsx`) so consumers must
8
+ * pass JSX in from their own `.tsx` test files. Keeping the module
9
+ * JSX-free avoids polluting non-React tests with a React dependency.
10
+ */
11
+ import { vi } from 'vitest'
12
+ import type { ECharts, EChartsOption } from 'echarts'
13
+ import { getWidgetStore, type WidgetState, type WidgetStoreApi } from './stores'
14
+
15
+ // ─── ECharts instance mock ────────────────────────────────────────────────
16
+
17
+ export interface MockChartHandlers {
18
+ finished?: () => void
19
+ rendered?: () => void
20
+ click?: (params: unknown) => void
21
+ globalcursortaken?: (params: unknown) => void
22
+ datazoom?: (params: unknown) => void
23
+ brushselected?: (params: unknown) => void
24
+ brushend?: (params: unknown) => void
25
+ [key: string]: ((params?: unknown) => void) | undefined
26
+ }
27
+
28
+ export interface MockChart {
29
+ dispatchAction: ReturnType<typeof vi.fn>
30
+ setOption: ReturnType<typeof vi.fn>
31
+ getOption: ReturnType<typeof vi.fn>
32
+ resize: ReturnType<typeof vi.fn>
33
+ clear: ReturnType<typeof vi.fn>
34
+ dispose: ReturnType<typeof vi.fn>
35
+ isDisposed: ReturnType<typeof vi.fn>
36
+ getWidth: ReturnType<typeof vi.fn>
37
+ getHeight: ReturnType<typeof vi.fn>
38
+ getDom: ReturnType<typeof vi.fn>
39
+ on: (event: string, callback: (params?: unknown) => void) => void
40
+ off: (event: string, callback?: (params?: unknown) => void) => void
41
+ __handlers: MockChartHandlers
42
+ __emit: (event: keyof MockChartHandlers, params?: unknown) => void
43
+ }
44
+
45
+ /**
46
+ * Returns a duck-typed `ECharts` instance suitable for tests. The instance
47
+ * captures `on()` handlers in `__handlers` so tests can `__emit('finished')`
48
+ * directly, and all imperative methods (`dispatchAction`, `setOption`,
49
+ * `resize`, …) are `vi.fn()` spies.
50
+ */
51
+ export function createMockChart(): MockChart {
52
+ const handlers: MockChartHandlers = {}
53
+ const chart: MockChart = {
54
+ dispatchAction: vi.fn(),
55
+ setOption: vi.fn(),
56
+ getOption: vi.fn(() => ({})),
57
+ resize: vi.fn(),
58
+ clear: vi.fn(),
59
+ dispose: vi.fn(),
60
+ isDisposed: vi.fn(() => false),
61
+ getWidth: vi.fn(() => 400),
62
+ getHeight: vi.fn(() => 300),
63
+ getDom: vi.fn(() => document.createElement('div')),
64
+ on: (event, callback) => {
65
+ handlers[event] = callback as MockChartHandlers[string]
66
+ },
67
+ off: (event) => {
68
+ handlers[event] = undefined
69
+ },
70
+ __handlers: handlers,
71
+ __emit: (event, params) => {
72
+ handlers[event as string]?.(params)
73
+ },
74
+ }
75
+ return chart
76
+ }
77
+
78
+ /** Convenience cast for tests that need an `ECharts`-typed reference. */
79
+ export const asEcharts = (chart: MockChart): ECharts =>
80
+ chart as unknown as ECharts
81
+
82
+ // ─── Option factory helpers ────────────────────────────────────────────────
83
+
84
+ /**
85
+ * Returns a `vi.fn()` option factory. The factory takes the standard
86
+ * `(option, data, ctx)` signature and returns the supplied `output` unchanged.
87
+ * Useful when the test only cares about how the bridge wires the factory in.
88
+ */
89
+ export function createMockOptionFactory(output: EChartsOption = {}) {
90
+ return vi.fn(() => output)
91
+ }
92
+
93
+ // ─── Store accessor ────────────────────────────────────────────────────────
94
+
95
+ /**
96
+ * Typed re-export of `getWidgetStore(id).getState()` — the verbose form
97
+ * shows up dozens of times across the suite. Tests that need the store
98
+ * api itself (`setState`, `subscribe`) still call `getWidgetStore(id)`.
99
+ */
100
+ export function getState(id: string): WidgetState {
101
+ return getWidgetStore(id).getState()
102
+ }
103
+
104
+ /** Typed re-export of `getWidgetStore(id)` for tests that need the api. */
105
+ export function getStore(id: string): WidgetStoreApi {
106
+ return getWidgetStore(id)
107
+ }
@@ -0,0 +1,95 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest'
2
+ import { createTimeseriesDownloadConfig } from './download'
3
+ import type { TimeseriesWidgetData } from './types'
4
+
5
+ let csvText = ''
6
+
7
+ beforeEach(() => {
8
+ csvText = ''
9
+ vi.spyOn(URL, 'createObjectURL').mockReturnValue('blob:mock')
10
+ vi.spyOn(URL, 'revokeObjectURL').mockImplementation(() => undefined)
11
+ const RealBlob = global.Blob
12
+ vi.stubGlobal(
13
+ 'Blob',
14
+ class extends RealBlob {
15
+ constructor(parts: BlobPart[], opts?: BlobPropertyBag) {
16
+ csvText = typeof parts[0] === 'string' ? parts[0] : ''
17
+ super(parts, opts)
18
+ }
19
+ },
20
+ )
21
+ })
22
+
23
+ describe('createTimeseriesDownloadConfig', () => {
24
+ it('CSV-only by default', () => {
25
+ expect(
26
+ createTimeseriesDownloadConfig({
27
+ filename: 't',
28
+ getData: () => [[{ name: '2024-01-01', value: 1 }]],
29
+ }).map((i) => i.id),
30
+ ).toEqual(['csv'])
31
+ })
32
+
33
+ it('prepends PNG when getCaptureEl is provided', () => {
34
+ const items = createTimeseriesDownloadConfig({
35
+ filename: 't',
36
+ getData: () => [],
37
+ getCaptureEl: () => document.createElement('div'),
38
+ })
39
+ expect(items.map((i) => i.id)).toEqual(['png', 'csv'])
40
+ })
41
+
42
+ it('emits ISO strings for Date keys and aligns rows across series', async () => {
43
+ const d1 = new Date('2024-01-01T00:00:00.000Z')
44
+ const d2 = new Date('2024-01-02T00:00:00.000Z')
45
+ const data: TimeseriesWidgetData = [
46
+ [
47
+ { name: d1, value: 1 },
48
+ { name: d2, value: 2 },
49
+ ],
50
+ [{ name: d2, value: 20 }],
51
+ ]
52
+ const items = createTimeseriesDownloadConfig({
53
+ filename: 't',
54
+ getData: () => data,
55
+ })
56
+ const handle = await items.find((i) => i.id === 'csv')!.resolve()
57
+ expect(handle.filename).toBe('t.csv')
58
+ expect(csvText).toBe(
59
+ 'time,series_1,series_2\n' +
60
+ '2024-01-01T00:00:00.000Z,1,\n' +
61
+ '2024-01-02T00:00:00.000Z,2,20',
62
+ )
63
+ })
64
+
65
+ it('emits ISO strings for numeric ms-since-epoch keys', async () => {
66
+ const ts = Date.UTC(2024, 0, 1)
67
+ const data: TimeseriesWidgetData = [[{ name: ts, value: 7 }]]
68
+ const items = createTimeseriesDownloadConfig({
69
+ filename: 't',
70
+ getData: () => data,
71
+ })
72
+ await items.find((i) => i.id === 'csv')!.resolve()
73
+ expect(csvText).toContain('2024-01-01T00:00:00.000Z,7')
74
+ })
75
+
76
+ it('passes string time keys through verbatim', async () => {
77
+ const data: TimeseriesWidgetData = [[{ name: '2024-Q1', value: 1 }]]
78
+ const items = createTimeseriesDownloadConfig({
79
+ filename: 't',
80
+ getData: () => data,
81
+ })
82
+ await items.find((i) => i.id === 'csv')!.resolve()
83
+ expect(csvText).toContain('2024-Q1,1')
84
+ })
85
+
86
+ it('uses supplied seriesNames in the header', async () => {
87
+ const items = createTimeseriesDownloadConfig({
88
+ filename: 't',
89
+ getData: () => [[{ name: '2024', value: 1 }]],
90
+ seriesNames: ['revenue'],
91
+ })
92
+ await items.find((i) => i.id === 'csv')!.resolve()
93
+ expect(csvText.split('\n')[0]).toBe('time,revenue')
94
+ })
95
+ })
@@ -0,0 +1,86 @@
1
+ import {
2
+ buildPngDownloadItem,
3
+ downloadToCSV,
4
+ type DownloadItem,
5
+ } from '../actions/download'
6
+ import type { TimeseriesWidgetData } from './types'
7
+
8
+ /**
9
+ * Download menu items for the Timeseries widget. Always includes a CSV
10
+ * item with `time, series_1, series_2, …` columns (one row per unique time
11
+ * across all series; ISO-8601 strings for `Date`/numeric times). When
12
+ * `getCaptureEl` is supplied, prepends a PNG item that rasterises the
13
+ * captured element via `html2canvas`.
14
+ */
15
+ export function createTimeseriesDownloadConfig(args: {
16
+ filename: string
17
+ getData: () => TimeseriesWidgetData
18
+ seriesNames?: readonly string[]
19
+ getCaptureEl?: () => HTMLElement | null
20
+ pngPixelRatio?: number
21
+ pngBackgroundColor?: string | null
22
+ }): DownloadItem[] {
23
+ const items: DownloadItem[] = []
24
+ if (args.getCaptureEl) {
25
+ items.push(
26
+ buildPngDownloadItem({
27
+ filename: args.filename,
28
+ getCaptureEl: args.getCaptureEl,
29
+ pixelRatio: args.pngPixelRatio,
30
+ backgroundColor: args.pngBackgroundColor,
31
+ }),
32
+ )
33
+ }
34
+ items.push({
35
+ id: 'csv',
36
+ label: 'Download as CSV',
37
+ resolve: () => {
38
+ const data = args.getData()
39
+ const seriesCount = data.length
40
+
41
+ // Collect every unique time, preserving insertion order.
42
+ const timeKeys: (Date | number | string)[] = []
43
+ const seenKeys = new Set<string>()
44
+ for (const series of data) {
45
+ for (const point of series) {
46
+ const key = String(point.name)
47
+ if (!seenKeys.has(key)) {
48
+ seenKeys.add(key)
49
+ timeKeys.push(point.name)
50
+ }
51
+ }
52
+ }
53
+
54
+ // Build a quick lookup per series for O(rows × series) emit.
55
+ const lookups = data.map(
56
+ (series) => new Map(series.map((p) => [String(p.name), p.value])),
57
+ )
58
+
59
+ const header: unknown[] = ['time']
60
+ for (let i = 0; i < seriesCount; i++) {
61
+ header.push(args.seriesNames?.[i] ?? `series_${i + 1}`)
62
+ }
63
+ const rows: unknown[][] = [header]
64
+ for (const key of timeKeys) {
65
+ const row: unknown[] = [formatTime(key)]
66
+ const lookupKey = String(key)
67
+ for (const lookup of lookups) row.push(lookup.get(lookupKey) ?? '')
68
+ rows.push(row)
69
+ }
70
+
71
+ const handle = downloadToCSV(rows)
72
+ return Promise.resolve({
73
+ url: handle.url,
74
+ filename: `${args.filename}.csv`,
75
+ revoke: handle.revoke,
76
+ })
77
+ },
78
+ })
79
+ return items
80
+ }
81
+
82
+ function formatTime(v: Date | number | string): string {
83
+ if (v instanceof Date) return v.toISOString()
84
+ if (typeof v === 'number') return new Date(v).toISOString()
85
+ return v
86
+ }
@@ -0,0 +1,10 @@
1
+ export { timeseriesOptions, createTimeseriesOptionFactory } from './options'
2
+ export { TimeseriesSkeleton } from './skeleton'
3
+ export { createTimeseriesDownloadConfig } from './download'
4
+ export type {
5
+ TimeseriesDatum,
6
+ TimeseriesWidgetData,
7
+ TimeseriesOptionsInput,
8
+ TimeseriesOptionFactoryInput,
9
+ TimeseriesEChartsOption,
10
+ } from './types'