diff --git a/package-lock.json b/package-lock.json index 98d7dfe..ed0d2a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,10 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@devexpress/dx-react-chart": "^2.7.6", + "@devexpress/dx-react-chart-bootstrap4": "^2.7.6", + "@devexpress/dx-react-chart-material-ui": "^2.7.6", + "@devexpress/dx-react-core": "^2.7.6", "@emotion/react": "^11.6.0", "@emotion/styled": "^11.6.0", "@mui/icons-material": "^5.1.1", @@ -1648,6 +1652,85 @@ "node": ">=6.9.0" } }, + "node_modules/@devexpress/dx-chart-core": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-chart-core/-/dx-chart-core-2.7.6.tgz", + "integrity": "sha512-hCxLJfueJk9bgKNAwecphJbAUlAO0IF8NRQQufSbacKKDa/bpE30oLpYpE58oL6hhiVdkCUPKwmpAkwcSfZaLg==", + "dependencies": { + "d3-array": "^2.4.0", + "d3-scale": "^3.2.0", + "d3-shape": "^1.3.7" + }, + "peerDependencies": { + "@devexpress/dx-core": "2.7.6" + } + }, + "node_modules/@devexpress/dx-core": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-core/-/dx-core-2.7.6.tgz", + "integrity": "sha512-ykcgRi1x4DwVK/5vXUhwK/S0FCwdIp5GmsG6x+4Xf24xVlVD+68ln0pK+y5tCVE4Scxzmq3m0YFtMpckUKQ6zA==" + }, + "node_modules/@devexpress/dx-react-chart": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-chart/-/dx-react-chart-2.7.6.tgz", + "integrity": "sha512-4fS95P4yd/0KQ1SOXjgHAkTUAtszOLC43ktNw4s7T1UytYpqyzYm/mZU4zK5nHrEz8C8l5uN7Jg5oXpqCd7WUw==", + "dependencies": { + "@devexpress/dx-chart-core": "2.7.6", + "d3-scale": "^3.2.0", + "d3-shape": "^1.3.7" + }, + "peerDependencies": { + "@devexpress/dx-react-core": "2.7.6", + "react": ">=16.10.2", + "react-dom": ">=16.10.2" + } + }, + "node_modules/@devexpress/dx-react-chart-bootstrap4": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-chart-bootstrap4/-/dx-react-chart-bootstrap4-2.7.6.tgz", + "integrity": "sha512-YkZgYlWryZLewDly7y119XHFuh6xp+t/WQmLwsvoLag9njeRXtpZ0pUe+8c1dgl3i5OoD94hdkWrlwtAvefMRg==", + "dependencies": { + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-popper": "^1.3.11" + }, + "peerDependencies": { + "@devexpress/dx-chart-core": "2.7.6", + "@devexpress/dx-react-chart": "2.7.6", + "@devexpress/dx-react-core": "2.7.6", + "react": ">=16.10.2" + } + }, + "node_modules/@devexpress/dx-react-chart-material-ui": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-chart-material-ui/-/dx-react-chart-material-ui-2.7.6.tgz", + "integrity": "sha512-+kmd3NNLwvdQAoUqM7S2qKGmmj77R/G00cmBLS0I5FiXRy5AsRByp+ybnDUZ0yDx/9Lc4KZ+1R75ijt75Kl3TQ==", + "dependencies": { + "clsx": "^1.0.4", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "@devexpress/dx-chart-core": "2.7.6", + "@devexpress/dx-react-chart": "2.7.6", + "@devexpress/dx-react-core": "2.7.6", + "@material-ui/core": ">=4.5.0", + "@material-ui/icons": ">=4.4.3", + "react": ">=16.10.2" + } + }, + "node_modules/@devexpress/dx-react-core": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-core/-/dx-react-core-2.7.6.tgz", + "integrity": "sha512-oKQhtUD0kGNjN5FCMaLE2mDodp1Q67KcC+VYbYdZ9EJUttLrZ5n+YuYZogaXZabGM07uHw+0NABq4GFg8XQcRg==", + "dependencies": { + "@devexpress/dx-core": "2.7.6", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">=16.10.2", + "react-dom": ">=16.10.2" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", @@ -1803,6 +1886,193 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, + "node_modules/@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "dependencies": { + "gud": "^1.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": ">=0.14.0" + } + }, + "node_modules/@material-ui/core": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.3.tgz", + "integrity": "sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles/node_modules/csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==", + "peer": true + }, + "node_modules/@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/system/node_modules/csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==", + "peer": true + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peer": true, + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, "node_modules/@mui/base": { "version": "5.0.0-alpha.55", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.55.tgz", @@ -2819,7 +3089,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -3241,6 +3510,73 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, + "node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/d3-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + }, + "node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, + "node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "dependencies": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + } + }, + "node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "dependencies": { + "d3-array": "2" + } + }, + "node_modules/d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "dependencies": { + "d3-time": "1 - 2" + } + }, "node_modules/debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -3261,7 +3597,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, "dependencies": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -3299,7 +3634,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "dependencies": { "object-keys": "^1.0.12" }, @@ -3980,7 +4314,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -4074,6 +4407,11 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, + "node_modules/gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -4103,7 +4441,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4115,7 +4452,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -4457,6 +4793,11 @@ "node": ">= 0.10" } }, + "node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -4494,7 +4835,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4538,7 +4878,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4657,7 +4996,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5262,7 +5600,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -5278,7 +5615,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -5601,6 +5937,12 @@ "node": ">=8" } }, + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", + "peer": true + }, "node_modules/portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -5893,6 +6235,33 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + }, + "peerDependencies": { + "react": "0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/react-popper/node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/react-redux": { "version": "7.2.6", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.6.tgz", @@ -6038,7 +6407,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -6761,6 +7129,11 @@ "node": ">= 0.6" } }, + "node_modules/typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -6875,6 +7248,14 @@ "node": ">= 0.8" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", @@ -8307,6 +8688,59 @@ "to-fast-properties": "^2.0.0" } }, + "@devexpress/dx-chart-core": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-chart-core/-/dx-chart-core-2.7.6.tgz", + "integrity": "sha512-hCxLJfueJk9bgKNAwecphJbAUlAO0IF8NRQQufSbacKKDa/bpE30oLpYpE58oL6hhiVdkCUPKwmpAkwcSfZaLg==", + "requires": { + "d3-array": "^2.4.0", + "d3-scale": "^3.2.0", + "d3-shape": "^1.3.7" + } + }, + "@devexpress/dx-core": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-core/-/dx-core-2.7.6.tgz", + "integrity": "sha512-ykcgRi1x4DwVK/5vXUhwK/S0FCwdIp5GmsG6x+4Xf24xVlVD+68ln0pK+y5tCVE4Scxzmq3m0YFtMpckUKQ6zA==" + }, + "@devexpress/dx-react-chart": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-chart/-/dx-react-chart-2.7.6.tgz", + "integrity": "sha512-4fS95P4yd/0KQ1SOXjgHAkTUAtszOLC43ktNw4s7T1UytYpqyzYm/mZU4zK5nHrEz8C8l5uN7Jg5oXpqCd7WUw==", + "requires": { + "@devexpress/dx-chart-core": "2.7.6", + "d3-scale": "^3.2.0", + "d3-shape": "^1.3.7" + } + }, + "@devexpress/dx-react-chart-bootstrap4": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-chart-bootstrap4/-/dx-react-chart-bootstrap4-2.7.6.tgz", + "integrity": "sha512-YkZgYlWryZLewDly7y119XHFuh6xp+t/WQmLwsvoLag9njeRXtpZ0pUe+8c1dgl3i5OoD94hdkWrlwtAvefMRg==", + "requires": { + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-popper": "^1.3.11" + } + }, + "@devexpress/dx-react-chart-material-ui": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-chart-material-ui/-/dx-react-chart-material-ui-2.7.6.tgz", + "integrity": "sha512-+kmd3NNLwvdQAoUqM7S2qKGmmj77R/G00cmBLS0I5FiXRy5AsRByp+ybnDUZ0yDx/9Lc4KZ+1R75ijt75Kl3TQ==", + "requires": { + "clsx": "^1.0.4", + "prop-types": "^15.7.2" + } + }, + "@devexpress/dx-react-core": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@devexpress/dx-react-core/-/dx-react-core-2.7.6.tgz", + "integrity": "sha512-oKQhtUD0kGNjN5FCMaLE2mDodp1Q67KcC+VYbYdZ9EJUttLrZ5n+YuYZogaXZabGM07uHw+0NABq4GFg8XQcRg==", + "requires": { + "@devexpress/dx-core": "2.7.6", + "prop-types": "^15.7.2" + } + }, "@discoveryjs/json-ext": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", @@ -8427,6 +8861,114 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, + "@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, + "@material-ui/core": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.3.tgz", + "integrity": "sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw==", + "peer": true, + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + } + }, + "@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "peer": true, + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "peer": true, + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==", + "peer": true + } + } + }, + "@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "peer": true, + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==", + "peer": true + } + } + }, + "@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peer": true, + "requires": {} + }, + "@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "peer": true, + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, "@mui/base": { "version": "5.0.0-alpha.55", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.55.tgz", @@ -9192,7 +9734,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -9521,6 +10062,73 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, + "d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "requires": { + "internmap": "^1.0.0" + } + }, + "d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "d3-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + }, + "d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "requires": { + "d3-color": "1 - 2" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + } + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "requires": { + "d3-array": "2" + } + }, + "d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "requires": { + "d3-time": "1 - 2" + } + }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -9533,7 +10141,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -9562,7 +10169,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -10100,7 +10706,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -10167,6 +10772,11 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -10189,14 +10799,12 @@ "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -10464,6 +11072,11 @@ } } }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, "interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -10492,7 +11105,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10524,7 +11136,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -10601,7 +11212,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11074,7 +11684,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -11083,8 +11692,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { "version": "4.1.2", @@ -11314,6 +11922,12 @@ "find-up": "^4.0.0" } }, + "popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", + "peer": true + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -11533,6 +12147,27 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "requires": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + }, + "dependencies": { + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + } + } + }, "react-redux": { "version": "7.2.6", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.6.tgz", @@ -11644,7 +12279,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -12200,6 +12834,11 @@ "mime-types": "~2.1.24" } }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -12291,6 +12930,14 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", diff --git a/package.json b/package.json index b1b6e40..95f8a5d 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,10 @@ "author": "", "license": "ISC", "dependencies": { + "@devexpress/dx-react-chart": "^2.7.6", + "@devexpress/dx-react-chart-bootstrap4": "^2.7.6", + "@devexpress/dx-react-chart-material-ui": "^2.7.6", + "@devexpress/dx-react-core": "^2.7.6", "@emotion/react": "^11.6.0", "@emotion/styled": "^11.6.0", "@mui/icons-material": "^5.1.1", diff --git a/src/App.jsx b/src/App.jsx index 9f3d3fe..c071b47 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -3,6 +3,8 @@ import { Route, Routes, Outlet } from 'react-router'; import { BrowserRouter, Link } from "react-router-dom"; import NavigationBar from "Components/NavigationBar"; import TasksListPage from "./pages/TaskListPage"; +import Tasks from "./pages/TaskListPage/Tasks" + import './styles.css'; import { Provider } from "react-redux"; @@ -20,7 +22,8 @@ function App () { {/* /tasks */} } /> {/* /tasks/self */} - My Tasks} /> + {/* My Tasks} /> */} + } /> {/* /dashboard */} Dashboard in construction} /> diff --git a/src/actions/tasks.js b/src/actions/tasks.js new file mode 100644 index 0000000..7564258 --- /dev/null +++ b/src/actions/tasks.js @@ -0,0 +1,34 @@ +import { SET_LOADER } from "./ui"; + +export const TASKS = '[TASKS]'; +export const FETCH_TASKS = `${TASKS} FETCH`; +export const SET_TASKS = `${TASKS} SET`; +export const POST_TASK = `${TASKS} POST`; +export const PUT_TASK = `${TASKS} PUT`; +export const ADD_NEW_TASK = `${TASKS} ADD`; + +export const fetchTasks = ({ query }) => ({ + type: FETCH_TASKS, + payload: query +}); + +export const setTasks = ({ list }) => ({ + type: SET_TASKS, + payload: list +}); + +export const postTask = ({ task }) => ({ + type: POST_TASK, + payload: task +}); + +export const putTask = ({ task, paramId }) => ({ + type: PUT_TASK, + payload: task, + paramId: paramId +}); + +export const addNewTasks = ({ list }) => ({ + type: ADD_NEW_TASK, + payload: list +}); \ No newline at end of file diff --git a/src/components/Chart/index.tsx b/src/components/Chart/index.tsx new file mode 100644 index 0000000..6a284bf --- /dev/null +++ b/src/components/Chart/index.tsx @@ -0,0 +1,47 @@ +import * as React from 'react'; +import Paper from '@material-ui/core/Paper'; +import { + Chart, + PieSeries, + Legend, + Title, + Tooltip, +} from '@devexpress/dx-react-chart-material-ui'; +import { Animation } from '@devexpress/dx-react-chart'; + + + + +const ChartPie = ({ list }) => { + const chartData = [ + { + title: "Completed", + value: list instanceof Array ? list.filter((task) => task.completed).length : 0 + }, + { + title: "In-Progress", + value: list instanceof Array ? list.filter((task) => !task.completed).length : 0 + }, + ]; + + + return ( + + + + + <Animation /> + <Tooltip /> + <Legend position={'bottom'} /> + </Chart> + </Paper> + ); +} + +export default ChartPie; \ No newline at end of file diff --git a/src/components/NavigationBar/index.jsx b/src/components/NavigationBar/index.jsx index 3097852..3171b70 100644 --- a/src/components/NavigationBar/index.jsx +++ b/src/components/NavigationBar/index.jsx @@ -1,18 +1,15 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; import AppBar from '@mui/material/AppBar'; import Box from '@mui/material/Box'; import CssBaseline from '@mui/material/CssBaseline'; import Divider from '@mui/material/Divider'; import Drawer from '@mui/material/Drawer'; import IconButton from '@mui/material/IconButton'; -import InboxIcon from '@mui/icons-material/MoveToInbox'; import List from '@mui/material/List'; import MenuIcon from '@mui/icons-material/Menu'; import Toolbar from '@mui/material/Toolbar'; import Typography from '@mui/material/Typography'; import { Outlet } from 'react-router'; -import { Link } from 'react-router-dom'; import ListItemLink from 'Components/ListItemLink'; import HomeIcon from '@mui/icons-material/Home'; @@ -38,6 +35,9 @@ function NavigationBar(props) { <ListItemLink to="/tasks" label="Tasks" icon={<TaskIcon />}/> <ListItemLink to="/tasks/self"label="My Tasks" icon={<TaskIcon />} /> <ListItemLink to="/dashboard" label="Dashboard" icon={<DashboardIcon />}/> + <ListItemLink to="/tasks" label="Tasks" icon={<TaskIcon />} /> + <ListItemLink to="/tasks/self" label="My Tasks" icon={<TaskIcon />} /> + <ListItemLink to="/dashboard" label="Dashboard" icon={<DashboardIcon />} /> </List> <Divider /> <List> @@ -116,12 +116,4 @@ function NavigationBar(props) { ); } -// ResponsiveDrawer.propTypes = { -// /** -// * Injected by the documentation to work in an iframe. -// * You won't need it on your project. -// */ -// window: PropTypes.func, -// }; - export default NavigationBar; diff --git a/src/components/Timer/index.js b/src/components/Timer/index.js deleted file mode 100644 index 698ac55..0000000 --- a/src/components/Timer/index.js +++ /dev/null @@ -1,45 +0,0 @@ -import React, { Component } from "react"; - -// class based component -class Timer extends Component { - - constructor(props) { - console.log('constructor exec'); - super(props); - this.state = { - time: new Date() - }; - } - - // componentDidMount - componentDidMount() { - console.log('componentDidMount exec'); - setInterval(() => { - this.setState({ - time: new Date() - }) - }, 1000); - } - - componentDidUpdate() { - console.log('componentDidUpdate exec'); - } - - shouldComponentUpdate() { - return true; - } - - componentWillUnmount() { - // remove the interval here - } - - render() { - console.log('render exec'); - const { time } = this.state; - return ( - <div>{`Time: ${time.toLocaleString()}`}</div> - ); - } -} - -export default Timer; diff --git a/src/components/Timer/index.jsx b/src/components/Timer/index.jsx new file mode 100644 index 0000000..6544780 --- /dev/null +++ b/src/components/Timer/index.jsx @@ -0,0 +1,65 @@ +import React, { Component } from "react"; +import { Box } from "@mui/material"; +const styles = { color: 'white', backgroundColor: 'blue' } + +class Timer extends Component { + + constructor(props) { + console.log('constructor exec'); + super(props); + this.state = { + time: new Date() + }; + } + + componentDidMount() { + var countDownDate = new Date(this.state.time).getTime(); + + setInterval(() => { + var now = new Date().getTime(); + var distance = now - countDownDate; + var days = Math.floor(distance / (1000 * 60 * 60 * 24)); + var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); + var seconds = Math.floor((distance % (1000 * 60)) / 1000); + var format = `${days} d ${hours} h ${minutes} m ${seconds} s` + this.setState({ + format: format + }) + }, 1000); + } + + componentDidUpdate() { + console.log('componentDidUpdate exec'); + } + + shouldComponentUpdate() { + return true; + } + + componentWillUnmount() { + // remove the interval here + } + + render() { + const { format } = this.state; + return ( + <div id="timer" style={styles}> + <Box + sx={{ + display: 'flex', + alignItems: 'center', + width: 'fit-content', + bgcolor: 'background.paper', + color: 'text.secondary', + fontSize: 18 + }} + > + {`Duration: ${format}`} + </Box> + </div> + ); + } +} + +export default Timer; diff --git a/src/middlewares/index.js b/src/middlewares/index.js new file mode 100644 index 0000000..a8be22a --- /dev/null +++ b/src/middlewares/index.js @@ -0,0 +1,40 @@ +import { apiFailure, apiStart, apiSuccess, API_START } from "../actions/api"; + +const TASKS_API_GET = "https://davidvida-tasks-service.herokuapp.com/api/v1/task"; +export const apiMiddleware = ({ dispatch }) => (next) => (action) => { + next(action) + switch (action.type) { + case API_START: + const { method, body, url } = action.meta; + if (method === "POST" || method === "PUT") { + fetch(action.meta.url, { + method: action.meta.method, + body: JSON.stringify(action.payload), + headers: { 'Content-Type': 'application/json' } + } + ) + .then(response => response.json()) + .then(data => { + dispatch(apiStart({ body: {}, method: 'GET', url: TASKS_API_GET })); + }) + .catch(function (error) { + dispatch(apiFailure({ error: error })); + }); + } else { + + if (method === "GET") { + fetch(url, { method: method, body: body }) + .then(response => response.json()) + .then(data => { + dispatch(apiSuccess({ response: data })); + }) + .catch(function (error) { + dispatch(apiFailure({ error: error })); + }); + } + } + break; + default: + break; + } +} diff --git a/src/middlewares/tasks.js b/src/middlewares/tasks.js new file mode 100644 index 0000000..b683134 --- /dev/null +++ b/src/middlewares/tasks.js @@ -0,0 +1,39 @@ +import { apiStart, API_FAILURE, API_SUCCESS } from "../actions/api"; +import { FETCH_TASKS, POST_TASK, PUT_TASK, setTasks } from "../actions/tasks"; +import { setLoader, setNotification } from "../actions/ui"; + +const TASKS_API_GET = "https://davidvida-tasks-service.herokuapp.com/api/v1/task"; +const TASKS_API_POST = "https://davidvida-tasks-service.herokuapp.com/api/v1/task"; + +export const tasksMiddleware = () => (next) => (action) => { + next(action); + switch (action.type) { + case FETCH_TASKS: + next(apiStart({ body: {}, method: 'GET', url: TASKS_API_GET })); + next(setLoader(true)); + break; + case API_SUCCESS: + next(setTasks({ list: action.payload })); + next(setLoader(false)); + break; + case API_FAILURE: + next(setNotification({ error: action.payload })); + next(setLoader(false)); + break; + case POST_TASK: + next(apiStart({ body: action.payload, method: 'POST', url: TASKS_API_POST })); + next(apiStart({ body: {}, method: 'GET', url: TASKS_API_GET })); + next(setLoader(true)); + break; + case PUT_TASK: + next( + apiStart( + { + body: action.payload, + method: "PUT", + url: `${TASKS_API_POST}/${action.paramId}` + } + ) + ); + } +}; \ No newline at end of file diff --git a/src/pages/TaskListPage/Tasks/index.tsx b/src/pages/TaskListPage/Tasks/index.tsx new file mode 100644 index 0000000..eeff1fc --- /dev/null +++ b/src/pages/TaskListPage/Tasks/index.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import TodoListContainer from "../TodoListContainer"; + +const MyTasksListPage = () => { + return ( + <TodoListContainer userName={"ER"} /> + ); +}; + +export default MyTasksListPage; \ No newline at end of file diff --git a/src/pages/TaskListPage/TodoList/index.jsx b/src/pages/TaskListPage/TodoList/index.jsx index 1ca5639..2211d9b 100644 --- a/src/pages/TaskListPage/TodoList/index.jsx +++ b/src/pages/TaskListPage/TodoList/index.jsx @@ -1,11 +1,11 @@ import React from 'react'; -import { Container, Divider, List, Paper } from '@mui/material'; -// import Timer from '../Timer'; -import Timer from 'Components/TimerFunction'; +import { Box, Container, Divider, List, Paper } from '@mui/material'; import TodoListItem from '../TodoListItem'; import FormAddTask from '../FormAddTask'; import Toggle from 'Components/Toggle'; import LoadingIndicator from 'Components/LoadingIndicator'; +import ChartPie from '../../../components/Chart'; +import Typography from '@mui/material/Typography'; /* * class based component @@ -15,43 +15,93 @@ class TodoList extends React.Component { super(props); } + getListByUser(taskList, userName) { + let listByUser = []; + + if (!taskList instanceof Array) { + return listByUser + } + if (!(userName === "All") && taskList instanceof Array) { + taskList.filter(item => { + if (item.user === userName) { + + listByUser.push(item); + } + }) + return listByUser + } + return taskList + }; + //render method render() { - const { list, filterApplied, toggleTimer, toggleListItem, performAddTask, showLoader } = this.props; + const { list, filterApplied, toggleListItem, performAddTask, showLoader, performUpdateTask, userName } = this.props; + const listByUser = this.getListByUser(list, userName); return ( - <Container> - {/* <div> - <span> - <input type="checkbox" id="hideTimer" onChange={this.toggleTimer} defaultChecked={hideTimer}/> - <label htmlFor="hideTimer">Hide Timer</label> - </span> - { !hideTimer && <Timer /> } - - </div> */} - <FormAddTask onSubmitCallback={performAddTask} /> - <LoadingIndicator show={showLoader} /> - { list.length > 0 && ( - <> + <> + <Typography + component="div" + variant="body1" + style={{ + height: 100, + width: '100%', + position: 'relative', + }} + > + <Box + sx={{ + display: 'grid', + justifyContent: 'space-between', + bgcolor: 'grey.700', + color: 'white', + p: 2, + position: 'right', + top: 20, + left: '40%', + + }} + > + {`Username: ${userName} `} + </Box> + + </Typography> + <Container> + <Box sx={{ display: 'flex', justifyContent: 'space-between', top: 20, p: 1.5 }} > + <FormAddTask onSubmitCallback={performAddTask} /> <Toggle active={filterApplied} label="Hide completed" onToggle={toggleListItem} /> - - <Paper> - <List> - {list.filter(item => (!filterApplied ? true : !item.completed)).map((item, index, array) => { - return ( + </Box> + <Box> + <Box sx={{ display: "grid", justifyContent: 'space-between', gap: 2, gridTemplateColumns: "repeat(3, 2fr)", border: '2px grey' }}> + <Box sx={{ gridColumn: "1/3", }}> + <LoadingIndicator show={showLoader} /> + {listByUser.length > 0 && ( <> - <TodoListItem key={item.id} completed={item.completed} name={item.name} /> - { index < array.length -1 && <Divider /> } + <Paper> + <List> + {listByUser.filter(item => (!filterApplied ? true : !item.completed)).map((item, index, array) => { + return ( + <> + <TodoListItem key={item.id} item={item} performUpdateTask={performUpdateTask} /> + {index < array.length - 1 && <Divider />} + </> + ) + })} + </List> + </Paper> </> - ) - })} - </List> - </Paper> - </> - )} - </Container> + )} + </Box> + + <Box sx={{ gridColumn: "3/3" }}> + {((listByUser.length === 0)) ? <></> : <ChartPie list={listByUser} />} + + </Box> + </Box> + </Box> + </Container> + </> ); } - } export default TodoList; diff --git a/src/pages/TaskListPage/TodoListContainer/index.jsx b/src/pages/TaskListPage/TodoListContainer/index.jsx index dc77789..addb7c5 100644 --- a/src/pages/TaskListPage/TodoListContainer/index.jsx +++ b/src/pages/TaskListPage/TodoListContainer/index.jsx @@ -9,7 +9,8 @@ class TodoListContainer extends Component { this.state = { list: [], filterApplied: false, - hideTimer: false + hideTimer: false, + userName: this.props.userName }; this.toggleTimer = this.toggleTimer.bind(this); this.toggleListItem = this.toggleListItem.bind(this); @@ -35,6 +36,19 @@ class TodoListContainer extends Component { }); } + getListByUser() { + let listByUser = []; + if (!userName === "All") { + this.props.list.filter(item => { + if (item.user === userName) { + listByUser.push(item); + } + }) + this.listByUser + } + return this.props.list.filter + }; + toggleTimer(event) { this.setState({ hideTimer: event.currentTarget.checked @@ -62,6 +76,23 @@ class TodoListContainer extends Component { }); } + + performUpdateTask(item) { + let body = {}; + if (!item.startDate && !item.completed) { + body = { + "startDate": new Date().toISOString(), + "completed": false + }; + } else if (item.startDate && !item.completed) { + body = { + "endDate": new Date().toISOString(), + "completed": true + }; + } + return this.props.putTask(body, item._id); + } + render() { const { filterApplied } = this.state; const { list, loading } = this.props; @@ -73,6 +104,8 @@ class TodoListContainer extends Component { toggleTimer={this.toggleTimer} toggleListItem={this.toggleListItem} performAddTask={this.performAddTask} + performUpdateTask={this.performUpdateTask} + userName={this.state.userName} /> ) } @@ -87,7 +120,8 @@ const mapStateToProps = state => { const mapDispacthToProps = dispatch => { return { - setLoaderProp: (show) => dispatch(setLoader(show)) + fetchTasks: () => dispatch(fetchTasks({ query: {} })), + AddTask: (task) => dispatch(postTask({ task: task })), } }