diff --git a/frontend/frontend/.vite/deps/_metadata.json b/frontend/frontend/.vite/deps/_metadata.json new file mode 100644 index 00000000..6bc63e74 --- /dev/null +++ b/frontend/frontend/.vite/deps/_metadata.json @@ -0,0 +1,8 @@ +{ + "hash": "ea10a7bd", + "configHash": "baf76694", + "lockfileHash": "e3b0c442", + "browserHash": "89947c23", + "optimized": {}, + "chunks": {} +} \ No newline at end of file diff --git a/frontend/frontend/.vite/deps/package.json b/frontend/frontend/.vite/deps/package.json new file mode 100644 index 00000000..3dbc1ca5 --- /dev/null +++ b/frontend/frontend/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/frontend/frontend/package-lock.json b/frontend/frontend/package-lock.json index 1eae7934..fdc877af 100644 --- a/frontend/frontend/package-lock.json +++ b/frontend/frontend/package-lock.json @@ -8,12 +8,14 @@ "name": "frontend", "version": "0.0.0", "dependencies": { - "@emotion/react": "^11.11.3", + "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@fontsource/roboto": "^5.0.8", "@mui/icons-material": "^5.15.11", - "@mui/material": "^5.15.11", + "@mui/material": "^5.15.12", + "@mui/x-date-pickers": "^6.19.6", "axios": "^1.6.7", + "dayjs": "^1.11.10", "i18next": "^23.10.0", "i18next-browser-languagedetector": "^7.2.0", "i18next-http-backend": "^2.5.0", @@ -50,13 +52,13 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -84,9 +86,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -94,11 +96,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -113,6 +115,12 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -227,9 +235,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -285,14 +293,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -312,9 +320,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -354,9 +362,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -365,23 +373,23 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -390,8 +398,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -400,9 +408,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -430,22 +438,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "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/cache": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", @@ -464,9 +456,9 @@ "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==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -477,9 +469,9 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", - "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -1057,9 +1049,9 @@ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "node_modules/@fontsource/roboto": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz", - "integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==" + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.12.tgz", + "integrity": "sha512-x0o17jvgoSSbS9OZnUX2+xJmVRvVCfeaYJjkS7w62iN7CuJWtMf5vJj8LqgC7ibqIkitOHVW+XssRjgrcHn62g==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", @@ -1117,14 +1109,14 @@ "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", - "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -1140,9 +1132,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1155,9 +1147,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", - "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1165,14 +1157,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.37", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.37.tgz", - "integrity": "sha512-/o3anbb+DeCng8jNsd3704XtmmLDZju1Fo8R2o7ugrVtPQ/QpcqddwKNzKPZwa0J5T8YNW3ZVuHyQgbTnQLisQ==", + "version": "5.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.38.tgz", + "integrity": "sha512-AsjD6Y1X5A1qndxz8xCcR8LDqv31aiwlgWMPxFAX/kCKiIGKlK65yMeVZ62iQr/6LBz+9hSKLiD1i4TZdAHKcQ==", "dependencies": { "@babel/runtime": "^7.23.9", "@floating-ui/react-dom": "^2.0.8", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.11", + "@mui/utils": "^5.15.12", "@popperjs/core": "^2.11.8", "clsx": "^2.1.0", "prop-types": "^15.8.1" @@ -1196,18 +1188,18 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.11.tgz", - "integrity": "sha512-JVrJ9Jo4gyU707ujnRzmE8ABBWpXd6FwL9GYULmwZRtfPg89ggXs/S3MStQkpJ1JRWfdLL6S5syXmgQGq5EDAw==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.12.tgz", + "integrity": "sha512-brRO+tMFLpGyjEYHrX97bzqeF6jZmKpqqe1rY0LyIHAwP6xRVzh++zSecOQorDOCaZJg4XkGT9xfD+RWOWxZBA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.11.tgz", - "integrity": "sha512-R5ZoQqnKpd+5Ew7mBygTFLxgYsQHPhgR3TDXSgIHYIjGzYuyPLmGLSdcPUoMdi6kxiYqHlpPj4NJxlbaFD0UHA==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.12.tgz", + "integrity": "sha512-3BXiDlOd3AexZoEXa/VqpIpVIvosCzjLHsdMWzKMXbZdnBiJjmb9ECdqfjn5SpTClO49qvkKLhkTqdBH3fSFGw==", "dependencies": { "@babel/runtime": "^7.23.9" }, @@ -1230,16 +1222,16 @@ } }, "node_modules/@mui/material": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.11.tgz", - "integrity": "sha512-FA3eEuEZaDaxgN3CgfXezMWbCZ4VCeU/sv0F0/PK5n42qIgsPVD6q+j71qS7/62sp6wRFMHtDMpXRlN+tT/7NA==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.12.tgz", + "integrity": "sha512-vXJGg6KNKucsvbW6l7w9zafnpOp0CWc0Wx4mDykuABTpQ5QQBnZxP7+oB4yAS1hDZQ1WobbeIl0CjxK4EEahkA==", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.37", - "@mui/core-downloads-tracker": "^5.15.11", - "@mui/system": "^5.15.11", + "@mui/base": "5.0.0-beta.38", + "@mui/core-downloads-tracker": "^5.15.12", + "@mui/system": "^5.15.12", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.11", + "@mui/utils": "^5.15.12", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", "csstype": "^3.1.3", @@ -1274,12 +1266,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.11.tgz", - "integrity": "sha512-jY/696SnSxSzO1u86Thym7ky5T9CgfidU3NFJjguldqK4f3Z5S97amZ6nffg8gTD0HBjY9scB+4ekqDEUmxZOA==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.12.tgz", + "integrity": "sha512-cqoSo9sgA5HE+8vZClbLrq9EkyOnYysooepi5eKaKvJ41lReT2c5wOZAeDDM1+xknrMDos+0mT2zr3sZmUiRRA==", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.11", + "@mui/utils": "^5.15.12", "prop-types": "^15.8.1" }, "engines": { @@ -1331,15 +1323,15 @@ } }, "node_modules/@mui/system": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.11.tgz", - "integrity": "sha512-9j35suLFq+MgJo5ktVSHPbkjDLRMBCV17NMBdEQurh6oWyGnLM4uhU4QGZZQ75o0vuhjJghOCA1jkO3+79wKsA==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.12.tgz", + "integrity": "sha512-/pq+GO6yN3X7r3hAwFTrzkAh7K1bTF5r8IzS79B9eyKJg7v6B/t4/zZYMR6OT9qEPtwf6rYN2Utg1e6Z7F1OgQ==", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.11", + "@mui/private-theming": "^5.15.12", "@mui/styled-engine": "^5.15.11", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.11", + "@mui/utils": "^5.15.12", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1383,9 +1375,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.11.tgz", - "integrity": "sha512-D6bwqprUa9Stf8ft0dcMqWyWDKEo7D+6pB1k8WajbqlYIRA8J8Kw9Ra7PSZKKePGBGWO+/xxrX1U8HpG/aXQCw==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.12.tgz", + "integrity": "sha512-8SDGCnO2DY9Yy+5bGzu00NZowSDtuyHP4H8gunhHGQoIlhlY2Z3w64wBzAOLpYw/ZhJNzksDTnS/i8qdJvxuow==", "dependencies": { "@babel/runtime": "^7.23.9", "@types/prop-types": "^15.7.11", @@ -1409,6 +1401,71 @@ } } }, + "node_modules/@mui/x-date-pickers": { + "version": "6.19.6", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.19.6.tgz", + "integrity": "sha512-QW9AFcPi0vLpkUhmquhhyhLaBvB0AZJuu3NTrE173qNKx3Z3n51aCLY9bc7c6i4ltZMMsVRHlvzQjsve04TC8A==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0 || ^3.2.0", + "date-fns-jalali": "^2.13.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.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 + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1462,9 +1519,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz", + "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==", "cpu": [ "arm" ], @@ -1475,9 +1532,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz", + "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==", "cpu": [ "arm64" ], @@ -1488,9 +1545,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz", + "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==", "cpu": [ "arm64" ], @@ -1501,9 +1558,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz", + "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==", "cpu": [ "x64" ], @@ -1514,9 +1571,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz", + "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==", "cpu": [ "arm" ], @@ -1527,9 +1584,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz", + "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==", "cpu": [ "arm64" ], @@ -1540,9 +1597,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz", + "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==", "cpu": [ "arm64" ], @@ -1553,9 +1610,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz", + "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==", "cpu": [ "riscv64" ], @@ -1566,9 +1623,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz", + "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==", "cpu": [ "x64" ], @@ -1579,9 +1636,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz", + "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==", "cpu": [ "x64" ], @@ -1592,9 +1649,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz", + "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==", "cpu": [ "arm64" ], @@ -1605,9 +1662,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz", + "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==", "cpu": [ "ia32" ], @@ -1618,9 +1675,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz", + "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==", "cpu": [ "x64" ], @@ -1694,9 +1751,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "18.2.58", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.58.tgz", - "integrity": "sha512-TaGvMNhxvG2Q0K0aYxiKfNDS5m5ZsoIBBbtfUorxdH4NGSXIlYvZxLJI+9Dd3KjeB3780bciLyAb7ylO8pLhPw==", + "version": "18.2.63", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.63.tgz", + "integrity": "sha512-ppaqODhs15PYL2nGUOaOu2RSCCB4Difu4UFrP4I3NHLloXC/ESQzQMi9nvjfT1+rudd0d2L3fQPJxRSey+rGlQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -1704,9 +1761,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", - "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "version": "18.2.20", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.20.tgz", + "integrity": "sha512-HXN/biJY8nv20Cn9ZbCFq3liERd4CozVZmKbaiZ9KiKTrWqsP7eoGDO6OOGvJQwoVFuiXaiJ7nBBjiFFbRmQMQ==", "dev": true, "dependencies": { "@types/react": "*" @@ -1741,16 +1798,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz", - "integrity": "sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", + "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/type-utils": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/type-utils": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1776,15 +1833,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.2.tgz", - "integrity": "sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", + "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4" }, "engines": { @@ -1804,13 +1861,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz", - "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", + "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1821,13 +1878,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.2.tgz", - "integrity": "sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", + "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/utils": "7.0.2", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/utils": "7.1.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1848,9 +1905,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz", - "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", + "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1861,13 +1918,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz", - "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", + "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1889,17 +1946,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz", - "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", + "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", "semver": "^7.5.4" }, "engines": { @@ -1914,12 +1971,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz", - "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", + "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/types": "7.1.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2124,9 +2181,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001589", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", - "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", + "version": "1.0.30001594", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", + "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", "dev": true, "funding": [ { @@ -2156,6 +2213,14 @@ "node": ">=4" } }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/clsx": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", @@ -2195,10 +2260,9 @@ "dev": true }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -2242,6 +2306,11 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2307,9 +2376,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.681", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz", - "integrity": "sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==", + "version": "1.4.693", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.693.tgz", + "integrity": "sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==", "dev": true }, "node_modules/error-ex": { @@ -2368,11 +2437,14 @@ } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { @@ -2538,18 +2610,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/eslint/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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -3697,9 +3757,9 @@ } }, "node_modules/react-i18next": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.0.5.tgz", - "integrity": "sha512-5+bQSeEtgJrMBABBL5lO7jPdSNAbeAZ+MlFWDw//7FnVacuVu3l9EeWFzBQvZsKy+cihkbThWOAThEdH8YjGEw==", + "version": "14.0.7", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.0.7.tgz", + "integrity": "sha512-8VN7IUaTB5t6ut/1LZtdHstQl1KSFStZRw3UGAERfkToVKLF4yvQVMz/Tq/YG3VR2zaWHEU8WrvIbVGhCqv90Q==", "dependencies": { "@babel/runtime": "^7.23.9", "html-parse-stringify": "^3.0.1" @@ -3844,9 +3904,9 @@ } }, "node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz", + "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -3859,19 +3919,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@rollup/rollup-android-arm-eabi": "4.12.1", + "@rollup/rollup-android-arm64": "4.12.1", + "@rollup/rollup-darwin-arm64": "4.12.1", + "@rollup/rollup-darwin-x64": "4.12.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.1", + "@rollup/rollup-linux-arm64-gnu": "4.12.1", + "@rollup/rollup-linux-arm64-musl": "4.12.1", + "@rollup/rollup-linux-riscv64-gnu": "4.12.1", + "@rollup/rollup-linux-x64-gnu": "4.12.1", + "@rollup/rollup-linux-x64-musl": "4.12.1", + "@rollup/rollup-win32-arm64-msvc": "4.12.1", + "@rollup/rollup-win32-ia32-msvc": "4.12.1", + "@rollup/rollup-win32-x64-msvc": "4.12.1", "fsevents": "~2.3.2" } }, @@ -4162,9 +4222,9 @@ } }, "node_modules/vite": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", - "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", "dev": true, "dependencies": { "esbuild": "^0.19.3", diff --git a/frontend/frontend/package.json b/frontend/frontend/package.json index 8c6fec59..e53efebe 100644 --- a/frontend/frontend/package.json +++ b/frontend/frontend/package.json @@ -10,12 +10,14 @@ "preview": "vite preview" }, "dependencies": { - "@emotion/react": "^11.11.3", + "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@fontsource/roboto": "^5.0.8", "@mui/icons-material": "^5.15.11", - "@mui/material": "^5.15.11", + "@mui/material": "^5.15.12", + "@mui/x-date-pickers": "^6.19.6", "axios": "^1.6.7", + "dayjs": "^1.11.10", "i18next": "^23.10.0", "i18next-browser-languagedetector": "^7.2.0", "i18next-http-backend": "^2.5.0", diff --git a/frontend/frontend/src/assets/logo_UGent_EN_RGB_2400_color-on-white.png b/frontend/frontend/public/assets/logo_UGent_EN_RGB_2400_color-on-white.png similarity index 100% rename from frontend/frontend/src/assets/logo_UGent_EN_RGB_2400_color-on-white.png rename to frontend/frontend/public/assets/logo_UGent_EN_RGB_2400_color-on-white.png diff --git a/frontend/frontend/src/assets/logo_UGent_EN_RGB_2400_color.png b/frontend/frontend/public/assets/logo_UGent_EN_RGB_2400_color.png similarity index 100% rename from frontend/frontend/src/assets/logo_UGent_EN_RGB_2400_color.png rename to frontend/frontend/public/assets/logo_UGent_EN_RGB_2400_color.png diff --git a/frontend/frontend/src/assets/logo_UGent_EN_RGB_2400_white.png b/frontend/frontend/public/assets/logo_UGent_EN_RGB_2400_white.png similarity index 100% rename from frontend/frontend/src/assets/logo_UGent_EN_RGB_2400_white.png rename to frontend/frontend/public/assets/logo_UGent_EN_RGB_2400_white.png diff --git a/frontend/frontend/src/assets/logo_UGent_NL_RGB_2400_kleur-op-wit.png b/frontend/frontend/public/assets/logo_UGent_NL_RGB_2400_kleur-op-wit.png similarity index 100% rename from frontend/frontend/src/assets/logo_UGent_NL_RGB_2400_kleur-op-wit.png rename to frontend/frontend/public/assets/logo_UGent_NL_RGB_2400_kleur-op-wit.png diff --git a/frontend/frontend/src/assets/logo_UGent_NL_RGB_2400_kleur.png b/frontend/frontend/public/assets/logo_UGent_NL_RGB_2400_kleur.png similarity index 100% rename from frontend/frontend/src/assets/logo_UGent_NL_RGB_2400_kleur.png rename to frontend/frontend/public/assets/logo_UGent_NL_RGB_2400_kleur.png diff --git a/frontend/frontend/src/assets/logo_UGent_NL_RGB_2400_wit.png b/frontend/frontend/public/assets/logo_UGent_NL_RGB_2400_wit.png similarity index 100% rename from frontend/frontend/src/assets/logo_UGent_NL_RGB_2400_wit.png rename to frontend/frontend/public/assets/logo_UGent_NL_RGB_2400_wit.png diff --git a/frontend/frontend/src/assets/react.svg b/frontend/frontend/public/assets/react.svg similarity index 100% rename from frontend/frontend/src/assets/react.svg rename to frontend/frontend/public/assets/react.svg diff --git a/frontend/frontend/src/assets/ufo-logo-3375276369.png b/frontend/frontend/public/assets/ufo-logo-3375276369.png similarity index 100% rename from frontend/frontend/src/assets/ufo-logo-3375276369.png rename to frontend/frontend/public/assets/ufo-logo-3375276369.png diff --git a/frontend/frontend/src/Theme.ts b/frontend/frontend/src/Theme.ts index a16a5b44..4b54483a 100644 --- a/frontend/frontend/src/Theme.ts +++ b/frontend/frontend/src/Theme.ts @@ -4,6 +4,8 @@ const theme = createTheme({ palette: { primary: { main: '#1E64C8', + light: '#D0E4FF', + dark: '#1E64C8', contrastText: '#FCF8FD' }, secondary: { @@ -15,15 +17,17 @@ const theme = createTheme({ }, text: { primary: '#47464A', - secondary: '#898991' + secondary: '#FCF8FD' }, error: { main: '#FF5445' }, success: { main: '#81A476' - } + }, + }, + }); export default theme; \ No newline at end of file diff --git a/frontend/frontend/src/components/AssignmentListItem.tsx b/frontend/frontend/src/components/AssignmentListItem.tsx index 2e222f42..d1b63a66 100644 --- a/frontend/frontend/src/components/AssignmentListItem.tsx +++ b/frontend/frontend/src/components/AssignmentListItem.tsx @@ -3,12 +3,13 @@ import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; import HighlightOffIcon from '@mui/icons-material/HighlightOff'; import {useNavigate} from "react-router-dom"; import {t} from "i18next"; + interface AssignmentListItemProps { - key: string; + id: string; projectName: string; dueDate?: Date; status: boolean; - isStudent:boolean; + isStudent: boolean; } /* @@ -20,16 +21,16 @@ interface AssignmentListItemProps { * @param isStudent: boolean - if the user is a student or a teacher */ -export function AssignmentListItem({key,projectName, dueDate, status,isStudent}:AssignmentListItemProps) { +export function AssignmentListItem({id, projectName, dueDate, status, isStudent}: AssignmentListItemProps) { const navigate = useNavigate(); const handleProjectClick = () => { console.log("Project clicked"); - navigate(`/${key}`) + navigate(`/${id}`) } return ( <> - + - - - {isStudent && {status?:}} + + + {isStudent && {status ? + : + }} diff --git a/frontend/frontend/src/components/AssignmentListItemSubjectsPage.tsx b/frontend/frontend/src/components/AssignmentListItemSubjectsPage.tsx new file mode 100644 index 00000000..6ad833a0 --- /dev/null +++ b/frontend/frontend/src/components/AssignmentListItemSubjectsPage.tsx @@ -0,0 +1,62 @@ +import {ListItem, ListItemButton, ListItemText, Divider} from "@mui/material"; +import {useNavigate} from "react-router-dom"; +import {t} from "i18next"; +interface AssignmentListItemSubjectsPageProps { + key: string; + projectName: string; + dueDate?: Date; + submissions: number; + score: number; + isStudent: boolean; +} + +/* +* This component is used to display a single assignment in the list of assignments +* @param key: string - the key of the assignment +* @param projectName: string - the name of the project +* @param dueDate: Date - the due date of the project +* @param submissions: number - number of submissions for the project +* @param score: number - assigned score on the project +* @param isStudent: boolean - if the user is a student or a teacher +*/ + +export function AssignmentListItemSubjectsPage({key,projectName, dueDate, submissions, score, isStudent}:AssignmentListItemSubjectsPageProps) { + const navigate = useNavigate(); + const handleProjectClick = () => { + console.log("Project clicked"); + navigate(`/${key}`) + } + + return ( + <> + + + {isStudent? + <> + + + + + + : + <> + + + + + } + + + + + ); +} \ No newline at end of file diff --git a/frontend/frontend/src/components/CourseCard.tsx b/frontend/frontend/src/components/CourseCard.tsx index c61cc633..0faa2998 100644 --- a/frontend/frontend/src/components/CourseCard.tsx +++ b/frontend/frontend/src/components/CourseCard.tsx @@ -1,7 +1,7 @@ import {Box, Card, CardActionArea, CardContent, Divider, IconButton, Typography} from "@mui/material"; import {t} from "i18next"; import List from '@mui/material/List'; -import { AssignmentListItem } from "./AssignmentListItem"; +import {AssignmentListItem} from "./AssignmentListItem"; import {useNavigate} from "react-router-dom"; import ArchiveOutlinedIcon from '@mui/icons-material/ArchiveOutlined'; /* @@ -53,106 +53,117 @@ export function CourseCard({courseId, archived, isStudent}: CourseCardProps) { return ( <> - + - - - {course.name} - {course.teacher} - - - {t("students")}{course.students.length} + + + {course.name} + {course.teacher} + + + {t("students")}{course.students.length} + - - {isStudent? - - Project - Deadline - Status - : + {isStudent ? + + Project + Deadline + Status + : <> - {archived? - - Project - Deadline - + {archived ? + + Project + Deadline + : - - Project - Deadline - - } + + Project + Deadline + + } } - {isStudent? - - - {assignments.map((assignment) => ( - - ))} - - : - <>{!archived? - + {isStudent ? + {assignments.map((assignment) => ( - ))} : - - - {assignments.map((assignment) => ( - - ))} - - + <>{!archived ? + + + {assignments.map((assignment) => ( + + ))} + + : + + + {assignments.map((assignment) => ( + + ))} + + } - {!archived && - - - } + {!archived && + + + } } diff --git a/frontend/frontend/src/components/DeadlineCalendar.tsx b/frontend/frontend/src/components/DeadlineCalendar.tsx new file mode 100644 index 00000000..9d00b54f --- /dev/null +++ b/frontend/frontend/src/components/DeadlineCalendar.tsx @@ -0,0 +1,128 @@ +import {DateCalendar, DayCalendarSkeleton, PickersDay, PickersDayProps} from "@mui/x-date-pickers"; +import dayjs, {Dayjs} from "dayjs"; +import {Badge, SxProps} from "@mui/material"; +import {useEffect, useRef, useState} from "react"; +import AssignmentIcon from '@mui/icons-material/Assignment'; + +//TODO: fix highlights for day with deadlines in the displayed month + +function fakeFetch(date: Dayjs, {signal}: { signal: AbortSignal }, deadlines: Dayjs[]) { + return new Promise<{ deadlinesToDisplay: Dayjs[] }>((resolve, reject) => { + const timeout = setTimeout(() => { + const deadlinesToDisplay = deadlines.filter(deadline => + deadline.month() === date.month() && deadline.year() === date.year() + ); + resolve({deadlinesToDisplay}); + }, 500); + + signal.onabort = () => { + clearTimeout(timeout); + reject(new DOMException('aborted', 'AbortError')); + }; + }); +} + + +function ServerDay(props: PickersDayProps & { highlightedDays?: number[] }) { + const {highlightedDays = [], day, outsideCurrentMonth, ...other} = props; + + const isSelected = + !props.outsideCurrentMonth && highlightedDays.indexOf(props.day.date()) >= 0; + + return ( + : undefined} + > + + + ); +} + +/* +* This component is a calendar that displays deadlines. +* It uses the DateCalendar component from @mui/x-date-pickers to display the calendar. +* The calendar is read-only and the user can't select a date. +* The deadlines are passed as an array of Dayjs objects. +* The deadlines are displayed as a badge on the day of the deadline. + */ + +interface DeadlineCalendarProps { + deadlines: Dayjs[]; +} + +export function DeadlineCalendar({deadlines}: DeadlineCalendarProps) { + const requestAbortController = useRef(null); + const [isLoading, setIsLoading] = useState(false); + const [highlightedDays, setHighlightedDays] = useState([1, 2, 15]); + const [value, setValue] = useState(dayjs()); + + const fetchHighlightedDays = (date: Dayjs) => { + const controller = new AbortController(); + fakeFetch(date, { + signal: controller.signal, + }, deadlines) + .then(({deadlinesToDisplay}) => { + setHighlightedDays(deadlinesToDisplay.map(deadline => deadline.date())); + setIsLoading(false); + }) + .catch((error: Error) => { + // ignore the error if it's caused by `controller.abort` + if (error.name !== 'AbortError') { + throw error; + } + }); + + requestAbortController.current = controller; + }; + + useEffect(() => { + fetchHighlightedDays(dayjs()); + // abort request on unmount + return () => requestAbortController.current?.abort(); + }, []); + + const handleMonthChange = (date: Dayjs) => { + if (requestAbortController.current) { + // make sure that you are aborting useless requests + // because it is possible to switch between months pretty quickly + requestAbortController.current.abort(); + } + + setIsLoading(true); + setHighlightedDays([]); + fetchHighlightedDays(date); + }; + + return ( + <> + setValue(newValue)} + onMonthChange={handleMonthChange} + renderLoading={() => } + loading={isLoading} + sx={dateStyle} + slots={{ + day: ServerDay, + }} + slotProps={{ + day: { + highlightedDays, + } as any, + }} + /> + + ); +} + +const dateStyle: SxProps = { + "& .MuiPickersDay-root.Mui-selected": { + color: "text.primary", + backgroundColor: "secondary.main", + }, + "& .MuiPickersDay-root.Mui-selected:hover": { + backgroundColor: "secondary.main", + }, + +}; \ No newline at end of file diff --git a/frontend/frontend/src/components/StudentScoreListItem.tsx b/frontend/frontend/src/components/StudentScoreListItem.tsx new file mode 100644 index 00000000..74d6bccd --- /dev/null +++ b/frontend/frontend/src/components/StudentScoreListItem.tsx @@ -0,0 +1,50 @@ +import {ListItem, ListItemText, Divider, TextField, IconButton} from "@mui/material"; +import DownloadIcon from '@mui/icons-material/Download'; +import {t} from "i18next"; + +interface StudentScoreListItemProps { + key: string; + studentName: string; + submissionFiles: string[]; +} + +/* +* This component is used to display a single assignment in the list of assignments +* @param key: string - the key of the studentOnProject +* @param studentName: string - the name of the student +* @param submissionFiles: string[] - a list of all files submitted by this student +*/ + +export function StudentScoreListItem({key, studentName, submissionFiles}:StudentScoreListItemProps) { + return ( + <> + + + <> + + + + + + + + + + + + + + + + + ); +} \ No newline at end of file diff --git a/frontend/frontend/src/i18n/config.ts b/frontend/frontend/src/i18n/config.ts index 9ab92b38..7b0c659f 100644 --- a/frontend/frontend/src/i18n/config.ts +++ b/frontend/frontend/src/i18n/config.ts @@ -3,28 +3,44 @@ import i18n from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; const english = { - logo: "./src/assets/logo_UGent_EN_RGB_2400_white.png", - logo_blue: "./src/assets/logo_UGent_EN_RGB_2400_color.png", + logo: "/assets/logo_UGent_EN_RGB_2400_white.png", + logo_blue: "/assets/logo_UGent_EN_RGB_2400_color.png", login: "Log in with your UGent account", - back : "Back", + back: "Back", current_courses: "Current courses", archived: "Archived", students: "Students: ", no_deadline: "No deadline", + add_admin: "Add admin", + submission: "Submission", + error: "Something went wrong.", + assignment: "Assignment:", + filename: "Submitted file:", + restrictions: "Restrictions:", + current_projects: "Current projects", }; const dutch = { - logo: "./src/assets/logo_UGent_NL_RGB_2400_wit.png", - logo_blue: "./src/assets/logo_UGent_NL_RGB_2400_kleur.png", + logo: "/assets/logo_UGent_NL_RGB_2400_wit.png", + logo_blue: "/assets/logo_UGent_NL_RGB_2400_kleur.png", login: "Log in met je UGent account", - back : "Terug", + back: "Terug", current_courses: "Huidige vakken", archived: "Gearchiveerd", students: "Studenten: ", no_deadline: "Geen deadline", + add_admin: "Voeg admin toe", + submission: "Indiening", + error: "Er is iets misgegaan.", + assignment: "Opgave:", + filename: "Ingediend bestand:", + restrictions: "Restricties:", + current_projects: "Huidige projecten", }; -i18n.use(initReactI18next).use(LanguageDetector).init({ fallbackLng: "en", - debug:true, interpolation: {escapeValue: false}, - resources: {en: {translation: english}, nl: {translation: dutch}}}); +i18n.use(initReactI18next).use(LanguageDetector).init({ + fallbackLng: "en", + debug: true, interpolation: {escapeValue: false}, + resources: {en: {translation: english}, nl: {translation: dutch}} +}); export default i18n; \ No newline at end of file diff --git a/frontend/frontend/src/main.tsx b/frontend/frontend/src/main.tsx index f048b358..9141dcd8 100644 --- a/frontend/frontend/src/main.tsx +++ b/frontend/frontend/src/main.tsx @@ -8,24 +8,68 @@ import ErrorPage from "./pages/ErrorPage.tsx"; import {MainPage} from "./pages/mainPage/MainPage.tsx"; import {Helmet, HelmetProvider} from "react-helmet-async"; + +import { SubjectsStudentPage } from "./pages/subjectsPage/SubjectsStudentPage.tsx"; +import { SubjectsTeacherPage } from "./pages/subjectsPage/SubjectsTeacherPage.tsx"; +import { ProjectScoresPage } from "./pages/scoresPage/ProjectScoresPage.tsx"; +import { SubjectsStudentPage } from "./pages/subjects_page/SubjectsStudentPage.tsx"; +import { AssignmentStudentPage } from "./pages/assignmentPage/assignmentStudentPage"; +import { AssignmentTeacherPage } from "./pages/assignmentPage/assignmentTeacherPage.tsx"; +import { GroupsPage } from "./pages/groupsPage/groupsPage.tsx"; import {SubjectsStudentPage} from "./pages/subjects_page/SubjectsStudentPage.tsx"; +import {LocalizationProvider} from "@mui/x-date-pickers"; +import {AdapterDayjs} from '@mui/x-date-pickers/AdapterDayjs/AdapterDayjs'; + +import {SubmissionPage} from "./pages/submissionPage/SubmissionPage.tsx"; import {SimpleRequestsPage} from "./pages/simpleRequestsPage/SimpleRequestsPage.tsx"; const router = createBrowserRouter([ - { - path: "/", - element: , - errorElement: , - }, - { + { + path: "/", + element: , + errorElement: , + }, + { + path: "/subjects_student/:courseId", + element: , + }, + { + + path: "/subjects_teacher/:courseId", + element: , + }, + { + path: "/scores", + element: , + }, + + path: "/assignment_student", + element: , + }, + { + path: "/assignment_teacher", + element: , + }, + { + path: "/groups", + element: , + }, + { path: "/subjects_student", element: , }, + { + + path: "/submission/:project", + element: , + }, + { path: "/test_requests", element: , } + ]); ReactDOM.createRoot(document.getElementById("root")!).render( @@ -37,7 +81,9 @@ ReactDOM.createRoot(document.getElementById("root")!).render( Loading...}> - + + + diff --git a/frontend/frontend/src/pages/ErrorPage.tsx b/frontend/frontend/src/pages/ErrorPage.tsx index 6afd2b0f..0efc778b 100644 --- a/frontend/frontend/src/pages/ErrorPage.tsx +++ b/frontend/frontend/src/pages/ErrorPage.tsx @@ -1,18 +1,122 @@ -import { useRouteError } from "react-router-dom"; +import {isRouteErrorResponse, useRouteError} from "react-router-dom"; +import {Box, Typography} from "@mui/material"; +import {t} from "i18next"; -//TODO:: fix a decent error page export default function ErrorPage() { const error = useRouteError(); console.error(error); + let errorMessage: string; + + if (isRouteErrorResponse(error)) { + // error is type `ErrorResponse` + errorMessage = error.error?.message || error.statusText; + } else if (error instanceof Error) { + errorMessage = error.message; + } else if (typeof error === 'string') { + errorMessage = error; + } else { + console.error(error); + errorMessage = 'Unknown error'; + } return ( -
-

Oops!

-

Sorry, an unexpected error has occurred.

-

- error -

-
+ <> + + + + + + + + {t("error")} + + + {errorMessage} + + + + + + ); } \ No newline at end of file diff --git a/frontend/frontend/src/pages/SubjectsPage/ArchivedProjectsView.tsx b/frontend/frontend/src/pages/SubjectsPage/ArchivedProjectsView.tsx new file mode 100644 index 00000000..0f4cded8 --- /dev/null +++ b/frontend/frontend/src/pages/SubjectsPage/ArchivedProjectsView.tsx @@ -0,0 +1,7 @@ +export function ArchivedProjectsView() { + return ( + <> + + + ); +} \ No newline at end of file diff --git a/frontend/frontend/src/pages/SubjectsPage/ProjectsView.tsx b/frontend/frontend/src/pages/SubjectsPage/ProjectsView.tsx new file mode 100644 index 00000000..70266f32 --- /dev/null +++ b/frontend/frontend/src/pages/SubjectsPage/ProjectsView.tsx @@ -0,0 +1,101 @@ +import {Box, Typography} from "@mui/material"; +import List from '@mui/material/List'; +import {AssignmentListItemSubjectsPage} from "../../components/AssignmentListItemSubjectsPage.tsx"; + +interface ProjectsViewProps { + courseId: string; + isStudent: boolean; +} + +interface Course { + id: string; + name: string; + teacher: string; + students: string[]; + //list of assignment ids + assignments: string[]; + archived: boolean; +} + +interface Assignment { + id: string; + name: string; + deadline?: Date; + submissions: number; + score: number; +} + +export function ProjectsView({courseId, isStudent}: ProjectsViewProps) { + const course = getCourse(courseId); + const assignments = course.assignments.map((assignmentId) => getAssignment(assignmentId)); + + return ( + <> + + {isStudent? + <> + Project + Deadline + Submissions + Score + + : + <> + Project + Deadline + Edit + + } + + + + + + {assignments.map((assignment) => ( + + ))} + + + + + + ); +} + +//TODO: use api to get data, for now use mock data +function getCourse(courseId: string): Course { + return { + id: courseId, + name: "courseName", + teacher: "teacher", + students: ["student1", "student2"], + archived: false, + assignments: ["assignment1", "assignment2", "assignment3", "assignment4", "assignment5", "assignment6", "assignment7", "assignment8", "assignment9"] + } +} + +function getAssignment(assignmentId: string): Assignment { + return { + id: assignmentId, + name: "assignmentName", + deadline: new Date(2022, 11, 17), + submissions: 2, + score: 10 + } +} \ No newline at end of file diff --git a/frontend/frontend/src/pages/SubjectsPage/SubjectsStudentPage.tsx b/frontend/frontend/src/pages/SubjectsPage/SubjectsStudentPage.tsx new file mode 100644 index 00000000..512c33a7 --- /dev/null +++ b/frontend/frontend/src/pages/SubjectsPage/SubjectsStudentPage.tsx @@ -0,0 +1,22 @@ +import { Header } from "../../components/Header"; +import { Box, Stack } from "@mui/material"; +import TabSwitcher from "../../components/TabSwitcher.tsx"; +import {ArchivedProjectsView} from "./ArchivedProjectsView.tsx"; +import {ProjectsView} from "./ProjectsView.tsx"; +import { useParams } from "react-router-dom"; + +export function SubjectsStudentPage() { + let { courseId } = useParams(); + courseId = String(courseId); + return ( + <> + +
+ + ,]}/> + + + + ); +} \ No newline at end of file diff --git a/frontend/frontend/src/pages/SubjectsPage/SubjectsTeacherPage.tsx b/frontend/frontend/src/pages/SubjectsPage/SubjectsTeacherPage.tsx new file mode 100644 index 00000000..1858afe4 --- /dev/null +++ b/frontend/frontend/src/pages/SubjectsPage/SubjectsTeacherPage.tsx @@ -0,0 +1,22 @@ +import { Header } from "../../components/Header"; +import { Box, Stack } from "@mui/material"; +import TabSwitcher from "../../components/TabSwitcher.tsx"; +import {ArchivedProjectsView} from "./ArchivedProjectsView.tsx"; +import {ProjectsView} from "./ProjectsView.tsx"; +import { useParams } from "react-router-dom"; + +export function SubjectsTeacherPage() { + let { courseId } = useParams(); + courseId = String(courseId); + return ( + <> + +
+ + ,]}/> + + + + ); +} \ No newline at end of file diff --git a/frontend/frontend/src/pages/assignmentPage/assignmentStudentPage.tsx b/frontend/frontend/src/pages/assignmentPage/assignmentStudentPage.tsx new file mode 100644 index 00000000..d4ee8111 --- /dev/null +++ b/frontend/frontend/src/pages/assignmentPage/assignmentStudentPage.tsx @@ -0,0 +1,126 @@ +import {Header} from "../../components/Header.tsx"; +import { AssignmentListItem } from "../../components/AssignmentListItem.tsx"; +import {Box,List, Button, Stack, Typography, Card, Divider} from "@mui/material"; + +const text = "Lorem ipsum dolor sit amet consectetur. Nisi magna dolor et nisi nibh et velit phasellus. Aliquam semper justo posuere suspendisse amet amet nam nec. Tellus magna in proin tempor hac sit. Faucibus laoreet nulla commodo quis. Porttitor sit facilisis sit dignissim quis. Malesuada etiam tempor donec et ante. Aliquam massa donec augue aliquam semper amet blandit sed faucibus. Et elementum duis adipiscing turpis mi. Senectus eu rutrum accumsan convallis metus mattis risus. Quam eget sapien tellus aliquam facilisi sit volutpat. Scelerisque auctor purus nam sit lacus amet ullamcorper amet. Turpis nulla quis in pretium. Maecenas aliquam ac ullamcorper suspendisse morbi cras. Mi nibh aliquet massa sit eget tristique a. Posuere pretium auctor tellus massa et eu egestas. Sit lorem proin aenean tortor morbi condimentum. Leo eu enim cursus tempus sed viverra laoreet. Nisl ornare velit molestie suspendisse. Hendrerit nibh mauris vulputate sit vitae. Tellus quisque non nibh proin nunc lacus scelerisque dui. Aliquam fermentum libero aliquet volutpat at. Vestibulum ultrices nec felis leo nibh viverra. Hendrerit ut nunc porta egestas sit velit dictumst dis porta. Donec quam aliquam commodo mattis purus. Tellus nulla lectus fusce in fames scelerisque at." + +const assignments = [ + { + id: '1', + name: '#1', + deadline: new Date(2024, 11, 17) + }, + { + id: '2', + name: '#2', + deadline: new Date(2024, 10, 25) + }, + { + id: '3', + name: '#3', + deadline: new Date(2024, 9, 30) + }, + { + id: '4', + name: '#4', + deadline: new Date(2024, 8, 12) + }, + { + id: '5', + name: '#5', + deadline: new Date(2024, 7, 8) + }, + { + id: '6', + name: '#6', + deadline: new Date(2024, 6, 15) + }, + { + id: '7', + name: '#7', + deadline: new Date(2024, 5, 20) + }, + { + id: '8', + name: '#8', + deadline: new Date(2024, 4, 10) + }, + { + id: '9', + name: '#9', + deadline: new Date(2024, 3, 28) + } +]; + + + +export function AssignmentStudentPage() { + return ( + <> +
+ + + {/*deadline and groep button */ } + + Deadline: 02/04/2024 +
+ + + + {/*Opgave*/ } + + + Opgave + {text} + + + + {/*Indieningen*/ } + + + Indiening + Datum + + + {assignments.map((assignment) => ( + <> + + + + + ))} + + + + {/*Upload knop*/ } + + +
+ + + + + + ); +} diff --git a/frontend/frontend/src/pages/assignmentPage/assignmentTeacherPage.tsx b/frontend/frontend/src/pages/assignmentPage/assignmentTeacherPage.tsx new file mode 100644 index 00000000..fbc7653a --- /dev/null +++ b/frontend/frontend/src/pages/assignmentPage/assignmentTeacherPage.tsx @@ -0,0 +1,136 @@ +import {Header} from "../../components/Header.tsx"; +import {Grid ,TextField,Box,List, Button, Stack, Typography, Card, Divider, ListItem, ListItemText} from "@mui/material"; +import UploadIcon from '@mui/icons-material/Upload'; +import SaveIcon from '@mui/icons-material/Save'; +import AddIcon from '@mui/icons-material/Add'; +import { LocalizationProvider } from '@mui/x-date-pickers'; +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs' +import { DatePicker } from '@mui/x-date-pickers/DatePicker'; + +const text = "Lorem ipsum dolor sit amet consectetur. Nisi magna dolor et nisi nibh et velit phasellus. Aliquam semper justo posuere suspendisse amet amet nam nec. Tellus magna in proin tempor hac sit. Faucibus laoreet nulla commodo quis. Porttitor sit facilisis sit dignissim quis. Malesuada etiam tempor donec et ante. Aliquam massa donec augue aliquam semper amet blandit sed faucibus. Et elementum duis adipiscing turpis mi. Senectus eu rutrum accumsan convallis metus mattis risus. Quam eget sapien tellus aliquam facilisi sit volutpat. Scelerisque auctor purus nam sit lacus amet ullamcorper amet. Turpis nulla quis in pretium. Maecenas aliquam ac ullamcorper suspendisse morbi cras. Mi nibh aliquet massa sit eget tristique a. Posuere pretium auctor tellus massa et eu egestas. Sit lorem proin aenean tortor morbi condimentum. Leo eu enim cursus tempus sed viverra laoreet. Nisl ornare velit molestie suspendisse. Hendrerit nibh mauris vulputate sit vitae. Tellus quisque non nibh proin nunc lacus scelerisque dui. Aliquam fermentum libero aliquet volutpat at. Vestibulum ultrices nec felis leo nibh viverra. Hendrerit ut nunc porta egestas sit velit dictumst dis porta. Donec quam aliquam commodo mattis purus. Tellus nulla lectus fusce in fames scelerisque at." + +const restrictions = [ + { + type: 'bestandstype', + details: '.pdf .zip', + }, + { + type: 'bestandsgrootte', + details: '< 0.25 gb', + }, + { + type: 'docker test', + details: 'filename', + }, +] + +interface restrictionProps { + type: string, + details: string, +} + +export function Restriction({type,details}:restrictionProps) { + return ( + <> + + {type} + {details} + + + ); +} + + +export function AssignmentTeacherPage() { + return ( + <> +
+ + + {/*opdracht and upload button*/ } + + + + + Naam Opdracht: + + + + + + +
+ + + + + + + + Deadline: + + + + + + + + + + {/*Opgave*/ } + + + Opgave + {text} + + + + {/*Restricties*/ } + + + + Type restrictie + Details + + + + {restrictions.map((res) => + + )} + + + + + + + + + +
+ + + + + ); +} \ No newline at end of file diff --git a/frontend/frontend/src/pages/groupsPage/groupsPage.tsx b/frontend/frontend/src/pages/groupsPage/groupsPage.tsx new file mode 100644 index 00000000..99cbf84a --- /dev/null +++ b/frontend/frontend/src/pages/groupsPage/groupsPage.tsx @@ -0,0 +1,112 @@ +import {Header} from "../../components/Header.tsx"; +import {Grid ,TextField,Box,List, Button, Stack, Typography, Card, Divider, ListItem, ListItemText} from "@mui/material"; +import Switch from '@mui/material/Switch'; + + +const groups = [ + { + name: 'Jane' + }, + { + name: 'John' + }, + { + name: 'Alice' + }, + { + name: 'Bob' + }, + { + name: 'Emily' + }, + { + name: 'David' + }, + { + name: 'Sophia' + }, + { + name: 'Michael' + }, + { + name: 'Olivia' + }, + { + name: 'William' + }, +]; + + +interface GroupListItemProps { + name: string, +} + +export function GroupListItem({name}:GroupListItemProps) { + return ( + <> + + + {name} + student1, student2.. + + + + ); +} + + +export function GroupsPage() { + return ( + <> +
+ + + Groepen: + + + + + + Leden per groep: + + + + + + + + + + Willekeurige groepen: + + + + Studenten kunnen kiezen: + + + + + + :not(style)': { marginBottom: '8px' ,width: "100vh" } }}> + + Naam Student + Ingeschreven groep + + + + {groups.map((res) => + + )} + + + + + + ); +} \ No newline at end of file diff --git a/frontend/frontend/src/pages/loginPage/LoginPage.tsx b/frontend/frontend/src/pages/loginPage/LoginPage.tsx index e4aa5bfa..72d3c320 100644 --- a/frontend/frontend/src/pages/loginPage/LoginPage.tsx +++ b/frontend/frontend/src/pages/loginPage/LoginPage.tsx @@ -1,5 +1,5 @@ -import { Box, Button, Typography } from "@mui/material"; -import { t } from "i18next"; +import {Box, Button, Typography} from "@mui/material"; +import {t} from "i18next"; import {useNavigate} from "react-router-dom"; /* @@ -16,106 +16,106 @@ export function LoginPage() { //navigate("main") //relative path, so it will redirect to localhost:3000/login/main } - return ( - <> - - - - + return ( + <> - - Naam Platform - - - - - - - - - ); + + + + + + Naam Platform + + + + + + + + + ); } diff --git a/frontend/frontend/src/pages/mainPage/ArchivedView.tsx b/frontend/frontend/src/pages/mainPage/ArchivedView.tsx index c04c1477..10ef6272 100644 --- a/frontend/frontend/src/pages/mainPage/ArchivedView.tsx +++ b/frontend/frontend/src/pages/mainPage/ArchivedView.tsx @@ -1,7 +1,32 @@ -export function ArchivedView() { +import {Stack} from "@mui/material"; +import {CourseCard} from "../../components/CourseCard.tsx"; + +interface CourseCardProps { + isStudent: boolean; +} + +export function ArchivedView({isStudent}: CourseCardProps) { + //TODO: get courses from state + const courses = getCourses(); return ( <> - + + + + + + + + ); +} + +//fix courses with state +function getCourses(): string[] { + return [] } \ No newline at end of file diff --git a/frontend/frontend/src/pages/mainPage/CoursesView.tsx b/frontend/frontend/src/pages/mainPage/CoursesView.tsx index bed5eeab..96fbb7f7 100644 --- a/frontend/frontend/src/pages/mainPage/CoursesView.tsx +++ b/frontend/frontend/src/pages/mainPage/CoursesView.tsx @@ -1,30 +1,41 @@ -import {Box, Stack} from "@mui/material"; +import {IconButton, Stack} from "@mui/material"; import {CourseCard} from "../../components/CourseCard.tsx"; +import AddIcon from "@mui/icons-material/Add"; interface CourseCardProps { isStudent: boolean; } + export function CoursesView({isStudent}: CourseCardProps) { //TODO: get courses from state const courses = getCourses(); return ( <> - - - - - - + + + + + + + + + {!isStudent && + + + + + } - - - ); } //fix courses with state -function getCourses():string[]{ +function getCourses(): string[] { return [] } \ No newline at end of file diff --git a/frontend/frontend/src/pages/mainPage/MainPage.tsx b/frontend/frontend/src/pages/mainPage/MainPage.tsx index 1650d13f..0f399517 100644 --- a/frontend/frontend/src/pages/mainPage/MainPage.tsx +++ b/frontend/frontend/src/pages/mainPage/MainPage.tsx @@ -1,24 +1,58 @@ import {Header} from "../../components/Header.tsx"; -import {Box, Stack} from "@mui/material"; +import {Box, Button, Stack} from "@mui/material"; import TabSwitcher from "../../components/TabSwitcher.tsx"; import {ArchivedView} from "./ArchivedView.tsx"; import {CoursesView} from "./CoursesView.tsx"; +import {DeadlineCalendar} from "../../components/DeadlineCalendar.tsx"; +import dayjs from "dayjs"; +import {t} from "i18next"; +import {useEffect, useState} from "react"; export function MainPage() { + const [role, setRole] = useState(getRole("1")); + + useEffect(() => { + setRole(getRole("1")); + console.log("current user is: " + role); + }, []); + return ( <> - -
- - ,]}/> + +
+ + , ]}/> + + + + {role === "admin" && + + + } ); } //TODO: use api to check user role -function getRole(id:string):string{ +function getRole(id: string): string { return "teacher"; -} \ No newline at end of file +} diff --git a/frontend/frontend/src/pages/scoresPage/ProjectScoresPage.tsx b/frontend/frontend/src/pages/scoresPage/ProjectScoresPage.tsx new file mode 100644 index 00000000..d8ba97fe --- /dev/null +++ b/frontend/frontend/src/pages/scoresPage/ProjectScoresPage.tsx @@ -0,0 +1,30 @@ +import { Header } from "../../components/Header"; +import { Box, Button, Stack } from "@mui/material"; +import { useParams } from "react-router-dom"; +import { StudentsView } from "./StudentsView.tsx"; +import SaveIcon from '@mui/icons-material/Save'; +import CloseIcon from '@mui/icons-material/Close'; + +export function ProjectScoresPage() { + let { projectId } = useParams(); + projectId = String(projectId); + return ( + <> + +
+ + + + + + + + + + + + {t("restrictions")} + + + { + submission.restrictions.map((restriction, index) => { + return ( + <> + + {restriction.name} + {restriction.artifact && + } + {restriction.value} + + + + ); + }) + } + + + + + + + ); +} \ No newline at end of file