This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push:
new f90824f [Dashboard] new listview filters & emotion infra (#9462)
f90824f is described below
commit f90824fa178c2164d954a8f29a12309c7a06327e
Author: ʈᵃᵢ <[email protected]>
AuthorDate: Mon Apr 13 13:39:55 2020 -0700
[Dashboard] new listview filters & emotion infra (#9462)
* [Dashboard] listview filters to match new design
* use title_or_slug filter
* use ?. operator
* move components to components folder
---
superset-frontend/jest.config.js | 5 +-
superset-frontend/package-lock.json | 627 ++++++++++++++++-----
superset-frontend/package.json | 11 +-
.../components/ListView/ListView_spec.jsx | 253 ++++++---
.../src/components/ListView/Filters.tsx | 168 ++++++
.../src/components/ListView/LegacyFilters.tsx | 199 +++++++
.../src/components/ListView/ListView.tsx | 219 ++-----
superset-frontend/src/components/ListView/types.ts | 10 +-
superset-frontend/src/components/ListView/utils.ts | 88 ++-
.../components/SearchInput.tsx} | 39 +-
.../components/StyledSelect.tsx} | 58 +-
superset-frontend/src/featureFlags.ts | 1 +
.../src/types/react-table-config.d.ts | 1 -
.../src/views/dashboardList/DashboardList.tsx | 41 +-
superset-frontend/src/welcome/App.jsx | 43 +-
.../styled-components/superset-theme.ts} | 48 +-
superset-frontend/webpack.config.js | 2 +
superset/config.py | 1 +
18 files changed, 1302 insertions(+), 512 deletions(-)
diff --git a/superset-frontend/jest.config.js b/superset-frontend/jest.config.js
index 8a3c08a..44f460d 100644
--- a/superset-frontend/jest.config.js
+++ b/superset-frontend/jest.config.js
@@ -34,13 +34,10 @@ module.exports = {
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
globals: {
'ts-jest': {
+ babelConfig: true,
diagnostics: {
warnOnly: true,
},
- tsConfig: {
- jsx: 'react',
- esModuleInterop: true,
- },
},
},
};
diff --git a/superset-frontend/package-lock.json
b/superset-frontend/package-lock.json
index e2c73d9..077a3a5 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -5360,6 +5360,145 @@
"prop-types": "^15.6.0"
}
},
+ "@emotion/cache": {
+ "version": "10.0.29",
+ "resolved":
"https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz",
+ "integrity":
"sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==",
+ "requires": {
+ "@emotion/sheet": "0.9.4",
+ "@emotion/stylis": "0.8.5",
+ "@emotion/utils": "0.11.3",
+ "@emotion/weak-memoize": "0.2.5"
+ }
+ },
+ "@emotion/core": {
+ "version": "10.0.28",
+ "resolved":
"https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz",
+ "integrity":
"sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "@emotion/cache": "^10.0.27",
+ "@emotion/css": "^10.0.27",
+ "@emotion/serialize": "^0.11.15",
+ "@emotion/sheet": "0.9.4",
+ "@emotion/utils": "0.11.3"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.9.2",
+ "resolved":
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
+ "integrity":
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved":
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity":
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+ }
+ }
+ },
+ "@emotion/css": {
+ "version": "10.0.27",
+ "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz",
+ "integrity":
"sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==",
+ "requires": {
+ "@emotion/serialize": "^0.11.15",
+ "@emotion/utils": "0.11.3",
+ "babel-plugin-emotion": "^10.0.27"
+ }
+ },
+ "@emotion/hash": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
+ "integrity":
"sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
+ },
+ "@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved":
"https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity":
"sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "requires": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved":
"https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity":
"sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
+ },
+ "@emotion/serialize": {
+ "version": "0.11.16",
+ "resolved":
"https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz",
+ "integrity":
"sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==",
+ "requires": {
+ "@emotion/hash": "0.8.0",
+ "@emotion/memoize": "0.7.4",
+ "@emotion/unitless": "0.7.5",
+ "@emotion/utils": "0.11.3",
+ "csstype": "^2.5.7"
+ }
+ },
+ "@emotion/sheet": {
+ "version": "0.9.4",
+ "resolved":
"https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz",
+ "integrity":
"sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA=="
+ },
+ "@emotion/styled": {
+ "version": "10.0.27",
+ "resolved":
"https://registry.npmjs.org/@emotion/styled/-/styled-10.0.27.tgz",
+ "integrity":
"sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==",
+ "requires": {
+ "@emotion/styled-base": "^10.0.27",
+ "babel-plugin-emotion": "^10.0.27"
+ }
+ },
+ "@emotion/styled-base": {
+ "version": "10.0.31",
+ "resolved":
"https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.31.tgz",
+ "integrity":
"sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "@emotion/is-prop-valid": "0.8.8",
+ "@emotion/serialize": "^0.11.15",
+ "@emotion/utils": "0.11.3"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.9.2",
+ "resolved":
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
+ "integrity":
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved":
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity":
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+ }
+ }
+ },
+ "@emotion/stylis": {
+ "version": "0.8.5",
+ "resolved":
"https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
+ "integrity":
"sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
+ },
+ "@emotion/unitless": {
+ "version": "0.7.5",
+ "resolved":
"https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
+ "integrity":
"sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
+ },
+ "@emotion/utils": {
+ "version": "0.11.3",
+ "resolved":
"https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz",
+ "integrity":
"sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw=="
+ },
+ "@emotion/weak-memoize": {
+ "version": "0.2.5",
+ "resolved":
"https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
+ "integrity":
"sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
+ },
"@hot-loader/react-dom": {
"version": "16.13.0",
"resolved":
"https://registry.npmjs.org/@hot-loader/react-dom/-/react-dom-16.13.0.tgz",
@@ -7655,6 +7794,11 @@
"@babel/runtime": "^7.0.0"
}
},
+ "@scarf/scarf": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-0.1.5.tgz",
+ "integrity":
"sha512-Fx6atDc7JM1r0WkPCDhNetVZNp+DO21q/HGlomAKBG+k8vb1B8fg8Yige4oCf1P9OWTZWm5tM5i3jlXhrSbNOg=="
+ },
"@sinonjs/commons": {
"version": "1.3.0",
"resolved":
"https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz",
@@ -8721,6 +8865,11 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.15.tgz",
"integrity":
"sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA=="
},
+ "@types/parse-json": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity":
"sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+ },
"@types/prop-types": {
"version": "15.5.8",
"resolved":
"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.8.tgz",
@@ -10689,6 +10838,23 @@
"object.assign": "^4.1.0"
}
},
+ "babel-plugin-emotion": {
+ "version": "10.0.29",
+ "resolved":
"https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.29.tgz",
+ "integrity":
"sha512-7Jpi1OCxjyz0k163lKtqP+LHMg5z3S6A7vMBfHnF06l2unmtsOmFDzZBpGf0CWo1G4m8UACfVcDJiSiRuu/cSw==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@emotion/hash": "0.8.0",
+ "@emotion/memoize": "0.7.4",
+ "@emotion/serialize": "^0.11.16",
+ "babel-plugin-macros": "^2.0.0",
+ "babel-plugin-syntax-jsx": "^6.18.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^1.0.5",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7"
+ }
+ },
"babel-plugin-istanbul": {
"version": "6.0.0",
"resolved":
"https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
@@ -10722,6 +10888,81 @@
"require-package-name": "^2.0.1"
}
},
+ "babel-plugin-macros": {
+ "version": "2.8.0",
+ "resolved":
"https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
+ "integrity":
"sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
+ "requires": {
+ "@babel/runtime": "^7.7.2",
+ "cosmiconfig": "^6.0.0",
+ "resolve": "^1.12.0"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.9.2",
+ "resolved":
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
+ "integrity":
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "cosmiconfig": {
+ "version": "6.0.0",
+ "resolved":
"https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity":
"sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ }
+ },
+ "import-fresh": {
+ "version": "3.2.1",
+ "resolved":
"https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+ "integrity":
"sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "5.0.0",
+ "resolved":
"https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
+ "integrity":
"sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity":
"sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ },
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved":
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity":
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+ },
+ "resolve": {
+ "version": "1.15.1",
+ "resolved":
"https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity":
"sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ }
+ }
+ },
+ "babel-plugin-syntax-jsx": {
+ "version": "6.18.0",
+ "resolved":
"https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+ "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
+ },
"babel-polyfill": {
"version": "6.26.0",
"resolved":
"https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
@@ -11516,28 +11757,28 @@
"dependencies": {
"abbrev": {
"version": "1.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity":
"sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true,
"optional": true
},
"ansi-regex": {
"version": "2.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity":
"sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true,
"optional": true
},
"are-we-there-yet": {
"version": "1.1.5",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
"integrity":
"sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
"dev": true,
"optional": true,
@@ -11548,14 +11789,14 @@
},
"balanced-match": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity":
"sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"optional": true,
@@ -11566,42 +11807,42 @@
},
"chownr": {
"version": "1.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
"integrity":
"sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
"dev": true,
"optional": true
},
"code-point-at": {
"version": "1.1.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true,
"optional": true
},
"debug": {
"version": "4.1.1",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity":
"sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"dev": true,
"optional": true,
@@ -11611,28 +11852,28 @@
},
"deep-extend": {
"version": "0.6.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity":
"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"dev": true,
"optional": true
},
"fs-minipass": {
"version": "1.2.5",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
"integrity":
"sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
"dev": true,
"optional": true,
@@ -11642,14 +11883,14 @@
},
"fs.realpath": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true,
"optional": true
},
"gauge": {
"version": "2.7.4",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"optional": true,
@@ -11666,7 +11907,7 @@
},
"glob": {
"version": "7.1.3",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity":
"sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"dev": true,
"optional": true,
@@ -11681,14 +11922,14 @@
},
"has-unicode": {
"version": "2.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true,
"optional": true
},
"iconv-lite": {
"version": "0.4.24",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity":
"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"optional": true,
@@ -11698,7 +11939,7 @@
},
"ignore-walk": {
"version": "3.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
"integrity":
"sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
"dev": true,
"optional": true,
@@ -11708,7 +11949,7 @@
},
"inflight": {
"version": "1.0.6",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"optional": true,
@@ -11719,21 +11960,21 @@
},
"inherits": {
"version": "2.0.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true,
"optional": true
},
"ini": {
"version": "1.3.5",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity":
"sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true,
"optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"optional": true,
@@ -11743,14 +11984,14 @@
},
"isarray": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity":
"sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"optional": true,
@@ -11760,14 +12001,14 @@
},
"minimist": {
"version": "0.0.8",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true,
"optional": true
},
"minipass": {
"version": "2.3.5",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
"integrity":
"sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
"dev": true,
"optional": true,
@@ -11778,7 +12019,7 @@
},
"minizlib": {
"version": "1.2.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
"integrity":
"sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
"dev": true,
"optional": true,
@@ -11788,7 +12029,7 @@
},
"mkdirp": {
"version": "0.5.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"optional": true,
@@ -11798,14 +12039,14 @@
},
"ms": {
"version": "2.1.1",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity":
"sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true,
"optional": true
},
"needle": {
"version": "2.3.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/needle/-/needle-2.3.0.tgz",
"integrity":
"sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==",
"dev": true,
"optional": true,
@@ -11817,7 +12058,7 @@
},
"node-pre-gyp": {
"version": "0.12.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz",
"integrity":
"sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==",
"dev": true,
"optional": true,
@@ -11836,7 +12077,7 @@
},
"nopt": {
"version": "4.0.1",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"dev": true,
"optional": true,
@@ -11847,14 +12088,14 @@
},
"npm-bundled": {
"version": "1.0.6",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz",
"integrity":
"sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
"dev": true,
"optional": true
},
"npm-packlist": {
"version": "1.4.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz",
"integrity":
"sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==",
"dev": true,
"optional": true,
@@ -11865,7 +12106,7 @@
},
"npmlog": {
"version": "4.1.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity":
"sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"optional": true,
@@ -11878,21 +12119,21 @@
},
"number-is-nan": {
"version": "1.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true,
"optional": true
},
"once": {
"version": "1.4.0",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"optional": true,
@@ -11902,21 +12143,21 @@
},
"os-homedir": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true,
"optional": true
},
"os-tmpdir": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true,
"optional": true
},
"osenv": {
"version": "0.1.5",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity":
"sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"optional": true,
@@ -11927,21 +12168,21 @@
},
"path-is-absolute": {
"version": "1.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true,
"optional": true
},
"process-nextick-args": {
"version": "2.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity":
"sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true,
"optional": true
},
"rc": {
"version": "1.2.8",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity":
"sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
"optional": true,
@@ -11963,7 +12204,7 @@
},
"readable-stream": {
"version": "2.3.6",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity":
"sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"optional": true,
@@ -11979,7 +12220,7 @@
},
"rimraf": {
"version": "2.6.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
"integrity":
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
"dev": true,
"optional": true,
@@ -11989,49 +12230,49 @@
},
"safe-buffer": {
"version": "5.1.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity":
"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity":
"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"optional": true
},
"sax": {
"version": "1.2.4",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity":
"sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true,
"optional": true
},
"semver": {
"version": "5.7.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity":
"sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
"dev": true,
"optional": true
},
"set-blocking": {
"version": "2.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true,
"optional": true
},
"signal-exit": {
"version": "3.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true,
"optional": true
},
"string-width": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"optional": true,
@@ -12043,7 +12284,7 @@
},
"string_decoder": {
"version": "1.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity":
"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"optional": true,
@@ -12053,7 +12294,7 @@
},
"strip-ansi": {
"version": "3.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"optional": true,
@@ -12063,14 +12304,14 @@
},
"strip-json-comments": {
"version": "2.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true,
"optional": true
},
"tar": {
"version": "4.4.8",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
"integrity":
"sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
"dev": true,
"optional": true,
@@ -12086,14 +12327,14 @@
},
"util-deprecate": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true,
"optional": true
},
"wide-align": {
"version": "1.1.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
"integrity":
"sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"dev": true,
"optional": true,
@@ -12103,14 +12344,14 @@
},
"wrappy": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true,
"optional": true
},
"yallist": {
"version": "3.0.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
"integrity":
"sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
"dev": true,
"optional": true
@@ -14408,6 +14649,81 @@
"resolved":
"https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
},
+ "emotion-theming": {
+ "version": "10.0.27",
+ "resolved":
"https://registry.npmjs.org/emotion-theming/-/emotion-theming-10.0.27.tgz",
+ "integrity":
"sha512-MlF1yu/gYh8u+sLUqA0YuA9JX0P4Hb69WlKc/9OLo+WCXuX6sy/KoIa+qJimgmr2dWqnypYKYPX37esjDBbhdw==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "@emotion/weak-memoize": "0.2.5",
+ "hoist-non-react-statics": "^3.3.0"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.9.2",
+ "resolved":
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
+ "integrity":
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved":
"https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity":
"sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "requires": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved":
"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity":
"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved":
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity":
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+ }
+ }
+ },
+ "emotion-ts-plugin": {
+ "version": "0.5.3",
+ "resolved":
"https://registry.npmjs.org/emotion-ts-plugin/-/emotion-ts-plugin-0.5.3.tgz",
+ "integrity":
"sha512-GK60jpSpQIH3RdOeG9+/cnbdMJLpto8zVYVBMsKaFGL8yK2Pm/ej1Pa3LgkeBxVww/ELQyvTjwCMi5R+ZQkNSA==",
+ "dev": true,
+ "requires": {
+ "@emotion/hash": "^0.7.3",
+ "convert-source-map": "^1.7.0",
+ "find-root": "^1.1.0",
+ "lodash": "^4.17.15",
+ "source-map": "^0.7.3",
+ "tslib": "^1.10.0"
+ },
+ "dependencies": {
+ "@emotion/hash": {
+ "version": "0.7.4",
+ "resolved":
"https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz",
+ "integrity":
"sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved":
"https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity":
"sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved":
"https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity":
"sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ },
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@@ -14571,7 +14887,6 @@
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity":
"sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
"requires": {
"is-arrayish": "^0.2.1"
}
@@ -16217,8 +16532,7 @@
"find-root": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
- "integrity":
"sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
- "dev": true
+ "integrity":
"sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
},
"find-up": {
"version": "2.1.0",
@@ -16441,28 +16755,28 @@
"dependencies": {
"abbrev": {
"version": "1.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity":
"sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true,
"optional": true
},
"ansi-regex": {
"version": "2.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity":
"sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true,
"optional": true
},
"are-we-there-yet": {
"version": "1.1.5",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
"integrity":
"sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
"dev": true,
"optional": true,
@@ -16473,14 +16787,14 @@
},
"balanced-match": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity":
"sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"optional": true,
@@ -16491,42 +16805,42 @@
},
"chownr": {
"version": "1.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
"integrity":
"sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
"dev": true,
"optional": true
},
"code-point-at": {
"version": "1.1.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true,
"optional": true
},
"debug": {
"version": "4.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity":
"sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"dev": true,
"optional": true,
@@ -16536,28 +16850,28 @@
},
"deep-extend": {
"version": "0.6.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity":
"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"dev": true,
"optional": true
},
"fs-minipass": {
"version": "1.2.5",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
"integrity":
"sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
"dev": true,
"optional": true,
@@ -16567,14 +16881,14 @@
},
"fs.realpath": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true,
"optional": true
},
"gauge": {
"version": "2.7.4",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"optional": true,
@@ -16591,7 +16905,7 @@
},
"glob": {
"version": "7.1.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity":
"sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"dev": true,
"optional": true,
@@ -16606,14 +16920,14 @@
},
"has-unicode": {
"version": "2.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true,
"optional": true
},
"iconv-lite": {
"version": "0.4.24",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity":
"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"optional": true,
@@ -16623,7 +16937,7 @@
},
"ignore-walk": {
"version": "3.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
"integrity":
"sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
"dev": true,
"optional": true,
@@ -16633,7 +16947,7 @@
},
"inflight": {
"version": "1.0.6",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"optional": true,
@@ -16644,21 +16958,21 @@
},
"inherits": {
"version": "2.0.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true,
"optional": true
},
"ini": {
"version": "1.3.5",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity":
"sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true,
"optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"optional": true,
@@ -16668,14 +16982,14 @@
},
"isarray": {
"version": "1.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity":
"sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"optional": true,
@@ -16685,14 +16999,14 @@
},
"minimist": {
"version": "0.0.8",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true,
"optional": true
},
"minipass": {
"version": "2.3.5",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
"integrity":
"sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
"dev": true,
"optional": true,
@@ -16703,7 +17017,7 @@
},
"minizlib": {
"version": "1.2.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
"integrity":
"sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
"dev": true,
"optional": true,
@@ -16713,7 +17027,7 @@
},
"mkdirp": {
"version": "0.5.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"optional": true,
@@ -16723,14 +17037,14 @@
},
"ms": {
"version": "2.1.1",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity":
"sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true,
"optional": true
},
"needle": {
"version": "2.3.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/needle/-/needle-2.3.0.tgz",
"integrity":
"sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==",
"dev": true,
"optional": true,
@@ -16742,7 +17056,7 @@
},
"node-pre-gyp": {
"version": "0.12.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz",
"integrity":
"sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==",
"dev": true,
"optional": true,
@@ -16761,7 +17075,7 @@
},
"nopt": {
"version": "4.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"dev": true,
"optional": true,
@@ -16772,14 +17086,14 @@
},
"npm-bundled": {
"version": "1.0.6",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz",
"integrity":
"sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
"dev": true,
"optional": true
},
"npm-packlist": {
"version": "1.4.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz",
"integrity":
"sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==",
"dev": true,
"optional": true,
@@ -16790,7 +17104,7 @@
},
"npmlog": {
"version": "4.1.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity":
"sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"optional": true,
@@ -16803,21 +17117,21 @@
},
"number-is-nan": {
"version": "1.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true,
"optional": true
},
"once": {
"version": "1.4.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"optional": true,
@@ -16827,21 +17141,21 @@
},
"os-homedir": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true,
"optional": true
},
"os-tmpdir": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true,
"optional": true
},
"osenv": {
"version": "0.1.5",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity":
"sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"optional": true,
@@ -16852,21 +17166,21 @@
},
"path-is-absolute": {
"version": "1.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true,
"optional": true
},
"process-nextick-args": {
"version": "2.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity":
"sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true,
"optional": true
},
"rc": {
"version": "1.2.8",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity":
"sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
"optional": true,
@@ -16888,7 +17202,7 @@
},
"readable-stream": {
"version": "2.3.6",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity":
"sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"optional": true,
@@ -16904,7 +17218,7 @@
},
"rimraf": {
"version": "2.6.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
"integrity":
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
"dev": true,
"optional": true,
@@ -16914,49 +17228,49 @@
},
"safe-buffer": {
"version": "5.1.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity":
"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity":
"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"optional": true
},
"sax": {
"version": "1.2.4",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity":
"sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true,
"optional": true
},
"semver": {
"version": "5.7.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity":
"sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
"dev": true,
"optional": true
},
"set-blocking": {
"version": "2.0.0",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true,
"optional": true
},
"signal-exit": {
"version": "3.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true,
"optional": true
},
"string-width": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"optional": true,
@@ -16968,7 +17282,7 @@
},
"string_decoder": {
"version": "1.1.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity":
"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"optional": true,
@@ -16978,7 +17292,7 @@
},
"strip-ansi": {
"version": "3.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"optional": true,
@@ -16988,14 +17302,14 @@
},
"strip-json-comments": {
"version": "2.0.1",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true,
"optional": true
},
"tar": {
"version": "4.4.8",
- "resolved": false,
+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
"integrity":
"sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
"dev": true,
"optional": true,
@@ -17011,14 +17325,14 @@
},
"util-deprecate": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true,
"optional": true
},
"wide-align": {
"version": "1.1.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
"integrity":
"sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"dev": true,
"optional": true,
@@ -17028,14 +17342,14 @@
},
"wrappy": {
"version": "1.0.2",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true,
"optional": true
},
"yallist": {
"version": "3.0.3",
- "resolved": false,
+ "resolved":
"https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
"integrity":
"sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
"dev": true,
"optional": true
@@ -18965,8 +19279,7 @@
"is-arrayish": {
"version": "0.2.1",
"resolved":
"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
- "dev": true
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
},
"is-binary-path": {
"version": "1.0.1",
@@ -25682,8 +25995,7 @@
"json-parse-better-errors": {
"version": "1.0.2",
"resolved":
"https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity":
"sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
+ "integrity":
"sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
},
"json-schema": {
"version": "0.2.3",
@@ -25875,6 +26187,11 @@
"type-check": "~0.3.2"
}
},
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved":
"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+ },
"loader-runner": {
"version": "2.3.1",
"resolved":
"https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz",
@@ -27275,7 +27592,6 @@
"version": "1.0.1",
"resolved":
"https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity":
"sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
"requires": {
"callsites": "^3.0.0"
}
@@ -30711,9 +31027,12 @@
}
},
"react-table": {
- "version": "7.0.0-rc.15",
- "resolved":
"https://registry.npmjs.org/react-table/-/react-table-7.0.0-rc.15.tgz",
- "integrity":
"sha512-ofMOlgrioHhhvHjvjsQkxvfQzU98cqwy6BjPGNwhLN1vhgXeWi0mUGreaCPvRenEbTiXsQbMl4k3Xmx3Mut8Rw=="
+ "version": "7.0.4",
+ "resolved":
"https://registry.npmjs.org/react-table/-/react-table-7.0.4.tgz",
+ "integrity":
"sha512-Uqpj+VnUIvsNWNtNFD1z2i7OCHdlhoJtQt0DWx3XOkZnvDyI/eCghK8YBfA9mY4TW7vEgCDLaRCcREC/fmcx6Q==",
+ "requires": {
+ "@scarf/scarf": "^0.1.5"
+ }
},
"react-test-renderer": {
"version": "16.9.0",
@@ -31611,8 +31930,7 @@
"resolve-from": {
"version": "4.0.0",
"resolved":
"https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity":
"sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
+ "integrity":
"sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
},
"resolve-pathname": {
"version": "3.0.0",
@@ -37012,6 +37330,29 @@
"integrity":
"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
},
+ "yaml": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz",
+ "integrity":
"sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==",
+ "requires": {
+ "@babel/runtime": "^7.8.7"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.9.2",
+ "resolved":
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
+ "integrity":
"sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved":
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity":
"sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
+ }
+ }
+ },
"yargs": {
"version": "12.0.5",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index d0a0589..1cf766b 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -16,7 +16,7 @@
"prod": "node --max_old_space_size=4096
./node_modules/webpack/bin/webpack.js --mode=production --colors --progress",
"build-dev": "cross-env NODE_OPTIONS=--max_old_space_size=8192
NODE_ENV=development webpack --mode=development --colors --progress",
"build": "cross-env NODE_OPTIONS=--max_old_space_size=8192
NODE_ENV=production webpack --mode=production --colors --progress",
- "lint": "eslint --ignore-path=.eslintignore --ext .js,.jsx,.ts,.tsx . &&
prettier --check '{src,stylesheets}/**/*.{css,less,sass,scss}'",
+ "lint": "prettier --check '{src,stylesheets}/**/*.{css,less,sass,scss}' &&
eslint --ignore-path=.eslintignore --ext .js,.jsx,.ts,.tsx .",
"lint-fix": "eslint --fix --ignore-path=.eslintignore --ext
.js,.jsx,.ts,tsx . && npm run clean-css",
"clean-css": "prettier --write
'{src,stylesheets}/**/*.{css,less,sass,scss}'"
},
@@ -53,6 +53,8 @@
"dependencies": {
"@babel/runtime-corejs3": "^7.8.4",
"@data-ui/sparkline": "^0.0.54",
+ "@emotion/core": "^10.0.28",
+ "@emotion/styled": "^10.0.27",
"@superset-ui/chart": "^0.12.11",
"@superset-ui/chart-composition": "^0.12.8",
"@superset-ui/color": "^0.12.8",
@@ -108,6 +110,7 @@
"d3-scale": "^2.1.2",
"dnd-core": "^2.6.0",
"dompurify": "^2.0.7",
+ "emotion-theming": "^10.0.27",
"geolib": "^2.0.24",
"immutable": "^3.8.2",
"interweave": "^11.2.0",
@@ -147,7 +150,7 @@
"react-split": "^2.0.4",
"react-sticky": "^6.0.2",
"react-syntax-highlighter": "^7.0.4",
- "react-table": "^7.0.0-rc.15",
+ "react-table": "^7.0.4",
"react-transition-group": "^2.5.3",
"react-ultimate-pagination": "^1.2.0",
"react-virtualized": "9.19.1",
@@ -175,10 +178,12 @@
"@babel/preset-react": "^7.8.3",
"@babel/register": "^7.8.6",
"@hot-loader/react-dom": "^16.13.0",
+ "@types/classnames": "^2.2.9",
"@types/jest": "^25.1.4",
"@types/jquery": "^3.3.32",
"@types/react": "^16.9.23",
"@types/react-dom": "^16.9.5",
+ "@types/react-json-tree": "^0.6.11",
"@types/react-redux": "^7.1.7",
"@types/react-table": "^7.0.2",
"@types/react-ultimate-pagination": "^1.2.0",
@@ -189,12 +194,14 @@
"babel-jest": "^25.1.0",
"babel-loader": "^8.0.6",
"babel-plugin-dynamic-import-node": "^2.3.0",
+ "babel-plugin-emotion": "^10.0.29",
"babel-plugin-lodash": "^3.3.4",
"cache-loader": "^1.2.2",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^5.1.1",
"cross-env": "^5.2.0",
"css-loader": "^1.0.0",
+ "emotion-ts-plugin": "^0.5.3",
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0",
"eslint": "^6.2.2",
diff --git
a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
index fc8b569..eba56f1 100644
--- a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
+++ b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx
@@ -20,43 +20,45 @@ import React from 'react';
import { mount, shallow } from 'enzyme';
import { act } from 'react-dom/test-utils';
import { MenuItem, Pagination } from 'react-bootstrap';
+import Select from 'react-select';
import ListView from 'src/components/ListView/ListView';
+import ListViewFilters from 'src/components/ListView/Filters';
import ListViewPagination from 'src/components/ListView/Pagination';
import { areArraysShallowEqual } from 'src/reduxUtils';
+const mockedProps = {
+ title: 'Data Table',
+ columns: [
+ {
+ accessor: 'id',
+ Header: 'ID',
+ sortable: true,
+ },
+ {
+ accessor: 'name',
+ Header: 'Name',
+ },
+ ],
+ filters: [
+ {
+ Header: 'Name',
+ id: 'name',
+ operators: [{ label: 'Starts With', value: 'sw' }],
+ },
+ ],
+ data: [
+ { id: 1, name: 'data 1' },
+ { id: 2, name: 'data 2' },
+ ],
+ count: 2,
+ pageSize: 1,
+ fetchData: jest.fn(() => []),
+ loading: false,
+ bulkActions: [{ name: 'do something', onSelect: jest.fn() }],
+};
+
describe('ListView', () => {
- const mockedProps = {
- title: 'Data Table',
- columns: [
- {
- accessor: 'id',
- Header: 'ID',
- sortable: true,
- },
- {
- accessor: 'name',
- Header: 'Name',
- filterable: true,
- },
- ],
- filters: [
- {
- Header: 'Name',
- id: 'name',
- operators: [{ label: 'Starts With', value: 'sw' }],
- },
- ],
- data: [
- { id: 1, name: 'data 1' },
- { id: 2, name: 'data 2' },
- ],
- count: 2,
- pageSize: 1,
- fetchData: jest.fn(() => []),
- loading: false,
- bulkActions: [{ name: 'do something', onSelect: jest.fn() }],
- };
const wrapper = mount(<ListView {...mockedProps} />);
afterEach(() => {
@@ -138,34 +140,35 @@ describe('ListView', () => {
wrapper.update();
expect(mockedProps.fetchData.mock.calls[0]).toMatchInlineSnapshot(`
- Array [
- Object {
- "filters": Array [
- Object {
- "Header": "name",
- "id": "name",
- "operator": "sw",
- "value": "foo",
- },
- ],
- "pageIndex": 0,
- "pageSize": 1,
- "sortBy": Array [
- Object {
- "desc": false,
- "id": "id",
- },
- ],
- },
- ]
- `);
+Array [
+ Object {
+ "filters": Array [
+ Object {
+ "id": "name",
+ "operator": "sw",
+ "value": "foo",
+ },
+ ],
+ "pageIndex": 0,
+ "pageSize": 1,
+ "sortBy": Array [
+ Object {
+ "desc": false,
+ "id": "id",
+ },
+ ],
+ },
+]
+`);
});
+
it('renders pagination controls', () => {
expect(wrapper.find(Pagination).exists()).toBe(true);
expect(wrapper.find(Pagination.Prev).exists()).toBe(true);
expect(wrapper.find(Pagination.Item).exists()).toBe(true);
expect(wrapper.find(Pagination.Next).exists()).toBe(true);
});
+
it('calls fetchData on page change', () => {
act(() => {
wrapper.find(ListViewPagination).prop('onChange')(2);
@@ -173,28 +176,28 @@ describe('ListView', () => {
wrapper.update();
expect(mockedProps.fetchData.mock.calls[0]).toMatchInlineSnapshot(`
- Array [
- Object {
- "filters": Array [
- Object {
- "Header": "name",
- "id": "name",
- "operator": "sw",
- "value": "foo",
- },
- ],
- "pageIndex": 1,
- "pageSize": 1,
- "sortBy": Array [
- Object {
- "desc": false,
- "id": "id",
- },
- ],
- },
- ]
- `);
+Array [
+ Object {
+ "filters": Array [
+ Object {
+ "id": "name",
+ "operator": "sw",
+ "value": "foo",
+ },
+ ],
+ "pageIndex": 1,
+ "pageSize": 1,
+ "sortBy": Array [
+ Object {
+ "desc": false,
+ "id": "id",
+ },
+ ],
+ },
+]
+`);
});
+
it('handles bulk actions on 1 row', () => {
act(() => {
wrapper
@@ -228,6 +231,7 @@ describe('ListView', () => {
]
`);
});
+
it('handles bulk actions on all rows', () => {
act(() => {
wrapper
@@ -265,6 +269,7 @@ describe('ListView', () => {
]
`);
});
+
it('Throws an exception if filter missing in columns', () => {
expect.assertions(1);
const props = {
@@ -280,3 +285,105 @@ describe('ListView', () => {
}
});
});
+
+describe('ListView with new UI filters', () => {
+ const newFiltersProps = {
+ ...mockedProps,
+ useNewUIFilters: true,
+ filters: [
+ {
+ Header: 'ID',
+ id: 'id',
+ input: 'select',
+ selects: [{ label: 'foo', value: 'bar' }],
+ operator: 'eq',
+ },
+ {
+ Header: 'Name',
+ id: 'name',
+ input: 'search',
+ operator: 'ct',
+ },
+ ],
+ };
+
+ const wrapper = mount(<ListView {...newFiltersProps} />);
+
+ afterEach(() => {
+ mockedProps.fetchData.mockClear();
+ mockedProps.bulkActions.forEach(ba => {
+ ba.onSelect.mockClear();
+ });
+ });
+
+ it('renders UI filters', () => {
+ expect(wrapper.find(ListViewFilters)).toHaveLength(1);
+ });
+
+ it('calls fetchData on filter', () => {
+ act(() => {
+ wrapper
+ .find('[data-test="filters-select"]')
+ .last()
+ .props()
+ .onChange({ value: 'bar' });
+ });
+
+ act(() => {
+ wrapper
+ .find('[data-test="filters-search"]')
+ .last()
+ .props()
+ .onChange({ currentTarget: { value: 'something' } });
+ });
+
+ wrapper.update();
+
+ act(() => {
+ wrapper
+ .find('[data-test="filters-search"]')
+ .last()
+ .props()
+ .onBlur();
+ });
+
+ expect(newFiltersProps.fetchData.mock.calls[0]).toMatchInlineSnapshot(`
+ Array [
+ Object {
+ "filters": Array [
+ Object {
+ "id": "id",
+ "operator": "eq",
+ "value": "bar",
+ },
+ ],
+ "pageIndex": 0,
+ "pageSize": 1,
+ "sortBy": Array [],
+ },
+ ]
+ `);
+
+ expect(newFiltersProps.fetchData.mock.calls[1]).toMatchInlineSnapshot(`
+ Array [
+ Object {
+ "filters": Array [
+ Object {
+ "id": "id",
+ "operator": "eq",
+ "value": "bar",
+ },
+ Object {
+ "id": "name",
+ "operator": "ct",
+ "value": "something",
+ },
+ ],
+ "pageIndex": 0,
+ "pageSize": 1,
+ "sortBy": Array [],
+ },
+ ]
+ `);
+ });
+});
diff --git a/superset-frontend/src/components/ListView/Filters.tsx
b/superset-frontend/src/components/ListView/Filters.tsx
new file mode 100644
index 0000000..69d35a1
--- /dev/null
+++ b/superset-frontend/src/components/ListView/Filters.tsx
@@ -0,0 +1,168 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React, { useState } from 'react';
+import styled from '@emotion/styled';
+import { withTheme } from 'emotion-theming';
+
+import StyledSelect from 'src/components/StyledSelect';
+import SearchInput from 'src/components/SearchInput';
+import { Filter, Filters, FilterValue, InternalFilter } from './types';
+
+interface BaseFilter {
+ Header: string;
+ initialValue: any;
+}
+interface SelectFilterProps extends BaseFilter {
+ onSelect: (selected: any) => any;
+ selects: Filter['selects'];
+ emptyLabel?: string;
+}
+
+const FilterContainer = styled.div`
+ display: inline;
+ margin-right: 8px;
+`;
+
+const Title = styled.span`
+ font-weight: bold;
+`;
+
+const CLEAR_SELECT_FILTER_VALUE = 'CLEAR_SELECT_FILTER_VALUE';
+
+function SelectFilter({
+ Header,
+ selects = [],
+ emptyLabel = 'None',
+ initialValue,
+ onSelect,
+}: SelectFilterProps) {
+ const clearFilterSelect = {
+ label: emptyLabel,
+ value: CLEAR_SELECT_FILTER_VALUE,
+ };
+ const options = React.useMemo(() => [clearFilterSelect, ...selects], [
+ emptyLabel,
+ selects,
+ ]);
+
+ const [value, setValue] = useState(
+ typeof initialValue === 'undefined'
+ ? clearFilterSelect.value
+ : initialValue,
+ );
+ const onChange = (selected: { label: string; value: any } | null) => {
+ if (selected === null) return;
+ setValue(selected.value);
+ onSelect(
+ selected.value === CLEAR_SELECT_FILTER_VALUE ? undefined :
selected.value,
+ );
+ };
+
+ return (
+ <FilterContainer>
+ <Title>{Header}:</Title>
+ <StyledSelect
+ data-test="filters-select"
+ value={value}
+ options={options}
+ onChange={onChange}
+ clearable={false}
+ />
+ </FilterContainer>
+ );
+}
+
+interface SearchHeaderProps extends BaseFilter {
+ Header: string;
+ onSubmit: (val: string) => void;
+}
+
+function SearchFilter({ Header, initialValue, onSubmit }: SearchHeaderProps) {
+ const [value, setValue] = useState(initialValue || '');
+ const handleSubmit = () => onSubmit(value);
+
+ return (
+ <FilterContainer>
+ <SearchInput
+ data-test="filters-search"
+ placeholder={Header}
+ value={value}
+ onChange={e => {
+ setValue(e.currentTarget.value);
+ }}
+ onKeyDown={e => {
+ if (e.key === 'Enter') {
+ handleSubmit();
+ }
+ }}
+ onBlur={handleSubmit}
+ />
+ </FilterContainer>
+ );
+}
+
+interface UIFiltersProps {
+ filters: Filters;
+ internalFilters: InternalFilter[];
+ updateFilterValue: (id: number, value: FilterValue['value']) => void;
+}
+
+const FilterWrapper = styled.div`
+ padding: 24px 16px 8px;
+`;
+
+function UIFilters({
+ filters,
+ internalFilters = [],
+ updateFilterValue,
+}: UIFiltersProps) {
+ return (
+ <FilterWrapper>
+ {filters.map(({ Header, input, selects, unfilteredLabel }, index) => {
+ const initialValue =
+ internalFilters[index] && internalFilters[index].value;
+ if (input === 'select') {
+ return (
+ <SelectFilter
+ key={Header}
+ Header={Header}
+ selects={selects}
+ emptyLabel={unfilteredLabel}
+ initialValue={initialValue}
+ onSelect={(value: any) => updateFilterValue(index, value)}
+ />
+ );
+ }
+ if (input === 'search') {
+ return (
+ <SearchFilter
+ key={Header}
+ Header={Header}
+ initialValue={initialValue}
+ onSubmit={(value: string) => updateFilterValue(index, value)}
+ />
+ );
+ }
+ return null;
+ })}
+ </FilterWrapper>
+ );
+}
+
+export default withTheme(UIFilters);
diff --git a/superset-frontend/src/components/ListView/LegacyFilters.tsx
b/superset-frontend/src/components/ListView/LegacyFilters.tsx
new file mode 100644
index 0000000..6c493bc
--- /dev/null
+++ b/superset-frontend/src/components/ListView/LegacyFilters.tsx
@@ -0,0 +1,199 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { t } from '@superset-ui/translation';
+import React, { Dispatch, SetStateAction } from 'react';
+import {
+ Button,
+ Col,
+ DropdownButton,
+ FormControl,
+ MenuItem,
+ Row,
+ // @ts-ignore
+} from 'react-bootstrap';
+// @ts-ignore
+import SelectComponent from 'react-select';
+// @ts-ignore
+import VirtualizedSelect from 'react-virtualized-select';
+import { Filters, InternalFilter, Select } from './types';
+import { extractInputValue, getDefaultFilterOperator } from './utils';
+
+export const FilterMenu = ({
+ filters,
+ internalFilters,
+ setInternalFilters,
+}: {
+ filters: Filters;
+ internalFilters: InternalFilter[];
+ setInternalFilters: Dispatch<SetStateAction<InternalFilter[]>>;
+}) => (
+ <div className="filter-dropdown">
+ <DropdownButton
+ id="filter-picker"
+ bsSize="small"
+ bsStyle={'default'}
+ noCaret
+ title={
+ <>
+ <i className="fa fa-filter text-primary" />
+ {' '}
+ {t('Filter List')}
+ </>
+ }
+ >
+ {filters
+ .map(({ id, Header }) => ({
+ Header,
+ id,
+ value: undefined,
+ }))
+ .map(ft => (
+ <MenuItem
+ key={ft.id}
+ eventKey={ft}
+ onSelect={(fltr: typeof ft) =>
+ setInternalFilters([...internalFilters, fltr])
+ }
+ >
+ {ft.Header}
+ </MenuItem>
+ ))}
+ </DropdownButton>
+ </div>
+);
+
+export const FilterInputs = ({
+ internalFilters,
+ filters,
+ updateInternalFilter,
+ removeFilterAndApply,
+ filtersApplied,
+ applyFilters,
+}: {
+ internalFilters: InternalFilter[];
+ filters: Filters;
+ updateInternalFilter: (i: number, f: object) => void;
+ removeFilterAndApply: (i: number) => void;
+ filtersApplied: boolean;
+ applyFilters: () => void;
+}) => (
+ <>
+ {internalFilters.map((ft, i) => {
+ const filter = filters.find(f => f.id === ft.id);
+ if (!filter) {
+ console.error(`could not find filter for ${ft.id}`);
+ return null;
+ }
+ return (
+ <div key={`${ft.Header}-${i}`} className="filter-inputs">
+ <Row>
+ <Col className="text-center filter-column" md={2}>
+ <span>{ft.Header}</span>
+ </Col>
+ <Col md={2}>
+ <FormControl
+ componentClass="select"
+ bsSize="small"
+ value={ft.operator}
+ placeholder={filter ? getDefaultFilterOperator(filter) : ''}
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
+ updateInternalFilter(i, {
+ operator: e.currentTarget.value,
+ });
+ }}
+ >
+ {(filter.operators || []).map(({ label, value }: Select) => (
+ <option key={label} value={value}>
+ {label}
+ </option>
+ ))}
+ </FormControl>
+ </Col>
+ <Col md={1} />
+ <Col md={4}>
+ {filter.input === 'select' && (
+ <VirtualizedSelect
+ autoFocus
+ multi
+ searchable
+ name={`filter-${filter.id}-select`}
+ options={filter.selects}
+ placeholder="Select Value"
+ value={ft.value}
+ selectComponent={SelectComponent}
+ onChange={(e: Select[] | null) => {
+ updateInternalFilter(i, {
+ operator: ft.operator ||
getDefaultFilterOperator(filter),
+ value: e ? e.map(s => s.value) : e,
+ });
+ }}
+ />
+ )}
+ {filter.input !== 'select' && (
+ <FormControl
+ type={filter.input ? filter.input : 'text'}
+ bsSize="small"
+ value={ft.value || ''}
+ checked={Boolean(ft.value)}
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
+ e.persist();
+ updateInternalFilter(i, {
+ operator: ft.operator ||
getDefaultFilterOperator(filter),
+ value: extractInputValue(filter.input, e),
+ });
+ }}
+ />
+ )}
+ </Col>
+ <Col md={1}>
+ <div
+ className="filter-close"
+ role="button"
+ tabIndex={0}
+ onClick={() => removeFilterAndApply(i)}
+ >
+ <i className="fa fa-close text-primary" />
+ </div>
+ </Col>
+ </Row>
+ <br />
+ </div>
+ );
+ })}
+ {internalFilters.length > 0 && (
+ <>
+ <Row>
+ <Col md={10} />
+ <Col md={2}>
+ <Button
+ data-test="apply-filters"
+ disabled={!!filtersApplied}
+ bsStyle="primary"
+ onClick={applyFilters}
+ bsSize="small"
+ >
+ {t('Apply')}
+ </Button>
+ </Col>
+ </Row>
+ <br />
+ </>
+ )}
+ </>
+);
diff --git a/superset-frontend/src/components/ListView/ListView.tsx
b/superset-frontend/src/components/ListView/ListView.tsx
index f488777..2999d78 100644
--- a/superset-frontend/src/components/ListView/ListView.tsx
+++ b/superset-frontend/src/components/ListView/ListView.tsx
@@ -19,10 +19,8 @@
import { t } from '@superset-ui/translation';
import React, { FunctionComponent } from 'react';
import {
- Button,
Col,
DropdownButton,
- FormControl,
MenuItem,
Row,
// @ts-ignore
@@ -34,20 +32,10 @@ import VirtualizedSelect from 'react-virtualized-select';
import IndeterminateCheckbox from '../IndeterminateCheckbox';
import TableCollection from './TableCollection';
import Pagination from './Pagination';
-import {
- FetchDataConfig,
- Filters,
- InternalFilter,
- Select,
- SortColumn,
-} from './types';
-import {
- convertFilters,
- extractInputValue,
- ListViewError,
- removeFromList,
- useListViewState,
-} from './utils';
+import { FilterMenu, FilterInputs } from './LegacyFilters';
+import FilterControls from './Filters';
+import { FetchDataConfig, Filters, SortColumn } from './types';
+import { ListViewError, useListViewState } from './utils';
import './ListViewStyles.less';
@@ -67,6 +55,7 @@ interface Props {
name: React.ReactNode;
onSelect: (rows: any[]) => any;
}>;
+ useNewUIFilters?: boolean;
}
const bulkSelectColumnConfig = {
@@ -95,6 +84,7 @@ const ListView: FunctionComponent<Props> = ({
title = '',
filters = [],
bulkActions = [],
+ useNewUIFilters = false,
}) => {
const {
getTableProps,
@@ -104,9 +94,10 @@ const ListView: FunctionComponent<Props> = ({
prepareRow,
pageCount = 1,
gotoPage,
- setAllFilters,
+ removeFilterAndApply,
setInternalFilters,
updateInternalFilter,
+ applyFilterValue,
applyFilters,
filtersApplied,
selectedFlatRows,
@@ -120,6 +111,7 @@ const ListView: FunctionComponent<Props> = ({
fetchData,
initialPageSize,
initialSort,
+ initialFilters: useNewUIFilters ? filters : [],
});
const filterable = Boolean(filters.length);
if (filterable) {
@@ -136,161 +128,56 @@ const ListView: FunctionComponent<Props> = ({
});
}
- const removeFilterAndApply = (index: number) => {
- const updated = removeFromList(internalFilters, index);
- setInternalFilters(updated);
- setAllFilters(convertFilters(updated));
- };
-
return (
<div className={`superset-list-view ${className}`}>
- {title && filterable && (
- <div className="header">
- <Row>
- <Col md={10}>
- <h2>{t(title)}</h2>
- </Col>
- {filterable && (
- <Col md={2}>
- <div className="filter-dropdown">
- <DropdownButton
- id="filter-picker"
- bsSize="small"
- bsStyle={'default'}
- noCaret
- title={
- <>
- <i className="fa fa-filter text-primary" />
- {' '}
- {t('Filter List')}
- </>
- }
- >
- {filters
- .map(({ id, Header }) => ({
- Header,
- id,
- }))
- .map((ft: InternalFilter) => (
- <MenuItem
- key={ft.id}
- eventKey={ft}
- onSelect={(fltr: InternalFilter) =>
- setInternalFilters([...internalFilters, fltr])
- }
- >
- {ft.Header}
- </MenuItem>
- ))}
- </DropdownButton>
- </div>
- </Col>
- )}
- </Row>
- <hr />
- {internalFilters.map((ft, i) => {
- const filter = filters.find(f => f.id === ft.id);
- if (!filter) {
- console.error(`could not find filter for ${ft.id}`);
- return null;
- }
- return (
- <div key={`${ft.Header}-${i}`} className="filter-inputs">
+ <div className="header">
+ {!useNewUIFilters && (
+ <>
+ {title && filterable && (
+ <>
<Row>
- <Col className="text-center filter-column" md={2}>
- <span>{ft.Header}</span>
+ <Col md={10}>
+ <h2>{t(title)}</h2>
</Col>
- <Col md={2}>
- <FormControl
- componentClass="select"
- bsSize="small"
- value={ft.operator}
- placeholder={filter ? filter.operators[0] : ''}
- onChange={(e: React.MouseEvent<HTMLInputElement>) => {
- updateInternalFilter(i, {
- operator: e.currentTarget.value,
- });
- }}
- >
- {filter.operators.map(({ label, value }: Select) => (
- <option key={label} value={value}>
- {label}
- </option>
- ))}
- </FormControl>
- </Col>
- <Col md={1} />
- <Col md={4}>
- {filter.input === 'select' && (
- <VirtualizedSelect
- autoFocus
- multi
- searchable
- name={`filter-${filter.id}-select`}
- options={filter.selects}
- placeholder="Select Value"
- value={ft.value}
- selectComponent={SelectComponent}
- onChange={(e: Select[] | null) => {
- updateInternalFilter(i, {
- operator: ft.operator || filter.operators[0].value,
- value: e ? e.map(s => s.value) : e,
- });
- }}
- />
- )}
- {filter.input !== 'select' && (
- <FormControl
- type={filter.input ? filter.input : 'text'}
- bsSize="small"
- value={ft.value || ''}
- checked={Boolean(ft.value)}
- onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
- e.persist();
- updateInternalFilter(i, {
- operator: ft.operator || filter.operators[0].value,
- value: extractInputValue(filter.input, e),
- });
- }}
+ {filterable && (
+ <Col md={2}>
+ <FilterMenu
+ filters={filters}
+ internalFilters={internalFilters}
+ setInternalFilters={setInternalFilters}
/>
- )}
- </Col>
- <Col md={1}>
- <div
- className="filter-close"
- role="button"
- tabIndex={0}
- onClick={() => removeFilterAndApply(i)}
- >
- <i className="fa fa-close text-primary" />
- </div>
- </Col>
+ </Col>
+ )}
</Row>
- <br />
- </div>
- );
- })}
- {internalFilters.length > 0 && (
- <>
- <Row>
- <Col md={10} />
- <Col md={2}>
- <Button
- data-test="apply-filters"
- disabled={!!filtersApplied}
- bsStyle="primary"
- onClick={applyFilters}
- bsSize="small"
- >
- {t('Apply')}
- </Button>
- </Col>
- </Row>
- <br />
- </>
- )}
- </div>
- )}
+ <hr />
+ <FilterInputs
+ internalFilters={internalFilters}
+ filters={filters}
+ updateInternalFilter={updateInternalFilter}
+ removeFilterAndApply={removeFilterAndApply}
+ filtersApplied={filtersApplied}
+ applyFilters={applyFilters}
+ />
+ </>
+ )}
+ </>
+ )}
+ {useNewUIFilters && (
+ <>
+ <Row>
+ <Col md={10}>
+ <h2>{t(title)}</h2>
+ </Col>
+ </Row>
+ <hr />
+ <FilterControls
+ filters={filters}
+ internalFilters={internalFilters}
+ updateFilterValue={applyFilterValue}
+ />
+ </>
+ )}
+ </div>
<div className="body">
<TableCollection
getTableProps={getTableProps}
diff --git a/superset-frontend/src/components/ListView/types.ts
b/superset-frontend/src/components/ListView/types.ts
index 294192d..de85949 100644
--- a/superset-frontend/src/components/ListView/types.ts
+++ b/superset-frontend/src/components/ListView/types.ts
@@ -31,8 +31,10 @@ export interface Select {
export interface Filter {
Header: string;
id: string;
- operators: Select[];
- input?: 'text' | 'textarea' | 'select' | 'checkbox';
+ operators?: Select[];
+ operator?: string;
+ input?: 'text' | 'textarea' | 'select' | 'checkbox' | 'search';
+ unfilteredLabel?: string;
selects?: Select[];
}
@@ -41,7 +43,7 @@ export type Filters = Filter[];
export interface FilterValue {
id: string;
operator?: string;
- value: string | boolean | number;
+ value: string | boolean | number | null | undefined;
}
export interface FetchDataConfig {
@@ -52,7 +54,7 @@ export interface FetchDataConfig {
}
export interface InternalFilter extends FilterValue {
- Header: string;
+ Header?: string;
}
export interface FilterOperatorMap {
diff --git a/superset-frontend/src/components/ListView/utils.ts
b/superset-frontend/src/components/ListView/utils.ts
index d94703a..6bc643a 100644
--- a/superset-frontend/src/components/ListView/utils.ts
+++ b/superset-frontend/src/components/ListView/utils.ts
@@ -33,7 +33,13 @@ import {
useQueryParams,
} from 'use-query-params';
-import { FetchDataConfig, InternalFilter, SortColumn } from './types';
+import {
+ FetchDataConfig,
+ Filter,
+ FilterValue,
+ InternalFilter,
+ SortColumn,
+} from './types';
export class ListViewError extends Error {
name = 'ListViewError';
@@ -55,17 +61,22 @@ function updateInList(list: any[], index: number, update:
any): any[] {
];
}
+function mergeCreateFilterValues(list: Filter[], updateList: FilterValue[]) {
+ return list.map(({ id, operator }) => {
+ const update = updateList.find(obj => obj.id === id);
+
+ return { id, operator, value: update?.value };
+ });
+}
+
// convert filters from UI objects to data objects
-export function convertFilters(fts: InternalFilter[]) {
+export function convertFilters(fts: InternalFilter[]): FilterValue[] {
return fts
- .filter((ft: InternalFilter) => ft.value)
- .map(ft => ({ operator: ft.operator, ...ft }));
+ .filter(f => typeof f.value !== 'undefined')
+ .map(({ value, operator, id }) => ({ value, operator, id }));
}
-export function extractInputValue(
- inputType: 'text' | 'textarea' | 'checkbox' | 'select' | undefined,
- event: any,
-) {
+export function extractInputValue(inputType: Filter['input'], event: any) {
if (!inputType || inputType === 'text') {
return event.currentTarget.value;
}
@@ -76,6 +87,13 @@ export function extractInputValue(
return null;
}
+export function getDefaultFilterOperator(filter: Filter): string {
+ if (filter?.operator) return filter.operator;
+ if (filter?.operators?.length) {
+ return filter.operators[0].value;
+ }
+ return '';
+}
interface UseListViewConfig {
fetchData: (conf: FetchDataConfig) => any;
columns: any[];
@@ -84,6 +102,7 @@ interface UseListViewConfig {
initialPageSize: number;
initialSort?: SortColumn[];
bulkSelectMode?: boolean;
+ initialFilters?: Filter[];
bulkSelectColumnConfig?: {
id: string;
Header: (conf: any) => React.ReactNode;
@@ -97,6 +116,7 @@ export function useListViewState({
data,
count,
initialPageSize,
+ initialFilters = [],
initialSort = [],
bulkSelectMode = false,
bulkSelectColumnConfig,
@@ -123,10 +143,13 @@ export function useListViewState({
sortBy: initialSortBy,
};
- const columnsWithSelect = useMemo(
- () => (bulkSelectMode ? [bulkSelectColumnConfig, ...columns] : columns),
- [bulkSelectMode, columns],
- );
+ const columnsWithSelect = useMemo(() => {
+ // add exact filter type so filters with falsey values are not filtered out
+ const columnsWithFilter = columns.map(f => ({ ...f, filter: 'exact' }));
+ return bulkSelectMode
+ ? [bulkSelectColumnConfig, ...columnsWithFilter]
+ : columnsWithFilter;
+ }, [bulkSelectMode, columns]);
const {
getTableProps,
@@ -166,6 +189,14 @@ export function useListViewState({
);
useEffect(() => {
+ if (initialFilters.length) {
+ setInternalFilters(
+ mergeCreateFilterValues(initialFilters, query.filters),
+ );
+ }
+ }, [initialFilters]);
+
+ useEffect(() => {
const queryParams: any = {
filters: internalFilters,
pageIndex,
@@ -175,22 +206,41 @@ export function useListViewState({
queryParams.sortOrder = sortBy[0].desc ? 'desc' : 'asc';
}
setQuery(queryParams);
-
fetchData({ pageIndex, pageSize, sortBy, filters });
}, [fetchData, pageIndex, pageSize, sortBy, filters]);
const filtersApplied = internalFilters.every(
({ id, value, operator }, index) =>
id &&
- filters[index] &&
- filters[index].id === id &&
- filters[index].value === value &&
+ filters[index]?.id === id &&
+ filters[index]?.value === value &&
// @ts-ignore
- filters[index].operator === operator,
+ filters[index]?.operator === operator,
);
+ const updateInternalFilter = (index: number, update: object) =>
+ setInternalFilters(updateInList(internalFilters, index, update));
+
+ const applyFilterValue = (index: number, value: any) => {
+ // skip redunundant updates
+ if (internalFilters[index].value === value) {
+ return;
+ }
+ const update = { ...internalFilters[index], value };
+ const updatedFilters = updateInList(internalFilters, index, update);
+ setInternalFilters(updatedFilters);
+ setAllFilters(convertFilters(updatedFilters));
+ };
+
+ const removeFilterAndApply = (index: number) => {
+ const updated = removeFromList(internalFilters, index);
+ setInternalFilters(updated);
+ setAllFilters(convertFilters(updated));
+ };
+
return {
applyFilters: () => setAllFilters(convertFilters(internalFilters)),
+ removeFilterAndApply,
canNextPage,
canPreviousPage,
filtersApplied,
@@ -205,7 +255,7 @@ export function useListViewState({
setAllFilters,
setInternalFilters,
state: { pageIndex, pageSize, sortBy, filters, internalFilters },
- updateInternalFilter: (index: number, update: object) =>
- setInternalFilters(updateInList(internalFilters, index, update)),
+ updateInternalFilter,
+ applyFilterValue,
};
}
diff --git a/superset-frontend/jest.config.js
b/superset-frontend/src/components/SearchInput.tsx
similarity index 50%
copy from superset-frontend/jest.config.js
copy to superset-frontend/src/components/SearchInput.tsx
index 8a3c08a..dc4e744 100644
--- a/superset-frontend/jest.config.js
+++ b/superset-frontend/src/components/SearchInput.tsx
@@ -16,31 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-module.exports = {
- testRegex: '\\/spec\\/.*(_spec|\\.test)\\.(j|t)sx?$',
- moduleNameMapper: {
- '\\.(css|less)$': '<rootDir>/spec/__mocks__/styleMock.js',
- '\\.(gif|ttf|eot|svg)$': '<rootDir>/spec/__mocks__/fileMock.js',
- '^src/(.*)$': '<rootDir>/src/$1',
- },
- setupFilesAfterEnv: ['<rootDir>/spec/helpers/shim.js'],
- testURL: 'http://localhost',
- collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'],
- coverageDirectory: '<rootDir>/coverage/',
- transform: {
- '^.+\\.jsx?$': 'babel-jest',
- '^.+\\.tsx?$': 'ts-jest',
- },
- moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
- globals: {
- 'ts-jest': {
- diagnostics: {
- warnOnly: true,
- },
- tsConfig: {
- jsx: 'react',
- esModuleInterop: true,
- },
- },
- },
-};
+import styled from '@emotion/styled';
+
+export default styled.input`
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ padding: 4px 8px;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+`;
diff --git a/superset-frontend/jest.config.js
b/superset-frontend/src/components/StyledSelect.tsx
similarity index 50%
copy from superset-frontend/jest.config.js
copy to superset-frontend/src/components/StyledSelect.tsx
index 8a3c08a..1a47466 100644
--- a/superset-frontend/jest.config.js
+++ b/superset-frontend/src/components/StyledSelect.tsx
@@ -16,31 +16,33 @@
* specific language governing permissions and limitations
* under the License.
*/
-module.exports = {
- testRegex: '\\/spec\\/.*(_spec|\\.test)\\.(j|t)sx?$',
- moduleNameMapper: {
- '\\.(css|less)$': '<rootDir>/spec/__mocks__/styleMock.js',
- '\\.(gif|ttf|eot|svg)$': '<rootDir>/spec/__mocks__/fileMock.js',
- '^src/(.*)$': '<rootDir>/src/$1',
- },
- setupFilesAfterEnv: ['<rootDir>/spec/helpers/shim.js'],
- testURL: 'http://localhost',
- collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'],
- coverageDirectory: '<rootDir>/coverage/',
- transform: {
- '^.+\\.jsx?$': 'babel-jest',
- '^.+\\.tsx?$': 'ts-jest',
- },
- moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
- globals: {
- 'ts-jest': {
- diagnostics: {
- warnOnly: true,
- },
- tsConfig: {
- jsx: 'react',
- esModuleInterop: true,
- },
- },
- },
-};
+import styled from '@emotion/styled';
+// @ts-ignore
+import Select from 'react-select';
+
+export default styled(Select)`
+ display: inline;
+ &.is-focused:not(.is-open) > .Select-control {
+ border: none;
+ box-shadow: none;
+ }
+ .Select-control {
+ display: inline-table;
+ border: none;
+ width: 100px;
+ &:focus,
+ &:hover {
+ border: none;
+ box-shadow: none;
+ }
+
+ .Select-arrow-zone {
+ padding-left: 10px;
+ }
+ }
+ .Select-menu-outer {
+ margin-top: 0;
+ border-bottom-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+`;
diff --git a/superset-frontend/src/featureFlags.ts
b/superset-frontend/src/featureFlags.ts
index 0853578..b9d1e38 100644
--- a/superset-frontend/src/featureFlags.ts
+++ b/superset-frontend/src/featureFlags.ts
@@ -26,6 +26,7 @@ export enum FeatureFlag {
ESTIMATE_QUERY_COST = 'ESTIMATE_QUERY_COST',
SHARE_QUERIES_VIA_KV_STORE = 'SHARE_QUERIES_VIA_KV_STORE',
SQLLAB_BACKEND_PERSISTENCE = 'SQLLAB_BACKEND_PERSISTENCE',
+ LIST_VIEWS_NEW_UI = 'LIST_VIEWS_NEW_UI',
}
export type FeatureFlagMap = {
diff --git a/superset-frontend/src/types/react-table-config.d.ts
b/superset-frontend/src/types/react-table-config.d.ts
index a16a695..5c2321a 100644
--- a/superset-frontend/src/types/react-table-config.d.ts
+++ b/superset-frontend/src/types/react-table-config.d.ts
@@ -69,7 +69,6 @@ declare module 'react-table' {
export interface TableOptions<D extends object>
extends UseExpandedOptions<D>,
UseFiltersOptions<D>,
- UseFiltersOptions<D>,
UseGlobalFiltersOptions<D>,
UseGroupByOptions<D>,
UsePaginationOptions<D>,
diff --git a/superset-frontend/src/views/dashboardList/DashboardList.tsx
b/superset-frontend/src/views/dashboardList/DashboardList.tsx
index c36ddd8..0137c9e 100644
--- a/superset-frontend/src/views/dashboardList/DashboardList.tsx
+++ b/superset-frontend/src/views/dashboardList/DashboardList.tsx
@@ -32,6 +32,7 @@ import {
} from 'src/components/ListView/types';
import withToasts from 'src/messageToasts/enhancers/withToasts';
import PropertiesModal from 'src/dashboard/components/PropertiesModal';
+import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
const PAGE_SIZE = 25;
@@ -125,6 +126,10 @@ class DashboardList extends React.PureComponent<Props,
State> {
return this.hasPerm('can_mulexport');
}
+ get isNewUIEnabled() {
+ return isFeatureEnabled(FeatureFlag.LIST_VIEWS_NEW_UI);
+ }
+
initialSort = [{ id: 'changed_on', desc: true }];
columns = [
@@ -378,6 +383,39 @@ class DashboardList extends React.PureComponent<Props,
State> {
updateFilters = () => {
const { filterOperators, owners } = this.state;
+
+ if (this.isNewUIEnabled) {
+ return this.setState({
+ filters: [
+ {
+ Header: 'Owner',
+ id: 'owners',
+ input: 'select',
+ operator: 'rel_m_m',
+ unfilteredLabel: 'All',
+ selects: owners.map(({ text: label, value }) => ({ label, value
})),
+ },
+ {
+ Header: 'Published',
+ id: 'published',
+ input: 'select',
+ operator: 'eq',
+ unfilteredLabel: 'Any',
+ selects: [
+ { label: 'Published', value: true },
+ { label: 'Unpublished', value: false },
+ ],
+ },
+ {
+ Header: 'Search',
+ id: 'dashboard_title',
+ input: 'search',
+ operator: 'title_or_slug',
+ },
+ ],
+ });
+ }
+
const convertFilter = ({
name: label,
operator,
@@ -386,7 +424,7 @@ class DashboardList extends React.PureComponent<Props,
State> {
operator: string;
}) => ({ label, value: operator });
- this.setState({
+ return this.setState({
filters: [
{
Header: 'Dashboard',
@@ -481,6 +519,7 @@ class DashboardList extends React.PureComponent<Props,
State> {
initialSort={this.initialSort}
filters={filters}
bulkActions={bulkActions}
+ useNewUIFilters={this.isNewUIEnabled}
/>
</>
);
diff --git a/superset-frontend/src/welcome/App.jsx
b/superset-frontend/src/welcome/App.jsx
index a83f6df..0580ccb 100644
--- a/superset-frontend/src/welcome/App.jsx
+++ b/superset-frontend/src/welcome/App.jsx
@@ -22,7 +22,10 @@ import thunk from 'redux-thunk';
import { createStore, applyMiddleware, compose, combineReducers } from 'redux';
import { Provider } from 'react-redux';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
+import { ThemeProvider } from 'emotion-theming';
+import { initFeatureFlags } from 'src/featureFlags';
+import { supersetTheme } from 'stylesheets/styled-components/superset-theme';
import Menu from 'src/components/Menu/Menu';
import DashboardList from 'src/views/dashboardList/DashboardList';
import ChartList from 'src/views/chartList/ChartList';
@@ -41,6 +44,8 @@ const bootstrap =
JSON.parse(container.getAttribute('data-bootstrap'));
const user = { ...bootstrap.user };
const menu = { ...bootstrap.common.menu_data };
+initFeatureFlags(bootstrap.common.feature_flags);
+
const store = createStore(
combineReducers({
messageToasts: messageToastReducer,
@@ -51,24 +56,26 @@ const store = createStore(
const App = () => (
<Provider store={store}>
- <Router>
- <Menu data={menu} />
- <Switch>
- <Route path="/superset/welcome/">
- <Welcome user={user} />
- </Route>
- <Route path="/dashboard/list/">
- <DashboardList user={user} />
- </Route>
- <Route path="/chart/list/">
- <ChartList user={user} />
- </Route>
- <Route path="/tablemodelview/list/">
- <DatasetList user={user} />
- </Route>
- </Switch>
- <ToastPresenter />
- </Router>
+ <ThemeProvider theme={supersetTheme}>
+ <Router>
+ <Menu data={menu} />
+ <Switch>
+ <Route path="/superset/welcome/">
+ <Welcome user={user} />
+ </Route>
+ <Route path="/dashboard/list/">
+ <DashboardList user={user} />
+ </Route>
+ <Route path="/chart/list/">
+ <ChartList user={user} />
+ </Route>
+ <Route path="/tablemodelview/list/">
+ <DatasetList user={user} />
+ </Route>
+ </Switch>
+ <ToastPresenter />
+ </Router>
+ </ThemeProvider>
</Provider>
);
diff --git a/superset-frontend/jest.config.js
b/superset-frontend/stylesheets/styled-components/superset-theme.ts
similarity index 51%
copy from superset-frontend/jest.config.js
copy to superset-frontend/stylesheets/styled-components/superset-theme.ts
index 8a3c08a..aadb575 100644
--- a/superset-frontend/jest.config.js
+++ b/superset-frontend/stylesheets/styled-components/superset-theme.ts
@@ -16,31 +16,29 @@
* specific language governing permissions and limitations
* under the License.
*/
-module.exports = {
- testRegex: '\\/spec\\/.*(_spec|\\.test)\\.(j|t)sx?$',
- moduleNameMapper: {
- '\\.(css|less)$': '<rootDir>/spec/__mocks__/styleMock.js',
- '\\.(gif|ttf|eot|svg)$': '<rootDir>/spec/__mocks__/fileMock.js',
- '^src/(.*)$': '<rootDir>/src/$1',
- },
- setupFilesAfterEnv: ['<rootDir>/spec/helpers/shim.js'],
- testURL: 'http://localhost',
- collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'],
- coverageDirectory: '<rootDir>/coverage/',
- transform: {
- '^.+\\.jsx?$': 'babel-jest',
- '^.+\\.tsx?$': 'ts-jest',
- },
- moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
- globals: {
- 'ts-jest': {
- diagnostics: {
- warnOnly: true,
- },
- tsConfig: {
- jsx: 'react',
- esModuleInterop: true,
- },
+import styled, { CreateStyled } from '@emotion/styled';
+
+const defaultTheme = {
+ borderRadius: '4px',
+ colors: {
+ primary: {
+ base: '#20A7C9',
+ },
+ secondary: {
+ base: '#444E7C',
+ dark1: '#363E63',
+ dark2: '#282E4A',
+ dark3: '#1B1F31',
+ light1: '#8E94B0',
+ light2: '#B4B8CA',
+ light3: '#D9DBE4',
+ light4: '#ECEEF2',
+ light5: '#F5F5F8',
},
},
+ gridUnit: '4px',
};
+
+export default styled as CreateStyled<typeof defaultTheme>;
+
+export const supersetTheme = defaultTheme;
diff --git a/superset-frontend/webpack.config.js
b/superset-frontend/webpack.config.js
index a07181c..50233b9 100644
--- a/superset-frontend/webpack.config.js
+++ b/superset-frontend/webpack.config.js
@@ -154,6 +154,7 @@ const babelLoader = {
// disable gzip compression for cache files
// faster when there are millions of small files
cacheCompression: false,
+ plugins: ['emotion'],
},
};
@@ -198,6 +199,7 @@ const config = {
alias: {
src: path.resolve(APP_DIR, './src'),
'react-dom': '@hot-loader/react-dom',
+ stylesheets: path.resolve(APP_DIR, './stylesheets'),
},
extensions: ['.ts', '.tsx', '.js', '.jsx'],
symlinks: false,
diff --git a/superset/config.py b/superset/config.py
index 1d27119..28beb27 100644
--- a/superset/config.py
+++ b/superset/config.py
@@ -289,6 +289,7 @@ DEFAULT_FEATURE_FLAGS = {
"SHARE_QUERIES_VIA_KV_STORE": False,
"TAGGING_SYSTEM": False,
"SQLLAB_BACKEND_PERSISTENCE": False,
+ "LIST_VIEWS_NEW_UI": False,
}
# This is merely a default.