From e9657afe4b68663039b0bd8851cbafa8dfad968b Mon Sep 17 00:00:00 2001 From: Ville Brofeldt <33317356+villebro@users.noreply.github.com> Date: Mon, 24 May 2021 16:33:59 +0300 Subject: [PATCH] feat(native-filters): add search all filter options (#14710) * feat(native-filters): add search all filter options * add tests * fix default value * implement ILIKE operator * rebump packages * fix test * address comments * fix state changes coming from application * fix debouncer --- superset-frontend/package-lock.json | 604 +++++++++--------- superset-frontend/package.json | 56 +- .../FilterBar/FilterControls/FilterValue.tsx | 33 +- .../FiltersConfigForm/DefaultValue.tsx | 3 + .../FiltersConfigForm/FiltersConfigForm.tsx | 5 +- .../components/nativeFilters/utils.ts | 2 +- .../FilterControl/AdhocFilter/index.js | 1 + .../index.jsx | 3 + superset-frontend/src/explore/constants.ts | 3 +- .../components/Select/SelectFilterPlugin.tsx | 175 +++-- .../components/Select/buildQuery.test.ts | 32 +- .../filters/components/Select/buildQuery.ts | 48 +- .../filters/components/Select/controlPanel.ts | 18 + .../src/filters/components/Select/index.ts | 1 + .../components/Select/transformProps.ts | 2 + .../src/filters/components/Select/types.ts | 6 +- superset/connectors/sqla/models.py | 2 + superset/utils/core.py | 1 + 18 files changed, 593 insertions(+), 402 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index e280c00181..3cb402ae5d 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -15,35 +15,35 @@ "@emotion/babel-preset-css-prop": "^11.2.0", "@emotion/cache": "^11.1.3", "@emotion/react": "^11.1.5", - "@superset-ui/chart-controls": "^0.17.48", - "@superset-ui/core": "^0.17.48", - "@superset-ui/legacy-plugin-chart-calendar": "0.17.48", - "@superset-ui/legacy-plugin-chart-chord": "0.17.48", - "@superset-ui/legacy-plugin-chart-country-map": "0.17.48", - "@superset-ui/legacy-plugin-chart-event-flow": "0.17.48", - "@superset-ui/legacy-plugin-chart-force-directed": "0.17.48", - "@superset-ui/legacy-plugin-chart-heatmap": "0.17.48", - "@superset-ui/legacy-plugin-chart-histogram": "0.17.48", - "@superset-ui/legacy-plugin-chart-horizon": "0.17.48", - "@superset-ui/legacy-plugin-chart-map-box": "0.17.48", - "@superset-ui/legacy-plugin-chart-paired-t-test": "0.17.48", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "0.17.48", - "@superset-ui/legacy-plugin-chart-partition": "0.17.48", - "@superset-ui/legacy-plugin-chart-pivot-table": "0.17.48", - "@superset-ui/legacy-plugin-chart-rose": "0.17.48", - "@superset-ui/legacy-plugin-chart-sankey": "^0.17.48", - "@superset-ui/legacy-plugin-chart-sankey-loop": "0.17.48", - "@superset-ui/legacy-plugin-chart-sunburst": "0.17.48", - "@superset-ui/legacy-plugin-chart-treemap": "0.17.48", - "@superset-ui/legacy-plugin-chart-world-map": "0.17.48", - "@superset-ui/legacy-preset-chart-big-number": "0.17.48", + "@superset-ui/chart-controls": "^0.17.50", + "@superset-ui/core": "^0.17.50", + "@superset-ui/legacy-plugin-chart-calendar": "^0.17.50", + "@superset-ui/legacy-plugin-chart-chord": "^0.17.50", + "@superset-ui/legacy-plugin-chart-country-map": "^0.17.50", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.50", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.50", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.50", + "@superset-ui/legacy-plugin-chart-histogram": "^0.17.50", + "@superset-ui/legacy-plugin-chart-horizon": "^0.17.50", + "@superset-ui/legacy-plugin-chart-map-box": "^0.17.50", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.50", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.50", + "@superset-ui/legacy-plugin-chart-partition": "^0.17.50", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.50", + "@superset-ui/legacy-plugin-chart-rose": "^0.17.50", + "@superset-ui/legacy-plugin-chart-sankey": "^0.17.50", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.50", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.50", + "@superset-ui/legacy-plugin-chart-treemap": "^0.17.50", + "@superset-ui/legacy-plugin-chart-world-map": "^0.17.50", + "@superset-ui/legacy-preset-chart-big-number": "^0.17.50", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.6", - "@superset-ui/legacy-preset-chart-nvd3": "0.17.48", - "@superset-ui/plugin-chart-echarts": "^0.17.48", - "@superset-ui/plugin-chart-pivot-table": "^0.17.48", - "@superset-ui/plugin-chart-table": "^0.17.48", - "@superset-ui/plugin-chart-word-cloud": "0.17.48", - "@superset-ui/preset-chart-xy": "0.17.48", + "@superset-ui/legacy-preset-chart-nvd3": "^0.17.50", + "@superset-ui/plugin-chart-echarts": "^0.17.50", + "@superset-ui/plugin-chart-pivot-table": "^0.17.50", + "@superset-ui/plugin-chart-table": "^0.17.50", + "@superset-ui/plugin-chart-word-cloud": "^0.17.50", + "@superset-ui/preset-chart-xy": "^0.17.50", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", @@ -14102,11 +14102,11 @@ } }, "node_modules/@superset-ui/chart-controls": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.48.tgz", - "integrity": "sha512-laUOIPuS0cY+DATm0uqtAIcN2mHIepjcah609MYdmo79bWhkPLG+cv6cJWIe7IDJZsHVQaPGhWnozqXc8ssfSg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.50.tgz", + "integrity": "sha512-VVX8YxwYDcaD6pxfcxjDvwVA9pr34rzINNYYmumY3gCyWkfUCMs2oB11naavAbXqDOx93pD9sSfkR8GUEACahQ==", "dependencies": { - "@superset-ui/core": "0.17.48", + "@superset-ui/core": "0.17.50", "lodash": "^4.17.15", "prop-types": "^15.7.2" }, @@ -14118,9 +14118,9 @@ } }, "node_modules/@superset-ui/core": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.48.tgz", - "integrity": "sha512-8sMGqHXC+2e5tLH8TX1xxDqOIwKJxAZkPVpU6mfsWdmK9QYum0gIuaIJwtNLhv+CjMpjJPfyOmnxZ/VRIbN2bg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.50.tgz", + "integrity": "sha512-YWCWZOHqsvXjzIGG+gKLJESsoSaobGcvIUQyQ+RN9nmqFJezBIlHenbsDVnn7eHN1jMOBUYTwmv5p9AojLslRw==", "dependencies": { "@babel/runtime": "^7.1.2", "@emotion/cache": "^11.1.3", @@ -14247,12 +14247,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.48.tgz", - "integrity": "sha512-ixP/wzx6GLHhAy9FBXAl4O4HvskrNpHIyPoIe9lb1CnL407wfKMbLdMBiPUGsk35M98Uh4EDvlfzbQvukhxdRw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.50.tgz", + "integrity": "sha512-jLIYTStx04Jd2jZv7u8FZ9u+3Zf0bd/c1GjToG2w4VnbDc73eTEqiMhyJPGlaZuKABWP2pigEanmbpR0OTAD/g==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -14271,24 +14271,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.48.tgz", - "integrity": "sha512-h8/ys4FVE9iEDp2toGur23tuU7pVlJHC9fP1Kpef8R5OF3gjTIaFfRr/8tHm8b4AO22JF/Uc9HRMXf4rDJPC7w==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.50.tgz", + "integrity": "sha512-XUK6LnUBuhYAHsyqGId80a7f+vzXgVuiZfbFTRJy4M/uPNdIBKfxX1t4kKudHIlqKNoSV2pFIVwh+4h4KpmadQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "node_modules/@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.48.tgz", - "integrity": "sha512-DBSZJnMkUw2jbnDsdjNNCiYOKIZN50OAVBNSPRm88JwV2aUUx+EAUgV8WC2RD4CYBRYTOdh7y088z2vRQk7m1w==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.50.tgz", + "integrity": "sha512-toxr09cCUI4Wari215323T8PL5YddCtnvliKVRA4+8UEEU9bnh+gQDIh++UqXq51dAR63czyr4kmxbu//JLDEg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -14303,13 +14303,13 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.48.tgz", - "integrity": "sha512-fkoLL0G1H8y+qo12i2QzklIU8aQSlt1vFHT0t1shADadUI2wON/2zNV3SMmCPhMofMZxP0CbXKOlYDm8WKbBOA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.50.tgz", + "integrity": "sha512-6Zq8CmIMCnqgcJJ8XSqWIexTZBbUG6lZto9isVnxBXLKiGAau6vMOLlWPZjyWPJETProVMnAc+CQm+YRhLI1TQ==", "dependencies": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "prop-types": "^15.6.2" }, "peerDependencies": { @@ -14317,12 +14317,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.48.tgz", - "integrity": "sha512-vHTzjRrQCCcZ0XiZsUpjtJt5rEBCvN6832PSzNZGAuKX91qFzbB3X1iox9o08tjmjBsaH8tlLPZH83e+YAY4YQ==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.50.tgz", + "integrity": "sha512-4KvRGdA2974MekvZ87ei/H5rP6MQooHB4PndLriRqqwtfwNs7LDlN3o/SRagKFj/8xvTxrZfprF0Kt+TO6Dk6A==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -14331,12 +14331,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.48.tgz", - "integrity": "sha512-ttXJ4zedTq9aFRzsnrwWK/MgMvwZyKtKLQe4ncgwEsER8oWZk+I0229pJFinzyOtpZWtwqiWAfPtvLXU/hVP6Q==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.50.tgz", + "integrity": "sha512-B/qt/z2ISVkiBRPoGDo4TVsur7QgFG3OKtIzjx6k+8KoRC1oWqeA2zTJAi55lp0bch5Mo4iIUwoyEY45T9nzOA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -14344,14 +14344,14 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.48.tgz", - "integrity": "sha512-spBKRzB5GJxqMtKim7ij4cVfJ+eVOUQR8rID9HJR8l3/c24jv1bvXhkCqKbl329HvWMhvxrSBAtL+VaknVLueA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.50.tgz", + "integrity": "sha512-AO2VbdJERQfSAVTsCVOkCjkzaHOzFhTgyUQpuCNwaMt6sV9yzKR/G3QHYxrfzTT/2DxDEjAX+uV26b821VFA8A==", "dependencies": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -14420,12 +14420,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.48.tgz", - "integrity": "sha512-JgFC5mgonbvQ8v8s4QxgJALH1rfMrb+sXdGTKPynKB0hRIRdtWU/jnO7Pmw+T1wxCQRXY6WO9Ak3+rAYoa75Hg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.50.tgz", + "integrity": "sha512-rfWJtCIITXqkYMW5Ue0MniqKYSQILtdVq8KDAtX2h5KuttDSi/2/ahBdwUmAs4rcjeSHH2FCaJONMAfAV0u1eA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -14455,12 +14455,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.48.tgz", - "integrity": "sha512-wl7mlU0cNxZl1+G0CvwsR8PTQMywEoLurjDwMHYWLX8QHaOntX7FHEF0cI47aQqsdPUSzx3PIq6Yn4X1YNRdng==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.50.tgz", + "integrity": "sha512-9ksPlfBRQHqWuoktnpnRtR0N7l8FbZ0caBvK9I5+zuWDv8/rc5sunjkmDmAAJg3GSWfn7NzNS0spSk6YsfmKOQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -14481,12 +14481,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.48.tgz", - "integrity": "sha512-rbeNvR/xv8QGJ68qpca9wLhV+pQN1lAjwk+Q2Ef130ZiXsSp02vj6tqiqwwFHfMi62o0HXgOSSsIGxRLIqso2g==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.50.tgz", + "integrity": "sha512-20jRj92fsGm+fRzeQ8WHP4iFdczO9wMg9jok9OWtZHGUW0Sa3+YpbCW48of9qnqqf1Um1rqZu6PdmgKwevz1zg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" @@ -14496,12 +14496,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.48.tgz", - "integrity": "sha512-Vy4YhznYNOpCoczy8kXYE2f/To/V6Ak0WMBOQ4Ls2lxcNhytZtsUgQVoTKmqS7v9l5lQhCck9hZ7Ke2o5PMg+Q==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.50.tgz", + "integrity": "sha512-fo8ASuix28TqTPNlVTBWXPXBo99sVpxXaCkXpb4cSnO6F6V6B9Kv9vSKIfV6KZL6ul1wQTe/xLjt/lyyX5HjHg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -14510,12 +14510,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.48.tgz", - "integrity": "sha512-0tNY0OuLvSdkcYrGxtbyFxlDatEp5tpTLMx4diLE9LvE1dD1P2boJU+3lZGM1I0PPPOPPWFK/GrqhOWNWmTkZg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.50.tgz", + "integrity": "sha512-cHwGtxftPk+j1BowOL12fTuM+eAWbAbfxGF4t+W0X9/ZX5KFpHMYR0cd836nPgfhTtO9sSc4/W34dP0QIQA9hQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" @@ -14525,24 +14525,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.48.tgz", - "integrity": "sha512-PKX8FAEy0/PH9TQblMNmUxcCCZ67CGILzyjKf6v3FLu7dYhn5VHOnHI38jFhjWSjniNr4cfVmUH07NsFs6HBUw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.50.tgz", + "integrity": "sha512-KolczfBy36AnXO445UF8uUDTb9enw9qy7wURr7RcMeBzLG0xN0P8vxEG/OU4NQ3MbbBBi7lYbTuTEYdZ/5wQgw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-rose": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.48.tgz", - "integrity": "sha512-T6LvEzUMRtgBUbISTfkkshDoqAP2038+gxQUC0QB0RCLT9LPxypc3XmDL9TOcIRIc86qDVUIGweeMoKbEkyIVw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.50.tgz", + "integrity": "sha512-DW8FKdR/dXlVsavxARnQZTB+hZ7B/C8Kwh+Kwa8Ji+qCJ5p30cH0xGQ9oX5Lgc15L01MIew4sLYaFdE6i41DCA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" @@ -14552,12 +14552,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.48.tgz", - "integrity": "sha512-QB9X7Bo+/dMCmWZunRiD8W66T250jtcrU7jcx0TX2PX4n7YHK1I505tvpxEWgxYz0jW5ghe2z2O73GGOh1RWZA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.50.tgz", + "integrity": "sha512-d4kPCsY7nLZWhJDU1oXOC9+jwFoBWGvCI5n+GldJyhiDwxrp9+SBTZCx3ubmhgeI1HETeAD7C99DQ/neT5ttAA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" @@ -14567,47 +14567,47 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.48.tgz", - "integrity": "sha512-H3XLE9ie0qsmEqw61Rh1z0Wp4daE13CAKIgBG9L4Et6tUx+G2FphGUTKMemqe9rs50QXOx7GAzxU5KC86Rz+XA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.50.tgz", + "integrity": "sha512-AMgrl2Te24H5VoveHOjeHyhaI6tQtKo3EGuMb+RAHcgaBv1YRSaMx5LsR90qJtXlxMK1t4kRwG7mhqlE4kEP4Q==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3-sankey-diagram": "^0.7.3", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.48.tgz", - "integrity": "sha512-OU+cjLo45peJtDzvHGG9c7+cLzevo8xGT8cVIW+bikW2RQcYsEC3lnnKAyiZYNSOJFLUNcmfHg5rYmOCRIAIjw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.50.tgz", + "integrity": "sha512-ZFN4s74tVtxMbHV6rGylup1tWbI3nwOMqFccuP9m/Nk78B2IMuU2ljZxE/2Zd87gbpg5NOH1442yKcbqyYt0kw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.48.tgz", - "integrity": "sha512-W5i7oYVMGaQUZLPip45/YveMlthIX6LTgyr0C1t9YxQ+DnduKNTVqxBivayuLxrk5bFWwnPBPKE7IDQL9UpljQ==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.50.tgz", + "integrity": "sha512-1W9kH/2rcpo6bZNM4A00mHdSd8BCFuatf7Z45yHGwUnl1monnNcam0d5YxLMgR4NZMYCW76S5ltRPY+2+/weGg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3-hierarchy": "^1.1.8", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.48.tgz", - "integrity": "sha512-IY8nMHx9fg7sYHo87jQVog7MMH7uSolSEErnhZHtv2uyjugte7jtiEgrtb7UgEt/jv6y5o6wcK1bd0AgRviBIg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.50.tgz", + "integrity": "sha512-HIomXGPRxI3sejPhW/ktMI673Qd47VrcwkNjsjJSlz8MrlwAMGWNynEwEYAaTmKbm16hoesNN2JuZSVGBAHX4w==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -14632,13 +14632,13 @@ "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, "node_modules/@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.48.tgz", - "integrity": "sha512-SavGp0fJ+qPC/+nGKUvn6aB9JkSDd5huIpriR0eahu34c4ZnWn6qBBd7ht4vSOksd95UiS3zV8KNChPQw2+dKA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.50.tgz", + "integrity": "sha512-5ibPRV7LMzhUvFQ1WQgeBrcCaj8vmEk2Ocnuk+Kxk5cFFeOjF6Y/x2XbKz1PBwK1KTB4qC9OT3O6vJcTWHJjLQ==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -14674,13 +14674,13 @@ } }, "node_modules/@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.48.tgz", - "integrity": "sha512-djRgMeCEPC7Xvzh9lCtNbELwu/db9fo2dLP0mrIjU8vvAugd96ECo0XPpATjGr0pYnC0ExWYMC3CTs+tIXDc+w==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.50.tgz", + "integrity": "sha512-jy2c37BXMQnSUc+pE9ZhiNiPNQHxweO+RD+gQcyF8DJ6Dn+woPE2DCfqjAdfVpUKuI4Y/FOM2lFlZT4xwGzsiA==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -14697,12 +14697,12 @@ } }, "node_modules/@superset-ui/plugin-chart-echarts": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.48.tgz", - "integrity": "sha512-HGhySR3kpT4DPOttdvPABCZ33PbVhFC3hHePw74FFP845tnocm+u1eUYVFHwZ4VwsoFtAyIRqRZGZUz+v6qIdg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.50.tgz", + "integrity": "sha512-Og5QRwmYZ66zyUjBsBPBU9JzL1zTtgsyS/opGhMDCBGBJbWmAPi8j6kSO2sVSzrexoTYWtPbOO261uMKzuGZ0w==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.1.1", @@ -14714,12 +14714,12 @@ } }, "node_modules/@superset-ui/plugin-chart-pivot-table": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.48.tgz", - "integrity": "sha512-l60wsmnlYSDavSnYsjLVXGI186cjBGKpiOd08UoRSi2msVjk4mbW+BNacIVQQVQF7EimNm3B37pZgoY6BK17Og==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.50.tgz", + "integrity": "sha512-WEa5lgJ4LbPb2v0MdHcDbDpnSN3khGmjvo2UV4G3AiJ6A47DLje8fhiYHkFhW7HfarozROYrwtcI/Rab6DYEyw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@superset-ui/react-pivottable": "^0.12.6" }, "peerDependencies": { @@ -14727,12 +14727,12 @@ } }, "node_modules/@superset-ui/plugin-chart-table": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.48.tgz", - "integrity": "sha512-OcnYEo0XE1BC6584QxZo1sWMJzJsYrAjYJVo73duHcyeBc1Kq+KQaiiUCA0MjqHxqAMtWoHscBNCCrXAnqqSXw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.50.tgz", + "integrity": "sha512-L8z9dm/0qPkvo4F8+lLb6yF0x2e7MaRxkZO9RGC0A9HYiMWEUc2Bg9Z+/QmLV6B9mA8qgYQbAeiglfBKC9h7nQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -14758,12 +14758,12 @@ } }, "node_modules/@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.48.tgz", - "integrity": "sha512-913+Vl1IApwYkCscO6J4WVAdWsEAqYz/O4X4pFBSaPdlU9mhaUYfiOUb4WSgVeNoTERLqPEUmIbMu9rzFwl7yA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.50.tgz", + "integrity": "sha512-IudEfIEy4JxJhmSrn0nctI4pIJY/KORi9FrT2ZiBRWTh1SmFhZNM2d9vQixsgXq1+bHN9J3JpZ3G0+4sFOtwsw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -14796,14 +14796,14 @@ } }, "node_modules/@superset-ui/preset-chart-xy": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.48.tgz", - "integrity": "sha512-Pk2MlbbsqRvFCDROJpz89bFv6z3SVmLBGqhWuUpATVbJXzp7TekizPkTyvHuCEsT3gIM8Rpor+b1RUdXpG5A8g==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.50.tgz", + "integrity": "sha512-pUhfI1aojKKDcrFB0aInkL7WmLlKdcOBhddsJ4+c5UfxpQZGdQ9VR9i0PPyvs8dbF4bRWyJNs31h9RHt7NOVSw==", "dependencies": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", @@ -66270,19 +66270,19 @@ } }, "@superset-ui/chart-controls": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.48.tgz", - "integrity": "sha512-laUOIPuS0cY+DATm0uqtAIcN2mHIepjcah609MYdmo79bWhkPLG+cv6cJWIe7IDJZsHVQaPGhWnozqXc8ssfSg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.50.tgz", + "integrity": "sha512-VVX8YxwYDcaD6pxfcxjDvwVA9pr34rzINNYYmumY3gCyWkfUCMs2oB11naavAbXqDOx93pD9sSfkR8GUEACahQ==", "requires": { - "@superset-ui/core": "0.17.48", + "@superset-ui/core": "0.17.50", "lodash": "^4.17.15", "prop-types": "^15.7.2" } }, "@superset-ui/core": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.48.tgz", - "integrity": "sha512-8sMGqHXC+2e5tLH8TX1xxDqOIwKJxAZkPVpU6mfsWdmK9QYum0gIuaIJwtNLhv+CjMpjJPfyOmnxZ/VRIbN2bg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.50.tgz", + "integrity": "sha512-YWCWZOHqsvXjzIGG+gKLJESsoSaobGcvIUQyQ+RN9nmqFJezBIlHenbsDVnn7eHN1jMOBUYTwmv5p9AojLslRw==", "requires": { "@babel/runtime": "^7.1.2", "@emotion/cache": "^11.1.3", @@ -66394,12 +66394,12 @@ } }, "@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.48.tgz", - "integrity": "sha512-ixP/wzx6GLHhAy9FBXAl4O4HvskrNpHIyPoIe9lb1CnL407wfKMbLdMBiPUGsk35M98Uh4EDvlfzbQvukhxdRw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.50.tgz", + "integrity": "sha512-jLIYTStx04Jd2jZv7u8FZ9u+3Zf0bd/c1GjToG2w4VnbDc73eTEqiMhyJPGlaZuKABWP2pigEanmbpR0OTAD/g==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -66417,24 +66417,24 @@ } }, "@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.48.tgz", - "integrity": "sha512-h8/ys4FVE9iEDp2toGur23tuU7pVlJHC9fP1Kpef8R5OF3gjTIaFfRr/8tHm8b4AO22JF/Uc9HRMXf4rDJPC7w==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.50.tgz", + "integrity": "sha512-XUK6LnUBuhYAHsyqGId80a7f+vzXgVuiZfbFTRJy4M/uPNdIBKfxX1t4kKudHIlqKNoSV2pFIVwh+4h4KpmadQ==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.48.tgz", - "integrity": "sha512-DBSZJnMkUw2jbnDsdjNNCiYOKIZN50OAVBNSPRm88JwV2aUUx+EAUgV8WC2RD4CYBRYTOdh7y088z2vRQk7m1w==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.50.tgz", + "integrity": "sha512-toxr09cCUI4Wari215323T8PL5YddCtnvliKVRA4+8UEEU9bnh+gQDIh++UqXq51dAR63czyr4kmxbu//JLDEg==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -66451,34 +66451,34 @@ } }, "@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.48.tgz", - "integrity": "sha512-fkoLL0G1H8y+qo12i2QzklIU8aQSlt1vFHT0t1shADadUI2wON/2zNV3SMmCPhMofMZxP0CbXKOlYDm8WKbBOA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.50.tgz", + "integrity": "sha512-6Zq8CmIMCnqgcJJ8XSqWIexTZBbUG6lZto9isVnxBXLKiGAau6vMOLlWPZjyWPJETProVMnAc+CQm+YRhLI1TQ==", "requires": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.48.tgz", - "integrity": "sha512-vHTzjRrQCCcZ0XiZsUpjtJt5rEBCvN6832PSzNZGAuKX91qFzbB3X1iox9o08tjmjBsaH8tlLPZH83e+YAY4YQ==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.50.tgz", + "integrity": "sha512-4KvRGdA2974MekvZ87ei/H5rP6MQooHB4PndLriRqqwtfwNs7LDlN3o/SRagKFj/8xvTxrZfprF0Kt+TO6Dk6A==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.48.tgz", - "integrity": "sha512-ttXJ4zedTq9aFRzsnrwWK/MgMvwZyKtKLQe4ncgwEsER8oWZk+I0229pJFinzyOtpZWtwqiWAfPtvLXU/hVP6Q==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.50.tgz", + "integrity": "sha512-B/qt/z2ISVkiBRPoGDo4TVsur7QgFG3OKtIzjx6k+8KoRC1oWqeA2zTJAi55lp0bch5Mo4iIUwoyEY45T9nzOA==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -66486,14 +66486,14 @@ } }, "@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.48.tgz", - "integrity": "sha512-spBKRzB5GJxqMtKim7ij4cVfJ+eVOUQR8rID9HJR8l3/c24jv1bvXhkCqKbl329HvWMhvxrSBAtL+VaknVLueA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.50.tgz", + "integrity": "sha512-AO2VbdJERQfSAVTsCVOkCjkzaHOzFhTgyUQpuCNwaMt6sV9yzKR/G3QHYxrfzTT/2DxDEjAX+uV26b821VFA8A==", "requires": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -66561,12 +66561,12 @@ } }, "@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.48.tgz", - "integrity": "sha512-JgFC5mgonbvQ8v8s4QxgJALH1rfMrb+sXdGTKPynKB0hRIRdtWU/jnO7Pmw+T1wxCQRXY6WO9Ak3+rAYoa75Hg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.50.tgz", + "integrity": "sha512-rfWJtCIITXqkYMW5Ue0MniqKYSQILtdVq8KDAtX2h5KuttDSi/2/ahBdwUmAs4rcjeSHH2FCaJONMAfAV0u1eA==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -66595,12 +66595,12 @@ } }, "@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.48.tgz", - "integrity": "sha512-wl7mlU0cNxZl1+G0CvwsR8PTQMywEoLurjDwMHYWLX8QHaOntX7FHEF0cI47aQqsdPUSzx3PIq6Yn4X1YNRdng==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.50.tgz", + "integrity": "sha512-9ksPlfBRQHqWuoktnpnRtR0N7l8FbZ0caBvK9I5+zuWDv8/rc5sunjkmDmAAJg3GSWfn7NzNS0spSk6YsfmKOQ==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -66617,118 +66617,118 @@ } }, "@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.48.tgz", - "integrity": "sha512-rbeNvR/xv8QGJ68qpca9wLhV+pQN1lAjwk+Q2Ef130ZiXsSp02vj6tqiqwwFHfMi62o0HXgOSSsIGxRLIqso2g==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.50.tgz", + "integrity": "sha512-20jRj92fsGm+fRzeQ8WHP4iFdczO9wMg9jok9OWtZHGUW0Sa3+YpbCW48of9qnqqf1Um1rqZu6PdmgKwevz1zg==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" } }, "@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.48.tgz", - "integrity": "sha512-Vy4YhznYNOpCoczy8kXYE2f/To/V6Ak0WMBOQ4Ls2lxcNhytZtsUgQVoTKmqS7v9l5lQhCck9hZ7Ke2o5PMg+Q==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.50.tgz", + "integrity": "sha512-fo8ASuix28TqTPNlVTBWXPXBo99sVpxXaCkXpb4cSnO6F6V6B9Kv9vSKIfV6KZL6ul1wQTe/xLjt/lyyX5HjHg==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.48.tgz", - "integrity": "sha512-0tNY0OuLvSdkcYrGxtbyFxlDatEp5tpTLMx4diLE9LvE1dD1P2boJU+3lZGM1I0PPPOPPWFK/GrqhOWNWmTkZg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.50.tgz", + "integrity": "sha512-cHwGtxftPk+j1BowOL12fTuM+eAWbAbfxGF4t+W0X9/ZX5KFpHMYR0cd836nPgfhTtO9sSc4/W34dP0QIQA9hQ==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.48.tgz", - "integrity": "sha512-PKX8FAEy0/PH9TQblMNmUxcCCZ67CGILzyjKf6v3FLu7dYhn5VHOnHI38jFhjWSjniNr4cfVmUH07NsFs6HBUw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.50.tgz", + "integrity": "sha512-KolczfBy36AnXO445UF8uUDTb9enw9qy7wURr7RcMeBzLG0xN0P8vxEG/OU4NQ3MbbBBi7lYbTuTEYdZ/5wQgw==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-rose": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.48.tgz", - "integrity": "sha512-T6LvEzUMRtgBUbISTfkkshDoqAP2038+gxQUC0QB0RCLT9LPxypc3XmDL9TOcIRIc86qDVUIGweeMoKbEkyIVw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.50.tgz", + "integrity": "sha512-DW8FKdR/dXlVsavxARnQZTB+hZ7B/C8Kwh+Kwa8Ji+qCJ5p30cH0xGQ9oX5Lgc15L01MIew4sLYaFdE6i41DCA==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.48.tgz", - "integrity": "sha512-QB9X7Bo+/dMCmWZunRiD8W66T250jtcrU7jcx0TX2PX4n7YHK1I505tvpxEWgxYz0jW5ghe2z2O73GGOh1RWZA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.50.tgz", + "integrity": "sha512-d4kPCsY7nLZWhJDU1oXOC9+jwFoBWGvCI5n+GldJyhiDwxrp9+SBTZCx3ubmhgeI1HETeAD7C99DQ/neT5ttAA==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.48.tgz", - "integrity": "sha512-H3XLE9ie0qsmEqw61Rh1z0Wp4daE13CAKIgBG9L4Et6tUx+G2FphGUTKMemqe9rs50QXOx7GAzxU5KC86Rz+XA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.50.tgz", + "integrity": "sha512-AMgrl2Te24H5VoveHOjeHyhaI6tQtKo3EGuMb+RAHcgaBv1YRSaMx5LsR90qJtXlxMK1t4kRwG7mhqlE4kEP4Q==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3-sankey-diagram": "^0.7.3", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.48.tgz", - "integrity": "sha512-OU+cjLo45peJtDzvHGG9c7+cLzevo8xGT8cVIW+bikW2RQcYsEC3lnnKAyiZYNSOJFLUNcmfHg5rYmOCRIAIjw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.50.tgz", + "integrity": "sha512-ZFN4s74tVtxMbHV6rGylup1tWbI3nwOMqFccuP9m/Nk78B2IMuU2ljZxE/2Zd87gbpg5NOH1442yKcbqyYt0kw==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.48.tgz", - "integrity": "sha512-W5i7oYVMGaQUZLPip45/YveMlthIX6LTgyr0C1t9YxQ+DnduKNTVqxBivayuLxrk5bFWwnPBPKE7IDQL9UpljQ==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.50.tgz", + "integrity": "sha512-1W9kH/2rcpo6bZNM4A00mHdSd8BCFuatf7Z45yHGwUnl1monnNcam0d5YxLMgR4NZMYCW76S5ltRPY+2+/weGg==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3-hierarchy": "^1.1.8", "d3-selection": "^1.4.0", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.48.tgz", - "integrity": "sha512-IY8nMHx9fg7sYHo87jQVog7MMH7uSolSEErnhZHtv2uyjugte7jtiEgrtb7UgEt/jv6y5o6wcK1bd0AgRviBIg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.50.tgz", + "integrity": "sha512-HIomXGPRxI3sejPhW/ktMI673Qd47VrcwkNjsjJSlz8MrlwAMGWNynEwEYAaTmKbm16hoesNN2JuZSVGBAHX4w==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -66752,13 +66752,13 @@ } }, "@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.48.tgz", - "integrity": "sha512-SavGp0fJ+qPC/+nGKUvn6aB9JkSDd5huIpriR0eahu34c4ZnWn6qBBd7ht4vSOksd95UiS3zV8KNChPQw2+dKA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.50.tgz", + "integrity": "sha512-5ibPRV7LMzhUvFQ1WQgeBrcCaj8vmEk2Ocnuk+Kxk5cFFeOjF6Y/x2XbKz1PBwK1KTB4qC9OT3O6vJcTWHJjLQ==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -66791,13 +66791,13 @@ } }, "@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.48.tgz", - "integrity": "sha512-djRgMeCEPC7Xvzh9lCtNbELwu/db9fo2dLP0mrIjU8vvAugd96ECo0XPpATjGr0pYnC0ExWYMC3CTs+tIXDc+w==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.50.tgz", + "integrity": "sha512-jy2c37BXMQnSUc+pE9ZhiNiPNQHxweO+RD+gQcyF8DJ6Dn+woPE2DCfqjAdfVpUKuI4Y/FOM2lFlZT4xwGzsiA==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -66811,12 +66811,12 @@ } }, "@superset-ui/plugin-chart-echarts": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.48.tgz", - "integrity": "sha512-HGhySR3kpT4DPOttdvPABCZ33PbVhFC3hHePw74FFP845tnocm+u1eUYVFHwZ4VwsoFtAyIRqRZGZUz+v6qIdg==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.50.tgz", + "integrity": "sha512-Og5QRwmYZ66zyUjBsBPBU9JzL1zTtgsyS/opGhMDCBGBJbWmAPi8j6kSO2sVSzrexoTYWtPbOO261uMKzuGZ0w==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.1.1", @@ -66825,22 +66825,22 @@ } }, "@superset-ui/plugin-chart-pivot-table": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.48.tgz", - "integrity": "sha512-l60wsmnlYSDavSnYsjLVXGI186cjBGKpiOd08UoRSi2msVjk4mbW+BNacIVQQVQF7EimNm3B37pZgoY6BK17Og==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.50.tgz", + "integrity": "sha512-WEa5lgJ4LbPb2v0MdHcDbDpnSN3khGmjvo2UV4G3AiJ6A47DLje8fhiYHkFhW7HfarozROYrwtcI/Rab6DYEyw==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@superset-ui/react-pivottable": "^0.12.6" } }, "@superset-ui/plugin-chart-table": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.48.tgz", - "integrity": "sha512-OcnYEo0XE1BC6584QxZo1sWMJzJsYrAjYJVo73duHcyeBc1Kq+KQaiiUCA0MjqHxqAMtWoHscBNCCrXAnqqSXw==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.50.tgz", + "integrity": "sha512-L8z9dm/0qPkvo4F8+lLb6yF0x2e7MaRxkZO9RGC0A9HYiMWEUc2Bg9Z+/QmLV6B9mA8qgYQbAeiglfBKC9h7nQ==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -66862,12 +66862,12 @@ } }, "@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.48.tgz", - "integrity": "sha512-913+Vl1IApwYkCscO6J4WVAdWsEAqYz/O4X4pFBSaPdlU9mhaUYfiOUb4WSgVeNoTERLqPEUmIbMu9rzFwl7yA==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.50.tgz", + "integrity": "sha512-IudEfIEy4JxJhmSrn0nctI4pIJY/KORi9FrT2ZiBRWTh1SmFhZNM2d9vQixsgXq1+bHN9J3JpZ3G0+4sFOtwsw==", "requires": { - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -66898,14 +66898,14 @@ } }, "@superset-ui/preset-chart-xy": { - "version": "0.17.48", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.48.tgz", - "integrity": "sha512-Pk2MlbbsqRvFCDROJpz89bFv6z3SVmLBGqhWuUpATVbJXzp7TekizPkTyvHuCEsT3gIM8Rpor+b1RUdXpG5A8g==", + "version": "0.17.50", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.50.tgz", + "integrity": "sha512-pUhfI1aojKKDcrFB0aInkL7WmLlKdcOBhddsJ4+c5UfxpQZGdQ9VR9i0PPyvs8dbF4bRWyJNs31h9RHt7NOVSw==", "requires": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.48", - "@superset-ui/core": "0.17.48", + "@superset-ui/chart-controls": "0.17.50", + "@superset-ui/core": "0.17.50", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", diff --git a/superset-frontend/package.json b/superset-frontend/package.json index f8f6eff3b9..deae9ee89d 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -67,35 +67,35 @@ "@emotion/babel-preset-css-prop": "^11.2.0", "@emotion/cache": "^11.1.3", "@emotion/react": "^11.1.5", - "@superset-ui/chart-controls": "^0.17.48", - "@superset-ui/core": "^0.17.48", - "@superset-ui/legacy-plugin-chart-calendar": "0.17.48", - "@superset-ui/legacy-plugin-chart-chord": "0.17.48", - "@superset-ui/legacy-plugin-chart-country-map": "0.17.48", - "@superset-ui/legacy-plugin-chart-event-flow": "0.17.48", - "@superset-ui/legacy-plugin-chart-force-directed": "0.17.48", - "@superset-ui/legacy-plugin-chart-heatmap": "0.17.48", - "@superset-ui/legacy-plugin-chart-histogram": "0.17.48", - "@superset-ui/legacy-plugin-chart-horizon": "0.17.48", - "@superset-ui/legacy-plugin-chart-map-box": "0.17.48", - "@superset-ui/legacy-plugin-chart-paired-t-test": "0.17.48", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "0.17.48", - "@superset-ui/legacy-plugin-chart-partition": "0.17.48", - "@superset-ui/legacy-plugin-chart-pivot-table": "0.17.48", - "@superset-ui/legacy-plugin-chart-rose": "0.17.48", - "@superset-ui/legacy-plugin-chart-sankey": "^0.17.48", - "@superset-ui/legacy-plugin-chart-sankey-loop": "0.17.48", - "@superset-ui/legacy-plugin-chart-sunburst": "0.17.48", - "@superset-ui/legacy-plugin-chart-treemap": "0.17.48", - "@superset-ui/legacy-plugin-chart-world-map": "0.17.48", - "@superset-ui/legacy-preset-chart-big-number": "0.17.48", + "@superset-ui/chart-controls": "^0.17.50", + "@superset-ui/core": "^0.17.50", + "@superset-ui/legacy-plugin-chart-calendar": "^0.17.50", + "@superset-ui/legacy-plugin-chart-chord": "^0.17.50", + "@superset-ui/legacy-plugin-chart-country-map": "^0.17.50", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.50", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.50", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.50", + "@superset-ui/legacy-plugin-chart-histogram": "^0.17.50", + "@superset-ui/legacy-plugin-chart-horizon": "^0.17.50", + "@superset-ui/legacy-plugin-chart-map-box": "^0.17.50", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.50", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.50", + "@superset-ui/legacy-plugin-chart-partition": "^0.17.50", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.50", + "@superset-ui/legacy-plugin-chart-rose": "^0.17.50", + "@superset-ui/legacy-plugin-chart-sankey": "^0.17.50", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.50", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.50", + "@superset-ui/legacy-plugin-chart-treemap": "^0.17.50", + "@superset-ui/legacy-plugin-chart-world-map": "^0.17.50", + "@superset-ui/legacy-preset-chart-big-number": "^0.17.50", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.6", - "@superset-ui/legacy-preset-chart-nvd3": "0.17.48", - "@superset-ui/plugin-chart-echarts": "^0.17.48", - "@superset-ui/plugin-chart-pivot-table": "^0.17.48", - "@superset-ui/plugin-chart-table": "^0.17.48", - "@superset-ui/plugin-chart-word-cloud": "0.17.48", - "@superset-ui/preset-chart-xy": "0.17.48", + "@superset-ui/legacy-preset-chart-nvd3": "^0.17.50", + "@superset-ui/plugin-chart-echarts": "^0.17.50", + "@superset-ui/plugin-chart-pivot-table": "^0.17.50", + "@superset-ui/plugin-chart-table": "^0.17.50", + "@superset-ui/plugin-chart-word-cloud": "^0.17.50", + "@superset-ui/preset-chart-xy": "^0.17.50", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx index 978328181c..200edfa35c 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx @@ -25,6 +25,8 @@ import { t, Behavior, ChartDataResponseResult, + JsonObject, + getChartMetadataRegistry, } from '@superset-ui/core'; import { useDispatch } from 'react-redux'; import { areObjectsEqual } from 'src/reduxUtils'; @@ -53,10 +55,12 @@ const FilterValue: React.FC = ({ onFilterSelectionChange, }) => { const { id, targets, filterType, adhoc_filters, time_range } = filter; + const metadata = getChartMetadataRegistry().get(filterType); const cascadingFilters = useCascadingFilters(id); const [state, setState] = useState([]); const [error, setError] = useState(''); const [formData, setFormData] = useState>({}); + const [ownState, setOwnState] = useState({}); const inputRef = useRef(null); const [target] = targets; const { @@ -65,7 +69,8 @@ const FilterValue: React.FC = ({ }: Partial<{ datasetId: number; column: { name?: string } }> = target; const { name: groupby } = column; const hasDataSource = !!datasetId; - const [loading, setLoading] = useState(hasDataSource); + const [isLoading, setIsLoading] = useState(hasDataSource); + const [isRefreshing, setIsRefreshing] = useState(false); const dispatch = useDispatch(); useEffect(() => { const newFormData = getFormData({ @@ -77,16 +82,22 @@ const FilterValue: React.FC = ({ adhoc_filters, time_range, }); - if (!areObjectsEqual(formData, newFormData)) { + const filterOwnState = filter.dataMask?.ownState || {}; + if ( + !areObjectsEqual(formData, newFormData) || + !areObjectsEqual(ownState, filterOwnState) + ) { setFormData(newFormData); + setOwnState(filterOwnState); if (!hasDataSource) { return; } + setIsRefreshing(true); getChartDataRequest({ formData: newFormData, force: false, requestParams: { dashboardId: 0 }, - ownState: filter.dataMask?.ownState, + ownState: filterOwnState, }) .then(response => { if (isFeatureEnabled(FeatureFlag.GLOBAL_ASYNC_QUERIES)) { @@ -94,24 +105,28 @@ const FilterValue: React.FC = ({ const result = 'result' in response ? response.result[0] : response; waitForAsyncData(result) .then((asyncResult: ChartDataResponseResult[]) => { - setLoading(false); + setIsRefreshing(false); + setIsLoading(false); setState(asyncResult); }) .catch((error: ClientErrorObject) => { setError( error.message || error.error || t('Check configuration'), ); - setLoading(false); + setIsRefreshing(false); + setIsLoading(false); }); } else { setState(response.result); setError(''); - setLoading(false); + setIsRefreshing(false); + setIsLoading(false); } }) .catch((error: Response) => { setError(error.statusText); - setLoading(false); + setIsRefreshing(false); + setIsLoading(false); }); } }, [ @@ -151,7 +166,7 @@ const FilterValue: React.FC = ({ return ( - {loading ? ( + {isLoading ? ( ) : ( = ({ behaviors={[Behavior.NATIVE_FILTER]} filterState={filter.dataMask?.filterState} ownState={filter.dataMask?.ownState} + enableNoResults={metadata?.enableNoResults} + isRefreshing={isRefreshing} hooks={{ setDataMask, setFocusedFilter, unsetFocusedFilter }} /> )} diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx index 34fd7c0d8e..0d05add39e 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx @@ -34,6 +34,7 @@ type DefaultValueProps = { hasDataset: boolean; form: FormInstance; formData: ReturnType; + enableNoResults: boolean; }; const DefaultValue: FC = ({ @@ -42,6 +43,7 @@ const DefaultValue: FC = ({ form, setDataMask, formData, + enableNoResults, }) => { const [loading, setLoading] = useState(hasDataset); const formFilter = (form.getFieldValue('filters') || {})[filterId]; @@ -70,6 +72,7 @@ const DefaultValue: FC = ({ } chartType={formFilter?.filterType} hooks={{ setDataMask }} + enableNoResults={enableNoResults} /> ); }; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx index e0fbf8bb67..85e642c87d 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx @@ -204,7 +204,9 @@ export const FiltersConfigForm: React.FC = ({ ?.datasourceCount; const hasColumn = hasDataset && !FILTERS_WITHOUT_COLUMN.includes(formFilter?.filterType); - + // @ts-ignore + const enableNoResults = !!nativeFilterItems[formFilter?.filterType]?.value + ?.enableNoResults; const datasetId = formFilter?.dataset?.value; useEffect(() => { @@ -484,6 +486,7 @@ export const FiltersConfigForm: React.FC = ({ hasDataset={hasDataset} form={form} formData={newFormData} + enableNoResults={enableNoResults} /> ) : hasFilledDataset ? ( t('Click "Populate" to get "Default Value" ->') diff --git a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts index a674a27673..776a3a3234 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts @@ -72,7 +72,7 @@ export const getFormData = ({ extra_form_data: cascadingFilters, granularity_sqla: 'ds', metrics: ['count'], - row_limit: 10000, + row_limit: 1000, showSearch: true, defaultValue: defaultDataMask?.filterState?.value, time_range, diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js index a4f11da254..c9c661b5b8 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilter/index.js @@ -39,6 +39,7 @@ const OPERATORS_TO_SQL = { IN: 'IN', 'NOT IN': 'NOT IN', LIKE: 'LIKE', + ILIKE: 'ILIKE', REGEX: 'REGEX', 'IS NOT NULL': 'IS NOT NULL', 'IS NULL': 'IS NULL', diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.jsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.jsx index 6cba671985..be9b40258d 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.jsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.jsx @@ -84,6 +84,9 @@ function translateOperator(operator) { if (operator === OPERATORS.LIKE) { return 'LIKE'; } + if (operator === OPERATORS.ILIKE) { + return 'LIKE (case insensitive)'; + } if (operator === OPERATORS['LATEST PARTITION']) { return 'use latest_partition template'; } diff --git a/superset-frontend/src/explore/constants.ts b/superset-frontend/src/explore/constants.ts index d17eb0276a..e61d767d86 100644 --- a/superset-frontend/src/explore/constants.ts +++ b/superset-frontend/src/explore/constants.ts @@ -37,6 +37,7 @@ export const OPERATORS = { '<=': '<=', IN: 'IN', 'NOT IN': 'NOT IN', + ILIKE: 'ILIKE', LIKE: 'LIKE', REGEX: 'REGEX', 'IS NOT NULL': 'IS NOT NULL', @@ -48,7 +49,7 @@ export const OPERATORS = { export const OPERATORS_OPTIONS = Object.values(OPERATORS); -export const TABLE_ONLY_OPERATORS = [OPERATORS.LIKE]; +export const TABLE_ONLY_OPERATORS = [OPERATORS.LIKE, OPERATORS.ILIKE]; export const DRUID_ONLY_OPERATORS = [OPERATORS.REGEX]; export const HAVING_OPERATORS = [ OPERATORS['=='], diff --git a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx index e89cb7d1a3..4fc7e296ce 100644 --- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx +++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx @@ -18,31 +18,76 @@ */ import { AppSection, + DataMask, ensureIsArray, + ExtraFormData, GenericDataType, + JsonObject, smartDateDetailedFormatter, t, tn, } from '@superset-ui/core'; -import React, { useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useReducer, useState } from 'react'; import { Select } from 'src/common/components'; -import { FIRST_VALUE, PluginFilterSelectProps, SelectValue } from './types'; +import { debounce } from 'lodash'; +import { SLOW_DEBOUNCE } from 'src/constants'; +import { PluginFilterSelectProps, SelectValue } from './types'; import { StyledSelect, Styles } from '../common'; import { getDataRecordFormatter, getSelectExtraFormData } from '../../utils'; const { Option } = Select; +type DataMaskAction = + | { type: 'ownState'; ownState: JsonObject } + | { + type: 'filterState'; + extraFormData: ExtraFormData; + filterState: { value: SelectValue }; + }; + +function reducer(state: DataMask, action: DataMaskAction): DataMask { + switch (action.type) { + case 'ownState': + return { + ...state, + ownState: { + ...(state.ownState || {}), + ...action.ownState, + }, + }; + case 'filterState': + return { + ...state, + extraFormData: action.extraFormData, + filterState: { + ...(state.filterState || {}), + ...action.filterState, + }, + }; + default: + return { + ...state, + }; + } +} + +type DataMaskReducer = ( + prevState: DataMask, + action: DataMaskAction, +) => DataMask; + export default function PluginFilterSelect(props: PluginFilterSelectProps) { const { coltypeMap, data, + filterState, formData, height, + isRefreshing, width, setDataMask, setFocusedFilter, unsetFocusedFilter, - filterState, appSection, } = props; const { @@ -53,33 +98,75 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { inverseSelection, inputRef, defaultToFirstItem, + searchAllOptions, } = formData; - const forceFirstValue = + const isDisabled = appSection === AppSection.FILTER_CONFIG_MODAL && defaultToFirstItem; const groupby = ensureIsArray(formData.groupby); // Correct initial value for Ant Select - const initSelectValue: SelectValue = - // `defaultValue` can be `FIRST_VALUE` if `defaultToFirstItem` is checked, so need convert it to correct value for Select - defaultValue === FIRST_VALUE ? [] : defaultValue ?? []; - - const firstItem: SelectValue = data[0] - ? (groupby.map(col => data[0][col]) as string[]) ?? initSelectValue - : initSelectValue; // If we are in config modal we always need show empty select for `defaultToFirstItem` const [values, setValues] = useState( - defaultToFirstItem && appSection !== AppSection.FILTER_CONFIG_MODAL - ? firstItem - : initSelectValue, + !isDisabled && defaultValue?.length ? defaultValue : [], ); const [currentSuggestionSearch, setCurrentSuggestionSearch] = useState(''); + const [dataMask, dispatchDataMask] = useReducer( + reducer, + searchAllOptions + ? { + ownState: { + coltypeMap, + }, + } + : {}, + ); + + const debouncedOwnStateFunc = useCallback( + debounce((val: string) => { + dispatchDataMask({ + type: 'ownState', + ownState: { + search: val, + }, + }); + }, SLOW_DEBOUNCE), + [], + ); + + const searchWrapper = (val: string) => { + if (searchAllOptions) { + debouncedOwnStateFunc(val); + } + setCurrentSuggestionSearch(val); + }; const clearSuggestionSearch = () => { setCurrentSuggestionSearch(''); + if (searchAllOptions) { + dispatchDataMask({ + type: 'ownState', + ownState: { + search: null, + }, + }); + } }; + useEffect(() => { + const firstItem: SelectValue = data[0] + ? (groupby.map(col => data[0][col]) as string[]) + : null; + if (!isDisabled && defaultToFirstItem && firstItem) { + // initialize to first value if set to default to first item + setValues(firstItem); + } else if (!isDisabled && defaultValue?.length) { + // initialize to saved value + setValues(defaultValue); + } + }, [defaultToFirstItem, defaultValue]); + const handleBlur = () => { clearSuggestionSearch(); unsetFocusedFilter(); @@ -92,27 +179,24 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { }); const handleChange = (value?: SelectValue | number | string) => { - let selectValue: (number | string)[] = ensureIsArray( - value, - ); - let stateValue: SelectValue | typeof FIRST_VALUE = selectValue.length - ? selectValue - : null; + setValues(ensureIsArray(value)); + }; - if (value === FIRST_VALUE) { - selectValue = forceFirstValue ? [] : firstItem; - stateValue = FIRST_VALUE; + useEffect(() => { + if (isDisabled) { + setValues([]); } + }, [isDisabled]); - setValues(selectValue); - + useEffect(() => { const emptyFilter = - enableEmptyFilter && !inverseSelection && selectValue?.length === 0; + enableEmptyFilter && !inverseSelection && values?.length === 0; - setDataMask({ + dispatchDataMask({ + type: 'filterState', extraFormData: getSelectExtraFormData( col, - selectValue, + values, emptyFilter, inverseSelection, ), @@ -120,33 +204,21 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { // We need to save in state `FIRST_VALUE` as some const and not as REAL value, // because when FiltersBar check if all filters initialized it compares `defaultValue` with this value // and because REAL value can be unpredictable for users that have different data for same dashboard we use `FIRST_VALUE` - value: stateValue, + value: values, }, }); - }; + }, [col, enableEmptyFilter, inverseSelection, JSON.stringify(values)]); useEffect(() => { - // For currentValue we need set always `FIRST_VALUE` only if we in config modal for `defaultToFirstItem` mode - handleChange(forceFirstValue ? FIRST_VALUE : filterState.value ?? []); - }, [ - JSON.stringify(filterState.value), - defaultToFirstItem, - multiSelect, - enableEmptyFilter, - inverseSelection, - ]); + // handle changes coming from application, e.g. "Clear all" button + if (JSON.stringify(values) !== JSON.stringify(filterState.value)) { + handleChange(filterState.value); + } + }, [JSON.stringify(filterState.value)]); useEffect(() => { - // If we have `defaultToFirstItem` mode it means that default value always `FIRST_VALUE` - handleChange(defaultToFirstItem ? FIRST_VALUE : defaultValue); - }, [ - JSON.stringify(defaultValue), - JSON.stringify(firstItem), - defaultToFirstItem, - multiSelect, - enableEmptyFilter, - inverseSelection, - ]); + setDataMask(dataMask); + }, [JSON.stringify(dataMask)]); const placeholderText = data.length === 0 @@ -158,17 +230,18 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) { allowClear={!enableEmptyFilter} // @ts-ignore value={values} - disabled={forceFirstValue} + disabled={isDisabled} showSearch={showSearch} mode={multiSelect ? 'multiple' : undefined} placeholder={placeholderText} - onSearch={setCurrentSuggestionSearch} + onSearch={searchWrapper} onSelect={clearSuggestionSearch} onBlur={handleBlur} onFocus={setFocusedFilter} // @ts-ignore onChange={handleChange} ref={inputRef} + loading={isRefreshing} > {data.map(row => { const [value] = groupby.map(col => row[col]); diff --git a/superset-frontend/src/filters/components/Select/buildQuery.test.ts b/superset-frontend/src/filters/components/Select/buildQuery.test.ts index 967fee5ece..bedec5834e 100644 --- a/superset-frontend/src/filters/components/Select/buildQuery.test.ts +++ b/superset-frontend/src/filters/components/Select/buildQuery.test.ts @@ -16,10 +16,12 @@ * specific language governing permissions and limitations * under the License. */ +import { GenericDataType } from '@superset-ui/core'; import buildQuery from './buildQuery'; +import { PluginFilterSelectQueryFormData } from './types'; describe('Select buildQuery', () => { - const formData = { + const formData: PluginFilterSelectQueryFormData = { datasource: '5__table', groupby: ['my_col'], viz_type: 'filter_select', @@ -30,6 +32,7 @@ describe('Select buildQuery', () => { inverseSelection: false, multiSelect: false, defaultToFirstItem: false, + searchAllOptions: false, height: 100, width: 100, }; @@ -39,6 +42,7 @@ describe('Select buildQuery', () => { expect(queryContext.queries.length).toEqual(1); const [query] = queryContext.queries; expect(query.groupby).toEqual(['my_col']); + expect(query.filters).toEqual([{ col: 'my_col', op: 'IS NOT NULL' }]); expect(query.metrics).toEqual([]); expect(query.apply_fetch_values_predicate).toEqual(true); expect(query.orderby).toEqual([]); @@ -56,4 +60,30 @@ describe('Select buildQuery', () => { expect(query.metrics).toEqual(['my_metric']); expect(query.orderby).toEqual([['my_metric', false]]); }); + + it('should add text search parameter to query filter', () => { + const queryContext = buildQuery(formData, { + ownState: { + search: 'abc', + coltypeMap: { my_col: GenericDataType.STRING }, + }, + }); + expect(queryContext.queries.length).toEqual(1); + const [query] = queryContext.queries; + expect(query.filters).toEqual([ + { col: 'my_col', op: 'ILIKE', val: '%abc%' }, + ]); + }); + + it('should add numeric search parameter to query filter', () => { + const queryContext = buildQuery(formData, { + ownState: { + search: '123', + coltypeMap: { my_col: GenericDataType.NUMERIC }, + }, + }); + expect(queryContext.queries.length).toEqual(1); + const [query] = queryContext.queries; + expect(query.filters).toEqual([{ col: 'my_col', op: '>=', val: 123 }]); + }); }); diff --git a/superset-frontend/src/filters/components/Select/buildQuery.ts b/superset-frontend/src/filters/components/Select/buildQuery.ts index 9960b1b7de..a6684db641 100644 --- a/superset-frontend/src/filters/components/Select/buildQuery.ts +++ b/superset-frontend/src/filters/components/Select/buildQuery.ts @@ -16,29 +16,63 @@ * specific language governing permissions and limitations * under the License. */ -import { buildQueryContext } from '@superset-ui/core'; +import { + buildQueryContext, + GenericDataType, + QueryObject, + QueryObjectFilterClause, +} from '@superset-ui/core'; +import { BuildQuery } from '@superset-ui/core/lib/chart/registries/ChartBuildQueryRegistrySingleton'; import { DEFAULT_FORM_DATA, PluginFilterSelectQueryFormData } from './types'; -export default function buildQuery(formData: PluginFilterSelectQueryFormData) { +const buildQuery: BuildQuery = ( + formData: PluginFilterSelectQueryFormData, + options, +) => { + const { search, coltypeMap } = options?.ownState || {}; const { sortAscending, sortMetric } = { ...DEFAULT_FORM_DATA, ...formData }; return buildQueryContext(formData, baseQueryObject => { const { columns = [], filters = [] } = baseQueryObject; + const extra_filters: QueryObjectFilterClause[] = columns.map(column => { + if (search && coltypeMap[column] === GenericDataType.STRING) { + return { + col: column, + op: 'ILIKE', + val: `%${search}%`, + }; + } + if ( + search && + coltypeMap[column] === GenericDataType.NUMERIC && + !Number.isNaN(Number(search)) + ) { + // for numeric columns we apply a >= where clause + return { + col: column, + op: '>=', + val: Number(search), + }; + } + // if no search is defined, make sure the col value is not null + return { col: column, op: 'IS NOT NULL' }; + }); const sortColumns = sortMetric ? [sortMetric] : columns; - return [ + const query: QueryObject[] = [ { ...baseQueryObject, apply_fetch_values_predicate: true, groupby: columns, metrics: sortMetric ? [sortMetric] : [], - filters: filters.concat( - columns.map(column => ({ col: column, op: 'IS NOT NULL' })), - ), + filters: filters.concat(extra_filters), orderby: sortMetric || sortAscending ? sortColumns.map(column => [column, sortAscending]) : [], }, ]; + return query; }); -} +}; + +export default buildQuery; diff --git a/superset-frontend/src/filters/components/Select/controlPanel.ts b/superset-frontend/src/filters/components/Select/controlPanel.ts index 1fad9305b6..335e44483f 100644 --- a/superset-frontend/src/filters/components/Select/controlPanel.ts +++ b/superset-frontend/src/filters/components/Select/controlPanel.ts @@ -25,6 +25,7 @@ const { inverseSelection, multiSelect, defaultToFirstItem, + searchAllOptions, sortAscending, } = DEFAULT_FORM_DATA; @@ -109,6 +110,23 @@ const config: ControlPanelConfig = { }, }, ], + [ + { + name: 'searchAllOptions', + config: { + type: 'CheckboxControl', + renderTrigger: true, + affectsDataMask: true, + label: t('Search all filter options'), + default: searchAllOptions, + description: t( + 'By default, each filter loads at most 1000 choices at the initial page load. ' + + 'Check this box if you have more than 1000 filter values and want to enable dynamically ' + + 'searching that loads filter values as users type (may add stress to your database).', + ), + }, + }, + ], ], }, ], diff --git a/superset-frontend/src/filters/components/Select/index.ts b/superset-frontend/src/filters/components/Select/index.ts index 96513cc21f..3e9dcf8d37 100644 --- a/superset-frontend/src/filters/components/Select/index.ts +++ b/superset-frontend/src/filters/components/Select/index.ts @@ -28,6 +28,7 @@ export default class FilterSelectPlugin extends ChartPlugin { name: t('Select filter'), description: t('Select filter plugin using AntD'), behaviors: [Behavior.INTERACTIVE_CHART, Behavior.NATIVE_FILTER], + enableNoResults: false, thumbnail, }); diff --git a/superset-frontend/src/filters/components/Select/transformProps.ts b/superset-frontend/src/filters/components/Select/transformProps.ts index 47d3260dfe..59e58d352e 100644 --- a/superset-frontend/src/filters/components/Select/transformProps.ts +++ b/superset-frontend/src/filters/components/Select/transformProps.ts @@ -31,6 +31,7 @@ export default function transformProps( behaviors, appSection, filterState, + isRefreshing, } = chartProps; const newFormData = { ...DEFAULT_FORM_DATA, ...formData }; const { @@ -54,6 +55,7 @@ export default function transformProps( height, data, formData: newFormData, + isRefreshing, setDataMask, setFocusedFilter, unsetFocusedFilter, diff --git a/superset-frontend/src/filters/components/Select/types.ts b/superset-frontend/src/filters/components/Select/types.ts index 57c2dc30e2..aac5aa905a 100644 --- a/superset-frontend/src/filters/components/Select/types.ts +++ b/superset-frontend/src/filters/components/Select/types.ts @@ -29,16 +29,16 @@ import { import { RefObject } from 'react'; import { PluginFilterHooks, PluginFilterStylesProps } from '../types'; -export const FIRST_VALUE = '__FIRST_VALUE__'; export type SelectValue = (number | string)[] | null; interface PluginFilterSelectCustomizeProps { - defaultValue?: SelectValue | typeof FIRST_VALUE; + defaultValue?: SelectValue; enableEmptyFilter: boolean; inverseSelection: boolean; multiSelect: boolean; defaultToFirstItem: boolean; inputRef?: RefObject; + searchAllOptions: boolean; sortAscending: boolean; sortMetric?: string; } @@ -58,6 +58,7 @@ export type PluginFilterSelectProps = PluginFilterStylesProps & { appSection: AppSection; formData: PluginFilterSelectQueryFormData; filterState: FilterState; + isRefreshing: boolean; } & PluginFilterHooks; export const DEFAULT_FORM_DATA: PluginFilterSelectCustomizeProps = { @@ -66,5 +67,6 @@ export const DEFAULT_FORM_DATA: PluginFilterSelectCustomizeProps = { inverseSelection: false, defaultToFirstItem: false, multiSelect: true, + searchAllOptions: false, sortAscending: true, }; diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 7f62d4c6ab..bc8012b864 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -1239,6 +1239,8 @@ class SqlaTable( # pylint: disable=too-many-public-methods,too-many-instance-at where_clause_and.append(col_obj.get_sqla_col() <= eq) elif op == utils.FilterOperator.LIKE.value: where_clause_and.append(col_obj.get_sqla_col().like(eq)) + elif op == utils.FilterOperator.ILIKE.value: + where_clause_and.append(col_obj.get_sqla_col().ilike(eq)) else: raise QueryObjectValidationError( _("Invalid filter operation type: %(op)s", op=op) diff --git a/superset/utils/core.py b/superset/utils/core.py index ea7604cd20..5ece0aeef6 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -206,6 +206,7 @@ class FilterOperator(str, Enum): GREATER_THAN_OR_EQUALS = ">=" LESS_THAN_OR_EQUALS = "<=" LIKE = "LIKE" + ILIKE = "ILIKE" IS_NULL = "IS NULL" IS_NOT_NULL = "IS NOT NULL" IN = "IN" # pylint: disable=invalid-name