From 8d1361cb6dc2e050d902a2a0b6ad19be97a7b027 Mon Sep 17 00:00:00 2001 From: wanguimbutu Date: Thu, 22 Dec 2022 16:38:10 +0300 Subject: [PATCH 01/49] add student folder --- front-end/src/App.js | 19 +++++- .../src/components/Students/Dashboard.js | 9 +++ .../src/components/Students/MyUrlField.js | 13 ++++ front-end/src/components/Students/posts.js | 64 +++++++++++++++++++ front-end/src/components/Students/users.js | 17 +++++ 5 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 front-end/src/components/Students/Dashboard.js create mode 100644 front-end/src/components/Students/MyUrlField.js create mode 100644 front-end/src/components/Students/posts.js create mode 100644 front-end/src/components/Students/users.js diff --git a/front-end/src/App.js b/front-end/src/App.js index 6e39807..a8d9aad 100644 --- a/front-end/src/App.js +++ b/front-end/src/App.js @@ -3,7 +3,13 @@ import "./App.css"; import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; import SupervisorDashboard from "./components/Supervisor/Dashboard"; import LogBookFeeback from "./components/Supervisor/logbook-feedback."; - +import * as React from 'react'; +import{Admin,Resource} from 'react-admin'; +import { PostEdit,PostList,PostCreate } from "./components/Students/posts"; +import { StudentDashboard } from "./components/Students/Dashboard"; +import jsonServerProvider from 'ra-data-json-server'; +import { UserList } from "./components/Students/users"; +const dataProvider = jsonServerProvider("https://jsonplaceholder.typicode.com"); function App() { return ( <> @@ -16,7 +22,16 @@ function App() { } /> - + + + + + ); } diff --git a/front-end/src/components/Students/Dashboard.js b/front-end/src/components/Students/Dashboard.js new file mode 100644 index 0000000..19d4e66 --- /dev/null +++ b/front-end/src/components/Students/Dashboard.js @@ -0,0 +1,9 @@ +import * as React from "react"; +import { Card, CardContent, CardHeader } from '@mui/material'; + +export const StudentDashboard=() => ( + + + Congrats on your internship... + +); \ No newline at end of file diff --git a/front-end/src/components/Students/MyUrlField.js b/front-end/src/components/Students/MyUrlField.js new file mode 100644 index 0000000..d5d0e02 --- /dev/null +++ b/front-end/src/components/Students/MyUrlField.js @@ -0,0 +1,13 @@ +import * as React from "react"; +import { useRecordContext } from 'react-admin'; + +const MyUrlField = ({ source }) => { + const record = useRecordContext(); + return record ? ( + + {record[source]} + + ) : null; +} + +export default MyUrlField; \ No newline at end of file diff --git a/front-end/src/components/Students/posts.js b/front-end/src/components/Students/posts.js new file mode 100644 index 0000000..3e97e66 --- /dev/null +++ b/front-end/src/components/Students/posts.js @@ -0,0 +1,64 @@ +import * as React from "react"; +import { + List, + Datagrid, + TextField, + ReferenceField, + EditButton, + Edit, + Create, + SimpleForm, + ReferenceInput, + SelectInput, + TextInput, +} from 'react-admin'; + +const postFilters = [ + , + + + , +]; + +export const PostList = props => ( + + + + + + + + + + + +); + +const PostTitle =({record})=>{ + returnPost {record ? `"${record.title}"` : ''} +} + +export const PostEdit = props => ( + } {...props}> + + + + + + + + + + +); +export const PostCreate = props => ( + + + + + + + + + +); \ No newline at end of file diff --git a/front-end/src/components/Students/users.js b/front-end/src/components/Students/users.js new file mode 100644 index 0000000..72b337a --- /dev/null +++ b/front-end/src/components/Students/users.js @@ -0,0 +1,17 @@ +import * as React from 'react'; +import { List,Datagrid,TextField,EmailField,UrlField } from 'react-admin' + +export const UserList = props => ( + + + + + + + + + + + + +); \ No newline at end of file From 4fbbde704640f14d0303e80bac7373d4f935e686 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Thu, 22 Dec 2022 17:38:26 +0300 Subject: [PATCH 02/49] Adds employer's dashboard file --- front-end/src/components/Employer/Dashboard.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 front-end/src/components/Employer/Dashboard.js diff --git a/front-end/src/components/Employer/Dashboard.js b/front-end/src/components/Employer/Dashboard.js new file mode 100644 index 0000000..e69de29 From bb14c6278d69204bb6821e8af16a0967ad092b87 Mon Sep 17 00:00:00 2001 From: Khadijah <83072455+Amiratul008@users.noreply.github.com> Date: Thu, 22 Dec 2022 17:43:00 +0300 Subject: [PATCH 03/49] Add file via upload --- .../src/components/Employer/Dashboard.html | 251 ++++++++++ .../src/components/Employer/Employer.html | 83 ++++ front-end/src/components/Employer/Login.html | 58 +++ .../components/Employer/Notifications.html | 73 +++ front-end/src/components/Employer/TUK1.jpg | Bin 0 -> 115339 bytes front-end/src/components/Employer/script.js | 6 + front-end/src/components/Employer/style.css | 131 +++++ front-end/src/components/Employer/style2.css | 294 +++++++++++ front-end/src/components/Employer/style3.css | 234 +++++++++ front-end/src/components/Employer/sytle1.css | 464 ++++++++++++++++++ 10 files changed, 1594 insertions(+) create mode 100644 front-end/src/components/Employer/Dashboard.html create mode 100644 front-end/src/components/Employer/Employer.html create mode 100644 front-end/src/components/Employer/Login.html create mode 100644 front-end/src/components/Employer/Notifications.html create mode 100644 front-end/src/components/Employer/TUK1.jpg create mode 100644 front-end/src/components/Employer/script.js create mode 100644 front-end/src/components/Employer/style.css create mode 100644 front-end/src/components/Employer/style2.css create mode 100644 front-end/src/components/Employer/style3.css create mode 100644 front-end/src/components/Employer/sytle1.css diff --git a/front-end/src/components/Employer/Dashboard.html b/front-end/src/components/Employer/Dashboard.html new file mode 100644 index 0000000..f25b9e0 --- /dev/null +++ b/front-end/src/components/Employer/Dashboard.html @@ -0,0 +1,251 @@ + + + + + + + + Employer Dashboard + + + + + + +
+ + +
+
+
+
+
Departments
+
15
+
+ + up since 2010 +
+
+ +
+
+
+
Employees
+
2000
+
+ + up since 2021 +
+
+ +
+
+
+
Interns
+
50
+
+ + up since sept 2021 +
+
+ +
+
+
+
Projects
+
27
+
+ + up since may 2021 +
+
+ +
+
+ + + +
+ + +
+ + + + + + + \ No newline at end of file diff --git a/front-end/src/components/Employer/Employer.html b/front-end/src/components/Employer/Employer.html new file mode 100644 index 0000000..426f370 --- /dev/null +++ b/front-end/src/components/Employer/Employer.html @@ -0,0 +1,83 @@ + + + + + + + + Employer Dashboard + + + + + + +
+ + +
+

Feedback

+
+ + + + + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/front-end/src/components/Employer/Login.html b/front-end/src/components/Employer/Login.html new file mode 100644 index 0000000..b311574 --- /dev/null +++ b/front-end/src/components/Employer/Login.html @@ -0,0 +1,58 @@ + + + + LOGIN AND REGISTRATION FORM + + + +
+
+
+
+ + +
+
+ + + Remember me. + +
+ +
+ + + + + + I agree to the terms & conditions. + +
+

ATTACHMENTS MANAGEMENT SYSTEM

+
+
+ + + + + \ No newline at end of file diff --git a/front-end/src/components/Employer/Notifications.html b/front-end/src/components/Employer/Notifications.html new file mode 100644 index 0000000..3612992 --- /dev/null +++ b/front-end/src/components/Employer/Notifications.html @@ -0,0 +1,73 @@ + + + + + + + + Employer Dashboard + + + + + + +
+ + + + +
+ + + + + + + \ No newline at end of file diff --git a/front-end/src/components/Employer/TUK1.jpg b/front-end/src/components/Employer/TUK1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b2ff270654de7724707db2d33251d8f9bf87e1c GIT binary patch literal 115339 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 z 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 Osg=nfH~E43&;Qx3zOecL literal 0 HcmV?d00001 diff --git a/front-end/src/components/Employer/script.js b/front-end/src/components/Employer/script.js new file mode 100644 index 0000000..156a446 --- /dev/null +++ b/front-end/src/components/Employer/script.js @@ -0,0 +1,6 @@ +let sidebar = document.querySelector(".sidebar"); +let sidebarBtn = document.querySelector(".sidebarBtn"); + +sidebarBtn.onclick = function(){ + sidebar.classList.toggle("active"); +} diff --git a/front-end/src/components/Employer/style.css b/front-end/src/components/Employer/style.css new file mode 100644 index 0000000..1740f2b --- /dev/null +++ b/front-end/src/components/Employer/style.css @@ -0,0 +1,131 @@ +*{ + margin: 0; + padding: 0; + font-family:sans-serif; +} +.hero{ + height: 650px; + width: 100%; + background-image: linear-gradient(rgba(0,0,0,0.4),rgba(0,0,0,0.4)),url(TUK1.jpg); + background-size: cover; + background-position: center; + position: absolute; +} + + + +.form-box{ + width: 400px; + height: 550px; + position: relative; + margin: 6% auto; + background: whitesmoke; + padding: 5px; + overflow: hidden; + border-radius: 10px; +} + +.button-box{ + width: 200px; + margin: 35px auto; + position: relative; + box-shadow: 0 0 20px 9px lightgreen; + border-radius: 30px; + +} + +.toggle-btn{ + padding: 10px 30px; + cursor: pointer; + background: transparent; + border: 0; + outline: none; + position: relative; +} + +#btn { + top: 0; + left: 0; + position: absolute; + width: 110px; + height: 100%; + background: linear-gradient(to right, green,peru); + border-radius: 30px; + transition: .5s; + } + +h1{ + margin: 60px auto; + padding: 0 0 20px; + text-align: center; + font-size: 12px; + color: green; + + +} + +.input-group{ + top: 180px; + position: absolute; + width: 280px; + transition: .5s; +} + +.input-field{ + width: 100%; + padding: 10px 0; + margin: 5px 0; + border-left: 0; + border-top: 0; + border-right: 0; + border-bottom: 1px solid #999; + outline: none; + background: transparent; +} + + + +.submit-btn{ + width: 85%; + padding: 10px 30px; + cursor: pointer; + display: block; + margin: auto; + background: green; + border: 0; + outline: none; + color: #fff; + border-radius: 20px; +} + +.submit-btn:hover{ + cursor:pointer; + background:green; + color: black; +} + +.chech-box{ + margin: 30px 10px 30px 0; +} + +span{ + color: #777; + font-size: 12px; + bottom: 64px; + position: absolute; +} + + + + + +#login{ + left: 50px; +} +#signup{ + left: 450px; +} + + + + diff --git a/front-end/src/components/Employer/style2.css b/front-end/src/components/Employer/style2.css new file mode 100644 index 0000000..efb1c26 --- /dev/null +++ b/front-end/src/components/Employer/style2.css @@ -0,0 +1,294 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Roboto', sans-serif; + +} + +body{ + min-height: 100vh; + width: 100%; + -webkit-font-smoothing: antialiased; +} + +.sidebar{ + position: fixed; + height: 100%; + width: 240px; + background: green; + transition:all 0.5s ease; +} + + +.sidebar.active{ + width: 60px; +} + +.sidebar .logo-details{ + height: 80px; + width: 100%; + display: flex; + align-items: center; +} + + +.sidebar .logo-details i{ + font-size: 28px; + font-weight: 500; + color:transparent; + min-width: 60px; + text-align: center; + +} +.sidebar .logo-details .logo_name{ + font-size: 20px; + font-weight: 500; + color: black; +} + +.sidebar .nav-links{ + margin-top: 16px; +} + +.sidebar .nav-links li{ + height: 50px; + width: 100%; + list-style: none; +} + +.sidebar .nav-links li a{ + height: 100%; + width: 100%; + display: flex; + align-items: center; + text-decoration: none; + transition: all 0.4s ease; +} + +.sidebar .nav-links li a:hover{ + background: lightgreen; +} + +.sidebar .nav-links li a i{ + /* background: whitesmoke;*/ + min-width: 60px; + text-align: center; + color: #fff; + font-size: 18px; +} + +.sidebar .nav-links li a .link_name{ + color: #fff; + font-size: 15px; + font-weight: 400; + white-space: nowrap; +} +/* Home-section css */ +.home-section{ + background: #f5f5f5; + position: relative; + min-height: 100vh; + width: calc(100% - 240px); + left: 240px; + transition: all 0.5s ease; +} + +.sidebar.active ~ .home-section{ + width: calc(100% - 60px); + left: 60px; +} + + +.home-section nav{ + position: fixed; + width: calc(100% - 24px); + left: 240px; + height: 80px; + background: #fff; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: space-between; + transition: all 0.5s ease; + z-index: 100; +} + +.sidebar.active ~ .home-section nav{ + width: calc(100% - 60px); + left: 60px; +} + +.home-section nav .sidebar-button{ + display: flex; + align-items: center; + font-size: 24px; + font-weight: 500; +} + +.home-section nav .sidebar-button i{ + font-size: 35px; + margin-right: 10px; +} + + + +.home-section nav .profile-details{ + display: flex; + align-items: center; + height: 50px; + min-width: 190px; + background: #f5f6fa; + border: 2px solid #efeef1; + border-radius: 6px; + padding: 0 15px 0 2px; +} + +nav .profile-details img{ + height: 40px; + width: 40px; + object-fit: cover; + border-radius: 6px; +} + +nav .profile-details .admin_name{ + font-size: 15px; + font-weight: 500; + color: #333; + margin: 0 10px; + white-space: norwap; +} + +nav .profile-details i{ + color: #333; + font-size: 25px; +} + +.comment-box { + top: 50%; + left: 50%; + position: absolute; + transform: translate(-50%, -50%); + width: 500px; +} +.comment-box h2 { + font-size: 20px; + font-weight: 500; + margin-bottom: 15px; +} +.comment-box input { + width: 100%; + height: 50px; + padding: 0 20px; + margin-bottom: 15px; + border-radius: 5px; + border: 1px solid #86b0b6; +} +.comment-box input:focus { + border: 1px solid #000; + outline: 0; +} +.comment-box textarea { + width: 100%; + height: 150px; + padding: 15px 20px; + margin-bottom: 10px; + border-radius: 5px; + border: 1px solid #86b0b6 ; +} +.comment-box textarea:focus { + border: 1px solid #000; + outline: 0; +} +.comment-box button { + border: 0; + padding: 10px 30px; + background: green; + font-size: 18px; + border-radius: 5px; + color: whitesmoke; +} +.comment-box button:hover { + background-color: peru; +} + + + + + + + + + + + + + + + +/*Responsive media query */ +@media (max-width: 1316px) { + .sidebar{ + width: 60px; + } + .sidebar.active{ + width: 220px; + } + .home-section{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section{ + width: calc(100% - 220px); + left: 220px; + } + .home-section nav{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section nav{ + width: calc(100% - 220px); + left: 220px; + } +} + +@media (max-width: 1078px) { + .home-section .comment-box { + flex-direction: column; + } + .home-section .comment-box h2{ + margin-bottom: 20px; + width: 100%; + overflow-x: scroll; + } + .home-section .comment-box input{ + margin-left: 0; + } +} +@media (max-width: 1018px) { + .home-section .comment-box input{ + width: calc(100% / 2 - 15px); + margin-bottom: 15px; + } +} +@media (max-width: 648px) { + .home-section nav .sidebar-button .dashboard, + nav .profile-details .admin_name, + nav .profile-details i{ + display: none; + } + .home-section nav .profile-details{ + min-width: 50px; + height: 50px; + } + .home-section .comment-box { + width: 100%; + margin-bottom: 15px; + } + .home-section .comment-box input{ + width: 500px; + } + +} \ No newline at end of file diff --git a/front-end/src/components/Employer/style3.css b/front-end/src/components/Employer/style3.css new file mode 100644 index 0000000..0e33138 --- /dev/null +++ b/front-end/src/components/Employer/style3.css @@ -0,0 +1,234 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Roboto', sans-serif; + +} + +body{ + min-height: 100vh; + width: 100%; + -webkit-font-smoothing: antialiased; +} + +.sidebar{ + position: fixed; + height: 100%; + width: 240px; + background: green; + transition:all 0.5s ease; +} + + +.sidebar.active{ + width: 60px; +} + +.sidebar .logo-details{ + height: 80px; + width: 100%; + display: flex; + align-items: center; +} + + +.sidebar .logo-details i{ + font-size: 28px; + font-weight: 500; + color:transparent; + min-width: 60px; + text-align: center; + +} +.sidebar .logo-details .logo_name{ + font-size: 20px; + font-weight: 500; + color: black; +} + +.sidebar .nav-links{ + margin-top: 16px; +} + +.sidebar .nav-links li{ + height: 50px; + width: 100%; + list-style: none; +} + +.sidebar .nav-links li a{ + height: 100%; + width: 100%; + display: flex; + align-items: center; + text-decoration: none; + transition: all 0.4s ease; +} + +.sidebar .nav-links li a:hover{ + background: lightgreen; +} + +.sidebar .nav-links li a i{ + /* background: whitesmoke;*/ + min-width: 60px; + text-align: center; + color: #fff; + font-size: 18px; +} + +.sidebar .nav-links li a .link_name{ + color: #fff; + font-size: 15px; + font-weight: 400; + white-space: nowrap; +} +/* Home-section css */ +.home-section{ + background: #f5f5f5; + position: relative; + min-height: 100vh; + width: calc(100% - 240px); + left: 240px; + transition: all 0.5s ease; +} + +.sidebar.active ~ .home-section{ + width: calc(100% - 60px); + left: 60px; +} + + +.home-section nav{ + position: fixed; + width: calc(100% - 24px); + left: 240px; + height: 80px; + background: #fff; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: space-between; + transition: all 0.5s ease; + z-index: 100; +} + +.sidebar.active ~ .home-section nav{ + width: calc(100% - 60px); + left: 60px; +} + +.home-section nav .sidebar-button{ + display: flex; + align-items: center; + font-size: 24px; + font-weight: 500; +} + +.home-section nav .sidebar-button i{ + font-size: 35px; + margin-right: 10px; +} + + + +.home-section nav .profile-details{ + display: flex; + align-items: center; + height: 50px; + min-width: 190px; + background: #f5f6fa; + border: 2px solid #efeef1; + border-radius: 6px; + padding: 0 15px 0 2px; +} + +nav .profile-details img{ + height: 40px; + width: 40px; + object-fit: cover; + border-radius: 6px; +} + +nav .profile-details .admin_name{ + font-size: 15px; + font-weight: 500; + color: #333; + margin: 0 10px; + white-space: norwap; +} + +nav .profile-details i{ + color: #333; + font-size: 25px; +} + + + + +/*Responsive media query */ +@media (max-width: 1316px) { + .sidebar{ + width: 60px; + } + .sidebar.active{ + width: 220px; + } + .home-section{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section{ + width: calc(100% - 220px); + left: 220px; + } + .home-section nav{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section nav{ + width: calc(100% - 220px); + left: 220px; + } +} + +@media (max-width: 1078px) { + .home-section .interns-boxes { + flex-direction: column; + } + .home-section .interns-boxes .box{ + margin-bottom: 20px; + width: 100%; + overflow-x: scroll; + } + .home-section .interns-boxes .workshops-intern{ + margin-left: 0; + } +} +@media (max-width: 1018px) { + .home-section .overview-boxes .box{ + width: calc(100% / 2 - 15px); + margin-bottom: 15px; + } +} +@media (max-width: 648px) { + .home-section nav .sidebar-button .dashboard, + nav .profile-details .admin_name, + nav .profile-details i{ + display: none; + } + .home-section nav .profile-details{ + min-width: 50px; + height: 50px; + } + .home-section .overview-boxes .box{ + width: 100%; + margin-bottom: 15px; + } + .home-section .interns-boxes .interns-details{ + width: 590px; + } +} \ No newline at end of file diff --git a/front-end/src/components/Employer/sytle1.css b/front-end/src/components/Employer/sytle1.css new file mode 100644 index 0000000..8de6c2e --- /dev/null +++ b/front-end/src/components/Employer/sytle1.css @@ -0,0 +1,464 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Roboto', sans-serif; + +} + +body{ + min-height: 100vh; + width: 100%; + -webkit-font-smoothing: antialiased; +} + +.sidebar{ + position: fixed; + height: 100%; + width: 240px; + background: green; + transition:all 0.5s ease; +} + + +.sidebar.active{ + width: 60px; +} + +.sidebar .logo-details{ + height: 80px; + width: 100%; + display: flex; + align-items: center; +} + + +.sidebar .logo-details i{ + font-size: 28px; + font-weight: 500; + color:transparent; + min-width: 60px; + text-align: center; + +} +.sidebar .logo-details .logo_name{ + font-size: 20px; + font-weight: 500; + color: black; +} + +.sidebar .nav-links{ + margin-top: 16px; +} + +.sidebar .nav-links li{ + height: 50px; + width: 100%; + list-style: none; +} + +.sidebar .nav-links li a{ + height: 100%; + width: 100%; + display: flex; + align-items: center; + text-decoration: none; + transition: all 0.4s ease; +} + +.sidebar .nav-links li a:hover{ + background: lightgreen; +} + +.sidebar .nav-links li a i{ + /* background: whitesmoke;*/ + min-width: 60px; + text-align: center; + color: #fff; + font-size: 18px; +} + +.sidebar .nav-links li a .link_name{ + color: #fff; + font-size: 15px; + font-weight: 400; + white-space: nowrap; +} +/* Home-section css */ +.home-section{ + background: #f5f5f5; + position: relative; + min-height: 100vh; + width: calc(100% - 240px); + left: 240px; + transition: all 0.5s ease; +} + +.sidebar.active ~ .home-section{ + width: calc(100% - 60px); + left: 60px; +} + + +.home-section nav{ + position: fixed; + width: calc(100% - 24px); + left: 240px; + height: 80px; + background: #fff; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: space-between; + transition: all 0.5s ease; + z-index: 100; +} + +.sidebar.active ~ .home-section nav{ + width: calc(100% - 60px); + left: 60px; +} + +.home-section nav .sidebar-button{ + display: flex; + align-items: center; + font-size: 24px; + font-weight: 500; +} + +.home-section nav .sidebar-button i{ + font-size: 35px; + margin-right: 10px; +} + +.home-section nav .search-box{ + height: 50px; + width: 550px; + margin: 0 20px; + position: relative; +} +nav .search-box input{ + position: absolute; + height: 100%; + width: 100%; + border-radius: 6px; + padding: 0 15px; + font-size: 17px; + color: black; + background: #f5f6fa; + border: 2px solid peru; + outline: none; +} + +nav .search-box .fa-search{ + position: absolute; + right: 5px; + top: 50%; + transform: translateY(-50%); + height: 40px; + width: 40px; + background: green; + border-radius: 6px; + color: #fff; + font-size: 22px; + line-height: 40px; + text-align: center; +} + +.home-section nav .profile-details{ + display: flex; + align-items: center; + height: 50px; + min-width: 190px; + background: #f5f6fa; + border: 2px solid #efeef1; + border-radius: 6px; + padding: 0 15px 0 2px; +} + +nav .profile-details img{ + height: 40px; + width: 40px; + object-fit: cover; + border-radius: 6px; +} + +nav .profile-details .admin_name{ + font-size: 15px; + font-weight: 500; + color: #333; + margin: 0 10px; + white-space: norwap; +} + +nav .profile-details i{ + color: #333; + font-size: 25px; +} + +.home-section .home-content{ + position: relative; + padding-top: 100px; +} + +.home-content .overview-boxes{ + display: flex; + width: 100%; + justify-content: space-between; + padding: 0 20px; + flex-wrap: wrap; +} + +.home-content .overview-boxes .box{ + width: calc(100% / 4 - 15px); + display: flex; + justify-content: center; + padding: 15px 14px; + align-items: center; + background: #fff; + border-radius: 15px; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1); +} + +.home-content .overview-boxes .box_topic{ + font-size: 20px; + font-weight: 500; + +} + +.home-content .overview-boxes .number{ + font-size: 35px; + font-weight: 500; + margin-top: -5px; + display: inline-block; +} + +.overview-boxes .indicater{ + display: flex; + align-items: center; +} + +.overview-boxes .indicater i{ + height: 20px; + width: 20px; + background:#008000; + color: #fff; + border-radius: 50%; + font-size: 20px; + margin-right: 5px; +} + +.overview-boxes .indicater .text{ + font-size: 12px; +} + +.overview-boxes .box .building{ + font-size: 32px; + font-weight: 500; + height: 50px; + width: 50px; + background: lightgreen; + color: #008000; + line-height: 50px; + text-align: center; + border-radius: 12px; +} + +.overview-boxes .box .user{ + font-size: 32px; + font-weight: 500; + height: 50px; + width: 50px; + background: palegoldenrod; + color: peru; + line-height: 50px; + text-align: center; + border-radius: 12px; +} + +.overview-boxes .box .user2{ + font-size: 32px; + font-weight: 500; + height: 50px; + width: 50px; + background:lightblue; + color:blue; + line-height: 50px; + text-align: center; + border-radius: 12px; +} + +.overview-boxes .box .p{ + font-size: 32px; + font-weight: 500; + height: 50px; + width: 50px; + background:lightcoral; + color:red; + line-height: 50px; + text-align: center; + border-radius: 12px; +} + +.home-section .interns-boxes{ + display: flex; + justify-content: space-between; + padding: 20px; +} + +.home-section .interns-boxes .recent-intern{ + width: 75%; + background: #fff; + border-radius: 12px; + box-shadow: 0 5px 10px rgba(0,0,0,0.1); + padding: 20px; +} + + + +.home-section .interns-boxes .interns-details{ + display: flex; + justify-content: space-between; + align-items: center; +} + +.home-section .interns-boxes .box .title{ + font-size: 24px; + font-weight: 500; +} + +.home-section .interns-boxes .box .topic{ + font-size: 20px; + font-weight: 500; +} + +.home-section .interns-boxes .box li{ + list-style: none; + margin: 10px 0; +} + +.interns-boxes .box li a{ + color: #333; + font-size: 18px; + font-weight: 400; + text-decoration: none; +} + +.interns-boxes .button{ + width: 100%; + display: flex; + justify-content: flex-end; +} + +.interns-boxes .button a{ + font-size: 15px; + font-weight: 400; + color: #fff; + background:#008000; + padding: 4px 12px; + text-decoration: none; + border-radius: 4px; + transition: all 0.3s ease; +} + +.interns-boxes .button a:hover{ + background: peru; + +} + +/*right side*/ +.home-section .interns-boxes .workshops-intern{ + width: 35%; + margin-left: 20px; + background: #fff; + box-shadow: 0 5px 10px rgba(0,0,0,0.1); + padding: 20px; + border-radius: 12px; +} + +.interns-boxes .workshops-intern li{ + display: flex; + align-items: center; + justify-content: space-between; +} + +.interns-boxes .workshops-intern li a{ + display: flex; + align-items: center; +} + +.interns-boxes .workshops-intern img{ + margin-right: 8px; + height: 40px; + width: 40px; + border-radius: 4px; + object-fit: cover; +} + + +/*Responsive media query */ +@media (max-width: 1316px) { + .sidebar{ + width: 60px; + } + .sidebar.active{ + width: 220px; + } + .home-section{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section{ + width: calc(100% - 220px); + left: 220px; + } + .home-section nav{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section nav{ + width: calc(100% - 220px); + left: 220px; + } +} + +@media (max-width: 1078px) { + .home-section .interns-boxes { + flex-direction: column; + } + .home-section .interns-boxes .box{ + margin-bottom: 20px; + width: 100%; + overflow-x: scroll; + } + .home-section .interns-boxes .workshops-intern{ + margin-left: 0; + } +} +@media (max-width: 1018px) { + .home-section .overview-boxes .box{ + width: calc(100% / 2 - 15px); + margin-bottom: 15px; + } +} +@media (max-width: 648px) { + .home-section nav .sidebar-button .dashboard, + nav .profile-details .admin_name, + nav .profile-details i{ + display: none; + } + .home-section nav .profile-details{ + min-width: 50px; + height: 50px; + } + .home-section .overview-boxes .box{ + width: 100%; + margin-bottom: 15px; + } + .home-section .interns-boxes .interns-details{ + width: 590px; + } +} + From 9181bedd0cae13d1ae55ec63c26fef2db891d425 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 23 Dec 2022 23:41:27 +0300 Subject: [PATCH 04/49] Adds application files --- front-end/package-lock.json | 1910 +++++++++++++++++ front-end/package.json | 2 + front-end/public/index.html | 43 +- front-end/src/App.js | 21 +- .../src/components/Employer/Dashboard.html | 251 --- .../src/components/Employer/Dashboard.js | 338 +++ .../src/components/Employer/Employer.html | 83 - front-end/src/components/Employer/Employer.js | 79 + front-end/src/components/Employer/Login.html | 58 - .../components/Employer/Notifications.html | 73 - .../src/components/Employer/Notifications.js | 58 + front-end/src/components/Employer/style.css | 4 +- front-end/src/components/Login.js | 100 + .../src/components/Supervisor/Dashboard.js | 3 +- .../Supervisor/logbook-feedback..js | 2 +- front-end/src/index.css | 1 - front-end/src/index.js | 2 - 17 files changed, 2538 insertions(+), 490 deletions(-) delete mode 100644 front-end/src/components/Employer/Dashboard.html delete mode 100644 front-end/src/components/Employer/Employer.html create mode 100644 front-end/src/components/Employer/Employer.js delete mode 100644 front-end/src/components/Employer/Login.html delete mode 100644 front-end/src/components/Employer/Notifications.html create mode 100644 front-end/src/components/Employer/Notifications.js diff --git a/front-end/package-lock.json b/front-end/package-lock.json index 080b59e..abcfa76 100644 --- a/front-end/package-lock.json +++ b/front-end/package-lock.json @@ -16,6 +16,8 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "@wojtekmaj/react-daterange-picker": "^4.1.0", + "bootstrap": "^5.2.3", + "mdbreact": "^5.2.0", "prop-types": "^15.8.1", "ra-data-json-server": "^4.6.1", "react": "^18.2.0", @@ -2503,6 +2505,15 @@ "tslib": "^2.4.0" } }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", @@ -2533,6 +2544,19 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "node_modules/@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "dependencies": { + "gud": "^1.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": ">=0.14.0" + } + }, "node_modules/@internationalized/date": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.0.1.tgz", @@ -7256,6 +7280,20 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, + "node_modules/@types/jss": { + "version": "9.5.8", + "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.8.tgz", + "integrity": "sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA==", + "dependencies": { + "csstype": "^2.0.0", + "indefinite-observable": "^1.0.1" + } + }, + "node_modules/@types/jss/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -7330,6 +7368,14 @@ "@types/react": "*" } }, + "node_modules/@types/react-text-mask": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/@types/react-text-mask/-/react-text-mask-5.4.11.tgz", + "integrity": "sha512-DIJ3/dS4jd7NK3lEgsOwcgpp+ZlVrNJEiUDRayZRE/PNMbV/nLWmOKGdL0BUS29hnx0CDgITgPudKx0BgbF5fA==", + "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", @@ -8701,6 +8747,29 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/bootstrap": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.6" + } + }, + "node_modules/bootstrap-css-only": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap-css-only/-/bootstrap-css-only-4.4.1.tgz", + "integrity": "sha512-iBgNli7RnedBFwn6sMTQoAZ8WgIwmX4kF1rckfj+pgro5q/Q0DbLtcpfH60XoFnCXzbEJU/khC/B2EQap89mCg==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8721,6 +8790,11 @@ "node": ">=8" } }, + "node_modules/brcast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.2.tgz", + "integrity": "sha512-f5XwwFCCuvgqP2nMH/hJ74FqnGmb4X3D+NC//HphxJzzhsZvSZa+Hk/syB7j3ZHpPDLMoYU8oBgviRWfNvEfKA==" + }, "node_modules/broadcast-channel": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", @@ -8903,6 +8977,11 @@ "node": ">=4" } }, + "node_modules/change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha512-YXzt1cQ4a2jqazhcuSWEOc1K2q8g9H6eWNsyZgi640LDzRWVQ2eDe+Y/kVdftH+vYdPF2rgDb3dLdpxE1jvAxw==" + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -8911,6 +8990,32 @@ "node": ">=10" } }, + "node_modules/chart.js": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz", + "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==", + "dependencies": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "node_modules/chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "dependencies": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "node_modules/chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "dependencies": { + "color-name": "^1.0.0" + } + }, "node_modules/check-types": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", @@ -9005,6 +9110,19 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", @@ -9515,6 +9633,14 @@ "node": ">=0.10.0" } }, + "node_modules/css-vendor": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", + "integrity": "sha512-Vx/Vl3zsHj32Z+WTNzGjd2iSbSIJTYHMmyGUT2nzCjj0Xk4qLfwpQ8nF6TQ5oo3Cf0s/An3DTc7LclH1BkAXbQ==", + "dependencies": { + "is-in-browser": "^1.0.2" + } + }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -9716,6 +9842,11 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -10153,6 +10284,14 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, "node_modules/enhanced-resolve": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", @@ -11098,6 +11237,11 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -11247,6 +11391,34 @@ "bser": "2.1.1" } }, + "node_modules/fbjs": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", + "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", + "dependencies": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "node_modules/fbjs/node_modules/core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js." + }, + "node_modules/fbjs/node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -11425,6 +11597,15 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, + "node_modules/focus-trap": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-4.0.2.tgz", + "integrity": "sha512-HtLjfAK7Hp2qbBtLS6wEznID1mPT+48ZnP2nkHzgjpL4kroYHg0CdqJ5cTXk+UO5znAxF5fRUkhdyfgrhh8Lzw==", + "dependencies": { + "tabbable": "^3.1.2", + "xtend": "^4.0.1" + } + }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -11912,6 +12093,11 @@ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, + "node_modules/gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -12249,6 +12435,11 @@ "node": ">=10.17.0" } }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -12353,6 +12544,14 @@ "node": ">=0.8.19" } }, + "node_modules/indefinite-observable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.2.tgz", + "integrity": "sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA==", + "dependencies": { + "symbol-observable": "1.2.0" + } + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -12562,6 +12761,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" + }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -12635,6 +12839,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -12804,6 +13019,23 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==", + "dependencies": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -14999,6 +15231,93 @@ "node": ">=0.10.0" } }, + "node_modules/jss": { + "version": "9.8.7", + "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", + "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", + "hasInstallScript": true, + "dependencies": { + "is-in-browser": "^1.1.3", + "symbol-observable": "^1.1.0", + "warning": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jss-camel-case": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", + "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", + "dependencies": { + "hyphenate-style-name": "^1.0.2" + }, + "peerDependencies": { + "jss": "^9.7.0" + } + }, + "node_modules/jss-default-unit": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", + "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==", + "peerDependencies": { + "jss": "^9.4.0" + } + }, + "node_modules/jss-global": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", + "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==", + "peerDependencies": { + "jss": "^9.0.0" + } + }, + "node_modules/jss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", + "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", + "dependencies": { + "warning": "^3.0.0" + }, + "peerDependencies": { + "jss": "^9.0.0" + } + }, + "node_modules/jss-nested/node_modules/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/jss-props-sort": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", + "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==", + "peerDependencies": { + "jss": "^9.0.0" + } + }, + "node_modules/jss-vendor-prefixer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", + "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", + "dependencies": { + "css-vendor": "^0.3.8" + }, + "peerDependencies": { + "jss": "^9.0.0" + } + }, + "node_modules/jss/node_modules/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -15141,6 +15460,11 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -15244,6 +15568,555 @@ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" }, + "node_modules/mdbreact": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mdbreact/-/mdbreact-5.2.0.tgz", + "integrity": "sha512-QIQ4xtEaZrXq82GKrVapRhTt+8OkVydsvb6Bir7y3AEiT//FvCg3OXzOk3VWPkaeiHnWdgKQTYhYBqsKEYEKYA==", + "dependencies": { + "@fortawesome/fontawesome-free": "^5.12.0", + "@material-ui/core": "3.9.3", + "bootstrap-css-only": "4.4.1", + "chart.js": "2.9.4", + "classnames": "2.2.6", + "focus-trap-react": "^6.0.0", + "material-ui-pickers": "2.2.4", + "perfect-scrollbar": "1.5.0", + "popper.js": "^1.16.0", + "prop-types": "15.7.2", + "raf": "3.4.1", + "react": "17.0.1", + "react-chartjs-2": "2.9.0", + "react-dom": "17.0.1", + "react-image-lightbox": "5.1.1", + "react-numeric-input": "2.2.3", + "react-popper": "^1.3.7", + "react-router-dom": "^5.1.2", + "react-scroll": "1.7.16", + "react-toastify": "5.5.0", + "react-transition-group": "4.3.0", + "sass-loader": "^8.0.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/mdbreact/node_modules/@material-ui/core": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.9.3.tgz", + "integrity": "sha512-REIj62+zEvTgI/C//YL4fZxrCVIySygmpZglsu/Nl5jPqy3CDjZv1F9ubBYorHqmRgeVPh64EghMMWqk4egmfg==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dependencies": { + "@babel/runtime": "^7.2.0", + "@material-ui/system": "^3.0.0-alpha.0", + "@material-ui/utils": "^3.0.0-alpha.2", + "@types/jss": "^9.5.6", + "@types/react-transition-group": "^2.0.8", + "brcast": "^3.0.1", + "classnames": "^2.2.5", + "csstype": "^2.5.2", + "debounce": "^1.1.0", + "deepmerge": "^3.0.0", + "dom-helpers": "^3.2.1", + "hoist-non-react-statics": "^3.2.1", + "is-plain-object": "^2.0.4", + "jss": "^9.8.7", + "jss-camel-case": "^6.0.0", + "jss-default-unit": "^8.0.2", + "jss-global": "^3.0.0", + "jss-nested": "^6.0.1", + "jss-props-sort": "^6.0.0", + "jss-vendor-prefixer": "^7.0.0", + "normalize-scroll-left": "^0.1.2", + "popper.js": "^1.14.1", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.2", + "react-transition-group": "^2.2.1", + "recompose": "0.28.0 - 0.30.0", + "warning": "^4.0.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "react": "^16.3.0", + "react-dom": "^16.3.0" + } + }, + "node_modules/mdbreact/node_modules/@material-ui/core/node_modules/@material-ui/system": { + "version": "3.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-3.0.0-alpha.2.tgz", + "integrity": "sha512-odmxQ0peKpP7RQBQ8koly06YhsPzcoVib1vByVPBH4QhwqBXuYoqlCjt02846fYspAqkrWzjxnWUD311EBbxOA==", + "deprecated": "You can now upgrade to @mui/system. See the guide: https://mui.com/guides/migration-v4/", + "dependencies": { + "@babel/runtime": "^7.2.0", + "deepmerge": "^3.0.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "react": "^16.3.0", + "react-dom": "^16.3.0" + } + }, + "node_modules/mdbreact/node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "version": "3.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-3.0.0-alpha.3.tgz", + "integrity": "sha512-rwMdMZptX0DivkqBuC+Jdq7BYTXwqKai5G5ejPpuEDKpWzi1Oxp+LygGw329FrKpuKeiqpcymlqJTjmy+quWng==", + "dependencies": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "react-is": "^16.6.3" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "react": "^16.3.0", + "react-dom": "^16.3.0" + } + }, + "node_modules/mdbreact/node_modules/@material-ui/core/node_modules/react-event-listener": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz", + "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", + "dependencies": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + }, + "peerDependencies": { + "react": "^16.3.0" + } + }, + "node_modules/mdbreact/node_modules/@material-ui/core/node_modules/react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "dependencies": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, + "node_modules/mdbreact/node_modules/@material-ui/core/node_modules/recompose": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", + "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "react-lifecycles-compat": "^3.0.2", + "symbol-observable": "^1.0.4" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/mdbreact/node_modules/@material-ui/core/node_modules/recompose/node_modules/hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "node_modules/mdbreact/node_modules/@types/react-transition-group": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.9.2.tgz", + "integrity": "sha512-5Fv2DQNO+GpdPZcxp2x/OQG/H19A01WlmpjVD9cKvVFmoVLOZ9LvBgSWG6pSXIU4og5fgbvGPaCV5+VGkWAEHA==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/mdbreact/node_modules/classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "node_modules/mdbreact/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "node_modules/mdbreact/node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mdbreact/node_modules/deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdbreact/node_modules/focus-trap-react": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-6.0.0.tgz", + "integrity": "sha512-mvEYxmP75PMx0vOqoIAmJHO/qUEvdTAdz6gLlEZyxxODnuKQdnKea2RWTYxghAPrV+ibiIq2o/GTSgQycnAjcw==", + "dependencies": { + "focus-trap": "^4.0.2" + }, + "peerDependencies": { + "react": "0.14.x || ^15.0.0 || ^16.0.0", + "react-dom": "0.14.x || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/mdbreact/node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/mdbreact/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/mdbreact/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/mdbreact/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mdbreact/node_modules/material-ui-pickers": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/material-ui-pickers/-/material-ui-pickers-2.2.4.tgz", + "integrity": "sha512-QCQh08Ylmnt+o4laW+rPs92QRAcESv3sPXl50YadLm++rAZAXAOh3K8lreGdynCMYFgZfdyu81Oz9xzTlAZNfw==", + "deprecated": "You can now upgrade to @material-ui/pickers. Documentation for v2 can be found at https://material-ui-pickers-v2.dmtr-kovalenko.now.sh/", + "dependencies": { + "@types/react-text-mask": "^5.4.3", + "clsx": "^1.0.2", + "react-event-listener": "^0.6.6", + "react-text-mask": "^5.4.3", + "react-transition-group": "^2.5.3", + "tslib": "^1.9.3" + }, + "peerDependencies": { + "@material-ui/core": "^3.2.0", + "prop-types": "^15.6.0", + "react": "^16.3.0", + "react-dom": "^16.3.0" + } + }, + "node_modules/mdbreact/node_modules/material-ui-pickers/node_modules/react-event-listener": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz", + "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", + "dependencies": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + }, + "peerDependencies": { + "react": "^16.3.0" + } + }, + "node_modules/mdbreact/node_modules/material-ui-pickers/node_modules/react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "dependencies": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, + "node_modules/mdbreact/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/mdbreact/node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/mdbreact/node_modules/react": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdbreact/node_modules/react-chartjs-2": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-2.9.0.tgz", + "integrity": "sha512-IYwqUUnQRAJ9SNA978vxulHJTcUFTJk2LDVfbAyk0TnJFZZG7+6U/2flsE4MCw6WCbBjTTypy8T82Ch7XrPtRw==", + "dependencies": { + "lodash": "^4.17.4", + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "chart.js": "^2.3", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0-beta || ^16.0.0", + "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0-beta || ^16.0.0" + } + }, + "node_modules/mdbreact/node_modules/react-dom": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.1" + }, + "peerDependencies": { + "react": "17.0.1" + } + }, + "node_modules/mdbreact/node_modules/react-image-lightbox": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-image-lightbox/-/react-image-lightbox-5.1.1.tgz", + "integrity": "sha512-GprldD8AqpRb2hsOdns3sI7Xeo9hJlcybDxuli4RB+ml1J/GaFaUuRkT/7IrTLv2+4vkR74ahz2LD0HOUHI7wA==", + "dependencies": { + "prop-types": "^15.6.2", + "react-modal": "^3.8.1" + }, + "peerDependencies": { + "react": "^16.x", + "react-dom": "^16.x" + } + }, + "node_modules/mdbreact/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/mdbreact/node_modules/react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + }, + "peerDependencies": { + "react": "0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/mdbreact/node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/mdbreact/node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/mdbreact/node_modules/react-scroll": { + "version": "1.7.16", + "resolved": "https://registry.npmjs.org/react-scroll/-/react-scroll-1.7.16.tgz", + "integrity": "sha512-f4M5AdL+3cw3MJ7c/T0hPMY2iHCeQLDXV13lRanAFQ6JIt9xyAdHCpTH9mLUQt9SQh4pRarD+Qc7KhU6qMx3Yg==", + "dependencies": { + "lodash.throttle": "^4.1.1", + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^15.5.4 || ^16.0.0", + "react-dom": "^15.5.4 || ^16.0.0" + } + }, + "node_modules/mdbreact/node_modules/react-transition-group": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", + "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "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/mdbreact/node_modules/react-transition-group/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/mdbreact/node_modules/react-transition-group/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/mdbreact/node_modules/sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dependencies": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/mdbreact/node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/mdbreact/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/mdbreact/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/mdbreact/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -15459,6 +16332,14 @@ "mkdirp": "bin/cmd.js" } }, + "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", @@ -15527,6 +16408,23 @@ "tslib": "^2.0.3" } }, + "node_modules/node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dependencies": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node_modules/node-fetch/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -15573,6 +16471,11 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-scroll-left": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz", + "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg==" + }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -15981,6 +16884,11 @@ "node": ">=8" } }, + "node_modules/perfect-scrollbar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz", + "integrity": "sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA==" + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -16144,6 +17052,16 @@ "node": ">=4" } }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/postcss": { "version": "8.4.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", @@ -18016,6 +18934,32 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, + "node_modules/react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" + } + }, + "node_modules/react-numeric-input": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-numeric-input/-/react-numeric-input-2.2.3.tgz", + "integrity": "sha512-0hDXY8eznhTNMYfmeXRo/R1Fyx//ub0C/tpXbIeEaTnG72P95MGGMvJbiX5i+mnmiFVT6OCgIR33mke45nNZzQ==", + "peerDependencies": { + "react": ">=0.14.0 || ^15.6.1 || ^16.0.0" + } + }, "node_modules/react-onclickoutside": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz", @@ -18178,6 +19122,56 @@ } } }, + "node_modules/react-text-mask": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-text-mask/-/react-text-mask-5.5.0.tgz", + "integrity": "sha512-SLJlJQxa0uonMXsnXRpv5abIepGmHz77ylQcra0GNd7Jtk4Wj2Mtp85uGQHv1avba2uI8ZvRpIEQPpJKsqRGYw==", + "dependencies": { + "prop-types": "^15.5.6" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-toastify": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-5.5.0.tgz", + "integrity": "sha512-jsVme7jALIFGRyQsri/g4YTsRuaaGI70T6/ikjwZMB4mwTZaCWqj5NqxhGrRStKlJc5npXKKvKeqTiRGQl78LQ==", + "dependencies": { + "@babel/runtime": "^7.4.2", + "classnames": "^2.2.6", + "prop-types": "^15.7.2", + "react-transition-group": "^4" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, + "node_modules/react-toastify/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/react-toastify/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/react-transition-group": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", @@ -18430,6 +19424,11 @@ "node": ">=8" } }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "node_modules/resolve-url-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", @@ -18898,11 +19897,27 @@ "node": ">= 0.8.0" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -19507,11 +20522,24 @@ "boolbase": "~1.0.0" } }, + "node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "node_modules/tabbable": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-3.1.2.tgz", + "integrity": "sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==" + }, "node_modules/tailwindcss": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.3.tgz", @@ -19699,6 +20727,11 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -19870,6 +20903,11 @@ "node": ">= 0.6" } }, + "node_modules/typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -19891,6 +20929,24 @@ "node": ">=4.2.0" } }, + "node_modules/ua-parser-js": { + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -20094,6 +21150,11 @@ "node": ">=10.12.0" } }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -22727,6 +23788,11 @@ "tslib": "^2.4.0" } }, + "@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" + }, "@humanwhocodes/config-array": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", @@ -22747,6 +23813,15 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, "@internationalized/date": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.0.1.tgz", @@ -26325,6 +27400,22 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, + "@types/jss": { + "version": "9.5.8", + "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.8.tgz", + "integrity": "sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA==", + "requires": { + "csstype": "^2.0.0", + "indefinite-observable": "^1.0.1" + }, + "dependencies": { + "csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + } + } + }, "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -26399,6 +27490,14 @@ "@types/react": "*" } }, + "@types/react-text-mask": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/@types/react-text-mask/-/react-text-mask-5.4.11.tgz", + "integrity": "sha512-DIJ3/dS4jd7NK3lEgsOwcgpp+ZlVrNJEiUDRayZRE/PNMbV/nLWmOKGdL0BUS29hnx0CDgITgPudKx0BgbF5fA==", + "requires": { + "@types/react": "*" + } + }, "@types/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -27426,6 +28525,17 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "bootstrap": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "requires": {} + }, + "bootstrap-css-only": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap-css-only/-/bootstrap-css-only-4.4.1.tgz", + "integrity": "sha512-iBgNli7RnedBFwn6sMTQoAZ8WgIwmX4kF1rckfj+pgro5q/Q0DbLtcpfH60XoFnCXzbEJU/khC/B2EQap89mCg==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -27443,6 +28553,11 @@ "fill-range": "^7.0.1" } }, + "brcast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.2.tgz", + "integrity": "sha512-f5XwwFCCuvgqP2nMH/hJ74FqnGmb4X3D+NC//HphxJzzhsZvSZa+Hk/syB7j3ZHpPDLMoYU8oBgviRWfNvEfKA==" + }, "broadcast-channel": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", @@ -27566,11 +28681,42 @@ "supports-color": "^5.3.0" } }, + "change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha512-YXzt1cQ4a2jqazhcuSWEOc1K2q8g9H6eWNsyZgi640LDzRWVQ2eDe+Y/kVdftH+vYdPF2rgDb3dLdpxE1jvAxw==" + }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" }, + "chart.js": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz", + "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, "check-types": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", @@ -27646,6 +28792,16 @@ "wrap-ansi": "^7.0.0" } }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", @@ -28008,6 +29164,14 @@ } } }, + "css-vendor": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", + "integrity": "sha512-Vx/Vl3zsHj32Z+WTNzGjd2iSbSIJTYHMmyGUT2nzCjj0Xk4qLfwpQ8nF6TQ5oo3Cf0s/An3DTc7LclH1BkAXbQ==", + "requires": { + "is-in-browser": "^1.0.2" + } + }, "css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -28154,6 +29318,11 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -28482,6 +29651,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + } + }, "enhanced-resolve": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", @@ -29168,6 +30345,11 @@ "strip-final-newline": "^2.0.0" } }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -29303,6 +30485,35 @@ "bser": "2.1.1" } }, + "fbjs": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", + "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + } + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -29439,6 +30650,15 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, + "focus-trap": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-4.0.2.tgz", + "integrity": "sha512-HtLjfAK7Hp2qbBtLS6wEznID1mPT+48ZnP2nkHzgjpL4kroYHg0CdqJ5cTXk+UO5znAxF5fRUkhdyfgrhh8Lzw==", + "requires": { + "tabbable": "^3.1.2", + "xtend": "^4.0.1" + } + }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -29769,6 +30989,11 @@ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -30022,6 +31247,11 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -30089,6 +31319,14 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, + "indefinite-observable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.2.tgz", + "integrity": "sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA==", + "requires": { + "symbol-observable": "1.2.0" + } + }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -30232,6 +31470,11 @@ "is-extglob": "^2.1.1" } }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" + }, "is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -30275,6 +31518,14 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -30390,6 +31641,20 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -31999,6 +33264,78 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" }, + "jss": { + "version": "9.8.7", + "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", + "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", + "requires": { + "is-in-browser": "^1.1.3", + "symbol-observable": "^1.1.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "jss-camel-case": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", + "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", + "requires": { + "hyphenate-style-name": "^1.0.2" + } + }, + "jss-default-unit": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", + "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==", + "requires": {} + }, + "jss-global": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", + "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==", + "requires": {} + }, + "jss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", + "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", + "requires": { + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "jss-props-sort": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", + "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==", + "requires": {} + }, + "jss-vendor-prefixer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", + "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", + "requires": { + "css-vendor": "^0.3.8" + } + }, "jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -32108,6 +33445,11 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -32194,6 +33536,432 @@ } } }, + "mdbreact": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mdbreact/-/mdbreact-5.2.0.tgz", + "integrity": "sha512-QIQ4xtEaZrXq82GKrVapRhTt+8OkVydsvb6Bir7y3AEiT//FvCg3OXzOk3VWPkaeiHnWdgKQTYhYBqsKEYEKYA==", + "requires": { + "@fortawesome/fontawesome-free": "^5.12.0", + "@material-ui/core": "3.9.3", + "bootstrap-css-only": "4.4.1", + "chart.js": "2.9.4", + "classnames": "2.2.6", + "focus-trap-react": "^6.0.0", + "material-ui-pickers": "2.2.4", + "perfect-scrollbar": "1.5.0", + "popper.js": "^1.16.0", + "prop-types": "15.7.2", + "raf": "3.4.1", + "react": "17.0.1", + "react-chartjs-2": "2.9.0", + "react-dom": "17.0.1", + "react-image-lightbox": "5.1.1", + "react-numeric-input": "2.2.3", + "react-popper": "^1.3.7", + "react-router-dom": "^5.1.2", + "react-scroll": "1.7.16", + "react-toastify": "5.5.0", + "react-transition-group": "4.3.0", + "sass-loader": "^8.0.2" + }, + "dependencies": { + "@material-ui/core": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.9.3.tgz", + "integrity": "sha512-REIj62+zEvTgI/C//YL4fZxrCVIySygmpZglsu/Nl5jPqy3CDjZv1F9ubBYorHqmRgeVPh64EghMMWqk4egmfg==", + "requires": { + "@babel/runtime": "^7.2.0", + "@material-ui/system": "^3.0.0-alpha.0", + "@material-ui/utils": "^3.0.0-alpha.2", + "@types/jss": "^9.5.6", + "@types/react-transition-group": "^2.0.8", + "brcast": "^3.0.1", + "classnames": "^2.2.5", + "csstype": "^2.5.2", + "debounce": "^1.1.0", + "deepmerge": "^3.0.0", + "dom-helpers": "^3.2.1", + "hoist-non-react-statics": "^3.2.1", + "is-plain-object": "^2.0.4", + "jss": "^9.8.7", + "jss-camel-case": "^6.0.0", + "jss-default-unit": "^8.0.2", + "jss-global": "^3.0.0", + "jss-nested": "^6.0.1", + "jss-props-sort": "^6.0.0", + "jss-vendor-prefixer": "^7.0.0", + "normalize-scroll-left": "^0.1.2", + "popper.js": "^1.14.1", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.2", + "react-transition-group": "^2.2.1", + "recompose": "0.28.0 - 0.30.0", + "warning": "^4.0.1" + }, + "dependencies": { + "@material-ui/system": { + "version": "3.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-3.0.0-alpha.2.tgz", + "integrity": "sha512-odmxQ0peKpP7RQBQ8koly06YhsPzcoVib1vByVPBH4QhwqBXuYoqlCjt02846fYspAqkrWzjxnWUD311EBbxOA==", + "requires": { + "@babel/runtime": "^7.2.0", + "deepmerge": "^3.0.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + } + }, + "@material-ui/utils": { + "version": "3.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-3.0.0-alpha.3.tgz", + "integrity": "sha512-rwMdMZptX0DivkqBuC+Jdq7BYTXwqKai5G5ejPpuEDKpWzi1Oxp+LygGw329FrKpuKeiqpcymlqJTjmy+quWng==", + "requires": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "react-is": "^16.6.3" + } + }, + "react-event-listener": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz", + "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", + "requires": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + } + }, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + }, + "recompose": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", + "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", + "requires": { + "@babel/runtime": "^7.0.0", + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "react-lifecycles-compat": "^3.0.2", + "symbol-observable": "^1.0.4" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + } + } + } + } + }, + "@types/react-transition-group": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.9.2.tgz", + "integrity": "sha512-5Fv2DQNO+GpdPZcxp2x/OQG/H19A01WlmpjVD9cKvVFmoVLOZ9LvBgSWG6pSXIU4og5fgbvGPaCV5+VGkWAEHA==", + "requires": { + "@types/react": "*" + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" + }, + "focus-trap-react": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-6.0.0.tgz", + "integrity": "sha512-mvEYxmP75PMx0vOqoIAmJHO/qUEvdTAdz6gLlEZyxxODnuKQdnKea2RWTYxghAPrV+ibiIq2o/GTSgQycnAjcw==", + "requires": { + "focus-trap": "^4.0.2" + } + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "material-ui-pickers": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/material-ui-pickers/-/material-ui-pickers-2.2.4.tgz", + "integrity": "sha512-QCQh08Ylmnt+o4laW+rPs92QRAcESv3sPXl50YadLm++rAZAXAOh3K8lreGdynCMYFgZfdyu81Oz9xzTlAZNfw==", + "requires": { + "@types/react-text-mask": "^5.4.3", + "clsx": "^1.0.2", + "react-event-listener": "^0.6.6", + "react-text-mask": "^5.4.3", + "react-transition-group": "^2.5.3", + "tslib": "^1.9.3" + }, + "dependencies": { + "react-event-listener": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz", + "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", + "requires": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + } + }, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + } + } + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "react": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-chartjs-2": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-2.9.0.tgz", + "integrity": "sha512-IYwqUUnQRAJ9SNA978vxulHJTcUFTJk2LDVfbAyk0TnJFZZG7+6U/2flsE4MCw6WCbBjTTypy8T82Ch7XrPtRw==", + "requires": { + "lodash": "^4.17.4", + "prop-types": "^15.5.8" + } + }, + "react-dom": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.1" + } + }, + "react-image-lightbox": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-image-lightbox/-/react-image-lightbox-5.1.1.tgz", + "integrity": "sha512-GprldD8AqpRb2hsOdns3sI7Xeo9hJlcybDxuli4RB+ml1J/GaFaUuRkT/7IrTLv2+4vkR74ahz2LD0HOUHI7wA==", + "requires": { + "prop-types": "^15.6.2", + "react-modal": "^3.8.1" + } + }, + "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==" + }, + "react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "requires": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + } + }, + "react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-scroll": { + "version": "1.7.16", + "resolved": "https://registry.npmjs.org/react-scroll/-/react-scroll-1.7.16.tgz", + "integrity": "sha512-f4M5AdL+3cw3MJ7c/T0hPMY2iHCeQLDXV13lRanAFQ6JIt9xyAdHCpTH9mLUQt9SQh4pRarD+Qc7KhU6qMx3Yg==", + "requires": { + "lodash.throttle": "^4.1.1", + "prop-types": "^15.5.8" + } + }, + "react-transition-group": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", + "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "dependencies": { + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + } + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, "mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -32345,6 +34113,11 @@ "minimist": "^1.2.6" } }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -32401,6 +34174,22 @@ "tslib": "^2.0.3" } }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + } + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -32438,6 +34227,11 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" }, + "normalize-scroll-left": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz", + "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg==" + }, "normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -32723,6 +34517,11 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, + "perfect-scrollbar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz", + "integrity": "sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA==" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -32839,6 +34638,11 @@ } } }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, "postcss": { "version": "8.4.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", @@ -34015,6 +35819,23 @@ } } }, + "react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "requires": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + } + }, + "react-numeric-input": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-numeric-input/-/react-numeric-input-2.2.3.tgz", + "integrity": "sha512-0hDXY8eznhTNMYfmeXRo/R1Fyx//ub0C/tpXbIeEaTnG72P95MGGMvJbiX5i+mnmiFVT6OCgIR33mke45nNZzQ==", + "requires": {} + }, "react-onclickoutside": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz", @@ -34117,6 +35938,47 @@ "workbox-webpack-plugin": "^6.4.1" } }, + "react-text-mask": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-text-mask/-/react-text-mask-5.5.0.tgz", + "integrity": "sha512-SLJlJQxa0uonMXsnXRpv5abIepGmHz77ylQcra0GNd7Jtk4Wj2Mtp85uGQHv1avba2uI8ZvRpIEQPpJKsqRGYw==", + "requires": { + "prop-types": "^15.5.6" + } + }, + "react-toastify": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-5.5.0.tgz", + "integrity": "sha512-jsVme7jALIFGRyQsri/g4YTsRuaaGI70T6/ikjwZMB4mwTZaCWqj5NqxhGrRStKlJc5npXKKvKeqTiRGQl78LQ==", + "requires": { + "@babel/runtime": "^7.4.2", + "classnames": "^2.2.6", + "prop-types": "^15.7.2", + "react-transition-group": "^4" + }, + "dependencies": { + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "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==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + } + } + }, "react-transition-group": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", @@ -34310,6 +36172,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "resolve-url-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", @@ -34633,11 +36500,24 @@ "send": "0.18.0" } }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, "shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -35097,11 +36977,21 @@ } } }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "tabbable": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-3.1.2.tgz", + "integrity": "sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==" + }, "tailwindcss": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.3.tgz", @@ -35231,6 +37121,11 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, "tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -35363,6 +37258,11 @@ "mime-types": "~2.1.24" } }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -35377,6 +37277,11 @@ "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "peer": true }, + "ua-parser-js": { + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==" + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -35521,6 +37426,11 @@ "source-map": "^0.7.3" } }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/front-end/package.json b/front-end/package.json index 3f83d24..1abfc69 100644 --- a/front-end/package.json +++ b/front-end/package.json @@ -11,6 +11,8 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "@wojtekmaj/react-daterange-picker": "^4.1.0", + "bootstrap": "^5.2.3", + "mdbreact": "^5.2.0", "prop-types": "^15.8.1", "ra-data-json-server": "^4.6.1", "react": "^18.2.0", diff --git a/front-end/public/index.html b/front-end/public/index.html index 1df4ebc..c016c98 100644 --- a/front-end/public/index.html +++ b/front-end/public/index.html @@ -8,7 +8,16 @@ + /> + + + React App - - + - { + x.style.left = "-400px"; + y.style.left = "50px"; + z.style.left = "110px"; + }; + const login = () => { + x.style.left = "50px"; + y.style.left = "450px"; + z.style.left = "0"; + }; + + $('#myLogin').on('click', ()=>{ + login() + }); + $('#mySignUp').on('click', ()=>{ + signup() + }); }); diff --git a/front-end/src/App.js b/front-end/src/App.js index a8d9aad..aa10e40 100644 --- a/front-end/src/App.js +++ b/front-end/src/App.js @@ -3,26 +3,34 @@ import "./App.css"; import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; import SupervisorDashboard from "./components/Supervisor/Dashboard"; import LogBookFeeback from "./components/Supervisor/logbook-feedback."; -import * as React from 'react'; -import{Admin,Resource} from 'react-admin'; -import { PostEdit,PostList,PostCreate } from "./components/Students/posts"; +import * as React from "react"; +import { Admin, Resource } from "react-admin"; +import { PostEdit, PostList, PostCreate } from "./components/Students/posts"; import { StudentDashboard } from "./components/Students/Dashboard"; -import jsonServerProvider from 'ra-data-json-server'; +import jsonServerProvider from "ra-data-json-server"; import { UserList } from "./components/Students/users"; +import EmployerDashboard from "./components/Employer/Dashboard"; +import Login from "./components/Login"; +import Notifications from "./components/Employer/Notifications"; +import Employer from "./components/Employer/Employer"; const dataProvider = jsonServerProvider("https://jsonplaceholder.typicode.com"); function App() { return ( <> + } /> } /> } /> + } /> + } /> + } /> - + {/* - - + */} ); } diff --git a/front-end/src/components/Employer/Dashboard.html b/front-end/src/components/Employer/Dashboard.html deleted file mode 100644 index f25b9e0..0000000 --- a/front-end/src/components/Employer/Dashboard.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - Employer Dashboard - - - - - - -
- - -
-
-
-
-
Departments
-
15
-
- - up since 2010 -
-
- -
-
-
-
Employees
-
2000
-
- - up since 2021 -
-
- -
-
-
-
Interns
-
50
-
- - up since sept 2021 -
-
- -
-
-
-
Projects
-
27
-
- - up since may 2021 -
-
- -
-
- - - -
- - -
- - - - - - - \ No newline at end of file diff --git a/front-end/src/components/Employer/Dashboard.js b/front-end/src/components/Employer/Dashboard.js index e69de29..e27e162 100644 --- a/front-end/src/components/Employer/Dashboard.js +++ b/front-end/src/components/Employer/Dashboard.js @@ -0,0 +1,338 @@ +import React from "react"; +import "./sytle1.css"; + +const EmployerDashboard = () => { + // let sidebar = document.querySelector(".sidebar"); + // let sidebarBtn = document.querySelector(".sidebarBtn"); + + // sidebarBtn.onclick = function () { + // sidebar.classList.toggle("active"); + // }; + + return ( + + + +
+ + +
+
+
+
+
Departments
+
15
+
+ + up since 2010 +
+
+ +
+
+
+
Employees
+
2000
+
+ + up since 2021 +
+
+ +
+
+
+
Interns
+
50
+
+ + up since sept 2021 +
+
+ +
+
+
+
Projects
+
27
+
+ + up since may 2021 +
+
+ +
+
+ +
+
+
Recent Interns
+ +
+ View All +
+
+ +
+
Workshops
+ +
+
+
+
+ + ); +}; + +export default EmployerDashboard; + +// +// +// +// +// +// +// +// Employer Dashboard +// + +// diff --git a/front-end/src/components/Employer/Employer.html b/front-end/src/components/Employer/Employer.html deleted file mode 100644 index 426f370..0000000 --- a/front-end/src/components/Employer/Employer.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - Employer Dashboard - - - - - - -
- - -
-

Feedback

-
- - - - - -
-
- - -
- - - - - - - \ No newline at end of file diff --git a/front-end/src/components/Employer/Employer.js b/front-end/src/components/Employer/Employer.js new file mode 100644 index 0000000..6468b7f --- /dev/null +++ b/front-end/src/components/Employer/Employer.js @@ -0,0 +1,79 @@ +import "./style2.css"; +function Employer() { + return ( + + + +
+ + +
+

Feedback

+
+ + + + +
+
+
+ + + + ); +} + +export default Employer; \ No newline at end of file diff --git a/front-end/src/components/Employer/Login.html b/front-end/src/components/Employer/Login.html deleted file mode 100644 index b311574..0000000 --- a/front-end/src/components/Employer/Login.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - LOGIN AND REGISTRATION FORM - - - -
-
-
-
- - -
-
- - - Remember me. - -
- -
- - - - - - I agree to the terms & conditions. - -
-

ATTACHMENTS MANAGEMENT SYSTEM

-
-
- - - - - \ No newline at end of file diff --git a/front-end/src/components/Employer/Notifications.html b/front-end/src/components/Employer/Notifications.html deleted file mode 100644 index 3612992..0000000 --- a/front-end/src/components/Employer/Notifications.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - Employer Dashboard - - - - - - -
- - - - -
- - - - - - - \ No newline at end of file diff --git a/front-end/src/components/Employer/Notifications.js b/front-end/src/components/Employer/Notifications.js new file mode 100644 index 0000000..229dbec --- /dev/null +++ b/front-end/src/components/Employer/Notifications.js @@ -0,0 +1,58 @@ +import "./style3.css"; +function Notifications() { + return ( + + + +
+ +
+ + + + ); +} + +export default Notifications \ No newline at end of file diff --git a/front-end/src/components/Employer/style.css b/front-end/src/components/Employer/style.css index 1740f2b..3169ce3 100644 --- a/front-end/src/components/Employer/style.css +++ b/front-end/src/components/Employer/style.css @@ -1,7 +1,7 @@ *{ - margin: 0; + margin: 0; padding: 0; - font-family:sans-serif; + font-family:sans-serif; } .hero{ height: 650px; diff --git a/front-end/src/components/Login.js b/front-end/src/components/Login.js index e69de29..b1b3f5f 100644 --- a/front-end/src/components/Login.js +++ b/front-end/src/components/Login.js @@ -0,0 +1,100 @@ +import "./Employer/style.css"; +function Login() { + + const handleLogin = (e)=>{ + e.preventDefault(); + + //Login API endpoint + + } + const handleRegistration = () =>{ + // Registration API endpoint + } + return ( + +
+
+
+
+ + +
+
+
+ +
+
+ +
+ + Remember me. + +
+ +
+ + + + + + + + + I agree to the terms & conditions. + +
+

ATTACHMENTS MANAGEMENT SYSTEM

+
+
+ + ); +} + +export default Login; diff --git a/front-end/src/components/Supervisor/Dashboard.js b/front-end/src/components/Supervisor/Dashboard.js index 7f00707..698449d 100644 --- a/front-end/src/components/Supervisor/Dashboard.js +++ b/front-end/src/components/Supervisor/Dashboard.js @@ -1,7 +1,6 @@ import React from "react"; import { useEffect, useState } from "react"; import { Navigate, useNavigate } from "react-router-dom"; - function SupervisorDashboard() { //Back to top button const [backToTopButton, setBackToTopButton] = useState(false); @@ -49,7 +48,7 @@ function SupervisorDashboard() { navigate("/", { replace: true }); }; - if (!isAuthenticated) { + if (isAuthenticated) { navigate("/", { replace: true }); // } else { diff --git a/front-end/src/components/Supervisor/logbook-feedback..js b/front-end/src/components/Supervisor/logbook-feedback..js index f4e766f..7b0b8e0 100644 --- a/front-end/src/components/Supervisor/logbook-feedback..js +++ b/front-end/src/components/Supervisor/logbook-feedback..js @@ -41,7 +41,7 @@ function LogBookFeeback() { const navigate = useNavigate(); const authenticated = localStorage.getItem("authenticated"); - if (!authenticated) { + if (authenticated) { navigate("/"); } else { return ( diff --git a/front-end/src/index.css b/front-end/src/index.css index 1396270..3d38a00 100644 --- a/front-end/src/index.css +++ b/front-end/src/index.css @@ -1,5 +1,4 @@ @import "https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700"; - body { font-family: "Poppins", sans-serif; background: #fafafa; diff --git a/front-end/src/index.js b/front-end/src/index.js index 6614184..ccb5856 100644 --- a/front-end/src/index.js +++ b/front-end/src/index.js @@ -2,8 +2,6 @@ import React from "react"; import ReactDOM from "react-dom/client"; import "./index.css"; import App from "./App"; - - const root = ReactDOM.createRoot(document.getElementById("root")); root.render( From baa6195de1e7ef4b86e67b6634d05dd9635795d1 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 24 Dec 2022 00:34:32 +0300 Subject: [PATCH 05/49] Adds backend files --- backend/.gitignore | 1 + backend/app/__init__.py | 0 backend/app/admin.py | 3 + backend/app/apps.py | 6 ++ backend/app/migrations/__init__.py | 0 backend/app/models.py | 3 + backend/app/tests.py | 3 + backend/app/views.py | 3 + backend/attachment/__init__.py | 0 backend/attachment/asgi.py | 16 ++++ backend/attachment/settings.py | 125 +++++++++++++++++++++++++++++ backend/attachment/urls.py | 21 +++++ backend/attachment/wsgi.py | 16 ++++ backend/manage.py | 22 +++++ 14 files changed, 219 insertions(+) create mode 100644 backend/.gitignore create mode 100644 backend/app/__init__.py create mode 100644 backend/app/admin.py create mode 100644 backend/app/apps.py create mode 100644 backend/app/migrations/__init__.py create mode 100644 backend/app/models.py create mode 100644 backend/app/tests.py create mode 100644 backend/app/views.py create mode 100644 backend/attachment/__init__.py create mode 100644 backend/attachment/asgi.py create mode 100644 backend/attachment/settings.py create mode 100644 backend/attachment/urls.py create mode 100644 backend/attachment/wsgi.py create mode 100644 backend/manage.py diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..a979ee7 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1 @@ +/venv \ No newline at end of file diff --git a/backend/app/__init__.py b/backend/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/admin.py b/backend/app/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/backend/app/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/backend/app/apps.py b/backend/app/apps.py new file mode 100644 index 0000000..ed327d2 --- /dev/null +++ b/backend/app/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AppConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'app' diff --git a/backend/app/migrations/__init__.py b/backend/app/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/models.py b/backend/app/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/backend/app/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/backend/app/tests.py b/backend/app/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/app/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/app/views.py b/backend/app/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/backend/app/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/backend/attachment/__init__.py b/backend/attachment/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/attachment/asgi.py b/backend/attachment/asgi.py new file mode 100644 index 0000000..a60efb2 --- /dev/null +++ b/backend/attachment/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for attachment project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'attachment.settings') + +application = get_asgi_application() diff --git a/backend/attachment/settings.py b/backend/attachment/settings.py new file mode 100644 index 0000000..6c32644 --- /dev/null +++ b/backend/attachment/settings.py @@ -0,0 +1,125 @@ +""" +Django settings for attachment project. + +Generated by 'django-admin startproject' using Django 3.2.16. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-2#2n-phd2ed7lr@&h3$77pv995g@w^8e2afw5kevcgp70*s3f5' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'attachment.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'attachment.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/3.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.2/howto/static-files/ + +STATIC_URL = '/static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/backend/attachment/urls.py b/backend/attachment/urls.py new file mode 100644 index 0000000..bc2ada1 --- /dev/null +++ b/backend/attachment/urls.py @@ -0,0 +1,21 @@ +"""attachment URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/3.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/backend/attachment/wsgi.py b/backend/attachment/wsgi.py new file mode 100644 index 0000000..644fbf6 --- /dev/null +++ b/backend/attachment/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for attachment project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'attachment.settings') + +application = get_wsgi_application() diff --git a/backend/manage.py b/backend/manage.py new file mode 100644 index 0000000..d18d498 --- /dev/null +++ b/backend/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'attachment.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() From 05260c1be356f31236254fefcf1d74e789731b59 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 24 Dec 2022 01:05:09 +0300 Subject: [PATCH 06/49] Adds the User model --- backend/app/models.py | 63 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/backend/app/models.py b/backend/app/models.py index 71a8362..99c5314 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -1,3 +1,64 @@ from django.db import models - +from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser) # Create your models here. + + +class UserManager(BaseUserManager): + + def create_user(self, username, email, user_type, password=None): + if username is None: + raise TypeError('Users must have a username') + if email is None: + raise TypeError('Users must have a Email') + + user = self.model( + + username=username, + user_type=user_type, + email=self.normalize_email(email) + + ) + user.set_password(password) + user.save() + return user + + def create_superuser(self, email, user_type, username, password=None): + + user = self.create_user( + + email, + user_type=user_type, + username=username, + password=password, + + ) + + user.is_admin = True + user.is_superuser = True + user.is_staff = True + user.save(using=self._db) + return user + + +class User(AbstractBaseUser): + + USER_TYPE_CHOICES = ( + + ('employer', "Employer"), + ('supervisor', "Supervisor"), + ('student', "Student"), + ) + + email = models.EmailField(max_length=100, unique=True) + username = models.CharField(max_length=100) + user_type = models.CharField(max_length=10) + is_active = models.BooleanField(default=True) + is_admin = models.BooleanField(default=False) + + USERNAME_FIELD = 'email' + REQUIRED_FIELDS = ['username', 'user_type'] + + objects = UserManager() + + def __str__(self): + return self.email From 97f71479fec590ea34557c42b52435686aaf8245 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 24 Dec 2022 01:10:39 +0300 Subject: [PATCH 07/49] Registers the app and install the rest_framework --- backend/attachment/settings.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/attachment/settings.py b/backend/attachment/settings.py index 6c32644..9cac964 100644 --- a/backend/attachment/settings.py +++ b/backend/attachment/settings.py @@ -31,6 +31,9 @@ # Application definition INSTALLED_APPS = [ + + 'app', + 'rest_framework', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', From 3430edc80df3a488c28750dbd6e2faec7e1b0766 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 24 Dec 2022 01:29:52 +0300 Subject: [PATCH 08/49] adds login and register serializers classes --- backend/app/serializers.py | 57 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 backend/app/serializers.py diff --git a/backend/app/serializers.py b/backend/app/serializers.py new file mode 100644 index 0000000..fcb7ef0 --- /dev/null +++ b/backend/app/serializers.py @@ -0,0 +1,57 @@ +from rest_framework import serializers +from .models import * +from django.contrib import auth +from rest_framework.exceptions import AuthenticationFailed + +class RegisterSerializer(serializers.ModelSerializer): + + password = serializers.CharField(max_length=68, min_length=6, write_only=True) + class Meta: + model = User + fields = ['email', 'username', 'user_type', 'password'] + + + def validate(self, attrs): + email = attrs.get('email', '') + username = attrs.get('username', '') + user_type = attrs.get('usertype', '') + + if not email: + raise serializers.ValidationError('Users should have an Email.') + + def create(self, validated_data): + + return User.objects.create_user(**validated_data) + + + +class LoginSerializer(serializers.ModelSerializer): + + email = serializers.EmailField(max_length=255, min_length=3 ) + password=serializers.CharField(max_length=68, min_length=6, write_only=True) + username =serializers.CharField(max_length=255, min_length=3, read_only=True) + user_type =serializers.CharField(max_length=255, min_length=3, read_only=True) + + class Meta: + model=User + fields = ['email', 'password', 'username', 'user_type'] + + def validate(self, attrs): + email =attrs.get('email', '') + password= attrs.get('password', '') + + user = auth.authenticate(email=email, password=password) + + if not user: + raise AuthenticationFailed('Invalid credetinals') + + if not user.is_active: + raise AuthenticationFailed('Account disabled contact Admin.') + + + return { + + 'email': user.email, + 'username': user.username, + 'user_tyoe': user.user_type + } \ No newline at end of file From 8ef4e44b49552989773bc5454d73568b63f85fb3 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 24 Dec 2022 01:35:11 +0300 Subject: [PATCH 09/49] Adds Login and Register API view --- backend/app/views.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/backend/app/views.py b/backend/app/views.py index 91ea44a..d9d5ade 100644 --- a/backend/app/views.py +++ b/backend/app/views.py @@ -1,3 +1,30 @@ from django.shortcuts import render - +from rest_framework import generics, status +from .serializers import RegisterSerializer, LoginSerializer +from rest_framework.response import Response # Create your views here. + +class RegisterView(generics.GenericAPIView): + + serializer_class = RegisterSerializer + + def post(self, request): + user = request.data + serializer = self.serializer_class(data=user) + serializer.is_valid(raise_exception=True) + serializer.save() + + user_data = serializer.data + + return Response(user_data, status=status.HTTP_201_CREATED) + +class LoginAPIView(generics.GenericAPIView): + + serializer_class = LoginSerializer + + def post(self, request): + + serializer = self.serializer_class(data=request.data) + serializer.is_valid(raise_exception=True) + + return Response(serializer.data, status=status.HTTP_200_OK) \ No newline at end of file From f2809a56b62833193a87640bb45e21474bb19c80 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 24 Dec 2022 01:35:40 +0300 Subject: [PATCH 10/49] Change user type --- backend/app/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/serializers.py b/backend/app/serializers.py index fcb7ef0..b35bccc 100644 --- a/backend/app/serializers.py +++ b/backend/app/serializers.py @@ -53,5 +53,5 @@ def validate(self, attrs): 'email': user.email, 'username': user.username, - 'user_tyoe': user.user_type + 'user_type': user.user_type } \ No newline at end of file From 7538f3d1e919cf2043edc879174b43cebd70ddd7 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 24 Dec 2022 01:39:09 +0300 Subject: [PATCH 11/49] Adds routing module --- backend/app/urls.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 backend/app/urls.py diff --git a/backend/app/urls.py b/backend/app/urls.py new file mode 100644 index 0000000..cacbf58 --- /dev/null +++ b/backend/app/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from .views import * + +urlpatterns = [ + + path('api/register/', RegisterView.as_view(), name="register"), + path('api/login/', LoginAPIView.as_view(), name="login"), +] From 318c338ca9738473f72cd30e94be73ade011b3c0 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 24 Dec 2022 01:41:57 +0300 Subject: [PATCH 12/49] Registers the app url to the project --- backend/app/urls.py | 4 ++-- backend/attachment/urls.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/app/urls.py b/backend/app/urls.py index cacbf58..7bcfd57 100644 --- a/backend/app/urls.py +++ b/backend/app/urls.py @@ -3,6 +3,6 @@ urlpatterns = [ - path('api/register/', RegisterView.as_view(), name="register"), - path('api/login/', LoginAPIView.as_view(), name="login"), + path('register/', RegisterView.as_view(), name="register"), + path('login/', LoginAPIView.as_view(), name="login"), ] diff --git a/backend/attachment/urls.py b/backend/attachment/urls.py index bc2ada1..9648ae7 100644 --- a/backend/attachment/urls.py +++ b/backend/attachment/urls.py @@ -14,8 +14,9 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), + path('api/',include('app.urls') ), ] From 533f204cdbdc1cbe3b8217f471a1e6c7b97d8c3f Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 24 Dec 2022 01:43:37 +0300 Subject: [PATCH 13/49] Specifies the user auth model --- backend/attachment/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/attachment/settings.py b/backend/attachment/settings.py index 9cac964..e044f07 100644 --- a/backend/attachment/settings.py +++ b/backend/attachment/settings.py @@ -27,6 +27,7 @@ ALLOWED_HOSTS = [] +AUTH_USER_MODEL = 'app.User' # Application definition From 06b2b93f1ecc0c3a2c5e4a9ec6b9c1ab1d775fe2 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Mon, 26 Dec 2022 10:34:01 +0300 Subject: [PATCH 14/49] Implement register and Login endpoints --- front-end/src/components/Login.js | 112 +++++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 19 deletions(-) diff --git a/front-end/src/components/Login.js b/front-end/src/components/Login.js index b1b3f5f..52ae41c 100644 --- a/front-end/src/components/Login.js +++ b/front-end/src/components/Login.js @@ -1,15 +1,89 @@ +import { useEffect, useState } from "react"; +import { Navigate, useNavigate } from "react-router-dom"; import "./Employer/style.css"; function Login() { + const navigate = useNavigate(); + const [authenticated, setauthenticated] = useState( + localStorage.getItem(localStorage.getItem("authenticated") || false) + ); + const handleLogin = (e) => { + e.preventDefault(); + let email = document.querySelector('input[name="loginEmail"]') + ? document.querySelector('input[name="loginEmail"]').value + : ""; + let pass = document.querySelector('input[name="loginPassword"]') + ? document.querySelector('input[name="loginPassword"]').value + : ""; + //Login API endpoint + fetch(" http://127.0.0.1:8000/api/login/", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + email: email, + password: pass, + }), + }) + .then((response) => response.json()) + .then((data) => { + if (data && data.user_type == "supervisor") { + setauthenticated(true); + localStorage.setItem("authenticated", true); + navigate("/supervisor-dashboard/", { replace: true }); + } + }); + }; - const handleLogin = (e)=>{ - e.preventDefault(); - - //Login API endpoint - - } - const handleRegistration = () =>{ - // Registration API endpoint + const handleRegistration = (e) => { + e.preventDefault(); + let userType = document.querySelector("#userTypes") + ? document.querySelector("#userTypes").value + : ""; + let username = document.querySelector('input[name="r-username"]') + ? document.querySelector('input[name="r-username"]').value + : ""; + let email = document.querySelector('input[name="r-email"]') + ? document.querySelector('input[name="r-email"]').value + : ""; + let pass = document.querySelector('input[name="r-password"]') + ? document.querySelector('input[name="r-password"]').value + : ""; + let confirmPass = document.querySelector('input[name="r-confirm"]') + ? document.querySelector('input[name="r-confirm"]').value + : ""; + // alert([userType, username, email, pass, confirmPass]) + if (pass !== confirmPass) { + alert("Password must match"); + return false; } + // Registration API endpoint + fetch(" http://127.0.0.1:8000/api/register/", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + email: email, + username: username, + password: pass, + user_type: userType, + }), + }) + .then((res) => { + res.json(); + if (res.status == 201) { + alert("Registered Successfully, Click Login to Sign in"); + } + }) + .catch((error) => { + console.log(error); + }); + let form = document.querySelector("#signup") + ? document.querySelector("#signup") + : ""; + form.reset() + }; return (
@@ -29,6 +103,7 @@ function Login() { type="email" class="input-field" placeholder="Enter Username" + name="loginEmail" required />
@@ -37,6 +112,7 @@ function Login() { type="password" class="input-field" placeholder="Enter password" + name="loginPassword" required /> @@ -48,40 +124,38 @@ function Login() {
- - + + + - From fc627dc6b44a34d4f93e27b6fb0558841b98ba2f Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Mon, 26 Dec 2022 10:35:04 +0300 Subject: [PATCH 15/49] Add login required --- front-end/src/components/Supervisor/Dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front-end/src/components/Supervisor/Dashboard.js b/front-end/src/components/Supervisor/Dashboard.js index 698449d..d30fcc7 100644 --- a/front-end/src/components/Supervisor/Dashboard.js +++ b/front-end/src/components/Supervisor/Dashboard.js @@ -48,7 +48,7 @@ function SupervisorDashboard() { navigate("/", { replace: true }); }; - if (isAuthenticated) { + if (!isAuthenticated) { navigate("/", { replace: true }); // } else { From 4841c3b21adf93e70c333e3b65f3901ae72c7267 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Mon, 26 Dec 2022 10:36:15 +0300 Subject: [PATCH 16/49] Registers users --- .../app/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 152 bytes backend/app/__pycache__/admin.cpython-37.pyc | Bin 0 -> 193 bytes backend/app/__pycache__/apps.cpython-37.pyc | Bin 0 -> 408 bytes backend/app/__pycache__/models.cpython-37.pyc | Bin 0 -> 1747 bytes .../__pycache__/serializers.cpython-37.pyc | Bin 0 -> 2189 bytes backend/app/__pycache__/urls.cpython-37.pyc | Bin 0 -> 349 bytes backend/app/__pycache__/views.cpython-37.pyc | Bin 0 -> 1274 bytes backend/app/migrations/0001_initial.py | 30 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-37.pyc | Bin 0 -> 963 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 163 bytes backend/app/serializers.py | 5 +-- .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 159 bytes .../__pycache__/settings.cpython-37.pyc | Bin 0 -> 2513 bytes .../__pycache__/urls.cpython-37.pyc | Bin 0 -> 985 bytes .../__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 568 bytes backend/attachment/settings.py | 6 ++++ backend/db.sqlite3 | Bin 0 -> 98304 bytes 17 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 backend/app/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/app/__pycache__/admin.cpython-37.pyc create mode 100644 backend/app/__pycache__/apps.cpython-37.pyc create mode 100644 backend/app/__pycache__/models.cpython-37.pyc create mode 100644 backend/app/__pycache__/serializers.cpython-37.pyc create mode 100644 backend/app/__pycache__/urls.cpython-37.pyc create mode 100644 backend/app/__pycache__/views.cpython-37.pyc create mode 100644 backend/app/migrations/0001_initial.py create mode 100644 backend/app/migrations/__pycache__/0001_initial.cpython-37.pyc create mode 100644 backend/app/migrations/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/attachment/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/attachment/__pycache__/settings.cpython-37.pyc create mode 100644 backend/attachment/__pycache__/urls.cpython-37.pyc create mode 100644 backend/attachment/__pycache__/wsgi.cpython-37.pyc create mode 100644 backend/db.sqlite3 diff --git a/backend/app/__pycache__/__init__.cpython-37.pyc b/backend/app/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7e9a8436bc0144c80310ea48d9f513bb499eb85 GIT binary patch literal 152 zcmZ?b<>g`kfI zlTi@klAm0fo0?Zr91~EKpOu;nWH^?TBqnEo1Y?pCle1IvQeqMd3S#2pGxIV_;^XxS VDsOSvg`kfews{Cd?{IpdFlCj$@zIDMVU!OAOlu16fpxSF!9UI*(xTqIJKxaCZiz6 zB|o_|H#M)MI3}PdKPxpE$Z#wvNleZF3C1KPCTFMSrNkr_6vTin&?~6C#bJ}1pHiBW NYR3pP@-q-K002QIG1LG6 literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/apps.cpython-37.pyc b/backend/app/__pycache__/apps.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5edc992cee468096541d1742a492039cad91d8b0 GIT binary patch literal 408 zcmYLFu};G<5Vd1hYD>EyRwUL8yEhP6k-v1Ne$c{8CmX zeu0T|+KQ9z{QU0DcYgEfbWG5;m%HQ>&u@1*8b>fgw-*?I0M(?R5vAmTfCub@08{jx zMHKiG@drOxMSR+g!m3)BGR?EZF-M~aX6W_|gCf{PA`fW9z>7FAe1X>?%ZmjeAIUVF+f^wb&3d2|~}9L|F?Dbzmd2b43Jka z6#{N?l2|DT2tk}CG_?aeWdS4B4;HsMyRtYF_N5&-Ks($8+7%3Fmp8_i@7;nG%O~1R zb1o9)Q{CN;lsHmCzKOEvL`dD+nyNxZad9VzQRi;hfV_gK`T&F#5N-vOyPR_SiUc-q zaK;_L7$jNMqc!l`U@v5Cj3ep;%cKa0*pKkApj$)Z$TJo~?Fm`3x& zx3zb-NjDJ-i}R(>jxbV3HxGdvN|{UTnD_ zU06kOEYWG{A!q>5-orLL>n}@of&I_Roo^@Rf|J>DvYW?cDzZXN-pYI-VnDWvB8q3o zoJ^zmoyhnkS}rGbJ_pNly%tLm6(U5Vc$)egfJMCeql{8QNylyhU58?o_`xH+rxW!J z*r}`qB&(v33P|xad+%^sIUzBS8faI}g26rql4Me2QsUdj?K%qUVCfLb&?(hCJMmq) z0SxWURT%Mfo&{~dRJjxqoiKb=M90T+4Y%1LpMpvo@P}|d*p(d=U@U9UL!I8rxqG8u z0#|(oz*<26hg>CN9)`sEyr{V4&fEjGLZ#ZZ*!63rWcAQ<)0GfQ!0Lr;0foE{n z;7!0=u%`k1HG_KwZ}Vob&Rcx#ga#eay|jWJZ}aslE7;&2$X8c041sU^6zrwTBtI82 z@P;c4xGfWpv$@J;&>CZ|3=WcpDoPIZ88pT-zfd7g+UGko2|+K!9)nUJ5NjSku#ZM_+Wd;7!JySjTY{P}4AV7Ob; zV^avakxxz6%RcBlSwWj1_!_3EWsfnZL)!I68S$t~CGHsc4c+96C_Bjqd|G?4xuWAd qE987Sh{|F%sGkvO<8fGd<{HMtQ>Sb1ySnVZ$CN1ay-j+o_tn2gd7pRy literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/serializers.cpython-37.pyc b/backend/app/__pycache__/serializers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa6723d968c98fbd2e75294615e6db5adcdc02f4 GIT binary patch literal 2189 zcmbtVL2u(k6!whAj-8}w=@z=Bz(xWj!l4ozIIIwAx7|fZY=pLjgB8iRo@wH&V}}{1 zyN$9Jy4U3waM)gu_)Bx;l)u0Q-WxY=n=KO3+M4I*H-0nE-+SMi2P-Re3$6!W{1IQ& zEbA|PSzHX1T^Q;J1h+Uztq}$JX^x^gK*O)-ML2Ct0OGlSv`MJWJ1RgjNCh z!Hv*@DzrWe9PYs8?sW6b&37J)BGQf+!B1;%0#IeqNN69mus9nF?TsU)p5>BvJFfP^ z5a+{C*TZm>^GS+&GYo&3MCs)W`w@J#1G6I4?nxq2uKu*-Cd6mN-v|5md-#p&4aU8L zJf4gIeAW9w=0g#KvR4#QJV0abIEtT&jQ67PxCb7KH13SgG{eY!SX3bd9$`doff7>? zcwx?PW*>(73dD@OhC1W)g1(?ew~cNaof)0YsQR)XuPJvf$ggBZ5Vo#d0dH-|7ChuC zi0QTozpV!OB<1ZvbSm0W)_#Z}?m!Ohz9=Ndp;v!`!sDi_9!i4|otqL9k0 ze6{WsM)EFtd#9zhz@1eSghiToQ%34^x_wJJ7akQ17={hQz<}!%){qS83Bd6i{vPRe zY`Fn;UCWOR{<;xM5kakC4Romd5GPxUg?R|S6D>#TmM)lMWfDNATen14e%0;x@*Vh6 zuA{hv!hq%P4qV}i5z{H}q4*d@RY0YN2uWxw7BWY9AUwK8T8`%%YYc|!s`&de znBL^?D;hY!W|uQ$Fs}idYvvu%jIpZ}29tyunuh(w1KRKJO>l zVO6m6e_-D^rUCH8rYIXIFldP-48*@?#zbE?Xdm*y-;VklOA#5~m*r=$u4)@tzMLGa z4*4#M_fXuH2Tau`F#Zo0pTKwj#l-?jb4F*_QRxddW57n6JLkwnHe_lS-rUPK2P`g( z8n69s1L|JMQ~5r|i2npoBXNyBz4KjWD!2_L$VHK4QL3i*_To67WJQ}NDmsRy-;VPP zdQZ{b=wW?C2O8$&b*xib^x2*fl^+ zO=HD>216n4hVZlng!iaRJcmJ_o8Dbc=7OBvPIEbVhFNvfno4S!-7!}s$*RO(quXs6 z{uDg06PPyS(H2?5o3@z5nQo`9TT-YZJdtodz;W@kjCU>SH`Zu4rV4ZT7o{nF+RRmtU7B(l>a>E2LSIc&1&hZ~hAd$?4$$ literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/urls.cpython-37.pyc b/backend/app/__pycache__/urls.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..543f5b97efae509ad956f6f491817f5f8d7fcde1 GIT binary patch literal 349 zcmXv~OHRWu5ViAfn@U_GEYdwH6$Lg(2vz(RktJl}QIe9M>;y#b&^y2eiMwzDZ&~#U ztQZG6l4ss~nt5aUbUGaqj79vBeqsGKWFH=a6Fh2;Nf1FxQqhD`A}nE-)-3@l9I)S< zcOqQjZEfT}xC0Li&#c4~qZ<;9cj!POs-2d1`Hub(dbk-$$O_egoatZ>O)WS5S9~tz@%?6v49Vc$yoLJ@WJkYQcEhGINW#ebvFd SYD8bc!n{kFUkhpA9ME5MjbwcQ literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/views.cpython-37.pyc b/backend/app/__pycache__/views.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95032f3bd7d859a95b109e93d9742066d691a75e GIT binary patch literal 1274 zcmbVM&2G~`5Z)ihaT2Eu<)`onMj`@^6{=d=svuCQ+Q7kzWQ=#4+VxMm>$Fg%CwlEW zzy*mn;TiVIsjt9^8K-H|6B299cxHBYcK7>c_hq}?B+!nZ{D^*WLVlw&Z59}7Ao?RH zK?F@nMtw@rW+}_K&oj%nz~{nBYnkoaS>3N!{k7D|8h(S4Z6a(@zaXM6dD8sK{T4(V z(SS(fI^v4vKJi*tunO_0v6ak)R30mf9m}}WMLxvx zG{RZfY9I*A28dn(HKqwUXJeAkF%$HXp7SwJm|%im0#sxEjejTjhf!8(jjghl*uuJG zutseMHff2l40~WKsxa0vke?$tEaM{gsKSN3xF`7< z2ZmKs{LZUhZ#Q`U^jWa6x3%8e+VpBLMy3a*uH^AZ>e5&v$Y+|fq<#Y<0q*7}QFkHN zpVf_({(A`O{^78{Swy2u=B4iMsv?mQ80%#jMu!;ee+r``psgPchy4@4OLvD~j5RED z*@8^k1x2V$UHBYkv$H$%;C6A`j%OPu2=XwKL13CekQHK-qU{F3@hD6uJ<5hm3iGM^ zsBoim>K?icP<0TE_&LmCRpkGQpsK3%-PgB@fJ5G!B6tiA(2s>cs{&wSHY#JvkMUt=gz&e73Ind>Xua<8if!y&Y6bsAdpUr$<;GfoMdEum$P@ z-1Enn!mS=azgk9xS3x0U|3DV=V*VMj7}@dKen%u>J}A2Suux?*Dz(BJV-^$?TX3L& z)zd;9DMYTSQPY~0o}Q43>-)>MCv?HBu5g8hzpy=d5v~cTcvZNCIS?v15DDYFnAFfJ QJ{uZ=b!i7amoF{+1)YE%qyPW_ literal 0 HcmV?d00001 diff --git a/backend/app/migrations/0001_initial.py b/backend/app/migrations/0001_initial.py new file mode 100644 index 0000000..9547477 --- /dev/null +++ b/backend/app/migrations/0001_initial.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.16 on 2022-12-23 22:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('email', models.EmailField(max_length=100, unique=True)), + ('username', models.CharField(max_length=100)), + ('user_type', models.CharField(max_length=10)), + ('is_active', models.BooleanField(default=True)), + ('is_admin', models.BooleanField(default=False)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/backend/app/migrations/__pycache__/0001_initial.cpython-37.pyc b/backend/app/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6be4d92ce45963957b3ffd5c15f5f86e38eadbc GIT binary patch literal 963 zcmYLIOK%e~5Z+gk-DDF&DX*Ro2c)Q|lq*80FN!#{szkZ0RZ7C0{w^FK}Y)O;xXK&G*e`duBX)FdX(R96w+EN}hX`^;d)2f!Nx^DPQ0M7TB4U z+mW3+kz-pQEO5a6VS&r+x%=IXT<|_wlgZ<|VL9Cfap7hG^{J zl)rIdR%C+}IbcU_YDFIF%)9z{)|>laNoZ2@YgDKnunXE`wemF!IWLq? zr?M8Pz?(f2d-sB~45aFnm3isY$w>Lc0!QqUG)*K#TozHpBTG)TDb8qeNpe!>+ zi?ye$*t!}2SYjIwHOs%V!#A;hLmAJi_^3>poE5c<&qO(A2^#x#O_P}><0(xpG18b; zReaal@$T;KYqHK}r&FoxdT&^ by-Cg`kfI zlTi@klAm0fo0?Zr91~EKpOu;nWH^?TBqnEo1Y?pCle1IvQeqMd3Sx3I(~A;IGV}9_ gW8&j8^D;}~g`kfI zlTi@klAm0fo0?Zr91~EKpOu;nWH^?TBqnEo1Y?pCle1IvQeqMjLhWHa^HWN5Qtd!Cdu-Jn?NTJG2^4RiQnW1+t{*97EA- z|3)6#r%wM)ANAU&{)0}Rx{_^hO=e0h>-gyG?zek(_dD`-E|-nrCs+Md|0@@Z{SiKl zKGQha!khk%1H_aV#35nDdkG~GkC6mP{uKY2`z3ZbbvUJ@AgQE*Q!++OnT9DP3n@rL z2BskkGcXG|m@}r88JLF!xB`oC6_(%{TsJbxEZi{SN)B!+b8yRu0SC8X89swM@VUX6 zarojRhw^#gl?Av9Uy>BuTaLl~j|nrbT!9Dh5Op5FqiB2_jVor{;FLvpqFjZi$`VF( z4e#rC-+*VzO;}ZKfgs0L^4eNF7Rwe7HQR7_N*FV3gYq56<2A-Kz1t%;<6X}=Bsvqa z*t2*eL@H-vTJ`Aan4LEN6>5#F@XMNea< zWApfBT@#&}7I}s-kZhMRm%hp8!O^KOa54%(cY1kZ=Mgc_9M{xoeiU?m0MELF@ANH; zw@k`-r*pn3%?5NtOpia-tUjUt$CpPsV~+mBW{9oC1Fo*IuD?A@gK1Nu_dT+@esA4g zb-S=mVAJxp9(FhGZ*IEBuV23~wobl(Mb@>>$%`X$tQ+p;+7r6bdC~MUn(GQJO1vP6 zGiA;rl&Kw0>yZ=3J5pwJ$D>`M0r9B6G;k>Bj?FytK#211U!7d-V{FS4i=hctl%2YS z`Zp$olu(KVxhUwNKr_(d_M`>F66#^$sJ}Xt^-KVZoM;{qqI{U_RFK2O;G}XU^S_#e z8afxo?B&7QnAL-^JdA4=Fg;^xD;HzI#_2h>P>6p1LzQ|Rp@74ClbnpHZcc=(VTQ+p z5b+t4YwA&7j~Pzxb(GI>KD5lC{)IC2k70IY$ zxR`VQ@g&Ga9RbKe-|(MYLenE3keJMWI@CSu@G#S#Kn^S5Z%inkW%m;XBiRZUq_@Sw zJE>Y!xMHax2N|(mSEE_FR&SPSRoP!2%h(AuOaYmR1&FE}q=9s_zQxWs0SD&^q#rDk zkqtkKi^KU!B1lQq-BMKwxT;u@yztfH?@h!WwUnz-imV3}&nXikchS)xvXJh5Mr5;R zT3Se`_X7>b^WR<;sbbn@uiq;Z+hE;u`)@95KVVRO7~?s>)@1>z{T}g5{UX8?u~++4 zNw%5=KaR8;qB za#IfG#a44qZOKwYt<;KAIhZR|s$QvRK`1iMx_oz=#mARFPDrhOL#sIMvegSJlC+{Cuq%q{6kPf?I8(k3twn zuvnCK#8$bfqK}%oQo%|?Q^oUN3UeTJq_;e2{5eOm`YEQgvw0EbWOxcR!Xi}X5vipgo)%)e3}?p6`4+KaRTji z61@CEIAG~Xa8ZlQvfH(7K_ABWj8aSlE_fxCnP9wBl4E`|CsoxY59&|5`c^UsI8X>j zL2Nz>!*Qo8mz<5UAe=o7Z5&3yv?N+TSb#8kfcifc(&S88B5`Zfp3W=4YT4hCjjfM~ zo?DPn^bey;k(D(q#0pGk`&nrjT;|@N%hnhSRN#7SEgMC6*;zT+*|ocl*c!ek+0~9) zQ*O<6QOZ>U2JSnBHqqjSQ55`y*NY;j@d@RHh}_1rjyHp@ded+7$;Km9k!*(6I7{hG zbf+22=kRdm^V!{wD@Zh|SSWbOs5v?ipkR2A@@(4Eg<*|nF`A=;tNxCZowauRbv~V> zSDGoE=2dzwv)Yb?PT%g{rcTfP%t^W+*+(X5`ge3viyc=t&F~4Av@Y4RdjPD5uzAk0 JbH8`&{02p=GvWXM literal 0 HcmV?d00001 diff --git a/backend/attachment/__pycache__/wsgi.cpython-37.pyc b/backend/attachment/__pycache__/wsgi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ec1edd347eb2a15a5356a5909112c5550f2a62c GIT binary patch literal 568 zcmYjOO>Yx15cN7~6D<@WQE~P)65T~`s}Q1)5(PnulvYU5N*mXn>^gYu?T(YuUilqJ za6#fP`O1mEzzJ`n(vIZu$7tSre)D>7FD4-_4t|Pn5h1_Z%T08{;Z<1pG$cu8L`IV8 zXcmRNqiNNdbs_@Mvip5UcID0w8g8AhWVS2mlni#Sef()U8Z%+dLKSRb8^)dEqO8C; zRyTGD!XB=p>&WpPr5q>HKeZPC literal 0 HcmV?d00001 diff --git a/backend/attachment/settings.py b/backend/attachment/settings.py index e044f07..8e86987 100644 --- a/backend/attachment/settings.py +++ b/backend/attachment/settings.py @@ -35,6 +35,7 @@ 'app', 'rest_framework', + 'corsheaders', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -46,6 +47,7 @@ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -53,6 +55,10 @@ 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] +CORS_ALLOWED_ORIGINS = [ + 'http://localhost:3000', +] + ROOT_URLCONF = 'attachment.urls' TEMPLATES = [ diff --git a/backend/db.sqlite3 b/backend/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..4036cfdb010a1fc1e0125deb369b1570cd579d7e GIT binary patch literal 98304 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 AE&u=k literal 0 HcmV?d00001 From 0673cf833f3dfad57832a50b9d644d084fa86783 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 28 Dec 2022 08:42:48 +0300 Subject: [PATCH 17/49] Adds models --- backend/app/__pycache__/models.cpython-37.pyc | Bin 1747 -> 2624 bytes backend/app/migrations/0001_initial.py | 2 +- .../__pycache__/0001_initial.cpython-37.pyc | Bin 963 -> 963 bytes backend/app/models.py | 23 +++++++++++++++++- backend/db.sqlite3 | Bin 98304 -> 98304 bytes 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/backend/app/__pycache__/models.cpython-37.pyc b/backend/app/__pycache__/models.cpython-37.pyc index d96eea69a7b87e9475961c60415ba6e41eb9c135..b2abfbe481d870523516221908c35a8a0bac609e 100644 GIT binary patch delta 1035 zcma)4O>fgc5cT?Vx8CzhZ=HR* z+ga+#OUiIfe)0*{ZHx+&>)DL> pnOGP(nAn(#q=1(BX|hjV$>}h;iA`j(EEhi)8&HggQGi826#(swC7=KR diff --git a/backend/app/migrations/0001_initial.py b/backend/app/migrations/0001_initial.py index 9547477..b762adf 100644 --- a/backend/app/migrations/0001_initial.py +++ b/backend/app/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.16 on 2022-12-23 22:45 +# Generated by Django 3.2.16 on 2022-12-27 07:46 from django.db import migrations, models diff --git a/backend/app/migrations/__pycache__/0001_initial.cpython-37.pyc b/backend/app/migrations/__pycache__/0001_initial.cpython-37.pyc index a6be4d92ce45963957b3ffd5c15f5f86e38eadbc..40d966cb834e96d63ffd3ac2d01ef6fedbd02e4d 100644 GIT binary patch delta 20 acmX@iewdxxiI1`-@g?&< zk@N%=|U5xFTYr6w+^{^|M_72Xw_?D zS*evOf$o)+=@kXRmF|V%o*u=9xw*dK`sT%%fypMB`IUucStjl!mPw)JuExc-8Hq`m zNtp;6J-~c~m761DRx|T(^6N41>+v7rU&rsXnI}PxUsIS_n-R^ioFdG+jOgZZG>7MJ K56@>@DF6Ux-*sOA delta 91 zcmV-h0HptbfChko29O&8D3KgP0VuIxS}z6%7XW01v_suCowe9uJYQErVBYw^wfgsSsNy8SnrA From be7a6ceb9b81a7163467016b8571a027d1b5dd76 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 28 Dec 2022 09:28:35 +0300 Subject: [PATCH 18/49] Add class method --- backend/app/models.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/backend/app/models.py b/backend/app/models.py index 88663b2..d98159d 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -68,18 +68,23 @@ class Student(models.Model): name = models.CharField(max_length=255) course = models.CharField(max_length=255) department = models.CharField(max_length=255) + photo_url = models.ImageField(upload_to="images/") user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE) + + @classmethod + def get_profile_info(cls, user): + profile_info = cls.objects.filter(user=user).first() + +# class LogBook(models.Model): +# pass -class LogBook(models.Model): - pass +# class Employer(models.Model): +# pass -class Employer(models.Model): - pass +# class Supervisor(models.Model): +# pass -class Supervisor(models.Model): - pass - -class Feedback(models.Model): - pass +# class Feedback(models.Model): +# pass From 4c437063c2f9e98d8c57b4738b5f2edc9cd60810 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 28 Dec 2022 18:12:17 +0300 Subject: [PATCH 19/49] Adds the logout and login api endpoints --- backend/app/urls.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/app/urls.py b/backend/app/urls.py index 7bcfd57..ab3df56 100644 --- a/backend/app/urls.py +++ b/backend/app/urls.py @@ -1,8 +1,15 @@ from django.urls import path from .views import * - +from django.conf import settings +from django.conf.urls.static import static urlpatterns = [ - + path('register/', RegisterView.as_view(), name="register"), - path('login/', LoginAPIView.as_view(), name="login"), + path('login/', login_user, name="login"), + path('logout/', logout_user, name="logout"), + path('student/', StudentAPIView.as_view()) ] + +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, + document_root=settings.MEDIA_ROOT) From a19740ef926ada18d9e8e71d3d574aa0dc25f13d Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 28 Dec 2022 18:13:13 +0300 Subject: [PATCH 20/49] Adds the logout and login api views --- backend/app/views.py | 65 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/backend/app/views.py b/backend/app/views.py index d9d5ade..603411d 100644 --- a/backend/app/views.py +++ b/backend/app/views.py @@ -1,30 +1,75 @@ from django.shortcuts import render from rest_framework import generics, status -from .serializers import RegisterSerializer, LoginSerializer +from .serializers import * from rest_framework.response import Response +from django.contrib.auth import authenticate ,login, logout +from rest_framework.decorators import api_view +from .models import * # Create your views here. + class RegisterView(generics.GenericAPIView): - + serializer_class = RegisterSerializer - + def post(self, request): user = request.data serializer = self.serializer_class(data=user) serializer.is_valid(raise_exception=True) serializer.save() - + user_data = serializer.data - + return Response(user_data, status=status.HTTP_201_CREATED) -class LoginAPIView(generics.GenericAPIView): - + +# class LoginAPIView(generics.GenericAPIView): + serializer_class = LoginSerializer - + def post(self, request): - serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) + user = User.objects.filter(email=serializer.data['email']).first() + if (serializer.data['authenticated']): + print(request.user) + # login(request, user) - return Response(serializer.data, status=status.HTTP_200_OK) \ No newline at end of file + return Response(serializer.data, status=status.HTTP_200_OK) + +@api_view(["POST"]) +def login_user(request): + + attrs = request.data + user = authenticate(request, email = attrs.get('email'), password = attrs.get('password')) + if user is not None: + login(request, user) + else: + raise AuthenticationFailed('Invalid credetinals') + print(request.user.is_authenticated) + user_data = { + 'email': user.email, + 'username': user.username, + 'user_type': user.user_type, + 'authenticated':request.user.is_authenticated + } + + return Response(user_data, status=status.HTTP_200_OK) + +@api_view(["GET"]) +def logout_user(request): + logout(request) + + return Response('User Logged out successfully') + +class StudentAPIView(generics.GenericAPIView): + serializer_class = StudentSerializer + + def post(self, request): + serializer = self.serializer_class(data=request.data) + serializer.is_valid(raise_exception=True) + return Response(serializer.data, status=status.HTTP_201_CREATED) + + +def user_logout(request): + pass From cb9e163869eae996f711e609def207133aea5a74 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 28 Dec 2022 18:15:38 +0300 Subject: [PATCH 21/49] Adds the media path --- backend/attachment/settings.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/attachment/settings.py b/backend/attachment/settings.py index 8e86987..9ba6fa9 100644 --- a/backend/attachment/settings.py +++ b/backend/attachment/settings.py @@ -11,7 +11,7 @@ """ from pathlib import Path - +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -133,3 +133,6 @@ # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +MEDIA_URL = '/Assets/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'Assets') \ No newline at end of file From f9b8e7783a2299bc59e7cc80a8a841282ba8cced Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 28 Dec 2022 18:16:23 +0300 Subject: [PATCH 22/49] Initial commit --- backend/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/.gitignore b/backend/.gitignore index a979ee7..8912810 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1 +1,2 @@ -/venv \ No newline at end of file +/venv +app/__pycache__/ \ No newline at end of file From ba88241d3295b1e17027a87eb83a1f6bf92b96f7 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 28 Dec 2022 18:16:42 +0300 Subject: [PATCH 23/49] Changes --- backend/app/__pycache__/models.cpython-37.pyc | Bin 2624 -> 2366 bytes .../__pycache__/serializers.cpython-37.pyc | Bin 2189 -> 3206 bytes backend/app/__pycache__/urls.cpython-37.pyc | Bin 349 -> 604 bytes backend/app/__pycache__/views.cpython-37.pyc | Bin 1274 -> 2373 bytes backend/app/serializers.py | 49 +++++++++++++++--- backend/app/views.py | 2 - .../__pycache__/settings.cpython-37.pyc | Bin 2513 -> 2602 bytes backend/db.sqlite3 | Bin 98304 -> 106496 bytes 8 files changed, 42 insertions(+), 9 deletions(-) diff --git a/backend/app/__pycache__/models.cpython-37.pyc b/backend/app/__pycache__/models.cpython-37.pyc index b2abfbe481d870523516221908c35a8a0bac609e..1c0f526a9e9df782a1432e10005810fc66c3b785 100644 GIT binary patch delta 510 zcmYjNOHbQC5caHz9XpO=5F+6bB#2PE5~BSBAQ4mqsEWknWDZf3-6W129PK(tjZ)BdfvufSAB{;eH zaBMK^RHOEv`|X)UKl`QE52J5fP~zKi(C6YZkdg3{mCO#5@6Iz7fVE_7oIxjfGN zm^lI8=6W~B9Y)aRS$3lPE-x^P+1J_?_#Vq)2S+SpZ?S@KMu{k^&nm+IX9NmU$IuLV zjW(B`D5TZ^Cuy*H93@}PrE!xWO^N=dduZhX!bt0CT^Ip_3H%^GweN&!*pJk(sEcu` zi;rkhqZNcP7ip#y2pLm7)tjN5GJK~mB8>8SaM6lH0okwMsXVXEhYN0H+;Jm##GCgaJTFI?-0L#cOCS|+eWRd8AH{)%1#TWBb Bc-8;_ delta 788 zcma)4O-sW-5X~mF*`#TVwZ*Ucg{TBXuoq8?7E}bOiakg!(smcIYEw2U^kM})c+i9F z&A;GDyo*0V5c3cG6*?2D6$NpZdCa^W<_#}-Og*LTd@^Y&aI!CVl{0!{_mbP2$<4xw z!VG3!D9q%fs-J6~0Zf8fz*sHD1SZLBVC)u?0H%{Uz&I_&VqIH`o4P-pi}i(c>9Bs_ zH@I+B&kT<1T%7C$z6j-WY@Q51ba#vqGA3u^MY18U;)_LYGL>u91dCs5p2c*SM8zQN zDuw`xt}2GH7y)>D2XIM5xN4ZFi@n2=Xzc9sMrio89mWs%5iht&`L1WkxXjQgxlKo# zq7x^y!NC$G@(=+ULy1kS=tg`6sINmHTYv~G0Iqn1DW1v*?5T$On!lU({r!Tgi5_?s zy$F2>Z8rb+~RlB!fW5Cj1td_iVsNWAje;n_y& zYSAKsI5mf8)LRejrRsr8FFp1T=(RWh2R#7lwWq#uHX(pV@AKz3Gw+SR_hxVW)o0$S z>)HxFziqzm{8iugn&k2Rg^lKS3bR@LrNZi*bj@8Yu$i-=`0oDmv#t{s`8H4Ts1xS= z_g~*?Bo;r?wMDLVZDz3A9trC2_wTBK!yM+mR05ZI7-LNQM+4I*u!w2*|C}PTVuwsS zOyAN2of){o6hG(}$4d8j9wz?K9}rzMjD@QMb)Yf2r#_S)G*GV>=YVq^0x1sAh|Ct*y2kKmi|x#T*6cw^k1nnI!whd7#}QevqFu_z_t zp4lRvcxqm6l+J3J#ym`JL_B8Ti`VATPzJSBk2I>`5RbxnbaiB~!$(81jFtfcR|3M6 zKta>%fbTLxCs#A;gosZTPtZ}L1WosjjSEQ`|QVUm_K346RWIv76VrOo(G z2zd_=TGn>9(>#4xKnzQmWZgGl9N#b@VG^M zeSK9r+&esEx03k#1D~t_h!r}2p^fZov`p5)Qt`SR4$Y&M337hjuZwr)?1@R%4U?_3 i-AR)iqDO6cwZ$oGg|x*3YoX!bQioV_zdA8JG50@=%MG~z delta 344 zcmZpZ>=op5;^pOH00Jk&WyuTKC-O-!hD=ls)=A+CX3*q*36jxdyv1FdT9lcXlUbEo zRQ!?=BF3l%lwe6LEy>t;;2kq#!sPWVo-*zXDV!->Eet7K%}h~TDcmVMEeuiIDZD_# z_$Di`Molhew4A($Rdeze*2u|onK&nhvB{ZbG1V~DFsHEeGS#xwuoN4WFsHCKGd3~S zuw=0mI{_j-M|jD={xUUoSa7ucRn5X)+&=de`S9#LccY6S}uUMu*DBB1QA@K3da~D zVi2=5uC>o9&B}@`@F8NCcICtlMidi=x_90^A};Z6P2eLsBL08_>XUH55e;vRYxI)v(Bj`X=tgI%L+eeVA34RX76I9Bg&IMpc$W#{D ze#B{B2ub-|c~4Lm*J(xfPRa73o-4aM_bwc)m2;*20QR1cEupoXLq$Yb)>c3^oH6-+ zI#B`HrFG6`EiVN(K!>uw7WA9=AIMn!ncEPEpAD(n)8)^4dEC*_a5ZTB0OiU}#YXpu z{Z7@U6_m$8uc#;Et6tXP^0cc6Kmj}k3|R|hFHerv@6_o0WO=&StXF5s@8Rm=;`#yc zL%6Xse_tQJOxDm`B-MaGdUTP{hr zYv8=hea%1ELj&w(z52Mp+6*wgN%o!AMA$sk2uT~e3l+;ipc>-7qO>-sN$rT+wk z{Ed^-i^1RyH1!8`oN$_x0gWidv6DLkH*yCoVla0(%e@ZTz1$y^qLTIT^I%Yp%7aQ& z8C0XHwUzSPpdQudYZ@K$knn()UlU#yZhvL!Mom%Yl^&f^UgfpdWJ;q|u+*)k!B?!M z1*@8T6;`dzSG9R-kA&^F5Ge_%@ue7YAw$OmJuwtAOO^4JPV`v4r85_L1N?$rp+?0} ziO@B*WULRwP-khPh4J#Dmko^%w_>c(H5p~`i%h&s@g1j^1A{xz)HUb?i6|$LBix8_ z%AMCF@`Mj#cQ)n>V)RUHSM)Nag?xg$;SP9t&=B#v(9|vHCbUnEoC)dEiNonJJ#r^* z-{B5-kAZ`U`^G&Xcn2@0*@S7Y?{jwS;5)VdB*pWwP};CD>}M*AO-&gsF-G$zk(Xhwe{bKt)%_Was(Uc%-Ye4a0B~2`9a;26 z3WF`Jlk@A3>WV*#I0b(+aJ) z+hNHBaXd^0B92WZjt2!F=Qys#@$+$#&z?lBQ^5Dm(r9)P+&NnL31zhOXz_YGvN0fu zRg3{D5D6US1a;;}v>LYac(0S9Wbs1wd}vl9Ll_`~M^w`Z@c0H)azgFhIia8u7u4f$ z@~kYs(Jpv6Q-_japc!XV`Ww|AtoHjQ)f}@mbPaM z1|yKk%R=(du?G1$#B$hvG_Wf(YV3yYd12{Ty(O;#u% zv?+!1lb$5A}wU13&?G( zC&q`GC2|!t9?t#*%&E1d#b&O}7JHm`o!kW9&5GV_%xQ&rSffqU0A0iH4QqYaYPbCV E0ER;tRsaA1 delta 589 zcmaix%Sr<=6o!*b&0IUJ$vOXj@)CU7{#H8eApKn~K2~3ioZ1ch$zEzFaCP~_*aY;$qK zMO>-HT`u~W{pNYx7z9Gxw~Ac0nhnX-2VGGee2<+6GVfSgmPlztDo2(xk=>D8lv$-+ zc|u}DNwSMw^-LCwgOIA3)aHagCYG+3tJ)$7>ILsN~NQ6K9?&W?uCZPz-|^000tV8@}O%<4+&Bc@v%p` z!%6AQqutY(UoEwYP1)9t#JD~nCIFKF5dDugNDKuA-XL-ird7czIN#lYH0s)#J_G}i qzs(!^X{tZPlkNz(^h_}6BZ(fA_g0A-=ruKNFs$aG8jS@Ip3fd z9G{boVTxnKX9yvWQH)_64+UQ~IVPT@3M4Q|Nland(=n50n0*pWPARyUQyCZYe_s6a zg(mkUrLjmElxRqul~u|qIas1$EYk?el=rk?^m$C}tMmkoLpxx_l}3d#W^D$IOTX2( z_$uf7{WWnP%G?>{^>*94X_qPd55+?FU3WCmYWF|&3NH=Jy{*li_2Z-3?m%8OZq5cW nXf-bf*8jLxtscIxYghgB+U+LIx^=2hiYPZk_tvaSDJ1^^8F*h! delta 290 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 Sd@@q+)?x=E`}w2qd;DMescKOG delta 102 zcmV-s0Ga=Qzy^ST29O&CDgXcg7?B`90V=UzrcV@601tBx;tpdCl+2vjK1l5CIIc5peGhkx&JakPEX5(D{#}1b`5? I1aJZT56>hYCjbBd From c46fc2abe39e185b09d33374b7fe0b0ea1229c93 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 09:15:45 +0300 Subject: [PATCH 24/49] Adds templates --- backend/templates/app/base.html | 0 backend/templates/app/login.html | 0 backend/templates/app/register.html | 38 +++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 backend/templates/app/base.html create mode 100644 backend/templates/app/login.html create mode 100644 backend/templates/app/register.html diff --git a/backend/templates/app/base.html b/backend/templates/app/base.html new file mode 100644 index 0000000..e69de29 diff --git a/backend/templates/app/login.html b/backend/templates/app/login.html new file mode 100644 index 0000000..e69de29 diff --git a/backend/templates/app/register.html b/backend/templates/app/register.html new file mode 100644 index 0000000..79d6a5c --- /dev/null +++ b/backend/templates/app/register.html @@ -0,0 +1,38 @@ +{% load static%} {% load crispy_forms_tags%} + + + + + + + Login + + + + +
+ {% block content %} +
+
+
+
+ {% comment %} {% endcomment %} + +
+ + {% csrf_token %} + {{form}} + + +
+
+ {% endblock %} +
+ + {% block scripts%} {% endblock %} + + From 40d85cd93645cc7a07b19d429dee83c18065ac67 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 09:16:39 +0300 Subject: [PATCH 25/49] Adds forms for registaration --- backend/app/forms.py | 29 +++++++++++++++++++++++++++++ backend/app/serializers.py | 5 +++-- 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 backend/app/forms.py diff --git a/backend/app/forms.py b/backend/app/forms.py new file mode 100644 index 0000000..55e13b4 --- /dev/null +++ b/backend/app/forms.py @@ -0,0 +1,29 @@ +from django import forms +from django.contrib.auth.forms import UserCreationForm +from .models import * + +class CustomUserCreationForm(UserCreationForm): + class Meta: + model = User + fields = ['email', 'username'] + + email = forms.Field(widget=forms.EmailInput(attrs={ + 'class':"input-field", + "placeholder":"Enter Email", + }), label='') + username = forms.Field(widget=forms.TextInput(attrs={ + 'class':"input-field", + "placeholder":"Enter username" + }), label='') + password1 = forms.Field(widget=forms.PasswordInput(attrs={ + 'class':"input-field", + "placeholder":"Enter password", + }), label='') + password2 = forms.Field(widget=forms.PasswordInput(attrs={ + 'class':"input-field", + "placeholder":"confirm password", + + }), label='') + + + \ No newline at end of file diff --git a/backend/app/serializers.py b/backend/app/serializers.py index 1e51c5f..01a2a6f 100644 --- a/backend/app/serializers.py +++ b/backend/app/serializers.py @@ -68,7 +68,7 @@ class StudentSerializer(serializers.ModelSerializer): department = serializers.CharField(max_length=255) photo_url = serializers.ImageField(required=False) user = serializers.ReadOnlyField(source='user.email') - + class Meta: model = Student @@ -82,7 +82,8 @@ def validate(self, attrs): return attrs def create(self, validated_data): - return Student.objects.create(**validated_data) + user = self.context + return Student.objects.create(**validated_data, user = user) From e60ca0577c88df09abe83213de029da0dd9cf14c Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 09:18:39 +0300 Subject: [PATCH 26/49] Adds static folder for static files --- backend/app/static/css/index.css | 0 backend/app/static/css/style.css | 122 ++++++++ backend/app/static/css/style2.css | 294 ++++++++++++++++++ backend/app/static/css/style3.css | 234 +++++++++++++++ backend/app/static/css/sytle1.css | 464 +++++++++++++++++++++++++++++ backend/app/static/images/TUK1.jpg | Bin 0 -> 115339 bytes 6 files changed, 1114 insertions(+) create mode 100644 backend/app/static/css/index.css create mode 100644 backend/app/static/css/style.css create mode 100644 backend/app/static/css/style2.css create mode 100644 backend/app/static/css/style3.css create mode 100644 backend/app/static/css/sytle1.css create mode 100644 backend/app/static/images/TUK1.jpg diff --git a/backend/app/static/css/index.css b/backend/app/static/css/index.css new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/static/css/style.css b/backend/app/static/css/style.css new file mode 100644 index 0000000..f314b44 --- /dev/null +++ b/backend/app/static/css/style.css @@ -0,0 +1,122 @@ +* { + + margin: 0; + padding: 0; + font-family: sans-serif; +} +.helptext { + display: none; +} +.hero { + height: 650px; + width: 100%; + background-image: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)), + url(../images/TUK1.jpg); + background-size: cover; + background-position: center; + position: absolute; +} + +.form-box { + width: 400px; + height: 550px; + position: relative; + margin: 6% auto; + background: whitesmoke; + padding: 5px; + overflow: hidden; + border-radius: 10px; +} + +.button-box { + width: 200px; + margin: 35px auto; + position: relative; + box-shadow: 0 0 20px 9px lightgreen; + border-radius: 30px; +} + +.toggle-btn { + padding: 10px 30px; + cursor: pointer; + background: transparent; + border: 0; + outline: none; + position: relative; +} + +#btn { + top: 0; + left: 0; + position: absolute; + width: 110px; + height: 100%; + background: linear-gradient(to right, green, peru); + border-radius: 30px; + transition: 0.5s; +} + +h1 { + margin: 60px auto; + padding: 0 0 20px; + text-align: center; + font-size: 12px; + color: green; +} + +.input-group { + top: 180px; + position: absolute; + width: 280px; + transition: 0.5s; +} + +.input-field { + width: 100%; + padding: 10px 0; + margin: 5px 0; + border-left: 0; + border-top: 0; + border-right: 0; + border-bottom: 1px solid #999; + outline: none; + background: transparent; +} + +.submit-btn { + width: 85%; + padding: 10px 30px; + cursor: pointer; + display: block; + margin: auto; + background: green; + border: 0; + outline: none; + color: #fff; + border-radius: 20px; + margin-top: 50px; +} + +.submit-btn:hover { + cursor: pointer; + background: green; + color: black; +} + +.chech-box { + margin: 30px 10px 30px 0; +} + +span { + color: #777; + font-size: 12px; + bottom: 64px; + position: absolute; +} + +#login { + left: 50px; +} +#signup { + left: 450px; +} diff --git a/backend/app/static/css/style2.css b/backend/app/static/css/style2.css new file mode 100644 index 0000000..00f7a50 --- /dev/null +++ b/backend/app/static/css/style2.css @@ -0,0 +1,294 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Roboto', sans-serif; + +} + +body{ + min-height: 100vh; + width: 100%; + -webkit-font-smoothing: antialiased; +} + +.sidebar{ + position: fixed; + height: 100%; + width: 240px; + background: green; + transition:all 0.5s ease; +} + + +.sidebar.active{ + width: 60px; +} + +.sidebar .logo-details{ + height: 80px; + width: 100%; + display: flex; + align-items: center; +} + + +.sidebar .logo-details i{ + font-size: 28px; + font-weight: 500; + color:transparent; + min-width: 60px; + text-align: center; + +} +.sidebar .logo-details .logo_name{ + font-size: 20px; + font-weight: 500; + color: black; +} + +.sidebar .nav-links{ + margin-top: 16px; +} + +.sidebar .nav-links li{ + height: 50px; + width: 100%; + list-style: none; +} + +.sidebar .nav-links li a{ + height: 100%; + width: 100%; + display: flex; + align-items: center; + text-decoration: none; + transition: all 0.4s ease; +} + +.sidebar .nav-links li a:hover{ + background: lightgreen; +} + +.sidebar .nav-links li a i{ + /* background: whitesmoke;*/ + min-width: 60px; + text-align: center; + color: #fff; + font-size: 18px; +} + +.sidebar .nav-links li a .link_name{ + color: #fff; + font-size: 15px; + font-weight: 400; + white-space: nowrap; +} +/* Home-section css */ +.home-section{ + background: #f5f5f5; + position: relative; + min-height: 100vh; + width: calc(100% - 240px); + left: 240px; + transition: all 0.5s ease; +} + +.sidebar.active ~ .home-section{ + width: calc(100% - 60px); + left: 60px; +} + + +.home-section nav{ + position: fixed; + width: calc(100% - 24px); + left: 240px; + height: 80px; + background: #fff; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: space-between; + transition: all 0.5s ease; + z-index: 100; +} + +.sidebar.active ~ .home-section nav{ + width: calc(100% - 60px); + left: 60px; +} + +.home-section nav .sidebar-button{ + display: flex; + align-items: center; + font-size: 24px; + font-weight: 500; +} + +.home-section nav .sidebar-button i{ + font-size: 35px; + margin-right: 10px; +} + + + +.home-section nav .profile-details{ + display: flex; + align-items: center; + height: 50px; + min-width: 190px; + background: #f5f6fa; + border: 2px solid #efeef1; + border-radius: 6px; + padding: 0 15px 0 2px; +} + +nav .profile-details img{ + height: 40px; + width: 40px; + object-fit: cover; + border-radius: 6px; +} + +nav .profile-details .admin_name{ + font-size: 15px; + font-weight: 500; + color: #333; + margin: 0 10px; + white-space: norwap; +} + +nav .profile-details i{ + color: #333; + font-size: 25px; +} + +.comment-box { + top: 50%; + left: 50%; + position: absolute; + transform: translate(-50%, -50%); + width: 500px; +} +.comment-box h2 { + font-size: 20px; + font-weight: 500; + margin-bottom: 15px; +} +.comment-box input { + width: 100%; + height: 50px; + padding: 0 20px; + margin-bottom: 15px; + border-radius: 5px; + border: 1px solid #86b0b6; +} +.comment-box input:focus { + border: 1px solid #000; + outline: 0; +} +.comment-box textarea { + width: 100%; + height: 150px; + padding: 15px 20px; + margin-bottom: 10px; + border-radius: 5px; + border: 1px solid #86b0b6 ; +} +.comment-box textarea:focus { + border: 1px solid #000; + outline: 0; +} +.comment-box button { + border: 0; + padding: 10px 30px; + background: green; + font-size: 18px; + border-radius: 5px; + color: whitesmoke; +} +.comment-box button:hover { + background-color: peru; +} + + + + + + + + + + + + + + + +/*Responsive media query */ +@media (max-width: 1316px) { + .sidebar{ + width: 60px; + } + .sidebar.active{ + width: 220px; + } + .home-section{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section{ + width: calc(100% - 220px); + left: 220px; + } + .home-section nav{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section nav{ + width: calc(100% - 220px); + left: 220px; + } +} + +@media (max-width: 1078px) { + .home-section .comment-box { + flex-direction: column; + } + .home-section .comment-box h2{ + margin-bottom: 20px; + width: 100%; + overflow-x: scroll; + } + .home-section .comment-box input{ + margin-left: 0; + } +} +@media (max-width: 1018px) { + .home-section .comment-box input{ + width: calc(100% / 2 - 15px); + margin-bottom: 15px; + } +} +@media (max-width: 648px) { + .home-section nav .sidebar-button .dashboard, + nav .profile-details .admin_name, + nav .profile-details i{ + display: none; + } + .home-section nav .profile-details{ + min-width: 50px; + height: 50px; + } + .home-section .comment-box { + width: 100%; + margin-bottom: 15px; + } + .home-section .comment-box input{ + width: 500px; + } + +} \ No newline at end of file diff --git a/backend/app/static/css/style3.css b/backend/app/static/css/style3.css new file mode 100644 index 0000000..77536e8 --- /dev/null +++ b/backend/app/static/css/style3.css @@ -0,0 +1,234 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Roboto', sans-serif; + +} + +body{ + min-height: 100vh; + width: 100%; + -webkit-font-smoothing: antialiased; +} + +.sidebar{ + position: fixed; + height: 100%; + width: 240px; + background: green; + transition:all 0.5s ease; +} + + +.sidebar.active{ + width: 60px; +} + +.sidebar .logo-details{ + height: 80px; + width: 100%; + display: flex; + align-items: center; +} + + +.sidebar .logo-details i{ + font-size: 28px; + font-weight: 500; + color:transparent; + min-width: 60px; + text-align: center; + +} +.sidebar .logo-details .logo_name{ + font-size: 20px; + font-weight: 500; + color: black; +} + +.sidebar .nav-links{ + margin-top: 16px; +} + +.sidebar .nav-links li{ + height: 50px; + width: 100%; + list-style: none; +} + +.sidebar .nav-links li a{ + height: 100%; + width: 100%; + display: flex; + align-items: center; + text-decoration: none; + transition: all 0.4s ease; +} + +.sidebar .nav-links li a:hover{ + background: lightgreen; +} + +.sidebar .nav-links li a i{ + /* background: whitesmoke;*/ + min-width: 60px; + text-align: center; + color: #fff; + font-size: 18px; +} + +.sidebar .nav-links li a .link_name{ + color: #fff; + font-size: 15px; + font-weight: 400; + white-space: nowrap; +} +/* Home-section css */ +.home-section{ + background: #f5f5f5; + position: relative; + min-height: 100vh; + width: calc(100% - 240px); + left: 240px; + transition: all 0.5s ease; +} + +.sidebar.active ~ .home-section{ + width: calc(100% - 60px); + left: 60px; +} + + +.home-section nav{ + position: fixed; + width: calc(100% - 24px); + left: 240px; + height: 80px; + background: #fff; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: space-between; + transition: all 0.5s ease; + z-index: 100; +} + +.sidebar.active ~ .home-section nav{ + width: calc(100% - 60px); + left: 60px; +} + +.home-section nav .sidebar-button{ + display: flex; + align-items: center; + font-size: 24px; + font-weight: 500; +} + +.home-section nav .sidebar-button i{ + font-size: 35px; + margin-right: 10px; +} + + + +.home-section nav .profile-details{ + display: flex; + align-items: center; + height: 50px; + min-width: 190px; + background: #f5f6fa; + border: 2px solid #efeef1; + border-radius: 6px; + padding: 0 15px 0 2px; +} + +nav .profile-details img{ + height: 40px; + width: 40px; + object-fit: cover; + border-radius: 6px; +} + +nav .profile-details .admin_name{ + font-size: 15px; + font-weight: 500; + color: #333; + margin: 0 10px; + white-space: norwap; +} + +nav .profile-details i{ + color: #333; + font-size: 25px; +} + + + + +/*Responsive media query */ +@media (max-width: 1316px) { + .sidebar{ + width: 60px; + } + .sidebar.active{ + width: 220px; + } + .home-section{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section{ + width: calc(100% - 220px); + left: 220px; + } + .home-section nav{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section nav{ + width: calc(100% - 220px); + left: 220px; + } +} + +@media (max-width: 1078px) { + .home-section .interns-boxes { + flex-direction: column; + } + .home-section .interns-boxes .box{ + margin-bottom: 20px; + width: 100%; + overflow-x: scroll; + } + .home-section .interns-boxes .workshops-intern{ + margin-left: 0; + } +} +@media (max-width: 1018px) { + .home-section .overview-boxes .box{ + width: calc(100% / 2 - 15px); + margin-bottom: 15px; + } +} +@media (max-width: 648px) { + .home-section nav .sidebar-button .dashboard, + nav .profile-details .admin_name, + nav .profile-details i{ + display: none; + } + .home-section nav .profile-details{ + min-width: 50px; + height: 50px; + } + .home-section .overview-boxes .box{ + width: 100%; + margin-bottom: 15px; + } + .home-section .interns-boxes .interns-details{ + width: 590px; + } +} \ No newline at end of file diff --git a/backend/app/static/css/sytle1.css b/backend/app/static/css/sytle1.css new file mode 100644 index 0000000..5c09ab6 --- /dev/null +++ b/backend/app/static/css/sytle1.css @@ -0,0 +1,464 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Roboto', sans-serif; + +} + +body{ + min-height: 100vh; + width: 100%; + -webkit-font-smoothing: antialiased; +} + +.sidebar{ + position: fixed; + height: 100%; + width: 240px; + background: green; + transition:all 0.5s ease; +} + + +.sidebar.active{ + width: 60px; +} + +.sidebar .logo-details{ + height: 80px; + width: 100%; + display: flex; + align-items: center; +} + + +.sidebar .logo-details i{ + font-size: 28px; + font-weight: 500; + color:transparent; + min-width: 60px; + text-align: center; + +} +.sidebar .logo-details .logo_name{ + font-size: 20px; + font-weight: 500; + color: black; +} + +.sidebar .nav-links{ + margin-top: 16px; +} + +.sidebar .nav-links li{ + height: 50px; + width: 100%; + list-style: none; +} + +.sidebar .nav-links li a{ + height: 100%; + width: 100%; + display: flex; + align-items: center; + text-decoration: none; + transition: all 0.4s ease; +} + +.sidebar .nav-links li a:hover{ + background: lightgreen; +} + +.sidebar .nav-links li a i{ + /* background: whitesmoke;*/ + min-width: 60px; + text-align: center; + color: #fff; + font-size: 18px; +} + +.sidebar .nav-links li a .link_name{ + color: #fff; + font-size: 15px; + font-weight: 400; + white-space: nowrap; +} +/* Home-section css */ +.home-section{ + background: #f5f5f5; + position: relative; + min-height: 100vh; + width: calc(100% - 240px); + left: 240px; + transition: all 0.5s ease; +} + +.sidebar.active ~ .home-section{ + width: calc(100% - 60px); + left: 60px; +} + + +.home-section nav{ + position: fixed; + width: calc(100% - 24px); + left: 240px; + height: 80px; + background: #fff; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: space-between; + transition: all 0.5s ease; + z-index: 100; +} + +.sidebar.active ~ .home-section nav{ + width: calc(100% - 60px); + left: 60px; +} + +.home-section nav .sidebar-button{ + display: flex; + align-items: center; + font-size: 24px; + font-weight: 500; +} + +.home-section nav .sidebar-button i{ + font-size: 35px; + margin-right: 10px; +} + +.home-section nav .search-box{ + height: 50px; + width: 550px; + margin: 0 20px; + position: relative; +} +nav .search-box input{ + position: absolute; + height: 100%; + width: 100%; + border-radius: 6px; + padding: 0 15px; + font-size: 17px; + color: black; + background: #f5f6fa; + border: 2px solid peru; + outline: none; +} + +nav .search-box .fa-search{ + position: absolute; + right: 5px; + top: 50%; + transform: translateY(-50%); + height: 40px; + width: 40px; + background: green; + border-radius: 6px; + color: #fff; + font-size: 22px; + line-height: 40px; + text-align: center; +} + +.home-section nav .profile-details{ + display: flex; + align-items: center; + height: 50px; + min-width: 190px; + background: #f5f6fa; + border: 2px solid #efeef1; + border-radius: 6px; + padding: 0 15px 0 2px; +} + +nav .profile-details img{ + height: 40px; + width: 40px; + object-fit: cover; + border-radius: 6px; +} + +nav .profile-details .admin_name{ + font-size: 15px; + font-weight: 500; + color: #333; + margin: 0 10px; + white-space: norwap; +} + +nav .profile-details i{ + color: #333; + font-size: 25px; +} + +.home-section .home-content{ + position: relative; + padding-top: 100px; +} + +.home-content .overview-boxes{ + display: flex; + width: 100%; + justify-content: space-between; + padding: 0 20px; + flex-wrap: wrap; +} + +.home-content .overview-boxes .box{ + width: calc(100% / 4 - 15px); + display: flex; + justify-content: center; + padding: 15px 14px; + align-items: center; + background: #fff; + border-radius: 15px; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1); +} + +.home-content .overview-boxes .box_topic{ + font-size: 20px; + font-weight: 500; + +} + +.home-content .overview-boxes .number{ + font-size: 35px; + font-weight: 500; + margin-top: -5px; + display: inline-block; +} + +.overview-boxes .indicater{ + display: flex; + align-items: center; +} + +.overview-boxes .indicater i{ + height: 20px; + width: 20px; + background:#008000; + color: #fff; + border-radius: 50%; + font-size: 20px; + margin-right: 5px; +} + +.overview-boxes .indicater .text{ + font-size: 12px; +} + +.overview-boxes .box .building{ + font-size: 32px; + font-weight: 500; + height: 50px; + width: 50px; + background: lightgreen; + color: #008000; + line-height: 50px; + text-align: center; + border-radius: 12px; +} + +.overview-boxes .box .user{ + font-size: 32px; + font-weight: 500; + height: 50px; + width: 50px; + background: palegoldenrod; + color: peru; + line-height: 50px; + text-align: center; + border-radius: 12px; +} + +.overview-boxes .box .user2{ + font-size: 32px; + font-weight: 500; + height: 50px; + width: 50px; + background:lightblue; + color:blue; + line-height: 50px; + text-align: center; + border-radius: 12px; +} + +.overview-boxes .box .p{ + font-size: 32px; + font-weight: 500; + height: 50px; + width: 50px; + background:lightcoral; + color:red; + line-height: 50px; + text-align: center; + border-radius: 12px; +} + +.home-section .interns-boxes{ + display: flex; + justify-content: space-between; + padding: 20px; +} + +.home-section .interns-boxes .recent-intern{ + width: 75%; + background: #fff; + border-radius: 12px; + box-shadow: 0 5px 10px rgba(0,0,0,0.1); + padding: 20px; +} + + + +.home-section .interns-boxes .interns-details{ + display: flex; + justify-content: space-between; + align-items: center; +} + +.home-section .interns-boxes .box .title{ + font-size: 24px; + font-weight: 500; +} + +.home-section .interns-boxes .box .topic{ + font-size: 20px; + font-weight: 500; +} + +.home-section .interns-boxes .box li{ + list-style: none; + margin: 10px 0; +} + +.interns-boxes .box li a{ + color: #333; + font-size: 18px; + font-weight: 400; + text-decoration: none; +} + +.interns-boxes .button{ + width: 100%; + display: flex; + justify-content: flex-end; +} + +.interns-boxes .button a{ + font-size: 15px; + font-weight: 400; + color: #fff; + background:#008000; + padding: 4px 12px; + text-decoration: none; + border-radius: 4px; + transition: all 0.3s ease; +} + +.interns-boxes .button a:hover{ + background: peru; + +} + +/*right side*/ +.home-section .interns-boxes .workshops-intern{ + width: 35%; + margin-left: 20px; + background: #fff; + box-shadow: 0 5px 10px rgba(0,0,0,0.1); + padding: 20px; + border-radius: 12px; +} + +.interns-boxes .workshops-intern li{ + display: flex; + align-items: center; + justify-content: space-between; +} + +.interns-boxes .workshops-intern li a{ + display: flex; + align-items: center; +} + +.interns-boxes .workshops-intern img{ + margin-right: 8px; + height: 40px; + width: 40px; + border-radius: 4px; + object-fit: cover; +} + + +/*Responsive media query */ +@media (max-width: 1316px) { + .sidebar{ + width: 60px; + } + .sidebar.active{ + width: 220px; + } + .home-section{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section{ + width: calc(100% - 220px); + left: 220px; + } + .home-section nav{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section nav{ + width: calc(100% - 220px); + left: 220px; + } +} + +@media (max-width: 1078px) { + .home-section .interns-boxes { + flex-direction: column; + } + .home-section .interns-boxes .box{ + margin-bottom: 20px; + width: 100%; + overflow-x: scroll; + } + .home-section .interns-boxes .workshops-intern{ + margin-left: 0; + } +} +@media (max-width: 1018px) { + .home-section .overview-boxes .box{ + width: calc(100% / 2 - 15px); + margin-bottom: 15px; + } +} +@media (max-width: 648px) { + .home-section nav .sidebar-button .dashboard, + nav .profile-details .admin_name, + nav .profile-details i{ + display: none; + } + .home-section nav .profile-details{ + min-width: 50px; + height: 50px; + } + .home-section .overview-boxes .box{ + width: 100%; + margin-bottom: 15px; + } + .home-section .interns-boxes .interns-details{ + width: 590px; + } +} + diff --git a/backend/app/static/images/TUK1.jpg b/backend/app/static/images/TUK1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b2ff270654de7724707db2d33251d8f9bf87e1c GIT binary patch literal 115339 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 z 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 Osg=nfH~E43&;Qx3zOecL literal 0 HcmV?d00001 From 1c80b2e893801593ab5baf282745cd8a1c2f0935 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 10:50:13 +0300 Subject: [PATCH 27/49] Adds a user_type field --- backend/app/forms.py | 50 ++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/backend/app/forms.py b/backend/app/forms.py index 55e13b4..ad4a901 100644 --- a/backend/app/forms.py +++ b/backend/app/forms.py @@ -1,29 +1,53 @@ from django import forms from django.contrib.auth.forms import UserCreationForm -from .models import * +from .models import * + class CustomUserCreationForm(UserCreationForm): class Meta: model = User - fields = ['email', 'username'] + fields = [ 'user_type', 'email', 'username'] + + USER_TYPES = ( + + ('employer', "Employer"), + ('supervisor', "Supervisor"), + ('student', "Student"), + ) + user_type = forms.ChoiceField(widget=forms.Select(attrs={ + 'class': "input-field", + } + ), choices=USER_TYPES) email = forms.Field(widget=forms.EmailInput(attrs={ - 'class':"input-field", - "placeholder":"Enter Email", + 'class': "input-field", + "placeholder": "Enter Email", }), label='') username = forms.Field(widget=forms.TextInput(attrs={ - 'class':"input-field", - "placeholder":"Enter username" + 'class': "input-field", + "placeholder": "Enter username" }), label='') password1 = forms.Field(widget=forms.PasswordInput(attrs={ - 'class':"input-field", - "placeholder":"Enter password", + 'class': "input-field", + "placeholder": "Enter password", }), label='') password2 = forms.Field(widget=forms.PasswordInput(attrs={ - 'class':"input-field", - "placeholder":"confirm password", - + 'class': "input-field", + "placeholder": "confirm password", + }), label='') + + + def clean_password2(self): + password1 = self.cleaned_data.get("password1") + password2 = self.cleaned_data.get("password2") + if password1 and password2 and password1 != password2: + raise forms.ValidationError("Passwords don't match") + return password2 - - \ No newline at end of file + def save(self, commit=True): + user = super().save(commit=False) + user.set_password(self.cleaned_data["password1"]) + if commit: + user.save() + return user \ No newline at end of file From d0b56aa4585434596e7658143d030b78e264f607 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 10:51:02 +0300 Subject: [PATCH 28/49] Adds views --- backend/app/views.py | 85 ++++++++++---------------------------------- 1 file changed, 18 insertions(+), 67 deletions(-) diff --git a/backend/app/views.py b/backend/app/views.py index c135035..b23120a 100644 --- a/backend/app/views.py +++ b/backend/app/views.py @@ -1,73 +1,24 @@ -from django.shortcuts import render -from rest_framework import generics, status -from .serializers import * -from rest_framework.response import Response -from django.contrib.auth import authenticate ,login, logout -from rest_framework.decorators import api_view -from .models import * -# Create your views here. +from django.shortcuts import redirect, render +from django.contrib import messages +from .forms import * -class RegisterView(generics.GenericAPIView): +def register(request): + form = CustomUserCreationForm() + if request.method == 'POST': + form = CustomUserCreationForm(request.POST) + if form.is_valid(): + form.save() + messages.success( + request, f'{form.cleaned_data["email"]} registered successfullly') + context = {'form': form} + return render(request, 'app/register.html', context) - serializer_class = RegisterSerializer - def post(self, request): - user = request.data - serializer = self.serializer_class(data=user) - serializer.is_valid(raise_exception=True) - serializer.save() - - user_data = serializer.data - - return Response(user_data, status=status.HTTP_201_CREATED) - - -# class LoginAPIView(generics.GenericAPIView): - - serializer_class = LoginSerializer - - def post(self, request): - serializer = self.serializer_class(data=request.data) - serializer.is_valid(raise_exception=True) - user = User.objects.filter(email=serializer.data['email']).first() - if (serializer.data['authenticated']): - print(request.user) - # login(request, user) - - return Response(serializer.data, status=status.HTTP_200_OK) - -@api_view(["POST"]) -def login_user(request): - - attrs = request.data - user = authenticate(request, email = attrs.get('email'), password = attrs.get('password')) - if user is not None: - login(request, user) - else: - raise AuthenticationFailed('Invalid credetinals') - print(request.user.is_authenticated) - user_data = { - 'email': user.email, - 'username': user.username, - 'user_type': user.user_type, - 'authenticated':request.user.is_authenticated - } - - return Response(user_data, status=status.HTTP_200_OK) - -@api_view(["GET"]) -def logout_user(request): - logout(request) - - return Response('User Logged out successfully') - -class StudentAPIView(generics.GenericAPIView): - serializer_class = StudentSerializer - - def post(self, request): - serializer = self.serializer_class(data=request.data) - serializer.is_valid(raise_exception=True) - return Response(serializer.data, status=status.HTTP_201_CREATED) +def login_view(request): + context = {} + return render(request, 'app/login.html', context) +def logout_view(request): + return render(redirect, 'app:login') From 017afb5e7cf46f94daa5bafd5908f7c686c64c1d Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 10:51:33 +0300 Subject: [PATCH 29/49] Adds routes --- backend/app/urls.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/backend/app/urls.py b/backend/app/urls.py index ab3df56..b26fbad 100644 --- a/backend/app/urls.py +++ b/backend/app/urls.py @@ -4,10 +4,9 @@ from django.conf.urls.static import static urlpatterns = [ - path('register/', RegisterView.as_view(), name="register"), - path('login/', login_user, name="login"), - path('logout/', logout_user, name="logout"), - path('student/', StudentAPIView.as_view()) + path('register/', register, name ='register'), + path('login/', login_view, name ='login'), + path('register/', logout_view, name ='logout') ] if settings.DEBUG: From 3b65a154282af331bd6a6966863d4b89893f8ab5 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 10:55:20 +0300 Subject: [PATCH 30/49] styles the registration page --- backend/app/static/css/style.css | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/backend/app/static/css/style.css b/backend/app/static/css/style.css index f314b44..1ed1f13 100644 --- a/backend/app/static/css/style.css +++ b/backend/app/static/css/style.css @@ -22,7 +22,7 @@ height: 550px; position: relative; margin: 6% auto; - background: whitesmoke; + background: white; padding: 5px; overflow: hidden; border-radius: 10px; @@ -94,7 +94,8 @@ h1 { outline: none; color: #fff; border-radius: 20px; - margin-top: 50px; + margin-top: 35px; + margin-bottom: 4px; } .submit-btn:hover { @@ -120,3 +121,25 @@ span { #signup { left: 450px; } + + +#logo{ + margin-top: 15px; + display: block; + margin-left: auto; + margin-right: auto; + width: 31% +} + +#toLogin{ + + text-decoration: none; + font-size: 10px; + text-align: center; + display: block; + margin-left: auto; + margin-right: auto; + margin-top: 15px; + width: 55%; + color: green; +} \ No newline at end of file From 98b310bdac2e89fd7108b872cf6e7d6db63ef522 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 20:02:11 +0300 Subject: [PATCH 31/49] Updates the logout url --- backend/app/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/urls.py b/backend/app/urls.py index b26fbad..802f113 100644 --- a/backend/app/urls.py +++ b/backend/app/urls.py @@ -6,7 +6,7 @@ path('register/', register, name ='register'), path('login/', login_view, name ='login'), - path('register/', logout_view, name ='logout') + path('logout/', logout_view, name ='logout') ] if settings.DEBUG: From 14d4c41ab05bd10a6b622e861aa722c777b4ff86 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 20:03:27 +0300 Subject: [PATCH 32/49] Adds register and login forms --- backend/templates/app/login.html | 61 +++++++++++++++++++++++++++++ backend/templates/app/register.html | 15 ++++--- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/backend/templates/app/login.html b/backend/templates/app/login.html index e69de29..b441ae6 100644 --- a/backend/templates/app/login.html +++ b/backend/templates/app/login.html @@ -0,0 +1,61 @@ +{% load static%}{% load crispy_forms_tags%} + + + + + + + Login + + + + {% if messages %} {% for message in messages %} +
{{ message }}
+ {% endfor %} {% endif %} +
+ + diff --git a/backend/templates/app/register.html b/backend/templates/app/register.html index 79d6a5c..18f0368 100644 --- a/backend/templates/app/register.html +++ b/backend/templates/app/register.html @@ -14,19 +14,22 @@ {% block content %}
-
-
- {% comment %} {% endcomment %} + + {% comment %}
+
+ -
-
+ + +
{% endcomment %} + {% csrf_token %} {{form}} + Already have an accoount? Login
From 245b2853396a13a1d7c46ee90511be28a941d902 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 20:04:46 +0300 Subject: [PATCH 33/49] Updates the login and logout views --- backend/app/views.py | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/backend/app/views.py b/backend/app/views.py index b23120a..78b01c9 100644 --- a/backend/app/views.py +++ b/backend/app/views.py @@ -1,5 +1,6 @@ from django.shortcuts import redirect, render from django.contrib import messages +from django.contrib.auth import login, logout, authenticate from .forms import * @@ -16,9 +17,34 @@ def register(request): def login_view(request): - context = {} - return render(request, 'app/login.html', context) + current_user = request.user + if current_user.is_authenticated: + if current_user.user_type == "supervisor": + pass + if current_user.user_type == "employer": + pass + if current_user.user_type == "student": + pass + email = "" + if request.method == 'POST': + email = request.POST.get('email') + password = request.POST.get('password') + remember_me = request.POST.get('remember_me') + user = authenticate(request, email = email, password = password) + if user is not None: + login(request, user) + messages.success(request, f'{user.username} logged in successfully.') + + else: + messages.warning(request, 'password or email is incorrect.' ) + return render(request, 'app/login.html', context={"email": email}) + + + + def logout_view(request): - return render(redirect, 'app:login') + print(request.user) + logout(request) + return redirect('login') From 7f3d1c28a152f1e2537d74c08d24966758e8483b Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Fri, 30 Dec 2022 20:05:48 +0300 Subject: [PATCH 34/49] Styles the login and registeration forms --- backend/app/static/css/style.css | 35 +++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/backend/app/static/css/style.css b/backend/app/static/css/style.css index 1ed1f13..be4ca68 100644 --- a/backend/app/static/css/style.css +++ b/backend/app/static/css/style.css @@ -1,8 +1,9 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@100&display=swap'); * { - + font-family: 'Roboto', sans-serif; margin: 0; padding: 0; - font-family: sans-serif; + font-family: 'Roboto', sans-serif; } .helptext { display: none; @@ -57,7 +58,7 @@ } h1 { - margin: 60px auto; + margin-top: 17px; padding: 0 0 20px; text-align: center; font-size: 12px; @@ -94,7 +95,7 @@ h1 { outline: none; color: #fff; border-radius: 20px; - margin-top: 35px; + margin-top: 26px; margin-bottom: 4px; } @@ -117,6 +118,7 @@ span { #login { left: 50px; + margin-top: 20px; } #signup { left: 450px; @@ -124,7 +126,14 @@ span { #logo{ - margin-top: 15px; + display: block; + margin-left: auto; + margin-right: auto; + margin-top: 17px; + width: 31% +} + +#logoLogin{ display: block; margin-left: auto; margin-right: auto; @@ -134,12 +143,24 @@ span { #toLogin{ text-decoration: none; - font-size: 10px; + font-size: 10.6px; text-align: center; display: block; margin-left: auto; margin-right: auto; margin-top: 15px; width: 55%; - color: green; + color: green +} + +#toRegister{ + text-decoration: none; + font-size: 11px; + text-align: center; + display: block; + margin-left: auto; + margin-right: auto; + margin-top: 20px; + width: 55%; + color: green } \ No newline at end of file From 72de06dcff9fc22d6283574104cb476db817b6ab Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 31 Dec 2022 13:46:08 +0300 Subject: [PATCH 35/49] Stages changes --- backend/.gitignore | 5 ++- backend/app/__pycache__/models.cpython-37.pyc | Bin 2366 -> 3103 bytes .../__pycache__/serializers.cpython-37.pyc | Bin 3206 -> 3241 bytes backend/app/__pycache__/urls.cpython-37.pyc | Bin 604 -> 542 bytes backend/app/__pycache__/views.cpython-37.pyc | Bin 2373 -> 1487 bytes backend/app/models.py | 38 +++++++++++++----- backend/app/static/css/style.css | 2 +- backend/app/static/images/tuk-logo.jpg | Bin 0 -> 6738 bytes .../__pycache__/settings.cpython-37.pyc | Bin 2602 -> 2951 bytes .../__pycache__/urls.cpython-37.pyc | Bin 985 -> 992 bytes backend/attachment/settings.py | 24 +++++++++-- backend/attachment/urls.py | 2 +- backend/db.sqlite3 | Bin 106496 -> 135168 bytes backend/templates/app/login.html | 10 +---- backend/templates/app/register.html | 8 ---- backend/templates/app/user.html | 0 backend/test.py | 7 ++++ 17 files changed, 61 insertions(+), 35 deletions(-) create mode 100644 backend/app/static/images/tuk-logo.jpg create mode 100644 backend/templates/app/user.html create mode 100644 backend/test.py diff --git a/backend/.gitignore b/backend/.gitignore index 8912810..f9c5df2 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,2 +1,5 @@ /venv -app/__pycache__/ \ No newline at end of file +app/__pycache__/ +attachment/__pycache__/ +app/migrations/ +zbackup.txt \ No newline at end of file diff --git a/backend/app/__pycache__/models.cpython-37.pyc b/backend/app/__pycache__/models.cpython-37.pyc index 1c0f526a9e9df782a1432e10005810fc66c3b785..2e00a92451d50115d7f270ad5ae3a56c6c11f369 100644 GIT binary patch delta 1182 zcmZuw&rj4q6z=rLw%zUSmI7e`g=o;EhAapssKmIUk!Wxa!o?ok6lPd==?^k32Z(V^ z@Sw&$m|jghdosktqyK`QdotemEAYK8EMjQ$zIpF^)0sEloBpsqS4vC8VqSpfi~V)u zQ{iK&(s>0D6)5oppE!h|FM6UQ!YFx?FFUfYI0_M#1u9eJjX)J9?@LY&;v7{WR+$2^ z3b96Yh;>HV8ZbIAd0GIbaLnX^F=!E(;xSX8!{Vx7mkzNeo1{5Eq|A%z2i@O<=-&cy zl#sFHt@Mtli6#FeY4S&&B@@Y@;*q<_YvudIW%!Vn&w`2J7{GM0mRlh08NJSV+RPRbonVG$^_lYw=4XCcjFW`a~0oH7hPhc#%R9W}jU@Mh_9nafSTfW<5(F~kP-`Vy;H>s+Rt(SOMu@2vq@KcG~$$Rz5wG{{= z89)#%vR7G+cPI$KyW%G(TVwEl9FFkkpBme*a delta 459 zcmXYsziS&Y6vy=>-JR}-&yJzQj_ZaH0yzS~L!d*UDP97FdPvem1dQ9KI5u~7xVTHV zU=Qh#p=j(-I+qS1w9pQn3mLL|YRCK&Y2TSj@YVP8^xo6c$J)Id6)sNo*>iPq(1JvzT@eW+OD{n#DveSa5edeU_)P8Zk!J6%bHD`sY zx9qw57*6bWcjri=MCTH;GGgeXiyrxad}t!%be2$E3LTp=`WVdE6m$hcnj^{^)G2>R za+vVES->NbyT2p}ECN=0M^$8$%{vr|iyM(|+F#y_&F2JXoP_bWwS&nUG^5FO-%Prv z`S^H{n(kn9Jnke*c2_-sb^B7SMmj)q+RG;yrP>R%2d&~qtzwRL(XHsOAcpAwuJXl< moy4E}IP8u3<86GEbNeZL0u3r%w)bH_+ z6vi5+OvdRcyvSe`=<)w0^vH@8vn>&>& zg$K&!P2~ouYi3GkiQ-9R$>J@lOXW#r1G4ylm_LQDm&u$ViYJ9Xm_buu;=C-mDvsik z(v;M^5`9g^Tf8ax$)&kKPJB^*eun>%6gQBaUs?j;@C8GRbPVteo7})?$R+~xOp(as?TmpEASMqZ2O|$7 O53>M>WE5a#1M&gO+e35! diff --git a/backend/app/__pycache__/views.cpython-37.pyc b/backend/app/__pycache__/views.cpython-37.pyc index c345475f9a282cc7851979da08a4d89298461ebf..bdb5c658afd41a6b0b52ccf15f0525261b3152bd 100644 GIT binary patch literal 1487 zcmZ8hO>g8x5bgH&csx;HmxzT$jD$EihuJ$?tsp@h!%7=CSR;)bcW1^Ee+<>_gc(gv z!*wrQ5hyuwLHq`OMqfGYU*JSlJJ}7mQNdC9LG9c`KLx6aPR_=6MUz5Mposqtl)3-#u`e6@OZ?=xBGx=IJx!EvW_TYsk{9D~et**4#xvk7Xc z7p(wd$V8=@UFKCOjHmKT2_6~4yKk7JsAS$qF%!AYfzrpKg&=?Eq|%UB-=b}_{89hT z;4$w1d2#&3ls>7Zi`De&w&-dssG7cnc8NTw=~r6k#e$5}v%I)KR;C#I^s)sIPad{D~XnfLP&64u?29mYV~M9As&1k&Eb1 zc-IbkyTZraZ-~4bUj(}g`r*}7uz+P(I-zF-#v_*sW&^>@gpj&25o zmoai2_Z&9~T8GH*kQmnqqC^B+r{rSvn)u#3F|q1a5-v;Cf{A3ks@k;#BtmxrOJ$g4 z3x=4TiB`E%S1kxL1X;`aOv0>|sbinQ$LO;8aEywcqgcx3p2@&T_@JHy`%gUWg4a6W&zgShl zJ|Yv5cazuBgjYEF zM1n!dI5a#IPGZL%3Mb|VZo=U+^m!{EYHs=^*{1#ofo)>G<46_Cz^<;qJrd=d*nCpY z_$w$I-G@X11Ue$+HjDqqIP8BfHppk_rsxG`6%C&wI!Q;_zF6kXyq%~;3%cmEvIpAQ zn7zAa)M-$j^*#FNzs3oX(ihu?L$xMaGdUTP{hr zYv8=hea%1ELj&w(z52Mp+6*wgN%o!AMA$sk2uT~e3l+;ipc>-7qO>-sN$rT+wk z{Ed^-i^1RyH1!8`oN$_x0gWidv6DLkH*yCoVla0(%e@ZTz1$y^qLTIT^I%Yp%7aQ& z8C0XHwUzSPpdQudYZ@K$knn()UlU#yZhvL!Mom%Yl^&f^UgfpdWJ;q|u+*)k!B?!M z1*@8T6;`dzSG9R-kA&^F5Ge_%@ue7YAw$OmJuwtAOO^4JPV`v4r85_L1N?$rp+?0} ziO@B*WULRwP-khPh4J#Dmko^%w_>c(H5p~`i%h&s@g1j^1A{xz)HUb?i6|$LBix8_ z%AMCF@`Mj#cQ)n>V)RUHSM)Nag?xg$;SP9t&=B#v(9|vHCbUnEoC)dEiNonJJ#r^* z-{B5-kAZ`U`^G&Xcn2@0*@S7Y?{jwS;5)VdB*pWwP};CD>}M*AO-&gsF-G$zk(Xhwe{bKt)%_Was(Uc%-Ye4a0B~2`9a;26 z3WF`Jlk@A3>WV*#I0b(+aJ) z+hNHBaXd^0B92WZjt2!F=Qys#@$+$#&z?lBQ^5Dm(r9)P+&NnL31zhOXz_YGvN0fu zRg3{D5D6US1a;;}v>LYac(0S9Wbs1wd}vl9Ll_`~M^w`Z@c0H)azgFhIia8u7u4f$ z@~kYs(Jpv6Q-_japc!XV`Ww|AtoHjQ)f}@mbPaM z1|yKk%R=(du?G1$#B$hvG_Wf(YV3yYd12{Ty(O;#u% zv?+!1lb$5A}wU13&?G( zC&q`GC2|!t9?t#*%&E1d#b&O}7JHm`o!kW9&5GV_%xQ&rSffqU0A0iH4QqYaYPbCV E0ER;tRsaA1 diff --git a/backend/app/models.py b/backend/app/models.py index d98159d..9cb9f7a 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -1,4 +1,5 @@ from django.db import models +import datetime from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser) # Create your models here. @@ -64,19 +65,34 @@ def __str__(self): class Student(models.Model): - admission_no = models.CharField(max_length=100, unique=True) - name = models.CharField(max_length=255) - course = models.CharField(max_length=255) - department = models.CharField(max_length=255) - photo_url = models.ImageField(upload_to="images/") - user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE) - - @classmethod - def get_profile_info(cls, user): + + admission_no = models.CharField(max_length=100, unique=True) + name = models.CharField(max_length=255) + course = models.CharField(max_length=255) + year = models.IntegerField(blank=True, null=True) + photo_url = models.ImageField(upload_to="images/") + user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE) + + @classmethod + def get_profile_info(cls, user): profile_info = cls.objects.filter(user=user).first() + return profile_info + + +class Attachment(models.Model): + attachment_name = models.CharField(max_length=100) + organisation_name = models.CharField(max_length=100) + start_date = models.DateField(default=datetime.date.today) + end_date = models.DateField(default=datetime.date.today) + student = models.OneToOneField(Student, primary_key=True, on_delete=models.CASCADE) + + @classmethod + def get_profile_info(cls, student): + attachment_info = cls.objects.filter(student=student).first() + return attachment_info -# class LogBook(models.Model): -# pass +class LogBook(models.Model): + pass # class Employer(models.Model): # pass diff --git a/backend/app/static/css/style.css b/backend/app/static/css/style.css index be4ca68..fd50a2b 100644 --- a/backend/app/static/css/style.css +++ b/backend/app/static/css/style.css @@ -85,7 +85,7 @@ h1 { } .submit-btn { - width: 85%; + width: 75%; padding: 10px 30px; cursor: pointer; display: block; diff --git a/backend/app/static/images/tuk-logo.jpg b/backend/app/static/images/tuk-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4d256ffa2ea223fb7249eb687e3eb66d7d0a4d0 GIT binary patch literal 6738 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 delta 444 zcmXv~IZJa<5WV-l`|_6T8jU8=xIT^gx%3JypQ507;L;3&h$lYta6>KZEaXG5y{(0o zYGIK^ZTugxwDl)gd^Z7SIEOQHhGCeS>{I4yJ|1_Oj_c3oz2yXBUyb5794%%w&c8K* z5d()f`Y zwZOxWp7Ai;V~nw zN>jCvFL3oP7L_o@YSYH0sC}3|=T0qYd0frdQ=(KNLkX5LT5zv VM+c=8T&QxikhYu6rXfwO`F~8mVLt!> diff --git a/backend/attachment/__pycache__/urls.cpython-37.pyc b/backend/attachment/__pycache__/urls.cpython-37.pyc index 895c8cb54072d25d95f98c0c3a6f924e77219364..7f7e0d0df43f16b55367190abd3e822ff72e4ca0 100644 GIT binary patch delta 38 scmcb~{(zm=iIGuWa48d+zpo zi~ooC&)?sIjQHd6$DX(y1Gj(Y&g*wS^M-$IJ^t~v_>bb>jej%#`|&Tve>wi~`_Dpr z{PC;nkF7m%`w{x?FE=N*x4*r%wH05B+gHDLmD~NR-H+{jXQ#jQkG9FJICzF1ZEk+* z%GTD}r(Rzp@4org%_#w~S(iB~!-H%BTXjrTcSJ^j)(cxxiry7j3$8_}Za z;^v8Cyzv>;As}9q7`X-EZAp|029`b$9nCyWija7P#tjyLX@Y z%H_)XMB=>%ul>&T$6_zW)`$Fn1K7>`&wS;t zV%ILm|2i_eXX8JO|2Y2N<3EW1_5Jt%tA7`tg75YU;Nuw@d_4UM__*~H__+Ca^t9E> zFRiUZ@x<;=FaN=MXY;My%+;@6{XdtR>%Vz*Z{wd`erfAZuYCRT_qUmyH@5!A?r8hQ zmG=67*|>VeiXY1#-eqra&uFC7%yT7;dOWXf)lh}T3XBby^KeKb|>c7A8pRVSw zes=qRZoYT(lN&#X|7HAbU}2wmZ2Eyq^%&tAbQln>!djYa3m%N|>=4F$Bj7127z(ur zg!8~|c#o9=M4L#u&G?+nS+qA61VwXQs2YK^p-lQ7q8g-x-~vssL;&H#Ky)WVLSPB5 zatcyhiKirif~;vUGC6^CJj>!d!xB}+GK_MBLQvEb$1*N46Wn!ig=92~mT4-GfR8MS z8N>2O8_5$6R^N<3dgwAFco0^_ha&D8KFnJhJDw6EI~qZ@X1)=jAViZq5A!_85Qd>k z*kePca919>v;Yr9^&=4op#*$_JG?U{1V)q$)G$Lfpz%N%Ga*BAuSX!wl3`v7Fj$2G zf2^oBOT(r^crdMziea*^MIcZQUkdW1{K^YqO~c#G*PEFo3E7%##ak!4D_n5Ev{K&Ttqp2f+$8i~`WeGsf6ZH9eV9HO~r_p`=J72LHem+=`Ga zpOHtrI^t9|3{af3U}UHO6XQI_g;*@Q)yPmW*t1pN5^!<|o)&dAHnKj2A$Xh&(FhcX z9s!MmA>-ISD{|gQRrK*FP{)wZYqX^!5y%f&*R?d?n=lqS10f8>dGt_rh5-?b zUY(QTuu#J3A&Xg~p~qtk#aIqudcZt61K1z2AE6X#A_ha-pD;YY!4_qhBRV22qa5G-4{p3)TB*S_EFnoDV*?Gpi{%sXo-1gz8+16q6~Y4O^XN=az^N&g5kjd zt?@7vPF{>aI?XVGH5rjO>GR5nW@$c9RNa)Yu`2-&`k_PWQ}R8_{f;4q$TY9@Q<1DB@tm_yUHGsdIys5y!NY%K|ffR`y%i09H z8G%eP&_}iz*cgd3&J?&ai)T>Vl_gtZFjZBbj8J1kz)V69+@YlbJ0VBHa5Rw>1@{>h zB1Qj31k!m#(4=58B7B-sWR9^wXs}U2@gbVFq~ZG`(1>(VAH#KZ;tPyTSR_X&yggPi zTE{hgis0{yP`pi=76Z$g#VRrg-(!b#CJq8L=mxy(u-79HMj2uNwmPmc0dS23r>dSJ z1DDU@0nMW56A_3W0w?bU8qJM4!uI?S*GU#LO_vNURdMBO5y&Cz2?$q;bN};ys$9Et zC;rj9>)(Yp;(A<)bMcRYL)=sGCof-$#n$i4KX1=JZ_Ph%-gkfa**7oU+5X18btndJ z?0jVB{oDU-`y1e*f3Q7$?#|`4*z?IVhrcYN?L~*dy?0LPFWd&07vXcK!3cGFK75F~ zb&5NCK#Xvw-#ozW-2}MA%h8$f#)Cs+gaZG60D1dkuf={VajAOc2lv)L7E4Tb|7`cG zyT7(O+3oI9yEk|K*Un$;{F|MBvh#O$PIlhhd3NVL+uz^*cej3JOW$g3!CTihf3*4S&980#`lh$p+oU&dZTxiOFE@UF<2N>@8z0+9Z#=hg zY5hO0|J(K7UjO^+;(B@grSFr_IUQn^yy3K7&yzLNeE8D=%WKWjbIRr z*3O8LNDNN<2(*u2I7ZUdC1NB6llurs!6;g}C)RedwYbxB*}i zB!z=R`UlU8fwciIfdg(7a6`|Z7lUd9JU1v3BO&^Q^I~8RcnZdVT7i!ur-_SlusDM3 z(+CQo&~r<~z)PU}6a*tQ_UuLR+@OJ&q9ANz^+k z?KUJbIA9dFE?y1+*AKQDiP1ED^Sl^rV!#bV1_U7>_{k;W`A!4Q8A6F055&`X+=2H% zT)^gfrNLnpCf@%*{zweCW0C&^?h}3Ac`@J()(6~Z41>t)7sUv0-w4=gz(LYaEQqfs zVX!zb2r>nuU?YQv!>-+XuNHga?aNy1f5#FVUs}6*<$G)KC$93lU*7rT_U~+80`WJs z`Kis^#_wMF-iEe8f+ETvTxrhQ&#&J|Bx1j)I1D@HLB{vs7_jiq+u3$LeU#rjN@r^M zz2_Dr&+UEaIcBIzwk_$}iKgHCZZ>vfeXr9fA9V8fe(4jjr#D{Ndydmx%f9#7PsE{ixlhDy?0~NfQFrtc*BVFH-@5zRoy+(Bq!zn=?=R}Hox4wOr`BJ@ zKX~OvIdPAv$L`#I=PY!BED(7Lf8inE<^uq{0JsAV5F2m*3qSVOjlJF2wY95%zWddk zU)dJ7GMjhSe|+Uzmw)H6U%d2l@1cO`3%~kLKR%rV=~c&h9(WVjNb~7*sy?xtYHM&( zE(F{lt?GhedMCMJPR$+qaJl3|eiNUZXaMCsJhm)u90=GpHA_5ox&8~Cbd(|7dAAhd z?%vnFHXTlSDSIHIrd7*0rl0TA*zqA+oV5Ea1RKWDpoC>vDwzW{Kr0BFZ}c_3CS)X0uV@9gSY(4* z77oM#k9BlCP|?O75G?YxgpmvX{imB zM(G}E=C+8f_rh6B&y=5E@J1MK_;9-x|^TU(&5vj0LJJTsiYK@{p zCr4z-T#o1u9k+xl^+i3Lb;Ps8jX8%^$>doM_a6Vv7%<8vlNzD*!`g`KA|=0-%fPIS zQyslQ%FapG=^hu_vTV_9p6@k>$~h7X?tYed|D43CWc4hG`Nm-DRtol@DkIh!-5z3B zw1aZ3Y!7<1dIn`1W*T#feHUvKi?qs~EGpt$NSP(xH|Ox~xiEq+;lOxs$}JW;RePLo zP)Df8(WoNxNcr$EgSA`ZjB%K21Q4j290?ikU_lRn!(!Z;C9cmotje^PaTpk>%F$%f zJ#p+-PCc>?$0sL8$>9JKODAr#tLlz@kXCzU#UdO1#diTh+hTB>C7zgbSe3{x<51|N zs8+M59Tx&D3FBRkmBwtZ&ovN9Kj4p!nvhH(hbE8UN;;oj)C0&r79#L0ac$0FRh{4> zhjKqdruwK=p(uOUXmFjD*Qt~Q!|j}eeYvaWtgxHLG9j0AxQ+;S7CD@a@^An7Z^T}R zZS8_+7K?v(qu2ImToSEc%Os3OJR%>>(MGXc`w|mBufz#G${s0PU7%@w{GJj#Kim&r{ zI>PmoS}pp7>vzDeEh$O)faQ)T@~F_`tpX&H;(;7gI{mE5^x-pc1gttwOHQ+rS>omS zs;jEG7tLfk!qX{Rb(~RN4$*93tYsjylQfSslQR2=N9*8y<`k=;RZqnB@o2$JKw^b0 zq&~C6OLGnnip4*xR=k7*IDMoF6vpJB419FhN^{mxHxyJ=&$J94^fN6Ml0`ddR9QrU zJ7!R}Yd+|UkfFXKoytR8nH z4(8FpISW`!;%12t%{i>9bT8vD1_gkDXlrz>T4qniRKt;w+_5|snd5NWtx0U2&bGNR zq1Ewm@|+%!2bm&B6laMKzQbX8A^kxeeHn*gGsXI8W{_^w={|GFhV@o0UpESkaVOJb zbFDBp^ed7}i}GR5JjY=%8=WPdKedMyW%?x?_|QqEN`KTG>X; zDMVv+urC(#YA5knJxH%=F+4cfTh&w}Uy(==^j#JDq?$iG zVq1=0R0bf9VOIL!pqDM^IX+Y>YO`@>JD$zgXNl+Lj}F=v@7lGPJ0gChr>c;tJTp3x>Bd1AV(L9Y}2io7KzvgL(x1clx(Yi#`uxcVm)J)cxKLFNfYNx4`&&N z0hX$aT3leu#|NDgsz;fb!C|jN)=V@HGaj4dtbrys2OXE;GZvLDSfXB>0YBcp!5A4bAmF>rfsF$eoK{;KH7ii8|I~B^tAqp zgVG4_k@Q?WQ7`jVp`O1GxaHKEt+GDk-| zl+X3OM{flzd$z7SOHilFUg)l$ZLVK@D^txpNCi@@jFn8Ok!v5x6ccK2-$N;(Cl2b3 zmVW3J>rT1Z7u`xQV|+7rt!=HQ?%Op3inA?lRFLaBY0z~&rQ%{46JAeK{y+4OOFP;WLW zNj_g~7Y+_czSe~;x}u#}>BcB;=766#r0cCm$H!9+3+4P-0-bYMH8!z~gW#n`hnZ1J zQF1}C8gL;}#d~bK&?0I?PwOIua!wk;LaX9-N8BS%amrz#XD~}3a}KMfGL~`R>nV}w zVdlsy*t)?&jL<&hN`?Zu$%6rgSebUQIOwNOlIg0ioO>6Gjfq(To^v=e^s!{-V;Kk9 zPt{P&J|diIzm(Mtq*5FYG`pHVCJ#&>%yei+9$NMLWBnlCc@#nCdRXj!%o5O?!>W;z zWgIXkMH0scM>Oa!a|ivFA}U5_s-yBfoS{6qpRGb{^)L-7&M_@(0XzXSaH9$-i4~jA8TtAd|8TaAGfV8B z+QYjI#6efb_azv7YCXRGPv~`cb@? zb69Lh{eMKzRr7rhBB&FjN==op8!Qs0dtA4XlUXx~(xjX04j{-cm=!vtePs+MU~HBs%+(W(4Bq)!GlS8{;5>pFW;R6)b+;3=Lk@C=E{_{F9`MIrwJdk~ ze&aBiFXKhVFJ?1juxOp2Eee9@!+!NFk)JQSY6kJ*TbUX-;3Qc) z;u?A|z$W=4QkMeHRL4g5q=x2-C0ew&a~u{L@3Ta9&SBLAMpcxZ?Rb&0LDdSaSi)I-E!VT53oNY6Q}8vi`Y;k0mT3`(g+ zxvW)0qj3_3>2|U`$qWLlQAiHx0-5CCW|2hnV9a!IKKW>y0=ErFEDS2l5^v5)tQs#p zOJZKQHIArMsdkubGfw^>&yz)-!gHOP;Td3hy~UBEb+#i z!_SyreK@?jj6;h~9Zt%Vwun?{O4Tcej8o*GMicQ{;?S>Gn1HghWET_QM%8^(ES&2B zbYdS)T+9+5nR8e*8@r4{lSuW&wtqCxI^cYpq@89%tr{|4@7GG%Vl$997xW4(1I->2 z_BjrVV;!@^>vImPMsJsKsF^9BY&VX3tw3+rS)V=dDrzgA<&O=#BUvYHrYY79>v#y` zX6xL>Ko@35W{KD499B*CF5^%sr|KhF=yeV!8P_*Of*rVJjxiK)Y?z3pfli>3QYX2j zLY|Dz9B1gL;s0e3u59S^76zj+IT*n=Lh82%rt5ig0Lr^2H67zVIP%*E)0v!64lcev*K3*XOwa` z`L!=kO{|!zcH8n0%-uR&#S)o8y`&ft-f1{wn_=;B&^{a~ss_ft^YumBI5&_sOH}3* zv=zTWI78vI18bs%RJSl$bLuX?Y5Ssh$2QLs|RISaI&Cc)#yu;{Gc;lblee# zg{ik$qWlhrM?Y~`_6vt491M_-4+bYBBh}aeO=JfW7|UjYV+$$g8amoZtHo{}V)CwZ zRJQGN92Q6GW{J|A!>S)pEaNcAr&zu!9@jmkhdXBLusgBGj5hSjLhIx}$H4CBuv{|~ zsVqBrWDXa`_hyOWoWrW~+eHp#1DxfOEW;Xy$A{HY^H4oO4(St>w_7@v5jZ`tD57*k U1rx++wA+iRFnAa6!i?bm109_nrCuqV} z|2ozQewB{5hC46gqJF6y)v-qKH+JzOzQHEeWNd8VRpJ>MRk>g*$TQ_6Kdq!VJL- zzQaAdg4?)+-|;EVDWgG@nbo$ZCHZM#G;@mlWa6L|k!SY0U<3C0ty9*)-90AjpUQD9i5tS`_5)^7ZX7o* zYe~ls3=jI~yc7BtVK=SC*hygckXGzH3w}KW7L2Wc9!6H+4~(i@YPJX__yhLbsn8cx jvsdksRkf~~Et!ip%&=94xnUi6hwzRvIpAUE8JvZGT#
-

ATTACHMENTS MANAGEMENT SYSTEM

+

ATTACHMENT MANAGEMENT SYSTEM

- {% comment %} -
-
- - -
- {% endcomment %} -
{% csrf_token %}
diff --git a/backend/templates/app/register.html b/backend/templates/app/register.html index 18f0368..195122c 100644 --- a/backend/templates/app/register.html +++ b/backend/templates/app/register.html @@ -15,14 +15,6 @@
- {% comment %}
-
- - - -
{% endcomment %} {% csrf_token %} {{form}} diff --git a/backend/templates/app/user.html b/backend/templates/app/user.html new file mode 100644 index 0000000..e69de29 diff --git a/backend/test.py b/backend/test.py new file mode 100644 index 0000000..b55de33 --- /dev/null +++ b/backend/test.py @@ -0,0 +1,7 @@ +from datetime import datetime + +date_str = '09-19-2022' + +date_object = datetime.strptime(date_str).date() +print(type(date_object)) +print(date_object) # printed in default format \ No newline at end of file From bd3fa192fec00f68a8fc00c0cd2400e06c0d689f Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sat, 31 Dec 2022 13:50:54 +0300 Subject: [PATCH 36/49] Changes the query key for student and attachment models --- backend/app/models.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/app/models.py b/backend/app/models.py index 9cb9f7a..26c6e73 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -74,8 +74,8 @@ class Student(models.Model): user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE) @classmethod - def get_profile_info(cls, user): - profile_info = cls.objects.filter(user=user).first() + def get_profile_info(cls, email): + profile_info = cls.objects.filter(email=email).first() return profile_info @@ -87,8 +87,8 @@ class Attachment(models.Model): student = models.OneToOneField(Student, primary_key=True, on_delete=models.CASCADE) @classmethod - def get_profile_info(cls, student): - attachment_info = cls.objects.filter(student=student).first() + def get_profile_info(cls, email): + attachment_info = cls.objects.filter(email=email).first() return attachment_info class LogBook(models.Model): From 9c88d46f6dfb33800f63f41ad28f49a2130a32b3 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sun, 1 Jan 2023 08:55:08 +0300 Subject: [PATCH 37/49] Adds the add-attachment view --- backend/app/views.py | 55 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/backend/app/views.py b/backend/app/views.py index 78b01c9..462e6ad 100644 --- a/backend/app/views.py +++ b/backend/app/views.py @@ -3,6 +3,8 @@ from django.contrib.auth import login, logout, authenticate from .forms import * +# # Authentication Views ## + def register(request): form = CustomUserCreationForm() @@ -24,27 +26,62 @@ def login_view(request): if current_user.user_type == "employer": pass if current_user.user_type == "student": - pass + return redirect('add_attachment') email = "" if request.method == 'POST': email = request.POST.get('email') password = request.POST.get('password') remember_me = request.POST.get('remember_me') - user = authenticate(request, email = email, password = password) + user = authenticate(request, email=email, password=password) if user is not None: login(request, user) - messages.success(request, f'{user.username} logged in successfully.') - + messages.success( + request, f'{user.username} logged in successfully.') + else: - messages.warning(request, 'password or email is incorrect.' ) + messages.warning(request, 'password or email is incorrect.') return render(request, 'app/login.html', context={"email": email}) - - - - def logout_view(request): print(request.user) logout(request) return redirect('login') + + +# # Student Views ## +def add_attachment(request): + if (request.user.last_login == request.user.date_joined): + messages.success( + request, f'update your profile detail') + return redirect('student_profile') + + if request.method == 'POST': + attachment_name = request.POST.get('attachment') + organisation_name = request.POST.get('organisation') + start_date = request.POST.get("start") + end_date = request.POST.get('end') + attachment = Attachment.objects.create( + + attachment_name=attachment_name, + organisation_name=organisation_name, + start_date=start_date, + end_date=end_date + + ) + attachment.student = request.user.student + attachment.save() + + return (request, 'app/attachment.html', locals()) + + +def add_profile(request): + pass + + +def add_logbook(request): + pass + + +def view_comments(request): + pass From 5eadd06fc93f24493cf30fa99d2935b1cb47b7a1 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Sun, 1 Jan 2023 08:56:23 +0300 Subject: [PATCH 38/49] Adds add-attachment and student-profile urls --- backend/app/urls.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/app/urls.py b/backend/app/urls.py index 802f113..42e41df 100644 --- a/backend/app/urls.py +++ b/backend/app/urls.py @@ -6,6 +6,8 @@ path('register/', register, name ='register'), path('login/', login_view, name ='login'), + path('add_attachment/', add_attachment, name="add_attachment"), + path('student_profile/', add_profile, name="student_profile"), path('logout/', logout_view, name ='logout') ] From 481f3f2fc97cdbb2d1f3aec2247f8142888b063b Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 4 Jan 2023 16:18:36 +0300 Subject: [PATCH 39/49] Adds the students views --- backend/app/models.py | 26 ++++++++-- backend/app/views.py | 111 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 111 insertions(+), 26 deletions(-) diff --git a/backend/app/models.py b/backend/app/models.py index 26c6e73..46179f7 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -55,6 +55,9 @@ class User(AbstractBaseUser): user_type = models.CharField(max_length=10) is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) + date_joined = models.DateTimeField(auto_now_add=True) + last_login = models.DateTimeField(auto_now_add=True) + updated_profile = models.BooleanField(default=False) USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username', 'user_type'] @@ -81,23 +84,36 @@ def get_profile_info(cls, email): class Attachment(models.Model): attachment_name = models.CharField(max_length=100) - organisation_name = models.CharField(max_length=100) + department_name = models.CharField(max_length=100) start_date = models.DateField(default=datetime.date.today) end_date = models.DateField(default=datetime.date.today) student = models.OneToOneField(Student, primary_key=True, on_delete=models.CASCADE) @classmethod def get_profile_info(cls, email): - attachment_info = cls.objects.filter(email=email).first() + attachment_info = cls.objects.get(email=email).first() return attachment_info class LogBook(models.Model): - pass + date = models.DateField(auto_now=False) + activity = models.CharField(max_length=1000) + verified = models.BooleanField(default=False) + student = models.ForeignKey(Student, on_delete=models.CASCADE, ) + + + + + def verify(self): + self.verified = True + return True + + + -# class Employer(models.Model): +# class Supervisor(models.Model): # pass -# class Supervisor(models.Model): +# class Employer(models.Model): # pass diff --git a/backend/app/views.py b/backend/app/views.py index 462e6ad..e27c63a 100644 --- a/backend/app/views.py +++ b/backend/app/views.py @@ -1,11 +1,10 @@ from django.shortcuts import redirect, render from django.contrib import messages from django.contrib.auth import login, logout, authenticate +from django.contrib.auth.decorators import login_required from .forms import * # # Authentication Views ## - - def register(request): form = CustomUserCreationForm() if request.method == 'POST': @@ -19,14 +18,6 @@ def register(request): def login_view(request): - current_user = request.user - if current_user.is_authenticated: - if current_user.user_type == "supervisor": - pass - if current_user.user_type == "employer": - pass - if current_user.user_type == "student": - return redirect('add_attachment') email = "" if request.method == 'POST': email = request.POST.get('email') @@ -37,6 +28,12 @@ def login_view(request): login(request, user) messages.success( request, f'{user.username} logged in successfully.') + if user.user_type == "supervisor": + pass + if user.user_type == "employer": + pass + if user.user_type == "student": + return redirect('add_attachment') else: messages.warning(request, 'password or email is incorrect.') @@ -44,44 +41,116 @@ def login_view(request): def logout_view(request): - print(request.user) + print(request.user.user_type) logout(request) return redirect('login') # # Student Views ## +@login_required(login_url='/attachment/login/') def add_attachment(request): - if (request.user.last_login == request.user.date_joined): + # date1 = request.user.last_login + # date2 = request.user.date_joined + # if (date1.year, date1.day == date2.year, date2.day): + if not request.user.updated_profile: messages.success( request, f'update your profile detail') return redirect('student_profile') if request.method == 'POST': attachment_name = request.POST.get('attachment') - organisation_name = request.POST.get('organisation') + department_name = request.POST.get('department') start_date = request.POST.get("start") end_date = request.POST.get('end') attachment = Attachment.objects.create( attachment_name=attachment_name, - organisation_name=organisation_name, + department_name=department_name, start_date=start_date, - end_date=end_date + end_date=end_date, + student = request.user.student ) - attachment.student = request.user.student + # attachment.student = request.user.student attachment.save() - - return (request, 'app/attachment.html', locals()) + return render(request, 'app/attachment.html', locals()) -def add_profile(request): - pass +@login_required(login_url='/attachment/login/') +def view_attachments(request): + attachments = Attachment.objects.all()[::-1] + return render(request, "app/view-attachment.html", locals()) + +@login_required(login_url='/attachment/login/') +def student_profile(request): + current_user = request.user + profile = Student.objects.filter(user=current_user) + if request.method == 'POST': + name = request.POST.get('name') + admission_no = request.POST.get('admission_no') + course = request.POST.get("course") + print(type(request.POST.get('year'))) + year = int(request.POST.get('year')) + pic = request.FILES.get('pic') + print(pic, end="$$$$$$$$$$$$$$$$") + profile = Student.objects.create( + + admission_no=admission_no, + name=name, + course=course, + year=year, + photo_url=pic, + user = current_user + ) + + # profile.user = current_user + profile.user.updated_profile = True + current_user.save() + + + return render(request, 'app/student_profile.html', locals()) + +@login_required(login_url='/attachment/login/') def add_logbook(request): - pass + + if request.method == 'POST': + activity = request.POST.get('activity') + date = request.POST.get('date') + + log_book = LogBook.objects.create( + + activity = activity, + date = date, + student = request.user.student + ) + return render(request, 'app/add-logbook.html', locals()) + + +@login_required(login_url='/attachment/login/') +def search_logbook(request): + current_user = request.user + print(current_user.student.photo_url.url) + log_books = None + if request.method == 'POST': + from_date = request.POST.get('from') + to_date = request.POST.get('to') + log_books = LogBook.objects.filter(date__range=(from_date, to_date)) + return render(request, "app/view-logbooks.html", locals()) + return render(request, "app/view-logbooks.html", locals()) def view_comments(request): pass + +#Supervisor Commednts + +def supervisor_dashboard(): + pass + +def supervisor_feedback(): + pass + +def supervisor_profile(): + pass \ No newline at end of file From 8d302f4c990974ae0e5f05024bbcdb94d855c076 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 4 Jan 2023 16:19:35 +0300 Subject: [PATCH 40/49] Adds studentst templates --- backend/templates/app/add-logbook.html | 62 +++++++ backend/templates/app/attachment.html | 159 +++++++++++++++++ backend/templates/app/student_profile.html | 110 ++++++++++++ backend/templates/app/user.html | 0 backend/templates/app/view-attachment.html | 66 +++++++ backend/templates/app/view-logbooks.html | 190 +++++++++++++++++++++ 6 files changed, 587 insertions(+) create mode 100644 backend/templates/app/add-logbook.html create mode 100644 backend/templates/app/attachment.html create mode 100644 backend/templates/app/student_profile.html delete mode 100644 backend/templates/app/user.html create mode 100644 backend/templates/app/view-attachment.html create mode 100644 backend/templates/app/view-logbooks.html diff --git a/backend/templates/app/add-logbook.html b/backend/templates/app/add-logbook.html new file mode 100644 index 0000000..f5fec0f --- /dev/null +++ b/backend/templates/app/add-logbook.html @@ -0,0 +1,62 @@ +{% load static%} + + + + + + + Add-attachement + + + +
+
+
+
+
+
+
+ + {% csrf_token %} +
+ + +
+
+ + +
+ + + + Cancel + + +
+
+
+
+
+
+ + diff --git a/backend/templates/app/attachment.html b/backend/templates/app/attachment.html new file mode 100644 index 0000000..1a0d27e --- /dev/null +++ b/backend/templates/app/attachment.html @@ -0,0 +1,159 @@ +{% load static%} + + + + + + + Add-attachement + + + + + +
+
+ +
+
+
+
+
+ {% csrf_token %} +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +     + Cancel +
+
+
+
+
+ + diff --git a/backend/templates/app/student_profile.html b/backend/templates/app/student_profile.html new file mode 100644 index 0000000..84f7386 --- /dev/null +++ b/backend/templates/app/student_profile.html @@ -0,0 +1,110 @@ +{% load static%} + + + + + + + Add-attachement + + + + + + +
+
+
+
+
+

UPDATE PROFILE

+ +
+ {% csrf_token %} +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+
+
+
+
+ + + + + + + + diff --git a/backend/templates/app/user.html b/backend/templates/app/user.html deleted file mode 100644 index e69de29..0000000 diff --git a/backend/templates/app/view-attachment.html b/backend/templates/app/view-attachment.html new file mode 100644 index 0000000..49bc1d7 --- /dev/null +++ b/backend/templates/app/view-attachment.html @@ -0,0 +1,66 @@ +{% load static%} + + + + + + + Add-attachement + + + +
+
+
+
+ +
+
+

Attachments List

+ +
+
+
+ + + + + + + + + + + + {% for attachment in attachments %} + + + + + + + + {%endfor %} + +
IdNameDepartmentStartEnd
{{attachment.attachment_id}}{{attachment.attachment_name}}{{attachment.department_name}}{{attachment.start_date}}{{attachment.end_date}}
+
+
+
+
+
+
+
+ + diff --git a/backend/templates/app/view-logbooks.html b/backend/templates/app/view-logbooks.html new file mode 100644 index 0000000..4b4b564 --- /dev/null +++ b/backend/templates/app/view-logbooks.html @@ -0,0 +1,190 @@ +{% load static%} + + + + + + + Add-attachement + + + + +
+ {% comment %} +
+
+ {% endcomment %} +
+ +   +
+
+ +
+ +

Logbooks

+
+
+ {% csrf_token %} + + +   --   TO:   + +     + +
+
+ + + + + + + + + + {% for logbook in log_books %} + + + + + + {%endfor %} + +
DateActivityStatus
+ {{logbook.date | date:"l" }}, {{logbook.date}} + {{logbook.activity}} + {% if logbook.satus%} + + {% else %} + pending ... + {% endif %} +
+
+
+
+ {% comment %} +
+
+ {% endcomment %} + + From 8a7eaa0edcd956c7733cd1de92ede3ee63e56ea4 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 4 Jan 2023 16:20:34 +0300 Subject: [PATCH 41/49] Styles the student's profile page --- backend/app/static/css/Card.css | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 backend/app/static/css/Card.css diff --git a/backend/app/static/css/Card.css b/backend/app/static/css/Card.css new file mode 100644 index 0000000..3a9910a --- /dev/null +++ b/backend/app/static/css/Card.css @@ -0,0 +1,49 @@ + + .card{ + + height: auto; + border-radius: 5px; + box-shadow: 1px 3px 10px #e9ecef; + padding: 15px; + + + } + + +.toggle-btn{ + padding: 10px 30px; + cursor: pointer; + background: transparent; + border: 0; + outline: none; + position: relative; +} + +#btn { + top: 0; + left: 0; + position: absolute; + width: 110px; + height: 100%; + background: linear-gradient(to right, green,peru); + border-radius: 30px; + transition: .5s; + } + + .button-box{ + width: 200px; + margin: 35px auto; + position: relative; + box-shadow: 0 0 24px 5px lightgreen; + border-radius: 30px; + display: flex; + height: 41px; + +} + +#view{ + left: 50px; +} +#editform{ + left: 450px; +} \ No newline at end of file From a73b7cf9db8c4cace2d24a5bb3c6b28568aa7bb3 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 4 Jan 2023 16:21:29 +0300 Subject: [PATCH 42/49] Adds the media url settings --- backend/attachment/settings.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/attachment/settings.py b/backend/attachment/settings.py index 8d85e6f..7106f84 100644 --- a/backend/attachment/settings.py +++ b/backend/attachment/settings.py @@ -29,6 +29,9 @@ ALLOWED_HOSTS = ['*'] AUTH_USER_MODEL = 'app.User' +LOGIN_URL = 'login' +LOGOUT_URL = 'logout' +LOGOUT_REDIRECT_URL = 'login' # Application definition @@ -118,7 +121,7 @@ LANGUAGE_CODE = 'en-us' -TIME_ZONE = 'UTC' +TIME_ZONE = 'Africa/Nairobi' USE_I18N = True @@ -142,8 +145,8 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -MEDIA_URL = '/Assets/' -MEDIA_ROOT = os.path.join(BASE_DIR, 'Assets') +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') MESSAGE_TAGS = { messages.DEBUG: 'alert-secondary', From 5e1fd9ab575ee923e888e49c1f861d640d916a87 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 4 Jan 2023 20:19:13 +0300 Subject: [PATCH 43/49] Adds supervisor dashboard templater --- backend/templates/app/supervisor-dashbaoard.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 backend/templates/app/supervisor-dashbaoard.html diff --git a/backend/templates/app/supervisor-dashbaoard.html b/backend/templates/app/supervisor-dashbaoard.html new file mode 100644 index 0000000..e69de29 From 8a1fedbc9b29de1cca04a982c55b532ca18eea33 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Wed, 4 Jan 2023 20:21:56 +0300 Subject: [PATCH 44/49] Adds the supervisor css file --- backend/app/static/css/supervisor.css | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 backend/app/static/css/supervisor.css diff --git a/backend/app/static/css/supervisor.css b/backend/app/static/css/supervisor.css new file mode 100644 index 0000000..e69de29 From 46d291dc7abe21023f84f364619ce7cc0ffcf858 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Mon, 9 Jan 2023 08:51:54 +0300 Subject: [PATCH 45/49] Adds the comments and Employer models --- backend/app/models.py | 100 ++++++++++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 32 deletions(-) diff --git a/backend/app/models.py b/backend/app/models.py index 46179f7..7c3a36b 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -60,63 +60,99 @@ class User(AbstractBaseUser): updated_profile = models.BooleanField(default=False) USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username', 'user_type'] - + objects = UserManager() - + def __str__(self): return self.email - - + + class Student(models.Model): - + admission_no = models.CharField(max_length=100, unique=True) name = models.CharField(max_length=255) course = models.CharField(max_length=255) year = models.IntegerField(blank=True, null=True) photo_url = models.ImageField(upload_to="images/") - user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE) - + assessed_by_employer = models.BooleanField(default=False) + user = models.OneToOneField( + User, primary_key=True, on_delete=models.CASCADE) + @classmethod def get_profile_info(cls, email): - profile_info = cls.objects.filter(email=email).first() - return profile_info - - + profile_info = cls.objects.filter(email=email).first() + return profile_info + + @classmethod + def update_profile(cls, id, admission_no, name, course): + cls.objects.filter(pk=id).update( + admission_no=admission_no, name=name, course=course) + new_name_object = cls.objects.get(admission_no=admission_no) + new_name = new_name_object.admission_no + return new_name + + class Attachment(models.Model): attachment_name = models.CharField(max_length=100) department_name = models.CharField(max_length=100) start_date = models.DateField(default=datetime.date.today) end_date = models.DateField(default=datetime.date.today) - student = models.OneToOneField(Student, primary_key=True, on_delete=models.CASCADE) - + student = models.OneToOneField( + Student, primary_key=True, on_delete=models.CASCADE) + @classmethod def get_profile_info(cls, email): - attachment_info = cls.objects.get(email=email).first() - return attachment_info - + attachment_info = cls.objects.get(email=email).first() + return attachment_info + + class LogBook(models.Model): date = models.DateField(auto_now=False) activity = models.CharField(max_length=1000) - verified = models.BooleanField(default=False) + status = models.BooleanField(default=False) student = models.ForeignKey(Student, on_delete=models.CASCADE, ) - - - - + def verify(self): - self.verified = True - return True - - - + self.verified = True + return True + -# class Supervisor(models.Model): -# pass +class Supervisor(models.Model): + name = models.CharField(max_length=255) + postion = models.CharField(max_length=255) + phone = models.CharField(max_length=20) + photo_url = models.ImageField(upload_to="images/") + user = models.OneToOneField( + User, primary_key=True, on_delete=models.CASCADE) -# class Employer(models.Model): -# pass +class Comments(models.Model): + comment = models.CharField(max_length=1000) + supervisor = models.ForeignKey(Supervisor, on_delete=models.CASCADE) + logbook = models.ForeignKey(LogBook, on_delete=models.CASCADE) + + @classmethod + def get_comments(cls, id): + comments = cls.objects.filter(update__id=id) + return comments + + def save_comment(self): + self.save() + + def __str__(self): + return self.comment + + +class Employer(models.Model): + name = models.CharField(max_length=255) + organisation = models.CharField(max_length=255) + postion = models.CharField(max_length=255) + phone = models.CharField(max_length=20) + photo_url = models.ImageField(upload_to="images/") + user = models.OneToOneField( + User, primary_key=True, on_delete=models.CASCADE) -# class Feedback(models.Model): -# pass +class EmployerComment(models.Model): + comment = models.CharField(max_length=1000) + student = models.OneToOneField(Student, on_delete=models.CASCADE) From e22c70bc4ab27212e50270691d78a91ff1eca717 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Mon, 9 Jan 2023 08:53:14 +0300 Subject: [PATCH 46/49] Adds the supervisor and employer routes --- backend/app/urls.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/backend/app/urls.py b/backend/app/urls.py index 42e41df..f88e96f 100644 --- a/backend/app/urls.py +++ b/backend/app/urls.py @@ -3,14 +3,31 @@ from django.conf import settings from django.conf.urls.static import static urlpatterns = [ - - path('register/', register, name ='register'), - path('login/', login_view, name ='login'), - path('add_attachment/', add_attachment, name="add_attachment"), - path('student_profile/', add_profile, name="student_profile"), - path('logout/', logout_view, name ='logout') + ## authentication paths + path('register/', register, name='register'), + path('login/', login_view, name='login'), + path('logout/', logout_view, name='logout'), + ## student paths + path('add_attachment/', add_attachment, name="add_attachment"), + path('view_attachments/', view_attachments, name='view_attachments'), + path('student_profile/', student_profile, name="student_profile"), + path('add_logbook/', add_logbook, name="add_logbook"), + path('search_logbook/', search_logbook, name="search_logbook"), + + ## supervisor paths + path('supervisor_dashboard/', supervisor_dashboard, name="supervisor_dashboard"), + path('supervisor_feedback/', supervisor_feedback, name="supervisor_feedback"), + path('log_feed/', logbook_comment, name="logbook_comment"), + path('supervisor_profile/', supervisor_profile, name='supervisor_profile'), + + path('employer_dashboard/', employer_dashboard, name="employer_dashboard"), + path('employer_comment/', employer_comment, name="employer_comment"), + path('employer_profile/', employer_profile, name = "employer_profile" ) + + ] + if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) From 228cf62625900648564254c1bc29aa385b2f45df Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Mon, 9 Jan 2023 08:54:02 +0300 Subject: [PATCH 47/49] Adds the supervisor and Employer views --- backend/app/views.py | 225 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 185 insertions(+), 40 deletions(-) diff --git a/backend/app/views.py b/backend/app/views.py index e27c63a..50d8fad 100644 --- a/backend/app/views.py +++ b/backend/app/views.py @@ -2,9 +2,14 @@ from django.contrib import messages from django.contrib.auth import login, logout, authenticate from django.contrib.auth.decorators import login_required +from django.shortcuts import render, redirect, HttpResponse, HttpResponseRedirect, get_object_or_404 +from django.utils.http import is_safe_url +from django.urls import reverse from .forms import * # # Authentication Views ## + + def register(request): form = CustomUserCreationForm() if request.method == 'POST': @@ -13,6 +18,7 @@ def register(request): form.save() messages.success( request, f'{form.cleaned_data["email"]} registered successfullly') + return redirect('login') context = {'form': form} return render(request, 'app/register.html', context) @@ -29,11 +35,13 @@ def login_view(request): messages.success( request, f'{user.username} logged in successfully.') if user.user_type == "supervisor": - pass + return redirect('supervisor_dashboard') if user.user_type == "employer": - pass + return redirect('employer_dashboard') if user.user_type == "student": return redirect('add_attachment') + + messages.success(request, 'Logged In successfully.') else: messages.warning(request, 'password or email is incorrect.') @@ -42,6 +50,7 @@ def login_view(request): def logout_view(request): print(request.user.user_type) + messages.success(request, 'Logged out In successfully.') logout(request) return redirect('login') @@ -49,9 +58,7 @@ def logout_view(request): # # Student Views ## @login_required(login_url='/attachment/login/') def add_attachment(request): - # date1 = request.user.last_login - # date2 = request.user.date_joined - # if (date1.year, date1.day == date2.year, date2.day): + current_user = request.user if not request.user.updated_profile: messages.success( request, f'update your profile detail') @@ -68,19 +75,20 @@ def add_attachment(request): department_name=department_name, start_date=start_date, end_date=end_date, - student = request.user.student + student=request.user.student ) - # attachment.student = request.user.student attachment.save() return render(request, 'app/attachment.html', locals()) + @login_required(login_url='/attachment/login/') def view_attachments(request): attachments = Attachment.objects.all()[::-1] return render(request, "app/view-attachment.html", locals()) + @login_required(login_url='/attachment/login/') def student_profile(request): current_user = request.user @@ -91,43 +99,50 @@ def student_profile(request): admission_no = request.POST.get('admission_no') course = request.POST.get("course") print(type(request.POST.get('year'))) - year = int(request.POST.get('year')) + level = int(request.POST.get('year')) pic = request.FILES.get('pic') - print(pic, end="$$$$$$$$$$$$$$$$") - profile = Student.objects.create( - - admission_no=admission_no, - name=name, - course=course, - year=year, - photo_url=pic, - user = current_user - ) - - # profile.user = current_user - profile.user.updated_profile = True - current_user.save() - - + if not current_user.updated_profile: + profile = Student.objects.create( + + admission_no=admission_no, + name=name, + course=course, + year=level, + photo_url=pic, + user=current_user + + ) + profile.user.updated_profile = True + current_user.save() + else: + student = Student.objects.get( + admission_no=current_user.student.admission_no) + student.admission_no = admission_no + student.name = name + student.course = course + student.year = level + student.photo_url = pic + student.save() return render(request, 'app/student_profile.html', locals()) + @login_required(login_url='/attachment/login/') def add_logbook(request): - + current_user = request.user if request.method == 'POST': activity = request.POST.get('activity') date = request.POST.get('date') - + log_book = LogBook.objects.create( - - activity = activity, - date = date, - student = request.user.student + + activity=activity, + date=date, + student=request.user.student ) return render(request, 'app/add-logbook.html', locals()) - + @login_required(login_url='/attachment/login/') def search_logbook(request): @@ -137,20 +152,150 @@ def search_logbook(request): if request.method == 'POST': from_date = request.POST.get('from') to_date = request.POST.get('to') - log_books = LogBook.objects.filter(date__range=(from_date, to_date)) + log_books = LogBook.objects.filter(date__range=( + from_date, to_date), student=current_user.student) return render(request, "app/view-logbooks.html", locals()) - return render(request, "app/view-logbooks.html", locals()) + return render(request, "app/view-logbooks.html", locals()) + def view_comments(request): pass -#Supervisor Commednts +# Supervisor views -def supervisor_dashboard(): - pass -def supervisor_feedback(): - pass +def supervisor_dashboard(request): + supervisor = request.user.supervisor + if not request.user.updated_profile: + messages.success( + request, f'update your profile detail') + return redirect('supervisor_profile') + students = User.objects.filter(user_type='student')[::-1] + return render(request, "app/supervisor-dashboard.html", locals()) + + +@login_required(login_url='/attachment/login/') +def supervisor_profile(request): + current_user = request.user + profile = Supervisor.objects.filter(user=current_user) + + if request.method == 'POST': + name = request.POST.get('name') + position = request.POST.get('position') + phone = request.POST.get("phone") + pic = request.FILES.get('pic') + + if not current_user.updated_profile: + profile = Supervisor.objects.create( + + name=name, + postion=position, + phone=phone, + photo_url=pic, + user=current_user + + ) + profile.user.updated_profile = True + current_user.save() + else: + supervisor = Supervisor.objects.get( + pk=current_user.pk) + + supervisor.name = name + supervisor.postion = position + supervisor.phone = phone + supervisor.photo_url = pic + supervisor.save() + return render(request, 'app/supervisor_profile.html', locals()) -def supervisor_profile(): - pass \ No newline at end of file + +def supervisor_feedback(request, email): + student = User.objects.get(email=email).student + log_books = None + if request.method == 'POST': + from_date = request.POST.get('from') + to_date = request.POST.get('to') + print(f'from {from_date} , end {to_date} {student}') + log_books = LogBook.objects.filter( + date__range=(from_date, to_date), student=student) + return render(request, "app/logbook_feedback.html", locals()) + + +def logbook_comment(request, log_id): + supervisor = request.user.supervisor + logbook = get_object_or_404(LogBook, pk=log_id) + if request.method == 'POST': + comment = Comments.objects.create( + + comment=request.POST.get('comment'), + logbook=logbook, + supervisor=supervisor + ) + logbook.status = True + logbook.save() + next_url = request.POST.get('next') + # if not next_url or not is_safe_url(url=next_url, allowed_hosts=request.get_host()): + # next_url = reverse('supervisor_dashboard') + return HttpResponseRedirect(next_url) + + +def employer_dashboard(request): + current_user = request.user + if not request.user.updated_profile: + messages.success( + request, f'update your profile detail') + return redirect('employer_profile') + students = User.objects.filter(user_type='student')[::-1] + + return render(request, "app/employer_dashboard.html", locals()) + + +@login_required(login_url='/attachment/login/') +def employer_profile(request): + current_user = request.user + profile = Employer.objects.filter(user=current_user) + + if request.method == 'POST': + name = request.POST.get('name') + organisation = request.POST.get('organisation') + position = request.POST.get('position') + phone = request.POST.get("phone") + pic = request.FILES.get('pic') + + if not current_user.updated_profile: + profile = Employer.objects.create( + + name=name, + postion=position, + organisation=organisation, + phone=phone, + photo_url=pic, + user=current_user + + ) + profile.user.updated_profile = True + current_user.save() + else: + employer = Employer.objects.get( + pk=current_user.pk) + + employer.name = name + employer.organisation=organisation + employer.postion = position + employer.phone = phone + employer.photo_url = pic + employer.save() + return render(request, 'app/employer_profile.html', locals()) + + +def employer_comment(request, email): + current_user = request.user + student = User.objects.get(email=email).student + if request.method == 'POST': + comment = EmployerComment.objects.create( + + comment=request.POST.get('feedback'), + student = student + ) + return redirect('employer_dashboard') + return render(request, "app/employer_comment.html", locals()) From c6081df67a70af4edec8463e819e7453980b9e15 Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Mon, 9 Jan 2023 08:55:45 +0300 Subject: [PATCH 48/49] Adds html templates for Student, Employer and Supervisor views --- backend/templates/app/add-logbook.html | 106 ++++++- backend/templates/app/attachment.html | 2 +- backend/templates/app/base.html | 0 backend/templates/app/employer_comment.html | 109 ++++++++ backend/templates/app/employer_dashboard.html | 161 +++++++++++ backend/templates/app/employer_profile.html | 189 +++++++++++++ backend/templates/app/logbook_feedback.html | 258 ++++++++++++++++++ backend/templates/app/login.html | 8 +- backend/templates/app/student_profile.html | 214 ++++++++++----- .../templates/app/supervisor-dashbaoard.html | 0 .../templates/app/supervisor-dashboard.html | 257 +++++++++++++++++ backend/templates/app/supervisor_profile.html | 180 ++++++++++++ backend/templates/app/view-logbooks.html | 45 ++- 13 files changed, 1443 insertions(+), 86 deletions(-) delete mode 100644 backend/templates/app/base.html create mode 100644 backend/templates/app/employer_comment.html create mode 100644 backend/templates/app/employer_dashboard.html create mode 100644 backend/templates/app/employer_profile.html create mode 100644 backend/templates/app/logbook_feedback.html delete mode 100644 backend/templates/app/supervisor-dashbaoard.html create mode 100644 backend/templates/app/supervisor-dashboard.html create mode 100644 backend/templates/app/supervisor_profile.html diff --git a/backend/templates/app/add-logbook.html b/backend/templates/app/add-logbook.html index f5fec0f..5986220 100644 --- a/backend/templates/app/add-logbook.html +++ b/backend/templates/app/add-logbook.html @@ -17,10 +17,87 @@

-
+
-
+ +
+

UPDATE LOGBOOK

+
{% csrf_token %}
@@ -30,6 +107,7 @@ placeholder="date" name="date" class="form-control" + id="date" />
@@ -53,10 +131,34 @@
+
+ + + + + + + diff --git a/backend/templates/app/attachment.html b/backend/templates/app/attachment.html index 1a0d27e..8597e58 100644 --- a/backend/templates/app/attachment.html +++ b/backend/templates/app/attachment.html @@ -41,7 +41,7 @@ " > + + + + + + + + Employer Dashboard + + + + + + +
+ + +
+
FEEDBACK:
+
+ {% csrf_token %} + + +
+
+
+ + + + + + + + + diff --git a/backend/templates/app/employer_dashboard.html b/backend/templates/app/employer_dashboard.html new file mode 100644 index 0000000..93deb3f --- /dev/null +++ b/backend/templates/app/employer_dashboard.html @@ -0,0 +1,161 @@ +{%load static%} + + + + + + + + + Employer Dashboard + + + + + +
+ + + +
+ + + + + + + + + + + + {%for student in students %} {%if student.student.photo_url %} + + + + + + + + {% endif %} {% endfor %} + +
Student RegistrationStudent NameDepartmentStatusAction
+
+    +
+

+

{{student.student.admission_no}}

+
+
+
+

{{student.student.name}}

+
+
+

+ {{student.student.attachment.department_name}} +

+
+
+

+ {% if student.student.employercomment.comment%} + + {% else %} + Awaiting Approval ... + {% endif %} +

+
+ + view + +
+
+
+ + + + + + + + diff --git a/backend/templates/app/employer_profile.html b/backend/templates/app/employer_profile.html new file mode 100644 index 0000000..258adb1 --- /dev/null +++ b/backend/templates/app/employer_profile.html @@ -0,0 +1,189 @@ +{% load static%} + + + + + + + Add-attachement + + + {% comment %} + + {% endcomment %} + + + +
+
+ +
+ {%if current_user.employer.photo_url %} +
+ John +
+

{{current_user.employer.name}}

+

{{current_user.employer.postion}}, {{current_user.employer.organisation}}

+

+ Contact: + {{current_user.employer.phone}} +

+
+
+ {% else %} +
+

+ No profile +

+ John Doe +
+ {% endif %} +
+
+

UPDATE PROFILE

+ {% csrf_token %} +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+
+ + + + + + + + + diff --git a/backend/templates/app/logbook_feedback.html b/backend/templates/app/logbook_feedback.html new file mode 100644 index 0000000..9a44e0c --- /dev/null +++ b/backend/templates/app/logbook_feedback.html @@ -0,0 +1,258 @@ +{% load static%} + + + + + + + supervisor + + + + + + +
+

+
+
+
+
+
+ + + +
STUDENT NAME:  
+
+ COURSE OF STUDY: INFORMATION TECHNOLOGY +
+
+
+
+ +
+ {% csrf_token %} + + +   --   TO:   + +     + +
+
+
+
+ + + + + + + + + + {% for logbook in log_books %} + + + + + + + {%endfor %} + +
DAYACTIVITIESSTATUS
+

+ {{logbook.date | date:"l" }} +

+
+

{{logbook.activity}}

+
+ + + + {% if logbook.status%} + + {% else %} + pending ... + {% endif %} +
+
+
+
+
+
+
+
+ + + + + + + + + + diff --git a/backend/templates/app/login.html b/backend/templates/app/login.html index 27d6815..c5c2bfe 100644 --- a/backend/templates/app/login.html +++ b/backend/templates/app/login.html @@ -9,10 +9,12 @@ - {% if messages %} {% for message in messages %} -
{{ message }}
- {% endfor %} {% endif %} +
+ {% if messages %} {% for message in messages %} +
{{ message }} +
+ {% endfor %} {% endif %}

ATTACHMENT MANAGEMENT SYSTEM

- + {% comment %} + {% endcomment %} + - -
-
-
-
-
-

UPDATE PROFILE

- -
- {% csrf_token %} -
- -
-
- -
-
- -
-
- -
-
- -
- -
+ +
+
+ +
+ {%if current_user.student.photo_url %} +
+ John +
+

{{current_user.student.name}}

+

{{current_user.student.admission_no}}

+

+ {{current_user.student.course}}, Year + {{current_user.student.year}} +

+
-
+ {% else %} +
+

+ No profile +

+ John Doe +
+ {% endif %}
+
+

UPDATE PROFILE

+ {% csrf_token %} +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
-
+
+ diff --git a/backend/templates/app/supervisor-dashbaoard.html b/backend/templates/app/supervisor-dashbaoard.html deleted file mode 100644 index e69de29..0000000 diff --git a/backend/templates/app/supervisor-dashboard.html b/backend/templates/app/supervisor-dashboard.html new file mode 100644 index 0000000..7cfe0de --- /dev/null +++ b/backend/templates/app/supervisor-dashboard.html @@ -0,0 +1,257 @@ +{% load static%} + + + + + + + supervisor + + + + + + +
+
+ +
+ +

Submissions

+ + + + + + + + + + + {%for student in students %} {%if student.student.photo_url %} + + + + + + + + {% endif %} {% endfor %} + +
Student AdmissionStudent NameDepartmentLogbook
+
+ +
+

+

+ {{student.student.admission_no}} +

+ +
+
+
{{student.student.name}} +
+

+ {{student.student.attachment.department_name}} +

+
+
+ + view + +
+
+
+ +
+ + + + + + + + + diff --git a/backend/templates/app/supervisor_profile.html b/backend/templates/app/supervisor_profile.html new file mode 100644 index 0000000..46d178a --- /dev/null +++ b/backend/templates/app/supervisor_profile.html @@ -0,0 +1,180 @@ +{% load static%} + + + + + + + Add-attachement + + + {% comment %} + + {% endcomment %} + + + +
+
+ +
+ {%if current_user.supervisor.photo_url %} +
+ John +
+

{{current_user.supervisor.name}}

+

{{current_user.supervisor.postion}}

+

+ Contact: + {{current_user.supervisor.phone}} +

+
+
+ {% else %} +
+

+ No profile +

+ John Doe +
+ {% endif %} +
+
+

UPDATE PROFILE

+ {% csrf_token %} +
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+
+ + + + + + + + + diff --git a/backend/templates/app/view-logbooks.html b/backend/templates/app/view-logbooks.html index 4b4b564..9f892dd 100644 --- a/backend/templates/app/view-logbooks.html +++ b/backend/templates/app/view-logbooks.html @@ -58,15 +58,7 @@ width="100px" alt="Avattar" /> - {% endif %} {% comment %} - - {% endcomment %} + {% endif %}
{% endcomment %} + + + + + + + From cb8aaeec69bb38a814b06f1deb29259e80bd454f Mon Sep 17 00:00:00 2001 From: Daniel Karani Date: Mon, 9 Jan 2023 08:58:22 +0300 Subject: [PATCH 49/49] Adds styling for the templates --- backend/app/static/css/profile.css | 186 ++++++++++++++++ backend/app/static/css/styles.css | 341 +++++++++++++++++++++++++++++ backend/app/static/css/styles1.css | 296 +++++++++++++++++++++++++ 3 files changed, 823 insertions(+) create mode 100644 backend/app/static/css/profile.css create mode 100644 backend/app/static/css/styles.css create mode 100644 backend/app/static/css/styles1.css diff --git a/backend/app/static/css/profile.css b/backend/app/static/css/profile.css new file mode 100644 index 0000000..e219a6a --- /dev/null +++ b/backend/app/static/css/profile.css @@ -0,0 +1,186 @@ + +.helptext { + display: none; +} +.my_warapper { + height: auto; + width: 100%; + position: absolute; + background-image: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)), + url(../images/profile.jpg); + background-size: cover; + background-position: center; +} + +.form-box { + width: 400px; + height: 75vh; + position: relative; + margin: 6% auto; + background: white; + padding: 5px; + overflow: hidden; + box-shadow: 7px 4px 8px 0 rgba(0, 0, 0, 0.2); + border-radius: 5px; + overflow-y: scroll; + +} + +.form-box::-webkit-scrollbar { + width: 10px; + + } + + .form-box::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 10px; + } + + .form-box::-webkit-scrollbar-thumb { + background: #888; + } + +.button-box { + width: 200px; + margin: 20px auto; + position: relative; + box-shadow: 0 0 20px 9px whitesmoke; + border-radius: 30px; +} + +.toggle-btn { + padding: 10px 30px; + cursor: pointer; + background: transparent; + outline: none; + position: relative; +} + +#btn { + top: 0; + left: 0; + position: absolute; + width: 110px; + height: 100%; + background: linear-gradient(to right, green, peru); + border-radius: 30px; + transition: 0.5s; +} + +h1 { + margin-top: 17px; + padding: 0 0 20px; + text-align: center; + font-size: 12px; + color: green; +} + +.input-group { + top: 100px; + position: absolute; + width: 280px; + transition: 0.5s; +} + +.input-field { + width: 100%; + padding: 10px 0; + margin: 5px 0; + border-left: 0; + border-top: 0; + border-right: 0; + border-bottom: 1px solid #999; + outline: none; + background: transparent; +} + +.submit-btn { + width: 75%; + padding: 10px 30px; + cursor: pointer; + display: block; + margin: auto; + background: green; + border: 0; + outline: none; + color: #fff; + border-radius: 20px; + margin-top: 26px; + margin-bottom: 4px; +} + +.submit-btn:hover { + cursor: pointer; + background: green; + color: black; +} + +.chech-box { + margin: 30px 10px 30px 0; +} + +span { + color: #777; + font-size: 12px; + bottom: 64px; + position: absolute; +} + +#login { + left: 50px; + margin-top: 20px; +} +#signup { + left: 450px; +} + +#logo { + display: block; + margin-left: auto; + margin-right: auto; + margin-top: 17px; + width: 31%; +} + +#logoLogin { + display: block; + margin-left: auto; + margin-right: auto; + width: 31%; +} + + +#card { + box-shadow: 7px 4px 8px 0 rgba(0, 0, 0, 0.2); + max-width: 300px; + margin: auto; + text-align: center; + } + + .title { + color: grey; + font-size: 18px; + } + + #cardbtn { + border: none; + outline: 0; + display: inline-block; + padding: 8px; + color: white; + background-color: #000; + text-align: center; + cursor: pointer; + width: 100%; + font-size: 18px; + } + + #card a { + text-decoration: none; + font-size: 22px; + color: black; + } + + #cardbtn:hover, #card a:hover { + opacity: 0.7; + } \ No newline at end of file diff --git a/backend/app/static/css/styles.css b/backend/app/static/css/styles.css new file mode 100644 index 0000000..57dd455 --- /dev/null +++ b/backend/app/static/css/styles.css @@ -0,0 +1,341 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Roboto', sans-serif; + +} + +body{ + min-height: 100vh; + width: 100%; + -webkit-font-smoothing: antialiased; +} + +.sidebar{ + position: fixed; + height: 100%; + width: 240px; + background: green; + transition:all 0.5s ease; +} + + +.sidebar.active{ + width: 60px; +} + +.sidebar .profile-details{ + display: flex; + align-items: center; + height: 50px; + min-width: 190px; + background:green; + border-radius: 50%; + padding: 0 15px 0 2px; + justify-content: center; + margin-top: 40px; + + +} + +.sidebar .profile-details img{ + height: 80px; + width: 80px; + object-fit: cover; + border-radius: 50%; +} + + + + + +.sidebar .nav-links{ + margin-top: 50px; +} + +.sidebar .nav-links li{ + height: 50px; + width: 100%; + list-style: none; +} + +.sidebar .nav-links li a{ + height: 100%; + width: 100%; + display: flex; + align-items: center; + text-decoration: none; + transition: all 0.4s ease; +} + +.sidebar .nav-links li a:hover{ + background: lightgreen; +} + +.sidebar .nav-links li a i{ + /* background: whitesmoke;*/ + min-width: 60px; + text-align: center; + color: #fff; + font-size: 18px; +} + +.sidebar .nav-links li a .link_name{ + color: #fff; + font-size: 15px; + font-weight: 400; + white-space: nowrap; +} + +.submit-btn { + width: 55%; + padding: 10px 30px; + cursor: pointer; + display: block; + margin: auto; + background:green; + border: 0; + outline: none; + color: whitesmoke; + border-radius: 2px; + margin-top: 80px; + font-weight: 400; + font-size: 15px; + align-items: center; + white-space: nowrap; +} + +.submit-btn:hover { + cursor:pointer; + background:whitesmoke; + color: black; +} +/* Home-section css */ +.home-section{ + background: #f5f5f5; + position: relative; + min-height: 100vh; + width: calc(100% - 240px); + left: 240px; + transition: all 0.5s ease; +} + +.sidebar.active ~ .home-section{ + width: calc(100% - 60px); + left: 60px; +} + + +.home-section nav{ + position: fixed; + width: calc(100% - 24px); + left: 240px; + height: 80px; + background: #fff; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: space-between; + transition: all 0.5s ease; + z-index: 100; +} + +.sidebar.active ~ .home-section nav{ + width: calc(100% - 60px); + left: 60px; +} + +.home-section nav .sidebar-button{ + display: flex; + align-items: center; + font-size: 24px; + font-weight: 500; +} + +.home-section nav .sidebar-button i{ + font-size: 35px; + margin-right: 10px; +} + + +.home-section .home-content{ + position: relative; + padding-top: 20px; +} + + + + +.home-section .interns-boxes{ + display: flex; + justify-content: space-between; + padding: 1px; + +} + +.home-section .interns-boxes .recent-intern{ + width: 100%; + background: #fff; + border-radius: 12px; + box-shadow: 0 5px 10px rgba(0,0,0,0.1); + padding: 110px; +} + + + +.home-section .interns-boxes .interns-details{ + display: flex; + justify-content: space-between; + align-items: center; +} + +.home-section .interns-boxes .box .title{ + font-size: 24px; + font-weight: 500; +} + +.home-section .interns-boxes .box .topic{ + font-size: 20px; + font-weight: 500; +} + +.home-section .interns-boxes .box li{ + list-style: none; + margin: 10px 0; + padding: 2px 12px; + margin-top: 4px; +} + +.interns-boxes .box li a{ + color: #333; + font-size: 18px; + font-weight: 400; + text-decoration: none; + +} + +.home-section .interns-boxes .box .button li{ + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + + + +} + +.interns-boxes .box .button li a{ + font-size: 18px; + font-weight: 400; + + color: #fff; + background:#008000; + padding: 2px 12px; + margin-top: 4px; + text-decoration: none; + border-radius: 4px; + transition: all 0.3s ease; +} + +.interns-boxes .box .button a:hover{ + background: peru; + +} + +/*right side*/ +.home-section .interns-boxes .workshops-intern{ + width: 35%; + margin-left: 20px; + background: #fff; + box-shadow: 0 5px 10px rgba(0,0,0,0.1); + padding: 20px; + border-radius: 12px; +} + +.interns-boxes .workshops-intern li{ + display: flex; + align-items: center; + justify-content: space-between; +} + +.interns-boxes .workshops-intern li a{ + display: flex; + align-items: center; +} + +.interns-boxes .workshops-intern img{ + margin-right: 8px; + height: 40px; + width: 40px; + border-radius: 4px; + object-fit: cover; +} + + +/*Responsive media query */ +@media (max-width: 1316px) { + .sidebar{ + width: 220px; + } + .sidebar.active{ + width: 220px; + } + .home-section{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section{ + width: calc(100% - 220px); + left: 220px; + } + .home-section nav{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section nav{ + width: calc(100% - 220px); + left: 220px; + } +} + +@media (max-width: 1078px) { + .home-section .interns-boxes { + flex-direction: column; + } + .home-section .interns-boxes .box{ + margin-bottom: 20px; + width: 100%; + overflow-x: scroll; + } + .home-section .interns-boxes .workshops-intern{ + margin-left: 0; + } +} +@media (max-width: 1018px) { + .home-section .overview-boxes .box{ + width: calc(100% / 2 - 15px); + margin-bottom: 15px; + } +} +@media (max-width: 648px) { + .home-section nav .sidebar-button .dashboard, + nav .profile-details .admin_name, + nav .profile-details i{ + display: none; + } + .home-section nav .profile-details{ + min-width: 50px; + height: 50px; + } + .home-section .overview-boxes .box{ + width: 100%; + margin-bottom: 15px; + } + .home-section .interns-boxes .interns-details{ + width: 590px; + } +} + diff --git a/backend/app/static/css/styles1.css b/backend/app/static/css/styles1.css new file mode 100644 index 0000000..fc6ab62 --- /dev/null +++ b/backend/app/static/css/styles1.css @@ -0,0 +1,296 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap'); + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Roboto', sans-serif; + +} + +body{ + min-height: 100vh; + width: 100%; + -webkit-font-smoothing: antialiased; +} + +.sidebar{ + position: fixed; + height: 100%; + width: 240px; + background: green; + transition:all 0.5s ease; +} + + +.sidebar.active{ + width: 60px; +} + + + +.sidebar .profile-details{ + display: flex; + align-items: center; + height: 50px; + min-width: 190px; + background:green; + border-radius: 50%; + padding: 0 15px 0 2px; + justify-content: center; + margin-top: 40px; + + +} + +.sidebar .profile-details img{ + height: 80px; + width: 80px; + object-fit: cover; + border-radius: 50%; +} + + + +.sidebar .nav-links{ + margin-top: 50px; +} + +.sidebar .nav-links li{ + height: 50px; + width: 100%; + list-style: none; +} + +.sidebar .nav-links li a{ + height: 100%; + width: 100%; + display: flex; + align-items: center; + text-decoration: none; + transition: all 0.4s ease; +} + +.sidebar .nav-links li a:hover{ + background: lightgreen; +} + +.sidebar .nav-links li a i{ + /* background: whitesmoke;*/ + min-width: 60px; + text-align: center; + color: #fff; + font-size: 18px; +} + +.sidebar .nav-links li a .link_name{ + color: #fff; + font-size: 15px; + font-weight: 400; + white-space: nowrap; +} + +.submit-btn{ + width: 55%; + padding: 10px 30px; + cursor: pointer; + display: block; + margin: auto; + background:green; + border: 0; + outline: none; + color: whitesmoke; + border-radius: 2px; + margin-top: 80px; + font-weight: 400; + font-size: 15px; + align-items: center; +} + +.submit-btn:hover{ + cursor:pointer; + background:whitesmoke; + color: black; +} + +/* Home-section css */ +.home-section{ + background: #f5f5f5; + position: relative; + min-height: 100vh; + width: calc(100% - 240px); + left: 240px; + transition: all 0.5s ease; +} + +.sidebar.active ~ .home-section{ + width: calc(100% - 60px); + left: 60px; +} + + +.home-section nav{ + position: fixed; + width: calc(100% - 24px); + left: 240px; + height: 80px; + background: #fff; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: space-between; + transition: all 0.5s ease; + z-index: 100; +} + +.sidebar.active ~ .home-section nav{ + width: calc(100% - 60px); + left: 60px; +} + +.home-section nav .sidebar-button{ + display: flex; + align-items: center; + font-size: 24px; + font-weight: 500; +} + +.home-section nav .sidebar-button i{ + font-size: 35px; + margin-right: 10px; +} + + + + + + + + +.comment-box { + top: 50%; + left: 50%; + position: absolute; + transform: translate(-50%, -50%); + width: 500px; +} +.comment-box h2 { + font-size: 20px; + font-weight: 500; + margin-bottom: 15px; +} +.comment-box input { + width: 100%; + height: 50px; + padding: 0 20px; + margin-bottom: 15px; + border-radius: 5px; + border: 1px solid #86b0b6; +} +.comment-box input:focus { + border: 1px solid #000; + outline: 0; +} +.comment-box textarea { + width: 100%; + height: 150px; + padding: 15px 20px; + margin-bottom: 10px; + border-radius: 5px; + border: 1px solid #86b0b6 ; +} +.comment-box textarea:focus { + border: 1px solid #000; + outline: 0; +} +.comment-box button { + border: 0; + padding: 10px 30px; + background: green; + font-size: 18px; + border-radius: 5px; + color: whitesmoke; + margin-top: 20px; +} +.comment-box button:hover { + background-color: peru; +} + + + + + + + + + + + + + + + +/*Responsive media query */ +@media (max-width: 1316px) { + .sidebar{ + width: 220px; + } + .sidebar.active{ + width: 220px; + } + .home-section{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section{ + width: calc(100% - 220px); + left: 220px; + } + .home-section nav{ + width: calc(100% - 60px); + left: 60px; + } + .sidebar.active ~ .home-section nav{ + width: calc(100% - 220px); + left: 220px; + } +} + +@media (max-width: 1078px) { + .home-section .comment-box { + flex-direction: column; + } + .home-section .comment-box h2{ + margin-bottom: 20px; + width: 100%; + overflow-x: scroll; + } + .home-section .comment-box input{ + margin-left: 0; + } +} +@media (max-width: 1018px) { + .home-section .comment-box input{ + width: calc(100% / 2 - 15px); + margin-bottom: 15px; + } +} +@media (max-width: 648px) { + .home-section nav .sidebar-button .dashboard, + nav .profile-details .admin_name, + nav .profile-details i{ + display: none; + } + .home-section nav .profile-details{ + min-width: 50px; + height: 50px; + } + .home-section .comment-box { + width: 100%; + margin-bottom: 15px; + } + .home-section .comment-box input{ + width: 500px; + } + +} \ No newline at end of file