From d97e1e460c05d1600ae1ec54241dca93d1cb6e9d Mon Sep 17 00:00:00 2001 From: Chaparala Sri Kiran Date: Thu, 24 Dec 2020 10:39:20 -0500 Subject: [PATCH] Release 2.0.0 (#281) Major Changes: FIltering from backend Performance Improvement Tabbed Dashboard File Centric workflow Styling updates --- .env | 6 - config/webpack.config.js | 5 +- package-lock.json | 3851 +++++++++-------- package.json | 12 +- public/index.html | 6 + public/injectEnv.js | 8 + src/assets/icons/ExternalLinkIcon.svg | 15 + src/bento/armDetailData.js | 47 +- src/bento/caseDetailData.js | 163 +- src/bento/dashboardData.js | 65 +- src/bento/dashboardTabData.js | 868 ++++ src/bento/fileCentricCartWorkflowData.js | 127 + src/bento/globalFooterData.js | 7 +- src/bento/globalStatsData.js | 22 +- src/bento/navigationBarData.js | 25 +- src/bento/programData.js | 3 + src/bento/programDetailData.js | 8 +- .../AddToCartDialogAlertView.js | 37 + .../AddToCartDialogController.js | 83 + .../AddToCartDialog/AddToCartDialogView.js | 46 + .../AddToCartDialog/dialogThemeConfig.js | 56 + src/components/AddToCartDialog/index.js | 1 + src/components/CustomFooter/CustomFooter.js | 32 + src/components/CustomFooter/index.js | 1 + src/components/GraphqlClient/GraphqlView.js | 3 +- src/components/GridWithFooter/GridView.js | 348 ++ src/components/GridWithFooter/customFooter.js | 33 + src/components/GridWithFooter/index.js | 1 + src/components/Header/HeaderView.js | 15 +- src/components/Layout/LayoutView.js | 14 +- src/components/Message/index.js | 1 + src/components/Message/message.js | 49 + src/components/NavBar/NavBarContainer.js | 1 + src/components/NavBar/NavBarView.js | 452 +- .../NavBar/components/DropdownItemsMenu.js | 55 - .../NavBar/components/DropdownMenu.js | 103 - .../NumberOfThings/NumberOfThingsView.js | 35 + src/components/NumberOfThings/index.js | 1 + src/components/ProfileMenu/ProfileMenuView.js | 3 +- .../PropertySubsection/armDetailSubsection.js | 2 +- .../caseDetailSubsection.js | 2 +- .../SideBar/SideBarComponents/FacetFilters.js | 242 +- src/components/SideBar/SideBarView.js | 37 +- src/components/Snackbar/Snackbar.js | 41 + src/components/Snackbar/index.js | 1 + .../Stats/DashboardStatsController.js | 4 +- src/components/Stats/StatsView.js | 114 +- .../Stats/pageSpecificStatsController.js | 2 +- .../CustomActiveDonutController.js | 8 - .../CustomActiveDonutView.js | 117 - .../PieCharts/Donut/DonutController.js | 8 - .../Widgets/PieCharts/Donut/DonutView.js | 46 - .../ProgramSunburstController.js | 8 - .../ProgramSunburst/ProgramSunburstView.js | 162 - src/components/Wrappers/Wrappers.js | 1 - .../serverPaginatedTable.js | 228 + src/index.js | 7 +- src/pages/about/aboutBodyView.js | 266 -- src/pages/about/aboutController.js | 17 +- src/pages/about/aboutHeaderView.js | 37 - src/pages/about/aboutView.js | 34 + src/pages/about/xoomInOutView.js | 154 - src/pages/armDetail/armDetailController.js | 33 +- src/pages/armDetail/armDetailView.js | 175 +- src/pages/caseDetail/caseDetailController.js | 37 +- src/pages/caseDetail/caseDetailView.js | 240 +- src/pages/dashboard/caseTable/caseView.js | 19 +- src/pages/dashboard/dashboard.js | 9 +- src/pages/dashboard/dashboardState.js | 13 +- src/pages/dashboardTab/components/modal.js | 68 + .../dashboardTab/components/tabController.js | 339 ++ .../dashboardTab/components/tabFooter.js | 38 + src/pages/dashboardTab/components/tabLabel.js | 30 + .../dashboardTab/components/tabThemeConfig.js | 80 + src/pages/dashboardTab/components/tabView.js | 415 ++ src/pages/dashboardTab/dashboard.js | 245 ++ src/pages/dashboardTab/dashboardController.js | 64 + .../dashboardTab/store/dashboardReducer.js | 556 +++ .../utils/dashboardUtilFunctions.js | 813 ++++ .../dataDictionary/dataDictonaryController.js | 3 +- src/pages/dataDictionary/dataDictonaryView.js | 2 +- src/pages/fileCentricCart/cartController.js | 40 + .../fileCentricCart/cartTableThemeConfig.js | 28 + src/pages/fileCentricCart/cartView.js | 466 ++ src/pages/fileCentricCart/customFooter.js | 31 + .../fileCentricCart/dialogThemeConfig.js | 56 + src/pages/fileCentricCart/store/cart.js | 108 + src/pages/fileCentricCart/utils.js | 60 + src/pages/landing/landingController.js | 23 +- src/pages/landing/landingView.js | 1 - src/pages/modelPage/modelPageView.js | 5 +- .../programDetail/programDetailController.js | 28 +- src/pages/programDetail/programDetailView.js | 189 +- src/pages/programs/programsController.js | 15 +- src/pages/programs/programsView.js | 127 +- src/pages/selectedCases/customFooter.js | 82 - .../selectedCases/selectedCasesController.js | 33 - src/pages/selectedCases/selectedCasesState.js | 114 - src/pages/selectedCases/selectedCasesView.js | 317 -- src/pages/selectedFiles/customFooter.js | 61 - .../selectedFiles/selectedFilesController.js | 33 - src/pages/selectedFiles/selectedFilesView.js | 463 -- src/pages/table/tableView.js | 1 - src/store/index.js | 19 +- src/store/reducers.js | 13 - src/themes/dark.js | 33 +- src/themes/light.js | 35 +- src/utils/SuccessOutlined.js | 2 +- src/utils/anchor.js | 37 - src/utils/classNameConcat.js | 10 - src/utils/colors.js | 26 + src/utils/createSvgIcon.js | 20 - src/utils/dashboardUtilFunctions.js | 402 -- src/utils/env.js | 9 + src/utils/fileTable.js | 27 + src/utils/formatBytes.js | 12 - src/utils/graphqlClient.js | 7 +- src/utils/graphqlQueries.js | 2 +- src/utils/helpers.js | 22 - src/utils/sampleFileTable.js | 47 + 120 files changed, 8736 insertions(+), 5593 deletions(-) create mode 100644 public/injectEnv.js create mode 100644 src/assets/icons/ExternalLinkIcon.svg create mode 100644 src/bento/dashboardTabData.js create mode 100644 src/bento/fileCentricCartWorkflowData.js create mode 100644 src/components/AddToCartDialog/AddToCartDialogAlertView.js create mode 100644 src/components/AddToCartDialog/AddToCartDialogController.js create mode 100644 src/components/AddToCartDialog/AddToCartDialogView.js create mode 100644 src/components/AddToCartDialog/dialogThemeConfig.js create mode 100644 src/components/AddToCartDialog/index.js create mode 100644 src/components/CustomFooter/CustomFooter.js create mode 100644 src/components/CustomFooter/index.js create mode 100644 src/components/GridWithFooter/GridView.js create mode 100644 src/components/GridWithFooter/customFooter.js create mode 100644 src/components/GridWithFooter/index.js create mode 100644 src/components/Message/index.js create mode 100644 src/components/Message/message.js delete mode 100644 src/components/NavBar/components/DropdownItemsMenu.js delete mode 100644 src/components/NavBar/components/DropdownMenu.js create mode 100644 src/components/NumberOfThings/NumberOfThingsView.js create mode 100644 src/components/NumberOfThings/index.js create mode 100644 src/components/Snackbar/Snackbar.js create mode 100644 src/components/Snackbar/index.js delete mode 100644 src/components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutController.js delete mode 100644 src/components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutView.js delete mode 100644 src/components/Widgets/PieCharts/Donut/DonutController.js delete mode 100644 src/components/Widgets/PieCharts/Donut/DonutView.js delete mode 100644 src/components/Widgets/PieCharts/ProgramSunburst/ProgramSunburstController.js delete mode 100644 src/components/Widgets/PieCharts/ProgramSunburst/ProgramSunburstView.js create mode 100644 src/components/serverPaginatedTable/serverPaginatedTable.js delete mode 100644 src/pages/about/aboutBodyView.js delete mode 100644 src/pages/about/aboutHeaderView.js create mode 100644 src/pages/about/aboutView.js delete mode 100644 src/pages/about/xoomInOutView.js create mode 100644 src/pages/dashboardTab/components/modal.js create mode 100644 src/pages/dashboardTab/components/tabController.js create mode 100644 src/pages/dashboardTab/components/tabFooter.js create mode 100644 src/pages/dashboardTab/components/tabLabel.js create mode 100644 src/pages/dashboardTab/components/tabThemeConfig.js create mode 100644 src/pages/dashboardTab/components/tabView.js create mode 100644 src/pages/dashboardTab/dashboard.js create mode 100644 src/pages/dashboardTab/dashboardController.js create mode 100644 src/pages/dashboardTab/store/dashboardReducer.js create mode 100644 src/pages/dashboardTab/utils/dashboardUtilFunctions.js create mode 100644 src/pages/fileCentricCart/cartController.js create mode 100644 src/pages/fileCentricCart/cartTableThemeConfig.js create mode 100644 src/pages/fileCentricCart/cartView.js create mode 100644 src/pages/fileCentricCart/customFooter.js create mode 100644 src/pages/fileCentricCart/dialogThemeConfig.js create mode 100644 src/pages/fileCentricCart/store/cart.js create mode 100644 src/pages/fileCentricCart/utils.js delete mode 100644 src/pages/selectedCases/customFooter.js delete mode 100644 src/pages/selectedCases/selectedCasesController.js delete mode 100644 src/pages/selectedCases/selectedCasesState.js delete mode 100644 src/pages/selectedCases/selectedCasesView.js delete mode 100644 src/pages/selectedFiles/customFooter.js delete mode 100644 src/pages/selectedFiles/selectedFilesController.js delete mode 100644 src/pages/selectedFiles/selectedFilesView.js delete mode 100755 src/store/reducers.js delete mode 100644 src/utils/anchor.js delete mode 100644 src/utils/classNameConcat.js create mode 100644 src/utils/colors.js delete mode 100644 src/utils/createSvgIcon.js delete mode 100644 src/utils/dashboardUtilFunctions.js create mode 100644 src/utils/env.js create mode 100644 src/utils/fileTable.js delete mode 100644 src/utils/formatBytes.js delete mode 100644 src/utils/helpers.js create mode 100644 src/utils/sampleFileTable.js diff --git a/.env b/.env index 965e355c0..e69de29bb 100644 --- a/.env +++ b/.env @@ -1,6 +0,0 @@ -REACT_APP_BACKEND_GETUSERINFO_API=https://k9dc.essential-dev.com/fence/login/ -REACT_APP_LOGIN_URL=https://nci-crdc-staging.datacommons.io/user/oauth2/authorize?client_id=82pslYFJqA7auRvKYfTOK67jzQAMb8f6C33tlmZz&response_type=code&redirect_uri=https%3A%2F%2Fk9dc.essential-dev.com%2F&scope=openid%20user -REACT_APP_USER_LOGOUT_URL=https://k9dc.essential-dev.com/fence/logout -REACT_APP_BACKEND_API=http://localhost:8080/v1/graphql/ -REACT_APP_APPLICATION_VERSION=YYYY_MM_DD/HH:MM -REACT_APP_ABOUT_CONTENT_URL= https://raw.githubusercontent.com/CBIIT/ctdc-codebase/master/src/main/frontend/src/content/dev/aboutPagesContent.yaml \ No newline at end of file diff --git a/config/webpack.config.js b/config/webpack.config.js index 66e29460f..53e690ec7 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -18,12 +18,11 @@ const WorkboxWebpackPlugin = require('workbox-webpack-plugin'); const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent'); -const paths = require('./paths'); -const getClientEnvironment = require('./env'); const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin'); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin-alt'); const typescriptFormatter = require('react-dev-utils/typescriptFormatter'); - +const paths = require('./paths'); +const getClientEnvironment = require('./env'); // Source maps are resource heavy and can cause out of memory issue for large source files. const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false'; diff --git a/package-lock.json b/package-lock.json index cbc92f7dd..dfcdd79dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,12 +4,201 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@apollo/client": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.3.4.tgz", + "integrity": "sha512-PnbkSa2gcFD6Qakn2eJCJ1RMYdCzEIlRlaHZGnUNbH+7AKOYwjDVtSVCC03nDtWeS9yWiJ15A8xGMreMKAboQQ==", + "requires": { + "@graphql-typed-document-node/core": "^3.0.0", + "@types/zen-observable": "^0.8.0", + "@wry/context": "^0.5.2", + "@wry/equality": "^0.3.0", + "fast-json-stable-stringify": "^2.0.0", + "graphql-tag": "^2.11.0", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.13.1", + "prop-types": "^15.7.2", + "symbol-observable": "^2.0.0", + "ts-invariant": "^0.6.0", + "tslib": "^1.10.0", + "zen-observable": "^0.8.14" + }, + "dependencies": { + "@wry/context": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.5.2.tgz", + "integrity": "sha512-B/JLuRZ/vbEKHRUiGj6xiMojST1kHhu4WcreLfNN7q9DqQFrb97cWgf/kiYsPSUCAMVN0HzfFc8XjJdzgZzfjw==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@wry/equality": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.3.0.tgz", + "integrity": "sha512-DRDAu/e3oWBj826OWNV/GCmSdHD248mASXImgNoLE/3SDvpgb+k6G/+TAmdpIB35ju264+kB22Rx92eXg52DnA==", + "requires": { + "tslib": "^1.9.3" + } + }, + "optimism": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.13.1.tgz", + "integrity": "sha512-16RRVYZe8ODcUqpabpY7Gb91vCAbdhn8FHjlUb2Hqnjjow1j8Z1dlppds+yAsLbreNTVylLC+tNX6DuC2vt3Kw==", + "requires": { + "@wry/context": "^0.5.2" + } + }, + "symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==" + }, + "ts-invariant": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.6.0.tgz", + "integrity": "sha512-caoafsfgb8QxdrKzFfjKt627m4i8KTtfAiji0DYJfWI4A/S9ORNNpzYuD9br64kyKFgxn9UNaLLbSupam84mCA==", + "requires": { + "@types/ungap__global-this": "^0.3.1", + "@ungap/global-this": "^0.4.2", + "tslib": "^1.9.3" + } + } + } + }, + "@apollo/react-common": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@apollo/react-common/-/react-common-3.1.4.tgz", + "integrity": "sha512-X5Kyro73bthWSCBJUC5XYQqMnG0dLWuDZmVkzog9dynovhfiVCV4kPSdgSIkqnb++cwCzOVuQ4rDKVwo2XRzQA==", + "requires": { + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0" + }, + "dependencies": { + "ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "@apollo/react-components": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@apollo/react-components/-/react-components-4.0.0.tgz", + "integrity": "sha512-JI0qnvROVC8bPbtPVzHKNHkDhohv8f8a8DNGjyI9seLeB2V0NMT3c1qEUs+zsu0W+SdDdRaUKE3DjsEuxj92Ew==", + "requires": { + "@apollo/client": "^3.3.4" + }, + "dependencies": { + "@apollo/client": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.3.4.tgz", + "integrity": "sha512-PnbkSa2gcFD6Qakn2eJCJ1RMYdCzEIlRlaHZGnUNbH+7AKOYwjDVtSVCC03nDtWeS9yWiJ15A8xGMreMKAboQQ==", + "requires": { + "@graphql-typed-document-node/core": "^3.0.0", + "@types/zen-observable": "^0.8.0", + "@wry/context": "^0.5.2", + "@wry/equality": "^0.3.0", + "fast-json-stable-stringify": "^2.0.0", + "graphql-tag": "^2.11.0", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.13.1", + "prop-types": "^15.7.2", + "symbol-observable": "^2.0.0", + "ts-invariant": "^0.6.0", + "tslib": "^1.10.0", + "zen-observable": "^0.8.14" + } + }, + "symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==" + } + } + }, + "@apollo/react-hoc": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@apollo/react-hoc/-/react-hoc-3.1.5.tgz", + "integrity": "sha512-jlZ2pvEnRevLa54H563BU0/xrYSgWQ72GksarxUzCHQW85nmn9wQln0kLBX7Ua7SBt9WgiuYQXQVechaaCulfQ==", + "requires": { + "@apollo/react-common": "^3.1.4", + "@apollo/react-components": "^3.1.5", + "hoist-non-react-statics": "^3.3.0", + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0" + }, + "dependencies": { + "@apollo/react-components": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@apollo/react-components/-/react-components-3.1.5.tgz", + "integrity": "sha512-c82VyUuE9VBnJB7bnX+3dmwpIPMhyjMwyoSLyQWPHxz8jK4ak30XszJtqFf4eC4hwvvLYa+Ou6X73Q8V8e2/jg==", + "requires": { + "@apollo/react-common": "^3.1.4", + "@apollo/react-hooks": "^3.1.5", + "prop-types": "^15.7.2", + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0" + } + }, + "ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "@apollo/react-hooks": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@apollo/react-hooks/-/react-hooks-3.1.5.tgz", + "integrity": "sha512-y0CJ393DLxIIkksRup4nt+vSjxalbZBXnnXxYbviq/woj+zKa431zy0yT4LqyRKpFy9ahMIwxBnBwfwIoupqLQ==", + "requires": { + "@apollo/react-common": "^3.1.4", + "@wry/equality": "^0.1.9", + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0" + }, + "dependencies": { + "@wry/equality": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", + "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", + "requires": { + "tslib": "^1.9.3" + } + }, + "ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "@apollo/react-ssr": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@apollo/react-ssr/-/react-ssr-3.1.5.tgz", + "integrity": "sha512-wuLPkKlctNn3u8EU8rlECyktpOUCeekFfb0KhIKknpGY6Lza2Qu0bThx7D9MIbVEzhKadNNrzLcpk0Y8/5UuWg==", + "requires": { + "@apollo/react-common": "^3.1.4", + "@apollo/react-hooks": "^3.1.5", + "tslib": "^1.10.0" + } + }, "@babel/cli": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.11.6.tgz", - "integrity": "sha512-+w7BZCvkewSmaRM6H4L2QM3RL90teqEIHDIFXAmrW33+0jhlymnDAEdqVeCZATvxhQuio1ifoGVlJJbIiH9Ffg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.12.10.tgz", + "integrity": "sha512-+y4ZnePpvWs1fc/LhZRTHkTesbXkyBYuOB+5CyodZqrEuETXi3zOVfpAQIdgC3lXbHLTDG9dQosxR9BhvLKDLQ==", "requires": { - "chokidar": "^2.1.8", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", + "chokidar": "^3.4.0", "commander": "^4.0.1", "convert-source-map": "^1.1.0", "fs-readdir-recursive": "^1.1.0", @@ -29,14 +218,9 @@ } }, "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.5.tgz", + "integrity": "sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg==" }, "@babel/core": { "version": "7.2.2", @@ -60,11 +244,11 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", "requires": { - "@babel/types": "^7.11.5", + "@babel/types": "^7.12.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -96,48 +280,46 @@ } }, "@babel/helper-builder-react-jsx-experimental": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", - "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", + "version": "7.12.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz", + "integrity": "sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.11.5" + "@babel/helper-module-imports": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", "semver": "^5.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", "requires": { "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "regexpu-core": "^4.7.1" } }, "@babel/helper-define-map": { @@ -151,11 +333,11 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-function-name": { @@ -185,32 +367,34 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, @@ -236,42 +420,40 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -287,10 +469,15 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==" + }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/template": "^7.10.4", @@ -299,13 +486,13 @@ } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/highlight": { @@ -319,26 +506,26 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -353,103 +540,103 @@ } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz", + "integrity": "sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/plugin-transform-parameters": "^7.12.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -462,17 +649,17 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-decorators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz", - "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz", + "integrity": "sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -494,9 +681,9 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", - "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz", + "integrity": "sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -510,9 +697,9 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -566,107 +753,107 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", - "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", + "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-remap-async-to-generator": "^7.12.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-define-map": "^7.10.4", "@babel/helper-function-name": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -682,197 +869,195 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "requires": { - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "requires": { "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-replace-supers": "^7.12.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz", - "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz", + "integrity": "sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.5.tgz", + "integrity": "sha512-2xkcPqqrYiOQgSlM/iwto1paPijjsDbUynN13tI6bosDz/jOW3CRzYguIE8wKX32h+msbBM22Dv5fwrFkUOZjQ==", "requires": { "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/plugin-syntax-jsx": "^7.12.1" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz", - "integrity": "sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.5.tgz", + "integrity": "sha512-1JJusg3iPgsZDthyWiCr3KQiGs31ikU/mSf2N2dSYEAO0GEImmVUbWf0VoSDGDFTAn5Dj4DUiR6SdIXHY7tELA==", "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.11.5", + "@babel/helper-builder-react-jsx-experimental": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/plugin-syntax-jsx": "^7.12.1" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz", + "integrity": "sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz", + "integrity": "sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", - "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -889,99 +1074,99 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-regex": "^7.10.4" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typescript": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", - "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", + "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.10.4" + "@babel/plugin-syntax-typescript": "^7.12.1" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", - "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-class-properties": "^7.12.1", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -991,45 +1176,42 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.5", - "browserslist": "^4.12.0", + "@babel/types": "^7.12.1", "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", "semver": "^5.5.0" } }, @@ -1046,17 +1228,17 @@ } }, "@babel/preset-react": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", - "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.5.tgz", + "integrity": "sha512-jcs++VPrgyFehkMezHtezS2BpnUlR7tQFAyesJn1vGTO9aTFZrgIQrA5YydlTwxbcjMwkFY6i04flCigRRr3GA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.10.4", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/plugin-transform-react-jsx-development": "^7.10.4", - "@babel/plugin-transform-react-jsx-self": "^7.10.4", - "@babel/plugin-transform-react-jsx-source": "^7.10.4", - "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.5", + "@babel/plugin-transform-react-jsx-development": "^7.12.5", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" } }, "@babel/preset-typescript": { @@ -1069,17 +1251,17 @@ } }, "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", - "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz", + "integrity": "sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ==", "requires": { "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.4" @@ -1096,25 +1278,25 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -1152,9 +1334,9 @@ } }, "@emotion/core": { - "version": "10.0.35", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.35.tgz", - "integrity": "sha512-sH++vJCdk025fBlRZSAhkRlSUoqSqgCzYf5fMOmqqi3bM6how+sQpg3hkgJonj8GxXM4WbD7dRO+4tegDB9fUw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.1.1.tgz", + "integrity": "sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA==", "requires": { "@babel/runtime": "^7.5.5", "@emotion/cache": "^10.0.27", @@ -1216,41 +1398,6 @@ "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": { - "@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/stylis": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", @@ -1271,6 +1418,11 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, + "@graphql-typed-document-node/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz", + "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==" + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -2292,11 +2444,6 @@ "react-is": "^16.8.0" } }, - "@mdx-js/react": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.16.tgz", - "integrity": "sha512-+FhuSVOPo7+4fZaRwWuCSRUcZkJOkZu0rfAbBKvoCg1LWb1Td8Vzi0DTLORdSvgWNbU6+EL40HIgwTOs00x2Jw==" - }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -2306,6 +2453,123 @@ "glob-to-regexp": "^0.3.0" } }, + "@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", + "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "optional": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + } + } + }, "@nodelib/fs.stat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", @@ -2316,135 +2580,6 @@ "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" }, - "@styled-system/background": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/background/-/background-5.1.2.tgz", - "integrity": "sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/border": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/border/-/border-5.1.5.tgz", - "integrity": "sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/color": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/color/-/color-5.1.2.tgz", - "integrity": "sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/core/-/core-5.1.2.tgz", - "integrity": "sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==", - "requires": { - "object-assign": "^4.1.1" - } - }, - "@styled-system/css": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", - "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==" - }, - "@styled-system/flexbox": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/flexbox/-/flexbox-5.1.2.tgz", - "integrity": "sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/grid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/grid/-/grid-5.1.2.tgz", - "integrity": "sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/layout": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/layout/-/layout-5.1.2.tgz", - "integrity": "sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/position": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/position/-/position-5.1.2.tgz", - "integrity": "sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/shadow": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/shadow/-/shadow-5.1.2.tgz", - "integrity": "sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/should-forward-prop": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/should-forward-prop/-/should-forward-prop-5.1.5.tgz", - "integrity": "sha512-+rPRomgCGYnUIaFabDoOgpSDc4UUJ1KsmlnzcEp0tu5lFrBQKgZclSo18Z1URhaZm7a6agGtS5Xif7tuC2s52Q==", - "requires": { - "@emotion/is-prop-valid": "^0.8.1", - "@emotion/memoize": "^0.7.1", - "styled-system": "^5.1.5" - }, - "dependencies": { - "@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" - }, - "dependencies": { - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - } - } - } - } - }, - "@styled-system/space": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/space/-/space-5.1.2.tgz", - "integrity": "sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/typography": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/typography/-/typography-5.1.2.tgz", - "integrity": "sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/variant": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/variant/-/variant-5.1.5.tgz", - "integrity": "sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==", - "requires": { - "@styled-system/core": "^5.1.2", - "@styled-system/css": "^5.1.5" - } - }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", @@ -2530,18 +2665,18 @@ }, "dependencies": { "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -2605,9 +2740,9 @@ } }, "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "version": "15.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.11.tgz", + "integrity": "sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA==", "requires": { "@types/yargs-parser": "*" } @@ -2618,11 +2753,10 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -2705,70 +2839,10 @@ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz", "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==" }, - "@theme-ui/color-modes": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/color-modes/-/color-modes-0.3.1.tgz", - "integrity": "sha512-WuZGgFW7M5wOWSse1PVZCEfM0OZip15/D6U3bB3B9KmWax7qiSnAm1yAMLRQKC+QYhndrjq3xU+WAQm11KnhIw==", - "requires": { - "@emotion/core": "^10.0.0", - "@theme-ui/core": "^0.3.1", - "@theme-ui/css": "^0.3.1", - "deepmerge": "^4.2.2" - } - }, - "@theme-ui/components": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/components/-/components-0.3.1.tgz", - "integrity": "sha512-uG4dUM61s4tWv6N34uxs5VIh24bJyA/7TrYJ75WDiI+s72zbcNG7aGRpvX/hSZnAhxjdXpuskdEM3eEgOabdEg==", - "requires": { - "@emotion/core": "^10.0.0", - "@emotion/styled": "^10.0.0", - "@styled-system/color": "^5.1.2", - "@styled-system/should-forward-prop": "^5.1.2", - "@styled-system/space": "^5.1.2", - "@theme-ui/css": "^0.3.1" - } - }, - "@theme-ui/core": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/core/-/core-0.3.1.tgz", - "integrity": "sha512-cK6EVSOx0Kyx1Xpi4qb0JTLIxywx0DRh+53Ln1foXMplF2qKaDsFi3vD6duHIlT331E3CNOa9dftHHNM7y4rbA==", - "requires": { - "@emotion/core": "^10.0.0", - "@theme-ui/css": "^0.3.1", - "deepmerge": "^4.2.2" - } - }, - "@theme-ui/css": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/css/-/css-0.3.1.tgz", - "integrity": "sha512-QB2/fZBpo4inaLHL3OrB8NOBgNfwnj8GtHzXWHb9iQSRjmtNX8zPXBe32jLT7qQP0+y8JxPT4YChZIkm5ZyIdg==" - }, - "@theme-ui/mdx": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@theme-ui/mdx/-/mdx-0.3.0.tgz", - "integrity": "sha512-/GHBNKqmUptWwkmF+zIASVQtjYs81XMEwtqPCHnHuaaCzhZxcXrtCwvcAgmCXF8hpRttCXVVxw1X3Gt0mhzaTQ==", - "requires": { - "@emotion/core": "^10.0.0", - "@emotion/styled": "^10.0.0", - "@mdx-js/react": "^1.0.0" - } - }, - "@theme-ui/theme-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/theme-provider/-/theme-provider-0.3.1.tgz", - "integrity": "sha512-Sjj6lD0gPxBi+hcGCkawcGZECeESV/mW2YfmPqjNgmc296x5tulfNc+0/N5CJwLVOmnkn8zR5KNWZ8BjndfeTg==", - "requires": { - "@emotion/core": "^10.0.0", - "@theme-ui/color-modes": "^0.3.1", - "@theme-ui/core": "^0.3.1", - "@theme-ui/mdx": "^0.3.0" - } - }, "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -2778,35 +2852,30 @@ } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.14.tgz", - "integrity": "sha512-8w9szzKs14ZtBVuP6Wn7nMLRJ0D6dfB0VEBEyRgxrZ/Ln49aNMykrghM2FaNn4FJRzNppCSa0Rv9pBRM5Xc3wg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", "requires": { "@babel/types": "^7.3.0" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -2860,9 +2929,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "14.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz", - "integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==" + "version": "14.14.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.8.tgz", + "integrity": "sha512-z/5Yd59dCKI5kbxauAJgw6dLPzW+TNOItNE00PkpzNwUIEwdj/Lsqwq94H5DdYBX7C13aRA0CY32BK76+neEUA==" }, "@types/parse-json": { "version": "4.0.0", @@ -2880,25 +2949,25 @@ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, "@types/react": { - "version": "16.9.49", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.49.tgz", - "integrity": "sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g==", + "version": "16.9.56", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.56.tgz", + "integrity": "sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ==", "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" }, "dependencies": { "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" } } }, "@types/react-dom": { - "version": "16.9.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz", - "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.0.tgz", + "integrity": "sha512-lUqY7OlkF/RbNtD5nIq7ot8NquXrdFrjSOR6+w9a9RFQevGi1oZO1dcJbXMeONAPKtZ2UrZOEJ5UOCVsxbLk/g==", "requires": { "@types/react": "*" } @@ -2951,9 +3020,9 @@ } }, "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "version": "15.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.11.tgz", + "integrity": "sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA==", "requires": { "@types/yargs-parser": "*" } @@ -2964,11 +3033,10 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -3020,10 +3088,15 @@ } } }, + "@types/ungap__global-this": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@types/ungap__global-this/-/ungap__global-this-0.3.1.tgz", + "integrity": "sha512-+/DsiV4CxXl6ZWefwHZDXSe1Slitz21tom38qPCaG0DYCS1NnDPIQDTKcmQ/tvK/edJUKkmuIDBJbmKDiB0r/g==" + }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } @@ -3061,11 +3134,11 @@ }, "dependencies": { "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } } @@ -3109,13 +3182,29 @@ "is-extglob": "^2.1.1" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "requires": { + "lru-cache": "^6.0.0" + } } } }, + "@ungap/global-this": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@ungap/global-this/-/global-this-0.4.2.tgz", + "integrity": "sha512-uFg7Kz+E12RBlgBLMlWVjmn2OIeE2J1Lzij0RseNcCVsrJX+LEB4fQ9MnoPXkXJmO5cHtTEzI5ATtb3IJfQ9tQ==" + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -3275,18 +3364,17 @@ } }, "@wry/context": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.4.4.tgz", - "integrity": "sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.5.2.tgz", + "integrity": "sha512-B/JLuRZ/vbEKHRUiGj6xiMojST1kHhu4WcreLfNN7q9DqQFrb97cWgf/kiYsPSUCAMVN0HzfFc8XjJdzgZzfjw==", "requires": { - "@types/node": ">=6", "tslib": "^1.9.3" } }, "@wry/equality": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", - "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.3.0.tgz", + "integrity": "sha512-DRDAu/e3oWBj826OWNV/GCmSdHD248mASXImgNoLE/3SDvpgb+k6G/+TAmdpIB35ju264+kB22Rx92eXg52DnA==", "requires": { "tslib": "^1.9.3" } @@ -3302,9 +3390,9 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "abab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", - "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, "accepts": { "version": "1.3.7", @@ -3316,9 +3404,9 @@ } }, "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "acorn-dynamic-import": { "version": "3.0.0", @@ -3345,9 +3433,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" } } }, @@ -3418,9 +3506,9 @@ } }, "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3748,110 +3836,6 @@ } } }, - "apollo-boost": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/apollo-boost/-/apollo-boost-0.4.9.tgz", - "integrity": "sha512-05y5BKcDaa8w47f8d81UVwKqrAjn8uKLv6QM9fNdldoNzQ+rnOHgFlnrySUZRz9QIT3vPftQkEz2UEASp1Mi5g==", - "requires": { - "apollo-cache": "^1.3.5", - "apollo-cache-inmemory": "^1.6.6", - "apollo-client": "^2.6.10", - "apollo-link": "^1.0.6", - "apollo-link-error": "^1.0.3", - "apollo-link-http": "^1.3.1", - "graphql-tag": "^2.4.2", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0" - } - }, - "apollo-cache": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.5.tgz", - "integrity": "sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA==", - "requires": { - "apollo-utilities": "^1.3.4", - "tslib": "^1.10.0" - } - }, - "apollo-cache-inmemory": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz", - "integrity": "sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A==", - "requires": { - "apollo-cache": "^1.3.5", - "apollo-utilities": "^1.3.4", - "optimism": "^0.10.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0" - } - }, - "apollo-client": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.6.10.tgz", - "integrity": "sha512-jiPlMTN6/5CjZpJOkGeUV0mb4zxx33uXWdj/xQCfAMkuNAC3HN7CvYDyMHHEzmcQ5GV12LszWoQ/VlxET24CtA==", - "requires": { - "@types/zen-observable": "^0.8.0", - "apollo-cache": "1.3.5", - "apollo-link": "^1.0.0", - "apollo-utilities": "1.3.4", - "symbol-observable": "^1.0.2", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0", - "zen-observable": "^0.8.0" - } - }, - "apollo-link": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", - "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", - "requires": { - "apollo-utilities": "^1.3.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3", - "zen-observable-ts": "^0.8.21" - } - }, - "apollo-link-error": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.13.tgz", - "integrity": "sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg==", - "requires": { - "apollo-link": "^1.2.14", - "apollo-link-http-common": "^0.2.16", - "tslib": "^1.9.3" - } - }, - "apollo-link-http": { - "version": "1.5.17", - "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.17.tgz", - "integrity": "sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==", - "requires": { - "apollo-link": "^1.2.14", - "apollo-link-http-common": "^0.2.16", - "tslib": "^1.9.3" - } - }, - "apollo-link-http-common": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz", - "integrity": "sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==", - "requires": { - "apollo-link": "^1.2.14", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3" - } - }, - "apollo-utilities": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", - "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", - "requires": { - "@wry/equality": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0" - } - }, "append-transform": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", @@ -3959,23 +3943,68 @@ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "array.prototype.flatmap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", - "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", + "es-abstract": "^1.18.0-next.1", "function-bind": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "arrify": { @@ -4090,14 +4119,14 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axe-core": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", - "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.0.tgz", + "integrity": "sha512-9atDIOTDLsWL+1GbBec6omflaT5Cxh88J0GtJtGfCVIXpI02rXHkju59W5mMqWa7eiC5OR168v3TK3kUKBW98g==", "dev": true }, "axios": { @@ -4295,9 +4324,9 @@ } }, "babel-plugin-named-asset-import": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", - "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" }, "babel-plugin-styled-components": { "version": "1.11.1", @@ -4741,9 +4770,9 @@ } }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "batch": { "version": "0.6.1", @@ -4759,9 +4788,9 @@ } }, "bento-components": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/bento-components/-/bento-components-0.1.32.tgz", - "integrity": "sha512-FLc4xGvC2d5zyg9iSIBLeS+cAQKnjIlHaZvCzCYuO/+enWQYZtf2xoDD6FfvP71wviuM+pEWWPpudomUnR97rA==", + "version": "0.1.45", + "resolved": "https://registry.npmjs.org/bento-components/-/bento-components-0.1.45.tgz", + "integrity": "sha512-CXXNWxcAkFMLc9aDu7PwDGmA7/H1toAzAS+6peccbhVD/OufqPZhxGMTaeh0R0AXOwr3mtNrF3Ih5sLP+VssUw==", "requires": { "@babel/cli": "^7.10.5", "@babel/plugin-proposal-class-properties": "^7.10.4", @@ -4776,6 +4805,7 @@ "cross-env": "^7.0.2", "eslint-plugin-babel": "^5.3.1", "link-react": "^3.0.0", + "lodash": "^4.17.20", "lodash.assignwith": "^4.2.0", "lodash.clonedeep": "^4.5.0", "lodash.debounce": "^4.0.8", @@ -4792,7 +4822,18 @@ "react-router-dom": "^5.2.0", "react-scripts": "3.4.1", "react-to-print": "^2.8.0", - "svg-url-loader": "^5.0.0" + "react-vis": "^1.11.7", + "react-zoom-pan-pinch": "^1.6.1", + "recharts": "^1.8.5", + "svg-url-loader": "^5.0.0", + "uuid": "^8.3.1" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } } }, "bfj": { @@ -4974,19 +5015,12 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -5031,14 +5065,15 @@ } }, "browserslist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "version": "4.14.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz", + "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==", "requires": { - "caniuse-lite": "^1.0.30001125", - "electron-to-chromium": "^1.3.564", - "escalade": "^3.0.2", - "node-releases": "^1.1.61" + "caniuse-lite": "^1.0.30001157", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.591", + "escalade": "^3.1.1", + "node-releases": "^1.1.66" } }, "bser": { @@ -5135,6 +5170,15 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -5162,12 +5206,19 @@ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } } }, "camelcase": { @@ -5192,9 +5243,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001125", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001125.tgz", - "integrity": "sha512-9f+r7BW8Qli917mU3j0fUaTweT3f3vnX/Lcs+1C73V+RADmFme+Ih0Br8vONQi3X0lseOe6ZHfsZLCA8MSjxUA==" + "version": "1.0.30001159", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz", + "integrity": "sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA==" }, "capture-exit": { "version": "2.0.0", @@ -5255,82 +5306,70 @@ "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==" }, "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" }, "dependencies": { - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "is-extendable": "^0.1.0" + "fill-range": "^7.0.1" } }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "to-regex-range": "^5.0.1" } }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" } }, "is-extglob": { @@ -5347,17 +5386,30 @@ } }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } } } }, @@ -5541,17 +5593,17 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codemirror": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.57.0.tgz", - "integrity": "sha512-WGc6UL7Hqt+8a6ZAsj/f1ApQl3NPvHY/UQSzG6fB6l4BjExgVdhFaxd7mRTw1UCiYe/6q86zHP+kfvBQcZGvUg==" + "version": "5.58.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.58.2.tgz", + "integrity": "sha512-K/hOh24cCwRutd1Mk3uLtjWzNISOkm4fvXiMO7LucCrqbh6aJDdtqUziim3MZUI6wOY0rvY1SlL1Ork01uMy6w==" }, "codemirror-graphql": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-0.12.1.tgz", - "integrity": "sha512-PlOCTpfBBUwDZXQo60ZfzD/nGZsaJoE1tA07Uf9xJN7R0kBDGJeD4AVfdUTprZr27p0JIntJzmL6mt/G4Zkzeg==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-0.12.3.tgz", + "integrity": "sha512-u0TooVA2MWGNV+Bio89RCTRW9P5FqegB1V9rnz9I0QKoGXX/c9z9/Fc+nj18p8jxkWK8ii8d7hkz7vsNsHxdkw==", "requires": { - "graphql-language-service-interface": "^2.4.1", - "graphql-language-service-parser": "^1.6.1" + "graphql-language-service-interface": "^2.4.2", + "graphql-language-service-parser": "^1.6.4" } }, "collection-visit": { @@ -5564,12 +5616,12 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" } }, "color-convert": { @@ -5586,9 +5638,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -5694,9 +5746,9 @@ } }, "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" }, "connect-history-api-fallback": { "version": "1.6.0", @@ -5781,11 +5833,11 @@ "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.7.0.tgz", + "integrity": "sha512-V8yBI3+ZLDVomoWICO6kq/CD28Y4r1M7CWeO4AGpMdMfseu8bkSubBmUPySMGKRTS+su4XQ07zUkAsiu9FCWTg==", "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.14.6", "semver": "7.0.0" }, "dependencies": { @@ -5797,9 +5849,9 @@ } }, "core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.7.0.tgz", + "integrity": "sha512-EZD2ckZysv8MMt4J6HSvS9K2GdtlZtdBncKAmF9lr2n0c9dJUaUN88PSTjvgwCgQPWKTkERXITgS6JJRAnljtg==" }, "core-util-is": { "version": "1.0.2", @@ -5859,9 +5911,9 @@ } }, "cross-env": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", - "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "requires": { "cross-spawn": "^7.0.1" } @@ -5966,13 +6018,13 @@ } }, "css-jss": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/css-jss/-/css-jss-10.4.0.tgz", - "integrity": "sha512-WA/MgZyQm6KAubnFlBn8d6jwNjpzv0kdRCZ9Qb81ylb3/EYTz8qyjGvhIMODa/MuRBUaIMgzr2qjkb1B7WXEkw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/css-jss/-/css-jss-10.5.0.tgz", + "integrity": "sha512-AkItNzoem2IkLpSw6IClzLKNmqEq9bUOjHAhrG/TZM5Wzb/u/7nzd1IfnR+i7XCYB8kyoQL60iqRbx1im9Nlzw==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0", - "jss-preset-default": "10.4.0" + "jss": "10.5.0", + "jss-preset-default": "10.5.0" } }, "css-loader": { @@ -6135,9 +6187,9 @@ } }, "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" }, "css.escape": { "version": "1.5.1", @@ -6226,26 +6278,26 @@ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" }, "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.1.1.tgz", + "integrity": "sha512-Rvq+e1e0TFB8E8X+8MQjHSY6vtol45s5gxtLI/018UsAn2IBMmwNEZRM/h+HVnAJRHjasLIKKUO3uvoMM28LvA==", "requires": { - "css-tree": "1.0.0-alpha.39" + "css-tree": "^1.0.0" }, "dependencies": { "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.1.tgz", + "integrity": "sha512-NVN42M2fjszcUNpDbdkvutgQSlFYsr1z7kqeuCagHnNLBfYor6uP1WL1KrkmdYZ5Y1vTBCIOI/C/+8T98fJ71w==", "requires": { - "mdn-data": "2.0.6", + "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "source-map": { "version": "0.6.1", @@ -6268,9 +6320,9 @@ } }, "csstype": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.13.tgz", - "integrity": "sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A==" + "version": "2.6.14", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.14.tgz", + "integrity": "sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A==" }, "cyclist": { "version": "1.0.1", @@ -6431,11 +6483,11 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -6444,9 +6496,9 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decimal.js-light": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.0.tgz", - "integrity": "sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg==" + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, "decode-uri-component": { "version": "0.2.0", @@ -6476,11 +6528,6 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -6769,9 +6816,9 @@ }, "dependencies": { "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" } } }, @@ -6785,9 +6832,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==" } } }, @@ -6832,12 +6879,19 @@ } }, "dot-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", - "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } } }, "dot-prop": { @@ -6889,9 +6943,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.564", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.564.tgz", - "integrity": "sha512-fNaYN3EtKQWLQsrKXui8mzcryJXuA0LbCLoizeX6oayG2emBaS5MauKjCPAvc29NEY4FpLHIUWiP+Y0Bfrs5dg==" + "version": "1.3.598", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.598.tgz", + "integrity": "sha512-G5Ztk23/ubLYVPxPXnB1uu105uzIPd4xB/D8ld8x1GaSC9+vU9NZL16nYZya8H77/7CCKKN7dArzJL3pBs8N7A==" }, "elliptic": { "version": "6.5.3", @@ -6977,9 +7031,9 @@ } }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" }, "errno": { "version": "0.1.7", @@ -6998,19 +7052,19 @@ } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -7055,9 +7109,9 @@ } }, "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -7158,11 +7212,11 @@ } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -7191,9 +7245,9 @@ } }, "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==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7264,24 +7318,24 @@ } }, "eslint-config-airbnb": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz", - "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", + "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", "dev": true, "requires": { - "eslint-config-airbnb-base": "^14.2.0", - "object.assign": "^4.1.0", + "eslint-config-airbnb-base": "^14.2.1", + "object.assign": "^4.1.2", "object.entries": "^1.1.2" } }, "eslint-config-airbnb-base": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", - "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.9", - "object.assign": "^4.1.0", + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", "object.entries": "^1.1.2" } }, @@ -7316,10 +7370,11 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } } @@ -7393,9 +7448,9 @@ } }, "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -7403,7 +7458,7 @@ "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", + "eslint-import-resolver-node": "^0.3.4", "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", @@ -7490,11 +7545,12 @@ } }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -7507,48 +7563,58 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz", - "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", "dev": true, "requires": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.11.2", "aria-query": "^4.2.2", "array-includes": "^3.1.1", "ast-types-flow": "^0.0.7", - "axe-core": "^3.5.4", - "axobject-query": "^2.1.2", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", "damerau-levenshtein": "^1.0.6", "emoji-regex": "^9.0.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", + "jsx-ast-utils": "^3.1.0", "language-tags": "^1.0.5" }, "dependencies": { "emoji-regex": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz", - "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", + "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==", "dev": true + }, + "jsx-ast-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz", + "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.1" + } } } }, "eslint-plugin-react": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz", - "integrity": "sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz", + "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==", "dev": true, "requires": { "array-includes": "^3.1.1", "array.prototype.flatmap": "^1.2.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", "object.entries": "^1.1.2", "object.fromentries": "^2.0.2", "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.17.0", + "resolve": "^1.18.1", "string.prototype.matchall": "^4.0.2" }, "dependencies": { @@ -7562,11 +7628,12 @@ } }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } } @@ -8520,15 +8587,6 @@ "worker-rpc": "^0.1.0" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -8539,32 +8597,31 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "debug": { @@ -8692,25 +8749,24 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "is-glob": "^4.0.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "is-accessor-descriptor": { @@ -8721,14 +8777,6 @@ "kind-of": "^6.0.0" } }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", @@ -8747,24 +8795,24 @@ "kind-of": "^6.0.2" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "is-extglob": "^2.1.1" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8788,110 +8836,12 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } } } }, @@ -8935,16 +8885,25 @@ "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "debug": { @@ -8977,14 +8936,6 @@ "is-descriptor": "^0.1.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -9038,6 +8989,14 @@ } } }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -9060,14 +9019,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } } } }, @@ -9080,14 +9031,23 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extendable": "^0.1.0" + "is-extglob": "^2.1.0" } } } @@ -9098,6 +9058,13 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } } }, "is-data-descriptor": { @@ -9106,6 +9073,13 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } } }, "is-descriptor": { @@ -9116,6 +9090,26 @@ "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" } }, "is-number": { @@ -9124,23 +9118,8 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -9159,12 +9138,41 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" } } }, @@ -9270,15 +9278,25 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -9433,20 +9451,15 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "graphiql": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/graphiql/-/graphiql-1.0.3.tgz", - "integrity": "sha512-6YW76m2exdpGiVS75I0QsbM4NanvenKFR9FtW/IFbui0mWv89iVa1FbdjhUt+kxa+LX/WlqTshiqiZRz7E5Bgg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/graphiql/-/graphiql-1.0.6.tgz", + "integrity": "sha512-PgKEfWkXxU4Lx92eSEcLF/2en5bjGplxNwwLCKEQ82xU7t8wfj4UL46Zwx40E9LcxJum6KRfGzMjcY+bNwHzpQ==", "requires": { - "@emotion/core": "^10.0.28", - "@mdx-js/react": "^1.5.2", - "codemirror": "^5.52.2", - "codemirror-graphql": "^0.12.0", + "codemirror": "^5.54.0", + "codemirror-graphql": "^0.12.3", "copy-to-clipboard": "^3.2.0", "entities": "^2.0.0", - "markdown-it": "^10.0.0", - "monaco-graphql": "^0.2.0", - "regenerator-runtime": "^0.13.5", - "theme-ui": "^0.3.1" + "markdown-it": "^10.0.0" } }, "graphql": { @@ -9457,42 +9470,37 @@ "iterall": "^1.2.2" } }, - "graphql-language-service": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-3.0.1.tgz", - "integrity": "sha512-79EGvEECgn1HIX0VBh3pXqetqgdtRHfkNTws0mcirCtFowwqt+QZAKKBNKVLY2vMya9wNVLDWUvzl0FF5wbBTA==", - "requires": { - "graphql-language-service-interface": "^2.4.1", - "graphql-language-service-types": "^1.6.1" - } - }, "graphql-language-service-interface": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/graphql-language-service-interface/-/graphql-language-service-interface-2.4.1.tgz", - "integrity": "sha512-cKT0ia7xNVpkLlI0vuwxVpPVIXwy02ah4I+N6s4mxFKVgo+lPlX9r933EWX6t1P1vzGJmNf+dip2dK3gHg2bBw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/graphql-language-service-interface/-/graphql-language-service-interface-2.4.2.tgz", + "integrity": "sha512-iFLMz51cA2L5Tu7/mP19++bRGUuIe2J9ekQZrcJ6sMYStsF60x5eNu3JqheduYTLhQaSdKN55jX7RlLeIDUhQA==", "requires": { - "graphql-language-service-parser": "^1.6.1", - "graphql-language-service-types": "^1.6.1", - "graphql-language-service-utils": "^2.4.1", + "graphql-language-service-parser": "^1.6.4", + "graphql-language-service-types": "^1.6.3", + "graphql-language-service-utils": "^2.4.3", "vscode-languageserver-types": "^3.15.1" } }, "graphql-language-service-parser": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/graphql-language-service-parser/-/graphql-language-service-parser-1.6.2.tgz", - "integrity": "sha512-7CwFkvuOjyrzwk+Ox4hPH839NOGnFHbzlWD08nsRxRTqth71LkHWS1ADVFxvBv49C1kXFmLSsCMhi4PH1meozQ==" + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/graphql-language-service-parser/-/graphql-language-service-parser-1.6.4.tgz", + "integrity": "sha512-Y365zUFfJ1GJ9NeRHb5Z/HBo6EnbuTi187Gkuldwd1YIDc0QcD7kqz6U5g043zd7BI/UZQth13Zd7pElvbb2zw==", + "requires": { + "graphql-language-service-types": "^1.6.3", + "typescript": "^3.9.5" + } }, "graphql-language-service-types": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/graphql-language-service-types/-/graphql-language-service-types-1.6.1.tgz", - "integrity": "sha512-ag3m5b7aje7ZBSuLVQE/gt2iDL9WEfzotZfLyskUDOonhHKniQ8BfmSQ/pF9F6zrdVjtZ8VRr5nes1sEYvvwKQ==" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/graphql-language-service-types/-/graphql-language-service-types-1.6.3.tgz", + "integrity": "sha512-VDtBhdan1iSe7ad7+eBbsO5rrzWQpC6aV4SxSHEi8AtEQOFXpnL9Lq5jSaN8O02pGvAUr4wNUPu0oRU5g2XmVA==" }, "graphql-language-service-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/graphql-language-service-utils/-/graphql-language-service-utils-2.4.1.tgz", - "integrity": "sha512-fqYSrjJ3YXHwY9eYUz5nesLwLfo8csbR/hS4Xz8wDZCeqkD20UzjVfnbF1Q0SjtKFlDtEfnG9hJvHZEJXZCF3A==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/graphql-language-service-utils/-/graphql-language-service-utils-2.4.3.tgz", + "integrity": "sha512-XSCMKsV4GuVSGdW8RJTpO/IJDMXgESDJLu67SAuXFXwfel84j1gWrsmBAUeu6Di6NUEoM9NOCEtJv3LbU+/8qw==", "requires": { - "graphql-language-service-types": "^1.6.1" + "graphql-language-service-types": "^1.6.3" } }, "graphql-tag": { @@ -9674,9 +9682,9 @@ } }, "hast-util-parse-selector": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz", - "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA==" + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" }, "hastscript": { "version": "5.1.2", @@ -10294,9 +10302,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "iferr": { "version": "0.1.5", @@ -10352,6 +10360,14 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "indefinite-observable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-2.0.1.tgz", + "integrity": "sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ==", + "requires": { + "symbol-observable": "1.2.0" + } + }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -10412,11 +10428,10 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -10563,9 +10578,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" }, "is-ci": { "version": "2.0.0", @@ -10588,6 +10603,14 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -10811,9 +10834,9 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-what": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.11.2.tgz", - "integrity": "sha512-m7LzBsC9TqUhkBrozSmmWfVO7VYnjk9UHu0U+Y8BiJRnc1TYIK/3Qv4DteuiBpn2S4K7n3N4WNC4pe6wEx2xYg==" + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.12.0.tgz", + "integrity": "sha512-2ilQz5/f/o9V7WRWJQmpFYNmQFZ9iM+OXRonZKcYgTkCzjb949Vi4h282PD1UfmgHk666rcWonbRJ++KI41VGw==" }, "is-windows": { "version": "1.0.2", @@ -12500,9 +12523,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "jsdom": { "version": "14.1.0", @@ -13640,158 +13663,159 @@ } }, "jss": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.4.0.tgz", - "integrity": "sha512-l7EwdwhsDishXzqTc3lbsbyZ83tlUl5L/Hb16pHCvZliA9lRDdNBZmHzeJHP0sxqD0t1mrMmMR8XroR12JBYzw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.5.0.tgz", + "integrity": "sha512-B6151NvG+thUg3murLNHRPLxTLwQ13ep4SH5brj4d8qKtogOx/jupnpfkPGSHPqvcwKJaCLctpj2lEk+5yGwMw==", "requires": { "@babel/runtime": "^7.3.1", "csstype": "^3.0.2", + "indefinite-observable": "^2.0.1", "is-in-browser": "^1.1.3", "tiny-warning": "^1.0.2" }, "dependencies": { "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" } } }, "jss-plugin-camel-case": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.4.0.tgz", - "integrity": "sha512-9oDjsQ/AgdBbMyRjc06Kl3P8lDCSEts2vYZiPZfGAxbGCegqE4RnMob3mDaBby5H9vL9gWmyyImhLRWqIkRUCw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.0.tgz", + "integrity": "sha512-GSjPL0adGAkuoqeYiXTgO7PlIrmjv5v8lA6TTBdfxbNYpxADOdGKJgIEkffhlyuIZHlPuuiFYTwUreLUmSn7rg==", "requires": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", - "jss": "10.4.0" + "jss": "10.5.0" } }, "jss-plugin-compose": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-compose/-/jss-plugin-compose-10.4.0.tgz", - "integrity": "sha512-m1MKZQDH/48W2NHqgsfhYBAObVHzDzSCULLLqrc8nZh1fYGvEBUND82oqd6Jh95pJbMhTzx3E9st63MivEuvAw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-compose/-/jss-plugin-compose-10.5.0.tgz", + "integrity": "sha512-A2NPCIq1rH83plRvNyixwKzVdxEeZU81fcc5JV1bThVWLSozis60EWzEM148+d9giyQd5yzxHbf1qwy3mGhfcQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0", + "jss": "10.5.0", "tiny-warning": "^1.0.2" } }, "jss-plugin-default-unit": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.4.0.tgz", - "integrity": "sha512-BYJ+Y3RUYiMEgmlcYMLqwbA49DcSWsGgHpVmEEllTC8MK5iJ7++pT9TnKkKBnNZZxTV75ycyFCR5xeLSOzVm4A==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.0.tgz", + "integrity": "sha512-rsbTtZGCMrbcb9beiDd+TwL991NGmsAgVYH0hATrYJtue9e+LH/Gn4yFD1ENwE+3JzF3A+rPnM2JuD9L/SIIWw==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0" + "jss": "10.5.0" } }, "jss-plugin-expand": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-expand/-/jss-plugin-expand-10.4.0.tgz", - "integrity": "sha512-UiZ6D4Ud2Chg3GIzRGjgs3DLiueN4r+g1TkEgc7L/0J/L9wsvuFKOtkahdHn177+YUK5/+N05mIE9xsgREB4+Q==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-expand/-/jss-plugin-expand-10.5.0.tgz", + "integrity": "sha512-YFgFKt6qBPznv5qNAG/ohIAMKq/FvHWm0MQ7LU7XgYnGIUm/0nLyNEiltIS7EJVTgvOxIuwC6y87esta9KCSrA==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0" + "jss": "10.5.0" } }, "jss-plugin-extend": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-extend/-/jss-plugin-extend-10.4.0.tgz", - "integrity": "sha512-TsgSmvWnpZWvXWpCDHl9Vj/n8wA/Awluutg/dnrfU7rwnM+BKkssHocGai8wQ5mtmIR+lYt+y7zAO+MOeigPiw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-extend/-/jss-plugin-extend-10.5.0.tgz", + "integrity": "sha512-WLldG+qnrFZ1F+29jJM7MlYdiKp6kW+/zJ9RedXEts0LsN5co3THnr3m/Wnuu8MluUz49DCCRr2cDIgakmS+eQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0", + "jss": "10.5.0", "tiny-warning": "^1.0.2" } }, "jss-plugin-global": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.4.0.tgz", - "integrity": "sha512-b8IHMJUmv29cidt3nI4bUI1+Mo5RZE37kqthaFpmxf5K7r2aAegGliAw4hXvA70ca6ckAoXMUl4SN/zxiRcRag==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.5.0.tgz", + "integrity": "sha512-FZd9+JE/3D7HMefEG54fEC0XiQ9rhGtDHAT/ols24y8sKQ1D5KIw6OyXEmIdKFmACgxZV2ARQ5pAUypxkk2IFQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0" + "jss": "10.5.0" } }, "jss-plugin-nested": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.4.0.tgz", - "integrity": "sha512-cKgpeHIxAP0ygeWh+drpLbrxFiak6zzJ2toVRi/NmHbpkNaLjTLgePmOz5+67ln3qzJiPdXXJB1tbOyYKAP4Pw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.5.0.tgz", + "integrity": "sha512-ejPlCLNlEGgx8jmMiDk/zarsCZk+DV0YqXfddpgzbO9Toamo0HweCFuwJ3ZO40UFOfqKwfpKMVH/3HUXgxkTMg==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0", + "jss": "10.5.0", "tiny-warning": "^1.0.2" } }, "jss-plugin-props-sort": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.4.0.tgz", - "integrity": "sha512-j/t0R40/2fp+Nzt6GgHeUFnHVY2kPGF5drUVlgkcwYoHCgtBDOhTTsOfdaQFW6sHWfoQYgnGV4CXdjlPiRrzwA==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.0.tgz", + "integrity": "sha512-kTLRvrOetFKz5vM88FAhLNeJIxfjhCepnvq65G7xsAQ/Wgy7HwO1BS/2wE5mx8iLaAWC6Rj5h16mhMk9sKdZxg==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0" + "jss": "10.5.0" } }, "jss-plugin-rule-value-function": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.4.0.tgz", - "integrity": "sha512-w8504Cdfu66+0SJoLkr6GUQlEb8keHg8ymtJXdVHWh0YvFxDG2l/nS93SI5Gfx0fV29dO6yUugXnKzDFJxrdFQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.0.tgz", + "integrity": "sha512-jXINGr8BSsB13JVuK274oEtk0LoooYSJqTBCGeBu2cG/VJ3+4FPs1gwLgsq24xTgKshtZ+WEQMVL34OprLidRA==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0", + "jss": "10.5.0", "tiny-warning": "^1.0.2" } }, "jss-plugin-rule-value-observable": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.4.0.tgz", - "integrity": "sha512-Utnsvopa2Gg9Z/9rJ5uH0Gl5QRWlnx9Hd+K/rnAc7UyxbIpvTAWMv5hsnuCUbmUSyb9RKJPHlohJNwG8rFownQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.5.0.tgz", + "integrity": "sha512-x4deslR2SjMfG+1ZbVdMyuagJi7SroS7TQZyv3T9F5jjb1T1ZN+B7zZ5GdN5SuVjxN4w2/MTpf4ldoAJt9R6fg==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0", + "jss": "10.5.0", "symbol-observable": "^1.2.0" } }, "jss-plugin-template": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.4.0.tgz", - "integrity": "sha512-bpRu56Dnas1+G/HvB0TdeC2907YujZ8F3pwLls7gNS6oJSYZD3iYbqsJuRVcAkhNINYVdcuW1SCo1aigCI7r/Q==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.5.0.tgz", + "integrity": "sha512-NCRPzsKicVuFSEtqRv4qqtVTdfQeM1SDONU93gXfVG+AB3PRO5GhxaeMxoe8cDDkV+Ku0zmlOOWzSnjsuEIPaQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0", + "jss": "10.5.0", "tiny-warning": "^1.0.2" } }, "jss-plugin-vendor-prefixer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.4.0.tgz", - "integrity": "sha512-DpF+/a+GU8hMh/948sBGnKSNfKkoHg2p9aRFUmyoyxgKjOeH9n74Ht3Yt8lOgdZsuWNJbPrvaa3U4PXKwxVpTQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.0.tgz", + "integrity": "sha512-rux3gmfwDdOKCLDx0IQjTwTm03IfBa+Rm/hs747cOw5Q7O3RaTUIMPKjtVfc31Xr/XI9Abz2XEupk1/oMQ7zRA==", "requires": { "@babel/runtime": "^7.3.1", "css-vendor": "^2.0.8", - "jss": "10.4.0" + "jss": "10.5.0" } }, "jss-preset-default": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-10.4.0.tgz", - "integrity": "sha512-WnmqDtQiK7bcw7yOxoW4iwf2ytVhgJfxqsb9R7V0gYOQi8TuApxs99nXgLVr3XN2HfVwk8hXlc9j50N5imozCQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-10.5.0.tgz", + "integrity": "sha512-0n02VNi6r4x2MqzHrkDQdTuEMU9gR5oTKRtGlYv46IEtS9mH/wxnC4uFBN3ICGZIhuyS4lgWYDC68PAKWlNEnQ==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.4.0", - "jss-plugin-camel-case": "10.4.0", - "jss-plugin-compose": "10.4.0", - "jss-plugin-default-unit": "10.4.0", - "jss-plugin-expand": "10.4.0", - "jss-plugin-extend": "10.4.0", - "jss-plugin-global": "10.4.0", - "jss-plugin-nested": "10.4.0", - "jss-plugin-props-sort": "10.4.0", - "jss-plugin-rule-value-function": "10.4.0", - "jss-plugin-rule-value-observable": "10.4.0", - "jss-plugin-template": "10.4.0", - "jss-plugin-vendor-prefixer": "10.4.0" + "jss": "10.5.0", + "jss-plugin-camel-case": "10.5.0", + "jss-plugin-compose": "10.5.0", + "jss-plugin-default-unit": "10.5.0", + "jss-plugin-expand": "10.5.0", + "jss-plugin-extend": "10.5.0", + "jss-plugin-global": "10.5.0", + "jss-plugin-nested": "10.5.0", + "jss-plugin-props-sort": "10.5.0", + "jss-plugin-rule-value-function": "10.5.0", + "jss-plugin-rule-value-observable": "10.5.0", + "jss-plugin-template": "10.5.0", + "jss-plugin-vendor-prefixer": "10.5.0" } }, "jsx-ast-utils": { @@ -13803,6 +13827,11 @@ "object.assign": "^4.1.0" } }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -13822,9 +13851,9 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, "language-subtag-registry": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", - "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", "dev": true }, "language-tags": { @@ -14120,11 +14149,18 @@ } }, "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "requires": { - "tslib": "^1.10.0" + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } } }, "lowlight": { @@ -14211,12 +14247,19 @@ "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + } } }, "math-expression-evaluator": { - "version": "1.2.22", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz", - "integrity": "sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.3.3.tgz", + "integrity": "sha512-geKTlqoxnjqHoWqB71h0kchWIC23a3yfwwbZu4E2amjvGLF+fTjCCwBQOHkE0/oHc6KdnSVmMt3QB82KaPmKEA==" }, "math-random": { "version": "1.0.4", @@ -14393,11 +14436,11 @@ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" }, "mini-create-react-context": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", - "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", "requires": { - "@babel/runtime": "^7.5.5", + "@babel/runtime": "^7.12.1", "tiny-warning": "^1.0.3" } }, @@ -14538,21 +14581,6 @@ "minimist": "^1.2.5" } }, - "monaco-editor": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.20.0.tgz", - "integrity": "sha512-hkvf4EtPJRMQlPC3UbMoRs0vTAFAYdzFQ+gpMb8A+9znae1c43q8Mab9iVsgTcg/4PNiLGGn3SlDIa8uvK1FIQ==" - }, - "monaco-graphql": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/monaco-graphql/-/monaco-graphql-0.2.0.tgz", - "integrity": "sha512-IwpbJvrNlFxq6xjnQQ8eC72ep+q2vfiUaHBNkfqe314CXYnUCcXYfoMBfR5EuLAXRBOTf4CKl6BCN1/9eHrq7A==", - "requires": { - "graphql-language-service": "^3.0.0", - "graphql-language-service-utils": "^2.4.0", - "monaco-editor": "^0.20.0" - } - }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -14591,9 +14619,9 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", "optional": true }, "nanomatch": { @@ -14657,12 +14685,19 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } } }, "node-fetch": { @@ -14675,9 +14710,9 @@ } }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "node-int64": { "version": "0.4.0", @@ -14762,9 +14797,9 @@ } }, "node-releases": { - "version": "1.1.61", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", - "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==" + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==" }, "normalize-package-data": { "version": "2.5.0", @@ -14891,12 +14926,33 @@ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" }, "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "object-keys": { @@ -14918,14 +14974,14 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.entries": { @@ -15021,9 +15077,9 @@ } }, "open": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-7.2.1.tgz", - "integrity": "sha512-xbYCJib4spUdmcs0g/2mK1nKo/jO2T7INClWd/beL7PFkXRWgr8B23ssDHX/USPn2M2IjDR5UdpYs6I67SnTSA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", + "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -15048,11 +15104,11 @@ } }, "optimism": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.10.3.tgz", - "integrity": "sha512-9A5pqGoQk49H6Vhjb9kPgAeeECfUDF6aIICbMDL23kDLStBn1MWk3YvcZ4xWF9CsSf6XEgvRLkXy4xof/56vVw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.13.1.tgz", + "integrity": "sha512-16RRVYZe8ODcUqpabpY7Gb91vCAbdhn8FHjlUb2Hqnjjow1j8Z1dlppds+yAsLbreNTVylLC+tNX6DuC2vt3Kw==", "requires": { - "@wry/context": "^0.4.0" + "@wry/context": "^0.5.2" } }, "optimize-css-assets-webpack-plugin": { @@ -15191,12 +15247,19 @@ } }, "param-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", - "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "requires": { - "dot-case": "^3.0.3", - "tslib": "^1.10.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } } }, "parent-module": { @@ -15270,12 +15333,19 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } } }, "pascalcase": { @@ -15531,9 +15601,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -15573,9 +15643,9 @@ } }, "postcss-calc": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", - "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "requires": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", @@ -15808,9 +15878,9 @@ } }, "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", "requires": { "postcss": "^7.0.2" } @@ -15852,9 +15922,9 @@ } }, "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "requires": { "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" @@ -16403,13 +16473,14 @@ } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "requires": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } }, "postcss-svgo": { @@ -16476,12 +16547,12 @@ "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==" }, "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "lodash": "^4.17.20", + "renderkid": "^2.0.4" } }, "pretty-format": { @@ -16503,9 +16574,9 @@ } }, "prismjs": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.21.0.tgz", - "integrity": "sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.22.0.tgz", + "integrity": "sha512-lLJ/Wt9yy0AiSYBf212kK3mM5L8ycwlyTlSxHBAneXLR0nzFMlZ5y7riFPF3E33zXOF2IH95xdY5jIyZbM9z/w==", "requires": { "clipboard": "^2.0.0" } @@ -16544,12 +16615,12 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" } }, "prop-types": { @@ -16563,9 +16634,9 @@ } }, "property-information": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz", - "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", "requires": { "xtend": "^4.0.0" } @@ -16655,9 +16726,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.1.tgz", - "integrity": "sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA==", + "version": "6.13.7", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.7.tgz", + "integrity": "sha512-CsGs8ZYb39zu0WLkeOhe0NMePqgYdAuCqxOYKDR5LVCytDZYMGx3Bb+xypvQvPHVPijRXB0HZNFllCzHRe4gEA==", "requires": { "decode-uri-component": "^0.2.0", "split-on-first": "^1.0.0", @@ -16757,9 +16828,9 @@ } }, "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -16767,25 +16838,37 @@ } }, "react-apollo": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-2.5.8.tgz", - "integrity": "sha512-60yOQrnNosxU/tRbOxGDaYNLFcOKmQqxHPhxyvKTlGIaF/rRCXQRKixUgWVffpEupSHHD7psY5k5ZOuZsdsSGQ==", - "requires": { - "apollo-utilities": "^1.3.0", - "fast-json-stable-stringify": "^2.0.0", - "hoist-non-react-statics": "^3.3.0", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.7.2", - "ts-invariant": "^0.4.2", - "tslib": "^1.9.3" - } - }, - "react-apollo-hooks": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/react-apollo-hooks/-/react-apollo-hooks-0.5.0.tgz", - "integrity": "sha512-Us5KqFe7/c6vY1NaiyfhnD2Pz4lPLTojQXLppShaBVYU/vYvJrRjmj4MzIPXnExXaSfnQ+K2bWDr4lP4efbsRQ==", - "requires": { - "lodash": "^4.17.11" + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-3.1.5.tgz", + "integrity": "sha512-xOxMqxORps+WHrUYbjVHPliviomefOpu5Sh35oO3osuOyPTxvrljdfTLGCggMhcXBsDljtS5Oy4g+ijWg3D4JQ==", + "requires": { + "@apollo/react-common": "^3.1.4", + "@apollo/react-components": "^3.1.5", + "@apollo/react-hoc": "^3.1.5", + "@apollo/react-hooks": "^3.1.5", + "@apollo/react-ssr": "^3.1.5" + }, + "dependencies": { + "@apollo/react-components": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@apollo/react-components/-/react-components-3.1.5.tgz", + "integrity": "sha512-c82VyUuE9VBnJB7bnX+3dmwpIPMhyjMwyoSLyQWPHxz8jK4ak30XszJtqFf4eC4hwvvLYa+Ou6X73Q8V8e2/jg==", + "requires": { + "@apollo/react-common": "^3.1.4", + "@apollo/react-hooks": "^3.1.5", + "prop-types": "^15.7.2", + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0" + } + }, + "ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "requires": { + "tslib": "^1.9.3" + } + } } }, "react-app-polyfill": { @@ -17223,9 +17306,9 @@ "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==" }, "react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -17234,9 +17317,19 @@ } }, "react-error-overlay": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", - "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.8.tgz", + "integrity": "sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw==" + }, + "react-event-listener": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz", + "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", + "requires": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + } }, "react-is": { "version": "16.13.1", @@ -17244,17 +17337,17 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-jss": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-10.4.0.tgz", - "integrity": "sha512-q0P6GQrq0bm0ms/l6QpqNaPwPuJpYP5kcCXLSwcOQUnKACXh4NCcEsnqxD56TQmbAhE1p3RhtGD5xoBda1pjwQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-10.5.0.tgz", + "integrity": "sha512-WhID21UxdKC/9Xvl9tFSZTRUcgBqsHwBhSaxB1UEN1Oxu1wNNymov7gWOK/ceba0Gbvm15i0LYdoRGJG460hvg==", "requires": { "@babel/runtime": "^7.3.1", "@emotion/is-prop-valid": "^0.7.3", - "css-jss": "10.4.0", + "css-jss": "10.5.0", "hoist-non-react-statics": "^3.2.0", "is-in-browser": "^1.1.3", - "jss": "10.4.0", - "jss-preset-default": "10.4.0", + "jss": "10.5.0", + "jss-preset-default": "10.5.0", "prop-types": "^15.6.0", "shallow-equal": "^1.2.0", "theming": "^3.3.0", @@ -17266,6 +17359,14 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "react-loading-skeleton": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-2.1.1.tgz", + "integrity": "sha512-+fGvgG9ieUw4D5QVgpqJkJ75jhzUdz96GRsA0HjTlR0Mpj9DJUEFc0AKELs7ZkqWVH8/DiroaaufSrOPld1kGA==", + "requires": { + "@emotion/core": "^10.0.22" + } + }, "react-motion": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", @@ -17284,15 +17385,15 @@ } }, "react-redux": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.1.tgz", - "integrity": "sha512-T+VfD/bvgGTUA74iW9d2i5THrDQWbweXP0AVNI8tNd1Rk5ch1rnMiJkDD67ejw7YBKM4+REvcvqRuWJb7BLuEg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.2.tgz", + "integrity": "sha512-8+CQ1EvIVFkYL/vu6Olo7JFLWop1qRUeb46sGtIMDCSpgwPQq8fPLpirIB0iTqFe9XYEFPHssdX8/UwN6pAkEA==", "requires": { - "@babel/runtime": "^7.5.5", - "hoist-non-react-statics": "^3.3.0", + "@babel/runtime": "^7.12.1", + "hoist-non-react-statics": "^3.3.2", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", - "react-is": "^16.9.0" + "react-is": "^16.13.1" } }, "react-resize-detector": { @@ -17541,9 +17642,9 @@ } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "ansi-regex": { "version": "4.1.0", @@ -17794,6 +17895,37 @@ "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + } + } + }, "cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", @@ -17849,9 +17981,9 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.1.tgz", + "integrity": "sha512-9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+obg==" }, "cosmiconfig": { "version": "6.0.0", @@ -18136,10 +18268,11 @@ } }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } } @@ -18337,6 +18470,25 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -18356,9 +18508,9 @@ } }, "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==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -18415,11 +18567,24 @@ "kind-of": "^6.0.2" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -19399,6 +19564,85 @@ } } }, + "react-swipeable-views": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/react-swipeable-views/-/react-swipeable-views-0.13.9.tgz", + "integrity": "sha512-WXC2FKYvZ9QdJ31v9LjEJEl1bA7E4AcaloTkbW0uU0dYf5uvv4aOpiyxubvOkVl1a5L2UAHmKSif4TmJ9usrSg==", + "requires": { + "@babel/runtime": "7.0.0", + "prop-types": "^15.5.4", + "react-swipeable-views-core": "^0.13.7", + "react-swipeable-views-utils": "^0.13.9", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, + "react-swipeable-views-core": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/react-swipeable-views-core/-/react-swipeable-views-core-0.13.7.tgz", + "integrity": "sha512-ekn9oDYfBt0oqJSGGwLEhKvn+QaqMGTy//9dURTLf+vp7W5j6GvmKryYdnwJCDITaPFI2hujXV4CH9krhvaE5w==", + "requires": { + "@babel/runtime": "7.0.0", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, + "react-swipeable-views-utils": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.9.tgz", + "integrity": "sha512-QLGxRKrbJCbWz94vkWLzb1Daaa2Y/TZKmsNKQ6WSNrS+chrlfZ3z9tqZ7YUJlW6pRWp3QZdLSY3UE3cN0TXXmw==", + "requires": { + "@babel/runtime": "7.0.0", + "keycode": "^2.1.7", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.0", + "react-swipeable-views-core": "^0.13.7", + "shallow-equal": "^1.2.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, "react-syntax-highlighter": { "version": "10.3.5", "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-10.3.5.tgz", @@ -19412,9 +19656,9 @@ } }, "react-to-print": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/react-to-print/-/react-to-print-2.10.0.tgz", - "integrity": "sha512-1xCUHGiNkgl2H7xtzyo0KsJHO3B51vuZumwHYYOatT4eQklkAswJDJREOUcGRAm8XO/J0+k3p6v0mNs2Vr6fWA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/react-to-print/-/react-to-print-2.12.1.tgz", + "integrity": "sha512-+zGNUYQKaae7Wp0JL2JcoWM0lDd5csasRmTqRZlJLOj6F4sRmJsT7ZPgH0SL6ZQ7gWz0hwglhLlLoyF85lGgHw==", "requires": { "prop-types": "^15.7.2" } @@ -19970,9 +20214,9 @@ } }, "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "8.2.0", @@ -20032,9 +20276,9 @@ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", @@ -20075,15 +20319,15 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.4.tgz", + "integrity": "sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==", "requires": { "css-select": "^1.1.0", "dom-converter": "^0.2", "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" }, "dependencies": { "css-select": { @@ -20787,11 +21031,11 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { @@ -21021,20 +21265,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", + "is-callable": "^1.2.2", "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -21313,9 +21557,9 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==" }, "spdy": { "version": "4.0.2", @@ -21403,9 +21647,19 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.3.tgz", + "integrity": "sha512-WldO+YmqhEpjp23eHZRhOT1NQF51STsbxZ+/AdpFD+EhheFxAe5d0WoK4DQVJkSHacPrJJX3OqRAl9CgHf78pg==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } }, "static-extend": { "version": "0.1.2", @@ -21539,21 +21793,63 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string_decoder": { @@ -21680,26 +21976,6 @@ } } }, - "styled-system": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/styled-system/-/styled-system-5.1.5.tgz", - "integrity": "sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A==", - "requires": { - "@styled-system/background": "^5.1.2", - "@styled-system/border": "^5.1.5", - "@styled-system/color": "^5.1.2", - "@styled-system/core": "^5.1.2", - "@styled-system/flexbox": "^5.1.2", - "@styled-system/grid": "^5.1.2", - "@styled-system/layout": "^5.1.2", - "@styled-system/position": "^5.1.2", - "@styled-system/shadow": "^5.1.2", - "@styled-system/space": "^5.1.2", - "@styled-system/typography": "^5.1.2", - "@styled-system/variant": "^5.1.5", - "object-assign": "^4.1.1" - } - }, "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", @@ -21976,19 +22252,6 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, - "theme-ui": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/theme-ui/-/theme-ui-0.3.1.tgz", - "integrity": "sha512-My/TSALqp7Dst5Ez7nJA+94Q8zJhc26Z0qGo8kEWyoqHHJ5TU8xdhjLPBltTdQck3T32cSq5USIeSKU3JtxYUQ==", - "requires": { - "@theme-ui/color-modes": "^0.3.1", - "@theme-ui/components": "^0.3.1", - "@theme-ui/core": "^0.3.1", - "@theme-ui/css": "^0.3.1", - "@theme-ui/mdx": "^0.3.0", - "@theme-ui/theme-provider": "^0.3.1" - } - }, "theming": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/theming/-/theming-3.3.0.tgz", @@ -22025,9 +22288,9 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "requires": { "setimmediate": "^1.0.4" } @@ -22054,9 +22317,9 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" }, "tmp": { "version": "0.0.33", @@ -22165,10 +22428,12 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, "ts-invariant": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", - "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.6.0.tgz", + "integrity": "sha512-caoafsfgb8QxdrKzFfjKt627m4i8KTtfAiji0DYJfWI4A/S9ORNNpzYuD9br64kyKFgxn9UNaLLbSupam84mCA==", "requires": { + "@types/ungap__global-this": "^0.3.1", + "@ungap/global-this": "^0.4.2", "tslib": "^1.9.3" } }, @@ -22207,9 +22472,9 @@ } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsutils": { "version": "3.17.1", @@ -22269,10 +22534,15 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==" + }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==" }, "uc.micro": { "version": "1.0.6", @@ -22534,9 +22804,9 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -22613,89 +22883,118 @@ "makeerror": "1.0.x" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "optional": true }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "optional": true, "requires": { - "fill-range": "^7.0.1" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" } }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "optional": true, "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "optional": true, "requires": { - "to-regex-range": "^5.0.1" + "is-extendable": "^0.1.0" } }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "optional": true, "requires": { - "is-glob": "^4.0.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" } }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "optional": true, "requires": { - "binary-extensions": "^2.0.0" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } }, "is-extglob": { @@ -22714,46 +23013,22 @@ } }, "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "optional": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "optional": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "optional": true, - "requires": { - "is-number": "^7.0.0" - } } } }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "optional": true, - "requires": { - "chokidar": "^2.1.8" - } - }, "wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", @@ -23290,11 +23565,116 @@ "yargs": "^13.3.2" }, "dependencies": { + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -23405,9 +23785,9 @@ } }, "whatwg-fetch": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz", - "integrity": "sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz", + "integrity": "sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A==" }, "whatwg-mimetype": { "version": "2.3.0", @@ -23872,11 +24252,11 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "xregexp": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", - "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.4.1.tgz", + "integrity": "sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==", "requires": { - "@babel/runtime-corejs3": "^7.8.3" + "@babel/runtime-corejs3": "^7.12.1" } }, "xtend": { @@ -24007,15 +24387,6 @@ "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" - }, - "zen-observable-ts": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", - "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", - "requires": { - "tslib": "^1.9.3", - "zen-observable": "^0.8.0" - } } } } diff --git a/package.json b/package.json index 8f65dc819..b97b290e2 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,12 @@ "name": "bento-frontend", "version": "0.1.0", "dependencies": { + "@apollo/client": "^3.3.4", + "@apollo/react-components": "^4.0.0", "@babel/core": "7.2.2", "@material-ui/core": "^4.10.0", "@material-ui/icons": "^4.9.1", "@svgr/webpack": "4.1.0", - "apollo-boost": "^0.4.3", "axios": "^0.19.1", "babel-core": "7.0.0-bridge.0", "babel-eslint": "^9.0.0", @@ -15,7 +16,7 @@ "babel-loader": "8.0.5", "babel-plugin-named-asset-import": "^0.3.4", "babel-preset-react-app": "^7.0.1", - "bento-components": "^0.1.32", + "bento-components": "^0.1.45", "bfj": "6.1.1", "case-sensitive-paths-webpack-plugin": "2.2.0", "classnames": "^2.2.6", @@ -30,7 +31,7 @@ "fork-ts-checker-webpack-plugin-alt": "0.4.14", "fs-extra": "7.0.1", "graphiql": "^1.0.3", - "graphql": "^14.4.2", + "graphql": "^14.7.0", "graphql-tag": "^2.11.0", "html-webpack-plugin": "4.0.0-alpha.2", "identity-obj-proxy": "3.0.0", @@ -51,15 +52,16 @@ "postcss-safe-parser": "4.0.1", "query-string": "^6.8.3", "react": "^16.8.2", - "react-apollo": "^2.5.8", - "react-apollo-hooks": "^0.5.0", + "react-apollo": "^3.1.5", "react-app-polyfill": "^0.2.1", "react-dev-utils": "^7.0.3", "react-dom": "^16.8.2", + "react-loading-skeleton": "^2.1.1", "react-redux": "^7.2.1", "react-router": "^5.1.2", "react-router-dom": "^5.1.2", "react-scroll": "^1.7.16", + "react-swipeable-views": "^0.13.9", "react-syntax-highlighter": "^10.2.0", "react-toastify": "^4.5.2", "react-uuid": "^1.0.2", diff --git a/public/index.html b/public/index.html index 25e97912a..3e1ad0b6b 100644 --- a/public/index.html +++ b/public/index.html @@ -25,6 +25,12 @@ Ideal size: 32x32 px. --> + + + + + + +Group +Created with Sketch. + + + + + diff --git a/src/bento/armDetailData.js b/src/bento/armDetailData.js index 360a6afb7..796119565 100644 --- a/src/bento/armDetailData.js +++ b/src/bento/armDetailData.js @@ -1,4 +1,11 @@ import gql from 'graphql-tag'; +import { FileOnRowsSelect } from '../utils/fileTable'; + +// --------------- Tooltip configuration -------------- +export const tooltipContent = { + src: 'https://raw.githubusercontent.com/google/material-design-icons/master/src/action/help/materialicons/24px.svg', + alt: 'tooltipIcon', +}; // -------------- Case ID area configurations -------------- const header = { @@ -41,11 +48,16 @@ const subsections = [ }, ]; -// --------------- File table configuration -------------- +// Ideal size for externalLinkIcon is 16x16 px +export const externalLinkIcon = { + src: 'https://raw.githubusercontent.com/CBIIT/bento-frontend/master/src/assets/program/externalLinkIcon.svg', + alt: 'External link icon', +}; +// --------------- File table configuration -------------- const table = { // Set 'display' to false to hide the table entirely - display: false, + display: true, // Table title title: 'ASSOCIATED FILES', // Field name for files data, need to be updated only when using a different GraphQL query @@ -54,7 +66,29 @@ const table = { defaultSortField: 'file_name', // 'asc' or 'desc' defaultSortDirection: 'asc', - // A maximum of 10 columns are allowed + // Set 'selectableRows' to true to show the row selection + selectableRows: true, + tooltipMessage: 'Click button to add selected files.', + helpMessage: 'Here help message', + // Text to appear on Add to cart button + buttonText: 'Add Selected Files', + saveButtonDefaultStyle: { + color: '#fff', + backgroundColor: '#09A175', + opacity: '1', + border: '0px', + cursor: 'pointer', + }, + ActiveSaveButtonDefaultStyle: { + disabled: 'true', + opacity: '0.3', + cursor: 'auto', + }, + DeactiveSaveButtonDefaultStyle: { + cursor: 'pointer', + opacity: 'unset', + border: 'unset', + }, columns: [ { dataField: 'file_name', @@ -64,10 +98,6 @@ const table = { dataField: 'file_type', header: 'File Type', }, - { - dataField: 'association', - header: 'Association', - }, { dataField: 'file_description', header: 'Description', @@ -83,6 +113,9 @@ const table = { formatBytes: true, }, ], + // Util Functions + // Custom function on selct checkbox is selected. + customOnRowsSelect: FileOnRowsSelect, }; // --------------- GraphQL query configuration -------------- diff --git a/src/bento/caseDetailData.js b/src/bento/caseDetailData.js index 2eea6f1a8..203a4780c 100644 --- a/src/bento/caseDetailData.js +++ b/src/bento/caseDetailData.js @@ -1,4 +1,12 @@ import gql from 'graphql-tag'; +import { FileOnRowsSelect } from '../utils/fileTable'; +import { SampleOnRowsSelect } from '../utils/sampleFileTable'; + +// --------------- Tooltip configuration -------------- +export const tooltipContent = { + src: 'https://raw.githubusercontent.com/google/material-design-icons/master/src/action/help/materialicons/24px.svg', + alt: 'tooltipIcon', +}; // -------------- Case ID area configurations -------------- const caseHeader = { @@ -174,19 +182,138 @@ const rightPanel = [ }, ]; -// --------------- File table configuration -------------- +// --------------- Dahboard Table external link configuration -------------- +// Ideal size for externalLinkIcon is 16x16 px +export const externalLinkIcon = { + src: 'https://raw.githubusercontent.com/CBIIT/bento-frontend/master/src/assets/program/externalLinkIcon.svg', + alt: 'External link icon', +}; + +// --------------- Table 1 configuration -------------- +const table1 = { + // Set 'display' to false to hide the table entirely + display: true, + // Table title + tableTitle: 'ASSOCIATED SAMPLES', + // Field name for files data, need to be updated only when using a different GraphQL query + subjectDetailField: 'samples', + // Value must be one of the 'dataField's in fileTableColumns + defaultSortField: 'sample_id', + // 'asc' or 'desc' + defaultSortDirection: 'asc', + // Text to appear on Add to cart button + buttonText: 'Add Selected Files', + saveButtonDefaultStyle: { + color: '#fff', + backgroundColor: '#09A175', + opacity: '1', + border: '0px', + cursor: 'pointer', + }, + ActiveSaveButtonDefaultStyle: { + disabled: 'true', + opacity: '0.3', + cursor: 'auto', + }, + DeactiveSaveButtonDefaultStyle: { + cursor: 'pointer', + opacity: 'unset', + border: 'unset', + }, + // Help Icon Message + tooltipMessage: 'Click button to add selected files associated with the selected sample(s).', + helpMessage: 'Here help message', + // showHideColumns 'true' or 'false' + showHideColumns: true, + // download csv + download: false, + // downloaded File Name + downloadFileName: 'Bento_case_files_download', + // Set 'selectableRows' to true to show the row selection + selectableRows: true, + // A maximum of 10 columns are allowed + columns: [ + { + dataField: 'sample_id', + header: 'Sample ID', + sort: 'asc', + primary: true, + display: true, + }, + { + dataField: 'disease_subtype', + header: 'Diagnosis', + dataFromRoot: true, + }, + { + dataField: 'tissue_type', + header: 'Tissue Type', + }, + { + dataField: 'composition', + header: 'Tissue Composition', + }, + { + dataField: 'sample_anatomic_site', + header: 'Sample Anatomic Site', + }, + { + dataField: 'method_of_sample_procurement', + header: 'Sample Procurement Method', + }, + { + dataField: 'test_name', + header: 'Platform', + dataFromRoot: true, + }, + ], + // Util Functions + // Custom function on selct checkbox is selected. + customOnRowsSelect: SampleOnRowsSelect, +}; -const table = { +// --------------- Table 2 configuration -------------- +const table2 = { // Set 'display' to false to hide the table entirely display: true, // Table title - title: 'ASSOCIATED FILES', + tableTitle: 'ASSOCIATED FILES', // Field name for files data, need to be updated only when using a different GraphQL query - filesField: 'files', + subjectDetailField: 'files', // Value must be one of the 'dataField's in fileTableColumns defaultSortField: 'file_name', // 'asc' or 'desc' defaultSortDirection: 'asc', + // Text to appear on Add to cart button + buttonText: 'Add Selected Files', + saveButtonDefaultStyle: { + color: '#fff', + backgroundColor: '#09A175', + opacity: '1', + border: '0px', + cursor: 'pointer', + }, + ActiveSaveButtonDefaultStyle: { + disabled: 'true', + opacity: '0.3', + cursor: 'auto', + }, + DeactiveSaveButtonDefaultStyle: { + cursor: 'pointer', + opacity: 'unset', + border: 'unset', + }, + // Help Icon Message + tooltipMessage: 'Click button to add selected files.', + helpMessage: 'Here help message', + // showHideColumns 'true' or 'false' + showHideColumns: true, + // download csv 'true' or 'false' + download: false, + // downloaded File Name + downloadFileName: 'Bento_case_samples_download', + // Set 'selectableRows' to true to show the row selection + selectableRows: true, // A maximum of 10 columns are allowed columns: [ { @@ -216,17 +343,23 @@ const table = { formatBytes: true, }, ], + // Util Functions + // Custom function on selct checkbox is selected. + customOnRowsSelect: FileOnRowsSelect, }; // --------------- GraphQL query configuration -------------- // query name, also used as root of returned data const dataRoot = 'subjectDetail'; +// query name, also used as key for files to Samples Mapping. +const filesOfSamples = 'samplesForSubjectId'; // Primary ID field used to query a case const caseIDField = 'subject_id'; + // GraphQL query to retrieve detailed info for a case const GET_CASE_DETAIL_DATA_QUERY = gql` - query subjectDetail($subject_id: String) { + query subjectDetail($subject_id: String!) { subjectDetail(subject_id: $subject_id) { subject_id program_acronym @@ -259,6 +392,7 @@ const GET_CASE_DETAIL_DATA_QUERY = gql` first_recurrence_type days_to_progression days_to_recurrence + test_name files { subject_id file_name @@ -270,9 +404,24 @@ const GET_CASE_DETAIL_DATA_QUERY = gql` file_id md5sum } + samples { + sample_id + sample_anatomic_site + composition + method_of_sample_procurement + tissue_type + sample_type + } num_samples num_lab_procedures } + samplesForSubjectId(subject_id: $subject_id) { + sample_id + files { + file_id + file_name + } + } } `; @@ -280,8 +429,10 @@ export { caseHeader, dataRoot, caseIDField, + filesOfSamples, leftPanel, rightPanel, - table, + table1, + table2, GET_CASE_DETAIL_DATA_QUERY, }; diff --git a/src/bento/dashboardData.js b/src/bento/dashboardData.js index 13f171e76..2852b869b 100644 --- a/src/bento/dashboardData.js +++ b/src/bento/dashboardData.js @@ -4,43 +4,68 @@ import gql from 'graphql-tag'; // A maximum of 12 facetSearchData are allowed export const facetSearchData = [ { - label: 'Program', field: 'group', api: 'subjectCountByProgram', datafield: 'program', show: true, + label: 'Program', field: 'group', api: 'subjectCountByProgram', datafield: 'programs', section: 'Filter By Cases', show: true, }, { - label: 'Arm', field: 'group', api: 'subjectCountByStudy', datafield: 'study_info', show: true, + label: 'Arm', field: 'group', api: 'subjectCountByStudy', datafield: 'studies', section: 'Filter By Cases', show: true, }, { - label: 'Diagnosis', field: 'group', api: 'subjectCountByDiagnoses', datafield: 'diagnosis', show: true, + label: 'Diagnosis', field: 'group', api: 'subjectCountByDiagnoses', datafield: 'diagnoses', section: 'Filter By Cases', show: true, }, { - label: 'Recurrence Score', field: 'group', api: 'subjectCountByRecurrenceScore', datafield: 'recurrence_score', show: true, + label: 'Recurrence Score', field: 'group', api: 'subjectCountByRecurrenceScore', datafield: 'rc_scores', section: 'Filter By Cases', show: true, }, { - label: 'Tumor Size', field: 'group', api: 'subjectCountByTumorSize', datafield: 'tumor_size', show: true, + label: 'Tumor Size', field: 'group', api: 'subjectCountByTumorSize', datafield: 'tumor_sizes', section: 'Filter By Cases', show: true, }, { - label: 'Chemotherapy Regimen', field: 'group', api: 'subjectCountByChemotherapyRegimen', datafield: 'chemotherapy', show: true, + label: 'Chemotherapy', field: 'group', api: 'subjectCountByChemotherapyRegimen', datafield: 'chemo_regimen', section: 'Filter By Cases', show: true, }, { - label: 'Tumor Grade', field: 'group', api: 'subjectCountByTumorGrade', datafield: 'tumor_grade', show: true, + label: 'Tumor Grade', field: 'group', api: 'subjectCountByTumorGrade', datafield: 'tumor_grades', section: 'Filter By Cases', show: true, }, { - label: 'ER Status', field: 'group', api: 'subjectCountByErStatus', datafield: 'er_status', show: true, + label: 'ER Status', field: 'group', api: 'subjectCountByErStatus', datafield: 'er_status', section: 'Filter By Cases', show: true, }, { - label: 'PR Status', field: 'group', api: 'subjectCountByPrStatus', datafield: 'pr_status', show: true, + label: 'PR Status', field: 'group', api: 'subjectCountByPrStatus', datafield: 'pr_status', section: 'Filter By Cases', show: true, }, { - label: 'Chemotherapy', field: 'group', api: 'subjectCountByChemotherapyRegimen', datafield: 'chemotherapy', show: true, + label: 'Endocrine Therapy', field: 'group', api: 'subjectCountByEndocrineTherapy', datafield: 'endo_therapies', section: 'Filter By Cases', show: true, }, { - label: 'Endocrine Therapy', field: 'group', api: 'subjectCountByEndocrineTherapy', datafield: 'endocrine_therapy', show: true, + label: 'Menopause Status', field: 'group', api: 'subjectCountByMenopauseStatus', datafield: 'meno_status', section: 'Filter By Cases', show: true, }, { - label: 'Menopause Status', field: 'group', api: 'subjectCountByMenopauseStatus', datafield: 'menopause_status', show: true, + label: 'Tissue Type', field: 'group', api: 'subjectCountByTissueType', datafield: 'tissue_type', section: 'Filter By Samples', show: true, + }, + { + label: 'Tissue Composition', field: 'group', api: 'subjectCountByTissueComposition', datafield: 'composition', section: 'Filter By Samples', show: true, + }, + { + label: 'File Association', field: 'group', api: 'subjectCountByFileAssociation', datafield: 'association', section: 'Filter By Files', show: true, + }, + { + label: 'File Type', field: 'group', api: 'subjectCountByFileType', datafield: 'file_type', section: 'Filter By Files', show: true, }, ]; +// --------------- Dashboard Sidebar Sections styling -------------- +export const facetSectionStyling = { + 'Filter By Cases': { + color: '#10A075', + height: '5px', + }, + 'Filter By Samples': { + color: '#10BEFF', + height: '5px', + }, + 'Filter By Files': { + color: '#E636E4', + height: '5px', + }, +}; + // --------------- Dashboard Widgets configuration -------------- // A maximum of 6 widgets are allowed export const widgetsData = [ @@ -230,6 +255,22 @@ export const GET_DASHBOARD_DATA_QUERY = gql`{ group subjects } + subjectCountByFileType{ + group + subjects +} +subjectCountByFileAssociation { + group + subjects +} +subjectCountByTissueComposition{ + group + subjects +} +subjectCountByTissueType{ + group + subjects +} armsByPrograms { program caseSize diff --git a/src/bento/dashboardTabData.js b/src/bento/dashboardTabData.js new file mode 100644 index 000000000..bbbfe03e2 --- /dev/null +++ b/src/bento/dashboardTabData.js @@ -0,0 +1,868 @@ +import gql from 'graphql-tag'; + +// --------------- Tooltip configuration -------------- +export const tooltipContent = { + icon: 'https://raw.githubusercontent.com/google/material-design-icons/master/src/action/help/materialicons/24px.svg', + alt: 'tooltipIcon', + 0: 'Click button to add selected files associated with the selected case(s).', + 1: 'Click button to add selected files associated with the selected sample(s).', + 2: 'Click button to add selected files.', +}; + +// --------------- Dahboard Table external link configuration -------------- +// Ideal size for externalLinkIcon is 16x16 px +export const externalLinkIcon = { + src: 'https://raw.githubusercontent.com/CBIIT/bento-frontend/master/src/assets/program/externalLinkIcon.svg', + alt: 'External link icon', +}; + +// --------------- Tabs Table configuration -------------- +export const tabContainers = [ + { + + name: 'Cases', + dataField: 'dataCase', + api: 'GET_CASES_OVERVIEW_QUERY', + paginationAPIField: 'subjectOverViewPaged', + paginationAPIFieldDesc: 'subjectOverViewPagedDesc', + count: 'numberOfSubjects', + dataKey: 'subject_id', + defaultSortField: 'subject_id', + defaultSortDirection: 'asc', + buttonText: 'Add Selected Files', + saveButtonDefaultStyle: { + color: '#fff', + backgroundColor: '#09A175', + opacity: '1', + border: '0px', + cursor: 'pointer', + }, + ActiveSaveButtonDefaultStyle: { + cursor: 'pointer', + opacity: 'unset', + border: 'unset', + }, + DeactiveSaveButtonDefaultStyle: { + opacity: '0.3', + cursor: 'auto', + }, + columns: [ + { + dataField: 'subject_id', + header: 'Case ID', + sort: 'asc', + link: '/case/{subject_id}', + primary: true, + display: true, + }, + { + dataField: 'program', + header: 'Program Code', + sort: 'asc', + link: '/program/{program_id}', + display: true, + }, + { + dataField: 'program_id', + header: 'Program ID', + sort: 'asc', + display: true, + }, + { + dataField: 'study_acronym', + header: 'Arm', + sort: 'asc', + link: '/arm/{study_acronym}', + display: true, + }, + { + dataField: 'diagnosis', + header: 'Diagnosis', + sort: 'asc', + display: true, + }, + { + dataField: 'recurrence_score', + header: 'Recurrence Score', + sort: 'asc', + display: true, + }, + { + dataField: 'tumor_size', + header: 'Tumor Size (cm)', + sort: 'asc', + display: true, + }, + { + dataField: 'er_status', + header: 'ER Status', + sort: 'asc', + display: true, + }, + { + dataField: 'pr_status', + header: 'PR Status', + sort: 'asc', + display: true, + }, + { + dataField: 'age_at_index', + header: 'Age (years)', + sort: 'asc', + display: true, + }, + { + dataField: 'survival_time', + header: 'Survival (days)', + sort: 'asc', + display: true, + }, + ], + id: 'case_tab', + onRowsSelect: 'type1', + disableRowSelection: 'type1', + tableID: 'case_tab_table', + selectableRows: true, + tabIndex: '0', + downloadFileName: 'Bento_Dashboard_cases_download', + headerPagination: true, + footerPagination: true, + }, + { + name: 'Samples', + dataField: 'dataSample', + api: 'GET_SAMPLES_OVERVIEW_QUERY', + count: 'numberOfSamples', + paginationAPIField: 'sampleOverview', + paginationAPIFieldDesc: 'sampleOverviewDesc', + dataKey: 'sample_id', + saveButtonDefaultStyle: { + color: '#fff', + backgroundColor: '#00AEEF', + opacity: '1', + border: '0px', + cursor: 'pointer', + }, + DeactiveSaveButtonDefaultStyle: { + opacity: '0.3', + cursor: 'auto', + }, + ActiveSaveButtonDefaultStyle: { + cursor: 'pointer', + opacity: 'unset', + border: 'unset', + }, + + columns: [ + { + dataField: 'sample_id', + header: 'Sample ID', + sort: 'asc', + primary: true, + display: true, + }, + { + dataField: 'subject_id', + header: 'Case ID', + sort: 'asc', + link: '/case/{subject_id}', + display: true, + }, + { + dataField: 'program', + header: 'Program Code', + sort: 'asc', + link: '/program/{program_id}', + display: true, + }, + { + dataField: 'program_id', + header: 'Program ID', + sort: 'asc', + display: false, + }, + { + dataField: 'arm', + header: 'Arm', + sort: 'asc', + link: '/arm/{arm}', + display: true, + }, + { + dataField: 'diagnosis', + header: 'Diagnosis', + sort: 'asc', + display: true, + }, + { + dataField: 'tissue_type', + header: 'Tissue Type', + sort: 'asc', + display: true, + }, + { + dataField: 'tumor_size', + header: 'Tumor Size (cm)', + sort: 'asc', + display: true, + }, + { + dataField: 'tissue_composition', + header: 'Tissue Composition', + sort: 'asc', + display: true, + }, + { + dataField: 'sample_anatomic_site', + header: 'Sample Anatomic Site', + sort: 'asc', + display: true, + }, + { + dataField: 'sample_procurement_method', + header: 'Sample Procurement Method', + sort: 'asc', + display: true, + }, + { + dataField: 'platform', + header: 'platform', + sort: 'asc', + display: true, + }, + ], + id: 'sample_tab', + onRowsSelect: 'type3', + disableRowSelection: 'type2', + buttonText: 'Add Selected Files', + tableID: 'sample_tab_table', + selectableRows: true, + tabIndex: '1', + downloadFileName: 'Bento_Dashboard_cases_download', + headerPagination: true, + footerPagination: true, + }, + { + name: 'Files', + dataField: 'dataFile', + api: 'GET_FILES_OVERVIEW_QUERY', + paginationAPIField: 'fileOverview', + paginationAPIFieldDesc: 'fileOverviewDesc', + defaultSortField: 'file_name', + defaultSortDirection: 'asc', + count: 'numberOfFiles', + buttonText: 'Add Selected Files', + dataKey: 'file_id', + saveButtonDefaultStyle: { + color: '#fff', + backgroundColor: '#DC2FDA', + opacity: '1', + border: '0px', + cursor: 'pointer', + }, + DeactiveSaveButtonDefaultStyle: { + opacity: '0.3', + cursor: 'auto', + }, + ActiveSaveButtonDefaultStyle: { + cursor: 'pointer', + opacity: 'unset', + border: 'unset', + }, + columns: [ + { + dataField: 'file_name', + header: 'File Name', + sort: 'asc', + primary: true, + display: true, + }, + { + dataField: 'file_id', + header: 'File ID', + sort: 'asc', + display: false, + }, + { + dataField: 'association', + header: 'Association', + sort: 'asc', + display: true, + }, + { + dataField: 'file_description', + header: 'Description', + sort: 'asc', + display: true, + }, + { + dataField: 'file_format', + header: 'File Format', + sort: 'asc', + display: true, + }, + { + dataField: 'file_size', + header: 'Size', + sort: 'asc', + display: true, + formatBytes: true, + }, + { + dataField: 'program', + header: 'Program Code', + sort: 'asc', + link: '/program/{program_id}', + display: true, + }, + { + dataField: 'program_id', + header: 'Program ID', + sort: 'asc', + display: false, + }, + { + dataField: 'arm', + header: 'Arm', + sort: 'asc', + link: '/arm/{arm}', + display: true, + }, + { + dataField: 'subject_id', + header: 'Case ID', + sort: 'asc', + link: '/case/{subject_id}', + display: true, + }, + { + dataField: 'sample_id', + header: 'Sample ID', + sort: 'asc', + display: true, + }, + { + dataField: 'diagnosis', + header: 'Diagnosis', + sort: 'asc', + display: true, + }, + ], + id: 'file_tab', + onRowsSelect: 'type2', + disableRowSelection: 'type3', + tableID: 'file_tab_table', + selectableRows: true, + + tabIndex: '2', + downloadFileName: 'Bento_Dashboard_cases_download', + headerPagination: true, + footerPagination: true, + }, +]; + +// --------------- Tabs Header Data configuration -------------- +export const tabs = [ + { + id: 'case_tab', + title: 'Cases', + dataField: 'dataCase', + count: 'numberOfSubjects', + }, + { + id: 'sample_tab', + title: 'Samples', + dataField: 'dataSample', + count: 'numberOfSamples', + }, + { + id: 'file_tab', + title: 'Files', + dataField: 'dataFile', + count: 'numberOfFiles', + }, +]; + +// --------------- Tabs Header Style configuration -------------- +export const tabIndex = [ + { + title: 'Cases', + primaryColor: '#D6F2EA', + secondaryColor: '#FFDFB8', + selectedColor: '#10A075', + }, + { + title: 'Samples', + primaryColor: '#CFEDF9', + secondaryColor: '#C9F1F1', + selectedColor: '#0DAFEC', + }, + { + title: 'Files', + primaryColor: '#F7D7F7', + secondaryColor: '#86D6F0', + selectedColor: '#C92EC7', + }, +]; + +export const DASHBOARD_QUERY = gql`{ + numberOfPrograms + numberOfStudies + numberOfSubjects + numberOfSamples + numberOfLabProcedures + numberOfFiles + subjectCountByProgram{ + group + subjects + } + subjectCountByStudy{ + group + subjects + } + subjectCountByDiagnoses{ + group + subjects + } + subjectCountByRecurrenceScore{ + group + subjects + } + subjectCountByTumorSize{ + group + subjects + } + subjectCountByChemotherapyRegimen{ + group + subjects + } + subjectCountByTumorGrade{ + group + subjects + } + subjectCountByErStatus{ + group + subjects + } + subjectCountByPrStatus{ + group + subjects + } + subjectCountByMenopauseStatus{ + group + subjects + } + subjectCountByChemotherapyRegimen{ + group + subjects + } + subjectCountByEndocrineTherapy{ + group + subjects + } + subjectCountByFileType{ + group + subjects + } + subjectCountByFileAssociation { + group + subjects + } + subjectCountByTissueComposition{ + group + subjects + } + subjectCountByTissueType{ + group + subjects + } + armsByPrograms { + program + caseSize + children { + arm + caseSize + size + } + } + + subjectOverViewPaged(first: 10) { + subject_id + program_id + study_info + samples + program + study_acronym + diagnosis + recurrence_score + tumor_size + tumor_grade + er_status + pr_status + chemotherapy + endocrine_therapy + menopause_status + age_at_index + survival_time + lab_procedures + files{ + file_id + } + } + sampleOverview(first: 10) { + sample_id + subject_id + program + program_id + arm + diagnosis + tissue_type + tissue_composition + sample_anatomic_site + sample_procurement_method + platform + files +} +fileOverview(first: 10) { + file_id + file_name + association + file_description + file_format + file_size + program + program_id + arm + subject_id + sample_id + diagnosis +} + }`; + +export const FILTER_GROUP_QUERY = gql` + query groupCounts($subject_ids: [String]){ + subjectCountByProgram(subject_ids: $subject_ids) { + group + subjects + } + subjectCountByStudy(subject_ids: $subject_ids) { + group + subjects + } + subjectCountByDiagnoses (subject_ids: $subject_ids){ + group + subjects + } + subjectCountByRecurrenceScore (subject_ids: $subject_ids){ + group + subjects + } + subjectCountByTumorSize(subject_ids: $subject_ids) { + group + subjects + } + subjectCountByChemotherapyRegimen(subject_ids: $subject_ids) { + group + subjects + } + subjectCountByEndocrineTherapy (subject_ids: $subject_ids){ + group + subjects + } + subjectCountByTumorGrade(subject_ids: $subject_ids){ + group + subjects + } + subjectCountByErStatus(subject_ids: $subject_ids){ + group + subjects + } + subjectCountByPrStatus(subject_ids: $subject_ids){ + group + subjects + } + subjectCountByMenopauseStatus(subject_ids: $subject_ids){ + group + subjects + } + subjectCountByFileType (subject_ids: $subject_ids){ + group + subjects + } + subjectCountByFileAssociation(subject_ids: $subject_ids) { + group + subjects + } + subjectCountByTissueComposition(subject_ids: $subject_ids) { + group + subjects + } + subjectCountByTissueType(subject_ids: $subject_ids) { + group + subjects + } + subjectCountByFileType (subject_ids: $subject_ids){ + group + subjects +} +subjectCountByFileAssociation(subject_ids: $subject_ids) { + group + subjects +} +subjectCountByTissueComposition(subject_ids: $subject_ids) { + group + subjects +} +subjectCountByTissueType(subject_ids: $subject_ids) { + group + subjects +} + armsByPrograms(subject_ids: $subject_ids) { + program + caseSize + children { + arm + caseSize + size + } + } + +} + `; + +export const FILTER_QUERY = gql` +query search ( + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String] + $first: Int +){ + searchSubjects ( + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type + first: $first + ) { + numberOfPrograms + numberOfStudies + numberOfSubjects + numberOfSamples + numberOfLabProcedures + numberOfFiles + subjectIds + firstPage { + subject_id + program + program_id + study_acronym + study_short_description + study_info + diagnosis + recurrence_score + tumor_size + tumor_grade + er_status + pr_status + chemotherapy + endocrine_therapy + menopause_status + age_at_index + survival_time + survival_time_unit + files { + file_id + file_id + file_description + file_format + file_location + file_name + file_size + file_status + file_type + md5sum + } + lab_procedures + samples + } + } +} +`; + +// --------------- GraphQL query - Retrieve files tab details -------------- +export const GET_FILES_OVERVIEW_QUERY = gql` +query fileOverview($subject_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String ="file_name"){ + + fileOverview(subject_ids: $subject_ids, offset: $offset,first: $first, order_by: $order_by) { + file_id + file_name + association + file_description + file_format + file_size + program + program_id + arm + subject_id + sample_id + diagnosis + } +} + `; + +// --------------- GraphQL query - Retrieve sample tab details -------------- + +export const GET_SAMPLES_OVERVIEW_QUERY = gql` + query sampleOverview($subject_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String =""){ + sampleOverview(subject_ids: $subject_ids, offset: $offset,first: $first, order_by: $order_by) { + sample_id + subject_id + program + program_id + arm + diagnosis + tissue_type + tissue_composition + sample_anatomic_site + sample_procurement_method + platform + files +} +} + `; + +// --------------- GraphQL query - Retrieve sample tab details -------------- + +export const GET_CASES_OVERVIEW_QUERY = gql` + query subjectOverViewPaged($subject_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String =""){ + subjectOverViewPaged(subject_ids: $subject_ids, first: $first, offset: $offset, order_by: $order_by) { + subject_id + program + program_id + study_acronym + study_short_description + study_info + diagnosis + recurrence_score + tumor_size + tumor_grade + er_status + pr_status + chemotherapy + endocrine_therapy + menopause_status + age_at_index + survival_time + files { + file_id + } + lab_procedures + } +} + + `; + +export const GET_ALL_FILEIDS_FOR_SELECT_ALL = gql` + query subjectOverViewPaged($subject_ids: [String], $first: Int = 10000000){ + subjectOverViewPaged(subject_ids: $subject_ids, first: $first) { + files { + file_id + } + } +} + + `; +export const GET_FILES_OVERVIEW_DESC_QUERY = gql` +query fileOverviewDesc($subject_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String ="file_name"){ + + fileOverviewDesc(subject_ids: $subject_ids, offset: $offset,first: $first, order_by: $order_by) { + file_id + file_name + association + file_description + file_format + file_size + program + program_id + arm + subject_id + sample_id + diagnosis + } +} + `; + +// --------------- GraphQL query - Retrieve sample tab details -------------- + +export const GET_SAMPLES_OVERVIEW_DESC_QUERY = gql` + query sampleOverview($subject_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String =""){ + sampleOverviewDesc(subject_ids: $subject_ids, offset: $offset,first: $first, order_by: $order_by) { + sample_id + subject_id + program + program_id + arm + diagnosis + tissue_type + tissue_composition + sample_anatomic_site + sample_procurement_method + platform + files +} +} + `; + +// --------------- GraphQL query - Retrieve sample tab details -------------- + +export const GET_CASES_OVERVIEW_DESC_QUERY = gql` + query subjectOverViewPaged($subject_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String =""){ + subjectOverViewPagedDesc(subject_ids: $subject_ids, first: $first, offset: $offset, order_by: $order_by) { + subject_id + program + program_id + study_acronym + study_short_description + study_info + diagnosis + recurrence_score + tumor_size + tumor_grade + er_status + pr_status + chemotherapy + endocrine_therapy + menopause_status + age_at_index + survival_time + files { + file_id + } + lab_procedures + } +} + + `; diff --git a/src/bento/fileCentricCartWorkflowData.js b/src/bento/fileCentricCartWorkflowData.js new file mode 100644 index 000000000..5e532ee53 --- /dev/null +++ b/src/bento/fileCentricCartWorkflowData.js @@ -0,0 +1,127 @@ +import gql from 'graphql-tag'; + +export const navBarCartData = { + cartLabel: 'Cart', + cartLink: '/fileCentricCart', + cartIcon: 'https://raw.githubusercontent.com/CBIIT/bento-frontend/master/src/assets/icons/Icon-Cart-Navbar.svg', + cartIconAlt: 'cart_logo', +}; + +export const myFilesPageData = { + mainTitle: 'Cart >', + subTitle: 'Selected Files', + downButtonText: 'DOWNLOAD MANIFEST', + headerIconSrc: 'https://raw.githubusercontent.com/CBIIT/bento-frontend/master/src/assets/icons/Icon-Cart-Workflow.svg', + headerIconAlt: 'Bento MyFiles header logo', + manifestFileName: 'BENTO File Manifest', + tooltipIcon: 'https://raw.githubusercontent.com/google/material-design-icons/master/src/action/help/materialicons/24px.svg', + tooltipAlt: 'tooltip icon', + tooltipMessage: 'To access and analyze files: select and remove unwanted files, click the “Download Manifest” button, and upload the resulting Manifest file to your Seven Bridges Genomics account.', + textareaPlaceholder: 'Please add a description for the XML file you are about to download.', + errorMessage: 'An error has occurred in loading CART', + popUpWindow: { + showNumberOfFileBeRemoved: true, + messagePart1: 'Remove ', + messagePart2: 'All files (', + messagePart3: ') ', + messagePart4: 'From Cart', + okButtonText: 'Ok', + cancelButtonText: 'Cancel', + }, +}; + +export const manifestData = { + keysToInclude: ['study_code', 'subject_id', 'file_name', 'file_id', 'md5sum'], + header: ['Study Code', 'Case ID', 'File Name', 'File ID', 'Md5sum', 'User Comments'], +}; + +// --------------- File table configuration -------------- + +export const table = { + dataField: 'filesInList', + // Value must be one of the 'dataField's in "columns" + defaultSortField: 'file_name', + // 'asc' or 'desc' + defaultSortDirection: 'asc', + + columns: [ + { + dataField: 'file_name', + header: 'File Name', + }, + { + dataField: 'file_type', + header: 'File Type', + }, + { + dataField: 'association', + header: 'Association', + }, + { + dataField: 'file_description', + header: 'Description', + }, + { + dataField: 'file_format', + header: 'Format', + }, + { + dataField: 'file_size', + header: 'Size', + // set formatBytes to true to display file size (in bytes) in a more human readable format + formatBytes: true, + }, + { + dataField: 'subject_id', + header: 'Case ID', + }, + { + dataField: 'study_code', + header: 'Study Code', + }, + { + dataField: 'file_id', + header: 'UUID', + display: false, + }, + { + dataField: 'md5sum', + header: 'Md5Sum', + display: false, + }, + ], +}; + +// --------------- GraphQL query - Retrieve selected cases info -------------- +export const GET_MY_CART_DATA_QUERY = gql` +query filesInList($file_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String ="") { + filesInList(file_ids: $file_ids, offset: $offset,first: $first, order_by: $order_by) { + study_code + subject_id + file_name + file_type + association + file_description + file_format + file_size + file_id + md5sum + } +}`; + +// --------------- GraphQL query - Retrieve selected files info Desc -------------- +export const GET_MY_CART_DATA_QUERY_DESC = gql` +query filesInListDesc($file_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String ="") { + filesInListDesc(file_ids: $file_ids, offset: $offset,first: $first, order_by: $order_by) { + study_code + subject_id + file_name + file_type + association + file_description + file_format + file_size + file_id + md5sum + } +}`; diff --git a/src/bento/globalFooterData.js b/src/bento/globalFooterData.js index b8ef05635..237193b96 100644 --- a/src/bento/globalFooterData.js +++ b/src/bento/globalFooterData.js @@ -1,12 +1,13 @@ -// import Test from '../assets/header/CTDC_Logo.svg'; - +import env from '../utils/env'; // footerLogoImage ideal image size 310x80 px export default { footerLogoImage: 'https://raw.githubusercontent.com/CBIIT/bento-frontend/master/src/assets/footer/FNL_logo.png', footerLogoAltText: 'Footer Logo', + footerLogoHyperlink: 'https://frederick.cancer.gov/', footerStaticText: 'NIH … Turning Discovery Into Health®', - version: process.env.REACT_APP_APPLICATION_VERSION, + version: env.REACT_APP_FE_VERSION, + BEversion: env.REACT_APP_BE_VERSION, // A maximum of 3 Subsections (link_sections) are allowed // A maximum of 4 Subsection Links ('items' under link_sections) are allowed // A maximum of 4 Anchor Links (global_footer_links) are allowed diff --git a/src/bento/globalStatsData.js b/src/bento/globalStatsData.js index 8e30a85d3..7c0cdbd44 100644 --- a/src/bento/globalStatsData.js +++ b/src/bento/globalStatsData.js @@ -1,42 +1,44 @@ import gql from 'graphql-tag'; +export const statsStyling = { + global: { + horizontalStyle: true, + statTitleFirst: true, + height: '47px', + background: '#8DCAFF', + }, +}; + export const globalStatsData = [ // A maximum of 6 stats are allowed { statTitle: 'Programs', - datatable_field: 'program', type: 'field', statAPI: 'numberOfPrograms', }, { statTitle: 'Arms', - datatable_field: 'study_acronym', type: 'field', statAPI: 'numberOfStudies', }, { statTitle: 'Cases', - datatable_field: 'subject_id', type: 'field', statAPI: 'numberOfSubjects', }, { statTitle: 'samples', - type: 'array', - datatable_field: 'samples', + type: 'field', statAPI: 'numberOfSamples', }, { statTitle: 'Assays', - type: 'array', - datatable_field: 'lab_procedures', + type: 'field', statAPI: 'numberOfLabProcedures', }, { statTitle: 'files', - type: 'object', - datatable_field: 'files', - datatable_sub_field: 'file_id', + type: 'field', statAPI: 'numberOfFiles', }, ]; diff --git a/src/bento/navigationBarData.js b/src/bento/navigationBarData.js index cae4550b8..a8eb0908e 100644 --- a/src/bento/navigationBarData.js +++ b/src/bento/navigationBarData.js @@ -1,5 +1,19 @@ -// A maximum of 4 nav bar items are allowed -export default [ +export const navBarstyling = { + global: { + backgroundColor: '#142D64', + height: '39px', + padding: '9px 20px 0px 20px', + }, + dropDownIcon: { + displayIcon: false, + fontSize: '18px', + margin: '0px 0px 0px 0px', + }, +}; + +export const navBarData = [ + // A maximum of 5 nav bar items are allowed + // A maximum of 9 dropDownLinks items are allowed { labelText: 'home', type: 'link', @@ -34,3 +48,10 @@ export default [ ], }, ]; + +export const navBarCartData = { + cartLabel: 'MY Files', + cartLink: '/fileCentricCart', + cartIcon: 'https://raw.githubusercontent.com/CBIIT/bento-frontend/master/src/assets/icons/Icon-Cart-Navbar.svg', + cartIconAlt: 'cart_logo', +}; diff --git a/src/bento/programData.js b/src/bento/programData.js index 4812aec5a..6100028fc 100644 --- a/src/bento/programData.js +++ b/src/bento/programData.js @@ -25,12 +25,15 @@ const table = { defaultSortField: 'program_acronym', // 'asc' or 'desc' defaultSortDirection: 'asc', + // Set 'selectableRows' to true to show the row selection + selectableRows: false, // A maximum of 10 columns are allowed columns: [ { dataField: 'program_acronym', header: 'Program Code', link: '/program/{program_id}', + display: true, }, { dataField: 'program_id', diff --git a/src/bento/programDetailData.js b/src/bento/programDetailData.js index d9978fad9..2fc982049 100644 --- a/src/bento/programDetailData.js +++ b/src/bento/programDetailData.js @@ -73,7 +73,7 @@ const leftPanel = { const rightPanel = { widget: [ { - dataField: 'diagnosis', + dataField: 'diagnoses', label: 'Diagnosis', display: true, }, @@ -101,6 +101,8 @@ const table = { defaultSortField: 'study_acronym', // 'asc' or 'desc' defaultSortDirection: 'asc', + // Set 'selectableRows' to true to show the row selection + selectableRows: false, // A maximum of 10 columns are allowed columns: [ { @@ -142,6 +144,10 @@ query programDetail($program_id: String!) { num_samples num_lab_procedures disease_subtypes + diagnoses { + group + subjects + } studies { study_name study_type diff --git a/src/components/AddToCartDialog/AddToCartDialogAlertView.js b/src/components/AddToCartDialog/AddToCartDialogAlertView.js new file mode 100644 index 000000000..2223d93a1 --- /dev/null +++ b/src/components/AddToCartDialog/AddToCartDialogAlertView.js @@ -0,0 +1,37 @@ +import React from 'react'; +import { + Dialog, DialogContent, DialogContentText, +} from '@material-ui/core'; +import DialogThemeProvider from './dialogThemeConfig'; + +function AddToCartDialogAlertView(props) { + const { open, classes, onClose } = props; + const closeAlertModelTimer = 4000; + + const alertMessage = 'The cart is limited to 1,000 files. Please narrow the search criteria or remove some files from the cart to add more.'; + + const AlertDialog = ( + + + + + {alertMessage} + + + + + ); + + if (open === true) { + // close the Dialog after 3 seconds. + setTimeout(() => { onClose(); }, closeAlertModelTimer); + } + return AlertDialog; +} + +export default AddToCartDialogAlertView; diff --git a/src/components/AddToCartDialog/AddToCartDialogController.js b/src/components/AddToCartDialog/AddToCartDialogController.js new file mode 100644 index 000000000..ad296a9b2 --- /dev/null +++ b/src/components/AddToCartDialog/AddToCartDialogController.js @@ -0,0 +1,83 @@ +import React, { forwardRef, useImperativeHandle } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Dialog from './AddToCartDialogView'; +import Alert from './AddToCartDialogAlertView'; + +const useStyles = makeStyles({ + popUpWindowText: { + fontFamily: 'Lato', + size: '16px', + }, + okButton: { + background: '#98A19E', + color: '#fff', + cursor: 'pointer', + '&:hover': { + backgroundColor: 'rgba(152,161,158,0.6)', + }, + }, + cancelButton: { + background: '#42779A', + color: '#fff', + cursor: 'pointer', + '&:hover': { + backgroundColor: 'rgba(66,119,154,0.6)', + }, + }, + button: { + borderRadius: '10px', + width: '100px', + lineHeight: '37px', + fontSize: '12px', + textTransform: 'uppercase', + fontFamily: 'Lato', + color: '#fff', + backgroundColor: '#142D64', + marginTop: '6px', + marginBottom: '10px', + marginRight: '24px', + }, +}); + +// `forwardRef` to gain access to the ref object that is assigned using the `ref` prop. +const AddToCartDialogController = forwardRef((props, ref) => { + const [open, setOpen] = React.useState(false); + + const handleClose = () => { + setOpen(false); + }; + + // The component instance will be extended + // with whatever you return from the callback passed + // as the second argument + useImperativeHandle(ref, () => ({ + open() { + setOpen(true); + }, + close() { + setOpen(false); + }, + })); + + const { + cartWillFull, + numberOfFilesSelected, + onYesClick, + onNoClick, + } = props; + + if (cartWillFull) { + return ; + } + return ( + + ); +}); + +export default AddToCartDialogController; diff --git a/src/components/AddToCartDialog/AddToCartDialogView.js b/src/components/AddToCartDialog/AddToCartDialogView.js new file mode 100644 index 000000000..ae2433610 --- /dev/null +++ b/src/components/AddToCartDialog/AddToCartDialogView.js @@ -0,0 +1,46 @@ +import React from 'react'; +import { + Dialog, DialogActions, DialogContent, DialogContentText, Button, +} from '@material-ui/core'; +import DialogThemeProvider from './dialogThemeConfig'; + +function AddToCartDialogView(props) { + const { + open, + numberOfFilesSelected, + onYesClick, + onNoClick, + classes, + } = props; + + return ( + + + + + Are you sure to add All Files + {' '} + {numberOfFilesSelected} + {' '} + to cart + + + + + + + + + ); +} + +export default AddToCartDialogView; diff --git a/src/components/AddToCartDialog/dialogThemeConfig.js b/src/components/AddToCartDialog/dialogThemeConfig.js new file mode 100644 index 000000000..181945840 --- /dev/null +++ b/src/components/AddToCartDialog/dialogThemeConfig.js @@ -0,0 +1,56 @@ +import React from 'react'; +import { ThemeProvider, createMuiTheme } from '@material-ui/core/styles'; +import themes, { overrides } from '../../themes'; + +export default ({ + children, +}) => { + const style = []; + + const overridesObj = themes.light.overrides; + + const MuiDialog = { + paper: { + width: '431px', + height: '170px', + borderRadius: '25px !important', + textAlign: 'center', + backgroundColor: '#E8DFDC !important', + border: '2px solid #A61401', + }, + }; + + const MuiDialogContent = { + root: { + padding: '40px 20px 0px 20px !important', + }, + }; + + const MuiButton = { + root: { + width: '133px', + height: '45px', + }, + }; + + const MuiDialogActions = { + root: { + justifyContent: 'center !important', + paddingBottom: '25px !important', + }, + }; + + overridesObj.MuiDialog = MuiDialog; + overridesObj.MuiDialogContent = MuiDialogContent; + overridesObj.MuiButton = MuiButton; + overridesObj.MuiDialogActions = MuiDialogActions; + + style.push(overridesObj); + const computedTheme = createMuiTheme({ ...themes.light, ...overrides, ...style }); + + return ( + + {children} + + ); +}; diff --git a/src/components/AddToCartDialog/index.js b/src/components/AddToCartDialog/index.js new file mode 100644 index 000000000..78d9ee3e7 --- /dev/null +++ b/src/components/AddToCartDialog/index.js @@ -0,0 +1 @@ +export { default } from './AddToCartDialogController'; diff --git a/src/components/CustomFooter/CustomFooter.js b/src/components/CustomFooter/CustomFooter.js new file mode 100644 index 000000000..baedf3083 --- /dev/null +++ b/src/components/CustomFooter/CustomFooter.js @@ -0,0 +1,32 @@ +import React from 'react'; +import TableFooter from '@material-ui/core/TableFooter'; +import TableRow from '@material-ui/core/TableRow'; +import TablePagination from '@material-ui/core/TablePagination'; +import { withStyles } from '@material-ui/core/styles'; + +const defaultFooterStyles = { + +}; + +const CustomFooter = ({ + count, + page, + rowsPerPage, + onChangePage, + onChangeRowsPerPage, +}) => ( + + + + + + +); + +export default withStyles(defaultFooterStyles, { withTheme: true })(CustomFooter); diff --git a/src/components/CustomFooter/index.js b/src/components/CustomFooter/index.js new file mode 100644 index 000000000..9ae2482d9 --- /dev/null +++ b/src/components/CustomFooter/index.js @@ -0,0 +1 @@ +export { default } from './CustomFooter'; diff --git a/src/components/GraphqlClient/GraphqlView.js b/src/components/GraphqlClient/GraphqlView.js index 64ea47928..58d5849ae 100644 --- a/src/components/GraphqlClient/GraphqlView.js +++ b/src/components/GraphqlClient/GraphqlView.js @@ -2,8 +2,9 @@ import React from 'react'; import GraphiQL from 'graphiql'; import { withStyles } from '@material-ui/core'; import fetch from 'isomorphic-fetch'; +import env from '../../utils/env'; -const BACKEND = process.env.REACT_APP_BACKEND_API; +const BACKEND = env.REACT_APP_BACKEND_API; function graphQLFetcher(graphQLParams) { return fetch(BACKEND, { diff --git a/src/components/GridWithFooter/GridView.js b/src/components/GridWithFooter/GridView.js new file mode 100644 index 000000000..4957641e2 --- /dev/null +++ b/src/components/GridWithFooter/GridView.js @@ -0,0 +1,348 @@ +import React, { useRef, useEffect } from 'react'; +import { + Grid, + withStyles, +} from '@material-ui/core'; +import _ from 'lodash'; +import { useSelector } from 'react-redux'; +import { CustomDataTable } from 'bento-components'; +import HelpIcon from '@material-ui/icons/Help'; +import IconButton from '@material-ui/core/IconButton'; +import { addToCart, cartWillFull } from '../../pages/fileCentricCart/store/cart'; +import Message from '../Message'; +import AddToCartAlertDialog from '../AddToCartDialog'; + +const GridView = ({ + classes, + data, + title, + columns, + customOnRowsSelect, + openSnack, + disableRowSelection, + buttonText, + options, + tooltipMessage, + tooltipContent, + saveButtonDefaultStyle, + DeactiveSaveButtonDefaultStyle, + ActiveSaveButtonDefaultStyle, +}) => { + // Get the existing files ids from cart state + const fileIDs = useSelector((state) => state.cart.fileIds); + const [messageStatus, setMessageStatus] = React.useState(false); + // Store current page selected info + const [rowSelection, setRowSelection] = React.useState({ + selectedRowInfo: [], + selectedRowIndex: [], + }); + + // Store current page selected info + const [selectedIDs, setSelectedIDs] = React.useState([]); + const AddToCartAlertDialogRef = useRef(); + const [cartIsFull, setCartIsFull] = React.useState(false); + const saveButton = useRef(null); + + function openMessage() { + return setMessageStatus(true); + } + + function closeMessage() { + return setMessageStatus(false); + } + + function toggleMessageStatus(location, status) { + return status === 'close' ? closeMessage(location) : openMessage(location); + } + + // Button styling functions. + const buildButtonStyle = (button, styleObject) => { + const styleKV = Object.entries(styleObject); + // eslint-disable-next-line no-restricted-syntax, no-unused-vars + for (const [key, value] of styleKV) { + // eslint-disable-next-line no-param-reassign + button.current.style[key] = value; + } + }; + + const initSaveButtonDefaultStyle = (button) => { + // eslint-disable-next-line no-param-reassign + button.current.disabled = true; + buildButtonStyle(button, saveButtonDefaultStyle); + }; + + const updateActiveSaveButtonStyle = (flag, button) => { + if (flag) { + // eslint-disable-next-line no-param-reassign + button.current.disabled = true; + buildButtonStyle(button, ActiveSaveButtonDefaultStyle); + } else { + // eslint-disable-next-line no-param-reassign + button.current.disabled = false; + buildButtonStyle(button, DeactiveSaveButtonDefaultStyle); + } + }; + + // Calculate the properate marginTop value for the tooltip on the top + function tooltipStyle(text) { + const topValue = text.length > 35 ? '-78px' : '-51px'; + return { top: topValue }; + } + + const btnStyle = { + borderRadius: '10px', + width: '156px', + lineHeight: '37px', + fontSize: '12px', + textTransform: 'uppercase', + fontFamily: 'Lato', + color: '#fff', + backgroundColor: '#10A075', + marginTop: '6px', + marginBottom: '10px', + marginRight: '4px', + }; + + useEffect(() => { + initSaveButtonDefaultStyle(saveButton); + + if (selectedIDs.length === 0) { + updateActiveSaveButtonStyle(true, saveButton); + } else { + updateActiveSaveButtonStyle(false, saveButton); + } + }); + + function exportFiles() { + // Find the newly added files by comparing + const newFileIDS = fileIDs !== null ? selectedIDs.filter( + (e) => !fileIDs.find((a) => e === a), + ).length : selectedIDs.length; + if (cartWillFull(newFileIDS)) { + // throw an alert + setCartIsFull(true); + AddToCartAlertDialogRef.current.open(); + } else if (newFileIDS > 0) { + addToCart({ fileIds: selectedIDs }); + openSnack(newFileIDS); + setSelectedIDs([]); + } + } + + function divStyle() { + const css = {}; + css.display = 'inherit'; + return css; + } + + function rowSelectionEvent(displayData, rowsSelected) { + const displayedDataKeies = displayData; + const selectedRowsKey = rowsSelected + ? rowsSelected.map((index) => displayedDataKeies[index]) + : []; + let newSelectedRowInfo = []; + + if (rowsSelected) { + // Remove the rowInfo from selectedRowInfo if this row currently be + // displayed and not be selected. + if (rowSelection.selectedRowInfo.length > 0) { + newSelectedRowInfo = rowSelection.selectedRowInfo.filter((key) => { + if (displayedDataKeies.includes(key)) { + return false; + } + return true; + }); + } + } else { + newSelectedRowInfo = rowSelection.selectedRowInfo; + } + newSelectedRowInfo = newSelectedRowInfo.concat(selectedRowsKey); + + // Get selectedRowIndex by comparing current page data with selected row's key. + // if rowInfo from selectedRowInfo is currently be displayed + const newSelectedRowIndex = displayedDataKeies.reduce( + (accumulator, currentValue, currentIndex) => { + if (newSelectedRowInfo.includes(currentValue)) { + accumulator.push(currentIndex); + } + return accumulator; + }, [], + ); + + setRowSelection({ + selectedRowInfo: newSelectedRowInfo, + selectedRowIndex: newSelectedRowIndex, + }); + } + + /* + Presist user selection + */ + function onRowsSelect(curr, allRowsSelected, rowsSelected, displayData) { + rowSelectionEvent(displayData.map((d) => d.data[0]), rowsSelected); + setSelectedIDs([...new Set( + customOnRowsSelect(data, allRowsSelected), + )]); + + if (allRowsSelected.length === 0) { + updateActiveSaveButtonStyle(true, saveButton); + } else { + updateActiveSaveButtonStyle(false, saveButton); + } + } + + // overwrite default options + const defaultOptions = () => ({ + rowsSelected: rowSelection.selectedRowIndex, + onRowSelectionChange: (curr, allRowsSelected, rowsSelected, displayData) => onRowsSelect( + curr, + allRowsSelected, + rowsSelected, + displayData, + ), + isRowSelectable: (dataIndex) => (disableRowSelection + ? disableRowSelection(data[dataIndex], fileIDs) : true), + }); + + const finalOptions = { ...options, ...defaultOptions() }; + + return ( +
+ + + + + + + +
+ + toggleMessageStatus('top', 'open')} onMouseEnter={() => toggleMessageStatus('top', 'open')} onMouseLeave={() => toggleMessageStatus('top', 'close')}> + {tooltipContent.src ? ( + toggleMessageStatus('top', 'open')} + onMouseOver={() => toggleMessageStatus('top', 'open')} + onFocus={() => toggleMessageStatus('top', 'open')} + src={tooltipContent.src} + alt={tooltipContent.alt} + className={classes.helpIcon} + /> + ) : ( + toggleMessageStatus('top', 'open')} + onMouseEnter={() => toggleMessageStatus('top', 'open')} + onFocus={() => toggleMessageStatus('top', 'open')} + /> + )} + + { messageStatus ? ( +
+ {' '} + + {' '} +
+ ) : ''} +
+
+ ); +}; + +const styles = () => ({ + link: { + color: '#DC762F', + textDecoration: 'none', + '&:hover': { + textDecoration: 'underline', + }, + }, + caseTitle: { + color: '#194563', + fontSize: '25.2pt', + fontStyle: 'normal', + fontFamily: 'Raleway', + letterSpacing: '0.025em', + backgroundColor: '#f5f5f5', + padding: '10px 32px 8px 28px', + }, + chips: { + position: 'absolute', + marginLeft: '250px', + marginTop: '36px', + zIndex: '999', + }, + chipRoot: { + color: '#ffffff', + fontFamily: '"Open Sans", sans-serif', + letterSpacing: '0.075em', + marginLeft: '10px', + backgroundColor: '#9b9b9b', + fontSize: '9pt', + }, + chipDeleteIcon: { + color: '#ffffff', + '&:hover': { + color: '#ffffff', + }, + }, + root: { + fontFamily: '"Open Sans", sans-serif', + fontSize: '9pt', + letterSpacing: '0.025em', + color: '#000', + }, + saveButtonDiv: { + position: 'absolute', + margin: '-50px 0 0 0', + paddingLeft: '25px', + }, + button: { + borderRadius: '10px', + width: '260px', + height: '27px', + lineHeight: '18px', + fontSize: '10pt', + color: '#fff', + // backgroundColor: '#ff7f15', + }, + helpIcon: { + verticalAlign: 'top', + zIndex: '600', + }, + topButtonGroup: { + textAlign: 'right', + padding: '10px 0px 0px 0px', + position: 'relative', + }, + messageBottom: { + position: 'absolute', + right: '-8px', + bottom: '20px', + zIndex: '400', + }, + linkIcon: { + color: '#dc762f', + width: '20px', + verticalAlign: 'sub', + margin: '0px 0px 0px 2px', + }, + helpIconButton: { + verticalAlign: 'top', + marginLeft: '-5px', + }, +}); + +export default withStyles(styles, { withTheme: true })(GridView); diff --git a/src/components/GridWithFooter/customFooter.js b/src/components/GridWithFooter/customFooter.js new file mode 100644 index 000000000..237e0555b --- /dev/null +++ b/src/components/GridWithFooter/customFooter.js @@ -0,0 +1,33 @@ +import React from 'react'; +import TableFooter from '@material-ui/core/TableFooter'; +import TableRow from '@material-ui/core/TableRow'; +import TablePagination from '@material-ui/core/TablePagination'; +import { withStyles } from '@material-ui/core/styles'; + +const defaultFooterStyles = { + +}; + +const CustomFooter = ({ + classes, + count, + page, + rowsPerPage, + onChangePage, + onChangeRowsPerPage, +}) => ( + + + + + +); + +export default withStyles(defaultFooterStyles, { withTheme: true })(CustomFooter); diff --git a/src/components/GridWithFooter/index.js b/src/components/GridWithFooter/index.js new file mode 100644 index 000000000..2e8083cd5 --- /dev/null +++ b/src/components/GridWithFooter/index.js @@ -0,0 +1 @@ +export { default } from './GridView'; diff --git a/src/components/Header/HeaderView.js b/src/components/Header/HeaderView.js index ee728f472..7793d9325 100644 --- a/src/components/Header/HeaderView.js +++ b/src/components/Header/HeaderView.js @@ -1,10 +1,15 @@ -/* eslint-disable */ - import React from 'react'; import { Header } from 'bento-components'; import headerData from '../../bento/globalHeaderData'; -// import nihLogo from '../../assets/header/icdc_nih_logo.svg'; - -const ICDCHeader = () => <>
; +const ICDCHeader = () => ( + <> +
+ +); export default ICDCHeader; diff --git a/src/components/Layout/LayoutView.js b/src/components/Layout/LayoutView.js index c692cc6f7..024019e17 100644 --- a/src/components/Layout/LayoutView.js +++ b/src/components/Layout/LayoutView.js @@ -6,24 +6,18 @@ import Header from '../Header/HeaderView'; import NavBar from '../NavBar/NavBarContainer'; import Footer from '../Footer/FooterView'; import Error from '../../pages/error/Error'; - -// import Sidebar from '../Sidebar'; - -// pages - -import Dashboard from '../../pages/dashboard/dashboardController'; +import Dashboard from '../../pages/dashboardTab/dashboardController'; import CaseDetail from '../../pages/caseDetail/caseDetailController'; import ArmDetail from '../../pages/armDetail/armDetailController'; import modelPage from '../../pages/modelPage/modelPageView'; import table from '../../pages/table/tableView'; -import SelectedCases from '../../pages/selectedCases/selectedCasesController'; -import SelectedFiles from '../../pages/selectedFiles/selectedFilesController'; import Home from '../../pages/landing/landingController'; import About from '../../pages/about/aboutController'; import DataDictonary from '../../pages/dataDictionary/dataDictonaryController'; import Programs from '../../pages/programs/programsController'; import ProgramDetail from '../../pages/programDetail/programDetailController'; import GraphqlClient from '../GraphqlClient/GraphqlView'; +import fileCentricCart from '../../pages/fileCentricCart/cartController'; const ScrollToTop = () => { window.scrollTo(0, 0); @@ -51,9 +45,7 @@ const Layout = ({ classes, isSidebarOpened }) => ( - - - + diff --git a/src/components/Message/index.js b/src/components/Message/index.js new file mode 100644 index 000000000..e8006b8af --- /dev/null +++ b/src/components/Message/index.js @@ -0,0 +1 @@ +export { default } from './message'; diff --git a/src/components/Message/message.js b/src/components/Message/message.js new file mode 100644 index 000000000..28d871c4a --- /dev/null +++ b/src/components/Message/message.js @@ -0,0 +1,49 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core'; + +const message = ({ classes, data }) => ( +
+
{data}
+
+
+
+
+
+); + +const styles = () => ({ + arrayIconBase: { + width: '0px', + height: '0px', + borderTop: '15px solid #03A383', + borderLeft: '10px solid transparent', + borderRight: '10px solid transparent', + borderBottom: '20px solid transparent', + }, + arrayIconCover: { + position: 'absolute', + marginTop: '-2px', + marginLeft: '0.3px', + width: '0px', + height: '0px', + borderTop: '15px solid #fff', + borderLeft: '10px solid transparent', + borderRight: '10px solid transparent', + borderBottom: '20px solid transparent', + }, + messageTextArea: { + width: '225px', + minHeight: '50px', + border: '2px solid #03A383', + borderRadius: '10px', + background: '#fff', + padding: '10px 10px 10px 13px', + textAlign: 'left', + color: '#0D4659', + fontSize: '12px', + }, + arrayIcon: { + marginLeft: '192px', + }, +}); +export default withStyles(styles, { withTheme: true })(message); diff --git a/src/components/NavBar/NavBarContainer.js b/src/components/NavBar/NavBarContainer.js index 6f171cd6b..1e31d9504 100755 --- a/src/components/NavBar/NavBarContainer.js +++ b/src/components/NavBar/NavBarContainer.js @@ -9,6 +9,7 @@ export default compose( connect( (state) => ({ isSidebarOpened: state.layout.isSidebarOpened, + cartFieldIds: state.cart.fileIds, }), { toggleSidebar }, ), diff --git a/src/components/NavBar/NavBarView.js b/src/components/NavBar/NavBarView.js index 8bd37471f..26b374669 100644 --- a/src/components/NavBar/NavBarView.js +++ b/src/components/NavBar/NavBarView.js @@ -1,438 +1,18 @@ import React from 'react'; -import queryString from 'query-string'; -import { withRouter, NavLink } from 'react-router-dom'; -import { useSelector, useDispatch } from 'react-redux'; +import { NavBar } from 'bento-components'; +// import { useSelector } from 'react-redux'; import { - AppBar, - Button, - Toolbar, - Tooltip, - withStyles, -} from '@material-ui/core'; -import classnames from 'classnames'; -import { navBarCartData } from '../../bento/cartWorkflowData'; -import navBarData from '../../bento/navigationBarData'; - -// import { useTheme } from '../ThemeContext'; - -import { initCart } from '../../pages/selectedCases/selectedCasesState'; -import DropdownMenu from './components/DropdownMenu'; - -const drawerWidth = 240; -// const FENCE_LOGIN_URL = process.env.FENCE_LOGIN_URL; -// const FENCE_LOGIN_URL = process.env.REACT_APP_LOGIN_URL; -const BACKEND_GETUSERINFO_API = process.env.REACT_APP_BACKEND_GETUSERINFO_API; - -const NavBar = ({ - classes, isSidebarOpened, -}) => { - // const theme = useTheme(); - const [authState, setAuthState] = React.useState({ - isAuthorized: localStorage.getItem('isAuthorized') === 'true', - }); - - // Similar to componentDidMount and componentDidUpdate: - // Empty second argument of react useEffect will avoid the infinte loop that - // caused due to component update - const dispatch = useDispatch(); - const [clickedEl, setClickedEl] = React.useState(null); - - function handleButtonClickEvent(eventName) { - setClickedEl(eventName); - } - - React.useEffect(() => { - dispatch(initCart()); - const values = queryString.parse(window.location.search); - - if (values.code) { - fetch(BACKEND_GETUSERINFO_API + values.code) - .then((response) => { - if (!response.ok) { - throw Error(response.statusText); - } - return response.json(); - }) - .then((result) => { - setAuthState({ - ...authState, - isAuthorized: true, - }); - localStorage.setItem('username', JSON.stringify(result.user)); - localStorage.setItem('isAuthorized', 'true'); - }) - .catch(() => { - // Ajay Need to update this - // setAuthState( - // { ...authState, username: "", isAuthorized: false } - // ); - // localStorage.setItem("isAuthorized", "false"); - }); - } - }, []); - - const numberOfCases = useSelector((state) => { - if (state.cart.cases) { - return state.cart.cases.length; - } - return 0; - }); - - // const activeFilters = useSelector((state) => ( - // state.dashboard.datatable - // && state.dashboard.datatable.filters - // ? state.dashboard.datatable.filters : [])); - return ( - <> - - - - {/* Sidebar button */} - - {/* End Sidebar button */} - - {/* Start of Theme Switching Icon and logic */} -
- -
- {/* Login button functionality on Navigation bar */} - - {/* {authState.isAuthorized ? ( - - ) : ( - - )} */} - {/* End Login button functionality on Navigation bar */} - -
-
- {/* { (location.pathname === '/cases') && ( - -
-
- -
-
- - funnel_image - -
-
- - -
- )} */} - - ); -}; - -const styles = (theme) => ({ - myCasesPosition: { - position: 'absolute', - right: '20px', - }, - logotype: { - whiteSpace: 'nowrap', - color: '#FFFFFF', - fontFamily: 'Raleway', - fontSize: '11px', - letterSpacing: '1.25px', - fontWeight: '800', - [theme.breakpoints.down('xs')]: { - display: 'none', - }, - '&:hover, &:focus': { - borderRadius: '0', - }, - }, - buttonContainer: { - margin: '0 auto', - }, - appBar: { - marginTop: '100px', - width: '100vw', - zIndex: theme.zIndex.drawer + 1, - transition: theme.transitions.create(['margin'], { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.leavingScreen, - }), - }, - cartLogoImg: { - width: '22px', - height: '22px', - marginLeft: '6px', - }, - hide: { - display: 'none', - }, - grow: { - flexGrow: 1, - }, - messageContent: { - display: 'flex', - flexDirection: 'column', - }, - headerMenu: { - marginTop: theme.spacing.unit * 7, - }, - headerMenuList: { - display: 'flex', - flexDirection: 'column', - }, - headerMenuItem: { - '&:hover, &:focus': { - backgroundColor: theme.palette.primary.main, - color: 'white', - }, - }, - headerMenuButton: { - marginLeft: theme.spacing.unit, - padding: theme.spacing.unit / 2, - }, - headerMenuButtonCollapse: { - marginRight: theme.spacing.unit * 2, - }, - headerIcon: { - fontSize: 20, - }, - headerIconCollapse: { - color: 'white', - }, - profileMenu: { - minWidth: 265, - }, - profileMenuUser: { - display: 'flex', - flexDirection: 'column', - padding: theme.spacing.unit * 2, - }, - profileMenuItem: { - color: theme.palette.text.hint, - }, - profileMenuIcon: { - marginRight: theme.spacing.unit * 2, - color: theme.palette.text.hint, - }, - profileMenuLink: { - fontSize: 16, - textDecoration: 'none', - '&:hover': { - cursor: 'pointer', - }, - }, - messageNotification: { - height: 'auto', - display: 'flex', - alignItems: 'center', - '&:hover, &:focus': { - backgroundColor: theme.palette.background.light, - }, - }, - messageNotificationSide: { - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - marginRight: theme.spacing.unit * 2, - }, - messageNotificationBodySide: { - alignItems: 'flex-start', - marginRight: 0, - }, - sendMessageButton: { - margin: theme.spacing.unit * 4, - marginTop: theme.spacing.unit * 2, - marginBottom: theme.spacing.unit * 2, - textTransform: 'none', - }, - firstLink: { - textDecoration: 'none', - color: theme.palette.primary.contrastText, - fontFamily: 'Nunito', - fontSize: '13px', - }, - sendButtonIcon: { - marginLeft: theme.spacing.unit * 2, - }, - link: { - textDecoration: 'none', - color: theme.palette.primary.contrastText, - fontFamily: 'Nunito', - fontSize: '13px', - }, - myCasesLink: { - color: '#FFFFFF', - }, - menuButton: { - marginRight: theme.spacing.unit * 2, - }, - appBarShift: { - paddingRight: '0px !important', - width: '100%', - marginLeft: drawerWidth, - transition: theme.transitions.create(['margin', 'width'], { - easing: theme.transitions.easing.easeOut, - duration: theme.transitions.duration.enteringScreen, - }), - }, - drawer: { - width: drawerWidth, - flexShrink: 0, - }, - drawerPaper: { - width: drawerWidth, - marginTop: '100px', - zIndex: '1201', - height: 'calc(100% - 100px)', - }, - toolbar: { - minHeight: 39, - paddingRight: '45px', - paddingLeft: '45px', - alignItems: 'flex-start', - }, - buttonRoot: { - paddingTop: '9px', - paddingLeft: '20px', - paddingRight: '20px', - }, - buttonRootNoRightPadding: { - paddingTop: '9px', - paddingLeft: '20px', - paddingRight: '20px', - }, - iconButtonRoot: { - paddingTop: '9px', - paddingLeft: '0px', - }, - floatRight: { - float: 'right', - }, - floatLeft: { - float: 'left', - marginTop: '6px', - marginLeft: '10px', - }, - funnelLogoImg: { - width: '20px', - height: '20px', - }, - clearAllButtonRoot: { - margin: 'auto', - }, - customButton: { - borderRadius: '100px', - borderLeft: '0px', - minHeight: '20px', - fontSize: 9, - textTransform: 'none', - color: 'black', - marginLeft: '16px', - fontFamily: theme.custom.fontFamilySans, - '&:hover': { - backgroundColor: '#566672', - color: 'white', - }, - }, - drawerAppBar: { - height: '45px', - }, - badge: { - display: 'inline-flex', - position: 'relative', - verticalAlign: 'middle', - }, - badgeText: { - height: '16px', - minWidth: '16px', - fontWeight: '600', - letterSpacing: '0.8px', - transform: 'scale(1) translate(0%, -50%)', - }, -}); - -export default withRouter(withStyles(styles)(NavBar)); + navBarData, navBarCartData, navBarstyling, +} from '../../bento/navigationBarData'; + +const BentoNavBar = ({ cartFieldIds }) => ( + <> + + +); +export default BentoNavBar; diff --git a/src/components/NavBar/components/DropdownItemsMenu.js b/src/components/NavBar/components/DropdownItemsMenu.js deleted file mode 100644 index 510d6f8df..000000000 --- a/src/components/NavBar/components/DropdownItemsMenu.js +++ /dev/null @@ -1,55 +0,0 @@ -import React from 'react'; -import { NavLink } from 'react-router-dom'; -import { - withStyles, Paper, -} from '@material-ui/core'; - -const CustomDropdownMenu = ({ classes, handleClick, dropDownElements }) => ( - <> - -
- {dropDownElements.map((dropDownElementsItem) => ( - - {dropDownElementsItem.labelText} - - ))} -
-
- -); - -const styles = () => ({ - paper: { - background: '#142D64', - width: '170px', - padding: '0px 16px 18px 22px', - position: 'absolute', - marginTop: '-5px', - borderRadius: '0', - marginLeft: '18px', - }, - link: { - textDecoration: 'none', - color: 'white', - fontFamily: 'Lato', - fontSize: '15px', - fontWeight: '800', - lineHeight: '12px', - display: 'block', - marginTop: '13px', - '&:hover': { - cursor: 'pointer', - color: '#41A7FF', - }, - }, - aboutItemsWrapper: { - maxWidth: '150px', - }, -}); - -export default withStyles(styles)(CustomDropdownMenu); diff --git a/src/components/NavBar/components/DropdownMenu.js b/src/components/NavBar/components/DropdownMenu.js deleted file mode 100644 index 1186c5972..000000000 --- a/src/components/NavBar/components/DropdownMenu.js +++ /dev/null @@ -1,103 +0,0 @@ -import React from 'react'; -import { - Button, withStyles, -} from '@material-ui/core'; -// import ExpandMoreRoundedIcon from '@material-ui/icons/ExpandMoreRounded'; -import DropdownItemsMenu from './DropdownItemsMenu'; - -const DropdownMenu = ({ - classes, handleButtonClickEvent, linkText, clickedEl, dropDownElements, -}) => { - const [displayDropDownMenu, setDisplayDropDownMenu] = React.useState(false); - - function handleClick() { - setDisplayDropDownMenu(true); - } - - function handleMoveOut() { - setDisplayDropDownMenu(false); - } - - function dropdownMenuClickEvent() { - setDisplayDropDownMenu(false); - handleButtonClickEvent('aboutMenu'); - } - - return ( -
- - {displayDropDownMenu ? : ''} -
- ); -}; - -const styles = (theme) => ({ - logotype: { - whiteSpace: 'nowrap', - color: theme.palette.primary.contrastText, - fontFamily: 'Nunito', - fontSize: '13px', - fontWeight: '600', - letterSpacing: '0.9px', - [theme.breakpoints.down('xs')]: { - display: 'none', - }, - '&:hover, &:focus': { - borderRadius: '0', - }, - }, - buttonRoot: { - paddingTop: '9px', - paddingLeft: '20px', - paddingRight: '20px', - }, - buttonRootClicked: { - borderBottom: '2px solid #FFFFFF', - }, - icon: { - fontSize: '18px', - }, - paper: { - background: '#309EC4', - padding: '6px 16px 16px 16px', - }, - link: { - textDecoration: 'none', - color: 'black', - fontFamily: 'Lato', - fontSize: '13px', - fontWeight: '800', - lineSpacing: '1px', - display: 'block', - marginTop: '13px', - '&:hover': { - cursor: 'pointer', - color: 'white', - }, - }, - aboutItemsWrapper: { - maxWidth: '150px', - }, - aboutMenu: { - display: 'inline-block', - }, -}); - -export default withStyles(styles)(DropdownMenu); diff --git a/src/components/NumberOfThings/NumberOfThingsView.js b/src/components/NumberOfThings/NumberOfThingsView.js new file mode 100644 index 000000000..41bb83662 --- /dev/null +++ b/src/components/NumberOfThings/NumberOfThingsView.js @@ -0,0 +1,35 @@ +import React from 'react'; +import { + Grid, + withStyles, +} from '@material-ui/core'; + +const defaultFooterStyles = { + +}; + +const NumberOfThing = ({ + number: numberOfThing, title, alt, icon, classes, +}) => ( + +
+
{title}
+ + + +
+ {alt} +
+ {numberOfThing} +
+
+
+
+
+); + +export default withStyles(defaultFooterStyles, { withTheme: true })(NumberOfThing); diff --git a/src/components/NumberOfThings/index.js b/src/components/NumberOfThings/index.js new file mode 100644 index 000000000..27a44367a --- /dev/null +++ b/src/components/NumberOfThings/index.js @@ -0,0 +1 @@ +export { default } from './NumberOfThingsView'; diff --git a/src/components/ProfileMenu/ProfileMenuView.js b/src/components/ProfileMenu/ProfileMenuView.js index 83aa9b518..80a7fdcb7 100644 --- a/src/components/ProfileMenu/ProfileMenuView.js +++ b/src/components/ProfileMenu/ProfileMenuView.js @@ -7,8 +7,9 @@ import { Person as PersonIcon, } from '@material-ui/icons'; import { Typography } from '../Wrappers/Wrappers'; +import env from '../../utils/env'; -const USER_LOGOUT_URL = process.env.REACT_APP_USER_LOGOUT_URL; +const USER_LOGOUT_URL = env.REACT_APP_USER_LOGOUT_URL; export default function ProfileMenu() { const [anchorEl, setAnchorEl] = React.useState(null); diff --git a/src/components/PropertySubsection/armDetailSubsection.js b/src/components/PropertySubsection/armDetailSubsection.js index 3bd9f5de2..dacf9889c 100644 --- a/src/components/PropertySubsection/armDetailSubsection.js +++ b/src/components/PropertySubsection/armDetailSubsection.js @@ -1,6 +1,6 @@ import { Grid, withStyles } from '@material-ui/core'; import React from 'react'; -import { Anchor, prepareLinks } from '../../utils/anchor'; +import { Anchor, prepareLinks } from 'bento-components'; const PropertyItem = ({ label, value, link, labelLink, classes, diff --git a/src/components/PropertySubsection/caseDetailSubsection.js b/src/components/PropertySubsection/caseDetailSubsection.js index 2b1ddef06..992190281 100644 --- a/src/components/PropertySubsection/caseDetailSubsection.js +++ b/src/components/PropertySubsection/caseDetailSubsection.js @@ -1,7 +1,7 @@ // Component to display a property import { Grid, withStyles } from '@material-ui/core'; import React from 'react'; -import { Anchor, prepareLinks } from '../../utils/anchor'; +import { Anchor, prepareLinks } from 'bento-components'; const PropertyItem = ({ label, value, link, labelLink, classes, diff --git a/src/components/SideBar/SideBarComponents/FacetFilters.js b/src/components/SideBar/SideBarComponents/FacetFilters.js index dfa41844f..5a8939857 100644 --- a/src/components/SideBar/SideBarComponents/FacetFilters.js +++ b/src/components/SideBar/SideBarComponents/FacetFilters.js @@ -9,11 +9,16 @@ import { ExpansionPanelSummary, withStyles, Divider, + Backdrop, + CircularProgress, } from '@material-ui/core'; -import CheckBoxIcon from '@material-ui/icons/CheckBox'; -import CheckBoxBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; -import ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown'; -import { toggleCheckBox } from '../../../pages/dashboard/dashboardState'; +import _ from 'lodash'; +import { + CheckBox as CheckBoxIcon, CheckBoxOutlineBlank as CheckBoxBlankIcon, ArrowDropDown + as ArrowDropDownIcon, +} from '@material-ui/icons'; +import { toggleCheckBox, setSideBarToLoading, setDashboardTableLoading } from '../../../pages/dashboardTab/store/dashboardReducer'; +import { facetSectionStyling, facetSearchData } from '../../../bento/dashboardData'; const CustomExpansionPanelSummary = withStyles({ root: { @@ -34,18 +39,46 @@ const CustomExpansionPanelSummary = withStyles({ const FacetPanel = ({ classes }) => { // data from store const sideBarContent = useSelector((state) => ( - state.dashboard - && state.dashboard.checkbox - ? state.dashboard.checkbox : { + state.dashboardTab + && state.dashboardTab.checkbox + ? state.dashboardTab.checkbox : { data: [], defaultPanel: false, })); - + // data from store for sidebar laoding + const isSidebarLoading = useSelector((state) => ( + state.dashboardTab + && state.dashboardTab.setSideBarLoading + ? state.dashboardTab.setSideBarLoading : false)); + const tabDataLoading = useSelector((state) => (state.dashboardTab + && state.dashboardTab.isDashboardTableLoading + ? state.dashboardTab.isDashboardTableLoading + : false)); // redux use actions const dispatch = useDispatch(); const [expanded, setExpanded] = React.useState(false); + const [groupExpanded, setGroupExpanded] = React.useState(['case']); + + const activeFilters = useSelector((state) => ( + state.dashboardTab + && state.dashboardTab.allActiveFilters + ? state.dashboardTab.allActiveFilters : {})); + + Object.entries(activeFilters).map((filter) => { + if ((filter[1].length >= 1) && (document.getElementById(`filterGroup_${filter[0]}`))) { + const filterLabel = facetSearchData.filter((word) => word.datafield === filter[0]); + document.getElementById(`filterGroup_${filter[0]}`).innerHTML = `${filterLabel[0].label}*`; + document.getElementById(`filterGroup_${filter[0]}`).style.color = 'green'; + } else if (document.getElementById(`filterGroup_${filter[0]}`)) { + const filterLabel = facetSearchData.filter((word) => word.datafield === filter[0]); + document.getElementById(`filterGroup_${filter[0]}`).innerHTML = `${filterLabel[0].label}`; + document.getElementById(`filterGroup_${filter[0]}`).style.color = 'black'; + } + return ''; + }); + React.useEffect(() => { if (!expanded || !(expanded === `${sideBarContent.defaultPanel}false` || expanded !== false)) { setExpanded(sideBarContent.defaultPanel); @@ -58,45 +91,111 @@ const FacetPanel = ({ classes }) => { // set height of filters. }; + const handleGroupChange = (panel) => (event, isExpanded) => { + const groups = _.cloneDeep(groupExpanded); + if (isExpanded) { + groups.push(panel); + } else { + const index = groups.indexOf(panel); + if (index > -1) { + groups.splice(index, 1); + } + } + + setGroupExpanded(groups); + }; + const handleToggle = (value) => () => { const valueList = value.split('$$'); + setSideBarToLoading(); + setDashboardTableLoading(); // dispatch toggleCheckBox action dispatch(toggleCheckBox([{ groupName: valueList[1], name: valueList[0], datafield: valueList[2], isChecked: !(valueList[3] === 'true'), + section: valueList[4], }])); }; const sideBarDisplay = sideBarContent.data.filter((sideBar) => sideBar.show === true) - .slice(0, 12); + .slice(0, 15); + + const arrangeBySections = (arr) => { + const sideBar = {}; + arr.forEach(({ section, ...item }) => { + if (!sideBar[section]) { + sideBar[section] = { sectionName: section, items: [] }; + } + sideBar[section].items.push({ section, ...item }); + }); + return Object.values(sideBar); + }; + const sideBarSections = arrangeBySections(sideBarDisplay); return ( <> - {sideBarDisplay.map((sideBarItem) => { - if (sideBarItem.show) { - return ( - <> - ( + <> + + - } - aria-controls={sideBarItem.groupName} - id={sideBarItem.groupName} - > - {/* */} -
{sideBarItem.groupName}
+ classes={{ + root: classes.expansionPanelRoot, + }} + > + } + aria-controls={currentSection.sectionName} + id={currentSection.sectionName} + > + {/* */} +
{currentSection.sectionName}
+ +
-
+ + + {currentSection.items.map((sideBarItem) => ( + <> + + +)} + aria-controls={sideBarItem.groupName} + id={sideBarItem.groupName} + > + {/* */} +
{sideBarItem.groupName}
- - - { +
+ + + + { sideBarItem.checkboxItems.map((checkboxItem) => { if (checkboxItem.subjects === 0 && !checkboxItem.isChecked) { return ''; @@ -104,7 +203,7 @@ const FacetPanel = ({ classes }) => { return ( @@ -120,7 +219,7 @@ const FacetPanel = ({ classes }) => { />
{`${checkboxItem.name}`} - +   {`(${checkboxItem.subjects})`} @@ -129,15 +228,19 @@ const FacetPanel = ({ classes }) => { ); }) } - - - - - - ); - } - return ''; - })} + + + + + ))} + + + + + + + + ))} ); }; @@ -145,25 +248,58 @@ const FacetPanel = ({ classes }) => { const styles = () => ({ expansionPanelRoot: { boxShadow: 'none', - background: 'transparent', + background: '#D2D2D2', margin: 'auto', position: 'initial', '&:before': { position: 'initial', }, }, - dividerRoot: { - backgroundColor: '#B0CFE1', - marginLeft: '45px', - height: '1px', + expansionPanelsideBarItem: { + boxShadow: 'none', + borderTop: '1px solid #000000', + borderLeft: '1px solid #D2D2D2', + borderRight: '1px solid #D2D2D2', + '&:last-child': { + borderBottom: '1px solid #D2D2D2', + }, + margin: 'auto', + position: 'initial', + '&:before': { + position: 'initial', + }, + }, + backdrop: { + // position: 'absolute', + zIndex: 99999, + background: 'rgba(0, 0, 0, 0.1)', + }, + expansionPanelDetailsRoot: { + paddingBottom: '8px', + display: 'unset', + }, + dropDownIconSection: { + fill: '#000000', }, - panelSummaryText: { - marginLeft: '24px', - color: '#3F799A', + dropDownIconSubSection: { + fill: '#3695A9', + }, + sectionSummaryText: { + marginLeft: '-6px', + color: '#000000', + fontFamily: 'Lato', + fontSize: '20px', + lineHeight: '26px', + letterSpacing: 0, + }, + subSectionSummaryText: { + marginLeft: '16px', + color: '#000000', fontFamily: 'Lato', fontSize: '14px', - fontWeight: 'bold', textTransform: 'uppercase', + lineHeight: 0, + letterSpacing: 0, }, panelDetailText: { color: '#000000', @@ -171,18 +307,12 @@ const styles = () => ({ fontSize: '14px', marginRight: '12px', }, - panelDetailTextSubjectCount: { - color: '#137fbe', - }, checkboxRoot: { color: '#344B5A', height: 12, }, listItemGutters: { - padding: '8px 0px 8px 30px', - }, - expansionPanelDetailsRoot: { - paddingBottom: '8px', + padding: '8px 0px 8px 15px', }, }); diff --git a/src/components/SideBar/SideBarView.js b/src/components/SideBar/SideBarView.js index cf6df8a68..12ed5db2c 100644 --- a/src/components/SideBar/SideBarView.js +++ b/src/components/SideBar/SideBarView.js @@ -1,22 +1,22 @@ import React from 'react'; -import { useSelector, useDispatch } from 'react-redux'; +import { useSelector } from 'react-redux'; import { - withStyles, Divider, Drawer, List, Button, + withStyles, Drawer, List, Button, } from '@material-ui/core'; -import cn from '../../utils/classNameConcat'; import FacetFilter from './SideBarComponents/FacetFilters'; import { facetSearchData } from '../../bento/dashboardData'; -import { toggleCheckBox } from '../../pages/dashboard/dashboardState'; -import { unselectFilters } from '../../utils/dashboardUtilFunctions'; +import { clearAllFilters } from '../../pages/dashboardTab/store/dashboardReducer'; const drawerWidth = 240; const SideBarContent = ({ classes }) => { - const dispatch = useDispatch(); const activeFilters = useSelector((state) => ( - state.dashboard.datatable - && state.dashboard.datatable.filters - ? state.dashboard.datatable.filters : [])); + state.dashboardTab + && state.dashboardTab.allActiveFilters + ? state.dashboardTab.allActiveFilters : {})); + const activeFiltersCount = Object.entries(activeFilters).reduce( + (acc, [key, val]) => acc + (val.length), 0, // eslint-disable-line no-unused-vars + ); const countFilters = facetSearchData ? facetSearchData.reduce((n, facet) => n + (facet.show === true), 0) : 0; return ( @@ -36,24 +36,21 @@ const SideBarContent = ({ classes }) => { > { countFilters > 0 && (
-
-
Filter Cases
+
- @@ -67,9 +64,6 @@ const styles = (theme) => ({ drawerPaperRoot: { backgroundColor: 'transparent', }, - drawerAppBar: { - height: '54px', - }, drawer: { width: drawerWidth, flexShrink: 0, @@ -84,9 +78,7 @@ const styles = (theme) => ({ border: 'none', }, floatRight: { - float: 'right', - marginTop: '13px', - marginRight: '10px', + margin: '14px 0px 14px 9px', }, floatLeft: { float: 'left', @@ -123,6 +115,9 @@ const styles = (theme) => ({ listRoot: { paddingTop: 0, paddingBottom: 1, + height: '900px', + overflowX: 'hidden', + overflowY: 'auto', }, dividerRoot: { backgroundColor: '#B0CFE1', diff --git a/src/components/Snackbar/Snackbar.js b/src/components/Snackbar/Snackbar.js new file mode 100644 index 000000000..757a7f44a --- /dev/null +++ b/src/components/Snackbar/Snackbar.js @@ -0,0 +1,41 @@ +import React from 'react'; +import Snackbar from '@material-ui/core/Snackbar'; +import { withStyles } from '@material-ui/core'; +import SuccessOutlinedIcon from '../../utils/SuccessOutlined'; + +const defaultFooterStyles = { + +}; + +const SnackbarView = ({ + snackbarState, closeSnack, autoHideDuration, classes, +}) => ( + + + + {' '} + + + + {snackbarState.value} + {' '} + File(s) successfully + {' '} + {snackbarState.action} + {' '} + to your files + + +
+)} + /> +); + +export default withStyles(defaultFooterStyles, { withTheme: true })(SnackbarView); diff --git a/src/components/Snackbar/index.js b/src/components/Snackbar/index.js new file mode 100644 index 000000000..049fb6a50 --- /dev/null +++ b/src/components/Snackbar/index.js @@ -0,0 +1 @@ +export { default } from './Snackbar'; diff --git a/src/components/Stats/DashboardStatsController.js b/src/components/Stats/DashboardStatsController.js index fdc89d478..2e3544ca9 100644 --- a/src/components/Stats/DashboardStatsController.js +++ b/src/components/Stats/DashboardStatsController.js @@ -6,8 +6,8 @@ import StatsView from './StatsView'; const Stats = () => { const data = useSelector((state) => ( state.dashboard - && state.dashboard.stats - ? state.dashboard.stats : [])); + && state.dashboardTab.stats + ? state.dashboardTab.stats : [])); return (!data || data.length === 0 ? () : ); }; diff --git a/src/components/Stats/StatsView.js b/src/components/Stats/StatsView.js index bdc906cf3..134965a79 100644 --- a/src/components/Stats/StatsView.js +++ b/src/components/Stats/StatsView.js @@ -1,111 +1,15 @@ -/* eslint-disable */ import React from 'react'; -import { globalStatsData as statsCount } from '../../bento/globalStatsData'; +import { StatsBar } from 'bento-components'; +import { statsStyling, globalStatsData } from '../../bento/globalStatsData'; -import { - withStyles, -} from '@material-ui/core'; - -const StatsView = ({ classes, data }) => ( +const StatsView = ({ data }) => ( <> -
-
- {statsCount.slice(0, 6).map((stat) => ( -
-
-
- {stat.statTitle} -
-
- {data[stat.statAPI]} -
-
-
- ))} -
-
+ ); -const styles = () => ({ - statsSection: { - top: '139px', - width: '100%', - zIndex: 999, - position: 'fixed', - background: '#8DCAFF', - textAlign: 'center', - left: 0, - right: 0, - display: 'flex', - justifyContent: 'flex-end', - }, - bannerTexture: { - color: '#4898B4', - fontFamily: 'Raleway', - fontSize: '19px', - fontWeight: '600', - lineHeight: '60px', - textAlign: 'center', - margin: '0 auto', - letterSpacing: '0.050pt', - textTransform: 'uppercase', - width: '869px', - }, - boxCut: { - direction: 'ltr', - display: 'inline-flex', - borderBottom: '47px solid #8DCAFF', - borderLeft: '50px solid transparent', - height: '47px', - }, - box: { - direction: 'ltr', - display: 'inline-flex', - borderBottom: '47px solid #8DCAFF', - height: '47px', - margin: '0 auto', - }, - statsText: { - height: '42px', - }, - statTitle: { - display: 'inline-block', - float: 'left', - color: '#062D4F', - fontFamily: 'Nunito', - fontWeight: 'bold', - fontSize: '11px', - letterSpacing: '1px', - marginRight: '8px', - marginTop: '14px', - textTransform: 'uppercase', - }, - statCount: { - display: 'inline-block', - color: '#0467BD', - fontFamily: 'Oswald', - fontSize: '20px', - marginTop: '4px', - fontWeight: 600, - }, - floatLeft: { - float: 'left', - marginTop: '3px', - letterSpacing: '1px', - }, - floatRight: { - float: 'right', - marginLeft: '6px', - marginTop: '3px', - }, - statsGroup: { - // padding: '36px 48px 4px 48px', - // borderBottom: '2px solid', - margin: '4px 32px', - }, -}); - -export default withStyles(styles, { withTheme: true })(StatsView); +export default StatsView; diff --git a/src/components/Stats/pageSpecificStatsController.js b/src/components/Stats/pageSpecificStatsController.js index d88336822..7f0d4a698 100644 --- a/src/components/Stats/pageSpecificStatsController.js +++ b/src/components/Stats/pageSpecificStatsController.js @@ -1,7 +1,7 @@ import React from 'react'; import { useSelector, useDispatch } from 'react-redux'; import CircularProgress from '@material-ui/core/CircularProgress'; -import { filterData } from '../../utils/dashboardUtilFunctions'; +import { filterData } from 'bento-components'; import { getFilteredStat, fetchDataForDashboardDataTable } from '../../pages/dashboard/dashboardState'; import StatsView from './StatsView'; diff --git a/src/components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutController.js b/src/components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutController.js deleted file mode 100644 index bca38afac..000000000 --- a/src/components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutController.js +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; -import DonutView from './CustomActiveDonutView'; - -const DonutController = ({ - data, ...props -}) => ; - -export default DonutController; diff --git a/src/components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutView.js b/src/components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutView.js deleted file mode 100644 index 929ff754d..000000000 --- a/src/components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutView.js +++ /dev/null @@ -1,117 +0,0 @@ -import React, { PureComponent } from 'react'; -import { - PieChart, Pie, Sector, Cell, ResponsiveContainer, -} from 'recharts'; - -const COLORS_EVEN = [ - '#D4D4D4', - '#057EBD', - '#0C3151', - '#F78F49', - '#79287C', - '#7CC242', - '#61479D', -]; - -const COLORS_ODD = [ - '#057EBD', - '#0C3151', - '#F78F49', - '#79287C', - '#7CC242', - '#61479D', - '#D4D4D4', -]; - -const renderActiveShape = (props) => { - // const RADIAN = Math.PI / 180; - const { - cx, cy, innerRadius, outerRadius, startAngle, endAngle, - fill, payload, value, textColor, fontSize, - } = props; - // const sin = Math.sin(-RADIAN * midAngle); - // const cos = Math.cos(-RADIAN * midAngle); - // const sx = cx + (outerRadius + 2) * cos; - // const sy = cy + (outerRadius + 2) * sin; - // const mx = cx + (outerRadius + 5) * cos; - // const my = cy + (outerRadius + 5) * sin; - // const ex = mx + (cos >= 0 ? 1 : -1) * 20; - // const ey = my; - // const textAnchor = cos >= 0 ? 'start' : 'end'; - - return ( - - {String(payload.name).length > 30 ? `${String(payload.name).substr(0, 30)}...` : payload.name} - {`${value}`} - Cases - - - - - ); -}; - -export default class CustomActiveDonut extends PureComponent { - constructor(props) { - super(props); - this.state = { activeIndex: 0 }; - } - - onPieEnter = (data, index) => { - this.setState({ - activeIndex: index, - }); - }; - - render() { - const { - data: DataObj, textColor, - } = this.props; - const data = DataObj.map((obj) => ({ - name: obj.group, - value: obj.subjects, - })); - - const { activeIndex } = this.state; - - return ( - - - - {data.map((entry, index) => ( - - ))} - - - - ); - } -} diff --git a/src/components/Widgets/PieCharts/Donut/DonutController.js b/src/components/Widgets/PieCharts/Donut/DonutController.js deleted file mode 100644 index 5db09293f..000000000 --- a/src/components/Widgets/PieCharts/Donut/DonutController.js +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; -import DonutView from './DonutView'; - -const DonutController = ({ - data, ...props -}) => ; - -export default DonutController; diff --git a/src/components/Widgets/PieCharts/Donut/DonutView.js b/src/components/Widgets/PieCharts/Donut/DonutView.js deleted file mode 100644 index 4d0ac70d3..000000000 --- a/src/components/Widgets/PieCharts/Donut/DonutView.js +++ /dev/null @@ -1,46 +0,0 @@ -import React, { PureComponent } from 'react'; -import { - PieChart, Pie, Tooltip, Cell, -} from 'recharts'; - -const COLORS = [ - '#523175', - '#6e7ff5', - '#fc4b5b', - '#2b69a3', - '#287d6d', - '#af66ff', -]; - -export default class GenderDonut extends PureComponent { - render() { - const { - data: DataObj, width, height, innerRadius, outerRadius, cx, cy, - } = this.props; - - // Ajay Need to replace this with a utility function - const data = DataObj.map((obj) => ({ - name: obj.item, - value: obj.cases, - })); - return ( - - - {data.map((entry, index) => ( - - ))} - - - - ); - } -} diff --git a/src/components/Widgets/PieCharts/ProgramSunburst/ProgramSunburstController.js b/src/components/Widgets/PieCharts/ProgramSunburst/ProgramSunburstController.js deleted file mode 100644 index aee3609da..000000000 --- a/src/components/Widgets/PieCharts/ProgramSunburst/ProgramSunburstController.js +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; -import ProgramSunburstView from './ProgramSunburstView'; - -const ProgramSunburstController = ({ - data, ...props -}) => ; - -export default ProgramSunburstController; diff --git a/src/components/Widgets/PieCharts/ProgramSunburst/ProgramSunburstView.js b/src/components/Widgets/PieCharts/ProgramSunburst/ProgramSunburstView.js deleted file mode 100644 index 063f14747..000000000 --- a/src/components/Widgets/PieCharts/ProgramSunburst/ProgramSunburstView.js +++ /dev/null @@ -1,162 +0,0 @@ -import React, { PureComponent } from 'react'; -import { Sunburst, LabelSeries } from 'react-vis'; -import { withStyles } from '@material-ui/core'; - -function getKeyPath(node) { - if (!node.parent) { - return ['root']; - } - - return [(node.data && node.data.title) || node.title].concat( - getKeyPath(node.parent), - ); -} - -function updateData(d, keyPath) { - const data = d; - if (data.children) { - data.children.map((child) => updateData(child, keyPath)); - data.style = { - ...data.style, - fillOpacity: keyPath && !keyPath[data.title] ? 0.2 : 0.7, - }; - } else { - data.style = { - ...data.style, - fillOpacity: keyPath && !keyPath[data.title] ? 0.2 : 1, - }; - } - return data; -} - -// find the caseSize of a given title -function findCaseSizeOfTitle(data, title) { - if (title === '') { - return data.caseSize; - } - if (data.title !== title) { - if (data.children) { - let match = 0; - data.children.forEach((d) => { - const res = findCaseSizeOfTitle(d, title); - if (res !== 0) { - match = res; - } - }); - return match; - } - return 0; - } - return data.caseSize; -} - -const styles = (theme) => ({ - title: { - color: theme.palette.widgetBackground.contrastText, - fontSize: '12px', - maxWidth: '1440px', - fontFamily: 'Nunito', - lineHeight: '20px', - fontWeight: '500', - height: '20px', - textAlign: 'center', - }, - customWidget: { - marginTop: '18px', - }, -}); - -class ProgramSunburst extends PureComponent { - constructor(props) { - super(props); - const { data } = this.props; - this.state = { - widgetData: data, - size: findCaseSizeOfTitle(data, ''), - title: '', - caseSize: data.children[0].caseSize, - }; - } - - render() { - const { - caseSize, size, widgetData, title, - } = this.state; - const { - width, height, data, textColor, classes, - } = this.props; - // update the caseSize associated with title - - this.setState({ - widgetData: data, - size, - title, - caseSize: findCaseSizeOfTitle(data, title), - }); - - return ( - <> -
- { - const path = getKeyPath(node).reverse(); - const pathAsMap = path.reduce((res, row) => { - res[row.toString()] = true; - return res; - }, {}); - const wdata = updateData(widgetData, pathAsMap); - this.setState({ - size: node.size, - widgetData: wdata, - title: node.title, - caseSize: node.size || node.caseSize, - }); - }} - > - {caseSize > 0 && ( - - )} - -
- {title} -
-
- - ); - } -} - -export default withStyles(styles)(ProgramSunburst); diff --git a/src/components/Wrappers/Wrappers.js b/src/components/Wrappers/Wrappers.js index b76d66e79..a8fc2251d 100755 --- a/src/components/Wrappers/Wrappers.js +++ b/src/components/Wrappers/Wrappers.js @@ -1,5 +1,4 @@ /* eslint-disable */ - import React from "react"; import { withStyles, diff --git a/src/components/serverPaginatedTable/serverPaginatedTable.js b/src/components/serverPaginatedTable/serverPaginatedTable.js new file mode 100644 index 000000000..37c9ed91d --- /dev/null +++ b/src/components/serverPaginatedTable/serverPaginatedTable.js @@ -0,0 +1,228 @@ +/* eslint-disable react/destructuring-assignment */ +/* eslint-disable react/state-in-constructor */ +import React from 'react'; +import TableFooter from '@material-ui/core/TableFooter'; +import TableRow from '@material-ui/core/TableRow'; +import TablePagination from '@material-ui/core/TablePagination'; + +import { CircularProgress, Backdrop, withStyles } from '@material-ui/core'; +import { CustomDataTable } from 'bento-components'; +import client from '../../utils/graphqlClient'; + +class ServerPaginatedTableView extends React.Component { + state = { + count: 1, + rowsPerPage: 10, + sortOrder: {}, + data: 'undefined', + isLoading: false, + }; + + componentDidMount() { + this.getData('', 0); + } + + componentDidUpdate(prevProps) { + if (this.props.data !== prevProps.data) { + this.getData('', 0); + } + } + + // get data + getData = (url, page) => { + this.xhrRequest(url, page).then((res) => { + this.setState({ data: res.data, count: this.props.count }); + }); + } + + getSrcData = () => this.props.data; + + rowsSelectedTrigger = (displayedData) => { + if (this.props.options.rowsSelectedTrigger) { + this.props.options.rowsSelectedTrigger( + displayedData.map((d) => d[this.props.options.dataKey]), + ); + } + } + + sort = (page, sortOrder) => { + this.setState({ isLoading: true }); + this.fetchData(page * this.state.rowsPerPage, this.state.rowsPerPage, sortOrder).then((res) => { + this.rowsSelectedTrigger(res); + this.setState({ + isLoading: false, + sortOrder, + data: res, + }); + }); + } + + // mock async function + xhrRequest = (url, page, sortOrder = {}) => new Promise((resolve) => { + // mock page data + let fullData = this.getSrcData() !== {} ? this.getSrcData() : [{}]; + // mock record count from server - normally this would be a number attached to the return data + const total = 60; + + const sortField = sortOrder.name; + const sortDir = sortOrder.direction; + + if (sortField) { + fullData = fullData.sort((a, b) => { + if (a[sortField] < b[sortField]) { + return 1 * (sortDir === 'asc' ? -1 : 1); + } if (a[sortField] > b[sortField]) { + return -1 * (sortDir === 'asc' ? -1 : 1); + } + return 0; + }); + } + + // eslint-disable-next-line max-len + const srcData = fullData.slice(page * this.state.rowsPerPage, (page + 1) * this.state.rowsPerPage); + const data = srcData; + + setTimeout(() => { + resolve({ + data, total, page, + }); + }, 500); + }) + + changePage = (page, sortOrder) => { + this.setState({ + isLoading: true, + }); + this.fetchData( + page * this.state.rowsPerPage, + this.state.rowsPerPage, + this.state.sortOrder, + ).then((res) => { + this.rowsSelectedTrigger(res); + this.setState({ + isLoading: false, + sortOrder, + data: res, + }); + }); + }; + + updateData = () => { + this.setState({ + isLoading: true, + }); + this.setState({ + isLoading: false, + data: this.getSrcData(), + }); + }; + + async fetchData(offset, rowsRequired, sortOrder = {}) { + let sortDirection = 'asc'; + let sortColumn = 'arm'; + + sortDirection = Object.keys(sortOrder).length === 0 ? this.props.defaultSortDirection || 'asc' : sortOrder.direction; + sortColumn = Object.keys(sortOrder).length === 0 ? this.props.defaultSortCoulmn || '' : sortOrder.name; + const fetchResult = await client + .query({ + query: sortDirection !== 'asc' ? this.props.overviewDesc : this.props.overview, + variables: { + offset, + first: this.props.count < rowsRequired ? this.props.count : rowsRequired, + order_by: sortColumn, + ...this.props.queryCustomVaribles, + }, + }) + .then((result) => (sortDirection !== 'asc' ? result.data[this.props.paginationAPIFieldDesc] : result.data[this.props.paginationAPIField])); + return fetchResult; + } + + render() { + const { + data, count, isLoading, rowsPerPage, sortOrder, className, + } = this.state; + const options1 = { + filterType: 'dropdown', + responsive: 'stacked', + serverSide: true, + count, + rowsPerPage, + rowsPerPageOptions: [], + sortOrder, + onRowSelectionChange: ( + curr, + allRowsSelected, + rowsSelected, + displayData, + ) => this.props.options.onRowSelectionChange( + curr, + allRowsSelected, + rowsSelected, + displayData, + data, + ), + // eslint-disable-next-line no-shadow + customFooter: (count, page, rowsPerPage, changeRowsPerPage, changePage) => ( + + + { this.setState({ rowsPerPage: event.target.value }); changePage(page); changeRowsPerPage(event.target.value); }} + // eslint-disable-next-line no-shadow + onChangePage={(_, page) => changePage(page)} + /> + + + ), + // rowsSelected: data.map((item, idx) => idx), + onTableChange: (action, tableState) => { + // console.log(action, tableState); + + // a developer could react to change on an action basis or + // examine the state as a whole and do whatever they want + + switch (action) { + case 'changePage': + this.changePage(tableState.page, tableState.sortOrder); + break; + case 'sort': + this.sort(tableState.page, tableState.sortOrder); + break; + default: + break; + } + }, + }; + + return ( +
+ + + + {data === 'undefined' ? : ( + + )} +
+ ); + } +} + +const styles = () => ({ + backdrop: { + position: 'absolute', + zIndex: 99999, + background: 'rgba(0, 0, 0, 0.1)', + }, +}); +export default withStyles(styles)(ServerPaginatedTableView); diff --git a/src/index.js b/src/index.js index c81bf4521..88ab71f31 100755 --- a/src/index.js +++ b/src/index.js @@ -2,21 +2,16 @@ import React from "react"; import ReactDOM from "react-dom"; import App from "./components/App"; import * as serviceWorker from "./serviceWorker"; -import ApolloClient from "apollo-boost"; -import { ApolloProvider } from "react-apollo"; +import { ApolloProvider } from '@apollo/client' import { Provider } from 'react-redux'; -import { ApolloProvider as ApolloProviderHooks } from "react-apollo-hooks"; import store from './store'; import client from './utils/graphqlClient'; ReactDOM.render( - {" "} - - , document.getElementById("root") ); diff --git a/src/pages/about/aboutBodyView.js b/src/pages/about/aboutBodyView.js deleted file mode 100644 index 36d40628d..000000000 --- a/src/pages/about/aboutBodyView.js +++ /dev/null @@ -1,266 +0,0 @@ -import React from 'react'; -import { Grid, withStyles, Link } from '@material-ui/core'; -import AboutHeader from './aboutHeaderView'; -import XoomInOut from './xoomInOutView'; -import Stats from '../../components/Stats/AllStatsController'; -import externalIcon from '../../assets/about/About-ExternalLink.svg'; -import submissionGuide from '../../assets/footer/ICDC_DGAB_Guidelines.pdf'; -import MyCasesWizardStep4 from '../../assets/icons/Cart-Wizard-Step2.svg'; - -const AboutBody = ({ classes, data }) => { - function boldText(text) { - const boldedText = text.split('$$').map((splitedText) => { - if (splitedText != null && (/\*(.*)\*/.test(splitedText))) { - return ({splitedText.match(/\*(.*)\*/).pop()}); - } - return splitedText; - }); - return boldedText; - } - return ( - <> - - -
-
- - - {data.content ? data.content.map((contentObj) => ( - <> - {/* Ordered List with Numbers logic */} - {contentObj.listWithNumbers && ( -
- {/* Numbered ordered list */} -
    - { contentObj.listWithNumbers.map((listObj) => ( - listObj.listWithAlpahbets ? ( - // Alphetised sub ordered list -
      - {/* bolding text if necessary */} - { listObj.listWithAlpahbets.map((listObj1) =>
    1. {listObj1.includes('$$') ? boldText(listObj1) : listObj1}
    2. )} -
    - ) :
  1. {listObj.includes('$$') ? boldText(listObj) : listObj}
  2. - ))} -
-
- )} - {/* Ordered List with Alphabets logic */} - {contentObj.listWithAlpahbets && ( -
- {/* Alphabetised ordered list */} -
    - { contentObj.listWithAlpahbets.map((listObj) =>
  1. {listObj.includes('$$') ? boldText(listObj) : listObj}
  2. )} -
-
- )} - {/* MyCases-Wizard-Step4-SVG */} - {contentObj.image && ( -
- Step1 - Select and Save to My Cases|
-                    Step2 - Review My Cases|
-                    Step3 - Select Files and Create Manifest|
-                    Step4 - Load Manifest to SBG -
- )} - {/* Paragraphs */} - {contentObj.paragraph && ( -
- { contentObj.paragraph.split('$$').map((splitedParagraph) => { - // Checking for regex ()[] pattern - if (splitedParagraph != null && ((/\[(.+)\]\((.+)\)/g.test(splitedParagraph)) || (/\((.+)\)\[(.+)\]/g.test(splitedParagraph)))) { - return ( - <> - - {splitedParagraph.match(/\[(.*)\]/).pop()} - - outbounnd web site icon - - ); - } - // For sub headings - if (splitedParagraph != null && (/#(.*)#/.test(splitedParagraph))) { - return (
{splitedParagraph.match(/#(.*)#/).pop()}
); - } - // For bolding inline words - if (splitedParagraph != null && (/\*(.*)\*/.test(splitedParagraph))) { - return ({splitedParagraph.match(/\*(.*)\*/).pop()}); - } - // For downloading Submission PDF - if (splitedParagraph != null && (/{(.*)}/.test(splitedParagraph))) { - return ( - - {splitedParagraph.match(/{(.*)}/).pop()} - - ); - } - return splitedParagraph; - })} -
- )} - - {/* Table logic */} - {contentObj.table && ( -
- - - - - - )) } - - - - { contentObj.table[1].body.map((rowObj, index) => ( - <> - - - {/* eslint-disable-next-line max-len */} - { rowObj.row.map((rowValue) => )} - - - )) } - -
- { contentObj.table[0].head.map((rowObj) => ( - <> - {rowObj}
{index + 1}{rowValue}
-
- )} -
- - )) : ''} -
- - {data.title} - -
-
-
- {data.secondaryZoomImageTitle - &&
{data.secondaryZoomImageTitle}
} - {data.secondaryZoomImage && secondary zoominout} - - ); -}; - -const styles = (theme) => ({ - container: { - color: '#000000', - fontFamily: 'Nunito', - fontSize: '15px', - lineHeight: '22px', - background: '#e7eef5', - }, - maxWidthContainer: { - margin: '0px auto 0px auto', - maxWidth: '1440px', - }, - secondayTitle: { - display: 'block', - textAlign: 'center', - fontWeight: 'bold', - marginBottom: '70px', - color: '#033D6F', - fontSize: '28px', - fontFamily: 'Lato', - }, - text: { - // height: '476px', - // width: '675px', - color: '#000000', - fontFamily: 'Nunito', - fontSize: '16px', - lineHeight: '30px', - }, - title: { - color: '#0B3556', - fontWeight: 'bold', - }, - rightSection: { - padding: '8px 25px 8px 0px !important', - float: 'left', - }, - leftSection: { - float: 'left', - }, - aboutSection: { - padding: '60px 45px', - }, - img: { - width: '100%', - }, - linkIcon: { - width: '20px', - verticalAlign: 'sub', - margin: '0px 0px 0px 2px', - }, - link: { - color: '#0296C9', - '&:hover': { - color: '#0296C9', - }, - }, - tableDiv: { - marginTop: '45px', - }, - table: { - borderSpacing: '0', - borderCollapse: 'collapse', - fontSize: '12px', - fontWeight: 'bold', - letterSpacing: '0.025em', - lineHeight: '30px', - textAlign: 'left', - width: '100%', - }, - tableHeader: { - fontFamily: theme.custom.fontFamily, - color: '#194563', - textTransform: 'uppercase', - - }, - tableBodyRow: { - borderSpacing: '0', - borderCollapse: 'collapse', - color: '#3E7AAA', - }, - tableCell: { - fontFamily: theme.custom.fontFamily, - fontSize: '14px', - padding: '8px 15px 8px 0px', - borderBottom: '0.66px solid #087CA5', - }, - headerCell: { - borderBottom: '4px solid #087CA5', - borderSpacing: '0', - borderCollapse: 'collapse', - fontWeight: 'bolder', - }, - MyCasesWizardStep4: { - width: '600px', - }, -}); - -AboutBody.defaultProps = { - classes: {}, - data: { - content: [], - }, -}; - -export default withStyles(styles)(AboutBody); diff --git a/src/pages/about/aboutController.js b/src/pages/about/aboutController.js index 55606d31a..ede414a0a 100644 --- a/src/pages/about/aboutController.js +++ b/src/pages/about/aboutController.js @@ -2,9 +2,10 @@ import React, { useState, useEffect } from 'react'; import yaml from 'js-yaml'; import axios from 'axios'; import YAMLData from '../../content/prod/aboutPagesContent.yaml'; -import AboutBody from './aboutBodyView'; +import env from '../../utils/env'; +import AboutView from './aboutView'; -const ABOUT_CONTENT_URL = process.env.REACT_APP_ABOUT_CONTENT_URL; +const ABOUT_CONTENT_URL = env.REACT_APP_ABOUT_CONTENT_URL; const About = ({ match }) => { const [data, setData] = useState([]); @@ -29,17 +30,7 @@ const About = ({ match }) => { }, [match.path]); return ( - <> - - + ); }; export default About; diff --git a/src/pages/about/aboutHeaderView.js b/src/pages/about/aboutHeaderView.js deleted file mode 100644 index dfd859dc5..000000000 --- a/src/pages/about/aboutHeaderView.js +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import { withStyles } from '@material-ui/core'; - -const AboutHeader = ({ classes, title }) => ( -
-
-
{title}
-
-
-
-); - -const styles = () => ({ - header: { - padding: '45px', - }, - container: { - background: '#e7eef5', - }, - whitePadding: { - height: '6px', - background: 'white', - }, - titleBody: { - textAlign: 'center', - }, - titleText: { - height: '65px', - width: '252px', - color: '#0077E3', - fontFamily: 'Lato', - fontSize: '35px', - fontWeight: 'bold', - }, -}); - -export default withStyles(styles)(AboutHeader); diff --git a/src/pages/about/aboutView.js b/src/pages/about/aboutView.js new file mode 100644 index 000000000..45e92ad2e --- /dev/null +++ b/src/pages/about/aboutView.js @@ -0,0 +1,34 @@ +import React from 'react'; +import { AboutHeader, AboutBody } from 'bento-components'; +import { withStyles } from '@material-ui/core'; +import Stats from '../../components/Stats/AllStatsController'; + +const AboutView = ({ classes, data }) => { + const getImage = (imgPath, alt) => {alt}; + + return ( + <> + + + + + + ); +}; +const styles = () => ({ + img: { + width: '100%', + }, +}); + +export default withStyles(styles)(AboutView); diff --git a/src/pages/about/xoomInOutView.js b/src/pages/about/xoomInOutView.js deleted file mode 100644 index b662fb3a2..000000000 --- a/src/pages/about/xoomInOutView.js +++ /dev/null @@ -1,154 +0,0 @@ -import React from 'react'; -import { - Button, - withStyles, -} from '@material-ui/core'; -import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch'; -import CenterIcon from '../../assets/about/Model-Buttons-Center.svg'; -import ZoomInIcon from '../../assets/about/Model-Buttons-ZoomIn.svg'; -import ZoomOutIcon from '../../assets/about/Model-Buttons-ZoomOut.svg'; - -const limitToBounds = false; -const panningEnabled = true; -const transformEnabled = true; -const pinchEnabled = true; -const limitToWrapperBounds = false; -const disabled = false; -const dbClickEnabled = true; -const lockAxisX = false; -const lockAxisY = false; -const velocityEqualToMove = false; -const enableWheel = true; -const enableTouchPadPinch = true; -const enableVelocity = true; -const disableLimitsOnWheel = true; - -const ModelPage = ({ classes, children }) => ( - <> - - {({ - zoomIn, - zoomOut, - resetTransform, - }) => ( -
-
- - - -
-
- - {children} - -
-
- )} -
- -); - -const styles = () => ({ - - linkIcon: { - width: '20px', - verticalAlign: 'sub', - margin: '0px 0px 0px 2px', - }, - linkIcon2: { - width: '20px', - verticalAlign: 'sub', - margin: '0px 0px 0px 0px', - }, - link: { - color: '#0296C9', - fontWeight: 'bolder', - '&:hover': { - color: '#0296C9', - fontWeight: 'bolder', - textDecoration: 'none', - }, - }, - title: { - color: '#0B3556', - textTransform: 'uppercase', - fontWeight: 'bold', - }, - button: { - color: 'white', - '& img': { - width: '40px', - }, - }, - container: { - maxWidth: '1440px', - margin: 'auto', - }, - tool: { - margin: '20px auto', - }, - schema: { - overflowX: 'hidden', - overflowY: 'hidden', - width: '100%', - margin: 'auto', - - }, - imgSection: { - width: '100%', - border: '2px solid #7D92AE', - borderRadius: '23px', - marginBottom: '20px', - height: 'auto', - overflow: 'hidden', - '& .react-transform-element': { - display: '-webkit-box !important', - }, - }, - img: { - width: '100%', - }, - modelContainer: { - display: 'flex', - maxWidth: '1440px', - margin: '-67px 40px 60px 40px', - textAlign: 'center', - '@media (min-width: 1400px)': { - margin: '-67px auto 60px auto', - }, - }, - tools: { - maxWidth: '60px', - height: '168px', - padding: '4px', - marginTop: '100px', - background: '#7D92AE', - borderRadius: '23px 0px 0px 23px', - }, -}); - -export default withStyles(styles, { withTheme: true })(ModelPage); diff --git a/src/pages/armDetail/armDetailController.js b/src/pages/armDetail/armDetailController.js index 1982dfa0c..60e7322a1 100644 --- a/src/pages/armDetail/armDetailController.js +++ b/src/pages/armDetail/armDetailController.js @@ -1,24 +1,25 @@ import React from 'react'; -import { Query } from 'react-apollo'; +import { useQuery } from '@apollo/client'; import CircularProgress from '@material-ui/core/CircularProgress'; import ArmDetailView from './armDetailView'; import { Typography } from '../../components/Wrappers/Wrappers'; import { GET_ARM_DETAIL_DATA_QUERY, dataRoot, armIDField } from '../../bento/armDetailData'; -const ArmDetailContainer = ({ match }) => ( - - {({ data, loading, error }) => ( - loading ? - : (error || !data || data[dataRoot][armIDField] !== match.params.id - ? ( - - {error && `An error has occurred in loading stats component: ${error}`} - - ) - : - ) - )} - -); +const ArmDetailContainer = ({ match }) => { + const { loading, error, data } = useQuery(GET_ARM_DETAIL_DATA_QUERY, { + variables: { [armIDField]: match.params.id }, + }); + + if (loading) return ; + if (error || !data || data[dataRoot][armIDField] !== match.params.id) { + return ( + + {error ? `An error has occurred in loading stats component: ${error}` : 'Recieved wrong data'} + + ); + } + + return ; +}; export default ArmDetailContainer; diff --git a/src/pages/armDetail/armDetailView.js b/src/pages/armDetail/armDetailView.js index 8e4c375e1..34912818c 100644 --- a/src/pages/armDetail/armDetailView.js +++ b/src/pages/armDetail/armDetailView.js @@ -1,14 +1,12 @@ import React from 'react'; -import { useDispatch } from 'react-redux'; +// import { useDispatch } from 'react-redux'; import { Grid, withStyles, } from '@material-ui/core'; import { Link } from 'react-router-dom'; -import { CustomDataTable } from 'bento-components'; -import TableFooter from '@material-ui/core/TableFooter'; -import TableRow from '@material-ui/core/TableRow'; -import TablePagination from '@material-ui/core/TablePagination'; +import { getOptions, getColumns, CustomActiveDonut } from 'bento-components'; +import GridWithFooter from '../../components/GridWithFooter/GridView'; import StatsView from '../../components/Stats/StatsView'; import { Typography } from '../../components/Wrappers/Wrappers'; import icon from '../../assets/icons/Arms.Icon.svg'; @@ -17,100 +15,44 @@ import { header, subsections, table, + tooltipContent, } from '../../bento/armDetailData'; -import formatBytes from '../../utils/formatBytes'; -// import { fetchDataForDashboardDataTable, singleCheckBox } from '../dashboard/dashboardState'; - -import { singleCheckBox } from '../dashboard/dashboardState'; +import { + singleCheckBox, setSideBarToLoading, setDashboardTableLoading, +} from '../dashboardTab/store/dashboardReducer'; import Widget from '../../components/Widgets/WidgetView'; -import CustomActiveDonut from '../../components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutController'; import PropertySubsection from '../../components/PropertySubsection/armDetailSubsection'; - -const FileCount = ({ num_files: numFiles, classes }) => ( -
-
Number of Files
- - - -
- Bento file count icon -
- {numFiles} -
-
-
-
-
-); - -const options = (classes) => ({ - selectableRows: 'none', - responsive: 'stacked', - search: false, - filter: false, - searchable: false, - print: false, - download: false, - viewColumns: false, - pagination: true, - sortOrder: { - name: table.defaultSortField, - direction: table.defaultSortDirection, - }, - customFooter: (count, page, rowsPerPage, changeRowsPerPage, changePage) => ( - - - = 11 ? classes.root : classes.noDisplay} - count={count} - page={page} - rowsPerPage={rowsPerPage} - onChangeRowsPerPage={(event) => changeRowsPerPage(event.target.value)} - // eslint-disable-next-line no-shadow - onChangePage={(_, page) => changePage(page)} - /> - - - ), -}); +import NumberOfThings from '../../components/NumberOfThings'; +import Snackbar from '../../components/Snackbar'; +import colors from '../../utils/colors'; // Main case detail component const ArmDetail = ({ data, classes }) => { - const dispatch = useDispatch(); + // const dispatch = useDispatch(); - // React.useEffect(() => { - // // Update dashboard first - // dispatch(fetchDataForDashboardDataTable()); - // }, []); + const [snackbarState, setsnackbarState] = React.useState({ + open: false, + value: 0, + }); + function openSnack(value1) { + setsnackbarState({ open: true, value: value1 }); + } + function closeSnack() { + setsnackbarState({ open: false }); + } - const redirectTo = async () => { - dispatch(singleCheckBox([{ + const redirectTo = () => { + setSideBarToLoading(); + setDashboardTableLoading(); + singleCheckBox([{ + datafield: 'studies', groupName: 'Arm', - name: data.study_info, - datafield: 'study_info', isChecked: true, - }])); + name: data.study_info, + section: 'Filter By Cases', + }]); }; - const columns = table.columns.map((column, index) => ( - { - name: column.dataField, - label: column.header, - options: { - customBodyRender: (value) => ( -
- {' '} - {column.formatBytes ? formatBytes(value) : value} - {' '} -
- ), - }, - } - )); const stat = { numberOfPrograms: 1, numberOfStudies: 1, @@ -122,6 +64,12 @@ const ArmDetail = ({ data, classes }) => { return ( <> +
@@ -170,7 +118,7 @@ const ArmDetail = ({ data, classes }) => { {/* Left panel */} - +
{ subsections.slice(0, 6).map((section, index) => ( @@ -181,7 +129,7 @@ const ArmDetail = ({ data, classes }) => { {/* Left panel end */} {/* Right panel */} - +
{/* Diagnosis donut */}
@@ -201,12 +149,15 @@ const ArmDetail = ({ data, classes }) => { outerRadius={75} cx="50%" cy="50%" - fontSize="15px" + fontSize="12px" + colors={colors} + titleLocation="bottom" + titleAlignment="center" />
{/* File count */} - +
{/* Right panel end */} @@ -222,10 +173,21 @@ const ArmDetail = ({ data, classes }) => { - @@ -338,7 +300,7 @@ const styles = (theme) => ({ detailContainer: { maxWidth: theme.custom.maxContentWidth, margin: 'auto', - padding: '5px 0 10px 10px', + padding: '5px 0 10px 0px', fontFamily: theme.custom.fontFamily, letterSpacing: '0.014em', color: '#000000', @@ -349,13 +311,19 @@ const styles = (theme) => ({ detailPanel: { borderRight: 'solid 1px #81A6BA', }, + leftPanel: { + paddingLeft: '0px', + }, + rightPanel: { + paddingLeft: '16px !important', + }, innerPanel: { height: '100%', minHeight: '590px', maxHeight: '700px', overflowY: 'auto', overflowX: 'hidden', - paddingLeft: '16px', + paddingLeft: '0px', paddingRight: '40px', scrollbarColor: '#697270', }, @@ -409,7 +377,7 @@ const styles = (theme) => ({ }, tableContainer: { background: '#FFFFFF', - padding: '0 117px', + padding: '0 0px', }, tableHeader: { paddingLeft: '32px', @@ -427,6 +395,19 @@ const styles = (theme) => ({ color: '#3695A9', paddingBottom: '19px', }, + link: { + color: '#DC762F', + textDecoration: 'none', + '&:hover': { + textDecoration: 'underline', + }, + }, + externalLinkIcon: { + width: '14.5px', + verticalAlign: 'sub', + marginLeft: '4px', + paddingBottom: '2px', + }, }); export default withStyles(styles, { withTheme: true })(ArmDetail); diff --git a/src/pages/caseDetail/caseDetailController.js b/src/pages/caseDetail/caseDetailController.js index 8fec94634..6d2c4c931 100644 --- a/src/pages/caseDetail/caseDetailController.js +++ b/src/pages/caseDetail/caseDetailController.js @@ -1,24 +1,27 @@ import React from 'react'; -import { Query } from 'react-apollo'; +import { useQuery } from '@apollo/client'; import CircularProgress from '@material-ui/core/CircularProgress'; import CaseDetailView from './caseDetailView'; import { Typography } from '../../components/Wrappers/Wrappers'; -import { GET_CASE_DETAIL_DATA_QUERY, dataRoot, caseIDField } from '../../bento/caseDetailData'; +import { + GET_CASE_DETAIL_DATA_QUERY, dataRoot, caseIDField, filesOfSamples, +} from '../../bento/caseDetailData'; -const CaseDetailContainer = ({ match }) => ( - - {({ data, loading, error }) => ( - loading ? - : (error || !data || data[dataRoot][caseIDField] !== match.params.id - ? ( - - {error && `An error has occurred in loading stats component: ${error}`} - - ) - : - ) - )} - -); +const CaseDetailContainer = ({ match }) => { + const { loading, error, data } = useQuery(GET_CASE_DETAIL_DATA_QUERY, { + variables: { [caseIDField]: match.params.id }, + }); + + if (loading) return ; + if (error || !data || data[dataRoot][caseIDField] !== match.params.id) { + return ( + + {error ? `An error has occurred in loading stats component: ${error}` : 'Recieved wrong data'} + + ); + } + + return ; +}; export default CaseDetailContainer; diff --git a/src/pages/caseDetail/caseDetailView.js b/src/pages/caseDetail/caseDetailView.js index 42a9195df..1fd16bcf7 100644 --- a/src/pages/caseDetail/caseDetailView.js +++ b/src/pages/caseDetail/caseDetailView.js @@ -3,64 +3,39 @@ import { Grid, withStyles, } from '@material-ui/core'; -import { CustomDataTable } from 'bento-components'; -import TableFooter from '@material-ui/core/TableFooter'; -import TableRow from '@material-ui/core/TableRow'; -import TablePagination from '@material-ui/core/TablePagination'; +import _ from 'lodash'; import { useDispatch } from 'react-redux'; +import { getOptions, getColumns } from 'bento-components'; import StatsView from '../../components/Stats/StatsView'; import { Typography } from '../../components/Wrappers/Wrappers'; +import GridWithFooter from '../../components/GridWithFooter/GridView'; import icon from '../../assets/icons/Cases.Icon.svg'; -import formatBytes from '../../utils/formatBytes'; import Subsection from '../../components/PropertySubsection/caseDetailSubsection'; import CustomBreadcrumb from '../../components/Breadcrumb/BreadcrumbView'; import { caseHeader, leftPanel, rightPanel, - table, + table1, + table2, + externalLinkIcon, + tooltipContent, } from '../../bento/caseDetailData'; +import Snackbar from '../../components/Snackbar'; import { fetchDataForDashboardDataTable } from '../dashboard/dashboardState'; -const options = (classes) => ({ - selectableRows: 'none', - responsive: 'stacked', - search: false, - filter: false, - searchable: false, - print: false, - download: false, - viewColumns: false, - pagination: true, - sortOrder: { - name: table.defaultSortField, - direction: table.defaultSortDirection, - }, - customFooter: (count, page, rowsPerPage, changeRowsPerPage, changePage) => ( - -
- {count >= 11 - ? ( - - changeRowsPerPage(event.target.value)} - // eslint-disable-next-line no-shadow - onChangePage={(_, page) => changePage(page)} - /> - - ) - : ''} -
-
- ), -}); - // Main case detail component -const CaseDetail = ({ data, classes }) => { +const CaseDetail = ({ data, filesOfSamples, classes }) => { + const [snackbarState, setsnackbarState] = React.useState({ + open: false, + value: 0, + }); + function openSnack(value1) { + setsnackbarState({ open: true, value: value1 }); + } + function closeSnack() { + setsnackbarState({ open: false }); + } const dispatch = useDispatch(); // make sure dashboard data has been loaded first for stats bar to work @@ -74,7 +49,7 @@ const CaseDetail = ({ data, classes }) => { numberOfSubjects: 1, numberOfSamples: data.num_samples, numberOfLabProcedures: data.num_lab_procedures, - numberOfFiles: data[table.filesField].length, + numberOfFiles: data.files.length, }; const breadCrumbJson = [{ @@ -83,24 +58,35 @@ const CaseDetail = ({ data, classes }) => { isALink: true, }]; - const columns = table.columns.slice(0, 10).map((column, index) => ( - { - name: column.dataField, - label: column.header, - options: { - customBodyRender: (value) => ( -
- {' '} - {column.formatBytes ? formatBytes(value) : value} - {' '} -
- ), - }, + // those are questioning codes for ICDC only, need to remove from here. + const filesOfSamplesObj = filesOfSamples.reduce( + (obj, item) => ({ ...obj, [item.sample_id]: item.files }), {}, + ); + + // NOTE: Needs improvement. + const datFieldsFromRoot = []; + table1.columns.forEach((e) => (e.dataFromRoot ? datFieldsFromRoot.push(e.dataField) : null)); + + const samplesData = data.samples.map((s) => { + const files = filesOfSamplesObj[s.sample_id]; + const sample = _.cloneDeep(s); + sample.files = files; + if (datFieldsFromRoot.length > 0) { + datFieldsFromRoot.forEach((e) => { + sample[e] = data[e]; + }); } - )); + return sample; + }); return ( <> +
@@ -138,7 +124,7 @@ const CaseDetail = ({ data, classes }) => { {/* Left panel */} - +
{leftPanel.slice(0, 3).map((section) => ( @@ -153,8 +139,8 @@ const CaseDetail = ({ data, classes }) => { {/* Left panel end */} {/* Right panel */} - -
+ +
{rightPanel.slice(0, 3).map((section) => ( {
- { - table.display - ? ( -
-
-
- {table.title} -
- - - - - - - - + {table1.display + ? ( +
+
+ + + + + {table1.tableTitle} +
+ )} + columns={getColumns(table1, classes, data, externalLinkIcon)} + options={getOptions(table1, classes)} + customOnRowsSelect={table1.customOnRowsSelect} + openSnack={openSnack} + closeSnack={closeSnack} + disableRowSelection={table1.disableRowSelection} + buttonText={table1.buttonText} + saveButtonDefaultStyle={table1.saveButtonDefaultStyle} + ActiveSaveButtonDefaultStyle={table1.ActiveSaveButtonDefaultStyle} + DeactiveSaveButtonDefaultStyle={table1.DeactiveSaveButtonDefaultStyle} + tooltipMessage={table1.tooltipMessage} + tooltipContent={tooltipContent} + /> -
+
- ) : '' - } +
+ ) : ''} + {table2.display + ? ( +
+
+ + + + + {table2.tableTitle} +
+ )} + columns={getColumns(table2, classes, data)} + options={getOptions(table2, classes)} + customOnRowsSelect={table2.customOnRowsSelect} + openSnack={openSnack} + closeSnack={closeSnack} + disableRowSelection={table2.disableRowSelection} + buttonText={table2.buttonText} + saveButtonDefaultStyle={table1.saveButtonDefaultStyle} + ActiveSaveButtonDefaultStyle={table1.ActiveSaveButtonDefaultStyle} + DeactiveSaveButtonDefaultStyle={table1.DeactiveSaveButtonDefaultStyle} + tooltipMessage={table2.tooltipMessage} + tooltipContent={tooltipContent} + /> + + + +
+
+ ) : ''} +
); }; @@ -214,7 +241,7 @@ const styles = (theme) => ({ }, root: { fontFamily: theme.custom.fontFamily, - fontSize: '9px', + fontSize: '12px', letterSpacing: '0.025em', color: '#000', background: '#f3f3f3', @@ -254,10 +281,17 @@ const styles = (theme) => ({ marginTop: '-6px', filter: 'drop-shadow( 2px 2px 2px rgba(0, 0, 0, 0.2))', }, + link: { + color: '#DC762F', + textDecoration: 'none', + '&:hover': { + textDecoration: 'underline', + }, + }, detailContainer: { maxWidth: theme.custom.maxContentWidth, margin: 'auto', - padding: '26px 10px', + padding: '26px 10px 26px 0px', fontFamily: theme.custom.fontFamily, letterSpacing: '0.014em', color: '#000000', @@ -269,26 +303,32 @@ const styles = (theme) => ({ paddingBottom: '0 !important', borderRight: '1px solid #81A6BA', }, + leftPanel: { + paddingLeft: '25px !important', + }, + rightPanel: { + paddingLeft: '16px !important', + }, innerPanel: { height: '100%', minHeight: '209px', maxHeight: '380px', overflowY: 'auto', overflowX: 'hidden', - paddingLeft: '16px', + paddingLeft: '0px', scrollbarColor: '#697270', }, + innerPanelRight: { + paddingLeft: '30px', + }, tableContainer: { background: '#f3f3f3', }, - tableHeader: { - paddingLeft: '32px', - }, tableDiv: { maxWidth: '1340px', margin: 'auto', - paddingTop: '50px', - paddingLeft: '30px', + paddingTop: '30px', + paddingLeft: '0px', }, tableTitle: { textTransform: 'uppercase', @@ -296,11 +336,23 @@ const styles = (theme) => ({ fontSize: '17px', letterSpacing: '0.025em', color: '#3695A9', - paddingBottom: '19px', }, breadCrumb: { paddingTop: '3px', }, + snackBarMessageIcon: { + verticalAlign: 'middle', + }, + externalLinkIcon: { + width: '14.5px', + verticalAlign: 'sub', + marginLeft: '4px', + paddingBottom: '2px', + }, + blankSpace: { + height: '73px', + background: '#f3f3f3', + }, }); export default withStyles(styles, { withTheme: true })(CaseDetail); diff --git a/src/pages/dashboard/caseTable/caseView.js b/src/pages/dashboard/caseTable/caseView.js index 6171b292c..3a7591cc4 100644 --- a/src/pages/dashboard/caseTable/caseView.js +++ b/src/pages/dashboard/caseTable/caseView.js @@ -6,25 +6,14 @@ import { } from '@material-ui/core'; import { useSelector, useDispatch } from 'react-redux'; import { Link } from 'react-router-dom'; -import { CustomDataTable } from 'bento-components'; +import { CustomDataTable, manipultateLinks } from 'bento-components'; import Snackbar from '@material-ui/core/Snackbar'; -// import { Link } from 'react-router-dom'; import { dashboardTable, externalLinkIcon } from '../../../bento/dashboardData'; -import manipultateLinks from '../../../utils/helpers'; import SuccessOutlinedIcon from '../../../utils/SuccessOutlined'; import { cartSelectionMessages } from '../../../bento/cartWorkflowData'; import CustomFooter from './customFooter'; import { toggleCheckBox } from '../dashboardState'; -import { receiveCases } from '../../selectedCases/selectedCasesState'; - -// const tableStyle = (ratio = 1) => ({ -// : ((((document.documentElement.clientWidth - 280) * 0.6) / 10) * ratio), -// overflow: 'hidden', -// overflowWrap:' break-wor',; -// maxWidth: ((((document.documentElement.clientWidth - 280) * 0.6) / 10) * ratio), -// minWidth: '100px', -// } -// ); +import { addToCart } from '../../fileCentricCart/store/cart'; const Cases = ({ classes, data }) => { const [snackbarState, setsnackbarState] = React.useState({ @@ -45,7 +34,7 @@ const Cases = ({ classes, data }) => { ? state.dashboard.datatable.filters : [])); // Get the existing caseIds from MyCases cart state - const caseIds = useSelector((state) => state.cart.cases); + const caseIds = useSelector((state) => state.cart.subjectIds); // The bubble below will shows in the dashboard and work as // When user select and filters @@ -129,7 +118,7 @@ const Cases = ({ classes, data }) => { if (uniqueCases > 0) { openSnack(uniqueCases); } - dispatch(receiveCases(selectedCaseIds)); + addToCart({ subjectIds: selectedCaseIds }); selectedCaseIds = []; } diff --git a/src/pages/dashboard/dashboard.js b/src/pages/dashboard/dashboard.js index aa8864ea3..20517c183 100644 --- a/src/pages/dashboard/dashboard.js +++ b/src/pages/dashboard/dashboard.js @@ -2,15 +2,15 @@ import React from 'react'; import { Grid, withStyles, Button, Switch, Collapse, FormControlLabel, } from '@material-ui/core'; +import { ProgramSunburst, CustomActiveDonut } from 'bento-components'; import { useTheme } from '../../components/ThemeContext'; import Widget from '../../components/Widgets/WidgetView'; import Stats from '../../components/Stats/DashboardStatsController'; import Cases from './caseTable/caseController'; // import PositionedSnackbar from '../../components/Disclaimer/DisclaimerView'; -import ProgramSunburst from '../../components/Widgets/PieCharts/ProgramSunburst/ProgramSunburstController'; -import CustomActiveDonut from '../../components/Widgets/PieCharts/CustomActiveDonut/CustomActiveDonutController'; import SideBar from '../../components/SideBar/SideBarView'; import { widgetsData } from '../../bento/dashboardData'; +import colors from '../../utils/colors'; const displaywidgets = widgetsData.filter((widget) => widget.show === true).slice(0, 6); @@ -84,6 +84,8 @@ const Dashboard = ({ cx="50%" cy="50%" textColor={theme.palette.widgetBackground.contrastText} + titleLocation="bottom" + titleAlignment="center" /> @@ -110,6 +112,9 @@ const Dashboard = ({ cx="50%" cy="50%" textColor={theme.palette.widgetBackground.contrastText} + colors={colors} + titleLocation="bottom" + titleAlignment="center" /> diff --git a/src/pages/dashboard/dashboardState.js b/src/pages/dashboard/dashboardState.js index c003c5980..558c8c534 100644 --- a/src/pages/dashboard/dashboardState.js +++ b/src/pages/dashboard/dashboardState.js @@ -1,7 +1,3 @@ -import client from '../../utils/graphqlClient'; -import { GET_DASHBOARD_DATA_QUERY, widgetsData, GET_DASHBOARD_TABLE_DATA_QUERY } from '../../bento/dashboardData'; -import { globalStatsData as statsCount } from '../../bento/globalStatsData'; - import { getStatDataFromDashboardData, getSunburstDataFromDashboardData, @@ -11,7 +7,12 @@ import { getCheckBoxData, customCheckBox, transformInitialDataForSunburst, -} from '../../utils/dashboardUtilFunctions'; +} from 'bento-components'; +import client from '../../utils/graphqlClient'; +import { + GET_DASHBOARD_DATA_QUERY, widgetsData, GET_DASHBOARD_TABLE_DATA_QUERY, facetSearchData, +} from '../../bento/dashboardData'; +import { globalStatsData as statsCount } from '../../bento/globalStatsData'; export const initialState = { dashboard: { @@ -282,7 +283,7 @@ export default function dashboardReducer(state = initialState, action) { } case RECEIVE_DASHBOARD: { // get action data - const checkboxData = customCheckBox(action.payload.data); + const checkboxData = customCheckBox(action.payload.data, facetSearchData); return action.payload.data ? { ...state.dashboard, diff --git a/src/pages/dashboardTab/components/modal.js b/src/pages/dashboardTab/components/modal.js new file mode 100644 index 000000000..f0ed1e623 --- /dev/null +++ b/src/pages/dashboardTab/components/modal.js @@ -0,0 +1,68 @@ +import React, { useRef } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Dialog from '../../../components/AddToCartDialog'; +import { addToCart, cartWillFull } from '../../fileCentricCart/store/cart'; +import { fetchAllFileIDsForSelectAll, getFilesCount } from '../store/dashboardReducer'; + +const useStyles = makeStyles({ + button: { + borderRadius: '10px', + width: '120px', + lineHeight: '37px', + fontSize: '12px', + textTransform: 'uppercase', + fontFamily: 'Lato', + color: '#fff', + backgroundColor: '#142D64', + marginTop: '6px', + marginBottom: '10px', + marginRight: '24px', + }, +}); + +export default function SimpleDialogDemo() { + const classes = useStyles(); + const childRef = useRef(); + + const handleClickOpen = () => { + childRef.current.open(); + }; + + const handleClose = () => { + childRef.current.close(); + }; + + async function exportFiles() { + // Find the newly added files by comparing + const getAllFilesData = await fetchAllFileIDsForSelectAll(getFilesCount()); + const selectedIDs = getAllFilesData.reduce((accumulator, currentValue) => { + const { files } = currentValue; + // check if file + if (files && files.length > 0) { + return accumulator.concat(files.map((f) => f.file_id)); + } + return accumulator; + }, []); + addToCart({ fileIds: selectedIDs }); + handleClose(); + } + + const numberOfFilesSelected = getFilesCount(); + const OnYesClick = () => { exportFiles(); }; + const onNoClick = () => { handleClose(); }; + + return ( + <> + + + + ); +} diff --git a/src/pages/dashboardTab/components/tabController.js b/src/pages/dashboardTab/components/tabController.js new file mode 100644 index 000000000..b982e73c7 --- /dev/null +++ b/src/pages/dashboardTab/components/tabController.js @@ -0,0 +1,339 @@ +import React from 'react'; +import { useSelector } from 'react-redux'; +import { + Tabs, Tab, withStyles, +} from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import SwipeableViews from 'react-swipeable-views'; +import Snackbar from '@material-ui/core/Snackbar'; +import { getOptions } from 'bento-components'; +import TabView from './tabView'; +import SuccessOutlinedIcon from '../../../utils/SuccessOutlined'; +import TabThemeProvider from './tabThemeConfig'; +import TabLabel from './tabLabel'; +import Message from '../../../components/Message'; +import { + tabs, tooltipContent, tabContainers, tabIndex, externalLinkIcon, +} from '../../../bento/dashboardTabData'; +import { fetchDataForDashboardTab } from '../store/dashboardReducer'; + +function TabContainer({ children, dir }) { + return ( + + {children} + + ); +} + +const tabController = (classes) => { + const currentActiveTabTitle = useSelector((state) => (state.dashboardTab + && state.dashboardTab.currentActiveTab + ? state.dashboardTab.currentActiveTab + : tabIndex[0].title)); + const tabVlaue = tabIndex.map((el) => el.title).indexOf(currentActiveTabTitle) || 0; + // tab settings + const [currentTab, setCurrentTab] = React.useState(tabVlaue); + + // data from store + const dashboard = useSelector((state) => (state.dashboardTab +&& state.dashboardTab.datatable + ? state.dashboardTab.datatable : {})); + // get stats data from store + const dashboardStats = useSelector((state) => (state.dashboardTab + && state.dashboardTab.stats ? state.dashboardTab.stats : {})); + + const filteredSubjectIds = useSelector((state) => (state.dashboardTab + && state.dashboardTab.filteredSubjectIds ? state.dashboardTab.filteredSubjectIds : [])); + + const [TopMessageStatus, setTopMessageStatus] = React.useState({ + text: tooltipContent[currentTab], + src: tooltipContent.icon, + alt: tooltipContent.alt, + isActive: false, + currentTab, + }); + const [BottomMessageStatus, setBottomMessageStatus] = React.useState({ + text: tooltipContent[currentTab], + src: tooltipContent.icon, + alt: tooltipContent.alt, + isActive: false, + currentTab, + }); + + function setTooltip(status, tabInfo = '', icon, alt) { + return { + text: tabInfo, + src: icon, + alt, + isActive: status, + currentTab, + }; + } + + const tooltipConfig = { + location: { + top: { + open: () => setTopMessageStatus(setTooltip(true, + tooltipContent[currentTab], + tooltipContent.icon, + tooltipContent.alt)), + close: () => setTopMessageStatus(setTooltip(false, tooltipContent[currentTab], + tooltipContent.icon, + tooltipContent.alt)), + }, + bottom: { + open: () => setBottomMessageStatus(setTooltip(true, tooltipContent[currentTab], + tooltipContent.icon, + tooltipContent.alt)), + close: () => setBottomMessageStatus(setTooltip(false, tooltipContent[currentTab], + tooltipContent.icon, + tooltipContent.alt)), + }, + }, + + }; + + function toggleMessageStatus(location, status) { + return tooltipConfig.location[location][status](); + } + + const handleTabChange = (event, value) => { + setCurrentTab(value); + fetchDataForDashboardTab(tabIndex[value].title); + }; + + const [snackbarState, setsnackbarState] = React.useState({ + open: false, + value: 0, + }); + function openSnack(value1) { + setsnackbarState({ open: true, value: value1 }); + } + + // eslint-disable-next-line no-unused-vars + function closeSnack() { + setsnackbarState({ open: false }); + } + + function getBorderStyle() { + const style = '3px solid #42779a'; + return `${style}`; + } + + function getTableColor() { + return `${tabIndex[currentTab].primaryColor}`; + } + + function getTabLalbel(title, count) { + const tabObj = tabIndex[currentTab]; + // NOTE: refactor white color to theme's white color. + const primaryColor = (tabObj.title === title) ? tabIndex[currentTab].selectedColor : undefined; + const secondaryColor = (tabObj.title === title) ? tabObj.secondaryColor : undefined; + + return ( + + ); + } + + /* on row select event + @param data data for initial the table sample -> [files] + @param allRowsSelected : selected rows + @output [f.uuid] + */ + function Type1OnRowsSelect(data, allRowsSelected) { + // use reduce to combine all the files' id into single array + return allRowsSelected.reduce((accumulator, currentValue) => { + if (data[currentValue.dataIndex]) { + const { files } = data[currentValue.dataIndex]; + // check if file exists + if (files && files.length > 0) { + return accumulator.concat(files.map((f) => f.file_id)); + } + } + return accumulator; + }, []); + } + + /* on row select event + @param data data for initial the table sample -> [files] + @param allRowsSelected : selected rows + @output [f.uuid] + */ + function Type2OnRowsSelect(data, allRowsSelected) { + return allRowsSelected.map((row) => data[row.dataIndex].file_id); + } + + /* on row select event + @param data data for initial the table sample -> [files] + @param allRowsSelected : selected rows + @output [f.uuid] + */ + function Type3OnRowsSelect(data, allRowsSelected) { + // use reduce to combine all the files' id into single array + return allRowsSelected.reduce((accumulator, currentValue) => { + const { files } = data[currentValue.dataIndex]; + // check if file + if (files && files.length > 0) { + return accumulator.concat(files); + } + return accumulator; + }, []); + } + + // onRowsSelectFunction contains all the onRowsSelection functions + // user can pick one for use. + const onRowsSelectFunction = { + type1: Type1OnRowsSelect, + type2: Type2OnRowsSelect, + type3: Type3OnRowsSelect, + }; + + // This function for future use + /* To check if this row is selectable or not. + I want the system to visually communicate ("flag") which of + the samples being displayed have already had all of their files added to the cart. + @param data row of data from sample tab + @param cartData, list of fileIDs + @output boolean true-> selectable +*/ + // eslint-disable-next-line no-unused-vars + function disableRowSelection(data, cartData) { + return true; + } + + // disableRowSelectionFunction contains all the disableRowSelection functions + // user can pick one for use. + const disableRowSelectionFunction = { + type1: disableRowSelection, + type2: disableRowSelection, + type3: disableRowSelection, + }; + + // Tab Header Generator + const TABs = tabs.map((tab) => ( + + )); + + // Calculate the properate marginTop value for the tooltip on the top + function tooltipStyle(text) { + const marginTopValue = text.length > 40 ? '-25px' : '-3px'; + return { marginTop: marginTopValue }; + } + + // Tab table Generator + const TABContainers = tabContainers.map((container) => ( + + + + )); + + return ( + <> + + + + {' '} + + + {snackbarState.value} + {' '} + File(s) successfully added to your cart + +
+)} + /> + { TopMessageStatus.isActive ? ( +
+ {' '} + + {' '} +
+ ) : ' '} + + + {TABs} + + + {TABContainers} + + + + ); +}; + +const styles = () => ({ + button: { + borderRadius: '10px', + width: '330px', + height: '27px', + lineHeight: '18px', + fontSize: '10pt', + color: '#fff', + backgroundColor: '#ff7f15', + }, + snackBarMessageIcon: { + verticalAlign: 'middle', + }, + messageTop: { + position: 'absolute', + right: '20px', + zIndex: '300', + }, +}); +export default withStyles(styles, { withTheme: true })(tabController); diff --git a/src/pages/dashboardTab/components/tabFooter.js b/src/pages/dashboardTab/components/tabFooter.js new file mode 100644 index 000000000..562d492d3 --- /dev/null +++ b/src/pages/dashboardTab/components/tabFooter.js @@ -0,0 +1,38 @@ +import React from 'react'; +import TableFooter from '@material-ui/core/TableFooter'; +import TableRow from '@material-ui/core/TableRow'; +import TablePagination from '@material-ui/core/TablePagination'; +import { withStyles } from '@material-ui/core/styles'; + +const defaultFooterStyles = { + root: { + fontFamily: '"Open Sans", sans-serif', + fontSize: '9pt', + letterSpacing: '0.025em', + color: '#000', + }, +}; + +const TabFooter = ({ + classes, + count, + page, + rowsPerPage, + onChangePage, + onChangeRowsPerPage, +}) => ( + + + + + +); + +export default withStyles(defaultFooterStyles, { withTheme: true })(TabFooter); diff --git a/src/pages/dashboardTab/components/tabLabel.js b/src/pages/dashboardTab/components/tabLabel.js new file mode 100644 index 000000000..dce4dd26b --- /dev/null +++ b/src/pages/dashboardTab/components/tabLabel.js @@ -0,0 +1,30 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core'; + +const tabLabel = ({ + classes, title, count, primaryColor, +}) => ( +
+ + {title} + {' '} + + + + ( + {count} + ) + + +
+); + +const styles = () => ({ + defaultStyle: { + fontFamily: 'Lato', + textTransform: 'capitalize', + fontSize: '21px', + }, +}); + +export default withStyles(styles, { withTheme: true })(tabLabel); diff --git a/src/pages/dashboardTab/components/tabThemeConfig.js b/src/pages/dashboardTab/components/tabThemeConfig.js new file mode 100644 index 000000000..72f9bb6e9 --- /dev/null +++ b/src/pages/dashboardTab/components/tabThemeConfig.js @@ -0,0 +1,80 @@ +import React from 'react'; +import { MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles'; +import themes, { overrides } from '../../../themes'; + +export default ({ + children, extraStyles, tableBorder, tablecolor, +}) => { + const style = []; + + const overridesObj = themes.light.overrides; + + if (extraStyles) style.push(extraStyles); + + if (tableBorder) { + overridesObj.MUIDataTableToolbarSelect.root.borderTop = '2px solid #e7e5e5'; + overridesObj.MUIDataTableSelectCell.headerCell.borderTop = tableBorder; + overridesObj.MUIDataTableSelectCell.headerCell.borderBottom = tableBorder; + overridesObj.MUIDataTableHeadCell.fixedHeader.borderTop = tableBorder; + overridesObj.MUIDataTableHeadCell.fixedHeader.borderBottom = tableBorder; + overridesObj.MuiTableFooter = { root: { borderTop: tableBorder } }; + overridesObj.MUIDataTableToolbar = { root: { minHeight: '15px' } }; + overridesObj.MuiTablePagination.toolbar.paddingTop = '11px'; + } + + const PrivateTabIndicator = { + root: { + transitionProperty: 'none', + height: '0px', + }, + }; + + const MuiTabs = { + root: { + marginTop: '15px', + }, + flexContainer: { + borderBottom: '10px solid #40789C', + overflow: 'visible !important', + }, + }; + + const MuiTab = { + root: { + width: '250px', + height: '45px', + minHeight: '40px', + marginRight: '10px', + background: '#EAEAEA', + fontSize: '18px', + fontFamily: 'Raleway', + fontWeight: '400', + lineHeight: '18px', + paddingLeft: '5px', + letterSpacing: '0.25px', + borderTop: '1px solid black', + borderLeft: '1px solid black', + borderRight: '1px solid black', + '&$selected': { + background: tablecolor, + fontWeight: 'bolder', + }, + }, + labelContainer: { + + }, + }; + + overridesObj.MuiTabs = MuiTabs; + overridesObj.MuiTab = MuiTab; + overridesObj.PrivateTabIndicator = PrivateTabIndicator; + + style.push(overridesObj); + const computedTheme = createMuiTheme({ ...themes.light, ...overrides, ...style }); + + return ( + + {children} + + ); +}; diff --git a/src/pages/dashboardTab/components/tabView.js b/src/pages/dashboardTab/components/tabView.js new file mode 100644 index 000000000..ad8001b6d --- /dev/null +++ b/src/pages/dashboardTab/components/tabView.js @@ -0,0 +1,415 @@ +import React, { useRef, useEffect } from 'react'; +import { + Grid, + IconButton, + withStyles, +} from '@material-ui/core'; +import { Link } from 'react-router-dom'; +import HelpIcon from '@material-ui/icons/Help'; +import { getColumns } from 'bento-components'; +import SelectAllModal from './modal'; +import { + GET_FILES_OVERVIEW_QUERY, + GET_SAMPLES_OVERVIEW_QUERY, + GET_CASES_OVERVIEW_QUERY, + GET_FILES_OVERVIEW_DESC_QUERY, + GET_SAMPLES_OVERVIEW_DESC_QUERY, + GET_CASES_OVERVIEW_DESC_QUERY, +} from '../../../bento/dashboardTabData'; +import CustomDataTable from '../../../components/serverPaginatedTable/serverPaginatedTable'; +import { addToCart, getCart, cartWillFull } from '../../fileCentricCart/store/cart'; +import Message from '../../../components/Message'; +import AddToCartAlertDialog from '../../../components/AddToCartDialog'; + +const getOverviewQuery = (api) => (api === 'GET_SAMPLES_OVERVIEW_QUERY' ? GET_SAMPLES_OVERVIEW_QUERY : api === 'GET_FILES_OVERVIEW_QUERY' ? GET_FILES_OVERVIEW_QUERY : GET_CASES_OVERVIEW_QUERY); + +// Due to cypher limitation we have to send seperate query get descending list +const getOverviewDescQuery = (api) => (api === 'GET_SAMPLES_OVERVIEW_QUERY' ? GET_SAMPLES_OVERVIEW_DESC_QUERY : api === 'GET_FILES_OVERVIEW_QUERY' ? GET_FILES_OVERVIEW_DESC_QUERY : GET_CASES_OVERVIEW_DESC_QUERY); + +const TabView = ({ + classes, + data, + customColumn, + customOnRowsSelect, + openSnack, + disableRowSelection, + buttonText, + tableID, + saveButtonDefaultStyle, + DeactiveSaveButtonDefaultStyle, + ActiveSaveButtonDefaultStyle, + toggleMessageStatus, + BottomMessageStatus, + tabIndex, + externalLinkIcon, + options, + TopMessageStatus, + count, + api, + paginationAPIField, + paginationAPIFieldDesc, + dataKey, + filteredSubjectIds, + defaultSortCoulmn, + defaultSortDirection, +}) => { + // Get the existing files ids from cart state + const cart = getCart(); + const fileIDs = cart.fileIds ? cart.fileIds : []; + const saveButton = useRef(null); + const saveButton2 = useRef(null); + const AddToCartAlertDialogRef = useRef(); + // Store current page selected info + const [rowSelection, setRowSelection] = React.useState({ + selectedRowInfo: [], + selectedRowIndex: [], + }); + + // Store current page selected info + const [selectedIDs, setSelectedIDs] = React.useState([]); + const [cartIsFull, setCartIsFull] = React.useState(false); + const buildButtonStyle = (button, styleObject) => { + const styleKV = Object.entries(styleObject); + // eslint-disable-next-line no-restricted-syntax, no-unused-vars + for (const [key, value] of styleKV) { + // eslint-disable-next-line no-param-reassign + button.current.style[key] = value; + } + }; + const initSaveButtonDefaultStyle = (button) => { + // eslint-disable-next-line no-param-reassign + button.current.disabled = true; + buildButtonStyle(button, saveButtonDefaultStyle); + }; + + const updateActiveSaveButtonStyle = (flag, button) => { + if (flag) { + // eslint-disable-next-line no-param-reassign + button.current.disabled = true; + buildButtonStyle(button, DeactiveSaveButtonDefaultStyle); + } else { + // eslint-disable-next-line no-param-reassign + button.current.disabled = false; + buildButtonStyle(button, ActiveSaveButtonDefaultStyle); + } + }; + + useEffect(() => { + initSaveButtonDefaultStyle(saveButton); + initSaveButtonDefaultStyle(saveButton2); + + if (rowSelection.selectedRowIndex.length === 0) { + updateActiveSaveButtonStyle(true, saveButton); + updateActiveSaveButtonStyle(true, saveButton2); + } else { + updateActiveSaveButtonStyle(false, saveButton); + updateActiveSaveButtonStyle(false, saveButton2); + } + }); + + function exportFiles() { + // Find the newly added files by comparing + const newFileIDS = fileIDs !== null ? selectedIDs.filter( + (e) => !fileIDs.find((a) => e === a), + ).length : selectedIDs.length; + if (cartWillFull(newFileIDS)) { + // throw an alert + setCartIsFull(true); + AddToCartAlertDialogRef.current.open(); + } else if (newFileIDS > 0) { + addToCart({ fileIds: selectedIDs }); + openSnack(newFileIDS); + setSelectedIDs([]); + } + } + + function rowSelectionEvent(displayData, rowsSelected) { + const displayedDataKeies = displayData; + const selectedRowsKey = rowsSelected + ? rowsSelected.map((index) => displayedDataKeies[index]) + : []; + let newSelectedRowInfo = []; + + if (rowsSelected) { + // Remove the rowInfo from selectedRowInfo if this row currently be + // displayed and not be selected. + if (rowSelection.selectedRowInfo.length > 0) { + newSelectedRowInfo = rowSelection.selectedRowInfo.filter((key) => { + if (displayedDataKeies.includes(key)) { + return false; + } + return true; + }); + } + } else { + newSelectedRowInfo = rowSelection.selectedRowInfo; + } + newSelectedRowInfo = newSelectedRowInfo.concat(selectedRowsKey); + + // Get selectedRowIndex by comparing current page data with selected row's key. + // if rowInfo from selectedRowInfo is currently be displayed + const newSelectedRowIndex = displayedDataKeies.reduce( + (accumulator, currentValue, currentIndex) => { + if (newSelectedRowInfo.includes(currentValue)) { + accumulator.push(currentIndex); + } + return accumulator; + }, [], + ); + + setRowSelection({ + selectedRowInfo: newSelectedRowInfo, + selectedRowIndex: newSelectedRowIndex, + }); + } + + // Calculate the properate marginTop value for the tooltip on the top + function tooltipStyle(text) { + const marginTopValue = text.length > 40 ? '-148px' : '-118px'; + return { marginTop: marginTopValue }; + } + + /* + Presist user selection + */ + function onRowsSelect(curr, allRowsSelected, rowsSelected, displayData, selectedData) { + rowSelectionEvent(displayData.map((d) => d.data[0]), rowsSelected); + + setSelectedIDs([...new Set( + customOnRowsSelect(selectedData, allRowsSelected), + )]); + if (allRowsSelected.length === 0) { + updateActiveSaveButtonStyle(true, saveButton); + updateActiveSaveButtonStyle(true, saveButton2); + } else { + updateActiveSaveButtonStyle(false, saveButton); + updateActiveSaveButtonStyle(false, saveButton2); + } + } + + // overwrite default options + const defaultOptions = () => ({ + dataKey, + rowsSelectedTrigger: (displayData, rowsSelected) => rowSelectionEvent( + displayData, + rowsSelected, + ), + rowsSelected: rowSelection.selectedRowIndex, + onRowSelectionChange: onRowsSelect, + isRowSelectable: (dataIndex) => (disableRowSelection + ? disableRowSelection(data[dataIndex], fileIDs) : true), + }); + const finalOptions = { ...options, ...defaultOptions() }; + + return ( +
+ + + + + toggleMessageStatus('top', 'open')} onMouseEnter={() => toggleMessageStatus('top', 'open')} onMouseLeave={() => toggleMessageStatus('top', 'close')}> + {TopMessageStatus.src ? ( + toggleMessageStatus('top', 'open')} + onMouseOver={() => toggleMessageStatus('top', 'open')} + onFocus={() => toggleMessageStatus('top', 'open')} + src={TopMessageStatus.src} + alt={TopMessageStatus.alt} + className={classes.helpIcon} + /> + ) : ( + toggleMessageStatus('top', 'open')} + onMouseEnter={() => toggleMessageStatus('top', 'open')} + onFocus={() => toggleMessageStatus('top', 'open')} + /> + )} + + + + + + + + + + + + toggleMessageStatus('bottom', 'open')} onMouseEnter={() => toggleMessageStatus('bottom', 'open')} onMouseLeave={() => toggleMessageStatus('bottom', 'close')}> + {BottomMessageStatus.src ? ( + toggleMessageStatus('bottom', 'open')} + onMouseOver={() => toggleMessageStatus('bottom', 'open')} + onFocus={() => toggleMessageStatus('bottom', 'open')} + src={BottomMessageStatus.src} + alt={BottomMessageStatus.alt} + className={classes.helpIcon} + /> + ) : ( + toggleMessageStatus('bottom', 'open')} + onMouseOver={() => toggleMessageStatus('bottom', 'open')} + onFocus={() => toggleMessageStatus('bottom', 'open')} + className={classes.helpIcon} + fontSize="small" + /> + )} + +
+ { BottomMessageStatus.isActive + && tabIndex === BottomMessageStatus.currentTab.toString() ? ( +
+ {' '} + + {' '} +
+ ) : ''} + ({ ...location, pathname: '/fileCentricCart' })} + color="inherit" + className={classes.cartlink} + > + Go to Cart + {' '} + {'>'} + +
+ +
+
+ ); +}; + +const styles = () => ({ + + link: { + color: '#7747ff', + textDecoration: 'none', + + '&:hover': { + textDecoration: 'underline', + }, + }, + cartlink: { + fontFamily: 'Lato', + color: '#3E6886', + fontSize: '12px', + marginRight: '70px', + textDecoration: 'none', + borderBottom: '1px solid #3E6886', + paddingBottom: '3px', + }, + caseTitle: { + color: '#194563', + fontSize: '25.2pt', + fontStyle: 'normal', + fontFamily: 'Raleway', + letterSpacing: '0.025em', + backgroundColor: '#f5f5f5', + padding: '10px 32px 8px 28px', + }, + chips: { + position: 'absolute', + marginLeft: '250px', + marginTop: '36px', + zIndex: '999', + }, + chipRoot: { + color: '#ffffff', + fontFamily: '"Open Sans", sans-serif', + letterSpacing: '0.075em', + marginLeft: '10px', + backgroundColor: '#9b9b9b', + fontSize: '9pt', + }, + chipDeleteIcon: { + color: '#ffffff', + '&:hover': { + color: '#ffffff', + }, + }, + root: { + fontFamily: '"Open Sans", sans-serif', + fontSize: '9pt', + letterSpacing: '0.025em', + color: '#000', + }, + saveButtonDiv: { + paddingTop: '5px', + paddingRight: '25px', + textAlign: 'right', + }, + saveButtonDivBottom: { + paddingTop: '5px', + paddingRight: '25px', + textAlign: 'right', + marginBottom: '30px', + position: 'relative', + }, + button: { + borderRadius: '10px', + width: '156px', + lineHeight: '37px', + fontSize: '12px', + textTransform: 'uppercase', + fontFamily: 'Lato', + color: '#fff', + backgroundColor: '#10A075', + marginTop: '6px', + marginBottom: '10px', + marginRight: '5px', + }, + caseTableBorder: { + borderTopColor: '#F48439', + }, + fileTableBorder: { + borderTopColor: '#2446C6', + }, + sampleTableBorder: { + borderTopColor: '#05C5CC', + }, + messageBottom: { + zIndex: '500', + position: 'absolute', + marginTop: '-148px', + marginLeft: 'calc(100% - 220px)', + }, + helpIcon: { + zIndex: '600', + }, + helpIconButton: { + verticalAlign: 'top', + marginLeft: '-5px', + }, +}); + +export default withStyles(styles, { withTheme: true })(TabView); diff --git a/src/pages/dashboardTab/dashboard.js b/src/pages/dashboardTab/dashboard.js new file mode 100644 index 000000000..06b4ffe89 --- /dev/null +++ b/src/pages/dashboardTab/dashboard.js @@ -0,0 +1,245 @@ +import React from 'react'; +import { + Grid, withStyles, Button, Switch, Collapse, FormControlLabel, +} from '@material-ui/core'; +import { ProgramSunburst, CustomActiveDonut } from 'bento-components'; +import { useTheme } from '../../components/ThemeContext'; +import Widget from '../../components/Widgets/WidgetView'; +import Stats from '../../components/Stats/DashboardStatsController'; +import SideBar from '../../components/SideBar/SideBarView'; +import { widgetsData } from '../../bento/dashboardData'; +import Tab from './components/tabController'; +import colors from '../../utils/colors'; + +const displaywidgets = widgetsData.filter((widget) => widget.show === true).slice(0, 6); + +const Dashboard = ({ + classes, data, theme, +}) => { + const [collapse, setCollapse] = React.useState(true); + const themeChanger = useTheme(); + const handleChange = () => { + setCollapse((prev) => !prev); + }; + + return ( + <> +
+ +
+
+
+ +
+
+
+
+
+
+ + {collapse ? 'COLLAPSE VIEW' : 'OPEN VIEW' } + +)} + /> + { + themeChanger.toggleTheme(); + }} + /> +
+
+ + + {displaywidgets.map((widget) => { + if (widget.type === 'sunburst' && widget.show) { + return ( + + + + + + ); + } + if (widget.type === 'donut' && widget.show) { + return ( + + + + + + ); + } + return <>; + })} + + +
+ { collapse &&
} + { collapse &&
} + +
+
+
+ {/* Addingg diclaimer for Dev */} + {/* */} +
+ + ); +}; + +const styles = (theme) => ({ + dashboardContainer: { + backgroundColor: '#FFFFFF', + // boxShadow: 'inset 0 0 87px 7px rgba(27,28,28,0.15)', + }, + dashboardDivider: { + height: 16, + marginTop: '32px', + backgroundColor: '#E2E7EC', + }, + dashboardDividerTop: { + height: 16, + backgroundColor: theme.palette.widgetBackground.main, + }, + rightContent: { + maxWidth: 'calc(100% - 250px)', + position: 'relative', + }, + content: { + // padding: theme.spacing.unit * 3, + display: 'flex', + maxWidth: '1800px', + margin: 'auto', + }, + widgetsContainer: { + background: theme.palette.widgetBackground.main, + }, + contentShift: { + width: `calc(100vw - ${theme.custom.drawerWidth})`, + marginLeft: theme.custom.drawerWidth, + transition: theme.transitions.create(['margin', 'width'], { + easing: theme.transitions.easing.easeOut, + duration: theme.transitions.duration.enteringScreen, + }), + }, + card: { + minHeight: '100%', + display: 'flex', + flexDirection: 'column', + }, + paper: { + textAlign: 'center', + }, + fakeToolbar: { + ...theme.mixins.toolbar, + }, + sunburst: { + textAlign: 'center', + }, + widgetInner: { + marginTop: '-8px', + borderBottom: '6px solid #E2E7EC', + }, + widgetsCollapse: { + background: theme.palette.widgetBackground.main, + }, + floatRight: { + float: 'right', + marginRight: '80px', + }, + floatLeft: { + float: 'left', + }, + customSwitch: { + marginTop: '-6px', + }, + customButton: { + borderRadius: '0 0 18px 18px', + minHeight: '20px', + fontSize: 8, + color: '#ffffff', + textTransform: 'none', + backgroundColor: '#566672', + marginRight: '4px', + fontFamily: theme.custom.fontFamilySans, + marginTop: '-4px', + '&:hover': { + backgroundColor: '#566672', + }, + }, + backgroundWidgets: { + background: theme.palette.widgetBackground.main, + }, + sideBar: { + width: '250px', + backgroundColor: '#FFFFFF', + boxShadow: 'inset 0 0 87px 7px #E2E7EC', + zIndex: '99', + }, + statsBar: { + position: 'fixed', + }, + switchBase: { + color: theme.palette.widgetBackground.contrastText, + '&$checked': { + color: theme.palette.widgetBackground.contrastSwicthColor, + }, + '&$checked + $track': { + backgroundColor: theme.palette.widgetBackground.contrastText, + }, + }, + checked: {}, + track: {}, +}); + +export default withStyles(styles, { withTheme: true })(Dashboard); diff --git a/src/pages/dashboardTab/dashboardController.js b/src/pages/dashboardTab/dashboardController.js new file mode 100644 index 000000000..ec14c174b --- /dev/null +++ b/src/pages/dashboardTab/dashboardController.js @@ -0,0 +1,64 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Dashboard from './dashboard'; +import { fetchDataForDashboardTabDataTable } from './store/dashboardReducer'; +// import { fetchDataForDashboardDataTable } from '../dashboard/dashboardState'; +import { Typography } from '../../components/Wrappers/Wrappers'; + +class DashboardController extends Component { + componentDidMount() { + // const { dispatch } = this.props; + fetchDataForDashboardTabDataTable(); + // dispatch(fetchDataForDashboardDataTable()); + } + + render() { + const { + isLoading, hasError, error, widgets, isFetched, isSidebarOpened, + } = this.props; + + if (hasError) { + return ( + + { error && `An error has occurred in loading dashboard component: ${error}`} + + ); + } + if (isLoading) { + return ; + } + + if (isFetched) { + return ( + + ); + } + return ( + + { error && `An error has occurred in loading stats component: ${error}`} + + ); + } +} + +function mapStateToProps(state) { + const { + isLoading, isFetched, hasError, error, widgets, + } = state.dashboardTab; + + const { isSidebarOpened } = state.layout; + return { + isLoading, + hasError, + error, + widgets, + isFetched, + isSidebarOpened, + }; +} + +export default connect(mapStateToProps)(DashboardController); diff --git a/src/pages/dashboardTab/store/dashboardReducer.js b/src/pages/dashboardTab/store/dashboardReducer.js new file mode 100644 index 000000000..f956875ec --- /dev/null +++ b/src/pages/dashboardTab/store/dashboardReducer.js @@ -0,0 +1,556 @@ +import _ from 'lodash'; +import { + customCheckBox, + updateCheckBox, + getFilters, + filterData, + getCheckBoxData, + getStatDataFromDashboardData, + getSunburstDataFromDashboardData, + getDonutDataFromDashboardData, + setSelectedFilterValues, + transformInitialDataForSunburst, +} from 'bento-components'; +import { globalStatsData as statsCount } from '../../../bento/globalStatsData'; +import { widgetsData, facetSearchData } from '../../../bento/dashboardData'; + +import store from '../../../store'; +import client from '../../../utils/graphqlClient'; +import { + tabContainers, + DASHBOARD_QUERY, + FILTER_QUERY, + FILTER_GROUP_QUERY, + GET_FILES_OVERVIEW_QUERY, + GET_SAMPLES_OVERVIEW_QUERY, + GET_CASES_OVERVIEW_QUERY, + GET_ALL_FILEIDS_FOR_SELECT_ALL, + GET_FILES_OVERVIEW_DESC_QUERY, + GET_SAMPLES_OVERVIEW_DESC_QUERY, + GET_CASES_OVERVIEW_DESC_QUERY, + tabIndex, +} from '../../../bento/dashboardTabData'; + +const storeKey = 'dashboardTab'; + +const initialState = { + dashboardTab: { + isDataTableUptoDate: false, + isFetched: false, + isLoading: false, + isDashboardTableLoading: false, + setSideBarLoading: false, + error: '', + hasError: false, + stats: {}, + allActiveFilters: {}, + currentActiveTab: tabIndex[0].title, + filteredSubjectIds: [], + checkboxForAll: { + data: [], + }, + subjectOverView: { + data: [], + }, + checkbox: { + data: [], + defaultPanel: false, + }, + datatable: { + dataCase: 'undefined', + dataSample: 'undefined', + dataFile: 'undefined', + }, + widgets: {}, + }, +}; + +// HELPERS +const getState = () => store.getState()[storeKey]; + +function shouldFetchDataForDashboardTabDataTable(state) { + return !(state.isFetched); +} + +/** + * Returns the stats from inputAPI data. + * @param {object} data + * @param {json} statCountVariables + * @return {json} + */ +function getStatInit(input, statCountVariables) { + const initStats = statCountVariables.reduce((acc, widget) => ( + { ...acc, [widget.statAPI]: input[widget.statAPI] } + ), {}); + return initStats; +} + +/** + * Returns the filtered stats from inputAPT data. + * @param {object} data + * @param {json} statCountVariables + * @return {json} + */ +function getFilteredStat(input, statCountVariables) { + const filteredStats = statCountVariables.reduce((acc, stat) => ( + { ...acc, [stat.statAPI]: input[stat.statAPI] } + ), {}); + return filteredStats; +} + +/** + * removes EmptySubjectsFromDonutDataa. + * @param {object} data + * @param {object} + */ +const removeEmptySubjectsFromDonutData = (data) => data.filter((item) => item.subjects !== 0); + +/** + * Returns the widgets data. + * @param {object} data + * @param {json} widgetsInfoFromCustConfig + * @return {json}r + */ +function getWidgetsInitData(data, widgetsInfoFromCustConfig) { + const donut = widgetsInfoFromCustConfig.reduce((acc, widget) => { + const Data = widget.type === 'sunburst' ? transformInitialDataForSunburst(data[widget.dataName]) : removeEmptySubjectsFromDonutData(data[widget.dataName]); + const label = widget.dataName; + return { ...acc, [label]: Data }; + }, {}); + + return donut; +} + +function fetchDashboardTab() { + return () => { + store.dispatch({ type: 'REQUEST_DASHBOARDTAB' }); + return client + .query({ + query: DASHBOARD_QUERY, + }) + .then((result) => store.dispatch({ type: 'RECEIVE_DASHBOARDTAB', payload: _.cloneDeep(result) })) + .catch((error) => store.dispatch( + { type: 'DASHBOARDTAB_QUERY_ERR', error }, + )); + }; +} + +function fetchDashboardTabForClearAll() { + return () => client + .query({ + query: DASHBOARD_QUERY, + }) + .then((result) => store.dispatch({ type: 'CLEAR_ALL', payload: _.cloneDeep(result) })) + .catch((error) => store.dispatch( + { type: 'DASHBOARDTAB_QUERY_ERR', error }, + )); +} + +/** + * Generate a default varibles for filter query. + * + * Need to be updated with custodian of filter + * @return json + */ + +function allFilters() { + const emptyFilters = facetSearchData.reduce((acc, facet) => ( + { ...acc, [facet.datafield]: [] } + ), {}); + return emptyFilters; +} +/** + * Returns filter variable for graphql query using the all filters. + * + * @param {object} data + * @return {json} + */ + +function createFilterVariables(data) { + const currentAllActiveFilters = getState().allActiveFilters; + // eslint-disable-next-line no-unused-vars + const filter = Object.entries(currentAllActiveFilters).reduce((acc, [key, val]) => { + if (data[0].datafield === key) { + return data[0].isChecked + ? { ...acc, [key]: [...currentAllActiveFilters[key], ...[data[0].name]] } + : { ...acc, [key]: currentAllActiveFilters[key].filter((item) => item !== data[0].name) }; + } + // return { ...acc , [key]: [...currentAllActiveFilters[key],...[data[0].name]] } + return { ...acc, [key]: currentAllActiveFilters[key] }; + }, {}); + + return filter; +} + +/** + * Switch to get query sort dorection and sort field . + * + * @param {string} payload + * @param {json} tabContainer + * @return {json} with three keys QUERY, sortfield, sortDirection + */ + +const querySwitch = (payload, tabContainer) => { + switch (payload) { + case ('Samples'): + return { QUERY: tabContainer.defaultSortDirection === 'desc' ? GET_SAMPLES_OVERVIEW_DESC_QUERY : GET_SAMPLES_OVERVIEW_QUERY, sortfield: tabContainer.defaultSortField || '', sortDirection: tabContainer.defaultSortDirection || '' }; + case ('Files'): + return { QUERY: tabContainer.defaultSortDirection === 'desc' ? GET_FILES_OVERVIEW_DESC_QUERY : GET_FILES_OVERVIEW_QUERY, sortfield: tabContainer.defaultSortField || '', sortDirection: tabContainer.defaultSortDirection || '' }; + default: + return { QUERY: tabContainer.defaultSortDirection === 'desc' ? GET_CASES_OVERVIEW_DESC_QUERY : GET_CASES_OVERVIEW_QUERY, sortfield: tabContainer.defaultSortField || '', sortDirection: tabContainer.defaultSortDirection || '' }; + } +}; + +/** + * Function to get getquery and default sort. + * + * @param {string} payload + * @return {json} with three keys QUERY,GET_CASES_OVERVIEW_DESC_QUERY, sortfield + */ + +const getQueryAndDefaultSort = (payload = tabIndex[0].title) => { + const tabContainer = tabContainers.find((x) => x.name === payload); + return querySwitch(payload, tabContainer); +}; + +/** + * Updates the current active dashboard tab. + * + * @param {object} data + * @return {json} + */ + +export function fetchDataForDashboardTab(payload, subjectIDsAfterFilter = null) { + const { QUERY, sortfield, sortDirection } = getQueryAndDefaultSort(payload); + const VARIABLES = subjectIDsAfterFilter || getState().filteredSubjectIds; + return client + .query({ + query: QUERY, + variables: { subject_ids: VARIABLES, order_by: sortfield || '' }, + }) + .then((result) => store.dispatch({ type: 'UPDATE_CURRRENT_TAB_DATA', payload: { currentTab: payload, sortDirection, ..._.cloneDeep(result) } })) + .catch((error) => store.dispatch( + { type: 'DASHBOARDTAB_QUERY_ERR', error }, + )); +} + +/** + * Gets all file ids for active subjectIds. + * + * @param obj fileCoubt + * @return {json} + */ +export async function fetchAllFileIDsForSelectAll(fileCount = 100000) { + const VARIABLES = getState().filteredSubjectIds; + + const fetchResult = await client + .query({ + query: GET_ALL_FILEIDS_FOR_SELECT_ALL, + variables: { subject_ids: VARIABLES, first: fileCount }, + }) + .then((result) => result.data.subjectOverViewPaged); + return fetchResult; +} + +export const getFilesCount = () => getState().stats.numberOfFiles; + +/** + * Returns the widgets data. + * @param {object} data + * @param {json} widgetsInfoFromCustConfig + * @return {json}r + */ +function getWidgetsData(input, widgetsInfoFromCustConfig) { + const donut = widgetsInfoFromCustConfig.reduce((acc, widget) => { + const Data = widget.type === 'sunburst' ? getSunburstDataFromDashboardData(input, widget.datatable_level1_field, widget.datatable_level2_field) : getDonutDataFromDashboardData(input, widget.datatable_field); + const label = widget.dataName; + return { ...acc, [label]: Data }; + }, {}); + + return donut; +} + +/** + * Reducer for fetch dashboard data + * + * @return distpatcher + */ + +export function fetchDataForDashboardTabDataTable() { + if (shouldFetchDataForDashboardTabDataTable(getState())) { + return store.dispatch(fetchDashboardTab()); + } + return store.dispatch({ type: 'READY_DASHBOARDTAB' }); +} + +/** + * Helper function to create only one filter that was from payload payload + * @param {object} payload + * @return distpatcher + */ + +function createSingleFilterVariables(payload) { + const currentAllActiveFilters = allFilters(); + // eslint-disable-next-line no-unused-vars + const filter = Object.entries(currentAllActiveFilters).reduce((acc, [key, val]) => { + if (payload[0].datafield === key) { + return { ...acc, [key]: [...currentAllActiveFilters[key], ...[payload[0].name]] }; + } + return { ...acc, [key]: currentAllActiveFilters[key] }; + }, {}); + return filter; +} + +/** + * Helper function to query and get filtered values for dashboard + * @param {object} payload ingeneral its a single filter variable used to set the checkbox + * @param {obj} currentAllFilterVariables gets the current active filters + * @return distpatcher + */ +function toggleCheckBoxWithAPIAction(payload, currentAllFilterVariables) { + return client + .query({ // request to get the filtered subjects + query: FILTER_QUERY, + variables: { ...currentAllFilterVariables, first: 100 }, + }) + .then((result) => client.query({ // request to get the filtered group counts + query: FILTER_GROUP_QUERY, + variables: { subject_ids: result.data.searchSubjects.subjectIds }, + }) + .then((result2) => store.dispatch({ + type: 'TOGGGLE_CHECKBOX_WITH_API', + payload: { + filter: payload, + allFilters: currentAllFilterVariables, + groups: _.cloneDeep(result2), + ..._.cloneDeep(result), + }, + })) + .catch((error) => store.dispatch( + { type: 'DASHBOARDTAB_QUERY_ERR', error }, + ))) + .catch((error) => store.dispatch( + { type: 'DASHBOARDTAB_QUERY_ERR', error }, + )); +} + +/** + * Reducer for clear all + * + * @return distpatcher + */ + +export function clearAllFilters() { + store.dispatch(fetchDashboardTabForClearAll()); +} + +/** + * Sets the given filter variable as the only filter for the dasboard + * @param {object} data + * @return distpatcher + */ +export async function setSingleFilter(payload) { + // test weather there are active dashboard filters if so clear all filters + if (!_.isEqual(getState().allActiveFilters, allFilters())) { + await clearAllFilters(); + } + const singlefiter = createSingleFilterVariables(payload); + store.dispatch({ type: 'SET_SINGLE_FILTER', payload: singlefiter }); +} + +/** + * Reducer for setting single checkbox filter + * @param {object} payload + * @return distpatcher + */ + +export async function singleCheckBox(payload) { + await setSingleFilter(payload); + const currentAllFilterVariables = payload === {} ? allFilters : createFilterVariables(payload); + toggleCheckBoxWithAPIAction(payload, currentAllFilterVariables); +} + +/** + * Trigger respective API queries when checkbox is checked. + * + * @param {object} payload + * @return distpatcher + */ +export function toggleCheckBox(payload) { + return () => { + const currentAllFilterVariables = payload === {} ? allFilters : createFilterVariables(payload); + // For performance issue we are using initial dasboardquery instead of fitered for empty filters + if (_.isEqual(currentAllFilterVariables, allFilters())) { + clearAllFilters(); + } else toggleCheckBoxWithAPIAction(payload, currentAllFilterVariables); + }; +} + +/** + * Reducer for sidebar loading + * + * @return distpatcher + */ + +export function setSideBarToLoading() { + store.dispatch({ type: 'SET_SIDEBAR_LOADING' }); +} + +/** + * Reducer for setting dashboardtable loading loading + * + * @return distpatcher + */ + +export function setDashboardTableLoading() { + store.dispatch({ type: 'SET_DASHBOARDTABLE_LOADING' }); +} + +export const getDashboard = () => getState(); + +// reducers +const reducers = { + DASHBOARDTAB_QUERY_ERR: (state, item) => ({ + ...state, + hasError: true, + error: item, + isLoading: false, + isFetched: false, + }), + READY_DASHBOARDTAB: (state) => ({ + ...state, + isLoading: false, + isFetched: true, + setSideBarLoading: false, + isDashboardTableLoading: false, + }), + TOGGGLE_CHECKBOX_WITH_API: (state, item) => { + const updatedCheckboxData1 = updateCheckBox( + state.checkbox.data, item.groups.data, item.filter[0], facetSearchData, + ); + const checkboxData1 = setSelectedFilterValues(updatedCheckboxData1, item.allFilters); + fetchDataForDashboardTab(state.currentActiveTab, item.data.searchSubjects.subjectIds); + return { + ...state, + setSideBarLoading: false, + allActiveFilters: item.allFilters, + filteredSubjectIds: item.data.searchSubjects.subjectIds, + checkbox: { + data: checkboxData1, + }, + stats: getFilteredStat(item.data.searchSubjects, statsCount), + widgets: getWidgetsInitData(item.groups.data, widgetsData), + }; + }, + UPDATE_CURRRENT_TAB_DATA: (state, item) => ( + { + ...state, + isDashboardTableLoading: false, + currentActiveTab: item.currentTab, + datatable: { + ...state.datatable, + dataCase: item.sortDirection === 'desc' ? item.data.subjectOverViewPagedDesc : item.data.subjectOverViewPaged, + dataSample: item.sortDirection === 'desc' ? item.data.sampleOverviewDesc : item.data.sampleOverview, + dataFile: item.sortDirection === 'desc' ? item.data.fileOverviewDesc : item.data.fileOverview, + }, + } + ), + REQUEST_DASHBOARDTAB: (state) => ({ ...state, isLoading: true }), + SET_SIDEBAR_LOADING: (state) => ({ ...state, setSideBarLoading: true }), + SET_SINGLE_FILTER: (state, item) => ( + { + ...state, + allActiveFilters: item, + } + ), + SET_DASHBOARDTABLE_LOADING: (state) => ({ ...state, isDashboardTableLoading: true }), + TOGGGLE_CHECKBOX: (state, item) => { + const dataTableFilters = getFilters(state.datatable.filters, item); + const tableData = state.subjectOverView.data.filter((d) => (filterData(d, dataTableFilters))); + const updatedCheckboxData = dataTableFilters && dataTableFilters.length !== 0 + ? getCheckBoxData( + state.subjectOverView.data, + state.checkboxForAll.data, + state.checkbox.data.filter((d) => item[0].groupName === d.groupName)[0], + dataTableFilters, + ) + : state.checkboxForAll.data; + return { + ...state, + isCalulatingDashboard: false, + stats: getStatDataFromDashboardData(tableData, statsCount), + checkbox: { + data: updatedCheckboxData, + }, + datatable: { + ...state.datatable, + dataCase: tableData, + filters: dataTableFilters, + }, + filters: dataTableFilters, + widgets: getWidgetsData(tableData, widgetsData), + }; + }, + RECEIVE_DASHBOARDTAB: (state, item) => { + const checkboxData = customCheckBox(item.data, facetSearchData); + fetchDataForDashboardTab(tabIndex[0].title, []); + return item.data + ? { + ...state.dashboard, + isFetched: true, + isLoading: false, + hasError: false, + setSideBarLoading: false, + error: '', + stats: getStatInit(item.data, statsCount), + allActiveFilters: allFilters(), + filteredSubjectIds: [], + checkboxForAll: { + data: checkboxData, + }, + checkbox: { + data: checkboxData, + }, + datatable: { + filters: [], + }, + widgets: getWidgetsInitData(item.data, widgetsData), + + } : { ...state }; + }, + CLEAR_ALL: (state, item) => { + const checkboxData = customCheckBox(item.data, facetSearchData); + return item.data + ? { + ...state.dashboard, + isFetched: true, + isLoading: false, + hasError: false, + error: '', + stats: getStatInit(item.data, statsCount), + allActiveFilters: allFilters(), + filteredSubjectIds: [], + subjectOverView: { + data: item.data.subjectOverViewPaged, + }, + checkboxForAll: { + data: checkboxData, + }, + checkbox: { + data: checkboxData, + }, + datatable: { + dataCase: item.data.subjectOverViewPaged, + dataSample: item.data.sampleOverview, + dataFile: item.data.fileOverview, + filters: [], + }, + widgets: getWidgetsInitData(item.data, widgetsData), + + } : { ...state }; + }, +}; + +// INJECT-REDUCERS INTO REDUX STORE +store.injectReducer(storeKey, (state = initialState, { type, payload }) => ( + reducers[type] ? reducers[type](state, payload) : state)); diff --git a/src/pages/dashboardTab/utils/dashboardUtilFunctions.js b/src/pages/dashboardTab/utils/dashboardUtilFunctions.js new file mode 100644 index 000000000..e8b5222a7 --- /dev/null +++ b/src/pages/dashboardTab/utils/dashboardUtilFunctions.js @@ -0,0 +1,813 @@ +import { v1 as uuid } from 'uuid'; +import { _, mergeWith, isArray } from 'lodash'; +import { facetSearchData } from '../../../bento/dashboardData'; + +const COLORS = [ + '#39C0F0', + '#004CF3', + '#FF7F15', + '#4C3112', + '#8DE260', + '#437200', +]; + +export const NOT_PROVIDED = 'Not Specified'; + +export const mappingCheckBoxToDataTable = [ + { + group: 'Program', + field: 'program', + api: 'caseOverview', + datafield: 'program', + show: false, + section: 'case', + + }, + { + group: 'Study', + field: 'study_code', + api: 'caseOverview', + datafield: 'study_code', + show: true, + type: 2, + key: 'case_id', + section: 'case', + + }, + { + group: 'Study Type', + field: 'study_type', + api: 'caseOverview', + datafield: 'study_type', + show: true, + type: 2, + key: 'case_id', + section: 'case', + + }, + { + group: 'Breed', + field: 'breed', + api: 'caseOverview', + datafield: 'breed', + show: true, + type: 2, + key: 'case_id', + section: 'case', + + }, + { + group: 'Diagnosis', + field: 'diagnosis', + api: 'caseOverview', + datafield: 'diagnosis', + show: true, + type: 2, + key: 'case_id', + section: 'case', + + }, + { + group: 'Primary Disease Site', + field: 'disease_site', + api: 'caseOverview', + datafield: 'disease_site', + show: true, + type: 2, + key: 'case_id', + section: 'case', + + }, + { + group: 'Stage of Disease', + field: 'stage_of_disease', + api: 'caseOverview', + datafield: 'stage_of_disease', + show: true, + type: 2, + key: 'case_id', + section: 'case', + + }, + { + group: 'Response to Treatment', + field: 'best_response', + api: 'caseOverview', + datafield: 'best_response', + show: true, + type: 2, + key: 'case_id', + section: 'case', + + }, + { + group: 'Sex', + field: 'sex', + api: 'caseOverview', + datafield: 'sex', + show: true, + type: 2, + key: 'case_id', + section: 'case', + + }, + { + group: 'Neutered Status', + field: 'neutered_status', + api: 'caseOverview', + datafield: 'neutered_status', + show: true, + type: 2, + key: 'case_id', + section: 'case', + + }, + { + group: 'Sample Type', + field: 'sample_list@summarized_sample_type', + api: 'caseOverview', + datafield: 'sample_list@summarized_sample_type', + show: true, + type: 2, + key: 'sample_id', + section: 'sample', + + }, + { + group: 'Sample Pathology', + field: 'sample_list@specific_sample_pathology', + api: 'caseOverview', + datafield: 'sample_list@specific_sample_pathology', + show: true, + type: 2, + key: 'sample_id', + section: 'sample', + + }, + { + group: 'File Association', + field: 'files@parent', + api: 'caseOverview', + datafield: 'files@parent', + show: true, + type: 2, + key: 'uuid', + section: 'file', + + }, + { + group: 'File Type', + field: 'files@file_type', + api: 'caseOverview', + datafield: 'files@file_type', + show: true, + type: 2, + key: 'uuid', + section: 'file', + + }, + { + group: 'File Format', + field: 'files@file_format', + api: 'caseOverview', + datafield: 'files@file_format', + show: true, + type: 2, + key: 'uuid', + section: 'file', + + }, + +]; + +export const unselectFilters = (filtersObj) => filtersObj.map((filterElement) => ({ + groupName: filterElement.groupName, + name: filterElement.name, + datafield: filterElement.datafield, + section: filterElement.section, + isChecked: false, +})); + +// getStudiesProgramWidgetFromDT +export function getSunburstDataFromDashboardData(data) { + // construct data tree + const widgetData = []; + let colorIndex = 0; + data.forEach((d) => { + let existProgram = false; + let existStudy = false; + if (d.program && d.study_code) { + widgetData.map((p) => { + if (p.title === d.program) { // program exist + existProgram = true; + // eslint-disable-next-line no-param-reassign + p.caseSize += 1; + p.children.map((study) => { + const s = study; + if (s.title === `${d.program} : ${d.study_code}`) { // study exist + existStudy = true; + s.size += 1; + s.caseSize += 1; + } + return s; + }); // end find study + if (!existStudy) { // new study + colorIndex += 1; + p.children.push({ + title: `${d.program} : ${d.study_code}`, + color: p.color, + size: 1, + caseSize: 1, + }); + } + } + return p; + }); // end find program + + if (!existProgram && !existStudy) { + widgetData.push({ + title: d.program, + color: COLORS[parseInt(colorIndex, 10)], + caseSize: 1, + children: [{ + title: `${d.program} : ${d.study_code}`, + color: COLORS[parseInt(colorIndex, 10)], + size: 1, + caseSize: 1, + }], + }); + colorIndex += 1; + } + } + }); // end foreach + + return ({ + key: uuid(), + title: 'root', + color: COLORS[parseInt(colorIndex, 10)], + children: widgetData, + }); +} + +// getWidegtDataFromDT +export function getDonutDataFromDashboardData(data, widgetName) { + const output = []; + data.reduce((accumulator, currentValue) => { + if (currentValue[widgetName.toString()]) { + if (accumulator.has(currentValue[widgetName.toString()])) { + accumulator.set( + currentValue[widgetName.toString()], + accumulator.get(currentValue[widgetName.toString()]) + 1, + ); + } else { + accumulator.set(currentValue[widgetName.toString()], 1); + } + } + return accumulator; + }, new Map()).forEach((value, key) => { output.push({ item: key, cases: value }); }); + return output; +} + +// DFS search to get all the data for Checkbox +function DFSOfCheckBoxDataType2Input(data, fields) { + const targetField = fields.shift(); + + // leaf + if (fields.length === 0) { + return data; + } + // branches + if (data[targetField]) { + if (Array.isArray(data[targetField])) { + // it is an array of object + return data[targetField].reduce( + (accumulator, currentValue) => accumulator.concat( + DFSOfCheckBoxDataType2Input(currentValue, [...fields]), + ), + [], + ); + } + // if it is an Object + return DFSOfCheckBoxDataType2Input(data[targetField], [...fields]); + } + return []; +} + +/* filterData function evaluates a row of data with filters, + to check if this row will be showed in the data table. + + If no filter, then display this row. + If has filters and for each group of filters, at least has one filter option + is related to the data. + Otherwise: Hide this row. + + @param row : a row of caseOverview, it contains all the data retrieved from backend + @param filters : array of filter + { + datafield: "diagnosis" + groupName: "Diagnosis" + isChecked: true + section:"section" + name: "B Cell Lymphoma" + } + + datafield may contains hierarchy info. eg. files@file_type + + @output : true -> display this row + false-> hide + */ +export const filterData = (row, filters) => { + // No filter + if (filters.length === 0) { + return true; + } + // filters groups + const groups = {}; + + filters.forEach((filter) => { + // skip if filter group has already satisfied. + if (groups[filter.groupName] && groups[filter.groupName] === true) return; + + // convert name + const fName = (filter.name === NOT_PROVIDED ? '' : filter.name); + // DFS get a single array + const filterOpts = filter.datafield.includes('@') ? filter.datafield.split('@') : [].concat(filter.datafield); + + const rawTargetObjs = [].concat(DFSOfCheckBoxDataType2Input(row, [...filterOpts])); + + const targetField = filterOpts.pop(); + + groups[filter.groupName] = false; + + rawTargetObjs.forEach((r) => { + if (r[targetField] === fName) { + groups[filter.groupName] = true; + } + }); + }); + + if (Object.values(groups).includes(false)) { + return false; + } + return true; +}; + +function sayNoToParent(parent) { + if (parent) { + // not root, + if (Array.isArray(parent)) { + return false; + } + return undefined; + } + // root + return undefined; +} + +function sayYesToParent(parent, nestedData) { + if (parent) { + // not root, + if (Array.isArray(parent)) { + return true; + } + return nestedData; + } + // root + return nestedData; +} + +/* DFS search to get all the data for Checkbox + @param filter : { + datafield: ["diagnosis","sdf"] + groupName: "Diagnosis" + isChecked: true + section:"section" + name: "B Cell Lymphoma" + } +*/ +/* DFS search to get all the data for Checkbox + @param filter : { + datafield: ["diagnosis","sdf"] + groupName: "Diagnosis" + isChecked: true + section:"section" + name: "B Cell Lymphoma" + } +*/ + +function DFSFiltering(nestedData, filter, parent) { + if (filter.datafield.length === 1) { + // do the matching job. + if (nestedData[filter.datafield[0]] && filter.name.includes(nestedData[filter.datafield[0]])) { + // match the filter + // tell the parent, Yes, I am your kid. + return sayYesToParent(parent, nestedData); + } + // not match the filter + // tell the parent, No, I am not your kid. + return sayNoToParent(parent); + } + // filter datafield not reach the end. have to go deep + const targetField = filter.datafield.shift(); + if (nestedData[targetField]) { + // if has target the field + if (Array.isArray(nestedData[targetField])) { + // eslint-disable-next-line no-param-reassign + nestedData[targetField] = nestedData[targetField] + .filter((d) => DFSFiltering(d, filter, nestedData[targetField])); + } else { + // eslint-disable-next-line no-param-reassign + nestedData[targetField] = DFSFiltering( + nestedData[targetField], + filter, + nestedData[targetField], + ); + } + return nestedData; + } + // target field not found + // tell the parent, No, I am not your kid. + return sayNoToParent(parent); +} + +export function getFilters(orginFilter, newCheckBoxs) { + let ogFilter = orginFilter; + newCheckBoxs.forEach((checkbox) => { + let isExist = false; + ogFilter = ogFilter.filter((filter) => { + if (checkbox.groupName === filter.groupName && checkbox.name === filter.name) { + isExist = true; + return checkbox.isChecked; + } + return true; + }); + if (!isExist && checkbox.isChecked) { + ogFilter.push(checkbox); + } + }); + return ogFilter; +} + +export function customSorting(a, b, flag, i = 0) { + if (flag === 'alphabetical') { + if (b[i] && !a[i]) { + return -1; + } + if (!b[i] && a[i]) { + return 1; + } + if (b[i] > a[i]) { return -1; } + if (b[i] < a[i]) { return 1; } + if (b[i] === a[i]) { + if (b[i] && a[i]) { + return customSorting(a, b, flag, i + 1); + } + return 0; + } + } + return -1; +} + +/* Init check box stats data with Type2 input. + This is not based on the cases but the data instead. + + @param data from API caseOverView, which is source of the data table in cases page + @param field : field for source2 will contain hierarchy info, such as samples@sample_type. + sample_type is under sample + @output + [{ + name: field, + isChecked: false, + cases: 123, + }] +*/ + +function initCheckBoxDataWithType2Input(data, field, key) { + const hierarchy = field.split('@'); + // DFS get a single array + const rawTargetObjs = data.reduce( + (accumulator, currentValue) => accumulator.concat( + DFSOfCheckBoxDataType2Input(currentValue, [...hierarchy]), + ), + [], + ); + const tmpKeys = []; // Use for filter out duplicated records + const dicResult = {}; + // count number; + const targetField = hierarchy.pop(); + rawTargetObjs.forEach((currentValue) => { + const fieldData = currentValue[targetField] === '' || !currentValue[targetField] + ? NOT_PROVIDED : currentValue[targetField]; + if (key) { + if (currentValue[key] && !tmpKeys.includes(currentValue[key])) { + tmpKeys.push(currentValue[key]); + + // count the number + if (fieldData in dicResult) { + dicResult[fieldData] += 1; + } else { + dicResult[fieldData] = 1; + } + } + } else if (fieldData in dicResult) { + dicResult[fieldData] += 1; + } else if (fieldData) { + dicResult[fieldData] = 1; + } + }); + + return Object.keys(dicResult).map((dicResultKey) => ({ + name: dicResultKey, + isChecked: false, + cases: dicResult[dicResultKey], + })); +} + +/* Init check box stats data. + + @param data : from API numberOfThings, data structures like: + { + cases:1 + [field]: + } + @param field : this is paramter to find target data + @output + [{ + name: field, + isChecked: false, + cases: 123, + }] + +*/ + +function initCheckBoxDataWithType1Input(data, field) { + const result = []; + let preElementIndex = 0; + data.map((el) => ({ + name: el[field.toString()] === '' || !el[field.toString()] + ? NOT_PROVIDED : el[field.toString()], + isChecked: false, + cases: el.cases, + })) + .sort((a, b) => customSorting(a.name, b.name, 'alphabetical')) + .forEach((el) => { + // reduce the duplication + if (result[parseInt(preElementIndex, 10)] && result[parseInt(preElementIndex, 10)].name) { + if (result[parseInt(preElementIndex, 10)].name === el.name) { + result[parseInt(preElementIndex, 10)].cases += el.cases; + } else { + preElementIndex += 1; + result.push(el); + } + } else { + result.push(el); + } + }); + + return result; +} + +/* Init check box stats data. + + @param data : two data sources with differen data structures + source1 from API numberOfThings, data structures like: + { + cases:1 + [field]: + } + source2 from API caseOverView, which is source of the data table in cases page. + Requirement : index_key should place at 1st order. (sample id comes first) + @param field : this is paramter to find target data + field for source2 will contain hierarchy info, such as samples@sample_type. + sample_type is under sample + @param type: to distinguish the input. + default[undefined]: source1 + 1-> source1 + 2-> source2 + @output + [{ + name: field, + isChecked: false, + cases: 123, + }] + +*/ +export function initCheckBoxData(data, field, type, key) { + if (type && type === 2) { + return initCheckBoxDataWithType2Input(data, field, key); + } + return initCheckBoxDataWithType1Input(data, field); +} + +// after the filtering, updateCheckBox stats +// @param data : filtered caseOverview +// @param allCheckBoxes : All stated checkbox +// @param activeCheckBoxes: filter Groups that has at least one filtering option is checked. +// @param filters : checked filtering options + +export const updateCheckBoxData = (data, allCheckBoxes, activeCheckBoxes, filters) => ( + // deep copy array + JSON.parse(JSON.stringify(allCheckBoxes)).map((ck) => { + const checkbox = ck; + if (checkbox.groupName === activeCheckBoxes.groupName) { + // if current group is active group, + // we update the filter options' status + // overwrite with old checkbox + checkbox.checkboxItems = JSON.parse( + JSON.stringify(activeCheckBoxes.checkboxItems), + ); + // update the checkbox items' status + checkbox.checkboxItems = checkbox.checkboxItems.map((el) => { + const item = el; + item.isChecked = false; + filters.forEach((filter) => { + if (item.name === filter.name) { + item.isChecked = filter.isChecked; + } + }); + return item; + }); + } else { + // get active filters without ones in the current filter group + const filterWithOutCurrentCate = filters.filter( + (f) => (f.groupName !== checkbox.groupName), + ); + + // filter data + // this is case centric filtering, because it filter the top level of the data. + // In this case, we give a list of cases, return a list cases match the query. + // however, if combines filters of sample or files will have a problem. + // Beacuse it returns cases not the files and sample. + // So we have to do the filering again to filter out the file or sample later on. + let subData = _.cloneDeep(data).filter((d) => (filterData(d, filterWithOutCurrentCate))); + + // merge filters in a same group. + let transformedfilterWithOutCurrentCate = {}; + filterWithOutCurrentCate.forEach((f) => { + if (f.datafield in transformedfilterWithOutCurrentCate) { + transformedfilterWithOutCurrentCate[f.datafield].name.push(f.name); + } else { + transformedfilterWithOutCurrentCate[f.datafield] = _.cloneDeep(f); + // eslint-disable-next-line max-len + transformedfilterWithOutCurrentCate[f.datafield].name = [transformedfilterWithOutCurrentCate[f.datafield].name]; + } + }); + // convert to array + transformedfilterWithOutCurrentCate = Object.values(transformedfilterWithOutCurrentCate); + + subData = subData.map((d) => { + // filtering + transformedfilterWithOutCurrentCate.forEach((f) => { + const filter = { ...f }; + const filterOpts = filter.datafield.includes('@') ? filter.datafield.split('@') : [].concat(filter.datafield); + filter.datafield = filterOpts; + // eslint-disable-next-line no-param-reassign + d = DFSFiltering(d, _.cloneDeep(filter), undefined); + }); + return d; + }); + // remove underfined ones + subData = subData.filter((d) => { + if (d) { return true; } return false; + }); + // Interate filter options + checkbox.checkboxItems = checkbox.checkboxItems.map((el) => { + const item = el; + item.cases = 0; + + // interate data + subData.forEach((d) => { + // filter option name + const fName = (item.name === NOT_PROVIDED ? '' : item.name); + + // data field, define how to find the data + const filterOpts = checkbox.datafield.includes('@') ? checkbox.datafield.split('@') : [].concat(checkbox.datafield); + + // find the data and put into a array + const rawTargetObjs = [].concat(DFSOfCheckBoxDataType2Input(d, [...filterOpts])); + + const targetField = filterOpts.pop(); + + const tmpKeys = []; + + const { key } = targetField; + + rawTargetObjs.forEach((r) => { + if (key) { + if (!tmpKeys.includes(r[key])) { + tmpKeys.push(r[key]); + // count + if (r[targetField]) { + if (checkbox.key in r && r[targetField] === fName) { // Str compare + item.cases += 1; + } + } else if (checkbox.key in r && item.name === NOT_PROVIDED) { // No such attribute + item.cases += 1; + } + } + } else if (checkbox.key in r && r[targetField]) { + if (r[targetField] === fName) { // Str compare + item.cases += 1; + } + } else if (checkbox.key in r && item.name === NOT_PROVIDED) { // No such attribute + item.cases += 1; + } + }); + }); + item.isChecked = false; + // update the check status + filters.forEach((filter) => { + if (checkbox.groupName === filter.groupName && item.name === filter.name) { + item.isChecked = filter.isChecked; + } + }); + return item; + }).sort((a, b) => customSorting(a.name, b.name, 'alphabetical')); + } + + return checkbox; + }) +); + +export function transformAPIDataIntoCheckBoxData(data, field) { + const result = []; + let preElementIndex = 0; + data.map((el) => ({ + name: el[field.toString()] === '' || !el[field.toString()] + ? NOT_PROVIDED : el[field.toString()], + isChecked: false, + subjects: el.subjects, + })) + .sort((a, b) => customSorting(a.name, b.name)) + .forEach((el) => { + // reduce the duplication + if (result[parseInt(preElementIndex, 10)] && result[parseInt(preElementIndex, 10)].name) { + if (result[parseInt(preElementIndex, 10)].name === el.name) { + result[parseInt(preElementIndex, 10)].subjects += el.subjects; + } else { + preElementIndex += 1; + result.push(el); + } + } else { + result.push(el); + } + }); + + return result; +} + +// CustomCheckBox works for first time init Checkbox, +// that function transforms the data which returns from API into a another format +// so it contains more information and easy for front-end to show it correctly. +export function customCheckBox(data) { + return ( + facetSearchData.map((mapping) => ({ + groupName: mapping.label, + checkboxItems: transformAPIDataIntoCheckBoxData(data[mapping.api], mapping.field), + datafield: mapping.datafield, + show: mapping.show, + })) + ); +} + +// eslint-disable-next-line consistent-return +function customizer(objValue, srcValue) { + if (isArray(objValue)) { + return objValue.concat(srcValue); + } +} + +export function getStatDataFromDashboardData(dashboardData, stats) { + const statsWithArraySubj = dashboardData.reduce((acc, subjectRow) => { + const calculatedStats = stats.map((stat) => { + if (stat.type === 'field') { + return { + [stat.statAPI]: [...(acc[stat.statAPI] || []), ...[subjectRow[stat.datatable_field]]], + }; + } + if (stat.type === 'array') { + return { + [stat.statAPI]: [...(acc[stat.statAPI] || []), ...(subjectRow[[stat.datatable_field]] + ? subjectRow[[stat.datatable_field]] : [])], + }; + } + if (stat.type === 'object') { + const statObj = (subjectRow[stat.datatable_field] + ? subjectRow[stat.datatable_field] : []).map((f) => f[stat.datatable_sub_field]); + return { + [stat.statAPI]: [...(acc[stat.statAPI] || []), ...statObj], + }; + } + return { + [stat.statAPI]: [], + }; + }); + return mergeWith(acc, calculatedStats, customizer); + }, {}); + + const output = {}; + stats.forEach((stat, index) => { + output[stat.statAPI] = [...new Set(statsWithArraySubj[index][stat.statAPI])].length; + }); + return output; +} diff --git a/src/pages/dataDictionary/dataDictonaryController.js b/src/pages/dataDictionary/dataDictonaryController.js index e73a8a616..0dd88c1ff 100644 --- a/src/pages/dataDictionary/dataDictonaryController.js +++ b/src/pages/dataDictionary/dataDictonaryController.js @@ -3,8 +3,9 @@ import yaml from 'js-yaml'; import axios from 'axios'; import YAMLData from '../../content/stg/aboutPagesContent.yaml'; import DataDictBody from './dataDictonaryView'; +import env from '../../utils/env'; -const ABOUT_CONTENT_URL = process.env.REACT_APP_ABOUT_CONTENT_URL; +const ABOUT_CONTENT_URL = env.REACT_APP_ABOUT_CONTENT_URL; const About = () => { const [data, setData] = useState([]); diff --git a/src/pages/dataDictionary/dataDictonaryView.js b/src/pages/dataDictionary/dataDictonaryView.js index 625e51ad9..a6b034f88 100644 --- a/src/pages/dataDictionary/dataDictonaryView.js +++ b/src/pages/dataDictionary/dataDictonaryView.js @@ -1,10 +1,10 @@ import React, { useState, useEffect, useRef } from 'react'; import { animateScroll as scroll } from 'react-scroll'; import { withStyles, Divider } from '@material-ui/core'; +import { AboutHeader } from 'bento-components'; import scrollUp from '../../assets/icons/ScrollUpButton.svg'; import scrollUpHover from '../../assets/icons/ScrollUpHoverButton.svg'; -import AboutHeader from '../about/aboutHeaderView'; import Stats from '../../components/Stats/AllStatsController'; import AlphabetBar from './alphabetComponent'; import Section from './attributeComponent'; diff --git a/src/pages/fileCentricCart/cartController.js b/src/pages/fileCentricCart/cartController.js new file mode 100644 index 000000000..68e78cf4c --- /dev/null +++ b/src/pages/fileCentricCart/cartController.js @@ -0,0 +1,40 @@ +import React from 'react'; +import { useQuery } from '@apollo/client'; +import { getCart } from './store/cart'; +import { Typography } from '../../components/Wrappers/Wrappers'; +import { GET_MY_CART_DATA_QUERY, GET_MY_CART_DATA_QUERY_DESC, table } from '../../bento/fileCentricCartWorkflowData'; +import CartView from './cartView'; + +const cartController = () => { + const cart = getCart(); + const ids = cart.fileIds ? cart.fileIds : []; + const defaultSortDirection = table.defaultSortDirection || 'asc'; + const CART_QUERY = defaultSortDirection === 'desc' ? GET_MY_CART_DATA_QUERY_DESC : GET_MY_CART_DATA_QUERY; + + const { loading, error, data } = useQuery(CART_QUERY, { + variables: { file_ids: ids, order_by: table.defaultSortField || '' }, + }); + + if (loading) return ; + if (error || !data) { + return ( + {error && `An error has occurred in loading CART : ${error}`} + ); + } + + return ( + + ); +}; + +export default cartController; diff --git a/src/pages/fileCentricCart/cartTableThemeConfig.js b/src/pages/fileCentricCart/cartTableThemeConfig.js new file mode 100644 index 000000000..bca06deb5 --- /dev/null +++ b/src/pages/fileCentricCart/cartTableThemeConfig.js @@ -0,0 +1,28 @@ +import React from 'react'; +import { MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles'; +import themes, { overrides } from '../../themes'; + +export default ({ + children, +}) => { + const style = []; + + const overridesObj = themes.light.overrides; + const tableBorder = '#42779A 3px solid'; + overridesObj.MUIDataTableSelectCell.headerCell.borderTop = tableBorder; + overridesObj.MUIDataTableSelectCell.headerCell.borderBottom = tableBorder; + overridesObj.MUIDataTableHeadCell.fixedHeader.borderTop = tableBorder; + overridesObj.MUIDataTableHeadCell.fixedHeader.borderBottom = tableBorder; + overridesObj.MuiTableFooter = { root: { borderTop: tableBorder } }; + overridesObj.MUIDataTableToolbar = { root: { minHeight: '15px' } }; + overridesObj.MuiTablePagination.toolbar.paddingTop = '11px'; + + style.push(overridesObj); + const computedTheme = createMuiTheme({ ...themes.light, ...overrides, ...style }); + + return ( + + {children} + + ); +}; diff --git a/src/pages/fileCentricCart/cartView.js b/src/pages/fileCentricCart/cartView.js new file mode 100644 index 000000000..2675265f1 --- /dev/null +++ b/src/pages/fileCentricCart/cartView.js @@ -0,0 +1,466 @@ +import React from 'react'; +import { + Grid, withStyles, Dialog, DialogActions, DialogContent, DialogContentText, IconButton, +} from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import { + getColumns, getOptions, getDefaultCustomFooter, +} from 'bento-components'; +import _ from 'lodash'; +import { DeleteOutline as DeleteOutlineIcon, ArrowDropDown as ArrowDropDownIcon } from '@material-ui/icons'; +import CustomDataTable from '../../components/serverPaginatedTable/serverPaginatedTable'; +import client from '../../utils/graphqlClient'; +import { + myFilesPageData, table, manifestData, GET_MY_CART_DATA_QUERY, GET_MY_CART_DATA_QUERY_DESC, +} from '../../bento/fileCentricCartWorkflowData'; +import { deleteFromCart } from './store/cart'; +import { downloadJson } from './utils'; +import Message from '../../components/Message'; +import DialogThemeProvider from './dialogThemeConfig'; +import TableThemeProvider from './cartTableThemeConfig'; + +const cartView = ({ + classes, data, fileIDs = [], defaultSortCoulmn, defaultSortDirection, +}) => { + const [modalStatus, setModalStatus] = React.useState(false); + const [TopMessageStatus, setTopMessageStatus] = React.useState(false); + const [removeAllMessageStatus, setRemoveAllMessageStatus] = React.useState(false); + const [userComments, setUserComments] = React.useState(''); + async function fetchData() { + const fetchResult = await client + .query({ + query: GET_MY_CART_DATA_QUERY, + variables: { + first: fileIDs.length, ...{ file_ids: fileIDs }, + }, + }) + .then((result) => result.data.filesInList); + return fetchResult; + } + + function toggleMessageStatus(status) { + return status === 'close' ? setTopMessageStatus(false) : setTopMessageStatus(true); + } + + function toggleRemoveAllMessageStatus(status) { + return status === 'close' ? setRemoveAllMessageStatus(false) : setRemoveAllMessageStatus(true); + } + + function closeModal() { + setModalStatus(false); + } + + function removeSubjects() { + setModalStatus(true); + } + function deleteSubjectsAndCloseModal() { + setModalStatus(false); + deleteFromCart({ fileIds: fileIDs }); + } + + function onRowSelectionChange(curr, allRowsSelected) { + return (curr, allRowsSelected); + } + async function prepareDownload() { + const data1 = await fetchData(); + return downloadJson( + data1, + userComments, + myFilesPageData.manifestFileName, + manifestData, + ); + } + + const fileIdIndex = table.columns.map((d) => d.dataField).findIndex((e) => e === 'file_id'); + + const deleteColumn = [{ + name: 'Remove', + label: 'Remove', + options: { + sort: false, + customBodyRender: (value, tableMeta) => ( +
+ +
+ ), + customHeadRender: () => ( + + +
+
+ Remove +
+
+ + removeSubjects()} onMouseEnter={() => toggleRemoveAllMessageStatus('open')} onMouseLeave={() => toggleRemoveAllMessageStatus('close')} /> + + { removeAllMessageStatus ? ( +
+ {' '} + Remove + {' '} + All + {' '} + items in cart. + {' '} +
+ ) : ''} +
+
+
+ + ), + }, + }]; + const columns = getColumns(table, classes).concat(deleteColumn); + const options = getOptions(table, classes, getDefaultCustomFooter, onRowSelectionChange); + + const messageData = ( + + {myFilesPageData.tooltipMessage} + {' '} + + ); + + const numberOfFilesBeDeleted = myFilesPageData.popUpWindow.showNumberOfFileBeRemoved ? fileIDs.length : ''; + + return ( + + + closeModal()} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + className={classes.popUpWindow} + > + + + { myFilesPageData.popUpWindow.messagePart1 } + + { myFilesPageData.popUpWindow.messagePart2 } + { numberOfFilesBeDeleted } + { myFilesPageData.popUpWindow.messagePart3 } + + { myFilesPageData.popUpWindow.messagePart4 } + {' '} + + + + + + + + +
+ +
+
+ {myFilesPageData.headerIconAlt} + +
+
+
+ {myFilesPageData.mainTitle} + + {' '} + {' '} + {myFilesPageData.subTitle} + +
+
+
+ +
+ + toggleMessageStatus('top', 'open')} onMouseEnter={() => toggleMessageStatus('open')} onMouseOver={() => toggleMessageStatus('open')} onMouseLeave={() => toggleMessageStatus('close')}> + toggleMessageStatus('open')} + onMouseOver={() => toggleMessageStatus('open')} + onFocus={() => toggleMessageStatus('top', 'open')} + src={myFilesPageData.tooltipIcon} + alt={myFilesPageData.tooltipAlt} + className={classes.helpIcon} + /> + + { TopMessageStatus ? ( +
+ {' '} + + {' '} +
+ ) : ''} +
+
+ {} + + + +
+