diff --git a/backend/blueprints/project.py b/backend/blueprints/project.py
index c07d6fabe02a2991791384f6aece15f1ed3edddf..c17fba27fa890d98a47dfb0448059d80739c2637 100644
--- a/backend/blueprints/project.py
+++ b/backend/blueprints/project.py
@@ -4,6 +4,7 @@ from backend.database_config.database import DB
 from backend.models.project_model import Project
 from backend.models.task_model import Task
 from backend.models.user_model import User_project
+from backend.models.task_model import AssignedTask
 
 project = Blueprint('project', __name__)
 
@@ -61,12 +62,19 @@ def update_project(project_id):
 
 @project.route('/projects/<project_id>', methods=['DELETE'])
 def delete_project(project_id):
-  tasks = Task.query.filter_by(project_id=project_id)
-  for task in tasks:
-    DB.delete(task)
+  
   assignments = User_project.query.filter_by(project_id=project_id)
   for assignment in assignments:
     DB.delete(assignment)
+  
+  
+  tasks = Task.query.filter_by(project_id=project_id)
+  for task in tasks:
+    assigned_tasks = AssignedTask.query.filter_by(task_id=task.id)
+    for assignment in assigned_tasks:
+      DB.delete(assignment)
+    DB.delete(task)
+
   entry = Project.query.get(project_id)
   DB.delete(entry)
   return ''
diff --git a/backend/static/react/asset-manifest.json b/backend/static/react/asset-manifest.json
index 44c4cb9e3240881f32eaba65f6a45fb4f880d2d1..05c32d1d48cd91990392999447b41d4718cb7f49 100644
--- a/backend/static/react/asset-manifest.json
+++ b/backend/static/react/asset-manifest.json
@@ -1,8 +1,8 @@
 {
   "files": {
     "main.css": "/static/react/css/main.599c7cc1.chunk.css",
-    "main.js": "/static/react/js/main.4429b17a.chunk.js",
-    "main.js.map": "/static/react/js/main.4429b17a.chunk.js.map",
+    "main.js": "/static/react/js/main.8ac766d6.chunk.js",
+    "main.js.map": "/static/react/js/main.8ac766d6.chunk.js.map",
     "runtime-main.js": "/static/react/js/runtime-main.094287be.js",
     "runtime-main.js.map": "/static/react/js/runtime-main.094287be.js.map",
     "js/2.49ea22cc.chunk.js": "/static/react/js/2.49ea22cc.chunk.js",
@@ -17,6 +17,6 @@
     "js/runtime-main.094287be.js",
     "js/2.49ea22cc.chunk.js",
     "css/main.599c7cc1.chunk.css",
-    "js/main.4429b17a.chunk.js"
+    "js/main.8ac766d6.chunk.js"
   ]
 }
\ No newline at end of file
diff --git a/backend/static/react/js/main.4429b17a.chunk.js b/backend/static/react/js/main.4429b17a.chunk.js
deleted file mode 100644
index 03b5a32c3718cb9246a048560095dc385625cc63..0000000000000000000000000000000000000000
--- a/backend/static/react/js/main.4429b17a.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(this["webpackJsonpinaglobe-dashboard"]=this["webpackJsonpinaglobe-dashboard"]||[]).push([[0],{38:function(e,t,n){},72:function(e,t,n){"use strict";n.r(t);var r=n(1),c=n.n(r),s=n(16),a=n.n(s),i=(n(38),n(4)),o=n(6),l=n(3);function j(){var e=Object(r.useState)(function(){var e=localStorage.getItem("token"),t=JSON.parse(e);return null===t||void 0===t?void 0:t.token}()),t=Object(l.a)(e,2),n=t[0],c=t[1];return{setToken:function(e){localStorage.setItem("token",JSON.stringify(e)),c(e.token)},token:n}}var d=n(0),u=function(){var e=j(),t=(e.setToken,e.token);return Object(d.jsxs)("nav",{className:"navbar",children:[Object(d.jsx)("a",{href:"/",style:{color:"#ff4e83",fontSize:"20px",borderRadius:"8px"},children:"InAGlobe Platform"}),Object(d.jsxs)("div",{className:"links",children:[Object(d.jsx)(i.b,{to:"/create-project",children:"New Project"}),Object(d.jsx)(i.b,{to:"/users/"+t,children:"My Profile"})]})]})},b=function(e){var t=e.projects,n=e.title;return Object(d.jsxs)("div",{className:"project-list",children:[Object(d.jsx)("h2",{children:n}),t.map((function(e){return Object(d.jsx)("div",{className:"preview",children:Object(d.jsxs)(i.b,{to:"/projects/".concat(e.id),children:[Object(d.jsx)("h2",{children:e.name}),Object(d.jsx)("h3",{children:e.status})]})},e.id)}))]})},h=function(e){var t=Object(r.useState)([]),n=Object(l.a)(t,2),c=n[0],s=n[1],a=Object(r.useState)(null),i=Object(l.a)(a,2),o=i[0],j=i[1],d=Object(r.useState)(!0),u=Object(l.a)(d,2),b=u[0],h=u[1];return Object(r.useEffect)((function(){fetch(e).then((function(e){if(!e.ok)throw Error("could not fetch the data for that resource");return e.json()})).then((function(e){s(e),h(!1),j(null)})).catch((function(e){j(e.message)}))}),[e]),{data:c,error:o,isPending:b}},O=function(e){var t=e.task_id,n=(e.title,h("/assigned_task/task/"+t)),r=n.data;n.error,n.isPending;return r.map((function(e){return Object(d.jsx)("div",{className:"assigned_users_list",children:Object(d.jsx)(i.b,{to:"/users/".concat(e.username),children:Object(d.jsxs)("h5",{children:[e.firstname," ",e.surname]})})})}))},p=function(e){var t=e.tasks,n=e.title;return Object(d.jsxs)("div",{children:[Object(d.jsx)("h2",{children:n}),Object(d.jsx)("div",{className:"my-project-tasks",children:t.map((function(e){return Object(d.jsxs)("div",{className:"task-preview",children:[Object(d.jsxs)("h2",{children:[e.project_name,": ",e.description]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Priority level:"})," ",e.priority]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{})," ",e.priority]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"To be done by:"})," ",e.due_date]}),Object(d.jsx)("h3",{children:"All volunteers assigned to this task: "}),Object(d.jsx)(O,{task_id:e.id}),Object(d.jsx)(i.b,{to:"/projects/".concat(e.project_id),children:Object(d.jsx)("h4",{children:"Click to see the project details"})})]},e.id)}))})]})},x=function(e){var t=e.todos,n=e.title,c=j(),s=(c.setToken,c.token),a=h("/users"),i=a.data,o=(a.error,a.isPending),u=Object(r.useState)(""),b=Object(l.a)(u,2),O=b[0],p=b[1],x=Object(r.useState)(1),m=Object(l.a)(x,2),f=m[0],v=m[1],g=Object(r.useState)(Date.now()),y=Object(l.a)(g,2),k=y[0],S=y[1],w=Object(r.useState)(s),C=Object(l.a)(w,2),N=C[0],P=C[1];return Object(d.jsxs)("div",{className:"todo-list",style:{float:"right"},children:[Object(d.jsx)("h2",{children:n}),Object(d.jsx)("div",{className:"add-todo-button",children:Object(d.jsx)("button",{onClick:function(){document.getElementsByClassName("add-todo-form")[0].style.display="block"},children:"Add a personal task"})}),t&&0===Object.keys(t).length&&Object(d.jsx)("h3",{style:{float:"right"},children:"Well done you have no ToDo items!"}),o&&Object(d.jsx)("h2",{children:"Loading..."}),Object(d.jsx)("div",{className:"add-todo-form",children:i&&Object(d.jsxs)("form",{onSubmit:function(e){document.getElementsByClassName("add-todo-form")[0].style.display="none",e.preventDefault();var t={todo_desc:O,priority:f,due_date:k,username:N};fetch("/todos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(){window.location.reload()}))},children:[Object(d.jsx)("label",{children:"Task description [required]"}),Object(d.jsx)("textarea",{value:O,onChange:function(e){return p(e.target.value)},required:!0,placeholder:"Add some awesome description!"}),Object(d.jsx)("label",{children:"Priority level (1: lowest, 4: highest)"}),Object(d.jsxs)("select",{value:f,onChange:function(e){return v(e.target.value)},children:[Object(d.jsx)("option",{value:"1",children:"1"}),Object(d.jsx)("option",{value:"2",children:"2"}),Object(d.jsx)("option",{value:"3",children:"3"}),Object(d.jsx)("option",{value:"4",children:"4"})]}),Object(d.jsx)("label",{children:"When should this task be done by? [required]"}),Object(d.jsx)("input",{required:!0,type:"date",value:k,onChange:function(e){return S(e.target.value)}}),Object(d.jsx)("label",{children:"Assigned user"}),Object(d.jsx)("select",{value:N,onChange:function(e){return P(e.target.value)},children:i.map((function(e){return Object(d.jsx)("option",{value:e.username,children:e.username})}))}),Object(d.jsx)("button",{children:"Save task"})]})}),Object(d.jsx)("div",{className:"personal-todos",children:t.map((function(e){return Object(d.jsxs)("div",{className:"todo-preview",children:[Object(d.jsx)("h2",{children:e.todo_desc}),Object(d.jsxs)("h3",{children:["Priority level: ",e.priority]}),Object(d.jsxs)("h3",{children:["To be done by: ",e.due_date]}),Object(d.jsx)("button",{onClick:(t=e.id,function(e){e.preventDefault(),fetch("/todos/"+t,{method:"DELETE"}).then((function(){window.location.reload()}))}),children:"Complete"})]},e.id);var t}))})]})},m=function(){var e=h("/todos"),t=e.data,n=(e.errorTodos,e.isPendingTodos),r=j(),c=(r.setToken,r.token),s=h("/user_project/username/"+c),a=s.data,i=(s.errorRProjects,s.isPendingRProjects),o=h("/assigned_task/username/"+c),l=o.data,u=(o.errorProjectTasks,o.isPendingProjectTasks,h("/users/name/"+c).data),O=u.firstname,m=(u.surname,t.filter((function(e){return e.username===c})));return Object(d.jsxs)("div",{className:"home",children:[Object(d.jsxs)("h1",{children:["Welcome back, ",O,"!"]}),console.log("Firstname: "),Object(d.jsxs)("div",{className:"home-projects",style:{float:"left",width:"600px"},children:[i&&Object(d.jsx)("h2",{children:"Loading..."}),a&&Object(d.jsx)(b,{projects:a,title:"My Projects"}),a&&0===Object.keys(a).length&&Object(d.jsx)("h3",{children:"You are not assigned to any project currently"})]}),Object(d.jsxs)("div",{className:"homeTodos",style:{float:"right",width:"300px"},children:[n&&Object(d.jsx)("h2",{children:"Loading..."}),t&&Object(d.jsx)(x,{todos:m,title:"Personal ToDo items"})]}),Object(d.jsxs)("div",{className:"home-project-tasks",style:{float:"left",width:"600px"},children:[i&&Object(d.jsx)("h2",{children:"Loading..."}),a&&Object(d.jsx)(p,{tasks:l,title:"My tasks from all projects"}),a&&0===Object.keys(l).length&&Object(d.jsx)("h3",{children:"Well done you have no project tasks!"})]})]})},f=n(5),v=n.n(f),g=n(8),y=n(18),k=function(){var e=Object(r.useState)(""),t=Object(l.a)(e,2),n=t[0],c=t[1],s=Object(r.useState)(""),a=Object(l.a)(s,2),i=a[0],j=a[1],u=Object(r.useState)("Available"),b=Object(l.a)(u,2),O=b[0],p=b[1],x=Object(r.useState)("Other"),m=Object(l.a)(x,2),f=m[0],k=m[1],S=Object(r.useState)(""),w=Object(l.a)(S,2),C=w[0],N=w[1],P=Object(r.useState)(""),T=Object(l.a)(P,2),_=T[0],A=T[1],D=Object(r.useState)([]),E=Object(l.a)(D,2),I=E[0],L=E[1],q=Object(o.f)(),V=h("/users/user_project"),F=V.data,B=(V.error,V.isPending,F.map((function(e){return e.username})),function(){var e=Object(g.a)(v.a.mark((function e(t){var r,c,s,a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),r={name:n,description:i,status:O,tag:f,location:C,files:_},e.next=4,fetch("/projects",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});case 4:return c=e.sent,e.next=7,c.json();case 7:s=e.sent,a=s.id,I.map((function(e){var t={username:e,project_id:a};fetch("/user_project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})})),q.push("/");case 11:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}());return Object(d.jsxs)("div",{className:"create-project",children:[Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Add a new project"}),Object(d.jsxs)("form",{onSubmit:B,children:[Object(d.jsx)("label",{children:"Project name [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:n,onChange:function(e){return c(e.target.value)},placeholder:"Input project name"}),Object(d.jsx)("label",{children:"Description [required]"}),Object(d.jsx)("textarea",{required:!0,placeholder:"Add some awesome description!",value:i,onChange:function(e){return j(e.target.value)}}),Object(d.jsx)("label",{children:"Status"}),Object(d.jsxs)("select",{value:O,onChange:function(e){return p(e.target.value)},children:[Object(d.jsx)("option",{value:"Progress",children:"Progress"}),Object(d.jsx)("option",{value:"Available",children:"Available"}),Object(d.jsx)("option",{value:"Completed",children:"Completed"})]}),Object(d.jsx)("label",{children:"Location"}),Object(d.jsx)("input",{type:"text",value:C,onChange:function(e){return N(e.target.value)},placeholder:"Eg: United Kingdom"}),Object(d.jsx)("label",{children:"Type of project [required]"}),Object(d.jsxs)("select",{required:!0,value:f,onChange:function(e){return k(e.target.value)},children:[Object(d.jsx)("option",{value:"Social",children:"Social"}),Object(d.jsx)("option",{value:"Education",children:"Education"}),Object(d.jsx)("option",{value:"Wash",children:"Wash"}),Object(d.jsx)("option",{value:"Environment",children:"Environment"}),Object(d.jsx)("option",{value:"Health",children:"Health"}),Object(d.jsx)("option",{value:"Other",children:"Other"})]}),Object(d.jsx)("label",{children:"Volunteers assigned to this project"}),Object(d.jsx)(y.a,{className:"dropdown",placeholder:"Select Users",value:F.filter((function(e){return I.includes(e.value)})),options:F,onChange:function(e){L(Array.isArray(e)?e.map((function(e){return e.value})):[])},isMulti:!0,isClearable:!0}),Object(d.jsx)("label",{children:"Google Drive folder"}),Object(d.jsx)("textarea",{placeholder:"Copy the link to the Google Drive folder for this project",value:_,onChange:function(e){return A(e.target.value)}}),Object(d.jsx)("button",{children:"Add project"})]})]})},S=function(){var e=Object(o.g)().id,t=Object(o.f)(),n=h("/projects/"+e),r=n.data,c=(n.error,n.isPending),s=h("/user_project/project/"+e),a=s.data;s.errorAssignment,s.isPendingAssignment;return Object(d.jsxs)("div",{className:"project-details",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(e){t.push("/")},children:"To Dashboard"})}),Object(d.jsx)("br",{}),c&&Object(d.jsx)("h2",{children:"Loading..."}),r&&Object(d.jsx)("h2",{children:r.name}),r&&Object(d.jsxs)("button",{style:{fontSize:"20px",color:"#fff",marginBottom:"30px",marginright:"10px",borderRadius:"8px",backgroundColor:"#f1b535",cursor:"default"},children:["Status: ",r.status]}),r&&Object(d.jsx)("button",{style:{fontSize:"20px",color:"#fff",marginBottom:"30px",marginRight:"10px",borderRadius:"8px",backgroundColor:"#595bc0",cursor:"default"},children:r.tag}),r&&Object(d.jsxs)("h4",{children:["Location: ",r.location]}),r&&Object(d.jsx)("button",{onClick:function(e){e.preventDefault(),window.open(r.files,"_blank")},children:"Documents"}),r&&Object(d.jsx)("p",{children:r.description}),Object(d.jsx)("h3",{children:"Volunteers working on this project"}),Object(d.jsx)("div",{className:"project_user_assignment_list",children:a.map((function(e){return Object(d.jsx)("div",{className:"assigned_users_preview",style:{float:"left",width:"50%"},children:Object(d.jsx)(i.b,{to:"/users/".concat(e.username),children:Object(d.jsx)("h4",{children:e.username})})},e.id)}))}),Object(d.jsxs)("div",{className:"project-tasks",children:[r&&Object(d.jsx)(i.b,{to:"/projects/".concat(r.id,"/tasks"),className:"view-tasks-button",children:"View Tasks"}),r&&Object(d.jsx)(i.b,{to:"/projects/".concat(r.id,"/add-task"),className:"add-task-button",children:"Add Task"})]}),Object(d.jsxs)("div",{children:[r&&Object(d.jsx)("button",{onClick:function(n){n.preventDefault(),fetch("/projects/"+e,{method:"DELETE"}).then((function(){t.push("/")}))},children:"Delete project"}),r&&Object(d.jsx)(i.b,{to:"/edit-project/".concat(r.id),className:"edit-project-button",children:"Edit project"})]})]})},w=function(){return Object(d.jsxs)("div",{className:"page-not-found",children:[Object(d.jsx)("h2",{children:"Something went wrong..."}),Object(d.jsx)("p",{children:"That page cannot be found"}),Object(d.jsx)(i.b,{to:"/",children:"Back to the main page"})]})},C=function(){var e=j(),t=(e.setToken,e.token),n=h("/users/"+t),r=n.data,c=(n.error,n.isPending);return Object(d.jsxs)("div",{className:"my-profile",children:[c&&Object(d.jsx)("h2",{children:"Loading..."}),r&&Object(d.jsx)("h2",{children:r.firstname+" "+r.surname}),r&&Object(d.jsx)("h1",{children:"Username: "+r.token}),r&&Object(d.jsx)("h1",{children:"Title: "+r.title}),r&&Object(d.jsx)("h1",{children:"Email: "+r.email}),r&&Object(d.jsx)("h1",{children:"Bio: "+r.bio}),r&&Object(d.jsx)("h1",{children:"Joined: "+r.joined}),r&&Object(d.jsx)("h1",{children:"Location: "+r.location}),r&&Object(d.jsx)("h1",{children:"Availability: "+r.availability}),r&&Object(d.jsx)("h1",{children:"Partnership Opportunities: "+r.partnership_opportunities}),r&&Object(d.jsx)("h1",{children:"Interests: "+r.interests})]})},N=function(){var e=Object(o.g)().username,t=Object(o.f)(),n=j(),r=(n.setToken,n.token),c=h("/users/"+e),s=c.data,a=(c.error,c.isPending);return Object(d.jsxs)("div",{className:"user",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(e){t.push("/users")},children:"To All Users"})}),Object(d.jsx)("br",{}),a&&Object(d.jsx)("h2",{children:"Loading..."}),s&&Object(d.jsx)("div",{children:Object(d.jsx)("h2",{children:s.firstname+" "+s.surname})}),s&&Object(d.jsxs)("div",{children:[Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Username: "}),s.username]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Email: "}),s.email]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Title: "}),s.title]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Joined: "}),s.joined]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Location: "}),s.location]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Availability: "}),s.availability]})]}),Object(d.jsx)("br",{}),s&&Object(d.jsxs)("div",{children:[Object(d.jsx)("label",{children:Object(d.jsx)("strong",{children:"Bio"})}),Object(d.jsx)("p",{children:s.bio})]}),s&&Object(d.jsxs)("div",{children:[Object(d.jsx)("label",{children:Object(d.jsx)("strong",{children:"Partnership Opportunities"})}),Object(d.jsx)("p",{children:s.partnership_opportunities})]}),s&&Object(d.jsxs)("div",{children:[Object(d.jsx)("label",{children:Object(d.jsx)("strong",{children:"Interests"})}),Object(d.jsx)("p",{children:s.interests})]}),s&&("jaimeaguilera"==r||e==r)&&Object(d.jsx)("button",{onClick:function(n){n.preventDefault(),fetch("/users/"+e,{method:"DELETE"}).then((function(){t.push("/")}))},children:"Delete user"}),s&&("jaimeaguilera"==r||e==r)&&Object(d.jsx)(i.b,{to:"/edit-user/".concat(e),className:"edit-user-button",children:"Edit details"})]})},P=function(e){var t=e.users;return Object(d.jsx)("div",{className:"user-list",children:t.map((function(e){return Object(d.jsx)("div",{className:"preview",children:Object(d.jsx)(i.b,{to:"/users/".concat(e.username),children:Object(d.jsx)("h2",{children:e.username})})},e.username)}))})},T=function(){var e=h("/users"),t=e.data,n=(e.error,e.isPending),r=j(),c=(r.setToken,r.token);return Object(d.jsxs)("div",{className:"users",children:[Object(d.jsx)("h1",{children:"Users"}),"jaimeaguilera"==c&&Object(d.jsx)(i.b,{to:"/add-user",className:"add-user-button",children:"Add User"}),Object(d.jsx)("br",{}),Object(d.jsx)("br",{}),n&&Object(d.jsx)("h2",{children:"Loading..."}),t&&Object(d.jsx)(P,{users:t,title:"All Users"})]})},_=function(){var e=Object(r.useState)(""),t=Object(l.a)(e,2),n=t[0],c=t[1],s=Object(r.useState)(""),a=Object(l.a)(s,2),i=a[0],j=a[1],u=Object(r.useState)(""),b=Object(l.a)(u,2),h=b[0],O=b[1],p=Object(r.useState)(""),x=Object(l.a)(p,2),m=x[0],f=x[1],v=Object(r.useState)(""),g=Object(l.a)(v,2),y=g[0],k=g[1],S=Object(r.useState)(""),w=Object(l.a)(S,2),C=w[0],N=w[1],P=Object(r.useState)(""),T=Object(l.a)(P,2),_=T[0],A=T[1],D=Object(r.useState)(Date.now()),E=Object(l.a)(D,2),I=E[0],L=E[1],q=Object(r.useState)(""),V=Object(l.a)(q,2),F=V[0],B=V[1],J=Object(r.useState)(""),U=Object(l.a)(J,2),W=U[0],G=U[1],M=Object(r.useState)(""),H=Object(l.a)(M,2),R=H[0],z=H[1],Y=Object(r.useState)(""),K=Object(l.a)(Y,2),Q=K[0],X=K[1],Z=Object(r.useState)(""),$=Object(l.a)(Z,2),ee=$[0],te=$[1],ne=Object(o.f)();return Object(d.jsxs)("div",{className:"add-user",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(e){ne.push("/users")},children:"To All Users"})}),Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Add a new user"}),Object(d.jsxs)("form",{onSubmit:function(e){e.preventDefault();var t={firstname:n,surname:i,password:h,title:m,email:y,phone_no:C,bio:_,joined:I,location:F,availability:W,partnership_opportunities:R,interests:Q,username:ee};fetch("/users",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(){ne.push("/users")}))},children:[Object(d.jsx)("label",{children:"Username [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:ee,onChange:function(e){return te(e.target.value)},placeholder:"Input username here"}),Object(d.jsx)("label",{children:"Firstname [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:n,onChange:function(e){return c(e.target.value)},placeholder:"Input your first name here"}),Object(d.jsx)("label",{children:"Surname [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:i,onChange:function(e){return j(e.target.value)},placeholder:"Input surname here"}),Object(d.jsx)("label",{children:"Title [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:m,onChange:function(e){return f(e.target.value)},placeholder:"State your role at InAGlobe (eg: volunteer)"}),Object(d.jsx)("label",{children:"Password [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:h,onChange:function(e){return O(e.target.value)},placeholder:"Input the default password (to be changed by the user)"}),Object(d.jsx)("label",{children:"Email [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:y,onChange:function(e){return k(e.target.value)},placeholder:"Input InAGlobe email here"}),Object(d.jsx)("label",{children:"Phone Number"}),Object(d.jsx)("input",{type:"text",value:C,onChange:function(e){return N(e.target.value)},placeholder:"Input your phone number"}),Object(d.jsx)("label",{children:"Bio"}),Object(d.jsx)("input",{type:"text",value:_,onChange:function(e){return A(e.target.value)},placeholder:"Tell your colleagues a bit about yourself"}),Object(d.jsx)("label",{children:"Joined [required]"}),Object(d.jsx)("input",{type:"date",required:!0,value:I,onChange:function(e){return L(e.target.value)},placeholder:"Eg: 20th April 2020"}),Object(d.jsx)("label",{children:"Location"}),Object(d.jsx)("input",{type:"text",value:F,onChange:function(e){return B(e.target.value)},placeholder:"Where are you currently based?"}),Object(d.jsx)("label",{children:"Availibility"}),Object(d.jsx)("input",{type:"text",value:W,onChange:function(e){return G(e.target.value)},placeholder:"How available are you approximately per week?"}),Object(d.jsx)("label",{children:"Partnership Opportunities"}),Object(d.jsx)("input",{type:"text",value:R,onChange:function(e){return z(e.target.value)},placeholder:"Eg: Department of Computing at Imperial College London"}),Object(d.jsx)("label",{children:"Interests"}),Object(d.jsx)("input",{type:"text",value:Q,onChange:function(e){return X(e.target.value)},placeholder:"What are your hobbies?"}),Object(d.jsx)("button",{children:"Add user"})]})]})},A=n(7),D=n(22),E=function(){var e=Object(o.g)().id,t=h("/projects/"+e),n=t.data,c=n.name,s=n.description,a=n.status,i=n.location,j=n.tag,u=n.files,b=(t.error,t.isPending),O=Object(r.useState)([]),p=Object(l.a)(O,2),x=p[0],m=p[1],f=h("/users/user_project"),v=f.data,g=(f.errorUsers,f.isPendingUsers,Object(o.f)()),k=Object(D.a)(),S=k.register,w=k.handleSubmit;return Object(d.jsxs)("div",{className:"edit-project",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(t){g.push("/projects/"+e)},children:"To Project Page"})}),Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Edit project"}),b&&Object(d.jsx)("h2",{children:"Loading..."}),c&&Object(d.jsxs)("form",{onSubmit:w((function(t){fetch("/projects/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(){x.map((function(t){var n={username:t,project_id:e};fetch("/user_project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)})}))})).then((function(){g.push("/projects")}))})),children:[Object(d.jsx)("label",{children:"Project name"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},S("name")),{},{placeholder:"Insert project name here",type:"text",defaultValue:c})),Object(d.jsx)("label",{children:"Description"}),Object(d.jsx)("textarea",Object(A.a)(Object(A.a)({},S("description")),{},{placeholder:"Insert description of the project here",defaultValue:s})),Object(d.jsx)("label",{children:"Status"}),Object(d.jsxs)("select",Object(A.a)(Object(A.a)({},S("status")),{},{defaultValue:a,children:[Object(d.jsx)("option",{value:"Progress",children:"Progress"}),Object(d.jsx)("option",{value:"Available",children:"Available"}),Object(d.jsx)("option",{value:"Completed",children:"Completed"})]})),Object(d.jsx)("label",{children:"Location"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},S("location")),{},{type:"text",placeholder:"Insert location of project here",defaultValue:i})),Object(d.jsx)("label",{children:"Type of project"}),Object(d.jsxs)("select",Object(A.a)(Object(A.a)({},S("tag")),{},{defaultValue:j,children:[Object(d.jsx)("option",{value:"Social",children:"Social"}),Object(d.jsx)("option",{value:"Education",children:"Education"}),Object(d.jsx)("option",{value:"Wash",children:"Wash"}),Object(d.jsx)("option",{value:"Environment",children:"Environment"}),Object(d.jsx)("option",{value:"Health",children:"Health"}),Object(d.jsx)("option",{value:"Other",children:"Other"})]})),Object(d.jsx)("label",{children:"Volunteers assigned to this project"}),Object(d.jsx)(y.a,{className:"dropdown",placeholder:"Select Users",value:v.filter((function(e){return x.includes(e.value)})),options:v,onChange:function(e){m(Array.isArray(e)?e.map((function(e){return e.value})):[])},isMulti:!0,isClearable:!0}),Object(d.jsx)("label",{children:"Google Drive folder"}),Object(d.jsx)("textarea",Object(A.a)(Object(A.a)({},S("files")),{},{placeholder:"Insert Google Drive Folder link here",defaultValue:u})),Object(d.jsx)("button",{type:"submit",children:"Save project details"})]})]})},I=n(33),L=function(){var e=Object(o.f)(),t=j(),n=(t.setToken,t.token);return Object(d.jsxs)(I.slide,{children:[Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)(i.b,{to:"/",children:"Home"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)(i.b,{to:"/users/"+n,children:"Profile"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)(i.b,{to:"/users",children:"All Users"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)(i.b,{to:"/projects",children:"All Projects"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)("a",{href:"https://slack.com/intl/en-gb/",target:"_blank",children:"Go To Slack"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)("a",{style:{textDecoration:"underline",cursor:"pointer"},onClick:function(t){t.preventDefault(),localStorage.clear(),window.location.reload(),e.push("/")},children:"Log Out"})})]})},q=function(){var e=Object(o.g)().username,t=h("/users/"+e),n=t.data,r=n.firstname,c=n.surname,s=n.password,a=n.title,l=n.email,j=n.phone_no,u=n.bio,b=n.joined,O=n.location,p=n.availability,x=n.partnership_opportunities,m=n.interests,f=(t.error,t.isPending),v=Object(o.f)(),g={firstname:r,surname:c,password:s,title:a,email:l,phone_no:j,bio:u,joined:b,location:O,availability:p,partnership_opportunities:x,interests:m},y=Object(D.a)({defaultValues:g}),k=y.register,S=y.handleSubmit;return Object(d.jsxs)("div",{className:"edit-user",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(t){v.push("/users/"+e)},children:"To User Page"})}),Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Edit user"}),f&&Object(d.jsx)("h2",{children:"Loading..."}),Object(d.jsx)(i.b,{to:"/users/change-password",style:{fontSize:"20px"},children:"Change Password"}),r&&Object(d.jsxs)("form",{onSubmit:S((function(t){fetch("/users/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(){v.push("/users")}))})),children:[Object(d.jsx)("br",{}),Object(d.jsx)("label",{htmlFor:"firstname",children:"Firstname"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("firstname")),{},{placeholder:"Input your first name here",defaultValue:r})),Object(d.jsx)("label",{htmlFor:"surname",children:"Surname"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("surname")),{},{placeholder:"Input surname here",defaultValue:c})),Object(d.jsx)("label",{htmlFor:"title",children:"Title"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("title")),{},{placeholder:"State your role at InAGlobe (eg: volunteer)",defaultValue:a})),Object(d.jsx)("label",{htmlFor:"email",children:"Email"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("email")),{},{placeholder:"Input InAGlobe email here",defaultValue:l})),Object(d.jsx)("label",{htmlFor:"phone_no",children:"Phone number"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("phone_no")),{},{placeholder:"Input phone number here",defaultValue:j})),Object(d.jsx)("label",{htmlFor:"bio",children:"Bio"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("bio")),{},{placeholder:"Tell your colleagues a bit about yourself",defaultValue:u})),Object(d.jsx)("label",{htmlFor:"location",children:"Location"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("location")),{},{placeholder:"Where are you currently based?",defaultValue:O})),Object(d.jsx)("label",{htmlFor:"availability",children:"Availibility (hours per week)"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("availability")),{},{placeholder:"How available are you approximately per week?",defaultValue:p})),Object(d.jsx)("label",{htmlFor:"interests",children:"Interests"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("interests")),{},{placeholder:"What are your hobbies?",defaultValue:m})),Object(d.jsx)("label",{htmlFor:"partnership_opportunities",children:"Partnership Opportunities"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("partnership_opportunities")),{},{placeholder:"Eg: Department of Computing at Imperial College London",defaultValue:x})),Object(d.jsx)("button",{type:"submit",children:"Save user details"})]})]})},V=function(e){var t=e.project_tasks,n=Object(r.useState)(""),c=Object(l.a)(n,2),s=c[0],a=c[1],i=Object(r.useState)(1),o=Object(l.a)(i,2),j=o[0],u=o[1],b=Object(r.useState)(Date.now),h=Object(l.a)(b,2),p=h[0],x=h[1],m=Object(r.useState)(""),f=Object(l.a)(m,2),v=f[0],g=f[1],y=Object(r.useState)(""),k=Object(l.a)(y,2),S=k[0],w=k[1],C=function(e){return function(t){t.preventDefault(),a(e.description),u(e.priority),x(e.due_date),g("Completed"),w(e.project_id);var n={description:s,priority:j,due_date:p,completed:v,project_id:S};console.log(n),fetch("/projects/"+e.project_id+"/tasks/"+e.id,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}).then((function(){window.location.reload()}))}},N=function(e){return function(t){t.preventDefault(),fetch("/projects/"+e.project_id+"/tasks/"+e.id,{method:"DELETE"}).then((function(){window.location.reload()}))}};return Object(d.jsx)("div",{className:"project-tasks-list",children:t.map((function(e){return Object(d.jsxs)("div",{className:"project-task-preview",children:[Object(d.jsxs)("div",{children:[Object(d.jsx)("h2",{children:e.description}),Object(d.jsxs)("h3",{children:["Due date: ",e.due_date]})]}),Object(d.jsxs)("h3",{children:["Priority: ",e.priority]}),Object(d.jsx)("h3",{children:"All volunteers assigned to this task"}),Object(d.jsx)(O,{task_id:e.id}),!e.completed&&Object(d.jsx)("button",{className:"task-complete-button",onClick:C(e),children:"Complete"}),Object(d.jsx)("button",{className:"task-delete-button",onClick:N(e),children:"Delete"})]},e.id)}))})},F=function(){var e=Object(o.g)().id,t=h("/projects/"+e),n=t.data,r=(t.errorProject,t.isPendingProject,h("/projects/"+e+"/tasks")),c=r.data,s=(r.errorTasks,r.isPendingTasks),a=Object(o.f)();return Object(d.jsxs)("div",{className:"project-tasks",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(t){a.push("/projects/"+e)},children:"To Project Details"})}),Object(d.jsx)("br",{}),s&&Object(d.jsx)("h2",{children:"Loading..."}),n&&Object(d.jsxs)("h1",{children:[n.name,": tasks"]}),Object(d.jsx)("h2",{children:"Ongoing Project Tasks"}),c&&Object(d.jsx)(V,{project_tasks:c.filter((function(e){return!e.completed}))}),Object(d.jsx)("h2",{children:"Completed Project Tasks"}),c&&Object(d.jsx)(V,{project_tasks:c.filter((function(e){return e.completed}))}),Object(d.jsx)("div",{className:"add-task-button-wrapper",children:c&&Object(d.jsx)(i.b,{to:"/projects/".concat(n.id,"/add-task"),className:"add-task-button",children:"Add Task"})})]})},B=function(){var e=Object(o.g)().id,t=Object(r.useState)(""),n=Object(l.a)(t,2),c=n[0],s=n[1],a=Object(r.useState)(Date.now),i=Object(l.a)(a,2),j=i[0],u=i[1],b=Object(r.useState)(1),O=Object(l.a)(b,2),p=O[0],x=O[1],m=Object(r.useState)(!1),f=Object(l.a)(m,2),k=f[0],S=f[1],w=Object(r.useState)([]),C=Object(l.a)(w,2),N=C[0],P=C[1],T=h("/projects/"+e),_=T.data,A=(T.error,T.isPending),D=h("/user_project/project_task/"+e),E=D.data,I=(D.errorParticipants,D.isPendingParticipants,Object(o.f)()),L=function(){var t=Object(g.a)(v.a.mark((function t(n){var r,s,a,i;return v.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n.preventDefault(),r={description:c,due_date:j,priority:p,completed:k},t.next=4,fetch("/projects/"+_.id+"/tasks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});case 4:return s=t.sent,t.next=7,s.json();case 7:a=t.sent,i=a.id,N.map((function(e){var t={username:e,task_id:i};fetch("/assigned_task",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})})),I.push("/projects/"+e);case 11:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();return Object(d.jsxs)("div",{className:"add-project-task",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(t){I.push("/projects/"+e+"/tasks")},children:"To Project Tasks"})}),Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Add a new task"}),A&&Object(d.jsx)("h2",{children:"Loading..."}),_&&Object(d.jsxs)("form",{onSubmit:L,children:[Object(d.jsx)("label",{children:"Description"}),Object(d.jsx)("input",{type:"text",required:!0,value:c,onChange:function(e){return s(e.target.value)},placeholder:"Input description here"}),Object(d.jsx)("label",{children:"Due Date [required]"}),Object(d.jsx)("input",{type:"date",required:!0,value:j,onChange:function(e){return u(e.target.value)},placeholder:"Input your first name here"}),Object(d.jsx)("label",{children:"Priority level (1: lowest, 4: highest) [required]"}),Object(d.jsxs)("select",{required:!0,value:p,onChange:function(e){return x(e.target.value)},children:[Object(d.jsx)("option",{value:"1",children:"1"}),Object(d.jsx)("option",{value:"2",children:"2"}),Object(d.jsx)("option",{value:"3",children:"3"}),Object(d.jsx)("option",{value:"4",children:"4"})]}),Object(d.jsx)("label",{children:"Volunteers assigned to this task"}),Object(d.jsx)(y.a,{className:"dropdown",placeholder:"Select Users",value:E.filter((function(e){return N.includes(e.value)})),options:E,onChange:function(e){P(Array.isArray(e)?e.map((function(e){return e.value})):[])},isMulti:!0,isClearable:!0}),Object(d.jsx)("label",{children:"Status"}),Object(d.jsxs)("select",{value:k,onChange:function(e){return S(e.target.value)},children:[Object(d.jsx)("option",{value:"Incomplete",children:"Available"}),Object(d.jsx)("option",{value:"Completed",children:"Completed"})]}),Object(d.jsx)("button",{children:"Add task"})]})]})};function J(e){return U.apply(this,arguments)}function U(){return(U=Object(g.a)(v.a.mark((function e(t){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",fetch("/users/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(e){return e.json()})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function W(e){var t=e.setToken,n=Object(r.useState)(),c=Object(l.a)(n,2),s=c[0],a=c[1],o=Object(r.useState)(),j=Object(l.a)(o,2),u=j[0],b=j[1],h=function(){var e=Object(g.a)(v.a.mark((function e(n){var r;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.preventDefault(),e.next=3,J({username:s,password:u});case 3:""!=(r=e.sent).token?t(r):document.getElementsByClassName("incorrect-password")[0].style.display="block";case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return Object(d.jsxs)("div",{className:"login",children:[Object(d.jsx)("h1",{children:" InAGlobe Platform "}),Object(d.jsxs)("form",{onSubmit:h,children:[Object(d.jsx)("input",{type:"text",id:"login",class:"fadeIn second",name:"login",placeholder:"login",onChange:function(e){return a(e.target.value)}}),Object(d.jsx)("input",{type:"password",id:"password",class:"fadeIn third",name:"login",placeholder:"password",onChange:function(e){return b(e.target.value)}}),Object(d.jsx)("div",{className:"incorrect-password",style:{display:"none"},children:Object(d.jsx)("h2",{children:"Incorrect password!"})}),Object(d.jsx)("div",{className:"links",children:Object(d.jsx)(i.b,{to:"/forgot-password",children:"Forgot Password"})}),Object(d.jsx)("button",{type:"submit",children:"Log In"})]})]})}var G=function(){var e=Object(r.useState)(""),t=Object(l.a)(e,2),n=t[0],c=t[1],s=Object(r.useState)(""),a=Object(l.a)(s,2),u=a[0],b=a[1],h=j(),O=(h.setToken,h.token);Object(o.f)();function p(){return x.apply(this,arguments)}function x(){return(x=Object(g.a)(v.a.mark((function e(){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",fetch("/users/update-password",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:O,oldPassword:n,newPassword:u})}).then((function(e){return e.json()})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var m=function(){var e=Object(g.a)(v.a.mark((function e(t){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),e.next=3,p();case 3:"True"!=e.sent.status?document.getElementsByClassName("incorrect-password")[0].style.display="block":document.getElementsByClassName("password-changed-msg")[0].style.display="block";case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return Object(d.jsxs)("div",{className:"change-password",children:[Object(d.jsx)("h2",{children:"Change Password"}),Object(d.jsx)("label",{children:"Current Password"}),Object(d.jsx)("input",{onChange:function(e){return c(e.target.value)},placeholder:"Current Password"}),Object(d.jsx)("label",{children:"New Password"}),Object(d.jsx)("input",{onChange:function(e){return b(e.target.value)},placeholder:"New Password"}),Object(d.jsx)("button",{onClick:m,children:"Change password"}),Object(d.jsx)("h2",{className:"incorrect-password",style:{display:"none"},children:"Incorrect password"}),Object(d.jsxs)("div",{className:"password-changed-msg",style:{display:"none"},children:[Object(d.jsx)("h3",{children:"Your password has been changed successfully"}),Object(d.jsx)(i.b,{to:"/",children:"Back to Dashboard"})]})]})},M=function(){var e=h("/projects"),t=e.data,n=(e.errorProjects,e.isPendingProjects);return Object(d.jsxs)("div",{className:"project-registry",children:[Object(d.jsx)("h1",{children:"All Projects"}),Object(d.jsx)("br",{}),n&&Object(d.jsx)("h2",{children:"Loading..."}),t&&Object(d.jsx)(b,{projects:t,title:"All Projects"})]})};function H(e){return R.apply(this,arguments)}function R(){return(R=Object(g.a)(v.a.mark((function e(t){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",fetch("/users/forgot-password",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(e){return e.json()})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var z=function(){var e=Object(r.useState)("."),t=Object(l.a)(e,2),n=t[0],c=t[1],s=Object(o.f)(),a=function(){var e=Object(g.a)(v.a.mark((function e(t){var r;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t.preventDefault(),"."==n){e.next=7;break}return r={username:n,newPassword:Math.random().toString(36).replace(/[^a-z]+/g,"")},e.next=5,H(r);case 5:"False"==e.sent.status?(document.getElementsByClassName("email-sent")[0].style.display="none",document.getElementsByClassName("incorrect-username")[0].style.display="block"):(document.getElementsByClassName("incorrect-username")[0].style.display="none",document.getElementsByClassName("email-sent")[0].style.display="block");case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return Object(d.jsxs)("div",{className:"forgot-password",children:[Object(d.jsxs)("form",{onSubmit:a,children:[Object(d.jsx)("h1",{children:"Forgot Password"}),Object(d.jsx)("h2",{children:"Input your username"}),Object(d.jsx)("input",{type:"text",placeholder:"username",onChange:function(e){return c(e.target.value)}}),Object(d.jsx)("div",{className:"incorrect-username",style:{display:"none"},children:Object(d.jsx)("h2",{children:"Incorrect username provided!"})}),Object(d.jsx)("div",{className:"email-sent",style:{display:"none"},children:Object(d.jsx)("h2",{children:"Email has been sent!"})}),Object(d.jsx)("button",{children:"Submit"})]}),Object(d.jsx)("button",{onClick:function(e){e.preventDefault(),s.push("/")},children:"Back to Login Page"})]})};var Y=function(){var e=j(),t=e.token,n=e.setToken;return t?Object(d.jsx)(i.a,{children:Object(d.jsxs)("div",{className:"App",children:[Object(d.jsx)(L,{}),Object(d.jsx)(u,{}),Object(d.jsx)("div",{className:"content",children:Object(d.jsxs)(o.c,{children:[Object(d.jsx)(o.a,{exact:!0,path:"/",children:Object(d.jsx)(m,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/create-project",children:Object(d.jsx)(k,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/add-user",children:Object(d.jsx)(_,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/my-profile",children:Object(d.jsx)(C,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/users",children:Object(d.jsx)(T,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/users/change-password",children:Object(d.jsx)(G,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/users/:username",children:Object(d.jsx)(N,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/edit-user/:username",children:Object(d.jsx)(q,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/projects",children:Object(d.jsx)(M,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/projects/:id/add-task",children:Object(d.jsx)(B,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/projects/:id/tasks",children:Object(d.jsx)(F,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/projects/:id",children:Object(d.jsx)(S,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/edit-project/:id",children:Object(d.jsx)(E,{})}),Object(d.jsx)(o.a,{path:"*",children:Object(d.jsx)(w,{})})]})})]})}):Object(d.jsx)(i.a,{children:Object(d.jsxs)(o.c,{children:[Object(d.jsx)(o.a,{exact:!0,path:"/forgot-password",children:Object(d.jsx)(z,{})}),Object(d.jsx)(o.a,{path:"*",children:Object(d.jsx)(W,{setToken:n})})]})})},K=function(e){e&&e instanceof Function&&n.e(3).then(n.bind(null,73)).then((function(t){var n=t.getCLS,r=t.getFID,c=t.getFCP,s=t.getLCP,a=t.getTTFB;n(e),r(e),c(e),s(e),a(e)}))};a.a.render(Object(d.jsx)(c.a.StrictMode,{children:Object(d.jsx)(Y,{})}),document.getElementById("root")),K()}},[[72,1,2]]]);
-//# sourceMappingURL=main.4429b17a.chunk.js.map
\ No newline at end of file
diff --git a/backend/static/react/js/main.4429b17a.chunk.js.map b/backend/static/react/js/main.4429b17a.chunk.js.map
deleted file mode 100644
index 3e37430061ac39cfec3f03e9f307f5e6213c4b74..0000000000000000000000000000000000000000
--- a/backend/static/react/js/main.4429b17a.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["useToken.js","Navbar.js","ProjectList.js","useFetch.js","UsersAssignedToTask.js","MyProjectTasks.js","PersonalToDo.js","Home.js","CreateProject.js","ProjectDetails.js","PageNotFound.js","MyProfile.js","User.js","UserList.js","Users.js","AddUser.js","EditProject.js","Sidebar.js","EditUser.js","ProjectTaskList.js","ProjectTasks.js","AddProjectTask.js","Login.js","ChangePassword.js","ProjectsRegistry.js","ForgotPassword.js","App.js","reportWebVitals.js","index.js"],"names":["useToken","useState","tokenString","localStorage","getItem","userToken","JSON","parse","token","getToken","setToken","setItem","stringify","Navbar","className","href","style","color","fontSize","borderRadius","to","ProjectList","projects","title","map","project","id","name","status","useFetch","url","data","setData","error","setError","isPending","setIsPending","useEffect","fetch","then","res","ok","Error","json","catch","err","message","UsersAssignedToTask","task_id","assignedUsers","user","username","firstname","surname","MyProjectTasks","tasks","task","project_name","description","priority","due_date","project_id","PersonalToDo","todos","users","todo_desc","setTodoDesc","setPriority","Date","now","setDueDate","setUsername","float","onClick","document","getElementsByClassName","display","Object","keys","length","onSubmit","e","preventDefault","newTodo","method","headers","body","window","location","reload","value","onChange","target","required","placeholder","type","todo","Home","isPendingTodos","errorTodos","isPendingRProjects","errorRProjects","project_tasks","errorProjectTasks","isPendingProjectTasks","myTodos","filter","console","log","width","CreateProject","setName","setDescription","setStatus","tag","setTag","setLocation","files","setFiles","selectUsernames","setSelectUsernames","history","useHistory","handleSubmit","a","newProject","response","responseJSON","assign_project","push","includes","options","Array","isArray","x","isMulti","isClearable","ProjectDetails","useParams","assignments","errorAssignment","isPendingAssignment","marginBottom","marginright","backgroundColor","cursor","marginRight","open","PageNotFound","MyProfile","email","bio","joined","availability","partnership_opportunities","interests","User","UserList","Users","AddUser","setFirstname","setSurname","password","setPassword","setTitle","setEmail","phone_no","setPhoneNo","setBio","setJoined","setAvailability","setPartnership_opportunities","setInterests","newUser","EditProject","errorUsers","isPendingUsers","useForm","register","defaultValue","Sidebar","textDecoration","clear","EditUser","oldUserDetails","defaultValues","htmlFor","ProjectTaskList","completed","setCompleted","setProjectId","handleComplete","newTask","handleDelete","ProjectTasks","errorProject","isPendingProject","isPendingTasks","errorTasks","AddProjectTask","setAssignedUsers","participants","errorParticipants","isPendingParticipants","newProjectTask","assigned_task","loginUser","credentials","Login","setUserName","class","ChangePassword","oldPassword","setOldPassword","newPassword","setNewPassword","passwordUpdate","ProjectRegistry","isPendingProjects","errorProjects","resetPassword","msg","ForgotPassword","Math","random","toString","replace","App","exact","path","ProjectsRegistry","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"6NAEe,SAASA,IACpB,IAMA,EAA0BC,mBANT,WACb,IAAMC,EAAcC,aAAaC,QAAQ,SACnCC,EAAYC,KAAKC,MAAML,GAC7B,cAAOG,QAAP,IAAOA,OAAP,EAAOA,EAAWG,MAGaC,IAAnC,mBAAOD,EAAP,KAAcE,EAAd,KAOA,MAAO,CACHA,SANc,SAAAL,GACdF,aAAaQ,QAAQ,QAASL,KAAKM,UAAUP,IAC7CK,EAASL,EAAUG,QAKnBA,S,WCGOK,EAlBA,WACX,MAA0Bb,IAATQ,GAAjB,EAAOE,SAAP,EAAiBF,OAEjB,OACI,sBAAKM,UAAU,SAAf,UACI,mBAAGC,KAAK,IAAIC,MAAO,CACfC,MAAO,UACPC,SAAU,OACVC,aAAc,OAHlB,+BAKA,sBAAKL,UAAU,QAAf,UACI,cAAC,IAAD,CAAMM,GAAE,kBAAR,yBACA,cAAC,IAAD,CAAMA,GAAI,UAAYZ,EAAtB,+BCIDa,EAjBK,SAAC,GAAyB,IAAvBC,EAAsB,EAAtBA,SAAUC,EAAY,EAAZA,MAE7B,OACI,sBAAKT,UAAU,eAAf,UACI,6BAAKS,IACJD,EAASE,KAAI,SAACC,GAAD,OACV,qBAAKX,UAAU,UAAf,SACI,eAAC,IAAD,CAAMM,GAAE,oBAAeK,EAAQC,IAA/B,UACI,6BAAKD,EAAQE,OACb,6BAAKF,EAAQG,aAHSH,EAAQC,WCqBvCG,EA3BE,SAACC,GAChB,MAAwB7B,mBAAS,IAAjC,mBAAO8B,EAAP,KAAaC,EAAb,KACA,EAA0B/B,mBAAS,MAAnC,mBAAOgC,EAAP,KAAcC,EAAd,KACA,EAAkCjC,oBAAS,GAA3C,mBAAOkC,EAAP,KAAkBC,EAAlB,KAqBA,OAnBAC,qBAAU,WACRC,MAAMR,GACDS,MAAK,SAAAC,GACF,IAAKA,EAAIC,GACL,MAAMC,MAAM,8CAEhB,OAAOF,EAAIG,UAEdJ,MAAK,SAAAR,GACFC,EAAQD,GACRK,GAAa,GACbF,EAAS,SAEZU,OAAM,SAAAC,GAEHX,EAASW,EAAIC,cAEpB,CAAChB,IAEG,CAAEC,OAAME,QAAOE,cCTTY,EAda,SAAC,GAAsB,IAArBC,EAAoB,EAApBA,QAE1B,GAF8C,EAAXzB,MAEeM,EAAS,uBAAyBmB,IAAtEC,EAAd,EAAQlB,KAAR,EAA6BE,MAA7B,EAAoCE,UAEpC,OAAOc,EAAczB,KAAI,SAAC0B,GAAD,OACrB,qBAAKpC,UAAU,sBAAf,SACI,cAAC,IAAD,CAAMM,GAAE,iBAAY8B,EAAKC,UAAzB,SACI,+BAAKD,EAAKE,UAAV,IAAsBF,EAAKG,mBC6B5BC,EAnCQ,SAAC,GAAsB,IAApBC,EAAmB,EAAnBA,MAAOhC,EAAY,EAAZA,MAY7B,OACI,gCACI,6BAAKA,IAEL,qBAAKT,UAAU,mBAAf,SACKyC,EAAM/B,KAAI,SAACgC,GAAD,OACP,sBAAK1C,UAAU,eAAf,UACI,+BAAK0C,EAAKC,aAAV,KAA0BD,EAAKE,eAC/B,+BAAI,qDAAJ,IAAsCF,EAAKG,YAC3C,+BAAI,2BAAJ,IAAuBH,EAAKG,YAC5B,+BAAI,oDAAJ,IAAqCH,EAAKI,YAC1C,wEACA,cAAC,EAAD,CAAqBZ,QAASQ,EAAK9B,KACnC,cAAC,IAAD,CAAMN,GAAE,oBAAeoC,EAAKK,YAA5B,SACI,sEAR2BL,EAAK9B,aC0E7CoC,EA5FM,SAAC,GAAsB,IAApBC,EAAmB,EAAnBA,MAAOxC,EAAY,EAAZA,MAK3B,EAA0BvB,IAATQ,GAAjB,EAAOE,SAAP,EAAiBF,OAGjB,EAA0CqB,EAAS,UAArCmC,EAAd,EAAQjC,KAAoBI,GAA5B,EAAqBF,MAArB,EAA4BE,WAE5B,EAAiClC,mBAAS,IAA1C,mBAAOgE,EAAP,KAAkBC,EAAlB,KACA,EAAgCjE,mBAAS,GAAzC,mBAAO0D,EAAP,KAAiBQ,EAAjB,KACA,EAA+BlE,mBAASmE,KAAKC,OAA7C,mBAAOT,EAAP,KAAiBU,EAAjB,KACA,EAAgCrE,mBAASO,GAAzC,mBAAO2C,EAAP,KAAiBoB,EAAjB,KAyBA,OACI,sBAAKzD,UAAU,YAAYE,MAAO,CAACwD,MAAO,SAA1C,UACI,6BAAKjD,IAEL,qBAAKT,UAAU,kBAAf,SACI,wBAAQ2D,QAzCC,WACjBC,SAASC,uBAAuB,iBAAiB,GAAG3D,MAAM4D,QAAU,SAwC5D,mCAGFb,GAAwC,IAA9Bc,OAAOC,KAAKf,GAAOgB,QAAiB,oBAAI/D,MAAO,CAACwD,MAAO,SAAnB,+CAE9CrC,GAAa,4CAEf,qBAAKrB,UAAU,gBAAf,SACMkD,GAAS,uBAAMgB,SApCR,SAAAC,GACjBP,SAASC,uBAAuB,iBAAiB,GAAG3D,MAAM4D,QAAU,OAEpEK,EAAEC,iBACF,IAAMC,EAAU,CAAElB,YAAWN,WAAUC,WAAUT,YAEjDb,MAAM,SAAU,CACZ8C,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAUuE,KACtB5C,MAAK,WACJgD,OAAOC,SAASC,aAyBD,UACP,gEACA,0BAAUC,MAAOzB,EAAW0B,SAAU,SAACV,GAAD,OAAOf,EAAYe,EAAEW,OAAOF,QAAQG,UAAQ,EAACC,YAAY,kCAC/F,2EACA,yBAAQJ,MAAO/B,EAAUgC,SAAU,SAACV,GAAD,OAAOd,EAAYc,EAAEW,OAAOF,QAA/D,UACI,wBAAQA,MAAM,IAAd,eACA,wBAAQA,MAAM,IAAd,eACA,wBAAQA,MAAM,IAAd,eACA,wBAAQA,MAAM,IAAd,kBAEJ,iFACA,uBACIG,UAAQ,EACRE,KAAK,OACLL,MAAO9B,EACP+B,SAAU,SAACV,GAAD,OAAOX,EAAWW,EAAEW,OAAOF,UAEzC,kDACA,wBAAQA,MAAOvC,EAAUwC,SAAU,SAACV,GAAD,OAAOV,EAAYU,EAAEW,OAAOF,QAA/D,SACK1B,EAAMxC,KAAI,SAAA0B,GAAI,OAAI,wBAAQwC,MAAOxC,EAAKC,SAApB,SAA+BD,EAAKC,gBAE3D,oDAIR,qBAAKrC,UAAU,iBAAf,SACKiD,EAAMvC,KAAI,SAACwE,GAAD,OACP,sBAAKlF,UAAU,eAAf,UACI,6BAAKkF,EAAK/B,YACV,kDAAqB+B,EAAKrC,YAC1B,iDAAoBqC,EAAKpC,YACzB,wBAAQa,SApDP/C,EAoD6BsE,EAAKtE,GApD5B,SAAAuD,GACvBA,EAAEC,iBACF5C,MAAM,UAAYZ,EAAI,CAAE0D,OAAQ,WAC3B7C,MAAK,WACFgD,OAAOC,SAASC,cAgDR,wBAJ+BO,EAAKtE,IAhDnC,IAAAA,WCQVuE,EAnCF,WAET,MAAoDpE,EAAS,UAA/CkC,EAAd,EAAQhC,KAAyBmE,GAAjC,EAAqBC,WAArB,EAAiCD,gBACjC,EAA4BlG,IAAVQ,GAAlB,EAAQE,SAAR,EAAkBF,OAElB,EAA+DqB,EAAS,0BAA4BrB,GAAtFc,EAAd,EAAQS,KAAgCqE,GAAxC,EAAwBC,eAAxB,EAAwCD,oBACxC,EAAwEvE,EAAS,2BAA6BrB,GAAjG8F,EAAb,EAAOvE,KAEP,GAFA,EAA4BwE,kBAA5B,EAA+CC,sBAET3E,EAAS,eAAiBrB,GAAxDuB,MAAOqB,EAAf,EAAeA,UACTqD,GADN,EAA0BpD,QACVU,EAAM2C,QAAO,SAAAV,GAAI,OAAIA,EAAK7C,WAAa3C,MAGvD,OACI,sBAAKM,UAAU,OAAf,UACI,gDAAmBsC,EAAnB,OACCuD,QAAQC,IAAI,eACb,sBAAK9F,UAAU,gBAAgBE,MAAO,CAAEwD,MAAO,OAAQqC,MAAO,SAA9D,UACKT,GAAsB,4CACtB9E,GAAY,cAAC,EAAD,CAAaA,SAAUA,EAAUC,MAAM,gBACnDD,GAA8C,IAAjCuD,OAAOC,KAAKxD,GAAUyD,QAAiB,kFAEzD,sBAAKjE,UAAU,YAAYE,MAAO,CAAEwD,MAAO,QAASqC,MAAO,SAA3D,UACKX,GAAkB,4CAClBnC,GAAS,cAAC,EAAD,CAAcA,MAAO0C,EAASlF,MAAM,2BAElD,sBAAKT,UAAU,qBAAqBE,MAAO,CAAEwD,MAAO,OAAQqC,MAAO,SAAnE,UACKT,GAAsB,4CACtB9E,GAAY,cAAC,EAAD,CAAgBiC,MAAO+C,EAAe/E,MAAM,+BACxDD,GAAmD,IAAtCuD,OAAOC,KAAKwB,GAAevB,QAAiB,6E,+BC0E3D+B,EAxGO,WAClB,MAAwB7G,mBAAS,IAAjC,mBAAO0B,EAAP,KAAaoF,EAAb,KACA,EAAsC9G,mBAAS,IAA/C,mBAAOyD,EAAP,KAAoBsD,EAApB,KACA,EAA4B/G,mBAAS,aAArC,mBAAO2B,EAAP,KAAeqF,EAAf,KACA,EAAsBhH,mBAAS,SAA/B,mBAAOiH,EAAP,KAAYC,EAAZ,KACA,EAAgClH,mBAAS,IAAzC,mBAAOuF,EAAP,KAAiB4B,EAAjB,KACA,EAA0BnH,mBAAS,IAAnC,mBAAOoH,EAAP,KAAcC,EAAd,KAEA,EAA8CrH,mBAAS,IAAvD,mBAAOsH,EAAP,KAAwBC,EAAxB,KAEMC,EAAUC,cAEhB,EAA0C7F,EAAS,uBAArCmC,EAAd,EAAQjC,KAQF4F,GARN,EAAqB1F,MAArB,EAA4BE,UAEV6B,EAAMxC,KAAI,SAAA0B,GAAI,OAAIA,EAAKC,YAMvB,uCAAG,WAAM8B,GAAN,qBAAA2C,EAAA,6DACjB3C,EAAEC,iBAEI2C,EAAa,CAAElG,OAAM+B,cAAa9B,SAAQsF,MAAK1B,WAAU6B,SAH9C,SAKM/E,MAAM,YAAa,CACtC8C,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAUiH,KARR,cAKXC,EALW,gBAWUA,EAASnF,OAXnB,OAWXoF,EAXW,OAaXlE,EAAakE,EAAarG,GAEhC6F,EAAgB/F,KAAI,SAAA2B,GAChB,IAAM6E,EAAiB,CAAE7E,WAAUU,cAEnCvB,MAAM,gBAAiB,CACnB8C,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAUoH,QAI7BP,EAAQQ,KAAK,KAzBI,4CAAH,uDA4BlB,OACI,sBAAKnH,UAAU,iBAAf,UACI,uBACA,mDACA,uBAAMkE,SAAU2C,EAAhB,UACI,4DACA,uBACI5B,KAAK,OACLF,UAAQ,EACRH,MAAO/D,EACPgE,SAAU,SAACV,GAAD,OAAO8B,EAAQ9B,EAAEW,OAAOF,QAClCI,YAAY,uBAEhB,2DACA,0BAAUD,UAAQ,EAACC,YAAY,gCAAgCJ,MAAOhC,EAAaiC,SAAU,SAACV,GAAD,OAAO+B,EAAe/B,EAAEW,OAAOF,UAC5H,2CACA,yBAAQA,MAAO9D,EAAQ+D,SAAU,SAACV,GAAD,OAAOgC,EAAUhC,EAAEW,OAAOF,QAA3D,UACI,wBAAQA,MAAM,WAAd,sBACA,wBAAQA,MAAM,YAAd,uBACA,wBAAQA,MAAM,YAAd,0BAEJ,6CACA,uBACIK,KAAK,OACLL,MAAOF,EACPG,SAAU,SAACV,GAAD,OAAOmC,EAAYnC,EAAEW,OAAOF,QACtCI,YAAY,uBAEhB,+DACA,yBAAQD,UAAQ,EAACH,MAAOwB,EAAKvB,SAAU,SAACV,GAAD,OAAOkC,EAAOlC,EAAEW,OAAOF,QAA9D,UACI,wBAAQA,MAAM,SAAd,oBACA,wBAAQA,MAAM,YAAd,uBACA,wBAAQA,MAAM,OAAd,kBACA,wBAAQA,MAAM,cAAd,yBACA,wBAAQA,MAAM,SAAd,oBACA,wBAAQA,MAAM,QAAd,sBAEJ,wEACA,cAAC,IAAD,CACI5E,UAAU,WACVgF,YAAY,eACZJ,MAAO1B,EAAM0C,QAAO,SAAAxD,GAAI,OAAIqE,EAAgBW,SAAShF,EAAKwC,UAC1DyC,QAASnE,EACT2B,SA3EK,SAACV,GAClBuC,EAAmBY,MAAMC,QAAQpD,GAAKA,EAAEzD,KAAI,SAAA8G,GAAC,OAAIA,EAAE5C,SAAS,KA2EhD6C,SAAO,EACPC,aAAW,IAEf,wDACA,0BAAU1C,YAAY,4DAA4DJ,MAAO2B,EAAO1B,SAAU,SAACV,GAAD,OAAOqC,EAASrC,EAAEW,OAAOF,UACnI,wDCnBD+C,EA/EQ,WACnB,IAAQ/G,EAAOgH,cAAPhH,GACF+F,EAAUC,cAEhB,EAA4C7F,EAAS,aAAeH,GAAtDD,EAAd,EAAQM,KAAsBI,GAA9B,EAAuBF,MAAvB,EAA8BE,WAC9B,EAAoEN,EAAS,yBAA2BH,GAA1FiH,EAAd,EAAQ5G,KAAR,EAA2B6G,gBAA3B,EAA4CC,oBAY5C,OACI,sBAAK/H,UAAU,kBAAf,UACI,qBAAKA,UAAU,gBAAf,SACI,wBAAQ2D,QAPC,SAAAQ,GACjBwC,EAAQQ,KAAK,MAML,4BAEJ,uBACE9F,GAAa,4CACbV,GAAW,6BAAKA,EAAQE,OACxBF,GAAW,yBAAQT,MAAO,CACxBE,SAAU,OACVD,MAAO,OACP6H,aAAc,OACdC,YAAa,OACb5H,aAAc,MACd6H,gBAAiB,UACjBC,OAAQ,WAPC,qBAQDxH,EAAQG,UACnBH,GAAW,wBAAQT,MAAO,CACvBE,SAAU,OACVD,MAAO,OACP6H,aAAc,OACdI,YAAa,OACb/H,aAAc,MACd6H,gBAAiB,UACjBC,OAAQ,WAPA,SAQRxH,EAAQyF,MACXzF,GAAW,4CAAeA,EAAQ+D,YAClC/D,GAAW,wBAAQgD,QAAS,SAACQ,GAC1BA,EAAEC,iBACFK,OAAO4D,KAAK1H,EAAQ4F,MAAO,WAFnB,uBAIX5F,GAAW,4BAAIA,EAAQiC,cAExB,oEACA,qBAAK5C,UAAU,+BAAf,SACK6H,EAAYnH,KAAI,SAAAoG,GAAC,OACd,qBAAK9G,UAAU,yBAAyBE,MAAO,CAACwD,MAAO,OAAQqC,MAAO,OAAtE,SACI,cAAC,IAAD,CAAMzF,GAAE,iBAAYwG,EAAEzE,UAAtB,SACI,6BAAKyE,EAAEzE,cAFoEyE,EAAElG,SAS7F,sBAAKZ,UAAU,gBAAf,UACKW,GAAW,cAAC,IAAD,CAAML,GAAE,oBAAeK,EAAQC,GAAvB,UAAmCZ,UAAU,oBAArD,wBAEXW,GAAW,cAAC,IAAD,CAAML,GAAE,oBAAeK,EAAQC,GAAvB,aAAsCZ,UAAU,kBAAxD,yBAGhB,gCACKW,GAAW,wBAAQgD,QA9DX,SAAAQ,GACjBA,EAAEC,iBACF5C,MAAM,aAAeZ,EAAI,CAAE0D,OAAQ,WAC9B7C,MAAK,WAAQkF,EAAQQ,KAAK,SA2DX,4BAEXxG,GAAW,cAAC,IAAD,CAAML,GAAE,wBAAmBK,EAAQC,IAAMZ,UAAU,sBAAnD,iCC/DbsI,EAVM,WACjB,OACI,sBAAKtI,UAAU,iBAAf,UACI,yDACA,0DACA,cAAC,IAAD,CAAMM,GAAG,IAAT,uCCmBGiI,EAtBG,WACd,MAA0BrJ,IAATQ,GAAjB,EAAOE,SAAP,EAAiBF,OAEjB,EAAuCqB,EAAS,UAAYrB,GAA/C0C,EAAb,EAAOnB,KAAmBI,GAA1B,EAAmBF,MAAnB,EAA0BE,WAE1B,OACI,sBAAKrB,UAAU,aAAf,UACMqB,GAAa,4CACbe,GAAQ,6BAAKA,EAAKE,UAAY,IAAMF,EAAKG,UACzCH,GAAQ,6BAAK,aAAeA,EAAK1C,QACjC0C,GAAQ,6BAAK,UAAYA,EAAK3B,QAC9B2B,GAAQ,6BAAK,UAAYA,EAAKoG,QAC9BpG,GAAQ,6BAAK,QAAUA,EAAKqG,MAC5BrG,GAAQ,6BAAK,WAAaA,EAAKsG,SAC/BtG,GAAQ,6BAAK,aAAeA,EAAKsC,WACjCtC,GAAQ,6BAAK,iBAAmBA,EAAKuG,eACrCvG,GAAQ,6BAAK,8BAAgCA,EAAKwG,4BAClDxG,GAAQ,6BAAK,cAAgBA,EAAKyG,gBC6CjCC,EA7DF,WACT,IAAOzG,EAAYuF,cAAZvF,SACDsE,EAAUC,cAChB,EAA0B1H,IAATQ,GAAjB,EAAOE,SAAP,EAAiBF,OAEjB,EAAuCqB,EAAS,UAAYsB,GAA/CD,EAAb,EAAOnB,KAAmBI,GAA1B,EAAmBF,MAAnB,EAA0BE,WAY1B,OACI,sBAAKrB,UAAU,OAAf,UACI,qBAAKA,UAAU,gBAAf,SACI,wBAAQ2D,QAPC,SAAAQ,GACjBwC,EAAQQ,KAAK,WAML,4BAEJ,uBACE9F,GAAa,4CACbe,GAAQ,8BACN,6BAAKA,EAAKE,UAAY,IAAMF,EAAKG,YAGnCH,GAAQ,gCACN,+BAAI,gDAA4BA,EAAKC,YACrC,+BAAI,6CAAyBD,EAAKoG,SAClC,+BAAI,6CAAyBpG,EAAK3B,SAClC,+BAAI,8CAA0B2B,EAAKsG,UACnC,+BAAI,gDAA4BtG,EAAKsC,YACrC,+BAAI,oDAAgCtC,EAAKuG,mBAG7C,uBAEEvG,GAAQ,gCACN,gCAAO,2CACP,4BAAIA,EAAKqG,SAGXrG,GAAQ,gCACN,gCAAO,iEACP,4BAAIA,EAAKwG,+BAGXxG,GAAQ,gCACN,gCAAO,iDACP,4BAAIA,EAAKyG,eAGXzG,IAAkB,iBAAT1C,GAA4B2C,GAAY3C,IAAU,wBAAQiE,QA/CxD,SAAAQ,GACjBA,EAAEC,iBACF5C,MAAM,UAAYa,EAAU,CAACiC,OAAQ,WAChC7C,MAAK,WAAMkF,EAAQQ,KAAK,SA4CoC,yBAE3D/E,IAAkB,iBAAT1C,GAA4B2C,GAAY3C,IAAU,cAAC,IAAD,CAAMY,GAAE,qBAAgB+B,GAAYrC,UAAU,mBAA9C,8BC3C1D+I,EAhBE,SAAC,GAAe,IAAb7F,EAAY,EAAZA,MAEhB,OACI,qBAAKlD,UAAU,YAAf,SAEKkD,EAAMxC,KAAI,SAAC0B,GAAD,OACP,qBAAKpC,UAAU,UAAf,SACI,cAAC,IAAD,CAAMM,GAAE,iBAAY8B,EAAKC,UAAzB,SACI,6BAAKD,EAAKC,cAFYD,EAAKC,gBCcpC2G,EAjBD,WAEV,MAAwCjI,EAAS,UAApCmC,EAAb,EAAOjC,KAAoBI,GAA3B,EAAoBF,MAApB,EAA2BE,WAC3B,EAA0BnC,IAATQ,GAAjB,EAAOE,SAAP,EAAiBF,OAEjB,OACI,sBAAKM,UAAU,QAAf,UACI,uCACW,iBAATN,GAA4B,cAAC,IAAD,CAAMY,GAAE,YAAeN,UAAU,kBAAjC,sBAC9B,uBACA,uBACEqB,GAAa,4CACb6B,GAAS,cAAC,EAAD,CAAUA,MAAOA,EAAOzC,MAAM,kBCmKtCwI,EAjLC,WACZ,MAAkC9J,mBAAS,IAA3C,mBAAOmD,EAAP,KAAkB4G,EAAlB,KACA,EAA8B/J,mBAAS,IAAvC,mBAAOoD,EAAP,KAAgB4G,EAAhB,KACA,EAAgChK,mBAAS,IAAzC,mBAAOiK,EAAP,KAAiBC,EAAjB,KACA,EAA0BlK,mBAAS,IAAnC,mBAAOsB,EAAP,KAAc6I,EAAd,KACA,EAA0BnK,mBAAS,IAAnC,mBAAOqJ,EAAP,KAAce,EAAd,KACA,EAA+BpK,mBAAS,IAAxC,mBAAOqK,EAAP,KAAiBC,EAAjB,KACA,EAAsBtK,mBAAS,IAA/B,mBAAOsJ,EAAP,KAAYiB,EAAZ,KACA,EAA4BvK,mBAASmE,KAAKC,OAA1C,mBAAOmF,EAAP,KAAeiB,EAAf,KACA,EAAgCxK,mBAAS,IAAzC,mBAAOuF,EAAP,KAAiB4B,EAAjB,KACA,EAAwCnH,mBAAS,IAAjD,mBAAOwJ,EAAP,KAAqBiB,EAArB,KACA,EAAkEzK,mBAAS,IAA3E,mBAAOyJ,EAAP,KAAkCiB,EAAlC,KACA,EAAkC1K,mBAAS,IAA3C,mBAAO0J,EAAP,KAAkBiB,EAAlB,KACA,EAAgC3K,mBAAS,IAAzC,mBAAOkD,GAAP,KAAiBoB,GAAjB,KAEMkD,GAAUC,cAkChB,OACI,sBAAK5G,UAAU,WAAf,UACI,qBAAKA,UAAU,gBAAf,SACI,wBAAQ2D,QAPC,SAAAQ,GACjBwC,GAAQQ,KAAK,WAML,4BAEJ,uBACA,gDACA,uBAAMjD,SAvCO,SAAAC,GACjBA,EAAEC,iBAEF,IAAM2F,EAAU,CACZzH,YACAC,UACA6G,WACA3I,QACA+H,QACAgB,WACAf,MACAC,SACAhE,WACAiE,eACAC,4BACAC,YACAxG,aAGJb,MAAM,SAAU,CACZ8C,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAUiK,KACtBtI,MAAK,WACJkF,GAAQQ,KAAK,cAeb,UACI,wDACA,uBACIlC,KAAK,OACLF,UAAQ,EACRH,MAAOvC,GACPwC,SAAU,SAACV,GAAD,OAAOV,GAAYU,EAAEW,OAAOF,QACtCI,YAAY,wBAIhB,yDACA,uBACIC,KAAK,OACLF,UAAQ,EACRH,MAAOtC,EACPuC,SAAU,SAACV,GAAD,OAAO+E,EAAa/E,EAAEW,OAAOF,QACvCI,YAAY,+BAGhB,uDACA,uBACIC,KAAK,OACLF,UAAQ,EACRH,MAAOrC,EACPsC,SAAU,SAACV,GAAD,OAAOgF,EAAWhF,EAAEW,OAAOF,QACrCI,YAAY,uBAGhB,qDACA,uBACIC,KAAK,OACLF,UAAQ,EACRH,MAAOnE,EACPoE,SAAU,SAACV,GAAD,OAAOmF,EAASnF,EAAEW,OAAOF,QACnCI,YAAY,gDAGhB,wDACA,uBACIC,KAAK,OACLF,UAAQ,EACRH,MAAOwE,EACPvE,SAAU,SAACV,GAAD,OAAOkF,EAAYlF,EAAEW,OAAOF,QACtCI,YAAY,2DAGhB,qDACA,uBACIC,KAAK,OACLF,UAAQ,EACRH,MAAO4D,EACP3D,SAAU,SAACV,GAAD,OAAOoF,EAASpF,EAAEW,OAAOF,QACnCI,YAAY,8BAGhB,iDACA,uBACIC,KAAK,OACLL,MAAO4E,EACP3E,SAAU,SAACV,GAAD,OAAOsF,EAAWtF,EAAEW,OAAOF,QACrCI,YAAY,4BAIhB,wCACA,uBACIC,KAAK,OACLL,MAAO6D,EACP5D,SAAU,SAACV,GAAD,OAAOuF,EAAOvF,EAAEW,OAAOF,QACjCI,YAAY,8CAGhB,sDACA,uBACIC,KAAK,OACLF,UAAQ,EACRH,MAAO8D,EACP7D,SAAU,SAACV,GAAD,OAAOwF,EAAUxF,EAAEW,OAAOF,QACpCI,YAAY,wBAIhB,6CACA,uBACIC,KAAK,OACLL,MAAOF,EACPG,SAAU,SAACV,GAAD,OAAOmC,EAAYnC,EAAEW,OAAOF,QACtCI,YAAY,mCAGhB,iDACA,uBACIC,KAAK,OACLL,MAAO+D,EACP9D,SAAU,SAACV,GAAD,OAAOyF,EAAgBzF,EAAEW,OAAOF,QAC1CI,YAAY,kDAGhB,8DACA,uBACIC,KAAK,OACLL,MAAOgE,EACP/D,SAAU,SAACV,GAAD,OAAO0F,EAA6B1F,EAAEW,OAAOF,QACvDI,YAAY,2DAGhB,8CACA,uBACIC,KAAK,OACLL,MAAOiE,EACPhE,SAAU,SAACV,GAAD,OAAO2F,EAAa3F,EAAEW,OAAOF,QACvCI,YAAY,2BAGhB,qD,eCxEDgF,EAhGK,WAChB,IAAQpJ,EAAOgH,cAAPhH,GACR,EAAwFG,EAAS,aAAeH,GAAhH,IAAQK,KAAQJ,EAAhB,EAAgBA,KAAM+B,EAAtB,EAAsBA,YAAa9B,EAAnC,EAAmCA,OAAQ4D,EAA3C,EAA2CA,SAAU0B,EAArD,EAAqDA,IAAKG,EAA1D,EAA0DA,MAAgBlF,GAA1E,EAAmEF,MAAnE,EAA0EE,WAC1E,EAA8ClC,mBAAS,IAAvD,mBAAOsH,EAAP,KAAwBC,EAAxB,KACA,EAAoD3F,EAAS,uBAA/CmC,EAAd,EAAQjC,KAEF0F,GAFN,EAAqBsD,WAArB,EAAiCC,eAEjBtD,eAEhB,EAAmCuD,cAA3BC,EAAR,EAAQA,SAAUvD,EAAlB,EAAkBA,aA8BlB,OACI,sBAAK7G,UAAU,eAAf,UACI,qBAAKA,UAAU,gBAAf,SACI,wBAAQ2D,QAPC,SAAAQ,GACjBwC,EAAQQ,KAAK,aAAevG,IAMpB,+BAEJ,uBACA,8CACCS,GAAa,4CACbR,GAAQ,uBAAMqD,SAAU2C,GAhChB,SAAA1C,GACb3C,MAAM,aAAeZ,EAAI,CACrB0D,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAUqE,KACtB1C,MAAK,WACJgF,EAAgB/F,KAAI,SAAA2B,GAChB,IAAM6E,EAAiB,CAAE7E,SAAUA,EAAUU,WAAYnC,GAEzDY,MAAM,gBAAiB,CACnB8C,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAUoH,WAG9BzF,MAAK,WACJkF,EAAQQ,KAAK,mBAgBJ,UACL,iDACA,iDACQiD,EAAS,SADjB,IAEIpF,YAAY,2BACZC,KAAK,OACLoF,aAAcxJ,KAElB,gDACA,oDAAcuJ,EAAS,gBAAvB,IAAuCpF,YAAY,yCAAyCqF,aAAczH,KAC1G,2CACA,mDAAYwH,EAAS,WAArB,IAAgCC,aAAcvJ,EAA9C,UACI,wBAAQ8D,MAAM,WAAd,sBACA,wBAAQA,MAAM,YAAd,uBACA,wBAAQA,MAAM,YAAd,2BAEJ,6CACA,iDACQwF,EAAS,aADjB,IAEInF,KAAK,OACLD,YAAY,kCACZqF,aAAc3F,KAElB,oDACA,mDAAY0F,EAAS,QAArB,IAA6BC,aAAcjE,EAA3C,UACI,wBAAQxB,MAAM,SAAd,oBACA,wBAAQA,MAAM,YAAd,uBACA,wBAAQA,MAAM,OAAd,kBACA,wBAAQA,MAAM,cAAd,yBACA,wBAAQA,MAAM,SAAd,oBACA,wBAAQA,MAAM,QAAd,uBAEJ,wEACA,cAAC,IAAD,CACI5E,UAAU,WACVgF,YAAY,eACZJ,MAAO1B,EAAM0C,QAAO,SAAAxD,GAAI,OAAIqE,EAAgBW,SAAShF,EAAKwC,UAC1DyC,QAASnE,EACT2B,SA1EK,SAACV,GAClBuC,EAAmBY,MAAMC,QAAQpD,GAAKA,EAAEzD,KAAI,SAAA8G,GAAC,OAAIA,EAAE5C,SAAS,KA0EhD6C,SAAO,EACPC,aAAW,IAEf,wDACA,oDAAc0C,EAAS,UAAvB,IAAiCpF,YAAY,uCAAuCqF,aAAc9D,KAClG,wBAAQtB,KAAK,SAAb,yC,QChDDqF,EA3CC,WAEhB,IAEM3D,EAAUC,cAEhB,EAA0B1H,IAATQ,GAAjB,EAAOE,SAAP,EAAiBF,OAWjB,OACI,eAAC,QAAD,WACE,qBAAKM,UAAU,YAAf,SACA,cAAC,IAAD,CAAMM,GAAE,IAAR,oBAEA,qBAAKN,UAAU,YAAf,SACA,cAAC,IAAD,CAAMM,GAAI,UAAYZ,EAAtB,uBAEA,qBAAKM,UAAU,YAAf,SACA,cAAC,IAAD,CAAMM,GAAE,SAAR,yBAEA,qBAAKN,UAAU,YAAf,SACA,cAAC,IAAD,CAAMM,GAAE,YAAR,4BAEA,qBAAKN,UAAU,YAAf,SACA,mBAAGC,KA9BS,gCA8BQ6E,OAAO,SAA3B,2BAEA,qBAAK9E,UAAU,YAAf,SACA,mBAAGE,MAAO,CAACqK,eAAgB,YAAapC,OAAQ,WAAYxE,QA3B5C,SAAAQ,GACpBA,EAAEC,iBAEF/E,aAAamL,QAEb/F,OAAOC,SAASC,SAChBgC,EAAQQ,KAAK,MAqBT,2BCiFSsD,EArHE,WACb,IAAQpI,EAAauF,cAAbvF,SACR,EACyFtB,EAAS,UAAYsB,GAD9G,IAAQpB,KAAQqB,EAAhB,EAAgBA,UAAWC,EAA3B,EAA2BA,QAAS6G,EAApC,EAAoCA,SAAU3I,EAA9C,EAA8CA,MAAO+H,EAArD,EAAqDA,MAAOgB,EAA5D,EAA4DA,SAAUf,EAAtE,EAAsEA,IAAKC,EAA3E,EAA2EA,OACvEhE,EADJ,EACIA,SAAUiE,EADd,EACcA,aAAcC,EAD5B,EAC4BA,0BAA2BC,EADvD,EACuDA,UAAoBxH,GAD3E,EACoEF,MADpE,EAC2EE,WAErEsF,EAAUC,cACV8D,EAAiB,CACnBpI,UAAWA,EACXC,QAASA,EACT6G,SAAUA,EACV3I,MAAOA,EACP+H,MAAOA,EACPgB,SAAUA,EACVf,IAAKA,EACLC,OAAQA,EACRhE,SAAUA,EACViE,aAAcA,EACdC,0BAA2BA,EAC3BC,UAAWA,GAGf,EAAmCsB,YAAQ,CACvCQ,cAAeD,IADXN,EAAR,EAAQA,SAAUvD,EAAlB,EAAkBA,aAkBlB,OACI,sBAAK7G,UAAU,YAAf,UACI,qBAAKA,UAAU,gBAAf,SACI,wBAAQ2D,QAPC,SAAAQ,GACjBwC,EAAQQ,KAAK,UAAY9E,IAMjB,4BAEJ,uBACA,2CACChB,GAAa,4CACd,cAAC,IAAD,CAAMf,GAAE,yBAA4BJ,MAAO,CAACE,SAAU,QAAtD,6BACCkC,GAAa,uBAAM4B,SAAU2C,GAvBrB,SAAA1C,GACb3C,MAAM,UAAYa,EAAU,CACxBiC,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAUqE,KACtB1C,MAAK,WACJkF,EAAQQ,KAAK,gBAiBC,UACV,uBACA,uBAAOyD,QAAQ,YAAf,uBACA,iDAAWR,EAAS,cAApB,IACIpF,YAAY,6BACZqF,aAAc/H,KAGlB,uBAAOsI,QAAQ,UAAf,qBACA,iDAAWR,EAAS,YAApB,IACIpF,YAAY,qBACZqF,aAAc9H,KAGlB,uBAAOqI,QAAQ,QAAf,mBACA,iDAAWR,EAAS,UAApB,IACIpF,YAAY,8CACZqF,aAAc5J,KAIlB,uBAAOmK,QAAQ,QAAf,mBACA,iDAAWR,EAAS,UAApB,IACIpF,YAAY,4BACZqF,aAAc7B,KAGlB,uBAAOoC,QAAQ,WAAf,0BACA,iDAAWR,EAAS,aAApB,IACIpF,YAAY,0BACZqF,aAAcb,KAIlB,uBAAOoB,QAAQ,MAAf,iBACA,iDAAWR,EAAS,QAApB,IACIpF,YAAY,4CACZqF,aAAc5B,KAGlB,uBAAOmC,QAAQ,WAAf,sBACA,iDAAWR,EAAS,aAApB,IACIpF,YAAY,iCACZqF,aAAc3F,KAGlB,uBAAOkG,QAAQ,eAAf,2CACA,iDAAWR,EAAS,iBAApB,IACIpF,YAAY,gDACZqF,aAAc1B,KAGlB,uBAAOiC,QAAQ,YAAf,uBACA,iDAAWR,EAAS,cAApB,IACIpF,YAAY,yBACZqF,aAAcxB,KAGlB,uBAAO+B,QAAQ,4BAAf,uCACA,iDAAWR,EAAS,8BAApB,IACIpF,YAAY,yDACZqF,aAAczB,KAElB,wBAAQ3D,KAAK,SAAb,sCCpDD4F,EA5DS,SAAC,GAAuB,IAArBrF,EAAoB,EAApBA,cAEvB,EAAsCrG,mBAAS,IAA/C,mBAAOyD,EAAP,KAAoBsD,EAApB,KACA,EAAgC/G,mBAAS,GAAzC,mBAAO0D,EAAP,KAAiBQ,EAAjB,KACA,EAA+BlE,mBAASmE,KAAKC,KAA7C,mBAAOT,EAAP,KAAiBU,EAAjB,KACA,EAAkCrE,mBAAS,IAA3C,mBAAO2L,EAAP,KAAkBC,EAAlB,KACA,EAAmC5L,mBAAS,IAA5C,mBAAO4D,EAAP,KAAmBiI,EAAnB,KAEMC,EAAiB,SAAAvI,GAAI,OAAI,SAAAyB,GAC3BA,EAAEC,iBAEF8B,EAAexD,EAAKE,aACpBS,EAAYX,EAAKG,UACjBW,EAAWd,EAAKI,UAChBiI,EAAa,aACbC,EAAatI,EAAKK,YAClB,IAAMmI,EAAU,CAAEtI,cAAaC,WAAUC,WAAUgI,YAAW/H,cAE9D8C,QAAQC,IAAIoF,GAEZ1J,MAAM,aAAekB,EAAKK,WAAa,UAAYL,EAAK9B,GAAI,CACxD0D,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAU4C,KACtBjB,MAAK,WACJgD,OAAOC,SAASC,cAKlBwG,EAAe,SAAAzI,GAAI,OAAI,SAAAyB,GACzBA,EAAEC,iBAEF5C,MAAM,aAAekB,EAAKK,WAAa,UAAYL,EAAK9B,GAAI,CACxD0D,OAAQ,WACT7C,MAAK,WACJgD,OAAOC,SAASC,cAIxB,OACI,qBAAK3E,UAAU,qBAAf,SACKwF,EAAc9E,KAAI,SAACgC,GAAD,OACf,sBAAK1C,UAAU,uBAAf,UACQ,gCACI,6BAAK0C,EAAKE,cACV,4CAAeF,EAAKI,eAGxB,4CAAeJ,EAAKG,YACpB,sEACA,cAAC,EAAD,CAAqBX,QAASQ,EAAK9B,MAChC8B,EAAKoI,WAAa,wBAAQ9K,UAAU,uBAAuB2D,QAASsH,EAAevI,GAAjE,sBACrB,wBAAQ1C,UAAU,qBAAoB2D,QAASwH,EAAazI,GAA5D,sBAVmCA,EAAK9B,UCRjDwK,EAhCM,WACjB,IAAQxK,EAAOgH,cAAPhH,GACR,EAA0DG,EAAS,aAAeH,GAApED,EAAd,EAAQM,KAER,GAFA,EAAuBoK,aAAvB,EAAqCC,iBAEuBvK,EAAS,aAAeH,EAAK,WAA3E4E,EAAd,EAAQvE,KAAiCsK,GAAzC,EAA6BC,WAA7B,EAAyCD,gBAEnC5E,EAAUC,cAMhB,OACI,sBAAK5G,UAAU,gBAAf,UACI,qBAAKA,UAAU,gBAAf,SACI,wBAAQ2D,QAPC,SAAAQ,GACjBwC,EAAQQ,KAAK,aAAevG,IAMpB,kCAEJ,uBACE2K,GAAkB,4CAClB5K,GAAW,+BAAKA,EAAQE,KAAb,aACb,uDACE2E,GAAiB,cAAC,EAAD,CAAiBA,cAAeA,EAAcI,QAAO,SAAAlD,GAAI,OAAKA,EAAKoI,eACtF,yDACEtF,GAAiB,cAAC,EAAD,CAAiBA,cAAeA,EAAcI,QAAO,SAAAlD,GAAI,OAAIA,EAAKoI,eAErF,qBAAK9K,UAAU,0BAAf,SACMwF,GAAiB,cAAC,IAAD,CAAMlF,GAAE,oBAAeK,EAAQC,GAAvB,aAAsCZ,UAAU,kBAAxD,4BCiFpByL,EA3GQ,WACnB,IAAQ7K,EAAOgH,cAAPhH,GAER,EAAsCzB,mBAAS,IAA/C,mBAAOyD,EAAP,KAAoBsD,EAApB,KACA,EAA+B/G,mBAASmE,KAAKC,KAA7C,mBAAOT,EAAP,KAAiBU,EAAjB,KACA,EAAgCrE,mBAAS,GAAzC,mBAAO0D,EAAP,KAAiBQ,EAAjB,KACA,EAAkClE,oBAAS,GAA3C,mBAAO2L,EAAP,KAAkBC,EAAlB,KACA,EAA0C5L,mBAAS,IAAnD,mBAAOgD,EAAP,KAAsBuJ,EAAtB,KAEA,EAA4C3K,EAAS,aAAeH,GAAtDD,EAAd,EAAQM,KAAsBI,GAA9B,EAAuBF,MAAvB,EAA8BE,WAC9B,EAAyEN,EAAS,8BAAgCH,GAApG+K,EAAd,EAAQ1K,KAEF0F,GAFN,EAA4BiF,kBAA5B,EAA+CC,sBAE/BjF,eAMVC,EAAY,uCAAG,WAAM1C,GAAN,qBAAA2C,EAAA,6DACjB3C,EAAEC,iBAEI0H,EAAiB,CAAElJ,cAAaE,WAAUD,WAAUiI,aAHzC,SAKMtJ,MAAM,aAAeb,EAAQC,GAAK,SAAU,CAC/D0D,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAUgM,KARR,cAKX9E,EALW,gBAWUA,EAASnF,OAXnB,OAWXoF,EAXW,OAYX/E,EAAU+E,EAAarG,GAE7BuB,EAAczB,KAAI,SAAA2B,GACd,IAAM0J,EAAgB,CAAE1J,WAAUH,WAElCV,MAAM,iBAAkB,CACpB8C,OAAQ,OACRC,QAAS,CAAE,eAAgB,oBAC3BC,KAAMhF,KAAKM,UAAUiM,QAI7BpF,EAAQQ,KAAK,aAAevG,GAxBX,4CAAH,sDA+BlB,OACI,sBAAKZ,UAAU,mBAAf,UACI,qBAAKA,UAAU,gBAAf,SACI,wBAAQ2D,QAPC,SAAAQ,GACjBwC,EAAQQ,KAAK,aAAevG,EAAK,WAMzB,gCAEJ,uBACA,gDACCS,GAAa,4CACbV,GAAW,uBAAMuD,SAAU2C,EAAhB,UACR,gDACA,uBACI5B,KAAK,OACLF,UAAQ,EACRH,MAAOhC,EACPiC,SAAU,SAACV,GAAD,OAAO+B,EAAe/B,EAAEW,OAAOF,QACzCI,YAAY,2BAIhB,wDACA,uBACIC,KAAK,OACLF,UAAQ,EACRH,MAAO9B,EACP+B,SAAU,SAACV,GAAD,OAAOX,EAAWW,EAAEW,OAAOF,QACrCI,YAAY,+BAGhB,sFACA,yBAAQD,UAAQ,EAACH,MAAO/B,EAAUgC,SAAU,SAACV,GAAD,OAAOd,EAAYc,EAAEW,OAAOF,QAAxE,UACQ,wBAAQA,MAAM,IAAd,eACA,wBAAQA,MAAM,IAAd,eACA,wBAAQA,MAAM,IAAd,eACA,wBAAQA,MAAM,IAAd,kBAGR,qEACA,cAAC,IAAD,CACI5E,UAAU,WACVgF,YAAY,eACZJ,MAAO+G,EAAa/F,QAAO,SAAAxD,GAAI,OAAID,EAAciF,SAAShF,EAAKwC,UAC/DyC,QAASsE,EACT9G,SA7EK,SAACV,GAClBuH,EAAiBpE,MAAMC,QAAQpD,GAAKA,EAAEzD,KAAI,SAAA8G,GAAC,OAAIA,EAAE5C,SAAS,KA6E9C6C,SAAO,EACPC,aAAW,IAGf,2CACA,yBAAQ9C,MAAOkG,EAAWjG,SAAU,SAACV,GAAD,OAAO4G,EAAa5G,EAAEW,OAAOF,QAAjE,UACI,wBAAQA,MAAM,aAAd,uBACA,wBAAQA,MAAM,YAAd,0BAEJ,qD,SCvGDoH,E,8EAAf,WAAyBC,GAAzB,SAAAnF,EAAA,+EACWtF,MAAM,eAAgB,CACzB8C,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMhF,KAAKM,UAAUmM,KAEtBxK,MAAK,SAAAR,GAAI,OAAIA,EAAKY,WARzB,4C,sBAWe,SAASqK,EAAT,GAA8B,IAAbtM,EAAY,EAAZA,SAC5B,EAAgCT,qBAAhC,mBAAOkD,EAAP,KAAiB8J,EAAjB,KACA,EAAgChN,qBAAhC,mBAAOiK,EAAP,KAAiBC,EAAjB,KAEMxC,EAAY,uCAAG,WAAM1C,GAAN,eAAA2C,EAAA,6DACjB3C,EAAEC,iBADe,SAEG4H,EAAU,CAC5B3J,WACA+G,aAJe,OAMC,KAJZ1J,EAFW,QAMRA,MACLE,EAASF,GAETkE,SAASC,uBAAuB,sBAAsB,GAAG3D,MAAM4D,QAAU,QAT5D,2CAAH,sDAelB,OACI,sBAAK9D,UAAU,QAAf,UACI,qDACA,uBAAMkE,SAAU2C,EAAhB,UACI,uBAAO5B,KAAK,OAAOrE,GAAG,QAAQwL,MAAM,gBAAgBvL,KAAK,QAAQmE,YAAY,QACzEH,SAAU,SAAAV,GAAC,OAAIgI,EAAYhI,EAAEW,OAAOF,UACxC,uBAAOK,KAAK,WAAWrE,GAAG,WAAWwL,MAAM,eAAevL,KAAK,QAAQmE,YAAY,WAC/EH,SAAU,SAAAV,GAAC,OAAIkF,EAAYlF,EAAEW,OAAOF,UACxC,qBAAK5E,UAAU,qBAAqBE,MAAO,CAAC4D,QAAS,QAArD,SACI,uDAEJ,qBAAK9D,UAAU,QAAf,SACI,cAAC,IAAD,CAAMM,GAAE,mBAAR,+BAEJ,wBAAQ2E,KAAK,SAAb,0BC3ChB,IA8DeoH,EA9DQ,WACrB,MAAsClN,mBAAS,IAA/C,mBAAOmN,EAAP,KAAoBC,EAApB,KACA,EAAsCpN,mBAAS,IAA/C,mBAAOqN,EAAP,KAAoBC,EAApB,KACA,EAA0BvN,IAATQ,GAAjB,EAAOE,SAAP,EAAiBF,OACDkH,cAJW,SAMd8F,IANc,2EAM7B,sBAAA5F,EAAA,+EACStF,MAAM,yBAA0B,CACnC8C,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMhF,KAAKM,UAAU,CACnBuC,SAAU3C,EACV4M,YAAaA,EACbE,YAAaA,MAEhB/K,MAAK,SAAAR,GAAI,OAAIA,EAAKY,WAXvB,4CAN6B,sBAoB3B,IAAMgF,EAAY,uCAAG,WAAM1C,GAAN,SAAA2C,EAAA,6DACjB3C,EAAEC,iBADe,SAEKsI,IAFL,OAII,QAJJ,OAIN5L,OACR8C,SAASC,uBAAuB,sBAAsB,GAAG3D,MAAM4D,QAAU,QAG1EF,SAASC,uBAAuB,wBAAwB,GAAG3D,MAAM4D,QAAU,QAR5D,2CAAH,sDAYpB,OACE,sBAAK9D,UAAU,kBAAf,UACI,iDACA,qDACA,uBACE6E,SAAU,SAACV,GAAD,OAAOoI,EAAepI,EAAEW,OAAOF,QACzCI,YAAY,qBAGd,iDACA,uBACEH,SAAU,SAACV,GAAD,OAAOsI,EAAetI,EAAEW,OAAOF,QACzCI,YAAY,iBAGd,wBAAQrB,QAASkD,EAAjB,6BAEA,oBAAI7G,UAAU,qBAAqBE,MAAO,CAAC4D,QAAS,QAApD,gCAEA,sBAAK9D,UAAU,uBAAuBE,MAAO,CAAC4D,QAAS,QAAvD,UACE,6EACA,cAAC,IAAD,CAAMxD,GAAE,IAAR,sCCxCOqM,EAfS,WAEpB,MAA2D5L,EAAS,aAAvDP,EAAb,EAAOS,KAA+B2L,GAAtC,EAAuBC,cAAvB,EAAsCD,mBAEtC,OACI,sBAAK5M,UAAU,mBAAf,UACI,8CACA,uBACE4M,GAAqB,4CACrBpM,GAAY,cAAC,EAAD,CAAaA,SAAUA,EAAUC,MAAM,qB,SCTlDqM,E,8EAAf,WAA6BC,GAA7B,SAAAjG,EAAA,+EACWtF,MAAM,yBAA0B,CACnC8C,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMhF,KAAKM,UAAUiN,KAEtBtL,MAAK,SAAAR,GAAI,OAAIA,EAAKY,WARzB,4C,sBAWA,IAqDemL,EArDQ,WAEnB,MAAgC7N,mBAAS,KAAzC,mBAAOkD,EAAP,KAAiBoB,EAAjB,KACMkD,EAAUC,cAGVC,EAAY,uCAAG,WAAM1C,GAAN,eAAA2C,EAAA,yDACjB3C,EAAEC,iBAEa,KAAZ/B,EAHc,uBAKP0K,EAAM,CACR1K,SAAUA,EACVmK,YAAaS,KAAKC,SAASC,SAAS,IAAIC,QAAQ,WAAY,KAPnD,SAUUN,EAAcC,GAVxB,OAWS,SAXT,OAWDjM,QACR8C,SAASC,uBAAuB,cAAc,GAAG3D,MAAM4D,QAAU,OACjEF,SAASC,uBAAuB,sBAAsB,GAAG3D,MAAM4D,QAAU,UAEzEF,SAASC,uBAAuB,sBAAsB,GAAG3D,MAAM4D,QAAU,OACzEF,SAASC,uBAAuB,cAAc,GAAG3D,MAAM4D,QAAU,SAhBxD,2CAAH,sDA2BlB,OACI,sBAAK9D,UAAU,kBAAf,UACI,uBAAMkE,SAAU2C,EAAhB,UACI,iDACA,qDACA,uBAAO5B,KAAK,OAAOD,YAAY,WAAWH,SAAU,SAAAV,GAAC,OAAIV,EAAYU,EAAEW,OAAOF,UAC9E,qBAAK5E,UAAU,qBAAqBE,MAAO,CAAC4D,QAAS,QAArD,SACI,gEAEJ,qBAAK9D,UAAU,aAAaE,MAAO,CAAC4D,QAAS,QAA7C,SACI,wDAEJ,+CAEJ,wBAAQH,QApBK,SAAAQ,GACjBA,EAAEC,iBACFuC,EAAQQ,KAAK,MAkBT,oCCqCGkG,MA3Ef,WAEE,MAA4BnO,IAApBQ,EAAR,EAAQA,MAAOE,EAAf,EAAeA,SAEf,OAAIF,EAgBF,cAAC,IAAD,UACE,sBAAKM,UAAU,MAAf,UACA,cAAC,EAAD,IACE,cAAC,EAAD,IACA,qBAAKA,UAAU,UAAf,SACE,eAAC,IAAD,WACE,cAAC,IAAD,CAAOsN,OAAK,EAACC,KAAK,IAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,kBAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,YAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,cAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,SAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,yBAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,mBAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,uBAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,YAAlB,SACE,cAACC,EAAD,MAEF,cAAC,IAAD,CAAOF,OAAK,EAACC,KAAK,yBAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,sBAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,gBAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,oBAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOA,KAAK,IAAZ,SACE,cAAC,EAAD,gBA5DR,cAAC,IAAD,UACE,eAAC,IAAD,WACE,cAAC,IAAD,CAAOD,OAAK,EAACC,KAAK,mBAAlB,SACE,cAAC,EAAD,MAEF,cAAC,IAAD,CAAOA,KAAK,IAAZ,SACE,cAACrB,EAAD,CAAOtM,SAAUA,YCvBd6N,EAZS,SAAAC,GAClBA,GAAeA,aAAuBC,UACxC,6BAAqBlM,MAAK,YAAkD,IAA/CmM,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QAC3DJ,EAAOF,GACPG,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAQN,OCDdO,IAASC,OACP,cAAC,IAAMC,WAAP,UACE,cAAC,EAAD,MAEFvK,SAASwK,eAAe,SAM1BX,M","file":"js/main.4429b17a.chunk.js","sourcesContent":["import { useState } from 'react';\n\nexport default function useToken() {\n    const getToken = () => {\n        const tokenString = localStorage.getItem('token');\n        const userToken = JSON.parse(tokenString);\n        return userToken?.token\n    };\n    \n    const [token, setToken] = useState(getToken());\n\n    const saveToken = userToken => {\n        localStorage.setItem('token', JSON.stringify(userToken));\n        setToken(userToken.token);\n    };\n\n    return {\n        setToken: saveToken,\n        token\n    }\n\n}","import { Link } from 'react-router-dom'\nimport useToken from './useToken';\n\nconst Navbar = () => {\n    const {setToken, token} = useToken();\n\n    return (\n        <nav className=\"navbar\" >\n            <a href=\"/\" style={{ \n                color: '#ff4e83',\n                fontSize: '20px',\n                borderRadius: '8px' \n            }}>InAGlobe Platform</a>\n            <div className=\"links\"> \n                <Link to={`/create-project`}>New Project</Link>\n                <Link to={`/users/` + token}>My Profile</Link>\n            </div>\n        </nav>\n    );\n}\n \nexport default Navbar;","import { Link } from 'react-router-dom'\n\nconst ProjectList = ({ projects, title }) => {\n\n    return (\n        <div className=\"project-list\">\n            <h2>{title}</h2>\n            {projects.map((project) => (\n                <div className=\"preview\" key={project.id}>\n                    <Link to={`/projects/${project.id}`}>\n                        <h2>{project.name}</h2>\n                        <h3>{project.status}</h3>\n                    </Link>\n                </div>\n            ))}\n        </div>\n    );\n}\n \nexport default ProjectList;","import { useState, useEffect } from 'react';\n\nconst useFetch = (url) => {\n  const [data, setData] = useState([]);\n  const [error, setError] = useState(null);\n  const [isPending, setIsPending] = useState(true);\n\n  useEffect(() => {\n    fetch(url)\n        .then(res => {\n            if (!res.ok) { // error coming back from server\n                throw Error('could not fetch the data for that resource');\n            } \n            return res.json();\n        })\n        .then(data => {\n            setData(data);\n            setIsPending(false);\n            setError(null);\n        })\n        .catch(err => {\n            // auto catches network / connection error\n            setError(err.message);\n        })\n  }, [url])\n\n  return { data, error, isPending };\n}\n \nexport default useFetch;","import { Link } from 'react-router-dom'\nimport useFetch from './useFetch';\n\nconst UsersAssignedToTask = ({task_id, title}) => {\n\n    const { data: assignedUsers, error, isPending } = useFetch(\"/assigned_task/task/\" + task_id);\n\n    return assignedUsers.map((user) => (\n        <div className=\"assigned_users_list\">\n            <Link to={`/users/${user.username}`}>\n                <h5>{user.firstname} {user.surname}</h5>\n            </Link>\n        </div>\n    ));\n\n}\n\nexport default UsersAssignedToTask;","import { Link } from 'react-router-dom'\nimport useFetch from './useFetch';\nimport UsersAssignedToTask from './UsersAssignedToTask';\n\nconst MyProjectTasks = ({ tasks, title }) => {\n    const FindingUsers = task_id => {\n        const { data: assignedUsers, error, isPending } = useFetch(\"/assigned_task/task/\" + task_id);\n        return assignedUsers.map((user) => (\n            <div className=\"assigned-users-list\">\n                <Link to={`/users/${user.username}`}>\n                    <h5>{user.firstname} {user.surname}</h5>\n                </Link>\n            </div>\n        ));\n    }\n\n    return (\n        <div>\n            <h2>{title}</h2>\n\n            <div className=\"my-project-tasks\">\n                {tasks.map((task) => (\n                    <div className=\"task-preview\" key={task.id}>\n                        <h2>{task.project_name}: {task.description}</h2>\n                        <h3><strong>Priority level:</strong> {task.priority}</h3>\n                        <h3><strong></strong> {task.priority}</h3>\n                        <h3><strong>To be done by:</strong> {task.due_date}</h3>\n                        <h3>All volunteers assigned to this task: </h3>\n                        <UsersAssignedToTask task_id={task.id} />\n                        <Link to={`/projects/${task.project_id}`}>\n                            <h4>Click to see the project details</h4>\n                        </Link>\n                    </div>\n                ))}\n            </div>\n        </div>\n    );\n}\n\nexport default MyProjectTasks;","import useFetch from './useFetch'\nimport { useState } from \"react\";\nimport useToken from './useToken'\n\nconst PersonalToDo = ({ todos, title }) => {\n\n    const openTaskForm = () => {\n        document.getElementsByClassName(\"add-todo-form\")[0].style.display = \"block\";\n    }\n    const {setToken, token} = useToken();\n\n\n    const { data: users, error, isPending } = useFetch(\"/users\")\n\n    const [todo_desc, setTodoDesc] = useState(\"\");\n    const [priority, setPriority] = useState(1);\n    const [due_date, setDueDate] = useState(Date.now());\n    const [username, setUsername] = useState(token);\n\n    const handleSubmit = e => {\n        document.getElementsByClassName(\"add-todo-form\")[0].style.display = \"none\";\n\n        e.preventDefault();\n        const newTodo = { todo_desc, priority, due_date, username };\n\n        fetch(\"/todos\", {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(newTodo)\n        }).then(() => {\n            window.location.reload();\n        })\n    }\n\n    const handleRemove = id => e => {\n        e.preventDefault();\n        fetch(\"/todos/\" + id, { method: 'DELETE' })\n            .then(() => {\n                window.location.reload();\n            })\n    };\n\n    return (\n        <div className=\"todo-list\" style={{float: \"right\"}}>\n            <h2>{title}</h2>\n\n            <div className=\"add-todo-button\">\n                <button onClick={openTaskForm}>Add a personal task</button>\n            </div>\n\n            { todos && (Object.keys(todos).length === 0) && <h3 style={{float: \"right\"}}>Well done you have no ToDo items!</h3>}\n\n            { isPending && <h2>Loading...</h2> }\n\n            <div className=\"add-todo-form\">\n                { users && <form onSubmit={handleSubmit}>\n                    <label>Task description [required]</label>\n                    <textarea value={todo_desc} onChange={(e) => setTodoDesc(e.target.value)} required placeholder=\"Add some awesome description!\" ></textarea>\n                    <label>Priority level (1: lowest, 4: highest)</label>\n                    <select value={priority} onChange={(e) => setPriority(e.target.value)} >\n                        <option value=\"1\">1</option>\n                        <option value=\"2\">2</option>\n                        <option value=\"3\">3</option>\n                        <option value=\"4\">4</option>\n                    </select>\n                    <label>When should this task be done by? [required]</label>\n                    <input\n                        required\n                        type=\"date\"\n                        value={due_date}\n                        onChange={(e) => setDueDate(e.target.value)}\n                    />\n                    <label>Assigned user</label>\n                    <select value={username} onChange={(e) => setUsername(e.target.value)} >\n                        {users.map(user => <option value={user.username}>{user.username}</option>)}\n                    </select>\n                    <button>Save task</button>\n                </form> }\n            </div>\n\n            <div className=\"personal-todos\">\n                {todos.map((todo) => (\n                    <div className=\"todo-preview\" key={todo.id}>\n                        <h2>{todo.todo_desc}</h2>\n                        <h3>Priority level: {todo.priority}</h3>\n                        <h3>To be done by: {todo.due_date}</h3>\n                        <button onClick={handleRemove(todo.id)}>Complete</button>\n                    </div>\n                ))}\n            </div>\n\n        </div>\n    );\n\n}\n\nexport default PersonalToDo;","import ProjectList from './ProjectList';\nimport MyProjectTasks from './MyProjectTasks';\nimport PersonalToDo from './PersonalToDo';\nimport useFetch from './useFetch';\nimport useToken from './useToken';\nimport { useState } from \"react\";\n\nconst Home = () => {\n\n    const { data: todos, errorTodos, isPendingTodos } = useFetch(\"/todos\");\n    const { setToken, token } = useToken();\n\n    const { data: projects, errorRProjects, isPendingRProjects } = useFetch(\"/user_project/username/\" + token);\n    const {data: project_tasks, errorProjectTasks, isPendingProjectTasks} = useFetch(\"/assigned_task/username/\" + token)\n\n    const { data: {firstname, surname}} = useFetch(\"/users/name/\" + token);\n    const myTodos = todos.filter(todo => todo.username === token);\n\n  \n    return (\n        <div className=\"home\">\n            <h1>Welcome back, {firstname}!</h1>\n            {console.log(\"Firstname: \" )}\n            <div className=\"home-projects\" style={{ float: \"left\", width: \"600px\" }}>\n                {isPendingRProjects && <h2>Loading...</h2>}\n                {projects && <ProjectList projects={projects} title=\"My Projects\" />}\n                {projects && (Object.keys(projects).length === 0) && <h3>You are not assigned to any project currently</h3>}\n            </div>\n            <div className=\"homeTodos\" style={{ float: \"right\", width: \"300px\" }}>\n                {isPendingTodos && <h2>Loading...</h2>}\n                {todos && <PersonalToDo todos={myTodos} title=\"Personal ToDo items\" />}\n            </div>\n            <div className=\"home-project-tasks\" style={{ float: \"left\", width: \"600px\" }}>\n                {isPendingRProjects && <h2>Loading...</h2>}\n                {projects && <MyProjectTasks tasks={project_tasks} title=\"My tasks from all projects\" />}\n                {projects && (Object.keys(project_tasks).length === 0) && <h3>Well done you have no project tasks!</h3>}\n            </div>\n        </div>\n\n    );\n}\n\nexport default Home;","import { useState } from \"react\";\nimport { useHistory } from \"react-router-dom\"\nimport Select from 'react-select';\nimport useFetch from './useFetch'\n\nconst CreateProject = () => {\n    const [name, setName] = useState(\"\");\n    const [description, setDescription] = useState(\"\");\n    const [status, setStatus] = useState(\"Available\");\n    const [tag, setTag] = useState(\"Other\");\n    const [location, setLocation] = useState(\"\");\n    const [files, setFiles] = useState(\"\");\n\n    const [selectUsernames, setSelectUsernames] = useState([]);\n\n    const history = useHistory();\n\n    const { data: users, error, isPending } = useFetch(\"/users/user_project\");\n\n    const usernames = users.map(user => user.username);\n\n    const handleChange = (e) => {\n        setSelectUsernames(Array.isArray(e) ? e.map(x => x.value) : []); \n    }\n\n    const handleSubmit = async e => {\n        e.preventDefault()\n\n        const newProject = { name, description, status, tag, location, files };\n\n        const response = await fetch(\"/projects\", {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(newProject)\n        });\n\n        const responseJSON = await response.json();\n\n        const project_id = responseJSON.id;\n\n        selectUsernames.map(username => {\n            const assign_project = { username, project_id };\n\n            fetch(\"/user_project\", {\n                method: 'POST',\n                headers: { \"Content-Type\": \"application/json\" },\n                body: JSON.stringify(assign_project)\n            });\n        });\n\n        history.push(\"/\");\n    }\n\n    return (\n        <div className=\"create-project\">\n            <br />\n            <h2>Add a new project</h2>\n            <form onSubmit={handleSubmit}>\n                <label>Project name [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={name}\n                    onChange={(e) => setName(e.target.value)}\n                    placeholder=\"Input project name\"\n                />\n                <label>Description [required]</label>\n                <textarea required placeholder=\"Add some awesome description!\" value={description} onChange={(e) => setDescription(e.target.value)}></textarea>\n                <label>Status</label>\n                <select value={status} onChange={(e) => setStatus(e.target.value)}>\n                    <option value=\"Progress\">Progress</option>\n                    <option value=\"Available\">Available</option>\n                    <option value=\"Completed\">Completed</option>\n                </select>\n                <label>Location</label>\n                <input\n                    type=\"text\"\n                    value={location}\n                    onChange={(e) => setLocation(e.target.value)}\n                    placeholder=\"Eg: United Kingdom\"\n                />\n                <label>Type of project [required]</label>\n                <select required value={tag} onChange={(e) => setTag(e.target.value)}>\n                    <option value=\"Social\">Social</option>\n                    <option value=\"Education\">Education</option>\n                    <option value=\"Wash\">Wash</option>\n                    <option value=\"Environment\">Environment</option>\n                    <option value=\"Health\">Health</option>\n                    <option value=\"Other\">Other</option>\n                </select>\n                <label>Volunteers assigned to this project</label>\n                <Select\n                    className=\"dropdown\"\n                    placeholder=\"Select Users\"\n                    value={users.filter(user => selectUsernames.includes(user.value))}\n                    options={users} // set list of the usernames\n                    onChange={handleChange} // assign onChange function\n                    isMulti\n                    isClearable\n                />\n                <label>Google Drive folder</label>\n                <textarea placeholder=\"Copy the link to the Google Drive folder for this project\" value={files} onChange={(e) => setFiles(e.target.value)}></textarea>\n                <button>Add project</button>\n            </form>\n        </div>\n    );\n}\n\n\nexport default CreateProject;","import { useHistory, useParams } from 'react-router';\nimport useFetch from './useFetch'\nimport { Link } from \"react-router-dom\"\n\nconst ProjectDetails = () => {\n    const { id } = useParams();\n    const history = useHistory();\n\n    const { data: project, error, isPending } = useFetch(\"/projects/\" + id)\n    const { data: assignments, errorAssignment, isPendingAssignment } = useFetch(\"/user_project/project/\" + id)\n\n    const handleRemove = e => {\n        e.preventDefault()\n        fetch(\"/projects/\" + id, { method: 'DELETE' })\n            .then(() => { history.push('/'); })\n    };\n\n    const handleReturn = e => {\n        history.push('/');\n    }\n\n    return (\n        <div className=\"project-details\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To Dashboard</button>\n            </div>\n            <br />\n            { isPending && <h2>Loading...</h2> }\n            { project && <h2>{project.name}</h2> }\n            { project && <button style={{\n                fontSize: '20px',\n                color: '#fff',\n                marginBottom: '30px',\n                marginright: '10px',\n                borderRadius: '8px',\n                backgroundColor: '#f1b535',\n                cursor: 'default'\n            }}>Status: {project.status}</button>}\n            {project && <button style={{\n                fontSize: '20px',\n                color: '#fff',\n                marginBottom: '30px',\n                marginRight: '10px',\n                borderRadius: '8px',\n                backgroundColor: '#595bc0',\n                cursor: 'default'\n            }}>{project.tag}</button>}\n            {project && <h4>Location: {project.location}</h4>}\n            {project && <button onClick={(e) => {\n                e.preventDefault();\n                window.open(project.files, \"_blank\");\n            }}>Documents</button>}\n            {project && <p>{project.description}</p>}\n\n            <h3>Volunteers working on this project</h3>\n            <div className=\"project_user_assignment_list\">\n                {assignments.map(a => (\n                    <div className=\"assigned_users_preview\" style={{float: \"left\", width: \"50%\"}} key={a.id}>\n                        <Link to={`/users/${a.username}`}>\n                            <h4>{a.username}</h4>\n                        </Link>\n                    </div>)\n                )\n                }\n            </div>\n\n            <div className=\"project-tasks\">\n                {project && <Link to={`/projects/${project.id}/tasks`} className=\"view-tasks-button\">View Tasks</Link>}\n\n                {project && <Link to={`/projects/${project.id}/add-task`} className=\"add-task-button\">Add Task</Link>}\n            </div>\n\n            <div>\n                {project && <button onClick={handleRemove}>Delete project</button>}\n\n                {project && <Link to={`/edit-project/${project.id}`} className=\"edit-project-button\">Edit project</Link>}\n            </div>\n\n        </div>\n\n    );\n}\n\nexport default ProjectDetails;","import { Link } from \"react-router-dom\"\n\nconst PageNotFound = () => {\n    return (\n        <div className=\"page-not-found\">\n            <h2>Something went wrong...</h2>\n            <p>That page cannot be found</p>\n            <Link to='/'>Back to the main page</Link>\n        </div>\n    );\n}\n \nexport default PageNotFound;","import { useHistory, useParams } from 'react-router';\nimport useFetch from './useFetch'\nimport useToken from './useToken';\n\nconst MyProfile = () => {\n    const {setToken, token} = useToken();\n\n    const {data: user, error, isPending} = useFetch(\"/users/\" + token)\n\n    return (\n        <div className=\"my-profile\">\n            { isPending && <h2>Loading...</h2> }\n            { user && <h2>{user.firstname + \" \" + user.surname}</h2> }\n            { user && <h1>{\"Username: \" + user.token}</h1> }\n            { user && <h1>{\"Title: \" + user.title}</h1> }\n            { user && <h1>{\"Email: \" + user.email}</h1> }\n            { user && <h1>{\"Bio: \" + user.bio}</h1> }\n            { user && <h1>{\"Joined: \" + user.joined}</h1> }\n            { user && <h1>{\"Location: \" + user.location}</h1> }\n            { user && <h1>{\"Availability: \" + user.availability}</h1> }\n            { user && <h1>{\"Partnership Opportunities: \" + user.partnership_opportunities}</h1> }\n            { user && <h1>{\"Interests: \" + user.interests}</h1> }    \n        </div>\n    );\n}\n\nexport default MyProfile;","import { useHistory, useParams } from 'react-router';\nimport useFetch from './useFetch'\nimport { Link } from \"react-router-dom\"\nimport useToken from './useToken';\n\nconst User = () => {\n    const {username} = useParams();\n    const history = useHistory();\n    const {setToken, token} = useToken();\n    \n    const {data: user, error, isPending} = useFetch(\"/users/\" + username)\n    \n    const handleRemove = e => {\n        e.preventDefault()\n        fetch(\"/users/\" + username, {method: 'DELETE'})\n            .then(()=> {history.push('/');})\n      };\n\n    const handleReturn = e => {\n        history.push('/users');\n    }\n\n    return (\n        <div className=\"user\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To All Users</button>\n            </div>\n            <br />\n            { isPending && <h2>Loading...</h2> }\n            { user && <div>\n                <h2>{user.firstname + \" \" + user.surname}</h2>\n            </div> }\n\n            { user && <div>\n                <h3><strong>Username: </strong>{user.username}</h3>\n                <h3><strong>Email: </strong>{user.email}</h3>       \n                <h3><strong>Title: </strong>{user.title}</h3>\n                <h3><strong>Joined: </strong>{user.joined}</h3>\n                <h3><strong>Location: </strong>{user.location}</h3>\n                <h3><strong>Availability: </strong>{user.availability}</h3>\n            </div> }\n\n            <br />\n\n            { user && <div>\n                <label><strong>Bio</strong></label>\n                <p>{user.bio}</p>\n            </div> }\n            \n            { user && <div>\n                <label><strong>Partnership Opportunities</strong></label>\n                <p>{user.partnership_opportunities}</p>\n            </div> }\n\n            { user && <div>\n                <label><strong>Interests</strong></label>\n                <p>{user.interests}</p>\n            </div> }\n\n            { user && (token == \"jaimeaguilera\" || username == token) && <button onClick={handleRemove}>Delete user</button> }\n            \n            { user && (token == \"jaimeaguilera\" || username == token) && <Link to={`/edit-user/${username}`} className=\"edit-user-button\">Edit details</Link> }\n    </div>\n    );\n}\n \nexport default User;","import { Link } from 'react-router-dom'\n\nconst UserList = ({ users }) => {\n\n    return (\n        <div className=\"user-list\">\n\n            {users.map((user) => (\n                <div className=\"preview\" key={user.username}>\n                    <Link to={`/users/${user.username}`}>\n                        <h2>{user.username}</h2>\n                    </Link>\n                </div>\n            ))}\n        </div>\n    );\n}\n \nexport default UserList;\n","import UserList from './UserList'\nimport useFetch from './useFetch'\nimport useToken from './useToken'\nimport { Link } from 'react-router-dom'\n\nconst Users = () => {\n\n    const {data: users, error, isPending} = useFetch(\"/users\")\n    const {setToken, token} = useToken();\n\n    return (\n        <div className=\"users\">\n            <h1>Users</h1>\n            { token == \"jaimeaguilera\" && <Link to={`/add-user`} className=\"add-user-button\">Add User</Link> }\n            <br />\n            <br />\n            { isPending && <h2>Loading...</h2> }\n            { users && <UserList users={users} title=\"All Users\"/> }\n        </div>\n    );\n}\n \nexport default Users;","import { useState } from \"react\";\nimport { useHistory } from \"react-router-dom\"\n\nconst AddUser = () => {\n    const [firstname, setFirstname] = useState(\"\");\n    const [surname, setSurname] = useState(\"\");\n    const [password, setPassword] = useState(\"\");\n    const [title, setTitle] = useState(\"\")\n    const [email, setEmail] = useState(\"\");\n    const [phone_no, setPhoneNo] = useState(\"\");\n    const [bio, setBio] = useState(\"\");\n    const [joined, setJoined] = useState(Date.now());\n    const [location, setLocation] = useState(\"\");\n    const [availability, setAvailability] = useState(\"\");\n    const [partnership_opportunities, setPartnership_opportunities] = useState(\"\");\n    const [interests, setInterests] = useState(\"\");\n    const [username, setUsername] = useState(\"\");\n\n    const history = useHistory();\n\n    const handleSubmit = e => {\n        e.preventDefault()\n\n        const newUser = {\n            firstname,\n            surname,\n            password,\n            title,\n            email,\n            phone_no,\n            bio,\n            joined,\n            location,\n            availability,\n            partnership_opportunities,\n            interests,\n            username\n        }\n\n        fetch(\"/users\", {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(newUser)\n        }).then(() => {\n            history.push('/users');\n        })\n    }\n\n    const handleReturn = e => {\n        history.push('/users');\n    }\n\n    return (\n        <div className=\"add-user\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To All Users</button>\n            </div>\n            <br />\n            <h2>Add a new user</h2>\n            <form onSubmit={handleSubmit}>\n                <label>Username [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={username}\n                    onChange={(e) => setUsername(e.target.value)}\n                    placeholder=\"Input username here\"\n                />\n\n\n                <label>Firstname [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={firstname}\n                    onChange={(e) => setFirstname(e.target.value)}\n                    placeholder=\"Input your first name here\"\n                />\n\n                <label>Surname [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={surname}\n                    onChange={(e) => setSurname(e.target.value)}\n                    placeholder=\"Input surname here\"\n                />\n\n                <label>Title [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={title}\n                    onChange={(e) => setTitle(e.target.value)}\n                    placeholder=\"State your role at InAGlobe (eg: volunteer)\"\n                />\n\n                <label>Password [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={password}\n                    onChange={(e) => setPassword(e.target.value)}\n                    placeholder=\"Input the default password (to be changed by the user)\"\n                />\n\n                <label>Email [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={email}\n                    onChange={(e) => setEmail(e.target.value)}\n                    placeholder=\"Input InAGlobe email here\"\n                />\n\n                <label>Phone Number</label>\n                <input\n                    type=\"text\"\n                    value={phone_no}\n                    onChange={(e) => setPhoneNo(e.target.value)}\n                    placeholder=\"Input your phone number\"\n                />\n\n\n                <label>Bio</label>\n                <input\n                    type=\"text\"\n                    value={bio}\n                    onChange={(e) => setBio(e.target.value)}\n                    placeholder=\"Tell your colleagues a bit about yourself\"\n                />\n\n                <label>Joined [required]</label>\n                <input\n                    type=\"date\"\n                    required\n                    value={joined}\n                    onChange={(e) => setJoined(e.target.value)}\n                    placeholder=\"Eg: 20th April 2020\"\n                />\n\n\n                <label>Location</label>\n                <input\n                    type=\"text\"\n                    value={location}\n                    onChange={(e) => setLocation(e.target.value)}\n                    placeholder=\"Where are you currently based?\"\n                />\n\n                <label>Availibility</label>\n                <input\n                    type=\"text\"\n                    value={availability}\n                    onChange={(e) => setAvailability(e.target.value)}\n                    placeholder=\"How available are you approximately per week?\"\n                />\n\n                <label>Partnership Opportunities</label>\n                <input\n                    type=\"text\"\n                    value={partnership_opportunities}\n                    onChange={(e) => setPartnership_opportunities(e.target.value)}\n                    placeholder=\"Eg: Department of Computing at Imperial College London\"\n                />\n\n                <label>Interests</label>\n                <input\n                    type=\"text\"\n                    value={interests}\n                    onChange={(e) => setInterests(e.target.value)}\n                    placeholder=\"What are your hobbies?\"\n                />\n\n                <button>Add user</button>\n            </form>\n        </div>\n    );\n}\n\nexport default AddUser;","import { useState } from \"react\";\nimport { useHistory, useParams } from \"react-router-dom\"\nimport { useForm } from \"react-hook-form\"\nimport useFetch from './useFetch'\nimport Select from 'react-select'\n\nconst EditProject = () => {\n    const { id } = useParams();\n    const { data: { name, description, status, location, tag, files }, error, isPending } = useFetch(\"/projects/\" + id)\n    const [selectUsernames, setSelectUsernames] = useState([]);\n    const { data: users, errorUsers, isPendingUsers } = useFetch(\"/users/user_project\");\n\n    const history = useHistory();\n    \n    const { register, handleSubmit } = useForm();\n\n    const handleChange = (e) => {\n        setSelectUsernames(Array.isArray(e) ? e.map(x => x.value) : []);\n    }\n\n    const onSubmit = e => {\n        fetch(\"/projects/\" + id, {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(e)\n        }).then(() => {\n            selectUsernames.map(username => {\n                const assign_project = { username: username, project_id: id };\n\n                fetch(\"/user_project\", {\n                    method: 'POST',\n                    headers: { \"Content-Type\": \"application/json\" },\n                    body: JSON.stringify(assign_project)\n                });\n            });\n        }).then(() => {\n            history.push('/projects');\n        })\n    }\n\n    const handleReturn = e => {\n        history.push('/projects/' + id);\n    }\n\n    return (\n        <div className=\"edit-project\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To Project Page</button>\n            </div>\n            <br />\n            <h2>Edit project</h2>\n            {isPending && <h2>Loading...</h2>}\n            {name && <form onSubmit={handleSubmit(onSubmit)}>\n                <label>Project name</label>\n                <input\n                    {...register(\"name\")}\n                    placeholder=\"Insert project name here\"\n                    type=\"text\"\n                    defaultValue={name}\n                />\n                <label>Description</label>\n                <textarea {...register(\"description\")} placeholder=\"Insert description of the project here\" defaultValue={description}></textarea>\n                <label>Status</label>\n                <select {...register(\"status\")} defaultValue={status}>\n                    <option value=\"Progress\">Progress</option>\n                    <option value=\"Available\">Available</option>\n                    <option value=\"Completed\">Completed</option>\n                </select>\n                <label>Location</label>\n                <input\n                    {...register(\"location\")}\n                    type=\"text\"\n                    placeholder=\"Insert location of project here\"\n                    defaultValue={location}\n                />\n                <label>Type of project</label>\n                <select {...register(\"tag\")} defaultValue={tag}>\n                    <option value=\"Social\">Social</option>\n                    <option value=\"Education\">Education</option>\n                    <option value=\"Wash\">Wash</option>\n                    <option value=\"Environment\">Environment</option>\n                    <option value=\"Health\">Health</option>\n                    <option value=\"Other\">Other</option>\n                </select>\n                <label>Volunteers assigned to this project</label>\n                <Select\n                    className=\"dropdown\"\n                    placeholder=\"Select Users\"\n                    value={users.filter(user => selectUsernames.includes(user.value))}\n                    options={users}\n                    onChange={handleChange}\n                    isMulti\n                    isClearable\n                />\n                <label>Google Drive folder</label>\n                <textarea {...register(\"files\")} placeholder=\"Insert Google Drive Folder link here\" defaultValue={files}></textarea>\n                <button type=\"submit\">Save project details</button>\n            </form>}\n        </div>\n    );\n}\n\nexport default EditProject;","import React from 'react';\nimport { slide as Menu } from 'react-burger-menu';\nimport { Link, useHistory } from 'react-router-dom'\nimport useToken from './useToken';\n\nconst Sidebar = () => {\n\nconst slackLink = \"https://slack.com/intl/en-gb/\"\n\nconst history = useHistory();\n\nconst {setToken, token} = useToken();\n\nconst handleSignOut = e => {\n  e.preventDefault()\n\n  localStorage.clear();\n\n  window.location.reload();\n  history.push(\"/\");\n}\n\nreturn (\n    <Menu>\n      <div className=\"menu-item\" > \n      <Link to={`/`}>Home</Link>\n      </div>\n      <div className=\"menu-item\" > \n      <Link to={`/users/` + token}>Profile</Link>\n      </div>\n      <div className=\"menu-item\" > \n      <Link to={`/users`}>All Users</Link>\n      </div>\n      <div className=\"menu-item\" > \n      <Link to={`/projects`}>All Projects</Link>\n      </div>\n      <div className=\"menu-item\" > \n      <a href={slackLink} target=\"_blank\">Go To Slack</a>\n      </div> \n      <div className=\"menu-item\" >\n      <a style={{textDecoration: \"underline\", cursor: \"pointer\"}} onClick={handleSignOut}>Log Out</a>\n      </div> \n    </Menu>\n\n);\n\n}\n\nexport default Sidebar;","import { Link, useHistory, useParams } from \"react-router-dom\"\nimport { useForm } from \"react-hook-form\"\nimport useFetch from './useFetch'\n\nconst EditUser = () => {\n    const { username } = useParams();\n    const { data: { firstname, surname, password, title, email, phone_no, bio, joined,\n        location, availability, partnership_opportunities, interests }, error, isPending } = useFetch(\"/users/\" + username)\n\n    const history = useHistory();\n    const oldUserDetails = {\n        firstname: firstname,\n        surname: surname,\n        password: password,\n        title: title,\n        email: email,\n        phone_no: phone_no,\n        bio: bio,\n        joined: joined,\n        location: location,\n        availability: availability,\n        partnership_opportunities: partnership_opportunities,\n        interests: interests,\n    }\n\n    const { register, handleSubmit } = useForm({\n        defaultValues: oldUserDetails\n    });\n\n    const onSubmit = e => {\n        fetch(\"/users/\" + username, {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(e)\n        }).then(() => {\n            history.push('/users');\n        })\n    }\n\n    const handleReturn = e => {\n        history.push('/users/' + username);\n    }\n\n    return (\n        <div className=\"edit-user\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To User Page</button>\n            </div>\n            <br />\n            <h2>Edit user</h2>\n            {isPending && <h2>Loading...</h2>}\n            <Link to={`/users/change-password`} style={{fontSize: \"20px\"}}>Change Password</Link>\n            {firstname && <form onSubmit={handleSubmit(onSubmit)}>\n                <br />\n                <label htmlFor=\"firstname\">Firstname</label>\n                <input {...register(\"firstname\")}\n                    placeholder=\"Input your first name here\"\n                    defaultValue={firstname}\n                />\n\n                <label htmlFor=\"surname\">Surname</label>\n                <input {...register(\"surname\")}\n                    placeholder=\"Input surname here\"\n                    defaultValue={surname}\n                />\n\n                <label htmlFor=\"title\">Title</label>\n                <input {...register(\"title\")}\n                    placeholder=\"State your role at InAGlobe (eg: volunteer)\"\n                    defaultValue={title}\n                />\n\n\n                <label htmlFor=\"email\">Email</label>\n                <input {...register(\"email\")}\n                    placeholder=\"Input InAGlobe email here\"\n                    defaultValue={email}\n                />\n\n                <label htmlFor=\"phone_no\">Phone number</label>\n                <input {...register(\"phone_no\")}\n                    placeholder=\"Input phone number here\"\n                    defaultValue={phone_no}\n                />\n\n\n                <label htmlFor=\"bio\">Bio</label>\n                <input {...register(\"bio\")}\n                    placeholder=\"Tell your colleagues a bit about yourself\"\n                    defaultValue={bio}\n                />\n\n                <label htmlFor=\"location\">Location</label>\n                <input {...register(\"location\")}\n                    placeholder=\"Where are you currently based?\"\n                    defaultValue={location}\n                />\n\n                <label htmlFor=\"availability\">Availibility (hours per week)</label>\n                <input {...register(\"availability\")}\n                    placeholder=\"How available are you approximately per week?\"\n                    defaultValue={availability}\n                />\n\n                <label htmlFor=\"interests\">Interests</label>\n                <input {...register(\"interests\")}\n                    placeholder=\"What are your hobbies?\"\n                    defaultValue={interests}\n                />\n\n                <label htmlFor=\"partnership_opportunities\">Partnership Opportunities</label>\n                <input {...register(\"partnership_opportunities\")}\n                    placeholder=\"Eg: Department of Computing at Imperial College London\"\n                    defaultValue={partnership_opportunities}\n                />\n                <button type=\"submit\">Save user details</button>\n            </form>}\n        </div>\n    );\n}\n\nexport default EditUser;","import { useState } from \"react\";\nimport UsersAssignedToTask from \"./UsersAssignedToTask\";\n\nconst ProjectTaskList = ({ project_tasks }) => {\n    /* pass in filtered dataset containing tasks for a specific project*/\n    const [description, setDescription] = useState(\"\");\n    const [priority, setPriority] = useState(1);\n    const [due_date, setDueDate] = useState(Date.now);\n    const [completed, setCompleted] = useState(\"\");\n    const [project_id, setProjectId] = useState(\"\");\n\n    const handleComplete = task => e => {\n        e.preventDefault();\n\n        setDescription(task.description)\n        setPriority(task.priority)\n        setDueDate(task.due_date)\n        setCompleted(\"Completed\")\n        setProjectId(task.project_id)\n        const newTask = { description, priority, due_date, completed, project_id }\n\n        console.log(newTask)\n\n        fetch(\"/projects/\" + task.project_id + \"/tasks/\" + task.id, {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(task)\n        }).then(() => {\n            window.location.reload();\n        })\n    \n    };\n\n    const handleDelete = task => e => {\n        e.preventDefault();\n\n        fetch(\"/projects/\" + task.project_id + \"/tasks/\" + task.id, {\n            method: 'DELETE',\n        }).then(() => {\n            window.location.reload();\n        })\n    };\n\n    return (\n        <div className=\"project-tasks-list\">\n            {project_tasks.map((task) => (\n                <div className=\"project-task-preview\" key={task.id}>\n                        <div>\n                            <h2>{task.description}</h2>\n                            <h3>Due date: {task.due_date}</h3>\n                        </div>\n                        \n                        <h3>Priority: {task.priority}</h3>\n                        <h3>All volunteers assigned to this task</h3>\n                        <UsersAssignedToTask task_id={task.id} />\n                        { !task.completed && <button className=\"task-complete-button\" onClick={handleComplete(task)}>Complete</button> }\n                        <button className=\"task-delete-button\"onClick={handleDelete(task)}>Delete</button>\n                </div>\n            ))}\n        </div>\n    );\n}\n \nexport default ProjectTaskList;\n","import { useParams } from 'react-router';\nimport { useHistory } from \"react-router-dom\"\nimport ProjectTaskList from './ProjectTaskList'\nimport useFetch from './useFetch'\nimport { Link } from \"react-router-dom\"\n\nconst ProjectTasks = () => {\n    const { id } = useParams();\n    const { data: project, errorProject, isPendingProject } = useFetch(\"/projects/\" + id)\n\n    const { data: project_tasks, errorTasks, isPendingTasks } = useFetch(\"/projects/\" + id + \"/tasks\");\n\n    const history = useHistory();\n\n    const handleReturn = e => {\n        history.push('/projects/' + id);\n    }\n\n    return (\n        <div className=\"project-tasks\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To Project Details</button>\n            </div>\n            <br />\n            { isPendingTasks && <h2>Loading...</h2> }\n            { project && <h1>{project.name}: tasks</h1>}\n            <h2>Ongoing Project Tasks</h2>\n            { project_tasks && <ProjectTaskList project_tasks={project_tasks.filter(task => !task.completed)}/> }\n            <h2>Completed Project Tasks</h2>\n            { project_tasks && <ProjectTaskList project_tasks={project_tasks.filter(task => task.completed)}/> }\n\n            <div className=\"add-task-button-wrapper\">\n                { project_tasks && <Link to={`/projects/${project.id}/add-task`} className=\"add-task-button\">Add Task</Link> }\n            </div>\n        </div>\n    );\n}\n\nexport default ProjectTasks;","import { useState } from \"react\";\nimport { useHistory } from \"react-router-dom\"\nimport { useParams } from \"react-router\"\nimport useFetch from \"./useFetch\";\nimport Select from 'react-select';\n\nconst AddProjectTask = () => {\n    const { id } = useParams();\n\n    const [description, setDescription] = useState(\"\");\n    const [due_date, setDueDate] = useState(Date.now);\n    const [priority, setPriority] = useState(1);\n    const [completed, setCompleted] = useState(false);\n    const [assignedUsers, setAssignedUsers] = useState([]);\n\n    const { data: project, error, isPending } = useFetch(\"/projects/\" + id)\n    const { data: participants, errorParticipants, isPendingParticipants } = useFetch(\"/user_project/project_task/\" + id) \n\n    const history = useHistory();\n\n    const handleChange = (e) => {\n        setAssignedUsers(Array.isArray(e) ? e.map(x => x.value) : []); \n    }\n\n    const handleSubmit = async e => {\n        e.preventDefault()\n\n        const newProjectTask = { description, due_date, priority, completed };\n\n        const response = await fetch(\"/projects/\" + project.id + \"/tasks\", {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(newProjectTask)\n        });\n\n        const responseJSON = await response.json();\n        const task_id = responseJSON.id;\n\n        assignedUsers.map(username => {\n            const assigned_task = { username, task_id };\n\n            fetch(\"/assigned_task\", {\n                method: 'POST',\n                headers: { \"Content-Type\": \"application/json\" },\n                body: JSON.stringify(assigned_task)\n            });\n        });\n\n        history.push(\"/projects/\" + id);\n    }\n\n    const handleReturn = e => {\n        history.push('/projects/' + id + '/tasks');\n    }\n\n    return (\n        <div className=\"add-project-task\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To Project Tasks</button>\n            </div>\n            <br />\n            <h2>Add a new task</h2>\n            {isPending && <h2>Loading...</h2>}\n            {project && <form onSubmit={handleSubmit}>\n                <label>Description</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={description}\n                    onChange={(e) => setDescription(e.target.value)}\n                    placeholder=\"Input description here\"\n                />\n\n\n                <label>Due Date [required]</label>\n                <input\n                    type=\"date\"\n                    required\n                    value={due_date}\n                    onChange={(e) => setDueDate(e.target.value)}\n                    placeholder=\"Input your first name here\"\n                />\n\n                <label>Priority level (1: lowest, 4: highest) [required]</label>\n                <select required value={priority} onChange={(e) => setPriority(e.target.value)} >\n                        <option value=\"1\">1</option>\n                        <option value=\"2\">2</option>\n                        <option value=\"3\">3</option>\n                        <option value=\"4\">4</option>\n                    </select>\n\n                <label>Volunteers assigned to this task</label>\n                <Select\n                    className=\"dropdown\"\n                    placeholder=\"Select Users\"\n                    value={participants.filter(user => assignedUsers.includes(user.value))}\n                    options={participants}\n                    onChange={handleChange}\n                    isMulti\n                    isClearable\n                />\n\n                <label>Status</label>\n                <select value={completed} onChange={(e) => setCompleted(e.target.value)}>\n                    <option value=\"Incomplete\">Available</option>\n                    <option value=\"Completed\">Completed</option>\n                </select>\n                <button>Add task</button>\n            </form>}\n        </div>\n    );\n}\n\nexport default AddProjectTask;","import { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom'\n\nasync function loginUser(credentials) {\n    return fetch('/users/login', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify(credentials)\n      })\n      .then(data => data.json())\n   }\n\nexport default function Login({ setToken }) {\n    const [username, setUserName] = useState();\n    const [password, setPassword] = useState();\n\n    const handleSubmit = async e => {\n        e.preventDefault();\n        const token = await loginUser({\n          username,\n          password\n        });\n        if(token.token != \"\") {\n            setToken(token);\n        } else {\n            document.getElementsByClassName(\"incorrect-password\")[0].style.display = \"block\";\n\n        }\n    }\n    \n\n    return (\n        <div className=\"login\">\n            <h1> InAGlobe Platform </h1>\n            <form onSubmit={handleSubmit}>\n                <input type=\"text\" id=\"login\" class=\"fadeIn second\" name=\"login\" placeholder=\"login\"\n                    onChange={e => setUserName(e.target.value)}/>\n                <input type=\"password\" id=\"password\" class=\"fadeIn third\" name=\"login\" placeholder=\"password\"\n                    onChange={e => setPassword(e.target.value)}/> \n                <div className=\"incorrect-password\" style={{display: 'none'}}>\n                    <h2>Incorrect password!</h2>\n                </div>\n                <div className=\"links\">\n                    <Link to={`/forgot-password`}>Forgot Password</Link>\n                </div>\n                <button type=\"submit\">Log In</button>\n            </form>\n        </div>\n    );\n}\n \nLogin.propTypes = {\n    setToken: PropTypes.func.isRequired\n}\n","\nimport useToken from './useToken';\nimport { Link, useHistory } from 'react-router-dom'\nimport { useState } from 'react'\n\nconst ChangePassword = () => {\n  const [oldPassword, setOldPassword] = useState(\"\");\n  const [newPassword, setNewPassword] = useState(\"\");\n  const {setToken, token} = useToken()\n  const history = useHistory()\n\nasync function passwordUpdate() {\n  return fetch('/users/update-password', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        username: token,\n        oldPassword: oldPassword,\n        newPassword: newPassword})\n    })\n    .then(data => data.json())\n }\n\n  const handleSubmit = async e => {\n      e.preventDefault();\n      const updated = await passwordUpdate();\n\n      if(updated.status != \"True\") {\n         document.getElementsByClassName(\"incorrect-password\")[0].style.display = \"block\";\n      }\n      else{\n        document.getElementsByClassName(\"password-changed-msg\")[0].style.display = \"block\";\n      }\n    }\n  \nreturn (\n  <div className=\"change-password\">\n      <h2>Change Password</h2>\n      <label >Current Password</label>\n      <input  \n        onChange={(e) => setOldPassword(e.target.value)}\n        placeholder=\"Current Password\"\n      />\n\n      <label >New Password</label>\n      <input  \n        onChange={(e) => setNewPassword(e.target.value)}\n        placeholder=\"New Password\"\n      />\n\n      <button onClick={handleSubmit}>Change password</button>\n\n      <h2 className=\"incorrect-password\" style={{display: \"none\"}}>Incorrect password</h2>\n\n      <div className=\"password-changed-msg\" style={{display: \"none\"}}>\n        <h3>Your password has been changed successfully</h3>\n        <Link to={`/`}>Back to Dashboard</Link>\n      </div>\n\n  </div>\n  \n  )\n\n}\n\nexport default ChangePassword;","import ProjectList from './ProjectList'\nimport useFetch from './useFetch'\n\nconst ProjectRegistry = () => {\n\n    const {data: projects, errorProjects, isPendingProjects} = useFetch(\"/projects\")\n\n    return (\n        <div className=\"project-registry\">\n            <h1>All Projects</h1>\n            <br />\n            { isPendingProjects && <h2>Loading...</h2> }\n            { projects && <ProjectList projects={projects} title=\"All Projects\"/> }\n        </div>\n        \n    );\n}\n \nexport default ProjectRegistry;","import { useState } from \"react\";\nimport { useHistory } from 'react-router';\n\nasync function resetPassword(msg) {\n    return fetch('/users/forgot-password', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify(msg)\n      })\n      .then(data => data.json())\n   }\n\nconst ForgotPassword = () => {\n\n    const [username, setUsername] = useState(\".\");\n    const history = useHistory();\n    \n\n    const handleSubmit = async e => {\n        e.preventDefault();\n\n        if(username != \".\") {\n\n            const msg = {\n                username: username,\n                newPassword: Math.random().toString(36).replace(/[^a-z]+/g, '')\n            }\n\n            const response = await resetPassword(msg);\n            if(response.status == \"False\") {\n                document.getElementsByClassName(\"email-sent\")[0].style.display = \"none\";\n                document.getElementsByClassName(\"incorrect-username\")[0].style.display = \"block\";\n            } else {\n                document.getElementsByClassName(\"incorrect-username\")[0].style.display = \"none\";\n                document.getElementsByClassName(\"email-sent\")[0].style.display = \"block\";\n            }\n        }\n    }\n\n    const handleReturn = e => {\n        e.preventDefault();\n        history.push('/');\n    }\n\n\n    return (\n        <div className=\"forgot-password\">\n            <form onSubmit={handleSubmit}>\n                <h1>Forgot Password</h1>\n                <h2>Input your username</h2>\n                <input type=\"text\" placeholder=\"username\" onChange={e => setUsername(e.target.value)}/>\n                <div className=\"incorrect-username\" style={{display: 'none'}}>\n                    <h2>Incorrect username provided!</h2>\n                </div>\n                <div className=\"email-sent\" style={{display: 'none'}}>\n                    <h2>Email has been sent!</h2>\n                </div>\n                <button>Submit</button>\n            </form>\n            <button onClick={handleReturn}>Back to Login Page</button>\n        </div>\n        \n    );\n}\n \nexport default ForgotPassword;","import React, { useState } from 'react';\nimport {HashRouter as Router, Route, Switch} from 'react-router-dom'\n\nimport Navbar from './Navbar'\nimport Home from './Home'\nimport CreateProject from './CreateProject'\nimport ProjectDetails from './ProjectDetails'\nimport PageNotFound from './PageNotFound'\nimport MyProfile from './MyProfile'\nimport User from './User'\nimport Users from './Users'\nimport AddUser from './AddUser'\nimport EditProject from './EditProject'\nimport Sidebar from './Sidebar'  \nimport EditUser from './EditUser'\nimport ProjectTasks from './ProjectTasks'\nimport AddProjectTask from './AddProjectTask'\nimport Login from './Login'\nimport useToken from './useToken'\nimport ChangePassword from './ChangePassword'\nimport ProjectsRegistry from './ProjectsRegistry'\nimport ForgotPassword from './ForgotPassword'\n\nfunction App() {\n\n  const { token, setToken } = useToken();\n\n  if(!token) {\n    return (\n      <Router>\n        <Switch>\n          <Route exact path=\"/forgot-password\">\n            <ForgotPassword />\n          </Route>\n          <Route path=\"*\">\n            <Login setToken={setToken} />\n          </Route>\n        </Switch>\n      </Router>\n    )\n  }\n\n  return (\n    <Router>\n      <div className=\"App\">    \n      <Sidebar />\n        <Navbar />\n        <div className=\"content\">   \n          <Switch>\n            <Route exact path=\"/\">\n              <Home />\n            </Route>\n            <Route exact path=\"/create-project\">\n              <CreateProject />\n            </Route>\n            <Route exact path=\"/add-user\">\n              <AddUser />  \n            </Route>\n            <Route exact path=\"/my-profile\">\n              <MyProfile />\n            </Route>\n            <Route exact path=\"/users\">\n              <Users />  \n            </Route>\n            <Route exact path=\"/users/change-password\">\n              <ChangePassword />\n            </Route>   \n            <Route exact path=\"/users/:username\">\n              <User />\n            </Route>\n            <Route exact path=\"/edit-user/:username\">\n              <EditUser />\n            </Route>   \n            <Route exact path=\"/projects\">\n              <ProjectsRegistry />  \n            </Route>        \n            <Route exact path=\"/projects/:id/add-task\">\n              <AddProjectTask />  \n            </Route>       \n            <Route exact path=\"/projects/:id/tasks\">\n              <ProjectTasks />          \n            </Route>\n            <Route exact path=\"/projects/:id\">\n              <ProjectDetails />\n            </Route>\n            <Route exact path=\"/edit-project/:id\">\n              <EditProject />\n            </Route>\n            <Route path=\"*\">\n              <PageNotFound />\n            </Route>\n          </Switch>\n        </div>\n      </div>\n    </Router>\n  );\n}\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n  if (onPerfEntry && onPerfEntry instanceof Function) {\n    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n      getCLS(onPerfEntry);\n      getFID(onPerfEntry);\n      getFCP(onPerfEntry);\n      getLCP(onPerfEntry);\n      getTTFB(onPerfEntry);\n    });\n  }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>,\n  document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/backend/static/react/js/main.8ac766d6.chunk.js b/backend/static/react/js/main.8ac766d6.chunk.js
new file mode 100644
index 0000000000000000000000000000000000000000..7cfffedece0c6ef7a1ef24091f851eba212aa9e6
--- /dev/null
+++ b/backend/static/react/js/main.8ac766d6.chunk.js
@@ -0,0 +1,2 @@
+(this["webpackJsonpinaglobe-dashboard"]=this["webpackJsonpinaglobe-dashboard"]||[]).push([[0],{38:function(e,t,n){},72:function(e,t,n){"use strict";n.r(t);var r=n(1),c=n.n(r),s=n(16),a=n.n(s),i=(n(38),n(4)),o=n(6),l=n(3);function j(){var e=Object(r.useState)(function(){var e=localStorage.getItem("token"),t=JSON.parse(e);return null===t||void 0===t?void 0:t.token}()),t=Object(l.a)(e,2),n=t[0],c=t[1];return{setToken:function(e){localStorage.setItem("token",JSON.stringify(e)),c(e.token)},token:n}}var d=n(0),u=function(){var e=j(),t=(e.setToken,e.token);return Object(d.jsxs)("nav",{className:"navbar",children:[Object(d.jsx)("a",{href:"/",style:{color:"#ff4e83",fontSize:"20px",borderRadius:"8px"},children:"InAGlobe Platform"}),Object(d.jsxs)("div",{className:"links",children:[Object(d.jsx)(i.b,{to:"/create-project",children:"New Project"}),Object(d.jsx)(i.b,{to:"/users/"+t,children:"My Profile"})]})]})},b=function(e){var t=e.projects,n=e.title;return Object(d.jsxs)("div",{className:"project-list",children:[Object(d.jsx)("h2",{children:n}),t.map((function(e){return Object(d.jsx)("div",{className:"preview",children:Object(d.jsxs)(i.b,{to:"/projects/".concat(e.id),children:[Object(d.jsx)("h2",{children:e.name}),Object(d.jsx)("h3",{children:e.status})]})},e.id)}))]})},h=function(e){var t=Object(r.useState)([]),n=Object(l.a)(t,2),c=n[0],s=n[1],a=Object(r.useState)(null),i=Object(l.a)(a,2),o=i[0],j=i[1],d=Object(r.useState)(!0),u=Object(l.a)(d,2),b=u[0],h=u[1];return Object(r.useEffect)((function(){fetch(e).then((function(e){if(!e.ok)throw Error("could not fetch the data for that resource");return e.json()})).then((function(e){s(e),h(!1),j(null)})).catch((function(e){j(e.message)}))}),[e]),{data:c,error:o,isPending:b}},O=function(e){var t=e.task_id,n=(e.title,h("/assigned_task/task/"+t)),r=n.data;n.error,n.isPending;return r.map((function(e){return Object(d.jsx)("div",{className:"assigned_users_list",children:Object(d.jsx)(i.b,{to:"/users/".concat(e.username),children:Object(d.jsxs)("h5",{children:[e.firstname," ",e.surname]})})})}))},p=function(e){var t=e.tasks,n=e.title;return Object(d.jsxs)("div",{children:[Object(d.jsx)("h2",{children:n}),Object(d.jsx)("div",{className:"my-project-tasks",children:t.map((function(e){return Object(d.jsxs)("div",{className:"task-preview",children:[Object(d.jsxs)("h2",{children:[e.description," [Priority: ",e.priority,"]"]}),Object(d.jsx)(i.b,{to:"/projects/".concat(e.project_id),children:Object(d.jsx)("h3",{style:{color:"#f1356d"},children:e.project_name})}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"To be done by:"})," ",e.due_date]}),Object(d.jsx)("h3",{children:"Assigned volunteers: "}),Object(d.jsx)(O,{task_id:e.id})]},e.id)}))})]})},x=function(e){var t=e.todos,n=e.title,c=j(),s=(c.setToken,c.token),a=h("/users"),i=a.data,o=(a.error,a.isPending),u=Object(r.useState)(""),b=Object(l.a)(u,2),O=b[0],p=b[1],x=Object(r.useState)(1),m=Object(l.a)(x,2),f=m[0],v=m[1],g=Object(r.useState)(Date.now()),y=Object(l.a)(g,2),k=y[0],S=y[1],w=Object(r.useState)(s),C=Object(l.a)(w,2),N=C[0],P=C[1];return Object(d.jsxs)("div",{className:"todo-list",style:{float:"right"},children:[Object(d.jsx)("h2",{children:n}),Object(d.jsx)("div",{className:"add-todo-button",children:Object(d.jsx)("button",{onClick:function(){document.getElementsByClassName("add-todo-form")[0].style.display="block"},children:"Add a personal task"})}),t&&0===Object.keys(t).length&&Object(d.jsx)("h3",{style:{float:"right"},children:"Well done you have no ToDo items!"}),o&&Object(d.jsx)("h2",{children:"Loading..."}),Object(d.jsx)("div",{className:"add-todo-form",children:i&&Object(d.jsxs)("form",{onSubmit:function(e){document.getElementsByClassName("add-todo-form")[0].style.display="none",e.preventDefault();var t={todo_desc:O,priority:f,due_date:k,username:N};fetch("/todos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(){window.location.reload()}))},children:[Object(d.jsx)("label",{children:"Task description [required]"}),Object(d.jsx)("textarea",{value:O,onChange:function(e){return p(e.target.value)},required:!0,placeholder:"Add some awesome description!"}),Object(d.jsx)("label",{children:"Priority level (1: lowest, 4: highest)"}),Object(d.jsxs)("select",{value:f,onChange:function(e){return v(e.target.value)},children:[Object(d.jsx)("option",{value:"1",children:"1"}),Object(d.jsx)("option",{value:"2",children:"2"}),Object(d.jsx)("option",{value:"3",children:"3"}),Object(d.jsx)("option",{value:"4",children:"4"})]}),Object(d.jsx)("label",{children:"When should this task be done by? [required]"}),Object(d.jsx)("input",{required:!0,type:"date",value:k,onChange:function(e){return S(e.target.value)}}),Object(d.jsx)("label",{children:"Assigned user"}),Object(d.jsx)("select",{value:N,onChange:function(e){return P(e.target.value)},children:i.map((function(e){return Object(d.jsx)("option",{value:e.username,children:e.username})}))}),Object(d.jsx)("button",{children:"Save task"})]})}),Object(d.jsx)("div",{className:"personal-todos",children:t.map((function(e){return Object(d.jsxs)("div",{className:"todo-preview",children:[Object(d.jsx)("h2",{children:e.todo_desc}),Object(d.jsxs)("h3",{children:["Priority level: ",e.priority]}),Object(d.jsxs)("h3",{children:["To be done by: ",e.due_date]}),Object(d.jsx)("button",{onClick:(t=e.id,function(e){e.preventDefault(),fetch("/todos/"+t,{method:"DELETE"}).then((function(){window.location.reload()}))}),children:"Complete"})]},e.id);var t}))})]})},m=function(){var e=h("/todos"),t=e.data,n=(e.errorTodos,e.isPendingTodos),r=j(),c=(r.setToken,r.token),s=h("/user_project/username/"+c),a=s.data,i=(s.errorRProjects,s.isPendingRProjects),o=h("/assigned_task/username/"+c),l=o.data,u=(o.errorProjectTasks,o.isPendingProjectTasks,h("/users/name/"+c).data),O=u.firstname,m=(u.surname,t.filter((function(e){return e.username===c})));return Object(d.jsxs)("div",{className:"home",children:[Object(d.jsxs)("h1",{children:["Welcome back, ",O,"!"]}),console.log("Firstname: "),Object(d.jsxs)("div",{className:"home-projects",style:{float:"left",width:"600px"},children:[i&&Object(d.jsx)("h2",{children:"Loading..."}),a&&Object(d.jsx)(b,{projects:a,title:"My Projects"}),a&&0===Object.keys(a).length&&Object(d.jsx)("h3",{children:"You are not assigned to any project currently"})]}),Object(d.jsxs)("div",{className:"homeTodos",style:{float:"right",width:"300px"},children:[n&&Object(d.jsx)("h2",{children:"Loading..."}),t&&Object(d.jsx)(x,{todos:m,title:"Personal ToDo items"})]}),Object(d.jsxs)("div",{className:"home-project-tasks",style:{float:"left",width:"600px"},children:[i&&Object(d.jsx)("h2",{children:"Loading..."}),a&&Object(d.jsx)(p,{tasks:l,title:"My tasks from all projects"}),a&&0===Object.keys(l).length&&Object(d.jsx)("h3",{children:"Well done you have no project tasks!"})]})]})},f=n(5),v=n.n(f),g=n(8),y=n(18),k=function(){var e=Object(r.useState)(""),t=Object(l.a)(e,2),n=t[0],c=t[1],s=Object(r.useState)(""),a=Object(l.a)(s,2),i=a[0],j=a[1],u=Object(r.useState)("Available"),b=Object(l.a)(u,2),O=b[0],p=b[1],x=Object(r.useState)("Other"),m=Object(l.a)(x,2),f=m[0],k=m[1],S=Object(r.useState)(""),w=Object(l.a)(S,2),C=w[0],N=w[1],P=Object(r.useState)(""),T=Object(l.a)(P,2),_=T[0],A=T[1],D=Object(r.useState)([]),E=Object(l.a)(D,2),I=E[0],L=E[1],q=Object(o.f)(),V=h("/users/user_project"),F=V.data,B=(V.error,V.isPending,F.map((function(e){return e.username})),function(){var e=Object(g.a)(v.a.mark((function e(t){var r,c,s,a;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),r={name:n,description:i,status:O,tag:f,location:C,files:_},e.next=4,fetch("/projects",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});case 4:return c=e.sent,e.next=7,c.json();case 7:s=e.sent,a=s.id,I.map((function(e){var t={username:e,project_id:a};fetch("/user_project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})})),q.push("/");case 11:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}());return Object(d.jsxs)("div",{className:"create-project",children:[Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Add a new project"}),Object(d.jsxs)("form",{onSubmit:B,children:[Object(d.jsx)("label",{children:"Project name [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:n,onChange:function(e){return c(e.target.value)},placeholder:"Input project name"}),Object(d.jsx)("label",{children:"Description [required]"}),Object(d.jsx)("textarea",{required:!0,placeholder:"Add some awesome description!",value:i,onChange:function(e){return j(e.target.value)}}),Object(d.jsx)("label",{children:"Status"}),Object(d.jsxs)("select",{value:O,onChange:function(e){return p(e.target.value)},children:[Object(d.jsx)("option",{value:"Progress",children:"Progress"}),Object(d.jsx)("option",{value:"Available",children:"Available"}),Object(d.jsx)("option",{value:"Completed",children:"Completed"})]}),Object(d.jsx)("label",{children:"Location"}),Object(d.jsx)("input",{type:"text",value:C,onChange:function(e){return N(e.target.value)},placeholder:"Eg: United Kingdom"}),Object(d.jsx)("label",{children:"Type of project [required]"}),Object(d.jsxs)("select",{required:!0,value:f,onChange:function(e){return k(e.target.value)},children:[Object(d.jsx)("option",{value:"Social",children:"Social"}),Object(d.jsx)("option",{value:"Education",children:"Education"}),Object(d.jsx)("option",{value:"Wash",children:"Wash"}),Object(d.jsx)("option",{value:"Environment",children:"Environment"}),Object(d.jsx)("option",{value:"Health",children:"Health"}),Object(d.jsx)("option",{value:"Other",children:"Other"})]}),Object(d.jsx)("label",{children:"Volunteers assigned to this project"}),Object(d.jsx)(y.a,{className:"dropdown",placeholder:"Select Users",value:F.filter((function(e){return I.includes(e.value)})),options:F,onChange:function(e){L(Array.isArray(e)?e.map((function(e){return e.value})):[])},isMulti:!0,isClearable:!0}),Object(d.jsx)("label",{children:"Google Drive folder"}),Object(d.jsx)("textarea",{placeholder:"Copy the link to the Google Drive folder for this project",value:_,onChange:function(e){return A(e.target.value)}}),Object(d.jsx)("button",{children:"Add project"})]})]})},S=function(){var e=Object(o.g)().id,t=Object(o.f)(),n=h("/projects/"+e),r=n.data,c=(n.error,n.isPending),s=h("/user_project/project/"+e),a=s.data;s.errorAssignment,s.isPendingAssignment;return Object(d.jsxs)("div",{className:"project-details",children:[Object(d.jsx)("br",{}),c&&Object(d.jsx)("h2",{children:"Loading..."}),r&&Object(d.jsx)("h2",{children:r.name}),r&&Object(d.jsxs)("button",{style:{fontSize:"20px",color:"#fff",marginBottom:"30px",marginright:"10px",borderRadius:"8px",backgroundColor:"#f1b535",cursor:"default"},children:["Status: ",r.status]}),r&&Object(d.jsx)("button",{style:{fontSize:"20px",color:"#fff",marginBottom:"30px",marginRight:"10px",borderRadius:"8px",backgroundColor:"#595bc0",cursor:"default"},children:r.tag}),r&&Object(d.jsxs)("h4",{children:["Location: ",r.location]}),r&&Object(d.jsx)("button",{onClick:function(e){e.preventDefault(),window.open(r.files,"_blank")},children:"Documents"}),r&&Object(d.jsx)("p",{children:r.description}),Object(d.jsx)("h3",{children:"Volunteers working on this project"}),Object(d.jsx)("div",{className:"project_user_assignment_list",children:a.map((function(e){return Object(d.jsx)("div",{className:"assigned_users_preview",style:{float:"left",width:"50%"},children:Object(d.jsx)(i.b,{to:"/users/".concat(e.username),children:Object(d.jsx)("h4",{children:e.username})})},e.id)}))}),Object(d.jsxs)("div",{className:"project-tasks",children:[r&&Object(d.jsx)(i.b,{to:"/projects/".concat(r.id,"/tasks"),className:"view-tasks-button",children:"View Tasks"}),r&&Object(d.jsx)(i.b,{to:"/projects/".concat(r.id,"/add-task"),className:"add-task-button",children:"Add Task"})]}),Object(d.jsxs)("div",{children:[r&&Object(d.jsx)("button",{onClick:function(n){n.preventDefault(),fetch("/projects/"+e,{method:"DELETE"}).then((function(){t.push("/")}))},children:"Delete project"}),r&&Object(d.jsx)(i.b,{to:"/edit-project/".concat(r.id),className:"edit-project-button",children:"Edit project"})]})]})},w=function(){return Object(d.jsxs)("div",{className:"page-not-found",children:[Object(d.jsx)("h2",{children:"Something went wrong..."}),Object(d.jsx)("p",{children:"That page cannot be found"}),Object(d.jsx)(i.b,{to:"/",children:"Back to the main page"})]})},C=function(){var e=j(),t=(e.setToken,e.token),n=h("/users/"+t),r=n.data,c=(n.error,n.isPending);return Object(d.jsxs)("div",{className:"my-profile",children:[c&&Object(d.jsx)("h2",{children:"Loading..."}),r&&Object(d.jsx)("h2",{children:r.firstname+" "+r.surname}),r&&Object(d.jsx)("h1",{children:"Username: "+r.token}),r&&Object(d.jsx)("h1",{children:"Title: "+r.title}),r&&Object(d.jsx)("h1",{children:"Email: "+r.email}),r&&Object(d.jsx)("h1",{children:"Bio: "+r.bio}),r&&Object(d.jsx)("h1",{children:"Joined: "+r.joined}),r&&Object(d.jsx)("h1",{children:"Location: "+r.location}),r&&Object(d.jsx)("h1",{children:"Availability: "+r.availability}),r&&Object(d.jsx)("h1",{children:"Partnership Opportunities: "+r.partnership_opportunities}),r&&Object(d.jsx)("h1",{children:"Interests: "+r.interests})]})},N=function(){var e=Object(o.g)().username,t=Object(o.f)(),n=j(),r=(n.setToken,n.token),c=h("/users/"+e),s=c.data,a=(c.error,c.isPending);return Object(d.jsxs)("div",{className:"user",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(e){t.push("/users")},children:"To All Users"})}),Object(d.jsx)("br",{}),a&&Object(d.jsx)("h2",{children:"Loading..."}),s&&Object(d.jsx)("div",{children:Object(d.jsx)("h2",{children:s.firstname+" "+s.surname})}),s&&Object(d.jsxs)("div",{children:[Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Username: "}),s.username]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Email: "}),s.email]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Title: "}),s.title]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Joined: "}),s.joined]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Location: "}),s.location]}),Object(d.jsxs)("h3",{children:[Object(d.jsx)("strong",{children:"Availability: "}),s.availability]})]}),Object(d.jsx)("br",{}),s&&Object(d.jsxs)("div",{children:[Object(d.jsx)("label",{children:Object(d.jsx)("strong",{children:"Bio"})}),Object(d.jsx)("p",{children:s.bio})]}),s&&Object(d.jsxs)("div",{children:[Object(d.jsx)("label",{children:Object(d.jsx)("strong",{children:"Partnership Opportunities"})}),Object(d.jsx)("p",{children:s.partnership_opportunities})]}),s&&Object(d.jsxs)("div",{children:[Object(d.jsx)("label",{children:Object(d.jsx)("strong",{children:"Interests"})}),Object(d.jsx)("p",{children:s.interests})]}),s&&("jaimeaguilera"==r||e==r)&&Object(d.jsx)("button",{onClick:function(n){n.preventDefault(),fetch("/users/"+e,{method:"DELETE"}).then((function(){t.push("/")}))},children:"Delete user"}),s&&("jaimeaguilera"==r||e==r)&&Object(d.jsx)(i.b,{to:"/edit-user/".concat(e),className:"edit-user-button",children:"Edit details"})]})},P=function(e){var t=e.users;return Object(d.jsx)("div",{className:"user-list",children:t.map((function(e){return Object(d.jsx)("div",{className:"preview",children:Object(d.jsx)(i.b,{to:"/users/".concat(e.username),children:Object(d.jsx)("h2",{children:e.username})})},e.username)}))})},T=function(){var e=h("/users"),t=e.data,n=(e.error,e.isPending),r=j(),c=(r.setToken,r.token);return Object(d.jsxs)("div",{className:"users",children:[Object(d.jsx)("h1",{children:"Users"}),"jaimeaguilera"==c&&Object(d.jsx)(i.b,{to:"/add-user",className:"add-user-button",children:"Add User"}),Object(d.jsx)("br",{}),Object(d.jsx)("br",{}),n&&Object(d.jsx)("h2",{children:"Loading..."}),t&&Object(d.jsx)(P,{users:t,title:"All Users"})]})},_=function(){var e=Object(r.useState)(""),t=Object(l.a)(e,2),n=t[0],c=t[1],s=Object(r.useState)(""),a=Object(l.a)(s,2),i=a[0],j=a[1],u=Object(r.useState)(""),b=Object(l.a)(u,2),h=b[0],O=b[1],p=Object(r.useState)(""),x=Object(l.a)(p,2),m=x[0],f=x[1],v=Object(r.useState)(""),g=Object(l.a)(v,2),y=g[0],k=g[1],S=Object(r.useState)(""),w=Object(l.a)(S,2),C=w[0],N=w[1],P=Object(r.useState)(""),T=Object(l.a)(P,2),_=T[0],A=T[1],D=Object(r.useState)(Date.now()),E=Object(l.a)(D,2),I=E[0],L=E[1],q=Object(r.useState)(""),V=Object(l.a)(q,2),F=V[0],B=V[1],J=Object(r.useState)(""),U=Object(l.a)(J,2),W=U[0],G=U[1],M=Object(r.useState)(""),H=Object(l.a)(M,2),R=H[0],z=H[1],Y=Object(r.useState)(""),K=Object(l.a)(Y,2),Q=K[0],X=K[1],Z=Object(r.useState)(""),$=Object(l.a)(Z,2),ee=$[0],te=$[1],ne=Object(o.f)();return Object(d.jsxs)("div",{className:"add-user",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(e){ne.push("/users")},children:"To All Users"})}),Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Add a new user"}),Object(d.jsxs)("form",{onSubmit:function(e){e.preventDefault();var t={firstname:n,surname:i,password:h,title:m,email:y,phone_no:C,bio:_,joined:I,location:F,availability:W,partnership_opportunities:R,interests:Q,username:ee};fetch("/users",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(){ne.push("/users")}))},children:[Object(d.jsx)("label",{children:"Username [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:ee,onChange:function(e){return te(e.target.value)},placeholder:"Input username here"}),Object(d.jsx)("label",{children:"Firstname [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:n,onChange:function(e){return c(e.target.value)},placeholder:"Input your first name here"}),Object(d.jsx)("label",{children:"Surname [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:i,onChange:function(e){return j(e.target.value)},placeholder:"Input surname here"}),Object(d.jsx)("label",{children:"Title [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:m,onChange:function(e){return f(e.target.value)},placeholder:"State your role at InAGlobe (eg: volunteer)"}),Object(d.jsx)("label",{children:"Password [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:h,onChange:function(e){return O(e.target.value)},placeholder:"Input the default password (to be changed by the user)"}),Object(d.jsx)("label",{children:"Email [required]"}),Object(d.jsx)("input",{type:"text",required:!0,value:y,onChange:function(e){return k(e.target.value)},placeholder:"Input InAGlobe email here"}),Object(d.jsx)("label",{children:"Phone Number"}),Object(d.jsx)("input",{type:"text",value:C,onChange:function(e){return N(e.target.value)},placeholder:"Input your phone number"}),Object(d.jsx)("label",{children:"Bio"}),Object(d.jsx)("input",{type:"text",value:_,onChange:function(e){return A(e.target.value)},placeholder:"Tell your colleagues a bit about yourself"}),Object(d.jsx)("label",{children:"Joined [required]"}),Object(d.jsx)("input",{type:"date",required:!0,value:I,onChange:function(e){return L(e.target.value)},placeholder:"Eg: 20th April 2020"}),Object(d.jsx)("label",{children:"Location"}),Object(d.jsx)("input",{type:"text",value:F,onChange:function(e){return B(e.target.value)},placeholder:"Where are you currently based?"}),Object(d.jsx)("label",{children:"Availibility"}),Object(d.jsx)("input",{type:"text",value:W,onChange:function(e){return G(e.target.value)},placeholder:"How available are you approximately per week?"}),Object(d.jsx)("label",{children:"Partnership Opportunities"}),Object(d.jsx)("input",{type:"text",value:R,onChange:function(e){return z(e.target.value)},placeholder:"Eg: Department of Computing at Imperial College London"}),Object(d.jsx)("label",{children:"Interests"}),Object(d.jsx)("input",{type:"text",value:Q,onChange:function(e){return X(e.target.value)},placeholder:"What are your hobbies?"}),Object(d.jsx)("button",{children:"Add user"})]})]})},A=n(7),D=n(22),E=function(){var e=Object(o.g)().id,t=h("/projects/"+e),n=t.data,c=n.name,s=n.description,a=n.status,i=n.location,j=n.tag,u=n.files,b=(t.error,t.isPending),O=Object(r.useState)([]),p=Object(l.a)(O,2),x=p[0],m=p[1],f=h("/users/user_project"),v=f.data,g=(f.errorUsers,f.isPendingUsers,Object(o.f)()),k=Object(D.a)(),S=k.register,w=k.handleSubmit;return Object(d.jsxs)("div",{className:"edit-project",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(t){g.push("/projects/"+e)},children:"To Project Page"})}),Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Edit project"}),b&&Object(d.jsx)("h2",{children:"Loading..."}),c&&Object(d.jsxs)("form",{onSubmit:w((function(t){fetch("/projects/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(){x.map((function(t){var n={username:t,project_id:e};fetch("/user_project",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)})}))})).then((function(){g.push("/projects")}))})),children:[Object(d.jsx)("label",{children:"Project name"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},S("name")),{},{placeholder:"Insert project name here",type:"text",defaultValue:c})),Object(d.jsx)("label",{children:"Description"}),Object(d.jsx)("textarea",Object(A.a)(Object(A.a)({},S("description")),{},{placeholder:"Insert description of the project here",defaultValue:s})),Object(d.jsx)("label",{children:"Status"}),Object(d.jsxs)("select",Object(A.a)(Object(A.a)({},S("status")),{},{defaultValue:a,children:[Object(d.jsx)("option",{value:"Progress",children:"Progress"}),Object(d.jsx)("option",{value:"Available",children:"Available"}),Object(d.jsx)("option",{value:"Completed",children:"Completed"})]})),Object(d.jsx)("label",{children:"Location"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},S("location")),{},{type:"text",placeholder:"Insert location of project here",defaultValue:i})),Object(d.jsx)("label",{children:"Type of project"}),Object(d.jsxs)("select",Object(A.a)(Object(A.a)({},S("tag")),{},{defaultValue:j,children:[Object(d.jsx)("option",{value:"Social",children:"Social"}),Object(d.jsx)("option",{value:"Education",children:"Education"}),Object(d.jsx)("option",{value:"Wash",children:"Wash"}),Object(d.jsx)("option",{value:"Environment",children:"Environment"}),Object(d.jsx)("option",{value:"Health",children:"Health"}),Object(d.jsx)("option",{value:"Other",children:"Other"})]})),Object(d.jsx)("label",{children:"Volunteers assigned to this project"}),Object(d.jsx)(y.a,{className:"dropdown",placeholder:"Select Users",value:v.filter((function(e){return x.includes(e.value)})),options:v,onChange:function(e){m(Array.isArray(e)?e.map((function(e){return e.value})):[])},isMulti:!0,isClearable:!0}),Object(d.jsx)("label",{children:"Google Drive folder"}),Object(d.jsx)("textarea",Object(A.a)(Object(A.a)({},S("files")),{},{placeholder:"Insert Google Drive Folder link here",defaultValue:u})),Object(d.jsx)("button",{type:"submit",children:"Save project details"})]})]})},I=n(33),L=function(){var e=Object(o.f)(),t=j(),n=(t.setToken,t.token);return Object(d.jsxs)(I.slide,{children:[Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)(i.b,{to:"/",children:"Home"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)(i.b,{to:"/users/"+n,children:"Profile"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)(i.b,{to:"/users",children:"All Users"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)(i.b,{to:"/projects",children:"All Projects"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)("a",{href:"https://slack.com/intl/en-gb/",target:"_blank",children:"Go To Slack"})}),Object(d.jsx)("div",{className:"menu-item",children:Object(d.jsx)("a",{style:{textDecoration:"underline",cursor:"pointer"},onClick:function(t){t.preventDefault(),localStorage.clear(),window.location.reload(),e.push("/")},children:"Log Out"})})]})},q=function(){var e=Object(o.g)().username,t=h("/users/"+e),n=t.data,r=n.firstname,c=n.surname,s=n.password,a=n.title,l=n.email,j=n.phone_no,u=n.bio,b=n.joined,O=n.location,p=n.availability,x=n.partnership_opportunities,m=n.interests,f=(t.error,t.isPending),v=Object(o.f)(),g={firstname:r,surname:c,password:s,title:a,email:l,phone_no:j,bio:u,joined:b,location:O,availability:p,partnership_opportunities:x,interests:m},y=Object(D.a)({defaultValues:g}),k=y.register,S=y.handleSubmit;return Object(d.jsxs)("div",{className:"edit-user",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(t){v.push("/users/"+e)},children:"To User Page"})}),Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Edit user"}),f&&Object(d.jsx)("h2",{children:"Loading..."}),Object(d.jsx)(i.b,{to:"/users/change-password",style:{fontSize:"20px"},children:"Change Password"}),r&&Object(d.jsxs)("form",{onSubmit:S((function(t){fetch("/users/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(){v.push("/users")}))})),children:[Object(d.jsx)("br",{}),Object(d.jsx)("label",{htmlFor:"firstname",children:"Firstname"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("firstname")),{},{placeholder:"Input your first name here",defaultValue:r})),Object(d.jsx)("label",{htmlFor:"surname",children:"Surname"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("surname")),{},{placeholder:"Input surname here",defaultValue:c})),Object(d.jsx)("label",{htmlFor:"title",children:"Title"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("title")),{},{placeholder:"State your role at InAGlobe (eg: volunteer)",defaultValue:a})),Object(d.jsx)("label",{htmlFor:"email",children:"Email"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("email")),{},{placeholder:"Input InAGlobe email here",defaultValue:l})),Object(d.jsx)("label",{htmlFor:"phone_no",children:"Phone number"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("phone_no")),{},{placeholder:"Input phone number here",defaultValue:j})),Object(d.jsx)("label",{htmlFor:"bio",children:"Bio"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("bio")),{},{placeholder:"Tell your colleagues a bit about yourself",defaultValue:u})),Object(d.jsx)("label",{htmlFor:"location",children:"Location"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("location")),{},{placeholder:"Where are you currently based?",defaultValue:O})),Object(d.jsx)("label",{htmlFor:"availability",children:"Availibility (hours per week)"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("availability")),{},{placeholder:"How available are you approximately per week?",defaultValue:p})),Object(d.jsx)("label",{htmlFor:"interests",children:"Interests"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("interests")),{},{placeholder:"What are your hobbies?",defaultValue:m})),Object(d.jsx)("label",{htmlFor:"partnership_opportunities",children:"Partnership Opportunities"}),Object(d.jsx)("input",Object(A.a)(Object(A.a)({},k("partnership_opportunities")),{},{placeholder:"Eg: Department of Computing at Imperial College London",defaultValue:x})),Object(d.jsx)("button",{type:"submit",children:"Save user details"})]})]})},V=function(e){var t=e.project_tasks,n=Object(r.useState)(""),c=Object(l.a)(n,2),s=c[0],a=c[1],i=Object(r.useState)(1),o=Object(l.a)(i,2),j=o[0],u=o[1],b=Object(r.useState)(Date.now),h=Object(l.a)(b,2),p=h[0],x=h[1],m=Object(r.useState)(""),f=Object(l.a)(m,2),v=f[0],g=f[1],y=Object(r.useState)(""),k=Object(l.a)(y,2),S=k[0],w=k[1],C=function(e){return function(t){t.preventDefault(),a(e.description),u(e.priority),x(e.due_date),g("Completed"),w(e.project_id);var n={description:s,priority:j,due_date:p,completed:v,project_id:S};console.log(n),fetch("/projects/"+e.project_id+"/tasks/"+e.id,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}).then((function(){window.location.reload()}))}},N=function(e){return function(t){t.preventDefault(),fetch("/projects/"+e.project_id+"/tasks/"+e.id,{method:"DELETE"}).then((function(){window.location.reload()}))}};return Object(d.jsx)("div",{className:"project-tasks-list",children:t.map((function(e){return Object(d.jsxs)("div",{className:"project-task-preview",children:[Object(d.jsxs)("div",{children:[Object(d.jsx)("h2",{children:e.description}),Object(d.jsxs)("h3",{children:["Due date: ",e.due_date]})]}),Object(d.jsxs)("h3",{children:["Priority: ",e.priority]}),Object(d.jsx)("h3",{children:"All volunteers assigned to this task"}),Object(d.jsx)(O,{task_id:e.id}),!e.completed&&Object(d.jsx)("button",{className:"task-complete-button",onClick:C(e),children:"Complete"}),Object(d.jsx)("button",{className:"task-delete-button",onClick:N(e),children:"Delete"})]},e.id)}))})},F=function(){var e=Object(o.g)().id,t=h("/projects/"+e),n=t.data,r=(t.errorProject,t.isPendingProject,h("/projects/"+e+"/tasks")),c=r.data,s=(r.errorTasks,r.isPendingTasks),a=Object(o.f)();return Object(d.jsxs)("div",{className:"project-tasks",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(t){a.push("/projects/"+e)},children:"To Project Details"})}),Object(d.jsx)("br",{}),s&&Object(d.jsx)("h2",{children:"Loading..."}),n&&Object(d.jsxs)("h1",{children:[n.name,": tasks"]}),Object(d.jsx)("h2",{children:"Ongoing Project Tasks"}),c&&Object(d.jsx)(V,{project_tasks:c.filter((function(e){return!e.completed}))}),Object(d.jsx)("h2",{children:"Completed Project Tasks"}),c&&Object(d.jsx)(V,{project_tasks:c.filter((function(e){return e.completed}))}),Object(d.jsx)("div",{className:"add-task-button-wrapper",children:c&&Object(d.jsx)(i.b,{to:"/projects/".concat(n.id,"/add-task"),className:"add-task-button",children:"Add Task"})})]})},B=function(){var e=Object(o.g)().id,t=Object(r.useState)(""),n=Object(l.a)(t,2),c=n[0],s=n[1],a=Object(r.useState)(Date.now),i=Object(l.a)(a,2),j=i[0],u=i[1],b=Object(r.useState)(1),O=Object(l.a)(b,2),p=O[0],x=O[1],m=Object(r.useState)(!1),f=Object(l.a)(m,2),k=f[0],S=f[1],w=Object(r.useState)([]),C=Object(l.a)(w,2),N=C[0],P=C[1],T=h("/projects/"+e),_=T.data,A=(T.error,T.isPending),D=h("/user_project/project_task/"+e),E=D.data,I=(D.errorParticipants,D.isPendingParticipants,Object(o.f)()),L=function(){var t=Object(g.a)(v.a.mark((function t(n){var r,s,a,i;return v.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n.preventDefault(),r={description:c,due_date:j,priority:p,completed:k},t.next=4,fetch("/projects/"+_.id+"/tasks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});case 4:return s=t.sent,t.next=7,s.json();case 7:a=t.sent,i=a.id,N.map((function(e){var t={username:e,task_id:i};fetch("/assigned_task",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})})),I.push("/projects/"+e);case 11:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();return Object(d.jsxs)("div",{className:"add-project-task",children:[Object(d.jsx)("div",{className:"ret-prev-page",children:Object(d.jsx)("button",{onClick:function(t){I.push("/projects/"+e+"/tasks")},children:"To Project Tasks"})}),Object(d.jsx)("br",{}),Object(d.jsx)("h2",{children:"Add a new task"}),A&&Object(d.jsx)("h2",{children:"Loading..."}),_&&Object(d.jsxs)("form",{onSubmit:L,children:[Object(d.jsx)("label",{children:"Description"}),Object(d.jsx)("input",{type:"text",required:!0,value:c,onChange:function(e){return s(e.target.value)},placeholder:"Input description here"}),Object(d.jsx)("label",{children:"Due Date [required]"}),Object(d.jsx)("input",{type:"date",required:!0,value:j,onChange:function(e){return u(e.target.value)},placeholder:"Input your first name here"}),Object(d.jsx)("label",{children:"Priority level (1: lowest, 4: highest) [required]"}),Object(d.jsxs)("select",{required:!0,value:p,onChange:function(e){return x(e.target.value)},children:[Object(d.jsx)("option",{value:"1",children:"1"}),Object(d.jsx)("option",{value:"2",children:"2"}),Object(d.jsx)("option",{value:"3",children:"3"}),Object(d.jsx)("option",{value:"4",children:"4"})]}),Object(d.jsx)("label",{children:"Volunteers assigned to this task"}),Object(d.jsx)(y.a,{className:"dropdown",placeholder:"Select Users",value:E.filter((function(e){return N.includes(e.value)})),options:E,onChange:function(e){P(Array.isArray(e)?e.map((function(e){return e.value})):[])},isMulti:!0,isClearable:!0}),Object(d.jsx)("label",{children:"Status"}),Object(d.jsxs)("select",{value:k,onChange:function(e){return S(e.target.value)},children:[Object(d.jsx)("option",{value:"Incomplete",children:"Available"}),Object(d.jsx)("option",{value:"Completed",children:"Completed"})]}),Object(d.jsx)("button",{children:"Add task"})]})]})};function J(e){return U.apply(this,arguments)}function U(){return(U=Object(g.a)(v.a.mark((function e(t){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",fetch("/users/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(e){return e.json()})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function W(e){var t=e.setToken,n=Object(r.useState)(),c=Object(l.a)(n,2),s=c[0],a=c[1],o=Object(r.useState)(),j=Object(l.a)(o,2),u=j[0],b=j[1],h=function(){var e=Object(g.a)(v.a.mark((function e(n){var r;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.preventDefault(),e.next=3,J({username:s,password:u});case 3:""!=(r=e.sent).token?t(r):document.getElementsByClassName("incorrect-password")[0].style.display="block";case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return Object(d.jsxs)("div",{className:"login",children:[Object(d.jsx)("h1",{children:" InAGlobe Platform "}),Object(d.jsxs)("form",{onSubmit:h,children:[Object(d.jsx)("input",{type:"text",id:"login",class:"fadeIn second",name:"login",placeholder:"login",onChange:function(e){return a(e.target.value)}}),Object(d.jsx)("input",{type:"password",id:"password",class:"fadeIn third",name:"login",placeholder:"password",onChange:function(e){return b(e.target.value)}}),Object(d.jsx)("div",{className:"incorrect-password",style:{display:"none"},children:Object(d.jsx)("h2",{children:"Incorrect password!"})}),Object(d.jsx)("div",{className:"links",children:Object(d.jsx)(i.b,{to:"/forgot-password",children:"Forgot Password"})}),Object(d.jsx)("button",{type:"submit",children:"Log In"})]})]})}var G=function(){var e=Object(r.useState)(""),t=Object(l.a)(e,2),n=t[0],c=t[1],s=Object(r.useState)(""),a=Object(l.a)(s,2),u=a[0],b=a[1],h=j(),O=(h.setToken,h.token);Object(o.f)();function p(){return x.apply(this,arguments)}function x(){return(x=Object(g.a)(v.a.mark((function e(){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",fetch("/users/update-password",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:O,oldPassword:n,newPassword:u})}).then((function(e){return e.json()})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var m=function(){var e=Object(g.a)(v.a.mark((function e(t){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),e.next=3,p();case 3:"True"!=e.sent.status?document.getElementsByClassName("incorrect-password")[0].style.display="block":document.getElementsByClassName("password-changed-msg")[0].style.display="block";case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return Object(d.jsxs)("div",{className:"change-password",children:[Object(d.jsx)("h2",{children:"Change Password"}),Object(d.jsx)("label",{children:"Current Password"}),Object(d.jsx)("input",{onChange:function(e){return c(e.target.value)},placeholder:"Current Password"}),Object(d.jsx)("label",{children:"New Password"}),Object(d.jsx)("input",{onChange:function(e){return b(e.target.value)},placeholder:"New Password"}),Object(d.jsx)("button",{onClick:m,children:"Change password"}),Object(d.jsx)("h2",{className:"incorrect-password",style:{display:"none"},children:"Incorrect password"}),Object(d.jsxs)("div",{className:"password-changed-msg",style:{display:"none"},children:[Object(d.jsx)("h3",{children:"Your password has been changed successfully"}),Object(d.jsx)(i.b,{to:"/",children:"Back to Dashboard"})]})]})},M=function(){var e=h("/projects"),t=e.data,n=(e.errorProjects,e.isPendingProjects);return Object(d.jsxs)("div",{className:"project-registry",children:[Object(d.jsx)("h1",{children:"All Projects"}),Object(d.jsx)("br",{}),n&&Object(d.jsx)("h2",{children:"Loading..."}),t&&Object(d.jsx)(b,{projects:t,title:"All Projects"})]})};function H(e){return R.apply(this,arguments)}function R(){return(R=Object(g.a)(v.a.mark((function e(t){return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",fetch("/users/forgot-password",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((function(e){return e.json()})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var z=function(){var e=Object(r.useState)("."),t=Object(l.a)(e,2),n=t[0],c=t[1],s=Object(o.f)(),a=function(){var e=Object(g.a)(v.a.mark((function e(t){var r;return v.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t.preventDefault(),"."==n){e.next=7;break}return r={username:n,newPassword:Math.random().toString(36).replace(/[^a-z]+/g,"")},e.next=5,H(r);case 5:"False"==e.sent.status?(document.getElementsByClassName("email-sent")[0].style.display="none",document.getElementsByClassName("incorrect-username")[0].style.display="block"):(document.getElementsByClassName("incorrect-username")[0].style.display="none",document.getElementsByClassName("email-sent")[0].style.display="block");case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return Object(d.jsxs)("div",{className:"forgot-password",children:[Object(d.jsxs)("form",{onSubmit:a,children:[Object(d.jsx)("h1",{children:"Forgot Password"}),Object(d.jsx)("h2",{children:"Input your username"}),Object(d.jsx)("input",{type:"text",placeholder:"username",onChange:function(e){return c(e.target.value)}}),Object(d.jsx)("div",{className:"incorrect-username",style:{display:"none"},children:Object(d.jsx)("h2",{children:"Incorrect username provided!"})}),Object(d.jsx)("div",{className:"email-sent",style:{display:"none"},children:Object(d.jsx)("h2",{children:"Email has been sent!"})}),Object(d.jsx)("button",{children:"Submit"})]}),Object(d.jsx)("button",{onClick:function(e){e.preventDefault(),s.push("/")},children:"Back to Login Page"})]})};var Y=function(){var e=j(),t=e.token,n=e.setToken;return t?Object(d.jsx)(i.a,{children:Object(d.jsxs)("div",{className:"App",children:[Object(d.jsx)(L,{}),Object(d.jsx)(u,{}),Object(d.jsx)("div",{className:"content",children:Object(d.jsxs)(o.c,{children:[Object(d.jsx)(o.a,{exact:!0,path:"/",children:Object(d.jsx)(m,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/create-project",children:Object(d.jsx)(k,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/add-user",children:Object(d.jsx)(_,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/my-profile",children:Object(d.jsx)(C,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/users",children:Object(d.jsx)(T,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/users/change-password",children:Object(d.jsx)(G,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/users/:username",children:Object(d.jsx)(N,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/edit-user/:username",children:Object(d.jsx)(q,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/projects",children:Object(d.jsx)(M,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/projects/:id/add-task",children:Object(d.jsx)(B,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/projects/:id/tasks",children:Object(d.jsx)(F,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/projects/:id",children:Object(d.jsx)(S,{})}),Object(d.jsx)(o.a,{exact:!0,path:"/edit-project/:id",children:Object(d.jsx)(E,{})}),Object(d.jsx)(o.a,{path:"*",children:Object(d.jsx)(w,{})})]})})]})}):Object(d.jsx)(i.a,{children:Object(d.jsxs)(o.c,{children:[Object(d.jsx)(o.a,{exact:!0,path:"/forgot-password",children:Object(d.jsx)(z,{})}),Object(d.jsx)(o.a,{path:"*",children:Object(d.jsx)(W,{setToken:n})})]})})},K=function(e){e&&e instanceof Function&&n.e(3).then(n.bind(null,73)).then((function(t){var n=t.getCLS,r=t.getFID,c=t.getFCP,s=t.getLCP,a=t.getTTFB;n(e),r(e),c(e),s(e),a(e)}))};a.a.render(Object(d.jsx)(c.a.StrictMode,{children:Object(d.jsx)(Y,{})}),document.getElementById("root")),K()}},[[72,1,2]]]);
+//# sourceMappingURL=main.8ac766d6.chunk.js.map
\ No newline at end of file
diff --git a/backend/static/react/js/main.8ac766d6.chunk.js.map b/backend/static/react/js/main.8ac766d6.chunk.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..938016d97128c88385b1cd808482c867c79f3472
--- /dev/null
+++ b/backend/static/react/js/main.8ac766d6.chunk.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["useToken.js","Navbar.js","ProjectList.js","useFetch.js","UsersAssignedToTask.js","MyProjectTasks.js","PersonalToDo.js","Home.js","CreateProject.js","ProjectDetails.js","PageNotFound.js","MyProfile.js","User.js","UserList.js","Users.js","AddUser.js","EditProject.js","Sidebar.js","EditUser.js","ProjectTaskList.js","ProjectTasks.js","AddProjectTask.js","Login.js","ChangePassword.js","ProjectsRegistry.js","ForgotPassword.js","App.js","reportWebVitals.js","index.js"],"names":["useToken","useState","tokenString","localStorage","getItem","userToken","JSON","parse","token","getToken","setToken","setItem","stringify","Navbar","className","href","style","color","fontSize","borderRadius","to","ProjectList","projects","title","map","project","id","name","status","useFetch","url","data","setData","error","setError","isPending","setIsPending","useEffect","fetch","then","res","ok","Error","json","catch","err","message","UsersAssignedToTask","task_id","assignedUsers","user","username","firstname","surname","MyProjectTasks","tasks","task","description","priority","project_id","project_name","due_date","PersonalToDo","todos","users","todo_desc","setTodoDesc","setPriority","Date","now","setDueDate","setUsername","float","onClick","document","getElementsByClassName","display","Object","keys","length","onSubmit","e","preventDefault","newTodo","method","headers","body","window","location","reload","value","onChange","target","required","placeholder","type","todo","Home","isPendingTodos","errorTodos","isPendingRProjects","errorRProjects","project_tasks","errorProjectTasks","isPendingProjectTasks","myTodos","filter","console","log","width","CreateProject","setName","setDescription","setStatus","tag","setTag","setLocation","files","setFiles","selectUsernames","setSelectUsernames","history","useHistory","handleSubmit","a","newProject","response","responseJSON","assign_project","push","includes","options","Array","isArray","x","isMulti","isClearable","ProjectDetails","useParams","assignments","errorAssignment","isPendingAssignment","marginBottom","marginright","backgroundColor","cursor","marginRight","open","PageNotFound","MyProfile","email","bio","joined","availability","partnership_opportunities","interests","User","UserList","Users","AddUser","setFirstname","setSurname","password","setPassword","setTitle","setEmail","phone_no","setPhoneNo","setBio","setJoined","setAvailability","setPartnership_opportunities","setInterests","newUser","EditProject","errorUsers","isPendingUsers","useForm","register","defaultValue","Sidebar","textDecoration","clear","EditUser","oldUserDetails","defaultValues","htmlFor","ProjectTaskList","completed","setCompleted","setProjectId","handleComplete","newTask","handleDelete","ProjectTasks","errorProject","isPendingProject","isPendingTasks","errorTasks","AddProjectTask","setAssignedUsers","participants","errorParticipants","isPendingParticipants","newProjectTask","assigned_task","loginUser","credentials","Login","setUserName","class","ChangePassword","oldPassword","setOldPassword","newPassword","setNewPassword","passwordUpdate","ProjectRegistry","isPendingProjects","errorProjects","resetPassword","msg","ForgotPassword","Math","random","toString","replace","App","exact","path","ProjectsRegistry","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"js/main.8ac766d6.chunk.js","sourcesContent":["import { useState } from 'react';\n\nexport default function useToken() {\n    const getToken = () => {\n        const tokenString = localStorage.getItem('token');\n        const userToken = JSON.parse(tokenString);\n        return userToken?.token\n    };\n    \n    const [token, setToken] = useState(getToken());\n\n    const saveToken = userToken => {\n        localStorage.setItem('token', JSON.stringify(userToken));\n        setToken(userToken.token);\n    };\n\n    return {\n        setToken: saveToken,\n        token\n    }\n\n}","import { Link } from 'react-router-dom'\nimport useToken from './useToken';\n\nconst Navbar = () => {\n    const {setToken, token} = useToken();\n\n    return (\n        <nav className=\"navbar\" >\n            <a href=\"/\" style={{ \n                color: '#ff4e83',\n                fontSize: '20px',\n                borderRadius: '8px' \n            }}>InAGlobe Platform</a>\n            <div className=\"links\"> \n                <Link to={`/create-project`}>New Project</Link>\n                <Link to={`/users/` + token}>My Profile</Link>\n            </div>\n        </nav>\n    );\n}\n \nexport default Navbar;","import { Link } from 'react-router-dom'\n\nconst ProjectList = ({ projects, title }) => {\n\n    return (\n        <div className=\"project-list\">\n            <h2>{title}</h2>\n            {projects.map((project) => (\n                <div className=\"preview\" key={project.id}>\n                    <Link to={`/projects/${project.id}`}>\n                        <h2>{project.name}</h2>\n                        <h3>{project.status}</h3>\n                    </Link>\n                </div>\n            ))}\n        </div>\n    );\n}\n \nexport default ProjectList;","import { useState, useEffect } from 'react';\n\nconst useFetch = (url) => {\n  const [data, setData] = useState([]);\n  const [error, setError] = useState(null);\n  const [isPending, setIsPending] = useState(true);\n\n  useEffect(() => {\n    fetch(url)\n        .then(res => {\n            if (!res.ok) { // error coming back from server\n                throw Error('could not fetch the data for that resource');\n            } \n            return res.json();\n        })\n        .then(data => {\n            setData(data);\n            setIsPending(false);\n            setError(null);\n        })\n        .catch(err => {\n            // auto catches network / connection error\n            setError(err.message);\n        })\n  }, [url])\n\n  return { data, error, isPending };\n}\n \nexport default useFetch;","import { Link } from 'react-router-dom'\nimport useFetch from './useFetch';\n\nconst UsersAssignedToTask = ({task_id, title}) => {\n\n    const { data: assignedUsers, error, isPending } = useFetch(\"/assigned_task/task/\" + task_id);\n\n    return assignedUsers.map((user) => (\n        <div className=\"assigned_users_list\">\n            <Link to={`/users/${user.username}`}>\n                <h5>{user.firstname} {user.surname}</h5>\n            </Link>\n        </div>\n    ));\n\n}\n\nexport default UsersAssignedToTask;","import { Link } from 'react-router-dom'\nimport useFetch from './useFetch';\nimport UsersAssignedToTask from './UsersAssignedToTask';\n\nconst MyProjectTasks = ({ tasks, title }) => {\n    const FindingUsers = task_id => {\n        const { data: assignedUsers, error, isPending } = useFetch(\"/assigned_task/task/\" + task_id);\n        return assignedUsers.map((user) => (\n            <div className=\"assigned-users-list\">\n                <Link to={`/users/${user.username}`}>\n                    <h5>{user.firstname} {user.surname}</h5>\n                </Link>\n            </div>\n        ));\n    }\n\n    return (\n        <div>\n            <h2>{title}</h2>\n\n            <div className=\"my-project-tasks\">\n                {tasks.map((task) => (\n                    <div className=\"task-preview\" key={task.id}>\n                        <h2>{task.description} [Priority: {task.priority}]</h2>\n                        <Link to={`/projects/${task.project_id}`}>\n                            <h3 style={{color: \"#f1356d\"}}>{task.project_name}</h3>\n                        </Link>\n                        <h3><strong>To be done by:</strong> {task.due_date}</h3>\n                        <h3>Assigned volunteers: </h3>\n                        <UsersAssignedToTask task_id={task.id} />\n                    </div>\n                ))}\n            </div>\n        </div>\n    );\n}\n\nexport default MyProjectTasks;","import useFetch from './useFetch'\nimport { useState } from \"react\";\nimport useToken from './useToken'\n\nconst PersonalToDo = ({ todos, title }) => {\n\n    const openTaskForm = () => {\n        document.getElementsByClassName(\"add-todo-form\")[0].style.display = \"block\";\n    }\n    const {setToken, token} = useToken();\n\n\n    const { data: users, error, isPending } = useFetch(\"/users\")\n\n    const [todo_desc, setTodoDesc] = useState(\"\");\n    const [priority, setPriority] = useState(1);\n    const [due_date, setDueDate] = useState(Date.now());\n    const [username, setUsername] = useState(token);\n\n    const handleSubmit = e => {\n        document.getElementsByClassName(\"add-todo-form\")[0].style.display = \"none\";\n\n        e.preventDefault();\n        const newTodo = { todo_desc, priority, due_date, username };\n\n        fetch(\"/todos\", {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(newTodo)\n        }).then(() => {\n            window.location.reload();\n        })\n    }\n\n    const handleRemove = id => e => {\n        e.preventDefault();\n        fetch(\"/todos/\" + id, { method: 'DELETE' })\n            .then(() => {\n                window.location.reload();\n            })\n    };\n\n    return (\n        <div className=\"todo-list\" style={{float: \"right\"}}>\n            <h2>{title}</h2>\n\n            <div className=\"add-todo-button\">\n                <button onClick={openTaskForm}>Add a personal task</button>\n            </div>\n\n            { todos && (Object.keys(todos).length === 0) && <h3 style={{float: \"right\"}}>Well done you have no ToDo items!</h3>}\n\n            { isPending && <h2>Loading...</h2> }\n\n            <div className=\"add-todo-form\">\n                { users && <form onSubmit={handleSubmit}>\n                    <label>Task description [required]</label>\n                    <textarea value={todo_desc} onChange={(e) => setTodoDesc(e.target.value)} required placeholder=\"Add some awesome description!\" ></textarea>\n                    <label>Priority level (1: lowest, 4: highest)</label>\n                    <select value={priority} onChange={(e) => setPriority(e.target.value)} >\n                        <option value=\"1\">1</option>\n                        <option value=\"2\">2</option>\n                        <option value=\"3\">3</option>\n                        <option value=\"4\">4</option>\n                    </select>\n                    <label>When should this task be done by? [required]</label>\n                    <input\n                        required\n                        type=\"date\"\n                        value={due_date}\n                        onChange={(e) => setDueDate(e.target.value)}\n                    />\n                    <label>Assigned user</label>\n                    <select value={username} onChange={(e) => setUsername(e.target.value)} >\n                        {users.map(user => <option value={user.username}>{user.username}</option>)}\n                    </select>\n                    <button>Save task</button>\n                </form> }\n            </div>\n\n            <div className=\"personal-todos\">\n                {todos.map((todo) => (\n                    <div className=\"todo-preview\" key={todo.id}>\n                        <h2>{todo.todo_desc}</h2>\n                        <h3>Priority level: {todo.priority}</h3>\n                        <h3>To be done by: {todo.due_date}</h3>\n                        <button onClick={handleRemove(todo.id)}>Complete</button>\n                    </div>\n                ))}\n            </div>\n\n        </div>\n    );\n\n}\n\nexport default PersonalToDo;","import ProjectList from './ProjectList';\nimport MyProjectTasks from './MyProjectTasks';\nimport PersonalToDo from './PersonalToDo';\nimport useFetch from './useFetch';\nimport useToken from './useToken';\nimport { useState } from \"react\";\n\nconst Home = () => {\n\n    const { data: todos, errorTodos, isPendingTodos } = useFetch(\"/todos\");\n    const { setToken, token } = useToken();\n\n    const { data: projects, errorRProjects, isPendingRProjects } = useFetch(\"/user_project/username/\" + token);\n    const {data: project_tasks, errorProjectTasks, isPendingProjectTasks} = useFetch(\"/assigned_task/username/\" + token)\n\n    const { data: {firstname, surname}} = useFetch(\"/users/name/\" + token);\n    const myTodos = todos.filter(todo => todo.username === token);\n\n  \n    return (\n        <div className=\"home\">\n            <h1>Welcome back, {firstname}!</h1>\n            {console.log(\"Firstname: \" )}\n            <div className=\"home-projects\" style={{ float: \"left\", width: \"600px\" }}>\n                {isPendingRProjects && <h2>Loading...</h2>}\n                {projects && <ProjectList projects={projects} title=\"My Projects\" />}\n                {projects && (Object.keys(projects).length === 0) && <h3>You are not assigned to any project currently</h3>}\n            </div>\n            <div className=\"homeTodos\" style={{ float: \"right\", width: \"300px\" }}>\n                {isPendingTodos && <h2>Loading...</h2>}\n                {todos && <PersonalToDo todos={myTodos} title=\"Personal ToDo items\" />}\n            </div>\n            <div className=\"home-project-tasks\" style={{ float: \"left\", width: \"600px\" }}>\n                {isPendingRProjects && <h2>Loading...</h2>}\n                {projects && <MyProjectTasks tasks={project_tasks} title=\"My tasks from all projects\" />}\n                {projects && (Object.keys(project_tasks).length === 0) && <h3>Well done you have no project tasks!</h3>}\n            </div>\n        </div>\n\n    );\n}\n\nexport default Home;","import { useState } from \"react\";\nimport { useHistory } from \"react-router-dom\"\nimport Select from 'react-select';\nimport useFetch from './useFetch'\n\nconst CreateProject = () => {\n    const [name, setName] = useState(\"\");\n    const [description, setDescription] = useState(\"\");\n    const [status, setStatus] = useState(\"Available\");\n    const [tag, setTag] = useState(\"Other\");\n    const [location, setLocation] = useState(\"\");\n    const [files, setFiles] = useState(\"\");\n\n    const [selectUsernames, setSelectUsernames] = useState([]);\n\n    const history = useHistory();\n\n    const { data: users, error, isPending } = useFetch(\"/users/user_project\");\n\n    const usernames = users.map(user => user.username);\n\n    const handleChange = (e) => {\n        setSelectUsernames(Array.isArray(e) ? e.map(x => x.value) : []); \n    }\n\n    const handleSubmit = async e => {\n        e.preventDefault()\n\n        const newProject = { name, description, status, tag, location, files };\n\n        const response = await fetch(\"/projects\", {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(newProject)\n        });\n\n        const responseJSON = await response.json();\n\n        const project_id = responseJSON.id;\n\n        selectUsernames.map(username => {\n            const assign_project = { username, project_id };\n\n            fetch(\"/user_project\", {\n                method: 'POST',\n                headers: { \"Content-Type\": \"application/json\" },\n                body: JSON.stringify(assign_project)\n            });\n        });\n\n        history.push(\"/\");\n    }\n\n    return (\n        <div className=\"create-project\">\n            <br />\n            <h2>Add a new project</h2>\n            <form onSubmit={handleSubmit}>\n                <label>Project name [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={name}\n                    onChange={(e) => setName(e.target.value)}\n                    placeholder=\"Input project name\"\n                />\n                <label>Description [required]</label>\n                <textarea required placeholder=\"Add some awesome description!\" value={description} onChange={(e) => setDescription(e.target.value)}></textarea>\n                <label>Status</label>\n                <select value={status} onChange={(e) => setStatus(e.target.value)}>\n                    <option value=\"Progress\">Progress</option>\n                    <option value=\"Available\">Available</option>\n                    <option value=\"Completed\">Completed</option>\n                </select>\n                <label>Location</label>\n                <input\n                    type=\"text\"\n                    value={location}\n                    onChange={(e) => setLocation(e.target.value)}\n                    placeholder=\"Eg: United Kingdom\"\n                />\n                <label>Type of project [required]</label>\n                <select required value={tag} onChange={(e) => setTag(e.target.value)}>\n                    <option value=\"Social\">Social</option>\n                    <option value=\"Education\">Education</option>\n                    <option value=\"Wash\">Wash</option>\n                    <option value=\"Environment\">Environment</option>\n                    <option value=\"Health\">Health</option>\n                    <option value=\"Other\">Other</option>\n                </select>\n                <label>Volunteers assigned to this project</label>\n                <Select\n                    className=\"dropdown\"\n                    placeholder=\"Select Users\"\n                    value={users.filter(user => selectUsernames.includes(user.value))}\n                    options={users} // set list of the usernames\n                    onChange={handleChange} // assign onChange function\n                    isMulti\n                    isClearable\n                />\n                <label>Google Drive folder</label>\n                <textarea placeholder=\"Copy the link to the Google Drive folder for this project\" value={files} onChange={(e) => setFiles(e.target.value)}></textarea>\n                <button>Add project</button>\n            </form>\n        </div>\n    );\n}\n\n\nexport default CreateProject;","import { useHistory, useParams } from 'react-router';\nimport useFetch from './useFetch'\nimport { Link } from \"react-router-dom\"\n\nconst ProjectDetails = () => {\n    const { id } = useParams();\n    const history = useHistory();\n\n    const { data: project, error, isPending } = useFetch(\"/projects/\" + id)\n    const { data: assignments, errorAssignment, isPendingAssignment } = useFetch(\"/user_project/project/\" + id)\n\n    const handleRemove = e => {\n        e.preventDefault()\n        fetch(\"/projects/\" + id, { method: 'DELETE' })\n            .then(() => { history.push('/'); })\n    };\n\n    return (\n        <div className=\"project-details\">\n            <br />\n            { isPending && <h2>Loading...</h2> }\n            { project && <h2>{project.name}</h2> }\n            { project && <button style={{\n                fontSize: '20px',\n                color: '#fff',\n                marginBottom: '30px',\n                marginright: '10px',\n                borderRadius: '8px',\n                backgroundColor: '#f1b535',\n                cursor: 'default'\n            }}>Status: {project.status}</button>}\n            {project && <button style={{\n                fontSize: '20px',\n                color: '#fff',\n                marginBottom: '30px',\n                marginRight: '10px',\n                borderRadius: '8px',\n                backgroundColor: '#595bc0',\n                cursor: 'default'\n            }}>{project.tag}</button>}\n            {project && <h4>Location: {project.location}</h4>}\n            {project && <button onClick={(e) => {\n                e.preventDefault();\n                window.open(project.files, \"_blank\");\n            }}>Documents</button>}\n            {project && <p>{project.description}</p>}\n\n            <h3>Volunteers working on this project</h3>\n            <div className=\"project_user_assignment_list\">\n                {assignments.map(a => (\n                    <div className=\"assigned_users_preview\" style={{float: \"left\", width: \"50%\"}} key={a.id}>\n                        <Link to={`/users/${a.username}`}>\n                            <h4>{a.username}</h4>\n                        </Link>\n                    </div>)\n                )\n                }\n            </div>\n\n            <div className=\"project-tasks\">\n                {project && <Link to={`/projects/${project.id}/tasks`} className=\"view-tasks-button\">View Tasks</Link>}\n\n                {project && <Link to={`/projects/${project.id}/add-task`} className=\"add-task-button\">Add Task</Link>}\n            </div>\n\n            <div>\n                {project && <button onClick={handleRemove}>Delete project</button>}\n\n                {project && <Link to={`/edit-project/${project.id}`} className=\"edit-project-button\">Edit project</Link>}\n            </div>\n\n        </div>\n\n    );\n}\n\nexport default ProjectDetails;","import { Link } from \"react-router-dom\"\n\nconst PageNotFound = () => {\n    return (\n        <div className=\"page-not-found\">\n            <h2>Something went wrong...</h2>\n            <p>That page cannot be found</p>\n            <Link to='/'>Back to the main page</Link>\n        </div>\n    );\n}\n \nexport default PageNotFound;","import { useHistory, useParams } from 'react-router';\nimport useFetch from './useFetch'\nimport useToken from './useToken';\n\nconst MyProfile = () => {\n    const {setToken, token} = useToken();\n\n    const {data: user, error, isPending} = useFetch(\"/users/\" + token)\n\n    return (\n        <div className=\"my-profile\">\n            { isPending && <h2>Loading...</h2> }\n            { user && <h2>{user.firstname + \" \" + user.surname}</h2> }\n            { user && <h1>{\"Username: \" + user.token}</h1> }\n            { user && <h1>{\"Title: \" + user.title}</h1> }\n            { user && <h1>{\"Email: \" + user.email}</h1> }\n            { user && <h1>{\"Bio: \" + user.bio}</h1> }\n            { user && <h1>{\"Joined: \" + user.joined}</h1> }\n            { user && <h1>{\"Location: \" + user.location}</h1> }\n            { user && <h1>{\"Availability: \" + user.availability}</h1> }\n            { user && <h1>{\"Partnership Opportunities: \" + user.partnership_opportunities}</h1> }\n            { user && <h1>{\"Interests: \" + user.interests}</h1> }    \n        </div>\n    );\n}\n\nexport default MyProfile;","import { useHistory, useParams } from 'react-router';\nimport useFetch from './useFetch'\nimport { Link } from \"react-router-dom\"\nimport useToken from './useToken';\n\nconst User = () => {\n    const {username} = useParams();\n    const history = useHistory();\n    const {setToken, token} = useToken();\n    \n    const {data: user, error, isPending} = useFetch(\"/users/\" + username)\n    \n    const handleRemove = e => {\n        e.preventDefault()\n        fetch(\"/users/\" + username, {method: 'DELETE'})\n            .then(()=> {history.push('/');})\n      };\n\n    const handleReturn = e => {\n        history.push('/users');\n    }\n\n    return (\n        <div className=\"user\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To All Users</button>\n            </div>\n            <br />\n            { isPending && <h2>Loading...</h2> }\n            { user && <div>\n                <h2>{user.firstname + \" \" + user.surname}</h2>\n            </div> }\n\n            { user && <div>\n                <h3><strong>Username: </strong>{user.username}</h3>\n                <h3><strong>Email: </strong>{user.email}</h3>       \n                <h3><strong>Title: </strong>{user.title}</h3>\n                <h3><strong>Joined: </strong>{user.joined}</h3>\n                <h3><strong>Location: </strong>{user.location}</h3>\n                <h3><strong>Availability: </strong>{user.availability}</h3>\n            </div> }\n\n            <br />\n\n            { user && <div>\n                <label><strong>Bio</strong></label>\n                <p>{user.bio}</p>\n            </div> }\n            \n            { user && <div>\n                <label><strong>Partnership Opportunities</strong></label>\n                <p>{user.partnership_opportunities}</p>\n            </div> }\n\n            { user && <div>\n                <label><strong>Interests</strong></label>\n                <p>{user.interests}</p>\n            </div> }\n\n            { user && (token == \"jaimeaguilera\" || username == token) && <button onClick={handleRemove}>Delete user</button> }\n            \n            { user && (token == \"jaimeaguilera\" || username == token) && <Link to={`/edit-user/${username}`} className=\"edit-user-button\">Edit details</Link> }\n    </div>\n    );\n}\n \nexport default User;","import { Link } from 'react-router-dom'\n\nconst UserList = ({ users }) => {\n\n    return (\n        <div className=\"user-list\">\n\n            {users.map((user) => (\n                <div className=\"preview\" key={user.username}>\n                    <Link to={`/users/${user.username}`}>\n                        <h2>{user.username}</h2>\n                    </Link>\n                </div>\n            ))}\n        </div>\n    );\n}\n \nexport default UserList;\n","import UserList from './UserList'\nimport useFetch from './useFetch'\nimport useToken from './useToken'\nimport { Link } from 'react-router-dom'\n\nconst Users = () => {\n\n    const {data: users, error, isPending} = useFetch(\"/users\")\n    const {setToken, token} = useToken();\n\n    return (\n        <div className=\"users\">\n            <h1>Users</h1>\n            { token == \"jaimeaguilera\" && <Link to={`/add-user`} className=\"add-user-button\">Add User</Link> }\n            <br />\n            <br />\n            { isPending && <h2>Loading...</h2> }\n            { users && <UserList users={users} title=\"All Users\"/> }\n        </div>\n    );\n}\n \nexport default Users;","import { useState } from \"react\";\nimport { useHistory } from \"react-router-dom\"\n\nconst AddUser = () => {\n    const [firstname, setFirstname] = useState(\"\");\n    const [surname, setSurname] = useState(\"\");\n    const [password, setPassword] = useState(\"\");\n    const [title, setTitle] = useState(\"\")\n    const [email, setEmail] = useState(\"\");\n    const [phone_no, setPhoneNo] = useState(\"\");\n    const [bio, setBio] = useState(\"\");\n    const [joined, setJoined] = useState(Date.now());\n    const [location, setLocation] = useState(\"\");\n    const [availability, setAvailability] = useState(\"\");\n    const [partnership_opportunities, setPartnership_opportunities] = useState(\"\");\n    const [interests, setInterests] = useState(\"\");\n    const [username, setUsername] = useState(\"\");\n\n    const history = useHistory();\n\n    const handleSubmit = e => {\n        e.preventDefault()\n\n        const newUser = {\n            firstname,\n            surname,\n            password,\n            title,\n            email,\n            phone_no,\n            bio,\n            joined,\n            location,\n            availability,\n            partnership_opportunities,\n            interests,\n            username\n        }\n\n        fetch(\"/users\", {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(newUser)\n        }).then(() => {\n            history.push('/users');\n        })\n    }\n\n    const handleReturn = e => {\n        history.push('/users');\n    }\n\n    return (\n        <div className=\"add-user\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To All Users</button>\n            </div>\n            <br />\n            <h2>Add a new user</h2>\n            <form onSubmit={handleSubmit}>\n                <label>Username [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={username}\n                    onChange={(e) => setUsername(e.target.value)}\n                    placeholder=\"Input username here\"\n                />\n\n\n                <label>Firstname [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={firstname}\n                    onChange={(e) => setFirstname(e.target.value)}\n                    placeholder=\"Input your first name here\"\n                />\n\n                <label>Surname [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={surname}\n                    onChange={(e) => setSurname(e.target.value)}\n                    placeholder=\"Input surname here\"\n                />\n\n                <label>Title [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={title}\n                    onChange={(e) => setTitle(e.target.value)}\n                    placeholder=\"State your role at InAGlobe (eg: volunteer)\"\n                />\n\n                <label>Password [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={password}\n                    onChange={(e) => setPassword(e.target.value)}\n                    placeholder=\"Input the default password (to be changed by the user)\"\n                />\n\n                <label>Email [required]</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={email}\n                    onChange={(e) => setEmail(e.target.value)}\n                    placeholder=\"Input InAGlobe email here\"\n                />\n\n                <label>Phone Number</label>\n                <input\n                    type=\"text\"\n                    value={phone_no}\n                    onChange={(e) => setPhoneNo(e.target.value)}\n                    placeholder=\"Input your phone number\"\n                />\n\n\n                <label>Bio</label>\n                <input\n                    type=\"text\"\n                    value={bio}\n                    onChange={(e) => setBio(e.target.value)}\n                    placeholder=\"Tell your colleagues a bit about yourself\"\n                />\n\n                <label>Joined [required]</label>\n                <input\n                    type=\"date\"\n                    required\n                    value={joined}\n                    onChange={(e) => setJoined(e.target.value)}\n                    placeholder=\"Eg: 20th April 2020\"\n                />\n\n\n                <label>Location</label>\n                <input\n                    type=\"text\"\n                    value={location}\n                    onChange={(e) => setLocation(e.target.value)}\n                    placeholder=\"Where are you currently based?\"\n                />\n\n                <label>Availibility</label>\n                <input\n                    type=\"text\"\n                    value={availability}\n                    onChange={(e) => setAvailability(e.target.value)}\n                    placeholder=\"How available are you approximately per week?\"\n                />\n\n                <label>Partnership Opportunities</label>\n                <input\n                    type=\"text\"\n                    value={partnership_opportunities}\n                    onChange={(e) => setPartnership_opportunities(e.target.value)}\n                    placeholder=\"Eg: Department of Computing at Imperial College London\"\n                />\n\n                <label>Interests</label>\n                <input\n                    type=\"text\"\n                    value={interests}\n                    onChange={(e) => setInterests(e.target.value)}\n                    placeholder=\"What are your hobbies?\"\n                />\n\n                <button>Add user</button>\n            </form>\n        </div>\n    );\n}\n\nexport default AddUser;","import { useState } from \"react\";\nimport { useHistory, useParams } from \"react-router-dom\"\nimport { useForm } from \"react-hook-form\"\nimport useFetch from './useFetch'\nimport Select from 'react-select'\n\nconst EditProject = () => {\n    const { id } = useParams();\n    const { data: { name, description, status, location, tag, files }, error, isPending } = useFetch(\"/projects/\" + id)\n    const [selectUsernames, setSelectUsernames] = useState([]);\n    const { data: users, errorUsers, isPendingUsers } = useFetch(\"/users/user_project\");\n\n    const history = useHistory();\n    \n    const { register, handleSubmit } = useForm();\n\n    const handleChange = (e) => {\n        setSelectUsernames(Array.isArray(e) ? e.map(x => x.value) : []);\n    }\n\n    const onSubmit = e => {\n        fetch(\"/projects/\" + id, {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(e)\n        }).then(() => {\n            selectUsernames.map(username => {\n                const assign_project = { username: username, project_id: id };\n\n                fetch(\"/user_project\", {\n                    method: 'POST',\n                    headers: { \"Content-Type\": \"application/json\" },\n                    body: JSON.stringify(assign_project)\n                });\n            });\n        }).then(() => {\n            history.push('/projects');\n        })\n    }\n\n    const handleReturn = e => {\n        history.push('/projects/' + id);\n    }\n\n    return (\n        <div className=\"edit-project\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To Project Page</button>\n            </div>\n            <br />\n            <h2>Edit project</h2>\n            {isPending && <h2>Loading...</h2>}\n            {name && <form onSubmit={handleSubmit(onSubmit)}>\n                <label>Project name</label>\n                <input\n                    {...register(\"name\")}\n                    placeholder=\"Insert project name here\"\n                    type=\"text\"\n                    defaultValue={name}\n                />\n                <label>Description</label>\n                <textarea {...register(\"description\")} placeholder=\"Insert description of the project here\" defaultValue={description}></textarea>\n                <label>Status</label>\n                <select {...register(\"status\")} defaultValue={status}>\n                    <option value=\"Progress\">Progress</option>\n                    <option value=\"Available\">Available</option>\n                    <option value=\"Completed\">Completed</option>\n                </select>\n                <label>Location</label>\n                <input\n                    {...register(\"location\")}\n                    type=\"text\"\n                    placeholder=\"Insert location of project here\"\n                    defaultValue={location}\n                />\n                <label>Type of project</label>\n                <select {...register(\"tag\")} defaultValue={tag}>\n                    <option value=\"Social\">Social</option>\n                    <option value=\"Education\">Education</option>\n                    <option value=\"Wash\">Wash</option>\n                    <option value=\"Environment\">Environment</option>\n                    <option value=\"Health\">Health</option>\n                    <option value=\"Other\">Other</option>\n                </select>\n                <label>Volunteers assigned to this project</label>\n                <Select\n                    className=\"dropdown\"\n                    placeholder=\"Select Users\"\n                    value={users.filter(user => selectUsernames.includes(user.value))}\n                    options={users}\n                    onChange={handleChange}\n                    isMulti\n                    isClearable\n                />\n                <label>Google Drive folder</label>\n                <textarea {...register(\"files\")} placeholder=\"Insert Google Drive Folder link here\" defaultValue={files}></textarea>\n                <button type=\"submit\">Save project details</button>\n            </form>}\n        </div>\n    );\n}\n\nexport default EditProject;","import React from 'react';\nimport { slide as Menu } from 'react-burger-menu';\nimport { Link, useHistory } from 'react-router-dom'\nimport useToken from './useToken';\n\nconst Sidebar = () => {\n\nconst slackLink = \"https://slack.com/intl/en-gb/\"\n\nconst history = useHistory();\n\nconst {setToken, token} = useToken();\n\nconst handleSignOut = e => {\n  e.preventDefault()\n\n  localStorage.clear();\n\n  window.location.reload();\n  history.push(\"/\");\n}\n\nreturn (\n    <Menu>\n      <div className=\"menu-item\" > \n      <Link to={`/`}>Home</Link>\n      </div>\n      <div className=\"menu-item\" > \n      <Link to={`/users/` + token}>Profile</Link>\n      </div>\n      <div className=\"menu-item\" > \n      <Link to={`/users`}>All Users</Link>\n      </div>\n      <div className=\"menu-item\" > \n      <Link to={`/projects`}>All Projects</Link>\n      </div>\n      <div className=\"menu-item\" > \n      <a href={slackLink} target=\"_blank\">Go To Slack</a>\n      </div> \n      <div className=\"menu-item\" >\n      <a style={{textDecoration: \"underline\", cursor: \"pointer\"}} onClick={handleSignOut}>Log Out</a>\n      </div> \n    </Menu>\n\n);\n\n}\n\nexport default Sidebar;","import { Link, useHistory, useParams } from \"react-router-dom\"\nimport { useForm } from \"react-hook-form\"\nimport useFetch from './useFetch'\n\nconst EditUser = () => {\n    const { username } = useParams();\n    const { data: { firstname, surname, password, title, email, phone_no, bio, joined,\n        location, availability, partnership_opportunities, interests }, error, isPending } = useFetch(\"/users/\" + username)\n\n    const history = useHistory();\n    const oldUserDetails = {\n        firstname: firstname,\n        surname: surname,\n        password: password,\n        title: title,\n        email: email,\n        phone_no: phone_no,\n        bio: bio,\n        joined: joined,\n        location: location,\n        availability: availability,\n        partnership_opportunities: partnership_opportunities,\n        interests: interests,\n    }\n\n    const { register, handleSubmit } = useForm({\n        defaultValues: oldUserDetails\n    });\n\n    const onSubmit = e => {\n        fetch(\"/users/\" + username, {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(e)\n        }).then(() => {\n            history.push('/users');\n        })\n    }\n\n    const handleReturn = e => {\n        history.push('/users/' + username);\n    }\n\n    return (\n        <div className=\"edit-user\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To User Page</button>\n            </div>\n            <br />\n            <h2>Edit user</h2>\n            {isPending && <h2>Loading...</h2>}\n            <Link to={`/users/change-password`} style={{fontSize: \"20px\"}}>Change Password</Link>\n            {firstname && <form onSubmit={handleSubmit(onSubmit)}>\n                <br />\n                <label htmlFor=\"firstname\">Firstname</label>\n                <input {...register(\"firstname\")}\n                    placeholder=\"Input your first name here\"\n                    defaultValue={firstname}\n                />\n\n                <label htmlFor=\"surname\">Surname</label>\n                <input {...register(\"surname\")}\n                    placeholder=\"Input surname here\"\n                    defaultValue={surname}\n                />\n\n                <label htmlFor=\"title\">Title</label>\n                <input {...register(\"title\")}\n                    placeholder=\"State your role at InAGlobe (eg: volunteer)\"\n                    defaultValue={title}\n                />\n\n\n                <label htmlFor=\"email\">Email</label>\n                <input {...register(\"email\")}\n                    placeholder=\"Input InAGlobe email here\"\n                    defaultValue={email}\n                />\n\n                <label htmlFor=\"phone_no\">Phone number</label>\n                <input {...register(\"phone_no\")}\n                    placeholder=\"Input phone number here\"\n                    defaultValue={phone_no}\n                />\n\n\n                <label htmlFor=\"bio\">Bio</label>\n                <input {...register(\"bio\")}\n                    placeholder=\"Tell your colleagues a bit about yourself\"\n                    defaultValue={bio}\n                />\n\n                <label htmlFor=\"location\">Location</label>\n                <input {...register(\"location\")}\n                    placeholder=\"Where are you currently based?\"\n                    defaultValue={location}\n                />\n\n                <label htmlFor=\"availability\">Availibility (hours per week)</label>\n                <input {...register(\"availability\")}\n                    placeholder=\"How available are you approximately per week?\"\n                    defaultValue={availability}\n                />\n\n                <label htmlFor=\"interests\">Interests</label>\n                <input {...register(\"interests\")}\n                    placeholder=\"What are your hobbies?\"\n                    defaultValue={interests}\n                />\n\n                <label htmlFor=\"partnership_opportunities\">Partnership Opportunities</label>\n                <input {...register(\"partnership_opportunities\")}\n                    placeholder=\"Eg: Department of Computing at Imperial College London\"\n                    defaultValue={partnership_opportunities}\n                />\n                <button type=\"submit\">Save user details</button>\n            </form>}\n        </div>\n    );\n}\n\nexport default EditUser;","import { useState } from \"react\";\nimport UsersAssignedToTask from \"./UsersAssignedToTask\";\n\nconst ProjectTaskList = ({ project_tasks }) => {\n    /* pass in filtered dataset containing tasks for a specific project*/\n    const [description, setDescription] = useState(\"\");\n    const [priority, setPriority] = useState(1);\n    const [due_date, setDueDate] = useState(Date.now);\n    const [completed, setCompleted] = useState(\"\");\n    const [project_id, setProjectId] = useState(\"\");\n\n    const handleComplete = task => e => {\n        e.preventDefault();\n\n        setDescription(task.description)\n        setPriority(task.priority)\n        setDueDate(task.due_date)\n        setCompleted(\"Completed\")\n        setProjectId(task.project_id)\n        const newTask = { description, priority, due_date, completed, project_id }\n\n        console.log(newTask)\n\n        fetch(\"/projects/\" + task.project_id + \"/tasks/\" + task.id, {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(task)\n        }).then(() => {\n            window.location.reload();\n        })\n    \n    };\n\n    const handleDelete = task => e => {\n        e.preventDefault();\n\n        fetch(\"/projects/\" + task.project_id + \"/tasks/\" + task.id, {\n            method: 'DELETE',\n        }).then(() => {\n            window.location.reload();\n        })\n    };\n\n    return (\n        <div className=\"project-tasks-list\">\n            {project_tasks.map((task) => (\n                <div className=\"project-task-preview\" key={task.id}>\n                        <div>\n                            <h2>{task.description}</h2>\n                            <h3>Due date: {task.due_date}</h3>\n                        </div>\n                        \n                        <h3>Priority: {task.priority}</h3>\n                        <h3>All volunteers assigned to this task</h3>\n                        <UsersAssignedToTask task_id={task.id} />\n                        { !task.completed && <button className=\"task-complete-button\" onClick={handleComplete(task)}>Complete</button> }\n                        <button className=\"task-delete-button\"onClick={handleDelete(task)}>Delete</button>\n                </div>\n            ))}\n        </div>\n    );\n}\n \nexport default ProjectTaskList;\n","import { useParams } from 'react-router';\nimport { useHistory } from \"react-router-dom\"\nimport ProjectTaskList from './ProjectTaskList'\nimport useFetch from './useFetch'\nimport { Link } from \"react-router-dom\"\n\nconst ProjectTasks = () => {\n    const { id } = useParams();\n    const { data: project, errorProject, isPendingProject } = useFetch(\"/projects/\" + id)\n\n    const { data: project_tasks, errorTasks, isPendingTasks } = useFetch(\"/projects/\" + id + \"/tasks\");\n\n    const history = useHistory();\n\n    const handleReturn = e => {\n        history.push('/projects/' + id);\n    }\n\n    return (\n        <div className=\"project-tasks\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To Project Details</button>\n            </div>\n            <br />\n            { isPendingTasks && <h2>Loading...</h2> }\n            { project && <h1>{project.name}: tasks</h1>}\n            <h2>Ongoing Project Tasks</h2>\n            { project_tasks && <ProjectTaskList project_tasks={project_tasks.filter(task => !task.completed)}/> }\n            <h2>Completed Project Tasks</h2>\n            { project_tasks && <ProjectTaskList project_tasks={project_tasks.filter(task => task.completed)}/> }\n\n            <div className=\"add-task-button-wrapper\">\n                { project_tasks && <Link to={`/projects/${project.id}/add-task`} className=\"add-task-button\">Add Task</Link> }\n            </div>\n        </div>\n    );\n}\n\nexport default ProjectTasks;","import { useState } from \"react\";\nimport { useHistory } from \"react-router-dom\"\nimport { useParams } from \"react-router\"\nimport useFetch from \"./useFetch\";\nimport Select from 'react-select';\n\nconst AddProjectTask = () => {\n    const { id } = useParams();\n\n    const [description, setDescription] = useState(\"\");\n    const [due_date, setDueDate] = useState(Date.now);\n    const [priority, setPriority] = useState(1);\n    const [completed, setCompleted] = useState(false);\n    const [assignedUsers, setAssignedUsers] = useState([]);\n\n    const { data: project, error, isPending } = useFetch(\"/projects/\" + id)\n    const { data: participants, errorParticipants, isPendingParticipants } = useFetch(\"/user_project/project_task/\" + id) \n\n    const history = useHistory();\n\n    const handleChange = (e) => {\n        setAssignedUsers(Array.isArray(e) ? e.map(x => x.value) : []); \n    }\n\n    const handleSubmit = async e => {\n        e.preventDefault()\n\n        const newProjectTask = { description, due_date, priority, completed };\n\n        const response = await fetch(\"/projects/\" + project.id + \"/tasks\", {\n            method: 'POST',\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify(newProjectTask)\n        });\n\n        const responseJSON = await response.json();\n        const task_id = responseJSON.id;\n\n        assignedUsers.map(username => {\n            const assigned_task = { username, task_id };\n\n            fetch(\"/assigned_task\", {\n                method: 'POST',\n                headers: { \"Content-Type\": \"application/json\" },\n                body: JSON.stringify(assigned_task)\n            });\n        });\n\n        history.push(\"/projects/\" + id);\n    }\n\n    const handleReturn = e => {\n        history.push('/projects/' + id + '/tasks');\n    }\n\n    return (\n        <div className=\"add-project-task\">\n            <div className=\"ret-prev-page\">\n                <button onClick={handleReturn}>To Project Tasks</button>\n            </div>\n            <br />\n            <h2>Add a new task</h2>\n            {isPending && <h2>Loading...</h2>}\n            {project && <form onSubmit={handleSubmit}>\n                <label>Description</label>\n                <input\n                    type=\"text\"\n                    required\n                    value={description}\n                    onChange={(e) => setDescription(e.target.value)}\n                    placeholder=\"Input description here\"\n                />\n\n\n                <label>Due Date [required]</label>\n                <input\n                    type=\"date\"\n                    required\n                    value={due_date}\n                    onChange={(e) => setDueDate(e.target.value)}\n                    placeholder=\"Input your first name here\"\n                />\n\n                <label>Priority level (1: lowest, 4: highest) [required]</label>\n                <select required value={priority} onChange={(e) => setPriority(e.target.value)} >\n                        <option value=\"1\">1</option>\n                        <option value=\"2\">2</option>\n                        <option value=\"3\">3</option>\n                        <option value=\"4\">4</option>\n                    </select>\n\n                <label>Volunteers assigned to this task</label>\n                <Select\n                    className=\"dropdown\"\n                    placeholder=\"Select Users\"\n                    value={participants.filter(user => assignedUsers.includes(user.value))}\n                    options={participants}\n                    onChange={handleChange}\n                    isMulti\n                    isClearable\n                />\n\n                <label>Status</label>\n                <select value={completed} onChange={(e) => setCompleted(e.target.value)}>\n                    <option value=\"Incomplete\">Available</option>\n                    <option value=\"Completed\">Completed</option>\n                </select>\n                <button>Add task</button>\n            </form>}\n        </div>\n    );\n}\n\nexport default AddProjectTask;","import { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom'\n\nasync function loginUser(credentials) {\n    return fetch('/users/login', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify(credentials)\n      })\n      .then(data => data.json())\n   }\n\nexport default function Login({ setToken }) {\n    const [username, setUserName] = useState();\n    const [password, setPassword] = useState();\n\n    const handleSubmit = async e => {\n        e.preventDefault();\n        const token = await loginUser({\n          username,\n          password\n        });\n        if(token.token != \"\") {\n            setToken(token);\n        } else {\n            document.getElementsByClassName(\"incorrect-password\")[0].style.display = \"block\";\n\n        }\n    }\n    \n\n    return (\n        <div className=\"login\">\n            <h1> InAGlobe Platform </h1>\n            <form onSubmit={handleSubmit}>\n                <input type=\"text\" id=\"login\" class=\"fadeIn second\" name=\"login\" placeholder=\"login\"\n                    onChange={e => setUserName(e.target.value)}/>\n                <input type=\"password\" id=\"password\" class=\"fadeIn third\" name=\"login\" placeholder=\"password\"\n                    onChange={e => setPassword(e.target.value)}/> \n                <div className=\"incorrect-password\" style={{display: 'none'}}>\n                    <h2>Incorrect password!</h2>\n                </div>\n                <div className=\"links\">\n                    <Link to={`/forgot-password`}>Forgot Password</Link>\n                </div>\n                <button type=\"submit\">Log In</button>\n            </form>\n        </div>\n    );\n}\n \nLogin.propTypes = {\n    setToken: PropTypes.func.isRequired\n}\n","\nimport useToken from './useToken';\nimport { Link, useHistory } from 'react-router-dom'\nimport { useState } from 'react'\n\nconst ChangePassword = () => {\n  const [oldPassword, setOldPassword] = useState(\"\");\n  const [newPassword, setNewPassword] = useState(\"\");\n  const {setToken, token} = useToken()\n  const history = useHistory()\n\nasync function passwordUpdate() {\n  return fetch('/users/update-password', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        username: token,\n        oldPassword: oldPassword,\n        newPassword: newPassword})\n    })\n    .then(data => data.json())\n }\n\n  const handleSubmit = async e => {\n      e.preventDefault();\n      const updated = await passwordUpdate();\n\n      if(updated.status != \"True\") {\n         document.getElementsByClassName(\"incorrect-password\")[0].style.display = \"block\";\n      }\n      else{\n        document.getElementsByClassName(\"password-changed-msg\")[0].style.display = \"block\";\n      }\n    }\n  \nreturn (\n  <div className=\"change-password\">\n      <h2>Change Password</h2>\n      <label >Current Password</label>\n      <input  \n        onChange={(e) => setOldPassword(e.target.value)}\n        placeholder=\"Current Password\"\n      />\n\n      <label >New Password</label>\n      <input  \n        onChange={(e) => setNewPassword(e.target.value)}\n        placeholder=\"New Password\"\n      />\n\n      <button onClick={handleSubmit}>Change password</button>\n\n      <h2 className=\"incorrect-password\" style={{display: \"none\"}}>Incorrect password</h2>\n\n      <div className=\"password-changed-msg\" style={{display: \"none\"}}>\n        <h3>Your password has been changed successfully</h3>\n        <Link to={`/`}>Back to Dashboard</Link>\n      </div>\n\n  </div>\n  \n  )\n\n}\n\nexport default ChangePassword;","import ProjectList from './ProjectList'\nimport useFetch from './useFetch'\n\nconst ProjectRegistry = () => {\n\n    const {data: projects, errorProjects, isPendingProjects} = useFetch(\"/projects\")\n\n    return (\n        <div className=\"project-registry\">\n            <h1>All Projects</h1>\n            <br />\n            { isPendingProjects && <h2>Loading...</h2> }\n            { projects && <ProjectList projects={projects} title=\"All Projects\"/> }\n        </div>\n        \n    );\n}\n \nexport default ProjectRegistry;","import { useState } from \"react\";\nimport { useHistory } from 'react-router';\n\nasync function resetPassword(msg) {\n    return fetch('/users/forgot-password', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify(msg)\n      })\n      .then(data => data.json())\n   }\n\nconst ForgotPassword = () => {\n\n    const [username, setUsername] = useState(\".\");\n    const history = useHistory();\n    \n\n    const handleSubmit = async e => {\n        e.preventDefault();\n\n        if(username != \".\") {\n\n            const msg = {\n                username: username,\n                newPassword: Math.random().toString(36).replace(/[^a-z]+/g, '')\n            }\n\n            const response = await resetPassword(msg);\n            if(response.status == \"False\") {\n                document.getElementsByClassName(\"email-sent\")[0].style.display = \"none\";\n                document.getElementsByClassName(\"incorrect-username\")[0].style.display = \"block\";\n            } else {\n                document.getElementsByClassName(\"incorrect-username\")[0].style.display = \"none\";\n                document.getElementsByClassName(\"email-sent\")[0].style.display = \"block\";\n            }\n        }\n    }\n\n    const handleReturn = e => {\n        e.preventDefault();\n        history.push('/');\n    }\n\n\n    return (\n        <div className=\"forgot-password\">\n            <form onSubmit={handleSubmit}>\n                <h1>Forgot Password</h1>\n                <h2>Input your username</h2>\n                <input type=\"text\" placeholder=\"username\" onChange={e => setUsername(e.target.value)}/>\n                <div className=\"incorrect-username\" style={{display: 'none'}}>\n                    <h2>Incorrect username provided!</h2>\n                </div>\n                <div className=\"email-sent\" style={{display: 'none'}}>\n                    <h2>Email has been sent!</h2>\n                </div>\n                <button>Submit</button>\n            </form>\n            <button onClick={handleReturn}>Back to Login Page</button>\n        </div>\n        \n    );\n}\n \nexport default ForgotPassword;","import React, { useState } from 'react';\nimport {HashRouter as Router, Route, Switch} from 'react-router-dom'\n\nimport Navbar from './Navbar'\nimport Home from './Home'\nimport CreateProject from './CreateProject'\nimport ProjectDetails from './ProjectDetails'\nimport PageNotFound from './PageNotFound'\nimport MyProfile from './MyProfile'\nimport User from './User'\nimport Users from './Users'\nimport AddUser from './AddUser'\nimport EditProject from './EditProject'\nimport Sidebar from './Sidebar'  \nimport EditUser from './EditUser'\nimport ProjectTasks from './ProjectTasks'\nimport AddProjectTask from './AddProjectTask'\nimport Login from './Login'\nimport useToken from './useToken'\nimport ChangePassword from './ChangePassword'\nimport ProjectsRegistry from './ProjectsRegistry'\nimport ForgotPassword from './ForgotPassword'\n\nfunction App() {\n\n  const { token, setToken } = useToken();\n\n  if(!token) {\n    return (\n      <Router>\n        <Switch>\n          <Route exact path=\"/forgot-password\">\n            <ForgotPassword />\n          </Route>\n          <Route path=\"*\">\n            <Login setToken={setToken} />\n          </Route>\n        </Switch>\n      </Router>\n    )\n  }\n\n  return (\n    <Router>\n      <div className=\"App\">    \n      <Sidebar />\n        <Navbar />\n        <div className=\"content\">   \n          <Switch>\n            <Route exact path=\"/\">\n              <Home />\n            </Route>\n            <Route exact path=\"/create-project\">\n              <CreateProject />\n            </Route>\n            <Route exact path=\"/add-user\">\n              <AddUser />  \n            </Route>\n            <Route exact path=\"/my-profile\">\n              <MyProfile />\n            </Route>\n            <Route exact path=\"/users\">\n              <Users />  \n            </Route>\n            <Route exact path=\"/users/change-password\">\n              <ChangePassword />\n            </Route>   \n            <Route exact path=\"/users/:username\">\n              <User />\n            </Route>\n            <Route exact path=\"/edit-user/:username\">\n              <EditUser />\n            </Route>   \n            <Route exact path=\"/projects\">\n              <ProjectsRegistry />  \n            </Route>        \n            <Route exact path=\"/projects/:id/add-task\">\n              <AddProjectTask />  \n            </Route>       \n            <Route exact path=\"/projects/:id/tasks\">\n              <ProjectTasks />          \n            </Route>\n            <Route exact path=\"/projects/:id\">\n              <ProjectDetails />\n            </Route>\n            <Route exact path=\"/edit-project/:id\">\n              <EditProject />\n            </Route>\n            <Route path=\"*\">\n              <PageNotFound />\n            </Route>\n          </Switch>\n        </div>\n      </div>\n    </Router>\n  );\n}\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n  if (onPerfEntry && onPerfEntry instanceof Function) {\n    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n      getCLS(onPerfEntry);\n      getFID(onPerfEntry);\n      getFCP(onPerfEntry);\n      getLCP(onPerfEntry);\n      getTTFB(onPerfEntry);\n    });\n  }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>,\n  document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/backend/templates/index.html b/backend/templates/index.html
index 3f38f76de4cc3bedcc5084f7fb2a1bf0d14b326f..86cc9dfcb69030fdf739ab8bfc56efcf55e58dfd 100644
--- a/backend/templates/index.html
+++ b/backend/templates/index.html
@@ -1 +1 @@
-<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/static/react/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/static/react/logo192.png"/><link rel="manifest" href="/static/react/manifest.json"/><title>InAGlobe Platform</title><script>window.token="{{DRP_token}}"</script><link href="/static/react/css/main.599c7cc1.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,u,i=r[0],c=r[1],l=r[2],s=0,p=[];s<i.length;s++)u=i[s],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&p.push(o[u][0]),o[u]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(f&&f(r);p.length;)p.shift()();return a.push.apply(a,l||[]),t()}function t(){for(var e,r=0;r<a.length;r++){for(var t=a[r],n=!0,i=1;i<t.length;i++){var c=t[i];0!==o[c]&&(n=!1)}n&&(a.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},a=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise((function(r,n){t=o[e]=[r,n]}));r.push(t[2]=n);var a,i=document.createElement("script");i.charset="utf-8",i.timeout=120,u.nc&&i.setAttribute("nonce",u.nc),i.src=function(e){return u.p+"js/"+({}[e]||e)+"."+{3:"ddc4d6e7"}[e]+".chunk.js"}(e);var c=new Error;a=function(r){i.onerror=i.onload=null,clearTimeout(l);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+a+")",c.name="ChunkLoadError",c.type=n,c.request=a,t[1](c)}o[e]=void 0}};var l=setTimeout((function(){a({type:"timeout",target:i})}),12e4);i.onerror=i.onload=a,document.head.appendChild(i)}return Promise.all(r)},u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="/static/react/",u.oe=function(e){throw console.error(e),e};var i=this["webpackJsonpinaglobe-dashboard"]=this["webpackJsonpinaglobe-dashboard"]||[],c=i.push.bind(i);i.push=r,i=i.slice();for(var l=0;l<i.length;l++)r(i[l]);var f=c;t()}([])</script><script src="/static/react/js/2.49ea22cc.chunk.js"></script><script src="/static/react/js/main.4429b17a.chunk.js"></script></body></html>
\ No newline at end of file
+<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/static/react/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/static/react/logo192.png"/><link rel="manifest" href="/static/react/manifest.json"/><title>InAGlobe Platform</title><script>window.token="{{DRP_token}}"</script><link href="/static/react/css/main.599c7cc1.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,u,i=r[0],c=r[1],l=r[2],s=0,p=[];s<i.length;s++)u=i[s],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&p.push(o[u][0]),o[u]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(f&&f(r);p.length;)p.shift()();return a.push.apply(a,l||[]),t()}function t(){for(var e,r=0;r<a.length;r++){for(var t=a[r],n=!0,i=1;i<t.length;i++){var c=t[i];0!==o[c]&&(n=!1)}n&&(a.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},a=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise((function(r,n){t=o[e]=[r,n]}));r.push(t[2]=n);var a,i=document.createElement("script");i.charset="utf-8",i.timeout=120,u.nc&&i.setAttribute("nonce",u.nc),i.src=function(e){return u.p+"js/"+({}[e]||e)+"."+{3:"ddc4d6e7"}[e]+".chunk.js"}(e);var c=new Error;a=function(r){i.onerror=i.onload=null,clearTimeout(l);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+a+")",c.name="ChunkLoadError",c.type=n,c.request=a,t[1](c)}o[e]=void 0}};var l=setTimeout((function(){a({type:"timeout",target:i})}),12e4);i.onerror=i.onload=a,document.head.appendChild(i)}return Promise.all(r)},u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="/static/react/",u.oe=function(e){throw console.error(e),e};var i=this["webpackJsonpinaglobe-dashboard"]=this["webpackJsonpinaglobe-dashboard"]||[],c=i.push.bind(i);i.push=r,i=i.slice();for(var l=0;l<i.length;l++)r(i[l]);var f=c;t()}([])</script><script src="/static/react/js/2.49ea22cc.chunk.js"></script><script src="/static/react/js/main.8ac766d6.chunk.js"></script></body></html>
\ No newline at end of file
diff --git a/frontend/src/MyProjectTasks.js b/frontend/src/MyProjectTasks.js
index 97bba74536ae4d9bced4258fe8e3dc8bd00ef35e..2c5bdd747a7512ce009180387f20568832e9a026 100644
--- a/frontend/src/MyProjectTasks.js
+++ b/frontend/src/MyProjectTasks.js
@@ -21,15 +21,13 @@ const MyProjectTasks = ({ tasks, title }) => {
             <div className="my-project-tasks">
                 {tasks.map((task) => (
                     <div className="task-preview" key={task.id}>
-                        <h2>{task.project_name}: {task.description}</h2>
-                        <h3><strong>Priority level:</strong> {task.priority}</h3>
-                        <h3><strong></strong> {task.priority}</h3>
-                        <h3><strong>To be done by:</strong> {task.due_date}</h3>
-                        <h3>All volunteers assigned to this task: </h3>
-                        <UsersAssignedToTask task_id={task.id} />
+                        <h2>{task.description} [Priority: {task.priority}]</h2>
                         <Link to={`/projects/${task.project_id}`}>
-                            <h4>Click to see the project details</h4>
+                            <h3 style={{color: "#f1356d"}}>{task.project_name}</h3>
                         </Link>
+                        <h3><strong>To be done by:</strong> {task.due_date}</h3>
+                        <h3>Assigned volunteers: </h3>
+                        <UsersAssignedToTask task_id={task.id} />
                     </div>
                 ))}
             </div>