From 32320f013dedc43d7588dc2ac33f254d4f53de03 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 18 Feb 2020 17:22:45 +0100 Subject: [PATCH 01/36] Start implementing Resources page --- package-lock.json | 18 ++++++++--- package.json | 1 + www/front_src/src/Resources/index.tsx | 35 +++++++++++++++++++++ www/front_src/src/route-maps/reactRoutes.js | 5 +++ www/front_src/src/route-maps/route-map.js | 1 + 5 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 www/front_src/src/Resources/index.tsx diff --git a/package-lock.json b/package-lock.json index 9ee4f7bc5d5..67243b236f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "centreon", - "version": "19.04.1", + "version": "20.04.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1085,6 +1085,16 @@ "react-files": "^2.4.8", "react-router-dom": "^5.1.2", "resize-observer-polyfill": "^1.5.1" + }, + "dependencies": { + "@material-ui/icons": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.5.1.tgz", + "integrity": "sha512-YZ/BgJbXX4a0gOuKWb30mBaHaoXRqPanlePam83JQPZ/y4kl+3aW0Wv9tlR70hB5EGAkEJGW5m4ktJwMgxQAeA==", + "requires": { + "@babel/runtime": "^7.4.4" + } + } } }, "@cnakazawa/watch": { @@ -1434,9 +1444,9 @@ } }, "@material-ui/icons": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.5.1.tgz", - "integrity": "sha512-YZ/BgJbXX4a0gOuKWb30mBaHaoXRqPanlePam83JQPZ/y4kl+3aW0Wv9tlR70hB5EGAkEJGW5m4ktJwMgxQAeA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.9.1.tgz", + "integrity": "sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg==", "requires": { "@babel/runtime": "^7.4.4" } diff --git a/package.json b/package.json index 73aed014092..db362135173 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "dependencies": { "@centreon/ui": "centreon/centreon-ui", "@material-ui/core": "^4.9.2", + "@material-ui/icons": "^4.9.1", "axios": "^0.19.0", "classnames": "^2.2.6", "connected-react-router": "^6.6.1", diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx new file mode 100644 index 00000000000..51823d5b503 --- /dev/null +++ b/www/front_src/src/Resources/index.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +import { Box, Typography, makeStyles } from '@material-ui/core'; +import { Settings as IconSettings } from '@material-ui/icons'; + +import { SelectField } from '@centreon/ui'; + +const useStyles = makeStyles((theme) => ({ + iconSettings: { + color: theme.palette.primary.main, + }, +})); + +const Resources = (): JSX.Element => { + const classes = useStyles(); + + return ( + + + Filter + + + + + + + + + ); +}; + +export default Resources; diff --git a/www/front_src/src/route-maps/reactRoutes.js b/www/front_src/src/route-maps/reactRoutes.js index 096e665a425..5bdf8036dc4 100644 --- a/www/front_src/src/route-maps/reactRoutes.js +++ b/www/front_src/src/route-maps/reactRoutes.js @@ -8,6 +8,7 @@ import RemoteServerStepThree from '../route-components/remoteServerStep3'; import ServerConfigurationWizard from '../route-components/serverConfigurationWizard'; import ExtensionsManagerPage from '../route-components/administration/extensions/manager'; import NotAllowedPage from '../route-components/notAllowedPage'; +import Resources from '../Resources'; const reactRoutes = [ { @@ -46,6 +47,10 @@ const reactRoutes = [ path: routeMap.notAllowedPage, comp: NotAllowedPage, }, + { + path: routeMap.resources, + comp: Resources, + }, ]; export default reactRoutes; diff --git a/www/front_src/src/route-maps/route-map.js b/www/front_src/src/route-maps/route-map.js index 0e1021a980b..5ac7629e314 100644 --- a/www/front_src/src/route-maps/route-map.js +++ b/www/front_src/src/route-maps/route-map.js @@ -9,6 +9,7 @@ const routeMap = { pollerList: '/main.php?p=60901', extensionsManagerPage: '/administration/extensions/manager', notAllowedPage: '/not-allowed', + resources: '/monitoring/resources', }; export default routeMap; From a2aea5b6965ca4c889c63ab815f3ea945f1d7430 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Wed, 19 Feb 2020 13:57:50 +0100 Subject: [PATCH 02/36] Add Listing to Resources --- package-lock.json | 3145 ++++++++++++++--- package.json | 98 +- webpack.config.dev.js | 1 + www/front_src/src/App.tsx | 54 +- www/front_src/src/Resources/index.tsx | 96 +- .../src/Resources/translatedLabels.ts | 2 + .../src/components/ReactRouter/index.tsx | 25 +- 7 files changed, 2874 insertions(+), 547 deletions(-) create mode 100644 www/front_src/src/Resources/translatedLabels.ts diff --git a/package-lock.json b/package-lock.json index 67243b236f0..cdd0f7868f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -439,6 +439,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/plugin-syntax-decorators": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", @@ -1062,21 +1071,27 @@ "to-fast-properties": "^2.0.0" } }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "@centreon/frontend-core": { "version": "github:centreon/frontend-core#948abe1f89b8ba12ee7153b3380b12b0bec57af6", "from": "github:centreon/frontend-core", "dev": true }, "@centreon/ui": { - "version": "github:centreon/centreon-ui#c54e2cbf6ec2729a797aca41e08f27800c362d92", - "from": "github:centreon/centreon-ui", - "requires": { - "@material-ui/core": "^4.6.0", - "@material-ui/icons": "4.5.1", - "@material-ui/styles": "^4.6.0", - "axios": "^0.19.0", - "clsx": "^1.0.4", - "formik": "^2.0.3", + "version": "github:centreon/centreon-ui#afdd33b44453ce7ba017d817a5b957b804a80564", + "from": "github:centreon/centreon-ui#adapt-styles-for-unfied-view", + "requires": { + "@material-ui/core": "^4.9.3", + "@material-ui/icons": "4.9.1", + "@material-ui/styles": "^4.9.0", + "axios": "^0.19.2", + "clsx": "^1.1.0", + "formik": "^2.1.4", "loaders.css": "^0.1.2", "lodash": "^4.17.15", "prop-types": "^15.7.2", @@ -1085,16 +1100,6 @@ "react-files": "^2.4.8", "react-router-dom": "^5.1.2", "resize-observer-polyfill": "^1.5.1" - }, - "dependencies": { - "@material-ui/icons": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.5.1.tgz", - "integrity": "sha512-YZ/BgJbXX4a0gOuKWb30mBaHaoXRqPanlePam83JQPZ/y4kl+3aW0Wv9tlR70hB5EGAkEJGW5m4ktJwMgxQAeA==", - "requires": { - "@babel/runtime": "^7.4.4" - } - } } }, "@cnakazawa/watch": { @@ -1231,6 +1236,66 @@ "@hapi/hoek": "^8.3.0" } }, + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, "@jest/console": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", @@ -1423,20 +1488,19 @@ } }, "@material-ui/core": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.2.tgz", - "integrity": "sha512-fSf/yBuE5GR7dA+FiQAAGY7HrCN/8RaYApi9tx3IKMiJIJkRCHk+E2lktgJZ+QRsaqCACLo2lwhU2CW5aeO0UQ==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.3.tgz", + "integrity": "sha512-EQrhN7XHdCfBCMiCTHmiHSn/H1tj2qCt5W/kSDhr1gaYAtBTTiQ29j2xR1NcHT1siVQqAtgIkPephqbTEgQLwA==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.9.0", - "@material-ui/system": "^4.9.1", + "@material-ui/system": "^4.9.3", "@material-ui/types": "^5.0.0", "@material-ui/utils": "^4.7.1", "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.2", "convert-css-length": "^2.0.1", "hoist-non-react-statics": "^3.3.2", - "normalize-scroll-left": "^0.2.0", "popper.js": "^1.14.1", "prop-types": "^15.7.2", "react-is": "^16.8.0", @@ -1475,9 +1539,9 @@ } }, "@material-ui/system": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.1.tgz", - "integrity": "sha512-CLrJK2aKNWNwruGVTRf+rLz96P4jmozpY2UaCE6hBTa1oGsQ396YXOQQABQ4c0igawmdyf5iQb0zs9j5zsAf1w==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.3.tgz", + "integrity": "sha512-DBGsTKYrLlFpHG8BUp0X6ZpvaOzef+GhSwn/8DwVTXUdHitphaPQoL9xucrI8X9MTBo//El+7nylko7lo7eJIw==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.7.1", @@ -1566,6 +1630,15 @@ "integrity": "sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==", "dev": true }, + "@sinonjs/commons": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", + "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, "@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", @@ -1676,43 +1749,167 @@ } }, "@testing-library/dom": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-5.6.1.tgz", - "integrity": "sha512-Y1T2bjtvQMewffn1CJ28kpgnuvPYKsBcZMagEH0ppfEMZPDc8AkkEnTk4smrGZKw0cblNB3lhM2FMnpfLExlHg==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.12.2.tgz", + "integrity": "sha512-KCnvHra5fV+wDxg3wJObGvZFxq7v1DJt829GNFLuRDjKxVNc/B5AdsylNF5PMHFbWMXDsHwM26d2NZcZO9KjbQ==", "dev": true, "requires": { - "@babel/runtime": "^7.5.5", + "@babel/runtime": "^7.6.2", "@sheerun/mutationobserver-shim": "^0.3.2", + "@types/testing-library__dom": "^6.0.0", "aria-query": "3.0.0", - "pretty-format": "^24.8.0", - "wait-for-expect": "^1.2.0" + "pretty-format": "^24.9.0", + "wait-for-expect": "^3.0.0" } }, "@testing-library/jest-dom": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz", - "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.1.1.tgz", + "integrity": "sha512-7xnmBFcUmmUVAUhFiZ/u3CxFh1e46THAwra4SiiKNCW4By26RedCRwEk0rtleFPZG0wlTSNOKDvJjWYy93dp0w==", "dev": true, "requires": { - "@babel/runtime": "^7.5.1", - "chalk": "^2.4.1", - "css": "^2.2.3", + "@babel/runtime": "^7.8.3", + "@types/testing-library__jest-dom": "^5.0.0", + "chalk": "^3.0.0", + "css": "^2.2.4", "css.escape": "^1.5.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "lodash": "^4.17.11", - "pretty-format": "^24.0.0", + "jest-diff": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "lodash": "^4.17.15", + "pretty-format": "^25.1.0", "redent": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", + "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz", + "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "diff-sequences": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", + "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-diff": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", + "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "jest-get-type": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", + "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", + "dev": true + }, + "jest-matcher-utils": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", + "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "pretty-format": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", + "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@testing-library/react": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-8.0.9.tgz", - "integrity": "sha512-I7zd+MW5wk8rQA5VopZgBfxGKUd91jgZ6Vzj2gMqFf2iGGtKwvI5SVTrIJcSFaOXK88T2EUsbsIKugDtoqOcZQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.0.tgz", + "integrity": "sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==", "dev": true, "requires": { - "@babel/runtime": "^7.5.5", - "@testing-library/dom": "^5.6.1" + "@babel/runtime": "^7.7.6", + "@testing-library/dom": "^6.11.0", + "@types/testing-library__react": "^9.1.2" } }, "@types/anymatch": { @@ -1722,9 +1919,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.4.tgz", + "integrity": "sha512-c/5MuRz5HM4aizqL5ViYfW4iEnmfPcfbH4Xa6GgLT21dMc1NGeNnuS6egHheOmP+kCJ9CAzC4pv4SDCWTnRkbg==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -1761,7 +1958,8 @@ "@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==" + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true }, "@types/eslint-visitor-keys": { "version": "1.0.0", @@ -1811,6 +2009,125 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "25.1.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.2.tgz", + "integrity": "sha512-EsPIgEsonlXmYV7GzUqcvORsSS9Gqxw/OvkGwHfAdpjduNRxMlhsav0O5Kb0zijc/eXSO/uW6SJt9nwull8AUQ==", + "dev": true, + "requires": { + "jest-diff": "^25.1.0", + "pretty-format": "^25.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", + "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz", + "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "diff-sequences": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", + "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-diff": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", + "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "jest-get-type": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", + "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", + "dev": true + }, + "pretty-format": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", + "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", @@ -1822,9 +2139,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz", - "integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==" + "version": "13.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.2.tgz", + "integrity": "sha512-uvilvAQbdJvnSBFcKJ2td4016urcGvsiR+N4dHGU87ml8O2Vl6l+ErOi9w0kXSPiwJ1AYlIW+0pDXDWWMOiWbw==" }, "@types/parse-json": { "version": "4.0.0", @@ -1842,14 +2159,23 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, "@types/react": { - "version": "16.9.19", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.19.tgz", - "integrity": "sha512-LJV97//H+zqKWMms0kvxaKYJDG05U2TtQB3chRLF8MPNs+MQh/H1aGlyDUxjaHvu08EAGerdX2z4LTBc7ns77A==", + "version": "16.9.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.20.tgz", + "integrity": "sha512-jRrWBr25zzEVNa4QbESKLPluvrZ3W6Odfwrfe2F5vzbrDuNvlpnHa/xbZcXg8RH5D4CE181J5VxrRrLvzRH+5A==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" } }, + "@types/react-dom": { + "version": "16.9.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.5.tgz", + "integrity": "sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/react-router": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.4.tgz", @@ -1885,19 +2211,47 @@ "integrity": "sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==", "dev": true }, - "@types/uglify-js": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", - "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "@types/testing-library__dom": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.12.1.tgz", + "integrity": "sha512-cgqnEjxKk31tQt29j4baSWaZPNjQf3bHalj2gcHQTpW5SuHRal76gOpF0vypeEo6o+sS5inOvvNdzLY0B3FB2A==", "dev": true, "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "pretty-format": "^24.3.0" + } + }, + "@types/testing-library__jest-dom": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.1.tgz", + "integrity": "sha512-GiPXQBVF9O4DG9cssD2d266vozBJvC5Tnv6aeH5ujgYJgys1DYm9AFCz7YC+STR5ksGxq3zCt+yP8T1wbk2DFg==", + "dev": true, + "requires": { + "@types/jest": "*" + } + }, + "@types/testing-library__react": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.2.tgz", + "integrity": "sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q==", + "dev": true, + "requires": { + "@types/react-dom": "*", + "@types/testing-library__dom": "*" + } + }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -1957,11 +2311,11 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.19.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.19.2.tgz", - "integrity": "sha512-HX2qOq2GOV04HNrmKnTpSIpHjfl7iwdXe3u/Nvt+/cpmdvzYvY0NHSiTkYN257jHnq4OM/yo+OsFgati+7LqJA==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", + "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", "requires": { - "@typescript-eslint/experimental-utils": "2.19.2", + "@typescript-eslint/experimental-utils": "2.20.0", "eslint-utils": "^1.4.3", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -1969,30 +2323,30 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "2.19.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.19.2.tgz", - "integrity": "sha512-B88QuwT1wMJR750YvTJBNjMZwmiPpbmKYLm1yI7PCc3x0NariqPwqaPsoJRwU9DmUi0cd9dkhz1IqEnwfD+P1A==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", + "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.19.2", + "@typescript-eslint/typescript-estree": "2.20.0", "eslint-scope": "^5.0.0" } }, "@typescript-eslint/parser": { - "version": "2.19.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.19.2.tgz", - "integrity": "sha512-8uwnYGKqX9wWHGPGdLB9sk9+12sjcdqEEYKGgbS8A0IvYX59h01o8os5qXUHMq2na8vpDRaV0suTLM7S8wraTA==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", + "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.19.2", - "@typescript-eslint/typescript-estree": "2.19.2", + "@typescript-eslint/experimental-utils": "2.20.0", + "@typescript-eslint/typescript-estree": "2.20.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.19.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.19.2.tgz", - "integrity": "sha512-Xu/qa0MDk6upQWqE4Qy2X16Xg8Vi32tQS2PR0AvnT/ZYS4YGDvtn2MStOh5y8Zy2mg4NuL06KUHlvCh95j9C6Q==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", + "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", @@ -2710,17 +3064,316 @@ } }, "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", + "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", + "dev": true, "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.1.0", + "chalk": "^3.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/transform": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", + "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^25.1.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.3", + "jest-haste-map": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-util": "^25.1.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", + "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz", + "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", + "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", + "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-bigint": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^25.1.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "jest-haste-map": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", + "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.3", + "jest-serializer": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-regex-util": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", + "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==", + "dev": true + }, + "jest-serializer": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", + "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==", + "dev": true + }, + "jest-util": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", + "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1" + } + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", + "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } } }, "babel-loader": { @@ -3447,9 +4100,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001027", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001027.tgz", - "integrity": "sha512-7xvKeErvXZFtUItTHgNtLgS9RJpVnwBlWX8jSo/BO8VsF6deszemZSkJJJA1KOKrXuzZH4WALpAJdq5EyfgMLg==" + "version": "1.0.30001028", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", + "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==" }, "capture-exit": { "version": "2.0.0", @@ -3709,6 +4362,12 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "collect-v8-coverage": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", + "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==", + "dev": true + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -4201,11 +4860,6 @@ } } }, - "css-unit-converter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", - "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" - }, "css-vendor": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.7.tgz", @@ -4678,12 +5332,12 @@ } }, "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" } }, "domain-browser": { @@ -4692,9 +5346,9 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" }, "domexception": { "version": "1.0.1", @@ -4710,6 +5364,13 @@ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + } } }, "domutils": { @@ -4719,6 +5380,13 @@ "requires": { "dom-serializer": "0", "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + } } }, "dot-prop": { @@ -4799,9 +5467,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.349", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.349.tgz", - "integrity": "sha512-uEb2zs6EJ6OZIqaMsCSliYVgzE/f7/s1fLWqtvRtHg/v5KBF2xds974fUnyatfxIDgkqzQVwFtam5KExqywx0Q==" + "version": "1.3.355", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz", + "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==" }, "elliptic": { "version": "6.5.2", @@ -4889,9 +5557,9 @@ } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" }, "errno": { "version": "0.1.7", @@ -5908,9 +6576,9 @@ "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { "escape-string-regexp": "^1.0.5" } @@ -5924,9 +6592,10 @@ } }, "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-5.0.2.tgz", + "integrity": "sha512-QMiQ+WBkGLejKe81HU8SZ9PovsU/5uaLo0JdTCEXOYv7i7jfAjHZi1tcwp9tSASJPOmmHZtbdCervFmXMH/Dcg==", + "dev": true, "requires": { "loader-utils": "^1.2.3", "schema-utils": "^2.5.0" @@ -6908,6 +7577,18 @@ "entities": "^1.1.1", "inherits": "^2.0.1", "readable-stream": "^3.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } } }, "http-deceiver": { @@ -6975,8 +7656,14 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, - "hyphenate-style-name": { - "version": "1.0.3", + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "hyphenate-style-name": { + "version": "1.0.3", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" }, @@ -7279,6 +7966,11 @@ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -7516,56 +8208,1278 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "^2.1.1" + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "requires": { + "html-escaper": "^2.0.0" + } + }, + "jest": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", + "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", + "dev": true, + "requires": { + "@jest/core": "^25.1.0", + "import-local": "^3.0.2", + "jest-cli": "^25.1.0" + }, + "dependencies": { + "@jest/console": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", + "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", + "dev": true, + "requires": { + "@jest/source-map": "^25.1.0", + "chalk": "^3.0.0", + "jest-util": "^25.1.0", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", + "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", + "dev": true, + "requires": { + "@jest/console": "^25.1.0", + "@jest/reporters": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-changed-files": "^25.1.0", + "jest-config": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-resolve-dependencies": "^25.1.0", + "jest-runner": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "jest-watcher": "^25.1.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "realpath-native": "^1.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", + "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", + "dev": true, + "requires": { + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0" + } + }, + "@jest/fake-timers": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", + "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0", + "lolex": "^5.0.0" + } + }, + "@jest/reporters": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", + "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "jest-haste-map": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "node-notifier": "^6.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.0.1" + } + }, + "@jest/source-map": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", + "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.3", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", + "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", + "dev": true, + "requires": { + "@jest/console": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", + "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", + "dev": true, + "requires": { + "@jest/test-result": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-runner": "^25.1.0", + "jest-runtime": "^25.1.0" + } + }, + "@jest/transform": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", + "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^25.1.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.3", + "jest-haste-map": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-util": "^25.1.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", + "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "@types/yargs": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz", + "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "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==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", + "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", + "dev": true + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "expect": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", + "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-regex-util": "^25.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true, + "optional": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest-changed-files": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", + "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "execa": "^3.2.0", + "throat": "^5.0.0" + } + }, + "jest-cli": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", + "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", + "dev": true, + "requires": { + "@jest/core": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^15.0.0" + } + }, + "jest-config": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", + "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^25.1.0", + "@jest/types": "^25.1.0", + "babel-jest": "^25.1.0", + "chalk": "^3.0.0", + "glob": "^7.1.1", + "jest-environment-jsdom": "^25.1.0", + "jest-environment-node": "^25.1.0", + "jest-get-type": "^25.1.0", + "jest-jasmine2": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "micromatch": "^4.0.2", + "pretty-format": "^25.1.0", + "realpath-native": "^1.1.0" + } + }, + "jest-diff": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", + "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "jest-docblock": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", + "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", + "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.1.0", + "jest-util": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "jest-environment-jsdom": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", + "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", + "dev": true, + "requires": { + "@jest/environment": "^25.1.0", + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0", + "jsdom": "^15.1.1" + } + }, + "jest-environment-node": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", + "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", + "dev": true, + "requires": { + "@jest/environment": "^25.1.0", + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0" + } + }, + "jest-get-type": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", + "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", + "dev": true + }, + "jest-haste-map": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", + "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.3", + "jest-serializer": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", + "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^25.1.0", + "@jest/source-map": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "co": "^4.6.0", + "expect": "^25.1.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "pretty-format": "^25.1.0", + "throat": "^5.0.0" + } + }, + "jest-leak-detector": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", + "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", + "dev": true, + "requires": { + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "jest-matcher-utils": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", + "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "jest-message-util": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", + "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", + "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0" + } + }, + "jest-regex-util": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", + "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==", + "dev": true + }, + "jest-resolve": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", + "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-resolve-dependencies": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", + "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-snapshot": "^25.1.0" + } + }, + "jest-runner": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", + "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", + "dev": true, + "requires": { + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-config": "^25.1.0", + "jest-docblock": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-jasmine2": "^25.1.0", + "jest-leak-detector": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", + "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", + "dev": true, + "requires": { + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/source-map": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.3", + "jest-config": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "realpath-native": "^1.1.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.0.0" + } + }, + "jest-serializer": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", + "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==", + "dev": true + }, + "jest-snapshot": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", + "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "expect": "^25.1.0", + "jest-diff": "^25.1.0", + "jest-get-type": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^25.1.0", + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } + } + }, + "jest-util": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", + "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1" + } + }, + "jest-validate": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", + "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.1.0", + "leven": "^3.1.0", + "pretty-format": "^25.1.0" + } + }, + "jest-watcher": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", + "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", + "dev": true, + "requires": { + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.1.0", + "string-length": "^3.1.0" + } + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node-notifier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pretty-format": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", + "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "dev": true, "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", + "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", + "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==", + "dev": true + }, + "yargs": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", + "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^16.1.0" + } + }, + "yargs-parser": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", + "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -7602,6 +9516,22 @@ "micromatch": "^3.1.10", "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" + }, + "dependencies": { + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } + } } }, "jest-diff": { @@ -9031,8 +10961,17 @@ "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", "dev": true, "requires": { - "es6-symbol": "^3.1.1", - "object.assign": "^4.1.0" + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" + } + }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" } }, "loose-envify": { @@ -9460,10 +11399,9 @@ } }, "mini-css-extract-plugin": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", - "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", - "dev": true, + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", "requires": { "loader-utils": "^1.1.0", "normalize-url": "1.9.1", @@ -9475,7 +11413,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -10009,11 +11946,6 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, - "normalize-scroll-left": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.2.0.tgz", - "integrity": "sha512-t5oCENZJl8TGusJKoCJm7+asaSsPuNmK6+iEjrZ5TyBj2f02brCRsd4c83hwtu+e5d4LCSBZ0uoDlMjBo+A8yA==" - }, "normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -10033,6 +11965,11 @@ "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" } } }, @@ -10115,9 +12052,9 @@ } }, "object-hash": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.2.tgz", - "integrity": "sha512-b+2AKjAf6uQlxxv8ChHdM+VT4eeX+ZSwv+pk2xIXZWbo+yxn4/En1iC+GHe/OFYa9on0AhFF2PvuAcFHoiiHaA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" }, "object-inspect": { "version": "1.7.0", @@ -10263,11 +12200,19 @@ } }, "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", + "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", "requires": { - "is-wsl": "^1.1.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "dependencies": { + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==" + } } }, "opn": { @@ -10683,9 +12628,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -10725,36 +12670,13 @@ } }, "postcss-calc": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", - "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", "requires": { - "css-unit-converter": "^1.1.1", - "postcss": "^7.0.5", - "postcss-selector-parser": "^5.0.0-rc.4", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" } }, "postcss-color-functional-notation": { @@ -11552,11 +13474,12 @@ } }, "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "^7.0.26" } }, "postcss-selector-matches": { @@ -11616,9 +13539,9 @@ } }, "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==" }, "postcss-values-parser": { "version": "2.0.1", @@ -11721,12 +13644,12 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prompts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", - "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.1.tgz", + "integrity": "sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==", "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.3" + "sisteransi": "^1.0.4" } }, "prop-types": { @@ -11828,13 +13751,13 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.11.0.tgz", + "integrity": "sha512-jS+me8X3OEGFTsF6kF+vUUMFG/d3WUCvD7bHhfZP5784nOq1pjj8yau/u86nfOncmcN6ZkSWKWkKAvv/MGxzLA==", "requires": { "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" } }, "querystring": { @@ -11924,14 +13847,14 @@ } }, "react-dev-utils": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.1.0.tgz", - "integrity": "sha512-KmZChqxY6l+ed28IHetGrY8J9yZSvzlAHyFXduEIhQ42EBGtqftlbqQZ+dDTaC7CwNW2tuXN+66bRKE5h2HgrQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.0.tgz", + "integrity": "sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g==", "requires": { "@babel/code-frame": "7.8.3", "address": "1.1.2", "browserslist": "4.8.6", - "chalk": "3.0.0", + "chalk": "2.4.2", "cross-spawn": "7.0.1", "detect-port-alt": "1.1.6", "escape-string-regexp": "2.0.0", @@ -11945,24 +13868,15 @@ "inquirer": "7.0.4", "is-root": "2.1.0", "loader-utils": "1.2.3", - "open": "^6.4.0", + "open": "^7.0.2", "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.5", + "react-error-overlay": "^6.0.6", "recursive-readdir": "2.2.2", "shell-quote": "1.7.2", "strip-ansi": "6.0.0", "text-table": "0.2.0" }, "dependencies": { - "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==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, "browserslist": { "version": "4.8.6", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", @@ -11973,28 +13887,6 @@ "node-releases": "^1.1.47" } }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "cross-spawn": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", @@ -12019,11 +13911,6 @@ "path-exists": "^4.0.0" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -12071,14 +13958,6 @@ "ansi-regex": "^5.0.0" } }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -12101,9 +13980,9 @@ } }, "react-error-overlay": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.5.tgz", - "integrity": "sha512-+DMR2k5c6BqMDSMF8hLH0vYKtKTeikiFW+fj0LClN+XZg4N9b8QUAdHC62CGWNLTi/gnuuemNcNcTFrCvK1f+A==" + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.6.tgz", + "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==" }, "react-fast-compare": { "version": "2.0.4", @@ -12164,13 +14043,12 @@ "dev": true }, "react-redux": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.1.3.tgz", - "integrity": "sha512-uI1wca+ECG9RoVkWQFF4jDMqmaw0/qnvaSvOoL/GA4dNxf6LoV8sUAcNDvE5NWKs4hFpn0t6wswNQnY3f7HT3w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz", + "integrity": "sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==", "requires": { "@babel/runtime": "^7.5.5", "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", "react-is": "^16.9.0" @@ -12216,9 +14094,9 @@ } }, "react-scripts": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.3.1.tgz", - "integrity": "sha512-DHvc+/QN0IsLvmnPQqd+H70ol+gdFD3p/SS2tX8M6z1ysjtRGvOwLWy72co1nphYGpq1NqV/Ti5dviU8SCAXpA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", + "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", "requires": { "@babel/core": "7.8.4", "@svgr/webpack": "4.3.3", @@ -12260,29 +14138,56 @@ "postcss-preset-env": "6.7.0", "postcss-safe-parser": "4.0.1", "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.1.0", + "react-dev-utils": "^10.2.0", "resolve": "1.15.0", "resolve-url-loader": "3.1.1", "sass-loader": "8.0.2", "semver": "6.3.0", - "style-loader": "1.1.3", + "style-loader": "0.23.1", "terser-webpack-plugin": "2.3.4", "ts-pnp": "1.1.5", "url-loader": "2.3.0", "webpack": "4.41.5", - "webpack-dev-server": "3.10.1", + "webpack-dev-server": "3.10.2", "webpack-manifest-plugin": "2.2.0", "workbox-webpack-plugin": "4.3.1" }, "dependencies": { - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + }, + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" } }, "find-cache-dir": { @@ -12322,6 +14227,37 @@ "util.promisify": "1.0.0" } }, + "jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" + }, + "dependencies": { + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "requires": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + } + } + }, "jest-worker": { "version": "25.1.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", @@ -12331,11 +14267,6 @@ "supports-color": "^7.0.0" } }, - "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==" - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -12352,17 +14283,6 @@ "semver": "^6.0.0" } }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -12376,6 +14296,11 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -12384,45 +14309,12 @@ "find-up": "^4.0.0" } }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "postcss-safe-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", + "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", "requires": { - "kind-of": "^6.0.2" + "postcss": "^7.0.0" } }, "source-map": { @@ -12430,6 +14322,14 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -12452,17 +14352,16 @@ "source-map": "^0.6.1", "terser": "^4.4.3", "webpack-sources": "^1.4.3" - }, - "dependencies": { - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } + } + }, + "url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" } }, "util.promisify": { @@ -12473,6 +14372,148 @@ "define-properties": "^1.1.2", "object.getownpropertydescriptors": "^2.0.3" } + }, + "webpack": { + "version": "4.41.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", + "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } + } } } }, @@ -12784,6 +14825,11 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", @@ -13385,15 +15431,14 @@ } }, "sass-loader": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", - "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", - "dev": true, + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "requires": { "clone-deep": "^4.0.1", - "loader-utils": "^1.0.1", - "neo-async": "^2.5.0", - "pify": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", "semver": "^6.3.0" }, "dependencies": { @@ -13401,7 +15446,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, "requires": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -13411,20 +15455,12 @@ "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==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, "requires": { "kind-of": "^6.0.2" } @@ -14029,6 +16065,11 @@ } } }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -14241,9 +16282,9 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" }, "string-length": { "version": "2.0.0", @@ -14379,6 +16420,12 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -14394,12 +16441,24 @@ "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" }, "style-loader": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", - "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.6.4" + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "stylehacks": { @@ -14432,6 +16491,33 @@ "has-flag": "^3.0.0" } }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "svg-parser": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", @@ -14473,9 +16559,9 @@ "integrity": "sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A==" }, "systemjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.2.2.tgz", - "integrity": "sha512-w/E0mvyvz+kEpMkHqFAcFaxclCgAuu+iLbAE1F/S8E4Lv4Pk/KpamcusDnHLIpwKwa518sVBPu95z7VMbN264Q==" + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.2.3.tgz", + "integrity": "sha512-2ic0xO7gnFJmw/wqXU71oXNxSp9u8bNmDeP61STh987dgROiAn4noESJE9WPNdy5EgS/fGLmHC5OjKOE5be1qg==" }, "systemjs-plugin-css": { "version": "0.1.37", @@ -14531,6 +16617,16 @@ "inherits": "2" } }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, "terser": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", @@ -14549,64 +16645,114 @@ } }, "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", + "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", + "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" }, "dependencies": { - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "find-cache-dir": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", + "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" } }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "has-flag": "^4.0.0" } } } @@ -14859,6 +17005,12 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -14878,6 +17030,15 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "3.7.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", @@ -15086,9 +17247,10 @@ } }, "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-3.0.0.tgz", + "integrity": "sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A==", + "dev": true, "requires": { "loader-utils": "^1.2.3", "mime": "^2.4.4", @@ -15160,6 +17322,25 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" }, + "v8-to-istanbul": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz", + "integrity": "sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -15218,9 +17399,9 @@ } }, "wait-for-expect": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-1.3.0.tgz", - "integrity": "sha512-8fJU7jiA96HfGPt+P/UilelSAZfhMBJ52YhKzlmZQvKEZU2EcD1GQ0yqGB6liLdHjYtYAoGVigYwdxr5rktvzA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz", + "integrity": "sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==", "dev": true }, "walker": { @@ -15840,9 +18021,10 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", + "version": "4.41.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz", + "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==", + "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", @@ -15872,12 +18054,37 @@ "acorn": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -15887,11 +18094,44 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } } } }, @@ -15997,9 +18237,9 @@ } }, "webpack-dev-server": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz", - "integrity": "sha512-AGG4+XrrXn4rbZUueyNrQgO4KGnol+0wm3MPdqGLmmA+NofZl3blZQKxZ9BND6RDNuvAK9OMYClhjOSnxpWRoA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", + "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -17297,13 +19537,14 @@ } }, "yup": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", - "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.28.1.tgz", + "integrity": "sha512-xSHMZA7UyecSG/CCTDCtnYZMjBrYDR/C7hu0fMsZ6UcS/ngko4qCVFbw+CAmNtHlbItKkvQ3YXITODeTj/dUkw==", "requires": { "@babel/runtime": "^7.0.0", "fn-name": "~2.0.1", "lodash": "^4.17.11", + "lodash-es": "^4.17.11", "property-expr": "^1.5.0", "synchronous-promise": "^2.0.6", "toposort": "^2.0.2" diff --git a/package.json b/package.json index db362135173..aadddebb8a0 100644 --- a/package.json +++ b/package.json @@ -13,89 +13,89 @@ "start:dev": "npm run build:dev -- --watch" }, "devDependencies": { - "@babel/core": "^7.5.5", - "@babel/plugin-proposal-class-properties": "^7.7.4", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/polyfill": "^7.4.4", - "@babel/preset-env": "^7.5.5", - "@babel/preset-react": "^7.0.0", - "@babel/preset-typescript": "^7.7.7", + "@babel/core": "^7.8.4", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/polyfill": "^7.8.3", + "@babel/preset-env": "^7.8.4", + "@babel/preset-react": "^7.8.3", + "@babel/preset-typescript": "^7.8.3", "@centreon/frontend-core": "centreon/frontend-core", - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^8.0.6", + "@testing-library/jest-dom": "^5.1.1", + "@testing-library/react": "^9.4.0", "@types/react-router": "^5.1.4", "awesome-typescript-loader": "^5.2.1", - "babel-jest": "^24.8.0", + "babel-jest": "^25.1.0", "babel-loader": "^8.0.6", "babel-merge": "^3.0.0", "clean-webpack-plugin": "^3.0.0", - "css-loader": "^3.1.0", + "css-loader": "^3.4.2", "eslint-config-airbnb": "^18.0.1", - "eslint-config-prettier": "^6.9.0", + "eslint-config-prettier": "^6.10.0", "eslint-import-resolver-alias": "1.1.2", "eslint-plugin-babel": "^5.3.0", - "eslint-plugin-jest": "^23.6.0", + "eslint-plugin-jest": "^23.7.0", "eslint-plugin-prefer-arrow-functions": "^3.0.1", - "eslint-plugin-prettier": "^3.1.0", - "file-loader": "^4.1.0", + "eslint-plugin-prettier": "^3.1.2", + "file-loader": "^5.0.2", "html-webpack-plugin": "^3.2.0", - "html-webpack-tags-plugin": "^2.0.13", - "jest": "^24.8.0", + "html-webpack-tags-plugin": "^2.0.17", + "jest": "^25.1.0", "jest-junit": "^10.0.0", "lodash": "^4.17.15", - "mini-css-extract-plugin": "^0.8.0", - "node-sass": "^4.12.0", + "mini-css-extract-plugin": "^0.9.0", + "node-sass": "^4.13.1", "postcss-loader": "^3.0.0", - "postcss-safe-parser": "^4.0.1", - "prettier": "^1.18.2", + "postcss-safe-parser": "^4.0.2", + "prettier": "^1.19.1", "react-mock-router": "^1.0.15", "react-testing-library": "^8.0.1", - "redux-mock-store": "^1.5.3", - "resolve-url-loader": "^3.1.0", - "sass-loader": "^7.1.0", - "terser-webpack-plugin": "^1.4.2", - "typescript": "^3.7.4", - "url-loader": "^2.1.0", - "webpack": "^4.36.1", - "webpack-cli": "^3.3.6", + "redux-mock-store": "^1.5.4", + "resolve-url-loader": "^3.1.1", + "sass-loader": "^8.0.2", + "terser-webpack-plugin": "^2.3.5", + "typescript": "^3.7.5", + "url-loader": "^3.0.0", + "webpack": "^4.41.6", + "webpack-cli": "^3.3.11", "webpack-livereload-plugin": "^2.2.0", "webpack-merge": "^4.2.2" }, "dependencies": { - "@centreon/ui": "centreon/centreon-ui", - "@material-ui/core": "^4.9.2", + "@centreon/ui": "centreon/centreon-ui#adapt-styles-for-unfied-view", + "@material-ui/core": "^4.9.3", "@material-ui/icons": "^4.9.1", - "axios": "^0.19.0", + "axios": "^0.19.2", "classnames": "^2.2.6", - "connected-react-router": "^6.6.1", - "dom-serializer": "^0.1.1", + "connected-react-router": "^6.7.0", + "dom-serializer": "^0.2.2", "install": "^0.13.0", "loaders.css": "^0.1.2", - "moment-timezone": "^0.5.26", + "moment-timezone": "^0.5.27", "numeral": "^2.0.6", - "query-string": "^5.1.1", - "react": "^16.8.6", - "react-dom": "^16.8.6", + "query-string": "^6.11.0", + "react": "^16.12.0", + "react-dom": "^16.12.0", "react-full-screen": "^0.2.4", "react-fullscreen-crossbrowser": "^1.0.9", - "react-redux": "^7.1.0", + "react-redux": "^7.2.0", "react-redux-i18n": "^1.9.3", "react-router-dom": "^5.1.2", - "react-scripts": "^3.3.0", - "react-select": "^3.0.4", - "redux": "^4.0.4", + "react-scripts": "^3.4.0", + "react-select": "^3.0.8", + "redux": "^4.0.5", "redux-batched-actions": "^0.4.1", - "redux-form": "^8.2.4", + "redux-form": "^8.3.0", "redux-logger": "^3.0.6", - "redux-saga": "^1.0.5", + "redux-saga": "^1.1.3", "redux-thunk": "^2.3.0", "reselect": "^4.0.0", - "systemjs": "^6.1.3", + "systemjs": "^6.2.3", "systemjs-plugin-css": "^0.1.37", - "yup": "^0.27.0" + "yup": "^0.28.1" }, "jest": { "testResultsProcessor": "jest-junit", diff --git a/webpack.config.dev.js b/webpack.config.dev.js index 8dbd41af744..fd78e62b2ea 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -11,6 +11,7 @@ module.exports = merge(baseConfig, devConfig, { alias: { react: path.resolve('./node_modules/react'), 'react-router-dom': path.resolve('./node_modules/react-router-dom'), + '@material-ui/core': path.resolve('./node_modules/@material-ui/core'), }, }, plugins: [ diff --git a/www/front_src/src/App.tsx b/www/front_src/src/App.tsx index 351d124e513..91f79b47761 100755 --- a/www/front_src/src/App.tsx +++ b/www/front_src/src/App.tsx @@ -7,19 +7,20 @@ /* eslint-disable react/jsx-filename-extension */ import React, { Component, ReactNode } from 'react'; + import { connect } from 'react-redux'; import { ConnectedRouter } from 'connected-react-router'; import Fullscreen from 'react-fullscreen-crossbrowser'; import queryString from 'query-string'; +import { ThemeProvider } from '@centreon/ui'; import Header from './components/header'; -import { history } from './store'; +import { history } from './store'; import NavigationComponent from './components/navigation'; import Tooltip from './components/tooltip'; import Footer from './components/footer'; import MainRouter from './components/mainRouter'; import axios from './axios'; - import { fetchExternalComponents } from './redux/actions/externalComponentsActions'; import styles from './App.scss'; @@ -115,31 +116,36 @@ class App extends Component { return ( -
- {!min && } - -
- {!min &&
} -
- { - this.setState({ isFullscreenEnabled }); - }} + +
+ {!min && } + +
+ {!min &&
} +
-
- -
- + { + this.setState({ isFullscreenEnabled }); + }} + > +
+ +
+
+
+ {!min &&
}
- {!min &&
} +
- -
+ ); } diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index 51823d5b503..ae497f25151 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -1,34 +1,98 @@ import React from 'react'; -import { Box, Typography, makeStyles } from '@material-ui/core'; -import { Settings as IconSettings } from '@material-ui/icons'; +import { Box, Typography, makeStyles, Button, Paper } from '@material-ui/core'; +import { + Settings as IconSettings, + HelpOutline as IconHelp, +} from '@material-ui/icons'; -import { SelectField } from '@centreon/ui'; +import { + TABLE_COLUMN_TYPES, + Listing, + SelectField, + SearchField, +} from '@centreon/ui'; +import { labelResourceName, labelSearch } from './translatedLabels'; const useStyles = makeStyles((theme) => ({ + page: { + backgroundColor: theme.palette.background.default, + }, iconSettings: { color: theme.palette.primary.main, }, + filter: { + padding: theme.spacing(1), + backgroundColor: theme.palette.common.white, + }, + listing: { + marginLeft: theme.spacing(1), + marginRight: theme.spacing(1), + }, })); +interface FilterBoxProps { + children: React.ReactNode; +} + +const FilterBox = ({ children }: FilterBoxProps): JSX.Element => ( + {children} +); + +const noOp = (): void => undefined; + +const configuration = [ + { id: 'status', label: 'Status', type: TABLE_COLUMN_TYPES.string }, +]; + const Resources = (): JSX.Element => { const classes = useStyles(); return ( - - - Filter - - - - - - + + + + Filter + + + + + + + + + } + placeholder={labelResourceName} + /> + + + + + + +
+ - - +
+
); }; diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts new file mode 100644 index 00000000000..8bfa24c6a71 --- /dev/null +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -0,0 +1,2 @@ +export const labelResourceName = 'Resource name'; +export const labelSearch = 'Search'; diff --git a/www/front_src/src/components/ReactRouter/index.tsx b/www/front_src/src/components/ReactRouter/index.tsx index da894ed264b..297eb14921e 100644 --- a/www/front_src/src/components/ReactRouter/index.tsx +++ b/www/front_src/src/components/ReactRouter/index.tsx @@ -13,10 +13,23 @@ import NotAllowedPage from '../../route-components/notAllowedPage'; import BreadcrumbWrapper from '../breadcrumbWrapper'; import { allowedPagesSelector } from '../../redux/selectors/navigation/allowedPages'; -const PageContainer = styled('div')({ +const PageContainer = styled('div')(({ theme }) => ({ overflow: 'auto', height: 'calc(100vh - 82px)', -}); + background: theme.palette.background.default, +})); + +interface PageWithBreadcrumbProps { + children: React.ReactNode; + path: string; +} + +const PageWithBreadcrumb = ({ + children, + path, +}: PageWithBreadcrumbProps): JSX.Element => ( + {children} +); const getExternalPageRoutes = ({ history, @@ -45,9 +58,9 @@ const getExternalPageRoutes = ({ exact render={(renderProps): JSX.Element => ( - + - + )} /> @@ -78,9 +91,9 @@ const ReactRouter = React.memo( render={(renderProps): JSX.Element => ( {allowedPages.includes(path) ? ( - + - + ) : ( )} From a77b594d29be7f4a5c60de111ef17a29759afc80 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Thu, 20 Feb 2020 16:30:42 +0100 Subject: [PATCH 03/36] Implement more columns --- package-lock.json | 5 + package.json | 1 + www/front_src/src/Resources/api/endpoint.ts | 3 + www/front_src/src/Resources/api/index.ts | 16 +++ www/front_src/src/Resources/columns/index.tsx | 114 ++++++++++++++++++ www/front_src/src/Resources/index.tsx | 38 +++--- www/front_src/src/Resources/models.ts | 4 + .../src/Resources/translatedLabels.ts | 5 + 8 files changed, 169 insertions(+), 17 deletions(-) create mode 100644 www/front_src/src/Resources/api/endpoint.ts create mode 100644 www/front_src/src/Resources/api/index.ts create mode 100644 www/front_src/src/Resources/columns/index.tsx create mode 100644 www/front_src/src/Resources/models.ts diff --git a/package-lock.json b/package-lock.json index cdd0f7868f6..77f9eec5b39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5045,6 +5045,11 @@ } } }, + "date-fns": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.9.0.tgz", + "integrity": "sha512-khbFLu/MlzLjEzy9Gh8oY1hNt/Dvxw3J6Rbc28cVoYWQaC1S3YI4xwkF9ZWcjDLscbZlY9hISMr66RFzZagLsA==" + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", diff --git a/package.json b/package.json index aadddebb8a0..a225c0e1069 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "axios": "^0.19.2", "classnames": "^2.2.6", "connected-react-router": "^6.7.0", + "date-fns": "^2.9.0", "dom-serializer": "^0.2.2", "install": "^0.13.0", "loaders.css": "^0.1.2", diff --git a/www/front_src/src/Resources/api/endpoint.ts b/www/front_src/src/Resources/api/endpoint.ts new file mode 100644 index 00000000000..7233cfdc978 --- /dev/null +++ b/www/front_src/src/Resources/api/endpoint.ts @@ -0,0 +1,3 @@ +const resourceEndpoint = 'monitoring/resources'; + +export { resourceEndpoint }; diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts new file mode 100644 index 00000000000..111c2a6aaca --- /dev/null +++ b/www/front_src/src/Resources/api/index.ts @@ -0,0 +1,16 @@ +import axios from 'axios'; +import { resourceEndpoint } from './endpoint'; +import { Listing } from '../models'; + +const mockEndpoint = 'http://localhost:5000/centreon/api/v2/'; + +const api = axios.create({ + // baseURL: './api/v2/', + baseURL: mockEndpoint, +}); + +const getData = (endpoint) => api.get(endpoint).then(({ data }) => data); + +const listResources = (): Promise => getData(resourceEndpoint); + +export { listResources }; diff --git a/www/front_src/src/Resources/columns/index.tsx b/www/front_src/src/Resources/columns/index.tsx new file mode 100644 index 00000000000..8e617168b88 --- /dev/null +++ b/www/front_src/src/Resources/columns/index.tsx @@ -0,0 +1,114 @@ +import React from 'react'; + +import { distanceInWordsStricts } from 'date-fns/esm'; + +import { TABLE_COLUMN_TYPES, StatusChip, StatusCode } from '@centreon/ui'; + +import { Grid, Typography } from '@material-ui/core'; +import { + labelResources, + labelSeverity, + labelStatus, + labelDuration, + labelTries, +} from '../translatedLabels'; + +const ClickableChip = (props): JSX.Element => { + const click = (e): void => { + e.preventDefault(); + e.stopPropagation(); + }; + + return ( + + ); +}; + +interface ColumnProps { + row; + Cell: ({ children }) => JSX.Element; +} + +const SeverityColumn = ({ Cell }: ColumnProps): JSX.Element => { + return ( + + + + ); +}; + +const StatusColumn = ({ Cell, row }: ColumnProps): JSX.Element => { + return ( + + + + ); +}; + +const ResourcesColumn = ({ Cell, row }: ColumnProps): JSX.Element => { + return ( + + + + {/* {row.icon.name} */} + + + {row.name} + + {row.parent && ( + <> + + + + )} + + + ); +}; + +const columns = [ + { + id: 'severity', + label: labelSeverity, + type: TABLE_COLUMN_TYPES.component, + Component: SeverityColumn, + }, + { + id: 'status', + label: labelStatus, + type: TABLE_COLUMN_TYPES.component, + Component: StatusColumn, + }, + { + id: 'resources', + label: labelResources, + type: TABLE_COLUMN_TYPES.component, + Component: ResourcesColumn, + }, + { + id: 'duration', + label: labelDuration, + type: TABLE_COLUMN_TYPES.string, + getFormattedString: ({ last_status_change }): string => last_status_change, + }, + { + id: 'tries', + label: labelTries, + type: TABLE_COLUMN_TYPES.string, + getFormattedString: ({ tries }): string => tries, + }, + { + id: 'lastCheck', + label: 'Last check', + type: TABLE_COLUMN_TYPES.string, + getFormattedString: ({ last_check }): string => last_check, + }, + { + id: 'information', + label: 'Information', + type: TABLE_COLUMN_TYPES.string, + getFormattedString: ({ information }): string => information, + }, +]; + +export default columns; diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index ae497f25151..1c179a24e08 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { Box, Typography, makeStyles, Button, Paper } from '@material-ui/core'; import { @@ -6,13 +6,12 @@ import { HelpOutline as IconHelp, } from '@material-ui/icons'; -import { - TABLE_COLUMN_TYPES, - Listing, - SelectField, - SearchField, -} from '@centreon/ui'; +import { Listing, SelectField, SearchField } from '@centreon/ui'; + import { labelResourceName, labelSearch } from './translatedLabels'; +import { listResources } from './api'; +import { Listing as ListingEntity } from './models'; +import columns from './columns'; const useStyles = makeStyles((theme) => ({ page: { @@ -41,13 +40,18 @@ const FilterBox = ({ children }: FilterBoxProps): JSX.Element => ( const noOp = (): void => undefined; -const configuration = [ - { id: 'status', label: 'Status', type: TABLE_COLUMN_TYPES.string }, -]; - const Resources = (): JSX.Element => { const classes = useStyles(); + const [listing, setListing] = useState({ + result: [], + meta: { page: 1, total: 0, limit: 10 }, + }); + + useEffect(() => { + listResources().then((retrievedListing) => setListing(retrievedListing)); + }, []); + return (
@@ -60,7 +64,7 @@ const Resources = (): JSX.Element => { @@ -79,15 +83,15 @@ const Resources = (): JSX.Element => {
diff --git a/www/front_src/src/Resources/models.ts b/www/front_src/src/Resources/models.ts new file mode 100644 index 00000000000..f00c35b0dc6 --- /dev/null +++ b/www/front_src/src/Resources/models.ts @@ -0,0 +1,4 @@ +export interface Listing { + result; + meta; +} diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts index 8bfa24c6a71..987f4d48031 100644 --- a/www/front_src/src/Resources/translatedLabels.ts +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -1,2 +1,7 @@ +export const labelDuration = 'Duration'; export const labelResourceName = 'Resource name'; +export const labelResources = 'Resources'; export const labelSearch = 'Search'; +export const labelSeverity = 'Severity'; +export const labelStatus = 'Status'; +export const labelTries = 'Tries'; From f3d28b42169254d57b060b7f112b9493a1446ca8 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 21 Feb 2020 16:46:55 +0100 Subject: [PATCH 04/36] Finish up Listing columns --- package-lock.json | 341 +++++++++++++++--- package.json | 1 + types/custom.d.ts | 4 + webpack.config.js | 7 + .../Resources/columns/icons/downtime.icon.svg | 1 + www/front_src/src/Resources/columns/index.tsx | 119 ++++-- www/front_src/src/Resources/index.tsx | 61 +--- 7 files changed, 408 insertions(+), 126 deletions(-) create mode 100644 types/custom.d.ts create mode 100644 www/front_src/src/Resources/columns/icons/downtime.icon.svg diff --git a/package-lock.json b/package-lock.json index 77f9eec5b39..5e2502d1eed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1640,111 +1640,223 @@ } }, "@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", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.0.1.tgz", + "integrity": "sha512-av76JbSudaN2CUOGuKQp5BVqLFidtojg4ApRTg1PBOVsskXK2ORwKnBYhIu0JLA6ynmuNDprlHNCD6IwLiYidw==", + "dev": true }, "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.0.1.tgz", + "integrity": "sha512-oXyByaDQEK4Ut/eC75698MDKnaadbWmp/LS2w22cZAaoObCkkiwYYgZTZ+bvb3moo//AxvKkBtNrlz6+xBb9ZQ==", + "dev": true }, "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "dev": true }, "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "dev": true }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.0.1.tgz", + "integrity": "sha512-IbFiDBvq5WpANPndjEom1Y9k1pHCNfJs87jCN1Lt8NEA7yrNVPSoAjBVmmfi0aVBERfp8IT/lgjn2a/S85lXGg==", + "dev": true }, "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.0.1.tgz", + "integrity": "sha512-7kL9LtqCm1ca+zAbBsrD4ME3EQeVcRxkdrf2GsbKPgkzWJ+399vS4VqCP462+WvFRbG13jSwpNCrvhekdyvXsA==", + "dev": true }, "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.0.1.tgz", + "integrity": "sha512-ITG1jJ0zHQ4yft6ISQqlMW4fHIzsrSB/FmrMxAcJtkTjh9M2/9M8wfKxQya9NnTfZ5WMSlQjXMQNZmGQsuxRrw==", + "dev": true }, "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.0.1.tgz", + "integrity": "sha512-TYJ5L0QJgWqeMnuc8GEVy2jorwj/jp7y/mGLPwJhNrvrtAuVN7wEvc/Dzi1o1krsKKN7h6WpW/w3AQ6Na7qYEw==", + "dev": true }, "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.0.1.tgz", + "integrity": "sha512-V2u6rAHLD//0xu+p/Il6laOLfuU5ySpaU1t2HBBXsRp6G9GTTNpAjxUw0iRulfd56AoWcr2j+Fap/J1yz/cx0w==", + "dev": true, "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + "@svgr/babel-plugin-add-jsx-attribute": "^5.0.1", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.0.1", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.0.1", + "@svgr/babel-plugin-svg-em-dimensions": "^5.0.1", + "@svgr/babel-plugin-transform-react-native-svg": "^5.0.1", + "@svgr/babel-plugin-transform-svg-component": "^5.0.1" } }, "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.0.1.tgz", + "integrity": "sha512-F/HXJpKbN6Cab31ngiSFiUXYV9y+yiJaDaOZuc7Yqzc19+ncIrM+wSKoytjwcwc+Haj8gvEHsPqRX9L4yM1ftA==", + "dev": true, "requires": { - "@svgr/plugin-jsx": "^4.3.3", + "@svgr/plugin-jsx": "^5.0.1", "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" + "cosmiconfig": "^6.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.0.1.tgz", + "integrity": "sha512-G7UHNPNhLyDK5p6RJvSh4TRpHszTxG8jPp5lAxC6Ez6O6rj1plEAjrCDdYj50mvilUuT9IKjqn87F8+agpKaSw==", + "dev": true, "requires": { "@babel/types": "^7.4.4" } }, "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.0.1.tgz", + "integrity": "sha512-9mEinzosJshc/VdLqVkoBZQgs2d+ASbL61sX/2XCxcJ+/81KXdZcxmxSycJN37BvlM7F5fuj2ZF7IZwZ7ZOKaQ==", + "dev": true, "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" + "@babel/core": "^7.7.5", + "@svgr/babel-preset": "^5.0.1", + "@svgr/hast-util-to-babel-ast": "^5.0.1", + "svg-parser": "^2.0.2" } }, "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.1.0.tgz", + "integrity": "sha512-yj7e6F6nlMZyKe/uezrwS8ZJ6a/NRbQkuJV5yNdnottd9FiWQKG4mkLmb3YHas3rzfv5WBJHf1NU2p58/v01MA==", + "dev": true, "requires": { - "cosmiconfig": "^5.2.1", + "cosmiconfig": "^6.0.0", "merge-deep": "^3.0.2", "svgo": "^1.2.2" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.1.0.tgz", + "integrity": "sha512-Ww7PHynN6oHtdKbVB5WcgMV44v8INGVK78ydToB3JFW8ZhIyLxc7gnUq4UQjvsvqC4bTbUV0kZt0Wh30BwhSrA==", + "dev": true, "requires": { "@babel/core": "^7.4.5", "@babel/plugin-transform-react-constant-elements": "^7.0.0", "@babel/preset-env": "^7.4.5", "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", + "@svgr/core": "^5.0.1", + "@svgr/plugin-jsx": "^5.0.1", + "@svgr/plugin-svgo": "^5.1.0", "loader-utils": "^1.2.3" } }, @@ -14158,6 +14270,115 @@ "workbox-webpack-plugin": "4.3.1" }, "dependencies": { + "@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", + "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", + "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", + "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", + "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", + "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", + "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", + "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" + }, + "@svgr/babel-preset": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", + "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", + "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", + "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + } + }, + "@svgr/core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", + "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", + "requires": { + "@svgr/plugin-jsx": "^4.3.3", + "camelcase": "^5.3.1", + "cosmiconfig": "^5.2.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@svgr/plugin-jsx": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", + "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", + "requires": { + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.3", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" + } + }, + "@svgr/plugin-svgo": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", + "requires": { + "cosmiconfig": "^5.2.1", + "merge-deep": "^3.0.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", + "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", + "requires": { + "@babel/core": "^7.4.5", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.4.5", + "@babel/preset-react": "^7.0.0", + "@svgr/core": "^4.3.3", + "@svgr/plugin-jsx": "^4.3.3", + "@svgr/plugin-svgo": "^4.3.1", + "loader-utils": "^1.2.3" + } + }, "acorn": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", diff --git a/package.json b/package.json index a225c0e1069..a8c65d60622 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@babel/preset-react": "^7.8.3", "@babel/preset-typescript": "^7.8.3", "@centreon/frontend-core": "centreon/frontend-core", + "@svgr/webpack": "^5.1.0", "@testing-library/jest-dom": "^5.1.1", "@testing-library/react": "^9.4.0", "@types/react-router": "^5.1.4", diff --git a/types/custom.d.ts b/types/custom.d.ts new file mode 100644 index 00000000000..006534e2350 --- /dev/null +++ b/types/custom.d.ts @@ -0,0 +1,4 @@ +declare module '*.svg' { + const content: React.FunctionComponent>; + export default content; +} diff --git a/webpack.config.js b/webpack.config.js index bcb73cff370..5f18d19cc4a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -24,6 +24,9 @@ module.exports = merge(baseConfig, extractCssConfig, { filename: '../index.html', }), ], + resolve: { + extensions: ['.svg'], + }, module: { rules: [ { parser: { system: false } }, @@ -39,6 +42,10 @@ module.exports = merge(baseConfig, extractCssConfig, { }, ], }, + { + test: /\.icon.svg$/, + use: ['@svgr/webpack'], + }, { test: /\.(bmp|png|jpg|jpeg|gif|svg)$/, use: [ diff --git a/www/front_src/src/Resources/columns/icons/downtime.icon.svg b/www/front_src/src/Resources/columns/icons/downtime.icon.svg new file mode 100644 index 00000000000..f0f314a83e8 --- /dev/null +++ b/www/front_src/src/Resources/columns/icons/downtime.icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/front_src/src/Resources/columns/index.tsx b/www/front_src/src/Resources/columns/index.tsx index 8e617168b88..78312537188 100644 --- a/www/front_src/src/Resources/columns/index.tsx +++ b/www/front_src/src/Resources/columns/index.tsx @@ -1,46 +1,39 @@ import React from 'react'; -import { distanceInWordsStricts } from 'date-fns/esm'; +import { Grid, Typography, Avatar, makeStyles, fade } from '@material-ui/core'; +import { Person as IconAcknowledged } from '@material-ui/icons'; import { TABLE_COLUMN_TYPES, StatusChip, StatusCode } from '@centreon/ui'; -import { Grid, Typography } from '@material-ui/core'; import { labelResources, - labelSeverity, labelStatus, labelDuration, labelTries, } from '../translatedLabels'; -const ClickableChip = (props): JSX.Element => { - const click = (e): void => { - e.preventDefault(); - e.stopPropagation(); - }; - - return ( - - ); -}; +import IconDowntime from './icons/Downtime'; interface ColumnProps { row; - Cell: ({ children }) => JSX.Element; + Cell: ({ children, width }: { children; width? }) => JSX.Element; + isRowSelected: boolean; + style; + onClick; } const SeverityColumn = ({ Cell }: ColumnProps): JSX.Element => { return ( - - + + ); }; const StatusColumn = ({ Cell, row }: ColumnProps): JSX.Element => { return ( - - + + ); }; @@ -48,17 +41,31 @@ const StatusColumn = ({ Cell, row }: ColumnProps): JSX.Element => { const ResourcesColumn = ({ Cell, row }: ColumnProps): JSX.Element => { return ( - - - {/* {row.icon.name} */} + + + {row.icon ? ( + {row.icon.name} + ) : ( + + )} - + {row.name} {row.parent && ( <> - + + + + + {row.parent.name} + )} @@ -66,24 +73,81 @@ const ResourcesColumn = ({ Cell, row }: ColumnProps): JSX.Element => { ); }; +const useStateChipStyles = makeStyles((theme) => ({ + stateChip: { + width: theme.spacing(4), + height: theme.spacing(4), + }, + acknowledged: { + backgroundColor: fade('#AE9500', 0.1), + color: '#AE9500', + }, + downtime: { + backgroundColor: fade('#C117FF', 0.1), + color: '#C117FF', + }, +})); + +const DowntimeChip = (): JSX.Element => { + const classes = useStateChipStyles(); + + return ( + + + + ); +}; + +const AcknowledgedChip = (): JSX.Element => { + const classes = useStateChipStyles(); + + return ( + + + + ); +}; + +const StateColumn = ({ Cell, row }: ColumnProps): JSX.Element => { + return ( + + + {row.in_downtime && ( + + + + )} + {row.acknowledged && ( + + + + )} + + + ); +}; + const columns = [ { id: 'severity', - label: labelSeverity, + label: 'S', type: TABLE_COLUMN_TYPES.component, Component: SeverityColumn, + clickable: false, }, { id: 'status', label: labelStatus, type: TABLE_COLUMN_TYPES.component, Component: StatusColumn, + clickable: false, }, { id: 'resources', label: labelResources, type: TABLE_COLUMN_TYPES.component, Component: ResourcesColumn, + clickable: false, }, { id: 'duration', @@ -109,6 +173,13 @@ const columns = [ type: TABLE_COLUMN_TYPES.string, getFormattedString: ({ information }): string => information, }, + { + id: 'state', + label: 'State', + type: TABLE_COLUMN_TYPES.component, + Component: StateColumn, + clickable: false, + }, ]; export default columns; diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index 1c179a24e08..d00657430f0 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -1,14 +1,9 @@ import React, { useEffect, useState } from 'react'; -import { Box, Typography, makeStyles, Button, Paper } from '@material-ui/core'; -import { - Settings as IconSettings, - HelpOutline as IconHelp, -} from '@material-ui/icons'; +import { Typography, makeStyles, Paper, Grid } from '@material-ui/core'; -import { Listing, SelectField, SearchField } from '@centreon/ui'; +import { Listing, SelectField } from '@centreon/ui'; -import { labelResourceName, labelSearch } from './translatedLabels'; import { listResources } from './api'; import { Listing as ListingEntity } from './models'; import columns from './columns'; @@ -20,8 +15,8 @@ const useStyles = makeStyles((theme) => ({ iconSettings: { color: theme.palette.primary.main, }, - filter: { - padding: theme.spacing(1), + filterBox: { + padding: theme.spacing(2), backgroundColor: theme.palette.common.white, }, listing: { @@ -30,14 +25,6 @@ const useStyles = makeStyles((theme) => ({ }, })); -interface FilterBoxProps { - children: React.ReactNode; -} - -const FilterBox = ({ children }: FilterBoxProps): JSX.Element => ( - {children} -); - const noOp = (): void => undefined; const Resources = (): JSX.Element => { @@ -54,32 +41,22 @@ const Resources = (): JSX.Element => { return (
- - - + + + Filter - - - - - - - - - } - placeholder={labelResourceName} - /> - - - - - + + + + + + + + +
Date: Fri, 21 Feb 2020 16:47:04 +0100 Subject: [PATCH 05/36] Add Downtime Icon --- .../src/Resources/columns/icons/Downtime.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 www/front_src/src/Resources/columns/icons/Downtime.tsx diff --git a/www/front_src/src/Resources/columns/icons/Downtime.tsx b/www/front_src/src/Resources/columns/icons/Downtime.tsx new file mode 100644 index 00000000000..75e6b73401e --- /dev/null +++ b/www/front_src/src/Resources/columns/icons/Downtime.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +import { SvgIcon } from '@material-ui/core'; + +import { ReactComponent as IconDowntime } from './downtime.icon.svg'; + +const Downtime = (): JSX.Element => ( + +); + +export default Downtime; From db10fac7fbccab9d39974a76668b307fca31e4ac Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Mon, 24 Feb 2020 19:00:19 +0100 Subject: [PATCH 06/36] Implement sorting and filtering --- www/front_src/src/Resources/api/endpoint.ts | 20 +++- www/front_src/src/Resources/api/index.ts | 16 ++- www/front_src/src/Resources/columns/index.tsx | 8 +- www/front_src/src/Resources/index.test.tsx | 5 + www/front_src/src/Resources/index.tsx | 100 +++++++++++++++--- www/front_src/src/Resources/models.ts | 76 ++++++++++++- .../src/Resources/translatedLabels.ts | 22 ++-- 7 files changed, 211 insertions(+), 36 deletions(-) create mode 100644 www/front_src/src/Resources/index.test.tsx diff --git a/www/front_src/src/Resources/api/endpoint.ts b/www/front_src/src/Resources/api/endpoint.ts index 7233cfdc978..9c643631b13 100644 --- a/www/front_src/src/Resources/api/endpoint.ts +++ b/www/front_src/src/Resources/api/endpoint.ts @@ -1,3 +1,19 @@ -const resourceEndpoint = 'monitoring/resources'; +const resourcesEndpoint = 'monitoring/resources'; -export { resourceEndpoint }; +const buildParam = (param): string => { + if (!param) { + return ''; + } + return JSON.stringify(param); +}; + +const buildResourcesEndpoint = ({ state, sort }): string => { + const stateParam = buildParam([state]); + const sortParam = buildParam(sort); + + return [`${resourcesEndpoint}?state=${stateParam}`, sortParam] + .filter((part) => part !== '') + .join('&'); +}; + +export { buildResourcesEndpoint }; diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts index 111c2a6aaca..c3a38979b87 100644 --- a/www/front_src/src/Resources/api/index.ts +++ b/www/front_src/src/Resources/api/index.ts @@ -1,6 +1,7 @@ -import axios from 'axios'; -import { resourceEndpoint } from './endpoint'; -import { Listing } from '../models'; +import axios, { AxiosRequestConfig } from 'axios'; + +import { buildResourcesEndpoint } from './endpoint'; +import { ResourceListing } from '../models'; const mockEndpoint = 'http://localhost:5000/centreon/api/v2/'; @@ -9,8 +10,13 @@ const api = axios.create({ baseURL: mockEndpoint, }); -const getData = (endpoint) => api.get(endpoint).then(({ data }) => data); +const getData = ({ endpoint, requestParams }): Promise => + api.get(endpoint, requestParams).then(({ data }) => data); -const listResources = (): Promise => getData(resourceEndpoint); +const listResources = ( + endpointParams, + requestParams: AxiosRequestConfig = {}, +): Promise => + getData({ endpoint: buildResourcesEndpoint(endpointParams), requestParams }); export { listResources }; diff --git a/www/front_src/src/Resources/columns/index.tsx b/www/front_src/src/Resources/columns/index.tsx index 78312537188..e37247672ae 100644 --- a/www/front_src/src/Resources/columns/index.tsx +++ b/www/front_src/src/Resources/columns/index.tsx @@ -10,6 +10,8 @@ import { labelStatus, labelDuration, labelTries, + labelInformation, + labelState, } from '../translatedLabels'; import IconDowntime from './icons/Downtime'; @@ -153,7 +155,7 @@ const columns = [ id: 'duration', label: labelDuration, type: TABLE_COLUMN_TYPES.string, - getFormattedString: ({ last_status_change }): string => last_status_change, + getFormattedString: ({ duration }): string => duration, }, { id: 'tries', @@ -169,13 +171,13 @@ const columns = [ }, { id: 'information', - label: 'Information', + label: labelInformation, type: TABLE_COLUMN_TYPES.string, getFormattedString: ({ information }): string => information, }, { id: 'state', - label: 'State', + label: labelState, type: TABLE_COLUMN_TYPES.component, Component: StateColumn, clickable: false, diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx new file mode 100644 index 00000000000..70ed50addc1 --- /dev/null +++ b/www/front_src/src/Resources/index.test.tsx @@ -0,0 +1,5 @@ +import Resources from '.'; + +describe(Resources, () => { + it('lists resources', () => {}); +}); diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index d00657430f0..95ebe99b0c3 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -1,12 +1,26 @@ import React, { useEffect, useState } from 'react'; +import axios from 'axios'; + import { Typography, makeStyles, Paper, Grid } from '@material-ui/core'; -import { Listing, SelectField } from '@centreon/ui'; +import { + Listing, + SelectField, + withErrorSnackbar, + useErrorSnackbar, +} from '@centreon/ui'; import { listResources } from './api'; -import { Listing as ListingEntity } from './models'; +import { + Listing as ListingEntity, + Resource, + unhandledProblemsFilter, + resourcesProblemFilter, + allFilter, +} from './models'; import columns from './columns'; +import { labelFilter } from './translatedLabels'; const useStyles = makeStyles((theme) => ({ page: { @@ -30,28 +44,79 @@ const noOp = (): void => undefined; const Resources = (): JSX.Element => { const classes = useStyles(); - const [listing, setListing] = useState({ - result: [], - meta: { page: 1, total: 0, limit: 10 }, - }); + const [listing, setListing] = useState | undefined>( + undefined, + ); + const [filterId, setFilterId] = useState('unhandled_problems'); + const [sort, setSort] = useState<{ [orderBy: string]: string }>({}); + const [loading, setLoading] = useState(true); + const { showError } = useErrorSnackbar(); + const [tokenSource] = useState(axios.CancelToken.source()); + + const load = (): void => { + setLoading(true); + listResources({ state: filterId, sort }, { cancelToken: tokenSource.token }) + .then((retrievedListing) => setListing(retrievedListing)) + .catch((error) => { + showError(error.message); + }) + .finally(() => setLoading(false)); + }; useEffect(() => { - listResources().then((retrievedListing) => setListing(retrievedListing)); + return (): void => { + tokenSource.cancel(); + }; }, []); + useEffect(() => { + load(); + }, [filterId]); + + useEffect(() => { + if (!sort) { + return; + } + + load(); + }, [sort]); + + const changeFilterId = (event): void => { + setFilterId(event.target.value); + }; + + const changeSort = ({ order, orderBy }): void => { + setSort({ [orderBy]: order }); + }; + + const getSortf = (): string => { + const [sorto] = Object.keys(sort); + + return sorto; + }; + + const getSorto = (): string => { + return sort[getSortf()]; + }; + return (
- Filter + {labelFilter} @@ -60,15 +125,18 @@ const Resources = (): JSX.Element => {
@@ -77,4 +145,4 @@ const Resources = (): JSX.Element => { ); }; -export default Resources; +export default withErrorSnackbar(Resources); diff --git a/www/front_src/src/Resources/models.ts b/www/front_src/src/Resources/models.ts index f00c35b0dc6..fb400b4667d 100644 --- a/www/front_src/src/Resources/models.ts +++ b/www/front_src/src/Resources/models.ts @@ -1,4 +1,74 @@ -export interface Listing { - result; - meta; +import { + labelUnhandledProblems, + labelResourceProblems, + labelAll, +} from './translatedLabels'; + +export interface Icon { + url: string; + name: string; } + +export interface Parent { + name: string; + icon: Icon | null; +} + +export interface Status { + code: number; + name: string; +} + +export interface Severity { + level: number; +} + +export interface Resource { + id: string; + name: string; + icon?: Icon; + parent: Parent; + status: Status; + acknowledged: boolean; + in_downtime: boolean; + duration: string; + tries: string; + last_check: string; + information: string; + severity?: Severity; +} + +interface ListingMeta { + page: number; + limit: number; + search: {}; + sort_by: {}; + total: number; +} + +export interface Listing { + result: TEntity; + meta: ListingMeta; +} + +export type ResourceListing = Listing; + +export interface Filter { + id: 'unhandled_problems' | 'resources_problems' | 'all'; + name: string; +} + +export const unhandledProblemsFilter: Filter = { + id: 'unhandled_problems', + name: labelUnhandledProblems, +}; + +export const resourcesProblemFilter: Filter = { + id: 'resources_problems', + name: labelResourceProblems, +}; + +export const allFilter: Filter = { + id: 'all', + name: labelAll, +}; diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts index 987f4d48031..04d04da8194 100644 --- a/www/front_src/src/Resources/translatedLabels.ts +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -1,7 +1,15 @@ -export const labelDuration = 'Duration'; -export const labelResourceName = 'Resource name'; -export const labelResources = 'Resources'; -export const labelSearch = 'Search'; -export const labelSeverity = 'Severity'; -export const labelStatus = 'Status'; -export const labelTries = 'Tries'; +import { I18n } from 'react-redux-i18n'; + +export const labelAll = I18n.t('All'); +export const labelDuration = I18n.t('Duration'); +export const labelFilter = I18n.t('Filter'); +export const labelResourceName = I18n.t('Resource name'); +export const labelResourceProblems = I18n.t('Resource problems'); +export const labelResources = I18n.t('Resources'); +export const labelSearch = I18n.t('Search'); +export const labelSeverity = I18n.t('Severity'); +export const labelStatus = I18n.t('Status'); +export const labelTries = I18n.t('Tries'); +export const labelInformation = I18n.t('Information'); +export const labelState = I18n.t('State'); +export const labelUnhandledProblems = I18n.t('Unhandled problems'); From 800ae096638a62001e37ccfc51f3cdcc9693afcf Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 25 Feb 2020 19:21:33 +0100 Subject: [PATCH 07/36] Implement pagination and limit --- jest.config.js | 1 + package-lock.json | 1171 +++++++++++------ package.json | 25 +- setupTests.ts | 8 + www/front_src/src/Resources/api/endpoint.ts | 30 +- www/front_src/src/Resources/columns/index.tsx | 18 +- www/front_src/src/Resources/index.test.tsx | 86 +- www/front_src/src/Resources/index.tsx | 60 +- www/front_src/src/Resources/models.ts | 6 +- .../src/Resources/translatedLabels.ts | 1 + www/front_src/src/__mocks__/axios.ts | 11 + 11 files changed, 983 insertions(+), 434 deletions(-) create mode 100644 setupTests.ts create mode 100644 www/front_src/src/__mocks__/axios.ts diff --git a/jest.config.js b/jest.config.js index b4b88d210cb..d6c9fb3a6ce 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,4 +2,5 @@ const merge = require('lodash/merge'); module.exports = merge(require('@centreon/frontend-core/jest'), { roots: ['/www/front_src/src/'], + setupFilesAfterEnv: ['/setupTests.ts'], }); diff --git a/package-lock.json b/package-lock.json index 5e2502d1eed..0aa646650b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1083,7 +1083,7 @@ "dev": true }, "@centreon/ui": { - "version": "github:centreon/centreon-ui#afdd33b44453ce7ba017d817a5b957b804a80564", + "version": "github:centreon/centreon-ui#841691ff4317bddae6d83ea3528ef7216baed556", "from": "github:centreon/centreon-ui#adapt-styles-for-unfied-view", "requires": { "@material-ui/core": "^4.9.3", @@ -1488,9 +1488,9 @@ } }, "@material-ui/core": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.3.tgz", - "integrity": "sha512-EQrhN7XHdCfBCMiCTHmiHSn/H1tj2qCt5W/kSDhr1gaYAtBTTiQ29j2xR1NcHT1siVQqAtgIkPephqbTEgQLwA==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.4.tgz", + "integrity": "sha512-1wqm3jBC8mGpVHu0wVOYBX7LUzkPsWxkkTtKSn0Hz66T6TDJkke72mkSIL7akNdjnxy+bRc2Vi6NiJ4YutkDcw==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.9.0", @@ -1499,7 +1499,6 @@ "@material-ui/utils": "^4.7.1", "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.2", - "convert-css-length": "^2.0.1", "hoist-non-react-statics": "^3.3.2", "popper.js": "^1.14.1", "prop-types": "^15.7.2", @@ -1631,170 +1630,231 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.0.1.tgz", - "integrity": "sha512-av76JbSudaN2CUOGuKQp5BVqLFidtojg4ApRTg1PBOVsskXK2ORwKnBYhIu0JLA6ynmuNDprlHNCD6IwLiYidw==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" }, "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.0.1.tgz", - "integrity": "sha512-oXyByaDQEK4Ut/eC75698MDKnaadbWmp/LS2w22cZAaoObCkkiwYYgZTZ+bvb3moo//AxvKkBtNrlz6+xBb9ZQ==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" }, "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", + "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" }, "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", + "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.0.1.tgz", - "integrity": "sha512-IbFiDBvq5WpANPndjEom1Y9k1pHCNfJs87jCN1Lt8NEA7yrNVPSoAjBVmmfi0aVBERfp8IT/lgjn2a/S85lXGg==", - "dev": true + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", + "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" }, "@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.0.1.tgz", - "integrity": "sha512-7kL9LtqCm1ca+zAbBsrD4ME3EQeVcRxkdrf2GsbKPgkzWJ+399vS4VqCP462+WvFRbG13jSwpNCrvhekdyvXsA==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", + "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" }, "@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.0.1.tgz", - "integrity": "sha512-ITG1jJ0zHQ4yft6ISQqlMW4fHIzsrSB/FmrMxAcJtkTjh9M2/9M8wfKxQya9NnTfZ5WMSlQjXMQNZmGQsuxRrw==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", + "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" }, "@svgr/babel-plugin-transform-svg-component": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.0.1.tgz", - "integrity": "sha512-TYJ5L0QJgWqeMnuc8GEVy2jorwj/jp7y/mGLPwJhNrvrtAuVN7wEvc/Dzi1o1krsKKN7h6WpW/w3AQ6Na7qYEw==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", + "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" }, "@svgr/babel-preset": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.0.1.tgz", - "integrity": "sha512-V2u6rAHLD//0xu+p/Il6laOLfuU5ySpaU1t2HBBXsRp6G9GTTNpAjxUw0iRulfd56AoWcr2j+Fap/J1yz/cx0w==", - "dev": true, + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", + "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.0.1", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.0.1", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.0.1", - "@svgr/babel-plugin-svg-em-dimensions": "^5.0.1", - "@svgr/babel-plugin-transform-react-native-svg": "^5.0.1", - "@svgr/babel-plugin-transform-svg-component": "^5.0.1" + "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", + "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", + "@svgr/babel-plugin-transform-svg-component": "^4.2.0" } }, "@svgr/core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.0.1.tgz", - "integrity": "sha512-F/HXJpKbN6Cab31ngiSFiUXYV9y+yiJaDaOZuc7Yqzc19+ncIrM+wSKoytjwcwc+Haj8gvEHsPqRX9L4yM1ftA==", - "dev": true, + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", + "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", "requires": { - "@svgr/plugin-jsx": "^5.0.1", + "@svgr/plugin-jsx": "^4.3.3", "camelcase": "^5.3.1", - "cosmiconfig": "^6.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } + "cosmiconfig": "^5.2.1" } }, "@svgr/hast-util-to-babel-ast": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.0.1.tgz", - "integrity": "sha512-G7UHNPNhLyDK5p6RJvSh4TRpHszTxG8jPp5lAxC6Ez6O6rj1plEAjrCDdYj50mvilUuT9IKjqn87F8+agpKaSw==", - "dev": true, + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", "requires": { "@babel/types": "^7.4.4" } }, "@svgr/plugin-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.0.1.tgz", - "integrity": "sha512-9mEinzosJshc/VdLqVkoBZQgs2d+ASbL61sX/2XCxcJ+/81KXdZcxmxSycJN37BvlM7F5fuj2ZF7IZwZ7ZOKaQ==", - "dev": true, + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", + "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", "requires": { - "@babel/core": "^7.7.5", - "@svgr/babel-preset": "^5.0.1", - "@svgr/hast-util-to-babel-ast": "^5.0.1", - "svg-parser": "^2.0.2" + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.3", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" } }, "@svgr/plugin-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.1.0.tgz", - "integrity": "sha512-yj7e6F6nlMZyKe/uezrwS8ZJ6a/NRbQkuJV5yNdnottd9FiWQKG4mkLmb3YHas3rzfv5WBJHf1NU2p58/v01MA==", - "dev": true, + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", "requires": { - "cosmiconfig": "^6.0.0", + "cosmiconfig": "^5.2.1", "merge-deep": "^3.0.2", "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.2.0.tgz", + "integrity": "sha512-y9tMjTtqrvC998aCOgsEP8pb+bdg2RR1v8i+sjT31m4Xb8HGd905K7/GdSwEMM2nlTFbxSUQPZRRvfaJwAvghA==", + "dev": true, + "requires": { + "@babel/core": "^7.4.5", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.4.5", + "@babel/preset-react": "^7.0.0", + "@svgr/core": "^5.2.0", + "@svgr/plugin-jsx": "^5.2.0", + "@svgr/plugin-svgo": "^5.2.0", + "loader-utils": "^1.2.3" }, "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.0.1.tgz", + "integrity": "sha512-av76JbSudaN2CUOGuKQp5BVqLFidtojg4ApRTg1PBOVsskXK2ORwKnBYhIu0JLA6ynmuNDprlHNCD6IwLiYidw==", + "dev": true + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.0.1.tgz", + "integrity": "sha512-oXyByaDQEK4Ut/eC75698MDKnaadbWmp/LS2w22cZAaoObCkkiwYYgZTZ+bvb3moo//AxvKkBtNrlz6+xBb9ZQ==", + "dev": true + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "dev": true + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "dev": true + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.0.1.tgz", + "integrity": "sha512-IbFiDBvq5WpANPndjEom1Y9k1pHCNfJs87jCN1Lt8NEA7yrNVPSoAjBVmmfi0aVBERfp8IT/lgjn2a/S85lXGg==", + "dev": true + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.0.1.tgz", + "integrity": "sha512-7kL9LtqCm1ca+zAbBsrD4ME3EQeVcRxkdrf2GsbKPgkzWJ+399vS4VqCP462+WvFRbG13jSwpNCrvhekdyvXsA==", + "dev": true + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.0.1.tgz", + "integrity": "sha512-ITG1jJ0zHQ4yft6ISQqlMW4fHIzsrSB/FmrMxAcJtkTjh9M2/9M8wfKxQya9NnTfZ5WMSlQjXMQNZmGQsuxRrw==", + "dev": true + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.2.0.tgz", + "integrity": "sha512-t4dq0cNr7c8cuUu1Cwehai/0iXO3dV5876r2QRaLdgQF3C6XOK2vdTvNOwcJ3uRa92revSC3kGL8v8WgJrecRg==", + "dev": true + }, + "@svgr/babel-preset": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.2.0.tgz", + "integrity": "sha512-sr7486h+SddMU1VgFrajXx/Ws0a1QPzX4wUBM1LgG2PHeZpnm+fQs2MXQNdnfoXRwo7C5mH2I4QDiRVR/49BEg==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.0.1", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.0.1", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.0.1", + "@svgr/babel-plugin-svg-em-dimensions": "^5.0.1", + "@svgr/babel-plugin-transform-react-native-svg": "^5.0.1", + "@svgr/babel-plugin-transform-svg-component": "^5.2.0" + } + }, + "@svgr/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.2.0.tgz", + "integrity": "sha512-vuODnJ0owj/oFi2bzskuSEk6TGuYoMV9hmvBhGuE1QktzMAAjOr0LnvUN5u2eGB6ilGdI7yqUKrZtQ0Tw44mrA==", + "dev": true, + "requires": { + "@svgr/plugin-jsx": "^5.2.0", + "camelcase": "^5.3.1", + "cosmiconfig": "^6.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.0.1.tgz", + "integrity": "sha512-G7UHNPNhLyDK5p6RJvSh4TRpHszTxG8jPp5lAxC6Ez6O6rj1plEAjrCDdYj50mvilUuT9IKjqn87F8+agpKaSw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@svgr/plugin-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.2.0.tgz", + "integrity": "sha512-z1HWitE5sCNgaXqBGrmCnnnvR/BRTq9B/lsgZ+T8OWABzZHhezqjjDUvkyyyBb3Y+0xExWg5aTh2jxqk7GR9tg==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@svgr/babel-preset": "^5.2.0", + "@svgr/hast-util-to-babel-ast": "^5.0.1", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.2.0.tgz", + "integrity": "sha512-cyqWx026uO3heGG/55j5zfJLtS5sl0dWYawN1JotOqpJDyyR7rraTsnydpwwsOoz0YpESjVjAkXOAfd41lBY9Q==", + "dev": true, + "requires": { + "cosmiconfig": "^6.0.0", + "merge-deep": "^3.0.2", + "svgo": "^1.2.2" + } + }, "cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -1844,22 +1904,6 @@ } } }, - "@svgr/webpack": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.1.0.tgz", - "integrity": "sha512-Ww7PHynN6oHtdKbVB5WcgMV44v8INGVK78ydToB3JFW8ZhIyLxc7gnUq4UQjvsvqC4bTbUV0kZt0Wh30BwhSrA==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^5.0.1", - "@svgr/plugin-jsx": "^5.0.1", - "@svgr/plugin-svgo": "^5.1.0", - "loader-utils": "^1.2.3" - } - }, "@testing-library/dom": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.12.2.tgz", @@ -2014,16 +2058,22 @@ } }, "@testing-library/react": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.0.tgz", - "integrity": "sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.1.tgz", + "integrity": "sha512-sta3ui24HPgW92quHyQj6gpOkNgLNx8BX/QOU4k1bddo43ZdqlGwmzCYwL93bExfhergwiau+IzBGl7TCsSFeA==", "dev": true, "requires": { - "@babel/runtime": "^7.7.6", + "@babel/runtime": "^7.8.3", "@testing-library/dom": "^6.11.0", "@types/testing-library__react": "^9.1.2" } }, + "@testing-library/user-event": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-10.0.0.tgz", + "integrity": "sha512-ygQ1SaX3AzWDGPer5e2LF7FvWwLPG+XYViHvpW4ObseOkqmJI2ruawp9iLmEwxQW88jNCCExvonh0jBAwwiYZw==", + "dev": true + }, "@types/anymatch": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", @@ -2031,9 +2081,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.4.tgz", - "integrity": "sha512-c/5MuRz5HM4aizqL5ViYfW4iEnmfPcfbH4Xa6GgLT21dMc1NGeNnuS6egHheOmP+kCJ9CAzC4pv4SDCWTnRkbg==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.5.tgz", + "integrity": "sha512-+ckxwNj892FWgvwrUWLOghQ2JDgOgeqTPwrcl+0t1pG59CP8qMJ6S/efmEd999vCFSJKOpyMakvU+w380rduUQ==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -2060,9 +2110,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", + "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", "requires": { "@babel/types": "^7.3.0" } @@ -2122,9 +2172,9 @@ } }, "@types/jest": { - "version": "25.1.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.2.tgz", - "integrity": "sha512-EsPIgEsonlXmYV7GzUqcvORsSS9Gqxw/OvkGwHfAdpjduNRxMlhsav0O5Kb0zijc/eXSO/uW6SJt9nwull8AUQ==", + "version": "25.1.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.3.tgz", + "integrity": "sha512-jqargqzyJWgWAJCXX96LBGR/Ei7wQcZBvRv0PLEu9ZByMfcs23keUJrKv9FMR6YZf9YCbfqDqgmY+JUBsnqhrg==", "dev": true, "requires": { "jest-diff": "^25.1.0", @@ -2251,9 +2301,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.2.tgz", - "integrity": "sha512-uvilvAQbdJvnSBFcKJ2td4016urcGvsiR+N4dHGU87ml8O2Vl6l+ErOi9w0kXSPiwJ1AYlIW+0pDXDWWMOiWbw==" + "version": "13.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.4.tgz", + "integrity": "sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==" }, "@types/parse-json": { "version": "4.0.0", @@ -2271,9 +2321,9 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, "@types/react": { - "version": "16.9.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.20.tgz", - "integrity": "sha512-jRrWBr25zzEVNa4QbESKLPluvrZ3W6Odfwrfe2F5vzbrDuNvlpnHa/xbZcXg8RH5D4CE181J5VxrRrLvzRH+5A==", + "version": "16.9.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.22.tgz", + "integrity": "sha512-7OSt4EGiLvy0h5R7X+r0c7S739TCU/LvWbkNOrm10lUwNHe7XPz5OLhLOSZeCkqO9JSCly1NkYJ7ODTUqVnHJQ==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" @@ -2299,9 +2349,9 @@ } }, "@types/react-transition-group": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.3.tgz", - "integrity": "sha512-Hk8jiuT7iLOHrcjKP/ZVSyCNXK73wJAUz60xm0mVhiRujrdiI++j4duLiL282VGxwAgxetHQFfqA29LgEeSkFA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.4.tgz", + "integrity": "sha512-8DMUaDqh0S70TjkqU0DxOu80tFUiiaS9rxkWip/nb7gtvAsbqOXm02UCmR8zdcjWujgeYPiPNTVpVpKzUDotwA==", "requires": { "@types/react": "*" } @@ -2423,11 +2473,11 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", - "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.21.0.tgz", + "integrity": "sha512-b5jjjDMxzcjh/Sbjuo7WyhrQmVJg0WipTHQgXh5Xwx10uYm6nPWqN1WGOsaNq4HR3Zh4wUx4IRQdDkCHwyewyw==", "requires": { - "@typescript-eslint/experimental-utils": "2.20.0", + "@typescript-eslint/experimental-utils": "2.21.0", "eslint-utils": "^1.4.3", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -2435,30 +2485,30 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", - "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.21.0.tgz", + "integrity": "sha512-olKw9JP/XUkav4lq0I7S1mhGgONJF9rHNhKFn9wJlpfRVjNo3PPjSvybxEldvCXnvD+WAshSzqH5cEjPp9CsBA==", "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.20.0", + "@typescript-eslint/typescript-estree": "2.21.0", "eslint-scope": "^5.0.0" } }, "@typescript-eslint/parser": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", - "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.21.0.tgz", + "integrity": "sha512-VrmbdrrrvvI6cPPOG7uOgGUFXNYTiSbnRq8ZMyuGa4+qmXJXVLEEz78hKuqupvkpwJQNk1Ucz1TenrRP90gmBg==", "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.20.0", - "@typescript-eslint/typescript-estree": "2.20.0", + "@typescript-eslint/experimental-utils": "2.21.0", + "@typescript-eslint/typescript-estree": "2.21.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", - "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.21.0.tgz", + "integrity": "sha512-NC/nogZNb9IK2MEFQqyDBAciOT8Lp8O3KgAfvHx2Skx6WBo+KmDqlU3R9KxHONaijfTIKtojRe3SZQyMjr3wBw==", "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", @@ -2724,9 +2774,41 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } } } }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, "aggregate-error": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", @@ -2737,9 +2819,9 @@ } }, "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3097,6 +3179,15 @@ "follow-redirects": "1.5.10" } }, + "axios-mock-adapter": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.17.0.tgz", + "integrity": "sha512-q3efmwJUOO4g+wsLNSk9Ps1UlJoF3fQ3FSEe4uEEhkRtu7SoiAVPj8R3Hc/WP55MBTVFzaDP9QkdJhdVhP8A1Q==", + "dev": true, + "requires": { + "deep-equal": "^1.0.1" + } + }, "axobject-query": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", @@ -3475,9 +3566,9 @@ } }, "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -4169,12 +4260,12 @@ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "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==", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" } }, "camelcase": { @@ -4212,9 +4303,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==" + "version": "1.0.30001030", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001030.tgz", + "integrity": "sha512-QGK0W4Ft/Ac+zTjEiRJfwDNATvS3fodDczBXrH42784kcfqcDKpEPfN08N0HQjrAp8He/Jw8QiSS9QRn7XAbUw==" }, "capture-exit": { "version": "2.0.0", @@ -4638,6 +4729,29 @@ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -4691,11 +4805,6 @@ "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", "dev": true }, - "convert-css-length": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/convert-css-length/-/convert-css-length-2.0.1.tgz", - "integrity": "sha512-iGpbcvhLPRKUbBc0Quxx7w/bV14AC3ItuBEGMahA5WTYqB8lq9jH0kTXFheCBASsYnqeMFZhiTruNxr1N59Axg==" - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -5158,9 +5267,9 @@ } }, "date-fns": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.9.0.tgz", - "integrity": "sha512-khbFLu/MlzLjEzy9Gh8oY1hNt/Dvxw3J6Rbc28cVoYWQaC1S3YI4xwkF9ZWcjDLscbZlY9hISMr66RFzZagLsA==" + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.10.0.tgz", + "integrity": "sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA==" }, "debug": { "version": "3.1.0", @@ -5506,6 +5615,15 @@ } } }, + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, "dot-prop": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", @@ -5584,9 +5702,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz", - "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==" + "version": "1.3.360", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.360.tgz", + "integrity": "sha512-RE1pv2sjQiDRRN1nI0fJ0eQHZ9le4oobu16OArnwEUV5ycAU5SNjFyvzjZ1gPUAqBa2Ud1XagtW8j3ZXfHuQHA==" }, "elliptic": { "version": "6.5.2", @@ -5608,9 +5726,9 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { "version": "1.0.2", @@ -5756,6 +5874,21 @@ "es6-symbol": "^3.1.1" } }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -6172,9 +6305,9 @@ } }, "eslint-plugin-jest": { - "version": "23.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.7.0.tgz", - "integrity": "sha512-zkiyGlvJeHNjAEz8FaIxTXNblJJ/zj3waNbYbgflK7K6uy0cpE5zJBt/JpJtOBGM/UGkC6BqsQ4n0y7kQ2HA8w==", + "version": "23.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.0.tgz", + "integrity": "sha512-DKXmLxguZ1Lru4u5YM12ko3WLq6gqo7dhV2b63K731+/PNyZ/Ff6NGONQsGUtPLG9zU3kdz/N+2LTbweNZifeg==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^2.5.0" @@ -6611,6 +6744,29 @@ } } }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -6687,6 +6843,15 @@ "bser": "2.1.1" } }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -6709,12 +6874,12 @@ } }, "file-loader": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-5.0.2.tgz", - "integrity": "sha512-QMiQ+WBkGLejKe81HU8SZ9PovsU/5uaLo0JdTCEXOYv7i7jfAjHZi1tcwp9tSASJPOmmHZtbdCervFmXMH/Dcg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-5.1.0.tgz", + "integrity": "sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==", "dev": true, "requires": { - "loader-utils": "^1.2.3", + "loader-utils": "^1.4.0", "schema-utils": "^2.5.0" } }, @@ -7294,6 +7459,12 @@ "minimatch": "~3.0.2" } }, + "glur": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glur/-/glur-1.1.2.tgz", + "integrity": "sha1-8g6jbbEDv8KSNDkh8fkeg8NGdok=", + "dev": true + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -7578,26 +7749,60 @@ "uglify-js": "3.4.x" }, "dependencies": { + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } } } }, "html-minifier-terser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.3.tgz", - "integrity": "sha512-It4No3H1V3Dhd/O0MePFdo0oX/M6u6YZTMw4My/010mT6vxdbqge7+0RoxGAmeSbKok6gjYZoP0p4rpZ2+J2yw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz", + "integrity": "sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g==", "requires": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^4.0.0", + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", "he": "^1.2.0", - "param-case": "^2.1.1", + "param-case": "^3.0.3", "relateurl": "^0.2.7", - "terser": "^4.3.9" + "terser": "^4.6.3" }, "dependencies": { "commander": { @@ -7628,6 +7833,12 @@ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -7773,6 +7984,16 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -7982,9 +8203,9 @@ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" }, "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "is-absolute-url": { "version": "2.1.0", @@ -9553,9 +9774,9 @@ } }, "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -10299,6 +10520,70 @@ } } }, + "jest-image-snapshot": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/jest-image-snapshot/-/jest-image-snapshot-2.12.0.tgz", + "integrity": "sha512-hRiy+1Ygv1Of0As9R8M2Q8eTawT9wmmezJKAGfeciZrYllQW5bGL0n6Wgk/J2OG70t5zJr3ZXDx2faui1uGw0g==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "get-stdin": "^5.0.1", + "glur": "^1.1.2", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "pixelmatch": "^4.0.2", + "pngjs": "^3.3.3", + "rimraf": "^2.6.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "jest-jasmine2": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", @@ -10670,6 +10955,50 @@ } } }, + "jsdom-screenshot": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsdom-screenshot/-/jsdom-screenshot-3.2.0.tgz", + "integrity": "sha512-kAmHKr9ZrybEAtQYVE4kA2vdaXQ9LQn0Wa1HnEfLyrbe9mXgS4ftzdjJXfTeCoq5BmvmYOy2IFFiaYa/v2YSZg==", + "dev": true, + "requires": { + "connect": "3.7.0", + "eslint-plugin-prettier": "3.1.0", + "finalhandler": "1.1.2", + "lodash.merge": "^4.6.1", + "pretty-format": "24.8.0", + "puppeteer": "^1.12.2", + "serve-static": "1.14.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", + "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "pretty-format": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -10972,12 +11301,12 @@ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "requires": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", + "emojis-list": "^3.0.0", "json5": "^1.0.1" }, "dependencies": { @@ -11031,6 +11360,12 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -11110,9 +11445,12 @@ } }, "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + } }, "lru-cache": { "version": "5.1.1", @@ -11666,9 +12004,9 @@ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "moment-timezone": { - "version": "0.5.27", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", - "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz", + "integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==", "requires": { "moment": ">= 2.9.0" } @@ -11766,11 +12104,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", "requires": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.1", + "tslib": "^1.10.0" } }, "node-forge": { @@ -11917,9 +12256,9 @@ } }, "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", + "version": "1.1.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz", + "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==", "requires": { "semver": "^6.3.0" } @@ -12516,11 +12855,12 @@ } }, "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", "requires": { - "no-case": "^2.2.0" + "dot-case": "^3.0.3", + "tslib": "^1.10.0" } }, "parent-module": { @@ -12576,6 +12916,15 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "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==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -12644,6 +12993,12 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -12680,6 +13035,15 @@ "node-modules-regexp": "^1.0.0" } }, + "pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "dev": true, + "requires": { + "pngjs": "^3.0.0" + } + }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -12701,6 +13065,12 @@ "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "dev": true + }, "pnp-webpack-plugin": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", @@ -13785,14 +14155,20 @@ "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==" }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -13857,6 +14233,48 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "puppeteer": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -14014,6 +14432,11 @@ "which": "^2.0.1" } }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -14028,6 +14451,24 @@ "path-exists": "^4.0.0" } }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -14270,100 +14711,6 @@ "workbox-webpack-plugin": "4.3.1" }, "dependencies": { - "@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", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - } - }, "@svgr/webpack": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", @@ -14417,12 +14764,12 @@ } }, "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.0.tgz", + "integrity": "sha512-PtXtQb7IrD8O+h6Cq1dbpJH5NzD8+9keN1zZ0YlpDzl1PwXEJEBj6u1Xa92t1Hwluoozd9TNKul5Hi2iqpsWwg==", "requires": { "commondir": "^1.0.1", - "make-dir": "^3.0.0", + "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, @@ -14779,12 +15126,6 @@ } } }, - "react-testing-library": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-8.0.1.tgz", - "integrity": "sha512-Gq4JC9r3prA4hYwo7afcbHHMFckO29+5Nrh2KblAEPuK/DWaU0bJE1vtpAgLhzhY9bBirmcgjjIHljHEwGAXKw==", - "dev": true - }, "react-transition-group": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", @@ -15248,6 +15589,29 @@ "source-map": "0.6.1" }, "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, "postcss": { "version": "7.0.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", @@ -16785,9 +17149,9 @@ "integrity": "sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A==" }, "systemjs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.2.3.tgz", - "integrity": "sha512-2ic0xO7gnFJmw/wqXU71oXNxSp9u8bNmDeP61STh987dgROiAn4noESJE9WPNdy5EgS/fGLmHC5OjKOE5be1qg==" + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.2.4.tgz", + "integrity": "sha512-e++CM66/hoVcpWyfj2TVdj4pqMq8PQQLPgQUjb17W0uD7fpRYmO/ahmNfSDwtLoXxF03YUrBcLgg8RahwpZVig==" }, "systemjs-plugin-css": { "version": "0.1.37", @@ -16854,9 +17218,9 @@ } }, "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.4.tgz", + "integrity": "sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -16888,13 +17252,13 @@ }, "dependencies": { "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.0.tgz", + "integrity": "sha512-PtXtQb7IrD8O+h6Cq1dbpJH5NzD8+9keN1zZ0YlpDzl1PwXEJEBj6u1Xa92t1Hwluoozd9TNKul5Hi2iqpsWwg==", "dev": true, "requires": { "commondir": "^1.0.1", - "make-dir": "^3.0.0", + "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, @@ -17188,9 +17552,9 @@ "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==" }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", + "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==" }, "tsutils": { "version": "3.17.1", @@ -17266,9 +17630,9 @@ } }, "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.2.tgz", + "integrity": "sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ==", "dev": true }, "typescript-compare": { @@ -17441,7 +17805,8 @@ "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true }, "uri-js": { "version": "4.2.2", @@ -18386,6 +18751,12 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, "enhanced-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", @@ -18403,6 +18774,26 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -19266,13 +19657,32 @@ } }, "webpack-livereload-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-livereload-plugin/-/webpack-livereload-plugin-2.2.0.tgz", - "integrity": "sha512-sx9xA5mHoNOUgLQI0PmXT3KV9ecsVmUaTgr+fsoL69qAOHw/7VzkL1+ZMDQ8n0dPbWounswK6cBRSgMod7Nhgg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/webpack-livereload-plugin/-/webpack-livereload-plugin-2.3.0.tgz", + "integrity": "sha512-vVBLQLlNpElt2sfsBG+XLDeVbQFS4RrniVU8Hi1/hX5ycSfx6mtW8MEEITr2g0Cvo36kuPWShFFDuy+DS7KFMA==", "dev": true, "requires": { + "anymatch": "^3.1.1", "portfinder": "^1.0.17", "tiny-lr": "^1.1.1" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } } }, "webpack-log": { @@ -19762,6 +20172,15 @@ "decamelize": "^1.2.0" } }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + }, "yup": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/yup/-/yup-0.28.1.tgz", diff --git a/package.json b/package.json index a8c65d60622..aed9af8d173 100644 --- a/package.json +++ b/package.json @@ -24,11 +24,13 @@ "@babel/preset-react": "^7.8.3", "@babel/preset-typescript": "^7.8.3", "@centreon/frontend-core": "centreon/frontend-core", - "@svgr/webpack": "^5.1.0", + "@svgr/webpack": "^5.2.0", "@testing-library/jest-dom": "^5.1.1", - "@testing-library/react": "^9.4.0", + "@testing-library/react": "^9.4.1", + "@testing-library/user-event": "^10.0.0", "@types/react-router": "^5.1.4", "awesome-typescript-loader": "^5.2.1", + "axios-mock-adapter": "^1.17.0", "babel-jest": "^25.1.0", "babel-loader": "^8.0.6", "babel-merge": "^3.0.0", @@ -38,14 +40,16 @@ "eslint-config-prettier": "^6.10.0", "eslint-import-resolver-alias": "1.1.2", "eslint-plugin-babel": "^5.3.0", - "eslint-plugin-jest": "^23.7.0", + "eslint-plugin-jest": "^23.8.0", "eslint-plugin-prefer-arrow-functions": "^3.0.1", "eslint-plugin-prettier": "^3.1.2", - "file-loader": "^5.0.2", + "file-loader": "^5.1.0", "html-webpack-plugin": "^3.2.0", "html-webpack-tags-plugin": "^2.0.17", "jest": "^25.1.0", + "jest-image-snapshot": "^2.12.0", "jest-junit": "^10.0.0", + "jsdom-screenshot": "^3.2.0", "lodash": "^4.17.15", "mini-css-extract-plugin": "^0.9.0", "node-sass": "^4.13.1", @@ -53,30 +57,29 @@ "postcss-safe-parser": "^4.0.2", "prettier": "^1.19.1", "react-mock-router": "^1.0.15", - "react-testing-library": "^8.0.1", "redux-mock-store": "^1.5.4", "resolve-url-loader": "^3.1.1", "sass-loader": "^8.0.2", "terser-webpack-plugin": "^2.3.5", - "typescript": "^3.7.5", + "typescript": "^3.8.2", "url-loader": "^3.0.0", "webpack": "^4.41.6", "webpack-cli": "^3.3.11", - "webpack-livereload-plugin": "^2.2.0", + "webpack-livereload-plugin": "^2.3.0", "webpack-merge": "^4.2.2" }, "dependencies": { "@centreon/ui": "centreon/centreon-ui#adapt-styles-for-unfied-view", - "@material-ui/core": "^4.9.3", + "@material-ui/core": "^4.9.4", "@material-ui/icons": "^4.9.1", "axios": "^0.19.2", "classnames": "^2.2.6", "connected-react-router": "^6.7.0", - "date-fns": "^2.9.0", + "date-fns": "^2.10.0", "dom-serializer": "^0.2.2", "install": "^0.13.0", "loaders.css": "^0.1.2", - "moment-timezone": "^0.5.27", + "moment-timezone": "^0.5.28", "numeral": "^2.0.6", "query-string": "^6.11.0", "react": "^16.12.0", @@ -95,7 +98,7 @@ "redux-saga": "^1.1.3", "redux-thunk": "^2.3.0", "reselect": "^4.0.0", - "systemjs": "^6.2.3", + "systemjs": "^6.2.4", "systemjs-plugin-css": "^0.1.37", "yup": "^0.28.1" }, diff --git a/setupTests.ts b/setupTests.ts new file mode 100644 index 00000000000..c8670866183 --- /dev/null +++ b/setupTests.ts @@ -0,0 +1,8 @@ +import '@testing-library/jest-dom/extend-expect'; + +// eslint-disable-next-line @typescript-eslint/no-namespace +declare namespace jest { + interface Matchers { + toBeInTheDocument(): R; + } +} diff --git a/www/front_src/src/Resources/api/endpoint.ts b/www/front_src/src/Resources/api/endpoint.ts index 9c643631b13..afc09c4da6a 100644 --- a/www/front_src/src/Resources/api/endpoint.ts +++ b/www/front_src/src/Resources/api/endpoint.ts @@ -1,19 +1,27 @@ +import isNull from 'lodash/isNull'; + const resourcesEndpoint = 'monitoring/resources'; -const buildParam = (param): string => { - if (!param) { - return ''; - } - return JSON.stringify(param); +const buildParam = ({ name, value }): string => { + return `${name}=${JSON.stringify(value)}`; }; -const buildResourcesEndpoint = ({ state, sort }): string => { - const stateParam = buildParam([state]); - const sortParam = buildParam(sort); - - return [`${resourcesEndpoint}?state=${stateParam}`, sortParam] - .filter((part) => part !== '') +const buildResourcesEndpoint = ({ state, sort, page, limit }): string => { + console.log(limit); + const params = [ + { + name: 'state', + value: [state], + }, + { name: 'sort_by', value: sort }, + { name: 'page', value: page }, + { name: 'limit', value: limit }, + ] + .filter(({ value }) => value !== undefined) + .map(buildParam) .join('&'); + + return `${resourcesEndpoint}?${params}`; }; export { buildResourcesEndpoint }; diff --git a/www/front_src/src/Resources/columns/index.tsx b/www/front_src/src/Resources/columns/index.tsx index e37247672ae..d1ce1fded63 100644 --- a/www/front_src/src/Resources/columns/index.tsx +++ b/www/front_src/src/Resources/columns/index.tsx @@ -15,26 +15,32 @@ import { } from '../translatedLabels'; import IconDowntime from './icons/Downtime'; +import { Resource } from '../models'; interface ColumnProps { - row; + row: Resource; Cell: ({ children, width }: { children; width? }) => JSX.Element; isRowSelected: boolean; style; onClick; } -const SeverityColumn = ({ Cell }: ColumnProps): JSX.Element => { +const SeverityColumn = ({ Cell, row }: ColumnProps): JSX.Element => { return ( - - + + {row.severity && ( + + )} ); }; const StatusColumn = ({ Cell, row }: ColumnProps): JSX.Element => { return ( - + ); @@ -63,7 +69,7 @@ const ResourcesColumn = ({ Cell, row }: ColumnProps): JSX.Element => { <> - + {row.parent.name} diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index 70ed50addc1..74b688c881c 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -1,5 +1,89 @@ +import React from 'react'; + +import axios from 'axios'; +import { render, wait, within } from '@testing-library/react'; +import UserEvent from '@testing-library/user-event'; + import Resources from '.'; +import { + labelUnhandledProblems, + labelResourceProblems, + labelAll, +} from './translatedLabels'; + +const mockedAxios = axios as jest.Mocked; + +export const selectOption = (element, optionText): void => { + const selectButton = element.parentNode.querySelector('[role=button]'); + + UserEvent.click(selectButton); + + const listbox = document.body.querySelector( + 'ul[role=listbox]', + ) as HTMLElement; + + const listItem = within(listbox).getByText(optionText); + UserEvent.click(listItem); +}; describe(Resources, () => { - it('lists resources', () => {}); + afterEach(() => { + mockedAxios.get.mockReset(); + }); + + beforeEach(() => { + mockedAxios.get.mockResolvedValue({ + data: { + result: [], + meta: { + page: 1, + limit: 10, + search: {}, + sort_by: {}, + total: 0, + }, + }, + }); + }); + + it('lists with unhnandled_problems state by default', async () => { + render(); + + await wait(() => + expect( + mockedAxios.get, + ).toHaveBeenCalledWith( + 'monitoring/resources?state=["unhandled_problems"]', + { cancelToken: {} }, + ), + ); + }); + + it('executes a list request with selected state filter when state filter is changed', async () => { + const { getByText } = render(); + + await wait(() => expect(mockedAxios.get).toHaveBeenCalled()); + + selectOption(getByText(labelUnhandledProblems), labelResourceProblems); + + await wait(() => + expect( + mockedAxios.get, + ).toHaveBeenCalledWith( + 'monitoring/resources?state=["resources_problems"]', + { cancelToken: {} }, + ), + ); + + selectOption(getByText(labelResourceProblems), labelAll); + + await wait(() => + expect(mockedAxios.get).toHaveBeenCalledWith( + 'monitoring/resources?state=["all"]', + { + cancelToken: {}, + }, + ), + ); + }); }); diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index 95ebe99b0c3..d56bdbc682f 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react'; import axios from 'axios'; +import isEmpty from 'lodash/isEmpty'; import { Typography, makeStyles, Paper, Grid } from '@material-ui/core'; @@ -18,9 +19,10 @@ import { unhandledProblemsFilter, resourcesProblemFilter, allFilter, + ResourceListing, } from './models'; import columns from './columns'; -import { labelFilter } from './translatedLabels'; +import { labelFilter, labelStateFilter } from './translatedLabels'; const useStyles = makeStyles((theme) => ({ page: { @@ -44,19 +46,29 @@ const noOp = (): void => undefined; const Resources = (): JSX.Element => { const classes = useStyles(); - const [listing, setListing] = useState | undefined>( - undefined, - ); + const [listing, setListing] = useState(); const [filterId, setFilterId] = useState('unhandled_problems'); - const [sort, setSort] = useState<{ [orderBy: string]: string }>({}); + const [sorto, setSorto] = useState(); + const [sortf, setSortf] = useState(); + const [limit, setLimit] = useState(10); + const [page, setPage] = useState(1); + const [loading, setLoading] = useState(true); + const { showError } = useErrorSnackbar(); const [tokenSource] = useState(axios.CancelToken.source()); const load = (): void => { setLoading(true); - listResources({ state: filterId, sort }, { cancelToken: tokenSource.token }) - .then((retrievedListing) => setListing(retrievedListing)) + const sort = sortf ? { [sortf]: sorto } : undefined; + + listResources( + { state: filterId, sort, limit, page }, + { cancelToken: tokenSource.token }, + ) + .then((retrievedListing) => { + setListing(retrievedListing); + }) .catch((error) => { showError(error.message); }) @@ -71,32 +83,23 @@ const Resources = (): JSX.Element => { useEffect(() => { load(); - }, [filterId]); - - useEffect(() => { - if (!sort) { - return; - } - - load(); - }, [sort]); + }, [filterId, sortf, sorto, page, limit]); const changeFilterId = (event): void => { setFilterId(event.target.value); }; const changeSort = ({ order, orderBy }): void => { - setSort({ [orderBy]: order }); + setSortf(orderBy); + setSorto(order); }; - const getSortf = (): string => { - const [sorto] = Object.keys(sort); - - return sorto; + const changeLimit = ({ target }): void => { + setLimit(Number(target.value)); }; - const getSorto = (): string => { - return sort[getSortf()]; + const changePage = (_, updatedPage): void => { + setPage(updatedPage + 1); }; return ( @@ -117,6 +120,7 @@ const Resources = (): JSX.Element => { ]} selectedOptionId={filterId} onChange={changeFilterId} + ariaLabel={labelStateFilter} /> @@ -133,12 +137,12 @@ const Resources = (): JSX.Element => { onDelete={noOp} onSort={changeSort} onDuplicate={noOp} - onPaginationLimitChanged={noOp} - sortf={getSortf()} - sorto={getSorto()} + onPaginationLimitChanged={changeLimit} + onPaginate={changePage} + sortf={sortf} + sorto={sorto} totalRows={listing?.meta.total} - selectedRows={[]} - checkable + checkable={false} />
diff --git a/www/front_src/src/Resources/models.ts b/www/front_src/src/Resources/models.ts index fb400b4667d..1ff2b162c0f 100644 --- a/www/front_src/src/Resources/models.ts +++ b/www/front_src/src/Resources/models.ts @@ -12,6 +12,7 @@ export interface Icon { export interface Parent { name: string; icon: Icon | null; + status: Status; } export interface Status { @@ -36,6 +37,7 @@ export interface Resource { last_check: string; information: string; severity?: Severity; + short_name: string; } interface ListingMeta { @@ -53,8 +55,10 @@ export interface Listing { export type ResourceListing = Listing; +export type FilterId = 'unhandled_problems' | 'resources_problems' | 'all'; + export interface Filter { - id: 'unhandled_problems' | 'resources_problems' | 'all'; + id: FilterId; name: string; } diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts index 04d04da8194..249dc85b4d1 100644 --- a/www/front_src/src/Resources/translatedLabels.ts +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -12,4 +12,5 @@ export const labelStatus = I18n.t('Status'); export const labelTries = I18n.t('Tries'); export const labelInformation = I18n.t('Information'); export const labelState = I18n.t('State'); +export const labelStateFilter = I18n.t('State filter'); export const labelUnhandledProblems = I18n.t('Unhandled problems'); diff --git a/www/front_src/src/__mocks__/axios.ts b/www/front_src/src/__mocks__/axios.ts new file mode 100644 index 00000000000..ec6f50e4a51 --- /dev/null +++ b/www/front_src/src/__mocks__/axios.ts @@ -0,0 +1,11 @@ +const mockAxios = jest.genMockFromModule('axios'); + +mockAxios.create = jest.fn(() => mockAxios); +mockAxios.CancelToken = { + source: () => ({ + token: {}, + cancel: jest.fn(), + }), +}; + +export default mockAxios; From 6250d432c1e832116bab604f7876aed8d2f8bbd8 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Wed, 26 Feb 2020 11:31:55 +0100 Subject: [PATCH 08/36] Add pagination tests --- www/front_src/src/Resources/api/endpoint.ts | 3 - www/front_src/src/Resources/columns/index.tsx | 6 +- www/front_src/src/Resources/index.test.tsx | 132 ++++++++++++++++-- www/front_src/src/Resources/models.ts | 2 +- 4 files changed, 123 insertions(+), 20 deletions(-) diff --git a/www/front_src/src/Resources/api/endpoint.ts b/www/front_src/src/Resources/api/endpoint.ts index afc09c4da6a..bf971de7e1b 100644 --- a/www/front_src/src/Resources/api/endpoint.ts +++ b/www/front_src/src/Resources/api/endpoint.ts @@ -1,5 +1,3 @@ -import isNull from 'lodash/isNull'; - const resourcesEndpoint = 'monitoring/resources'; const buildParam = ({ name, value }): string => { @@ -7,7 +5,6 @@ const buildParam = ({ name, value }): string => { }; const buildResourcesEndpoint = ({ state, sort, page, limit }): string => { - console.log(limit); const params = [ { name: 'state', diff --git a/www/front_src/src/Resources/columns/index.tsx b/www/front_src/src/Resources/columns/index.tsx index d1ce1fded63..87c544dd94a 100644 --- a/www/front_src/src/Resources/columns/index.tsx +++ b/www/front_src/src/Resources/columns/index.tsx @@ -142,6 +142,7 @@ const columns = [ type: TABLE_COLUMN_TYPES.component, Component: SeverityColumn, clickable: false, + sortable: false, }, { id: 'status', @@ -149,6 +150,7 @@ const columns = [ type: TABLE_COLUMN_TYPES.component, Component: StatusColumn, clickable: false, + sortable: false, }, { id: 'resources', @@ -156,6 +158,7 @@ const columns = [ type: TABLE_COLUMN_TYPES.component, Component: ResourcesColumn, clickable: false, + sortable: false, }, { id: 'duration', @@ -170,7 +173,7 @@ const columns = [ getFormattedString: ({ tries }): string => tries, }, { - id: 'lastCheck', + id: 'last_check', label: 'Last check', type: TABLE_COLUMN_TYPES.string, getFormattedString: ({ last_check }): string => last_check, @@ -187,6 +190,7 @@ const columns = [ type: TABLE_COLUMN_TYPES.component, Component: StateColumn, clickable: false, + sortable: false, }, ]; diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index 74b688c881c..d6da77f1567 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import axios from 'axios'; -import { render, wait, within } from '@testing-library/react'; +import { render, wait, within, fireEvent } from '@testing-library/react'; import UserEvent from '@testing-library/user-event'; import Resources from '.'; @@ -10,9 +10,35 @@ import { labelResourceProblems, labelAll, } from './translatedLabels'; +import columns from './columns'; +import { Resource } from './models'; const mockedAxios = axios as jest.Mocked; +const baseEndpoint = 'monitoring/resources'; +const defaultPageAndLimitParams = 'page=1&limit=10'; +const defaultListingEndpoint = `${baseEndpoint}?state=["unhandled_problems]&${defaultPageAndLimitParams}`; + +const getEndpoint = ({ + state = 'unhandled_problems', + sortBy = undefined, + sortOrder = undefined, + page = 1, + limit = 10, +}: { + state?: string; + sortBy?: string; + sortOrder?: string; + page?: number; + limit?: number; +}): string => { + const sortParam = sortBy ? `&sort_by={"${sortBy}":"${sortOrder}"}` : ''; + + return `${baseEndpoint}?state=["${state}"]${sortParam}&page=${page}&limit=${limit}`; +}; + +const cancelTokenRequestParam = { cancelToken: {} }; + export const selectOption = (element, optionText): void => { const selectButton = element.parentNode.querySelector('[role=button]'); @@ -26,21 +52,41 @@ export const selectOption = (element, optionText): void => { UserEvent.click(listItem); }; +const fillEntities = (): Array => { + const entityCount = 31; + return new Array(entityCount).fill(0).map((_, index) => ({ + id: `${index}`, + name: `E${index}`, + status: { + code: 0, + name: 'OK', + }, + acknowledged: false, + in_downtime: false, + duration: '1m', + last_check: '1m', + tries: '1', + short_name: 's', + information: `Entity ${index}`, + })); +}; + describe(Resources, () => { afterEach(() => { mockedAxios.get.mockReset(); }); beforeEach(() => { + const entities = fillEntities(); mockedAxios.get.mockResolvedValue({ data: { - result: [], + result: entities, meta: { page: 1, limit: 10, search: {}, sort_by: {}, - total: 0, + total: entities.length, }, }, }); @@ -50,11 +96,9 @@ describe(Resources, () => { render(); await wait(() => - expect( - mockedAxios.get, - ).toHaveBeenCalledWith( - 'monitoring/resources?state=["unhandled_problems"]', - { cancelToken: {} }, + expect(mockedAxios.get).toHaveBeenCalledWith( + defaultListingEndpoint, + cancelTokenRequestParam, ), ); }); @@ -67,11 +111,9 @@ describe(Resources, () => { selectOption(getByText(labelUnhandledProblems), labelResourceProblems); await wait(() => - expect( - mockedAxios.get, - ).toHaveBeenCalledWith( + expect(mockedAxios.get).toHaveBeenCalledWith( 'monitoring/resources?state=["resources_problems"]', - { cancelToken: {} }, + cancelTokenRequestParam, ), ); @@ -80,10 +122,70 @@ describe(Resources, () => { await wait(() => expect(mockedAxios.get).toHaveBeenCalledWith( 'monitoring/resources?state=["all"]', - { - cancelToken: {}, - }, + cancelTokenRequestParam, ), ); }); + + it('sends a listing request with sort_by param when a sortable column is clicked', async () => { + const { getByText } = render(); + + await wait(() => { + expect(mockedAxios.get).toHaveBeenCalled(); + }); + + columns + .filter(({ sortable }) => sortable !== false) + .forEach(({ id, label }) => { + fireEvent.click(getByText(label)); + + expect(mockedAxios.get).toHaveBeenCalledWith( + getEndpoint({ sortBy: id, sortOrder: 'desc' }), + cancelTokenRequestParam, + ); + + fireEvent.click(getByText(label)); + + expect(mockedAxios.get).toHaveBeenCalledWith( + getEndpoint({ sortBy: id, sortOrder: 'asc' }), + cancelTokenRequestParam, + ); + }); + }); + + it('sends a listing request with an updated page param when a change page action is clicked', async () => { + const { getByLabelText } = render(); + + await wait(() => { + expect(mockedAxios.get).toHaveBeenCalled(); + }); + + fireEvent.click(getByLabelText('Next Page')); + + expect(mockedAxios.get).toHaveBeenLastCalledWith( + getEndpoint({ page: 2 }), + cancelTokenRequestParam, + ); + + fireEvent.click(getByLabelText('Previous Page')); + + expect(mockedAxios.get).toHaveBeenLastCalledWith( + getEndpoint({ page: 1 }), + cancelTokenRequestParam, + ); + + fireEvent.click(getByLabelText('Last Page')); + + expect(mockedAxios.get).toHaveBeenLastCalledWith( + getEndpoint({ page: 4 }), + cancelTokenRequestParam, + ); + + fireEvent.click(getByLabelText('First Page')); + + expect(mockedAxios.get).toHaveBeenLastCalledWith( + getEndpoint({ page: 1 }), + cancelTokenRequestParam, + ); + }); }); diff --git a/www/front_src/src/Resources/models.ts b/www/front_src/src/Resources/models.ts index 1ff2b162c0f..32d9a06e629 100644 --- a/www/front_src/src/Resources/models.ts +++ b/www/front_src/src/Resources/models.ts @@ -28,7 +28,7 @@ export interface Resource { id: string; name: string; icon?: Icon; - parent: Parent; + parent?: Parent; status: Status; acknowledged: boolean; in_downtime: boolean; From 816f19eff6b39330f34c3635419603d916961804 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Wed, 26 Feb 2020 16:07:13 +0100 Subject: [PATCH 09/36] Finish up listing tests --- www/front_src/src/Resources/index.test.tsx | 80 ++++++++++++++++------ www/front_src/src/Resources/index.tsx | 2 +- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index d6da77f1567..7a9970480d7 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -15,10 +15,6 @@ import { Resource } from './models'; const mockedAxios = axios as jest.Mocked; -const baseEndpoint = 'monitoring/resources'; -const defaultPageAndLimitParams = 'page=1&limit=10'; -const defaultListingEndpoint = `${baseEndpoint}?state=["unhandled_problems]&${defaultPageAndLimitParams}`; - const getEndpoint = ({ state = 'unhandled_problems', sortBy = undefined, @@ -32,6 +28,7 @@ const getEndpoint = ({ page?: number; limit?: number; }): string => { + const baseEndpoint = 'monitoring/resources'; const sortParam = sortBy ? `&sort_by={"${sortBy}":"${sortOrder}"}` : ''; return `${baseEndpoint}?state=["${state}"]${sortParam}&page=${page}&limit=${limit}`; @@ -71,25 +68,25 @@ const fillEntities = (): Array => { })); }; +const entities = fillEntities(); +const retrievedListing = { + result: entities, + meta: { + page: 1, + limit: 10, + search: {}, + sort_by: {}, + total: entities.length, + }, +}; + describe(Resources, () => { afterEach(() => { mockedAxios.get.mockReset(); }); beforeEach(() => { - const entities = fillEntities(); - mockedAxios.get.mockResolvedValue({ - data: { - result: entities, - meta: { - page: 1, - limit: 10, - search: {}, - sort_by: {}, - total: entities.length, - }, - }, - }); + mockedAxios.get.mockResolvedValue({ data: retrievedListing }); }); it('lists with unhnandled_problems state by default', async () => { @@ -97,7 +94,7 @@ describe(Resources, () => { await wait(() => expect(mockedAxios.get).toHaveBeenCalledWith( - defaultListingEndpoint, + getEndpoint({}), cancelTokenRequestParam, ), ); @@ -112,7 +109,7 @@ describe(Resources, () => { await wait(() => expect(mockedAxios.get).toHaveBeenCalledWith( - 'monitoring/resources?state=["resources_problems"]', + getEndpoint({ state: 'resources_problems' }), cancelTokenRequestParam, ), ); @@ -121,7 +118,7 @@ describe(Resources, () => { await wait(() => expect(mockedAxios.get).toHaveBeenCalledWith( - 'monitoring/resources?state=["all"]', + getEndpoint({ state: 'all' }), cancelTokenRequestParam, ), ); @@ -160,6 +157,15 @@ describe(Resources, () => { expect(mockedAxios.get).toHaveBeenCalled(); }); + mockedAxios.get.mockReset(); + + mockedAxios.get.mockResolvedValueOnce({ + data: { + ...retrievedListing, + meta: { ...retrievedListing.meta, page: 2 }, + }, + }); + fireEvent.click(getByLabelText('Next Page')); expect(mockedAxios.get).toHaveBeenLastCalledWith( @@ -167,6 +173,13 @@ describe(Resources, () => { cancelTokenRequestParam, ); + mockedAxios.get.mockResolvedValueOnce({ + data: { + ...retrievedListing, + meta: { ...retrievedListing.meta, page: 1 }, + }, + }); + fireEvent.click(getByLabelText('Previous Page')); expect(mockedAxios.get).toHaveBeenLastCalledWith( @@ -174,6 +187,13 @@ describe(Resources, () => { cancelTokenRequestParam, ); + mockedAxios.get.mockResolvedValueOnce({ + data: { + ...retrievedListing, + meta: { ...retrievedListing.meta, page: 4 }, + }, + }); + fireEvent.click(getByLabelText('Last Page')); expect(mockedAxios.get).toHaveBeenLastCalledWith( @@ -181,6 +201,13 @@ describe(Resources, () => { cancelTokenRequestParam, ); + mockedAxios.get.mockResolvedValueOnce({ + data: { + ...retrievedListing, + meta: { ...retrievedListing.meta, page: 4 }, + }, + }); + fireEvent.click(getByLabelText('First Page')); expect(mockedAxios.get).toHaveBeenLastCalledWith( @@ -188,4 +215,17 @@ describe(Resources, () => { cancelTokenRequestParam, ); }); + + it('executes a limit request when the rows per page value is changed', () => { + const { getByDisplayValue } = render(); + + fireEvent.change(getByDisplayValue('10'), { + target: { value: '20' }, + }); + + expect(mockedAxios.get).toHaveBeenCalledWith( + getEndpoint({ limit: 20 }), + cancelTokenRequestParam, + ); + }); }); diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index d56bdbc682f..143b23066cd 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -132,7 +132,7 @@ const Resources = (): JSX.Element => { loading={loading} columnConfiguration={columns} tableData={listing?.result} - currentPage={listing ? listing.meta.page - 1 : 0} + currentPage={page - 1} limit={listing?.meta.limit} onDelete={noOp} onSort={changeSort} From b1c77acdb0cdcc2bf4e1d053b3fb80b2b63482bf Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Wed, 26 Feb 2020 16:41:20 +0100 Subject: [PATCH 10/36] Fix TypeScript errors --- package-lock.json | 358 ++---------------- package.json | 3 - tsconfig.json | 10 +- types/custom.d.ts | 4 - .../src/Resources/columns/icons/Downtime.tsx | 4 +- www/front_src/src/Resources/index.tsx | 3 - www/front_src/src/declaration.d.ts | 6 + 7 files changed, 46 insertions(+), 342 deletions(-) delete mode 100644 types/custom.d.ts diff --git a/package-lock.json b/package-lock.json index 0aa646650b1..fdbbcbd3d52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1949,9 +1949,9 @@ } }, "@types/yargs": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz", - "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -2081,9 +2081,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.5.tgz", - "integrity": "sha512-+ckxwNj892FWgvwrUWLOghQ2JDgOgeqTPwrcl+0t1pG59CP8qMJ6S/efmEd999vCFSJKOpyMakvU+w380rduUQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", + "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -2194,9 +2194,9 @@ } }, "@types/yargs": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz", - "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -2301,9 +2301,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.7.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.4.tgz", - "integrity": "sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==" + "version": "13.7.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.6.tgz", + "integrity": "sha512-eyK7MWD0R1HqVTp+PtwRgFeIsemzuj4gBFSQxfPHY5iMjS7474e5wq+VFgTcdpyHeNxyKSaetYAjdMLJlKoWqA==" }, "@types/parse-json": { "version": "4.0.0", @@ -2321,9 +2321,9 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, "@types/react": { - "version": "16.9.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.22.tgz", - "integrity": "sha512-7OSt4EGiLvy0h5R7X+r0c7S739TCU/LvWbkNOrm10lUwNHe7XPz5OLhLOSZeCkqO9JSCly1NkYJ7ODTUqVnHJQ==", + "version": "16.9.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.23.tgz", + "integrity": "sha512-SsGVT4E7L2wLN3tPYLiF20hmZTPGuzaayVunfgXzUn1x4uHVsKH6QDJQ/TdpHqwsTLd4CwrmQ2vOgxN7gE24gw==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" @@ -2744,9 +2744,9 @@ } }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" }, "acorn-walk": { "version": "6.2.0", @@ -2800,15 +2800,6 @@ } } }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, "aggregate-error": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", @@ -3318,9 +3309,9 @@ } }, "@types/yargs": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz", - "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -4729,29 +4720,6 @@ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -5266,11 +5234,6 @@ } } }, - "date-fns": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.10.0.tgz", - "integrity": "sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA==" - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -5702,9 +5665,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.360", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.360.tgz", - "integrity": "sha512-RE1pv2sjQiDRRN1nI0fJ0eQHZ9le4oobu16OArnwEUV5ycAU5SNjFyvzjZ1gPUAqBa2Ud1XagtW8j3ZXfHuQHA==" + "version": "1.3.361", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.361.tgz", + "integrity": "sha512-OzSVjWpsRhJyr9PSAXkeloSe6e9viU2ToGt1wXlXFsGcxuI9vlsnalL+V/AM59Z2pEo3wRxIddtOGsT7Y6x/sQ==" }, "elliptic": { "version": "6.5.2", @@ -5874,21 +5837,6 @@ "es6-symbol": "^3.1.1" } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -6744,29 +6692,6 @@ } } }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -6843,15 +6768,6 @@ "bser": "2.1.1" } }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -7459,12 +7375,6 @@ "minimatch": "~3.0.2" } }, - "glur": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glur/-/glur-1.1.2.tgz", - "integrity": "sha1-8g6jbbEDv8KSNDkh8fkeg8NGdok=", - "dev": true - }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -7657,9 +7567,9 @@ } }, "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.6.tgz", + "integrity": "sha512-Kp6rShEsCHhF5dD3EWKdkgVA8ix90oSUJ0VY4g9goxxa0+f4lx63muTftn0mlJ/+8IESGWyKnP//V2D7S4ZbIQ==" }, "hpack.js": { "version": "2.1.6", @@ -7984,16 +7894,6 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -8759,9 +8659,9 @@ } }, "@types/yargs": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz", - "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -10520,70 +10420,6 @@ } } }, - "jest-image-snapshot": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/jest-image-snapshot/-/jest-image-snapshot-2.12.0.tgz", - "integrity": "sha512-hRiy+1Ygv1Of0As9R8M2Q8eTawT9wmmezJKAGfeciZrYllQW5bGL0n6Wgk/J2OG70t5zJr3ZXDx2faui1uGw0g==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "get-stdin": "^5.0.1", - "glur": "^1.1.2", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "pixelmatch": "^4.0.2", - "pngjs": "^3.3.3", - "rimraf": "^2.6.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "jest-jasmine2": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", @@ -10955,50 +10791,6 @@ } } }, - "jsdom-screenshot": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsdom-screenshot/-/jsdom-screenshot-3.2.0.tgz", - "integrity": "sha512-kAmHKr9ZrybEAtQYVE4kA2vdaXQ9LQn0Wa1HnEfLyrbe9mXgS4ftzdjJXfTeCoq5BmvmYOy2IFFiaYa/v2YSZg==", - "dev": true, - "requires": { - "connect": "3.7.0", - "eslint-plugin-prettier": "3.1.0", - "finalhandler": "1.1.2", - "lodash.merge": "^4.6.1", - "pretty-format": "24.8.0", - "puppeteer": "^1.12.2", - "serve-static": "1.14.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "eslint-plugin-prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", - "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", - "dev": true, - "requires": { - "@jest/types": "^24.8.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - } - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -11360,12 +11152,6 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -12993,12 +12779,6 @@ "sha.js": "^2.4.8" } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -13035,15 +12815,6 @@ "node-modules-regexp": "^1.0.0" } }, - "pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", - "dev": true, - "requires": { - "pngjs": "^3.0.0" - } - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -13065,12 +12836,6 @@ "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true - }, "pnp-webpack-plugin": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", @@ -14163,12 +13928,6 @@ "ipaddr.js": "1.9.1" } }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", - "dev": true - }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -14233,48 +13992,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "puppeteer": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", - "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^2.2.1", - "mime": "^2.0.3", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -15710,9 +15427,9 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "requires": { "is-promise": "^2.1.0" } @@ -20172,15 +19889,6 @@ "decamelize": "^1.2.0" } }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - }, "yup": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/yup/-/yup-0.28.1.tgz", diff --git a/package.json b/package.json index aed9af8d173..072ba8ad75a 100644 --- a/package.json +++ b/package.json @@ -47,9 +47,7 @@ "html-webpack-plugin": "^3.2.0", "html-webpack-tags-plugin": "^2.0.17", "jest": "^25.1.0", - "jest-image-snapshot": "^2.12.0", "jest-junit": "^10.0.0", - "jsdom-screenshot": "^3.2.0", "lodash": "^4.17.15", "mini-css-extract-plugin": "^0.9.0", "node-sass": "^4.13.1", @@ -75,7 +73,6 @@ "axios": "^0.19.2", "classnames": "^2.2.6", "connected-react-router": "^6.7.0", - "date-fns": "^2.10.0", "dom-serializer": "^0.2.2", "install": "^0.13.0", "loaders.css": "^0.1.2", diff --git a/tsconfig.json b/tsconfig.json index 8829f46bf0f..76e1f8193c2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,4 +1,3 @@ - { "compilerOptions": { "target": "es5", @@ -8,13 +7,16 @@ "noImplicitAny": false, "skipLibCheck": true, "baseUrl": "./", - "typeRoots": ["./types", "./node_modules/@types"], - "esModuleInterop": true, + "typeRoots": [ + "./types", + "./node_modules/@types" + ], + "esModuleInterop": true }, "include": [ "./www/front_src/src" ], "exclude": [ "node_modules" - ] + ], } \ No newline at end of file diff --git a/types/custom.d.ts b/types/custom.d.ts deleted file mode 100644 index 006534e2350..00000000000 --- a/types/custom.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.svg' { - const content: React.FunctionComponent>; - export default content; -} diff --git a/www/front_src/src/Resources/columns/icons/Downtime.tsx b/www/front_src/src/Resources/columns/icons/Downtime.tsx index 75e6b73401e..0c355f0bc00 100644 --- a/www/front_src/src/Resources/columns/icons/Downtime.tsx +++ b/www/front_src/src/Resources/columns/icons/Downtime.tsx @@ -4,8 +4,6 @@ import { SvgIcon } from '@material-ui/core'; import { ReactComponent as IconDowntime } from './downtime.icon.svg'; -const Downtime = (): JSX.Element => ( - -); +const Downtime = (): JSX.Element => ; export default Downtime; diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index 143b23066cd..b3cdf910b47 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react'; import axios from 'axios'; -import isEmpty from 'lodash/isEmpty'; import { Typography, makeStyles, Paper, Grid } from '@material-ui/core'; @@ -14,8 +13,6 @@ import { import { listResources } from './api'; import { - Listing as ListingEntity, - Resource, unhandledProblemsFilter, resourcesProblemFilter, allFilter, diff --git a/www/front_src/src/declaration.d.ts b/www/front_src/src/declaration.d.ts index ab04648bbd2..92a50aa9c5e 100644 --- a/www/front_src/src/declaration.d.ts +++ b/www/front_src/src/declaration.d.ts @@ -7,3 +7,9 @@ declare module '*.scss' { const content: Content; export default content; } + +declare module '*.svg' { + const content; + export const ReactComponent; + export default content; +} From 826b56d5e945aec9b017d3ea673878811358feb9 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Wed, 26 Feb 2020 17:21:21 +0100 Subject: [PATCH 11/36] Remove mock endpoint --- www/front_src/src/Resources/api/index.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts index c3a38979b87..12968115383 100644 --- a/www/front_src/src/Resources/api/index.ts +++ b/www/front_src/src/Resources/api/index.ts @@ -3,11 +3,8 @@ import axios, { AxiosRequestConfig } from 'axios'; import { buildResourcesEndpoint } from './endpoint'; import { ResourceListing } from '../models'; -const mockEndpoint = 'http://localhost:5000/centreon/api/v2/'; - const api = axios.create({ - // baseURL: './api/v2/', - baseURL: mockEndpoint, + baseURL: './api/v2/', }); const getData = ({ endpoint, requestParams }): Promise => From e28e836c170b3b2d392dc3ac6fba7bf7ba7b016d Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Wed, 26 Feb 2020 17:36:35 +0100 Subject: [PATCH 12/36] Update packages --- package-lock.json | 4 ++-- package.json | 2 +- www/front_src/src/__mocks__/axios.ts | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index fdbbcbd3d52..68528247d6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1083,8 +1083,8 @@ "dev": true }, "@centreon/ui": { - "version": "github:centreon/centreon-ui#841691ff4317bddae6d83ea3528ef7216baed556", - "from": "github:centreon/centreon-ui#adapt-styles-for-unfied-view", + "version": "github:centreon/centreon-ui#12ef887220f649c1bd0ff83440ba501fa5de6e2d", + "from": "github:centreon/centreon-ui", "requires": { "@material-ui/core": "^4.9.3", "@material-ui/icons": "4.9.1", diff --git a/package.json b/package.json index 072ba8ad75a..31b0c38b5b9 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "webpack-merge": "^4.2.2" }, "dependencies": { - "@centreon/ui": "centreon/centreon-ui#adapt-styles-for-unfied-view", + "@centreon/ui": "centreon/centreon-ui", "@material-ui/core": "^4.9.4", "@material-ui/icons": "^4.9.1", "axios": "^0.19.2", diff --git a/www/front_src/src/__mocks__/axios.ts b/www/front_src/src/__mocks__/axios.ts index ec6f50e4a51..6ead95b40d0 100644 --- a/www/front_src/src/__mocks__/axios.ts +++ b/www/front_src/src/__mocks__/axios.ts @@ -1,6 +1,11 @@ +/* eslint-disable @typescript-eslint/ban-ts-ignore */ + const mockAxios = jest.genMockFromModule('axios'); +// @ts-ignore mockAxios.create = jest.fn(() => mockAxios); + +// @ts-ignore mockAxios.CancelToken = { source: () => ({ token: {}, From 9cf4b4e37ea206bc7f0562d058c76f75f312ec9b Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Thu, 27 Feb 2020 18:19:52 +0100 Subject: [PATCH 13/36] Add SearchField in Resource page --- tsconfig.json | 1 + .../src/Resources/api/searchObjects.ts | 50 +++++++++++++++++++ www/front_src/src/Resources/index.tsx | 35 ++++++++++--- 3 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 www/front_src/src/Resources/api/searchObjects.ts diff --git a/tsconfig.json b/tsconfig.json index 76e1f8193c2..b1675bc5668 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "target": "es5", + "downlevelIteration": true, "module": "commonjs", "jsx": "react", "strict": true, diff --git a/www/front_src/src/Resources/api/searchObjects.ts b/www/front_src/src/Resources/api/searchObjects.ts new file mode 100644 index 00000000000..5accb2f4f2e --- /dev/null +++ b/www/front_src/src/Resources/api/searchObjects.ts @@ -0,0 +1,50 @@ +type SearchableField = + | 'host.name' + | 'host.alias' + | 'host.address' + | 'service.description'; + +const searchOptions: Array = [ + 'host.name', + 'host.alias', + 'host.address', + 'service.description', +]; + +interface SearchObject { + field: SearchableField; + value: string; +} + +const getFoundSearchObjects = (searchValue: string): Array => { + const searchOptionMatches = searchOptions.map((searchOption) => { + const pattern = searchOption.replace('.', '\\.'); + + const [searchOptionMatch] = searchValue.match(pattern); + + return { field: searchOption, value: searchOptionMatch }; + }); + + return searchOptionMatches.filter(({ value }) => value); +}; + +const getDefaultSearchObjects = (value): Array => { + return searchOptions.map((searchOption) => ({ field: searchOption, value })); +}; + +const getSearchParam = (searchValue: string) => { + const foundSearchObjects = getFoundSearchObjects(searchValue); + + const searchObjectsToSend = + foundSearchObjects.length > 0 + ? foundSearchObjects + : getDefaultSearchObjects(searchValue); + + return { + $or: searchObjectsToSend.map(({ field, value }) => ({ + [field]: { $lk: `${value}` }, + })), + }; +}; + +export { getSearchParam }; diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index b3cdf910b47..db6d1052050 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -2,13 +2,15 @@ import React, { useEffect, useState } from 'react'; import axios from 'axios'; -import { Typography, makeStyles, Paper, Grid } from '@material-ui/core'; +import { Typography, makeStyles, Paper, Grid, Button } from '@material-ui/core'; +import { HelpOutline as IconHelp } from '@material-ui/icons'; import { Listing, SelectField, withErrorSnackbar, useErrorSnackbar, + SearchField, } from '@centreon/ui'; import { listResources } from './api'; @@ -19,7 +21,7 @@ import { ResourceListing, } from './models'; import columns from './columns'; -import { labelFilter, labelStateFilter } from './translatedLabels'; +import { labelFilter, labelStateFilter, labelSearch } from './translatedLabels'; const useStyles = makeStyles((theme) => ({ page: { @@ -49,6 +51,7 @@ const Resources = (): JSX.Element => { const [sortf, setSortf] = useState(); const [limit, setLimit] = useState(10); const [page, setPage] = useState(1); + const [search, setSearch] = useState(); const [loading, setLoading] = useState(true); @@ -60,7 +63,7 @@ const Resources = (): JSX.Element => { const sort = sortf ? { [sortf]: sorto } : undefined; listResources( - { state: filterId, sort, limit, page }, + { state: filterId, sort, limit, page, search }, { cancelToken: tokenSource.token }, ) .then((retrievedListing) => { @@ -80,7 +83,7 @@ const Resources = (): JSX.Element => { useEffect(() => { load(); - }, [filterId, sortf, sorto, page, limit]); + }, [filterId, sortf, sorto, page, limit, search]); const changeFilterId = (event): void => { setFilterId(event.target.value); @@ -91,23 +94,27 @@ const Resources = (): JSX.Element => { setSorto(order); }; - const changeLimit = ({ target }): void => { - setLimit(Number(target.value)); + const changeLimit = (event): void => { + setLimit(Number(event.target.value)); }; const changePage = (_, updatedPage): void => { setPage(updatedPage + 1); }; + const changeSearch = (event): void => { + setSearch(event.target.value); + }; + return (
- + {labelFilter} - + { ariaLabel={labelStateFilter} /> + + } + value={search} + onChange={changeSearch} + /> + + + + From 8f704c3964e7128b05c776659f6b3be801d62772 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 09:53:46 +0100 Subject: [PATCH 14/36] Change api to beta --- www/front_src/src/Resources/api/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts index 12968115383..e2faf94ad08 100644 --- a/www/front_src/src/Resources/api/index.ts +++ b/www/front_src/src/Resources/api/index.ts @@ -4,7 +4,7 @@ import { buildResourcesEndpoint } from './endpoint'; import { ResourceListing } from '../models'; const api = axios.create({ - baseURL: './api/v2/', + baseURL: './api/beta/', }); const getData = ({ endpoint, requestParams }): Promise => From 63932fdbb35a8151b7a651f53d442f0f123b8615 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 09:54:16 +0100 Subject: [PATCH 15/36] change API to beta --- www/front_src/src/Resources/api/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts index 12968115383..e2faf94ad08 100644 --- a/www/front_src/src/Resources/api/index.ts +++ b/www/front_src/src/Resources/api/index.ts @@ -4,7 +4,7 @@ import { buildResourcesEndpoint } from './endpoint'; import { ResourceListing } from '../models'; const api = axios.create({ - baseURL: './api/v2/', + baseURL: './api/beta/', }); const getData = ({ endpoint, requestParams }): Promise => From 2eb9e74d222c4cfb3fbee62f070bfdcbcc2f5bfa Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 09:59:05 +0100 Subject: [PATCH 16/36] param made single element instead of array --- www/front_src/src/Resources/api/endpoint.ts | 2 +- www/front_src/src/Resources/columns/index.tsx | 3 ++- www/front_src/src/Resources/index.test.tsx | 2 +- www/front_src/src/Resources/translatedLabels.ts | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/www/front_src/src/Resources/api/endpoint.ts b/www/front_src/src/Resources/api/endpoint.ts index bf971de7e1b..cdaf0960bca 100644 --- a/www/front_src/src/Resources/api/endpoint.ts +++ b/www/front_src/src/Resources/api/endpoint.ts @@ -8,7 +8,7 @@ const buildResourcesEndpoint = ({ state, sort, page, limit }): string => { const params = [ { name: 'state', - value: [state], + value: state, }, { name: 'sort_by', value: sort }, { name: 'page', value: page }, diff --git a/www/front_src/src/Resources/columns/index.tsx b/www/front_src/src/Resources/columns/index.tsx index 87c544dd94a..6e23fa1333a 100644 --- a/www/front_src/src/Resources/columns/index.tsx +++ b/www/front_src/src/Resources/columns/index.tsx @@ -12,6 +12,7 @@ import { labelTries, labelInformation, labelState, + labelLastCheck, } from '../translatedLabels'; import IconDowntime from './icons/Downtime'; @@ -174,7 +175,7 @@ const columns = [ }, { id: 'last_check', - label: 'Last check', + label: labelLastCheck, type: TABLE_COLUMN_TYPES.string, getFormattedString: ({ last_check }): string => last_check, }, diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index 7a9970480d7..4d063c9649f 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -31,7 +31,7 @@ const getEndpoint = ({ const baseEndpoint = 'monitoring/resources'; const sortParam = sortBy ? `&sort_by={"${sortBy}":"${sortOrder}"}` : ''; - return `${baseEndpoint}?state=["${state}"]${sortParam}&page=${page}&limit=${limit}`; + return `${baseEndpoint}?state="${state}"${sortParam}&page=${page}&limit=${limit}`; }; const cancelTokenRequestParam = { cancelToken: {} }; diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts index 249dc85b4d1..8b756c41e75 100644 --- a/www/front_src/src/Resources/translatedLabels.ts +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -3,6 +3,7 @@ import { I18n } from 'react-redux-i18n'; export const labelAll = I18n.t('All'); export const labelDuration = I18n.t('Duration'); export const labelFilter = I18n.t('Filter'); +export const labelLastCheck = I18n.t('Last check'); export const labelResourceName = I18n.t('Resource name'); export const labelResourceProblems = I18n.t('Resource problems'); export const labelResources = I18n.t('Resources'); From 5ac983b5c0e8e576a596ddb0e89422a9de8f2bce Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 10:00:00 +0100 Subject: [PATCH 17/36] Re-order imports --- www/front_src/src/App.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/www/front_src/src/App.tsx b/www/front_src/src/App.tsx index 91f79b47761..172d894678a 100755 --- a/www/front_src/src/App.tsx +++ b/www/front_src/src/App.tsx @@ -12,9 +12,10 @@ import { connect } from 'react-redux'; import { ConnectedRouter } from 'connected-react-router'; import Fullscreen from 'react-fullscreen-crossbrowser'; import queryString from 'query-string'; + import { ThemeProvider } from '@centreon/ui'; -import Header from './components/header'; +import Header from './components/header'; import { history } from './store'; import NavigationComponent from './components/navigation'; import Tooltip from './components/tooltip'; From a1b12aeaa5853e165001c76c26e396b9aa677089 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 10:16:58 +0100 Subject: [PATCH 18/36] Remove jest config --- jest.config.js | 1 - setupTests.ts | 8 -------- 2 files changed, 9 deletions(-) delete mode 100644 setupTests.ts diff --git a/jest.config.js b/jest.config.js index d6c9fb3a6ce..b4b88d210cb 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,5 +2,4 @@ const merge = require('lodash/merge'); module.exports = merge(require('@centreon/frontend-core/jest'), { roots: ['/www/front_src/src/'], - setupFilesAfterEnv: ['/setupTests.ts'], }); diff --git a/setupTests.ts b/setupTests.ts deleted file mode 100644 index c8670866183..00000000000 --- a/setupTests.ts +++ /dev/null @@ -1,8 +0,0 @@ -import '@testing-library/jest-dom/extend-expect'; - -// eslint-disable-next-line @typescript-eslint/no-namespace -declare namespace jest { - interface Matchers { - toBeInTheDocument(): R; - } -} From 92f813c01b479fac778d09c0a82672de4e0b439f Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 11:36:07 +0100 Subject: [PATCH 19/36] Implement search --- www/front_src/src/Resources/api/endpoint.ts | 11 +++++++++- www/front_src/src/Resources/api/index.ts | 2 +- .../src/Resources/api/searchObjects.ts | 13 +++++++++--- www/front_src/src/Resources/index.tsx | 21 ++++++++++++++----- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/www/front_src/src/Resources/api/endpoint.ts b/www/front_src/src/Resources/api/endpoint.ts index cdaf0960bca..ad4af7c13bb 100644 --- a/www/front_src/src/Resources/api/endpoint.ts +++ b/www/front_src/src/Resources/api/endpoint.ts @@ -1,10 +1,18 @@ +import { getSearchParam } from './searchObjects'; + const resourcesEndpoint = 'monitoring/resources'; const buildParam = ({ name, value }): string => { return `${name}=${JSON.stringify(value)}`; }; -const buildResourcesEndpoint = ({ state, sort, page, limit }): string => { +const buildResourcesEndpoint = ({ + state, + sort, + page, + limit, + search, +}): string => { const params = [ { name: 'state', @@ -13,6 +21,7 @@ const buildResourcesEndpoint = ({ state, sort, page, limit }): string => { { name: 'sort_by', value: sort }, { name: 'page', value: page }, { name: 'limit', value: limit }, + { name: 'search', value: getSearchParam(search) }, ] .filter(({ value }) => value !== undefined) .map(buildParam) diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts index e2faf94ad08..8b4c9f330bd 100644 --- a/www/front_src/src/Resources/api/index.ts +++ b/www/front_src/src/Resources/api/index.ts @@ -4,7 +4,7 @@ import { buildResourcesEndpoint } from './endpoint'; import { ResourceListing } from '../models'; const api = axios.create({ - baseURL: './api/beta/', + baseURL: 'http://localhost:5000/centreon/api/v2', }); const getData = ({ endpoint, requestParams }): Promise => diff --git a/www/front_src/src/Resources/api/searchObjects.ts b/www/front_src/src/Resources/api/searchObjects.ts index 5accb2f4f2e..7f4aa54e1ed 100644 --- a/www/front_src/src/Resources/api/searchObjects.ts +++ b/www/front_src/src/Resources/api/searchObjects.ts @@ -16,11 +16,15 @@ interface SearchObject { value: string; } +interface SearchParam { + $or: Array<{ [field: SearchableField]: { $lk: string } }>; +} + const getFoundSearchObjects = (searchValue: string): Array => { const searchOptionMatches = searchOptions.map((searchOption) => { - const pattern = searchOption.replace('.', '\\.'); + const pattern = `${searchOption.replace('.', '\\.')}:([^\\s]+)`; - const [searchOptionMatch] = searchValue.match(pattern); + const [, searchOptionMatch] = searchValue.match(pattern) || []; return { field: searchOption, value: searchOptionMatch }; }); @@ -32,7 +36,10 @@ const getDefaultSearchObjects = (value): Array => { return searchOptions.map((searchOption) => ({ field: searchOption, value })); }; -const getSearchParam = (searchValue: string) => { +const getSearchParam = (searchValue: string): SearchParam | undefined => { + if (!searchValue) { + return undefined; + } const foundSearchObjects = getFoundSearchObjects(searchValue); const searchObjectsToSend = diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index db6d1052050..ddac0ab229f 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -51,6 +51,8 @@ const Resources = (): JSX.Element => { const [sortf, setSortf] = useState(); const [limit, setLimit] = useState(10); const [page, setPage] = useState(1); + + const [searchFieldValue, setSearchFieldValue] = useState(); const [search, setSearch] = useState(); const [loading, setLoading] = useState(true); @@ -102,8 +104,12 @@ const Resources = (): JSX.Element => { setPage(updatedPage + 1); }; - const changeSearch = (event): void => { - setSearch(event.target.value); + const changeSearchFieldValue = (event): void => { + setSearchFieldValue(event.target.value); + }; + + const doSearch = (): void => { + setSearch(searchFieldValue); }; return ( @@ -130,12 +136,17 @@ const Resources = (): JSX.Element => { } - value={search} - onChange={changeSearch} + value={searchFieldValue || ''} + onChange={changeSearchFieldValue} /> - From 2a4de7d76574ec121762b2286945534f2c84c4bd Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 16:01:22 +0100 Subject: [PATCH 20/36] Implement search unit tests --- .../src/Resources/api/searchObjects.ts | 4 +- www/front_src/src/Resources/index.test.tsx | 63 ++++++++++++++++++- www/front_src/src/Resources/index.tsx | 8 ++- 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/www/front_src/src/Resources/api/searchObjects.ts b/www/front_src/src/Resources/api/searchObjects.ts index 7f4aa54e1ed..315ce80f4d9 100644 --- a/www/front_src/src/Resources/api/searchObjects.ts +++ b/www/front_src/src/Resources/api/searchObjects.ts @@ -17,7 +17,7 @@ interface SearchObject { } interface SearchParam { - $or: Array<{ [field: SearchableField]: { $lk: string } }>; + $or: Array<{ [field in SearchableField]?: { $lk: string } }>; } const getFoundSearchObjects = (searchValue: string): Array => { @@ -49,7 +49,7 @@ const getSearchParam = (searchValue: string): SearchParam | undefined => { return { $or: searchObjectsToSend.map(({ field, value }) => ({ - [field]: { $lk: `${value}` }, + [field]: { $lk: `%${value}%` }, })), }; }; diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index 4d063c9649f..56c6d4a894d 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -9,6 +9,8 @@ import { labelUnhandledProblems, labelResourceProblems, labelAll, + labelResourceName, + labelSearch, } from './translatedLabels'; import columns from './columns'; import { Resource } from './models'; @@ -21,17 +23,24 @@ const getEndpoint = ({ sortOrder = undefined, page = 1, limit = 10, + search = undefined, }: { state?: string; sortBy?: string; sortOrder?: string; page?: number; limit?: number; + search?: Array<{ field: string; value: string }>; }): string => { const baseEndpoint = 'monitoring/resources'; const sortParam = sortBy ? `&sort_by={"${sortBy}":"${sortOrder}"}` : ''; + const searchParam = search + ? `&search={"$or":[${search.map( + ({ field, value }) => `{"${field}":{"$lk":"%${value}%"}}`, + )}]}` + : ''; - return `${baseEndpoint}?state="${state}"${sortParam}&page=${page}&limit=${limit}`; + return `${baseEndpoint}?state="${state}"${sortParam}&page=${page}&limit=${limit}${searchParam}`; }; const cancelTokenRequestParam = { cancelToken: {} }; @@ -80,6 +89,13 @@ const retrievedListing = { }, }; +const searchableFields = [ + 'host.name', + 'host.alias', + 'host.address', + 'service.description', +]; + describe(Resources, () => { afterEach(() => { mockedAxios.get.mockReset(); @@ -216,7 +232,7 @@ describe(Resources, () => { ); }); - it('executes a limit request when the rows per page value is changed', () => { + it('executes a listing request with a limit param when the rows per page value is changed', () => { const { getByDisplayValue } = render(); fireEvent.change(getByDisplayValue('10'), { @@ -228,4 +244,47 @@ describe(Resources, () => { cancelTokenRequestParam, ); }); + + searchableFields.forEach((searchableField) => { + it(`executes a listing request with a search param containing ${searchableField} when ${searchableField} is typed in the SearchField`, () => { + const { getByPlaceholderText, getByText } = render(); + + const fieldSearchValue = 'foobar'; + + fireEvent.change(getByPlaceholderText(labelResourceName), { + target: { value: `${searchableField}:${fieldSearchValue}` }, + }); + + fireEvent.click(getByText(labelSearch)); + + expect(mockedAxios.get).toHaveBeenCalledWith( + getEndpoint({ + search: [{ field: searchableField, value: fieldSearchValue }], + }), + cancelTokenRequestParam, + ); + }); + }); + + it('executes a listing request with a search param containing all searchable fields if no searchable field is directly specified', () => { + const { getByPlaceholderText, getByText } = render(); + + const searchValue = 'foobar'; + + fireEvent.change(getByPlaceholderText(labelResourceName), { + target: { value: searchValue }, + }); + + fireEvent.click(getByText(labelSearch)); + + expect(mockedAxios.get).toHaveBeenCalledWith( + getEndpoint({ + search: searchableFields.map((searchableField) => ({ + field: searchableField, + value: searchValue, + })), + }), + cancelTokenRequestParam, + ); + }); }); diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index ddac0ab229f..7048c0fb9b0 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -21,7 +21,12 @@ import { ResourceListing, } from './models'; import columns from './columns'; -import { labelFilter, labelStateFilter, labelSearch } from './translatedLabels'; +import { + labelFilter, + labelStateFilter, + labelSearch, + labelResourceName, +} from './translatedLabels'; const useStyles = makeStyles((theme) => ({ page: { @@ -138,6 +143,7 @@ const Resources = (): JSX.Element => { EndAdornment={(): JSX.Element => } value={searchFieldValue || ''} onChange={changeSearchFieldValue} + placeholder={labelResourceName} /> From 60f5e3d18bd509ede8e26937f16e2c2d9aea21de Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 17:47:17 +0100 Subject: [PATCH 21/36] Implement help tooltip for search --- .../src/Resources/SearchHelpTooltip.tsx | 38 +++++++++++++++++++ .../src/Resources/api/searchObjects.ts | 2 +- www/front_src/src/Resources/index.test.tsx | 2 +- www/front_src/src/Resources/index.tsx | 4 +- .../src/Resources/translatedLabels.ts | 15 ++++++++ 5 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 www/front_src/src/Resources/SearchHelpTooltip.tsx diff --git a/www/front_src/src/Resources/SearchHelpTooltip.tsx b/www/front_src/src/Resources/SearchHelpTooltip.tsx new file mode 100644 index 00000000000..d30f35e8689 --- /dev/null +++ b/www/front_src/src/Resources/SearchHelpTooltip.tsx @@ -0,0 +1,38 @@ +import React from 'react'; + +import { Tooltip } from '@material-ui/core'; +import { HelpOutline as IconHelp } from '@material-ui/icons'; + +import { + labelSearchOnFields, + labelSearchByHostName, + labelUsePartialQuery, + labelSearchByServiceStartingWith, + labelSearchByHostAliasEndingWith, +} from './translatedLabels'; + +const Content = (): JSX.Element => ( + <> +

{labelSearchOnFields}

+
    +
  • host.name
  • +
  • host.alias
  • +
  • host.address
  • +
  • service.description
  • +
+

{`${labelSearchByHostName} host.name:hostname`}

+

{labelUsePartialQuery}

+
    +
  • {`${labelSearchByServiceStartingWith} service.description:centreon%`}
  • +
  • {`${labelSearchByHostAliasEndingWith} host.alias:%-server`}
  • +
+ +); + +const SearchHelpTooltip = (): JSX.Element => ( + }> + + +); + +export default SearchHelpTooltip; diff --git a/www/front_src/src/Resources/api/searchObjects.ts b/www/front_src/src/Resources/api/searchObjects.ts index 315ce80f4d9..2e4c5f681af 100644 --- a/www/front_src/src/Resources/api/searchObjects.ts +++ b/www/front_src/src/Resources/api/searchObjects.ts @@ -49,7 +49,7 @@ const getSearchParam = (searchValue: string): SearchParam | undefined => { return { $or: searchObjectsToSend.map(({ field, value }) => ({ - [field]: { $lk: `%${value}%` }, + [field]: { $lk: `${value}` }, })), }; }; diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index 56c6d4a894d..fe3c12bb9a2 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -36,7 +36,7 @@ const getEndpoint = ({ const sortParam = sortBy ? `&sort_by={"${sortBy}":"${sortOrder}"}` : ''; const searchParam = search ? `&search={"$or":[${search.map( - ({ field, value }) => `{"${field}":{"$lk":"%${value}%"}}`, + ({ field, value }) => `{"${field}":{"$lk":"${value}"}}`, )}]}` : ''; diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index 7048c0fb9b0..88ba2e16ff4 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -3,7 +3,6 @@ import React, { useEffect, useState } from 'react'; import axios from 'axios'; import { Typography, makeStyles, Paper, Grid, Button } from '@material-ui/core'; -import { HelpOutline as IconHelp } from '@material-ui/icons'; import { Listing, @@ -27,6 +26,7 @@ import { labelSearch, labelResourceName, } from './translatedLabels'; +import SearchHelpTooltip from './SearchHelpTooltip'; const useStyles = makeStyles((theme) => ({ page: { @@ -140,7 +140,7 @@ const Resources = (): JSX.Element => {
} + EndAdornment={(): JSX.Element => } value={searchFieldValue || ''} onChange={changeSearchFieldValue} placeholder={labelResourceName} diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts index 8b756c41e75..415801689b8 100644 --- a/www/front_src/src/Resources/translatedLabels.ts +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -12,6 +12,21 @@ export const labelSeverity = I18n.t('Severity'); export const labelStatus = I18n.t('Status'); export const labelTries = I18n.t('Tries'); export const labelInformation = I18n.t('Information'); +export const labelSearchOnFields = I18n.t( + 'The search is done on the following resource fields:', +); +export const labelSearchByHostAliasEndingWith = I18n.t( + "To search hosts with alias ending with the string '-server', you can type:", +); +export const labelSearchByHostName = I18n.t( + 'For instance, to search by host name, you can type:', +); +export const labelSearchByServiceStartingWith = I18n.t( + "To search services with a description starting with the string 'centreon', you can type:", +); export const labelState = I18n.t('State'); export const labelStateFilter = I18n.t('State filter'); export const labelUnhandledProblems = I18n.t('Unhandled problems'); +export const labelUsePartialQuery = I18n.t( + "It's also possible to use a partial query for the search value, by wrapping it into a '%' character. For instance:", +); From bfc2d9bb47fbd7aa91bec48ddc4696d55a882f6b Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 17:47:43 +0100 Subject: [PATCH 22/36] set api version to beta --- www/front_src/src/Resources/api/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts index 8b4c9f330bd..f48593ff9da 100644 --- a/www/front_src/src/Resources/api/index.ts +++ b/www/front_src/src/Resources/api/index.ts @@ -4,7 +4,7 @@ import { buildResourcesEndpoint } from './endpoint'; import { ResourceListing } from '../models'; const api = axios.create({ - baseURL: 'http://localhost:5000/centreon/api/v2', + baseURL: './api/beta', }); const getData = ({ endpoint, requestParams }): Promise => From 94c4a8d19de92471b9e0754603658f635d69c50a Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Fri, 28 Feb 2020 18:40:21 +0100 Subject: [PATCH 23/36] Update colors --- www/front_src/src/Resources/columns/index.tsx | 9 +++++---- www/front_src/src/Resources/index.test.tsx | 10 +++++----- www/front_src/src/Resources/index.tsx | 9 +++++++++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/www/front_src/src/Resources/columns/index.tsx b/www/front_src/src/Resources/columns/index.tsx index 6e23fa1333a..cadb1399ec3 100644 --- a/www/front_src/src/Resources/columns/index.tsx +++ b/www/front_src/src/Resources/columns/index.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { Grid, Typography, Avatar, makeStyles, fade } from '@material-ui/core'; import { Person as IconAcknowledged } from '@material-ui/icons'; +import { lime, purple } from '@material-ui/core/colors'; import { TABLE_COLUMN_TYPES, StatusChip, StatusCode } from '@centreon/ui'; @@ -88,12 +89,12 @@ const useStateChipStyles = makeStyles((theme) => ({ height: theme.spacing(4), }, acknowledged: { - backgroundColor: fade('#AE9500', 0.1), - color: '#AE9500', + backgroundColor: fade(lime[900], 0.1), + color: lime[900], }, downtime: { - backgroundColor: fade('#C117FF', 0.1), - color: '#C117FF', + backgroundColor: fade(purple[500], 0.1), + color: purple[500], }, })); diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index fe3c12bb9a2..6ef32b8c176 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -116,7 +116,7 @@ describe(Resources, () => { ); }); - it('executes a list request with selected state filter when state filter is changed', async () => { + it('executes a listing request with selected state filter when state filter is changed', async () => { const { getByText } = render(); await wait(() => expect(mockedAxios.get).toHaveBeenCalled()); @@ -140,7 +140,7 @@ describe(Resources, () => { ); }); - it('sends a listing request with sort_by param when a sortable column is clicked', async () => { + it('executes a listing request with sort_by param when a sortable column is clicked', async () => { const { getByText } = render(); await wait(() => { @@ -166,7 +166,7 @@ describe(Resources, () => { }); }); - it('sends a listing request with an updated page param when a change page action is clicked', async () => { + it('executes a listing request with an updated page param when a change page action is clicked', async () => { const { getByLabelText } = render(); await wait(() => { @@ -246,7 +246,7 @@ describe(Resources, () => { }); searchableFields.forEach((searchableField) => { - it(`executes a listing request with a search param containing ${searchableField} when ${searchableField} is typed in the SearchField`, () => { + it(`executes a listing request with a search param containing ${searchableField} when ${searchableField} is typed in the search field`, () => { const { getByPlaceholderText, getByText } = render(); const fieldSearchValue = 'foobar'; @@ -266,7 +266,7 @@ describe(Resources, () => { }); }); - it('executes a listing request with a search param containing all searchable fields if no searchable field is directly specified', () => { + it('executes a listing request with a search param containing all searchable fields when a string that does not correspond to any searchable field is typed in the search field', () => { const { getByPlaceholderText, getByText } = render(); const searchValue = 'foobar'; diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index 88ba2e16ff4..c8a30f3f06f 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -3,6 +3,7 @@ import React, { useEffect, useState } from 'react'; import axios from 'axios'; import { Typography, makeStyles, Paper, Grid, Button } from '@material-ui/core'; +import { lime, purple } from '@material-ui/core/colors'; import { Listing, @@ -117,6 +118,14 @@ const Resources = (): JSX.Element => { setSearch(searchFieldValue); }; + const rowColorConditions = [ + { + condition: ({ acknowledged }): boolean => acknowledged, + color: purple[500], + }, + { condition: ({ in_downtime }): boolean => in_downtime, color: lime[900] }, + ]; + return (
From e4925f2ff810607c5d259dcb93c49fecfabb6c4a Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Sun, 1 Mar 2020 11:32:59 +0100 Subject: [PATCH 24/36] Add downtime and acknowledge color conditions --- www/front_src/src/Resources/api/index.ts | 2 +- www/front_src/src/Resources/index.tsx | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts index e2faf94ad08..c1e9a103a09 100644 --- a/www/front_src/src/Resources/api/index.ts +++ b/www/front_src/src/Resources/api/index.ts @@ -4,7 +4,7 @@ import { buildResourcesEndpoint } from './endpoint'; import { ResourceListing } from '../models'; const api = axios.create({ - baseURL: './api/beta/', + baseURL: 'http://localhost:5000/api/beta/', }); const getData = ({ endpoint, requestParams }): Promise => diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index c8a30f3f06f..b0cfe8fd476 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -120,10 +120,13 @@ const Resources = (): JSX.Element => { const rowColorConditions = [ { - condition: ({ acknowledged }): boolean => acknowledged, + condition: ({ in_downtime }): boolean => in_downtime, color: purple[500], }, - { condition: ({ in_downtime }): boolean => in_downtime, color: lime[900] }, + { + condition: ({ acknowledged }): boolean => acknowledged, + color: lime[900], + }, ]; return ( @@ -175,6 +178,7 @@ const Resources = (): JSX.Element => { columnConfiguration={columns} tableData={listing?.result} currentPage={page - 1} + rowColorConditions={rowColorConditions} limit={listing?.meta.limit} onDelete={noOp} onSort={changeSort} From 8298c59b2dd23ddef5a4bf1f67f2aee3400a9f0d Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 3 Mar 2020 09:48:52 +0100 Subject: [PATCH 25/36] Add Downtime hover details --- package-lock.json | 12 ++ package.json | 1 + www/front_src/src/Resources/api/index.ts | 4 +- .../src/Resources/columns/State/index.tsx | 163 ++++++++++++++++++ www/front_src/src/Resources/columns/index.tsx | 63 +------ www/front_src/src/Resources/index.tsx | 2 + .../src/Resources/translatedLabels.ts | 5 + 7 files changed, 188 insertions(+), 62 deletions(-) create mode 100644 www/front_src/src/Resources/columns/State/index.tsx diff --git a/package-lock.json b/package-lock.json index 68528247d6b..0e572470adf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1514,6 +1514,18 @@ "@babel/runtime": "^7.4.4" } }, + "@material-ui/lab": { + "version": "4.0.0-alpha.45", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.45.tgz", + "integrity": "sha512-zT6kUU87SHsPukiu3tlWg8V6o0tGS38c1b/xst/kPqX6eLbfqrROyxhHn1A8ZtHmqga1AKQdv/1llQoG80Afww==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.7.1", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + } + }, "@material-ui/styles": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.0.tgz", diff --git a/package.json b/package.json index 31b0c38b5b9..29f3d2d7d0a 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "@centreon/ui": "centreon/centreon-ui", "@material-ui/core": "^4.9.4", "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.45", "axios": "^0.19.2", "classnames": "^2.2.6", "connected-react-router": "^6.7.0", diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts index c1e9a103a09..81630b98a5e 100644 --- a/www/front_src/src/Resources/api/index.ts +++ b/www/front_src/src/Resources/api/index.ts @@ -7,7 +7,7 @@ const api = axios.create({ baseURL: 'http://localhost:5000/api/beta/', }); -const getData = ({ endpoint, requestParams }): Promise => +const getData = ({ endpoint, requestParams }): Promise => api.get(endpoint, requestParams).then(({ data }) => data); const listResources = ( @@ -16,4 +16,4 @@ const listResources = ( ): Promise => getData({ endpoint: buildResourcesEndpoint(endpointParams), requestParams }); -export { listResources }; +export { listResources, getData }; diff --git a/www/front_src/src/Resources/columns/State/index.tsx b/www/front_src/src/Resources/columns/State/index.tsx new file mode 100644 index 00000000000..67d2658f857 --- /dev/null +++ b/www/front_src/src/Resources/columns/State/index.tsx @@ -0,0 +1,163 @@ +import React, { useState, useEffect } from 'react'; + +import { + Grid, + Avatar, + makeStyles, + fade, + Tooltip, + TableContainer, + TableRow, + Paper, + Table, + TableHead, + TableCell, + TableBody, +} from '@material-ui/core'; +import { Person as IconAcknowledged } from '@material-ui/icons'; +import { lime, purple } from '@material-ui/core/colors'; +import { Skeleton } from '@material-ui/lab'; + +import IconDowntime from '../icons/Downtime'; +import { ColumnProps } from '..'; +import { + labelFixed, + labelAuthor, + labelStartTime, + labelEndTime, + labelComment, +} from '../../translatedLabels'; +import { getData } from '../../api'; + +const useStyles = makeStyles((theme) => ({ + stateChip: { + width: theme.spacing(4), + height: theme.spacing(4), + }, + acknowledged: { + backgroundColor: fade(lime[900], 0.1), + color: lime[900], + }, + downtime: { + backgroundColor: fade(purple[500], 0.1), + color: purple[500], + }, + tooltip: { + maxWidth: 'none', + backgroundColor: 'transparent', + }, +})); + +interface DetailsTableProps { + endpoint: string; + columns: Array; +} + +interface DowntimeDetails { + author: string; + fixed: boolean; + start_time: string; + end_time: string; + comment: string; +} + +const DetailsTable = ({ + endpoint, + columns, +}: DetailsTableProps): JSX.Element => { + const [details, setDetails] = useState(); + + useEffect(() => { + getData({ endpoint }) + .then((retrievedDetails) => setDetails(retrievedDetails)) + .catch(() => { + setDetails(null); + }); + }, []); + + const loading = details === undefined; + const error = details === null; + const success = !loading && !error; + + return ( + + + + + {columns.map((column) => ( + {column} + ))} + + + + + {loading && } + {success && + columns.map((column) => {details[column]})} + {error && oops!} + + +
+
+ ); +}; + +const DowntimeDetailsTable = ({ endpoint }): JSX.Element => { + const columns = [ + labelAuthor, + labelFixed, + labelStartTime, + labelEndTime, + labelComment, + ]; + + return ( + columns={columns} endpoint={endpoint} /> + ); +}; + +const DowntimeChip = ({ endpoint }): JSX.Element => { + const classes = useStyles(); + + return ( + } + classes={{ tooltip: classes.tooltip }} + > + + + + + ); +}; + +const AcknowledgedChip = (): JSX.Element => { + const classes = useStyles(); + + return ( + + + + ); +}; + +const StateColumn = ({ Cell, row }: ColumnProps): JSX.Element => { + return ( + + + {row.in_downtime && ( + + + + )} + {row.acknowledged && ( + + + + )} + + + ); +}; + +export default StateColumn; diff --git a/www/front_src/src/Resources/columns/index.tsx b/www/front_src/src/Resources/columns/index.tsx index cadb1399ec3..20d67a4c65c 100644 --- a/www/front_src/src/Resources/columns/index.tsx +++ b/www/front_src/src/Resources/columns/index.tsx @@ -1,8 +1,6 @@ import React from 'react'; -import { Grid, Typography, Avatar, makeStyles, fade } from '@material-ui/core'; -import { Person as IconAcknowledged } from '@material-ui/icons'; -import { lime, purple } from '@material-ui/core/colors'; +import { Grid, Typography } from '@material-ui/core'; import { TABLE_COLUMN_TYPES, StatusChip, StatusCode } from '@centreon/ui'; @@ -15,11 +13,10 @@ import { labelState, labelLastCheck, } from '../translatedLabels'; - -import IconDowntime from './icons/Downtime'; import { Resource } from '../models'; +import StateColumn from './State'; -interface ColumnProps { +export interface ColumnProps { row: Resource; Cell: ({ children, width }: { children; width? }) => JSX.Element; isRowSelected: boolean; @@ -83,60 +80,6 @@ const ResourcesColumn = ({ Cell, row }: ColumnProps): JSX.Element => { ); }; -const useStateChipStyles = makeStyles((theme) => ({ - stateChip: { - width: theme.spacing(4), - height: theme.spacing(4), - }, - acknowledged: { - backgroundColor: fade(lime[900], 0.1), - color: lime[900], - }, - downtime: { - backgroundColor: fade(purple[500], 0.1), - color: purple[500], - }, -})); - -const DowntimeChip = (): JSX.Element => { - const classes = useStateChipStyles(); - - return ( - - - - ); -}; - -const AcknowledgedChip = (): JSX.Element => { - const classes = useStateChipStyles(); - - return ( - - - - ); -}; - -const StateColumn = ({ Cell, row }: ColumnProps): JSX.Element => { - return ( - - - {row.in_downtime && ( - - - - )} - {row.acknowledged && ( - - - - )} - - - ); -}; - const columns = [ { id: 'severity', diff --git a/www/front_src/src/Resources/index.tsx b/www/front_src/src/Resources/index.tsx index b0cfe8fd476..b07b1f4fe6c 100644 --- a/www/front_src/src/Resources/index.tsx +++ b/www/front_src/src/Resources/index.tsx @@ -120,10 +120,12 @@ const Resources = (): JSX.Element => { const rowColorConditions = [ { + name: 'inDowntime', condition: ({ in_downtime }): boolean => in_downtime, color: purple[500], }, { + name: 'acknowledged', condition: ({ acknowledged }): boolean => acknowledged, color: lime[900], }, diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts index 415801689b8..fd05db78b33 100644 --- a/www/front_src/src/Resources/translatedLabels.ts +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -1,8 +1,12 @@ import { I18n } from 'react-redux-i18n'; export const labelAll = I18n.t('All'); +export const labelAuthor = I18n.t('Author'); +export const labelComment = I18n.t('Comment'); export const labelDuration = I18n.t('Duration'); +export const labelEndTime = I18n.t('End time'); export const labelFilter = I18n.t('Filter'); +export const labelFixed = I18n.t('Fixed'); export const labelLastCheck = I18n.t('Last check'); export const labelResourceName = I18n.t('Resource name'); export const labelResourceProblems = I18n.t('Resource problems'); @@ -24,6 +28,7 @@ export const labelSearchByHostName = I18n.t( export const labelSearchByServiceStartingWith = I18n.t( "To search services with a description starting with the string 'centreon', you can type:", ); +export const labelStartTime = I18n.t('Start time'); export const labelState = I18n.t('State'); export const labelStateFilter = I18n.t('State filter'); export const labelUnhandledProblems = I18n.t('Unhandled problems'); From 4926d7d4ef87c3e9d4fe509e6d10a9dfe7bbd279 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 3 Mar 2020 09:50:00 +0100 Subject: [PATCH 26/36] Update www/front_src/src/Resources/SearchHelpTooltip.tsx Co-Authored-By: Kevin Duret --- www/front_src/src/Resources/SearchHelpTooltip.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/front_src/src/Resources/SearchHelpTooltip.tsx b/www/front_src/src/Resources/SearchHelpTooltip.tsx index d30f35e8689..dcc2b5aaf7d 100644 --- a/www/front_src/src/Resources/SearchHelpTooltip.tsx +++ b/www/front_src/src/Resources/SearchHelpTooltip.tsx @@ -23,8 +23,8 @@ const Content = (): JSX.Element => (

{`${labelSearchByHostName} host.name:hostname`}

{labelUsePartialQuery}

    -
  • {`${labelSearchByServiceStartingWith} service.description:centreon%`}
  • -
  • {`${labelSearchByHostAliasEndingWith} host.alias:%-server`}
  • +
  • {`${labelSearchByServiceStartingWith} service.description:^centreon`}
  • +
  • {`${labelSearchByHostAliasEndingWith} host.alias:(fr|us)-server`}
); From 15274dbf1d2c88be621dc9b16889d952e860925d Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 3 Mar 2020 09:50:09 +0100 Subject: [PATCH 27/36] Update www/front_src/src/Resources/api/searchObjects.ts Co-Authored-By: Kevin Duret --- www/front_src/src/Resources/api/searchObjects.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/api/searchObjects.ts b/www/front_src/src/Resources/api/searchObjects.ts index 2e4c5f681af..a87896b7cbe 100644 --- a/www/front_src/src/Resources/api/searchObjects.ts +++ b/www/front_src/src/Resources/api/searchObjects.ts @@ -17,7 +17,7 @@ interface SearchObject { } interface SearchParam { - $or: Array<{ [field in SearchableField]?: { $lk: string } }>; + $or: Array<{ [field in SearchableField]?: { $rg: string } }>; } const getFoundSearchObjects = (searchValue: string): Array => { From 852371dc09a8940ddffb23bab8df391f5e020bf8 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 3 Mar 2020 09:50:16 +0100 Subject: [PATCH 28/36] Update www/front_src/src/Resources/api/searchObjects.ts Co-Authored-By: Kevin Duret --- www/front_src/src/Resources/api/searchObjects.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/api/searchObjects.ts b/www/front_src/src/Resources/api/searchObjects.ts index a87896b7cbe..68fa4ba0582 100644 --- a/www/front_src/src/Resources/api/searchObjects.ts +++ b/www/front_src/src/Resources/api/searchObjects.ts @@ -49,7 +49,7 @@ const getSearchParam = (searchValue: string): SearchParam | undefined => { return { $or: searchObjectsToSend.map(({ field, value }) => ({ - [field]: { $lk: `${value}` }, + [field]: { $rg: `${value}` }, })), }; }; From 00cb39d7a39ff34a9f04c9c5e641698ee39d405a Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 3 Mar 2020 09:52:59 +0100 Subject: [PATCH 29/36] Update www/front_src/src/Resources/translatedLabels.ts Co-Authored-By: Kevin Duret --- www/front_src/src/Resources/translatedLabels.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts index 415801689b8..3bb0cc296a2 100644 --- a/www/front_src/src/Resources/translatedLabels.ts +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -28,5 +28,5 @@ export const labelState = I18n.t('State'); export const labelStateFilter = I18n.t('State filter'); export const labelUnhandledProblems = I18n.t('Unhandled problems'); export const labelUsePartialQuery = I18n.t( - "It's also possible to use a partial query for the search value, by wrapping it into a '%' character. For instance:", + "It's also possible to use a partial query for the search value, by using a regular expression. For instance:", ); From c2f90f08b3b7ed4683d45361d13ebf10953c9a4b Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 3 Mar 2020 10:27:24 +0100 Subject: [PATCH 30/36] Fix tests and increase search help tooltip font size --- .../src/Resources/SearchHelpTooltip.tsx | 22 ++++++++++++++----- www/front_src/src/Resources/index.test.tsx | 2 +- .../src/Resources/translatedLabels.ts | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/www/front_src/src/Resources/SearchHelpTooltip.tsx b/www/front_src/src/Resources/SearchHelpTooltip.tsx index dcc2b5aaf7d..ba3c2153150 100644 --- a/www/front_src/src/Resources/SearchHelpTooltip.tsx +++ b/www/front_src/src/Resources/SearchHelpTooltip.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Tooltip } from '@material-ui/core'; +import { Tooltip, makeStyles } from '@material-ui/core'; import { HelpOutline as IconHelp } from '@material-ui/icons'; import { @@ -11,6 +11,12 @@ import { labelSearchByHostAliasEndingWith, } from './translatedLabels'; +const useStyles = makeStyles((theme) => ({ + tooltip: { + fontSize: theme.typography.pxToRem(12), + }, +})); + const Content = (): JSX.Element => ( <>

{labelSearchOnFields}

@@ -29,10 +35,14 @@ const Content = (): JSX.Element => ( ); -const SearchHelpTooltip = (): JSX.Element => ( - }> - - -); +const SearchHelpTooltip = (): JSX.Element => { + const classes = useStyles(); + + return ( + } classes={{ tooltip: classes.tooltip }}> + + + ); +}; export default SearchHelpTooltip; diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index fe3c12bb9a2..94e8d34436f 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -36,7 +36,7 @@ const getEndpoint = ({ const sortParam = sortBy ? `&sort_by={"${sortBy}":"${sortOrder}"}` : ''; const searchParam = search ? `&search={"$or":[${search.map( - ({ field, value }) => `{"${field}":{"$lk":"${value}"}}`, + ({ field, value }) => `{"${field}":{"$rg":"${value}"}}`, )}]}` : ''; diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts index 3bb0cc296a2..dfb81f5bef6 100644 --- a/www/front_src/src/Resources/translatedLabels.ts +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -28,5 +28,5 @@ export const labelState = I18n.t('State'); export const labelStateFilter = I18n.t('State filter'); export const labelUnhandledProblems = I18n.t('Unhandled problems'); export const labelUsePartialQuery = I18n.t( - "It's also possible to use a partial query for the search value, by using a regular expression. For instance:", + "It's also possible to use a partial query for the search value, by using a regular expression, for instance:", ); From 4284b0f8b7e6b260ccb02889798a803c6d03c5b8 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 3 Mar 2020 18:17:45 +0100 Subject: [PATCH 31/36] Implement ackwnoledge and downtime tooltips --- jest.config.js | 4 + package-lock.json | 551 ++++++++++++------ package.json | 1 + setupTest.js | 8 + .../State/DetailsTable/Acknowledgement.tsx | 61 ++ .../columns/State/DetailsTable/Downtime.tsx | 56 ++ .../columns/State/DetailsTable/index.tsx | 105 ++++ .../src/Resources/columns/State/index.tsx | 151 ++--- .../columns/icons/__mocks__/Downtime.tsx | 5 + .../Resources/columns/icons/downtime.icon.svg | 2 +- www/front_src/src/Resources/columns/index.tsx | 26 +- www/front_src/src/Resources/index.test.tsx | 108 +++- www/front_src/src/Resources/models.ts | 2 + .../src/Resources/translatedLabels.ts | 8 + .../src/Resources/useCancelTokenSource.ts | 11 + 15 files changed, 811 insertions(+), 288 deletions(-) create mode 100644 setupTest.js create mode 100644 www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx create mode 100644 www/front_src/src/Resources/columns/State/DetailsTable/Downtime.tsx create mode 100644 www/front_src/src/Resources/columns/State/DetailsTable/index.tsx create mode 100644 www/front_src/src/Resources/columns/icons/__mocks__/Downtime.tsx create mode 100644 www/front_src/src/Resources/useCancelTokenSource.ts diff --git a/jest.config.js b/jest.config.js index b4b88d210cb..0b4d02caaff 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,4 +2,8 @@ const merge = require('lodash/merge'); module.exports = merge(require('@centreon/frontend-core/jest'), { roots: ['/www/front_src/src/'], + setupFilesAfterEnv: [ + '@testing-library/jest-dom/extend-expect', + '/setupTest.js', + ], }); diff --git a/package-lock.json b/package-lock.json index 0e572470adf..39dba0cd040 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,9 @@ } }, "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.6.tgz", + "integrity": "sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q==", "requires": { "browserslist": "^4.8.5", "invariant": "^2.2.4", @@ -72,11 +72,11 @@ } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.6.tgz", + "integrity": "sha512-4bpOR5ZBz+wWcMeVtcf7FbjcFzCp+817z2/gHNncIRcM9MmKzUhtWCYAq27RAfUrAFwb+OCG1s9WEaVxfi6cjg==", "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.8.6", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -119,11 +119,11 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.6.tgz", + "integrity": "sha512-UrJdk27hKVJSnibFcUWYLkCL0ZywTUoot8yii1lsHJcvwrypagmYKjHLMWivQPm4s6GdyygCL8fiH5EYLxhQwQ==", "requires": { - "@babel/compat-data": "^7.8.4", + "@babel/compat-data": "^7.8.6", "browserslist": "^4.8.5", "invariant": "^2.2.4", "levenary": "^1.1.1", @@ -138,23 +138,24 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz", + "integrity": "sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==", "requires": { "@babel/helper-function-name": "^7.8.3", "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.6.tgz", + "integrity": "sha512-bPyujWfsHhV/ztUkwGHz/RPV1T1TDEsSZDsN42JPehndA+p1KKTh3npvTadux0ZhCrytx9tvjpWNowKby3tM6A==", "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-regex": "^7.8.3", "regexpu-core": "^4.6.0" } @@ -221,15 +222,16 @@ } }, "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz", + "integrity": "sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg==", "requires": { "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-simple-access": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.8.6", "lodash": "^4.17.13" } }, @@ -267,14 +269,14 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/helper-simple-access": { @@ -326,9 +328,9 @@ } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.6.tgz", + "integrity": "sha512-trGNYSfwq5s0SgM1BMEB8hX3NDmO7EP2wsDGDexiaKMB92BaRpS+qZfpkMqUBhcsOTBwNy9B/jieo4ad/t/z2g==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.8.3", @@ -580,16 +582,16 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz", + "integrity": "sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg==", "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-define-map": "^7.8.3", "@babel/helper-function-name": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" } @@ -646,9 +648,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz", + "integrity": "sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -921,12 +923,12 @@ } }, "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.6.tgz", + "integrity": "sha512-M5u8llV9DIVXBFB/ArIpqJuvXpO+ymxcJ6e8ZAmzeK3sQeBNOD1y+rHvHCGG4TlEmsNpIrdecsHGHT8ZCoOSJg==", "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", + "@babel/compat-data": "^7.8.6", + "@babel/helper-compilation-targets": "^7.8.6", "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-proposal-async-generator-functions": "^7.8.3", @@ -949,13 +951,13 @@ "@babel/plugin-transform-async-to-generator": "^7.8.3", "@babel/plugin-transform-block-scoped-functions": "^7.8.3", "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.6", "@babel/plugin-transform-computed-properties": "^7.8.3", "@babel/plugin-transform-destructuring": "^7.8.3", "@babel/plugin-transform-dotall-regex": "^7.8.3", "@babel/plugin-transform-duplicate-keys": "^7.8.3", "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-for-of": "^7.8.6", "@babel/plugin-transform-function-name": "^7.8.3", "@babel/plugin-transform-literals": "^7.8.3", "@babel/plugin-transform-member-expression-literals": "^7.8.3", @@ -976,7 +978,7 @@ "@babel/plugin-transform-template-literals": "^7.8.3", "@babel/plugin-transform-typeof-symbol": "^7.8.4", "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/types": "^7.8.6", "browserslist": "^4.8.5", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -1021,26 +1023,26 @@ } }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", + "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", + "@babel/generator": "^7.8.6", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -1062,9 +1064,9 @@ } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.6.tgz", + "integrity": "sha512-wqz7pgWMIrht3gquyEFPVXeXCti72Rm8ep9b5tQKz9Yg9LzJA3HxosF1SB3Kc81KD1A3XBkkVYtJvCKS2Z/QrA==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -1078,12 +1080,12 @@ "dev": true }, "@centreon/frontend-core": { - "version": "github:centreon/frontend-core#948abe1f89b8ba12ee7153b3380b12b0bec57af6", + "version": "github:centreon/frontend-core#35a9766ca0e58ad0ed275a31ab24c03a61b2e470", "from": "github:centreon/frontend-core", "dev": true }, "@centreon/ui": { - "version": "github:centreon/centreon-ui#12ef887220f649c1bd0ff83440ba501fa5de6e2d", + "version": "github:centreon/centreon-ui#c14dc35db5c9c2038281e62cdd1d0280aa917224", "from": "github:centreon/centreon-ui", "requires": { "@material-ui/core": "^4.9.3", @@ -1122,9 +1124,9 @@ "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@emotion/cache": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.27.tgz", - "integrity": "sha512-Zp8BEpbMunFsTcqAK4D7YTm3MvCp1SekflSLJH8lze2fCcSZ/yMkXHo8kb3t1/1Tdd3hAqf3Fb7z9VZ+FMiC9w==", + "version": "10.0.29", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", + "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", "requires": { "@emotion/sheet": "0.9.4", "@emotion/stylis": "0.8.5", @@ -1133,9 +1135,9 @@ } }, "@emotion/core": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.27.tgz", - "integrity": "sha512-XbD5R36pVbohQMnKfajHv43g8EbN4NHdF6Zh9zg/C0nr0jqwOw3gYnC07Xj3yG43OYSRyrGsoQ5qPwc8ycvLZw==", + "version": "10.0.28", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz", + "integrity": "sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==", "requires": { "@babel/runtime": "^7.5.5", "@emotion/cache": "^10.0.27", @@ -1166,15 +1168,22 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" }, "@emotion/serialize": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.15.tgz", - "integrity": "sha512-YE+qnrmGwyR+XB5j7Bi+0GT1JWsdcjM/d4POu+TXkcnrRs4RFCCsi3d/Ebf+wSStHqAlTT2+dfd+b9N9EO2KBg==", + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", "requires": { - "@emotion/hash": "0.7.4", + "@emotion/hash": "0.8.0", "@emotion/memoize": "0.7.4", "@emotion/unitless": "0.7.5", "@emotion/utils": "0.11.3", "csstype": "^2.5.7" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + } } }, "@emotion/sheet": { @@ -1488,9 +1497,9 @@ } }, "@material-ui/core": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.4.tgz", - "integrity": "sha512-1wqm3jBC8mGpVHu0wVOYBX7LUzkPsWxkkTtKSn0Hz66T6TDJkke72mkSIL7akNdjnxy+bRc2Vi6NiJ4YutkDcw==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.5.tgz", + "integrity": "sha512-hVuUqw6847jcgRsUqzCiYCXcIJYhPUfM3gS9sNehTsbI0SF3tufLNO2B2Cgkuns8uOGy0nicD4p3L7JqhnEElg==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.9.0", @@ -2132,8 +2141,7 @@ "@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==", - "dev": true + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/eslint-visitor-keys": { "version": "1.0.0", @@ -2313,9 +2321,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.7.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.6.tgz", - "integrity": "sha512-eyK7MWD0R1HqVTp+PtwRgFeIsemzuj4gBFSQxfPHY5iMjS7474e5wq+VFgTcdpyHeNxyKSaetYAjdMLJlKoWqA==" + "version": "13.7.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.7.tgz", + "integrity": "sha512-Uo4chgKbnPNlxQwoFmYIwctkQVkMMmsAoGGU4JKwLuvBefF0pCq4FybNSnfkfRCpC7ZW7kttcC/TrRtAJsvGtg==" }, "@types/parse-json": { "version": "4.0.0", @@ -2431,9 +2439,9 @@ } }, "@types/webpack": { - "version": "4.41.6", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.6.tgz", - "integrity": "sha512-iWRpV5Ej+8uKrgxp6jXz3v7ZTjgtuMXY+rsxQjFNU0hYCnHkpA7vtiNffgxjuxX4feFHBbz0IF76OzX2OqDYPw==", + "version": "4.41.7", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.7.tgz", + "integrity": "sha512-OQG9viYwO0V1NaNV7d0n79V+n6mjOV30CwgFPIfTzwmk8DHbt+C4f2aBGdCYbo3yFyYD6sjXfqqOjwkl1j+ulA==", "dev": true, "requires": { "@types/anymatch": "*", @@ -2485,11 +2493,11 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.21.0.tgz", - "integrity": "sha512-b5jjjDMxzcjh/Sbjuo7WyhrQmVJg0WipTHQgXh5Xwx10uYm6nPWqN1WGOsaNq4HR3Zh4wUx4IRQdDkCHwyewyw==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.22.0.tgz", + "integrity": "sha512-BvxRLaTDVQ3N+Qq8BivLiE9akQLAOUfxNHIEhedOcg8B2+jY8Rc4/D+iVprvuMX1AdezFYautuGDwr9QxqSxBQ==", "requires": { - "@typescript-eslint/experimental-utils": "2.21.0", + "@typescript-eslint/experimental-utils": "2.22.0", "eslint-utils": "^1.4.3", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -2497,30 +2505,30 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.21.0.tgz", - "integrity": "sha512-olKw9JP/XUkav4lq0I7S1mhGgONJF9rHNhKFn9wJlpfRVjNo3PPjSvybxEldvCXnvD+WAshSzqH5cEjPp9CsBA==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.22.0.tgz", + "integrity": "sha512-sJt1GYBe6yC0dWOQzXlp+tiuGglNhJC9eXZeC8GBVH98Zv9jtatccuhz0OF5kC/DwChqsNfghHx7OlIDQjNYAQ==", "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.21.0", + "@typescript-eslint/typescript-estree": "2.22.0", "eslint-scope": "^5.0.0" } }, "@typescript-eslint/parser": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.21.0.tgz", - "integrity": "sha512-VrmbdrrrvvI6cPPOG7uOgGUFXNYTiSbnRq8ZMyuGa4+qmXJXVLEEz78hKuqupvkpwJQNk1Ucz1TenrRP90gmBg==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.22.0.tgz", + "integrity": "sha512-FaZKC1X+nvD7qMPqKFUYHz3H0TAioSVFGvG29f796Nc5tBluoqfHgLbSFKsh7mKjRoeTm8J9WX2Wo9EyZWjG7w==", "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.21.0", - "@typescript-eslint/typescript-estree": "2.21.0", + "@typescript-eslint/experimental-utils": "2.22.0", + "@typescript-eslint/typescript-estree": "2.22.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.21.0.tgz", - "integrity": "sha512-NC/nogZNb9IK2MEFQqyDBAciOT8Lp8O3KgAfvHx2Skx6WBo+KmDqlU3R9KxHONaijfTIKtojRe3SZQyMjr3wBw==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.22.0.tgz", + "integrity": "sha512-2HFZW2FQc4MhIBB8WhDm9lVFaBDy6h9jGrJ4V2Uzxe/ON29HCHBTj3GkgcsgMWfsl2U5as+pTOr30Nibaw7qRQ==", "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", @@ -2735,9 +2743,9 @@ } }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" }, "acorn-globals": { "version": "4.3.4", @@ -2859,11 +2867,18 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + } } }, "ansi-html": { @@ -3619,20 +3634,27 @@ } }, "babel-plugin-emotion": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.27.tgz", - "integrity": "sha512-SUNYcT4FqhOqvwv0z1oeYhqgheU8qrceLojuHyX17ngo7WtWqN5I9l3IGHzf21Xraj465CVzF4IvOlAF+3ed0A==", + "version": "10.0.29", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.29.tgz", + "integrity": "sha512-7Jpi1OCxjyz0k163lKtqP+LHMg5z3S6A7vMBfHnF06l2unmtsOmFDzZBpGf0CWo1G4m8UACfVcDJiSiRuu/cSw==", "requires": { "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.7.4", + "@emotion/hash": "0.8.0", "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.15", + "@emotion/serialize": "^0.11.16", "babel-plugin-macros": "^2.0.0", "babel-plugin-syntax-jsx": "^6.18.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^1.0.5", "find-root": "^1.1.0", "source-map": "^0.5.7" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + } } }, "babel-plugin-istanbul": { @@ -3764,6 +3786,77 @@ "@babel/runtime": "7.8.4", "babel-plugin-macros": "2.8.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/preset-env": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", + "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "requires": { + "@babel/compat-data": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@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.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.5", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "babel-runtime": { @@ -4126,13 +4219,13 @@ } }, "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz", + "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==", "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" + "caniuse-lite": "^1.0.30001030", + "electron-to-chromium": "^1.3.363", + "node-releases": "^1.1.50" } }, "bser": { @@ -4306,9 +4399,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001030", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001030.tgz", - "integrity": "sha512-QGK0W4Ft/Ac+zTjEiRJfwDNATvS3fodDczBXrH42784kcfqcDKpEPfN08N0HQjrAp8He/Jw8QiSS9QRn7XAbUw==" + "version": "1.0.30001031", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001031.tgz", + "integrity": "sha512-DpAP5a1NGRLgYfaNCaXIRyGARi+3tJA2quZXNNA1Du26VyVkqvy2tznNu5ANyN1Y5aX44QDotZSVSUSi2uMGjg==" }, "capture-exit": { "version": "2.0.0", @@ -5246,6 +5339,11 @@ } } }, + "date-fns": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.10.0.tgz", + "integrity": "sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA==" + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -5677,9 +5775,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.361", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.361.tgz", - "integrity": "sha512-OzSVjWpsRhJyr9PSAXkeloSe6e9viU2ToGt1wXlXFsGcxuI9vlsnalL+V/AM59Z2pEo3wRxIddtOGsT7Y6x/sQ==" + "version": "1.3.366", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.366.tgz", + "integrity": "sha512-MWtwlJaX/MqAH4V7j4pFasq2O4OIH7MltGTEVvzyeuUW+CPYsx+fuVg/MSBrTL4PzZjHidOixaELNy75/XFK1g==" }, "elliptic": { "version": "6.5.2", @@ -6265,9 +6363,9 @@ } }, "eslint-plugin-jest": { - "version": "23.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.0.tgz", - "integrity": "sha512-DKXmLxguZ1Lru4u5YM12ko3WLq6gqo7dhV2b63K731+/PNyZ/Ff6NGONQsGUtPLG9zU3kdz/N+2LTbweNZifeg==", + "version": "23.8.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.1.tgz", + "integrity": "sha512-OycLNqPo/2EfO6kTqnmsu1khz1gTIOxGl3ThIVwL5/oycDF4pm5uNDyvFelNLdpr4COUuM8PVi3963NEG1Efpw==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^2.5.0" @@ -6371,12 +6469,12 @@ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.0.tgz", + "integrity": "sha512-Xs8airJ7RQolnDIbLtRutmfvSsAe0xqMMAantCN/GMoqf81TFbeI1T7Jpd56qYu1uuh32dOG5W/X9uO+ghPXzA==", "requires": { "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" } }, @@ -7579,9 +7677,9 @@ } }, "hosted-git-info": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.6.tgz", - "integrity": "sha512-Kp6rShEsCHhF5dD3EWKdkgVA8ix90oSUJ0VY4g9goxxa0+f4lx63muTftn0mlJ/+8IESGWyKnP//V2D7S4ZbIQ==" + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" }, "hpack.js": { "version": "2.1.6", @@ -8047,23 +8145,77 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.5.tgz", + "integrity": "sha512-6Z5cP+LAO0rzNE7xWjWtT84jxKa5ScLEGLgegPXeO3dGeU8lNe5Ii7SlXH6KVtLGlDuaEhsvsFjrjWjw8j5lFg==", "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", + "run-async": "^2.4.0", "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "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==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "install": { @@ -13895,9 +14047,9 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "requires": { "asap": "~2.0.6" } @@ -14015,9 +14167,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.11.0.tgz", - "integrity": "sha512-jS+me8X3OEGFTsF6kF+vUUMFG/d3WUCvD7bHhfZP5784nOq1pjj8yau/u86nfOncmcN6ZkSWKWkKAvv/MGxzLA==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.11.1.tgz", + "integrity": "sha512-1ZvJOUl8ifkkBxu2ByVM/8GijMIPx+cef7u3yroO3Ogm4DOdZcF5dcrWTIlSHe3Pg/mtlt6/eFjObDfJureZZA==", "requires": { "decode-uri-component": "^0.2.0", "split-on-first": "^1.0.0", @@ -14088,9 +14240,9 @@ } }, "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.0.tgz", + "integrity": "sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -14141,6 +14293,11 @@ "text-table": "0.2.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "browserslist": { "version": "4.8.6", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", @@ -14180,6 +14337,36 @@ "path-exists": "^4.0.0" } }, + "inquirer": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", + "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -14243,6 +14430,13 @@ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { "ansi-regex": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + } } }, "which": { @@ -14256,14 +14450,25 @@ } }, "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.0.tgz", + "integrity": "sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.18.0" + "scheduler": "^0.19.0" + }, + "dependencies": { + "scheduler": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.0.tgz", + "integrity": "sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "react-error-overlay": { @@ -14314,9 +14519,9 @@ } }, "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", + "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==" }, "react-lifecycles-compat": { "version": "3.0.4", @@ -16838,9 +17043,9 @@ } }, "svg-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", - "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "svgo": { "version": "1.3.2", @@ -16878,9 +17083,9 @@ "integrity": "sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A==" }, "systemjs": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.2.4.tgz", - "integrity": "sha512-e++CM66/hoVcpWyfj2TVdj4pqMq8PQQLPgQUjb17W0uD7fpRYmO/ahmNfSDwtLoXxF03YUrBcLgg8RahwpZVig==" + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.2.5.tgz", + "integrity": "sha512-Jw1FOgzxG+wIi+ewEPyYKsqxR3IQOQWMwFh1o7C0VfLYoBcVDYSg8EFrKCisUD+5+/KecrDC+NSy4exkl7QRdw==" }, "systemjs-plugin-css": { "version": "0.1.37", @@ -16947,9 +17152,9 @@ } }, "terser": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.4.tgz", - "integrity": "sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w==", + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.6.tgz", + "integrity": "sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -17281,9 +17486,9 @@ "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==" }, "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tsutils": { "version": "3.17.1", @@ -17359,9 +17564,9 @@ } }, "typescript": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.2.tgz", - "integrity": "sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, "typescript-compare": { @@ -18341,9 +18546,9 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "4.41.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz", - "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==", + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", + "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", diff --git a/package.json b/package.json index 29f3d2d7d0a..ad5b589f95b 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "axios": "^0.19.2", "classnames": "^2.2.6", "connected-react-router": "^6.7.0", + "date-fns": "^2.10.0", "dom-serializer": "^0.2.2", "install": "^0.13.0", "loaders.css": "^0.1.2", diff --git a/setupTest.js b/setupTest.js new file mode 100644 index 00000000000..a7e699ce8ca --- /dev/null +++ b/setupTest.js @@ -0,0 +1,8 @@ +document.createRange = () => ({ + setStart: () => {}, + setEnd: () => {}, + commonAncestorContainer: { + nodeName: 'BODY', + ownerDocument: document, + }, +}); diff --git a/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx b/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx new file mode 100644 index 00000000000..8af027256f4 --- /dev/null +++ b/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx @@ -0,0 +1,61 @@ +import React from 'react'; + +import { + labelAuthor, + labelComment, + labelEntryTime, + labelPersistent, + labelSticky, +} from '../../../translatedLabels'; +import DetailsTable, { + getFormattedDate, + DetailsTableProps, + getYesNoLabel, +} from '.'; + +interface AcknoweldgementDetails { + author_name: string; + entry_time: string; + is_persistent: string; + is_sticky: string; + comment: string; +} + +type Props = Pick; + +const AcknowledgementDetailsTable = ({ endpoint }: Props): JSX.Element => { + const columns = [ + { + label: labelAuthor, + getFormattedString: ({ author_name }): string => author_name, + }, + { + label: labelEntryTime, + getFormattedString: ({ entry_time }): string => + getFormattedDate(entry_time), + }, + { + label: labelPersistent, + getFormattedString: ({ is_persistent }): string => + getYesNoLabel(is_persistent), + }, + { + label: labelSticky, + getFormattedString: ({ is_sticky }): string => getYesNoLabel(is_sticky), + }, + + { + label: labelComment, + getFormattedString: ({ comment }): string => comment, + }, + ]; + + return ( + + columns={columns} + endpoint={endpoint} + /> + ); +}; + +export default AcknowledgementDetailsTable; diff --git a/www/front_src/src/Resources/columns/State/DetailsTable/Downtime.tsx b/www/front_src/src/Resources/columns/State/DetailsTable/Downtime.tsx new file mode 100644 index 00000000000..b15a7bca977 --- /dev/null +++ b/www/front_src/src/Resources/columns/State/DetailsTable/Downtime.tsx @@ -0,0 +1,56 @@ +import React from 'react'; + +import { + labelAuthor, + labelFixed, + labelYes, + labelNo, + labelStartTime, + labelEndTime, + labelComment, +} from '../../../translatedLabels'; +import DetailsTable, { getFormattedDate, DetailsTableProps } from '.'; + +interface DowntimeDetails { + author_name: string; + is_fixed: boolean; + start_time: string; + end_time: string; + ccoment: string; +} + +type Props = Pick; + +const DowntimeDetailsTable = ({ endpoint }: Props): JSX.Element => { + const columns = [ + { + label: labelAuthor, + getFormattedString: ({ author_name }): string => author_name, + }, + { + label: labelFixed, + getFormattedString: ({ is_fixed }): string => + is_fixed ? labelYes : labelNo, + }, + { + label: labelStartTime, + getFormattedString: ({ start_time }): string => + getFormattedDate(start_time), + }, + { + label: labelEndTime, + getFormattedString: ({ end_time }): string => getFormattedDate(end_time), + }, + + { + label: labelComment, + getFormattedString: ({ comment }): string => comment, + }, + ]; + + return ( + columns={columns} endpoint={endpoint} /> + ); +}; + +export default DowntimeDetailsTable; diff --git a/www/front_src/src/Resources/columns/State/DetailsTable/index.tsx b/www/front_src/src/Resources/columns/State/DetailsTable/index.tsx new file mode 100644 index 00000000000..bd84ed1a372 --- /dev/null +++ b/www/front_src/src/Resources/columns/State/DetailsTable/index.tsx @@ -0,0 +1,105 @@ +import React, { useState, useEffect } from 'react'; + +import format from 'date-fns/format'; +import parseISO from 'date-fns/parseISO'; + +import { + TableContainer, + TableRow, + Paper, + Table, + TableHead, + TableCell, + TableBody, +} from '@material-ui/core'; +import { Skeleton } from '@material-ui/lab'; + +import { getData } from '../../../api'; +import { + labelSomethingWentWrong, + labelYes, + labelNo, +} from '../../../translatedLabels'; +import useCancelTokenSource from '../../../useCancelTokenSource'; + +const getFormattedDate = (isoDate): string => + format(parseISO(isoDate), 'MM/dd/yyyy H:m'); + +const getYesNoLabel = (value): string => (value ? labelYes : labelNo); + +const columnMaxWidth = 150; + +interface Column { + getFormattedString: (details) => string; + label: string; +} + +export interface DetailsTableProps { + endpoint: string; + columns: Array; +} + +const DetailsTable = ({ + endpoint, + columns, +}: DetailsTableProps): JSX.Element => { + const [details, setDetails] = useState(); + const { cancel, token } = useCancelTokenSource(); + + useEffect(() => { + getData({ endpoint, requestParams: { cancelToken: token } }) + .then((retrievedDetails) => setDetails(retrievedDetails)) + .catch(() => { + setDetails(null); + }); + + return (): void => cancel(); + }, []); + + const loading = details === undefined; + const error = details === null; + const success = !loading && !error; + + const tableMaxWidth = columns.length * columnMaxWidth; + + return ( + + + + + {columns.map(({ label }) => ( + {label} + ))} + + + + + {loading && ( + + + + )} + {success && + columns.map(({ label, getFormattedString }) => ( + + {getFormattedString(details)} + + ))} + {error && ( + + {labelSomethingWentWrong} + + )} + + +
+
+ ); +}; + +export { getFormattedDate, getYesNoLabel }; +export default DetailsTable; diff --git a/www/front_src/src/Resources/columns/State/index.tsx b/www/front_src/src/Resources/columns/State/index.tsx index 67d2658f857..aaed4ca5d72 100644 --- a/www/front_src/src/Resources/columns/State/index.tsx +++ b/www/front_src/src/Resources/columns/State/index.tsx @@ -1,33 +1,15 @@ -import React, { useState, useEffect } from 'react'; +import React from 'react'; -import { - Grid, - Avatar, - makeStyles, - fade, - Tooltip, - TableContainer, - TableRow, - Paper, - Table, - TableHead, - TableCell, - TableBody, -} from '@material-ui/core'; +import { Grid, Avatar, makeStyles, fade, Tooltip } from '@material-ui/core'; import { Person as IconAcknowledged } from '@material-ui/icons'; import { lime, purple } from '@material-ui/core/colors'; -import { Skeleton } from '@material-ui/lab'; import IconDowntime from '../icons/Downtime'; import { ColumnProps } from '..'; -import { - labelFixed, - labelAuthor, - labelStartTime, - labelEndTime, - labelComment, -} from '../../translatedLabels'; -import { getData } from '../../api'; +import DowntimeDetailsTable from './DetailsTable/Downtime'; +import AcknowledgementDetailsTable from './DetailsTable/Acknowledgement'; +import { labelInDowntime, labelAcknowledged } from '../../translatedLabels'; +import { Resource } from '../../models'; const useStyles = makeStyles((theme) => ({ stateChip: { @@ -48,96 +30,69 @@ const useStyles = makeStyles((theme) => ({ }, })); -interface DetailsTableProps { +interface StateChipProps { endpoint: string; - columns: Array; + className: string; + Icon: React.SFC; + DetailsTable: React.SFC<{ endpoint: string }>; + ariaLabel: string; } -interface DowntimeDetails { - author: string; - fixed: boolean; - start_time: string; - end_time: string; - comment: string; -} - -const DetailsTable = ({ +const StateChip = ({ endpoint, - columns, -}: DetailsTableProps): JSX.Element => { - const [details, setDetails] = useState(); - - useEffect(() => { - getData({ endpoint }) - .then((retrievedDetails) => setDetails(retrievedDetails)) - .catch(() => { - setDetails(null); - }); - }, []); - - const loading = details === undefined; - const error = details === null; - const success = !loading && !error; - - return ( - - - - - {columns.map((column) => ( - {column} - ))} - - - - - {loading && } - {success && - columns.map((column) => {details[column]})} - {error && oops!} - - -
-
- ); -}; - -const DowntimeDetailsTable = ({ endpoint }): JSX.Element => { - const columns = [ - labelAuthor, - labelFixed, - labelStartTime, - labelEndTime, - labelComment, - ]; - - return ( - columns={columns} endpoint={endpoint} /> - ); -}; - -const DowntimeChip = ({ endpoint }): JSX.Element => { + className, + Icon, + DetailsTable, + ariaLabel, +}: StateChipProps): JSX.Element => { const classes = useStyles(); return ( } + placement="left" + title={} classes={{ tooltip: classes.tooltip }} + enterDelay={0} > - - + + ); }; -const AcknowledgedChip = (): JSX.Element => { +const DowntimeChip = ({ resource }: { resource: Resource }): JSX.Element => { + const classes = useStyles(); + + return ( + + ); +}; + +const AcknowledgedChip = ({ + resource, +}: { + resource: Resource; +}): JSX.Element => { const classes = useStyles(); return ( - - - + ); }; @@ -147,12 +102,12 @@ const StateColumn = ({ Cell, row }: ColumnProps): JSX.Element => { {row.in_downtime && ( - + )} {row.acknowledged && ( - + )} diff --git a/www/front_src/src/Resources/columns/icons/__mocks__/Downtime.tsx b/www/front_src/src/Resources/columns/icons/__mocks__/Downtime.tsx new file mode 100644 index 00000000000..0d41cc41e18 --- /dev/null +++ b/www/front_src/src/Resources/columns/icons/__mocks__/Downtime.tsx @@ -0,0 +1,5 @@ +import React from 'react'; + +const Downtime = (): JSX.Element => Downtime; + +export default Downtime; diff --git a/www/front_src/src/Resources/columns/icons/downtime.icon.svg b/www/front_src/src/Resources/columns/icons/downtime.icon.svg index f0f314a83e8..c08900b955c 100644 --- a/www/front_src/src/Resources/columns/icons/downtime.icon.svg +++ b/www/front_src/src/Resources/columns/icons/downtime.icon.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/www/front_src/src/Resources/columns/index.tsx b/www/front_src/src/Resources/columns/index.tsx index 20d67a4c65c..8ad9587d321 100644 --- a/www/front_src/src/Resources/columns/index.tsx +++ b/www/front_src/src/Resources/columns/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Grid, Typography } from '@material-ui/core'; +import { Grid, Typography, makeStyles } from '@material-ui/core'; import { TABLE_COLUMN_TYPES, StatusChip, StatusCode } from '@centreon/ui'; @@ -16,6 +16,12 @@ import { import { Resource } from '../models'; import StateColumn from './State'; +const useStyles = makeStyles((theme) => ({ + resourceDetailsCell: { + padding: theme.spacing(0.5), + }, +})); + export interface ColumnProps { row: Resource; Cell: ({ children, width }: { children; width? }) => JSX.Element; @@ -46,10 +52,12 @@ const StatusColumn = ({ Cell, row }: ColumnProps): JSX.Element => { }; const ResourcesColumn = ({ Cell, row }: ColumnProps): JSX.Element => { + const classes = useStyles(); + return ( - - + + {row.icon ? ( { )} - + {row.name} {row.parent && ( - <> + - + - - {row.parent.name} - - + {row.parent.name} + )} diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index ce439e14d65..73ba63815e9 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -11,12 +11,16 @@ import { labelAll, labelResourceName, labelSearch, + labelInDowntime, + labelAcknowledged, } from './translatedLabels'; import columns from './columns'; import { Resource } from './models'; const mockedAxios = axios as jest.Mocked; +jest.mock('./columns/icons/Downtime'); + const getEndpoint = ({ state = 'unhandled_problems', sortBy = undefined, @@ -67,8 +71,10 @@ const fillEntities = (): Array => { code: 0, name: 'OK', }, - acknowledged: false, - in_downtime: false, + acknowledged: index % 2 === 0, + acknowledgement_endpoint: `/monitoring/acknowledgement/${index}`, + in_downtime: index % 3 === 0, + downtime_endpoint: `/monitoring/downtime/${index}`, duration: '1m', last_check: '1m', tries: '1', @@ -102,10 +108,10 @@ describe(Resources, () => { }); beforeEach(() => { - mockedAxios.get.mockResolvedValue({ data: retrievedListing }); + mockedAxios.get.mockResolvedValueOnce({ data: retrievedListing }); }); - it('lists with unhnandled_problems state by default', async () => { + it('executes a listing request with unhnandled_problems state by default', async () => { render(); await wait(() => @@ -121,6 +127,8 @@ describe(Resources, () => { await wait(() => expect(mockedAxios.get).toHaveBeenCalled()); + mockedAxios.get.mockResolvedValueOnce({ data: retrievedListing }); + selectOption(getByText(labelUnhandledProblems), labelResourceProblems); await wait(() => @@ -130,6 +138,8 @@ describe(Resources, () => { ), ); + mockedAxios.get.mockResolvedValueOnce({ data: retrievedListing }); + selectOption(getByText(labelResourceProblems), labelAll); await wait(() => @@ -150,6 +160,8 @@ describe(Resources, () => { columns .filter(({ sortable }) => sortable !== false) .forEach(({ id, label }) => { + mockedAxios.get.mockResolvedValueOnce({ data: retrievedListing }); + fireEvent.click(getByText(label)); expect(mockedAxios.get).toHaveBeenCalledWith( @@ -157,6 +169,8 @@ describe(Resources, () => { cancelTokenRequestParam, ); + mockedAxios.get.mockResolvedValueOnce({ data: retrievedListing }); + fireEvent.click(getByText(label)); expect(mockedAxios.get).toHaveBeenCalledWith( @@ -173,8 +187,6 @@ describe(Resources, () => { expect(mockedAxios.get).toHaveBeenCalled(); }); - mockedAxios.get.mockReset(); - mockedAxios.get.mockResolvedValueOnce({ data: { ...retrievedListing, @@ -235,6 +247,8 @@ describe(Resources, () => { it('executes a listing request with a limit param when the rows per page value is changed', () => { const { getByDisplayValue } = render(); + mockedAxios.get.mockResolvedValueOnce({ data: retrievedListing }); + fireEvent.change(getByDisplayValue('10'), { target: { value: '20' }, }); @@ -255,6 +269,8 @@ describe(Resources, () => { target: { value: `${searchableField}:${fieldSearchValue}` }, }); + mockedAxios.get.mockResolvedValueOnce({ data: retrievedListing }); + fireEvent.click(getByText(labelSearch)); expect(mockedAxios.get).toHaveBeenCalledWith( @@ -275,6 +291,8 @@ describe(Resources, () => { target: { value: searchValue }, }); + mockedAxios.get.mockResolvedValueOnce({ data: retrievedListing }); + fireEvent.click(getByText(labelSearch)); expect(mockedAxios.get).toHaveBeenCalledWith( @@ -287,4 +305,82 @@ describe(Resources, () => { cancelTokenRequestParam, ); }); + + it('displays downtime details when the downtime state chip is hovered', async () => { + const { getByLabelText, getByText } = render(); + + const entityInDowntime = entities.find(({ in_downtime }) => in_downtime); + + await wait(() => { + expect(mockedAxios.get).toHaveBeenCalled(); + }); + + mockedAxios.get.mockResolvedValueOnce({ + data: { + author_name: 'admin', + start_time: '2020-02-28T09:16:16', + end_time: '2020-02-28T09:18:16', + is_fixed: true, + comment: 'Set by admin', + }, + }); + + const chipLabel = `${entityInDowntime?.name} ${labelInDowntime}`; + + fireEvent.mouseEnter(getByLabelText(chipLabel)); + fireEvent.mouseOver(getByLabelText(chipLabel)); + + await wait(() => expect(mockedAxios.get).toHaveBeenCalled()); + + expect(mockedAxios.get).toHaveBeenLastCalledWith( + entityInDowntime?.downtime_endpoint, + cancelTokenRequestParam, + ); + + expect(getByText('admin')).toBeInTheDocument(); + expect(getByText('Yes')).toBeInTheDocument(); + expect(getByText('02/28/2020 9:16')).toBeInTheDocument(); + expect(getByText('02/28/2020 9:18')).toBeInTheDocument(); + expect(getByText('Set by admin')).toBeInTheDocument(); + }); + + it('displays acknowledgement details when an acknowledged state chip is hovered', async () => { + const { getByLabelText, getByText } = render(); + + const acknowledgedEntity = entities.find( + ({ acknowledged }) => acknowledged, + ); + + await wait(() => { + expect(mockedAxios.get).toHaveBeenCalled(); + }); + + mockedAxios.get.mockResolvedValueOnce({ + data: { + author_name: 'admin', + entry_time: '2020-02-28T09:16:16', + is_persistent: true, + is_sticky: false, + comment: 'Set by admin', + }, + }); + + const chipLabel = `${acknowledgedEntity?.name} ${labelAcknowledged}`; + + fireEvent.mouseEnter(getByLabelText(chipLabel)); + fireEvent.mouseOver(getByLabelText(chipLabel)); + + await wait(() => expect(mockedAxios.get).toHaveBeenCalled()); + + expect(mockedAxios.get).toHaveBeenLastCalledWith( + acknowledgedEntity?.acknowledgement_endpoint, + cancelTokenRequestParam, + ); + + expect(getByText('admin')).toBeInTheDocument(); + expect(getByText('02/28/2020 9:16')).toBeInTheDocument(); + expect(getByText('Yes')).toBeInTheDocument(); + expect(getByText('No')).toBeInTheDocument(); + expect(getByText('Set by admin')).toBeInTheDocument(); + }); }); diff --git a/www/front_src/src/Resources/models.ts b/www/front_src/src/Resources/models.ts index 32d9a06e629..b88ce55790b 100644 --- a/www/front_src/src/Resources/models.ts +++ b/www/front_src/src/Resources/models.ts @@ -30,7 +30,9 @@ export interface Resource { icon?: Icon; parent?: Parent; status: Status; + downtime_endpoint?: string; acknowledged: boolean; + acknowledgement_endpoint?: string; in_downtime: boolean; duration: string; tries: string; diff --git a/www/front_src/src/Resources/translatedLabels.ts b/www/front_src/src/Resources/translatedLabels.ts index d5ffaaa1795..3403baa9c95 100644 --- a/www/front_src/src/Resources/translatedLabels.ts +++ b/www/front_src/src/Resources/translatedLabels.ts @@ -1,19 +1,25 @@ import { I18n } from 'react-redux-i18n'; +export const labelAcknowledged = I18n.t('acknowledged'); export const labelAll = I18n.t('All'); export const labelAuthor = I18n.t('Author'); export const labelComment = I18n.t('Comment'); export const labelDuration = I18n.t('Duration'); export const labelEndTime = I18n.t('End time'); +export const labelEntryTime = I18n.t('Entry time'); export const labelFilter = I18n.t('Filter'); export const labelFixed = I18n.t('Fixed'); +export const labelInDowntime = I18n.t('in downtime'); export const labelLastCheck = I18n.t('Last check'); +export const labelNo = I18n.t('No'); +export const labelPersistent = I18n.t('Persistent'); export const labelResourceName = I18n.t('Resource name'); export const labelResourceProblems = I18n.t('Resource problems'); export const labelResources = I18n.t('Resources'); export const labelSearch = I18n.t('Search'); export const labelSeverity = I18n.t('Severity'); export const labelStatus = I18n.t('Status'); +export const labelSticky = I18n.t('Sticky'); export const labelTries = I18n.t('Tries'); export const labelInformation = I18n.t('Information'); export const labelSearchOnFields = I18n.t( @@ -35,3 +41,5 @@ export const labelUnhandledProblems = I18n.t('Unhandled problems'); export const labelUsePartialQuery = I18n.t( "It's also possible to use a partial query for the search value, by using a regular expression, for instance:", ); +export const labelYes = I18n.t('Yes'); +export const labelSomethingWentWrong = I18n.t('Oops, something went wrong'); diff --git a/www/front_src/src/Resources/useCancelTokenSource.ts b/www/front_src/src/Resources/useCancelTokenSource.ts new file mode 100644 index 00000000000..714cf8ac781 --- /dev/null +++ b/www/front_src/src/Resources/useCancelTokenSource.ts @@ -0,0 +1,11 @@ +import { useState } from 'react'; + +import axios, { CancelTokenSource } from 'axios'; + +const useCancelTokenSource = (): CancelTokenSource => { + const [cancelTokenSource] = useState(axios.CancelToken.source()); + + return cancelTokenSource; +}; + +export default useCancelTokenSource; From cd1b4870e4e3e8a419a90b68ced1673f9ce112b0 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Tue, 3 Mar 2020 18:18:25 +0100 Subject: [PATCH 32/36] fix API baseUrl --- www/front_src/src/Resources/api/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/api/index.ts b/www/front_src/src/Resources/api/index.ts index 81630b98a5e..5c4b4e98395 100644 --- a/www/front_src/src/Resources/api/index.ts +++ b/www/front_src/src/Resources/api/index.ts @@ -4,7 +4,7 @@ import { buildResourcesEndpoint } from './endpoint'; import { ResourceListing } from '../models'; const api = axios.create({ - baseURL: 'http://localhost:5000/api/beta/', + baseURL: './api/beta/', }); const getData = ({ endpoint, requestParams }): Promise => From 4cdb6922071a310c3b2cbb42f73652b20cf0d09d Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Thu, 5 Mar 2020 09:27:47 +0100 Subject: [PATCH 33/36] Update www/front_src/src/Resources/index.test.tsx Co-Authored-By: Kevin Duret --- www/front_src/src/Resources/index.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/index.test.tsx b/www/front_src/src/Resources/index.test.tsx index 73ba63815e9..ef79b591d46 100644 --- a/www/front_src/src/Resources/index.test.tsx +++ b/www/front_src/src/Resources/index.test.tsx @@ -359,7 +359,7 @@ describe(Resources, () => { data: { author_name: 'admin', entry_time: '2020-02-28T09:16:16', - is_persistent: true, + is_persistent_comment: true, is_sticky: false, comment: 'Set by admin', }, From b791afacec6a0cff6c5e5b472191fff688cbaf77 Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Thu, 5 Mar 2020 09:27:54 +0100 Subject: [PATCH 34/36] Update www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx Co-Authored-By: Kevin Duret --- .../Resources/columns/State/DetailsTable/Acknowledgement.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx b/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx index 8af027256f4..8b681cb1fc2 100644 --- a/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx +++ b/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx @@ -37,7 +37,7 @@ const AcknowledgementDetailsTable = ({ endpoint }: Props): JSX.Element => { { label: labelPersistent, getFormattedString: ({ is_persistent }): string => - getYesNoLabel(is_persistent), + getYesNoLabel(is_persistent_comment), }, { label: labelSticky, From e3384d4842f515abb1f64af03117e8ef181784ab Mon Sep 17 00:00:00 2001 From: Bruno d'Auria Date: Thu, 5 Mar 2020 09:28:03 +0100 Subject: [PATCH 35/36] Update www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx Co-Authored-By: Kevin Duret --- .../Resources/columns/State/DetailsTable/Acknowledgement.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx b/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx index 8b681cb1fc2..25aeba51593 100644 --- a/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx +++ b/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx @@ -16,7 +16,7 @@ import DetailsTable, { interface AcknoweldgementDetails { author_name: string; entry_time: string; - is_persistent: string; + is_persistent_comment: string; is_sticky: string; comment: string; } From 902c35ebbf0e0b274e8152a49267a4b2e3dfa093 Mon Sep 17 00:00:00 2001 From: Kevin Duret Date: Thu, 5 Mar 2020 09:53:50 +0100 Subject: [PATCH 36/36] Update www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx --- .../Resources/columns/State/DetailsTable/Acknowledgement.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx b/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx index 25aeba51593..12704cba7df 100644 --- a/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx +++ b/www/front_src/src/Resources/columns/State/DetailsTable/Acknowledgement.tsx @@ -36,7 +36,7 @@ const AcknowledgementDetailsTable = ({ endpoint }: Props): JSX.Element => { }, { label: labelPersistent, - getFormattedString: ({ is_persistent }): string => + getFormattedString: ({ is_persistent_comment }): string => getYesNoLabel(is_persistent_comment), }, {