diff --git a/.pylintrc b/.pylintrc index 53a9b2ffd2f1a..49b3984d1943d 100644 --- a/.pylintrc +++ b/.pylintrc @@ -81,7 +81,7 @@ confidence= # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" -disable=long-builtin,dict-view-method,intern-builtin,suppressed-message,no-absolute-import,unpacking-in-except,apply-builtin,delslice-method,indexing-exception,old-raise-syntax,print-statement,cmp-builtin,reduce-builtin,useless-suppression,coerce-method,input-builtin,cmp-method,raw_input-builtin,nonzero-method,backtick,basestring-builtin,setslice-method,reload-builtin,oct-method,map-builtin-not-iterating,execfile-builtin,old-octal-literal,zip-builtin-not-iterating,buffer-builtin,getslice-method,metaclass-assignment,xrange-builtin,long-suffix,round-builtin,range-builtin-not-iterating,next-method-called,parameter-unpacking,unicode-builtin,unichr-builtin,import-star-module-level,raising-string,filter-builtin-not-iterating,using-cmp-argument,coerce-builtin,file-builtin,old-division,hex-method,missing-docstring,too-many-lines,ungrouped-imports,import-outside-toplevel,raise-missing-from,super-with-arguments,bad-option-value,too-few-public-methods +disable=long-builtin,dict-view-method,intern-builtin,suppressed-message,no-absolute-import,unpacking-in-except,apply-builtin,delslice-method,indexing-exception,old-raise-syntax,print-statement,cmp-builtin,reduce-builtin,useless-suppression,coerce-method,input-builtin,cmp-method,raw_input-builtin,nonzero-method,backtick,basestring-builtin,setslice-method,reload-builtin,oct-method,map-builtin-not-iterating,execfile-builtin,old-octal-literal,zip-builtin-not-iterating,buffer-builtin,getslice-method,metaclass-assignment,xrange-builtin,long-suffix,round-builtin,range-builtin-not-iterating,next-method-called,parameter-unpacking,unicode-builtin,unichr-builtin,import-star-module-level,raising-string,filter-builtin-not-iterating,using-cmp-argument,coerce-builtin,file-builtin,old-division,hex-method,missing-docstring,too-many-lines,ungrouped-imports,import-outside-toplevel,raise-missing-from,super-with-arguments,bad-option-value,too-few-public-methods,too-many-locals [REPORTS] diff --git a/superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts b/superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts index 61bdd7c6d9260..caff4c03f6755 100644 --- a/superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts +++ b/superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts @@ -61,7 +61,6 @@ describe('dashboard filters card view', () => { cy.get('.Select__menu').contains('Published').click({ timeout: 5000 }); cy.get('[data-test="styled-card"]').should('have.length', 2); cy.get('[data-test="styled-card"]') - .first() .contains('USA Births Names') .should('be.visible'); cy.get('.Select__control').eq(1).click(); @@ -107,13 +106,12 @@ describe('dashboard filters list view', () => { cy.get('[data-test="table-row"]').should('not.exist'); }); - xit('should filter by published correctly', () => { + it('should filter by published correctly', () => { // filter by published cy.get('.Select__control').eq(2).click(); cy.get('.Select__menu').contains('Published').click(); cy.get('[data-test="table-row"]').should('have.length', 2); cy.get('[data-test="table-row"]') - .first() .contains('USA Births Names') .should('be.visible'); cy.get('.Select__control').eq(2).click(); diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 42509818315e6..2649abee8eb27 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.52", - "@superset-ui/core": "^0.17.52", - "@superset-ui/legacy-plugin-chart-calendar": "^0.17.52", - "@superset-ui/legacy-plugin-chart-chord": "^0.17.52", - "@superset-ui/legacy-plugin-chart-country-map": "^0.17.52", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.52", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.52", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.52", - "@superset-ui/legacy-plugin-chart-histogram": "^0.17.52", - "@superset-ui/legacy-plugin-chart-horizon": "^0.17.52", - "@superset-ui/legacy-plugin-chart-map-box": "^0.17.52", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.52", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.52", - "@superset-ui/legacy-plugin-chart-partition": "^0.17.52", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.52", - "@superset-ui/legacy-plugin-chart-rose": "^0.17.52", - "@superset-ui/legacy-plugin-chart-sankey": "^0.17.52", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.52", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.52", - "@superset-ui/legacy-plugin-chart-treemap": "^0.17.52", - "@superset-ui/legacy-plugin-chart-world-map": "^0.17.52", - "@superset-ui/legacy-preset-chart-big-number": "^0.17.52", + "@superset-ui/chart-controls": "^0.17.53", + "@superset-ui/core": "^0.17.53", + "@superset-ui/legacy-plugin-chart-calendar": "^0.17.53", + "@superset-ui/legacy-plugin-chart-chord": "^0.17.53", + "@superset-ui/legacy-plugin-chart-country-map": "^0.17.53", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.53", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.53", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.53", + "@superset-ui/legacy-plugin-chart-histogram": "^0.17.53", + "@superset-ui/legacy-plugin-chart-horizon": "^0.17.53", + "@superset-ui/legacy-plugin-chart-map-box": "^0.17.53", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.53", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.53", + "@superset-ui/legacy-plugin-chart-partition": "^0.17.53", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.53", + "@superset-ui/legacy-plugin-chart-rose": "^0.17.53", + "@superset-ui/legacy-plugin-chart-sankey": "^0.17.53", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.53", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.53", + "@superset-ui/legacy-plugin-chart-treemap": "^0.17.53", + "@superset-ui/legacy-plugin-chart-world-map": "^0.17.53", + "@superset-ui/legacy-preset-chart-big-number": "^0.17.53", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.7", - "@superset-ui/legacy-preset-chart-nvd3": "^0.17.52", - "@superset-ui/plugin-chart-echarts": "^0.17.52", - "@superset-ui/plugin-chart-pivot-table": "^0.17.52", - "@superset-ui/plugin-chart-table": "^0.17.52", - "@superset-ui/plugin-chart-word-cloud": "^0.17.52", - "@superset-ui/preset-chart-xy": "^0.17.52", + "@superset-ui/legacy-preset-chart-nvd3": "^0.17.53", + "@superset-ui/plugin-chart-echarts": "^0.17.53", + "@superset-ui/plugin-chart-pivot-table": "^0.17.53", + "@superset-ui/plugin-chart-table": "^0.17.53", + "@superset-ui/plugin-chart-word-cloud": "^0.17.53", + "@superset-ui/preset-chart-xy": "^0.17.53", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", @@ -102,6 +102,7 @@ "react-markdown": "^4.3.1", "react-redux": "^7.2.0", "react-resize-detector": "^6.0.1-rc.1", + "react-reverse-portal": "^2.0.1", "react-router-dom": "^5.1.2", "react-search-input": "^0.11.3", "react-select": "^3.1.0", @@ -14102,11 +14103,11 @@ } }, "node_modules/@superset-ui/chart-controls": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.52.tgz", - "integrity": "sha512-np/i0qYvOiZqXgwJXQC2KElt44wLxsVFEfxC4/6ej8vH8jUuCP5D1s4N+L/y0xHtUQo0YuFHPXcTWjuvRFiySg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.53.tgz", + "integrity": "sha512-PjIDka4/lUwXUNEGjkQOIMwVWF2WfknqM6pKFNDPO0/nG4S4faQk96z/ABOXp8GYwIbBshnmmbmW4TCrCQ10Xw==", "dependencies": { - "@superset-ui/core": "0.17.52", + "@superset-ui/core": "0.17.53", "lodash": "^4.17.15", "prop-types": "^15.7.2" }, @@ -14118,9 +14119,9 @@ } }, "node_modules/@superset-ui/core": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.52.tgz", - "integrity": "sha512-MqRWpHMecyOwIanHL6Mj+ZwYCZDfKi+2iTEkHAq3HM9dvAYElUzY3T1yGOe5ciLd/pbsyM2C/7TqIkJN6Qepfg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.53.tgz", + "integrity": "sha512-2bIRrK3Y+4ZSNu6drc1EzHTq6fO3aWfdjCh43ytju88nlADHheQXgwxEKnmjzI141qxiVL2+oSL2kC6pSTkW8A==", "dependencies": { "@babel/runtime": "^7.1.2", "@emotion/cache": "^11.1.3", @@ -14247,12 +14248,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.52.tgz", - "integrity": "sha512-l7EJ1l4w+zxL23P7UT4U/NnifN+dQixcYdgg+hWEGno9BFKS5RPmEM1hPZ5MfcQktPcHwUSs/WHvfQcUtPrGTQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.53.tgz", + "integrity": "sha512-NLevYzzhQyRgP+vdEfhJyDxJIBbGM/bJTJfFw1iRllny3WQax6iU/X5hUw/iWZqruVNkwSnUA39+EGcjU1aIjg==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -14271,24 +14272,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.52.tgz", - "integrity": "sha512-PZZP2zhHPYmgZEiEfejusrVQAsNLikekJYfMqCrYd+AM+mT3e6cFqb6Bill/eD3dbJjB4xGhNKdj7bJ76254VQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.53.tgz", + "integrity": "sha512-a3Y8b/1nSuFvzEzUDTVVmad5/YjTBhz0qU2rcVGrdKp2kzuSVXVVljdN7KVisDUNHhYqrttLM8RQrqGw9f7x1A==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "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.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.52.tgz", - "integrity": "sha512-uQ/Vo/BqBCIaDPDSM1TSmosNXvK/Mog81zLZM+vxr+r4uLefUNHpoJHvf0xuEDCe5Pw5LekdzvwX5wqwdNAEDg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.53.tgz", + "integrity": "sha512-zTImQdeBT8raXnxafBIHvaVqOqKoECfyDwgFlPKhs4M7EXPG7U8/VLg0Oi2dCA7/SFZA/ASrJwc/KxW399vJhw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -14303,13 +14304,13 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.52.tgz", - "integrity": "sha512-VWcbUCWn3n+qNTWiKKD1l9CPcc51KqVnmTrznE/96lXD74fwa6lXZBchkwLAWiilBV0Dh1rp4NiPLxBf75ZyMg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.53.tgz", + "integrity": "sha512-QYL0Feyfu7ZH1GeQ9sfEaEgnW2IQG93sJnM29NO53CjSvdbbZItfU9v6xVnAo6jMwcam7JLNYRtuIPgJevNThw==", "dependencies": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "prop-types": "^15.6.2" }, "peerDependencies": { @@ -14317,12 +14318,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.52.tgz", - "integrity": "sha512-8Gyc4H9frO54PQDNmkkVUDG0bmks0G0bd2miWrbe1BQv8svBdZxQ+XkvAWIWpyceYdrVSJAzToiKpVdSeWENwA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.53.tgz", + "integrity": "sha512-F7hkrBxC7EWrClQ1jb7anzj1SmIjqXVMz2JKhzwEUk++Tafnn0mrB7Yo51u3twFFOY5bwn+KcI1NObzBRkXguQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -14331,12 +14332,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.52.tgz", - "integrity": "sha512-gQ5PRLQUmFjkZDKfHir97BBjOaGGqnctwnH/cgV8t2/OZRz7sy4KgBK+k3s32Q5iSEeKP+XVnJSUApl6H8THvw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.53.tgz", + "integrity": "sha512-NXx/E3AiTxkL+qwaj8B0IDrhWo6P5u5EuXXx1xaWqMTH18YomyeA9l4NBPwsjCfhAMqrEeT0hzeY2/WSoPq5KQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -14344,14 +14345,14 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.52.tgz", - "integrity": "sha512-wKaB+K1h+I9pS7VU0Z0u3/pRKPxWazigI1AwG+aWNCW1FdeFwOhdWqBOhFelQOdx1VM7tmrOyzbfYCF+yf+Qbg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.53.tgz", + "integrity": "sha512-EQ/VvG+qCec+IqnwYHA90iHAjkhnPNGkKbTuKlsRyL3ONfxg3n6L4EQOlAA0HvELKkFAZXBxh8TA8Qc3j+g4Fw==", "dependencies": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -14420,12 +14421,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.52.tgz", - "integrity": "sha512-mlxgJAAiH2DPhfUHeuhwW/g5wu6L1FtiimtN+OqsdbRBC+/B5KtNALhflMnjiK2vY53oS0usjLna1CnidMP+lQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.53.tgz", + "integrity": "sha512-LsM4HOuOkiabRNxMUjjietbFx99admne59Mm5zQdsRPNEpN/EKEWu8R4G4crSSqxxzD9KVnveRPE7OD0n91k/A==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -14455,12 +14456,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.52.tgz", - "integrity": "sha512-gQgnQ7I4QUMx8IJsEepagpNzOv2f4+3y7CashuQ9tbuEkpN6LZ3WButs+BQPcxF5YNA51fR3s4gxA6SOodcHFQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.53.tgz", + "integrity": "sha512-JuM77arnxECuSiHkdLMry4JruuVTAfTKTtR8F4qGOpiYiXzGEv4K+y12eqBe1o94ckJF43Esz9e1fdPLDkjqTw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -14481,12 +14482,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.52.tgz", - "integrity": "sha512-52Iph2obBw5HezUIb/0gBgOjjU9BiCuGDNy6l2/QK9VGsQX32/5AlrNwOKJuyIaaja3Fl/H+qvHM8vQE6Z8etw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.53.tgz", + "integrity": "sha512-QkRVm0XGoOxqOX0nRvHnGon2gG8MmV+dbBBpmPkmspxCWKrn183Wzq5SiMlM4vgo2HaroWUIPuBgLBd7rYZtGw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" @@ -14496,12 +14497,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.52.tgz", - "integrity": "sha512-kgBamgH7h5WH7HpsQOWBprmY52/y6y/lGdtu7NfaWDq/049IDzjkcOhA0akcJh61UT5ek3+gqsurEJ0CCbqxVw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.53.tgz", + "integrity": "sha512-NcwuEd+rXfmwPshPby0jEgnJnbYfKruM7l0Hb3lIw6iMTc1IV21d1CMftQPvYYdwagam0FapBO2YcSvnvj2rDw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "prop-types": "^15.7.2" }, @@ -14510,12 +14511,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.52.tgz", - "integrity": "sha512-gRmBkZlEEtwyU40m7BM3yFbYiaBoAmRTkIg66bAX+63IKhCAT8J6NvggBQGUC6jQQOgsta758SxH8bmR6c2vCw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.53.tgz", + "integrity": "sha512-CTzKjaKCdT/+bFlXUDD4nXC2CO7mXmIPJ2K/M94rY2G2gdAWRZJ1i2HlcvTP+RY/AItzZm3C+E7hYdAQ6toBkA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" @@ -14525,24 +14526,24 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.52.tgz", - "integrity": "sha512-awYGn65DkOemP952lnhvRZYucgtFNOwJea5bsylyDe1QQIuFp3KaETob14TqrSyR+AuNrdBf0hkXQ3AAhwtcQQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.53.tgz", + "integrity": "sha512-bk7mttnZFGgGmWCfj0kO++65XsMNyQJch0dgfRRnLVTlSnY89/kGqszTKybbCZhsbx4T5bJ+bn6hZKAGH+FnUA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "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.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.52.tgz", - "integrity": "sha512-zZ9VTTwRN9HxaGliJfM+OAwv/8k6dAGDme6kLpIHZWYbEa3aWIXgVbDF00zvC9lyu/pcV4hr3xi20UnawZ0pNA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.53.tgz", + "integrity": "sha512-ppvQuKAS0rMhniKenLXSKczmAsHX4igYc0bVZAvfFDmLNW3tnlmivL+zYSw/sQ9PAhjMGDbTBlSio1oJ+91wiA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" @@ -14552,12 +14553,12 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.52.tgz", - "integrity": "sha512-jxSGABuXo8Nu+qRAcX8LwyToXfgLBHqlRpTEJwDEW5U77A+o3r2ZFvlUBtGv1HGioiG/AccDno/J61MUrvz2YA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.53.tgz", + "integrity": "sha512-3tvMghg5WUAq40su8cZrjJHoc/TsK1WWx6UFu+j2mPOh/BJJZb8wh7A63X82ubLdyzEqdjxsEs9pzZWzs7kUHw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" @@ -14567,47 +14568,47 @@ } }, "node_modules/@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.52.tgz", - "integrity": "sha512-scfjXqOJ0QvIen0h8sIg+jln8eJdHaP+9pLI/W4dMj0hh2o6s7QNgUCmb4AJuWqpcC/K/GkwdxG4QhFvFJzAIw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.53.tgz", + "integrity": "sha512-60aGflqOi5+XDE3BR/p+Pw0xVp7OHsjwroX77CwkwBtFkw1AFVWczaTJH6CYeeCJZXCLYjrbc5OFMuaxIJ+j+Q==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "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.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.52.tgz", - "integrity": "sha512-71Iowlr/Fi68evO3SNCEyzOoVxqf1x/2TToo5w5fuZWWHNfiwfolxpkf3P7FvhGAG5oxv8b/uloqEgXtaYX3Ig==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.53.tgz", + "integrity": "sha512-t0z7XPsDtDpnZ+fIpn57w9Vi3oWQ7ximDdjmag1WGhC6+dwR3XxEpNcicI6P6xfNX078RT8Iz89PZQBtagAAkA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "node_modules/@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.52.tgz", - "integrity": "sha512-9rET9gIFyPifv4IcRc8VGBJdKB7KQxwozm2B0sugK2W1zkOux46eszs6rGXfym4cqjFXzWsTlTfqR0vFLp/pnw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.53.tgz", + "integrity": "sha512-LV16Qwiz7ahfhCmuWIGk6f54KpdRJDAyLtr/ifFi8a2AcoG27Lf7hZZ3mCI9Jl5X6c7LLBmvAHfxdbBnLGa8+g==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "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.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.52.tgz", - "integrity": "sha512-s8si/qlg4OScxg2uKTE0rK24i0Lsu9sITdwXMMcEN02gJiYmNi09nhwPp+6a6I5eVFAsys54bwRC+YxjG9QgHQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.53.tgz", + "integrity": "sha512-gnDBTyWPctqucyQzAObH6N+3f9GUQq9qpQ4cNbtvpIoVgXowYA5Q5dIfXBPnq525t78o3eiWqclTYf2Xcd62Kw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -14632,13 +14633,13 @@ "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, "node_modules/@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.52.tgz", - "integrity": "sha512-jXiduxVOCCBN6kB1Wf9h6VR42WA1nPqlCmHNThg0cWmsVcMPqOuSK8Wuw+FtD6bYdasZ6sY+3bd5WYsqFHWxhA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.53.tgz", + "integrity": "sha512-HUlE6IZUjFvPMiXCj1cdRiR4avFLVhT5qwIQZk1l30kycl8/73rTm37Y/syBfZMPrfCrIW3nyReqfcnAaNqw9g==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -14679,13 +14680,13 @@ } }, "node_modules/@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.52.tgz", - "integrity": "sha512-BJ/5YukberMIdGUN2XVzFSgb6ETah9694W2TB7vPPJhm9/AZ6ThnCh0finGnxE4kxpGe9hups5S05dnWwLgDJQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.53.tgz", + "integrity": "sha512-wTbQRCZDrnb16tLJzXYbIiCFbHddRJ3fo5DKsbv6MFNrfOLWWx1SjAZ5C60e57u33XpKdTE5jGpEuGdq7BZ55w==", "dependencies": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -14702,12 +14703,12 @@ } }, "node_modules/@superset-ui/plugin-chart-echarts": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.52.tgz", - "integrity": "sha512-BTEgnfsZ6+GzSgacp0dn/Lr98GtXGBZVo7ychjwqGs4k/XKxaRtzQdFMFBrYMDWKbG0G4ui8IeonJ0b1dvNN6A==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.53.tgz", + "integrity": "sha512-XXKqhr2CwZfi02qW55d9SQnNmdewTsAJT6xePBjci0SXAZRmi/T8vRbq2OCDJ7mQ0de7kjVBydAuOEEU/Y554A==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.1.1", @@ -14719,12 +14720,12 @@ } }, "node_modules/@superset-ui/plugin-chart-pivot-table": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.52.tgz", - "integrity": "sha512-XlLWDEfOnijUPxGy1WUTSX1lH9t7ym/Q+LJeX8pSaiSWZJbq4byudQum2YOxZqfYREFGSgiEzzM3BUuU5dMh5w==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.53.tgz", + "integrity": "sha512-18CTaM1sRgK5laFwHlKV+1A7+l9YWwPAvb7XrMjS8CQq0T2aEqNSQm7KWByG+LEj2x86idM8gaWghNes27yVtQ==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@superset-ui/react-pivottable": "^0.12.8" }, "peerDependencies": { @@ -14732,12 +14733,12 @@ } }, "node_modules/@superset-ui/plugin-chart-table": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.52.tgz", - "integrity": "sha512-I9QUAYvp2s6GHq/+z136hVa7cW8SAWduuTo1i+jlmzzjfeykUG+ESM3BtR53vQJbNkQgs/KwZR8prF0LpenAzg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.53.tgz", + "integrity": "sha512-PSeL/zQSTvQyztjUMMm4U4G6oEM3xk3wkC4HTpuLEpjQ7qyGme39M1JeCGvNG4pPZRm0nO4pU+0U/36oR0lAjw==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -14763,12 +14764,12 @@ } }, "node_modules/@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.52.tgz", - "integrity": "sha512-05T6dLl4kK2luLC4isyAerGKPzxRb3+LNrjAB58ZSASgLDrH7iCZnzc1xYHK7xt00OMSYV1g8DveOdwobU+WhA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.53.tgz", + "integrity": "sha512-lQTr9UpeoGgX1B0SkjrvtL0zjgYVoJbm6RVv8ELG+efCG1oYAoIVgw2sahJI4zLqNiHcNeWqHUcu7NK06uc4mA==", "dependencies": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -14801,14 +14802,14 @@ } }, "node_modules/@superset-ui/preset-chart-xy": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.52.tgz", - "integrity": "sha512-KsqwmUU9a5O6owKL950ynzbvDAY4XGT4H/ZqnBiS2QnhK/0YuucNhyoVjfg+l7dxqahNRXm0xj9OYyoPVH3O2Q==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.53.tgz", + "integrity": "sha512-nmqif4Zd7Tdx4hLoDiiRiNFUFn1kliumjp9RQK68eMaefWcl1vTMT7nPmyFvgUH5390HJygpC3up50+j5Bngkg==", "dependencies": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", @@ -44737,6 +44738,15 @@ "resize-observer-polyfill": "^1.5.1" } }, + "node_modules/react-reverse-portal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-reverse-portal/-/react-reverse-portal-2.0.1.tgz", + "integrity": "sha512-sj/D9nSHspqV8i8hWkTSZ5Ohnrqk2A5fkDKw4Xe/zV4OfF1UYwmbzrxLdmNRdKkWgQwnXIxaa2E3FC7QYdZAeA==", + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0" + } + }, "node_modules/react-router": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", @@ -66275,19 +66285,19 @@ } }, "@superset-ui/chart-controls": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.52.tgz", - "integrity": "sha512-np/i0qYvOiZqXgwJXQC2KElt44wLxsVFEfxC4/6ej8vH8jUuCP5D1s4N+L/y0xHtUQo0YuFHPXcTWjuvRFiySg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.53.tgz", + "integrity": "sha512-PjIDka4/lUwXUNEGjkQOIMwVWF2WfknqM6pKFNDPO0/nG4S4faQk96z/ABOXp8GYwIbBshnmmbmW4TCrCQ10Xw==", "requires": { - "@superset-ui/core": "0.17.52", + "@superset-ui/core": "0.17.53", "lodash": "^4.17.15", "prop-types": "^15.7.2" } }, "@superset-ui/core": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.52.tgz", - "integrity": "sha512-MqRWpHMecyOwIanHL6Mj+ZwYCZDfKi+2iTEkHAq3HM9dvAYElUzY3T1yGOe5ciLd/pbsyM2C/7TqIkJN6Qepfg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.53.tgz", + "integrity": "sha512-2bIRrK3Y+4ZSNu6drc1EzHTq6fO3aWfdjCh43ytju88nlADHheQXgwxEKnmjzI141qxiVL2+oSL2kC6pSTkW8A==", "requires": { "@babel/runtime": "^7.1.2", "@emotion/cache": "^11.1.3", @@ -66399,12 +66409,12 @@ } }, "@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.52.tgz", - "integrity": "sha512-l7EJ1l4w+zxL23P7UT4U/NnifN+dQixcYdgg+hWEGno9BFKS5RPmEM1hPZ5MfcQktPcHwUSs/WHvfQcUtPrGTQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.53.tgz", + "integrity": "sha512-NLevYzzhQyRgP+vdEfhJyDxJIBbGM/bJTJfFw1iRllny3WQax6iU/X5hUw/iWZqruVNkwSnUA39+EGcjU1aIjg==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", @@ -66422,24 +66432,24 @@ } }, "@superset-ui/legacy-plugin-chart-chord": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.52.tgz", - "integrity": "sha512-PZZP2zhHPYmgZEiEfejusrVQAsNLikekJYfMqCrYd+AM+mT3e6cFqb6Bill/eD3dbJjB4xGhNKdj7bJ76254VQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.53.tgz", + "integrity": "sha512-a3Y8b/1nSuFvzEzUDTVVmad5/YjTBhz0qU2rcVGrdKp2kzuSVXVVljdN7KVisDUNHhYqrttLM8RQrqGw9f7x1A==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "prop-types": "^15.6.2", "react": "^16.13.1" } }, "@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.52.tgz", - "integrity": "sha512-uQ/Vo/BqBCIaDPDSM1TSmosNXvK/Mog81zLZM+vxr+r4uLefUNHpoJHvf0xuEDCe5Pw5LekdzvwX5wqwdNAEDg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.53.tgz", + "integrity": "sha512-zTImQdeBT8raXnxafBIHvaVqOqKoECfyDwgFlPKhs4M7EXPG7U8/VLg0Oi2dCA7/SFZA/ASrJwc/KxW399vJhw==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-array": "^2.0.3", "prop-types": "^15.6.2" @@ -66456,34 +66466,34 @@ } }, "@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.52.tgz", - "integrity": "sha512-VWcbUCWn3n+qNTWiKKD1l9CPcc51KqVnmTrznE/96lXD74fwa6lXZBchkwLAWiilBV0Dh1rp4NiPLxBf75ZyMg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.53.tgz", + "integrity": "sha512-QYL0Feyfu7ZH1GeQ9sfEaEgnW2IQG93sJnM29NO53CjSvdbbZItfU9v6xVnAo6jMwcam7JLNYRtuIPgJevNThw==", "requires": { "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.52.tgz", - "integrity": "sha512-8Gyc4H9frO54PQDNmkkVUDG0bmks0G0bd2miWrbe1BQv8svBdZxQ+XkvAWIWpyceYdrVSJAzToiKpVdSeWENwA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.53.tgz", + "integrity": "sha512-F7hkrBxC7EWrClQ1jb7anzj1SmIjqXVMz2JKhzwEUk++Tafnn0mrB7Yo51u3twFFOY5bwn+KcI1NObzBRkXguQ==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.52.tgz", - "integrity": "sha512-gQ5PRLQUmFjkZDKfHir97BBjOaGGqnctwnH/cgV8t2/OZRz7sy4KgBK+k3s32Q5iSEeKP+XVnJSUApl6H8THvw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.53.tgz", + "integrity": "sha512-NXx/E3AiTxkL+qwaj8B0IDrhWo6P5u5EuXXx1xaWqMTH18YomyeA9l4NBPwsjCfhAMqrEeT0hzeY2/WSoPq5KQ==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-svg-legend": "^1.x", "d3-tip": "^0.9.1", @@ -66491,14 +66501,14 @@ } }, "@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.52.tgz", - "integrity": "sha512-wKaB+K1h+I9pS7VU0Z0u3/pRKPxWazigI1AwG+aWNCW1FdeFwOhdWqBOhFelQOdx1VM7tmrOyzbfYCF+yf+Qbg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.53.tgz", + "integrity": "sha512-EQ/VvG+qCec+IqnwYHA90iHAjkhnPNGkKbTuKlsRyL3ONfxg3n6L4EQOlAA0HvELKkFAZXBxh8TA8Qc3j+g4Fw==", "requires": { "@data-ui/histogram": "^0.0.84", "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@vx/legend": "^0.0.198", "@vx/responsive": "^0.0.199", "@vx/scale": "^0.0.197", @@ -66566,12 +66576,12 @@ } }, "@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.52.tgz", - "integrity": "sha512-mlxgJAAiH2DPhfUHeuhwW/g5wu6L1FtiimtN+OqsdbRBC+/B5KtNALhflMnjiK2vY53oS0usjLna1CnidMP+lQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.53.tgz", + "integrity": "sha512-LsM4HOuOkiabRNxMUjjietbFx99admne59Mm5zQdsRPNEpN/EKEWu8R4G4crSSqxxzD9KVnveRPE7OD0n91k/A==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3-array": "^2.0.3", "d3-scale": "^3.0.1", "prop-types": "^15.6.2" @@ -66600,12 +66610,12 @@ } }, "@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.52.tgz", - "integrity": "sha512-gQgnQ7I4QUMx8IJsEepagpNzOv2f4+3y7CashuQ9tbuEkpN6LZ3WButs+BQPcxF5YNA51fR3s4gxA6SOodcHFQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.53.tgz", + "integrity": "sha512-JuM77arnxECuSiHkdLMry4JruuVTAfTKTtR8F4qGOpiYiXzGEv4K+y12eqBe1o94ckJF43Esz9e1fdPLDkjqTw==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "immutable": "^3.8.2", "mapbox-gl": "^0.53.0", "prop-types": "^15.6.2", @@ -66622,118 +66632,118 @@ } }, "@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.52.tgz", - "integrity": "sha512-52Iph2obBw5HezUIb/0gBgOjjU9BiCuGDNy6l2/QK9VGsQX32/5AlrNwOKJuyIaaja3Fl/H+qvHM8vQE6Z8etw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.53.tgz", + "integrity": "sha512-QkRVm0XGoOxqOX0nRvHnGon2gG8MmV+dbBBpmPkmspxCWKrn183Wzq5SiMlM4vgo2HaroWUIPuBgLBd7rYZtGw==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "distributions": "^1.0.0", "prop-types": "^15.6.2", "reactable": "^1.1.0" } }, "@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.52.tgz", - "integrity": "sha512-kgBamgH7h5WH7HpsQOWBprmY52/y6y/lGdtu7NfaWDq/049IDzjkcOhA0akcJh61UT5ek3+gqsurEJ0CCbqxVw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.53.tgz", + "integrity": "sha512-NcwuEd+rXfmwPshPby0jEgnJnbYfKruM7l0Hb3lIw6iMTc1IV21d1CMftQPvYYdwagam0FapBO2YcSvnvj2rDw==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "prop-types": "^15.7.2" } }, "@superset-ui/legacy-plugin-chart-partition": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.52.tgz", - "integrity": "sha512-gRmBkZlEEtwyU40m7BM3yFbYiaBoAmRTkIg66bAX+63IKhCAT8J6NvggBQGUC6jQQOgsta758SxH8bmR6c2vCw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.53.tgz", + "integrity": "sha512-CTzKjaKCdT/+bFlXUDD4nXC2CO7mXmIPJ2K/M94rY2G2gdAWRZJ1i2HlcvTP+RY/AItzZm3C+E7hYdAQ6toBkA==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-hierarchy": "^1.1.8", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.52.tgz", - "integrity": "sha512-awYGn65DkOemP952lnhvRZYucgtFNOwJea5bsylyDe1QQIuFp3KaETob14TqrSyR+AuNrdBf0hkXQ3AAhwtcQQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.53.tgz", + "integrity": "sha512-bk7mttnZFGgGmWCfj0kO++65XsMNyQJch0dgfRRnLVTlSnY89/kGqszTKybbCZhsbx4T5bJ+bn6hZKAGH+FnUA==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "datatables.net-bs": "^1.10.15", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-rose": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.52.tgz", - "integrity": "sha512-zZ9VTTwRN9HxaGliJfM+OAwv/8k6dAGDme6kLpIHZWYbEa3aWIXgVbDF00zvC9lyu/pcV4hr3xi20UnawZ0pNA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.53.tgz", + "integrity": "sha512-ppvQuKAS0rMhniKenLXSKczmAsHX4igYc0bVZAvfFDmLNW3tnlmivL+zYSw/sQ9PAhjMGDbTBlSio1oJ+91wiA==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "nvd3": "1.8.6", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.52.tgz", - "integrity": "sha512-jxSGABuXo8Nu+qRAcX8LwyToXfgLBHqlRpTEJwDEW5U77A+o3r2ZFvlUBtGv1HGioiG/AccDno/J61MUrvz2YA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.53.tgz", + "integrity": "sha512-3tvMghg5WUAq40su8cZrjJHoc/TsK1WWx6UFu+j2mPOh/BJJZb8wh7A63X82ubLdyzEqdjxsEs9pzZWzs7kUHw==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-sankey": "^0.4.2", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.52.tgz", - "integrity": "sha512-scfjXqOJ0QvIen0h8sIg+jln8eJdHaP+9pLI/W4dMj0hh2o6s7QNgUCmb4AJuWqpcC/K/GkwdxG4QhFvFJzAIw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.53.tgz", + "integrity": "sha512-60aGflqOi5+XDE3BR/p+Pw0xVp7OHsjwroX77CwkwBtFkw1AFVWczaTJH6CYeeCJZXCLYjrbc5OFMuaxIJ+j+Q==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "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.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.52.tgz", - "integrity": "sha512-71Iowlr/Fi68evO3SNCEyzOoVxqf1x/2TToo5w5fuZWWHNfiwfolxpkf3P7FvhGAG5oxv8b/uloqEgXtaYX3Ig==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.53.tgz", + "integrity": "sha512-t0z7XPsDtDpnZ+fIpn57w9Vi3oWQ7ximDdjmag1WGhC6+dwR3XxEpNcicI6P6xfNX078RT8Iz89PZQBtagAAkA==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "prop-types": "^15.6.2" } }, "@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.52.tgz", - "integrity": "sha512-9rET9gIFyPifv4IcRc8VGBJdKB7KQxwozm2B0sugK2W1zkOux46eszs6rGXfym4cqjFXzWsTlTfqR0vFLp/pnw==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.53.tgz", + "integrity": "sha512-LV16Qwiz7ahfhCmuWIGk6f54KpdRJDAyLtr/ifFi8a2AcoG27Lf7hZZ3mCI9Jl5X6c7LLBmvAHfxdbBnLGa8+g==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "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.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.52.tgz", - "integrity": "sha512-s8si/qlg4OScxg2uKTE0rK24i0Lsu9sITdwXMMcEN02gJiYmNi09nhwPp+6a6I5eVFAsys54bwRC+YxjG9QgHQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.53.tgz", + "integrity": "sha512-gnDBTyWPctqucyQzAObH6N+3f9GUQq9qpQ4cNbtvpIoVgXowYA5Q5dIfXBPnq525t78o3eiWqclTYf2Xcd62Kw==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-array": "^2.4.0", "d3-color": "^1.4.1", @@ -66757,13 +66767,13 @@ } }, "@superset-ui/legacy-preset-chart-big-number": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.52.tgz", - "integrity": "sha512-jXiduxVOCCBN6kB1Wf9h6VR42WA1nPqlCmHNThg0cWmsVcMPqOuSK8Wuw+FtD6bYdasZ6sY+3bd5WYsqFHWxhA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.53.tgz", + "integrity": "sha512-HUlE6IZUjFvPMiXCj1cdRiR4avFLVhT5qwIQZk1l30kycl8/73rTm37Y/syBfZMPrfCrIW3nyReqfcnAaNqw9g==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@types/d3-color": "^1.2.2", "@types/shortid": "^0.0.29", "d3-color": "^1.2.3", @@ -66796,13 +66806,13 @@ } }, "@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.52.tgz", - "integrity": "sha512-BJ/5YukberMIdGUN2XVzFSgb6ETah9694W2TB7vPPJhm9/AZ6ThnCh0finGnxE4kxpGe9hups5S05dnWwLgDJQ==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.53.tgz", + "integrity": "sha512-wTbQRCZDrnb16tLJzXYbIiCFbHddRJ3fo5DKsbv6MFNrfOLWWx1SjAZ5C60e57u33XpKdTE5jGpEuGdq7BZ55w==", "requires": { "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "d3": "^3.5.17", "d3-tip": "^0.9.1", "dompurify": "^2.0.6", @@ -66816,12 +66826,12 @@ } }, "@superset-ui/plugin-chart-echarts": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.52.tgz", - "integrity": "sha512-BTEgnfsZ6+GzSgacp0dn/Lr98GtXGBZVo7ychjwqGs4k/XKxaRtzQdFMFBrYMDWKbG0G4ui8IeonJ0b1dvNN6A==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.53.tgz", + "integrity": "sha512-XXKqhr2CwZfi02qW55d9SQnNmdewTsAJT6xePBjci0SXAZRmi/T8vRbq2OCDJ7mQ0de7kjVBydAuOEEU/Y554A==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@types/mathjs": "^6.0.7", "d3-array": "^1.2.0", "echarts": "^5.1.1", @@ -66830,22 +66840,22 @@ } }, "@superset-ui/plugin-chart-pivot-table": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.52.tgz", - "integrity": "sha512-XlLWDEfOnijUPxGy1WUTSX1lH9t7ym/Q+LJeX8pSaiSWZJbq4byudQum2YOxZqfYREFGSgiEzzM3BUuU5dMh5w==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.53.tgz", + "integrity": "sha512-18CTaM1sRgK5laFwHlKV+1A7+l9YWwPAvb7XrMjS8CQq0T2aEqNSQm7KWByG+LEj2x86idM8gaWghNes27yVtQ==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@superset-ui/react-pivottable": "^0.12.8" } }, "@superset-ui/plugin-chart-table": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.52.tgz", - "integrity": "sha512-I9QUAYvp2s6GHq/+z136hVa7cW8SAWduuTo1i+jlmzzjfeykUG+ESM3BtR53vQJbNkQgs/KwZR8prF0LpenAzg==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.53.tgz", + "integrity": "sha512-PSeL/zQSTvQyztjUMMm4U4G6oEM3xk3wkC4HTpuLEpjQ7qyGme39M1JeCGvNG4pPZRm0nO4pU+0U/36oR0lAjw==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@types/d3-array": "^2.9.0", "@types/react-table": "^7.0.29", "d3-array": "^2.4.0", @@ -66867,12 +66877,12 @@ } }, "@superset-ui/plugin-chart-word-cloud": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.52.tgz", - "integrity": "sha512-05T6dLl4kK2luLC4isyAerGKPzxRb3+LNrjAB58ZSASgLDrH7iCZnzc1xYHK7xt00OMSYV1g8DveOdwobU+WhA==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.53.tgz", + "integrity": "sha512-lQTr9UpeoGgX1B0SkjrvtL0zjgYVoJbm6RVv8ELG+efCG1oYAoIVgw2sahJI4zLqNiHcNeWqHUcu7NK06uc4mA==", "requires": { - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -66903,14 +66913,14 @@ } }, "@superset-ui/preset-chart-xy": { - "version": "0.17.52", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.52.tgz", - "integrity": "sha512-KsqwmUU9a5O6owKL950ynzbvDAY4XGT4H/ZqnBiS2QnhK/0YuucNhyoVjfg+l7dxqahNRXm0xj9OYyoPVH3O2Q==", + "version": "0.17.53", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.53.tgz", + "integrity": "sha512-nmqif4Zd7Tdx4hLoDiiRiNFUFn1kliumjp9RQK68eMaefWcl1vTMT7nPmyFvgUH5390HJygpC3up50+j5Bngkg==", "requires": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.17.52", - "@superset-ui/core": "0.17.52", + "@superset-ui/chart-controls": "0.17.53", + "@superset-ui/core": "0.17.53", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", @@ -92328,6 +92338,12 @@ "resize-observer-polyfill": "^1.5.1" } }, + "react-reverse-portal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-reverse-portal/-/react-reverse-portal-2.0.1.tgz", + "integrity": "sha512-sj/D9nSHspqV8i8hWkTSZ5Ohnrqk2A5fkDKw4Xe/zV4OfF1UYwmbzrxLdmNRdKkWgQwnXIxaa2E3FC7QYdZAeA==", + "requires": {} + }, "react-router": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", diff --git a/superset-frontend/package.json b/superset-frontend/package.json index db48f72f0a964..120644c2b81f0 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.52", - "@superset-ui/core": "^0.17.52", - "@superset-ui/legacy-plugin-chart-calendar": "^0.17.52", - "@superset-ui/legacy-plugin-chart-chord": "^0.17.52", - "@superset-ui/legacy-plugin-chart-country-map": "^0.17.52", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.52", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.52", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.52", - "@superset-ui/legacy-plugin-chart-histogram": "^0.17.52", - "@superset-ui/legacy-plugin-chart-horizon": "^0.17.52", - "@superset-ui/legacy-plugin-chart-map-box": "^0.17.52", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.52", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.52", - "@superset-ui/legacy-plugin-chart-partition": "^0.17.52", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.52", - "@superset-ui/legacy-plugin-chart-rose": "^0.17.52", - "@superset-ui/legacy-plugin-chart-sankey": "^0.17.52", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.52", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.52", - "@superset-ui/legacy-plugin-chart-treemap": "^0.17.52", - "@superset-ui/legacy-plugin-chart-world-map": "^0.17.52", - "@superset-ui/legacy-preset-chart-big-number": "^0.17.52", + "@superset-ui/chart-controls": "^0.17.53", + "@superset-ui/core": "^0.17.53", + "@superset-ui/legacy-plugin-chart-calendar": "^0.17.53", + "@superset-ui/legacy-plugin-chart-chord": "^0.17.53", + "@superset-ui/legacy-plugin-chart-country-map": "^0.17.53", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.53", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.53", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.53", + "@superset-ui/legacy-plugin-chart-histogram": "^0.17.53", + "@superset-ui/legacy-plugin-chart-horizon": "^0.17.53", + "@superset-ui/legacy-plugin-chart-map-box": "^0.17.53", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.53", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.53", + "@superset-ui/legacy-plugin-chart-partition": "^0.17.53", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.53", + "@superset-ui/legacy-plugin-chart-rose": "^0.17.53", + "@superset-ui/legacy-plugin-chart-sankey": "^0.17.53", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.53", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.53", + "@superset-ui/legacy-plugin-chart-treemap": "^0.17.53", + "@superset-ui/legacy-plugin-chart-world-map": "^0.17.53", + "@superset-ui/legacy-preset-chart-big-number": "^0.17.53", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.7", - "@superset-ui/legacy-preset-chart-nvd3": "^0.17.52", - "@superset-ui/plugin-chart-echarts": "^0.17.52", - "@superset-ui/plugin-chart-pivot-table": "^0.17.52", - "@superset-ui/plugin-chart-table": "^0.17.52", - "@superset-ui/plugin-chart-word-cloud": "^0.17.52", - "@superset-ui/preset-chart-xy": "^0.17.52", + "@superset-ui/legacy-preset-chart-nvd3": "^0.17.53", + "@superset-ui/plugin-chart-echarts": "^0.17.53", + "@superset-ui/plugin-chart-pivot-table": "^0.17.53", + "@superset-ui/plugin-chart-table": "^0.17.53", + "@superset-ui/plugin-chart-word-cloud": "^0.17.53", + "@superset-ui/preset-chart-xy": "^0.17.53", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.9.4", @@ -154,6 +154,7 @@ "react-markdown": "^4.3.1", "react-redux": "^7.2.0", "react-resize-detector": "^6.0.1-rc.1", + "react-reverse-portal": "^2.0.1", "react-router-dom": "^5.1.2", "react-search-input": "^0.11.3", "react-select": "^3.1.0", diff --git a/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx index 66eaf20fdbb43..20f63a6fcabd9 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/DashboardBuilder_spec.jsx @@ -50,16 +50,21 @@ jest.mock('src/dashboard/actions/dashboardState'); describe('DashboardBuilder', () => { let favStarStub; + let focusedTabStub; beforeAll(() => { // this is invoked on mount, so we stub it instead of making a request favStarStub = sinon .stub(dashboardStateActions, 'fetchFaveStar') .returns({ type: 'mock-action' }); + focusedTabStub = sinon + .stub(dashboardStateActions, 'setLastFocusedTab') + .returns({ type: 'mock-action' }); }); afterAll(() => { favStarStub.restore(); + focusedTabStub.restore(); }); function setup(overrideState = {}, overrideStore) { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx index efc1d8ca91aa5..2a1d0bc98b2bb 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/ChartHolder_spec.jsx @@ -36,6 +36,7 @@ import { sliceId } from 'spec/fixtures/mockChartQueries'; import dashboardInfo from 'spec/fixtures/mockDashboardInfo'; import { dashboardLayout as mockLayout } from 'spec/fixtures/mockDashboardLayout'; import { sliceEntitiesForChart } from 'spec/fixtures/mockSliceEntities'; +import { nativeFiltersInfo } from '../../fixtures/mockNativeFilters'; describe('ChartHolder', () => { const props = { @@ -55,6 +56,7 @@ describe('ChartHolder', () => { handleComponentDrop() {}, updateComponents() {}, deleteComponent() {}, + nativeFilters: nativeFiltersInfo.filters, }; function setup(overrideProps) { diff --git a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx index 4b2dbd9a5316e..2f15359c7f192 100644 --- a/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx +++ b/superset-frontend/spec/javascripts/dashboard/components/gridComponents/Tabs_spec.jsx @@ -33,8 +33,10 @@ import HoverMenu from 'src/dashboard/components/menu/HoverMenu'; import DragDroppable from 'src/dashboard/components/dnd/DragDroppable'; import Tabs from 'src/dashboard/components/gridComponents/Tabs'; import { DASHBOARD_ROOT_ID } from 'src/dashboard/util/constants'; +import emptyDashboardLayout from 'src/dashboard/fixtures/emptyDashboardLayout'; import { dashboardLayoutWithTabs } from 'spec/fixtures/mockDashboardLayout'; import { mockStoreWithTabs } from 'spec/fixtures/mockStore'; +import { nativeFilters } from 'spec/fixtures/mockNativeFilters'; describe('Tabs', () => { fetchMock.post('glob:*/r/shortner/', {}); @@ -59,6 +61,8 @@ describe('Tabs', () => { deleteComponent() {}, updateComponents() {}, logEvent() {}, + dashboardLayout: emptyDashboardLayout, + nativeFilters: nativeFilters.filters, }; function setup(overrideProps) { diff --git a/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx b/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx index a9e1454b0e4fa..2ab5ea296bd59 100644 --- a/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx +++ b/superset-frontend/spec/javascripts/datasource/DatasourceEditor_spec.jsx @@ -86,6 +86,7 @@ describe('DatasourceEditor', () => { nullable: true, default: '', primary_key: false, + is_dttm: true, }, { name: 'gender', @@ -93,6 +94,7 @@ describe('DatasourceEditor', () => { nullable: true, default: '', primary_key: false, + is_dttm: false, }, { name: 'new_column', @@ -100,6 +102,7 @@ describe('DatasourceEditor', () => { nullable: true, default: '', primary_key: false, + is_dttm: false, }, ]; diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index bdd0e29209366..4ff6f3dc6537c 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -540,7 +540,7 @@ export default class ResultSet extends React.PureComponent< let limitMessage; const limitReached = results?.displayLimitReached; const limit = queryLimit || results.query.limit; - const isAdmin = !!this.props.user?.roles.Admin; + const isAdmin = !!this.props.user?.roles?.Admin; const displayMaxRowsReachedMessage = { withAdmin: t( `The number of results displayed is limited to %(rows)d by the configuration DISPLAY_MAX_ROWS. `, diff --git a/superset-frontend/src/dashboard/actions/dashboardState.js b/superset-frontend/src/dashboard/actions/dashboardState.js index ac2ead0d74330..d0b39e2ff14d7 100644 --- a/superset-frontend/src/dashboard/actions/dashboardState.js +++ b/superset-frontend/src/dashboard/actions/dashboardState.js @@ -344,6 +344,11 @@ export function setDirectPathToChild(path) { return { type: SET_DIRECT_PATH, path }; } +export const SET_LAST_FOCUSED_TAB = 'SET_LAST_FOCUSED_TAB'; +export function setLastFocusedTab(tabId) { + return { type: SET_LAST_FOCUSED_TAB, tabId }; +} + export const SET_FOCUSED_FILTER_FIELD = 'SET_FOCUSED_FILTER_FIELD'; export function setFocusedFilterField(chartId, column) { return { type: SET_FOCUSED_FILTER_FIELD, chartId, column }; diff --git a/superset-frontend/src/dashboard/actions/hydrate.js b/superset-frontend/src/dashboard/actions/hydrate.js index d86ae8c78e8b3..62751033ad672 100644 --- a/superset-frontend/src/dashboard/actions/hydrate.js +++ b/superset-frontend/src/dashboard/actions/hydrate.js @@ -377,6 +377,7 @@ export const hydrateDashboard = (dashboardData, chartData, datasourcesData) => ( hasUnsavedChanges: false, maxUndoHistoryExceeded: false, lastModifiedTime: dashboardData.changed_on, + lastFocusedTabId: null, }, dashboardLayout, }, diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardContainer.tsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardContainer.tsx index 9c58d853e4c1f..00c5d73ae5b71 100644 --- a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardContainer.tsx +++ b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardContainer.tsx @@ -21,7 +21,7 @@ import { ParentSize } from '@vx/responsive'; import Tabs from 'src/components/Tabs'; import React, { FC, useEffect, useState } from 'react'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import DashboardGrid from 'src/dashboard/containers/DashboardGrid'; import getLeafComponentIdFromPath from 'src/dashboard/util/getLeafComponentIdFromPath'; import { DashboardLayout, LayoutItem, RootState } from 'src/dashboard/types'; @@ -30,6 +30,10 @@ import { DASHBOARD_ROOT_DEPTH, } from 'src/dashboard/util/constants'; import { getRootLevelTabIndex } from './utils'; +import { Filters } from '../../reducers/types'; +import { getChartIdsInFilterScope } from '../../util/activeDashboardFilters'; +import { findTabsWithChartsInScope } from '../nativeFilters/utils'; +import { setFilterConfiguration } from '../../actions/nativeFilters'; type DashboardContainerProps = { topLevelTabs?: LayoutItem; @@ -39,6 +43,9 @@ const DashboardContainer: FC = ({ topLevelTabs }) => { const dashboardLayout = useSelector( state => state.dashboardLayout.present, ); + const nativeFilters = useSelector( + state => state.nativeFilters.filters, + ); const directPathToChild = useSelector( state => state.dashboardState.directPathToChild, ); @@ -46,10 +53,37 @@ const DashboardContainer: FC = ({ topLevelTabs }) => { getRootLevelTabIndex(dashboardLayout, directPathToChild), ); + const dispatch = useDispatch(); + useEffect(() => { setTabIndex(getRootLevelTabIndex(dashboardLayout, directPathToChild)); }, [getLeafComponentIdFromPath(directPathToChild)]); + // recalculate charts and tabs in scopes of native filters only when a scope or dashboard layout changes + const nativeFiltersValues = Object.values(nativeFilters); + const scopes = nativeFiltersValues.map(filter => filter.scope); + useEffect(() => { + nativeFiltersValues.forEach(filter => { + const filterScope = filter.scope; + const chartsInScope = getChartIdsInFilterScope({ + filterScope: { + scope: filterScope.rootPath, + // @ts-ignore + immune: filterScope.excluded, + }, + }); + const tabsInScope = findTabsWithChartsInScope( + dashboardLayout, + chartsInScope, + ); + Object.assign(filter, { + chartsInScope, + tabsInScope: Array.from(tabsInScope), + }); + }); + dispatch(setFilterConfiguration(nativeFiltersValues)); + }, [JSON.stringify(scopes), JSON.stringify(dashboardLayout)]); + const childIds: string[] = topLevelTabs ? topLevelTabs.children : [DASHBOARD_GRID_ID]; diff --git a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx index f4868d0e6a08e..102acae84aa02 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx @@ -85,37 +85,46 @@ const defaultProps = { * If ChartHolder were a function component, this could be implemented as a hook instead. */ const FilterFocusHighlight = React.forwardRef( - ({ chartId, focusedFilterScope, ...otherProps }, ref) => { + ({ chartId, focusedFilterScope, nativeFilters, ...otherProps }, ref) => { const theme = useTheme(); - if (!focusedFilterScope) return
; + const focusedNativeFilterId = nativeFilters.focusedFilterId; + if (!(focusedFilterScope || focusedNativeFilterId)) + return
; // we use local styles here instead of a conditionally-applied class, // because adding any conditional class to this container // causes performance issues in Chrome. // default to the "de-emphasized" state - let styles = { opacity: 0.3, pointerEvents: 'none' }; + const unfocusedChartStyles = { opacity: 0.3, pointerEvents: 'none' }; + const focusedChartStyles = { + borderColor: theme.colors.primary.light2, + opacity: 1, + boxShadow: `0px 0px ${theme.gridUnit * 2}px ${ + theme.colors.primary.light2 + }`, + pointerEvents: 'auto', + }; - if ( + if (focusedNativeFilterId) { + if ( + nativeFilters.filters[focusedNativeFilterId].chartsInScope.includes( + chartId, + ) + ) { + return
; + } + } else if ( chartId === focusedFilterScope.chartId || getChartIdsInFilterScope({ filterScope: focusedFilterScope.scope, }).includes(chartId) ) { - // apply the "highlighted" state if this chart - // contains a filter being focused, or is in scope of a focused filter. - styles = { - borderColor: theme.colors.primary.light2, - opacity: 1, - boxShadow: `0px 0px ${theme.gridUnit * 2}px ${ - theme.colors.primary.light2 - }`, - pointerEvents: 'auto', - }; + return
; } // inline styles are used here due to a performance issue when adding/changing a class, which causes a reflow - return
; + return
; }, ); @@ -233,6 +242,7 @@ class ChartHolder extends React.Component { isComponentVisible, dashboardId, focusedFilterScope, + nativeFilters, } = this.props; // inherit the size of parent columns @@ -291,6 +301,7 @@ class ChartHolder extends React.Component { { editMode: false, isComponentVisible: true, dashboardId: 123, + nativeFilters: nativeFiltersInfo.filters, }; const renderWrapper = (props = defaultProps, state = mockState) => diff --git a/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx b/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx index bdf60f8f42368..c41abf83a4b08 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Tabs.jsx @@ -31,40 +31,13 @@ import findTabIndexByComponentId from '../../util/findTabIndexByComponentId'; import getDirectPathToTabIndex from '../../util/getDirectPathToTabIndex'; import getLeafComponentIdFromPath from '../../util/getLeafComponentIdFromPath'; import { componentShape } from '../../util/propShapes'; -import { NEW_TAB_ID, DASHBOARD_ROOT_ID } from '../../util/constants'; +import { + NEW_TAB_ID, + DASHBOARD_ROOT_ID, + DASHBOARD_GRID_ID, +} from '../../util/constants'; import { RENDER_TAB, RENDER_TAB_CONTENT } from './Tab'; -import { CHART_TYPE, TAB_TYPE } from '../../util/componentTypes'; -import { getChartIdsInFilterScope } from '../../util/activeDashboardFilters'; - -const findTabsWithChartsInScope = ( - dashboardLayout, - chartsInScope, - childId, - tabId, - tabsToHighlight, -) => { - if ( - dashboardLayout[childId].type === CHART_TYPE && - chartsInScope.includes(dashboardLayout[childId].meta.chartId) - ) { - tabsToHighlight.add(tabId); - } - if ( - dashboardLayout[childId].children.length === 0 || - (dashboardLayout[childId].type === TAB_TYPE && tabsToHighlight.has(childId)) - ) { - return; - } - dashboardLayout[childId].children.forEach(subChildId => - findTabsWithChartsInScope( - dashboardLayout, - chartsInScope, - subChildId, - tabId, - tabsToHighlight, - ), - ); -}; +import { TAB_TYPE } from '../../util/componentTypes'; const propTypes = { id: PropTypes.string.isRequired, @@ -299,29 +272,27 @@ class Tabs extends React.PureComponent { renderHoverMenu, isComponentVisible: isCurrentTabVisible, editMode, - focusedFilterScope, + nativeFilters, dashboardLayout, + lastFocusedTabId, + setLastFocusedTab, } = this.props; const { children: tabIds } = tabsComponent; const { tabIndex: selectedTabIndex, activeKey } = this.state; - const tabsToHighlight = new Set(); - if (focusedFilterScope) { - const chartsInScope = getChartIdsInFilterScope({ - filterScope: focusedFilterScope.scope, - }); - tabIds.forEach(tabId => { - if (!tabsToHighlight.has(tabId)) { - findTabsWithChartsInScope( - dashboardLayout, - chartsInScope, - tabId, - tabId, - tabsToHighlight, - ); - } - }); + // On dashboards with top level tabs, set initial focus to the active top level tab + const dashboardRoot = dashboardLayout[DASHBOARD_ROOT_ID]; + const rootChildId = dashboardRoot.children[0]; + const isTopLevelTabs = rootChildId !== DASHBOARD_GRID_ID; + if (isTopLevelTabs && !lastFocusedTabId) { + setLastFocusedTab(activeKey); + } + + let tabsToHighlight; + if (nativeFilters.focusedFilterId) { + tabsToHighlight = + nativeFilters.filters[nativeFilters.focusedFilterId].tabsInScope; } return ( {tabIds.map((tabId, tabIndex) => ( } diff --git a/superset-frontend/src/dashboard/components/gridComponents/Tabs.test.tsx b/superset-frontend/src/dashboard/components/gridComponents/Tabs.test.tsx index f35dcd4df10b3..49ec405f25bdf 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Tabs.test.tsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Tabs.test.tsx @@ -20,11 +20,12 @@ import userEvent from '@testing-library/user-event'; import React from 'react'; import { render, screen, waitFor } from 'spec/helpers/testing-library'; +import { nativeFiltersInfo } from 'spec/javascripts/dashboard/fixtures/mockNativeFilters'; import DashboardComponent from 'src/dashboard/containers/DashboardComponent'; import DragDroppable from 'src/dashboard/components/dnd/DragDroppable'; import DeleteComponentButton from 'src/dashboard/components/DeleteComponentButton'; import getLeafComponentIdFromPath from 'src/dashboard/util/getLeafComponentIdFromPath'; - +import emptyDashboardLayout from 'src/dashboard/fixtures/emptyDashboardLayout'; import Tabs from './Tabs'; jest.mock('src/dashboard/containers/DashboardComponent', () => @@ -110,6 +111,8 @@ const createProps = () => ({ onChangeTab: jest.fn(), deleteComponent: jest.fn(), updateComponents: jest.fn(), + dashboardLayout: emptyDashboardLayout, + nativeFilters: nativeFiltersInfo.filters, }); beforeEach(() => { diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadeFilterControl/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadeFilterControl/index.tsx index 1ac1fb3a5f5a2..91908823badb2 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadeFilterControl/index.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadeFilterControl/index.tsx @@ -22,8 +22,10 @@ import Icon from 'src/components/Icon'; import FilterControl from 'src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl'; import { CascadeFilter } from 'src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/types'; import { Filter } from 'src/dashboard/components/nativeFilters/types'; +import { DataMaskStateWithId } from 'src/dataMask/types'; export interface CascadeFilterControlProps { + dataMaskSelected?: DataMaskStateWithId; filter: CascadeFilter; directPathToChild?: string[]; onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void; @@ -45,6 +47,7 @@ const StyledCaretIcon = styled(Icon)` `; const CascadeFilterControl: React.FC = ({ + dataMaskSelected, filter, directPathToChild, onFilterSelectionChange, @@ -53,6 +56,7 @@ const CascadeFilterControl: React.FC = ({ = ({ {filter.cascadeChildren?.map(childFilter => (
  • = ({ + dataMaskSelected, filter, visible, onVisibleChange, @@ -83,9 +82,7 @@ const CascadePopover: React.FC = ({ directPathToChild, }) => { const [currentPathToChild, setCurrentPathToChild] = useState(); - const dataMask = useSelector( - state => state.dataMask[filter.id] ?? getInitialDataMask(filter.id), - ); + const dataMask = dataMaskSelected[filter.id]; useEffect(() => { setCurrentPathToChild(directPathToChild); @@ -98,7 +95,7 @@ const CascadePopover: React.FC = ({ const getActiveChildren = useCallback( (filter: CascadeFilter): CascadeFilter[] | null => { const children = filter.cascadeChildren || []; - const currentValue = dataMask.filterState?.value; + const currentValue = dataMask?.filterState?.value; const activeChildren = children.flatMap( childFilter => getActiveChildren(childFilter) || [], @@ -147,6 +144,7 @@ const CascadePopover: React.FC = ({ if (!filter.cascadeChildren?.length) { return ( = ({ const content = ( = ({
    {activeFilters.map(activeFilter => ( = ({ + dataMaskSelected, filter, icon, onFilterSelectionChange, @@ -57,6 +58,7 @@ const FilterControl: React.FC = ({
    {icon}
    theme.gridUnit * 4}px; @@ -33,7 +41,7 @@ const Wrapper = styled.div` type FilterControlsProps = { directPathToChild?: string[]; - dataMaskSelected: DataMaskState; + dataMaskSelected: DataMaskStateWithId; onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void; }; @@ -44,7 +52,18 @@ const FilterControls: FC = ({ }) => { const [visiblePopoverId, setVisiblePopoverId] = useState(null); const filters = useFilters(); + const dashboardLayout = useDashboardLayout(); + const lastFocusedTabId = useSelector( + state => state.dashboardState?.lastFocusedTabId, + ); const filterValues = Object.values(filters); + const portalNodes = React.useMemo(() => { + const nodes = new Array(filterValues.length); + for (let i = 0; i < filterValues.length; i += 1) { + nodes[i] = portals.createHtmlPortalNode(); + } + return nodes; + }, [filterValues.length]); const cascadeFilters = useMemo(() => { const filtersWithValue = filterValues.map(filter => ({ @@ -53,22 +72,91 @@ const FilterControls: FC = ({ })); return buildCascadeFiltersTree(filtersWithValue); }, [filterValues, dataMaskSelected]); + const cascadeFilterIds = new Set(cascadeFilters.map(item => item.id)); + + let filtersInScope: CascadeFilter[] = []; + const filtersOutOfScope: CascadeFilter[] = []; + const dashboardHasTabs = Object.values(dashboardLayout).some( + element => element.type === TAB_TYPE, + ); + const showCollapsePanel = dashboardHasTabs && cascadeFilters.length > 0; + if (!lastFocusedTabId || !dashboardHasTabs) { + filtersInScope = cascadeFilters; + } else { + cascadeFilters.forEach((filter, index) => { + if (cascadeFilters[index].tabsInScope?.includes(lastFocusedTabId)) { + filtersInScope.push(filter); + } else { + filtersOutOfScope.push(filter); + } + }); + } return ( - {cascadeFilters.map(filter => ( - - setVisiblePopoverId(visible ? filter.id : null) - } - filter={filter} - onFilterSelectionChange={onFilterSelectionChange} - directPathToChild={directPathToChild} - /> - ))} + {portalNodes + .filter((node, index) => cascadeFilterIds.has(filterValues[index].id)) + .map((node, index) => ( + + + setVisiblePopoverId(visible ? cascadeFilters[index].id : null) + } + filter={cascadeFilters[index]} + onFilterSelectionChange={onFilterSelectionChange} + directPathToChild={directPathToChild} + /> + + ))} + {filtersInScope.map(filter => { + const index = filterValues.findIndex(f => f.id === filter.id); + return ; + })} + {showCollapsePanel && ( + css` + &.ant-collapse { + margin-top: ${filtersInScope.length > 0 + ? theme.gridUnit * 6 + : 0}px; + & > .ant-collapse-item { + & > .ant-collapse-header { + padding-left: 0; + padding-bottom: ${theme.gridUnit * 2}px; + + & > .ant-collapse-arrow { + right: ${theme.gridUnit}px; + } + } + + & .ant-collapse-content-box { + padding: ${theme.gridUnit * 4}px 0 0; + } + } + } + `} + > + + {filtersOutOfScope.map(filter => { + const index = cascadeFilters.findIndex(f => f.id === filter.id); + return ; + })} + + + )} ); }; 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 d6e146b8bb362..495f50f437bf4 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx @@ -53,13 +53,14 @@ const FilterItem = styled.div` `; const FilterValue: React.FC = ({ + dataMaskSelected, filter, directPathToChild, onFilterSelectionChange, }) => { const { id, targets, filterType, adhoc_filters, time_range } = filter; const metadata = getChartMetadataRegistry().get(filterType); - const cascadingFilters = useCascadingFilters(id); + const cascadingFilters = useCascadingFilters(id, dataMaskSelected); const [state, setState] = useState([]); const [error, setError] = useState(''); const [formData, setFormData] = useState>({}); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts index 7be5835780895..1aaf772722c16 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts @@ -18,22 +18,27 @@ */ import { useSelector } from 'react-redux'; import { NativeFiltersState } from 'src/dashboard/reducers/types'; +import { DataMaskStateWithId } from 'src/dataMask/types'; +import { ExtraFormData } from '@superset-ui/core'; import { mergeExtraFormData } from '../../utils'; -import { useNativeFiltersDataMask } from '../state'; // eslint-disable-next-line import/prefer-default-export -export function useCascadingFilters(id: string) { +export function useCascadingFilters( + id: string, + dataMaskSelected?: DataMaskStateWithId, +): ExtraFormData { const { filters } = useSelector( state => state.nativeFilters, ); const filter = filters[id]; const cascadeParentIds: string[] = filter?.cascadeParentIds ?? []; let cascadedFilters = {}; - const nativeFiltersDataMask = useNativeFiltersDataMask(); cascadeParentIds.forEach(parentId => { - const parentState = nativeFiltersDataMask[parentId] || {}; - const { extraFormData: parentExtra = {} } = parentState; - cascadedFilters = mergeExtraFormData(cascadedFilters, parentExtra); + const parentState = dataMaskSelected?.[parentId]; + cascadedFilters = mergeExtraFormData( + cascadedFilters, + parentState?.extraFormData, + ); }); return cascadedFilters; } diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts index 0b39dd210be5e..93bf76d8c2946 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts @@ -18,9 +18,11 @@ */ import React from 'react'; import { DataMask } from '@superset-ui/core'; +import { DataMaskStateWithId } from 'src/dataMask/types'; import { Filter } from '../../types'; export interface FilterProps { + dataMaskSelected?: DataMaskStateWithId; filter: Filter & { dataMask?: DataMask; }; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx index 50c16e95018f5..44a4f82aed723 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx @@ -19,7 +19,7 @@ /* eslint-disable no-param-reassign */ import { HandlerFunction, styled, t } from '@superset-ui/core'; -import React, { useEffect, useMemo, useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; import cx from 'classnames'; import Icon from 'src/components/Icon'; @@ -37,11 +37,7 @@ import { testWithId } from 'src/utils/testUtils'; import { Filter } from 'src/dashboard/components/nativeFilters/types'; import Loading from 'src/components/Loading'; import { getInitialDataMask } from 'src/dataMask/reducer'; -import { - getOnlyExtraFormData, - mapParentFiltersToChildren, - TabIds, -} from './utils'; +import { getOnlyExtraFormData, TabIds } from './utils'; import FilterSets from './FilterSets'; import { useNativeFiltersDataMask, @@ -175,10 +171,6 @@ const FilterBar: React.FC = ({ const filterValues = Object.values(filters); const dataMaskApplied: DataMaskStateWithId = useNativeFiltersDataMask(); const [isFilterSetChanged, setIsFilterSetChanged] = useState(false); - const cascadeChildren = useMemo( - () => mapParentFiltersToChildren(filterValues), - [filterValues], - ); useEffect(() => { setDataMaskSelected(() => dataMaskApplied); @@ -190,15 +182,6 @@ const FilterBar: React.FC = ({ ) => { setIsFilterSetChanged(tab !== TabIds.AllFilters); setDataMaskSelected(draft => { - const children = cascadeChildren[filter.id] || []; - // force instant updating on initialization or for parent filters when dataMaskSelected has filter - if ( - dataMaskSelected[filter.id] && - (filter.isInstant || children.length > 0) - ) { - dispatch(updateDataMask(filter.id, dataMask)); - } - draft[filter.id] = { ...(getInitialDataMask(filter.id) as DataMaskWithId), ...dataMask, diff --git a/superset-frontend/src/dashboard/components/nativeFilters/state.ts b/superset-frontend/src/dashboard/components/nativeFilters/state.ts index 83003d67c9e16..027bf2ac968c4 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/state.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/state.ts @@ -19,6 +19,7 @@ import { useSelector } from 'react-redux'; import { useMemo } from 'react'; import { Filter, FilterConfiguration } from './types'; +import { DashboardLayout } from '../../types'; const defaultFilterConfiguration: Filter[] = []; @@ -45,3 +46,9 @@ export function useFilterConfigMap() { [filterConfig], ); } + +export function useDashboardLayout() { + return useSelector( + state => state.dashboardLayout?.present, + ); +} diff --git a/superset-frontend/src/dashboard/components/nativeFilters/types.ts b/superset-frontend/src/dashboard/components/nativeFilters/types.ts index 07e347c437b82..ac772dcd73491 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/types.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/types.ts @@ -56,6 +56,8 @@ export interface Filter { sortMetric?: string | null; adhoc_filters?: AdhocFilter[]; time_range?: string; + tabsInScope?: string[]; + chartsInScope?: number[]; } export type FilterConfiguration = Filter[]; diff --git a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts index d85684ca091ad..24264cb4e725e 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts +++ b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts @@ -26,12 +26,14 @@ import { AdhocFilter, FeatureFlag, } from '@superset-ui/core'; -import { Charts } from 'src/dashboard/types'; +import { Charts, DashboardLayout } from 'src/dashboard/types'; import { RefObject } from 'react'; import { DataMaskStateWithId } from 'src/dataMask/types'; import extractUrlParams from 'src/dashboard/util/extractUrlParams'; import { isFeatureEnabled } from 'src/featureFlags'; import { Filter } from './types'; +import { CHART_TYPE, TAB_TYPE } from '../../util/componentTypes'; +import { DASHBOARD_GRID_ID, DASHBOARD_ROOT_ID } from '../../util/constants'; export const getFormData = ({ datasetId, @@ -142,3 +144,73 @@ export function nativeFilterGate(behaviors: Behavior[]): boolean { behaviors.includes(Behavior.INTERACTIVE_CHART)) ); } + +const isComponentATab = ( + dashboardLayout: DashboardLayout, + componentId: string, +) => dashboardLayout[componentId].type === TAB_TYPE; + +const findTabsWithChartsInScopeHelper = ( + dashboardLayout: DashboardLayout, + chartsInScope: number[], + componentId: string, + tabIds: string[], + tabsToHighlight: Set, +) => { + if ( + dashboardLayout[componentId].type === CHART_TYPE && + chartsInScope.includes(dashboardLayout[componentId].meta.chartId) + ) { + tabIds.forEach(tabsToHighlight.add, tabsToHighlight); + } + if ( + dashboardLayout[componentId].children.length === 0 || + (isComponentATab(dashboardLayout, componentId) && + tabsToHighlight.has(componentId)) + ) { + return; + } + dashboardLayout[componentId].children.forEach(childId => + findTabsWithChartsInScopeHelper( + dashboardLayout, + chartsInScope, + childId, + isComponentATab(dashboardLayout, childId) ? [...tabIds, childId] : tabIds, + tabsToHighlight, + ), + ); +}; + +export const findTabsWithChartsInScope = ( + dashboardLayout: DashboardLayout, + chartsInScope: number[], +) => { + const dashboardRoot = dashboardLayout[DASHBOARD_ROOT_ID]; + const rootChildId = dashboardRoot.children[0]; + const hasTopLevelTabs = rootChildId !== DASHBOARD_GRID_ID; + const tabsInScope = new Set(); + if (hasTopLevelTabs) { + dashboardLayout[rootChildId].children?.forEach(tabId => + findTabsWithChartsInScopeHelper( + dashboardLayout, + chartsInScope, + tabId, + [tabId], + tabsInScope, + ), + ); + } else { + Object.values(dashboardLayout) + .filter(element => element.type === TAB_TYPE) + .forEach(element => + findTabsWithChartsInScopeHelper( + dashboardLayout, + chartsInScope, + element.id, + [element.id], + tabsInScope, + ), + ); + } + return tabsInScope; +}; diff --git a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx index 42f408cd0d9ce..387e67c926298 100644 --- a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx +++ b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx @@ -35,7 +35,10 @@ import { updateComponents, handleComponentDrop, } from '../actions/dashboardLayout'; -import { setDirectPathToChild } from '../actions/dashboardState'; +import { + setDirectPathToChild, + setLastFocusedTab, +} from '../actions/dashboardState'; const propTypes = { id: PropTypes.string, @@ -79,19 +82,6 @@ function selectFocusedFilterScope(dashboardState, dashboardFilters) { }; } -function selectFocusedNativeFilterScope(nativeFilters) { - if (!nativeFilters.focusedFilterId) return null; - const id = nativeFilters.focusedFilterId; - const focusedFilterScope = nativeFilters.filters[id].scope; - return { - chartId: id, - scope: { - scope: focusedFilterScope.rootPath, - immune: focusedFilterScope.excluded, - }, - }; -} - function mapStateToProps( { dashboardLayout: undoableLayout, @@ -114,11 +104,14 @@ function mapStateToProps( redoLength: undoableLayout.future.length, filters: getActiveFilters(), directPathToChild: dashboardState.directPathToChild, + lastFocusedTabId: dashboardState.lastFocusedTabId, directPathLastUpdated: dashboardState.directPathLastUpdated, dashboardId: dashboardInfo.id, - focusedFilterScope: - selectFocusedFilterScope(dashboardState, dashboardFilters) || - selectFocusedNativeFilterScope(nativeFilters), + nativeFilters, + focusedFilterScope: selectFocusedFilterScope( + dashboardState, + dashboardFilters, + ), }; // rows and columns need more data about their child dimensions @@ -148,6 +141,7 @@ function mapDispatchToProps(dispatch) { updateComponents, handleComponentDrop, setDirectPathToChild, + setLastFocusedTab, logEvent, }, dispatch, diff --git a/superset-frontend/src/dashboard/reducers/dashboardState.js b/superset-frontend/src/dashboard/reducers/dashboardState.js index 6f162084708f4..842916e1cc31e 100644 --- a/superset-frontend/src/dashboard/reducers/dashboardState.js +++ b/superset-frontend/src/dashboard/reducers/dashboardState.js @@ -35,6 +35,7 @@ import { SET_DIRECT_PATH, SET_FOCUSED_FILTER_FIELD, UNSET_FOCUSED_FILTER_FIELD, + SET_LAST_FOCUSED_TAB, } from '../actions/dashboardState'; import { HYDRATE_DASHBOARD } from '../actions/hydrate'; @@ -133,6 +134,12 @@ export default function dashboardStateReducer(state = {}, action) { directPathLastUpdated: Date.now(), }; }, + [SET_LAST_FOCUSED_TAB]() { + return { + ...state, + lastFocusedTabId: action.tabId, + }; + }, [SET_FOCUSED_FILTER_FIELD]() { return { ...state, diff --git a/superset-frontend/src/dashboard/types.ts b/superset-frontend/src/dashboard/types.ts index a37cc0f938702..9a15b1da7ef03 100644 --- a/superset-frontend/src/dashboard/types.ts +++ b/superset-frontend/src/dashboard/types.ts @@ -43,7 +43,11 @@ export type Chart = ChartState & { export type DashboardLayout = { [key: string]: LayoutItem }; export type DashboardLayoutState = { present: DashboardLayout }; -export type DashboardState = { editMode: boolean; directPathToChild: string[] }; +export type DashboardState = { + editMode: boolean; + directPathToChild: string[]; + lastFocusedTabId: string | null; +}; export type DashboardInfo = { common: { flash_messages: string[]; diff --git a/superset-frontend/src/datasource/DatasourceEditor.jsx b/superset-frontend/src/datasource/DatasourceEditor.jsx index 8cf17e550a1ab..94d3cd976769f 100644 --- a/superset-frontend/src/datasource/DatasourceEditor.jsx +++ b/superset-frontend/src/datasource/DatasourceEditor.jsx @@ -379,6 +379,7 @@ class DatasourceEditor extends React.PureComponent { } setColumns(obj) { + // update calculatedColumns or databaseColumns this.setState(obj, this.validateAndChange); } @@ -414,13 +415,18 @@ class DatasourceEditor extends React.PureComponent { type: col.type, groupby: true, filterable: true, + is_dttm: col.is_dttm, }); results.added.push(col.name); - } else if (currentCol.type !== col.type) { + } else if ( + currentCol.type !== col.type || + currentCol.is_dttm !== col.is_dttm + ) { // modified column finalColumns.push({ ...currentCol, type: col.type, + is_dttm: col.is_dttm, }); results.modified.push(col.name); } else { diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx index 16f25dea84d47..ee8367b87cb94 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx @@ -162,6 +162,9 @@ function dbReducer( }; case ActionType.fetched: case ActionType.dbSelected: + return { + ...action.payload, + }; case ActionType.configMethodChange: return { ...action.payload, diff --git a/superset/config.py b/superset/config.py index 2bbb249a8751d..a6427b528d775 100644 --- a/superset/config.py +++ b/superset/config.py @@ -383,6 +383,9 @@ def _try_json_readsha( # pylint: disable=unused-argument # for report with type 'report' still send with email and slack message with # screenshot and link "ALERTS_ATTACH_REPORTS": True, + # Enabling FORCE_DATABASE_CONNECTIONS_SSL forces all database connections to be + # encrypted before being saved into superset metastore. + "FORCE_DATABASE_CONNECTIONS_SSL": False, } # Feature flags may also be set via 'SUPERSET_FEATURE_' prefixed environment vars. diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 19bd3bbc1bb04..0842b0e57e2d9 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -679,13 +679,25 @@ def external_metadata(self) -> List[Dict[str, str]]: for col in cols: try: if isinstance(col["type"], TypeEngine): - col["type"] = db_engine_spec.column_datatype_to_string( + db_type = db_engine_spec.column_datatype_to_string( col["type"], db_dialect ) + type_spec = db_engine_spec.get_column_spec(db_type) + col.update( + { + "type": db_type, + "type_generic": type_spec.generic_type + if type_spec + else None, + "is_dttm": type_spec.is_dttm if type_spec else None, + } + ) # Broad exception catch, because there are multiple possible exceptions # from different drivers that fall outside CompileError except Exception: # pylint: disable=broad-except - col["type"] = "UNKNOWN" + col.update( + {"type": "UNKNOWN", "generic_type": None, "is_dttm": None,} + ) return cols @property diff --git a/superset/databases/schemas.py b/superset/databases/schemas.py index 832bd480251b8..a6690aafea613 100644 --- a/superset/databases/schemas.py +++ b/superset/databases/schemas.py @@ -318,7 +318,7 @@ class DatabaseValidateParametersSchema(Schema): class Meta: # pylint: disable=too-few-public-methods unknown = EXCLUDE - engine = fields.String(allow_none=True, description="SQLAlchemy engine to use") + engine = fields.String(required=True, description="SQLAlchemy engine to use") parameters = fields.Dict( keys=fields.String(), values=fields.Raw(allow_none=True),