@carto/ps-react-ui 4.7.1 → 4.9.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.
- package/dist/category-DwaeYjpX.js +656 -0
- package/dist/category-DwaeYjpX.js.map +1 -0
- package/dist/change-column-Cidl_M-4.js +1110 -0
- package/dist/change-column-Cidl_M-4.js.map +1 -0
- package/dist/data-zoom-layout-BH0LPwSy.js +28 -0
- package/dist/data-zoom-layout-BH0LPwSy.js.map +1 -0
- package/dist/echart-CU0KmClP.js +176 -0
- package/dist/echart-CU0KmClP.js.map +1 -0
- package/dist/exports-Cx-f6m6U.js +63 -0
- package/dist/exports-Cx-f6m6U.js.map +1 -0
- package/dist/formula-DuC0NQLH.js +79 -0
- package/dist/formula-DuC0NQLH.js.map +1 -0
- package/dist/markdown-BD1jcknS.js +8326 -0
- package/dist/markdown-BD1jcknS.js.map +1 -0
- package/dist/{styles-BYTyKQFP.js → option-builders-F-c9ELi1.js} +25 -45
- package/dist/option-builders-F-c9ELi1.js.map +1 -0
- package/dist/png-item-CS4z1iSH.js +45 -0
- package/dist/png-item-CS4z1iSH.js.map +1 -0
- package/dist/range-l4fNHLEg.js +213 -0
- package/dist/range-l4fNHLEg.js.map +1 -0
- package/dist/resolve-theme-color-BdojIw0K.js +47 -0
- package/dist/resolve-theme-color-BdojIw0K.js.map +1 -0
- package/dist/spread-CTuIXZSM.js +67 -0
- package/dist/spread-CTuIXZSM.js.map +1 -0
- package/dist/style-DVnT6HC1.js +131 -0
- package/dist/style-DVnT6HC1.js.map +1 -0
- package/dist/styles-cohnxh9F.js +23 -0
- package/dist/styles-cohnxh9F.js.map +1 -0
- package/dist/table-CQCAnDLb.js +388 -0
- package/dist/table-CQCAnDLb.js.map +1 -0
- package/dist/transforms-Cdx4fkU5.js +106 -0
- package/dist/transforms-Cdx4fkU5.js.map +1 -0
- package/dist/types/widgets/echart/utils.test.d.ts +1 -0
- package/dist/types/widgets/formula/config.test.d.ts +1 -0
- package/dist/types/widgets/stores/widget-store-branches.test.d.ts +1 -0
- package/dist/types/widgets/table/config.test.d.ts +1 -0
- package/dist/types/widgets-v2/actions/brush-toggle/brush-toggle.d.ts +56 -0
- package/dist/types/widgets-v2/actions/brush-toggle/index.d.ts +3 -0
- package/dist/types/widgets-v2/actions/brush-toggle/labels.d.ts +5 -0
- package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +12 -0
- package/dist/types/widgets-v2/actions/brush-toggle/transforms.d.ts +11 -0
- package/dist/types/widgets-v2/actions/brush-toggle/transforms.test.d.ts +1 -0
- package/dist/types/widgets-v2/actions/change-column/change-column-icon.d.ts +2 -0
- package/dist/types/widgets-v2/actions/change-column/change-column.d.ts +29 -0
- package/dist/types/widgets-v2/actions/change-column/index.d.ts +3 -0
- package/dist/types/widgets-v2/actions/change-column/labels.d.ts +5 -0
- package/dist/types/widgets-v2/actions/change-column/sortable-column-item.d.ts +14 -0
- package/dist/types/widgets-v2/actions/change-column/style.d.ts +33 -0
- package/dist/types/widgets-v2/actions/change-column/types.d.ts +10 -0
- package/dist/types/widgets-v2/actions/download/download.d.ts +18 -0
- package/dist/types/widgets-v2/actions/download/exports.d.ts +37 -0
- package/dist/types/widgets-v2/actions/download/icons.d.ts +12 -0
- package/dist/types/widgets-v2/actions/download/index.d.ts +6 -0
- package/dist/types/widgets-v2/actions/download/labels.d.ts +11 -0
- package/dist/types/widgets-v2/actions/download/png-item.d.ts +24 -0
- package/dist/types/widgets-v2/actions/download/style.d.ts +1 -0
- package/dist/types/widgets-v2/actions/download/types.d.ts +35 -0
- package/dist/types/widgets-v2/actions/fullscreen/fullscreen.d.ts +59 -0
- package/dist/types/widgets-v2/actions/fullscreen/index.d.ts +3 -0
- package/dist/types/widgets-v2/actions/fullscreen/labels.d.ts +5 -0
- package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +48 -0
- package/dist/types/widgets-v2/actions/fullscreen/types.d.ts +14 -0
- package/dist/types/widgets-v2/actions/index.d.ts +9 -0
- package/dist/types/widgets-v2/actions/lock-selection/index.d.ts +3 -0
- package/dist/types/widgets-v2/actions/lock-selection/labels.d.ts +6 -0
- package/dist/types/widgets-v2/actions/lock-selection/lock-selection.d.ts +36 -0
- package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +12 -0
- package/dist/types/widgets-v2/actions/lock-selection/transforms.d.ts +6 -0
- package/dist/types/widgets-v2/actions/relative-data/index.d.ts +3 -0
- package/dist/types/widgets-v2/actions/relative-data/labels.d.ts +5 -0
- package/dist/types/widgets-v2/actions/relative-data/relative-data.d.ts +39 -0
- package/dist/types/widgets-v2/actions/relative-data/style.d.ts +12 -0
- package/dist/types/widgets-v2/actions/relative-data/transforms.d.ts +30 -0
- package/dist/types/widgets-v2/actions/relative-data/transforms.test.d.ts +1 -0
- package/dist/types/widgets-v2/actions/searcher/filter.d.ts +6 -0
- package/dist/types/widgets-v2/actions/searcher/index.d.ts +4 -0
- package/dist/types/widgets-v2/actions/searcher/labels.d.ts +7 -0
- package/dist/types/widgets-v2/actions/searcher/searcher-toggle.d.ts +23 -0
- package/dist/types/widgets-v2/actions/searcher/searcher.d.ts +11 -0
- package/dist/types/widgets-v2/actions/searcher/style.d.ts +16 -0
- package/dist/types/widgets-v2/actions/stack-toggle/index.d.ts +3 -0
- package/dist/types/widgets-v2/actions/stack-toggle/labels.d.ts +5 -0
- package/dist/types/widgets-v2/actions/stack-toggle/stack-toggle.d.ts +10 -0
- package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +12 -0
- package/dist/types/widgets-v2/actions/stack-toggle/transforms.d.ts +13 -0
- package/dist/types/widgets-v2/actions/stack-toggle/transforms.test.d.ts +1 -0
- package/dist/types/widgets-v2/actions/zoom-toggle/index.d.ts +3 -0
- package/dist/types/widgets-v2/actions/zoom-toggle/labels.d.ts +5 -0
- package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +12 -0
- package/dist/types/widgets-v2/actions/zoom-toggle/transforms.d.ts +51 -0
- package/dist/types/widgets-v2/actions/zoom-toggle/transforms.test.d.ts +1 -0
- package/dist/types/widgets-v2/actions/zoom-toggle/zoom-toggle.d.ts +35 -0
- package/dist/types/widgets-v2/bar/download.d.ts +24 -0
- package/dist/types/widgets-v2/bar/index.d.ts +4 -0
- package/dist/types/widgets-v2/bar/options.d.ts +43 -0
- package/dist/types/widgets-v2/bar/options.test.d.ts +1 -0
- package/dist/types/widgets-v2/bar/skeleton.d.ts +6 -0
- package/dist/types/widgets-v2/bar/types.d.ts +46 -0
- package/dist/types/widgets-v2/category/category-ui.d.ts +81 -0
- package/dist/types/widgets-v2/category/category.d.ts +48 -0
- package/dist/types/widgets-v2/category/components/category-bar-stacked.d.ts +28 -0
- package/dist/types/widgets-v2/category/components/category-bar.d.ts +23 -0
- package/dist/types/widgets-v2/category/components/category-legend.d.ts +18 -0
- package/dist/types/widgets-v2/category/components/category-row-multi.d.ts +31 -0
- package/dist/types/widgets-v2/category/components/category-row-other.d.ts +13 -0
- package/dist/types/widgets-v2/category/components/category-row-single.d.ts +28 -0
- package/dist/types/widgets-v2/category/components/category-row-stacked.d.ts +38 -0
- package/dist/types/widgets-v2/category/download.d.ts +16 -0
- package/dist/types/widgets-v2/category/download.test.d.ts +1 -0
- package/dist/types/widgets-v2/category/index.d.ts +10 -0
- package/dist/types/widgets-v2/category/skeleton.d.ts +11 -0
- package/dist/types/widgets-v2/category/style.d.ts +166 -0
- package/dist/types/widgets-v2/category/types.d.ts +53 -0
- package/dist/types/widgets-v2/echart/echart-ui.d.ts +44 -0
- package/dist/types/widgets-v2/echart/echart.d.ts +75 -0
- package/dist/types/widgets-v2/echart/index.d.ts +4 -0
- package/dist/types/widgets-v2/echart/shared-resize-observer.d.ts +5 -0
- package/dist/types/widgets-v2/echart/shared-resize-observer.test.d.ts +1 -0
- package/dist/types/widgets-v2/echart/style.d.ts +6 -0
- package/dist/types/widgets-v2/echart/use-chart-selection.d.ts +51 -0
- package/dist/types/widgets-v2/formula/delta.d.ts +22 -0
- package/dist/types/widgets-v2/formula/download.d.ts +20 -0
- package/dist/types/widgets-v2/formula/formula-ui.d.ts +20 -0
- package/dist/types/widgets-v2/formula/formula.d.ts +8 -0
- package/dist/types/widgets-v2/formula/index.d.ts +11 -0
- package/dist/types/widgets-v2/formula/note.d.ts +11 -0
- package/dist/types/widgets-v2/formula/prefix.d.ts +12 -0
- package/dist/types/widgets-v2/formula/series.d.ts +16 -0
- package/dist/types/widgets-v2/formula/skeleton.d.ts +4 -0
- package/dist/types/widgets-v2/formula/style.d.ts +29 -0
- package/dist/types/widgets-v2/formula/suffix.d.ts +12 -0
- package/dist/types/widgets-v2/formula/types.d.ts +43 -0
- package/dist/types/widgets-v2/formula/value.d.ts +14 -0
- package/dist/types/widgets-v2/histogram/download.d.ts +17 -0
- package/dist/types/widgets-v2/histogram/download.test.d.ts +1 -0
- package/dist/types/widgets-v2/histogram/index.d.ts +5 -0
- package/dist/types/widgets-v2/histogram/options.d.ts +42 -0
- package/dist/types/widgets-v2/histogram/options.test.d.ts +1 -0
- package/dist/types/widgets-v2/histogram/skeleton.d.ts +9 -0
- package/dist/types/widgets-v2/histogram/transforms.d.ts +17 -0
- package/dist/types/widgets-v2/histogram/transforms.test.d.ts +1 -0
- package/dist/types/widgets-v2/histogram/types.d.ts +51 -0
- package/dist/types/widgets-v2/index.d.ts +108 -0
- package/dist/types/widgets-v2/markdown/download.d.ts +16 -0
- package/dist/types/widgets-v2/markdown/download.test.d.ts +1 -0
- package/dist/types/widgets-v2/markdown/index.d.ts +6 -0
- package/dist/types/widgets-v2/markdown/markdown-content.d.ts +34 -0
- package/dist/types/widgets-v2/markdown/markdown-ui.d.ts +12 -0
- package/dist/types/widgets-v2/markdown/markdown.d.ts +6 -0
- package/dist/types/widgets-v2/markdown/skeleton.d.ts +4 -0
- package/dist/types/widgets-v2/markdown/style.d.ts +61 -0
- package/dist/types/widgets-v2/markdown/types.d.ts +4 -0
- package/dist/types/widgets-v2/note/labels.d.ts +5 -0
- package/dist/types/widgets-v2/note/style.d.ts +26 -0
- package/dist/types/widgets-v2/note/widget-note.d.ts +46 -0
- package/dist/types/widgets-v2/pie/download.d.ts +17 -0
- package/dist/types/widgets-v2/pie/download.test.d.ts +1 -0
- package/dist/types/widgets-v2/pie/index.d.ts +4 -0
- package/dist/types/widgets-v2/pie/options.d.ts +35 -0
- package/dist/types/widgets-v2/pie/options.test.d.ts +1 -0
- package/dist/types/widgets-v2/pie/skeleton.d.ts +4 -0
- package/dist/types/widgets-v2/pie/types.d.ts +57 -0
- package/dist/types/widgets-v2/provider/widget-provider.d.ts +32 -0
- package/dist/types/widgets-v2/range/index.d.ts +4 -0
- package/dist/types/widgets-v2/range/range-ui.d.ts +27 -0
- package/dist/types/widgets-v2/range/range.d.ts +24 -0
- package/dist/types/widgets-v2/range/skeleton.d.ts +9 -0
- package/dist/types/widgets-v2/range/style.d.ts +40 -0
- package/dist/types/widgets-v2/range/types.d.ts +37 -0
- package/dist/types/widgets-v2/scatterplot/download.d.ts +16 -0
- package/dist/types/widgets-v2/scatterplot/download.test.d.ts +1 -0
- package/dist/types/widgets-v2/scatterplot/index.d.ts +5 -0
- package/dist/types/widgets-v2/scatterplot/options.d.ts +42 -0
- package/dist/types/widgets-v2/scatterplot/options.test.d.ts +1 -0
- package/dist/types/widgets-v2/scatterplot/skeleton.d.ts +12 -0
- package/dist/types/widgets-v2/scatterplot/transforms.d.ts +17 -0
- package/dist/types/widgets-v2/scatterplot/transforms.test.d.ts +1 -0
- package/dist/types/widgets-v2/scatterplot/types.d.ts +54 -0
- package/dist/types/widgets-v2/selection-summary/labels.d.ts +6 -0
- package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +22 -0
- package/dist/types/widgets-v2/selection-summary/style.d.ts +23 -0
- package/dist/types/widgets-v2/spread/download.d.ts +15 -0
- package/dist/types/widgets-v2/spread/download.test.d.ts +1 -0
- package/dist/types/widgets-v2/spread/index.d.ts +6 -0
- package/dist/types/widgets-v2/spread/separator.d.ts +7 -0
- package/dist/types/widgets-v2/spread/skeleton.d.ts +9 -0
- package/dist/types/widgets-v2/spread/spread-ui.d.ts +18 -0
- package/dist/types/widgets-v2/spread/spread.d.ts +5 -0
- package/dist/types/widgets-v2/spread/types.d.ts +25 -0
- package/dist/types/widgets-v2/state/labels.d.ts +7 -0
- package/dist/types/widgets-v2/state/labels.test.d.ts +1 -0
- package/dist/types/widgets-v2/state/style.d.ts +19 -0
- package/dist/types/widgets-v2/state/widget-state.d.ts +19 -0
- package/dist/types/widgets-v2/stores/index.d.ts +8 -0
- package/dist/types/widgets-v2/stores/pipeline-middleware.d.ts +5 -0
- package/dist/types/widgets-v2/stores/pipeline-middleware.test.d.ts +1 -0
- package/dist/types/widgets-v2/stores/transforms.d.ts +4 -0
- package/dist/types/widgets-v2/stores/transforms.test.d.ts +1 -0
- package/dist/types/widgets-v2/stores/types.d.ts +55 -0
- package/dist/types/widgets-v2/stores/use-echart-instance.d.ts +15 -0
- package/dist/types/widgets-v2/stores/use-transform-enabled.d.ts +17 -0
- package/dist/types/widgets-v2/stores/use-transform.d.ts +12 -0
- package/dist/types/widgets-v2/stores/widget-context.d.ts +2 -0
- package/dist/types/widgets-v2/stores/widget-store-registry.d.ts +74 -0
- package/dist/types/widgets-v2/stores/widget-store-registry.test.d.ts +1 -0
- package/dist/types/widgets-v2/subheader/style.d.ts +10 -0
- package/dist/types/widgets-v2/subheader/subheader.d.ts +11 -0
- package/dist/types/widgets-v2/table/download.d.ts +18 -0
- package/dist/types/widgets-v2/table/download.test.d.ts +1 -0
- package/dist/types/widgets-v2/table/helpers.d.ts +32 -0
- package/dist/types/widgets-v2/table/helpers.test.d.ts +1 -0
- package/dist/types/widgets-v2/table/index.d.ts +7 -0
- package/dist/types/widgets-v2/table/labels.d.ts +22 -0
- package/dist/types/widgets-v2/table/skeleton.d.ts +22 -0
- package/dist/types/widgets-v2/table/style.d.ts +40 -0
- package/dist/types/widgets-v2/table/table-ui.d.ts +44 -0
- package/dist/types/widgets-v2/table/table.d.ts +50 -0
- package/dist/types/widgets-v2/table/types.d.ts +48 -0
- package/dist/types/widgets-v2/test-utils.d.ts +52 -0
- package/dist/types/widgets-v2/timeseries/download.d.ts +17 -0
- package/dist/types/widgets-v2/timeseries/download.test.d.ts +1 -0
- package/dist/types/widgets-v2/timeseries/index.d.ts +4 -0
- package/dist/types/widgets-v2/timeseries/options.d.ts +39 -0
- package/dist/types/widgets-v2/timeseries/options.test.d.ts +1 -0
- package/dist/types/widgets-v2/timeseries/skeleton.d.ts +8 -0
- package/dist/types/widgets-v2/timeseries/types.d.ts +60 -0
- package/dist/types/widgets-v2/toolbox/labels.d.ts +5 -0
- package/dist/types/widgets-v2/toolbox/style.d.ts +30 -0
- package/dist/types/widgets-v2/toolbox/toolbox.d.ts +49 -0
- package/dist/types/widgets-v2/types.d.ts +25 -0
- package/dist/types/widgets-v2/utils/data-zoom-layout.d.ts +11 -0
- package/dist/types/widgets-v2/utils/index.d.ts +3 -0
- package/dist/types/widgets-v2/utils/merge-options.d.ts +12 -0
- package/dist/types/widgets-v2/utils/merge-options.test.d.ts +1 -0
- package/dist/types/widgets-v2/utils/resolve-theme-color.d.ts +18 -0
- package/dist/types/widgets-v2/utils/resolve-theme-color.test.d.ts +1 -0
- package/dist/types/widgets-v2/wrapper/index.d.ts +4 -0
- package/dist/types/widgets-v2/wrapper/labels.d.ts +6 -0
- package/dist/types/widgets-v2/wrapper/style.d.ts +111 -0
- package/dist/types/widgets-v2/wrapper/widget-actions.d.ts +22 -0
- package/dist/types/widgets-v2/wrapper/widget-content.d.ts +12 -0
- package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +51 -0
- package/dist/use-transform-DXPN3nY7.js +110 -0
- package/dist/use-transform-DXPN3nY7.js.map +1 -0
- package/dist/widget-context-DTGO0Yta.js +13 -0
- package/dist/widget-context-DTGO0Yta.js.map +1 -0
- package/dist/widget-store-registry-_W4Z4xp-.js +178 -0
- package/dist/widget-store-registry-_W4Z4xp-.js.map +1 -0
- package/dist/widgets/bar.js +14 -13
- package/dist/widgets/bar.js.map +1 -1
- package/dist/widgets/histogram.js +8 -7
- package/dist/widgets/histogram.js.map +1 -1
- package/dist/widgets/pie.js +19 -18
- package/dist/widgets/pie.js.map +1 -1
- package/dist/widgets/scatterplot.js +8 -7
- package/dist/widgets/scatterplot.js.map +1 -1
- package/dist/widgets/timeseries.js +11 -10
- package/dist/widgets/timeseries.js.map +1 -1
- package/dist/widgets/utils.js +8 -7
- package/dist/widgets/utils.js.map +1 -1
- package/dist/widgets-v2/actions.js +43 -0
- package/dist/widgets-v2/actions.js.map +1 -0
- package/dist/widgets-v2/bar.js +330 -0
- package/dist/widgets-v2/bar.js.map +1 -0
- package/dist/widgets-v2/category.js +104 -0
- package/dist/widgets-v2/category.js.map +1 -0
- package/dist/widgets-v2/echart.js +57 -0
- package/dist/widgets-v2/echart.js.map +1 -0
- package/dist/widgets-v2/formula.js +74 -0
- package/dist/widgets-v2/formula.js.map +1 -0
- package/dist/widgets-v2/histogram.js +353 -0
- package/dist/widgets-v2/histogram.js.map +1 -0
- package/dist/widgets-v2/markdown.js +68 -0
- package/dist/widgets-v2/markdown.js.map +1 -0
- package/dist/widgets-v2/pie.js +387 -0
- package/dist/widgets-v2/pie.js.map +1 -0
- package/dist/widgets-v2/range.js +52 -0
- package/dist/widgets-v2/range.js.map +1 -0
- package/dist/widgets-v2/scatterplot.js +411 -0
- package/dist/widgets-v2/scatterplot.js.map +1 -0
- package/dist/widgets-v2/spread.js +72 -0
- package/dist/widgets-v2/spread.js.map +1 -0
- package/dist/widgets-v2/stores.js +42 -0
- package/dist/widgets-v2/stores.js.map +1 -0
- package/dist/widgets-v2/table.js +78 -0
- package/dist/widgets-v2/table.js.map +1 -0
- package/dist/widgets-v2/timeseries.js +358 -0
- package/dist/widgets-v2/timeseries.js.map +1 -0
- package/dist/widgets-v2/utils.js +8 -0
- package/dist/widgets-v2/utils.js.map +1 -0
- package/dist/widgets-v2.js +953 -0
- package/dist/widgets-v2.js.map +1 -0
- package/package.json +71 -3
- package/src/components/lasso-tool/chip.test.tsx +176 -0
- package/src/components/lasso-tool/lasso-tool-inline.test.tsx +171 -0
- package/src/components/lasso-tool/lasso-tool.test.tsx +198 -0
- package/src/components/list-data/list-data.test.tsx +73 -0
- package/src/components/no-data-alert/no-data-alert.test.tsx +38 -0
- package/src/components/responsive-drawer/responsive-drawer.test.tsx +68 -0
- package/src/widgets/actions/brush-toggle/brush-overlay.test.tsx +465 -0
- package/src/widgets/actions/brush-toggle/brush-toggle.test.tsx +208 -0
- package/src/widgets/actions/change-column/change-column-dnd.test.tsx +193 -0
- package/src/widgets/actions/change-column/sortable-column-item.test.tsx +124 -0
- package/src/widgets/actions/zoom-toggle/zoom-toggle.test.tsx +322 -0
- package/src/widgets/category/components/category-rows.test.tsx +213 -0
- package/src/widgets/echart/utils.test.ts +277 -0
- package/src/widgets/formula/config.test.ts +37 -0
- package/src/widgets/range/components/range-item.test.tsx +243 -0
- package/src/widgets/stores/widget-store-branches.test.ts +275 -0
- package/src/widgets/table/config.test.ts +65 -0
- package/src/widgets/utils/chart-config/option-builders.test.ts +188 -0
- package/src/widgets-v2/PERFORMANCE.md +189 -0
- package/src/widgets-v2/actions/brush-toggle/brush-toggle.test.tsx +180 -0
- package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +154 -0
- package/src/widgets-v2/actions/brush-toggle/index.ts +3 -0
- package/src/widgets-v2/actions/brush-toggle/labels.ts +9 -0
- package/src/widgets-v2/actions/brush-toggle/style.ts +11 -0
- package/src/widgets-v2/actions/brush-toggle/transforms.test.ts +47 -0
- package/src/widgets-v2/actions/brush-toggle/transforms.ts +31 -0
- package/src/widgets-v2/actions/change-column/change-column-icon.tsx +14 -0
- package/src/widgets-v2/actions/change-column/change-column.test.tsx +59 -0
- package/src/widgets-v2/actions/change-column/change-column.tsx +180 -0
- package/src/widgets-v2/actions/change-column/index.ts +7 -0
- package/src/widgets-v2/actions/change-column/labels.ts +9 -0
- package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +56 -0
- package/src/widgets-v2/actions/change-column/style.ts +32 -0
- package/src/widgets-v2/actions/change-column/types.ts +11 -0
- package/src/widgets-v2/actions/download/download.test.tsx +327 -0
- package/src/widgets-v2/actions/download/download.tsx +144 -0
- package/src/widgets-v2/actions/download/exports.test.tsx +198 -0
- package/src/widgets-v2/actions/download/exports.ts +115 -0
- package/src/widgets-v2/actions/download/icons.tsx +26 -0
- package/src/widgets-v2/actions/download/index.ts +13 -0
- package/src/widgets-v2/actions/download/labels.ts +16 -0
- package/src/widgets-v2/actions/download/png-item.test.tsx +72 -0
- package/src/widgets-v2/actions/download/png-item.tsx +52 -0
- package/src/widgets-v2/actions/download/style.ts +3 -0
- package/src/widgets-v2/actions/download/types.ts +32 -0
- package/src/widgets-v2/actions/fullscreen/fullscreen.test.tsx +150 -0
- package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +230 -0
- package/src/widgets-v2/actions/fullscreen/index.ts +7 -0
- package/src/widgets-v2/actions/fullscreen/labels.ts +9 -0
- package/src/widgets-v2/actions/fullscreen/style.ts +59 -0
- package/src/widgets-v2/actions/fullscreen/types.ts +15 -0
- package/src/widgets-v2/actions/index.ts +82 -0
- package/src/widgets-v2/actions/lock-selection/index.ts +10 -0
- package/src/widgets-v2/actions/lock-selection/labels.ts +11 -0
- package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +187 -0
- package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +130 -0
- package/src/widgets-v2/actions/lock-selection/style.ts +11 -0
- package/src/widgets-v2/actions/lock-selection/transforms.ts +27 -0
- package/src/widgets-v2/actions/relative-data/index.ts +3 -0
- package/src/widgets-v2/actions/relative-data/labels.ts +9 -0
- package/src/widgets-v2/actions/relative-data/relative-data.test.tsx +71 -0
- package/src/widgets-v2/actions/relative-data/relative-data.tsx +107 -0
- package/src/widgets-v2/actions/relative-data/style.ts +11 -0
- package/src/widgets-v2/actions/relative-data/transforms.test.ts +151 -0
- package/src/widgets-v2/actions/relative-data/transforms.ts +70 -0
- package/src/widgets-v2/actions/searcher/filter.ts +28 -0
- package/src/widgets-v2/actions/searcher/index.ts +8 -0
- package/src/widgets-v2/actions/searcher/labels.ts +13 -0
- package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +91 -0
- package/src/widgets-v2/actions/searcher/searcher.test.tsx +92 -0
- package/src/widgets-v2/actions/searcher/searcher.tsx +112 -0
- package/src/widgets-v2/actions/searcher/style.ts +15 -0
- package/src/widgets-v2/actions/stack-toggle/index.ts +3 -0
- package/src/widgets-v2/actions/stack-toggle/labels.ts +9 -0
- package/src/widgets-v2/actions/stack-toggle/stack-toggle.test.tsx +61 -0
- package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +54 -0
- package/src/widgets-v2/actions/stack-toggle/style.ts +11 -0
- package/src/widgets-v2/actions/stack-toggle/transforms.test.ts +43 -0
- package/src/widgets-v2/actions/stack-toggle/transforms.ts +25 -0
- package/src/widgets-v2/actions/zoom-toggle/index.ts +9 -0
- package/src/widgets-v2/actions/zoom-toggle/labels.ts +9 -0
- package/src/widgets-v2/actions/zoom-toggle/style.ts +11 -0
- package/src/widgets-v2/actions/zoom-toggle/transforms.test.ts +148 -0
- package/src/widgets-v2/actions/zoom-toggle/transforms.ts +171 -0
- package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.test.tsx +107 -0
- package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +106 -0
- package/src/widgets-v2/bar/download.test.tsx +91 -0
- package/src/widgets-v2/bar/download.tsx +66 -0
- package/src/widgets-v2/bar/index.ts +10 -0
- package/src/widgets-v2/bar/options.test.ts +334 -0
- package/src/widgets-v2/bar/options.ts +332 -0
- package/src/widgets-v2/bar/skeleton.test.tsx +19 -0
- package/src/widgets-v2/bar/skeleton.tsx +69 -0
- package/src/widgets-v2/bar/types.ts +51 -0
- package/src/widgets-v2/category/category-ui.test.tsx +746 -0
- package/src/widgets-v2/category/category-ui.tsx +389 -0
- package/src/widgets-v2/category/category.relative-data.test.tsx +107 -0
- package/src/widgets-v2/category/category.stack-toggle.test.tsx +85 -0
- package/src/widgets-v2/category/category.test.tsx +305 -0
- package/src/widgets-v2/category/category.tsx +121 -0
- package/src/widgets-v2/category/components/category-bar-stacked.test.tsx +121 -0
- package/src/widgets-v2/category/components/category-bar-stacked.tsx +73 -0
- package/src/widgets-v2/category/components/category-bar.test.tsx +64 -0
- package/src/widgets-v2/category/components/category-bar.tsx +49 -0
- package/src/widgets-v2/category/components/category-legend.test.tsx +51 -0
- package/src/widgets-v2/category/components/category-legend.tsx +39 -0
- package/src/widgets-v2/category/components/category-row-multi.tsx +86 -0
- package/src/widgets-v2/category/components/category-row-other.test.tsx +28 -0
- package/src/widgets-v2/category/components/category-row-other.tsx +33 -0
- package/src/widgets-v2/category/components/category-row-single.tsx +76 -0
- package/src/widgets-v2/category/components/category-row-stacked.test.tsx +244 -0
- package/src/widgets-v2/category/components/category-row-stacked.tsx +99 -0
- package/src/widgets-v2/category/download.test.ts +71 -0
- package/src/widgets-v2/category/download.ts +54 -0
- package/src/widgets-v2/category/index.ts +32 -0
- package/src/widgets-v2/category/skeleton.test.tsx +26 -0
- package/src/widgets-v2/category/skeleton.tsx +74 -0
- package/src/widgets-v2/category/style.ts +290 -0
- package/src/widgets-v2/category/types.ts +59 -0
- package/src/widgets-v2/echart/echart-ui.test.tsx +232 -0
- package/src/widgets-v2/echart/echart-ui.tsx +184 -0
- package/src/widgets-v2/echart/echart.test.tsx +229 -0
- package/src/widgets-v2/echart/echart.tsx +199 -0
- package/src/widgets-v2/echart/index.ts +22 -0
- package/src/widgets-v2/echart/shared-resize-observer.test.ts +91 -0
- package/src/widgets-v2/echart/shared-resize-observer.ts +56 -0
- package/src/widgets-v2/echart/style.ts +8 -0
- package/src/widgets-v2/echart/use-chart-selection.test.tsx +118 -0
- package/src/widgets-v2/echart/use-chart-selection.ts +115 -0
- package/src/widgets-v2/formula/delta.tsx +61 -0
- package/src/widgets-v2/formula/download.test.tsx +65 -0
- package/src/widgets-v2/formula/download.tsx +69 -0
- package/src/widgets-v2/formula/formula-ui.test.tsx +91 -0
- package/src/widgets-v2/formula/formula-ui.tsx +66 -0
- package/src/widgets-v2/formula/formula.test.tsx +50 -0
- package/src/widgets-v2/formula/formula.tsx +34 -0
- package/src/widgets-v2/formula/index.ts +17 -0
- package/src/widgets-v2/formula/note.tsx +25 -0
- package/src/widgets-v2/formula/prefix.tsx +25 -0
- package/src/widgets-v2/formula/series.tsx +67 -0
- package/src/widgets-v2/formula/skeleton.test.tsx +21 -0
- package/src/widgets-v2/formula/skeleton.tsx +27 -0
- package/src/widgets-v2/formula/style.ts +31 -0
- package/src/widgets-v2/formula/subcomponents.test.tsx +107 -0
- package/src/widgets-v2/formula/suffix.tsx +25 -0
- package/src/widgets-v2/formula/types.ts +48 -0
- package/src/widgets-v2/formula/value.tsx +31 -0
- package/src/widgets-v2/histogram/download.test.ts +94 -0
- package/src/widgets-v2/histogram/download.ts +60 -0
- package/src/widgets-v2/histogram/index.ts +10 -0
- package/src/widgets-v2/histogram/options.test.ts +318 -0
- package/src/widgets-v2/histogram/options.ts +338 -0
- package/src/widgets-v2/histogram/skeleton.test.tsx +16 -0
- package/src/widgets-v2/histogram/skeleton.tsx +70 -0
- package/src/widgets-v2/histogram/transforms.test.ts +46 -0
- package/src/widgets-v2/histogram/transforms.ts +30 -0
- package/src/widgets-v2/histogram/types.ts +55 -0
- package/src/widgets-v2/index.ts +204 -0
- package/src/widgets-v2/markdown/download.test.ts +66 -0
- package/src/widgets-v2/markdown/download.ts +53 -0
- package/src/widgets-v2/markdown/index.ts +6 -0
- package/src/widgets-v2/markdown/markdown-content.test.tsx +155 -0
- package/src/widgets-v2/markdown/markdown-content.tsx +72 -0
- package/src/widgets-v2/markdown/markdown-ui.test.tsx +75 -0
- package/src/widgets-v2/markdown/markdown-ui.tsx +55 -0
- package/src/widgets-v2/markdown/markdown.test.tsx +39 -0
- package/src/widgets-v2/markdown/markdown.tsx +17 -0
- package/src/widgets-v2/markdown/skeleton.test.tsx +15 -0
- package/src/widgets-v2/markdown/skeleton.tsx +32 -0
- package/src/widgets-v2/markdown/style.ts +53 -0
- package/src/widgets-v2/markdown/types.ts +4 -0
- package/src/widgets-v2/note/labels.ts +9 -0
- package/src/widgets-v2/note/style.ts +26 -0
- package/src/widgets-v2/note/widget-note.test.tsx +158 -0
- package/src/widgets-v2/note/widget-note.tsx +172 -0
- package/src/widgets-v2/pie/download.test.ts +78 -0
- package/src/widgets-v2/pie/download.ts +55 -0
- package/src/widgets-v2/pie/index.ts +10 -0
- package/src/widgets-v2/pie/options.test.ts +601 -0
- package/src/widgets-v2/pie/options.ts +513 -0
- package/src/widgets-v2/pie/skeleton.test.tsx +17 -0
- package/src/widgets-v2/pie/skeleton.tsx +32 -0
- package/src/widgets-v2/pie/types.ts +62 -0
- package/src/widgets-v2/provider/widget-provider.test.tsx +119 -0
- package/src/widgets-v2/provider/widget-provider.tsx +111 -0
- package/src/widgets-v2/range/index.ts +4 -0
- package/src/widgets-v2/range/range-ui.test.tsx +136 -0
- package/src/widgets-v2/range/range-ui.tsx +278 -0
- package/src/widgets-v2/range/range.test.tsx +68 -0
- package/src/widgets-v2/range/range.tsx +52 -0
- package/src/widgets-v2/range/skeleton.test.tsx +17 -0
- package/src/widgets-v2/range/skeleton.tsx +47 -0
- package/src/widgets-v2/range/style.ts +41 -0
- package/src/widgets-v2/range/types.ts +37 -0
- package/src/widgets-v2/scatterplot/download.test.ts +71 -0
- package/src/widgets-v2/scatterplot/download.ts +54 -0
- package/src/widgets-v2/scatterplot/index.ts +11 -0
- package/src/widgets-v2/scatterplot/options.test.ts +411 -0
- package/src/widgets-v2/scatterplot/options.ts +425 -0
- package/src/widgets-v2/scatterplot/skeleton.test.tsx +17 -0
- package/src/widgets-v2/scatterplot/skeleton.tsx +84 -0
- package/src/widgets-v2/scatterplot/transforms.test.ts +97 -0
- package/src/widgets-v2/scatterplot/transforms.ts +38 -0
- package/src/widgets-v2/scatterplot/types.ts +59 -0
- package/src/widgets-v2/selection-summary/labels.ts +11 -0
- package/src/widgets-v2/selection-summary/selection-summary.test.tsx +53 -0
- package/src/widgets-v2/selection-summary/selection-summary.tsx +62 -0
- package/src/widgets-v2/selection-summary/style.ts +23 -0
- package/src/widgets-v2/spread/download.test.ts +64 -0
- package/src/widgets-v2/spread/download.ts +59 -0
- package/src/widgets-v2/spread/index.ts +6 -0
- package/src/widgets-v2/spread/separator.tsx +11 -0
- package/src/widgets-v2/spread/skeleton.test.tsx +17 -0
- package/src/widgets-v2/spread/skeleton.tsx +38 -0
- package/src/widgets-v2/spread/spread-ui.test.tsx +108 -0
- package/src/widgets-v2/spread/spread-ui.tsx +52 -0
- package/src/widgets-v2/spread/spread.test.tsx +50 -0
- package/src/widgets-v2/spread/spread.tsx +31 -0
- package/src/widgets-v2/spread/types.ts +27 -0
- package/src/widgets-v2/state/labels.test.ts +33 -0
- package/src/widgets-v2/state/labels.ts +20 -0
- package/src/widgets-v2/state/style.ts +25 -0
- package/src/widgets-v2/state/widget-state.test.tsx +294 -0
- package/src/widgets-v2/state/widget-state.tsx +184 -0
- package/src/widgets-v2/stores/index.ts +49 -0
- package/src/widgets-v2/stores/pipeline-middleware.test.ts +187 -0
- package/src/widgets-v2/stores/pipeline-middleware.ts +91 -0
- package/src/widgets-v2/stores/transforms.test.ts +162 -0
- package/src/widgets-v2/stores/transforms.ts +70 -0
- package/src/widgets-v2/stores/types.ts +64 -0
- package/src/widgets-v2/stores/use-echart-instance.test.tsx +91 -0
- package/src/widgets-v2/stores/use-echart-instance.ts +29 -0
- package/src/widgets-v2/stores/use-transform-enabled.test.tsx +127 -0
- package/src/widgets-v2/stores/use-transform-enabled.ts +25 -0
- package/src/widgets-v2/stores/use-transform.test.tsx +262 -0
- package/src/widgets-v2/stores/use-transform.ts +158 -0
- package/src/widgets-v2/stores/widget-context.test.tsx +58 -0
- package/src/widgets-v2/stores/widget-context.ts +15 -0
- package/src/widgets-v2/stores/widget-store-registry.test.ts +292 -0
- package/src/widgets-v2/stores/widget-store-registry.ts +248 -0
- package/src/widgets-v2/subheader/style.ts +12 -0
- package/src/widgets-v2/subheader/subheader.test.tsx +30 -0
- package/src/widgets-v2/subheader/subheader.tsx +16 -0
- package/src/widgets-v2/table/download.test.ts +75 -0
- package/src/widgets-v2/table/download.ts +47 -0
- package/src/widgets-v2/table/helpers.test.ts +214 -0
- package/src/widgets-v2/table/helpers.ts +136 -0
- package/src/widgets-v2/table/index.ts +23 -0
- package/src/widgets-v2/table/labels.tsx +41 -0
- package/src/widgets-v2/table/skeleton.test.tsx +26 -0
- package/src/widgets-v2/table/skeleton.tsx +65 -0
- package/src/widgets-v2/table/style.ts +43 -0
- package/src/widgets-v2/table/table-ui.test.tsx +200 -0
- package/src/widgets-v2/table/table-ui.tsx +364 -0
- package/src/widgets-v2/table/table.test.tsx +119 -0
- package/src/widgets-v2/table/table.tsx +179 -0
- package/src/widgets-v2/table/types.ts +55 -0
- package/src/widgets-v2/test-utils.ts +107 -0
- package/src/widgets-v2/timeseries/download.test.ts +95 -0
- package/src/widgets-v2/timeseries/download.ts +86 -0
- package/src/widgets-v2/timeseries/index.ts +10 -0
- package/src/widgets-v2/timeseries/options.test.ts +394 -0
- package/src/widgets-v2/timeseries/options.ts +348 -0
- package/src/widgets-v2/timeseries/skeleton.test.tsx +13 -0
- package/src/widgets-v2/timeseries/skeleton.tsx +76 -0
- package/src/widgets-v2/timeseries/types.ts +65 -0
- package/src/widgets-v2/toolbox/labels.ts +9 -0
- package/src/widgets-v2/toolbox/style.ts +33 -0
- package/src/widgets-v2/toolbox/toolbox.test.tsx +200 -0
- package/src/widgets-v2/toolbox/toolbox.tsx +309 -0
- package/src/widgets-v2/types.ts +25 -0
- package/src/widgets-v2/utils/data-zoom-layout.ts +26 -0
- package/src/widgets-v2/utils/index.ts +3 -0
- package/src/widgets-v2/utils/merge-options.test.ts +52 -0
- package/src/widgets-v2/utils/merge-options.ts +50 -0
- package/src/widgets-v2/utils/resolve-theme-color.test.ts +43 -0
- package/src/widgets-v2/utils/resolve-theme-color.ts +34 -0
- package/src/widgets-v2/wrapper/index.ts +14 -0
- package/src/widgets-v2/wrapper/labels.ts +11 -0
- package/src/widgets-v2/wrapper/style.ts +134 -0
- package/src/widgets-v2/wrapper/widget-actions.test.tsx +52 -0
- package/src/widgets-v2/wrapper/widget-actions.tsx +43 -0
- package/src/widgets-v2/wrapper/widget-content.test.tsx +27 -0
- package/src/widgets-v2/wrapper/widget-content.tsx +29 -0
- package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +159 -0
- package/src/widgets-v2/wrapper/widget-wrapper.tsx +178 -0
- package/dist/styles-BYTyKQFP.js.map +0 -1
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import type { EChartsOption } from 'echarts'
|
|
2
|
+
import * as echarts from 'echarts'
|
|
3
|
+
import type { CallbackDataParams } from 'echarts/types/dist/shared'
|
|
4
|
+
import {
|
|
5
|
+
buildGridConfig,
|
|
6
|
+
buildLegendConfig,
|
|
7
|
+
createTooltipFormatter,
|
|
8
|
+
createTooltipPositioner,
|
|
9
|
+
niceNum,
|
|
10
|
+
} from '../../widgets/utils/chart-config'
|
|
11
|
+
import { ZOOM_LAYOUT } from '../actions/zoom-toggle'
|
|
12
|
+
import type { OptionFactory } from '../echart'
|
|
13
|
+
import { mergeOptions, resolveThemeColor } from '../utils'
|
|
14
|
+
import { positionDataZoomForLegend } from '../utils/data-zoom-layout'
|
|
15
|
+
import type {
|
|
16
|
+
TimeseriesEChartsOption,
|
|
17
|
+
TimeseriesOptionFactoryInput,
|
|
18
|
+
TimeseriesOptionsInput,
|
|
19
|
+
TimeseriesWidgetData,
|
|
20
|
+
} from './types'
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Builds the **structural** ECharts option for a timeseries widget —
|
|
24
|
+
* time x-axis, value y-axis, themed tooltip, themed legend, CARTO color
|
|
25
|
+
* palette. Mirrors {@link import('../bar/options').barOptions} so all
|
|
26
|
+
* four ECharts widgets share v1 look-and-feel.
|
|
27
|
+
*
|
|
28
|
+
* Intentional deviations from bar (timeseries-specific):
|
|
29
|
+
* - **X-axis is `type: 'time'`** (not 'category'). ECharts handles
|
|
30
|
+
* uneven sample spacing and zoom-level-aware label formatting.
|
|
31
|
+
* `labelFormatter` is wrapped so the consumer sees a `Date`, not
|
|
32
|
+
* a numeric timestamp.
|
|
33
|
+
* - **Tooltip body reads `{ name, value }` rows**, same as bar, but
|
|
34
|
+
* the `name` may arrive as `Date | number | string`. The
|
|
35
|
+
* `labelFormatter` receives a `Date` regardless.
|
|
36
|
+
*
|
|
37
|
+
* Intentionally data-agnostic: no series, no dataset, no `legend.show`
|
|
38
|
+
* (those depend on data and are added by the option factory's merge
|
|
39
|
+
* phase via {@link createTimeseriesOptionFactory}).
|
|
40
|
+
*/
|
|
41
|
+
export function timeseriesOptions({
|
|
42
|
+
theme,
|
|
43
|
+
formatter,
|
|
44
|
+
labelFormatter,
|
|
45
|
+
}: TimeseriesOptionsInput): TimeseriesEChartsOption {
|
|
46
|
+
// Closure shared between yAxis min/max callbacks and the label formatter,
|
|
47
|
+
// so only the rounded extents are labelled (matches v1 + bar).
|
|
48
|
+
let niceMin = 0
|
|
49
|
+
let niceMax = 1
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
grid: {
|
|
53
|
+
left: parseInt(theme.spacing(1)),
|
|
54
|
+
top: parseInt(theme.spacing(3)),
|
|
55
|
+
right: parseInt(theme.spacing(1)),
|
|
56
|
+
// Default: no legend. Merger bumps this when there are >1 series.
|
|
57
|
+
...buildGridConfig(false, theme),
|
|
58
|
+
containLabel: true,
|
|
59
|
+
},
|
|
60
|
+
tooltip: {
|
|
61
|
+
trigger: 'axis',
|
|
62
|
+
backgroundColor: theme.palette.grey[900],
|
|
63
|
+
borderWidth: 0,
|
|
64
|
+
padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],
|
|
65
|
+
textStyle: {
|
|
66
|
+
color: theme.palette.common.white,
|
|
67
|
+
fontSize: 11,
|
|
68
|
+
fontFamily: theme.typography.caption.fontFamily,
|
|
69
|
+
},
|
|
70
|
+
axisPointer: { type: 'line' },
|
|
71
|
+
position: createTooltipPositioner(theme),
|
|
72
|
+
formatter: buildTimeseriesTooltipFormatter(formatter, labelFormatter),
|
|
73
|
+
},
|
|
74
|
+
// Legend styling baked here; `show` is toggled by the merger based on
|
|
75
|
+
// series count.
|
|
76
|
+
legend: {
|
|
77
|
+
...buildLegendConfig({ hasLegend: false }),
|
|
78
|
+
},
|
|
79
|
+
axisPointer: { lineStyle: { color: theme.palette.grey[400] } },
|
|
80
|
+
color: [
|
|
81
|
+
theme.palette.secondary.main,
|
|
82
|
+
...Object.values(
|
|
83
|
+
(theme.palette as { qualitative?: { bold?: Record<string, string> } })
|
|
84
|
+
.qualitative?.bold ?? {},
|
|
85
|
+
),
|
|
86
|
+
],
|
|
87
|
+
xAxis: {
|
|
88
|
+
type: 'time',
|
|
89
|
+
axisLine: { show: false },
|
|
90
|
+
axisTick: { show: false },
|
|
91
|
+
axisLabel: {
|
|
92
|
+
padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],
|
|
93
|
+
margin: 0,
|
|
94
|
+
hideOverlap: true,
|
|
95
|
+
...(labelFormatter && {
|
|
96
|
+
formatter: (value: number) => labelFormatter(new Date(value)),
|
|
97
|
+
}),
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
yAxis: {
|
|
101
|
+
type: 'value',
|
|
102
|
+
min: (extent: { min: number }) => {
|
|
103
|
+
niceMin = extent.min < 0 ? niceNum(extent.min) : 0
|
|
104
|
+
return niceMin
|
|
105
|
+
},
|
|
106
|
+
max: (extent: { min: number; max: number }) => {
|
|
107
|
+
niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)
|
|
108
|
+
return niceMax
|
|
109
|
+
},
|
|
110
|
+
axisLine: { show: false },
|
|
111
|
+
axisTick: { show: false },
|
|
112
|
+
splitLine: {
|
|
113
|
+
show: true,
|
|
114
|
+
lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },
|
|
115
|
+
},
|
|
116
|
+
axisLabel: {
|
|
117
|
+
fontSize: theme.typography.overlineDelicate?.fontSize,
|
|
118
|
+
fontFamily: theme.typography.overlineDelicate?.fontFamily,
|
|
119
|
+
margin: parseInt(theme.spacing(1)),
|
|
120
|
+
show: true,
|
|
121
|
+
showMaxLabel: true,
|
|
122
|
+
showMinLabel: true,
|
|
123
|
+
verticalAlign: 'bottom',
|
|
124
|
+
inside: true,
|
|
125
|
+
formatter: (value: number) => {
|
|
126
|
+
if (value !== niceMax && value !== niceMin) return ''
|
|
127
|
+
if (value === 0) return ''
|
|
128
|
+
return formatter ? formatter(value) : String(value)
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
} as TimeseriesEChartsOption
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Returns the timeseries widget's {@link OptionFactory} — one closure
|
|
137
|
+
* that owns BOTH phases of option construction:
|
|
138
|
+
*
|
|
139
|
+
* - **Structural phase** (`option == null`) — builds the theme-aware
|
|
140
|
+
* structural option via {@link timeseriesOptions}, optionally merging
|
|
141
|
+
* the consumer-supplied `optionsOverride`. Called once by Provider to
|
|
142
|
+
* seed `rawOptions` in the store.
|
|
143
|
+
* - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`
|
|
144
|
+
* (`TimeseriesWidgetData`) into the option via the dataset API: one
|
|
145
|
+
* dataset per series, each series referencing its dataset by index,
|
|
146
|
+
* encoded by `name` (x — time) and `value` (y). Mirrors {@link import('../bar/options').createBarOptionFactory}:
|
|
147
|
+
* series-template merge for `addStack`, reactive formatters from
|
|
148
|
+
* `ctx`, `niceNum`-rounded y-axis bounds at fusion time, and
|
|
149
|
+
* `positionDataZoomForLegend` layout for ZoomToggle sliders.
|
|
150
|
+
*/
|
|
151
|
+
export function createTimeseriesOptionFactory(
|
|
152
|
+
options: TimeseriesOptionFactoryInput,
|
|
153
|
+
): OptionFactory {
|
|
154
|
+
const { theme, formatter, labelFormatter, optionsOverride } = options
|
|
155
|
+
const series = options.series
|
|
156
|
+
const smooth = options.smooth ?? true
|
|
157
|
+
const area = options.area ?? false
|
|
158
|
+
const selection = options.selection
|
|
159
|
+
const selectionSet =
|
|
160
|
+
selection && selection.length > 0
|
|
161
|
+
? new Set<string | number>(selection)
|
|
162
|
+
: null
|
|
163
|
+
// `name` may be Date | number | string. Normalize to the same type the
|
|
164
|
+
// selection is keyed on (Date → ms) so Set lookups match.
|
|
165
|
+
const normalizeName = (n: Date | number | string): string | number =>
|
|
166
|
+
n instanceof Date ? n.getTime() : n
|
|
167
|
+
return (option, data, ctx) => {
|
|
168
|
+
if (option == null) {
|
|
169
|
+
const structural = timeseriesOptions({ theme, formatter, labelFormatter })
|
|
170
|
+
return optionsOverride
|
|
171
|
+
? (mergeOptions(
|
|
172
|
+
structural as unknown as Record<string, unknown>,
|
|
173
|
+
optionsOverride as Partial<Record<string, unknown>>,
|
|
174
|
+
) as EChartsOption)
|
|
175
|
+
: structural
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const seriesArr = Array.isArray(data) ? (data as TimeseriesWidgetData) : []
|
|
179
|
+
if (seriesArr.length === 0) {
|
|
180
|
+
return { ...option, dataset: [], series: [] }
|
|
181
|
+
}
|
|
182
|
+
const hasLegend = seriesArr.length > 1
|
|
183
|
+
const seriesTemplates = Array.isArray(option.series) ? option.series : []
|
|
184
|
+
const broadcastTemplate = seriesTemplates[0] ?? {}
|
|
185
|
+
const baseYAxis =
|
|
186
|
+
typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)
|
|
187
|
+
? option.yAxis
|
|
188
|
+
: {}
|
|
189
|
+
const baseGrid =
|
|
190
|
+
typeof option.grid === 'object' && !Array.isArray(option.grid)
|
|
191
|
+
? option.grid
|
|
192
|
+
: {}
|
|
193
|
+
const baseTooltip =
|
|
194
|
+
typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)
|
|
195
|
+
? option.tooltip
|
|
196
|
+
: {}
|
|
197
|
+
const baseLegend =
|
|
198
|
+
typeof option.legend === 'object' && !Array.isArray(option.legend)
|
|
199
|
+
? option.legend
|
|
200
|
+
: {}
|
|
201
|
+
|
|
202
|
+
// Reactive (live store) formatter from ctx — distinct from the
|
|
203
|
+
// closure-time `formatter` captured for the structural-build branch
|
|
204
|
+
// above. RelativeData can install a percent formatter on the store
|
|
205
|
+
// after the factory was constructed; the merge phase reads `ctx` to
|
|
206
|
+
// pick that up. `labelFormatter` (Date → string) is structural-only —
|
|
207
|
+
// not relativizable — so the merge branch reads the closure-time value.
|
|
208
|
+
const liveFormatter = ctx?.formatter
|
|
209
|
+
|
|
210
|
+
const { niceMinVal, niceMaxVal } = computeTimeseriesNiceBounds(seriesArr)
|
|
211
|
+
|
|
212
|
+
// Zoom slider layout: when ZoomToggle has installed `dataZoom`, push the
|
|
213
|
+
// slider above the legend (if any) and reserve room in the grid below.
|
|
214
|
+
const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)
|
|
215
|
+
const fallbackBottom =
|
|
216
|
+
typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24
|
|
217
|
+
const baseBottom = hasLegend ? 56 : fallbackBottom
|
|
218
|
+
const gridBottom = dataZoomLayout
|
|
219
|
+
? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap
|
|
220
|
+
: baseBottom
|
|
221
|
+
|
|
222
|
+
// Dim non-selected points via `series.itemStyle.color`. Per-row
|
|
223
|
+
// `itemStyle` on dataset object-rows is silently ignored when
|
|
224
|
+
// `series.encode` is in play.
|
|
225
|
+
//
|
|
226
|
+
// We *always* emit `itemStyle.color` (a passthrough when nothing is
|
|
227
|
+
// selected), not conditionally — dropping the key between renders
|
|
228
|
+
// would let ECharts' default merge keep the previous callback alive
|
|
229
|
+
// and points would stay dimmed forever after an external clear.
|
|
230
|
+
// Always emitting lets normal merge swap the callback in place, no
|
|
231
|
+
// `replaceMerge` and no entry-animation flash on selection on/off.
|
|
232
|
+
const dimItemStyle = {
|
|
233
|
+
color: (params: CallbackDataParams) => {
|
|
234
|
+
const datum = params.value as
|
|
235
|
+
| { name?: Date | number | string }
|
|
236
|
+
| undefined
|
|
237
|
+
const raw = datum?.name
|
|
238
|
+
const base = params.color as string
|
|
239
|
+
if (!selectionSet || raw == null) return base
|
|
240
|
+
return selectionSet.has(normalizeName(raw))
|
|
241
|
+
? base
|
|
242
|
+
: echarts.color.modifyAlpha(base, 0.15)
|
|
243
|
+
},
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return {
|
|
247
|
+
...option,
|
|
248
|
+
dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),
|
|
249
|
+
series: seriesArr.map((_, i) => {
|
|
250
|
+
const template =
|
|
251
|
+
(seriesTemplates[i] as object | undefined) ??
|
|
252
|
+
(broadcastTemplate as object)
|
|
253
|
+
// For line series, set BOTH `series[i].color` (legend swatch +
|
|
254
|
+
// markers) AND `series[i].lineStyle.color` (the line itself) so
|
|
255
|
+
// the override paints everywhere a series has a colour slot.
|
|
256
|
+
const overrideColor = resolveThemeColor(theme, series?.[i]?.color)
|
|
257
|
+
return {
|
|
258
|
+
...(typeof template === 'object' ? template : {}),
|
|
259
|
+
type: 'line' as const,
|
|
260
|
+
datasetIndex: i,
|
|
261
|
+
name: series?.[i]?.name ?? `Series ${i + 1}`,
|
|
262
|
+
encode: { x: 'name', y: 'value' },
|
|
263
|
+
smooth,
|
|
264
|
+
// When a selection is active, surface markers so the per-point
|
|
265
|
+
// color callback has something to dim — a continuous line would
|
|
266
|
+
// hide the visual selection feedback.
|
|
267
|
+
showSymbol: selectionSet != null,
|
|
268
|
+
...(area ? { areaStyle: {} } : {}),
|
|
269
|
+
emphasis: { focus: 'series' },
|
|
270
|
+
itemStyle: dimItemStyle,
|
|
271
|
+
...(overrideColor
|
|
272
|
+
? { color: overrideColor, lineStyle: { color: overrideColor } }
|
|
273
|
+
: {}),
|
|
274
|
+
}
|
|
275
|
+
}),
|
|
276
|
+
legend: { ...baseLegend, show: hasLegend },
|
|
277
|
+
grid: { ...baseGrid, bottom: gridBottom },
|
|
278
|
+
...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),
|
|
279
|
+
yAxis: {
|
|
280
|
+
...baseYAxis,
|
|
281
|
+
min: niceMinVal,
|
|
282
|
+
max: niceMaxVal,
|
|
283
|
+
axisLabel: {
|
|
284
|
+
...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),
|
|
285
|
+
formatter: (value: number) => {
|
|
286
|
+
if (value !== niceMaxVal && value !== niceMinVal) return ''
|
|
287
|
+
if (value === 0) return ''
|
|
288
|
+
return liveFormatter ? liveFormatter(value) : String(value)
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
} as EChartsOption['yAxis'],
|
|
292
|
+
tooltip: {
|
|
293
|
+
...baseTooltip,
|
|
294
|
+
formatter: buildTimeseriesTooltipFormatter(
|
|
295
|
+
liveFormatter,
|
|
296
|
+
labelFormatter,
|
|
297
|
+
),
|
|
298
|
+
},
|
|
299
|
+
} as EChartsOption
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Tooltip formatter for the timeseries `{ name, value }` row shape.
|
|
305
|
+
* `name` arrives as `Date | number | string` (the time-axis stores the
|
|
306
|
+
* raw value the consumer supplied). The consumer's `labelFormatter`
|
|
307
|
+
* expects a `Date`, so we coerce non-Date values via `new Date(...)`
|
|
308
|
+
* before invoking it.
|
|
309
|
+
*/
|
|
310
|
+
function buildTimeseriesTooltipFormatter(
|
|
311
|
+
formatter: ((value: number) => string) | undefined,
|
|
312
|
+
labelFormatter: ((value: Date) => string) | undefined,
|
|
313
|
+
) {
|
|
314
|
+
return createTooltipFormatter((item) => {
|
|
315
|
+
const row = item.value as
|
|
316
|
+
| { name?: Date | number | string; value?: number }
|
|
317
|
+
| undefined
|
|
318
|
+
const raw = row?.value
|
|
319
|
+
const formattedValue =
|
|
320
|
+
typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')
|
|
321
|
+
const marker = typeof item.marker === 'string' ? item.marker : ''
|
|
322
|
+
const seriesName = item.seriesName ? `${item.seriesName}: ` : ''
|
|
323
|
+
const rawName = row?.name ?? item.name
|
|
324
|
+
const name =
|
|
325
|
+
labelFormatter && rawName != null
|
|
326
|
+
? labelFormatter(rawName instanceof Date ? rawName : new Date(rawName))
|
|
327
|
+
: (rawName ?? '')
|
|
328
|
+
return { name: String(name), seriesName, marker, value: formattedValue }
|
|
329
|
+
})
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function computeTimeseriesNiceBounds(seriesArr: TimeseriesWidgetData): {
|
|
333
|
+
niceMinVal: number
|
|
334
|
+
niceMaxVal: number
|
|
335
|
+
} {
|
|
336
|
+
let min = 0
|
|
337
|
+
let max = -Infinity
|
|
338
|
+
for (const series of seriesArr) {
|
|
339
|
+
for (const d of series) {
|
|
340
|
+
if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue
|
|
341
|
+
if (d.value < min) min = d.value
|
|
342
|
+
if (d.value > max) max = d.value
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
const niceMinVal = min < 0 ? niceNum(min) : 0
|
|
346
|
+
const niceMaxVal = max <= 0 ? 1 : niceNum(max)
|
|
347
|
+
return { niceMinVal, niceMaxVal }
|
|
348
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { render } from '@testing-library/react'
|
|
3
|
+
import { TimeseriesSkeleton } from './skeleton'
|
|
4
|
+
|
|
5
|
+
describe('<TimeseriesSkeleton>', () => {
|
|
6
|
+
it('renders without crashing', () => {
|
|
7
|
+
const { container } = render(<TimeseriesSkeleton />)
|
|
8
|
+
expect(container.firstChild).not.toBeNull()
|
|
9
|
+
expect(
|
|
10
|
+
container.querySelectorAll('.MuiSkeleton-root').length,
|
|
11
|
+
).toBeGreaterThan(0)
|
|
12
|
+
})
|
|
13
|
+
})
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Box, Skeleton } from '@mui/material'
|
|
2
|
+
import type { SxProps, Theme } from '@mui/material'
|
|
3
|
+
|
|
4
|
+
const styles = {
|
|
5
|
+
container: {
|
|
6
|
+
display: 'flex',
|
|
7
|
+
flexDirection: 'column',
|
|
8
|
+
justifyContent: 'space-between',
|
|
9
|
+
gap: ({ spacing }) => spacing(1),
|
|
10
|
+
height: ({ spacing }) => spacing(38),
|
|
11
|
+
},
|
|
12
|
+
graph: {
|
|
13
|
+
position: 'relative',
|
|
14
|
+
flex: '1 1 auto',
|
|
15
|
+
width: '100%',
|
|
16
|
+
},
|
|
17
|
+
segmentA: {
|
|
18
|
+
position: 'absolute',
|
|
19
|
+
left: 0,
|
|
20
|
+
right: '70%',
|
|
21
|
+
top: '60%',
|
|
22
|
+
height: 4,
|
|
23
|
+
},
|
|
24
|
+
segmentB: {
|
|
25
|
+
position: 'absolute',
|
|
26
|
+
left: '25%',
|
|
27
|
+
right: '40%',
|
|
28
|
+
top: '35%',
|
|
29
|
+
height: 4,
|
|
30
|
+
},
|
|
31
|
+
segmentC: {
|
|
32
|
+
position: 'absolute',
|
|
33
|
+
left: '55%',
|
|
34
|
+
right: 0,
|
|
35
|
+
top: '50%',
|
|
36
|
+
height: 4,
|
|
37
|
+
},
|
|
38
|
+
legend: {
|
|
39
|
+
display: 'flex',
|
|
40
|
+
alignItems: 'center',
|
|
41
|
+
gap: ({ spacing }) => spacing(2),
|
|
42
|
+
height: ({ spacing }) => spacing(5),
|
|
43
|
+
},
|
|
44
|
+
legendItem: {
|
|
45
|
+
display: 'flex',
|
|
46
|
+
alignItems: 'center',
|
|
47
|
+
gap: ({ spacing }) => spacing(1.5),
|
|
48
|
+
},
|
|
49
|
+
} satisfies Record<string, SxProps<Theme>>
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Loading state for the Timeseries widget. Mirrors a line chart's
|
|
53
|
+
* silhouette — three thin horizontal segments at staggered offsets to
|
|
54
|
+
* suggest a moving line, plus a 2-dot legend stub. Sibling-consistent
|
|
55
|
+
* with Bar / Histogram / Scatter skeletons (column-flex container with
|
|
56
|
+
* legend strip below).
|
|
57
|
+
*/
|
|
58
|
+
export function TimeseriesSkeleton() {
|
|
59
|
+
return (
|
|
60
|
+
<Box sx={styles.container}>
|
|
61
|
+
<Box sx={styles.graph}>
|
|
62
|
+
<Skeleton variant='rectangular' sx={styles.segmentA} />
|
|
63
|
+
<Skeleton variant='rectangular' sx={styles.segmentB} />
|
|
64
|
+
<Skeleton variant='rectangular' sx={styles.segmentC} />
|
|
65
|
+
</Box>
|
|
66
|
+
<Box sx={styles.legend}>
|
|
67
|
+
{[0, 1].map((i) => (
|
|
68
|
+
<Box key={`legend-${i}`} sx={styles.legendItem}>
|
|
69
|
+
<Skeleton variant='circular' width={8} height={8} />
|
|
70
|
+
<Skeleton width={48} height={8} />
|
|
71
|
+
</Box>
|
|
72
|
+
))}
|
|
73
|
+
</Box>
|
|
74
|
+
</Box>
|
|
75
|
+
)
|
|
76
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Theme } from '@mui/material'
|
|
2
|
+
import type { EChartsOption } from 'echarts'
|
|
3
|
+
import type { WidgetSeries } from '../types'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A single point on a time series. `name` is the time coordinate — accepts a
|
|
7
|
+
* Date object, a number (ms-since-epoch), or an ISO-8601 string. ECharts'
|
|
8
|
+
* time axis parses any of these.
|
|
9
|
+
*/
|
|
10
|
+
export interface TimeseriesDatum {
|
|
11
|
+
name: Date | number | string
|
|
12
|
+
value: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Timeseries widget data — one array of points per series. */
|
|
16
|
+
export type TimeseriesWidgetData = readonly (readonly TimeseriesDatum[])[]
|
|
17
|
+
|
|
18
|
+
/** Inputs to the structural-only {@link timeseriesOptions} builder. */
|
|
19
|
+
export interface TimeseriesOptionsInput {
|
|
20
|
+
theme: Theme
|
|
21
|
+
formatter?: (value: number) => string
|
|
22
|
+
/** Optional formatter for the time-axis tick labels. Receives a JS Date. */
|
|
23
|
+
labelFormatter?: (value: Date) => string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Combined inputs for the timeseries option factory creator. Carries
|
|
28
|
+
* everything the widget needs across BOTH phases — the structural-build
|
|
29
|
+
* (`theme`, `formatter`, `labelFormatter`, `optionsOverride`) AND the
|
|
30
|
+
* data merge (`series`, `smooth`, `area`, `selection`).
|
|
31
|
+
*/
|
|
32
|
+
export interface TimeseriesOptionFactoryInput {
|
|
33
|
+
theme: Theme
|
|
34
|
+
formatter?: (value: number) => string
|
|
35
|
+
/**
|
|
36
|
+
* Time-axis label formatter (also used in the tooltip name). Receives
|
|
37
|
+
* a JS Date — applied both at structural-build time (x-axis ticks) and
|
|
38
|
+
* at fusion time (tooltip name) so the date-aware labeling survives
|
|
39
|
+
* RelativeData's reactive formatter swaps.
|
|
40
|
+
*/
|
|
41
|
+
labelFormatter?: (value: Date) => string
|
|
42
|
+
/**
|
|
43
|
+
* Per-series metadata — drives the legend, `series[i].name`, and
|
|
44
|
+
* (when `color` is set) per-series line + marker colour overrides.
|
|
45
|
+
*/
|
|
46
|
+
series?: readonly WidgetSeries[]
|
|
47
|
+
/** Smooth lines (default `true`). */
|
|
48
|
+
smooth?: boolean
|
|
49
|
+
/** Filled area below each line (default `false`). */
|
|
50
|
+
area?: boolean
|
|
51
|
+
/**
|
|
52
|
+
* Selected point keys (matched against `TimeseriesDatum.name`; `Date`
|
|
53
|
+
* names are normalized to ms-since-epoch). Points not in this list render
|
|
54
|
+
* dimmed (`itemStyle.opacity: 0.15`). `null`/empty means no selection.
|
|
55
|
+
*/
|
|
56
|
+
selection?: readonly (string | number)[] | null
|
|
57
|
+
/**
|
|
58
|
+
* Consumer-supplied partial option merged into the structural option at
|
|
59
|
+
* structural-build time. Lets stories override pieces of the theme-aware
|
|
60
|
+
* base without forking the structural builder.
|
|
61
|
+
*/
|
|
62
|
+
optionsOverride?: Partial<EChartsOption>
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type TimeseriesEChartsOption = EChartsOption
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SxProps, Theme } from '@mui/material'
|
|
2
|
+
|
|
3
|
+
export const styles = {
|
|
4
|
+
root: {
|
|
5
|
+
display: 'flex',
|
|
6
|
+
alignItems: 'center',
|
|
7
|
+
gap: 0.25,
|
|
8
|
+
width: 'fit-content',
|
|
9
|
+
borderRadius: 0.5,
|
|
10
|
+
gridColumn: 2,
|
|
11
|
+
height: 'fit-content',
|
|
12
|
+
},
|
|
13
|
+
preview: {
|
|
14
|
+
display: 'flex',
|
|
15
|
+
alignItems: 'center',
|
|
16
|
+
gap: 0.25,
|
|
17
|
+
},
|
|
18
|
+
triggerActive: {
|
|
19
|
+
bgcolor: 'primary.relatedLight',
|
|
20
|
+
},
|
|
21
|
+
paper: {
|
|
22
|
+
// Positioning is handled by Popper; only visual styles here.
|
|
23
|
+
display: 'flex',
|
|
24
|
+
alignItems: 'center',
|
|
25
|
+
gap: 0.25,
|
|
26
|
+
px: 0.25,
|
|
27
|
+
py: 0.25,
|
|
28
|
+
mx: 0.25,
|
|
29
|
+
mt: `0 !important`, // Popper's placement adds a margin-top to offset from the trigger; we want to override that.
|
|
30
|
+
bgcolor: 'background.paper',
|
|
31
|
+
borderRadius: 0.5,
|
|
32
|
+
},
|
|
33
|
+
} satisfies Record<string, SxProps<Theme>>
|