@carto/ps-react-ui 4.7.0 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/merge-options-DCkkHZIf.js +34 -0
- package/dist/merge-options-DCkkHZIf.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-DsqTjSpg.js +186 -0
- package/dist/range-DsqTjSpg.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-HIpXuq4G.js +390 -0
- package/dist/table-HIpXuq4G.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 +41 -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 +49 -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 +40 -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 +47 -0
- package/dist/types/widgets-v2/index.d.ts +107 -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 +50 -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 +19 -0
- package/dist/types/widgets-v2/range/range.d.ts +19 -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 +50 -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 +44 -0
- package/dist/types/widgets-v2/table/table-ui.d.ts +38 -0
- package/dist/types/widgets-v2/table/table.d.ts +50 -0
- package/dist/types/widgets-v2/table/types.d.ts +37 -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 +56 -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/utils/data-zoom-layout.d.ts +11 -0
- package/dist/types/widgets-v2/utils/index.d.ts +2 -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/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/actions.js +688 -668
- package/dist/widgets/actions.js.map +1 -1
- package/dist/widgets/bar.js +14 -13
- package/dist/widgets/bar.js.map +1 -1
- package/dist/widgets/histogram.js +38 -37
- 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 +327 -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 +350 -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 +381 -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 +405 -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 +352 -0
- package/dist/widgets-v2/timeseries.js.map +1 -0
- package/dist/widgets-v2/utils.js +7 -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 +73 -5
- 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-overlay.tsx +24 -2
- 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/histogram/config.ts +1 -3
- 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 +317 -0
- package/src/widgets-v2/bar/options.ts +326 -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 +46 -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 +54 -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 +44 -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 +304 -0
- package/src/widgets-v2/histogram/options.ts +337 -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 +51 -0
- package/src/widgets-v2/index.ts +201 -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 +585 -0
- package/src/widgets-v2/pie/options.ts +509 -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 +55 -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 +130 -0
- package/src/widgets-v2/range/range-ui.tsx +211 -0
- package/src/widgets-v2/range/range.test.tsx +68 -0
- package/src/widgets-v2/range/range.tsx +46 -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 +399 -0
- package/src/widgets-v2/scatterplot/options.ts +421 -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 +55 -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 +46 -0
- package/src/widgets-v2/table/table-ui.test.tsx +200 -0
- package/src/widgets-v2/table/table-ui.tsx +331 -0
- package/src/widgets-v2/table/table.test.tsx +119 -0
- package/src/widgets-v2/table/table.tsx +174 -0
- package/src/widgets-v2/table/types.ts +44 -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 +379 -0
- package/src/widgets-v2/timeseries/options.ts +341 -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 +61 -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/utils/data-zoom-layout.ts +26 -0
- package/src/widgets-v2/utils/index.ts +2 -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/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,150 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react'
|
|
2
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
3
|
+
import { fireEvent, render, screen } from '@testing-library/react'
|
|
4
|
+
import { Provider } from '../../provider/widget-provider'
|
|
5
|
+
import { clearAllWidgetStores, getWidgetStore } from '../../stores'
|
|
6
|
+
import { FullScreen } from './fullscreen'
|
|
7
|
+
import type { FullScreenWidgetState } from './types'
|
|
8
|
+
|
|
9
|
+
beforeEach(() => clearAllWidgetStores())
|
|
10
|
+
afterEach(() => clearAllWidgetStores())
|
|
11
|
+
|
|
12
|
+
describe('<FullScreen.Trigger> — store toggle', () => {
|
|
13
|
+
it('does not surface isFullScreen on the base WidgetState until the trigger fires', () => {
|
|
14
|
+
render(
|
|
15
|
+
<Provider id='fs1' data={[]}>
|
|
16
|
+
<FullScreen.Trigger />
|
|
17
|
+
</Provider>,
|
|
18
|
+
)
|
|
19
|
+
const state = getWidgetStore('fs1').getState()
|
|
20
|
+
expect((state as FullScreenWidgetState).isFullScreen).toBeUndefined()
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('toggles state on click and swaps the trigger label', () => {
|
|
24
|
+
render(
|
|
25
|
+
<Provider id='fs2' data={[]}>
|
|
26
|
+
<FullScreen.Trigger labels={{ open: 'Expand', close: 'Shrink' }} />
|
|
27
|
+
</Provider>,
|
|
28
|
+
)
|
|
29
|
+
fireEvent.click(screen.getByLabelText('Expand'))
|
|
30
|
+
expect(screen.getByLabelText('Shrink')).toBeTruthy()
|
|
31
|
+
expect(
|
|
32
|
+
(getWidgetStore('fs2').getState() as FullScreenWidgetState).isFullScreen,
|
|
33
|
+
).toBe(true)
|
|
34
|
+
fireEvent.click(screen.getByLabelText('Shrink'))
|
|
35
|
+
expect(screen.getByLabelText('Expand')).toBeTruthy()
|
|
36
|
+
expect(
|
|
37
|
+
(getWidgetStore('fs2').getState() as FullScreenWidgetState).isFullScreen,
|
|
38
|
+
).toBe(false)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('keepAlive remount restores isFullScreen', () => {
|
|
42
|
+
const { unmount } = render(
|
|
43
|
+
<Provider id='fs3' data={[]} keepAlive>
|
|
44
|
+
<FullScreen.Trigger labels={{ open: 'Maximise' }} />
|
|
45
|
+
</Provider>,
|
|
46
|
+
)
|
|
47
|
+
fireEvent.click(screen.getByLabelText('Maximise'))
|
|
48
|
+
expect(
|
|
49
|
+
(getWidgetStore('fs3').getState() as FullScreenWidgetState).isFullScreen,
|
|
50
|
+
).toBe(true)
|
|
51
|
+
unmount()
|
|
52
|
+
render(
|
|
53
|
+
<Provider id='fs3' data={[]} keepAlive>
|
|
54
|
+
<FullScreen.Trigger labels={{ open: 'Maximise' }} />
|
|
55
|
+
</Provider>,
|
|
56
|
+
)
|
|
57
|
+
expect(
|
|
58
|
+
(getWidgetStore('fs3').getState() as FullScreenWidgetState).isFullScreen,
|
|
59
|
+
).toBe(true)
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
describe('<FullScreen.Slot> — render-prop body + portal', () => {
|
|
64
|
+
it('passes the live isFullScreen flag to the render prop', () => {
|
|
65
|
+
let received: boolean | undefined
|
|
66
|
+
render(
|
|
67
|
+
<Provider id='fs-rp' data={[]}>
|
|
68
|
+
<FullScreen.Trigger />
|
|
69
|
+
<FullScreen.Slot>
|
|
70
|
+
{(isFullScreen) => {
|
|
71
|
+
received = isFullScreen
|
|
72
|
+
return <span data-testid='body'>body</span>
|
|
73
|
+
}}
|
|
74
|
+
</FullScreen.Slot>
|
|
75
|
+
</Provider>,
|
|
76
|
+
)
|
|
77
|
+
expect(received).toBe(false)
|
|
78
|
+
fireEvent.click(screen.getByLabelText('Open in full screen'))
|
|
79
|
+
expect(received).toBe(true)
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
it('renders the title above the body when open', async () => {
|
|
83
|
+
render(
|
|
84
|
+
<Provider id='fs-title' data={[]}>
|
|
85
|
+
<FullScreen.Trigger />
|
|
86
|
+
<FullScreen.Slot title='Sales by region'>
|
|
87
|
+
{() => <div>body</div>}
|
|
88
|
+
</FullScreen.Slot>
|
|
89
|
+
</Provider>,
|
|
90
|
+
)
|
|
91
|
+
fireEvent.click(screen.getByLabelText('Open in full screen'))
|
|
92
|
+
expect(await screen.findByText('Sales by region')).toBeTruthy()
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('still renders the close button when no title is given', async () => {
|
|
96
|
+
render(
|
|
97
|
+
<Provider id='fs-no-title' data={[]}>
|
|
98
|
+
<FullScreen.Trigger />
|
|
99
|
+
<FullScreen.Slot>{() => <div>body</div>}</FullScreen.Slot>
|
|
100
|
+
</Provider>,
|
|
101
|
+
)
|
|
102
|
+
fireEvent.click(screen.getByLabelText('Open in full screen'))
|
|
103
|
+
const closes = await screen.findAllByLabelText('Exit full screen')
|
|
104
|
+
expect(closes.length).toBeGreaterThan(0)
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it('keeps the same DOM node across the fullscreen toggle (portal reparent)', () => {
|
|
108
|
+
render(
|
|
109
|
+
<Provider id='fs-reparent' data={[]}>
|
|
110
|
+
<FullScreen.Trigger />
|
|
111
|
+
<FullScreen.Slot title='X'>
|
|
112
|
+
{() => <span data-testid='inner'>inner</span>}
|
|
113
|
+
</FullScreen.Slot>
|
|
114
|
+
</Provider>,
|
|
115
|
+
)
|
|
116
|
+
const before = screen.getByTestId('inner')
|
|
117
|
+
fireEvent.click(screen.getByLabelText('Open in full screen'))
|
|
118
|
+
const after = screen.getByTestId('inner')
|
|
119
|
+
expect(after).toBe(before)
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
it('mounts the body exactly once across multiple fullscreen toggles', () => {
|
|
123
|
+
let mountCount = 0
|
|
124
|
+
function CountingChild() {
|
|
125
|
+
const counted = useRef(false)
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
if (counted.current) return
|
|
128
|
+
counted.current = true
|
|
129
|
+
mountCount += 1
|
|
130
|
+
}, [])
|
|
131
|
+
return <div data-testid='counter'>x</div>
|
|
132
|
+
}
|
|
133
|
+
// Distinct labels for the trigger so its "close" aria-label can't collide
|
|
134
|
+
// with the modal's own close button (also "Exit full screen" by default
|
|
135
|
+
// when keepMounted=true keeps the modal in DOM).
|
|
136
|
+
render(
|
|
137
|
+
<Provider id='fs-mount-once' data={[]}>
|
|
138
|
+
<FullScreen.Trigger labels={{ open: 'OpenT', close: 'CloseT' }} />
|
|
139
|
+
<FullScreen.Slot title='Z'>{() => <CountingChild />}</FullScreen.Slot>
|
|
140
|
+
</Provider>,
|
|
141
|
+
)
|
|
142
|
+
expect(mountCount).toBe(1)
|
|
143
|
+
fireEvent.click(screen.getByLabelText('OpenT'))
|
|
144
|
+
expect(mountCount).toBe(1)
|
|
145
|
+
fireEvent.click(screen.getByLabelText('CloseT'))
|
|
146
|
+
expect(mountCount).toBe(1)
|
|
147
|
+
fireEvent.click(screen.getByLabelText('OpenT'))
|
|
148
|
+
expect(mountCount).toBe(1)
|
|
149
|
+
})
|
|
150
|
+
})
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useCallback,
|
|
3
|
+
useLayoutEffect,
|
|
4
|
+
useState,
|
|
5
|
+
type ComponentType,
|
|
6
|
+
type ReactNode,
|
|
7
|
+
} from 'react'
|
|
8
|
+
import { createPortal } from 'react-dom'
|
|
9
|
+
import {
|
|
10
|
+
Box,
|
|
11
|
+
Dialog,
|
|
12
|
+
DialogContent,
|
|
13
|
+
DialogTitle,
|
|
14
|
+
IconButton,
|
|
15
|
+
Typography,
|
|
16
|
+
type SvgIconProps,
|
|
17
|
+
} from '@mui/material'
|
|
18
|
+
import FullscreenIcon from '@mui/icons-material/Fullscreen'
|
|
19
|
+
import FullscreenExitIcon from '@mui/icons-material/FullscreenExit'
|
|
20
|
+
import CloseIcon from '@mui/icons-material/Close'
|
|
21
|
+
import { Tooltip } from '../../../components'
|
|
22
|
+
import { getWidgetStore, useWidget, useWidgetId } from '../../stores'
|
|
23
|
+
import { DEFAULT_FULLSCREEN_LABELS, type FullScreenLabels } from './labels'
|
|
24
|
+
import type { FullScreenWidgetState } from './types'
|
|
25
|
+
import { styles } from './style'
|
|
26
|
+
|
|
27
|
+
export interface FullScreenTriggerProps {
|
|
28
|
+
labels?: Partial<FullScreenLabels>
|
|
29
|
+
enterIcon?: ComponentType<SvgIconProps>
|
|
30
|
+
exitIcon?: ComponentType<SvgIconProps>
|
|
31
|
+
iconProps?: SvgIconProps
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface FullScreenSlotProps {
|
|
35
|
+
/**
|
|
36
|
+
* Render-prop body. Receives the live `isFullScreen` flag so the consumer
|
|
37
|
+
* can branch per-mode props (e.g., `Widget.Toolbox visibleCount`) without
|
|
38
|
+
* duplicating the JSX.
|
|
39
|
+
*/
|
|
40
|
+
children: (isFullScreen: boolean) => ReactNode
|
|
41
|
+
/** Header text rendered above the body when the modal is open. */
|
|
42
|
+
title?: ReactNode
|
|
43
|
+
labels?: Partial<FullScreenLabels>
|
|
44
|
+
closeIcon?: ComponentType<SvgIconProps>
|
|
45
|
+
iconProps?: SvgIconProps
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Toggle button placed inside `<Widget.Actions>`. Reads / writes
|
|
50
|
+
* {@link FullScreenWidgetState.isFullScreen} on the per-widget store. The
|
|
51
|
+
* matching modal is rendered by {@link FullScreenSlot} (typically inside
|
|
52
|
+
* `<Widget.Content>`).
|
|
53
|
+
*/
|
|
54
|
+
function FullScreenTrigger({
|
|
55
|
+
labels,
|
|
56
|
+
enterIcon: EnterIcon = FullscreenIcon,
|
|
57
|
+
exitIcon: ExitIcon = FullscreenExitIcon,
|
|
58
|
+
iconProps,
|
|
59
|
+
}: FullScreenTriggerProps) {
|
|
60
|
+
const id = useWidgetId()
|
|
61
|
+
const _labels = { ...DEFAULT_FULLSCREEN_LABELS, ...labels }
|
|
62
|
+
const open = useWidget<boolean, FullScreenWidgetState>(
|
|
63
|
+
id,
|
|
64
|
+
(s) => s.isFullScreen ?? false,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
const handleToggle = useCallback(() => {
|
|
68
|
+
getWidgetStore(id).setState({
|
|
69
|
+
isFullScreen: !open,
|
|
70
|
+
} as Partial<FullScreenWidgetState>)
|
|
71
|
+
}, [id, open])
|
|
72
|
+
|
|
73
|
+
const triggerLabel = open ? _labels.close : _labels.open
|
|
74
|
+
const TriggerIcon = open ? ExitIcon : EnterIcon
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<Tooltip title={triggerLabel}>
|
|
78
|
+
<IconButton
|
|
79
|
+
size='small'
|
|
80
|
+
aria-label={triggerLabel}
|
|
81
|
+
aria-pressed={open}
|
|
82
|
+
onClick={handleToggle}
|
|
83
|
+
className={open ? 'active' : undefined}
|
|
84
|
+
sx={{ ...styles.trigger, ...(open && styles.triggerActive) }}
|
|
85
|
+
>
|
|
86
|
+
<TriggerIcon fontSize='small' {...iconProps} />
|
|
87
|
+
</IconButton>
|
|
88
|
+
</Tooltip>
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Body wrapper. Renders its render-prop children once, via a single
|
|
94
|
+
* `createPortal` call whose container is a stable `<div>` we hold as a ref.
|
|
95
|
+
* That div is moved imperatively between an inline placeholder and the
|
|
96
|
+
* `<DialogContent>` of an MUI `<Dialog keepMounted>`. Because both the
|
|
97
|
+
* React parent (the portal call site) AND the portal container are
|
|
98
|
+
* identical across the toggle, the subtree keeps its fiber identity and
|
|
99
|
+
* ECharts (or any other heavy child) stays mounted while only its DOM
|
|
100
|
+
* parent changes.
|
|
101
|
+
*/
|
|
102
|
+
function FullScreenSlot({
|
|
103
|
+
children,
|
|
104
|
+
title,
|
|
105
|
+
labels,
|
|
106
|
+
closeIcon: CloseSvg = CloseIcon,
|
|
107
|
+
iconProps,
|
|
108
|
+
}: FullScreenSlotProps) {
|
|
109
|
+
const id = useWidgetId()
|
|
110
|
+
const _labels = { ...DEFAULT_FULLSCREEN_LABELS, ...labels }
|
|
111
|
+
const open = useWidget<boolean, FullScreenWidgetState>(
|
|
112
|
+
id,
|
|
113
|
+
(s) => s.isFullScreen ?? false,
|
|
114
|
+
)
|
|
115
|
+
const [inlineEl, setInlineEl] = useState<HTMLElement | null>(null)
|
|
116
|
+
const [dialogEl, setDialogEl] = useState<HTMLElement | null>(null)
|
|
117
|
+
// Stable, never-changing portal container created once per slot. Held in
|
|
118
|
+
// state (not a ref) so the React Compiler is happy reading it during
|
|
119
|
+
// render — it's immutable from React's perspective, only its DOM parent
|
|
120
|
+
// changes via `appendChild`. Switching `createPortal`'s `container`
|
|
121
|
+
// argument makes React unmount and remount the children, defeating the
|
|
122
|
+
// single-mount goal; keeping the container identical and moving the div
|
|
123
|
+
// imperatively avoids that.
|
|
124
|
+
const [portalDiv] = useState<HTMLDivElement | null>(() => {
|
|
125
|
+
if (typeof document === 'undefined') return null
|
|
126
|
+
const div = document.createElement('div')
|
|
127
|
+
// `display: contents` keeps the wrapper transparent in flow so it
|
|
128
|
+
// doesn't introduce a stray block when nested inside the inline slot.
|
|
129
|
+
div.style.display = 'contents'
|
|
130
|
+
return div
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
const handleClose = useCallback(() => {
|
|
134
|
+
getWidgetStore(id).setState({
|
|
135
|
+
isFullScreen: false,
|
|
136
|
+
} as Partial<FullScreenWidgetState>)
|
|
137
|
+
}, [id])
|
|
138
|
+
|
|
139
|
+
// Reparent the portal div into the active host whenever `open` (or either
|
|
140
|
+
// host) changes. `useLayoutEffect` runs synchronously after commit (after
|
|
141
|
+
// refs have been written), so the dialog ref is already live when we read
|
|
142
|
+
// it.
|
|
143
|
+
//
|
|
144
|
+
// Anti-blink: pin a `min-height` on the inline shell that's always live —
|
|
145
|
+
// not just while fullscreen is open. We re-measure whenever the body is
|
|
146
|
+
// inline (open=false) so the lock tracks data-driven height changes
|
|
147
|
+
// (Formula adding rows, Table growing, ECharts re-init…) and survives
|
|
148
|
+
// every fullscreen toggle. Briefly clearing minHeight before the measure
|
|
149
|
+
// lets the lock shrink as well as grow; both operations are synchronous
|
|
150
|
+
// within useLayoutEffect, so the browser never paints the intermediate
|
|
151
|
+
// "no lock" frame.
|
|
152
|
+
useLayoutEffect(() => {
|
|
153
|
+
if (!portalDiv || !inlineEl) return
|
|
154
|
+
const host = open ? dialogEl : inlineEl
|
|
155
|
+
if (host && portalDiv.parentNode !== host) {
|
|
156
|
+
host.appendChild(portalDiv)
|
|
157
|
+
}
|
|
158
|
+
if (!open) refreshInlineHeightLock(inlineEl)
|
|
159
|
+
}, [open, inlineEl, dialogEl, portalDiv])
|
|
160
|
+
|
|
161
|
+
const titleId = `widget-fullscreen-title-${id}`
|
|
162
|
+
const rendered = children(open)
|
|
163
|
+
|
|
164
|
+
return (
|
|
165
|
+
<>
|
|
166
|
+
<Box ref={setInlineEl} sx={styles.inlineSlot} />
|
|
167
|
+
{portalDiv ? createPortal(rendered, portalDiv) : null}
|
|
168
|
+
<Dialog
|
|
169
|
+
open={open}
|
|
170
|
+
onClose={handleClose}
|
|
171
|
+
PaperProps={{ sx: styles.dialogPaper }}
|
|
172
|
+
aria-labelledby={titleId}
|
|
173
|
+
// Sits above the Toolbox overflow Paper (zIndex.tooltip = 1500),
|
|
174
|
+
// so opening fullscreen never leaves a stray popover floating on top.
|
|
175
|
+
sx={{ zIndex: (theme) => theme.zIndex.tooltip + 1 }}
|
|
176
|
+
>
|
|
177
|
+
<DialogTitle id={titleId} component='div' sx={styles.dialogTitle}>
|
|
178
|
+
<Typography
|
|
179
|
+
variant='subtitle1'
|
|
180
|
+
component='span'
|
|
181
|
+
sx={styles.titleText}
|
|
182
|
+
>
|
|
183
|
+
{title}
|
|
184
|
+
</Typography>
|
|
185
|
+
<Tooltip title={_labels.close}>
|
|
186
|
+
<IconButton
|
|
187
|
+
size='medium'
|
|
188
|
+
aria-label={_labels.close}
|
|
189
|
+
onClick={handleClose}
|
|
190
|
+
>
|
|
191
|
+
<CloseSvg fontSize='small' {...iconProps} />
|
|
192
|
+
</IconButton>
|
|
193
|
+
</Tooltip>
|
|
194
|
+
</DialogTitle>
|
|
195
|
+
<DialogContent ref={setDialogEl} sx={styles.dialogContent} />
|
|
196
|
+
</Dialog>
|
|
197
|
+
</>
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Briefly clear the inline shell's `min-height`, measure its natural
|
|
203
|
+
* height, then re-pin. Lives outside the component so the React Compiler
|
|
204
|
+
* doesn't see the DOM mutation as an attempt to modify a `useState` value
|
|
205
|
+
* — `el` here is just a parameter, not a tracked store value.
|
|
206
|
+
*/
|
|
207
|
+
function refreshInlineHeightLock(el: HTMLElement): void {
|
|
208
|
+
el.style.minHeight = ''
|
|
209
|
+
const h = el.getBoundingClientRect().height
|
|
210
|
+
if (h > 0) el.style.minHeight = `${h}px`
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Namespace export. Consumers compose with:
|
|
215
|
+
*
|
|
216
|
+
* ```tsx
|
|
217
|
+
* <Widget.Actions>
|
|
218
|
+
* <Widget.FullScreen.Trigger />
|
|
219
|
+
* </Widget.Actions>
|
|
220
|
+
* <Widget.Content>
|
|
221
|
+
* <Widget.FullScreen.Slot title={title}>
|
|
222
|
+
* {(isFullScreen) => <Body visibleCount={isFullScreen ? undefined : 2} />}
|
|
223
|
+
* </Widget.FullScreen.Slot>
|
|
224
|
+
* </Widget.Content>
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
export const FullScreen = {
|
|
228
|
+
Trigger: FullScreenTrigger,
|
|
229
|
+
Slot: FullScreenSlot,
|
|
230
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { SxProps, Theme } from '@mui/material'
|
|
2
|
+
|
|
3
|
+
export const styles = {
|
|
4
|
+
// Inline shell where the portaled body lives when fullscreen is closed.
|
|
5
|
+
// Real flex-column box (not `display: contents`) so that:
|
|
6
|
+
// 1. when the body is moved into the modal, we can pin a `min-height`
|
|
7
|
+
// to keep the widget card from collapsing — the inline shell is
|
|
8
|
+
// empty for that interval, and a layout-less wrapper would make
|
|
9
|
+
// the card squish a frame before the modal covers it (visible
|
|
10
|
+
// blink).
|
|
11
|
+
// 2. nested `flex: 1` (e.g. Widget.State's CaptureBox) still grows —
|
|
12
|
+
// this shell preserves the column-flex inheritance it would have
|
|
13
|
+
// had directly under `Widget.Content`.
|
|
14
|
+
// `gap: 1` mirrors `Widget.Content`'s gap so the body's siblings
|
|
15
|
+
// (Subheader / capture box / note) keep their spacing.
|
|
16
|
+
inlineSlot: {
|
|
17
|
+
display: 'flex',
|
|
18
|
+
flexDirection: 'column',
|
|
19
|
+
flex: 1,
|
|
20
|
+
minHeight: 0,
|
|
21
|
+
gap: 1,
|
|
22
|
+
},
|
|
23
|
+
trigger: {
|
|
24
|
+
p: 0.5,
|
|
25
|
+
'& .MuiSvgIcon-root': { fontSize: 20 },
|
|
26
|
+
},
|
|
27
|
+
triggerActive: {
|
|
28
|
+
background: (theme: Theme) => theme.palette.primary.relatedLight,
|
|
29
|
+
},
|
|
30
|
+
dialogPaper: {
|
|
31
|
+
width: '90vw',
|
|
32
|
+
height: '90vh',
|
|
33
|
+
maxWidth: 'none',
|
|
34
|
+
maxHeight: 'none',
|
|
35
|
+
},
|
|
36
|
+
dialogTitle: {
|
|
37
|
+
display: 'flex',
|
|
38
|
+
alignItems: 'center',
|
|
39
|
+
justifyContent: 'space-between',
|
|
40
|
+
gap: 1,
|
|
41
|
+
py: 3,
|
|
42
|
+
pr: 3,
|
|
43
|
+
pb: 2,
|
|
44
|
+
},
|
|
45
|
+
titleText: {
|
|
46
|
+
minWidth: 0,
|
|
47
|
+
overflow: 'hidden',
|
|
48
|
+
textOverflow: 'ellipsis',
|
|
49
|
+
whiteSpace: 'nowrap',
|
|
50
|
+
},
|
|
51
|
+
dialogContent: {
|
|
52
|
+
display: 'flex',
|
|
53
|
+
flexDirection: 'column',
|
|
54
|
+
gap: 1,
|
|
55
|
+
py: 3,
|
|
56
|
+
px: 2.5,
|
|
57
|
+
overflow: 'auto',
|
|
58
|
+
},
|
|
59
|
+
} satisfies Record<string, SxProps<Theme>>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { WidgetState } from '../../stores'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* State extension owned by FullScreen. The base `WidgetState` deliberately
|
|
5
|
+
* stays free of widget-specific UI flags (R12 from the round-5 amendment);
|
|
6
|
+
* actions that need persistent UI state declare it here and read it via the
|
|
7
|
+
* generic `useWidget<T, S>(id, sel)` form.
|
|
8
|
+
*
|
|
9
|
+
* `isFullScreen` survives `keepAlive` remounts because it lives on the same
|
|
10
|
+
* store the rest of `WidgetState` does — a kept-alive widget that was
|
|
11
|
+
* fullscreen reopens fullscreen automatically.
|
|
12
|
+
*/
|
|
13
|
+
export interface FullScreenWidgetState extends WidgetState {
|
|
14
|
+
isFullScreen: boolean
|
|
15
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export {
|
|
2
|
+
Searcher,
|
|
3
|
+
SearcherToggle,
|
|
4
|
+
setSearcherText,
|
|
5
|
+
filterBySearchText,
|
|
6
|
+
DEFAULT_SEARCHER_LABELS,
|
|
7
|
+
type SearcherProps,
|
|
8
|
+
type SearcherToggleProps,
|
|
9
|
+
type SearcherLabels,
|
|
10
|
+
} from './searcher'
|
|
11
|
+
export {
|
|
12
|
+
StackToggle,
|
|
13
|
+
addStack,
|
|
14
|
+
DEFAULT_STACK_TOGGLE_LABELS,
|
|
15
|
+
type StackToggleProps,
|
|
16
|
+
type StackToggleLabels,
|
|
17
|
+
} from './stack-toggle'
|
|
18
|
+
export {
|
|
19
|
+
ZoomToggle,
|
|
20
|
+
addZoom,
|
|
21
|
+
createAddZoom,
|
|
22
|
+
ZOOM_LAYOUT,
|
|
23
|
+
DEFAULT_ZOOM_TOGGLE_LABELS,
|
|
24
|
+
type ZoomToggleProps,
|
|
25
|
+
type ZoomToggleLabels,
|
|
26
|
+
} from './zoom-toggle'
|
|
27
|
+
export {
|
|
28
|
+
BrushToggle,
|
|
29
|
+
addBrush,
|
|
30
|
+
DEFAULT_BRUSH_TOGGLE_LABELS,
|
|
31
|
+
type BrushToggleProps,
|
|
32
|
+
type BrushToggleLabels,
|
|
33
|
+
} from './brush-toggle'
|
|
34
|
+
export {
|
|
35
|
+
RelativeData,
|
|
36
|
+
toRelativeData,
|
|
37
|
+
createPercentFormatter,
|
|
38
|
+
DEFAULT_RELATIVE_DATA_LABELS,
|
|
39
|
+
type RelativeDataProps,
|
|
40
|
+
type RelativeDataLabels,
|
|
41
|
+
} from './relative-data'
|
|
42
|
+
export {
|
|
43
|
+
Download,
|
|
44
|
+
downloadToCSV,
|
|
45
|
+
downloadDOMToPNG,
|
|
46
|
+
toCsvString,
|
|
47
|
+
triggerLinkDownload,
|
|
48
|
+
buildPngDownloadItem,
|
|
49
|
+
CSVIcon,
|
|
50
|
+
PNGIcon,
|
|
51
|
+
DEFAULT_DOWNLOAD_LABELS,
|
|
52
|
+
type DownloadProps,
|
|
53
|
+
type DownloadItem,
|
|
54
|
+
type DownloadHandle,
|
|
55
|
+
type DownloadDOMToPNGOptions,
|
|
56
|
+
type BuildPngDownloadItemArgs,
|
|
57
|
+
type DownloadLabels,
|
|
58
|
+
} from './download'
|
|
59
|
+
export {
|
|
60
|
+
FullScreen,
|
|
61
|
+
DEFAULT_FULLSCREEN_LABELS,
|
|
62
|
+
type FullScreenTriggerProps,
|
|
63
|
+
type FullScreenSlotProps,
|
|
64
|
+
type FullScreenLabels,
|
|
65
|
+
type FullScreenWidgetState,
|
|
66
|
+
} from './fullscreen'
|
|
67
|
+
export {
|
|
68
|
+
LockSelection,
|
|
69
|
+
filterByLockedItems,
|
|
70
|
+
DEFAULT_LOCK_SELECTION_LABELS,
|
|
71
|
+
type LockSelectionProps,
|
|
72
|
+
type LockSelectionKey,
|
|
73
|
+
type LockSelectionLabels,
|
|
74
|
+
} from './lock-selection'
|
|
75
|
+
export {
|
|
76
|
+
ChangeColumn,
|
|
77
|
+
DEFAULT_CHANGE_COLUMN_LABELS,
|
|
78
|
+
type ChangeColumnProps,
|
|
79
|
+
type ChangeColumnItem,
|
|
80
|
+
type ChangeColumnLabels,
|
|
81
|
+
type ChangeColumnWidgetState,
|
|
82
|
+
} from './change-column'
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface LockSelectionLabels {
|
|
2
|
+
lock: string
|
|
3
|
+
unlock: string
|
|
4
|
+
disabled: string
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export const DEFAULT_LOCK_SELECTION_LABELS: LockSelectionLabels = {
|
|
8
|
+
lock: 'Lock selection',
|
|
9
|
+
unlock: 'Unlock selection',
|
|
10
|
+
disabled: 'Select rows to lock',
|
|
11
|
+
}
|