diff --git a/client/db.json b/client/db.json new file mode 100644 index 0000000..3252133 --- /dev/null +++ b/client/db.json @@ -0,0 +1,31 @@ +{ + "subs": [ + { + "id": 3, + "name": "Netflix", + "tier": "", + "cost": "20", + "paymentDate": "2023-01-14T05:00:00.000Z", + "subscriptionType": "Family", + "activationDate": "2023-01-20T05:00:00.000Z" + }, + { + "name": "Disney Plus", + "tier": "", + "cost": "15", + "paymentDate": "2023-01-20T05:00:00.000Z", + "subscriptionType": "family", + "activationDate": "2023-01-31T05:00:00.000Z", + "id": 4 + }, + { + "name": "Ritual", + "tier": "", + "cost": "25", + "paymentDate": "2023-02-01T05:00:00.000Z", + "subscriptionType": "Health", + "activationDate": "2023-01-01T05:00:00.000Z", + "id": 5 + } + ] +} \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 320be6b..a3c3985 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -14,6 +14,12 @@ "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/runtime-corejs3": "^7.20.7", + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@fontsource/roboto": "^4.5.8", + "@mui/material": "^5.11.4", + "@mui/styled-engine-sc": "^5.11.0", + "@mui/x-date-pickers": "^5.0.13", "axios": "^1.2.2", "babel-loader": "^9.1.2", "core-js": "^3.27.1", @@ -22,6 +28,7 @@ "html-webpack-plugin": "^5.5.0", "mini-css-extract-plugin": "^2.7.2", "mini-svg-data-uri": "^1.4.4", + "moment": "^2.29.4", "normalize.css": "^8.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -30,6 +37,7 @@ "sass": "^1.57.1", "sass-loader": "^13.2.0", "style-loader": "^3.3.1", + "styled-components": "^5.3.6", "terser-webpack-plugin": "^5.3.6", "webpack": "^5.75.0", "webpack-cli": "^5.0.1", @@ -1667,6 +1675,75 @@ "node": ">=6.9.0" } }, + "node_modules/@date-io/core": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", + "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==" + }, + "node_modules/@date-io/date-fns": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz", + "integrity": "sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA==", + "dependencies": { + "@date-io/core": "^2.16.0" + }, + "peerDependencies": { + "date-fns": "^2.0.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + } + } + }, + "node_modules/@date-io/dayjs": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz", + "integrity": "sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw==", + "dependencies": { + "@date-io/core": "^2.16.0" + }, + "peerDependencies": { + "dayjs": "^1.8.17" + }, + "peerDependenciesMeta": { + "dayjs": { + "optional": true + } + } + }, + "node_modules/@date-io/luxon": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz", + "integrity": "sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ==", + "dependencies": { + "@date-io/core": "^2.16.0" + }, + "peerDependencies": { + "luxon": "^1.21.3 || ^2.x || ^3.x" + }, + "peerDependenciesMeta": { + "luxon": { + "optional": true + } + } + }, + "node_modules/@date-io/moment": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz", + "integrity": "sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ==", + "dependencies": { + "@date-io/core": "^2.16.0" + }, + "peerDependencies": { + "moment": "^2.24.0" + }, + "peerDependenciesMeta": { + "moment": { + "optional": true + } + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -1675,6 +1752,175 @@ "node": ">=10.0.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz", + "integrity": "sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "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.1.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.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.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "dependencies": { + "@emotion/memoize": "^0.8.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "node_modules/@emotion/react": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz", + "integrity": "sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.5", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "node_modules/@emotion/styled": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz", + "integrity": "sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.5", + "@emotion/is-prop-valid": "^1.2.0", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, "node_modules/@esbuild/darwin-arm64": { "version": "0.16.14", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.14.tgz", @@ -1691,6 +1937,11 @@ "node": ">=12" } }, + "node_modules/@fontsource/roboto": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.8.tgz", + "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==" + }, "node_modules/@jest/schemas": { "version": "29.0.0", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", @@ -1852,6 +2103,305 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@mui/base": { + "version": "5.0.0-alpha.113", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.113.tgz", + "integrity": "sha512-XSjvyQWATM8uk+EJZvYna8D21kOXC42lwb3q4K70btuGieKlCIQLaHTTDV2OfD4+JfT4o3NJy3I4Td2co31RZA==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "@emotion/is-prop-valid": "^1.2.0", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.2", + "@popperjs/core": "^2.11.6", + "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/core-downloads-tracker": { + "version": "5.11.4", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.4.tgz", + "integrity": "sha512-jWVwGM3vG4O0sXcW0VcIl+njCWbGCBF5vvjRpuKJajrz51AD7D6+fP1SkInZXVk5pRHf6Bnk/Yj9Of9gXxb/hA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/material": { + "version": "5.11.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.4.tgz", + "integrity": "sha512-ZL/czK9ynrQJ6uyDwQgK+j7m1iKA1XKPON+rEPupwAu/bJ1XJxD+H/H2bkMM8UpOkzaucx/WuMbJJGQ60l7gBg==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "@mui/base": "5.0.0-alpha.113", + "@mui/core-downloads-tracker": "^5.11.4", + "@mui/system": "^5.11.4", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.2", + "@types/react-transition-group": "^4.4.5", + "clsx": "^1.2.1", + "csstype": "^3.1.1", + "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/private-theming": { + "version": "5.11.2", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.2.tgz", + "integrity": "sha512-qZwMaqRFPwlYmqwVKblKBGKtIjJRAj3nsvX93pOmatsXyorW7N/0IPE/swPgz1VwChXhHO75DwBEx8tB+aRMNg==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "@mui/utils": "^5.11.2", + "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.11.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.0.tgz", + "integrity": "sha512-AF06K60Zc58qf0f7X+Y/QjaHaZq16znliLnGc9iVrV/+s8Ln/FCoeNuFvhlCbZZQ5WQcJvcy59zp0nXrklGGPQ==", + "dependencies": { + "@babel/runtime": "^7.20.6", + "@emotion/cache": "^11.10.5", + "csstype": "^3.1.1", + "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/styled-engine-sc": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine-sc/-/styled-engine-sc-5.11.0.tgz", + "integrity": "sha512-U8cA7DHB3fnLpDVM5qd/9FGnw5y+LrmwIXQ9Lzk3HYkF903tSMx9jXIbiz1vltpOfZTKX/Rn02m/nkH4OF6Pcg==", + "dependencies": { + "@babel/runtime": "^7.20.6", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/styled-components": "^5.1.14", + "styled-components": "^5.3.1" + }, + "peerDependenciesMeta": { + "@types/styled-components": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.11.4", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.4.tgz", + "integrity": "sha512-fE2Ts33V5zh7ouciwXgMm/a6sLvjIj9OMeojuHNYY7BStTxparC/Fp9CNUZNJwt76U6ZJC59aYScFSRQKbW08g==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "@mui/private-theming": "^5.11.2", + "@mui/styled-engine": "^5.11.0", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.2", + "clsx": "^1.2.1", + "csstype": "^3.1.1", + "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.3", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz", + "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.11.2", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.2.tgz", + "integrity": "sha512-AyizuHHlGdAtH5hOOXBW3kriuIwUIKUIgg0P7LzMvzf6jPhoQbENYqY6zJqfoZ7fAWMNNYT8mgN5EftNGzwE2w==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^16.7.1 || ^17.0.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/x-date-pickers": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.13.tgz", + "integrity": "sha512-nUc35Zvah/l4bEWcPNRtSvWBL+7uAlokd6G6PzQfLe2TQo4GNlK1JVRfoVpBY5FsdM09uWLrpvfWLbka87k7GA==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@date-io/core": "^2.15.0", + "@date-io/date-fns": "^2.15.0", + "@date-io/dayjs": "^2.15.0", + "@date-io/luxon": "^2.15.0", + "@date-io/moment": "^2.15.0", + "@mui/utils": "^5.10.3", + "@types/react-transition-group": "^4.4.5", + "clsx": "^1.2.1", + "prop-types": "^15.7.2", + "react-transition-group": "^4.4.5", + "rifm": "^0.12.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.4.1", + "@mui/system": "^5.4.1", + "date-fns": "^2.25.0", + "dayjs": "^1.10.7", + "luxon": "^1.28.0 || ^2.0.0 || ^3.0.0", + "moment": "^2.29.1", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", @@ -2021,6 +2571,15 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@remix-run/router": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.2.1.tgz", @@ -2372,6 +2931,16 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -2384,12 +2953,43 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "node_modules/@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-is": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", + "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, "node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -2776,6 +3376,20 @@ "webpack": ">=5" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", @@ -2812,6 +3426,26 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-plugin-styled-components": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", + "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-module-imports": "^7.16.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11", + "picomatch": "^2.3.0" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2981,6 +3615,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -2990,6 +3632,14 @@ "tslib": "^2.0.3" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -3112,6 +3762,14 @@ "node": ">=6" } }, + "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/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3307,6 +3965,21 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3320,6 +3993,14 @@ "node": ">= 8" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", @@ -3480,6 +4161,16 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-to-react-native": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.1.0.tgz", + "integrity": "sha512-AryfkFA29b4I3vG7N4kxFboq15DxwSXzhXM37XNEjwJMgjYIc8BcqfiprpAqX0zadI5PMByEIwAMzXxk5Vcc4g==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -3598,6 +4289,11 @@ "node": ">=8.0.0" } }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3694,6 +4390,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", @@ -3814,6 +4519,14 @@ "node": ">=4" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", @@ -4133,6 +4846,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": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -4342,6 +5060,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/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -4561,6 +5292,21 @@ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz", "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==" }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -4612,6 +5358,11 @@ "node": ">= 10" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4918,6 +5669,11 @@ "node": ">=10" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -5155,6 +5911,14 @@ "node": "*" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5268,6 +6032,14 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -5400,6 +6172,34 @@ "tslib": "^2.0.3" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -5454,6 +6254,14 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -5969,6 +6777,21 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/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/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -6091,6 +6914,11 @@ "react": "*" } }, + "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/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -6130,6 +6958,21 @@ "react-dom": ">=16.8" } }, + "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/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -6304,6 +7147,14 @@ "node": ">=8" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -6313,6 +7164,14 @@ "node": ">= 4" } }, + "node_modules/rifm": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz", + "integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==", + "peerDependencies": { + "react": ">=16.8" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -6621,6 +7480,11 @@ "node": ">=8" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6791,6 +7655,41 @@ "webpack": "^5.0.0" } }, + "node_modules/styled-components": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz", + "integrity": "sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg==", + "hasInstallScript": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -6806,6 +7705,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", diff --git a/client/package.json b/client/package.json index 5b1a517..9dfc54f 100644 --- a/client/package.json +++ b/client/package.json @@ -5,6 +5,7 @@ "main": "src/index.js", "scripts": { "start": "webpack-dev-server --config webpack.dev.js --progress --color", + "start-frontend-db": "npx json-server -p 3000 -w ./db.json", "build": "webpack --config webpack.prod.js --progress --color", "lint": "eslint --ext js,jsx", "lint-fix": "eslint --ext js,jsx --fix", @@ -29,6 +30,12 @@ "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/runtime-corejs3": "^7.20.7", + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@fontsource/roboto": "^4.5.8", + "@mui/material": "^5.11.4", + "@mui/styled-engine-sc": "^5.11.0", + "@mui/x-date-pickers": "^5.0.13", "axios": "^1.2.2", "babel-loader": "^9.1.2", "core-js": "^3.27.1", @@ -37,6 +44,7 @@ "html-webpack-plugin": "^5.5.0", "mini-css-extract-plugin": "^2.7.2", "mini-svg-data-uri": "^1.4.4", + "moment": "^2.29.4", "normalize.css": "^8.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -45,6 +53,7 @@ "sass": "^1.57.1", "sass-loader": "^13.2.0", "style-loader": "^3.3.1", + "styled-components": "^5.3.6", "terser-webpack-plugin": "^5.3.6", "webpack": "^5.75.0", "webpack-cli": "^5.0.1", diff --git a/client/src/assets/images/logo.svg b/client/src/assets/images/logo.svg new file mode 100755 index 0000000..43b14c6 --- /dev/null +++ b/client/src/assets/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/assets/images/main.svg b/client/src/assets/images/main.svg index 7199b5b..bed6fd1 100644 --- a/client/src/assets/images/main.svg +++ b/client/src/assets/images/main.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + \ No newline at end of file diff --git a/client/src/assets/styles/active.scss b/client/src/assets/styles/active.scss new file mode 100644 index 0000000..ab91c1f --- /dev/null +++ b/client/src/assets/styles/active.scss @@ -0,0 +1,27 @@ +.active { + display: grid; + + grid-template-columns: repeat(200px, 5); + grid-template-rows: auto; + grid-template-areas: + 'sidebar header header header header' + 'sidebar main main main main' + 'sidebar footer footer footer footer'; + + column-gap: 10px; + + h1 { + grid-area: header; + } + .active-cards { + grid-area: main; + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + } + + nav { + grid-area: sidebar; + } +} diff --git a/client/src/assets/styles/dashboard.scss b/client/src/assets/styles/dashboard.scss new file mode 100644 index 0000000..581584d --- /dev/null +++ b/client/src/assets/styles/dashboard.scss @@ -0,0 +1,58 @@ +dashboard { + padding-top: 10rem; + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-template-rows: 100px 100px 100px; + justify-items: center; + align-items: center; + align-content: center; + + h3 { + grid-column-start: 2; + grid-column-end: 4; + grid-row-start: 1; + grid-row-end: 2; + } + + div { + height: 10rem; + width: 13rem; + line-height: 8rem; + + vertical-align: middle; + } + + div.MuiCardContent-root { + // justify-content: center; + text-align: center; + align-items: center; + } + + .item-active { + grid-column-start: 1; + grid-column-end: 2; + grid-row-start: 2; + grid-row-end: 5; + } + + .item-trails { + grid-column-start: 2; + grid-column-end: 3; + grid-row-start: 2; + grid-row-end: 5; + } + + .item-summary { + grid-column-start: 3; + grid-column-end: 4; + grid-row-start: 2; + grid-row-end: 5; + } + + .item-past { + grid-column-start: 4; + grid-column-end: 5; + grid-row-start: 2; + grid-row-end: 5; + } + } \ No newline at end of file diff --git a/client/src/assets/styles/form-card.scss b/client/src/assets/styles/form-card.scss new file mode 100644 index 0000000..c05ec71 --- /dev/null +++ b/client/src/assets/styles/form-card.scss @@ -0,0 +1,57 @@ +.form-card { + label { + color: #0b4f6c; + } + div.MuiPaper-root, + form { + width: 324px; + height: 400px; + margin-top: 3rem; + } + + button { + margin: none; + } + + div.MuiPaper-root { + background: #e1efe6; + } + + div.MuiFormControl-root { + display: flex; + align-content: space-around; + } + + form { + padding: 1rem; + } + + div.MuiInputBase-input { + padding: 5rem; + } + + div.formInput .formInputDate { + padding-bottom: 4rem; + height: 0.5rem; + background: none; + border: none; + } + + div.formInputDate { + margin-bottom: 0.7rem; + } + + //MUI input field lengths + div.MuiInputBase-root { + width: 10rem; + height: 2rem; + background: white; + } + + /* controls Button component */ + button.MuiButton-root { + margin-top: 1rem; + background: #ffa630; + color: #0b4f6c; + } +} diff --git a/client/src/assets/styles/form.scss b/client/src/assets/styles/form.scss index 0dcaf8b..6044254 100644 --- a/client/src/assets/styles/form.scss +++ b/client/src/assets/styles/form.scss @@ -3,7 +3,7 @@ .form { width: 90vw; max-width: var(--fixed-width); - background: var(--white); + background: #E1EFE6; border-radius: var(--borderRadius); box-shadow: var(--shadow-2); padding: 2rem 2.5rem; @@ -28,7 +28,7 @@ width: 100%; padding: 0.375rem 0.75rem; border-radius: var(--borderRadius); - background: var(--backgroundColor); + background: white; border: 1px solid var(--grey-200); } .form-input, diff --git a/client/src/assets/styles/index.css b/client/src/assets/styles/index.css index febbcbe..3c7c040 100644 --- a/client/src/assets/styles/index.css +++ b/client/src/assets/styles/index.css @@ -1,3 +1,5 @@ +@import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Fredoka+One&display=swap'); + *, ::after, ::before { @@ -11,8 +13,8 @@ --primary-200: #87eaf2; --primary-300: #54d1db; --primary-400: #38bec9; - --primary-500: #2cb1bc; - --primary-600: #14919b; + --primary-500: #0b4f6c; + --primary-600: #0b4f6c; --primary-700: #0e7c86; --primary-800: #0a6c74; --primary-900: #044e54; @@ -37,13 +39,13 @@ --green-dark: #0f5132; /* fonts */ - --headingFont: Sans-Serif; - --bodyFont: Sans-Serif; + --headingFont: 'Fredoka One', Sans-Serif; + --bodyFont: 'Fredoka One', Sans-Serif; --small-text: 0.875rem; --extra-small-text: 0.7em; /* rest of the vars */ --backgroundColor: var(--grey-100); - --textColor: var(--grey-900); + --textColor: #0b4f6c; --borderRadius: 0.25rem; --letterSpacing: 1px; --transition: 0.3s ease-in-out all; @@ -63,7 +65,7 @@ } body { - background: var(--backgroundColor); + background: linear-gradient(#dbdfdc,#9aa6a0,#565c59); font-family: var(--bodyFont); font-weight: 400; line-height: 1.75; @@ -260,8 +262,7 @@ ul { } nav img { - height: 3rem; - margin-right: 1rem; + height: 10rem; } .landing .page { diff --git a/client/src/assets/styles/landing-page.scss b/client/src/assets/styles/landing-page.scss index f7913c1..35a58c2 100644 --- a/client/src/assets/styles/landing-page.scss +++ b/client/src/assets/styles/landing-page.scss @@ -1,4 +1,7 @@ .landing-page { + background-color: #e1efe6; + color: #0b4f6c; + nav { width: var(--fluid-width); max-width: var(--max-width); @@ -8,19 +11,25 @@ align-items: center; } .page { - min-height: calc(100vh - var(--nav-height)); + min-height: calc(120vh - var(--nav-height)); display: grid; align-items: center; margin-top: -3rem; + // height: 600px; } h1 { font-weight: 700; span { color: var(--primary-500); + color:#ffa630; + // color: #0b4f6c; + // background-color: #ffa630; + // text-align: center; } } p { color: var(--grey-600); + color: #0b4f6c; } .main-img { display: none; @@ -34,4 +43,9 @@ display: block; } } + + a { + background: #ffa630; + color: #0b4f6c; + } } diff --git a/client/src/assets/styles/large-sidebar.scss b/client/src/assets/styles/large-sidebar.scss index 026cadc..eed46c0 100644 --- a/client/src/assets/styles/large-sidebar.scss +++ b/client/src/assets/styles/large-sidebar.scss @@ -6,11 +6,11 @@ .logo { img { - width: 50px; + width: 10rem; } } .sidebar-container { - background: whitesmoke; + background: #E1EFE6; min-height: 100vh; height: 100%; width: 300px; @@ -31,9 +31,11 @@ padding-left: 2.5rem; } .nav-links { + font-family: 'Fredoka One', cursive; padding-top: 2rem; display: flex; flex-direction: column; + color: #0b4f6c; } .nav-link { display: flex; @@ -43,11 +45,19 @@ padding-left: 2.5rem; text-transform: capitalize; transition: var(--transition); + padding: 8px 8px 8px 32px; + text-decoration: none; + font-size: 18px; + color: #0b4f6c; + background-color: transparent; + display: float; + padding: 20px; } .nav-link:hover { background: var(--grey-50); padding-left: 3rem; color: var(--grey-900); + color: #ffa630; } .nav-link:hover .icon { color: var(--primary-500); @@ -67,3 +77,68 @@ } } } + +// .navbar { +// height: 100%; +// width: 0; +// position: fixed; +// top: 0; +// left: 1rem; +// padding-top: 1rem; +// } + +// .navbar a { +// padding: 8px 8px 8px 32px; +// text-decoration: none; +// font-size: 18px; +// color: #0b4f6c; +// background-color: transparent; +// display: float; +// padding: 20px; +// } + +// .navbar .title { +// font-size: 50px; +// color: #0b4f6c; +// font-family: 'Fredoka One', cursive; +// // font-family: 'Bebas Neue', cursive; +// } + +// .navbar .links { +// margin: 1rem; +// padding: 0; +// list-style: none; +// position: fixed; +// } + +// .navbar li { +// margin: 10px 0; +// border: 1px none #999; +// font-size: 40px; +// text-align: left; +// font-family: 'Fredoka One', cursive; +// // font-family: 'Bebas Neue', cursive; + +// // border: solid #FFA630; +// // border-radius: 25px; +// } + +// .navbar .active { +// background-color: #e1efe6; +// color: #ffa630; +// margin: 0; +// padding: 20px; +// border-radius: 15px; +// } + +// .navbar a:hover { +// color: #ffa630; +// border-radius: 15px; +// padding: 20px; +// } + +// .navbar .signout { +// bottom: 2rem; +// left: 2rem; +// position: fixed; +// } diff --git a/client/src/assets/styles/sub-card2.scss b/client/src/assets/styles/sub-card2.scss new file mode 100644 index 0000000..5e99134 --- /dev/null +++ b/client/src/assets/styles/sub-card2.scss @@ -0,0 +1,219 @@ +.sub-card2 { + /* Subscription Information Card */ + + /* Auto layout */ + display: flex; + flex-direction: row; + align-items: flex-start; + padding: 10px; + gap: 10px; + + position: relative; + width: 344px; + height: 372px; + left: 15px; + top: 37px; + + .email{ + + } + input { + background: none; + border: none; + display: flex; + text-align: center; + } + + .subCardBackground { + box-sizing: border-box; + + width: 324px; + height: 352px; + + background: #e1efe6; + + /* iOS - Lv4 + Drop Shadow + */ + box-shadow: 0px 32px 64px rgba(79, 94, 113, 0.07), + 0px 16px 32px rgba(79, 94, 113, 0.08), + 0px 8px 16px rgba(79, 94, 113, 0.09), 0px 4px 8px rgba(79, 94, 113, 0.1), + 0px 2px 4px rgba(79, 94, 113, 0.11), 0px 0px 2px rgba(79, 94, 113, 0.12); + border-radius: 5px; + + /* Inside auto layout */ + + flex: none; + order: 0; + flex-grow: 0; + + justify-content: center; + + .subType { + input { + color: white; + max-width: 5rem; + } + /* Subscription type */ + box-sizing: border-box; + + /* Auto layout */ + + display: flex; + flex-direction: row; + align-items: flex-start; + padding: 5px 50px 5px 10px; + gap: 2px; + + position: relative; + width: 111px; + height: 34px; + left: 0px; + top: 32px; + + background: #0b4f6c; + border-radius: 0px 10px 10px 0px; + + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-size: 20px; + line-height: 24px; + + color: #ffffff; + + /* Inside auto layout */ + flex: none; + order: 0; + flex-grow: 0; + } + + .subCost { + /* Pricing */ + + /* Auto layout */ + input { + max-width: 2.5rem; + color: #0b4f6c; + } + + display: flex; + flex-direction: row; + align-items: flex-start; + padding: 5px; + gap: 3px; + + position: relative; + width: 94px; + height: 46px; + left: 200px; + top: -10px; + + border-radius: 5px; + + /* $ 10 */ + + width: 62px; + height: 36px; + + font-family: 'Inter'; + font-style: normal; + font-weight: 700; + font-size: 30px; + line-height: 36px; + + color: #0b4f6c; + + /* Inside auto layout */ + + flex: none; + order: 0; + flex-grow: 0; + } + + .subName { + input { + color: #0b4f6c; + } + // align-items: flex-end; + + width: 97px; + height: 36px; + left: 7rem; + font-family: 'Inter'; + font-style: normal; + font-weight: 700; + font-size: 30px; + line-height: 36px; + + color: #0b4f6c; + } + + .paymentDate { + /* Billing Date: */ + + position: relative; + + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-size: 20px; + line-height: 24px; + margin-top: 2rem; + margin-left: 1rem; + color: #0b4f6c; + } + + .activationDate { + position: relative; + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-size: 20px; + line-height: 24px; + margin-top: 0.5rem; + margin-left: 1rem; + color: #0b4f6c; + } + + .email { + position: relative; + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-size: 20px; + line-height: 24px; + margin-top: 0.5rem; + margin-left: 1rem; + color: #0b4f6c; + } + + .cardInfo { + position: relative; + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-size: 20px; + line-height: 24px; + margin-top: 0.5rem; + margin-left: 1rem; + color: #0b4f6c; + } + + button { + // justify-content: space-between; + // align-items: center; + padding: 8px 10px; + gap: 10px; + + // position: relative; + width: 142px; + height: 35px; + border-radius: 5px; + margin-left: 1rem; + margin-top: 1rem; + background: #ffa630; + color: #0b4f6c; + } + } +} diff --git a/client/src/components/FormCard.jsx b/client/src/components/FormCard.jsx new file mode 100644 index 0000000..fbcd77c --- /dev/null +++ b/client/src/components/FormCard.jsx @@ -0,0 +1,161 @@ +import React, { useState } from 'react'; +import { Paper, TextField } from '@mui/material/'; +import Button from '@mui/material/Button'; +import MUFormRowCard from './MUFormRowCard.jsx'; +import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'; +import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; +import { DatePicker } from '@mui/x-date-pickers/DatePicker'; +import '../assets/styles/form-card.scss'; + +const FormCard = ({ fetchData }) => { + const API_URL = 'http://localhost:3000/subs'; + + const subInformation = { + subName: '', + subTier: '', + subCost: '', + subType: '', + }; + + //state to handle form inputs + const [inputs, setInputs] = useState(subInformation); + + //for date picker + const [paymentDate, setPaymentDate] = useState(null); + + //for date picker + const [activationDate, setActivationDate] = useState(null); + + const handleChange = (e) => { + //console logs to see state being updated + + // console.log({ inputs }); + // console.log([e.target.name]); + // console.log('on change'); + // console.log(inputs); + + //descontructing target name from inputs object and reassigning the keyvalue to the current value + setInputs((prevState) => ({ + ...prevState, + [e.target.name]: e.target.value, + })); + }; + + const handleClick = (e) => { + //prevent form from auto-sending? + e.preventDefault(); + + const options = { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + name: inputs.subName, + tier: inputs.subTier, + cost: inputs.subCost, + paymentDate: paymentDate, + subscriptionType: inputs.subType, + activationDate: activationDate, + }), + }; + + fetch(API_URL, options) + .then((data) => data.json()) + .then((data) => { + setInputs((prevState) => ({ + ...prevState, + subName: '', + subTier: '', + subCost: '', + subType: '', + })); + + fetchData(); + setPaymentDate(null); + setActivationDate(null); + + // console.log(inputs); + // console.log('done posting'); + }); + }; + + return ( +
+ +
+ + + {/* */} + + + + + +
+ + + + { + setPaymentDate(newDate); + }} + renderInput={(params) => } + /> + +
+ +
+ + + + { + setActivationDate(newDate); + }} + renderInput={(params) => } + /> + +
+ + +
+ + {/* */} +
+ ); +}; + +export default FormCard; diff --git a/client/src/components/FormRow.jsx b/client/src/components/FormRow.jsx index 37332b3..37bbd6d 100644 --- a/client/src/components/FormRow.jsx +++ b/client/src/components/FormRow.jsx @@ -5,13 +5,32 @@ const FormRow = ({ handleChange, autocomplete = 'on', labelText, + price, }) => { + if (price) { + return ( +
+ +
+ ); + } + return (
+ + + {/* */}
); }; diff --git a/client/src/components/Logo.jsx b/client/src/components/Logo.jsx index b96c6e8..af520a5 100644 --- a/client/src/components/Logo.jsx +++ b/client/src/components/Logo.jsx @@ -1,4 +1,4 @@ -import favicon from '../assets/images/logo.png'; +import favicon from '../assets/images/logo.svg'; const Logo = () => { return ( diff --git a/client/src/components/MUFormRow.jsx b/client/src/components/MUFormRow.jsx new file mode 100644 index 0000000..f719e46 --- /dev/null +++ b/client/src/components/MUFormRow.jsx @@ -0,0 +1,56 @@ +const MUFormRow = ({ + type, + name, + value, + handleChange, + autocomplete = 'on', + labelText, + price, +}) => { + if (price) { + return ( +
+ +
+ ); + } + + return ( +
+ {/* */} + + + + {/* */} +
+ ); +}; +export default MUFormRow; diff --git a/client/src/components/MUFormRowCard.jsx b/client/src/components/MUFormRowCard.jsx new file mode 100644 index 0000000..fb331e0 --- /dev/null +++ b/client/src/components/MUFormRowCard.jsx @@ -0,0 +1,61 @@ +const MUFormRowCard = ({ + type, + name, + value, + handleChange, + autocomplete = 'on', + labelText, + price, +}) => { + if (price) { + return ( +
+ + + +
+ ); + } + + return ( +
+ + + + + {/* */} +
+ ); +}; +export default MUFormRowCard; diff --git a/client/src/components/NavLinks.jsx b/client/src/components/NavLinks.jsx index 5b584a1..4dcc24a 100644 --- a/client/src/components/NavLinks.jsx +++ b/client/src/components/NavLinks.jsx @@ -11,7 +11,9 @@ const NavLinks = ({ toggleSidebar }) => { to={path} key={id} onClick={toggleSidebar} - className={({ isActive }) => (isActive ? 'active-link' : 'link')} + className={({ isActive }) => + isActive ? 'active nav-link' : 'nav-link' + } > {text} diff --git a/client/src/components/SubCard.jsx b/client/src/components/SubCard.jsx new file mode 100644 index 0000000..2ecb3b4 --- /dev/null +++ b/client/src/components/SubCard.jsx @@ -0,0 +1,186 @@ +import React, { useState } from 'react'; +import { Paper, TextField, Button } from '@mui/material/'; +import MUFormRow from './MUFormRow.jsx'; +import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'; +import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; +import moment from 'moment'; +import { DatePicker } from '@mui/x-date-pickers/DatePicker'; +import '../assets/styles/sub-card2.scss'; +import { useAppContext } from '../context/appContext'; +//Tree shake sub from props +const SubCard = ({ + id, + name, + tier, + cost, + paymentDate, + subscriptionType, + activationDate, + fetchData, +}) => { + const API_URL = 'http://localhost:3000/subs'; + + const subInformation = { + subName: name, + subTier: tier, + subCost: cost, + subType: subscriptionType, + }; + + //state to handle form inputs + const [inputs, setInputs] = useState(subInformation); + + //for date picker + const [newPaymentDate, setNewPaymentDate] = useState(paymentDate); + + //for date picker + const [newActivationDate, setNewActivationDate] = useState(activationDate); + + const handleChange = (e) => { + //console logs to see state being updated + + // console.log({ inputs }); + // console.log([e.target.name]); + // console.log('on change'); + // console.log(inputs); + + //descontructing target name from inputs object and reassigning the keyvalue to the current value + setInputs((prevState) => ({ + ...prevState, + [e.target.name]: e.target.value, + })); + }; + + //Delete Function + const handleDelete = (subId) => { + const options = { + method: 'DELETE', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ subId }), + }; + + console.log(subId); + + fetch(API_URL + `/${subId}`, options) + .then((data) => data.json()) + .then((data) => { + console.log('this is the data returned from deletion', data); + //after we get a success response, we should grab all of the quests again + + fetchData(); + }); + }; + + const handleEdit = (subId) => { + /** + * TO DO: + * change options below + * then add to OnClick in button below + */ + const options = { + method: 'PUT', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + id, + name: inputs.subName, + tier: inputs.subTier, + cost: inputs.subCost, + paymentDate, + subscriptionType: inputs.subType, + activationDate, + }), + }; + + fetch(API_URL + `/${subId}`, options) + .then((data) => data.json()) + .then((data) => { + console.log('this is the data returned from deletion', data); + //after we get a success response, we should grab all of the quests again + + fetchData(); + }); + }; + const { user } = useAppContext(); + //return a Paper/Box with the subscription information + return ( +
+
+
+ +
+
+ $ + + /mo +
+ +
+ +
+ +
+ Billing Date: {moment(paymentDate).format('MM/DD/YYYY')} +
+ +
+ Activation Date: {moment(activationDate).format('MM/DD/YYYY')} +
+ + {/*
+ + { + setNewPaymentDate(newDate); + }} + renderInput={(params) => } + /> + +
+ +
+ + { + setNewActivationDate(newDate); + }} + renderInput={(params) => } + /> + +
*/} + +
Email: {user.email}
+
Card on file: Visa XXX136
+ + +
+
+ ); +}; + +export default SubCard; diff --git a/client/src/components/Title.jsx b/client/src/components/Title.jsx new file mode 100644 index 0000000..8788b9a --- /dev/null +++ b/client/src/components/Title.jsx @@ -0,0 +1,5 @@ +const Title = ({ title }) => { + return

{title}

; +}; + +export default Title; diff --git a/client/src/pages/Landing.jsx b/client/src/pages/Landing.jsx index 4ceb0bb..e34c29f 100644 --- a/client/src/pages/Landing.jsx +++ b/client/src/pages/Landing.jsx @@ -12,13 +12,10 @@ const Landing = () => {

- Subscription Tracking App + Subscription overload? Subslify your life today!

- Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quos ut - doloremque sapiente nam perferendis neque, distinctio dolores omnis - veniam blanditiis vel ducimus repellat aliquid unde error quasi - praesentium non tempore! + With Subslify, you can easily track, organize, and understand your monthly subscriptions. No more surprise charges or hidden fees - Subslify has you covered. Try it now and take control of your subscription-based expenses!

Login/Register diff --git a/client/src/pages/dashboard/Active.jsx b/client/src/pages/dashboard/Active.jsx index 04eebba..b79c6a2 100644 --- a/client/src/pages/dashboard/Active.jsx +++ b/client/src/pages/dashboard/Active.jsx @@ -1,5 +1,77 @@ +import { useState } from 'react'; +import FormCard from '../../components/FormCard'; +import { Button } from '@mui/material'; +import SubCard from '../../components/SubCard'; +import Title from '../../components/Title'; +import '../../assets/styles/active.scss'; +import '../../assets/styles/sub-card2.scss'; +import { useEffect } from 'react'; + const Active = () => { - return
Active Subscription
; + //had to install a JSON Server package to https://www.npmjs.com/package/json-server + //IMPORTANT: MAKE SURE TO INSTALL LIKE THIS: npm install -g json-server + //Then to start the server json-server --watch db.json + + //ALSO IMPORTANT, need to create a file with the "db.json" naming convention + const API_URL = 'http://localhost:3000/subs'; + + //pseduo state mangement + //start the subList with the Form Card to take in new subscription tracking and make the "last card" the form + const [subList, setSubList] = useState([]); + + //fetchData function + const fetchData = () => { + fetch(API_URL) + .then((data) => data.json()) + .then((data) => { + //updating state to have the SubCard the first in the array and making unshifting the previous to after + + const subListBox = data.map((sub) => { + //reassign dates to the parsed version using moment to ensure proper formatting with in sub card + + console.log('sub payment date', sub.name, sub.paymentDate); + + console.log('sub activation date', sub.name, sub.activationDate); + + return ( +
+
+ +
+
+ ); + }); + + setSubList(() => [...subListBox]); + }); + }; + + useEffect(() => { + fetchData(); + }, []); + + return ( +
+ + + {/* render the current state of subList. At the beginning just a form card. then it will be an array of Sub Cards */} + <div className='active-cards'> + {subList} + <FormCard setSubList={setSubList} fetchData={fetchData} /> + {/* <Button onClick={fetchData}>Get Some Data</Button> */} + </div> + </div> + ); }; export default Active; diff --git a/client/static/favicon.ico b/client/static/favicon.ico index 4a1f430..910465c 100644 Binary files a/client/static/favicon.ico and b/client/static/favicon.ico differ diff --git a/client/static/index.html b/client/static/index.html index bee2940..8fddf02 100644 --- a/client/static/index.html +++ b/client/static/index.html @@ -5,7 +5,7 @@ <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - + <title>Subslify