@carto/ps-react-ui 4.3.3 → 4.3.5

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 (301) hide show
  1. package/dist/components.js +3 -3
  2. package/dist/components.js.map +1 -1
  3. package/dist/{lasso-tool-BwRzEW7k.js → lasso-tool-wFqOD6wk.js} +13 -13
  4. package/dist/lasso-tool-wFqOD6wk.js.map +1 -0
  5. package/dist/types/components/common-types.d.ts +41 -0
  6. package/dist/types/components/types.d.ts +1 -1
  7. package/dist/types/widgets/echart/echart-ui.d.ts +1 -1
  8. package/dist/types/widgets/echart/types.d.ts +4 -0
  9. package/dist/widgets/actions.js +1 -1
  10. package/dist/widgets/bar.js +1 -1
  11. package/dist/widgets/category.js +1 -1
  12. package/dist/widgets/echart.js +96 -85
  13. package/dist/widgets/echart.js.map +1 -1
  14. package/dist/widgets/formula.js +1 -1
  15. package/dist/widgets/histogram.js +1 -1
  16. package/dist/widgets/markdown.js +1 -1
  17. package/dist/widgets/pie.js +1 -1
  18. package/dist/widgets/scatterplot.js +1 -1
  19. package/dist/widgets/spread.js +1 -1
  20. package/dist/widgets/table.js +1 -1
  21. package/dist/widgets/timeseries.js +1 -1
  22. package/dist/widgets/toolbar-actions.js.map +1 -1
  23. package/dist/widgets/wrapper.js +1 -1
  24. package/package.json +8 -3
  25. package/src/components/basemaps/basemaps.test.tsx +196 -0
  26. package/src/components/basemaps/basemaps.tsx +128 -0
  27. package/src/components/basemaps/const.ts +13 -0
  28. package/src/components/basemaps/group-wrapper.test.tsx +38 -0
  29. package/src/components/basemaps/group-wrapper.tsx +28 -0
  30. package/src/components/basemaps/group.test.tsx +52 -0
  31. package/src/components/basemaps/group.tsx +42 -0
  32. package/src/components/basemaps/header.test.tsx +54 -0
  33. package/src/components/basemaps/header.tsx +36 -0
  34. package/src/components/basemaps/styles.ts +76 -0
  35. package/src/components/basemaps/types.ts +30 -0
  36. package/src/components/common-types.ts +1 -0
  37. package/src/components/geolocation-controls/const.ts +6 -0
  38. package/src/components/geolocation-controls/geolocation-controls.test.tsx +133 -0
  39. package/src/components/geolocation-controls/geolocation-controls.tsx +95 -0
  40. package/src/components/geolocation-controls/types.ts +17 -0
  41. package/src/components/index.ts +64 -0
  42. package/src/components/lasso-tool/chip.tsx +37 -0
  43. package/src/components/lasso-tool/const.tsx +70 -0
  44. package/src/components/lasso-tool/icons.tsx +91 -0
  45. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +168 -0
  46. package/src/components/lasso-tool/lasso-tool-inline.tsx +245 -0
  47. package/src/components/lasso-tool/lasso-tool.test.tsx +212 -0
  48. package/src/components/lasso-tool/lasso-tool.tsx +479 -0
  49. package/src/components/lasso-tool/styles.ts +143 -0
  50. package/src/components/lasso-tool/types.ts +114 -0
  51. package/src/components/list-data/list-data-skeleton.test.tsx +10 -0
  52. package/src/components/list-data/list-data-skeleton.tsx +40 -0
  53. package/src/components/list-data/list-data.test.tsx +94 -0
  54. package/src/components/list-data/list-data.tsx +106 -0
  55. package/src/components/list-data/styles.ts +37 -0
  56. package/src/components/list-data/types.ts +25 -0
  57. package/src/components/measurement-tools/const.tsx +108 -0
  58. package/src/components/measurement-tools/icons.tsx +54 -0
  59. package/src/components/measurement-tools/measurement-tools.test.tsx +165 -0
  60. package/src/components/measurement-tools/measurement-tools.tsx +443 -0
  61. package/src/components/measurement-tools/styles.ts +91 -0
  62. package/src/components/measurement-tools/types.ts +77 -0
  63. package/src/components/no-data-alert/no-data-alert.test.tsx +31 -0
  64. package/src/components/no-data-alert/no-data-alert.tsx +59 -0
  65. package/src/components/responsive-drawer/responsive-drawer.test.tsx +91 -0
  66. package/src/components/responsive-drawer/responsive-drawer.tsx +53 -0
  67. package/src/components/smart-tooltip/smart-tooltip.test.tsx +168 -0
  68. package/src/components/smart-tooltip/smart-tooltip.tsx +40 -0
  69. package/src/components/tooltip/tooltip.test.tsx +86 -0
  70. package/src/components/tooltip/tooltip.tsx +30 -0
  71. package/src/components/types.ts +1 -0
  72. package/src/components/zoom-controls/styles.ts +27 -0
  73. package/src/components/zoom-controls/types.ts +19 -0
  74. package/src/components/zoom-controls/zoom-controls.test.tsx +101 -0
  75. package/src/components/zoom-controls/zoom-controls.tsx +114 -0
  76. package/src/hooks/index.ts +2 -0
  77. package/src/hooks/use-debounce.ts +55 -0
  78. package/src/hooks/use-skeleton.test.tsx +32 -0
  79. package/src/hooks/use-skeleton.ts +19 -0
  80. package/src/hooks/use-widget-ref.ts +33 -0
  81. package/src/widgets/README.md +277 -0
  82. package/src/widgets/_shared/chart-config/config-factory.ts +67 -0
  83. package/src/widgets/_shared/chart-config/csv-modifiers.ts +56 -0
  84. package/src/widgets/_shared/chart-config/index.ts +21 -0
  85. package/src/widgets/_shared/chart-config/option-builders.ts +203 -0
  86. package/src/widgets/_shared/skeleton/index.ts +5 -0
  87. package/src/widgets/_shared/skeleton/styles.ts +20 -0
  88. package/src/widgets/actions/change-column/change-column-icon.tsx +10 -0
  89. package/src/widgets/actions/change-column/change-column.test.tsx +163 -0
  90. package/src/widgets/actions/change-column/change-column.tsx +141 -0
  91. package/src/widgets/actions/change-column/sortable-column-item.tsx +49 -0
  92. package/src/widgets/actions/change-column/types.ts +20 -0
  93. package/src/widgets/actions/download/download.test.tsx +322 -0
  94. package/src/widgets/actions/download/download.tsx +118 -0
  95. package/src/widgets/actions/download/exports.test.tsx +275 -0
  96. package/src/widgets/actions/download/exports.tsx +103 -0
  97. package/src/widgets/actions/download/types.ts +21 -0
  98. package/src/widgets/actions/fullscreen/fullscreen.test.tsx +269 -0
  99. package/src/widgets/actions/fullscreen/fullscreen.tsx +82 -0
  100. package/src/widgets/actions/fullscreen/styles.ts +17 -0
  101. package/src/widgets/actions/fullscreen/types.ts +27 -0
  102. package/src/widgets/actions/index.ts +51 -0
  103. package/src/widgets/actions/lock-selection/lock-selection.test.tsx +186 -0
  104. package/src/widgets/actions/lock-selection/lock-selection.tsx +133 -0
  105. package/src/widgets/actions/lock-selection/types.ts +41 -0
  106. package/src/widgets/actions/relative-data/relative-data.test.tsx +267 -0
  107. package/src/widgets/actions/relative-data/relative-data.tsx +133 -0
  108. package/src/widgets/actions/relative-data/style.ts +9 -0
  109. package/src/widgets/actions/relative-data/types.ts +31 -0
  110. package/src/widgets/actions/relative-data/utils.test.ts +223 -0
  111. package/src/widgets/actions/relative-data/utils.ts +58 -0
  112. package/src/widgets/actions/searcher/searcher-toggle.test.tsx +354 -0
  113. package/src/widgets/actions/searcher/searcher-toggle.tsx +73 -0
  114. package/src/widgets/actions/searcher/searcher.tsx +205 -0
  115. package/src/widgets/actions/searcher/types.ts +72 -0
  116. package/src/widgets/actions/shared/styles.ts +12 -0
  117. package/src/widgets/actions/stack-toggle/grouped-bar-chart-icon.tsx +14 -0
  118. package/src/widgets/actions/stack-toggle/stack-toggle.test.tsx +270 -0
  119. package/src/widgets/actions/stack-toggle/stack-toggle.tsx +146 -0
  120. package/src/widgets/actions/stack-toggle/types.ts +29 -0
  121. package/src/widgets/actions/zoom-toggle/index.ts +2 -0
  122. package/src/widgets/actions/zoom-toggle/style.ts +14 -0
  123. package/src/widgets/actions/zoom-toggle/types.ts +44 -0
  124. package/src/widgets/actions/zoom-toggle/zoom-toggle.tsx +186 -0
  125. package/src/widgets/bar/config.ts +122 -0
  126. package/src/widgets/bar/index.ts +9 -0
  127. package/src/widgets/bar/skeleton.tsx +60 -0
  128. package/src/widgets/bar/style.ts +33 -0
  129. package/src/widgets/bar/types.ts +16 -0
  130. package/src/widgets/category/category-ui.test.tsx +399 -0
  131. package/src/widgets/category/category-ui.tsx +156 -0
  132. package/src/widgets/category/components/category-bar.tsx +28 -0
  133. package/src/widgets/category/components/category-legend.tsx +30 -0
  134. package/src/widgets/category/components/category-row-multi.tsx +50 -0
  135. package/src/widgets/category/components/category-row-other.tsx +23 -0
  136. package/src/widgets/category/components/category-row-single.tsx +47 -0
  137. package/src/widgets/category/components/index.ts +14 -0
  138. package/src/widgets/category/config.ts +85 -0
  139. package/src/widgets/category/index.ts +30 -0
  140. package/src/widgets/category/skeleton.tsx +24 -0
  141. package/src/widgets/category/style.ts +133 -0
  142. package/src/widgets/category/types.ts +40 -0
  143. package/src/widgets/echart/const.ts +1 -0
  144. package/src/widgets/echart/echart-ui.test.tsx +537 -0
  145. package/src/widgets/echart/echart-ui.tsx +92 -0
  146. package/src/widgets/echart/echart.test.tsx +562 -0
  147. package/src/widgets/echart/echart.tsx +68 -0
  148. package/src/widgets/echart/index.ts +16 -0
  149. package/src/widgets/echart/options.ts +53 -0
  150. package/src/widgets/echart/types.ts +45 -0
  151. package/src/widgets/echart/utils.ts +169 -0
  152. package/src/widgets/error/error.test.tsx +331 -0
  153. package/src/widgets/error/error.tsx +40 -0
  154. package/src/widgets/error/index.ts +2 -0
  155. package/src/widgets/error/types.ts +14 -0
  156. package/src/widgets/formula/components/item.test.tsx +249 -0
  157. package/src/widgets/formula/components/item.tsx +18 -0
  158. package/src/widgets/formula/components/prefix.test.tsx +341 -0
  159. package/src/widgets/formula/components/prefix.tsx +18 -0
  160. package/src/widgets/formula/components/row.test.tsx +364 -0
  161. package/src/widgets/formula/components/row.tsx +21 -0
  162. package/src/widgets/formula/components/series.tsx +34 -0
  163. package/src/widgets/formula/components/suffix.test.tsx +383 -0
  164. package/src/widgets/formula/components/suffix.tsx +28 -0
  165. package/src/widgets/formula/components/value.test.tsx +329 -0
  166. package/src/widgets/formula/components/value.tsx +29 -0
  167. package/src/widgets/formula/config.ts +27 -0
  168. package/src/widgets/formula/formula-ui.test.tsx +399 -0
  169. package/src/widgets/formula/formula-ui.tsx +27 -0
  170. package/src/widgets/formula/index.ts +24 -0
  171. package/src/widgets/formula/serializer.test.tsx +144 -0
  172. package/src/widgets/formula/serializer.ts +28 -0
  173. package/src/widgets/formula/skeleton.tsx +10 -0
  174. package/src/widgets/formula/style.ts +23 -0
  175. package/src/widgets/formula/types.ts +50 -0
  176. package/src/widgets/histogram/config.ts +143 -0
  177. package/src/widgets/histogram/index.ts +8 -0
  178. package/src/widgets/histogram/skeleton.tsx +52 -0
  179. package/src/widgets/histogram/style.ts +8 -0
  180. package/src/widgets/histogram/types.ts +17 -0
  181. package/src/widgets/index.ts +25 -0
  182. package/src/widgets/loader/index.ts +4 -0
  183. package/src/widgets/loader/loader.tsx +70 -0
  184. package/src/widgets/loader/types.ts +11 -0
  185. package/src/widgets/loader/utils.test.ts +112 -0
  186. package/src/widgets/loader/utils.ts +35 -0
  187. package/src/widgets/markdown/config.ts +18 -0
  188. package/src/widgets/markdown/index.ts +14 -0
  189. package/src/widgets/markdown/markdown-ui.test.tsx +341 -0
  190. package/src/widgets/markdown/markdown-ui.tsx +52 -0
  191. package/src/widgets/markdown/markdown.tsx +20 -0
  192. package/src/widgets/markdown/skeleton.tsx +12 -0
  193. package/src/widgets/markdown/style.ts +28 -0
  194. package/src/widgets/markdown/types.ts +28 -0
  195. package/src/widgets/no-data/index.ts +2 -0
  196. package/src/widgets/no-data/no-data.test.tsx +447 -0
  197. package/src/widgets/no-data/no-data.tsx +116 -0
  198. package/src/widgets/no-data/style.ts +18 -0
  199. package/src/widgets/no-data/types.ts +72 -0
  200. package/src/widgets/note/index.ts +2 -0
  201. package/src/widgets/note/note.test.tsx +391 -0
  202. package/src/widgets/note/note.tsx +114 -0
  203. package/src/widgets/note/style.ts +29 -0
  204. package/src/widgets/note/types.ts +9 -0
  205. package/src/widgets/pie/config.ts +177 -0
  206. package/src/widgets/pie/index.ts +8 -0
  207. package/src/widgets/pie/skeleton.tsx +70 -0
  208. package/src/widgets/pie/style.ts +8 -0
  209. package/src/widgets/pie/types.ts +16 -0
  210. package/src/widgets/range/components/range-item.tsx +213 -0
  211. package/src/widgets/range/config.ts +10 -0
  212. package/src/widgets/range/index.ts +16 -0
  213. package/src/widgets/range/range-ui.test.tsx +203 -0
  214. package/src/widgets/range/range-ui.tsx +11 -0
  215. package/src/widgets/range/serializer.test.ts +70 -0
  216. package/src/widgets/range/serializer.ts +27 -0
  217. package/src/widgets/range/skeleton.tsx +14 -0
  218. package/src/widgets/range/style.ts +37 -0
  219. package/src/widgets/range/types.ts +39 -0
  220. package/src/widgets/scatterplot/config.ts +138 -0
  221. package/src/widgets/scatterplot/index.ts +8 -0
  222. package/src/widgets/scatterplot/skeleton.tsx +59 -0
  223. package/src/widgets/scatterplot/style.ts +21 -0
  224. package/src/widgets/scatterplot/types.ts +17 -0
  225. package/src/widgets/selection-summary/index.ts +6 -0
  226. package/src/widgets/selection-summary/selection-summary.tsx +46 -0
  227. package/src/widgets/selection-summary/style.ts +10 -0
  228. package/src/widgets/selection-summary/types.ts +14 -0
  229. package/src/widgets/skeleton-loader/index.ts +2 -0
  230. package/src/widgets/skeleton-loader/skeleton-loader.test.tsx +139 -0
  231. package/src/widgets/skeleton-loader/skeleton-loader.tsx +28 -0
  232. package/src/widgets/skeleton-loader/types.ts +8 -0
  233. package/src/widgets/spread/components/max-value.tsx +29 -0
  234. package/src/widgets/spread/components/min-value.tsx +29 -0
  235. package/src/widgets/spread/components/separator.tsx +6 -0
  236. package/src/widgets/spread/config.ts +34 -0
  237. package/src/widgets/spread/index.ts +23 -0
  238. package/src/widgets/spread/skeleton.tsx +10 -0
  239. package/src/widgets/spread/spread-ui.test.tsx +368 -0
  240. package/src/widgets/spread/spread-ui.tsx +29 -0
  241. package/src/widgets/spread/style.ts +22 -0
  242. package/src/widgets/spread/types.ts +47 -0
  243. package/src/widgets/stores/index.ts +9 -0
  244. package/src/widgets/stores/types.ts +192 -0
  245. package/src/widgets/stores/widget-store.test.ts +601 -0
  246. package/src/widgets/stores/widget-store.ts +239 -0
  247. package/src/widgets/subheader/index.ts +3 -0
  248. package/src/widgets/subheader/style.ts +20 -0
  249. package/src/widgets/subheader/subheader.test.tsx +45 -0
  250. package/src/widgets/subheader/subheader.tsx +16 -0
  251. package/src/widgets/subheader/types.ts +11 -0
  252. package/src/widgets/table/components/cell-header.tsx +58 -0
  253. package/src/widgets/table/components/cell.tsx +80 -0
  254. package/src/widgets/table/components/index.ts +4 -0
  255. package/src/widgets/table/components/pagination-actions.tsx +67 -0
  256. package/src/widgets/table/components/pagination.tsx +41 -0
  257. package/src/widgets/table/components/row.tsx +60 -0
  258. package/src/widgets/table/config.ts +71 -0
  259. package/src/widgets/table/helpers.test.ts +244 -0
  260. package/src/widgets/table/helpers.ts +107 -0
  261. package/src/widgets/table/hooks/index.ts +7 -0
  262. package/src/widgets/table/hooks/use-pagination.test.ts +294 -0
  263. package/src/widgets/table/hooks/use-pagination.ts +155 -0
  264. package/src/widgets/table/hooks/use-selection.test.ts +504 -0
  265. package/src/widgets/table/hooks/use-selection.ts +189 -0
  266. package/src/widgets/table/hooks/use-sort.test.ts +296 -0
  267. package/src/widgets/table/hooks/use-sort.ts +138 -0
  268. package/src/widgets/table/index.ts +53 -0
  269. package/src/widgets/table/serializer.ts +54 -0
  270. package/src/widgets/table/skeleton.tsx +48 -0
  271. package/src/widgets/table/style.ts +34 -0
  272. package/src/widgets/table/table-ui.tsx +64 -0
  273. package/src/widgets/table/types.ts +223 -0
  274. package/src/widgets/timeseries/config.ts +135 -0
  275. package/src/widgets/timeseries/index.ts +8 -0
  276. package/src/widgets/timeseries/skeleton.tsx +55 -0
  277. package/src/widgets/timeseries/style.ts +36 -0
  278. package/src/widgets/timeseries/types.ts +17 -0
  279. package/src/widgets/toolbar-actions/index.ts +6 -0
  280. package/src/widgets/toolbar-actions/styles.ts +38 -0
  281. package/src/widgets/toolbar-actions/toolbar-actions.test.tsx +691 -0
  282. package/src/widgets/toolbar-actions/toolbar-actions.tsx +145 -0
  283. package/src/widgets/toolbar-actions/types.ts +60 -0
  284. package/src/widgets/wrapper/components/actions.test.tsx +101 -0
  285. package/src/widgets/wrapper/components/actions.tsx +30 -0
  286. package/src/widgets/wrapper/components/options.test.tsx +323 -0
  287. package/src/widgets/wrapper/components/options.tsx +73 -0
  288. package/src/widgets/wrapper/components/title.test.tsx +126 -0
  289. package/src/widgets/wrapper/components/title.tsx +32 -0
  290. package/src/widgets/wrapper/index.ts +16 -0
  291. package/src/widgets/wrapper/styles.ts +98 -0
  292. package/src/widgets/wrapper/types.ts +55 -0
  293. package/src/widgets/wrapper/wrapper-ui.test.tsx +232 -0
  294. package/src/widgets/wrapper/wrapper-ui.tsx +57 -0
  295. package/src/widgets/wrapper/wrapper.test.tsx +365 -0
  296. package/src/widgets/wrapper/wrapper.tsx +50 -0
  297. package/dist/lasso-tool-BwRzEW7k.js.map +0 -1
  298. package/dist/types/common/common.d.ts +0 -3
  299. package/dist/types/common/index.d.ts +0 -26
  300. package/dist/types/common/lasso-tools.d.ts +0 -36
  301. package/dist/types/common/measurement-tools.d.ts +0 -65
@@ -0,0 +1,223 @@
1
+ import type { ReactNode, Ref } from 'react'
2
+ import type { TableProps as MuiTableProps } from '@mui/material'
3
+ import type { BaseWidgetState, WidgetsStoreProps } from '../stores/types'
4
+ import type { WrapperState } from '../wrapper/types'
5
+ import type { DownloadItem } from '../actions/download/types'
6
+
7
+ /**
8
+ * Table UI component props
9
+ */
10
+ export interface TableUIProps {
11
+ id: WidgetsStoreProps['id']
12
+ children?: ReactNode
13
+ }
14
+
15
+ /**
16
+ * Table column definition
17
+ */
18
+ export interface TableColumn {
19
+ /** Unique column identifier, matches key in row data */
20
+ id: string
21
+ /** Column header label */
22
+ label: string | ReactNode
23
+ /** Text alignment */
24
+ align?: 'left' | 'center' | 'right'
25
+ /** Column width (number for px, string for CSS value) */
26
+ width?: number | string
27
+ /** Enable sorting for this column */
28
+ sortable?: boolean
29
+ /** Custom cell value formatter */
30
+ formatter?: (value: unknown) => ReactNode
31
+ }
32
+
33
+ /**
34
+ * Table row data - extends Record for flexible data
35
+ */
36
+ export interface TableRow extends Record<string, unknown> {
37
+ /** Unique row identifier */
38
+ id: string | number
39
+ }
40
+
41
+ /**
42
+ * Table widget data type - array of row records
43
+ */
44
+ export type TableWidgetData = TableRow[]
45
+
46
+ /**
47
+ * Pagination state
48
+ */
49
+ export interface TablePaginationState {
50
+ /** Current page (0-indexed) */
51
+ page: number
52
+ /** Rows per page */
53
+ rowsPerPage: number
54
+ /** Total number of rows (for remote pagination) */
55
+ total: number
56
+ }
57
+
58
+ /**
59
+ * Sort direction
60
+ */
61
+ export type SortDirection = 'asc' | 'desc'
62
+
63
+ /**
64
+ * Sort state for single-column sorting
65
+ */
66
+ export interface SortState {
67
+ /** Column ID being sorted */
68
+ columnId: string | null
69
+ /** Sort direction */
70
+ direction: SortDirection
71
+ }
72
+
73
+ /**
74
+ * Pagination and sort mode
75
+ */
76
+ export type Mode = 'local' | 'remote'
77
+
78
+ /**
79
+ * Table widget configuration
80
+ */
81
+ export interface TableWidgetConfig {
82
+ /** Column definitions */
83
+ columns?: TableColumn[]
84
+ /** Enable row selection with checkboxes */
85
+ selectable?: boolean
86
+ /** Currently selected row IDs */
87
+ selected: (string | number)[]
88
+ /** Pagination and sort mode: local (client-side) or remote (server-side) */
89
+ mode: Mode
90
+ /** Pagination configuration */
91
+ pagination?: {
92
+ /** Current page (0-indexed) */
93
+ page?: number
94
+ /** Available rows per page options */
95
+ rowsPerPageOptions?: number[]
96
+ /** Default rows per page */
97
+ rowsPerPage?: number
98
+ /** Total rows for remote pagination */
99
+ total?: number
100
+ }
101
+ /** Sort configuration */
102
+ sort?: {
103
+ /** Default sort column */
104
+ columnId: string | null
105
+ /** Default sort direction */
106
+ direction?: SortDirection
107
+ }
108
+ /** Callback when a row is clicked */
109
+ onRowClick?: (row: TableRow) => void
110
+ /** Callback when hovering over a row (null when leaving table) */
111
+ onRowHover?: (row: TableRow | null) => void
112
+ /** Callback when selection changes */
113
+ onSelectionChange?: (selected: (string | number)[]) => void
114
+ /** Callback when page changes (for remote pagination) */
115
+ onPageChange?: (page: number, rowsPerPage: number) => void
116
+ /** Callback when sort changes (for remote sorting) */
117
+ onSortChange?: (columnId: string, direction: SortDirection) => void
118
+ }
119
+
120
+ /**
121
+ * Table widget state - includes both configuration and runtime state
122
+ */
123
+ export type TableWidgetState = BaseWidgetState<
124
+ WrapperState<
125
+ TableWidgetConfig & {
126
+ // pagination?: {
127
+ // page?: number
128
+ // }
129
+ }
130
+ > & {
131
+ data: TableWidgetData
132
+ }
133
+ >
134
+
135
+ /**
136
+ * Table download configuration
137
+ */
138
+ export type TableDownloadConfig = DownloadItem<TableWidgetData>[]
139
+
140
+ /**
141
+ * Props for the base Table component
142
+ */
143
+ export interface TableProps extends MuiTableProps {
144
+ /** Table element ref */
145
+ ref?: Ref<HTMLTableElement>
146
+ }
147
+
148
+ /**
149
+ * Props for CellHeader component
150
+ */
151
+ export interface CellHeaderProps {
152
+ /** Column definition */
153
+ column: TableColumn
154
+ /** Current sort state */
155
+ sortState?: SortState
156
+ /** Callback when sort is triggered */
157
+ onSort?: (columnId: string) => void
158
+ /** Whether this is a select-all checkbox header */
159
+ isSelectAll?: boolean
160
+ /** Whether all rows are selected */
161
+ isAllSelected?: boolean
162
+ /** Whether some rows are selected (indeterminate state) */
163
+ isIndeterminate?: boolean
164
+ /** Callback for select-all toggle */
165
+ onSelectAll?: () => void
166
+ }
167
+
168
+ /**
169
+ * Props for Row component
170
+ */
171
+ export interface RowProps {
172
+ /** Row data */
173
+ row: TableRow
174
+ /** Column definitions */
175
+ columns: TableColumn[]
176
+ /** Whether row is selected */
177
+ isSelected?: boolean
178
+ /** Whether selection is enabled */
179
+ selectable?: boolean
180
+ /** Callback when row is clicked */
181
+ onClick?: (row: TableRow) => void
182
+ /** Callback when row selection is toggled */
183
+ onSelect?: (row: TableRow) => void
184
+ /** Callback when mouse enters row */
185
+ onMouseEnter?: (row: TableRow) => void
186
+ /** Callback when mouse leaves row */
187
+ onMouseLeave?: () => void
188
+ }
189
+
190
+ /**
191
+ * Props for Pagination component
192
+ */
193
+ export interface PaginationProps {
194
+ /** Current page (0-indexed) */
195
+ page: number
196
+ /** Rows per page */
197
+ rowsPerPage: number
198
+ /** Total row count */
199
+ total: number
200
+ /** Available rows per page options */
201
+ rowsPerPageOptions?: number[]
202
+ /** Callback when page changes */
203
+ onPageChange: (page: number) => void
204
+ /** Callback when rows per page changes */
205
+ onRowsPerPageChange: (rowsPerPage: number) => void
206
+ }
207
+
208
+ /**
209
+ * Props for PaginationActions component
210
+ */
211
+ export interface PaginationActionsProps {
212
+ /** Current page (0-indexed) */
213
+ page: number
214
+ /** Total row count */
215
+ count: number
216
+ /** Rows per page */
217
+ rowsPerPage: number
218
+ /** Callback when page changes */
219
+ onPageChange: (
220
+ event: React.MouseEvent<HTMLButtonElement> | null,
221
+ newPage: number,
222
+ ) => void
223
+ }
@@ -0,0 +1,135 @@
1
+ import {
2
+ getCommonOptions,
3
+ mergeEchartWidgetConfig,
4
+ type EchartOptionsProps,
5
+ } from '../echart'
6
+ import type {
7
+ TimeseriesConfig,
8
+ TimeseriesWidgetConfig,
9
+ TimeseriesWidgetData,
10
+ } from './types'
11
+ import {
12
+ flattenObjectArrayToCSV,
13
+ buildLegendConfig,
14
+ buildGridConfig,
15
+ createTooltipFormatter,
16
+ applyYAxisFormatter,
17
+ } from '../_shared/chart-config'
18
+ import { downloadToCSV, downloadToPNG, type DownloadItem } from '../actions'
19
+ import type { ConfigProps } from '../loader/types'
20
+
21
+ export function timeseriesDownloadConfig({
22
+ refUI,
23
+ }: ConfigProps): DownloadItem<TimeseriesWidgetData>[] {
24
+ return [
25
+ {
26
+ ...downloadToPNG,
27
+ modifier: () => downloadToPNG.modifier(refUI),
28
+ },
29
+ {
30
+ ...downloadToCSV,
31
+ modifier: async (data) => {
32
+ const rows = flattenObjectArrayToCSV(data)
33
+ return downloadToCSV.modifier(rows)
34
+ },
35
+ },
36
+ ]
37
+ }
38
+
39
+ export function timeseriesConfig(
40
+ props: TimeseriesConfig,
41
+ ): TimeseriesWidgetConfig {
42
+ return {
43
+ type: 'timeseries',
44
+ option: mergeEchartWidgetConfig(getCommonOptions(props), getOption(props)),
45
+ }
46
+ }
47
+
48
+ function getOption({
49
+ data = [],
50
+ theme,
51
+ formatter,
52
+ }: TimeseriesConfig): EchartOptionsProps {
53
+ const hasLegend = (data?.length ?? 0) > 1
54
+
55
+ const yAxis = {
56
+ type: 'value' as const,
57
+ axisLabel: {
58
+ margin: 0,
59
+ padding: [
60
+ 0,
61
+ parseInt(theme.spacing(0.75)),
62
+ parseInt(theme.spacing(1.25)),
63
+ -parseInt(theme.spacing(1)),
64
+ ],
65
+ show: true,
66
+ showMaxLabel: true,
67
+ showMinLabel: false,
68
+ verticalAlign: 'bottom' as const,
69
+ },
70
+ axisLine: {
71
+ show: false,
72
+ },
73
+ axisTick: {
74
+ show: false,
75
+ },
76
+ splitLine: {
77
+ show: true,
78
+ lineStyle: {
79
+ color: theme.palette.black[4],
80
+ },
81
+ },
82
+ }
83
+
84
+ return {
85
+ legend: buildLegendConfig(hasLegend),
86
+ grid: {
87
+ ...buildGridConfig(hasLegend, theme),
88
+ outerBounds: {
89
+ left: parseInt(theme.spacing(3)),
90
+ right: parseInt(theme.spacing(1)),
91
+ top: parseInt(theme.spacing(2)),
92
+ },
93
+ },
94
+ xAxis: {
95
+ type: 'category',
96
+ axisTick: {
97
+ alignWithLabel: true,
98
+ },
99
+ axisLabel: {
100
+ show: true,
101
+ showMaxLabel: true,
102
+ showMinLabel: true,
103
+ rotate: 45,
104
+ },
105
+ },
106
+ yAxis: applyYAxisFormatter(yAxis, formatter),
107
+ tooltip: {
108
+ formatter: createTooltipFormatter((item) => {
109
+ const value = item.value as Record<string, string | number>
110
+ const index = item.dimensionNames?.[item.encode?.y?.at(0) ?? 1]
111
+ const _value = value[index ?? '']
112
+
113
+ const formattedValue =
114
+ typeof _value === 'number' && formatter
115
+ ? formatter(_value)
116
+ : (_value ?? '')
117
+
118
+ const marker = typeof item.marker === 'string' ? item.marker : ''
119
+ const seriesName = item.seriesName ? `${item.seriesName}: ` : ''
120
+ const name = item.name ?? ''
121
+
122
+ return { name, seriesName, marker, value: formattedValue }
123
+ }),
124
+ },
125
+ color: Object.values(theme.palette.qualitative.bold),
126
+ series: data.map((_: unknown, index: number) => ({
127
+ datasetIndex: index,
128
+ type: 'line',
129
+ smooth: true,
130
+ emphasis: {
131
+ focus: 'series',
132
+ },
133
+ })),
134
+ } as EchartOptionsProps
135
+ }
@@ -0,0 +1,8 @@
1
+ export type {
2
+ TimeseriesWidgetData,
3
+ TimeseriesWidgetState,
4
+ TimeseriesWidgetConfig,
5
+ TimeseriesConfig,
6
+ } from './types'
7
+ export { timeseriesConfig, timeseriesDownloadConfig } from './config'
8
+ export { TimeseriesSkeleton } from './skeleton'
@@ -0,0 +1,55 @@
1
+ import { Box, Skeleton } from '@mui/material'
2
+ import { styles } from './style'
3
+
4
+ export function TimeseriesSkeleton() {
5
+ return (
6
+ <Box sx={styles.skeleton.graph.container}>
7
+ {/* Timeseries bar */}
8
+ <Box sx={styles.skeleton.graph.grid}>
9
+ <Skeleton
10
+ sx={styles.skeleton.histogram.item}
11
+ variant='rectangular'
12
+ height='20%'
13
+ />
14
+ <Skeleton
15
+ sx={styles.skeleton.histogram.item}
16
+ variant='rectangular'
17
+ height='40%'
18
+ />
19
+ <Skeleton
20
+ sx={styles.skeleton.histogram.item}
21
+ variant='rectangular'
22
+ height='60%'
23
+ />
24
+ <Skeleton
25
+ sx={styles.skeleton.histogram.item}
26
+ variant='rectangular'
27
+ height='20%'
28
+ />
29
+ <Skeleton
30
+ sx={styles.skeleton.histogram.item}
31
+ variant='rectangular'
32
+ height='80%'
33
+ />
34
+ </Box>
35
+ {/* Legend */}
36
+ <Box sx={styles.skeleton.legend}>
37
+ {Array(2)
38
+ .fill(0)
39
+ .map((_, i) => (
40
+ <Box
41
+ key={i}
42
+ sx={{
43
+ display: 'flex',
44
+ alignItems: 'center',
45
+ gap: ({ spacing }) => spacing(1.5),
46
+ }}
47
+ >
48
+ <Skeleton variant='circular' width={8} height={8} />
49
+ <Skeleton width={48} height={8} />
50
+ </Box>
51
+ ))}
52
+ </Box>
53
+ </Box>
54
+ )
55
+ }
@@ -0,0 +1,36 @@
1
+ import type { SxProps, Theme } from '@mui/material'
2
+ import { baseSkeletonStyles } from '../_shared/skeleton'
3
+
4
+ export const styles = {
5
+ skeleton: {
6
+ graph: {
7
+ container: {
8
+ ...baseSkeletonStyles.graph.container,
9
+ position: 'relative',
10
+ },
11
+ grid: {
12
+ display: 'flex',
13
+ justifyContent: 'space-between',
14
+ flex: '1 1 auto',
15
+ alignItems: 'flex-end',
16
+ width: '100%',
17
+ },
18
+ },
19
+ histogram: {
20
+ item: {
21
+ flex: 1,
22
+ maxWidth: ({ spacing }) => spacing(8),
23
+
24
+ '& + &': {
25
+ marginLeft: '1px',
26
+ },
27
+ },
28
+ },
29
+ legend: {
30
+ display: 'flex',
31
+ alignItems: 'center',
32
+ gap: ({ spacing }) => spacing(2),
33
+ height: ({ spacing }) => spacing(5),
34
+ },
35
+ },
36
+ } satisfies Record<string, SxProps<Theme>>
@@ -0,0 +1,17 @@
1
+ import type { EchartWidgetData, EchartWidgetState } from '../echart'
2
+ import type {
3
+ EchartWidgetOptionProps,
4
+ EchartWidgetProps,
5
+ } from '../echart/types'
6
+ import type { ConfigProps } from '../loader'
7
+
8
+ export type TimeseriesWidgetData = EchartWidgetData
9
+
10
+ export type TimeseriesWidgetState = EchartWidgetState
11
+
12
+ export type TimeseriesWidgetConfig = EchartWidgetProps & {
13
+ type: 'timeseries'
14
+ }
15
+
16
+ export type TimeseriesConfig = ConfigProps &
17
+ EchartWidgetOptionProps<TimeseriesWidgetData>
@@ -0,0 +1,6 @@
1
+ export type {
2
+ ToolbarAction,
3
+ ToolbarActionsLabels,
4
+ ToolbarActionsProps,
5
+ } from './types'
6
+ export { ToolbarActions } from './toolbar-actions'
@@ -0,0 +1,38 @@
1
+ import type { SxProps, Theme } from '@mui/material'
2
+
3
+ export const styles = {
4
+ root: {
5
+ display: 'flex',
6
+ alignItems: 'center',
7
+ width: 'fit-content',
8
+ overflow: 'hidden',
9
+ borderRadius: ({ spacing }) => spacing(0.5),
10
+ gap: ({ spacing }) => spacing(0.25),
11
+ },
12
+ preview: {
13
+ display: 'flex',
14
+ alignItems: 'center',
15
+ gap: ({ spacing }) => spacing(0.25),
16
+ },
17
+ actionsContainer: {
18
+ position: 'absolute',
19
+ display: 'flex',
20
+ alignItems: 'center',
21
+ backgroundColor: ({ palette }) => palette.background.default,
22
+ padding: ({ spacing }) => spacing(0.25),
23
+ gap: ({ spacing }) => spacing(0.25),
24
+ },
25
+ iconButton: {
26
+ width: ({ spacing }) => spacing(4),
27
+ height: ({ spacing }) => spacing(4),
28
+ borderRadius: 0,
29
+ '.MuiTouchRipple-ripple .MuiTouchRipple-child': {
30
+ borderRadius: 0,
31
+ },
32
+ },
33
+ triggerButton: {
34
+ '&[data-active="true"]': {
35
+ backgroundColor: ({ palette }) => palette.primary.relatedLight,
36
+ },
37
+ },
38
+ } satisfies Record<string, SxProps<Theme>>