From 493df5c8088ad5f863427c757b9d6437d98266b9 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Thu, 16 Apr 2020 23:24:01 -0700 Subject: [PATCH] feat: migrate xy-chart to use encodable (#438) * feat: migrate xy-chart to use encodable (#420) * feat: use encodable in BoxPlot * feat: migrate legend * docs: update storybook * fix: label overlap * fix: lint * fix: remove comments * fix: path * feat: migrate scatterplot to use encodable (#421) * feat: migrate scatter plot (cherry picked from commit 0d607a60cdab8037ece7f29a74bef1c0a5432c5d) * fix: legend * feat: migrate line chart to use encodable (#427) * feat: migrate line to use encodable * fix: storybook ts * fix: remove comment * refactor: delete deprecated files (#430) * refactor: delete outdated files * feat: update index exports and add test * refactor: delete more files * fix: import order * fix: update dependency * fix: update dependency * build: fix babel * fix: remvoe comments * fix: babel * refactor: move files (#432) * refactor: move files * refactor: move files * fix: small issues with charts post-migration (#433) * fix: scatterplot issue * fix: bump encodable and fix time scale nicing * fix: issue with label rotation * refactor: remove deep import * fix: demo import * feat: bump and remove unnecessary dependencies (#436) * feat: bump dependencies * feat: remove unnecessary dependencies --- .../plugins/superset-ui-plugins/.gitignore | 1 - .../superset-ui-plugins/babel.config.js | 24 + .../plugins/superset-ui-plugins/package.json | 23 +- .../package.json | 2 +- .../src/chart/Encoder.ts | 3 +- .../src/chart/WordCloud.tsx | 2 +- .../BoxPlot/{data.js => data.ts} | 0 .../BoxPlot/{index.js => index.ts} | 6 +- .../Line/{index.js => index.ts} | 3 +- .../preset-chart-xy/ScatterPlot/index.js | 13 - .../preset-chart-xy/ScatterPlot/index.ts | 15 + .../ScatterPlot/stories/legacy.tsx | 2 +- .../superset-ui-preset-chart-xy/package.json | 20 +- .../src/BoxPlot/Encoder.ts | 51 -- .../src/BoxPlot/index.ts | 2 +- .../src/BoxPlot/legacy/index.ts | 2 +- .../src/BoxPlot/legacy/transformProps.ts | 2 +- .../src/BoxPlot/transformProps.ts | 4 +- .../src/Line/ChartFormData.ts | 2 +- .../src/Line/Encoder.ts | 63 --- .../src/Line/buildQuery.ts | 4 +- .../src/Line/index.ts | 2 +- .../src/Line/legacy/index.ts | 2 +- .../src/Line/transformProps.ts | 4 +- .../src/ScatterPlot/Encoder.ts | 63 --- .../src/ScatterPlot/ScatterPlot.tsx | 155 ------ .../src/ScatterPlot/index.ts | 2 +- .../src/ScatterPlot/legacy/index.ts | 2 +- .../src/ScatterPlot/transformProps.ts | 2 +- .../src/{ => components}/BoxPlot/BoxPlot.tsx | 80 ++-- .../BoxPlot/DefaultTooltipRenderer.tsx | 7 +- .../src/components/BoxPlot/Encoder.ts | 24 + .../src/{ => components}/BoxPlot/types.ts | 0 .../Line/DefaultLegendItemMarkRenderer.tsx | 26 ++ .../Line/DefaultTooltipRenderer.tsx | 0 .../src/components/Line/Encoder.ts | 35 ++ .../src/{ => components}/Line/Line.tsx | 89 ++-- .../ScatterPlot/DefaultTooltipRenderer.tsx | 16 +- .../src/components/ScatterPlot/Encoder.ts | 38 ++ .../components/ScatterPlot/ScatterPlot.tsx | 121 +++++ .../src/components/legend/DefaultLegend.tsx | 28 +- .../components/legend/DefaultLegendGroup.tsx | 25 +- .../components/legend/DefaultLegendItem.tsx | 28 +- .../components/legend/createRenderLegend.tsx | 11 +- .../src/components/legend/types.ts | 87 ++-- .../src/encodeable/AbstractEncoder.ts | 169 ------- .../src/encodeable/AxisAgent.ts | 195 -------- .../src/encodeable/ChannelEncoder.ts | 179 ------- .../src/encodeable/createEncoderClass.ts | 29 -- .../src/encodeable/createEncoderSelector.ts | 19 - .../src/encodeable/parsers/extractFormat.ts | 33 -- .../src/encodeable/parsers/extractGetter.ts | 14 - .../src/encodeable/parsers/extractScale.ts | 282 ----------- .../src/encodeable/types/Axis.ts | 60 --- .../src/encodeable/types/Base.ts | 16 - .../src/encodeable/types/Channel.ts | 35 -- .../src/encodeable/types/ChannelDef.ts | 96 ---- .../src/encodeable/types/Data.ts | 5 - .../src/encodeable/types/Legend.ts | 5 - .../src/encodeable/types/Scale.ts | 20 - .../src/encodeable/types/Specification.ts | 13 - .../src/encodeable/utils/identity.ts | 3 - .../src/encodeable/utils/isDisabled.ts | 11 - .../src/encodeable/utils/isEnabled.ts | 13 - .../superset-ui-preset-chart-xy/src/index.ts | 5 +- .../superset-ui-preset-chart-xy/src/legacy.ts | 3 - .../src/utils/XYChartLayout.tsx | 47 +- .../src/utils/computeAxisLayout.ts | 106 +++++ .../src/utils/constants.ts | 2 - .../utils/convertScaleToDataUIScaleShape.ts | 23 +- .../{selectors => }/createMarginSelector.tsx | 0 .../src/utils/createTickComponent.tsx | 2 +- .../src/utils/createTickLabelProps.ts | 54 +-- .../src/utils/createXYChartLayoutWithTheme.ts | 28 +- .../encodeable/parsers/extractGetter.test.ts | 13 - .../test/index.test.ts | 29 ++ .../types/@vx/legend/index.d.ts | 16 - .../types/@vx/responsive/index.d.ts | 10 - .../types/@vx/scale/index.d.ts | 9 - .../plugins/superset-ui-plugins/yarn.lock | 440 ++++++++++-------- 80 files changed, 951 insertions(+), 2124 deletions(-) create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/babel.config.js rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/{data.js => data.ts} (100%) rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/{index.js => index.ts} (66%) rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/Line/{index.js => index.ts} (77%) delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/index.js create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/index.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/Encoder.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Encoder.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/Encoder.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/ScatterPlot.tsx rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/{ => components}/BoxPlot/BoxPlot.tsx (50%) rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/{ => components}/BoxPlot/DefaultTooltipRenderer.tsx (88%) create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/Encoder.ts rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/{ => components}/BoxPlot/types.ts (100%) create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/DefaultLegendItemMarkRenderer.tsx rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/{ => components}/Line/DefaultTooltipRenderer.tsx (100%) create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/Encoder.ts rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/{ => components}/Line/Line.tsx (73%) rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/{ => components}/ScatterPlot/DefaultTooltipRenderer.tsx (71%) create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/Encoder.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/ScatterPlot.tsx delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AbstractEncoder.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AxisAgent.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/ChannelEncoder.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/createEncoderClass.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/createEncoderSelector.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractFormat.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractGetter.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractScale.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Axis.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Base.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Channel.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/ChannelDef.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Data.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Legend.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Scale.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Specification.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/identity.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isDisabled.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isEnabled.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/legacy.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/computeAxisLayout.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/constants.ts rename superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/{selectors => }/createMarginSelector.tsx (100%) delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/test/encodeable/parsers/extractGetter.test.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/test/index.test.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/legend/index.d.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/responsive/index.d.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/scale/index.d.ts diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/.gitignore b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/.gitignore index 9b738073f907..6abc008831b5 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/.gitignore +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/.gitignore @@ -38,7 +38,6 @@ test-changelog.md .eslintrc.js .flowconfig .prettierignore -babel.config.js jest.config.js prettier.config.js tsconfig.eslint.json diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/babel.config.js b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/babel.config.js new file mode 100644 index 000000000000..4bc657061b43 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/babel.config.js @@ -0,0 +1,24 @@ +// eslint-disable-next-line no-undef, import/no-extraneous-dependencies +const { getConfig } = require('@airbnb/config-babel'); + +const config = getConfig({ + library: true, + react: true, + next: true, + node: process.env.NODE_ENV === 'test', + typescript: true, + env: { + targets: false, + }, +}); + +if (process.env.NODE_ENV !== 'test') { + config.presets[0][1].modules = false; +} + +// Override to allow transpile es modules inside vega-lite +config.ignore = config.ignore.filter(item => item !== 'node_modules/'); +config.ignore.push('node_modules/(?!(vega-lite|lodash-es))'); + +// eslint-disable-next-line no-undef +module.exports = config; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/package.json b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/package.json index 096748b0f7d7..db1ee3a5e054 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/package.json +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/package.json @@ -6,8 +6,8 @@ "scripts": { "build": "yarn babel && yarn type && yarn build:assets", "babel": "yarn babel:cjs && yarn babel:esm", - "babel:cjs": "nimbus babel --clean --workspaces=\"@superset-ui/!(plugins-demo)\"", - "babel:esm": "nimbus babel --clean --workspaces=\"@superset-ui/!(plugins-demo)\" --esm", + "babel:cjs": "nimbus babel --clean --workspaces=\"@superset-ui/!(plugins-demo)\" --config-file=../../babel.config.js", + "babel:esm": "nimbus babel --clean --workspaces=\"@superset-ui/!(plugins-demo)\" --esm --config-file=../../babel.config.js", "build:assets": "node ./scripts/buildAssets.js", "clean": "rm -rf ./packages/**/{lib,esm}", "commit": "superset-commit", @@ -42,14 +42,14 @@ ], "license": "Apache-2.0", "devDependencies": { - "@airbnb/config-babel": "^2.1.3", - "@airbnb/config-eslint": "^2.1.3", - "@airbnb/config-jest": "^2.1.3", - "@airbnb/config-prettier": "^2.0.4", - "@airbnb/config-typescript": "^2.1.2", - "@airbnb/nimbus": "^2.1.3", + "@airbnb/config-babel": "^2.2.2", + "@airbnb/config-eslint": "^2.5.1", + "@airbnb/config-jest": "^2.2.2", + "@airbnb/config-prettier": "^2.1.1", + "@airbnb/config-typescript": "^2.2.2", + "@airbnb/nimbus": "^2.2.3", "@superset-ui/commit-config": "^0.0.9", - "@superset-ui/superset-ui": "^0.12.5", + "@superset-ui/superset-ui": "^0.12.15", "@types/enzyme": "^3.10.3", "@types/jest": "^25.1.3", "@types/jsdom": "^12.2.4", @@ -86,7 +86,7 @@ ], "nimbus": { "drivers": [ - "babel", + { "driver": "babel", "strategy": "none" }, "eslint", "jest", "prettier", @@ -106,6 +106,9 @@ "@airbnb/config-jest/enzyme", "./scripts/setupJest.js" ], + "transformIgnorePatterns": [ + "node_modules/(?!(vega-lite|lodash-es))" + ], "coverageThreshold": { "global": { "branches": 1, diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/package.json b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/package.json index c27fed2affd2..f19c6e9eaa08 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/package.json +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/package.json @@ -33,7 +33,7 @@ "@types/react": "^16.3.0", "d3-cloud": "^1.2.5", "d3-scale": "^3.0.1", - "encodable": "^0.2.0" + "encodable": "^0.3.3" }, "peerDependencies": { "@superset-ui/chart": "^0.12.0", diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/src/chart/Encoder.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/src/chart/Encoder.ts index ac2596200c79..db350938a80a 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/src/chart/Encoder.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/src/chart/Encoder.ts @@ -1,5 +1,4 @@ -import { createEncoderFactory } from 'encodable'; -import { DeriveEncoding } from 'encodable/lib/types/Encoding'; +import { createEncoderFactory, DeriveEncoding } from 'encodable'; type WordCloudEncodingConfig = { color: ['Color', string]; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/src/chart/WordCloud.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/src/chart/WordCloud.tsx index 75e4cf74e546..bf9e135bef3e 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/src/chart/WordCloud.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugin-chart-word-cloud/src/chart/WordCloud.tsx @@ -1,6 +1,6 @@ import React from 'react'; import cloudLayout, { Word } from 'd3-cloud'; -import { PlainObject } from 'encodable/lib/types/Data'; +import { PlainObject } from 'encodable'; import { WordCloudEncoding, wordCloudEncoderFactory } from './Encoder'; export const ROTATION = { diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/data.js b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/data.ts similarity index 100% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/data.js rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/data.ts diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/index.js b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/index.ts similarity index 66% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/index.js rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/index.ts index 3e3c8a16a872..d7fafb4ec7ab 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/index.js +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/BoxPlot/index.ts @@ -1,5 +1,7 @@ -import { BoxPlotChartPlugin as LegacyBoxPlotChartPlugin } from '../../../../../superset-ui-preset-chart-xy/esm/legacy'; -import { BoxPlotChartPlugin } from '../../../../../superset-ui-preset-chart-xy'; +import { + BoxPlotChartPlugin, + LegacyBoxPlotChartPlugin, +} from '../../../../../superset-ui-preset-chart-xy'; import Stories from './stories/Basic'; import LegacyStories from './stories/Legacy'; import { BOX_PLOT_PLUGIN_LEGACY_TYPE, BOX_PLOT_PLUGIN_TYPE } from './constants'; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/Line/index.js b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/Line/index.ts similarity index 77% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/Line/index.js rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/Line/index.ts index 83e449999066..b0990fb48f8e 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/Line/index.js +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/Line/index.ts @@ -1,5 +1,4 @@ -import { LineChartPlugin as LegacyLineChartPlugin } from '../../../../../superset-ui-preset-chart-xy/esm/legacy'; -import { LineChartPlugin } from '../../../../../superset-ui-preset-chart-xy'; +import { LineChartPlugin, LegacyLineChartPlugin } from '../../../../../superset-ui-preset-chart-xy'; import BasicStories from './stories/basic'; import FlushStories from './stories/flush'; import QueryStories from './stories/query'; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/index.js b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/index.js deleted file mode 100644 index 304434a81a42..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import { ScatterPlotPlugin as LegacyScatterPlotPlugin } from '../../../../../superset-ui-preset-chart-xy/esm/legacy'; -import { ScatterPlotPlugin } from '../../../../../superset-ui-preset-chart-xy'; -import BasicStories from './stories/basic'; -import BubbleStories from './stories/bubble'; -import LegacyStories from './stories/legacy'; -import { SCATTER_PLOT_PLUGIN_TYPE, SCATTER_PLOT_PLUGIN_LEGACY_TYPE } from './constants'; - -new LegacyScatterPlotPlugin().configure({ key: SCATTER_PLOT_PLUGIN_LEGACY_TYPE }).register(); -new ScatterPlotPlugin().configure({ key: SCATTER_PLOT_PLUGIN_TYPE }).register(); - -export default { - examples: [...BasicStories, ...BubbleStories, ...LegacyStories], -}; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/index.ts new file mode 100644 index 000000000000..75206dd3c824 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/index.ts @@ -0,0 +1,15 @@ +import { + ScatterPlotChartPlugin, + LegacyScatterPlotChartPlugin, +} from '../../../../../superset-ui-preset-chart-xy'; +import BasicStories from './stories/basic'; +import BubbleStories from './stories/bubble'; +import LegacyStories from './stories/legacy'; +import { SCATTER_PLOT_PLUGIN_TYPE, SCATTER_PLOT_PLUGIN_LEGACY_TYPE } from './constants'; + +new LegacyScatterPlotChartPlugin().configure({ key: SCATTER_PLOT_PLUGIN_LEGACY_TYPE }).register(); +new ScatterPlotChartPlugin().configure({ key: SCATTER_PLOT_PLUGIN_TYPE }).register(); + +export default { + examples: [...BasicStories, ...BubbleStories, ...LegacyStories], +}; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/stories/legacy.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/stories/legacy.tsx index 5b53beeca62f..7b90ed46e154 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/stories/legacy.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-plugins-demo/storybook/stories/preset-chart-xy/ScatterPlot/stories/legacy.tsx @@ -28,7 +28,7 @@ export default [ vizType: 'bubble', x: 'sum__SP_RUR_TOTL_ZS', xAxisFormat: '.3s', - xAxisLabel: 'x-axis label', + xAxisLabel: 'x-axis label test', xAxisShowminmax: false, xLogScale: false, xTicksLayout: 'auto', diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/package.json b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/package.json index ab7abbc3e3b7..7b4de712425d 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/package.json +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/package.json @@ -31,31 +31,23 @@ "dependencies": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@types/d3-scale": "^2.1.1", "@vx/axis": "^0.0.195", - "@vx/group": "^0.0.194", - "@vx/legend": "^0.0.194", - "@vx/responsive": "^0.0.195", + "@vx/legend": "^0.0.195", "@vx/scale": "^0.0.195", - "@vx/shape": "^0.0.194", "csstype": "^2.6.3", - "d3-array": "^2.1.0", - "d3-scale": "^3.0.0", + "encodable": "^0.3.4", "lodash": "^4.17.11", - "prop-types": "^15.6.2", - "reselect": "^4.0.0", - "vega": "^5.8.1", - "vega-lite": "~4.1.1" + "reselect": "^4.0.0" }, "peerDependencies": { "@superset-ui/chart": "^0.12.0", "@superset-ui/chart-composition": "^0.12.0", - "@superset-ui/color": "^0.12.0", + "@superset-ui/color": "^0.12.15", "@superset-ui/core": "^0.12.0", "@superset-ui/dimension": "^0.12.0", - "@superset-ui/number-format": "^0.12.0", + "@superset-ui/number-format": "^0.12.15", "@superset-ui/query": "^0.12.0", - "@superset-ui/time-format": "^0.12.0", + "@superset-ui/time-format": "^0.12.15", "@superset-ui/translation": "^0.12.0", "react": "^16.2" } diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/Encoder.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/Encoder.ts deleted file mode 100644 index 9d7908b5f8a8..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/Encoder.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Value } from 'vega-lite/build/src/channeldef'; -import { ChannelTypeToDefMap } from '../encodeable/types/Channel'; -import { ExtractChannelOutput } from '../encodeable/types/ChannelDef'; -import createEncoderClass from '../encodeable/createEncoderClass'; - -/** - * Define channel types - */ -const channelTypes = { - color: 'Color', - x: 'XBand', - y: 'YBand', -} as const; - -export type ChannelTypes = typeof channelTypes; - -/** - * TEMPLATE: - * Helper for defining encoding - */ -type CreateChannelDef< - ChannelName extends keyof ChannelTypes, - Output extends Value -> = ChannelTypeToDefMap[ChannelTypes[ChannelName]]; - -/** - * Encoding definition - */ -export type Encoding = { - color: CreateChannelDef<'color', string>; - x: CreateChannelDef<'x', number | null>; - y: CreateChannelDef<'y', number | null>; -}; - -/** - * TEMPLATE: - * Can use this to get returned type of a Channel - * example usage: ChannelOutput<'x'> - */ -export type ChannelOutput = ExtractChannelOutput< - Encoding[ChannelName] ->; - -export default class Encoder extends createEncoderClass({ - channelTypes, - defaultEncoding: { - color: { value: '#222' }, - x: { field: 'x', type: 'nominal' }, - y: { field: 'y', type: 'quantitative' }, - }, -}) {} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/index.ts index ee02dbbbe428..529dc454d149 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/index.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/index.ts @@ -23,7 +23,7 @@ import transformProps from './transformProps'; export default class BoxPlotChartPlugin extends ChartPlugin { constructor() { super({ - loadChart: () => import('./BoxPlot'), + loadChart: () => import('../components/BoxPlot/BoxPlot'), metadata: createMetadata(), transformProps, }); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/legacy/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/legacy/index.ts index 6667d5ccff7d..24ceb4eb7ad1 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/legacy/index.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/legacy/index.ts @@ -23,7 +23,7 @@ import transformProps from './transformProps'; export default class BoxPlotChartPlugin extends ChartPlugin { constructor() { super({ - loadChart: () => import('../BoxPlot'), + loadChart: () => import('../../components/BoxPlot/BoxPlot'), metadata: createMetadata(true), transformProps, }); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/legacy/transformProps.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/legacy/transformProps.ts index 926131e6d2ce..2b2275568d1e 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/legacy/transformProps.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/legacy/transformProps.ts @@ -17,7 +17,7 @@ * under the License. */ import { ChartProps } from '@superset-ui/chart'; -import { RawBoxPlotDataRow, BoxPlotDataRow } from '../types'; +import { RawBoxPlotDataRow, BoxPlotDataRow } from '../../components/BoxPlot/types'; export default function transformProps(chartProps: ChartProps) { const { width, height, datasource = {}, formData, queryData } = chartProps; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/transformProps.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/transformProps.ts index ac7e18f03839..8d5eb96ed60e 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/transformProps.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/transformProps.ts @@ -1,7 +1,7 @@ import { pick } from 'lodash'; import { ChartProps } from '@superset-ui/chart'; -import { BoxPlotDataRow, RawBoxPlotDataRow } from './types'; -import { HookProps } from './BoxPlot'; +import { BoxPlotDataRow, RawBoxPlotDataRow } from '../components/BoxPlot/types'; +import { HookProps } from '../components/BoxPlot/BoxPlot'; export default function transformProps(chartProps: ChartProps) { const { width, height, formData, queryData } = chartProps; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/ChartFormData.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/ChartFormData.ts index 2168e26a9f61..a345bf2ddb50 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/ChartFormData.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/ChartFormData.ts @@ -1,5 +1,5 @@ import { QueryFormData } from '@superset-ui/query'; -import { FormDataProps } from './Line'; +import { FormDataProps } from '../components/Line/Line'; type CombinedFormData = QueryFormData & FormDataProps; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Encoder.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Encoder.ts deleted file mode 100644 index 103af2d2dd1a..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Encoder.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Value } from 'vega-lite/build/src/channeldef'; -import { ChannelTypeToDefMap } from '../encodeable/types/Channel'; -import { ExtractChannelOutput } from '../encodeable/types/ChannelDef'; -import createEncoderClass from '../encodeable/createEncoderClass'; - -/** - * Define channel names and their types - */ -const channelTypes = { - fill: 'Category', - stroke: 'Color', - strokeDasharray: 'Category', - strokeWidth: 'Numeric', - x: 'X', - y: 'Y', -} as const; - -export type ChannelTypes = typeof channelTypes; - -/** - * TEMPLATE: - * Helper for defining encoding - */ -type CreateChannelDef< - ChannelName extends keyof ChannelTypes, - Output extends Value -> = ChannelTypeToDefMap[ChannelTypes[ChannelName]]; - -/** - * Encoding definition - */ -export type Encoding = { - fill: CreateChannelDef<'fill', boolean>; - stroke: CreateChannelDef<'stroke', string>; - strokeDasharray: CreateChannelDef<'strokeDasharray', string>; - strokeWidth: CreateChannelDef<'strokeWidth', number>; - x: CreateChannelDef<'x', number>; - y: CreateChannelDef<'y', number>; -}; - -/** - * TEMPLATE: - * Can use this to get returned type of a Channel - * example usage: ChannelOutput<'x'> - */ -export type ChannelOutput = ExtractChannelOutput< - Encoding[ChannelName] ->; - -export default class Encoder extends createEncoderClass({ - allChannelOptions: { - fill: { legend: false }, - }, - channelTypes, - defaultEncoding: { - fill: { value: false }, - stroke: { value: '#222' }, - strokeDasharray: { value: '' }, - strokeWidth: { value: 1 }, - x: { field: 'x', type: 'quantitative' }, - y: { field: 'y', type: 'quantitative' }, - }, -}) {} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/buildQuery.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/buildQuery.ts index 748c1fb8119f..ab8b1fe2263b 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/buildQuery.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/buildQuery.ts @@ -1,11 +1,11 @@ import { buildQueryContext } from '@superset-ui/query'; import ChartFormData from './ChartFormData'; -import Encoder from './Encoder'; +import { lineEncoderFactory } from '../components/Line/Encoder'; export default function buildQuery(formData: ChartFormData) { const queryContext = buildQueryContext(formData); const { encoding } = formData; - const encoder = new Encoder({ encoding }); + const encoder = lineEncoderFactory.create(encoding); queryContext.queries.forEach(query => { const q = query; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/index.ts index 9a9681d8fdb0..44595cecd1fb 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/index.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/index.ts @@ -8,7 +8,7 @@ export default class LineChartPlugin extends ChartPlugin { constructor() { super({ buildQuery, - loadChart: () => import('./Line'), + loadChart: () => import('../components/Line/Line'), metadata: createMetadata(), transformProps, }); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/legacy/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/legacy/index.ts index 2fe4dafdbcbd..bff5d6e6b815 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/legacy/index.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/legacy/index.ts @@ -5,7 +5,7 @@ import createMetadata from '../createMetadata'; export default class LineChartPlugin extends ChartPlugin { constructor() { super({ - loadChart: () => import('../Line'), + loadChart: () => import('../../components/Line/Line'), metadata: createMetadata(true), transformProps, }); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/transformProps.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/transformProps.ts index ff10271e0585..b8835dff05b5 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/transformProps.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/transformProps.ts @@ -1,6 +1,6 @@ import { pick } from 'lodash'; import { ChartProps } from '@superset-ui/chart'; -import { HookProps, FormDataProps } from './Line'; +import { HookProps, FormDataProps } from '../components/Line/Line'; export default function transformProps(chartProps: ChartProps) { const { width, height, queryData } = chartProps; @@ -12,7 +12,7 @@ export default function transformProps(chartProps: ChartProps) { * Use type-check to make sure the field names are expected ones * and only pick these fields to pass to the chart. */ - const fieldsFromFormData: (keyof FormDataProps)[] = ['encoding', 'margin', 'options', 'theme']; + const fieldsFromFormData: (keyof FormDataProps)[] = ['encoding', 'margin', 'theme']; const fieldsFromHooks: (keyof HookProps)[] = [ 'TooltipRenderer', diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/Encoder.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/Encoder.ts deleted file mode 100644 index d16d07984abc..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/Encoder.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Value } from 'vega-lite/build/src/channeldef'; -import { ChannelTypeToDefMap } from '../encodeable/types/Channel'; -import { ExtractChannelOutput } from '../encodeable/types/ChannelDef'; -import createEncoderClass from '../encodeable/createEncoderClass'; - -/** - * Define channel types - */ -const channelTypes = { - fill: 'Color', - group: 'Text', - size: 'Numeric', - stroke: 'Color', - tooltip: 'Text', - x: 'X', - y: 'Y', -} as const; // "as const" is mandatory - -export type ChannelTypes = typeof channelTypes; - -/** - * TEMPLATE: - * Helper for defining encoding - */ -type CreateChannelDef< - ChannelName extends keyof ChannelTypes, - Output extends Value -> = ChannelTypeToDefMap[ChannelTypes[ChannelName]]; - -/** - * Encoding definition - */ -export type Encoding = { - fill: CreateChannelDef<'fill', string>; - group: CreateChannelDef<'group', string>[]; - size: CreateChannelDef<'size', number>; - stroke: CreateChannelDef<'stroke', string>; - tooltip: CreateChannelDef<'tooltip', string>[]; - x: CreateChannelDef<'x', number>; - y: CreateChannelDef<'y', number>; -}; - -/** - * TEMPLATE: - * Can use this to get returned type of a Channel - * example usage: ChannelOutput<'x'> - */ -export type ChannelOutput = ExtractChannelOutput< - Encoding[ChannelName] ->; - -export default class Encoder extends createEncoderClass({ - channelTypes, - defaultEncoding: { - fill: { value: '#222' }, - group: [], - size: { value: 5 }, - stroke: { value: 'none' }, - tooltip: [], - x: { field: 'x', type: 'quantitative' }, - y: { field: 'y', type: 'quantitative' }, - }, -}) {} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/ScatterPlot.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/ScatterPlot.tsx deleted file mode 100644 index 1961ed956453..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/ScatterPlot.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import React, { PureComponent } from 'react'; -import { XYChart, PointSeries } from '@data-ui/xy-chart'; -import { chartTheme, ChartTheme } from '@data-ui/theme'; -import { Margin, Dimension } from '@superset-ui/dimension'; -import { WithLegend } from '@superset-ui/chart-composition'; -import Encoder, { Encoding, ChannelOutput } from './Encoder'; -import { Dataset, PlainObject } from '../encodeable/types/Data'; -import { PartialSpec } from '../encodeable/types/Specification'; -import createMarginSelector, { DEFAULT_MARGIN } from '../utils/selectors/createMarginSelector'; -import DefaultTooltipRenderer from './DefaultTooltipRenderer'; -import convertScaleToDataUIScale from '../utils/convertScaleToDataUIScaleShape'; -import { isScaleFieldDef } from '../encodeable/types/ChannelDef'; -import createXYChartLayoutWithTheme from '../utils/createXYChartLayoutWithTheme'; -import createEncoderSelector from '../encodeable/createEncoderSelector'; -import createRenderLegend from '../components/legend/createRenderLegend'; -import { LegendHooks } from '../components/legend/types'; - -export interface TooltipProps { - datum: EncodedPoint; - encoder: Encoder; -} - -const defaultProps = { - className: '', - margin: DEFAULT_MARGIN, - theme: chartTheme, - TooltipRenderer: DefaultTooltipRenderer, -} as const; - -export type HookProps = { - TooltipRenderer?: React.ComponentType; -} & LegendHooks; - -type Props = { - className?: string; - width: string | number; - height: string | number; - margin?: Margin; - data: Dataset; - theme?: ChartTheme; -} & PartialSpec & - HookProps & - Readonly; - -export interface EncodedPoint { - x: ChannelOutput<'x'>; - y: ChannelOutput<'y'>; - size: ChannelOutput<'size'>; - fill: ChannelOutput<'fill'>; - stroke: ChannelOutput<'stroke'>; - group: ChannelOutput<'group'>[]; - tooltip: ChannelOutput<'tooltip'>[]; - data: PlainObject; -} - -export default class ScatterPlot extends PureComponent { - private createEncoder = createEncoderSelector(Encoder); - - private createMargin = createMarginSelector(); - - static defaultProps = defaultProps; - - constructor(props: Props) { - super(props); - - this.renderChart = this.renderChart.bind(this); - } - - renderChart(dim: Dimension) { - const { width, height } = dim; - const { data, margin, theme, TooltipRenderer } = this.props; - const encoder = this.createEncoder(this.props); - const { channels } = encoder; - - if (typeof channels.x.scale !== 'undefined') { - const xDomain = channels.x.getDomain(data); - channels.x.scale.setDomain(xDomain); - } - if (typeof channels.y.scale !== 'undefined') { - const yDomain = channels.y.getDomain(data); - channels.y.scale.setDomain(yDomain); - } - if ( - isScaleFieldDef(channels.size.definition) && - channels.size.definition.type === 'quantitative' - ) { - const domain = channels.size.getDomain(data) as number[]; - const [min, max] = domain; - const adjustedDomain = [Math.min(min || 0, 0), Math.max(max || 1, 1)]; - channels.size.scale!.setDomain(adjustedDomain); - } - - const encodedData = data.map(d => ({ - x: channels.x.get(d), - y: channels.y.get(d), - size: channels.size.encode(d), - fill: channels.fill.encode(d), - stroke: channels.stroke.encode(d), - data: d, - })); - - const layout = createXYChartLayoutWithTheme({ - width, - height, - margin: this.createMargin(margin), - theme, - xEncoder: channels.x, - yEncoder: channels.y, - }); - - return layout.renderChartWithFrame((chartDim: Dimension) => ( - ( - - )} - theme={theme} - xScale={convertScaleToDataUIScale(channels.x.scale!.config)} - yScale={convertScaleToDataUIScale(channels.y.scale!.config)} - > - {layout.renderXAxis()} - {layout.renderYAxis()} - d.fill} - fillOpacity={0.5} - stroke={(d: EncodedPoint) => d.stroke} - size={(d: EncodedPoint) => d.size} - /> - - )); - } - - render() { - const { className, data, width, height } = this.props; - - const encoder = this.createEncoder(this.props); - - return ( - - ); - } -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/index.ts index 08a9615de066..3cac0a03fb6d 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/index.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/index.ts @@ -5,7 +5,7 @@ import transformProps from './transformProps'; export default class LineChartPlugin extends ChartPlugin { constructor() { super({ - loadChart: () => import('./ScatterPlot'), + loadChart: () => import('../components/ScatterPlot/ScatterPlot'), metadata: createMetadata(), transformProps, }); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/legacy/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/legacy/index.ts index 571dbef725b6..a3a2a85c7903 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/legacy/index.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/legacy/index.ts @@ -5,7 +5,7 @@ import transformProps from './transformProps'; export default class LineChartPlugin extends ChartPlugin { constructor() { super({ - loadChart: () => import('../ScatterPlot'), + loadChart: () => import('../../components/ScatterPlot/ScatterPlot'), metadata: createMetadata(true), transformProps, }); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/transformProps.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/transformProps.ts index 02f19af99fdb..293ee8148d13 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/transformProps.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/transformProps.ts @@ -1,6 +1,6 @@ import { pick } from 'lodash'; import { ChartProps } from '@superset-ui/chart'; -import { HookProps } from './ScatterPlot'; +import { HookProps } from '../components/ScatterPlot/ScatterPlot'; export default function transformProps(chartProps: ChartProps) { const { width, height, formData, queryData } = chartProps; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/BoxPlot.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/BoxPlot.tsx similarity index 50% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/BoxPlot.tsx rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/BoxPlot.tsx index 61dacd55caf7..8c7e971e4cce 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/BoxPlot.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/BoxPlot.tsx @@ -3,75 +3,67 @@ import { BoxPlotSeries, XYChart } from '@data-ui/xy-chart'; import { chartTheme, ChartTheme } from '@data-ui/theme'; import { Margin, Dimension } from '@superset-ui/dimension'; import { WithLegend } from '@superset-ui/chart-composition'; +import { Dataset, PlainObject, isFieldDef } from 'encodable'; import DefaultTooltipRenderer from './DefaultTooltipRenderer'; -import Encoder, { Encoding } from './Encoder'; -import { Dataset, PlainObject } from '../encodeable/types/Data'; -import { PartialSpec } from '../encodeable/types/Specification'; -import createMarginSelector, { DEFAULT_MARGIN } from '../utils/selectors/createMarginSelector'; +import { + BoxPlotEncodingConfig, + BoxPlotEncoding, + BoxPlotEncoder, + boxPlotEncoderFactory, +} from './Encoder'; +import createMarginSelector, { DEFAULT_MARGIN } from '../../utils/createMarginSelector'; import { BoxPlotDataRow } from './types'; -import convertScaleToDataUIScale from '../utils/convertScaleToDataUIScaleShape'; -import createXYChartLayoutWithTheme from '../utils/createXYChartLayoutWithTheme'; -import createEncoderSelector from '../encodeable/createEncoderSelector'; -import createRenderLegend from '../components/legend/createRenderLegend'; -import { LegendHooks } from '../components/legend/types'; +import convertScaleToDataUIScale from '../../utils/convertScaleToDataUIScaleShape'; +import createXYChartLayoutWithTheme from '../../utils/createXYChartLayoutWithTheme'; +import createRenderLegend from '../legend/createRenderLegend'; +import { LegendHooks } from '../legend/types'; export interface TooltipProps { datum: BoxPlotDataRow; color: string; - encoder: Encoder; + encoder: BoxPlotEncoder; } const defaultProps = { className: '', margin: DEFAULT_MARGIN, + encoding: {}, theme: chartTheme, TooltipRenderer: DefaultTooltipRenderer, } as const; export type HookProps = { TooltipRenderer?: React.ComponentType; -} & LegendHooks; +} & LegendHooks; type Props = { className?: string; width: string | number; height: string | number; margin?: Margin; + encoding?: Partial; data: Dataset; theme?: ChartTheme; -} & PartialSpec & - HookProps & +} & HookProps & Readonly; export default class BoxPlot extends React.PureComponent { - private createEncoder = createEncoderSelector(Encoder); + private createEncoder = boxPlotEncoderFactory.createSelector(); private createMargin = createMarginSelector(); static defaultProps = defaultProps; - constructor(props: Props) { - super(props); - - this.renderChart = this.renderChart.bind(this); - } - - renderChart(dim: Dimension) { + renderChart = (dim: Dimension) => { const { width, height } = dim; - const { data, margin, theme, TooltipRenderer } = this.props; - const encoder = this.createEncoder(this.props); + const { data, margin, theme, TooltipRenderer, encoding } = this.props; + const encoder = this.createEncoder(encoding); const { channels } = encoder; - const isHorizontal = channels.y.definition.type === 'nominal'; + const isHorizontal = + isFieldDef(channels.y.definition) && channels.y.definition.type === 'nominal'; - if (typeof channels.x.scale !== 'undefined') { - const xDomain = channels.x.getDomain(data); - channels.x.scale.setDomain(xDomain); - } - if (typeof channels.y.scale !== 'undefined') { - const yDomain = channels.y.getDomain(data); - channels.y.scale.setDomain(yDomain); - } + encoder.setDomainFromDataset(data); const layout = createXYChartLayoutWithTheme({ width, @@ -93,34 +85,32 @@ export default class BoxPlot extends React.PureComponent { )} theme={theme} - xScale={convertScaleToDataUIScale(channels.x.scale!.config)} - yScale={convertScaleToDataUIScale(channels.y.scale!.config)} + xScale={convertScaleToDataUIScale(channels.x.definition.scale as any)} + yScale={convertScaleToDataUIScale(channels.y.definition.scale as any)} > {layout.renderXAxis()} {layout.renderYAxis()} ({ ...row, y: channels.y.get(row) })) - : data.map(row => ({ ...row, x: channels.x.get(row) })) + ? data.map(row => ({ ...row, y: channels.y.getValueFromDatum(row) })) + : data.map(row => ({ ...row, x: channels.x.getValueFromDatum(row) })) } - fill={(datum: PlainObject) => channels.color.encode(datum, '#55acee')} + fill={(datum: PlainObject) => channels.color.encodeDatum(datum, '#55acee')} fillOpacity={0.4} - stroke={(datum: PlainObject) => channels.color.encode(datum)} + stroke={(datum: PlainObject) => channels.color.encodeDatum(datum)} strokeWidth={1} widthRatio={0.6} - horizontal={channels.y.definition.type === 'nominal'} + horizontal={isHorizontal} /> )); - } + }; render() { - const { className, data, width, height } = this.props; - - const encoder = this.createEncoder(this.props); + const { className, data, encoding, width, height } = this.props; return ( { width={width} height={height} position="top" - renderLegend={createRenderLegend(encoder, data, this.props)} + renderLegend={createRenderLegend(this.createEncoder(encoding), data, this.props)} renderChart={this.renderChart} /> ); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/DefaultTooltipRenderer.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/DefaultTooltipRenderer.tsx similarity index 88% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/DefaultTooltipRenderer.tsx rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/DefaultTooltipRenderer.tsx index 26469206468a..3970f5a59e7c 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/DefaultTooltipRenderer.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/DefaultTooltipRenderer.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { isDefined } from '@superset-ui/core'; import { TooltipFrame, TooltipTable } from '@superset-ui/chart-composition'; -import Encoder from './Encoder'; +import { BoxPlotEncoder } from './Encoder'; import { BoxPlotDataRow } from './types'; export default function DefaultTooltipRenderer({ @@ -11,13 +11,12 @@ export default function DefaultTooltipRenderer({ }: { datum: BoxPlotDataRow; color: string; - encoder: Encoder; + encoder: BoxPlotEncoder; }) { const { label, min, max, median, firstQuartile, thirdQuartile, outliers } = datum; const { channels } = encoder; - const formatValue = - channels.y.definition.type === 'nominal' ? channels.x.formatValue : channels.y.formatValue; + const { formatValue } = channels.y; const data = []; if (isDefined(min)) { diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/Encoder.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/Encoder.ts new file mode 100644 index 000000000000..74203911e3ea --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/Encoder.ts @@ -0,0 +1,24 @@ +import { createEncoderFactory, Encoder, DeriveEncoding } from 'encodable'; + +export type BoxPlotEncodingConfig = { + x: ['XBand', number]; + y: ['YBand', number]; + color: ['Color', string]; +}; + +export const boxPlotEncoderFactory = createEncoderFactory({ + channelTypes: { + x: 'XBand', + y: 'YBand', + color: 'Color', + }, + defaultEncoding: { + x: { field: 'x', type: 'nominal' }, + y: { field: 'y', type: 'quantitative' }, + color: { value: '#222' }, + }, +}); + +export type BoxPlotEncoding = DeriveEncoding; + +export type BoxPlotEncoder = Encoder; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/types.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/types.ts similarity index 100% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/BoxPlot/types.ts rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/BoxPlot/types.ts diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/DefaultLegendItemMarkRenderer.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/DefaultLegendItemMarkRenderer.tsx new file mode 100644 index 000000000000..54bc8ee5100f --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/DefaultLegendItemMarkRenderer.tsx @@ -0,0 +1,26 @@ +import React, { CSSProperties } from 'react'; +import { LegendItemMarkRendererProps } from '../legend/types'; +import { LineEncodingConfig } from './Encoder'; + +const MARK_WIDTH = 12; +const MARK_HEIGHT = 8; + +const MARK_STYLE: CSSProperties = { display: 'inline-block' }; + +export default function DefaultLegendItemMarkRenderer({ + item, +}: LegendItemMarkRendererProps) { + return ( + + + + ); +} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/DefaultTooltipRenderer.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/DefaultTooltipRenderer.tsx similarity index 100% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/DefaultTooltipRenderer.tsx rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/DefaultTooltipRenderer.tsx diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/Encoder.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/Encoder.ts new file mode 100644 index 000000000000..033d39cd7bd0 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/Encoder.ts @@ -0,0 +1,35 @@ +import { createEncoderFactory, Encoder, DeriveEncoding, DeriveChannelOutputs } from 'encodable'; + +export type LineEncodingConfig = { + x: ['X', number]; + y: ['Y', number]; + fill: ['Category', boolean]; + stroke: ['Color', string]; + strokeDasharray: ['Category', string]; + strokeWidth: ['Numeric', number]; +}; + +export const lineEncoderFactory = createEncoderFactory({ + channelTypes: { + x: 'X', + y: 'Y', + fill: 'Category', + stroke: 'Color', + strokeDasharray: 'Category', + strokeWidth: 'Numeric', + }, + defaultEncoding: { + x: { field: 'x', type: 'quantitative' }, + y: { field: 'y', type: 'quantitative' }, + fill: { value: false, legend: false }, + stroke: { value: '#222' }, + strokeDasharray: { value: '' }, + strokeWidth: { value: 1 }, + }, +}); + +export type LineEncoding = DeriveEncoding; + +export type LineEncoder = Encoder; + +export type LineChannelOutputs = DeriveChannelOutputs; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Line.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/Line.tsx similarity index 73% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Line.tsx rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/Line.tsx index 99a125ab15a9..c93948680ac4 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/Line/Line.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/Line/Line.tsx @@ -12,19 +12,24 @@ import { chartTheme } from '@data-ui/theme'; import { Margin, Dimension } from '@superset-ui/dimension'; import { WithLegend } from '@superset-ui/chart-composition'; import { createSelector } from 'reselect'; -import Encoder, { Encoding, ChannelOutput } from './Encoder'; -import { Dataset, PlainObject } from '../encodeable/types/Data'; -import { PartialSpec } from '../encodeable/types/Specification'; +import { Dataset, PlainObject } from 'encodable'; import DefaultTooltipRenderer from './DefaultTooltipRenderer'; -import createMarginSelector, { DEFAULT_MARGIN } from '../utils/selectors/createMarginSelector'; -import convertScaleToDataUIScale from '../utils/convertScaleToDataUIScaleShape'; -import createXYChartLayoutWithTheme from '../utils/createXYChartLayoutWithTheme'; -import createEncoderSelector from '../encodeable/createEncoderSelector'; -import createRenderLegend from '../components/legend/createRenderLegend'; -import { LegendHooks } from '../components/legend/types'; +import createMarginSelector, { DEFAULT_MARGIN } from '../../utils/createMarginSelector'; +import convertScaleToDataUIScale from '../../utils/convertScaleToDataUIScaleShape'; +import createXYChartLayoutWithTheme from '../../utils/createXYChartLayoutWithTheme'; +import createRenderLegend from '../legend/createRenderLegend'; +import { LegendHooks } from '../legend/types'; +import { + lineEncoderFactory, + LineEncoder, + LineEncoding, + LineEncodingConfig, + LineChannelOutputs, +} from './Encoder'; +import DefaultLegendItemMarkRenderer from './DefaultLegendItemMarkRenderer'; export interface TooltipProps { - encoder: Encoder; + encoder: LineEncoder; allSeries: Series[]; datum: SeriesValue; series: { @@ -35,6 +40,8 @@ export interface TooltipProps { const defaultProps = { className: '', + encoding: {}, + LegendItemMarkRenderer: DefaultLegendItemMarkRenderer, margin: DEFAULT_MARGIN, theme: chartTheme, TooltipRenderer: DefaultTooltipRenderer, @@ -44,11 +51,12 @@ const defaultProps = { export type FormDataProps = { margin?: Margin; theme?: typeof chartTheme; -} & PartialSpec; + encoding?: Partial; +}; export type HookProps = { TooltipRenderer?: React.ComponentType; -} & LegendHooks; +} & LegendHooks; type Props = { className?: string; @@ -61,10 +69,10 @@ type Props = { export interface Series { key: string; - fill: ChannelOutput<'fill'>; - stroke: ChannelOutput<'stroke'>; - strokeDasharray: ChannelOutput<'strokeDasharray'>; - strokeWidth: ChannelOutput<'strokeWidth'>; + fill: LineChannelOutputs['fill']; + stroke: LineChannelOutputs['stroke']; + strokeDasharray: LineChannelOutputs['strokeDasharray']; + strokeWidth: LineChannelOutputs['strokeWidth']; values: SeriesValue[]; } @@ -78,10 +86,10 @@ export interface SeriesValue { const CIRCLE_STYLE = { strokeWidth: 1.5 }; export default class LineChart extends PureComponent { - private createEncoder = createEncoderSelector(Encoder); + private createEncoder = lineEncoderFactory.createSelector(); private createAllSeries = createSelector( - (input: { encoder: Encoder; data: Dataset }) => input.encoder, + (input: { encoder: LineEncoder; data: Dataset }) => input.encoder, input => input.data, (encoder, data) => { const { channels } = encoder; @@ -94,17 +102,17 @@ export default class LineChart extends PureComponent { const key = fieldNames.map(f => firstDatum[f]).join(','); const series: Series = { key: key.length === 0 ? channels.y.getTitle() : key, - fill: channels.fill.encode(firstDatum, false), - stroke: channels.stroke.encode(firstDatum, '#222'), - strokeDasharray: channels.strokeDasharray.encode(firstDatum, ''), - strokeWidth: channels.strokeWidth.encode(firstDatum, 1), + fill: channels.fill.encodeDatum(firstDatum, false), + stroke: channels.stroke.encodeDatum(firstDatum, '#222'), + strokeDasharray: channels.strokeDasharray.encodeDatum(firstDatum, ''), + strokeWidth: channels.strokeWidth.encodeDatum(firstDatum, 1), values: [], }; series.values = seriesData .map(v => ({ - x: channels.x.get(v), - y: channels.y.get(v), + x: channels.x.getValueFromDatum(v), + y: channels.y.getValueFromDatum(v), data: v, parent: series, })) @@ -126,12 +134,6 @@ export default class LineChart extends PureComponent { static defaultProps = defaultProps; - constructor(props: Props) { - super(props); - - this.renderChart = this.renderChart.bind(this); - } - // eslint-disable-next-line class-methods-use-this renderSeries(allSeries: Series[]) { const filledSeries = flatMap( @@ -177,21 +179,14 @@ export default class LineChart extends PureComponent { return filledSeries.concat(unfilledSeries); } - renderChart(dim: Dimension) { + renderChart = (dim: Dimension) => { const { width, height } = dim; - const { data, margin, theme, TooltipRenderer } = this.props; + const { data, margin, theme, TooltipRenderer, encoding } = this.props; - const encoder = this.createEncoder(this.props); + const encoder = this.createEncoder(encoding); const { channels } = encoder; - if (typeof channels.x.scale !== 'undefined') { - const xDomain = channels.x.getDomain(data); - channels.x.scale.setDomain(xDomain); - } - if (typeof channels.y.scale !== 'undefined') { - const yDomain = channels.y.getDomain(data); - channels.y.scale.setDomain(yDomain); - } + encoder.setDomainFromDataset(data); const allSeries = this.createAllSeries({ encoder, data }); @@ -244,8 +239,8 @@ export default class LineChart extends PureComponent { renderTooltip={null} theme={theme} tooltipData={tooltipData} - xScale={convertScaleToDataUIScale(channels.x.scale!.config)} - yScale={convertScaleToDataUIScale(channels.y.scale!.config)} + xScale={convertScaleToDataUIScale(channels.x.definition.scale as any)} + yScale={convertScaleToDataUIScale(channels.y.definition.scale as any)} onMouseMove={onMouseMove} onMouseLeave={onMouseLeave} > @@ -272,12 +267,10 @@ export default class LineChart extends PureComponent { )} )); - } + }; render() { - const { className, data, width, height } = this.props; - - const encoder = this.createEncoder(this.props); + const { className, data, width, height, encoding } = this.props; return ( { width={width} height={height} position="top" - renderLegend={createRenderLegend(encoder, data, this.props)} + renderLegend={createRenderLegend(this.createEncoder(encoding), data, this.props)} renderChart={this.renderChart} /> ); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/DefaultTooltipRenderer.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/DefaultTooltipRenderer.tsx similarity index 71% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/DefaultTooltipRenderer.tsx rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/DefaultTooltipRenderer.tsx index fa3bf48d0fd8..69936a85cd81 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/ScatterPlot/DefaultTooltipRenderer.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/DefaultTooltipRenderer.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { TooltipFrame, TooltipTable } from '@superset-ui/chart-composition'; -import { isFieldDef } from '../encodeable/types/ChannelDef'; +import { isFieldDef } from 'encodable'; import { TooltipProps } from './ScatterPlot'; export default function DefaultTooltipRenderer({ datum, encoder }: TooltipProps) { @@ -8,43 +8,43 @@ export default function DefaultTooltipRenderer({ datum, encoder }: TooltipProps) const { x, y, size, fill, stroke } = channels; const tooltipRows = [ - { key: 'x', keyColumn: x.getTitle(), valueColumn: x.format(datum.data) }, - { key: 'y', keyColumn: y.getTitle(), valueColumn: y.format(datum.data) }, + { key: 'x', keyColumn: x.getTitle(), valueColumn: x.formatDatum(datum) }, + { key: 'y', keyColumn: y.getTitle(), valueColumn: y.formatDatum(datum) }, ]; if (isFieldDef(fill.definition)) { tooltipRows.push({ key: 'fill', keyColumn: fill.getTitle(), - valueColumn: fill.format(datum.data), + valueColumn: fill.formatDatum(datum), }); } if (isFieldDef(stroke.definition)) { tooltipRows.push({ key: 'stroke', keyColumn: stroke.getTitle(), - valueColumn: stroke.format(datum.data), + valueColumn: stroke.formatDatum(datum), }); } if (isFieldDef(size.definition)) { tooltipRows.push({ key: 'size', keyColumn: size.getTitle(), - valueColumn: size.format(datum.data), + valueColumn: size.formatDatum(datum), }); } channels.group.forEach(g => { tooltipRows.push({ key: `${g.name}`, keyColumn: g.getTitle(), - valueColumn: g.format(datum.data), + valueColumn: g.formatDatum(datum), }); }); channels.tooltip.forEach(g => { tooltipRows.push({ key: `${g.name}`, keyColumn: g.getTitle(), - valueColumn: g.format(datum.data), + valueColumn: g.formatDatum(datum), }); }); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/Encoder.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/Encoder.ts new file mode 100644 index 000000000000..37060226a1b9 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/Encoder.ts @@ -0,0 +1,38 @@ +import { createEncoderFactory, Encoder, DeriveEncoding, DeriveChannelOutputs } from 'encodable'; + +export type ScatterPlotEncodingConfig = { + x: ['X', number]; + y: ['Y', number]; + fill: ['Color', string]; + group: ['Category', string, 'multiple']; + size: ['Numeric', number]; + stroke: ['Color', string]; + tooltip: ['Text', string, 'multiple']; +}; + +export const scatterPlotEncoderFactory = createEncoderFactory({ + channelTypes: { + x: 'X', + y: 'Y', + fill: 'Color', + group: 'Category', + size: 'Numeric', + stroke: 'Color', + tooltip: 'Text', + }, + defaultEncoding: { + x: { field: 'x', type: 'quantitative' }, + y: { field: 'y', type: 'quantitative' }, + fill: { value: '#222' }, + group: [], + size: { value: 5 }, + stroke: { value: 'none' }, + tooltip: [], + }, +}); + +export type ScatterPlotEncoding = DeriveEncoding; + +export type ScatterPlotEncoder = Encoder; + +export type ScatterPlotChannelOutputs = DeriveChannelOutputs; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/ScatterPlot.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/ScatterPlot.tsx new file mode 100644 index 000000000000..f592f79ce39e --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/ScatterPlot/ScatterPlot.tsx @@ -0,0 +1,121 @@ +import React, { PureComponent } from 'react'; +import { XYChart, PointSeries } from '@data-ui/xy-chart'; +import { chartTheme, ChartTheme } from '@data-ui/theme'; +import { Margin, Dimension } from '@superset-ui/dimension'; +import { WithLegend } from '@superset-ui/chart-composition'; +import { isFieldDef, Dataset, PlainObject } from 'encodable'; + +import { + scatterPlotEncoderFactory, + ScatterPlotEncoder, + ScatterPlotEncodingConfig, + ScatterPlotEncoding, +} from './Encoder'; +import createMarginSelector, { DEFAULT_MARGIN } from '../../utils/createMarginSelector'; +import DefaultTooltipRenderer from './DefaultTooltipRenderer'; +import convertScaleToDataUIScale from '../../utils/convertScaleToDataUIScaleShape'; +import createXYChartLayoutWithTheme from '../../utils/createXYChartLayoutWithTheme'; +import createRenderLegend from '../legend/createRenderLegend'; +import { LegendHooks } from '../legend/types'; + +export interface TooltipProps { + datum: PlainObject; + encoder: ScatterPlotEncoder; +} + +const defaultProps = { + className: '', + margin: DEFAULT_MARGIN, + encoding: {}, + theme: chartTheme, + TooltipRenderer: DefaultTooltipRenderer, +} as const; + +export type HookProps = { + TooltipRenderer?: React.ComponentType; +} & LegendHooks; + +type Props = { + className?: string; + width: string | number; + height: string | number; + margin?: Margin; + data: Dataset; + encoding?: Partial; + theme?: ChartTheme; +} & HookProps & + Readonly; + +export default class ScatterPlot extends PureComponent { + private createEncoder = scatterPlotEncoderFactory.createSelector(); + + private createMargin = createMarginSelector(); + + static defaultProps = defaultProps; + + renderChart = (dim: Dimension) => { + const { width, height } = dim; + const { data, margin, theme, TooltipRenderer, encoding } = this.props; + const encoder = this.createEncoder(encoding); + const { channels } = encoder; + + encoder.setDomainFromDataset(data); + + const encodedData = data.map(d => ({ + x: channels.x.getValueFromDatum(d), + y: channels.y.getValueFromDatum(d), + ...d, + })); + + const layout = createXYChartLayoutWithTheme({ + width, + height, + margin: this.createMargin(margin), + theme, + xEncoder: channels.x, + yEncoder: channels.y, + }); + + return layout.renderChartWithFrame((chartDim: Dimension) => ( + ( + + )} + theme={theme} + xScale={convertScaleToDataUIScale(channels.x.definition.scale as any)} + yScale={convertScaleToDataUIScale(channels.y.definition.scale as any)} + > + {layout.renderXAxis()} + {layout.renderYAxis()} + channels.fill.encodeDatum(d)} + fillOpacity={0.5} + stroke={(d: PlainObject) => channels.stroke.encodeDatum(d)} + size={(d: PlainObject) => channels.size.encodeDatum(d)} + /> + + )); + }; + + render() { + const { className, data, width, height, encoding } = this.props; + + return ( + + ); + } +} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegend.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegend.tsx index de0a5ef9f633..57608f3484c0 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegend.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegend.tsx @@ -1,5 +1,5 @@ import React, { CSSProperties, PureComponent } from 'react'; -import AbstractEncoder from '../../encodeable/AbstractEncoder'; +import { EncodingConfig } from 'encodable'; import { LegendRendererProps } from './types'; import DefaultLegendGroup from './DefaultLegendGroup'; @@ -13,10 +13,10 @@ const LEGEND_CONTAINER_STYLE: CSSProperties = { position: 'relative', }; -export type Props = LegendRendererProps; +export type Props = LegendRendererProps; -export default class DefaultLegend> extends PureComponent< - Props +export default class DefaultLegend extends PureComponent< + Props > { render() { const { @@ -35,15 +35,17 @@ export default class DefaultLegend> ex return (
- {groups.map(items => ( - - ))} + {groups + .filter(group => 'items' in group && group.items.length > 0) + .map(group => ( + + ))}
); } diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegendGroup.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegendGroup.tsx index 8e946dad5fbc..b9d8695527eb 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegendGroup.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegendGroup.tsx @@ -1,4 +1,5 @@ import React, { CSSProperties } from 'react'; +import { EncodingConfig } from 'encodable'; import { LegendGroupRendererProps } from './types'; import DefaultLegendItem from './DefaultLegendItem'; @@ -14,26 +15,28 @@ const LEGEND_GROUP_STYLE: CSSProperties = { padding: 8, }; -export default function DefaultLegendGroupRenderer({ - items, +export default function DefaultLegendGroupRenderer({ + group, ItemRenderer = DefaultLegendItem, ItemMarkRenderer, ItemLabelRenderer, style, -}: LegendGroupRendererProps) { +}: LegendGroupRendererProps) { const combinedStyle = typeof style === 'undefined' ? LEGEND_GROUP_STYLE : { ...LEGEND_GROUP_STYLE, ...style }; return (
- {items.map(item => ( - - ))} + {'items' in group && + group.items.map(item => ( + + ))}
); } diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegendItem.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegendItem.tsx index c5f37b32d295..12fa8fbd4aa7 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegendItem.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/DefaultLegendItem.tsx @@ -1,33 +1,35 @@ import React, { CSSProperties } from 'react'; import { LegendItem, LegendLabel } from '@vx/legend'; +import { EncodingConfig } from 'encodable'; import { LegendItemRendererProps } from './types'; const MARK_SIZE = 8; const MARK_STYLE: CSSProperties = { display: 'inline-block' }; -export default function DefaultLegendItem({ +export default function DefaultLegendItem({ + group, item, MarkRenderer, LabelRenderer, -}: LegendItemRendererProps) { +}: LegendItemRendererProps) { return ( - + {typeof MarkRenderer === 'undefined' ? ( ({ /> ) : ( - + )} {typeof LabelRenderer === 'undefined' ? ( - {item.value} + {item.input} ) : ( - + )} ); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/createRenderLegend.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/createRenderLegend.tsx index d31a3ec46954..d8d09cdf13e1 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/createRenderLegend.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/components/legend/createRenderLegend.tsx @@ -1,13 +1,12 @@ import React from 'react'; -import AbstractEncoder from '../../encodeable/AbstractEncoder'; +import { Encoder, EncodingConfig, Dataset } from 'encodable'; import { LegendHooks } from './types'; import DefaultLegend from './DefaultLegend'; -import { Dataset } from '../../encodeable/types/Data'; -export default function createRenderLegend>( - encoder: Encoder, +export default function createRenderLegend( + encoder: Encoder, data: Dataset, - props: LegendHooks, + props: LegendHooks, ) { if (encoder.hasLegend()) { const { @@ -20,7 +19,7 @@ export default function createRenderLegend ( = { - field: string; - value: ChannelInput; - encodedValues: Partial>; +export type LegendItemMarkRendererProps = { + group: LegendGroupInformation; + item: LegendItemInformation; }; -export type LegendItemMarkRendererType = React.ComponentType<{ - item: LegendItemInfo; -}>; +export type LegendItemMarkRendererType = React.ComponentType< + LegendItemMarkRendererProps +>; + +export type LegendItemLabelRendererProps< + Config extends EncodingConfig +> = LegendItemMarkRendererProps; -export type LegendItemLabelRendererType = React.ComponentType<{ - item: LegendItemInfo; -}>; +export type LegendItemLabelRendererType = React.ComponentType< + LegendItemLabelRendererProps +>; -export type LegendItemRendererProps = { - item: LegendItemInfo; - MarkRenderer?: LegendItemMarkRendererType; - LabelRenderer?: LegendItemLabelRendererType; +export type LegendItemRendererProps = { + group: LegendGroupInformation; + item: LegendItemInformation; + MarkRenderer?: LegendItemMarkRendererType; + LabelRenderer?: LegendItemLabelRendererType; }; -export type LegendItemRendererType = React.ComponentType< - LegendItemRendererProps +export type LegendItemRendererType = React.ComponentType< + LegendItemRendererProps >; -export type LegendGroupRendererProps = { - items: LegendItemInfo[]; - ItemRenderer?: LegendItemRendererType; - ItemMarkRenderer?: LegendItemMarkRendererType; - ItemLabelRenderer?: LegendItemLabelRendererType; +export type LegendGroupRendererProps = { + group: LegendGroupInformation; + ItemRenderer?: LegendItemRendererType; + ItemMarkRenderer?: LegendItemMarkRendererType; + ItemLabelRenderer?: LegendItemLabelRendererType; style?: CSSProperties; }; -export type LegendGroupRendererType = React.ComponentType< - LegendGroupRendererProps +export type LegendGroupRendererType = React.ComponentType< + LegendGroupRendererProps >; -export type LegendRendererProps = { - groups: LegendItemInfo[][]; - LegendGroupRenderer?: LegendGroupRendererType; - LegendItemRenderer?: LegendItemRendererType; - LegendItemMarkRenderer?: LegendItemMarkRendererType; - LegendItemLabelRenderer?: LegendItemLabelRendererType; +export type LegendRendererProps = { + groups: LegendGroupInformation[]; + LegendGroupRenderer?: LegendGroupRendererType; + LegendItemRenderer?: LegendItemRendererType; + LegendItemMarkRenderer?: LegendItemMarkRendererType; + LegendItemLabelRenderer?: LegendItemLabelRendererType; style?: CSSProperties; }; -export type LegendRendererType = React.ComponentType>; - -export type LegendHooks< - Encoder, - Encoding = Encoder extends AbstractEncoder ? Encoding : never -> = { - LegendRenderer?: LegendRendererType; - LegendGroupRenderer?: LegendGroupRendererType; - LegendItemRenderer?: LegendItemRendererType; - LegendItemMarkRenderer?: LegendItemMarkRendererType; - LegendItemLabelRenderer?: LegendItemLabelRendererType; +export type LegendRendererType = React.ComponentType< + LegendRendererProps +>; + +export type LegendHooks = { + LegendRenderer?: LegendRendererType; + LegendGroupRenderer?: LegendGroupRendererType; + LegendItemRenderer?: LegendItemRendererType; + LegendItemMarkRenderer?: LegendItemMarkRendererType; + LegendItemLabelRenderer?: LegendItemLabelRendererType; }; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AbstractEncoder.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AbstractEncoder.ts deleted file mode 100644 index 5740326832ac..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AbstractEncoder.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { flatMap } from 'lodash'; -import { Value } from 'vega-lite/build/src/channeldef'; -import { ChannelType, ChannelInput, AllChannelOptions } from './types/Channel'; -import { FullSpec, BaseOptions, PartialSpec } from './types/Specification'; -import { isFieldDef, isTypedFieldDef, ChannelDef } from './types/ChannelDef'; -import { Dataset } from './types/Data'; -import { Unarray, MayBeArray, isArray, isNotArray } from './types/Base'; -import ChannelEncoder from './ChannelEncoder'; - -type AllChannelEncoders>> = { - readonly [k in keyof Encoding]: Encoding[k] extends any[] - ? ChannelEncoder>[] - : ChannelEncoder>; -}; - -export default abstract class AbstractEncoder< - ChannelTypes extends Record, - Encoding extends Record>, - Options extends BaseOptions = BaseOptions -> { - readonly spec: FullSpec; - - readonly channelTypes: ChannelTypes; - - readonly channels: AllChannelEncoders; - - readonly legends: { - [key: string]: (keyof Encoding)[]; - }; - - constructor( - channelTypes: ChannelTypes, - spec: PartialSpec, - defaultEncoding?: Encoding, - allChannelOptions: AllChannelOptions = {}, - ) { - this.channelTypes = channelTypes; - this.spec = this.createFullSpec(spec, defaultEncoding); - const { encoding } = this.spec; - - const channelNames = this.getChannelNames(); - - const channels: { [k in keyof Encoding]?: MayBeArray> } = {}; - - channelNames.forEach(name => { - const channelEncoding = encoding[name]; - if (isArray(channelEncoding)) { - const definitions = channelEncoding; - channels[name] = definitions.map( - (definition, i) => - new ChannelEncoder({ - definition, - name: `${name}[${i}]`, - type: 'Text', - }), - ); - } else if (isNotArray(channelEncoding)) { - const definition = channelEncoding; - channels[name] = new ChannelEncoder({ - definition, - name, - options: { - ...this.spec.options, - ...allChannelOptions[name], - }, - type: channelTypes[name], - }); - } - }); - - this.channels = channels as AllChannelEncoders; - - type ChannelName = keyof Encoding; - - // Group the channels that use the same field together - // so they can share the same legend. - this.legends = {}; - channelNames - .map(name => this.channels[name]) - .forEach(c => { - if (isNotArray(c) && c.hasLegend() && isFieldDef(c.definition)) { - const name = c.name as ChannelName; - const { field } = c.definition; - if (this.legends[field]) { - this.legends[field].push(name); - } else { - this.legends[field] = [name]; - } - } - }); - } - - /** - * subclass can override this - */ - // eslint-disable-next-line class-methods-use-this - createFullSpec(spec: PartialSpec, defaultEncoding?: Encoding) { - if (typeof defaultEncoding === 'undefined') { - return spec as FullSpec; - } - - const { encoding, ...rest } = spec; - - return { - ...rest, - encoding: { - ...defaultEncoding, - ...encoding, - }, - }; - } - - getChannelNames() { - return Object.keys(this.channelTypes) as (keyof ChannelTypes)[]; - } - - getChannelsAsArray() { - return this.getChannelNames().map(name => this.channels[name]); - } - - getGroupBys() { - const fields = flatMap(this.getChannelsAsArray()) - .filter(c => c.isGroupBy()) - .map(c => (isFieldDef(c.definition) ? c.definition.field : '')) - .filter(field => field !== ''); - - return Array.from(new Set(fields)); - } - - getLegendInfos(data: Dataset) { - return Object.keys(this.legends) - .map((field: string) => { - const channelNames = this.legends[field]; - const channelEncoder = this.channels[channelNames[0]]; - - if (isNotArray(channelEncoder) && isTypedFieldDef(channelEncoder.definition)) { - // Only work for nominal channels now - // TODO: Add support for numerical scale - if (channelEncoder.definition.type === 'nominal') { - const domain = channelEncoder.getDomain(data) as string[]; - - return domain.map((value: ChannelInput) => ({ - field, - value, - encodedValues: channelNames.reduce( - (prev: Partial>, curr) => { - const map = prev; - const channel = this.channels[curr]; - if (isNotArray(channel)) { - map[curr] = channel.encodeValue(value); - } - - return map; - }, - {}, - ), - })); - } - } - - return []; - }) - .filter(items => items.length > 0); - } - - hasLegend() { - return Object.keys(this.legends).length > 0; - } -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AxisAgent.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AxisAgent.ts deleted file mode 100644 index 214ccef50414..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/AxisAgent.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { CSSProperties } from 'react'; -import { getTextDimension, Margin, Dimension } from '@superset-ui/dimension'; -import { CategoricalColorScale } from '@superset-ui/color'; -import { extractFormatFromTypeAndFormat } from './parsers/extractFormat'; -import { CoreAxis, LabelOverlapStrategy, AxisOrient } from './types/Axis'; -import { PositionFieldDef, ChannelDef } from './types/ChannelDef'; -import ChannelEncoder from './ChannelEncoder'; -import { DEFAULT_LABEL_ANGLE } from '../utils/constants'; - -const DEFAULT_BASE_CONFIG: { - labelOverlap: LabelOverlapStrategy; - labelPadding: number; - tickCount: number; -} = { - labelOverlap: 'auto', - labelPadding: 4, - tickCount: 5, -}; - -const DEFAULT_X_CONFIG: CoreAxis = { - ...DEFAULT_BASE_CONFIG, - labelAngle: DEFAULT_LABEL_ANGLE, - orient: 'bottom', -}; - -const DEFAULT_Y_CONFIG: CoreAxis = { - ...DEFAULT_BASE_CONFIG, - labelAngle: 0, - orient: 'left', -}; - -export interface AxisLayout { - axisWidth: number; - labelAngle: number; - labelFlush: number | boolean; - labelOffset: number; - labelOverlap: 'flat' | 'rotate'; - minMargin: Partial; - orient: AxisOrient; - tickLabelDimensions: Dimension[]; - tickLabels: string[]; - tickTextAnchor?: string; -} - -export default class AxisAgent { - private readonly channelEncoder: ChannelEncoder; - - private readonly format?: (value: any) => string; - - readonly config: CoreAxis; - - constructor(channelEncoder: ChannelEncoder) { - this.channelEncoder = channelEncoder; - const definition = channelEncoder.definition as PositionFieldDef; - const { type, axis = {} } = definition; - - this.config = this.channelEncoder.isX() - ? { ...DEFAULT_X_CONFIG, ...axis } - : { ...DEFAULT_Y_CONFIG, ...axis }; - - if (typeof axis.format !== 'undefined') { - this.format = extractFormatFromTypeAndFormat(type, axis.format); - } - } - - getFormat() { - return this.format ?? this.channelEncoder.formatValue; - } - - hasTitle() { - return this.getTitle() !== ''; - } - - getTitle() { - const { title } = this.config; - - if (title === undefined || title === true) { - return this.channelEncoder.getTitle(); - } - if (title === false || title === '') { - return ''; - } - - return title; - } - - getTickLabels() { - const { tickCount, values } = this.config; - - const format = this.getFormat(); - if (typeof values !== 'undefined') { - return (values as any[]).map(format); - } - - if (typeof this.channelEncoder.scale !== 'undefined') { - const { scale } = this.channelEncoder.scale; - if (typeof scale !== 'undefined' && !(scale instanceof CategoricalColorScale)) { - return ('ticks' in scale && typeof scale.ticks !== 'undefined' - ? (scale.ticks(tickCount) as number[]) - : (scale.domain() as number[]) - ).map(format); - } - } - - return []; - } - - computeLayout({ - axisTitleHeight = 20, - axisWidth, - gapBetweenAxisLabelAndBorder = 4, - gapBetweenTickAndTickLabel = 4, - labelAngle = this.config.labelAngle, - tickSize = 8, - tickTextStyle = {}, - }: { - axisTitleHeight?: number; - axisWidth: number; - gapBetweenAxisLabelAndBorder?: number; - gapBetweenTickAndTickLabel?: number; - labelAngle?: number; - tickSize?: number; - tickTextStyle?: CSSProperties; - }): AxisLayout { - const tickLabels = this.getTickLabels(); - - const tickLabelDimensions = tickLabels.map((text: string) => - getTextDimension({ - style: tickTextStyle, - text, - }), - ); - - const { labelOverlap, labelPadding, orient } = this.config; - - const maxWidth = Math.max(...tickLabelDimensions.map((d: Dimension) => d.width), 0); - - // TODO: Add other strategies: stagger, chop, wrap. - let strategyForLabelOverlap = labelOverlap; - if (strategyForLabelOverlap === 'auto') { - // cheap heuristic, can improve - const widthPerTick = axisWidth / tickLabels.length; - if (this.channelEncoder.isY() || maxWidth <= widthPerTick) { - strategyForLabelOverlap = 'flat'; - } else { - strategyForLabelOverlap = 'rotate'; - } - } - - const spaceForAxisTitle = this.hasTitle() ? labelPadding + axisTitleHeight : 0; - let tickTextAnchor; - let labelOffset: number = 0; - let requiredMargin = - tickSize + gapBetweenTickAndTickLabel + spaceForAxisTitle + gapBetweenAxisLabelAndBorder; - - if (this.channelEncoder.isX()) { - if (strategyForLabelOverlap === 'flat') { - const labelHeight = tickLabelDimensions.length > 0 ? tickLabelDimensions[0].height : 0; - labelOffset = labelHeight + labelPadding; - requiredMargin += labelHeight; - } else if (strategyForLabelOverlap === 'rotate') { - const labelHeight = Math.ceil(Math.abs(maxWidth * Math.sin((labelAngle * Math.PI) / 180))); - labelOffset = labelHeight + labelPadding; - requiredMargin += labelHeight; - tickTextAnchor = - (orient === 'top' && labelAngle > 0) || (orient === 'bottom' && labelAngle < 0) - ? 'end' - : 'start'; - } - requiredMargin += 8; - } else { - labelOffset = maxWidth + spaceForAxisTitle; - requiredMargin += maxWidth; - } - - return { - axisWidth, - labelAngle: strategyForLabelOverlap === 'flat' ? 0 : labelAngle, - labelFlush: - typeof this.config.labelFlush === 'undefined' - ? // If not set, only enable flushing for continuous scales - this.channelEncoder.scale!.scaleTypeCategory === 'continuous' - : this.config.labelFlush, - labelOffset, - labelOverlap: strategyForLabelOverlap, - minMargin: { - [orient]: Math.ceil(requiredMargin), - }, - orient, - tickLabelDimensions, - tickLabels, - tickTextAnchor, - }; - } -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/ChannelEncoder.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/ChannelEncoder.ts deleted file mode 100644 index 300962c22eea..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/ChannelEncoder.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { extent as d3Extent } from 'd3-array'; -import { extractFormatFromChannelDef } from './parsers/extractFormat'; -import extractScale, { ScaleAgent } from './parsers/extractScale'; -import extractGetter from './parsers/extractGetter'; -import { ChannelOptions, ChannelType, ChannelInput } from './types/Channel'; -import { PlainObject, Dataset } from './types/Data'; -import { - ChannelDef, - isScaleFieldDef, - isMarkPropFieldDef, - isValueDef, - isFieldDef, - isNonValueDef, - isTypedFieldDef, - ExtractChannelOutput, -} from './types/ChannelDef'; -import isEnabled from './utils/isEnabled'; -import isDisabled from './utils/isDisabled'; -import identity from './utils/identity'; -import AxisAgent from './AxisAgent'; - -export default class ChannelEncoder { - readonly name: string | Symbol | number; - - readonly type: ChannelType; - - readonly definition: Def; - - readonly options: ChannelOptions; - - protected readonly getValue: (datum: PlainObject) => ChannelInput; - - readonly encodeValue: (value: ChannelInput) => ExtractChannelOutput | null | undefined; - - readonly formatValue: (value: ChannelInput | { toString(): string }) => string; - - readonly scale?: ScaleAgent>; - - readonly axis?: AxisAgent; - - constructor({ - name, - type, - definition, - options = {}, - }: { - name: string | Symbol | number; - type: ChannelType; - definition: Def; - options?: ChannelOptions; - }) { - this.name = name; - this.type = type; - this.definition = definition; - this.options = options; - - this.getValue = extractGetter(definition); - this.formatValue = extractFormatFromChannelDef(definition); - this.scale = extractScale(this.type, definition, options.namespace); - // Has to extract axis after format and scale - if ( - this.isXY() && - isNonValueDef(this.definition) && - (('axis' in this.definition && isEnabled(this.definition.axis)) || - !('axis' in this.definition)) - ) { - this.axis = new AxisAgent(this); - } - - this.encodeValue = this.scale ? this.scale.encodeValue : identity; - this.encode = this.encode.bind(this); - this.format = this.format.bind(this); - this.get = this.get.bind(this); - } - - encode(datum: PlainObject): ExtractChannelOutput | null | undefined; - - // eslint-disable-next-line no-dupe-class-members - encode(datum: PlainObject, otherwise: ExtractChannelOutput): ExtractChannelOutput; - - // eslint-disable-next-line no-dupe-class-members - encode(datum: PlainObject, otherwise?: ExtractChannelOutput) { - const value = this.get(datum); - if (value === null || value === undefined) { - return otherwise; - } - - const output = this.encodeValue(value); - - return otherwise !== undefined && (output === null || output === undefined) - ? otherwise - : output; - } - - format(datum: PlainObject): string { - return this.formatValue(this.get(datum)); - } - - get(datum: PlainObject, otherwise?: T) { - const value = this.getValue(datum); - - return otherwise !== undefined && (value === null || value === undefined) - ? otherwise - : (value as T); - } - - getDomain(data: Dataset) { - if (isTypedFieldDef(this.definition)) { - const { type } = this.definition; - if (type === 'nominal' || type === 'ordinal') { - return Array.from(new Set(data.map(d => this.get(d)))) as string[]; - } - if (type === 'quantitative') { - const extent = d3Extent(data, d => this.get(d)); - if (typeof extent[0] === 'undefined') { - return [0, 1]; - } - - return extent as [number, number]; - } - if (type === 'temporal') { - const extent = d3Extent(data, d => this.get(d)); - if (typeof extent[0] === 'undefined') { - return [0, 1]; - } - - return extent as [number, number] | [Date, Date]; - } - } - - return []; - } - - getTitle() { - if (isFieldDef(this.definition)) { - return this.definition.title ?? this.definition.field; - } - - return ''; - } - - hasLegend() { - if (isDisabled(this.options.legend) || this.isXY() || isValueDef(this.definition)) { - return false; - } - if (isMarkPropFieldDef(this.definition)) { - return isEnabled(this.definition.legend); - } - - return isScaleFieldDef(this.definition); - } - - isGroupBy() { - if (isTypedFieldDef(this.definition)) { - const { type: dataType } = this.definition; - - return ( - this.type === 'Category' || - this.type === 'Text' || - (this.type === 'Color' && (dataType === 'nominal' || dataType === 'ordinal')) || - (this.isXY() && (dataType === 'nominal' || dataType === 'ordinal')) - ); - } - - return false; - } - - isX() { - return this.type === 'X' || this.type === 'XBand'; - } - - isXY() { - return this.type === 'X' || this.type === 'Y' || this.type === 'XBand' || this.type === 'YBand'; - } - - isY() { - return this.type === 'Y' || this.type === 'YBand'; - } -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/createEncoderClass.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/createEncoderClass.ts deleted file mode 100644 index e1303e054f6f..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/createEncoderClass.ts +++ /dev/null @@ -1,29 +0,0 @@ -import AbstractEncoder from './AbstractEncoder'; -import { PartialSpec, BaseOptions } from './types/Specification'; -import { MayBeArray } from './types/Base'; -import { ChannelDef } from './types/ChannelDef'; -import { ChannelType, AllChannelOptions } from './types/Channel'; - -export default function createEncoderClass< - ChannelTypes extends Record, - Encoding extends Record>, - Options extends BaseOptions = BaseOptions ->({ - channelTypes, - defaultEncoding, - allChannelOptions = {}, -}: { - channelTypes: ChannelTypes; - defaultEncoding: Encoding; - allChannelOptions?: AllChannelOptions; -}) { - return class Encoder extends AbstractEncoder { - static readonly DEFAULT_ENCODING: Encoding = defaultEncoding; - - static readonly ALL_CHANNEL_OPTIONS = allChannelOptions; - - constructor(spec: PartialSpec) { - super(channelTypes, spec, defaultEncoding, allChannelOptions); - } - }; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/createEncoderSelector.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/createEncoderSelector.ts deleted file mode 100644 index 6685a715b1ab..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/createEncoderSelector.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { createSelector } from 'reselect'; -import { PartialSpec, BaseOptions } from './types/Specification'; -import AbstractEncoder from './AbstractEncoder'; -import { ChannelType } from './types/Channel'; -import { ChannelDef } from './types/ChannelDef'; -import { MayBeArray } from './types/Base'; - -export default function createEncoderSelector< - EncoderConstructor extends AbstractEncoder, - ChannelTypes extends Record, - Encoding extends Record>, - Options extends BaseOptions = BaseOptions ->(EncoderConstructor: new (spec: PartialSpec) => EncoderConstructor) { - return createSelector( - (spec: PartialSpec) => spec.encoding, - spec => spec.options, - (encoding, options) => new EncoderConstructor({ encoding, options }), - ); -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractFormat.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractFormat.ts deleted file mode 100644 index d79daf597420..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractFormat.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { getNumberFormatter } from '@superset-ui/number-format'; -import { getTimeFormatter } from '@superset-ui/time-format'; -import { Type } from 'vega-lite/build/src/type'; -import { isTypedFieldDef, ChannelDef } from '../types/ChannelDef'; - -const fallbackFormatter = (v: any) => `${v}`; - -export function extractFormatFromTypeAndFormat(type: Type, format: string) { - if (type === 'quantitative') { - const formatter = getNumberFormatter(format); - - return (value: any) => formatter(value); - } - if (type === 'temporal') { - const formatter = getTimeFormatter(format); - - return (value: any) => formatter(value); - } - - return fallbackFormatter; -} - -export function extractFormatFromChannelDef(definition: ChannelDef) { - if (isTypedFieldDef(definition)) { - const { type } = definition; - const format = - 'format' in definition && definition.format !== undefined ? definition.format : ''; - - return extractFormatFromTypeAndFormat(type, format); - } - - return fallbackFormatter; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractGetter.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractGetter.ts deleted file mode 100644 index 2565a139ee4b..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractGetter.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { get } from 'lodash/fp'; -import { isValueDef, ChannelDef } from '../types/ChannelDef'; -import identity from '../utils/identity'; - -export default function extractGetter(definition: ChannelDef) { - if (isValueDef(definition)) { - return () => definition.value; - } - if ('field' in definition && definition.field !== undefined) { - return get(definition.field); - } - - return identity; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractScale.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractScale.ts deleted file mode 100644 index 5d0d8eb6dc1a..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/parsers/extractScale.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { CategoricalColorNamespace, CategoricalColorScale } from '@superset-ui/color'; -import { - ScaleOrdinal, - ScaleLinear, - ScaleLogarithmic, - ScalePower, - ScaleTime, - ScaleQuantile, - ScaleQuantize, - ScaleThreshold, - ScalePoint, - ScaleBand, - scaleLinear, - scaleLog, - scalePow, - scaleSqrt, - scaleTime, - scaleUtc, - scaleQuantile, - scaleQuantize, - scaleThreshold, - scaleOrdinal, - scalePoint, - scaleBand, -} from 'd3-scale'; -import { Value } from 'vega-lite/build/src/channeldef'; -import { Type } from 'vega-lite/build/src/type'; -import { ScaleType } from 'vega-lite/build/src/scale'; -import { - isNonValueDef, - ChannelDef, - ExtractChannelOutput, - isTypedFieldDef, -} from '../types/ChannelDef'; -import isDisabled from '../utils/isDisabled'; -import { ChannelType } from '../types/Channel'; -import { Scale } from '../types/Scale'; - -export interface ScaleAgent { - config: Scale; - setDomain: (newDomain: number[] | string[] | boolean[] | Date[]) => void; - encodeValue: (value: number | string | boolean | null | undefined | Date) => Output; - scale: - | CategoricalColorScale - | ScaleLinear - | ScaleLogarithmic - | ScalePower - | ScaleLogarithmic - | ScaleTime - | ScaleQuantile - | ScaleQuantize - | ScaleThreshold - | ScaleOrdinal<{ toString(): string }, Output> - | ScalePoint<{ toString(): string }> - | ScaleBand<{ toString(): string }>; - scaleTypeCategory: 'continuous' | 'discrete' | 'discretizing' | undefined; -} - -export interface ScaleTypeToD3ScaleType { - [ScaleType.LINEAR]: ScaleLinear; - [ScaleType.LOG]: ScaleLogarithmic; - [ScaleType.POW]: ScalePower; - [ScaleType.SQRT]: ScalePower; - [ScaleType.SYMLOG]: ScaleLogarithmic; - [ScaleType.TIME]: ScaleTime; - [ScaleType.UTC]: ScaleTime; - [ScaleType.QUANTILE]: ScaleQuantile; - [ScaleType.QUANTIZE]: ScaleQuantize; - [ScaleType.THRESHOLD]: ScaleThreshold; - [ScaleType.BIN_ORDINAL]: ScaleOrdinal<{ toString(): string }, Output>; - [ScaleType.ORDINAL]: ScaleOrdinal<{ toString(): string }, Output>; - [ScaleType.POINT]: ScalePoint<{ toString(): string }>; - [ScaleType.BAND]: ScaleBand<{ toString(): string }>; -} - -export function deriveScaleTypeFromDataTypeAndChannelType( - dataType: Type | undefined, - channelType: ChannelType, - isBinned: boolean = false, -): ScaleType | undefined { - if (typeof dataType === 'undefined') { - return undefined; - } - if (dataType === 'nominal' || dataType === 'ordinal') { - switch (channelType) { - // For positional (x and y) ordinal and ordinal fields, - // "point" is the default scale type for all marks - // except bar and rect marks, which use "band" scales. - // https://vega.github.io/vega-lite/docs/scale.html - case 'XBand': - case 'YBand': - return ScaleType.BAND; - case 'X': - case 'Y': - case 'Numeric': - return ScaleType.POINT; - case 'Color': - case 'Category': - return ScaleType.ORDINAL; - default: - } - } else if (dataType === 'quantitative') { - switch (channelType) { - case 'XBand': - case 'YBand': - case 'X': - case 'Y': - case 'Numeric': - return ScaleType.LINEAR; - case 'Color': - return isBinned ? ScaleType.LINEAR : ScaleType.BIN_ORDINAL; - default: - } - } else if (dataType === 'temporal') { - switch (channelType) { - case 'XBand': - case 'YBand': - case 'X': - case 'Y': - case 'Numeric': - return ScaleType.TIME; - case 'Color': - return ScaleType.LINEAR; - default: - } - } - - return undefined; -} - -function createScaleFromType(type: ScaleType) { - switch (type) { - case ScaleType.LINEAR: - return scaleLinear(); - case ScaleType.LOG: - return scaleLog(); - case ScaleType.POW: - return scalePow(); - case ScaleType.SQRT: - return scaleSqrt(); - case ScaleType.SYMLOG: - return undefined; - case ScaleType.TIME: - return scaleTime(); - case ScaleType.UTC: - return scaleUtc(); - case ScaleType.QUANTILE: - return scaleQuantile(); - case ScaleType.QUANTIZE: - return scaleQuantize(); - case ScaleType.THRESHOLD: - return scaleThreshold(); - case ScaleType.BIN_ORDINAL: - return scaleOrdinal<{ toString(): string }, Output>(); - case ScaleType.ORDINAL: - return scaleOrdinal<{ toString(): string }, Output>(); - case ScaleType.POINT: - return scalePoint<{ toString(): string }>(); - case ScaleType.BAND: - return scaleBand<{ toString(): string }>(); - default: - return undefined; - } -} - -function createScale( - channelType: ChannelType, - scaleType: ScaleType, - config: Scale, -) { - const { namespace } = config; - - if (channelType === 'Color') { - const { scheme } = config; - - return typeof scheme === 'string' || typeof scheme === 'undefined' - ? CategoricalColorNamespace.getScale(scheme, namespace) - : // TODO: fully use SchemeParams - CategoricalColorNamespace.getScale(scheme.name, namespace); - } - - const scale = createScaleFromType(scaleType); - - if (typeof scale !== 'undefined') { - if (scale.domain && typeof config.domain !== 'undefined') { - scale.domain(config.domain as any[]); - } - if (scale.range && typeof config.range !== 'undefined') { - scale.range(config.range as any[]); - } - if ('nice' in scale && scale.nice && config.nice !== false) { - scale.nice(); - } - if ( - 'clamp' in scale && - typeof scale.clamp !== 'undefined' && - typeof config.clamp !== 'undefined' - ) { - scale.clamp(config.clamp); - } - } - - return scale; -} - -const continuousScaleTypes = new Set(['linear', 'pow', 'sqrt', 'symlog', 'log', 'time', 'utc']); -const discreteScaleTypes = new Set(['band', 'point', 'ordinal']); -const discretizingScaleTypes = new Set(['bin-ordinal', 'quantile', 'quantize', 'threshold']); - -function getScaleTypeCategory(scaleType: ScaleType) { - if (continuousScaleTypes.has(scaleType)) { - return 'continuous'; - } - if (discreteScaleTypes.has(scaleType)) { - return 'discrete'; - } - if (discretizingScaleTypes.has(scaleType)) { - return 'discretizing'; - } - - // eslint-disable-next-line no-console - console.warn(`Unknown scaleType ${scaleType}`); - - return undefined; -} - -export default function extractScale( - channelType: ChannelType, - definition: Def, - namespace?: string, -): ScaleAgent> | undefined { - if (isNonValueDef(definition)) { - type Output = ExtractChannelOutput; - const scaleConfig: Scale = ('scale' in definition && - typeof definition.scale !== 'undefined' - ? definition.scale - : {}) as Scale; - - // return if scale is disabled - if (isDisabled(scaleConfig)) { - return undefined; - } - - let scaleType = scaleConfig.type; - - if (typeof scaleType === 'undefined') { - // If scale type is not defined, try to derive scale type from field type - const dataType = isTypedFieldDef(definition) ? definition.type : undefined; - scaleType = deriveScaleTypeFromDataTypeAndChannelType(dataType, channelType); - - // If still do not have scale type, cannot create scale - if (typeof scaleType === 'undefined') { - return undefined; - } - } - - const scale = createScale(channelType, scaleType, { - namespace, - ...scaleConfig, - }); - - if (scale) { - const setDomain = - scale instanceof CategoricalColorScale || typeof scale.domain === 'undefined' - ? () => {} - : scale.domain; - - return { - config: { ...scaleConfig, type: scaleType }, - encodeValue: (scale as unknown) as ( - value: number | string | boolean | null | undefined | Date, - ) => Output, - scale, - scaleTypeCategory: getScaleTypeCategory(scaleType), - setDomain, - }; - } - } - - // ValueDef does not have scale - return undefined; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Axis.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Axis.ts deleted file mode 100644 index 3b489cb114c6..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Axis.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** See https://vega.github.io/vega-lite/docs/axis.html */ - -import { DateTime } from 'vega-lite/build/src/datetime'; - -export type AxisOrient = 'top' | 'bottom' | 'left' | 'right'; - -export type LabelOverlapStrategy = 'auto' | 'flat' | 'rotate'; - -export interface CoreAxis { - format?: string; - labelAngle: number; - /** - * Indicates if the first and last axis labels should be aligned flush with the scale range. - * Flush alignment for a horizontal axis will left-align the first label and right-align the last label. - * For vertical axes, bottom and top text baselines are applied instead. - * If this property is a number, it also indicates the number of pixels by which to offset the first and last labels; - * for example, a value of 2 will flush-align the first and last labels - * and also push them 2 pixels outward from the center of the axis. - * The additional adjustment can sometimes help the labels better visually group with corresponding axis ticks. */ - labelFlush?: boolean | number; - labelOverlap: LabelOverlapStrategy; - /** The padding, in pixels, between axis and text labels. */ - labelPadding: number; - orient: AxisOrient; - tickCount: number; - tickSize?: number; - title?: string | boolean; - /** Explicitly set the visible axis tick values. */ - values?: string[] | number[] | boolean[] | DateTime[]; -} - -export type Axis = Partial; - -export interface XAxis extends Axis { - orient?: 'top' | 'bottom'; - labelAngle?: number; - labelOverlap?: LabelOverlapStrategy; -} - -export interface WithXAxis { - axis?: XAxis | boolean; -} - -export interface YAxis extends Axis { - orient?: 'left' | 'right'; - labelAngle?: 0; - labelOverlap?: 'auto' | 'flat'; -} - -export interface WithYAxis { - axis?: YAxis; -} - -export interface WithAxis { - axis?: XAxis | YAxis; -} - -export function isAxis(axis: Axis | null | undefined | false): axis is Axis { - return axis !== false && axis !== null && axis !== undefined; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Base.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Base.ts deleted file mode 100644 index 65316e023965..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Base.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type ObjectWithKeysFromAndValueType = { [key in keyof T]: V }; - -export type Unarray = T extends Array ? U : T; -export type MayBeArray = T | T[]; - -export function isArray(maybeArray: T | T[]): maybeArray is T[] { - return Array.isArray(maybeArray); -} - -export function isNotArray(maybeArray: T | T[]): maybeArray is T { - return !Array.isArray(maybeArray); -} - -export function isDefined(x: any): x is T { - return typeof x !== 'undefined'; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Channel.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Channel.ts deleted file mode 100644 index 662093b61eb0..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Channel.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Value } from 'vega-lite/build/src/channeldef'; -import { XFieldDef, YFieldDef, MarkPropChannelDef, TextChannelDef } from './ChannelDef'; - -export type ChannelInput = number | string | boolean | null | Date | undefined; - -export interface ChannelOptions { - namespace?: string; - legend?: boolean; -} - -export type AllChannelOptions = Partial<{ [k in keyof Encoding]: ChannelOptions }>; - -/** - * Define all channel types and mapping to available definition grammar - */ -export interface ChannelTypeToDefMap { - // position on x-axis - X: XFieldDef; - // position on y-axis - Y: YFieldDef; - // position on x-axis but as a range, e.g., bar chart or heat map - XBand: XFieldDef; - // position on y-axis but as a range, e.g., bar chart or heat map - YBand: YFieldDef; - // numeric attributes of the mark, e.g., size, opacity - Numeric: MarkPropChannelDef; - // categorical attributes of the mark, e.g., color, visibility, shape - Category: MarkPropChannelDef; - // color of the mark - Color: MarkPropChannelDef; - // plain text, e.g., tooltip, key - Text: TextChannelDef; -} - -export type ChannelType = keyof ChannelTypeToDefMap; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/ChannelDef.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/ChannelDef.ts deleted file mode 100644 index 83a8e61a74e7..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/ChannelDef.ts +++ /dev/null @@ -1,96 +0,0 @@ -// eslint-disable no-unused-vars -import { ValueDef, Value } from 'vega-lite/build/src/channeldef'; -import { Type } from 'vega-lite/build/src/type'; -import { TimeFormatter } from '@superset-ui/time-format'; -import { NumberFormatter } from '@superset-ui/number-format'; -import { WithScale } from './Scale'; -import { WithXAxis, WithYAxis, WithAxis } from './Axis'; -import { WithLegend } from './Legend'; - -export type Formatter = NumberFormatter | TimeFormatter | ((d: any) => string); - -// ValueDef is { value: xxx } - -export interface FieldDef { - field: string; - format?: string; - title?: string; -} - -export interface TypedFieldDef extends FieldDef { - type: Type; -} - -export type TextFieldDef = FieldDef; - -type ScaleFieldDef = TypedFieldDef & WithScale; - -export type MarkPropFieldDef = ScaleFieldDef & WithLegend; - -// PositionFieldDef is { field: 'fieldName', scale: xxx, axis: xxx } - -type PositionFieldDefBase = ScaleFieldDef; - -export type XFieldDef = PositionFieldDefBase & WithXAxis; - -export type YFieldDef = PositionFieldDefBase & WithYAxis; - -export type PositionFieldDef = ScaleFieldDef & WithAxis; - -export type MarkPropChannelDef = - | MarkPropFieldDef - | ValueDef; - -export type TextChannelDef = TextFieldDef | ValueDef; - -export type NonValueDef = - | XFieldDef - | YFieldDef - | MarkPropFieldDef - | TextFieldDef; - -export type ChannelDef = NonValueDef | ValueDef; - -export type ExtractChannelOutput = Def extends ChannelDef ? Output : never; - -export function isValueDef( - channelDef: ChannelDef, -): channelDef is ValueDef { - return channelDef && 'value' in channelDef; -} - -export function isNonValueDef( - channelDef: ChannelDef, -): channelDef is NonValueDef { - return channelDef && !('value' in channelDef); -} - -export function isFieldDef( - channelDef: ChannelDef, -): channelDef is FieldDef { - return channelDef && 'field' in channelDef && !!channelDef.field; -} - -export function isTypedFieldDef( - channelDef: ChannelDef, -): channelDef is TypedFieldDef { - return isFieldDef(channelDef) && 'type' in channelDef && !!channelDef.type; -} - -export function isScaleFieldDef( - channelDef: ChannelDef, -): channelDef is ScaleFieldDef { - return channelDef && ('scale' in channelDef || 'sort' in channelDef); -} - -export function isMarkPropFieldDef( - channelDef: ChannelDef, -): channelDef is MarkPropFieldDef { - return channelDef && 'legend' in channelDef; -} - -export function isPositionFieldDef( - channelDef: ChannelDef, -): channelDef is PositionFieldDef { - return channelDef && ('axis' in channelDef || 'stack' in channelDef || 'impute' in channelDef); -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Data.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Data.ts deleted file mode 100644 index 0ce806c49daf..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Data.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type PlainObject = { - [key in Key]: Value; -}; - -export type Dataset = Partial>[]; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Legend.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Legend.ts deleted file mode 100644 index 407a8b26e0aa..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Legend.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type Legend = boolean | null; - -export interface WithLegend { - legend?: Legend; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Scale.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Scale.ts deleted file mode 100644 index 3d8f5d3fd48b..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Scale.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Value } from 'vega-lite/build/src/channeldef'; -import { DateTime } from 'vega-lite/build/src/datetime'; -import { SchemeParams, ScaleType } from 'vega-lite/build/src/scale'; - -export interface Scale { - type?: ScaleType; - domain?: number[] | string[] | boolean[] | DateTime[]; - paddingInner?: number; - paddingOuter?: number; - range?: Output[]; - clamp?: boolean; - nice?: boolean; - scheme?: string | SchemeParams; - /** vega-lite does not have this */ - namespace?: string; -} - -export interface WithScale { - scale?: Scale; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Specification.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Specification.ts deleted file mode 100644 index 7631de62eed2..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/types/Specification.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface BaseOptions { - namespace?: string; -} - -export interface PartialSpec { - encoding: Partial; - options?: Options; -} - -export interface FullSpec { - encoding: Encoding; - options?: Options; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/identity.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/identity.ts deleted file mode 100644 index 6ba7d5930028..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/identity.ts +++ /dev/null @@ -1,3 +0,0 @@ -const identity = (x: any) => x; - -export default identity; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isDisabled.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isDisabled.ts deleted file mode 100644 index d5b87caf8f37..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isDisabled.ts +++ /dev/null @@ -1,11 +0,0 @@ -export default function isDisabled( - config: - | { - [key: string]: any; - } - | boolean - | null - | undefined, -) { - return config === false || config === null; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isEnabled.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isEnabled.ts deleted file mode 100644 index 0397ed22a5e9..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/encodeable/utils/isEnabled.ts +++ /dev/null @@ -1,13 +0,0 @@ -import isDisabled from './isDisabled'; - -export default function isEnabled( - config: - | { - [key: string]: any; - } - | boolean - | null - | undefined, -) { - return !isDisabled(config); -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/index.ts index 3932d61ae3d6..d55cdcfa8250 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/index.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/index.ts @@ -1,3 +1,6 @@ export { default as BoxPlotChartPlugin } from './BoxPlot'; -export { default as ScatterPlotPlugin } from './ScatterPlot'; +export { default as LegacyBoxPlotChartPlugin } from './BoxPlot/legacy'; +export { default as ScatterPlotChartPlugin } from './ScatterPlot'; +export { default as LegacyScatterPlotChartPlugin } from './ScatterPlot/legacy'; export { default as LineChartPlugin } from './Line'; +export { default as LegacyLineChartPlugin } from './Line/legacy'; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/legacy.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/legacy.ts deleted file mode 100644 index 24c83c6d3c9b..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/legacy.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as BoxPlotChartPlugin } from './BoxPlot/legacy'; -export { default as ScatterPlotPlugin } from './ScatterPlot/legacy'; -export { default as LineChartPlugin } from './Line/legacy'; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/XYChartLayout.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/XYChartLayout.tsx index 2fe110f4c7a8..e8520149104e 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/XYChartLayout.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/XYChartLayout.tsx @@ -2,33 +2,32 @@ import React, { ReactNode, CSSProperties } from 'react'; import { XAxis, YAxis } from '@data-ui/xy-chart'; import { Margin, mergeMargin, Dimension } from '@superset-ui/dimension'; import { ChartFrame } from '@superset-ui/chart-composition'; +import { ChannelEncoder, PlainObject, Value, XFieldDef, YFieldDef } from 'encodable'; import createTickComponent from './createTickComponent'; -import ChannelEncoder from '../encodeable/ChannelEncoder'; -import { XFieldDef, YFieldDef } from '../encodeable/types/ChannelDef'; -import { PlainObject } from '../encodeable/types/Data'; -import { DEFAULT_LABEL_ANGLE } from './constants'; -import { AxisLayout } from '../encodeable/AxisAgent'; +import computeAxisLayout, { AxisLayout } from './computeAxisLayout'; + +export const DEFAULT_LABEL_ANGLE = 40; // Additional margin to avoid content hidden behind scroll bar const OVERFLOW_MARGIN = 8; -export interface XYChartLayoutConfig { +export interface XYChartLayoutConfig { width: number; height: number; minContentWidth?: number; minContentHeight?: number; margin: Margin; - xEncoder: ChannelEncoder; + xEncoder: ChannelEncoder, XOutput>; xTickSize?: number; xTickTextStyle?: CSSProperties; autoAdjustXMargin?: boolean; - yEncoder: ChannelEncoder; + yEncoder: ChannelEncoder, YOutput>; yTickSize?: number; yTickTextStyle?: CSSProperties; autoAdjustYMargin?: boolean; } -export default class XYChartLayout { +export default class XYChartLayout { chartWidth: number; chartHeight: number; @@ -39,15 +38,15 @@ export default class XYChartLayout { margin: Margin; - xEncoder: ChannelEncoder; + xEncoder: ChannelEncoder, XOutput>; xLayout?: AxisLayout; - yEncoder: ChannelEncoder; + yEncoder: ChannelEncoder, YOutput>; yLayout?: AxisLayout; - constructor(config: XYChartLayoutConfig) { + constructor(config: XYChartLayoutConfig) { const { width, height, @@ -68,9 +67,9 @@ export default class XYChartLayout { this.yEncoder = yEncoder; if (typeof yEncoder.axis !== 'undefined') { - this.yLayout = yEncoder.axis.computeLayout({ + this.yLayout = computeAxisLayout(yEncoder.axis, { axisWidth: Math.max(height - margin.top - margin.bottom), - tickSize: yEncoder.axis.config.tickSize ?? yTickSize, + defaultTickSize: yTickSize, tickTextStyle: yTickTextStyle, }); } @@ -80,10 +79,9 @@ export default class XYChartLayout { const innerWidth = Math.max(width - secondMargin.left - secondMargin.right, minContentWidth); if (typeof xEncoder.axis !== 'undefined') { - this.xLayout = xEncoder.axis.computeLayout({ + this.xLayout = computeAxisLayout(xEncoder.axis, { axisWidth: innerWidth, - labelAngle: this.recommendXLabelAngle(xEncoder.axis.config.orient as 'top' | 'bottom'), - tickSize: xEncoder.axis.config.tickSize ?? xTickSize, + defaultTickSize: xTickSize, tickTextStyle: xTickTextStyle, }); } @@ -113,17 +111,6 @@ export default class XYChartLayout { this.margin = finalMargin; } - recommendXLabelAngle(xOrient: 'top' | 'bottom' = 'bottom') { - const { axis } = this.yEncoder; - - return !this.yLayout || - (typeof axis !== 'undefined' && - ((axis.config.orient === 'right' && xOrient === 'bottom') || - (axis.config.orient === 'left' && xOrient === 'top'))) - ? DEFAULT_LABEL_ANGLE - : -DEFAULT_LABEL_ANGLE; - } - renderChartWithFrame(renderChart: (input: Dimension) => ReactNode) { return ( ) : null; @@ -161,7 +148,7 @@ export default class XYChartLayout { labelOffset={this.yLayout.labelOffset} numTicks={axis.config.tickCount} orientation={axis.config.orient} - tickFormat={axis.getFormat()} + tickFormat={axis.formatValue} {...props} /> ) : null; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/computeAxisLayout.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/computeAxisLayout.ts new file mode 100644 index 000000000000..39a06599989e --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/computeAxisLayout.ts @@ -0,0 +1,106 @@ +import { CSSProperties } from 'react'; +import { getTextDimension, Margin, Dimension } from '@superset-ui/dimension'; +import { AxisOrient, ChannelDef, Value } from 'encodable'; + +import ChannelEncoderAxis from 'encodable/lib/encoders/ChannelEncoderAxis'; + +export interface AxisLayout { + axisWidth: number; + labelAngle: number; + labelFlush: number | boolean; + labelOffset: number; + labelOverlap: 'flat' | 'rotate'; + minMargin: Partial; + orient: AxisOrient; + tickLabelDimensions: Dimension[]; + tickLabels: string[]; + tickTextAnchor?: string; +} + +export default function computeAxisLayout, Output extends Value>( + axis: ChannelEncoderAxis, + { + axisTitleHeight = 20, + axisWidth, + gapBetweenAxisLabelAndBorder = 4, + gapBetweenTickAndTickLabel = 4, + defaultTickSize = 8, + tickTextStyle = {}, + }: { + axisTitleHeight?: number; + axisWidth: number; + gapBetweenAxisLabelAndBorder?: number; + gapBetweenTickAndTickLabel?: number; + defaultTickSize?: number; + tickTextStyle?: CSSProperties; + }, +): AxisLayout { + const tickLabels = axis.getTickLabels(); + const tickLabelDimensions = tickLabels.map((text: string) => + getTextDimension({ + style: tickTextStyle, + text, + }), + ); + + const { + labelAngle, + labelFlush, + labelOverlap, + labelPadding, + orient, + tickSize = defaultTickSize, + } = axis.config; + + const maxWidth = Math.max(...tickLabelDimensions.map(d => d.width), 0); + + // cheap heuristic, can improve + const widthPerTick = axisWidth / tickLabels.length; + const isLabelOverlap = maxWidth > widthPerTick; + const labelAngleIfOverlap = labelOverlap.strategy === 'rotate' ? labelOverlap.labelAngle : 0; + const labelAngleAfterOverlapCheck = isLabelOverlap ? labelAngleIfOverlap : 0; + const finalLabelAngle = labelAngle === 0 ? labelAngleAfterOverlapCheck : labelAngle; + + const spaceForAxisTitle = axis.hasTitle() ? labelPadding + axisTitleHeight : 0; + let tickTextAnchor = 'middle'; + let labelOffset: number = 0; + let requiredMargin = + tickSize + gapBetweenTickAndTickLabel + spaceForAxisTitle + gapBetweenAxisLabelAndBorder; + + if (axis.channelEncoder.isX()) { + if (finalLabelAngle === 0) { + const labelHeight = tickLabelDimensions.length > 0 ? tickLabelDimensions[0].height : 0; + labelOffset = labelHeight + labelPadding; + requiredMargin += labelHeight; + } else { + const labelHeight = Math.ceil( + Math.abs(maxWidth * Math.sin((finalLabelAngle * Math.PI) / 180)), + ); + labelOffset = labelHeight + labelPadding; + requiredMargin += labelHeight; + tickTextAnchor = + (orient === 'top' && finalLabelAngle > 0) || (orient === 'bottom' && finalLabelAngle < 0) + ? 'end' + : 'start'; + } + requiredMargin += 8; + } else { + labelOffset = maxWidth + spaceForAxisTitle; + requiredMargin += maxWidth; + } + + return { + axisWidth, + labelAngle: finalLabelAngle, + labelFlush, + labelOffset, + labelOverlap: isLabelOverlap ? labelOverlap.strategy : 'flat', + minMargin: { + [orient]: Math.ceil(requiredMargin), + }, + orient, + tickLabelDimensions, + tickLabels, + tickTextAnchor, + }; +} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/constants.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/constants.ts deleted file mode 100644 index 29b3214e3d25..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -// eslint-disable-next-line import/prefer-default-export -export const DEFAULT_LABEL_ANGLE = 40; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/convertScaleToDataUIScaleShape.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/convertScaleToDataUIScaleShape.ts index 78f886531b0e..f3932af3d1fa 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/convertScaleToDataUIScaleShape.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/convertScaleToDataUIScaleShape.ts @@ -1,5 +1,4 @@ -import { Value } from 'vega-lite/build/src/channeldef'; -import { Scale } from '../encodeable/types/Scale'; +import { Value, ScaleConfig } from 'encodable'; type DataUIScaleType = 'time' | 'timeUtc' | 'linear' | 'band'; @@ -15,7 +14,7 @@ interface DataUIScale { } function isCompatibleDomainOrRange( - array: Scale['domain'] | Scale['range'], + array: ScaleConfig['domain'] | ScaleConfig['range'], ): array is number[] | string[] { return ( typeof array !== 'undefined' && @@ -28,8 +27,10 @@ function isCompatibleDomainOrRange( * Convert encodeable scale object into @data-ui's scale config * @param scale */ -export default function convertScaleToDataUIScale(scale: Scale) { - const { type, domain, range, nice, paddingInner, paddingOuter } = scale; +export default function convertScaleToDataUIScale( + scale: ScaleConfig, +) { + const { type, domain, range } = scale; let outputType: DataUIScaleType; @@ -48,14 +49,14 @@ export default function convertScaleToDataUIScale(scale: S if (isCompatibleDomainOrRange(range)) { output.range = range; } - if (typeof nice !== 'undefined') { - output.nice = nice; + if ('nice' in scale && typeof scale.nice === 'boolean') { + output.nice = scale.nice; } - if (typeof paddingInner !== 'undefined') { - output.paddingInner = paddingInner; + if ('paddingInner' in scale && typeof scale.paddingInner !== 'undefined') { + output.paddingInner = scale.paddingInner; } - if (typeof paddingOuter !== 'undefined') { - output.paddingOuter = paddingOuter; + if ('paddingOuter' in scale && typeof scale.paddingOuter !== 'undefined') { + output.paddingOuter = scale.paddingOuter; } return output; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/selectors/createMarginSelector.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createMarginSelector.tsx similarity index 100% rename from superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/selectors/createMarginSelector.tsx rename to superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createMarginSelector.tsx diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createTickComponent.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createTickComponent.tsx index 106d266c4a8d..f18406ac02db 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createTickComponent.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createTickComponent.tsx @@ -1,6 +1,6 @@ import React, { CSSProperties } from 'react'; import { Dimension } from '@superset-ui/dimension'; -import { AxisLayout } from '../encodeable/AxisAgent'; +import { AxisLayout } from './computeAxisLayout'; export default function createTickComponent({ axisWidth, diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createTickLabelProps.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createTickLabelProps.ts index 38502b087acb..e74d9a4bf0c5 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createTickLabelProps.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createTickLabelProps.ts @@ -1,28 +1,28 @@ -export default function createTickLabelProps({ - labelAngle, - labelOverlap, - orient, - tickTextAnchor = 'start', -}: { - labelAngle: number; - labelOverlap: string; - orient: string; - tickTextAnchor?: string; -}) { - let dx = 0; - let dy = 0; - if (labelOverlap === 'rotate' && labelAngle !== 0) { - dx = labelAngle > 0 ? -6 : 6; - if (orient === 'top') { - dx = 0; - } - dy = orient === 'top' ? -3 : 0; - } +// export default function createTickLabelProps({ +// labelAngle, +// labelOverlap, +// orient, +// tickTextAnchor = 'start', +// }: { +// labelAngle: number; +// labelOverlap: string; +// orient: string; +// tickTextAnchor?: string; +// }) { +// let dx = 0; +// let dy = 0; +// if (labelOverlap === 'rotate' && labelAngle !== 0) { +// dx = labelAngle > 0 ? -6 : 6; +// if (orient === 'top') { +// dx = 0; +// } +// dy = orient === 'top' ? -3 : 0; +// } - return { - angle: labelAngle, - dx, - dy, - textAnchor: tickTextAnchor, - }; -} +// return { +// angle: labelAngle, +// dx, +// dy, +// textAnchor: tickTextAnchor, +// }; +// } diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createXYChartLayoutWithTheme.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createXYChartLayoutWithTheme.ts index ffa7a9bb2d8a..9e42a032159a 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createXYChartLayoutWithTheme.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/src/utils/createXYChartLayoutWithTheme.ts @@ -1,31 +1,19 @@ import { ChartTheme } from '@data-ui/theme'; +import { Value } from 'encodable'; import XYChartLayout, { XYChartLayoutConfig } from './XYChartLayout'; -export default function createXYChartLayoutWithTheme( - config: XYChartLayoutConfig & { theme: ChartTheme }, +export default function createXYChartLayoutWithTheme( + config: XYChartLayoutConfig & { + theme: ChartTheme; + }, ) { - const { - width, - height, - minContentWidth, - minContentHeight, - margin, - xEncoder, - yEncoder, - theme, - } = config; + const { theme, ...rest } = config; - return new XYChartLayout({ - height, - margin, - minContentHeight, - minContentWidth, - width, - xEncoder, + return new XYChartLayout({ + ...rest, // @ts-ignore xTickSize: theme.xTickStyles.length || theme.xTickStyles.tickLength, xTickTextStyle: theme.xTickStyles.label.bottom || theme.xTickStyles.label.top, - yEncoder, // @ts-ignore yTickSize: theme.yTickStyles.length || theme.yTickStyles.tickLength, yTickTextStyle: theme.yTickStyles.label.left || theme.yTickStyles.label.right, diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/test/encodeable/parsers/extractGetter.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/test/encodeable/parsers/extractGetter.test.ts deleted file mode 100644 index 6b09e2e24539..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/test/encodeable/parsers/extractGetter.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import extractGetter from '../../../src/encodeable/parsers/extractGetter'; - -describe('extractGetter', () => { - it('extract getter from ValueDef { value: "abc" }', () => { - const getter = extractGetter({ value: 'abc' }); - expect(getter(undefined)).toEqual('abc'); - }); - - it('extract getter from FieldDef { field: "fieldName" }', () => { - const getter = extractGetter({ field: 'age' }); - expect(getter({ age: 10 })).toEqual(10); - }); -}); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/test/index.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/test/index.test.ts new file mode 100644 index 000000000000..1b51c085fca1 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/test/index.test.ts @@ -0,0 +1,29 @@ +import { + LegacyScatterPlotChartPlugin, + ScatterPlotChartPlugin, + LegacyLineChartPlugin, + LineChartPlugin, + LegacyBoxPlotChartPlugin, + BoxPlotChartPlugin, +} from '../src'; + +describe('index', () => { + it('exports ScatterPlot', () => { + expect(ScatterPlotChartPlugin).toBeDefined(); + }); + it('exports Line', () => { + expect(LineChartPlugin).toBeDefined(); + }); + it('exports BoxPlot', () => { + expect(BoxPlotChartPlugin).toBeDefined(); + }); + it('exports legacy ScatterPlot', () => { + expect(LegacyScatterPlotChartPlugin).toBeDefined(); + }); + it('exports legacy Line', () => { + expect(LegacyLineChartPlugin).toBeDefined(); + }); + it('exports legacy BoxPlot', () => { + expect(LegacyBoxPlotChartPlugin).toBeDefined(); + }); +}); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/legend/index.d.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/legend/index.d.ts deleted file mode 100644 index 79a0933b6ebf..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/legend/index.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable react/no-multi-comp */ -declare module '@vx/legend' { - import { ReactNode, ReactElement } from 'react'; - - export function LegendOrdinal(props: { [key: string]: any }): ReactElement; - - export function LegendItem(props: { [key: string]: any }): ReactElement; - - export function LegendLabel(props: { - align: string; - label?: ReactNode; - flex?: string | number; - margin?: string | number; - children?: ReactNode; - }): ReactElement; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/responsive/index.d.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/responsive/index.d.ts deleted file mode 100644 index a6a5cc36062a..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/responsive/index.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare module '@vx/responsive' { - import React from 'react'; - - interface ParentSizeProps { - children: (renderProps: { width: number; height: number }) => React.ReactNode; - } - - // eslint-disable-next-line import/prefer-default-export - export const ParentSize: React.ComponentType; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/scale/index.d.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/scale/index.d.ts deleted file mode 100644 index 57d81e673247..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/packages/superset-ui-preset-chart-xy/types/@vx/scale/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare module '@vx/scale' { - import { ScaleOrdinal } from 'd3-scale'; - - // eslint-disable-next-line import/prefer-default-export - export function scaleOrdinal(input: { - domain: Domain[]; - range: Range[]; - }): ScaleOrdinal; -} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/yarn.lock b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/yarn.lock index f06d39b3ad81..dacf04630b54 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/yarn.lock +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/superset-ui-plugins/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@airbnb/config-babel@^2.1.3": +"@airbnb/config-babel@^2.2.2": version "2.2.4" resolved "https://registry.yarnpkg.com/@airbnb/config-babel/-/config-babel-2.2.4.tgz#acdcad5ef0bb13ea7802f652324c54af5cfcb68d" integrity sha512-Fv6REtlTxwMKPRg+HeooJ/WznZ9Ed0a6V/s1Oc5DAlO7b4WhvZf2DU3bDlyY4Svi633eBB1H+DFsWzESidf5wQ== @@ -24,7 +24,7 @@ babel-plugin-transform-react-remove-prop-types "^0.4.24" babel-plugin-typescript-to-proptypes "^1.2.1" -"@airbnb/config-eslint@^2.1.3": +"@airbnb/config-eslint@^2.5.1": version "2.6.0" resolved "https://registry.yarnpkg.com/@airbnb/config-eslint/-/config-eslint-2.6.0.tgz#4e9d6cedf8cc2ebe553ad616c17f27ee502ec579" integrity sha512-dLjs2rr97gS06heH1sLceoQGB3U5RLZ5p4oO+CBzAcWwCrv7QwIDsbNIbnJWuj6unb+CY91818h+cX2GdbAshg== @@ -47,7 +47,7 @@ eslint-plugin-react-hooks "^2.4.0" eslint-plugin-unicorn "^16.1.1" -"@airbnb/config-jest@^2.1.3": +"@airbnb/config-jest@^2.2.2": version "2.2.4" resolved "https://registry.yarnpkg.com/@airbnb/config-jest/-/config-jest-2.2.4.tgz#ed68c745b048af36994134538fc82ef57f318469" integrity sha512-UOmUDBmvN2nFUe7LrrbXo3+OHiYW5utnkbqrtFiq5RS9kZhbDZ2Ihe74pYvpZISKaZid5iEJJDcOnibs9KA18Q== @@ -61,7 +61,7 @@ dom-storage "^2.1.0" jest "^25.1.0" -"@airbnb/config-prettier@^2.0.4": +"@airbnb/config-prettier@^2.1.1": version "2.1.3" resolved "https://registry.yarnpkg.com/@airbnb/config-prettier/-/config-prettier-2.1.3.tgz#e01f07b42db5926afb27292676b62b9aac1251b0" integrity sha512-R59UG7/LtwR/AixG2yqdMQ8sOkidQBCyzbST4oY+cjiLYmneMOjGFYZQfU+FTcsDT0xPP5/lqO9vrp53MajRaw== @@ -71,7 +71,7 @@ "@beemo/driver-prettier" "^1.2.2" prettier "^1.19.1" -"@airbnb/config-typescript@^2.1.2": +"@airbnb/config-typescript@^2.2.2": version "2.2.4" resolved "https://registry.yarnpkg.com/@airbnb/config-typescript/-/config-typescript-2.2.4.tgz#b5df246a1c64a564e9b56f17ffbd288289b69681" integrity sha512-jtgYi+CUSA0pKtQXCI7EZ6yVr+NwIJZkH124V7KKoqujYjooEgS9Bac2ZuHXn8W+786f0TwMnZhhp0SWZmzvQQ== @@ -134,7 +134,7 @@ execa "^4.0.0" fast-glob "^3.2.2" -"@airbnb/nimbus@^2.1.3": +"@airbnb/nimbus@^2.2.3": version "2.2.5" resolved "https://registry.yarnpkg.com/@airbnb/nimbus/-/nimbus-2.2.5.tgz#b45d639558688ccf810b7083193c174876af408b" integrity sha512-9erFcotmwJpfACsyO8vjRr9CCvvy3EwnhMBijX4T0cagJOA8Hb4HXkw+79EkTW6SYdBFScbdMhySIcBaZOTe/A== @@ -3162,32 +3162,32 @@ telejson "^3.2.0" util-deprecate "^1.0.2" -"@superset-ui/chart-composition@0.12.8": - version "0.12.8" - resolved "https://registry.yarnpkg.com/@superset-ui/chart-composition/-/chart-composition-0.12.8.tgz#2ec974ed8f5aeba0bf47667f38514da0a699f1b2" - integrity sha512-MEBdlsp8be7cRPi5w4B0EUDin+hZtezJeLTBu9gQErF4zPLbbonByM7jCcj+3Y7a/7h6sBbLhTPGYrMgO2aTXQ== +"@superset-ui/chart-composition@0.12.14": + version "0.12.14" + resolved "https://registry.yarnpkg.com/@superset-ui/chart-composition/-/chart-composition-0.12.14.tgz#291a23305d886b9d2358c0138a6dbee61edd23a4" + integrity sha512-FpiYhaDYcPaZytCx6r87wEp3oguYBkbonSWUOkZoY4ksPRgZ0bBWr8Wrwvk8zLaOCNF3jUdjXsKq/HPsRR3sKA== dependencies: "@types/react" "^16.7.17" - "@vx/responsive" "^0.0.194" + "@vx/responsive" "^0.0.195" csstype "^2.6.4" -"@superset-ui/chart@0.12.8": - version "0.12.8" - resolved "https://registry.yarnpkg.com/@superset-ui/chart/-/chart-0.12.8.tgz#25e41d7bade43887780d029e2acd4513eac2fc2b" - integrity sha512-1PWzT03lD2mRw2zRfdlQ+ljzhQEfrxg2HfgoLyRtRFfTcHHgHRo9J23+SejFoECgSYbcslMxzn73le7sO4Pc6A== +"@superset-ui/chart@0.12.14": + version "0.12.14" + resolved "https://registry.yarnpkg.com/@superset-ui/chart/-/chart-0.12.14.tgz#9fc5485a01061fd9f35d0160ae5c770aedbe3446" + integrity sha512-LaCFoG8sfBu4ohhtTFVtQlp/fdN249toWtsm7MA1vMiLX1Sk5BPPMXCJUm1iQBYnbYp5WFF+LGIgV5pI/EsMtw== dependencies: "@types/react" "^16.7.17" "@types/react-loadable" "^5.4.2" - "@vx/responsive" "^0.0.194" + "@vx/responsive" "^0.0.195" prop-types "^15.6.2" react-error-boundary "^1.2.5" react-loadable "^5.5.0" reselect "^4.0.0" -"@superset-ui/color@0.12.8": - version "0.12.8" - resolved "https://registry.yarnpkg.com/@superset-ui/color/-/color-0.12.8.tgz#5f32b915acb10b6bd213c30ed8833ffc58f5f344" - integrity sha512-kDycSkPg2ugkH3nfKnU5AreLcSw41v4jQY32Wrr/2jo4c9BXQ9x3PwUTc8hLdP8S2aygNHIFDzuVnXE0z4AcCA== +"@superset-ui/color@0.12.15": + version "0.12.15" + resolved "https://registry.yarnpkg.com/@superset-ui/color/-/color-0.12.15.tgz#a69356667404d1e40d2eb22d3eb9f2d886fe4b38" + integrity sha512-xmZr+7FvPVRfN2XTx9sQJWgfDZw7YKtftXKU5ZWw3AygoBYcTt6ijFRJTL79hB9mtgNBX71oytuwKs9ixc8JeQ== dependencies: "@types/d3-scale" "^2.1.1" d3-scale "^3.0.0" @@ -3205,74 +3205,80 @@ conventional-changelog-cli "^2.0.12" cz-conventional-changelog "^2.1.0" -"@superset-ui/connection@0.12.8": - version "0.12.8" - resolved "https://registry.yarnpkg.com/@superset-ui/connection/-/connection-0.12.8.tgz#60bf0caf3a2730543878d10df9e95c457bc502cb" - integrity sha512-08d+34LZAD7vEF6PjN4qgeJFpWGlE/wKakI2Uh+aCE78d9q+b65K4pGPu6w+NRVAIcjZRXBbgvD6+Wnr1vn/Tw== +"@superset-ui/connection@0.12.14": + version "0.12.14" + resolved "https://registry.yarnpkg.com/@superset-ui/connection/-/connection-0.12.14.tgz#d433234183d427cdae6afdbc6e1114ade3b5a3da" + integrity sha512-fGdECjgO0J2nXV3U7XJKYzhaMVa5GYwqaeKyEp9p2UTT7k1BAfXxDzAPaFCVpwOfEvLillPFgVqB1MACYhcAbw== dependencies: "@babel/runtime" "^7.1.2" whatwg-fetch "^3.0.0" -"@superset-ui/core@0.12.8": - version "0.12.8" - resolved "https://registry.yarnpkg.com/@superset-ui/core/-/core-0.12.8.tgz#3d448eba8ca9838f75dbc9a31019b410ff1908fb" - integrity sha512-mVRcsi9LTiOHJ2b0BnTTzs3DIFQaXmRNt12OnQUN5ktiQNYOkdx51MF+nnm9yJqYVhzn2m7+5LBRz1m3KeI6CQ== +"@superset-ui/core@0.12.15": + version "0.12.15" + resolved "https://registry.yarnpkg.com/@superset-ui/core/-/core-0.12.15.tgz#aa85ecfc7dd4a89a77e0da4e740b2879d0e2ae6e" + integrity sha512-YrLdEi2QFXrM/Bkwga774SShoHwQsBZh+we/a//AiMdBsE3Iht2rdUeZOYgdGXFXynilM8H5/KZlNra+OPYXuw== dependencies: "@types/lodash" "^4.14.149" lodash "^4.17.11" -"@superset-ui/dimension@0.12.8": - version "0.12.8" - resolved "https://registry.yarnpkg.com/@superset-ui/dimension/-/dimension-0.12.8.tgz#a054d2188b20a289dbe3c50876c020c7b6d00c1f" - integrity sha512-1GZkV2MICNb/JWrIE47KCZQZTOt8CRvodvluZrWV70KAhrDkT/FuBfZkPfbx5OiNutrq+02lnrjRWfjEThQ69Q== +"@superset-ui/dimension@0.12.14": + version "0.12.14" + resolved "https://registry.yarnpkg.com/@superset-ui/dimension/-/dimension-0.12.14.tgz#d7e4408f248f6ba8dc1de48d152985b9fedb3d47" + integrity sha512-r3YiFMg8WZ+fAyDU1EsU04EaJ6n4+WE2CdtuNTALmyQh3rxOyjhSxT35+7WEokr25pW3B3nVL9KMPW1fKJsPCA== -"@superset-ui/number-format@0.12.10": - version "0.12.10" - resolved "https://registry.yarnpkg.com/@superset-ui/number-format/-/number-format-0.12.10.tgz#be1567d9b66fd81e25ee73bd9cc332bf698ceaf1" - integrity sha512-VH9HHz6CC7AR1jKSFTocTFEfa0Zk4e3ZV1nzHYp1S+lwL5mFUWE+eWoJagu7O9bvvH5dVmBZVg82YOXFz/X1zQ== +"@superset-ui/number-format@0.12.15": + version "0.12.15" + resolved "https://registry.yarnpkg.com/@superset-ui/number-format/-/number-format-0.12.15.tgz#6da94438a168abbd32f369893993bb8043c7ac5d" + integrity sha512-dUvg9ZkQcOI1k9IazU04IUmtu7EHQ/vmtcj4W26oo8Va6TnsjNI/471goTprY2j94Y8pBeiKVFJzcP7ad+MtBg== dependencies: "@types/d3-format" "^1.3.0" d3-format "^1.3.2" - pretty-ms "^5.1.0" - -"@superset-ui/query@0.12.8": - version "0.12.8" - resolved "https://registry.yarnpkg.com/@superset-ui/query/-/query-0.12.8.tgz#2bc9a77fda76644d0adf36acae5f22c0f8b7db95" - integrity sha512-ZqYhyMM6DccApQFzsMZ49yC/n3c1d+PBiWdHnNZl7JpYmQT1WpwP/RiSvafO8mQjbObpc2gwFwk90VTlnZZbUg== - -"@superset-ui/superset-ui@^0.12.5": - version "0.12.10" - resolved "https://registry.yarnpkg.com/@superset-ui/superset-ui/-/superset-ui-0.12.10.tgz#26c72d489b3b640db5d7668808b89094d278ce87" - integrity sha512-S2HyEB9pOgVpkGcPBizNEKcj7N/l/FPgRPBYp5yrDcT83erjxQddvoPOhfkePYXHpfRJIM4P+xc9CKjrDr2pWA== - dependencies: - "@superset-ui/chart" "0.12.8" - "@superset-ui/chart-composition" "0.12.8" - "@superset-ui/color" "0.12.8" - "@superset-ui/connection" "0.12.8" - "@superset-ui/core" "0.12.8" - "@superset-ui/dimension" "0.12.8" - "@superset-ui/number-format" "0.12.10" - "@superset-ui/query" "0.12.8" - "@superset-ui/time-format" "0.12.10" - "@superset-ui/translation" "0.12.8" - -"@superset-ui/time-format@0.12.10": - version "0.12.10" - resolved "https://registry.yarnpkg.com/@superset-ui/time-format/-/time-format-0.12.10.tgz#e269a2e8573b14c5140236ad576c243c02d40691" - integrity sha512-VJQWkhbRFrPV08EprEyTeZf6S1qd29taHHDi9Ei081Q0zQDX5uvvoUPiFEpsRdPC3lDxah93Csja4kBRL7kHow== + pretty-ms "^6.0.1" + +"@superset-ui/query@0.12.14": + version "0.12.14" + resolved "https://registry.yarnpkg.com/@superset-ui/query/-/query-0.12.14.tgz#d3710c0e794e26b33849666aa8f2c3f0fe4094fe" + integrity sha512-ZgPiwLSGIK5Ipc8scw2EVnDkYjaxjYmN1p/L+aPDPICOLjOcQWFGpr8hWYnVgS+yUZyKCOSVj0KSvZTuhZCNdg== + +"@superset-ui/superset-ui@^0.12.15": + version "0.12.15" + resolved "https://registry.yarnpkg.com/@superset-ui/superset-ui/-/superset-ui-0.12.15.tgz#9328263b0f09c116dd0835767e425ce25ea29a82" + integrity sha512-Rd+PMt3Yj1sgvVlSJUKhz9xyEPxULBHrwuMiNdRwr+e681qL5oNgrLpx/9Dr4L2QUqeKbdUYdcSKwD+7XeTmgw== + dependencies: + "@superset-ui/chart" "0.12.14" + "@superset-ui/chart-composition" "0.12.14" + "@superset-ui/color" "0.12.15" + "@superset-ui/connection" "0.12.14" + "@superset-ui/core" "0.12.15" + "@superset-ui/dimension" "0.12.14" + "@superset-ui/number-format" "0.12.15" + "@superset-ui/query" "0.12.14" + "@superset-ui/time-format" "0.12.15" + "@superset-ui/translation" "0.12.14" + "@superset-ui/validator" "0.12.14" + +"@superset-ui/time-format@0.12.15": + version "0.12.15" + resolved "https://registry.yarnpkg.com/@superset-ui/time-format/-/time-format-0.12.15.tgz#5d1d18956006fad79cee7ff5ab36d99d69372e60" + integrity sha512-AUT9ABiTk6/edpMFzFrBNPwhktvTovIKR1/pcfFH+z23ZckmusYIXJfqjGf20wcUdrSYCArdH6PelCvf2uJkNw== dependencies: "@types/d3-time" "^1.0.9" "@types/d3-time-format" "^2.1.0" d3-time "^1.0.10" d3-time-format "^2.2.0" -"@superset-ui/translation@0.12.8": - version "0.12.8" - resolved "https://registry.yarnpkg.com/@superset-ui/translation/-/translation-0.12.8.tgz#0167d312e091750220dc95ddcb482e7e0757f8d3" - integrity sha512-+ARBG1AClA+DoiXjf+qd0cFjJ3fFYRQb4FnL6AKL6uLC9Fupc0zP/0477cPfqJtxzlJD9u4uXFN5c9eepZSRYA== +"@superset-ui/translation@0.12.14": + version "0.12.14" + resolved "https://registry.yarnpkg.com/@superset-ui/translation/-/translation-0.12.14.tgz#f043f81a1a1db74a208143ac3a4b371771d8d4a7" + integrity sha512-Zd7Yx58OP3qonkzric5rg5gaQRJwHferDL/xIaKuYIqaK8BMPb2ZY+3TKSPkCm9mHLNnMi50jzZl8KYy5fv6Fg== dependencies: jed "^1.1.1" +"@superset-ui/validator@0.12.14": + version "0.12.14" + resolved "https://registry.yarnpkg.com/@superset-ui/validator/-/validator-0.12.14.tgz#23216f89a9f8bcc4c99ad7e0c93a6c2e5afd710f" + integrity sha512-M1E67K/4LVOnbLLGwQf3ReHwTiR1SYugtK/0BpWrnLDdom2zeSpkh23Z1noOf4QUw3KcIqKtBnyvFaSbiQ+m9g== + "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" @@ -3809,13 +3815,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== -"@types/lodash-es@^4.17.3": - version "4.17.3" - resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.3.tgz#87eb0b3673b076b8ee655f1890260a136af09a2d" - integrity sha512-iHI0i7ZAL1qepz1Y7f3EKg/zUMDwDfTzitx+AlHhJJvXwenP682ZyGbgPSc5Ej3eEAKVbNWKFuwOadCj5vBbYQ== - dependencies: - "@types/lodash" "*" - "@types/lodash@*", "@types/lodash@^4.14.146", "@types/lodash@^4.14.149": version "4.14.149" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" @@ -4172,14 +4171,6 @@ dependencies: d3-shape "^1.0.6" -"@vx/curve@0.0.194": - version "0.0.194" - resolved "https://registry.yarnpkg.com/@vx/curve/-/curve-0.0.194.tgz#2ef25279b20eef18abdd4d1d3bcbb295f001e513" - integrity sha512-6B+rHxsdK+PWdO8kYhT00kwBIwl9HIzpuxE+bRndrXC/nyoJVfSA7E4cLhZiIJYt0ukwkIPE3YsSIuT1OmW+1A== - dependencies: - "@types/d3-shape" "^1.3.1" - d3-shape "^1.0.6" - "@vx/curve@0.0.195": version "0.0.195" resolved "https://registry.yarnpkg.com/@vx/curve/-/curve-0.0.195.tgz#86cf9ff09f7b22a9d22130f6a4ef9a4969417fec" @@ -4295,7 +4286,7 @@ dependencies: classnames "^2.2.5" -"@vx/group@0.0.194", "@vx/group@^0.0.194": +"@vx/group@0.0.194": version "0.0.194" resolved "https://registry.yarnpkg.com/@vx/group/-/group-0.0.194.tgz#c53cbd47d2a50650063be3b39920c44da063b3ae" integrity sha512-0TV9eo5rgBr04i42qY+T5qg3PaHp9CJ77+V3Cm+ifTS3fgNomcfNCjoKpTi5uFVIj4M2t4akvka9n9PjW4emDw== @@ -4336,6 +4327,18 @@ classnames "^2.2.5" prop-types "^15.5.10" +"@vx/legend@^0.0.195": + version "0.0.195" + resolved "https://registry.yarnpkg.com/@vx/legend/-/legend-0.0.195.tgz#a34d8cf599e71156bebd3fc8b9a918ebe96f4055" + integrity sha512-EduXqrgU+JlJAQlA723nXsAvT81EAEscw3cl3/E4m4d8LCHnudLIX3AMG0AD9gxY/4pJclkYFU9MQP3TfoTVag== + dependencies: + "@types/classnames" "^2.2.9" + "@types/d3-scale" "^2.1.1" + "@types/react" "*" + "@vx/group" "0.0.195" + classnames "^2.2.5" + prop-types "^15.5.10" + "@vx/pattern@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/pattern/-/pattern-0.0.140.tgz#f49f57c6f13cb5b3baaa5bbec174c5d3aa782da7" @@ -4391,17 +4394,6 @@ prop-types "^15.6.1" resize-observer-polyfill "1.5.0" -"@vx/responsive@^0.0.194": - version "0.0.194" - resolved "https://registry.yarnpkg.com/@vx/responsive/-/responsive-0.0.194.tgz#6f291a270ccf5fd10b5764f55d088eb5aaaeed08" - integrity sha512-ZeOG+AqvZAq5wh2R+DOcpMavLHIiyTYgAMrTtfqfXvD0sOrF1lrQBBF4OrPhdiXV9TL5qze7OnTbm+Hoe0XHFQ== - dependencies: - "@types/lodash" "^4.14.146" - "@types/react" "*" - lodash "^4.17.10" - prop-types "^15.6.1" - resize-observer-polyfill "1.5.1" - "@vx/responsive@^0.0.195": version "0.0.195" resolved "https://registry.yarnpkg.com/@vx/responsive/-/responsive-0.0.195.tgz#8c75d86a28801c5f1970d43433a01e101454d444" @@ -4535,22 +4527,6 @@ d3-shape "^1.2.0" prop-types "^15.5.10" -"@vx/shape@^0.0.194": - version "0.0.194" - resolved "https://registry.yarnpkg.com/@vx/shape/-/shape-0.0.194.tgz#e0651dc328c691a86968f1ad9b126f9c28f3f02c" - integrity sha512-1r2Ri4ulqcZ1pvFAdt0O5dXaXgx7aTPWSAsx2AsvDxwQlL0NmTIXjepFwzo651B/2mzsnsfCOqzwYGv69+fAKA== - dependencies: - "@types/classnames" "^2.2.9" - "@types/d3-path" "^1.0.8" - "@types/d3-shape" "^1.3.1" - "@types/react" "*" - "@vx/curve" "0.0.194" - "@vx/group" "0.0.194" - classnames "^2.2.5" - d3-path "^1.0.5" - d3-shape "^1.2.0" - prop-types "^15.5.10" - "@vx/stats@^0.0.165": version "0.0.165" resolved "https://registry.yarnpkg.com/@vx/stats/-/stats-0.0.165.tgz#32413a144383367e51628bbea61b3b0ce980f1fd" @@ -7401,7 +7377,7 @@ d3-array@1, d3-array@^1.0.2, d3-array@^1.2.0, d3-array@^1.2.1: resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== -"d3-array@1.2.0 - 2", d3-array@^2.0.3, d3-array@^2.1.0, d3-array@^2.2.0, d3-array@^2.3.1, d3-array@^2.3.3, d3-array@^2.4.0: +"d3-array@1.2.0 - 2", d3-array@^2.0.3, d3-array@^2.2.0, d3-array@^2.3.1, d3-array@^2.3.3, d3-array@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.4.0.tgz#87f8b9ad11088769c82b5ea846bcb1cc9393f242" integrity sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw== @@ -7443,7 +7419,7 @@ d3-drag@1: d3-dispatch "1" d3-selection "1" -d3-dsv@^1.2.0: +d3-dsv@^1.1.1, d3-dsv@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== @@ -8308,21 +8284,40 @@ emotion-theming@^10.0.19: "@emotion/weak-memoize" "0.2.5" hoist-non-react-statics "^3.3.0" -encodable@^0.2.0: - version "0.2.6" - resolved "https://registry.yarnpkg.com/encodable/-/encodable-0.2.6.tgz#5ecb7097764fc88fb6640fa284b73a5f141b2f5b" - integrity sha512-HQEaLGm6e/Z+u5zOh9/7DfDpn8FeMbmSVsgA6lbBuIE+SKd7og5Z6aELvK3HCkL/G8V6XBKwawqNG+qsB7GAew== +encodable@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/encodable/-/encodable-0.3.3.tgz#cb9fb4dc3d293ac679679a1bd2b0c8638a068e22" + integrity sha512-bmku/X1Dxks9y/lmJt855/27Zd3bmTjVbiNrZWBZIdZubyhv2hGTayLhyI2ZYlPw1Y03A1JusM61oPlx6QVNSw== dependencies: "@types/d3-array" "^2.0.0" "@types/d3-interpolate" "^1.3.1" "@types/d3-scale" "^2.1.1" "@types/d3-time" "^1.0.10" - "@types/lodash-es" "^4.17.3" + "@types/lodash" "^4.14.149" d3-array "^2.3.1" d3-interpolate "^1.3.2" d3-scale "^3.0.1" d3-time "^1.0.11" - lodash-es "^4.17.15" + lodash "^4.17.15" + reselect "^4.0.0" + vega "^5.9.1" + vega-lite "~4.1.0" + +encodable@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/encodable/-/encodable-0.3.4.tgz#9fd441a725719d9fa6cda6e53fbbcb0dc2d5d411" + integrity sha512-X+luRWWaosvOwNqYkTvLNexrie0CzEM0bnZydmL74T47B/uU6/F+GZuAMwumg2HrXQ8Uc3D0AKiDatFO/33Q8A== + dependencies: + "@types/d3-array" "^2.0.0" + "@types/d3-interpolate" "^1.3.1" + "@types/d3-scale" "^2.1.1" + "@types/d3-time" "^1.0.10" + "@types/lodash" "^4.14.149" + d3-array "^2.3.1" + d3-interpolate "^1.3.2" + d3-scale "^3.0.1" + d3-time "^1.0.11" + lodash "^4.17.15" reselect "^4.0.0" vega "^5.9.1" vega-lite "~4.1.0" @@ -12146,11 +12141,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash-es@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" - integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== - lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -14291,6 +14281,13 @@ pretty-ms@^5.1.0: dependencies: parse-ms "^2.1.0" +pretty-ms@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-6.0.1.tgz#03ec6cfee20329f142645e63efad96bb775d3da4" + integrity sha512-ke4njoVmlotekHlHyCZ3wI/c5AMT8peuHs8rKJqekj/oR5G8lND2dVpicFlUz5cbZgE290vvkMuDwfj/OcW1kw== + dependencies: + parse-ms "^2.1.0" + prismjs@^1.8.4: version "1.19.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.19.0.tgz#713afbd45c3baca4b321569f2df39e17e729d4dc" @@ -17110,7 +17107,7 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -topojson-client@^3.0.1: +topojson-client@^3.0.1, topojson-client@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== @@ -17604,7 +17601,7 @@ vega-canvas@^1.2.1: resolved "https://registry.yarnpkg.com/vega-canvas/-/vega-canvas-1.2.1.tgz#ee0586e2a1f096f6a5d1710df61ef501562c2bd4" integrity sha512-k/S3EPeJ37D7fYDhv4sEg7fNWVpLheQY7flfLyAmJU7aSwCMgw8cZJi0CKHchJeculssfH+41NCqvRB1QtaJnw== -vega-crossfilter@~4.0.1: +vega-crossfilter@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/vega-crossfilter/-/vega-crossfilter-4.0.1.tgz#9fab0dc5445e846d732c83ac2b5a72225bc6fdf1" integrity sha512-wLNS4JzKaOLj8EAzI/v8XBJjUWMRWYSu6EeQF4o9Opq/78u87Ol9Lc5I27UHsww5dNNH/tHubAV4QPIXnGOp5Q== @@ -17613,7 +17610,7 @@ vega-crossfilter@~4.0.1: vega-dataflow "^5.1.0" vega-util "^1.8.0" -vega-dataflow@^5.1.0, vega-dataflow@^5.1.1, vega-dataflow@^5.4.0, vega-dataflow@^5.4.1, vega-dataflow@^5.5.0, vega-dataflow@~5.5.0: +vega-dataflow@5.5.0, vega-dataflow@^5.1.0, vega-dataflow@^5.1.1, vega-dataflow@^5.4.0, vega-dataflow@^5.4.1, vega-dataflow@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/vega-dataflow/-/vega-dataflow-5.5.0.tgz#9a1ecd2eb0ff02aef53cdb87a7828eae528f8d82" integrity sha512-9eRe2qLpwvEegBoSaH3vdziSLMZSszY02wxVmvcFzHe57Rf/eYEr0YRuW4qc+gMmwURPYu9wtmeUTiK4XhDKXw== @@ -17621,7 +17618,7 @@ vega-dataflow@^5.1.0, vega-dataflow@^5.1.1, vega-dataflow@^5.4.0, vega-dataflow@ vega-loader "^4.0.0" vega-util "^1.11.0" -vega-encode@~4.5.2: +vega-encode@4.5.2: version "4.5.2" resolved "https://registry.yarnpkg.com/vega-encode/-/vega-encode-4.5.2.tgz#236dca241be0340a31354755913dc3919867726d" integrity sha512-iL1njX++VE0SAMJuDqc0k9kmsU8AeyRRHv15MXh2+PXe2JmyiSWn6HcF3RzFUy5xmKlZOU5BiL8KrTgTrxh+WA== @@ -17634,19 +17631,19 @@ vega-encode@~4.5.2: vega-time "^1.0.0" vega-util "^1.12.2" -vega-event-selector@^2.0.2, vega-event-selector@~2.0.2: +vega-event-selector@2.0.2, vega-event-selector@^2.0.2, vega-event-selector@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/vega-event-selector/-/vega-event-selector-2.0.2.tgz#bb64e1cfe047c6808878038319e18af6991759d9" integrity sha512-Uv72vBfM0lrlI2belKHFMZuVnW2uJl2ShqWPwGSXPVe6p+PzgqoPJYC8A/i5N8B54UA4UMDzlbBeo3x7q2W9Yg== -vega-expression@^2.6.1, vega-expression@^2.6.3, vega-expression@~2.6.3: +vega-expression@2.6.3, vega-expression@^2.6.1, vega-expression@^2.6.3, vega-expression@~2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/vega-expression/-/vega-expression-2.6.3.tgz#11110922765cc495b8aebd8e05c4ec848d9f2b3b" integrity sha512-sME1+45BToTGsftb1Q6Ubs2iRYEoXkD2NRGnJuKS9YJ2ITzZwPHF/jy2kHW3iLpuNjj54meaO7HMQ/hUKrciUw== dependencies: vega-util "^1.11.0" -vega-force@~4.0.3: +vega-force@4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/vega-force/-/vega-force-4.0.3.tgz#33e0b03c9af60146f821007d9e7a7617fe9e8ac6" integrity sha512-4stItN4jD9H1CENaCz4jXRNS1Bi9cozMOUjX2824FeJENi2RZSiAZAaGbscgerZQ/jbNcOHD8PHpC2pWldEvGA== @@ -17655,7 +17652,7 @@ vega-force@~4.0.3: vega-dataflow "^5.4.0" vega-util "^1.11.0" -vega-functions@^5.5.0, vega-functions@^5.5.1, vega-functions@~5.5.1: +vega-functions@5.5.1, vega-functions@^5.5.0, vega-functions@^5.5.1: version "5.5.1" resolved "https://registry.yarnpkg.com/vega-functions/-/vega-functions-5.5.1.tgz#849a7c9f19c77899c26969b6070c724cd7366131" integrity sha512-VTfEwf/ChSOGc4d4yUIgu2XoScky6NH06WN4vwVGY5PREhsyVPsQ+p2zqgD/N/a00EyWPHeOSHEhsPU28oIMtQ== @@ -17674,7 +17671,7 @@ vega-functions@^5.5.0, vega-functions@^5.5.1, vega-functions@~5.5.1: vega-time "^1.0.0" vega-util "^1.12.1" -vega-geo@~4.3.0: +vega-geo@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/vega-geo/-/vega-geo-4.3.0.tgz#3dd5d3606f18dc839c8a430338c6a390319bf477" integrity sha512-Rcz4z+TR4qy727pjBWSsbMAn8eM9bDZ5MXKqo5AWuFkoj/8ngv13vafHd1tvEMTA8L5BjAW3/eTqN4tyx9KSQg== @@ -17688,7 +17685,7 @@ vega-geo@~4.3.0: vega-statistics "^1.7.1" vega-util "^1.12.1" -vega-hierarchy@~4.0.3: +vega-hierarchy@4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/vega-hierarchy/-/vega-hierarchy-4.0.3.tgz#0d36bc29ad6f369fa844e3e2ce5faec983f8b047" integrity sha512-9wNe+KyKqZW1S4++jCC38HuAhZbqNhfY7gOvwiMLjsp65tMtRETrtvYfHkULClm3UokUIX54etAXREAGW7znbw== @@ -17697,7 +17694,7 @@ vega-hierarchy@~4.0.3: vega-dataflow "^5.4.0" vega-util "^1.11.0" -vega-lite@~4.1.0, vega-lite@~4.1.1: +vega-lite@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/vega-lite/-/vega-lite-4.1.1.tgz#f6e6cae4e0518c66afd0298fb544b6a35290437b" integrity sha512-D2seO6ZbY8aZQ8+ZQfU+5NYwot3ryIDyvdQdcVoupMSgJ/oGv4QqEwL3rmu8abdSG6NhFiac0trsI+wBb0F6vQ== @@ -17716,7 +17713,18 @@ vega-lite@~4.1.0, vega-lite@~4.1.1: vega-util "~1.12.2" yargs "~15.1.0" -vega-loader@^4.0.0, vega-loader@^4.1.4, vega-loader@~4.1.4: +vega-loader@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.1.3.tgz#8b80aa231406295bdc78725186ef863af05b9e6f" + integrity sha512-50aetjuct4WqU7LctwnZqF/NCyya9aZ1HDQZ9unFi++62vOQgRfbXLNL/dZavqwnWX3S9i0ltCznLyFMG4ck8g== + dependencies: + d3-dsv "^1.1.1" + d3-time-format "^2.2.1" + node-fetch "^2.6.0" + topojson-client "^3.0.1" + vega-util "^1.11.0" + +vega-loader@^4.0.0, vega-loader@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.1.4.tgz#1f1f346a0f1621596f2845deee44ba9946c9f069" integrity sha512-BeRjOb4cvrzhuAjzc/Drz1gyTB2LB4ZnK3BU/J6LZ+PzBDlAiOV32+tyvyP+TVKbligwysz7pwhtbury2A7ICg== @@ -17727,10 +17735,21 @@ vega-loader@^4.0.0, vega-loader@^4.1.4, vega-loader@~4.1.4: topojson-client "^3.0.1" vega-util "^1.11.0" -vega-parser@~5.12.1: - version "5.12.1" - resolved "https://registry.yarnpkg.com/vega-parser/-/vega-parser-5.12.1.tgz#e643e7f38cb55d6bece20862dba9a1c8fbca8b66" - integrity sha512-b1RTmaXKotNmHibF3HMlWoKd4AhdnFtoWQ8BYPTQkiaak242bm/opHgbrudHGUNceNr+03zpklyrh5DItdfs5A== +vega-loader@^4.1.3: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.2.1.tgz#556554e6e70f254dc68da15a391ba0d3ad6d1373" + integrity sha512-JfF/vwOWzj7MD2Je/5r0beqBApTsQ68e2H8uV1T9wZctMM7WV9+z3JWvQ95yUFiMqyjVYRpXUR25y/b7qPE03Q== + dependencies: + d3-dsv "^1.2.0" + d3-time-format "^2.2.3" + node-fetch "^2.6.0" + topojson-client "^3.1.0" + vega-util "^1.13.1" + +vega-parser@5.12.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/vega-parser/-/vega-parser-5.12.0.tgz#380fbc781649764583f5433f0be95f7f360c3f67" + integrity sha512-sIQcWp7aqafpfELEJr+gQDsz7TlLYaHkowKhp3O/pcOdIuvqeI3IYpP2+oNpXVGi8ikcq8cJLcCUMi9oP2Xtrw== dependencies: vega-dataflow "^5.5.0" vega-event-selector "^2.0.2" @@ -17739,7 +17758,7 @@ vega-parser@~5.12.1: vega-scale "^6.0.0" vega-util "^1.12.1" -vega-projection@^1.4.0, vega-projection@~1.4.0: +vega-projection@1.4.0, vega-projection@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/vega-projection/-/vega-projection-1.4.0.tgz#58c910b30306869132c4a26516164f8643fd1734" integrity sha512-Prb/E41PqZT5b+46rHv6BZLDsXMe+NFClHxJ9NbwW7mntz8aMGAHiYolVa/M2KuTLbsXVgDAPxk/aA9tbQ0SSg== @@ -17747,17 +17766,17 @@ vega-projection@^1.4.0, vega-projection@~1.4.0: d3-geo "^1.11.9" d3-geo-projection "^2.7.1" -vega-regression@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/vega-regression/-/vega-regression-1.0.5.tgz#dbe39dc6e3cb0c1f54f631be4edeedd3366f4b2c" - integrity sha512-HlKRQ0N5pQGqjmdy7Am+jtDCInI1IyAfHMbIVmpgF7H9odaUqtHynZijRtHRfbS6IXK+aXJ0WNsKW/oc+ox2fA== +vega-regression@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vega-regression/-/vega-regression-1.0.4.tgz#f29d8a8ec0e2dcc39056b71e12f80e8e488edd33" + integrity sha512-fHWJ0t1VEZOzpfBrI66Wo6RxMnqvJXYnXcIUZlOrZ9RLLbb1I6cdEASZp0cQ8M2oYAqu0YVgC0UEjnLs9mJaxQ== dependencies: d3-array "^2.4.0" vega-dataflow "^5.4.1" - vega-statistics "^1.7.3" + vega-statistics "^1.7.2" vega-util "^1.12.2" -vega-runtime@^5.0.2, vega-runtime@~5.0.2: +vega-runtime@5.0.2, vega-runtime@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/vega-runtime/-/vega-runtime-5.0.2.tgz#4d7f327e05b2d4addc8b7472d49eb54f1118ff6c" integrity sha512-Cuv+RY6kprH+vtNERg6xP4dgcdYGD2ZnxPxJNEtGi7dmtQQTBa1s7jQ0VDXTolsO6lKJ3B7np2GzKJYwevgj1A== @@ -17765,7 +17784,7 @@ vega-runtime@^5.0.2, vega-runtime@~5.0.2: vega-dataflow "^5.1.1" vega-util "^1.11.0" -vega-scale@^6.0.0, vega-scale@~6.0.0: +vega-scale@6.0.0, vega-scale@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/vega-scale/-/vega-scale-6.0.0.tgz#b227127b00841e9d507a3235af2f8be475f7de83" integrity sha512-uNJ5LC+s+XLxdO2iXC36/TLen3mMNv0wzhMZMNXa8h+Ih10geJ57sHbYYA8Z8403JC9AYTaWUe7m0H9CHgV9NA== @@ -17775,7 +17794,18 @@ vega-scale@^6.0.0, vega-scale@~6.0.0: d3-scale "^3.2.1" vega-util "^1.12.1" -vega-scenegraph@^4.4.0, vega-scenegraph@^4.5.0, vega-scenegraph@~4.5.1: +vega-scenegraph@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/vega-scenegraph/-/vega-scenegraph-4.5.0.tgz#0c3126a3210c19dbc1548b23d5e9634d58177fe8" + integrity sha512-nO1bTFwhLdkOPzJ++f8dmlMX6OLZya9c94/HZNwFRfGNfri1vXyCIudFwCJD9/h0dJ0kSWfG8ybH9wDQMcZZDw== + dependencies: + d3-path "^1.0.9" + d3-shape "^1.3.7" + vega-canvas "^1.2.1" + vega-loader "^4.1.3" + vega-util "^1.12.1" + +vega-scenegraph@^4.4.0, vega-scenegraph@^4.5.0: version "4.5.1" resolved "https://registry.yarnpkg.com/vega-scenegraph/-/vega-scenegraph-4.5.1.tgz#1906b2ae6f31cc9ec31d12c0244f349741deb038" integrity sha512-j77R2b0mBKWCgJ3j8rxBaTVC9mQKn6drH7CPwIqupfE0KnRxvSLDnclT5/2un1OeojeiX6Hg8JTgzVamYpRUEg== @@ -17794,14 +17824,21 @@ vega-selections@^5.1.0: vega-expression "^2.6.1" vega-util "^1.11.0" -vega-statistics@^1.7.1, vega-statistics@^1.7.3, vega-statistics@~1.7.3: +vega-statistics@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.7.2.tgz#0bd01b52aee294915f2c3f82cb80a82501592ad9" + integrity sha512-G6rvZ50MqnmiN1fGqDnFoCLWFwBCYt3nCucXu3zWov7A1/lsatvbDKYeSlVlnvT9OHtv4L+3pRpepFh5IhXKFg== + dependencies: + d3-array "^2.4.0" + +vega-statistics@^1.7.1, vega-statistics@^1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.7.3.tgz#8ce436eccebf484f7c7aa619c884e2427a7e044b" integrity sha512-PRhoozWmlQRYesly4greSIJ5yaKljzmuPYiXbhcvxW3dvgcnWexKjh3Kxk66eTgf9vX6OU/5QEnKQqjWKXqiQQ== dependencies: d3-array "^2.4.0" -vega-time@^1.0.0, vega-time@~1.0.0: +vega-time@1.0.0, vega-time@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/vega-time/-/vega-time-1.0.0.tgz#5bc61ff311260cd212ccc8cbd73049bcd29b1440" integrity sha512-r0yOFr/VklJwD3ew1+fEcB7E0LBCLChYlwh0KoO6cTIWMdlC4KhIIUN3/FuBfUZ4qx4V/xp71xH2YYYZTH6izg== @@ -17811,10 +17848,10 @@ vega-time@^1.0.0, vega-time@~1.0.0: d3-time-format "^2.2.1" vega-util "^1.12.0" -vega-transforms@~4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/vega-transforms/-/vega-transforms-4.6.1.tgz#c01c8f389b405096401915d21b381ccdbce17c89" - integrity sha512-wXS8LDnfYFnXHV3k+h7ciGhf2m43q8+jUPNF+4eymXg7M2Bw77IUh6MPnCzMeZsKuP5o9a94K7hHyK6nvdFr0Q== +vega-transforms@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/vega-transforms/-/vega-transforms-4.6.0.tgz#38e7b80d8ea19839773cbcae414ce97723a127cc" + integrity sha512-5nsMMnyOME/Xe1xLNGCcQ+BS94cix9gSItHiXqU7wR50ukp5U9JoUxnfeYJkuv37FAbnFpkuYlPcBCWp55zXhQ== dependencies: d3-array "^2.4.0" vega-dataflow "^5.5.0" @@ -17822,6 +17859,13 @@ vega-transforms@~4.6.1: vega-time "^1.0.0" vega-util "^1.12.1" +vega-typings@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-0.12.0.tgz#bf998252b7f72bb2f22d6d5a02813e0bd3685562" + integrity sha512-K+IoUTTtXW3E1Qhr/y+JgLRxy476viAm6DeM8IiVrA8vvuLA3FTzHaeI7TCnaWEwk9xxLJBtdVKKC5FGbp0Nyw== + dependencies: + vega-util "^1.12.1" + vega-typings@~0.12.0: version "0.12.4" resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-0.12.4.tgz#e3b298723db1a484aae6ca1cf760ff20fd46fae1" @@ -17829,24 +17873,22 @@ vega-typings@~0.12.0: dependencies: vega-util "^1.12.1" -vega-typings@~0.13.0: - version "0.13.1" - resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-0.13.1.tgz#70642c1829a27b3fd9757b370bb8bf05009f01e9" - integrity sha512-jU1nb1ZU27IfgU/WJFXMnqFdjdHoKx4PrbhL1yZdCi+WOM6HWFqIpYcLr6IR7hxcfPti8Hf7uulHxNe2IdVtuw== - dependencies: - vega-util "^1.12.1" +vega-util@1.12.2, vega-util@~1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.12.2.tgz#4997a50e56fa4be05046966568aed72246a40e27" + integrity sha512-p02+oQ/XU/gzY9S/CTZinym2NKWEMIneLc+FYdUeJZZnDGa3DvcNgUDlVR90JlwLcYZNs5dBdfYLfdRHsKZKiw== -vega-util@^1.11.0, vega-util@^1.12.0, vega-util@^1.12.1, vega-util@^1.12.2, vega-util@^1.13.0, vega-util@^1.8.0, vega-util@~1.13.0: +vega-util@^1.11.0, vega-util@^1.12.0, vega-util@^1.12.1, vega-util@^1.12.2, vega-util@^1.13.0, vega-util@^1.8.0: version "1.13.0" resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.13.0.tgz#3f933bff56f93f2c9346be0fb1a68b5f25d62496" integrity sha512-QYVAq7TLFGps18oA13Nwm82lMkQ7oak2dnQAYgEqCRaX5Nx4YFJ7R3R+iymDM0xFmwvervsTtD5arvMIY+HfFA== -vega-util@~1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.12.2.tgz#4997a50e56fa4be05046966568aed72246a40e27" - integrity sha512-p02+oQ/XU/gzY9S/CTZinym2NKWEMIneLc+FYdUeJZZnDGa3DvcNgUDlVR90JlwLcYZNs5dBdfYLfdRHsKZKiw== +vega-util@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.13.1.tgz#3eae51043184c6b873c17b148755c21b01274a0e" + integrity sha512-TmvZSMKqhGlS7eAXphqJUhq+NZVYbvXX2ahargTRkVckGWjEUpWhMC7T13vYihrU2Lf/OevKbrruSXKOBxke2w== -vega-view-transforms@~4.5.0: +vega-view-transforms@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/vega-view-transforms/-/vega-view-transforms-4.5.0.tgz#c358068902ee412469f8f6095e1e6cff5d3690a1" integrity sha512-8n52147HxNSjQ23NeHN//AWt99zZP+Ukiy4kSbkCJGPZ3dW3NYdunEYNvZWyMmOKSrHIMtgdcHUM9FmPTQpE9w== @@ -17855,7 +17897,7 @@ vega-view-transforms@~4.5.0: vega-scenegraph "^4.4.0" vega-util "^1.12.0" -vega-view@~5.4.0: +vega-view@5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/vega-view/-/vega-view-5.4.0.tgz#5c5cb2307b1762e9c2d78901df725bdf3d9a8133" integrity sha512-Q8nH93NceWJRB4/KTehOvsrpbCGGDnkjOCcNQpTsGgu6QRmgMTHtRQTHkE+LhLXMO/55zZrVR22thvMEH9r36w== @@ -17868,7 +17910,7 @@ vega-view@~5.4.0: vega-scenegraph "^4.5.0" vega-util "^1.12.1" -vega-voronoi@~4.1.1: +vega-voronoi@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/vega-voronoi/-/vega-voronoi-4.1.1.tgz#1a09f86661cf85c75581282f19ff108603893715" integrity sha512-agLmr+UGxJs5KB9D8GeZqxgeWWGoER/eVHPcFFPgVuoNBsrqf2bdoltmIkRnpiRsQnGCibGixhFEDCc9GGNAww== @@ -17877,7 +17919,7 @@ vega-voronoi@~4.1.1: vega-dataflow "^5.1.1" vega-util "^1.11.0" -vega-wordcloud@~4.0.4: +vega-wordcloud@4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/vega-wordcloud/-/vega-wordcloud-4.0.4.tgz#9169165c652478489e43cc56e05edbe14ce3d3c3" integrity sha512-+FwgCKTj8JBMbBjNiVciLvjQnk+rC59uyecmlTsmtUGVZz5wyANooYcXt4xtiRu+G8ohdlJ6L/59+UFTaUR8og== @@ -17888,36 +17930,36 @@ vega-wordcloud@~4.0.4: vega-statistics "^1.7.1" vega-util "^1.12.1" -vega@^5.8.1, vega@^5.9.1: - version "5.9.2" - resolved "https://registry.yarnpkg.com/vega/-/vega-5.9.2.tgz#f828a5e3a7a66e354e6fe98061c4b58ab650e20c" - integrity sha512-Ry8ZcxQW6JUhCkgYufRqiDG1Rw3nDPqu38h1VMx9vM7QYQ5p1U6fEJJL+yAY/JN9zeCtkm/ViuRqpAahyiZ+bQ== - dependencies: - vega-crossfilter "~4.0.1" - vega-dataflow "~5.5.0" - vega-encode "~4.5.2" - vega-event-selector "~2.0.2" - vega-expression "~2.6.3" - vega-force "~4.0.3" - vega-functions "~5.5.1" - vega-geo "~4.3.0" - vega-hierarchy "~4.0.3" - vega-loader "~4.1.4" - vega-parser "~5.12.1" - vega-projection "~1.4.0" - vega-regression "~1.0.5" - vega-runtime "~5.0.2" - vega-scale "~6.0.0" - vega-scenegraph "~4.5.1" - vega-statistics "~1.7.3" - vega-time "~1.0.0" - vega-transforms "~4.6.1" - vega-typings "~0.13.0" - vega-util "~1.13.0" - vega-view "~5.4.0" - vega-view-transforms "~4.5.0" - vega-voronoi "~4.1.1" - vega-wordcloud "~4.0.4" +vega@^5.9.1: + version "5.9.1" + resolved "https://registry.yarnpkg.com/vega/-/vega-5.9.1.tgz#8c4cd23630ba6b4422342a4825234a7d1e0a9957" + integrity sha512-Wd5WAfaXPGuHk5cSFqiFNkkw5DXRSZcl+q4x351VUbmV5/IRipyGZx05EbBP5D9B40Xb/Tt2I+JQBBdxuYYIxQ== + dependencies: + vega-crossfilter "4.0.1" + vega-dataflow "5.5.0" + vega-encode "4.5.2" + vega-event-selector "2.0.2" + vega-expression "2.6.3" + vega-force "4.0.3" + vega-functions "5.5.1" + vega-geo "4.3.0" + vega-hierarchy "4.0.3" + vega-loader "4.1.3" + vega-parser "5.12.0" + vega-projection "1.4.0" + vega-regression "1.0.4" + vega-runtime "5.0.2" + vega-scale "6.0.0" + vega-scenegraph "4.5.0" + vega-statistics "1.7.2" + vega-time "1.0.0" + vega-transforms "4.6.0" + vega-typings "0.12.0" + vega-util "1.12.2" + vega-view "5.4.0" + vega-view-transforms "4.5.0" + vega-voronoi "4.1.1" + vega-wordcloud "4.0.4" verror@1.10.0: version "1.10.0"