@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.
- package/dist/components.js +3 -3
- package/dist/components.js.map +1 -1
- package/dist/{lasso-tool-BwRzEW7k.js → lasso-tool-wFqOD6wk.js} +13 -13
- package/dist/lasso-tool-wFqOD6wk.js.map +1 -0
- package/dist/types/components/common-types.d.ts +41 -0
- package/dist/types/components/types.d.ts +1 -1
- package/dist/types/widgets/echart/echart-ui.d.ts +1 -1
- package/dist/types/widgets/echart/types.d.ts +4 -0
- package/dist/widgets/actions.js +1 -1
- package/dist/widgets/bar.js +1 -1
- package/dist/widgets/category.js +1 -1
- package/dist/widgets/echart.js +96 -85
- package/dist/widgets/echart.js.map +1 -1
- package/dist/widgets/formula.js +1 -1
- package/dist/widgets/histogram.js +1 -1
- package/dist/widgets/markdown.js +1 -1
- package/dist/widgets/pie.js +1 -1
- package/dist/widgets/scatterplot.js +1 -1
- package/dist/widgets/spread.js +1 -1
- package/dist/widgets/table.js +1 -1
- package/dist/widgets/timeseries.js +1 -1
- package/dist/widgets/toolbar-actions.js.map +1 -1
- package/dist/widgets/wrapper.js +1 -1
- package/package.json +8 -3
- package/src/components/basemaps/basemaps.test.tsx +196 -0
- package/src/components/basemaps/basemaps.tsx +128 -0
- package/src/components/basemaps/const.ts +13 -0
- package/src/components/basemaps/group-wrapper.test.tsx +38 -0
- package/src/components/basemaps/group-wrapper.tsx +28 -0
- package/src/components/basemaps/group.test.tsx +52 -0
- package/src/components/basemaps/group.tsx +42 -0
- package/src/components/basemaps/header.test.tsx +54 -0
- package/src/components/basemaps/header.tsx +36 -0
- package/src/components/basemaps/styles.ts +76 -0
- package/src/components/basemaps/types.ts +30 -0
- package/src/components/common-types.ts +1 -0
- package/src/components/geolocation-controls/const.ts +6 -0
- package/src/components/geolocation-controls/geolocation-controls.test.tsx +133 -0
- package/src/components/geolocation-controls/geolocation-controls.tsx +95 -0
- package/src/components/geolocation-controls/types.ts +17 -0
- package/src/components/index.ts +64 -0
- package/src/components/lasso-tool/chip.tsx +37 -0
- package/src/components/lasso-tool/const.tsx +70 -0
- package/src/components/lasso-tool/icons.tsx +91 -0
- package/src/components/lasso-tool/lasso-tool-inline.test.tsx +168 -0
- package/src/components/lasso-tool/lasso-tool-inline.tsx +245 -0
- package/src/components/lasso-tool/lasso-tool.test.tsx +212 -0
- package/src/components/lasso-tool/lasso-tool.tsx +479 -0
- package/src/components/lasso-tool/styles.ts +143 -0
- package/src/components/lasso-tool/types.ts +114 -0
- package/src/components/list-data/list-data-skeleton.test.tsx +10 -0
- package/src/components/list-data/list-data-skeleton.tsx +40 -0
- package/src/components/list-data/list-data.test.tsx +94 -0
- package/src/components/list-data/list-data.tsx +106 -0
- package/src/components/list-data/styles.ts +37 -0
- package/src/components/list-data/types.ts +25 -0
- package/src/components/measurement-tools/const.tsx +108 -0
- package/src/components/measurement-tools/icons.tsx +54 -0
- package/src/components/measurement-tools/measurement-tools.test.tsx +165 -0
- package/src/components/measurement-tools/measurement-tools.tsx +443 -0
- package/src/components/measurement-tools/styles.ts +91 -0
- package/src/components/measurement-tools/types.ts +77 -0
- package/src/components/no-data-alert/no-data-alert.test.tsx +31 -0
- package/src/components/no-data-alert/no-data-alert.tsx +59 -0
- package/src/components/responsive-drawer/responsive-drawer.test.tsx +91 -0
- package/src/components/responsive-drawer/responsive-drawer.tsx +53 -0
- package/src/components/smart-tooltip/smart-tooltip.test.tsx +168 -0
- package/src/components/smart-tooltip/smart-tooltip.tsx +40 -0
- package/src/components/tooltip/tooltip.test.tsx +86 -0
- package/src/components/tooltip/tooltip.tsx +30 -0
- package/src/components/types.ts +1 -0
- package/src/components/zoom-controls/styles.ts +27 -0
- package/src/components/zoom-controls/types.ts +19 -0
- package/src/components/zoom-controls/zoom-controls.test.tsx +101 -0
- package/src/components/zoom-controls/zoom-controls.tsx +114 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/use-debounce.ts +55 -0
- package/src/hooks/use-skeleton.test.tsx +32 -0
- package/src/hooks/use-skeleton.ts +19 -0
- package/src/hooks/use-widget-ref.ts +33 -0
- package/src/widgets/README.md +277 -0
- package/src/widgets/_shared/chart-config/config-factory.ts +67 -0
- package/src/widgets/_shared/chart-config/csv-modifiers.ts +56 -0
- package/src/widgets/_shared/chart-config/index.ts +21 -0
- package/src/widgets/_shared/chart-config/option-builders.ts +203 -0
- package/src/widgets/_shared/skeleton/index.ts +5 -0
- package/src/widgets/_shared/skeleton/styles.ts +20 -0
- package/src/widgets/actions/change-column/change-column-icon.tsx +10 -0
- package/src/widgets/actions/change-column/change-column.test.tsx +163 -0
- package/src/widgets/actions/change-column/change-column.tsx +141 -0
- package/src/widgets/actions/change-column/sortable-column-item.tsx +49 -0
- package/src/widgets/actions/change-column/types.ts +20 -0
- package/src/widgets/actions/download/download.test.tsx +322 -0
- package/src/widgets/actions/download/download.tsx +118 -0
- package/src/widgets/actions/download/exports.test.tsx +275 -0
- package/src/widgets/actions/download/exports.tsx +103 -0
- package/src/widgets/actions/download/types.ts +21 -0
- package/src/widgets/actions/fullscreen/fullscreen.test.tsx +269 -0
- package/src/widgets/actions/fullscreen/fullscreen.tsx +82 -0
- package/src/widgets/actions/fullscreen/styles.ts +17 -0
- package/src/widgets/actions/fullscreen/types.ts +27 -0
- package/src/widgets/actions/index.ts +51 -0
- package/src/widgets/actions/lock-selection/lock-selection.test.tsx +186 -0
- package/src/widgets/actions/lock-selection/lock-selection.tsx +133 -0
- package/src/widgets/actions/lock-selection/types.ts +41 -0
- package/src/widgets/actions/relative-data/relative-data.test.tsx +267 -0
- package/src/widgets/actions/relative-data/relative-data.tsx +133 -0
- package/src/widgets/actions/relative-data/style.ts +9 -0
- package/src/widgets/actions/relative-data/types.ts +31 -0
- package/src/widgets/actions/relative-data/utils.test.ts +223 -0
- package/src/widgets/actions/relative-data/utils.ts +58 -0
- package/src/widgets/actions/searcher/searcher-toggle.test.tsx +354 -0
- package/src/widgets/actions/searcher/searcher-toggle.tsx +73 -0
- package/src/widgets/actions/searcher/searcher.tsx +205 -0
- package/src/widgets/actions/searcher/types.ts +72 -0
- package/src/widgets/actions/shared/styles.ts +12 -0
- package/src/widgets/actions/stack-toggle/grouped-bar-chart-icon.tsx +14 -0
- package/src/widgets/actions/stack-toggle/stack-toggle.test.tsx +270 -0
- package/src/widgets/actions/stack-toggle/stack-toggle.tsx +146 -0
- package/src/widgets/actions/stack-toggle/types.ts +29 -0
- package/src/widgets/actions/zoom-toggle/index.ts +2 -0
- package/src/widgets/actions/zoom-toggle/style.ts +14 -0
- package/src/widgets/actions/zoom-toggle/types.ts +44 -0
- package/src/widgets/actions/zoom-toggle/zoom-toggle.tsx +186 -0
- package/src/widgets/bar/config.ts +122 -0
- package/src/widgets/bar/index.ts +9 -0
- package/src/widgets/bar/skeleton.tsx +60 -0
- package/src/widgets/bar/style.ts +33 -0
- package/src/widgets/bar/types.ts +16 -0
- package/src/widgets/category/category-ui.test.tsx +399 -0
- package/src/widgets/category/category-ui.tsx +156 -0
- package/src/widgets/category/components/category-bar.tsx +28 -0
- package/src/widgets/category/components/category-legend.tsx +30 -0
- package/src/widgets/category/components/category-row-multi.tsx +50 -0
- package/src/widgets/category/components/category-row-other.tsx +23 -0
- package/src/widgets/category/components/category-row-single.tsx +47 -0
- package/src/widgets/category/components/index.ts +14 -0
- package/src/widgets/category/config.ts +85 -0
- package/src/widgets/category/index.ts +30 -0
- package/src/widgets/category/skeleton.tsx +24 -0
- package/src/widgets/category/style.ts +133 -0
- package/src/widgets/category/types.ts +40 -0
- package/src/widgets/echart/const.ts +1 -0
- package/src/widgets/echart/echart-ui.test.tsx +537 -0
- package/src/widgets/echart/echart-ui.tsx +92 -0
- package/src/widgets/echart/echart.test.tsx +562 -0
- package/src/widgets/echart/echart.tsx +68 -0
- package/src/widgets/echart/index.ts +16 -0
- package/src/widgets/echart/options.ts +53 -0
- package/src/widgets/echart/types.ts +45 -0
- package/src/widgets/echart/utils.ts +169 -0
- package/src/widgets/error/error.test.tsx +331 -0
- package/src/widgets/error/error.tsx +40 -0
- package/src/widgets/error/index.ts +2 -0
- package/src/widgets/error/types.ts +14 -0
- package/src/widgets/formula/components/item.test.tsx +249 -0
- package/src/widgets/formula/components/item.tsx +18 -0
- package/src/widgets/formula/components/prefix.test.tsx +341 -0
- package/src/widgets/formula/components/prefix.tsx +18 -0
- package/src/widgets/formula/components/row.test.tsx +364 -0
- package/src/widgets/formula/components/row.tsx +21 -0
- package/src/widgets/formula/components/series.tsx +34 -0
- package/src/widgets/formula/components/suffix.test.tsx +383 -0
- package/src/widgets/formula/components/suffix.tsx +28 -0
- package/src/widgets/formula/components/value.test.tsx +329 -0
- package/src/widgets/formula/components/value.tsx +29 -0
- package/src/widgets/formula/config.ts +27 -0
- package/src/widgets/formula/formula-ui.test.tsx +399 -0
- package/src/widgets/formula/formula-ui.tsx +27 -0
- package/src/widgets/formula/index.ts +24 -0
- package/src/widgets/formula/serializer.test.tsx +144 -0
- package/src/widgets/formula/serializer.ts +28 -0
- package/src/widgets/formula/skeleton.tsx +10 -0
- package/src/widgets/formula/style.ts +23 -0
- package/src/widgets/formula/types.ts +50 -0
- package/src/widgets/histogram/config.ts +143 -0
- package/src/widgets/histogram/index.ts +8 -0
- package/src/widgets/histogram/skeleton.tsx +52 -0
- package/src/widgets/histogram/style.ts +8 -0
- package/src/widgets/histogram/types.ts +17 -0
- package/src/widgets/index.ts +25 -0
- package/src/widgets/loader/index.ts +4 -0
- package/src/widgets/loader/loader.tsx +70 -0
- package/src/widgets/loader/types.ts +11 -0
- package/src/widgets/loader/utils.test.ts +112 -0
- package/src/widgets/loader/utils.ts +35 -0
- package/src/widgets/markdown/config.ts +18 -0
- package/src/widgets/markdown/index.ts +14 -0
- package/src/widgets/markdown/markdown-ui.test.tsx +341 -0
- package/src/widgets/markdown/markdown-ui.tsx +52 -0
- package/src/widgets/markdown/markdown.tsx +20 -0
- package/src/widgets/markdown/skeleton.tsx +12 -0
- package/src/widgets/markdown/style.ts +28 -0
- package/src/widgets/markdown/types.ts +28 -0
- package/src/widgets/no-data/index.ts +2 -0
- package/src/widgets/no-data/no-data.test.tsx +447 -0
- package/src/widgets/no-data/no-data.tsx +116 -0
- package/src/widgets/no-data/style.ts +18 -0
- package/src/widgets/no-data/types.ts +72 -0
- package/src/widgets/note/index.ts +2 -0
- package/src/widgets/note/note.test.tsx +391 -0
- package/src/widgets/note/note.tsx +114 -0
- package/src/widgets/note/style.ts +29 -0
- package/src/widgets/note/types.ts +9 -0
- package/src/widgets/pie/config.ts +177 -0
- package/src/widgets/pie/index.ts +8 -0
- package/src/widgets/pie/skeleton.tsx +70 -0
- package/src/widgets/pie/style.ts +8 -0
- package/src/widgets/pie/types.ts +16 -0
- package/src/widgets/range/components/range-item.tsx +213 -0
- package/src/widgets/range/config.ts +10 -0
- package/src/widgets/range/index.ts +16 -0
- package/src/widgets/range/range-ui.test.tsx +203 -0
- package/src/widgets/range/range-ui.tsx +11 -0
- package/src/widgets/range/serializer.test.ts +70 -0
- package/src/widgets/range/serializer.ts +27 -0
- package/src/widgets/range/skeleton.tsx +14 -0
- package/src/widgets/range/style.ts +37 -0
- package/src/widgets/range/types.ts +39 -0
- package/src/widgets/scatterplot/config.ts +138 -0
- package/src/widgets/scatterplot/index.ts +8 -0
- package/src/widgets/scatterplot/skeleton.tsx +59 -0
- package/src/widgets/scatterplot/style.ts +21 -0
- package/src/widgets/scatterplot/types.ts +17 -0
- package/src/widgets/selection-summary/index.ts +6 -0
- package/src/widgets/selection-summary/selection-summary.tsx +46 -0
- package/src/widgets/selection-summary/style.ts +10 -0
- package/src/widgets/selection-summary/types.ts +14 -0
- package/src/widgets/skeleton-loader/index.ts +2 -0
- package/src/widgets/skeleton-loader/skeleton-loader.test.tsx +139 -0
- package/src/widgets/skeleton-loader/skeleton-loader.tsx +28 -0
- package/src/widgets/skeleton-loader/types.ts +8 -0
- package/src/widgets/spread/components/max-value.tsx +29 -0
- package/src/widgets/spread/components/min-value.tsx +29 -0
- package/src/widgets/spread/components/separator.tsx +6 -0
- package/src/widgets/spread/config.ts +34 -0
- package/src/widgets/spread/index.ts +23 -0
- package/src/widgets/spread/skeleton.tsx +10 -0
- package/src/widgets/spread/spread-ui.test.tsx +368 -0
- package/src/widgets/spread/spread-ui.tsx +29 -0
- package/src/widgets/spread/style.ts +22 -0
- package/src/widgets/spread/types.ts +47 -0
- package/src/widgets/stores/index.ts +9 -0
- package/src/widgets/stores/types.ts +192 -0
- package/src/widgets/stores/widget-store.test.ts +601 -0
- package/src/widgets/stores/widget-store.ts +239 -0
- package/src/widgets/subheader/index.ts +3 -0
- package/src/widgets/subheader/style.ts +20 -0
- package/src/widgets/subheader/subheader.test.tsx +45 -0
- package/src/widgets/subheader/subheader.tsx +16 -0
- package/src/widgets/subheader/types.ts +11 -0
- package/src/widgets/table/components/cell-header.tsx +58 -0
- package/src/widgets/table/components/cell.tsx +80 -0
- package/src/widgets/table/components/index.ts +4 -0
- package/src/widgets/table/components/pagination-actions.tsx +67 -0
- package/src/widgets/table/components/pagination.tsx +41 -0
- package/src/widgets/table/components/row.tsx +60 -0
- package/src/widgets/table/config.ts +71 -0
- package/src/widgets/table/helpers.test.ts +244 -0
- package/src/widgets/table/helpers.ts +107 -0
- package/src/widgets/table/hooks/index.ts +7 -0
- package/src/widgets/table/hooks/use-pagination.test.ts +294 -0
- package/src/widgets/table/hooks/use-pagination.ts +155 -0
- package/src/widgets/table/hooks/use-selection.test.ts +504 -0
- package/src/widgets/table/hooks/use-selection.ts +189 -0
- package/src/widgets/table/hooks/use-sort.test.ts +296 -0
- package/src/widgets/table/hooks/use-sort.ts +138 -0
- package/src/widgets/table/index.ts +53 -0
- package/src/widgets/table/serializer.ts +54 -0
- package/src/widgets/table/skeleton.tsx +48 -0
- package/src/widgets/table/style.ts +34 -0
- package/src/widgets/table/table-ui.tsx +64 -0
- package/src/widgets/table/types.ts +223 -0
- package/src/widgets/timeseries/config.ts +135 -0
- package/src/widgets/timeseries/index.ts +8 -0
- package/src/widgets/timeseries/skeleton.tsx +55 -0
- package/src/widgets/timeseries/style.ts +36 -0
- package/src/widgets/timeseries/types.ts +17 -0
- package/src/widgets/toolbar-actions/index.ts +6 -0
- package/src/widgets/toolbar-actions/styles.ts +38 -0
- package/src/widgets/toolbar-actions/toolbar-actions.test.tsx +691 -0
- package/src/widgets/toolbar-actions/toolbar-actions.tsx +145 -0
- package/src/widgets/toolbar-actions/types.ts +60 -0
- package/src/widgets/wrapper/components/actions.test.tsx +101 -0
- package/src/widgets/wrapper/components/actions.tsx +30 -0
- package/src/widgets/wrapper/components/options.test.tsx +323 -0
- package/src/widgets/wrapper/components/options.tsx +73 -0
- package/src/widgets/wrapper/components/title.test.tsx +126 -0
- package/src/widgets/wrapper/components/title.tsx +32 -0
- package/src/widgets/wrapper/index.ts +16 -0
- package/src/widgets/wrapper/styles.ts +98 -0
- package/src/widgets/wrapper/types.ts +55 -0
- package/src/widgets/wrapper/wrapper-ui.test.tsx +232 -0
- package/src/widgets/wrapper/wrapper-ui.tsx +57 -0
- package/src/widgets/wrapper/wrapper.test.tsx +365 -0
- package/src/widgets/wrapper/wrapper.tsx +50 -0
- package/dist/lasso-tool-BwRzEW7k.js.map +0 -1
- package/dist/types/common/common.d.ts +0 -3
- package/dist/types/common/index.d.ts +0 -26
- package/dist/types/common/lasso-tools.d.ts +0 -36
- 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,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,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>>
|