From d8d60be3b387aca270bbcaa391c4b04199e96cba Mon Sep 17 00:00:00 2001 From: bvaibhav23 Date: Tue, 30 May 2023 10:13:48 +0530 Subject: [PATCH] update --- package-lock.json | 567 +++++++++++++++++++++++++ package.json | 8 + public/favicon.ico | Bin 3870 -> 0 bytes public/index.html | 32 +- public/logo192.png | Bin 5347 -> 0 bytes public/logo512.png | Bin 9664 -> 0 bytes public/manifest.json | 25 -- public/pie_statistics_icon.png | Bin 0 -> 15373 bytes src/App.css | 38 -- src/App.js | 43 +- src/App.test.js | 8 - src/Dynamic Data/DynamicData.js | 17 + src/Dynamic Data/dataContext.js | 28 ++ src/Pages/Customers.js | 13 + src/Pages/Dashboard/Cards.js | 17 + src/Pages/Dashboard/DashboardCard.js | 30 ++ src/Pages/Dashboard/DashboardTable.js | 59 +++ src/Pages/Dashboard/DiscountChart.js | 110 +++++ src/Pages/Dashboard/RatingChart.js | 83 ++++ src/Pages/Dashboard/RevenueChart.js | 79 ++++ src/Pages/Dashboard/index.js | 88 ++++ src/Pages/Inventory/InventoryFilter.js | 52 +++ src/Pages/Inventory/InventoryTable.js | 106 +++++ src/Pages/Inventory/index.js | 35 ++ src/Pages/Orders/index.js | 52 +++ src/components/SideBar.js | 175 ++++++++ src/index.css | 7 +- src/index.js | 6 - src/logo.svg | 1 - src/reportWebVitals.js | 13 - src/setupTests.js | 5 - 31 files changed, 1550 insertions(+), 147 deletions(-) delete mode 100644 public/favicon.ico delete mode 100644 public/logo192.png delete mode 100644 public/logo512.png delete mode 100644 public/manifest.json create mode 100644 public/pie_statistics_icon.png delete mode 100644 src/App.test.js create mode 100644 src/Dynamic Data/DynamicData.js create mode 100644 src/Dynamic Data/dataContext.js create mode 100644 src/Pages/Customers.js create mode 100644 src/Pages/Dashboard/Cards.js create mode 100644 src/Pages/Dashboard/DashboardCard.js create mode 100644 src/Pages/Dashboard/DashboardTable.js create mode 100644 src/Pages/Dashboard/DiscountChart.js create mode 100644 src/Pages/Dashboard/RatingChart.js create mode 100644 src/Pages/Dashboard/RevenueChart.js create mode 100644 src/Pages/Dashboard/index.js create mode 100644 src/Pages/Inventory/InventoryFilter.js create mode 100644 src/Pages/Inventory/InventoryTable.js create mode 100644 src/Pages/Inventory/index.js create mode 100644 src/Pages/Orders/index.js create mode 100644 src/components/SideBar.js delete mode 100644 src/logo.svg delete mode 100644 src/reportWebVitals.js delete mode 100644 src/setupTests.js diff --git a/package-lock.json b/package-lock.json index 73c75b5..47d6f99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,19 @@ "name": "react-chart-js", "version": "0.1.0", "dependencies": { + "@emotion/react": "^11.11.0", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.16", + "@mui/material": "^5.13.1", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "chart.js": "^4.3.0", + "chartjs-plugin-datalabels": "^2.2.0", "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.11.2", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" } @@ -2137,6 +2145,158 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.0.tgz", + "integrity": "sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -2999,11 +3159,272 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.1.tgz", + "integrity": "sha512-xrkDCeu3JQE+JjJUnJnOrdQJMXwKhbV4AW+FRjMIj5i9cHK3BAuatG/iqbf1M+jklVWLk0KdbgioKwK+03aYbA==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/is-prop-valid": "^1.2.0", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@popperjs/core": "^2.11.7", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.1.tgz", + "integrity": "sha512-qDHtNDO72NcBQMhaWBt9EZMvNiO+OXjPg5Sdk/6LgRDw6Zr3HdEZ5n2FJ/qtYsaT/okGyCuQavQkcZCOCEVf/g==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.11.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.16.tgz", + "integrity": "sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.1.tgz", + "integrity": "sha512-qSnbJZer8lIuDYFDv19/t3s0AXYY9SxcOdhCnGvetRSfOG4gy3TkiFXNCdW5OLNveTieiMpOuv46eXUmE3ZA6A==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/base": "5.0.0-beta.1", + "@mui/core-downloads-tracker": "^5.13.1", + "@mui/system": "^5.13.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@types/react-transition-group": "^4.4.6", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/private-theming": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", + "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.13.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.12.3", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.12.3.tgz", + "integrity": "sha512-AhZtiRyT8Bjr7fufxE/mLS+QJ3LxwX1kghIcM2B2dvJzSSg9rnIuXDXM959QfUVIM3C8U4x3mgVoPFMQJvc4/g==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.10.8", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.1.tgz", + "integrity": "sha512-BsDUjhiO6ZVAvzKhnWBHLZ5AtPJcdT+62VjnRLyA4isboqDKLg4fmYIZXq51yndg/soDK9RkY5lYZwEDku13Ow==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/private-theming": "^5.13.1", + "@mui/styled-engine": "^5.12.3", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.1.tgz", + "integrity": "sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -3113,6 +3534,23 @@ } } }, + "node_modules/@popperjs/core": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", + "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz", + "integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -4199,6 +4637,22 @@ "@types/react": "*" } }, + "node_modules/@types/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -5679,6 +6133,25 @@ "node": ">=10" } }, + "node_modules/chart.js": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.0.tgz", + "integrity": "sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=7" + } + }, + "node_modules/chartjs-plugin-datalabels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz", + "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==", + "peerDependencies": { + "chart.js": ">=3.0.0" + } + }, "node_modules/check-types": { "version": "11.2.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz", @@ -5777,6 +6250,14 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6688,6 +7169,15 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -8068,6 +8558,11 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -8697,6 +9192,19 @@ "he": "bin/he" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -14217,6 +14725,15 @@ "node": ">=14" } }, + "node_modules/react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -14364,6 +14881,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz", + "integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==", + "dependencies": { + "@remix-run/router": "1.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz", + "integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==", + "dependencies": { + "@remix-run/router": "1.6.2", + "react-router": "6.11.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -14436,6 +14983,21 @@ } } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -15576,6 +16138,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/sucrase": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", diff --git a/package.json b/package.json index 9732411..607cd03 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,19 @@ "version": "0.1.0", "private": true, "dependencies": { + "@emotion/react": "^11.11.0", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.16", + "@mui/material": "^5.13.1", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "chart.js": "^4.3.0", + "chartjs-plugin-datalabels": "^2.2.0", "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.11.2", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" }, diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/public/index.html b/public/index.html index aa069f2..af76a7f 100644 --- a/public/index.html +++ b/public/index.html @@ -2,42 +2,16 @@ - + - - - - - React App + content="Web site created using create-react-app" /> + React | Chart
- diff --git a/public/logo192.png b/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index 080d6c7..0000000 --- a/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/public/pie_statistics_icon.png b/public/pie_statistics_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..23da6621657e183c337a000214c3cf9fa21d6318 GIT binary patch literal 15373 zcmeIZc{tSX_c(lyUG^4)5ET*9%G)vu5n0+S$&wb8q_PfXX|tB)ZELZslwI~QhC+$T zmVMtvGng=#G4tG``n=zt-#^cFJ~~ITK=OZX~clVgmp` z;JC5DDFE2uM>fF21^+Dgep`iqcyAfodH}$;iS>&B&l1D|kOjvLj-2sLASI%1ZMIHI z@&EdypZxeK>2dc{9p~J~Ixb6jA^ly!Ay2~l6T7Ve&px$SMW2n0T}hWgK-&I?e)KGkTUao|92u1O(Gj8uRaj0=u4krEt%{(+z$&-4 zwlYkpeaw?ru1r{r2wiofBhX^jvT|~1qq>iq1`_AD(u44UOqmZdwYKcu9CC8b!ftD{ zDkcqi+kcs9MbLfErHwK$sI8Vru9IQ@a6!`CI@x52E!*+Q2Oy$daw*MUz}42Z2O=UO z>KCGwYmg2SSmD90)9gumS??`2(Aht->tWWaaSCC;;gvUf7TwxSx zT;Ej=i~Z@hHpe6 zVUZRMUT`?!kjDbwAaB{7Nu87D4rPBtS`a1YS`_RYH0YOiyvWG7h9w6FUwy%Wvm>Li zm*Z>j-fce|n1o^ZpkP-YA+Ob+#IjNA@9zZUx!CW?)uOUT&-1M4PR0Uzz-pp!t&a$vK;CzR3tiX zM=5n5B<};~&Yd$jcI;RlW+G0-4o^o}Bsvna(2>f8y5gGoBUe3_)nvPLaRGgwrE|Pk!2`dxNL#&r|Qq$A* zKR;2|r(qzR$`3(I+PpObn|*m1*{Ft@53348J{h0q_R=Q1%wvgTDG}M^{Jy@v+N`Oh zb7#)%*kzueXq9cVT|!dQU;A~kVUnVawY7q%%DEl8PCSt{F*U8rwk_PKK(Cy-_&{v? z;N8fGH)Ulu{8Acw=Ly0hC%cmqy_}8z9tF^7o@W_$7uV23wZf|dQ?k#Z}sSVjQ zGTok4i_ojy4)}urZgYjtEO~xtHl(||+xh(iUgw%Xfwa`rBel-z{T3qN`~$F8iVf_b zQD;lt=BnyN~E@0=d>CIHWWVLO{;Rjy0d3cI`Vb22Of$#~+y4FcE@P8u9~`B63A%_&EE*oSP# zk3XbbdS6mFem*_I;2MXoRQBW-}3_|M${lHoa%j(el&N)1I?dK$rtJFAUy&a7RR*ayUCTQ0b5NQPWHLjWH9E zpPGFld$-D#(}5FVM{I3-xS53w${X&8YzOGyl(vK5J?9i_SG|~n{#n)`e0&pO+s4P8 z{Q`gs^?Uk3wlTACL22#R{)gE)HvZzqMIWF&JL*-Oh8kv@w_4#)w;I*qj#G2|N(w@p z4`f}aY?sD1(B$uddfcT|el%u$yj&WwY1awiZQHiteKhr)exL9rcXeTjs%?S>w)#s1 z@3BYX+jH$JUip`@bFlrwl)fJ%>9{*h)`rMcIU=p)WYyFx&f`6gQ**iJbk@b<-G>Lj zcPZfR#n{-i*I4XF`4nt`q>73P-Uo@x`^|-2oYjTf=g2XioSg=V;m7p6y-SuC+AO?e z*udbrU=OK`J$4`Cy!oOt&r!^W+$RFVB5^=G;G#rNu+CkAxClNS`$UKfhK;U!YBE92fTVVU1L`JEipZ4N@< zdwNf?^Sim>60+9TJ7#8PU)AJ*j6TaeHT&nDFaNu&B7xAJP2SFwGc_^6qg64Gd(mFS z&S&W>J>|@?!~4gIMM1U1y71^sPJDUpJl+s%kC7QXU=%LZP4b|af)_Djf^R)!!nbKz zX=CVJ58FA1kn4xW8xh-QU%rzW1Cd0XYk%j^)D>r>s&D>!cZ^8st?+RlF}aNo(nK_C zm6|czwie|&r&_zA7spveSX^tsJjwp^1Lf#*9M6Wd*)Hs1Nyc&QFZnOtWR{VzxC zn%4*k6HWYT1Z++_=$5_mjd7zz=W($u2(BvyHYGK6`|Y-E{r8`Pd<&H8aKi=8k{=eR zww+`#(Co2J%md%$xeFt&wDH`B5JQisR(TsA9!mVEez{?@nAHv(5~`oV6ynzWh@pDl zL|A>-cnZQ+4r_^ItLCzc-y>>!2py(RJk8<6O)6B zE7+fTv`wi)b*sD}LDN3K??%*AaP}sP+#4J7a^7MNX(8rjq_eV%#(lSlirzUYYjX^f zZZMGTS|7RnLxO8eZ0yd4#>P4#ns&p!7v2SjIv8W?T#LhAz=Ycrq?~y`{VGCD`*dOO zDF?1HS5dWOe7SOMsaG}o%-kl*tht%lV|D#1<#D$H(rS+~f>~~R=p{42v-6_@c-Trg3sZ+Q9?3wbNhgcg0ai=rPH5nbfk3x^$9xp0xqVj^u z22;*>p{>~jE~o<&@2_*^ojQ3k6&;+_)z^1prF;_z9PI>=VTZJ|dJ7yw)9#(0Z}I;r zB}wPNX(c^JTA)-ONgn?CaEpM$<$I5PUVR%b_n6#+^nnbbivx;Q_S%i*fYSZrhW;h) zuZ4xws-~Cc6hPnYugZCfd0|aRX5YhD0fz@5zr>!cnv*UHC_gg^1Z^XX$g#~6p;zy( zK3(I$*)lTy-WXfc&kgkyyV~3I4;k_R*WR7re6o#`JEI@$FcMmou}t7^}! z<)qQ&CuuBZEY9Q4sT<5^rNf|1HQR4)qY}c>Qr+ychGoWB%r+Vin37WC#t|f+6Ao7- z)?j<_$9sZw5h+aqmoJ;p^asdWhHTHUrCj=Ma?<~2>fepJ6(&G$(pM8?W@Wi;W4PxW zc4cuz(!R*}8kS$;fbsX9?<^a~R&7I&0K>PsI)<4ap4}nUB!Rs(X^gelC0;SkdoJ4n z54bq*3_LwOyZl@S7aKoZms#MzX%f|MCba4f3*MdE!vPRZdmQ+2hN13lx-&gHFZTp# zBb?&m<5f@gD0obKzCBzD2y6&FARgAqmh$G!r;=eL+BtRkYh>XXFDU$MT^9c!z$f%4 zkmX!o6c2CcdT~lhb=cWbQ+uGU;M&F@&xSxu+&ucz}Y|t4P(oyDQ zboNCT^=U!vQ(x~7(Axt|EFbM6yDwux@N_QR3r-+U+S98FdM5GJAXl+z#X z&p^|bG*@YefnTQ_16}zS?zg^=Reg5w6it}w0Uk*nFg~HIIG6ME`}a8N7uUSXiK$s` zU-otEr`h$A^kSo<(~EA6hhRIAwlC4aG)<82YMp!jdly^=LyL7~*n1G15jAfxQ~uy8 zGsK~HD6Vedm;fYehfc*u87^EQ2TZcmaV$V>dYC9B}mxa-|ByY zAFQ+^+mS@O4!@aDEC-G$wg1W^`6`(ql|Kq!3yVgW%GP_a$!mi*9kS5Ao4~u07cXj~ z28HHCf9tQ)IZ#h~oi#x5=_YI>LC;wYbDmxXM0EcTB0e0Sn5rUkxYF~^)1`N2Acfx+ z>cg*dsDSIPuCbysF}$2TK_&5QvZ7(vWMVMIWo2DU5R3FbST>7_Dyejg`d@LC>2cVA zQ?N)1hN&f~rZwX0vxANQwfGb`Uw+5%TI!X>FTzwc6f+BZlM8nV=43rVFJ*LY4dHU& zDb4WHf!99<3;4_VeRl<`vS= zU_z>Cn`szkF7>+iF8Lz{g8p!d7qn+FSLR9B!|Zx;7Ce3B9vKv~C-*Y@1~V*@OGrL! zbi_ZfVP$a*Yu&^Em!(nPWIm@<2jka1OoOOy2YB46{i ze<)YA$G<4ju#c<` zf5B#*m#Ol#&}i+pAgCEc!=yfkfI;B@D7hzh^_S;|V?|v?kIZ8EaKm{Yp&{J;-zb_} zT2hNN^k;o(e}RCBJd2f&yw%r!YoQ*@d@*#J7cXDhI_z*DZj`NY%o7k0XqXX8(fVhJ z@f{Bj6}7)hJ1kmt>vQUR8LMYkYPgzD|50Tq5=u&M3C3|>lv{K^o1w;&qo3}+!+yy- zS=WSSiecwu;e)RD1P=}t6&k}XQI^?A?EMdh9d)k9_~J2%!UziKcy!FtQ*9^5-MoLyfiMUX z+;-|*ilaD2(@9})NoaZwD}f#8-nuo8+7FAIH*71Kb!IyAd_1rAlJYOq82I~FxHTpJ zF+4n=y!wpj>ralHP}D{jpTSti9oCZ|QeXAVs$P7IjA;+&Ke%A+^z^wDWwG!M-6=?9 zk2sby@2$`{@6{pgXax)J8^&612!}!lC(5_|5ocb6?5C!tQiA2Nh|g`hKa%5{=!sr! zUFs&ZlLHSoCKzHG<#crVTaJ)kRCtr#UPk`ew;Qqd;s^dlzMVQcW_?vf4zy;MYYN2-e19s>S1g1XSn~N;k!2Nn;34|c zVbC``_9;4C@M=b)rpGH4+J9UkFF;)ojx{`2;rVE3xJeo7lbw9<^fhd*LuF5i7oYvl z;UJm64kh$Q0%H@fEPk482;P_#ez)a2;Yu+M=jDpY%w=WYSoAq-YnNX9!`$tx6#Z8` zyc;1KB{pnn`#RoSb<_=;tX#!J?olwhR@H+}6`O)}o&VhAX5iYHd-mLG_YU*1*s7+= zd?#WnMrF^QBCjt;JB7jVKeGM;Sn3E>lk(Up4TEUwxYw1YwUbQp5wK(XZ=H^2)59Fh zavvm`gcXn1o^n{BeKRU{HDrE1@p7%VtLy5_v;U&-ICN#%*=NpWH%`VwkQtdtYsp(9 zxE07tT#5SsKy72wyZp|$uy8flzr~9mEAv-HzU4I;4|Z9flLEN*s%cAUjQoUZ5djUY z`kc-yP8>l^FIg8IBl?4p(}wCDbaAjNIq^a{!0e14eff58r?RI2BJ#nyK`#Q4uQB|V z=MPwFGq&W>*Ty!~_&{L%%Rx8;<1uRS zS>}|?;Qr^sv$tn+9CohmPTI83bINjl?9--?9ZH^pe@OfWBB`#{+lrKC+2%^Bw%(N5 ze+-rE-dpmez-xp3zqkYgxl;}fx%7|BO1D^kY=qxSzc*9q%iUFUGBZ)jN6J2n|>r8y=E{vsC5GohO8{@axr#ByD!Tud#Y5uAKUlxXy1QBrsJ3m|em8{;24XxiZ0 zJ9w+{ ztpZ@YsK&}pB+30OxDC;a(9N@}Pfii{doKO3?d+8QCGNj6aDpiKdy|5B*`XoF9eMN| z+AWfVI%dwPH@q%%i*ix6;eYW&9qfR8pXFOd=eIY95=eQ6=ovk}ePeb^m#+yeC4#@Wx1LN2fDn4k>{2P4IHLod zf2H_|vqzCzU)jkSi3h)I7gQve+V03Bu4azvBX_#f?5LQ4WsCgz{WA=&762p*S+fAx zYp?^gOs<&qR68=o#$v~M5(?ArU1e!$@8?;TbcUt&n}zbJnPKJScO1nb%xxcn_5z!UoaV{O)pAGRKQcBDFb5t~&DVN}h^9ANqy~R+Wj$Dy; zd7~bT)CPQDuz_`#nI9y(>;@_b}j zh8;3zSp|$`)jWG9VZ;^b>2NYCIOlvSy7}2F!rQ^sxBH?dnlWmssuRvg>HB|(DFu<* zD2l=7WaMB0&s6f$-Afiv_asT|^)<63PRm3+pXp-69bSP-6i&X(S^414wvQmPK98G~ z=oF;xP-$%3q!K22U8WjOC?@Q>?Z%;?_F+d=|LxHa0{xA=d-Pb=nk5FV(6mj~#m2^l z3n*Ok3s_cBQx!dYJ?@%J{Y{knqSE~Ilee`f5p%K~>dj=9b>6hYF(;8fHn zA@~-I>YMf`Ffx5FA1^37Re6S1U1GZRpkzaXK{(%iML-IctKn?x-i{#yBpH-oRqlkGUSc-c8}q3tgj8 z!#snK6&MH9?!LztKLk&uJsf#69KZRd{aYJ??#+aYgX7pJioFDJa#rRa>m&@l&Vhpm zLlP3CI=K@Lz-CB6<_m*_%xA8(TI>{ZpqQB2M!OFY9t&9kYNv>Ha-AEkmw$@=V_$h# z{-b-GQg~$>yV_-M*o2a@iWDcxG$lrBR1AE-tCp@mkmBNxDu2C4QFu+N413i5$6!^} z)f+dyRZ3MO{zVA%Ev%;7o^wUUGa$ff#l(iVAwIdnU0TbEaM&wU!~UT4d3!4r;!Iry z=bie-*(vP4JQD)aEwk%@_lc1WfiKy)|6;UP4%nPKr?lSf*^1NuCti@PM?{Xy4cEv) zgGkf+@s+rBYe?SEmWi?8sCi5A==gX`Mj^p9l|I{QuYI8@bDt;7%U1}4uz3C_;(!Vz zmv_h-x;3=MYCpj@e=ZKYcU=?KLmYsZ6RMx#{Lx?0xoMWm_aq7%7#=RzAGG!SJ(d*z zO0zhsg~~B&_$P8f>I_HoG zt~&?qbvrr6sVn1lYpjNt5VtrFD?s>V)Oo-`R-RbkKB!BI-{ReNGkX>hu0YglNui25~Y4?;`7!5)XyvGS3ZlA^eeTv1*M*pIS;t3_Eb9?{TIksy1n*)U1u-#ev?4YZ`@#Duw&X#<=i-d7cf$zL?0hWnr>FIe^1~%eg z7!Rdj9Y>ORZWc;cNB6_qIAHQ*M<5xJUdb!x}$}1zOUj5?+jsl<&!H>7lUD+XWogy!WN_u$HI@=~{dCDm8)uw-N zLY`pt%!uX>=%E?( z)xwPC28!{omzXi(ZJKvpEZx0nxRU$uU%UadYf!CWW(uc3t~cub@e;xSEERf_&XMk) zH`K~yJO0}|Z->Pfqk&zvRAFn@APY+7UsThc?zPc`_=#rdIa3&^$?l^;MU+Gy$$QpCmX27 zoMDr7nc92uK%vQ}_usE~Zf5~xlZD&CQu;=aE~2ZILc2rKR0P(5|VHAwGM&`FR#NM(S1d6VB z#T9u3fPpCJiZB6BQg{(5cCd8H!OQ9-|3_SZ)tp$8_v?QCSnB`C?0UZm_m8yyb{_u` z++V4U>^~y^+XF$7g3(S7^VZC2dh*d@56F|L&S%fY3Md~5hVxXeSXHHxq9Pj%dA&ys zmQJ5OoxUbi8fu;AaCU$j<{>@FL7~OP#fP#vw!^|s_FDPtu8xi?>wP&E`Ar2EKNc~E zORi%uL{<()(er5fcl0X&N6Ip}Sfi7tO%y-%N)IFN|{(3*1)3J!iRB zqJjulYGBO5nv5Ey>D~D`@uha~E6bbQyT?YN=}8Cu{rAR`_Vy~zo;|yP&i!?LV2I=Y z@dsFEEZztJa5@Y@@K1FzRT1z%Z#eDnIdL_vN~OLKlP(BL&8%AU-k9Zrl`l4mt;XP}pe>nDJgD)|~AtQ_y8R?TTd$;677DIBgo~D<6C;L~CM={x00(z?l^VrOE##$yi^Y zh;U*bxjHjj$3A4udf;aW2N9fy>!)%9kt}GtOn~AY($G_xk4K|s)HdM$z93&Da}^RZ zdE=XozK)r{;weVjuv+5&3(v^+AHkVTS11&Xc3w@EO?O78%9Cr~w>iq!N_Qf84_#JCK5h&ZY!fn z0!@9tFxXsvbQY%A3q>38*jx&x~{RwML9sTHp_gnfqXzlIWxZ2JOvBy7fGZxD9 z9sRz)M0V&5{+HD#n+hfYQ{g4}^!l5tM0Ki$vA-_o=ZOu5Os zJQS`<^>?`YrB;aSw-(0NG6)}|^i{AK@ZsaWtg7Xvi^KKoBtE{DN%+QVv~UDRe#&{M zRXX%UOXX|f`?3g}gEi(%-)(wpRhv#}HP-{-s&47fl4*xC!ABy2o}+l^*EXGsYObCL zBWCGR-2-u9Ua)Y#z;X;vxSma3;S8-6nlSGV<5gFL@Wn0;8wbLN8~R+!7K{ok7ox}y zABb;;JHit9r*8M?NAcptM4TgcfM&H1N23&crjg9k{T}>#WYs2w)yjg&h7ZJdz}3+O zmPMzid)WD)urPD|=ViIf*Z}&n;;J%~YnA?={C>x^LCIA|?O;SS(5vb`IY{wfJw5XA z6Cd-DGIKj#4S^%>-;A=Op1AMOEPZ|VH{w-cb~ts8**|agcGDy#(?9o!P>5KsNPifY zdN3s2=wfQUaKDFuUv>Xz6!Ou-^ug~AdxMX_*>$7@pP|rnl3O!-kA8~?UX0J#awlkx zXb_8~OOR_3Dhw$M;bmd&D+4gUYj=dv=LN z6iWfhU@TIf`cv=6H_NeL@>XuOlyu@t8=Bk^{>TDLg9A4-WhczCH$!<+5n{$rTV@}!6arg`CAws{_f+HjQ= z#@_PLL5C7zv-jF7*ZWM{w$|3#d!e==A5;91PPby!_PIZN&U{HmaW_F*6p-S7TXwbm zRjFVY{qFr@ex{2`y`-GE8&i+Qs2-Al=59L4XO91HcoOY6JtZK^|AOpli@v0H=;uee zJwaHL6`Qeg1fI&r)scvIk=EA#;kyvewP%CDV7b?Ew-J(0zkXF=1V@RAeIAC9U*vx?O=7$mP)Epn0W6SYeBAi+zMQ2 zVS#BGUQN2oCr3!keWWl%i^710pTlNBiA?lss?`b!=W3+ePGs&ChXR}tu&o)4aF0fk z>u^(I<31!WA&)H8XWDi&M$M3TRs?^C4wLOm@qHJ}=T4?Dso-`mEor$Aj!Iobu1p*u z(M0ZF*dx{b%AbqtnO17ODP9bbCKJ=yD|6QJ1)T3WcS_@)KX;1hF>-La5!Q|>#lL6% ze!c-yPH%x2boj?xw75`{%&zN`XTpR^i3)Nw-OZ)p_Qr}#TZRjzN?GER6U`ghRR(FP z#o1uLS4}0|zq?a3H0c`=2&0`o<%^WSTESud>F*`_d8AEsHG#b)Yb|+?T8T(?*4a+= zd+d!2K#eqFHw)o{@M0jXGuAP+@Z#L7jF(|KrX99^d=3mP_dO1-y_!5O-qP(vM|BXG z*6Y>uUhmGN@0d%EkZzh#c9PXg?OTQWXrcHovx>;Li}T4XhZ%)uWGucctn^ToR|jo0 z?wC>c@b8#UL>{NUGg`n?VtpLGf|nPR9gAhom-d%@^c-vNZ` z(uOBU?#|-xhVojMgTK-%6Hk9iamms?gxW9PPZL|qBWz71KNVNJ8I*>7Lralgeb+sj zp(N1l(|N<|M*+#M^6dA5FDl8oXr?pZH`Hy{*~D(>KQ*!!dZ8BX@Orf(Z6`Q_VNO`J z*p2n}9^BIy;eP2z)Y4iQ!+Jn0Wv#Y6c{(ZVZmNz{_ltGtdmip5k5_P;BZ*H(ciCYA z_DOrrI`Ri@8xCVyQ_u7BLj$_MpIfSB2IIAy-D>xvH@;N~jN7Z@C4`M2<$Bys1B~-Z1&vA9)cT4*Kg4dcshNuOqvHb>~_c5ixcsb*E2a8Qaj$%=03ax`$V!yx`K% zC^^qWc${%_!QA@*%1MN;3i=qR8~{T25ep&dE45cTm8>7>Nlt>3?oyifA$ zmFZm3xe%2Um%Gq4eQ36wh*h`wAn}ZOf|{_P0632$ zC!l%?r#o(aDYff7r*Qw0xgzCnvgUU?=+cewLVME&6Ku4tu63D=qY)!j$qf;Pj7Qy@ zzL6~za}>8`psSqc9#t7{%knp0jkD44Go>PqEj-UG?Kji(@+@!7BG1SqY>K_8d;_&- zHWz)GhN&Cc%4ZZelN3!H>v^{y*@3<#vi4evpj6tAwnF(2N81T4t*R#k{7ex~LVk|> zD4QIXD05tP=^K=zT(a$V)0>@+ES`$BTsx~ z!>#k{n+|9&o_sjk!iRTxsTQSRJ*8U~j9Co3pJ8z2n2a5F!2yM=- zd9Gf6fp~^7m9VgF{_VLJv}(E4?&n5LVX3GNHGyn9l`s2KAY^N1mT5@i)ot|0M2YeEhyLTJMx>8q_otT5I|aW$6w6e4_(Ue%1T z6k(sX4r&VBovv_IW_9FhSn2NSNi%xTd5)R82qxv$IV;93bi7xVHv?X z>K)B=_{E!7?!mLoO8wlMMWP$5hy1OGSgAh>4f&~Mj~ zDKOq|m>rmfwlZdOcs_bAUNn63Y;Jc0mDZAej1f;R|1LSA@3!BM|)cC@8m0=P+8I@Jd?zmLB|$W5q$yP~xj~NbAKxjv znda}kdM_`cgi)|`KLiq{4?|`f>W>9ZpQG^%gJ0m@!0=kWzpzcrQ>tRw-D@3QlB8x9 zYin=nl;bpV9ol};P|PdVGvDKD&zA*t9s~zZal&x_N`K)dm^A)R{S?hJ!Ja}#TwO+M Q0}JMHLvw@NqfYn!FAYj%eE - - + + + + + + } /> + } /> + } /> + } /> + } /> + + + + ); } -export default App; +export default App; \ No newline at end of file diff --git a/src/App.test.js b/src/App.test.js deleted file mode 100644 index 1f03afe..0000000 --- a/src/App.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; - -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/src/Dynamic Data/DynamicData.js b/src/Dynamic Data/DynamicData.js new file mode 100644 index 0000000..c39a4d4 --- /dev/null +++ b/src/Dynamic Data/DynamicData.js @@ -0,0 +1,17 @@ +export const fetchCart = async () => { + const response = await fetch('https://dummyjson.com/carts') + if (!response.ok) { + throw new Error('Carts could not be fetched!') + } else { + return response.json() + } +} + +export const fetchProducts = async () => { + const response = await fetch('https://dummyjson.com/products?limit=30') + if (!response.ok) { + throw new Error('Products could not be fetched!') + } else { + return response.json() + } +} \ No newline at end of file diff --git a/src/Dynamic Data/dataContext.js b/src/Dynamic Data/dataContext.js new file mode 100644 index 0000000..ef24d01 --- /dev/null +++ b/src/Dynamic Data/dataContext.js @@ -0,0 +1,28 @@ +import React, { createContext, useEffect, useState } from 'react' +import { fetchCart, fetchProducts } from './DynamicData'; +export const productContext = createContext(); + +const DataContext = ({ children }) => { + const [products, setProducts] = useState(); + const [carts, setCarts] = useState(); + const [filteredProducts, setFilteredProducts] = useState(); + + useEffect(() => { + fetchProducts() + .then(res => { + setProducts(res.products); + setFilteredProducts(res.products) + }); + fetchCart() + .then(res => setCarts(res)) + }, []) + + return (<> + + {children} + + ) +} + + +export default DataContext; \ No newline at end of file diff --git a/src/Pages/Customers.js b/src/Pages/Customers.js new file mode 100644 index 0000000..cc0722e --- /dev/null +++ b/src/Pages/Customers.js @@ -0,0 +1,13 @@ +import { Container } from '@mui/material'; +import React, { useEffect } from 'react'; + + +const Customers = () => { + useEffect(() => { document.title = "Admin | Customers" }, []); + + return ( + Customers + ) +} + +export default Customers; \ No newline at end of file diff --git a/src/Pages/Dashboard/Cards.js b/src/Pages/Dashboard/Cards.js new file mode 100644 index 0000000..b6b1074 --- /dev/null +++ b/src/Pages/Dashboard/Cards.js @@ -0,0 +1,17 @@ +import React from 'react'; +import DashboardCard from './DashboardCard'; + +import { Stack } from '@mui/material'; +const Cards = ({ orders = 0, inventory = 0, customers = 0, revenue = 0 }) => { + + const cardsLog = [{ title: "Orders", value: orders }, { title: "Inventory", value: inventory.length }, { title: "Customers", value: customers }, { title: "Revenue", value: revenue.toLocaleString() }] + //const formattedNumber = number.toLocaleString("en-US"); + return ( + + {/* useFlexGap helps in wrap */} + {cardsLog.map((ele, index) => ())} + + ) +} + +export default Cards; \ No newline at end of file diff --git a/src/Pages/Dashboard/DashboardCard.js b/src/Pages/Dashboard/DashboardCard.js new file mode 100644 index 0000000..0c8f2e1 --- /dev/null +++ b/src/Pages/Dashboard/DashboardCard.js @@ -0,0 +1,30 @@ +import { Card, Typography, Stack, CardContent, Skeleton } from '@mui/material'; + +import CurrencyRupeeIcon from '@mui/icons-material/CurrencyRupee'; +import InventoryIcon from '@mui/icons-material/Inventory'; +import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'; +import AccountCircleIcon from '@mui/icons-material/AccountCircle'; +const DashboardCard = ({ ele, index }) => { + return ( + + + + {index % 2 === 0 ? index === 0 ? : : index === 1 ? : } + + + {ele.title} + + {!ele.value || ele.value === "0" ? : + {ele.value} + + } + + + + + ) +} +export default DashboardCard; \ No newline at end of file diff --git a/src/Pages/Dashboard/DashboardTable.js b/src/Pages/Dashboard/DashboardTable.js new file mode 100644 index 0000000..3edca19 --- /dev/null +++ b/src/Pages/Dashboard/DashboardTable.js @@ -0,0 +1,59 @@ +import React, { useEffect, useState } from 'react' +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell from '@mui/material/TableCell'; +import TableContainer from '@mui/material/TableContainer'; +import TableHead from '@mui/material/TableHead'; +import TableRow from '@mui/material/TableRow'; +import Paper from '@mui/material/Paper'; + +const DashboardTable = ({ orders }) => { + const [row, setRow] = useState(null); + const [randomIndex, setRandomIndex] = useState(0); + + //Math.floor(Math.random() * arr.length) + useEffect(() => { + if (orders) { + // setRandomIndex(Math.floor(Math.random() * orders.carts.length)); + // setRow(orders.carts[randomIndex].products) + setRow(orders.slice(0, 5)); + } + }, [orders]) + + + + function BasicTable() { + return (<> + + + + + Title + Quantity + Price + + + + {row && + row.map((item) => ( + + {item.title} + {item.quantity} + {item.price} + + ))} + +
+
+ + ); + } + return ( + + ) +} + +export default DashboardTable; diff --git a/src/Pages/Dashboard/DiscountChart.js b/src/Pages/Dashboard/DiscountChart.js new file mode 100644 index 0000000..9a184ca --- /dev/null +++ b/src/Pages/Dashboard/DiscountChart.js @@ -0,0 +1,110 @@ +import React, { useState, useEffect } from 'react'; +import { Bar } from "react-chartjs-2"; +import { Box, Skeleton } from '@mui/material'; + +const PriceVsDiscount = ({ chartsData }) => { + const [revenueData, setRevenueData] = useState({ + labels: [], + datasets: [], + }); + const [loader, setLoader] = useState(true); + useEffect(() => { + if (chartsData) { + + // console.log("chartsData", chartsData) + const labels = chartsData.map((product) => { + return `User-${product.id}`; + }); + const discountData = chartsData.map((product) => { + let discountedValue = product.price * (1 - product.discountPercentage / 100); + return discountedValue; + }); + const PriceData = chartsData.map((product) => { + return product.price; + }); + + const dataSource = { + labels, + datasets: [ + { + label: "DiscountedPrice", + data: discountData, + backgroundColor: "rgba(255, 0, 0, 0.51)", + borderRadius: 10, + order: 0, + categoryPercentage: 0.75 + }, + { + label: "Price", + data: PriceData, + backgroundColor: "rgba(0, 0, 0, 0.41)", + borderRadius: 10, + order: 1, + categoryPercentage: 0.76 + }, + ], + }; + + setRevenueData(dataSource); + setLoader(false); + } + + }, [chartsData]); + + const options = { + responsive: true, + scales: { + x: { + stacked: true, + }, + y: { + beginAtZero: true, + }, + }, + legend: { + display: false + }, + } + + // const options = { + // responsive: true, + // interaction: { + // intersect: false, + // }, + // scales: { + // x: { + // stacked: true, + // }, + // y: { + // stacked: true, + // beginAtZero: true + + // } + // }, + // plugins: { + // legend: { + // position: "top", + // }, + // title: { + // display: false, + // text: "Order Revenue", + // }, + // }, + // }; + + return (<> {loader ? + < div style={{ paddingTop: '57%' } + } /> + : + + + + } + + + ) +} + +export default PriceVsDiscount; \ No newline at end of file diff --git a/src/Pages/Dashboard/RatingChart.js b/src/Pages/Dashboard/RatingChart.js new file mode 100644 index 0000000..2a69999 --- /dev/null +++ b/src/Pages/Dashboard/RatingChart.js @@ -0,0 +1,83 @@ +import React, { useState, useEffect } from 'react' +import { Pie, Scatter } from 'react-chartjs-2'; +import { Skeleton, Box } from '@mui/material'; + +const RatingChart = ({ chartsData }) => { + const [ratingData, setRatingData] = useState({ + labels: [], + datasets: [], + }); + const [loader, setLoader] = useState(true); + + useEffect(() => { + if (chartsData) { + // console.log("Rating", chartsData.products[0].rating) + + // const counts = {}; + // for (const num of arr) { + // counts[num] = counts[num] ? counts[num] + 1 : 1; //occurrence counter + // } + const counts = { "4.75 to 5": 0, "4.5 to 4.75": 0, "4.25 to 4.5": 0, "4 to 4.25": 0, "Below 4": 0 }; + for (const num of chartsData) { + if (num.rating <= 5 && num.rating >= 4.75) + counts["4.75 to 5"] = counts["4.75 to 5"] + 1; + else if (num.rating < 4.75 && num.rating >= 4.5) + counts["4.5 to 4.75"] = counts["4.5 to 4.75"] + 1; + else if (num.rating < 4.5 && num.rating >= 4.25) + counts["4.25 to 4.5"] = counts["4.25 to 4.5"] + 1; + else if (num.rating < 4.25 && num.rating >= 4) + counts["4 to 4.25"] = counts["4 to 4.25"] + 1; + else + counts["Below 3"] = counts["Below 3"] + 1; + + // counts[num.rating] = counts[num.rating] ? counts[num.rating] + 1 : 1; + } + + // const data = chartsData.products.map((ele) => { + // return { x: ele.rating, y: ele.rating }; //Scatter + // }); + const data = Object.values(counts); + const ratingLabels = Object.keys(counts); + // console.log("Rating", counts) + + const dataSource = { + labels: ratingLabels, + datasets: [ + { + label: 'Rating', + data: data, + backgroundColor: [ + 'rgba(255, 99, 132, 0.5)', + 'rgba(54, 162, 235, 0.5)', + 'rgba(255, 206, 86, 0.5)', + 'rgba(75, 192, 192, 0.5)', + 'rgba(153, 102, 255, 0.5)'], + }, + ], + }; + setRatingData(dataSource); + setLoader(false); + } + }, [chartsData]); + + const options = { + responsive: true, + circumference: 360 + }; + + return ( + <> {loader ? + +
+ : + + {/* */} + + } + + ) +} + +export default RatingChart; \ No newline at end of file diff --git a/src/Pages/Dashboard/RevenueChart.js b/src/Pages/Dashboard/RevenueChart.js new file mode 100644 index 0000000..0dc0da8 --- /dev/null +++ b/src/Pages/Dashboard/RevenueChart.js @@ -0,0 +1,79 @@ +import React, { useState, useEffect } from 'react' +import { Line } from 'react-chartjs-2'; +import { Skeleton, Box } from '@mui/material'; + +const RatingChart = ({ chartsData }) => { + const [revenueData, setRevenueData] = useState({ + labels: [], + datasets: [], + }); + const [loader, setLoader] = useState(true); + + useEffect(() => { + if (chartsData) { + // console.log("chartsData", chartsData) + const labels = chartsData.map((product) => { + return `User-${product.id}`; + }); + const data = chartsData.map((product) => { + return product.price; + }); + + const dataSource = { + labels, + datasets: [ + { + label: 'Order Revenue', + data: data, + fill: true, + borderColor: "rgb(255, 99, 132)", + backgroundColor: "rgba(255, 99, 132, 0.5)", + tension: 0.4, + pointStyle: "circle" + }, + ], + }; + + setRevenueData(dataSource); + setLoader(false); + } + }, [chartsData]); + + const options = { + type: "line", + responsive: true, + scales: { + y: { + beginAtZero: true + } + }, + plugins: { + legend: { + position: "top", + }, + title: { + display: false, + text: "Order Revenue", + }, + tooltip: { + titleColor: "#fff", + cornerRadius: 15 + } + }, + }; + + return ( + <> {loader ? + +
+ : + + + } + + ) +} + +export default RatingChart; \ No newline at end of file diff --git a/src/Pages/Dashboard/index.js b/src/Pages/Dashboard/index.js new file mode 100644 index 0000000..cb6cbd3 --- /dev/null +++ b/src/Pages/Dashboard/index.js @@ -0,0 +1,88 @@ +import React, { useEffect, useState, useContext } from 'react'; +import { Grid, Skeleton, Typography } from '@mui/material'; + +// import { fetchCart, fetchProducts } from '../../Dynamic Data/DynamicData'; +import { productContext } from '../../Dynamic Data/dataContext'; +import Cards from './Cards'; +import DashboardTable from './DashboardTable'; +import RevenueChart from './RevenueChart'; +import { + Chart as ChartJS, Title, Tooltip, Legend, //Common + + CategoryScale, LinearScale, //Line & Bar Chart + + BarElement,//Bar Chart + + PointElement, LineElement, Filler, //Line Chart & Area Chart + + ArcElement, //Pie Chart +} from "chart.js"; +import RatingChart from './RatingChart'; +import PriceVsDiscount from './DiscountChart'; + +ChartJS.register( + CategoryScale, + LinearScale, + BarElement, + Title, + Tooltip, + Legend, + PointElement, LineElement, Filler, + ArcElement, +); + +const Dashboard = () => { + useEffect(() => { document.title = "Admin | Dashboard" }, []); + //destructure according to index[products, setProducts, carts, setCarts, filteredProducts, setFilteredProducts] + const [products, , , , filteredProducts, setFilteredProducts] = useContext(productContext); + + // const [carts, setCarts] = useState(); + // const [products, setProducts] = useState(); + const [orders, setOrders] = useState(0); + const [revenue, setRevenue] = useState(0); + const [loader, setLoader] = useState(true); + + useEffect(() => { + setLoader(true); + if (products) { + let revenue = filteredProducts.reduce((accumulator, object) => { + return accumulator + object.price; + }, 0); + setRevenue(revenue); + setOrders(products.length); + setLoader(false); + } + }, + // eslint-disable-next-line + [filteredProducts]); + console.log(products); + + return (<> + + + + + + Revenue + + + + Price VS DiscountedPrice + + + + <>Recent Orders + {loader ? +
+ : + + } + + + Product Rating + + + ) +} + +export default Dashboard; \ No newline at end of file diff --git a/src/Pages/Inventory/InventoryFilter.js b/src/Pages/Inventory/InventoryFilter.js new file mode 100644 index 0000000..e704b8f --- /dev/null +++ b/src/Pages/Inventory/InventoryFilter.js @@ -0,0 +1,52 @@ +import React, { useState, useContext, useEffect } from 'react' +import InputLabel from '@mui/material/InputLabel'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import Select from '@mui/material/Select'; +import { productContext } from '../../Dynamic Data/dataContext'; +import { useNavigate } from 'react-router-dom'; + +const InventoryFilter = () => { + const [data, setData] = useState(''); + //destructure according to index[products, setProducts, carts, setCarts, filteredProducts, setFilteredProducts] + const [products, , , , filteredProducts, setFilteredProducts] = useContext(productContext); + const [category, setCategory] = useState([]); + const navigate = useNavigate(); + useEffect(() => { + //let unique = [...new Set(myArray)]; // unique Elements + setCategory([...new Set(products.map((ele) => ele.category))]); + }, []) + + useEffect(() => { + if (data === "") { + setFilteredProducts(products); + } + else { + setFilteredProducts(products.filter((ele) => ele.category === data)); + } + console.log(filteredProducts); + }, [data]) + + return ( + + Filter + + + ); +} + +export default InventoryFilter; \ No newline at end of file diff --git a/src/Pages/Inventory/InventoryTable.js b/src/Pages/Inventory/InventoryTable.js new file mode 100644 index 0000000..a8330a3 --- /dev/null +++ b/src/Pages/Inventory/InventoryTable.js @@ -0,0 +1,106 @@ +import React, { useContext, useEffect, useState } from 'react' +import { Box } from '@mui/material'; +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell from '@mui/material/TableCell'; +import TableContainer from '@mui/material/TableContainer'; +import TableHead from '@mui/material/TableHead'; +import TablePagination from '@mui/material/TablePagination'; +import TableRow from '@mui/material/TableRow'; +import { productContext } from '../../Dynamic Data/dataContext'; + +const InventoryTable = () => { + //destructure according to index [products, setProducts, carts, setCarts, filteredProducts, setFilteredProducts] + const [, , , , filteredProducts,] = useContext(productContext) + const [rowData, setRowData] = useState(); + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(10); + + useEffect(() => { + if (filteredProducts) + setRowData(filteredProducts) + }, [filteredProducts]); + + const columns = [ + { id: 'id', label: 'Sr No.', width: 3 + "rem" }, + { id: 'title', label: 'Title', align: 'left', width: 7 + "rem" }, + { id: 'stock', label: 'Stock', align: 'center', width: 5 + "rem" }, + { + id: 'price', + label: 'Price', + width: 5 + "rem", + align: 'center', + format: (value) => value.toLocaleString(), + } + ]; + + const handleChangePage = (event, newPage) => { + if (event.target.getAttribute("data-testid") === "KeyboardArrowRightIcon") + setPage(newPage + 1); + else if (event.target.getAttribute("data-testid") === "KeyboardArrowLeftIcon") + setPage(newPage - 1); + else + setPage(newPage); + // console.log(event.target.getAttribute("data-testid"), newPage) + }; + + const handleChangeRowsPerPage = (event) => { + setRowsPerPage(+event.target.value); + setPage(0); + }; + + return (<>{rowData && <> + + + + + {columns.map((column) => ( + + {column.label} + + ))} + + + + {rowData + .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) + .map((row) => { + return ( + + {columns.map((column) => { + const value = row[column.id]; + return ( + + {column.format && typeof value === 'number' + ? column.format(value) + : value} + + ); + })} + + ); + })} + +
+
+ handleChangePage(e, page)} + onRowsPerPageChange={handleChangeRowsPerPage} + sx={{ + padding: 0, bgcolor: "lightcoral", margin: 0 + }} + /> + } + ); +} + +export default InventoryTable; \ No newline at end of file diff --git a/src/Pages/Inventory/index.js b/src/Pages/Inventory/index.js new file mode 100644 index 0000000..588b96e --- /dev/null +++ b/src/Pages/Inventory/index.js @@ -0,0 +1,35 @@ +import React, { useEffect, useContext } from 'react' + +import { Box, Container, Typography, Stack } from '@mui/material'; +import InventoryFilter from './InventoryFilter'; +import InventoryTable from './InventoryTable'; +import { useNavigate } from 'react-router-dom'; +import { productContext } from '../../Dynamic Data/dataContext'; + +const Inventory = () => { + //destructure according to index[products, setProducts, carts, setCarts, filteredProducts, setFilteredProducts] + const [products] = useContext(productContext); + const navigate = useNavigate(); + + + + useEffect(() => { + document.title = "Admin | Inventory"; + if (!products) { + navigate('/'); + } + }, []); + + return ( + {products && + + Inventory + + + + } + + ); +} + +export default Inventory; \ No newline at end of file diff --git a/src/Pages/Orders/index.js b/src/Pages/Orders/index.js new file mode 100644 index 0000000..7fbec85 --- /dev/null +++ b/src/Pages/Orders/index.js @@ -0,0 +1,52 @@ +import { Container } from '@mui/material'; +import React, { useState, useEffect } from 'react' +import { fetchCart, fetchProducts } from '../../Dynamic Data/DynamicData'; + +// import { productContext } from '../../Dynamic Data/dataContext'; + +const Orders = () => { + // const [products, setProducts, carts, setCarts] = useContext(productContext) + useEffect(() => { + document.title = "Admin | Orders"; + console.log(products, carts); + + }, []); + const [carts, setCarts] = useState(); + const [products, setProducts] = useState(); + const [orders, setOrders] = useState(0); + const [revenue, setRevenue] = useState(0); + const [loader, setLoader] = useState(true); + + useEffect(() => { + setTimeout(() => {// setTimeout used to test loader + fetchCart().then((res) => { + setCarts(res); + let orders = res.carts.reduce((accumulator, object) => { + // console.log(accumulator) + return accumulator + object.totalQuantity; + }, 0); + setOrders(orders); + + let revenue = res.carts.reduce((accumulator, object) => { + return accumulator + object.discountedTotal; + }, 0);; + setRevenue(revenue); + }); + fetchProducts().then((res) => { + setProducts(res); + // console.log("products", res,products); + }); + setLoader(false); + }, 500); + }, + // console.log("cart", carts, "products", products, "orders: ", orders, " inventory: ", products.total, " customers: ", carts.total, " revenue: ", revenue); + // eslint-disable-next-line + []); + + + return ( + Orders + ) +} + +export default Orders; \ No newline at end of file diff --git a/src/components/SideBar.js b/src/components/SideBar.js new file mode 100644 index 0000000..14ceeab --- /dev/null +++ b/src/components/SideBar.js @@ -0,0 +1,175 @@ +import { useState } from 'react'; +import { styled } from '@mui/material/styles'; +import Box from '@mui/material/Box'; +import MuiDrawer from '@mui/material/Drawer'; +import MuiAppBar from '@mui/material/AppBar'; +import Toolbar from '@mui/material/Toolbar'; +import List from '@mui/material/List'; +import CssBaseline from '@mui/material/CssBaseline'; +import Typography from '@mui/material/Typography'; +import Divider from '@mui/material/Divider'; +import IconButton from '@mui/material/IconButton'; +import MenuIcon from '@mui/icons-material/Menu'; +import ListItem from '@mui/material/ListItem'; +import ListItemButton from '@mui/material/ListItemButton'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import CloseIcon from '@mui/icons-material/Close'; + +import DashboardCustomizeIcon from '@mui/icons-material/DashboardCustomize'; +import InventoryIcon from '@mui/icons-material/Inventory'; +import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'; +import AccountCircleIcon from '@mui/icons-material/AccountCircle'; + +import { Link, useLocation } from "react-router-dom"; +import { Stack } from '@mui/material'; +import Dashboard from '../Pages/Dashboard'; + +const drawerWidth = 180; + +const openedMixin = (theme) => ({ + width: drawerWidth, + transition: theme.transitions.create('width', { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.enteringScreen, + }), + overflowX: 'hidden', +}); + +const closedMixin = (theme) => ({ + transition: theme.transitions.create('width', { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + overflowX: 'hidden', + width: `calc(${theme.spacing(7)} + 1px)`, + [theme.breakpoints.up('xs')]: { + width: `calc(${theme.spacing(0)} + 1px)`, + }, [theme.breakpoints.up('md')]: { + width: `calc(${theme.spacing(7)} + 1px)`, + }, +}); + +const DrawerHeader = styled('div')(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + justifyContent: 'flex-end', + padding: theme.spacing(0, 1), + // necessary for content to be below app bar + ...theme.mixins.toolbar, +})); + +const AppBar = styled(MuiAppBar, { + shouldForwardProp: (prop) => prop !== 'open', +})(({ theme, open }) => ({ + zIndex: theme.zIndex.drawer + 1, + transition: theme.transitions.create(['width', 'margin'], { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + ...(open && { + marginLeft: drawerWidth, + width: `calc(100% - ${drawerWidth}px)`, + transition: theme.transitions.create(['width', 'margin'], { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.enteringScreen, + }), + }), +})); + +const Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })( + ({ theme, open }) => ({ + width: drawerWidth, + flexShrink: 0, + whiteSpace: 'nowrap', + boxSizing: 'border-box', + ...(open && { + ...openedMixin(theme), + '& .MuiDrawer-paper': openedMixin(theme), + }), + ...(!open && { + ...closedMixin(theme), + '& .MuiDrawer-paper': closedMixin(theme), + }), + }), +); + +export default function MiniDrawer() { + const [open, setOpen] = useState(false); + const location = useLocation(); + let title = location.pathname.slice(1); + + const handleDrawerOpen = () => { + setOpen(true); + }; + + const handleDrawerClose = () => { + setOpen(false); + }; + + return ( + + + + + + {open ? : } + + + {title ? title : "Dashboard"} + + + + + + + Admin + + {open ? : } + + + + + + {['Dashboard', 'Inventory', 'Orders', 'Customers'].map((text, index) => + ( + + + + + {index % 2 === 0 ? index === 0 ? : : index === 1 ? : } + + + + + ) + )} + + + + + + + ); +} \ No newline at end of file diff --git a/src/index.css b/src/index.css index ec2585e..005eadf 100644 --- a/src/index.css +++ b/src/index.css @@ -1,13 +1,14 @@ body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", + "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + background-color: rgb(214, 233, 248); } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } diff --git a/src/index.js b/src/index.js index d563c0f..2cb1087 100644 --- a/src/index.js +++ b/src/index.js @@ -2,7 +2,6 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; -import reportWebVitals from './reportWebVitals'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( @@ -10,8 +9,3 @@ root.render( ); - -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals -reportWebVitals(); diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 9dfc1c0..0000000 --- a/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/reportWebVitals.js b/src/reportWebVitals.js deleted file mode 100644 index 5253d3a..0000000 --- a/src/reportWebVitals.js +++ /dev/null @@ -1,13 +0,0 @@ -const reportWebVitals = onPerfEntry => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/src/setupTests.js b/src/setupTests.js deleted file mode 100644 index 8f2609b..0000000 --- a/src/setupTests.js +++ /dev/null @@ -1,5 +0,0 @@ -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom';
- logo -

- Edit src/App.js and save to reload. -

-
- Learn React - -