From 05d6ef43e0a11fdd4a00637db68801c485d443f0 Mon Sep 17 00:00:00 2001 From: DanielMolares Date: Mon, 21 Jun 2021 21:25:17 -0400 Subject: [PATCH 1/8] Replaced alerts in ManageMyCourses/MyCourses for dialogs --- .../src/components/TopNavBar.js | 44 ------------------- .../src/pages/ManageMyCourses.js | 44 ++++++++++++++++--- .../toolkit-webapp/src/pages/MyCourses.js | 38 ++++++++++++++-- server/routes/courses.js | 6 +-- 4 files changed, 75 insertions(+), 57 deletions(-) diff --git a/frontend/toolkit-webapp/src/components/TopNavBar.js b/frontend/toolkit-webapp/src/components/TopNavBar.js index ad18253..c5a0607 100644 --- a/frontend/toolkit-webapp/src/components/TopNavBar.js +++ b/frontend/toolkit-webapp/src/components/TopNavBar.js @@ -306,50 +306,6 @@ export default function TopNavBar(props) { props.history.push(`/dashboard`); }; - // const onSubmit = (e) => { - - // e.preventDefault() - // if (firstName === user.first_name && lastName === user.last_name) { - // alert('No update made!') - // return - // } - - // updateUserInfo({ firstName, lastName}) - // // setFirstName('') - // // setLastName('') - // // setEmail('') - // // setPassword('') - // // setPasswordCopy('') - // } - - // const updateUserInfo = async (creds) => { - - // const res = await fetch(config.server_url + config.paths.updateUserInfo, { - // method: 'POST', - // headers: { - // 'Content-type': 'application/json' - // }, - // body: JSON.stringify({ - // "first_name": creds.firstName, - // "last_name": creds.lastName, - // "email": creds.email, - // "password": creds.password, - // "password_copy": creds.passwordCopy, - // "classesEnrolled": [] }) - // }) - - // const data = await res.json() - - // if (data.message == "added user") { - // alert("Success, user Created!!"); - // props.history.push('login') - - // } else if (data.message === "email already connected to an account") { - // alert("email already connected to an account, please try again."); - // } else { // this is to check if there are errors not being addressed already - // console.log(data) - // } - // } return (
{ const [courses, setCourses] = useState([]) const [searchQuery, setSearchQuery] = useState('') + const [openDialog, setOpenDialog] = useState(false); const classes = myCoursesStyles() @@ -52,6 +54,13 @@ const ManageMyCourses = (props) => { } } + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + }; + const deleteCourse = async (id) => { let res = undefined @@ -71,7 +80,7 @@ const ManageMyCourses = (props) => { // const newVal = courses.filter((courses) => courses._id !== id); // setCourses(newVal) - // window.location.reload() + window.location.reload() } @@ -125,16 +134,37 @@ const ManageMyCourses = (props) => { - {/* TODO: Figure out a way to reload the page without simply linking back to the same page. */} + {/* TODO: Figure out a way to reload the page without simply linking back to the same page. */} - + {/* */}
- +
+ {/* */} + + {openDialog === true ? + +
+ +
+ + Are you sure you wish to delete this course permanently? + +
+ + + + +
- - + + : null} ))} diff --git a/frontend/toolkit-webapp/src/pages/MyCourses.js b/frontend/toolkit-webapp/src/pages/MyCourses.js index d9446d2..eae7500 100644 --- a/frontend/toolkit-webapp/src/pages/MyCourses.js +++ b/frontend/toolkit-webapp/src/pages/MyCourses.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from 'react' import { Button, Card, CardActions, Container, CssBaseline, Divider, makeStyles, Grid, CardMedia, CardContent, Typography } from '@material-ui/core' +import { Dialog, DialogTitle, DialogActions, DialogContent } from '@material-ui/core' import '../css/dashboard.css' import config from '../config.json' import TopNavBar from '../components/TopNavBar' @@ -11,6 +12,7 @@ import { Link } from '@material-ui/core'; const MyCourses = (props) => { const [courses, setCourses] = useState([]) const [searchQuery, setSearchQuery] = useState('') + const [openDialog, setOpenDialog] = useState(false); const classes = myCoursesStyles() @@ -51,6 +53,14 @@ const MyCourses = (props) => { } } + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + }; + + const removeEnrollment = async (id) => { let res = undefined @@ -125,10 +135,32 @@ const MyCourses = (props) => {
- -
+
+ + {openDialog === true ? + +
+ +
+ + Are you sure you wish to disenroll from this course? + +
+ + + + +
+
+ + : null} ))} diff --git a/server/routes/courses.js b/server/routes/courses.js index 541de60..79b9caa 100644 --- a/server/routes/courses.js +++ b/server/routes/courses.js @@ -307,7 +307,7 @@ router.post('/deleteCreatedCourse', VerifyToken, async (req, res) => { fs.rmdirSync('public/' + req.body.courseID, { recursive: true }); - res.sendStatus(400); + res.json({'status': 'success'}) } catch (e) { console.log(e); @@ -360,8 +360,8 @@ router.post('/module/score', VerifyToken, async (req, res) => { let courses = await User.findOne({ _id: req.body.userID }, 'coursesData'); - if (courses.coursesData[0] == undefined) - courses.coursesData.append({}) + // if (courses.coursesData[0] == undefined) + // courses.coursesData.append({}) courses = courses.coursesData[0]; if (courses === undefined) From a206146830b8fbef1f4b6c5c50065a5de4bc1dde Mon Sep 17 00:00:00 2001 From: DanielMolares Date: Wed, 7 Jul 2021 20:36:39 -0400 Subject: [PATCH 2/8] Renamed ManageCourses title & edited dialogs UI --- .../src/pages/ManageMyCourses.js | 2 +- .../toolkit-webapp/src/pages/MyCourses.js | 9 ++-- .../src/styles/myCoursesStyle.js | 51 +++++++++++++++++++ 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/frontend/toolkit-webapp/src/pages/ManageMyCourses.js b/frontend/toolkit-webapp/src/pages/ManageMyCourses.js index 3b9e83b..42b47ca 100644 --- a/frontend/toolkit-webapp/src/pages/ManageMyCourses.js +++ b/frontend/toolkit-webapp/src/pages/ManageMyCourses.js @@ -106,7 +106,7 @@ const ManageMyCourses = (props) => {

- Manage My Courses + My Created Courses

diff --git a/frontend/toolkit-webapp/src/pages/MyCourses.js b/frontend/toolkit-webapp/src/pages/MyCourses.js index c5d8cdd..38ba380 100644 --- a/frontend/toolkit-webapp/src/pages/MyCourses.js +++ b/frontend/toolkit-webapp/src/pages/MyCourses.js @@ -1,7 +1,6 @@ import React, { useState, useEffect } from 'react' import { Button, Card, CardActions, Container, CssBaseline, Divider, makeStyles, Grid, CardMedia, CardContent, Typography } from '@material-ui/core' import { Dialog, DialogTitle, DialogActions, DialogContent } from '@material-ui/core' -import '../css/dashboard.css' import config from '../config.json' import TopNavBar from '../components/TopNavBar' // import Pagination from '@material-ui/lab/Pagination' @@ -143,19 +142,21 @@ const MyCourses = (props) => { {openDialog === true ?
- +
Are you sure you wish to disenroll from this course?
- - +
diff --git a/frontend/toolkit-webapp/src/styles/myCoursesStyle.js b/frontend/toolkit-webapp/src/styles/myCoursesStyle.js index 0171913..6111b23 100644 --- a/frontend/toolkit-webapp/src/styles/myCoursesStyle.js +++ b/frontend/toolkit-webapp/src/styles/myCoursesStyle.js @@ -43,6 +43,57 @@ const myCoursesStyle = makeStyles((theme) => ({ { flexGrow: 1, }, + + dialogComponent: + { + width: '60%', + border: '5px solid gold', + borderRadius: '5px' + }, + + dialogPaper: + { + border: '1.8px solid black', + borderRadius: '8px', + width: '380px', + boxShadow: 'none' + }, + + dialogContent: + { + + width: '100%', + textAlign: 'center', + // backgroundColor: 'yellow' + }, + + dialogButtons: + { + margin: 'auto', + }, + + dialogButton1: + { + backgroundColor: 'black', + color: 'white', + "&:hover": { + backgroundColor: 'grey', + color: 'white' + }, + marginRight: '10px' + }, + + dialogButton2: + { + backgroundColor: 'black', + color: 'white', + "&:hover": { + backgroundColor: 'grey', + color: 'white' + }, + marginLeft: '10px' + }, + grow: { flexGrow: 1 From ed6e0d8983d7b65c67aecd1560da0f643617ed2c Mon Sep 17 00:00:00 2001 From: DanielMolares Date: Wed, 7 Jul 2021 21:04:09 -0400 Subject: [PATCH 3/8] ManageMyCourses Dialog --- .../src/pages/ManageMyCourses.js | 21 +++++++++---------- .../src/styles/myCoursesStyle.js | 10 +++++---- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/frontend/toolkit-webapp/src/pages/ManageMyCourses.js b/frontend/toolkit-webapp/src/pages/ManageMyCourses.js index 42b47ca..e7f255a 100644 --- a/frontend/toolkit-webapp/src/pages/ManageMyCourses.js +++ b/frontend/toolkit-webapp/src/pages/ManageMyCourses.js @@ -139,32 +139,31 @@ const ManageMyCourses = (props) => { - {/* TODO: Figure out a way to reload the page without simply linking back to the same page. */} - - {/* */} +
- {/* */} {openDialog === true ?
- +
Are you sure you wish to delete this course permanently?
- - + + + +
diff --git a/frontend/toolkit-webapp/src/styles/myCoursesStyle.js b/frontend/toolkit-webapp/src/styles/myCoursesStyle.js index 6111b23..72ebef3 100644 --- a/frontend/toolkit-webapp/src/styles/myCoursesStyle.js +++ b/frontend/toolkit-webapp/src/styles/myCoursesStyle.js @@ -29,8 +29,8 @@ const myCoursesStyle = makeStyles((theme) => ({ { height: '100%', display: 'flex', - flexDirection: 'column' - // marginBottom: '0px' + flexDirection: 'column', + // marginBottom: '50px' }, cardMedia: @@ -101,13 +101,15 @@ const myCoursesStyle = makeStyles((theme) => ({ removeButton: { - width: "100%" + width: "100%", + // marginBottom: '50px' }, // buttonDiv: // { - // // paddingLeft: "30%" + // marginBottom: '50px' // } + })) export default myCoursesStyle; \ No newline at end of file From 06d1e7818955b9cf682f4b0dd8d439c2fa48d531 Mon Sep 17 00:00:00 2001 From: Nathaniel Lyra Date: Mon, 12 Jul 2021 12:31:43 -0400 Subject: [PATCH 4/8] Initial DialogComponent component creation, and integration to ManageMyCourses alert. --- frontend/toolkit-webapp/package-lock.json | 3 +- .../src/components/DialogComponent.js | 35 ++++++++++++++++++ .../src/pages/ManageMyCourses.js | 15 +++++++- .../moduleData/LyraResumeJune2021.pdf | Bin 83880 -> 0 bytes 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 frontend/toolkit-webapp/src/components/DialogComponent.js delete mode 100644 server/public/60da2d71d84df9a253b57d4d/moduleData/LyraResumeJune2021.pdf diff --git a/frontend/toolkit-webapp/package-lock.json b/frontend/toolkit-webapp/package-lock.json index 2059a66..74dc39a 100644 --- a/frontend/toolkit-webapp/package-lock.json +++ b/frontend/toolkit-webapp/package-lock.json @@ -15989,7 +15989,8 @@ }, "ssri": { "version": "6.0.1", - "resolved": "", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "requires": { "figgy-pudding": "^3.5.1" } diff --git a/frontend/toolkit-webapp/src/components/DialogComponent.js b/frontend/toolkit-webapp/src/components/DialogComponent.js new file mode 100644 index 0000000..a4efd78 --- /dev/null +++ b/frontend/toolkit-webapp/src/components/DialogComponent.js @@ -0,0 +1,35 @@ +import { Dialog, DialogTitle, DialogActions, DialogContent, Button } from '@material-ui/core' +import myCoursesStyles from '../styles/myCoursesStyle' + +export default function DialogComponent(props) { + + const classes = myCoursesStyles() + + return ( + <> + { props.open === true ? + +
+ +
+ + {props.text} + +
+ + {props.buttons.map((obj) => { + return ( + + ) + })} + +
+
+ + : null} + + ) + +} \ No newline at end of file diff --git a/frontend/toolkit-webapp/src/pages/ManageMyCourses.js b/frontend/toolkit-webapp/src/pages/ManageMyCourses.js index e7f255a..f55cd30 100644 --- a/frontend/toolkit-webapp/src/pages/ManageMyCourses.js +++ b/frontend/toolkit-webapp/src/pages/ManageMyCourses.js @@ -5,6 +5,7 @@ import TopNavBar from '../components/TopNavBar' // import Pagination from '@material-ui/lab/Pagination' import { Dialog, DialogTitle, DialogActions, DialogContent } from '@material-ui/core' import myCoursesStyles from '../styles/myCoursesStyle' +import DialogComponent from '../components/DialogComponent' import jwt_decode from "jwt-decode"; import { Link } from '@material-ui/core'; @@ -146,7 +147,17 @@ const ManageMyCourses = (props) => { - {openDialog === true ? + deleteCourse(course._id)}, + {text: "No", style: classes.dialogButton2, onClick: handleCloseDialog} + ]} + /> + + {/* {openDialog === true ?
@@ -168,7 +179,7 @@ const ManageMyCourses = (props) => {
- : null} + : null} */} ))} diff --git a/server/public/60da2d71d84df9a253b57d4d/moduleData/LyraResumeJune2021.pdf b/server/public/60da2d71d84df9a253b57d4d/moduleData/LyraResumeJune2021.pdf deleted file mode 100644 index dca9fa70f1de22020529901a438bbbfe7bb7abf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83880 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

kjWScy=8 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

I2th_u;_fXS^Sta4LN@Q5w;k zxZ9HdwEq)bdzXnN!=PpWsbZx(ju=74crxc^dX$+CQ^t*fqiu-y(_({rM<}YvuK5Xj zjZ708XeAe23AOTa**RjuPZKq|9o)vIR2QstfL+lB6};^`4rD%?D4dqqTrDLPBbV{^ z)cnys%1sSI(&y4?b7&rc#R()d1mr!L%0<>3!}-@ublDZV&nZax)ErBG z17oa%Np<%}GG=;*^kE zM<+9sxAO9)!eV?L`;C5%YMJW|y{0Xdbh)J0MI1aaqV$P!qO;234&LIX&HNVN0fv%> zJZj4Bwx>q*8*G&{NGY(oG)5|yV?daNDv2_G-Jx7}`Z3=68_@c-*rahhObE*!Dkn3AB zmp;5^LN>s$SJ&8)0hgQA4!C+ns>_h*pw#I{k?$KfYtCBfd1Fvp`JtM|_tGzAuD80R zz(T4o=b?VNk<-LcI-1flav~Ea{M3b3)Os{Y>sht>tue~d1cJ1A5A;b1{lAdB>Z_m2lJ#=m^=-y<&>Gg}YN1WO(=%#9k z7j?X@_Nz;?)L7eGBqO*@<`X_{d0$kYH?6@mNzCmrJuum5_Q0dZ*K2{OX|DZw^pSOqFIa&Q1izDv>>B*o?tN~{iX(d`2$=MCYof^w@@BH`o0#)-!B3at0ymbvDg_I(e2vio41TzbkxWQ+T7YTh&3 zjavJpd_sSXU`bII5KgMg=(d@(6^gCt5esIaN0qTf@{>0o`TW9y;v$6Ko@W6|W_{zo z+4T6aq~m)_F?*u7W%$r77y5cXc!>Y>(^8Y{Bj{93EIX_AuOxpAoSozkAi#Wo6b8Kf zAqf@>{Kfn4lYrTG*lEJ6({-W0e@hPjnoRvAWf)9u{ys69oz~1w5&ld58`oEvzvzEm zu~UP8OrZu7uD?s1{(6tCDGp4O{&t7`mos(xYpY<3KiYzw`~58;*wD+F2-7A~Ep05R zmM{aF6_rgmt$pHKUN91lf`6adDzE72Y-#O4qzYRR?MP$=(UE+Xs4&S!LDU$n4cB&7 zCfbvZUvMQFT+lJJzTjYuw-Hq&$a~6qIypOm-3WU+Ig;IEJrzVPZ75bmS@4=ohKUM) zVWB!Gh$3YGX)GKNC2-5T+StnKtEl}U1b$NxwWm^@WnnN64-Xj+qzuK?4hG=yco-Z3 zLm;F<4rwi7kjjWvwuNOU5SscxViz!yDitYxjiY8NWSmGH$p21J*y7mg%?4hDgN zD}U7h{QC9c3j^$XvHws*a0LHU@dq<`S~`R3!M~^nGRZ1`)z6SZaU^JytX(N?6kDpW zF=#n?*y{W8e-el)U`{##0Y?DRaEvq@Fa%Jt09F=_mxRM*;qdQ7zjA(&)TY>wY`y+( zB){YQPlpIpRa^UiH-VGWH!Ems%c@YUY3#w%P$AH0BpVO}QWe0csYt6RsbZy3a6nla zr>1;NS{Z=>@EANAg*%4$0`o^%Hc*hFL3X2BlC6pVNo(K9LVy?kFMPQF3w;Rx)5+hm z@;~PK$6SBQ0)LD7pV{?~x&D>~{uc8;v+M7f>#N%bV`(rd{4*FQ{1wcDRn!Wi9$={c zZ}wX3P0Y7Fg9^#b+0oJq3~vlcR7avP)s;qMZxO&YzOVq;Kg+MdlEW`MjMMr=TbKdq z0uij0L&1!}5@}(u(Ar!Wrca?z!7p%OeV7K>mLiN`S1W?oDyH&kDgXwl3Wuv=Rg?f_ z6r3F^eIF_j{?8m>2mij}5rsf~zp?R*M%TaAH8{DmY^?Fd1{K5g0k!%ap`Entx5Fe< zpFaEzw{54uQ^cXGYqy?T*{~86NiB=zA@hi5BKdcVFY*?0U*T@?W21i?<09A_ z#=qpQ0#nliH*Pw*nx5@`d=jLhY&Jl^ucDv4%Jm;sWE+$@0+mA*0n_KNsZ+AaE135uGU5U0l z++a;O77hOSahgiDE8Z!A8Y_t{sNq`7-04I0&pyvlMjdH>;sQlZ9f2jV>o01aBi>C z1yl?P7M`!3<4Ewm&}teupE+q@IX(v;cpLx+4J_T~prIgW;Gq{BeBe<495jgM60`v) z9|R6?zHsoNA#k7}aG)V@faAg09s~|>9&qwO-~gWwPCf`67zi8~2pkv)92f{3;E5+3 z{esU7Ck+Az`=FB5V}yag0nSMdKJXm2po6_9N?PBDZ5%{0EvVeH#`ImJOmEVZ>{bFT%jRooH)Q$8-kA$2e^_$@Ntd@ zxbQ;oapC~roHzhD1P%ZK2m5XQsyPXO{)3YSfdhcR0owjYS#Ufc<}T9n?;~WQ#eSp$xJ`6`Zi2=72 zt7CKw8o?1~gHbGUb!-dLK>zz=A6N{6ebmtp`eE@%j`@ehqrf%nPd=)vCCQQK%EJx5 zDfr|40Q&#=OM$Q3eoI&C*KH#X+ztRd+y@V;>ZVe)mkI5a8SoDTK^9;-;r?u From ae71ad98da12d5da1c41a9315737f96172f653e0 Mon Sep 17 00:00:00 2001 From: Nathaniel Lyra Date: Mon, 12 Jul 2021 17:06:57 -0400 Subject: [PATCH 5/8] Replaced rest of the alerts in the code with new styled dialogs. Alerts that have a reroute were not changed so that they could still appear after rerouting to new page. All other alerts are now dialogs. --- .../src/components/AdminCategoriesTab.js | 35 +++++++++- .../src/components/AdminCoursesTab.js | 33 ++++++++- .../src/components/AdminUsersTab.js | 36 ++++++++-- .../src/components/DialogComponent.js | 10 +-- .../src/components/QuizCreatorModule.js | 66 ++++++++++++++---- .../src/components/TopNavBar.js | 2 - frontend/toolkit-webapp/src/pages/Course.js | 34 +++++++-- .../src/pages/CourseCreatorNewCourse.js | 32 ++++++++- .../src/pages/ForgotPassword.js | 28 +++++++- frontend/toolkit-webapp/src/pages/Login.js | 28 +++++++- .../src/pages/ManageMyCourses.js | 8 ++- .../toolkit-webapp/src/pages/ModuleCreator.js | 69 +++++++++++++++---- .../toolkit-webapp/src/pages/ModuleEditor.js | 52 +++++++++++--- .../toolkit-webapp/src/pages/Registration.js | 34 +++++++-- .../toolkit-webapp/src/pages/ResetPassword.js | 32 ++++++++- .../toolkit-webapp/src/styles/dialogStyle.js | 57 +++++++++++++++ 16 files changed, 484 insertions(+), 72 deletions(-) create mode 100644 frontend/toolkit-webapp/src/styles/dialogStyle.js diff --git a/frontend/toolkit-webapp/src/components/AdminCategoriesTab.js b/frontend/toolkit-webapp/src/components/AdminCategoriesTab.js index ea5d1b8..5018708 100644 --- a/frontend/toolkit-webapp/src/components/AdminCategoriesTab.js +++ b/frontend/toolkit-webapp/src/components/AdminCategoriesTab.js @@ -13,6 +13,8 @@ import Link from '@material-ui/core/Link'; import TextField from '@material-ui/core/TextField'; import InputAdornment from '@material-ui/core/InputAdornment'; import SearchIcon from '@material-ui/icons/Search'; +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' const columns = [ { id: '_id', label: 'Id' }, @@ -58,14 +60,24 @@ const useStyles = makeStyles({ const AdminCategoriesTab = (props) => { const classes = useStyles(); + const dialogClasses = dialogStyles() const [categories, setCategories] = useState([]); const [search, setSearch] = useState([]); + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); // function that will run when page is loaded useEffect(() => { getCategories() }, []); + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + const getCategories = async () => { const token = localStorage.getItem("token"); @@ -87,7 +99,10 @@ const AdminCategoriesTab = (props) => { } else if (data.message === "wrong token") { localStorage.removeItem('token'); props.history.push('login'); - // probably alert the user + + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -114,7 +129,10 @@ const AdminCategoriesTab = (props) => { } else if (data.message === "wrong token") { localStorage.removeItem('token'); props.history.push('login'); - // probably alert the user + + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -140,7 +158,10 @@ const AdminCategoriesTab = (props) => { } else if (data.message === "wrong token") { localStorage.removeItem('token'); props.history.push('login'); - // probably alert the user + + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -213,6 +234,14 @@ const AdminCategoriesTab = (props) => { + ); } diff --git a/frontend/toolkit-webapp/src/components/AdminCoursesTab.js b/frontend/toolkit-webapp/src/components/AdminCoursesTab.js index 81e576c..8447a40 100644 --- a/frontend/toolkit-webapp/src/components/AdminCoursesTab.js +++ b/frontend/toolkit-webapp/src/components/AdminCoursesTab.js @@ -13,6 +13,8 @@ import Link from '@material-ui/core/Link'; import TextField from '@material-ui/core/TextField'; import InputAdornment from '@material-ui/core/InputAdornment'; import SearchIcon from '@material-ui/icons/Search'; +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' const columns = [ { id: '_id', label: 'Id' }, @@ -61,14 +63,24 @@ const useStyles = makeStyles({ const AdminCoursesTab = (props) => { const classes = useStyles(); + const dialogClasses = dialogStyles() const [courses, setCourses] = useState([]); const [search, setSearch] = useState([]); + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); // function that will run when page is loaded useEffect(() => { getCourses() }, []); + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + const getCourses = async () => { const token = localStorage.getItem("token"); @@ -88,7 +100,10 @@ const AdminCoursesTab = (props) => { } else if (data.message === "wrong token") { localStorage.removeItem('token'); props.history.push('login'); - // probably alert the user + + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -116,7 +131,9 @@ const AdminCoursesTab = (props) => { } else if (data.message === "wrong token") { localStorage.removeItem('token'); props.history.push('login'); - // probably alert the user + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -142,7 +159,9 @@ const AdminCoursesTab = (props) => { } else if (data.message === "wrong token") { localStorage.removeItem('token'); props.history.push('login'); - // probably alert the user + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -219,6 +238,14 @@ const AdminCoursesTab = (props) => { + ); } diff --git a/frontend/toolkit-webapp/src/components/AdminUsersTab.js b/frontend/toolkit-webapp/src/components/AdminUsersTab.js index 06a514b..b358018 100644 --- a/frontend/toolkit-webapp/src/components/AdminUsersTab.js +++ b/frontend/toolkit-webapp/src/components/AdminUsersTab.js @@ -16,6 +16,8 @@ import Link from '@material-ui/core/Link'; import TextField from '@material-ui/core/TextField'; import InputAdornment from '@material-ui/core/InputAdornment'; import SearchIcon from '@material-ui/icons/Search'; +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' const columns = [ { id: '_id', label: 'Id' }, @@ -59,14 +61,24 @@ const useStyles = makeStyles({ const AdminUsersTab = (props) => { const classes = useStyles(); + const dialogClasses = dialogStyles() const [users, setUsers] = useState([]); const [search, setSearch] = useState([]); + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); // function that will run when page is loaded useEffect(() => { getUsers() }, []); + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + const getUsers = async () => { const token = localStorage.getItem("token"); @@ -85,8 +97,10 @@ const AdminUsersTab = (props) => { setUsers(data.users) } else if (data.message === "wrong token") { localStorage.removeItem('token'); + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() props.history.push('login'); - // probably alert the user } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -112,8 +126,10 @@ const AdminUsersTab = (props) => { setUsers(data.users) } else if (data.message === "wrong token") { localStorage.removeItem('token'); + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() props.history.push('login'); - // probably alert the user } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -138,8 +154,10 @@ const AdminUsersTab = (props) => { // alert(`Successfully deleted user`) } else if (data.message === "wrong token") { localStorage.removeItem('token'); + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() props.history.push('login'); - // probably alert the user } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -164,8 +182,10 @@ const AdminUsersTab = (props) => { // localStorage.setItem("tab", 0); } else if (data.message === "wrong token") { localStorage.removeItem('token'); + // alert the user + setDialogText("Unauthorized access. Please contact your system administrator.") + handleOpenDialog() props.history.push('login'); - // probably alert the user }else { // this is to check if there are errors not being addressed already console.log(data) } @@ -254,6 +274,14 @@ const AdminUsersTab = (props) => { + ); } diff --git a/frontend/toolkit-webapp/src/components/DialogComponent.js b/frontend/toolkit-webapp/src/components/DialogComponent.js index a4efd78..02b4328 100644 --- a/frontend/toolkit-webapp/src/components/DialogComponent.js +++ b/frontend/toolkit-webapp/src/components/DialogComponent.js @@ -1,18 +1,18 @@ import { Dialog, DialogTitle, DialogActions, DialogContent, Button } from '@material-ui/core' -import myCoursesStyles from '../styles/myCoursesStyle' +import dialogStyles from '../styles/dialogStyle' export default function DialogComponent(props) { - const classes = myCoursesStyles() + const classes = dialogStyles() return ( <> { props.open === true ? -

+
-
- +
+ {props.text}
diff --git a/frontend/toolkit-webapp/src/components/QuizCreatorModule.js b/frontend/toolkit-webapp/src/components/QuizCreatorModule.js index 540a4ab..b39b7ce 100644 --- a/frontend/toolkit-webapp/src/components/QuizCreatorModule.js +++ b/frontend/toolkit-webapp/src/components/QuizCreatorModule.js @@ -4,6 +4,8 @@ import useStyles from '../styles/moduleStyle' import { Delete, Edit, ArrowUpward, ArrowDownward } from '@material-ui/icons' import MultipleChoice from '../components/MultipleChoiceCreator' import TorF from '../components/TrueOrFalseCreator' +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' var questions = { @@ -24,6 +26,11 @@ const QuizCreator = (props) => { const [open, setOpen] = React.useState(false) const [editOpen, setEdit] = React.useState(false) const [selected, setSelected] = React.useState([]); + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); + + const classes = useStyles() + const dialogClasses = dialogStyles() sessionStorage.setItem('editing', '') @@ -34,7 +41,12 @@ const QuizCreator = (props) => { } }, []); - const classes = useStyles() + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + }; const isSelected = (question) => selected.indexOf(question) !== -1 @@ -49,11 +61,17 @@ const QuizCreator = (props) => { } if (type === '') { - alert("Select a question type") + setDialogText("Select a question type") + handleOpenDialog() + //alert("Select a question type") } else if (questions.question === '' || questions.answers[0].answerText === '') { - alert("Requires a question and an answer.") + setDialogText("Requires a question and an answer.") + handleOpenDialog() + //alert("Requires a question and an answer.") } else if (dup === 1) { - alert("No Duplicate questions") + setDialogText("No duplicate questions allowed.") + handleOpenDialog() + //alert("No Duplicate questions") } else { quiz.push(questions) @@ -99,9 +117,13 @@ const QuizCreator = (props) => { const handleUp = () => { if (selected.length > 1) { - alert("Select only one question.") + setDialogText("Please select only one question at a time.") + handleOpenDialog() + //alert("Select only one question.") } else if (selected.length < 1) { - alert("Please select a question.") + setDialogText("Please make a question selection.") + handleOpenDialog() + //alert("Please select a question.") } else { for (var i = 0; i < quiz.length; i++) { if (isSelected(quiz[i].question)) { @@ -119,9 +141,13 @@ const QuizCreator = (props) => { const handleDown = () => { if (selected.length > 1) { - alert("Select only one question.") + setDialogText("Please select only one question.") + handleOpenDialog() + //alert("Select only one question.") } else if (selected.length < 1) { - alert("Please select a question.") + setDialogText("Please make a question selection.") + handleOpenDialog() + //alert("Please select a question.") } else { for (var i = 0; i < quiz.length; i++) { if (isSelected(quiz[i].question)) { @@ -140,9 +166,13 @@ const QuizCreator = (props) => { const handleEdit = () => { sessionStorage.setItem('editing', 'yes') if (selected.length > 1) { - alert("Select only one question.") + setDialogText("Please select only one question.") + handleOpenDialog() + //alert("Select only one question.") } else if (selected.length < 1) { - alert("Please select a question.") + setDialogText("Please make a question selection.") + handleOpenDialog() + //alert("Please select a question.") } else { for (var i = 0; i < quiz.length; i++) { if (isSelected(quiz[i].question)) { @@ -169,9 +199,13 @@ const QuizCreator = (props) => { } if (questions.question === '' || questions.answers[0].answerText === '') { - alert('Ensure there is a question and an Answer.') + setDialogText("Please ensure that there is both a question and an answer.") + handleOpenDialog() + //alert('Ensure there is a question and an Answer.') } else if (dup === 1 && check !== parseInt(sessionStorage.getItem('index'))) { - alert('No Duplicate Questions') + setDialogText("No duplicate questions allowed.") + handleOpenDialog() + //alert('No Duplicate Questions') } else { for (i = 0; i < quiz.length; i++) { if (isSelected(quiz[i].question)) { @@ -403,6 +437,14 @@ const QuizCreator = (props) => {
+
) } diff --git a/frontend/toolkit-webapp/src/components/TopNavBar.js b/frontend/toolkit-webapp/src/components/TopNavBar.js index 82dd483..908c9d6 100644 --- a/frontend/toolkit-webapp/src/components/TopNavBar.js +++ b/frontend/toolkit-webapp/src/components/TopNavBar.js @@ -456,8 +456,6 @@ export default function TopNavBar(props) { setNumUsers(data.numUsers) setNumCourses(data.numCourses) } - // setData(data.storageData) - // alert(data.storageData.numUsers) setOpenDialog(true) diff --git a/frontend/toolkit-webapp/src/pages/Course.js b/frontend/toolkit-webapp/src/pages/Course.js index 155f423..6006d98 100644 --- a/frontend/toolkit-webapp/src/pages/Course.js +++ b/frontend/toolkit-webapp/src/pages/Course.js @@ -15,6 +15,8 @@ import ModuleInfoEditButton from '../components/ModuleInfoEditButton'; import AddIcon from '@material-ui/icons/Add'; import DeleteIcon from '@material-ui/icons/Delete'; import courseStyles from '../styles/courseStyle'; +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' const Course = (props) => { @@ -28,10 +30,13 @@ const Course = (props) => { const [courseID, setCourseID] = useState('') const [isCreator, setIsCreator] = useState(false); const [isOwner, setIsOwner] = useState(false); + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); + const classes = courseStyles() + const dialogClasses = dialogStyles() let validImageTypes = ["PNG", "JPEG", "GIF", "TIF", "RAW", "JPG"] - const classes = courseStyles() const onEditCourseTitle = (e) => { setEditCourseInfo(true); @@ -46,6 +51,13 @@ const Course = (props) => { }, []); + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + const getAuthorization = async () => { const token = localStorage.getItem("token"); @@ -157,8 +169,10 @@ const Course = (props) => { // If it isn't, return and allow user to input valid image if (!validInput) { - alert('Invalid file type. Please upload an image with a proper image extension') - return + setDialogText("Invalid file type. Please upload an image with a proper image extension.") + handleOpenDialog() + //alert('Invalid file type. Please upload an image with a proper image extension') + return } // Check that the input given is alphanumeric to avoid the possibility of commands being @@ -168,8 +182,10 @@ const Course = (props) => { var isValid = !(RegEx.test(val)); if (isValid === false) { - alert('Invalid file type. Please upload an image for which name is alphanumeric.') - return + setDialogText("Invalid file type. Please upload an image for which name is alphnumeric.") + handleOpenDialog() + //alert('Invalid file type. Please upload an image for which name is alphanumeric.') + return } if (currCourseImage.name !== oldCourseImage.name) { @@ -486,6 +502,14 @@ const Course = (props) => { ))} +
) } diff --git a/frontend/toolkit-webapp/src/pages/CourseCreatorNewCourse.js b/frontend/toolkit-webapp/src/pages/CourseCreatorNewCourse.js index 5df0f55..f0bbbf2 100644 --- a/frontend/toolkit-webapp/src/pages/CourseCreatorNewCourse.js +++ b/frontend/toolkit-webapp/src/pages/CourseCreatorNewCourse.js @@ -6,25 +6,39 @@ import Chip from '@material-ui/core/Chip'; import config from '../config.json' import TopNavBar from '../components/TopNavBar' import courseStyles from '../styles/courseCreatorStyle' +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' import '../css/Login.css'; function NewCourse(props) { const classes = courseStyles() + const dialogClasses = dialogStyles() const [courseTitle, setCourseTitle] = useState('') const [categories, setCategories] = useState([]) const [description, setDescription] = useState('') const [image, setImage] = useState() const [dialogData, setDialogData] = useState([]); + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); const filter = createFilterOptions(); let validImageTypes = ["PNG", "JPEG", "GIF", "TIF", "RAW", "JPG"] + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + const onSubmit = (e) => { e.preventDefault() if (!courseTitle || !categories || !description) { - alert('Please enter all required fields') + setDialogText("Please enter all required fields.") + handleOpenDialog() + //alert('Please enter all required fields') return } console.log("categories on submit: " + categories) @@ -45,7 +59,9 @@ function NewCourse(props) { // If it isn't, return and allow user to input valid image if (!validInput) { - alert('Invalid file type. Please upload an image with a proper image extension') + setDialogText("Invalid file type. Please upload an image with the proper file extension.") + handleOpenDialog() + //alert('Invalid file type. Please upload an image with a proper image extension') return } @@ -56,7 +72,9 @@ function NewCourse(props) { // Input contains non-alphanumeric values so we must alert the user to rename the file if (isValid === false) { - alert('Invalid file type. Please upload an image for which name is alphanumeric.') + setDialogText("Invalid file type. Please upload an image for which the name is alphanumeric.") + handleOpenDialog() + //alert('Invalid file type. Please upload an image for which name is alphanumeric.') return } @@ -312,6 +330,14 @@ function NewCourse(props) { + ) } diff --git a/frontend/toolkit-webapp/src/pages/ForgotPassword.js b/frontend/toolkit-webapp/src/pages/ForgotPassword.js index 3ee2974..2800aba 100644 --- a/frontend/toolkit-webapp/src/pages/ForgotPassword.js +++ b/frontend/toolkit-webapp/src/pages/ForgotPassword.js @@ -7,12 +7,24 @@ import resetPassStyle from '../styles/registerStyle' // import '../css/Registration.css'; import TopNavBar from '../components/TopNavBar' import videoSource from '../img/PEOSTRI.mp4' +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' const ForgotPassword = (props) => { const [email, setEmail] = useState('') + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); + const dialogClasses = dialogStyles() const classes = resetPassStyle() + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + const onLogin = (e) => { props.history.push('login'); } @@ -22,7 +34,9 @@ const ForgotPassword = (props) => { if(email == '') { - alert('Please enter an email in the text box.') + setDialogText("Please enter an email in the text box.") + handleOpenDialog() + //alert('Please enter an email in the text box.') return } @@ -35,7 +49,9 @@ const ForgotPassword = (props) => { }) const data = await res.json() - alert('An email has been sent to the email listed, if registered.') + setDialogText("An email has been sent to the email listed, if registered.") + handleOpenDialog() + //alert('An email has been sent to the email listed, if registered.') setEmail('') } @@ -81,6 +97,14 @@ const ForgotPassword = (props) => { + ) diff --git a/frontend/toolkit-webapp/src/pages/Login.js b/frontend/toolkit-webapp/src/pages/Login.js index c4e213c..71806eb 100644 --- a/frontend/toolkit-webapp/src/pages/Login.js +++ b/frontend/toolkit-webapp/src/pages/Login.js @@ -6,12 +6,24 @@ import TopNavBar from '../components/TopNavBar' import LockOutlinedIcon from '@material-ui/icons/LockOutlined'; import Avatar from '@material-ui/core/Avatar'; import videoSource from '../img/PEOSTRI.mp4' +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' function Login(props) { const [email, setEmail] = useState('') const [password, setPassword] = useState('') + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); const classes = loginStyles() + const dialogClasses = dialogStyles() + + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } const onRegister = (e) => { props.history.push('registration'); @@ -23,7 +35,9 @@ function Login(props) { const onSubmit = (e) => { e.preventDefault() if (!email || !password) { - alert('Please enter Email and Password') + setDialogText("Please enter both email and password.") + handleOpenDialog() + //alert('Please enter Email and Password') return } onLogin({ email, password }) @@ -47,7 +61,9 @@ function Login(props) { props.history.push('dashboard') } else if (data.message === "wrong email or password") { - alert("Wrong email or password, please try again."); + setDialogText("Wrong email or password, please try again or recover password.") + handleOpenDialog() + //alert("Wrong email or password, please try again."); } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -115,6 +131,14 @@ function Login(props) { + ) diff --git a/frontend/toolkit-webapp/src/pages/ManageMyCourses.js b/frontend/toolkit-webapp/src/pages/ManageMyCourses.js index f55cd30..1285090 100644 --- a/frontend/toolkit-webapp/src/pages/ManageMyCourses.js +++ b/frontend/toolkit-webapp/src/pages/ManageMyCourses.js @@ -5,6 +5,7 @@ import TopNavBar from '../components/TopNavBar' // import Pagination from '@material-ui/lab/Pagination' import { Dialog, DialogTitle, DialogActions, DialogContent } from '@material-ui/core' import myCoursesStyles from '../styles/myCoursesStyle' +import dialogStyles from '../styles/dialogStyle' import DialogComponent from '../components/DialogComponent' import jwt_decode from "jwt-decode"; import { Link } from '@material-ui/core'; @@ -15,6 +16,7 @@ const ManageMyCourses = (props) => { const [openDialog, setOpenDialog] = useState(false); const classes = myCoursesStyles() + const dialogClasses = dialogStyles() // function that will run when page is loaded useEffect(() => { @@ -152,9 +154,9 @@ const ManageMyCourses = (props) => { text={"Are you sure you wish to delete this course permanently?"} onClose={handleCloseDialog} buttons={[ - {text: "Yes", style: classes.dialogButton1, onClick: () => deleteCourse(course._id)}, - {text: "No", style: classes.dialogButton2, onClick: handleCloseDialog} - ]} + {text: "Yes", style: dialogClasses.dialogButton1, onClick: () => deleteCourse(course._id)}, + {text: "No", style: dialogClasses.dialogButton2, onClick: handleCloseDialog} + ]} /> {/* {openDialog === true ? diff --git a/frontend/toolkit-webapp/src/pages/ModuleCreator.js b/frontend/toolkit-webapp/src/pages/ModuleCreator.js index 9c017de..e9f9b55 100644 --- a/frontend/toolkit-webapp/src/pages/ModuleCreator.js +++ b/frontend/toolkit-webapp/src/pages/ModuleCreator.js @@ -5,6 +5,8 @@ import { Button, FormControl, Container, TextField, Typography, Box, Select, Inp import config from '../config.json' import TopNavBar from '../components/TopNavBar' import useStyles from '../styles/moduleStyle' +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' import '../css/Login.css'; import QuizCreator from '../components/QuizCreatorModule' import VideoCreator from '../components/VideoCreatorModule' @@ -17,8 +19,11 @@ function ModuleCreator(props) { const [description, setDescription] = useState('') const [courseID, setCourseID] = useState('') const [gradeToPass, setGradeToPass] = useState('') + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); const classes = useStyles() + const dialogClasses = dialogStyles() const [file, setFile] = useState() const [video, setVideo] = useState() const [pdf, setPDF] = useState() @@ -28,6 +33,13 @@ function ModuleCreator(props) { // handleDisplayedContent(type) //} + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + function getExtention(filename) { var parts = filename.split('.'); return parts[parts.length - 1] @@ -99,7 +111,9 @@ function ModuleCreator(props) { const onSubmit = (e) => { e.preventDefault() if (!title || !type || !description) { - alert('Please enter all required fields') + setDialogText("Please enter all required fields.") + handleOpenDialog() + //alert('Please enter all required fields') return } @@ -112,7 +126,9 @@ function ModuleCreator(props) { onFinish({ title, type, description, quiz }) } else if(type === 'PDF' && pdf !== null && typeof(pdf) !== 'undefined'){ if(isPDF(pdf.name) === false){ - alert("File must be a PDF") + setDialogText("File must be a PDF.") + handleOpenDialog() + //alert("File must be a PDF") } else { console.log('works for PDF') onFinish({ title, type, description, pdf }) @@ -123,7 +139,9 @@ function ModuleCreator(props) { } else if(type === 'Video' && video !== null && typeof(video) !== 'undefined'){ if(isVideo(video.name) === false){ - alert("File must be a video") + setDialogText("File must be a video.") + handleOpenDialog() + //alert("File must be a video") } else { console.log('works for Video') onFinish({ title, type, description, video }) @@ -133,7 +151,9 @@ function ModuleCreator(props) { onFinish({ title, type, description }) } else { - alert("Please upload file for the respective module type selected.") + setDialogText("Please upload file for the respective module type selected.") + handleOpenDialog() + //alert("Please upload file for the respective module type selected.") } } @@ -169,14 +189,18 @@ function ModuleCreator(props) { // Input contains non-alphanumeric values so we must alert the user to rename the file if (isValid === false) { - alert('Invalid file type. Please upload a PDF for which name is alphanumeric and has no spaces.') + setDialogText("Invalid file type. Please upload a PDF for which name is alphanumeric and has no spaces.") + handleOpenDialog() + //alert('Invalid file type. Please upload a PDF for which name is alphanumeric and has no spaces.') return } if (data.message === "unauthorized") { props.history.push('dashboard'); } else { - alert("Successfully added Quiz module") + setDialogText("Succesfully added Quiz module.") + handleOpenDialog() + //alert("Successfully added Quiz module") props.history.push('/course/' + courseID) } @@ -210,7 +234,9 @@ function ModuleCreator(props) { if (data2.message === "unauthorized") { props.history.push('dashboard'); } else if (data2.status === 'Success') { - alert("Successfully added PDF module") + setDialogText("Successfully added PDF module.") + handleOpenDialog() + //alert("Successfully added PDF module") props.history.push('/course/' + courseID) } //else need to do something, not sure what rn } else { // this is to check if there are errors not being addressed already @@ -227,7 +253,9 @@ function ModuleCreator(props) { // Input contains non-alphanumeric values so we must alert the user to rename the file if (isValid === false) { - alert('Invalid file type. Please upload a file for which name is alphanumeric and has no spaces.') + setDialogText("Invalid file type. Please upload a file for which name is alphanumeric and has no spaces.") + handleOpenDialog() + //alert('Invalid file type. Please upload a file for which name is alphanumeric and has no spaces.') return } @@ -261,7 +289,9 @@ function ModuleCreator(props) { if (data2.message === "unauthorized") { props.history.push('dashboard'); } else if (data2.status === 'Success') { - alert("Successfully added File module") + setDialogText("Successfully added File module.") + handleOpenDialog() + //alert("Successfully added File module") props.history.push('/course/' + courseID) } //else need to do something, not sure what rn } else { // this is to check if there are errors not being addressed already @@ -279,7 +309,9 @@ function ModuleCreator(props) { // Input contains non-alphanumeric values so we must alert the user to rename the file if (isValid === false) { - alert('Invalid file type. Please upload a video for which name is alphanumeric and has no spaces.') + setDialogText("Invalid file type. Please upload a video for which name is alphanumeric and has no spaces.") + handleOpenDialog() + //alert('Invalid file type. Please upload a video for which name is alphanumeric and has no spaces.') return } @@ -314,7 +346,9 @@ function ModuleCreator(props) { if (data2.message === "unauthorized") { props.history.push('dashboard'); } else if (data2.status === 'Success') { - alert("Successfully added video module") + setDialogText("Successfully added video module.") + handleOpenDialog() + //alert("Successfully added video module") props.history.push('/course/' + courseID) } //else need to do something, not sure what rn } else { // this is to check if there are errors not being addressed already @@ -335,7 +369,9 @@ function ModuleCreator(props) { if (data.message === "unauthorized") { props.history.push('dashboard'); } else if (data.message === undefined) { - alert('worked') + setDialogText("Successfully completed action.") + handleOpenDialog() + //alert('worked') props.history.push('/course/' + courseID) } else { // this is to check if there are errors not being addressed already @@ -422,6 +458,15 @@ function ModuleCreator(props) { + ) diff --git a/frontend/toolkit-webapp/src/pages/ModuleEditor.js b/frontend/toolkit-webapp/src/pages/ModuleEditor.js index 2f253c3..30b9604 100644 --- a/frontend/toolkit-webapp/src/pages/ModuleEditor.js +++ b/frontend/toolkit-webapp/src/pages/ModuleEditor.js @@ -10,6 +10,8 @@ import QuizCreator from '../components/QuizCreatorModule' import VideoCreator from '../components/VideoCreatorModule' import PDFCreator from '../components/PDFCreatorModule' import FileCreator from '../components/FileCreatorModule' +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' function ModuleEditor(props) { @@ -20,12 +22,22 @@ function ModuleEditor(props) { const [description, setDescription] = useState(module.description) const [courseID, setCourseID] = useState('') const [gradeToPass, setGradeToPass] = useState(module.gradeToPass) + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); const classes = useStyles() + const dialogClasses = dialogStyles() const [file, setFile] = useState() const [video, setVideo] = useState() const [pdf, setPDF] = useState() + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + function getExtention(filename) { var parts = filename.split('.'); return parts[parts.length - 1] @@ -79,7 +91,9 @@ function ModuleEditor(props) { const onSubmit = (e) => { e.preventDefault() if (!title || !type || !description) { - alert('Please enter all required fields') + setDialogText("Please enter all required fields.") + handleOpenDialog() + //alert('Please enter all required fields') return } @@ -92,7 +106,9 @@ function ModuleEditor(props) { onFinish({ title, type, description, quiz, gradeToPass }) }else if(type === 'PDF' && pdf !== null && typeof(pdf) !== 'undefined'){ if(isPDF(pdf.name) === false){ - alert("File must be a PDF") + setDialogText("File must be a PDF") + handleOpenDialog() + //alert("File must be a PDF") } else { console.log('works for PDF') onFinish({ title, type, description, pdf }) @@ -103,7 +119,9 @@ function ModuleEditor(props) { }else if(type === 'Video' && video !== null && typeof(video) !== 'undefined'){ if(isVideo(video.name) === false){ - alert("File must be a video") + setDialogText("File must be a video.") + handleOpenDialog() + //alert("File must be a video") } else { console.log('works for Video') onFinish({ title, type, description, video }) @@ -113,7 +131,9 @@ function ModuleEditor(props) { onFinish({ title, type, description }) } else { - alert("Please attach proper file corresponding to module type.") + setDialogText("Please attach proper file corresponding to module type.") + handleOpenDialog() + //alert("Please attach proper file corresponding to module type.") } } @@ -155,7 +175,9 @@ function ModuleEditor(props) { // Input contains non-alphanumeric values so we must alert the user to rename the file if (isValid === false) { - alert('Invalid file type. Please upload a PDF for which name is alphanumeric and has no spaces.') + setDialogText("Invalid file type. Please upload a PDF for which name is alphanumeric and has no spaces.") + handleOpenDialog() + //alert('Invalid file type. Please upload a PDF for which name is alphanumeric and has no spaces.') return } @@ -207,7 +229,9 @@ function ModuleEditor(props) { // Input contains non-alphanumeric values so we must alert the user to rename the file if (isValid === false) { - alert('Invalid file type. Please upload a file for which name is alphanumeric and has no spaces.') + setDialogText("Invalid file type. Please upload a file for which name is alphanumeric and has no spaces.") + handleOpenDialog() + //alert('Invalid file type. Please upload a file for which name is alphanumeric and has no spaces.') return } @@ -258,7 +282,9 @@ function ModuleEditor(props) { // Input contains non-alphanumeric values so we must alert the user to rename the file if (isValid === false) { - alert('Invalid file type. Please upload a video for which name is alphanumeric and has no spaces.') + setDialogText("Invalid file type. Please upload a video for which name is alphanumeric and has no spaces.") + handleOpenDialog() + //alert('Invalid file type. Please upload a video for which name is alphanumeric and has no spaces.') return } @@ -294,7 +320,7 @@ function ModuleEditor(props) { if (data2.message === "unauthorized") { props.history.push('dashboard'); } else if (data2.status === 'Success') { - alert("Successfully Edited video module") + alert("Successfully Edited video module.") props.history.push('/course/' + courseID) } //else need to do something, not sure what rn } else { // this is to check if there are errors not being addressed already @@ -315,7 +341,7 @@ function ModuleEditor(props) { if (data.message === "unauthorized") { props.history.push('dashboard'); } else if (data.message === undefined) { - alert('worked') + alert('Success.') props.history.push('/course/' + courseID) } else { // this is to check if there are errors not being addressed already @@ -402,6 +428,14 @@ function ModuleEditor(props) { + ) } diff --git a/frontend/toolkit-webapp/src/pages/Registration.js b/frontend/toolkit-webapp/src/pages/Registration.js index bcf2f56..da6ef73 100644 --- a/frontend/toolkit-webapp/src/pages/Registration.js +++ b/frontend/toolkit-webapp/src/pages/Registration.js @@ -7,6 +7,8 @@ import registerStyles from '../styles/loginStyle' // import '../css/Registration.css'; import TopNavBar from '../components/TopNavBar' import videoSource from '../img/PEOSTRI.mp4' +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' function Registration(props) { @@ -15,8 +17,18 @@ function Registration(props) { const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [passwordCopy, setPasswordCopy] = useState('') + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); const classes = registerStyles() + const dialogClasses = dialogStyles() + + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } const onLogin = (e) => { props.history.push('login'); @@ -28,11 +40,15 @@ function Registration(props) { const onSubmit = (e) => { e.preventDefault() if (!firstName || !lastName || !email || !password) { - alert('Please enter all fields') + setDialogText("Please enter all fields.") + handleOpenDialog() + //alert('Please enter all fields') return } if (password != passwordCopy) { - alert('Passwords do not match!') + setDialogText("Passwords do not match! Please try again.") + handleOpenDialog() + //alert('Passwords do not match!') return } onRegistration({ firstName, lastName, email, password }) @@ -62,11 +78,13 @@ function Registration(props) { const data = await res.json() if (data.message == "added user") { - alert("Success, user Created!!"); + // setDialogText("Registration successful.") + // handleOpenDialog() + alert("User successfully created!"); props.history.push('login') } else if (data.message === "email already connected to an account") { - alert("email already connected to an account, please try again."); + alert("Email already registered to an account, please use a different email or click on recover password."); } else { // this is to check if there are errors not being addressed already console.log(data) } @@ -168,6 +186,14 @@ function Registration(props) { + ) diff --git a/frontend/toolkit-webapp/src/pages/ResetPassword.js b/frontend/toolkit-webapp/src/pages/ResetPassword.js index 0384e17..9943a71 100644 --- a/frontend/toolkit-webapp/src/pages/ResetPassword.js +++ b/frontend/toolkit-webapp/src/pages/ResetPassword.js @@ -6,6 +6,8 @@ import TopNavBar from '../components/TopNavBar' import LockOutlinedIcon from '@material-ui/icons/LockOutlined'; import Avatar from '@material-ui/core/Avatar'; import videoSource from '../img/PEOSTRI.mp4' +import dialogStyles from '../styles/dialogStyle' +import DialogComponent from '../components/DialogComponent' import jwt_decode from "jwt-decode"; function ResetPassword(props) { @@ -13,8 +15,11 @@ function ResetPassword(props) { const [password, setPassword] = useState('') const [passwordCopy, setPasswordCopy] = useState('') const [tokenProp, setTokenProp] = useState('') + const [dialogText, setDialogText] = useState('') + const [openDialog, setOpenDialog] = useState(false); const classes = loginStyles() + const dialogClasses = dialogStyles() useEffect(() => { const pathname = window.location.pathname.split('/') //returns the current path @@ -26,6 +31,13 @@ function ResetPassword(props) { }, []); + const handleOpenDialog = () => { + setOpenDialog(true); + } + const handleCloseDialog = () => { + setOpenDialog(false); + } + const checkCreds = async (resetToken) => { let res = undefined @@ -53,13 +65,17 @@ function ResetPassword(props) { const onSubmit = (e) => { e.preventDefault() if (!password || !passwordCopy) { - alert('Please fill in both blanks') + setDialogText("Please fill in both password text fields.") + handleOpenDialog() + //alert('Please fill in both blanks') return } if(password !== passwordCopy) { - alert('Passwords must match!') + setDialogText("Passwords must match!") + handleOpenDialog() + //alert('Passwords must match!') return } @@ -88,7 +104,9 @@ function ResetPassword(props) { } else { - alert('Something went wrong! Try inputting your new password again') + setDialogText("Something went wrong! Try inputting your new password again or contact your system administrator.") + handleOpenDialog() + //alert('Something went wrong! Try inputting your new password again') return } @@ -156,6 +174,14 @@ function ResetPassword(props) { + ) diff --git a/frontend/toolkit-webapp/src/styles/dialogStyle.js b/frontend/toolkit-webapp/src/styles/dialogStyle.js new file mode 100644 index 0000000..781a89c --- /dev/null +++ b/frontend/toolkit-webapp/src/styles/dialogStyle.js @@ -0,0 +1,57 @@ +import { makeStyles } from '@material-ui/core/styles' + +const dialogStyles = makeStyles((theme) => ({ + + dialogComponent: + { + width: '60%', + border: '5px solid gold', + borderRadius: '5px' + }, + + dialogPaper: + { + border: '1.8px solid black', + borderRadius: '8px', + width: '380px', + boxShadow: 'none' + }, + + dialogContent: + { + + width: '100%', + textAlign: 'center', + // backgroundColor: 'yellow' + }, + + dialogButtons: + { + margin: 'auto', + }, + + dialogButton1: + { + backgroundColor: 'black', + color: 'white', + "&:hover": { + backgroundColor: 'grey', + color: 'white' + }, + marginRight: '10px' + }, + + dialogButton2: + { + backgroundColor: 'black', + color: 'white', + "&:hover": { + backgroundColor: 'grey', + color: 'white' + }, + marginLeft: '10px' + } + +})) + +export default dialogStyles; \ No newline at end of file From 25bbc54de827983e6323781cc7211c63084d0519 Mon Sep 17 00:00:00 2001 From: Nathaniel Lyra Date: Tue, 13 Jul 2021 18:29:03 -0400 Subject: [PATCH 6/8] Fixed styling for logout dialog. --- .../src/components/TopNavBar.js | 39 ++++++++++++++++-- .../60ece5c7143ff504e993c36a/nyancat.gif | Bin 0 -> 35000 bytes 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 server/public/60ece5c7143ff504e993c36a/nyancat.gif diff --git a/frontend/toolkit-webapp/src/components/TopNavBar.js b/frontend/toolkit-webapp/src/components/TopNavBar.js index 908c9d6..a5f266c 100644 --- a/frontend/toolkit-webapp/src/components/TopNavBar.js +++ b/frontend/toolkit-webapp/src/components/TopNavBar.js @@ -40,9 +40,40 @@ const useStyles = makeStyles((theme) => ({ }, + dialogPaper: + { + border: '1.8px solid black', + borderRadius: '8px', + width: '380px', + boxShadow: 'none' + }, + dialogContent: { - width: '40vh' + width: '100%', + textAlign: 'center', + }, + + dialogButton1: + { + backgroundColor: 'black', + color: 'white', + "&:hover": { + backgroundColor: 'grey', + color: 'white' + }, + marginRight: '10px' + }, + + dialogButton2: + { + backgroundColor: 'black', + color: 'white', + "&:hover": { + backgroundColor: 'grey', + color: 'white' + }, + marginLeft: '10px' }, divider: @@ -960,17 +991,17 @@ export default function TopNavBar(props) {
- +
Are you sure you wish to log out of your account?
- - diff --git a/server/public/60ece5c7143ff504e993c36a/nyancat.gif b/server/public/60ece5c7143ff504e993c36a/nyancat.gif new file mode 100644 index 0000000000000000000000000000000000000000..80c899eb858ad8a3a3a575ad98b79a519600b3b0 GIT binary patch literal 35000 zcmeF&WmH>jqUiAov=po2($YeqEmFg+f@@20FD>p;+}+(taCZ#}1S^^l+(Lr8YZ5$M z-kCXb&dfV!&bsG*y?gz$v-3Rp6xnNKKfg#yOYrf3zee!k#?iHF1UCr&=b8uz{#-Kw z!C(9H)YVAn;=gK%AoMSVEE4=Fk*{@sPV{TtKUORH^&j#J@c)LY3O{weG&y0aUkfA0JS>3>9We&cVQ-5~jE z=P3mLqEv$Of73d_`JdY$IRB5%)(QTp)43Oz-)a9U0Ot2!Y6D>Y)M@STSvC64omWr& z`!4>Q4gbH|F7Ovuo#W5{Z)3V7Q4m-D_W9!%@wc3>Z(hH4?Hbbw!8PKmd-ki_)feQ$ zjcY{sYxYF+Qk9u)enbynYWGxTwFljMCIgVF%I*xKerGn-QxXhEROA4 zu{NwauQ%!S4>&-&CciI@&wgVHR#PyL@xhOnL8i8FC`T&pr4GEdXr$mvjto$yu6V3O zy~b=BURN?vq2C_LAPXv;tT7oW*69V6q3dlH;Xv8?^65tB!;R_Q`ij{W@0%oya^TAO z_TY!FbP?dH#qQ{5vgvY=>gC?#cjhw)NX_a%=I1a*`G(r{k-~2!x_u3Gn-i5kdeh|_ zLEC7s{pL(xWBu-Is~^c@1t@rbu_x}8UOyCaxH_04o1xIufZasan9ue%H6HEGwd2Dc zD>g$<4%bFX^ah%n&W`pLdovVUnlH|d4>xBAT3RkIuiavs^CqA)ne!ofUO4AV%Ck1- zcTa+C-v5!R$$S8{QQ>?bz2n+^(33#6g<$4HlZ6nr{KAD$cF@{F*y}E~#qjszCW{e# zD}{@ZLb$cXs1LVZEJce^nl8miJ?QR_mE&1w7L=BFkte383R{X-H%f_4P&Hd$PSRFA zSx#0DJYh~Td2X5?XA06-N|kSTVH|Cv%fAW~8iz2ayRQ_o#(Uh7Sjeicq0xnziEzfETUlls#VbWJ(Ixnwzu{)i z)hl00lIr_WI%N=}$&zx^ez9>@%Z)H#<*x^VrBxeDBn8#5w`u7$=AX_=YuCP-=huxH zxTS->+clQemvL@>sZz?8<#d>{dtn9MjGeGb@-3#bwm%HjsDK>(Hm(3%;?i_lEg!H~ z{<@Wuve!1kf!J#w;3wVhfJ@8mcXn!o?{~GDBKEr*T}TglKp}Dmu&R{s19)i>;-I$x zLVAeEhRGfF0Vl%``;*rZhXWsOb6^I=s4Ou4(zD1nk9Bj-M9=p zuI;pqozM^Bz#)GoS>h&53d(ROi~4OG+NPW1Xv$&2@@U$5wd@E#<9@X5r0h$;c|7M& zWpz9s%vyfD5dM%{bun6!^JFPTRN?A9FfMnQzsE6mvYHvhdAgRHWOce;SWtetQCh!q zx>?!HdA7M{X?3=ptQC2-17$6D+iktAck;Q0%KCi2hqdDT0P#w%ac^)J?}iy&#j9YE zYO^kfQ%<`VM{_}5=ZBL?cTX@Y1zvoo8}*7OxP@-6%X7@cW5JW1)yI5irv(FEm)G9Y zpKnRF-k{y{o^IE>cHz`S2-@``*Pgp}U#g8*bI&*Tn?6C+?KZMo6@H9}S%NoGzaON2 z@uVeX!h9(FG*wj@utGO~$5^VJmXa&r_0}|reKLgMAleoGwl?ctkW|Oe{9aJ~A=3kv zf)17&T*2bu*^i8!#aMBbKC1DIlr=pcg5>tY^o71tK=>ffWAED<3FWM0Qg`t*+z;6O znzKF3*4;K#6=}#kLwD5EeH?K=Dzxz#BjKH%uBxi2V7c5aym}ATvMOfPjhWfSNlIMv zAhz(w67x12O#ZYyE`3Uy<&894$u&|aOD^xF8Vs&V?E4E8oX2h~-K&W@NCYGDIGtd< zx~B(8t)%&{gQO7##BskyZS&qH!4O8Edx>4)`R@y)`^+>CQ<0_5-xe$)tXvP%<{mM= zuaWMzOFaav$rZe>e*v^k6kf98FF~PT01i_qWmzPb@_960fV)sazF4^+ zbTE%|wMf0sOfpAitlYIOT~#GgwOdBj+YVb|BEQMqo(iaLz?RJkm1wTYOnBhq(`@=m zbhTbgG@N29AU|K(;bf4%6{;(|;efNC*hj7>g2vsBi`Q0epg&g zCRv$@q%3OKcRVw^j_jveujY|74v-&#FS9U~MWawSP`3ECPQVCi<}}f@f}7PUNOo$0 z_6S@xR<;p*h+Yw(a%$sXwJVUF-q1_}!Q~n3GkT|YWH=kfq2vf?6llH* z4j!X$C&c1FKc544b5%4fbk#3Xo9B>vnewqRw0h+$}*+)9?6MzWs5AwIYrdX1fg{Gm-`4PaGnRRDd`@7!OLek8PNeQ+}1OmdQXtma*oD8hINg&wBd?KoL#p&pLJtn|CDDvXpzI( zyk2vvQiQi5q-58FS92O=SUg$Kfr9HF zmfNblgU$oCc{}hxj{Q2Nb6(0_=PLg41Em`1au%Mihx^rmk*Lu0Lp@$=ira@~Ezs59 z{d|Ld9ET}CKr83XF8SBfXMn6$Yi)S`(c2u@qT3B?67}rEL5;t--(57{-~x=f=wPc3 zAzMZh@5XBsCd+5XxApJ>KJ5zN+B3~HM^KXiVBxv`{qM6uU+oRbPag-I7SjA6#8b?YLL!#H#5j% zmC4#+G-(_sq$(Uic4;)>*1X?LRlCKlc$Tv0S=${|wc{fMm=nA_8H{Si?2_spKF`1) zsVceb@xp2AZkK0scP~dv^kz1VFVB-MSdI*z;c<zE7z9^o@Oasr^6k z`A1FoG+=yIyZmGdO`B>xt3LXFp$0`+isVd?FQi%Oo&~*Uwx%$Pw&qDdlBN6m%5iO-V%WL>=r)*F`pGSS$o4da0@In#TWg6 zKSsGQ6#OVG(BEZ>V5!b!(Bld&1t*tB2K@!W9+`4RWlBl%O}_rP)RC-JRB@$V<%a>e5<+c2OCq8tL1{e>fK3>rPQ((%*0II%NXMGEBo!7W z+Q1TXmJ=7ii4c~g?&Iiwzj$YtYJ2DreV zj$HTG&oUlJN#96G?}eoAoTRr+rtk4*U|iCMUI23`(w86^=t-Bt1<}haW>>&H&1^PQ z8f$7cduZAt&8*Djtj7ZBw6uEk#rNI{~RjwQyDAYhHVwTIHnX68lrP+{27Md%KN-TMox3r$SOqfT+l=m~0fC)vR zwvoqz%CphTuoEaayp#XESi?*v-$+K+#Pyz=K%OO>0&i_rK(1L3xRD;5TDTEX;1a6g z1JCsk(DgFA7gL<$*FX^fFLY?|0=&!$J1y#4FN`wNND|12EB+ok8KwI^-@GBm>zFd_ zW$`Xeacw97r3Ib6CNbDD{B zt;k7@1&x-_6$w-jmlQ1mOJw58h%2w7bN53j4~r{WY0AmX)9%q#t)3R{YUY=Gu9OE? z?rap_kpYt*^JtBmf~>7Lc; z(}89M>RuPu`JPtSP}h`wtBHlz88U%v=<4kR>tD!#D9k{XB?6U2Am^|mD_KehIHKfjrFMw07yeLy213U0sgSDv@zJmr?JZo+C!4t z(3=cxENkusx26gGMmKge*23^^O~|ySJqXl&61oA07_37^`I}}18!fV$*3z0cUIC_h z6K6;&2GEe9Frg)_=CMu6&9s)&w3hA7xZSX-eY)mDHz6!Z%aLs3Sz0S`IP?M?d%0PC zoj&QNg%BZW>uvXD5y%w3_{xmRt_Q6UP_HYzA39pLv%AuxkQ)MG$xK~4Qb zZ6OxY-z#CiUjf<$NI@Lo(UDs1gtWiw66!=rJ1kx{e6MPkfp!%3R)nuqw5fM|aIgFJ zqPg%#2eDhbSzCwpROd3P{coy+h4u$so+UzJd^0GaTv$yDZZSg5y2r3iS z5)Op{v@^V>d^4rB{ldH6JHSTMU_?`}Vko@-1SUWYZ|8=)XuS_;G4N&&qMq`=5< zi)hkbFiWqqTyLF4TYY$YBLD&4%5I{!Y9URTU_k`QAv!JES)rZ1fIiq3T$KpH$qyTI z?+BppA9qI}OZ(QK@G17dFjL)O_Qp}U{^gJk{g{5-6l`-VaL__$Hyp;wJdm&z-RU+! zP}Xx&8g!4@Cn@jtw)Xeo1rJ$ofI4)R61HD z+fe##{2-$T1=IAftkCcT1x$vxe~ev>R(K$Is*ba1mkk_&Xb57AJ zeO;z$RBn1y;bQa)!9sK0T(-Fm9kTW=%Ru^L$hsIKF4m ze}6me$HlnK#kd~BgoDn6itvOZaKg1|)KF(wIdI&J0r^WV^yc=sn+MV*Vj{Q+`J)UO zeu31Up13n@q>v_?1oVwXPETesjAbyOa{ESOr~8p=lSxe|3E+tJSy~^Ko{G|$>S{tZl%=jspqn|6t@0GV@xUn% z2Y6Hm)#EYk+B8*R>eYWSWyUc5?aefbY;sa(=9kCJ8pFgCgE`^x^qkJ<0tdxX(@b#L z3~m}Z4xA02o~d4$e$Oy_gA;nlK!NR>4QZMs@Wg+q|ecc(mj1Gw0SL@aiMQ9B+J>ILU-*Z`LgiPT5|e&YV&&L#hMl4x;g)PJmYL) z|3iT1Mq&C!ars#KjBGjEx`4<=HGWBQ`%#JKCOCZ)FtY*0Y-BNR)-Y~;Cm&MJ+U)Y& z>cOufZm!1@ZR&Dv4dTIh%@1L^+vA?wxV}wBqK!D6$X3Sfxya!lT?(Y`&Wh(wR@t^> z&vqe4{s807-pr!^1;v`~F3xjzt7$7^W~&9ivyb1!LnHNlb_w+MZgGumG>2|Aqd#73 zU%T8}klRwT-Fu|BPmr-k1=)KjGJ+@HXN;Pxn|VYjdcYio-=?mJrL|s&o!Wmqdr-!) zuln`it>_`d^WY-&z=pG%efQw8=(fPe!w-)!X;z1dh~4R(67qq=p`Am1CXB)*#$5pu zWr5jl*2pf$)FCi@*Rk5OSTRm)vmBOmcgHRgD^!8yoyVHB;7G`E{p>ip**!sP++`$= zrw!+vaU^f~;kupx!ZXs-(qZ?U++XiF(Cc{D21^}!9IkhqYJS9>brc(QT!A`FM&x`T9!%V zco*wWbFd_x#A%$0i21gvkS^?jC!kec`;z_P1-*Ex^14#KJWwQnR%JuESfxz2GgW0% zwOpsklaS7FQ@+};?^CUdqYnqja=N*0`HMb%!>{d`h-YfMy3HOJjLKS7EBXmDv55!+k)}AV!^2hYjtodaNZVi_P(hAMGFp-E(KZ zjmRoVnYZB!k=(n@jbTEBR8WpOoVM#- zk=u`RZSsg@Q}>`JTZ@&SSI%#~5xXzRTqTx&L+pND;*D4L%5UC}kN8Mq{FAMjn7d)H zi_Qu0rhS12^ID4O*V`(oXHjBrrK^+%)r zOtCvmEZh|GO~e*>XRtJx{D3` zOq}n#y~lFm+^-{ylzw1uZ2iLBj04^u5k-W_MG>O6XeJ|*Vv+Nyq>=BwCv@r@>o~~s zkT3M0fXVD();wmYXeYe$&pc=RErA~yaW83%62Ao68RosPOliu#W0Yi+)b|@=mcB+N zVD1(qA!A-qwR~Dw5TS5qoia%R4bSI}N6i=NrKcK{tahE6Hv-Ahd>fCfcy_B`=`M9P zBhLYCbzT;9W-0uqXZ2rJ6YH&-S-E(u;an9$TV2;DdbVzm+y+A1ebDYB^>mSFqn?sP z`oks;C!k%+!&QK7oo>V{hiP-VX*+8L+tXFI#0j`o-~%WXXtx7*AvOr#{(WiJMCMTK3SGJ8AI(3zN3W?*2cSS@>ai z8l^WkYO=zJH10`vnrN>W+(IgcXbcR4IK;|iSo~m< zgvchv+XWYh8NLd@^UE1f9;#O`%dw9oz11Y|NUZ;#0Mh61=Ysq26JApVyR2^?HwjE6P(=++ zqF{=Dmr2E7@{HsqbAaP$&f_M^&&z9H)Yjvo&pQn1 zHL`odZoJQ#MzcwN6!?}p9#8O8m{wX=rr$%MHiLpiQTFDk(pl$wDIRe%rMsac32P1o zh;TNUoFXOj{BMOD%x1(9S4$g?VX_WF3MEzVQ?!aO_HM6nNP`kSO zrk2`21hp4#Sc2$D%S>Ecm8SA33gfr8*}O<%=7tNv6P;FFk?7VX6sQ20%ci1o1Gy$( z+dxvdV^`g%i{pF`DJW8XZcCLX#XV7a`;oOwkK4rgX?e@U8JFPnX)negzv;GwP0I|4 zo*B%kIoeLjbXTi4EOY2ud4N=L5Xf@bMrhPn;94Sqz0 z!rSu8(sjkLhC#fCqofejobL>U0utin{4bOZJ|_=LO7N5>aF`pdhK?9J;_@fi1$6M= z(5w@IP6jm|v6gXlXbd+l{x`!Xtsg&I!nd8?qWLy`ROUKUM>Avddz$ty zwuN`khOgK6w0tbF`e+XrWaP!P*#m3>-c2pZ{NfXTlCBow);KmN;aGb4$%Zwjaj}nw zukpUZ!PktbRc`qcG1VPpVmmS76a*%JlTHvZLb){PDd3&Mp&#=sbyfJ%Wn7rnA%s-; zsW`7|^LjicOwr?+ykz<0U5G=ftj6lI76HXt5vKq<;itM@Y{(y2hUz5Y4P`xZg-Km2 zx&pe@Md9}!7delNT-x@dg4~x_L|x!&GY3iC?kmqOzxFxJ9A?~ZTD?!_I-G=0$B^G@ z1e|)RCLd~T+ti-9nUha-`hoZJyFGS(?GpCy&K$K&oUi$ao{!w+$4YB8mGr*bv+vdg z)D&24$1JihsLh@>)qCPRxZJm$ybcOQJ$Fva&wVYZT>Fze4s*CJ7-nbAcJB(~=0z{( z9w*}WZeQ-J4V;E99$|&VT9$l8Fa|BSABkt5TYKYL2!6J9FE-y|Za$Z7x_Bm414nxzmU<#P+JgW+(T`v;;c=n0Qa?st zhC@lCe!>zRU`ZH}Xl7VSE-dCfERMP7hq839H!K|k%OH?J#KBUT;n{LcX&usq-=IK5 zPo@LBz+WbcUM43OUfl66S5D^GlsErTXdwn(K_F`kkSSsAt@eLVih$So36?X5Ryy?7 z`}cCu%hu%fHvA;1m6KK1lm%_U!I<6_0=d&P*+yo$l8#;|DXZ0zY$g$+%K_0X)aLjC z0ej!uE+*%zg@Ab@`j!y=wa~U)#2~YDFI27#-HX87!4D|+jZMi7KI)r@ml|f5uR_U; zPTd*r=$i_co$&9Q5fYgM$a@RQqoMNC@B0_sWo9sa%kg}3qzVOEG7CadOS%0U4${j% z`?uoXuevMj&?>AWu5UgX*td|{8tp%Hf4#G%z<#c<&OC7BuW0jL5tBO*`?DL1NJlvg z94`&vEyTnh^jxDDyl(hlFZb@H*dRf`r)w;Ow|))Y9+SS=NlKVENPO|(R=^0FPi2ULL4=fhh$`S~`RA`o`a`sJL&Nq%)MG;oW7Rak zK{~?WCrwcL<)NqCN(Bc)36F+Z43)Z{4L=JQX0ya6F)zcO*C{>mPC1f_)<& zgolMKWktD_j|r4NswgwCjPeVQN>U7n>5NKq3`uOuN_CDd#w*J#D-+d?zHbu39ZG+V zkY%VT_<|1kHa4*ERi%?4QPpxlqEkpIKw8s7_FL0Hgy6SKZfQmZ$n0!nixJ&VKFWXWmUu8aWv%6#}BKa8dE%VM4iS$tje0KIgmCSue~Ei zvc4cK%#gnlRCja7Em@GA@6^M@kr-EGHd0-3L){_*dDyNdTZRNTs>k&qH%^guWEwaC zl1OvXIYc9rOvR>5C9O%t)^bu6s+#yqb>4mQEJfq{g@(?yh7-qRiJ(TF{Nx-h%6)p0 zU2|;AMe}QsrbgMMUz0{z-=u#8Dw#$j9jsY=p{dLfS2aD7y9~+GLFZd?)b`y0*U>^K z9yH`B)v@q{`n2l%*dcXjFAj8(FuIjY>r*G%e?+Te8U6b}>vw=^&k345WQs;u+euct zS4SIcHkHkyYALSPO{Q5wIIVv%iihWcdWEME)5U#tYKWzYAz_q$indSQG^$Q#(xakS zqtexqJ*aOQO*k`0p&K@-6D-d;)A?#vcxK*kX62VI>_VqiN4El~8x=9L+Bvf|rkg>= zG2Nt_a51AtHoMI-d+=*!Az@}`Y;xm58^=9+6rhI|*IQtiZ7$PGZkjzFo4pVpIU&?I z@<5+s884S-Z}7~~u;`~y=;z4jQ<%-&44flc>AlTJL99DX_+0B+;vCt^oOA8m$CJ5a z;_p43bL2ep4|SpUpFgDVWTnLEl1a={Cw`B$pMO#`|E=NsX}~d49#(#K=Hfe3 z*Zc$A{4aSvI3Fmiz@y+`=o+!eysH!Lq?3 z!y=c&;(OIaZlgsW$3@=2MZUyE{`^G&(4t`1qR{xF@XDeHZc+5s(g(_=kI$Dr@hp9o zSQ1lR5;t0sa9olMT#`y$lFna}0WHaPEy;~9$*(La;Fc6`Eq|e0{`!1biD&tn#ImyL zvWn5Ns^hX+;Iew+vPS;0CTLl!Ygv1IS!ZQgx9f-FwH1BJmG4Hk;ZIh6kQ?c#t{6&u z{V8Ge!_mmVXvH*t1rcs!njUV>xMH@lV#On6NoizqYt;a^V#i}lLvO54X>231>gc#y zB5Q2N8S3o0>Iz!r#pkSAD6G1zta|pBx~H#t;8uN}o9N##$>v-0Rb2}R1o%@D2N|se zCz|N{m}C~Ng>maeRX4wiY{E@8>jF1FdYXF}t%E`4is_pP zMyri0=4A@zF0jpJN(%wb)mC@D#iz)v4Dc3we5-F| zs~@*DaO>(yFXi^o^X*}t?GcIXQPu4+qwR6W?TNr`WTNF=*w!Ry`+fN~dff75|MoO) z``OO+ETt6<`OZAg4msz}qN){TjV$m(mm)$I7r z_KwwV`qn;f{eUrHd&TN-ylQu5doSM#SN`^B-10cz`XtZ{(`9{HX?-!X8_{5m-q~%y z@6HkLO)~B^aqbba_7hAP-3qc9b=WhH+#@#by%S|bGGUX@VPibAcXzjo+{@@5t1bVd z{U4nBk0gyRDIZ}IjVXfmouTVDqxNZMi)oB)=_YK$J8W;v?mu4bWmL0y!g>IFba0#N zfO)lIpMKyDt=a)=ed@CU8@2+whsJh*=7X0L2V!vtq_YQH6-}H+Hm_Oj(;pt*=Q@1f zvh&Kxj@!w;#ORRS>yTeG@13NrK=15Xk&i~xMF}7Dz|5E1u2jKm?-$Bj0eU7Y<>=NIRH^cQCP-}v2sJA8Kj?@{poV)n}B zCj5V!`@gZd-@h#?|6y|tdcFkGYw}&$T&3~(U`9?cgFvP$n`^)t3H~0&QhsG~z1w=` z!+3_TY_7{>aCV5u0oziv%}F6sH2;I5rC1{x7pBP9Z(l6O>+;k5_#~lJw4A7-p}`c- zVfSJsS?<13RX{PmI2NycfJ9M4U1MYywf{a6F=TETgzf3 z3ysbQ=GkBq4`u9F%ZXC|Rywr?jJ7ahE%<_QJ2< zwXg{$d|Ybde}`*pujCj-v(o; z2fgeC>_v#z6WV&cPN-6QPd-KH;Q;T5_C44KDh}-dQ`)jxH>q|AW@LlAjB^yuEm!NO zFv3;0%6X!zIZ7LU3(4mgYRBD`zOOCH~`sA{x(GGYGkg>DA z8XOqeV3_;Zv|*-#mFg@m&Pn&o!6ZqcYO`^XgLe;5%?Pz^>cuzicfS%5I_#6o&^!Rk zT6bYFtY78$~j^=t-E>h-`c2UPG1ue8!HrJZ=Y^VD%?Rgu&!R5vAYQ-h~{Al+| zhm-2#Tc7^L<`TWnJTLqtI>)@{b1yve+8wqloBPF=1R!(M%f5}=wbJ|1c_xu$a0{u7 zpT_apr{q>@gMvW3=6u$@kA>|_v_oDZQ1W{< zb{)@mDgqQ73?7u#h?R=%hemoor3~Wh+)&#)5-x!SSl-m!!-Nw_Z?)H4jEbZe>2rXqTdu zcpDQ0&ArXK4v_gI9_Ni|%)8=I>iTaeHrm;Z;&<^PnM zJoukBcTC9WT|KPt51UKm{+y@#Z#FkRpQjDh?|5Z%OCA{utV$33VRPH@+N?rHumR80 znvjEzf)BT427P0{Wn9V?exia8GByuq-ix@hxv8@LJeX|izQRv8WriYMF*(@ULJ3Kk z;aIDcc^@!C$`iiz*HRu9|t`cDK(8K z(WYxqtw&+Y8~iu5kKk&~;}jL%WbEu%)WmOE$FyeVKm)2?WY?9=jgBb&$twGgHrKJH zS!nV5mCdz&j;kq@FEdl?MU6M$>PpG*9Q3kRHuw2qZDn7Xl~XTz=9H(dx-ZA_%I1Du zz}5H2m)j-vYWLq#i|&jlcQ|pLTG2deK=xT#Wi;HCS##&)ahPL_0?Zhz9x8JN&M|3DJi&ZJNk>Ls|alziMtAh926EVnogqUL|y zzwcqFy~ub*UEB1iEHY?Ihw<{t=0^{{XmO0%{ zdiBX`lDp+rge)Kk6NMUl>ICVE|EHAtgW!L(xrkMfv%lKhvv8f46A}nxqnd20J`*n1 zhCgg>>hzTC0r}~0a(`_;Z{NDYC1mg;BYF1ai*=W~ z=3UxRC^LES8Eiv0?R2P_9F(ooB&&`-MfNCws^3Ix>TC!gS}8%bL-gCGT6CyO_e1lf zzHKYFGqjzRqpo~K7H@fxf0Ln*&F)f ze2GmF)MX#K8_BD^G(paf(2%#&N)=k>8*nL5)0K@BL@mBcy0W>PTd5NVD*}oQ!`J)l zHBX_vZ&^<(f;h3dbihO@y@v66tJVC0gLUml*Rf|DxGLV$jT(f8Pmb;*3Q7_2+9j;?ohA=vz znRAhM_Gptfl_&9T)0(8>>2MnU>ch*vdR;zryb+JBWF;*7q3AYI;n`n#ac-e7a5i&> zKWfcz+<52aCOXlKs}c3w3VXad6{N}6c4c!56fZXPT#l0sMKTibE$15ck8vm`&vGW~ zi-WYw^EE1d99PMOu-7FP=GC&5!sTfkCwg%_(1JgDypELxU39T}9kQC=;Pb9m^IE*+ zasC&ZOWtFMr_#8FG$y3>+NJWW$aAaS_ohesFsggrC(?Kb_PAl??%y6DjmeS=D@3XiQ<^cM#;ugL7}&_me~VE3jF< zSyTU_JjBf@ zShyf4{L1DQdPPc+MoSsTJDX;K9TV3alEEQ`$)TeYAsKweIcz2sNJkAm&yd2pn*rR)!4w6{zu&hz`sb-hp&$IJShYg~8eGwiX7od<`F@j!1M0pGgewMTYfBg~_r- zOd%u0BqOGcA|{SQCQZER)*{xDBiC*jVxC7XQU@<5d!q{@G3rsjyCM%)B6s-$_Y3_F zO`@*RM8^h39pp!y@%djA2ClM2lTJn(N<{A)Mc?N4y^|6|vK~#H5~Fb|rqMazAtZ_- zB>1v0hFLn6J|vv+BxaF1Hpw}L_8v;!Tk8{cChzAqg{l32@Z}RhJ<3q6n>? z1fx3L(Hi7V9f=J%59_>*iQ-VQEF&M8T*kR8uN-1XT~9b&pzP97`WjAth=(g{K?1@ zE7YCz_DLWR2YgSRp3albaqYp%9qP3ZuU-C3PiY{5YoM6t? zz8-~mk(LBYx)qv9)R09llSwRNODf~vbCT&5n87TNg;mWWp1gl~LUldW^RYmV&t&?0 zRMvSxvK?g#E+ku7J-faun{qvydILafmcvV&EtQ(POOwsQn=M+L{rshgh)m#zmnP@y z8RD+#lErCq#ksntdGe__dD0pWHZs4tnyLr{snMEf(58*QPtzd=8VKZn*DTmr&*izD zr}{F_)HVD5O91OyD*n^USSs2An$Tp~(1PLhtnh|3S62sjc)sUpfd?qx7nv`oR>&cp z8*G*v>RJ#*3yc&f2GJC$^A@FO79}*LyD8~%!;#8N*Yipg{h9k z#3iMuVi#O-CUuD?F8}JP>otLb^~sVZSjiwf{j4Czwkv1av^0#r^rM-ELeV|04XQVx zo+I$IVa@U!>HJnx4P$}A4q6jbLr#y3NsT~!?`e^CX!&VF#W|`1e_G*eTDB`-(i~5C z%dL_qt&+I0l4w&FlV3{qwUSh@>Jhq9W0LY(S`}?$6+OCY^F`%Nl8PqfDrUhd@-$nl zOv(rDY8EuUno>5=dcNwdV9k528lG24Pw1+>;j*0Q8V#H3gIiUkOjROU)w3uH-n3eo z##*`FLjIDPBzU#BZ1o2^>rajM#02Xexz%b9)&AAyLQiVHY!)k()ICSb-c75ngj5TK zfwbJJESNwJTJ?@@_1CrX<5WPME+CtdN)-|-HIj1AvwE(xL>r&_&?~^7R{OKJ-Z`-@ z&<)&B3z~UZf13#sXI`n@ND*-c$)szzI0Z+W8>coxe9kQW((V-qLVzU{*>sK7f{g|; z4SBN0W#-_bP0Nz7dyupGiZqH^L1>2-bi=f<{*`eHNqr;QvMCJ`5Y~`fLfNI&G=61s z(?X!IS9g2EKz+TI1LpUpOX}LfD3ET=S2owFs0k+6{Ozo%m$I2~zFAzWSuLyiIIU%@ zx4B-nMTDdU{=9`?zD3x)MK!C12+*3{+ma{S%1P4tvKzESQ#G{NFp@?|d}VXp>q$u= z$s@fT(AYt1}C$P9mxCKLe%7LMUl#UP0T1*lRenL0nhM zbm4gq&SiPGnpoW_g`pjC=M|!)bsyQApkn6dG@X=k?bPTFO=xG+X@`J$X9Hb(wQ47Y zd&leWPW#?YGiaCIMkf^;1&t0H1XS9B(gM)!8lGt-RQW5s1OH8~@SV22(Rs6z zHl-V&CsZ5gabE5v*K7yPaM11w0Dw%Olwkl^Dtl^#Txpa=kB?ASoJD&A>F*#p$}|AH zSUVXwRh*&S5+j%8Cnuk$-C7_-S#o7_OOwhhiYm@qs-W35Lh^Ozt@Z4bf7slqUa!+$ z5Ix*p2r;aT$aja0mLQN&I0BI0Z-E$OhYi!qk6Qd54{w`v?@xvHeM9w)L1mSN;EnJ5 zjl;nL;r%#h_l8CGmR$c1drv}u{DF4WEp3V;?Lim7z}<#{Lv09NPU9NGV4~cB)%UA4 zxK5(!oOt@d&s+I>rLy-JhI%yyD1?WF+=nJphYq0lp)}h5LCg@T;GiHDtl@l&|u499IS)IEzoLQ=*ZrQyY zPAL{KB6VeRg~tVjM}K;Zn?#I$X&Sef9#txnx)zaS5&D^D3y*m1IL)QDcz@Q1AvoW9LUt^NrMPv=JxoY zz!(AVgdp8O99i$H1XOX^goW*-+~#C8!#F?~4Z0Y~0;2C`A}3+x5q)LdwNNBW#}w?ANpV&-DHCDd_MIZit4nSN@$w+NH#twJo9dQYN>B( zm<%=AlsP^fie#u$o1V7qojzz9|1p#M*n`WM(W-^Xv-1Dbx+d;mY+um&$FdZQqGK1 zHy6+{2Gf@t6ZMaEa4e9JjC|XllWtt-En5%~L2~qub8!~E;S74GTguin#~rZv#A9}j zY;=KPDV=Odd1vBtIx>fB;=wW6yR(DojVdcrp7~a@tg$KO?>|621Pg?Jc+LD*riv;}gH2zKwBQ9SBn6K#1uW}2n zrEshzdX5HIt!XtQjW(8dXssg@CZ7hF(ql8 zGlTkJwQ)Oa!^qT=G$f$5s|_ ztCrL6WDQv|u{9vF(~4L%vfW-w-`Nn^n$(5$D9pggcL1zAOIJ2`I@_jd=d^kEym?_; zw`W&mW}kfOn$(rq-Q(w6*Bja;o!uknLSI^SUB5eh^K#k8WRECgKgMduaDR{Sa{r0q zT4vdHW*>e#y}5o?VQ)KVpEhc*nVf>@@!^%tdGqTJS z?NOZ<%Ab!aZXDw&;TadGiV=ipT^0EpGTy@i7FMly;jMQjP<63UfuGi^oz0k;e_VPd zh4-|^+35B#odu9(5W-)*k2C&87?l~7`l zPZyIm%M}VDuYvm0d|Q!A<+hyZNcp?XbujJ?lnH12FE+QX=-NNoT-7c0E1R1xo~F93 z39>Ar^%wlY)(^h2xplJ26}q7w&&mnt)%Wy&A1E>MKv;SOQ7Z8!Ir=01!Wgd%Spc@m}0<+LHpQdp_6W82cUgo zS5)*LHn;!B?I<7vk0lCpwsY&TF0^wd$V-bSUH8Hj7Z>v`=y8V2uT$*yYjReh$w82kw)?&q<8Jw1?Bp+8SM7_NqBoy4yBo{9w&XV*#yt6|h z+fw31L9Silq)o?z?#J~@)v{c|?qp(5#or%DF*6yw?YjwdSIT88@qgF<(j0MRbB~)l z-YE(nk-qAIbodWNiR`iIi$uLvXW?+SZWX!GYwv)6S=avCYqm{otECI zy`?b>w6z*EN=u1EuBT>s%B=!*ur5Ec>Q`J9vs<`nrE?inX$^}f;%HZDcID5O>sG5z z&7^C_!RC#-_4hX3BP_t|pK+&kyYnfv0- zJTH=!S$UaR>-T)}U4wVvg*>xp@X!O83cl?{{nGH;Icf_ zYyI2$I&3P5e?5EL1H*Xbb)i|=!!)DD9oo_hwkAQ$3QT=s1Ot>?weKp#(ce+$fUhcX zI)|&yMb8{R=W53Bp(&#LA;mVpbS|n#Kbs2TA~z_JaU;WCkPGNA%r-Wpro)%2@@9Rd zi?Pq%Mgp4(C4#Qw)KhnT;}#N9>dqMMkG z1Rm$)cHAd1C7OjBYv(#l9K^D|uL$SJ&L&KGE$*~B9i!a0`GumnnwQ-&%KXU44#rs` z%x@Zv;jj)t|2Q;Krx3$wxYJD8EH$JOlMq{$m(K99B%0hNPUa}jh<`Zx$Jx)%-I6;r zaj-Zk$M&BI&a8XHMjs0`m?xteS(OK_n#`3GdEPCzRsiKrAq$b zPnMU7(?&)6$fXdfI+ugDOY*%pZ|Z$a_}@lWbDDQ=z8tXCA!6ysh*bM4BsR?DGoBWR zsR=8-bic{dT{E4U?jHqm+X?UnIW!SLU*3Hj?DDAZ_eW-e+VQZ^SP1 z`+V4s#vtVixXsmT_ftIYQD)(~Ej9`-kuRW~ax*n3$CfEprAJV0S(vZD#wpbq;)YSz zW~u~O^smVk(+Zcid?*!(Io3XJQ6FHx%c}jh?_dc~>&(Hb;&m_mBSouDEyP-V>0oUx z%A@&Hi2W}Xfw>9&%0jQARiz9aU61B*^dum^i``h1mcAHQ z>jBzoU9U~)-72}&muxw@Z*`ddn3bsK&3C^ zn?s~CuN-!5U~eamR@kVRzKD6C1E!Q(azKa%WZ z%!Kg3X)YZs3UpqxeB19wePFe@Kq6gE>Hevt0am)kIP;FZhq4G=#jL>(7Lv%|@q_`p z0+n{luVksS$B1X*g5~52VL@{dsdW(wHWsQNz#_5JZRuBQQ|Ady(R$3u^4<7jiu2UP z&Onzs5T3QcV&Kvtt4nA!28qdF$g+m>U2Q&}?N3lRVBWSn$Hbdo4#w{>w^}jN_>S=G zUDC?h9lvY+ytk=KnB_{VpKF_}tc3^T?iwW$?Zd z2WA;)w6dw@Q!Tqdcll8vy#d!%YCxsqD8jL2duoh5^iw8btn~1XsGxhgT8E=>Bkwe0 zr^y%=t0Qo(ZRho(^F&;aW5Mk5zAF-#GQh`C_sV!jEb8q%UXD`%>*}$-4|hr~Y_RxC zdkJ?l_X262bAY`!P3137;4UVpaxr7SmWaolpJB&2u#M7!v1*;-s~h`!T}tcD@Rc}b z*MZKSv#3eVwaW6C8c4!H0BYH$C|IN^laDG`Ja`Ll-K|*|wsr$b^eW>~e5lpUWJ=kG zZn0L*E_Wi_(7)wVl+Xjuf^-4JpqsY43D-p|q`OQt`_uU&+e;M9zSgML^ZX~P4G?`? z$0kH9lreexL&No2lJ|+jPY93{5$u%Z16I-T9@AOpU0xizdp-Mz8ASTZ_QIpCnEUTP zW|-ddQthE(?Hg60VwV#d_fQ%OeRS%fj_;unp(Pf9eIg;^{|pg~LFp+m`u?u36Pd32 z@_P?Nv1cl^hgDg4;7<>mQ!j^q2W>jt57dsRgYGmyPxL{LE4T*{T~GkZ`yrhJJG_^| zzgO5xNLZv#)L)p3j)l9d7iYK!cT_lfsn_yI_-$P$lK*$XvZhBK;X%Vb1+Q*)@_r?2 zA#rP332Om5<-ZswJl~)^62c6!M1peA4Cr-V+?PIlWf5frF?MLbKKX#+ST~okD7sTW z_HWTdCL!D2GW1f>&toE%BCR@o&AQ}#N_1lSI|H@|;(DyKUwN}lSaVFv`l6cp{7b|b zp~6}xBFwyO9%%goZ^R9u1D>W%-hARZcg-&Q3+2`})b|MBT|bD^>=B z{;|0sc|)N@qCcU7rgN=o=%{3~cuub+dxeGsfda)AEo~Zs14?G&pappej$AjEJ{}ZnRNr zw0&o^<7PD2dbACVA@62HwrsT5c(BqqxGj976K-?;$A*-9yVBdxzR2u4O7)?SjsYbH zSfz&%#^FPNX=C0IWxkG98JLDL*0}L_AM2R>jZDF(@#Va608n~1yzfL>wpAu-!CH30 zx^*dDc7=Rmi&ZY?X3%#`A_6$>uPwViC$k~LyQv(yT{m&uHxbk)du%nZhtT`w&qQzh z#8mFY(b&Yb$mESk->J2z`iVv4l>x>B;=V{_yg=torU4)rWI5VFqX2>W4->dKd zdZjUJ#z>rJs7^;o*C7hjEJwg>7SSwA{w#OBl8~el+bt8jjnZ}atN@~NSo$mv#hehu9Pj*Wm(~pb{OEV* zIq~^HLAE)`eC4mAb0Uut{3df40dsP<%8K!GQaJMph%?gt%K7QyVvlnwCiBARDvAN~ z>Z0$J_~u{A&hy*MYtPS9d#PyL&g(^>XqKxaQ}-?b=Z!>F@lRCrO;pu!77UzAwQOdM z^A{{v+f8g1tn=s0;FFeH87ss^`+ij$ibbB?1i8mj$Av6GO$JfDh-fMBbnZ9bQn1Q|zwBJVyh2d_ z(oJ|-bKP|0?NSt?#+Q%?*?_2Uw&iP}x)#QAg2{3s;&Ked@-F9cO8rDUn?h3ma{Byo zum5tgEM_XA=2o4C;p%b@8z6VLF7sAn0tHZzF`k`3m6rf0&ex0yh{%7`D4f@v@&}lg z11b?$s#H+&`vGH1fZBku3Y?XC6Rl#3l^Qn5x`dSu<&}o|l~$YO#()*d0Ga96vIw%n zE&VIq6xwL>EA6+6!#7&}^^;wE<%@K{p#<#$UhO{T*$$PqP8;obY~b)Ma1vv9q+VN~ zUmMmq3%qjDK2nsKGFe@4#+xSASvAt0&CofLSxu2rSe##7rFgd#p_9w06I7MYnD8qAa9JYnDzM|>yZ9+C`Kl@9}S$bX6~may0zYVv3}8>@M2*dL3IPs zW&KG94?!;RWkZ-v>_!W#heI#6B&lazJ{KuXYk6P>Fs7UZSwoO4P2K^ zJh9LZ?7`Rzr8o_GA6)bY&Gm?4Hh=%xBt_c7I5YVDcXO>~6V`9=8c83QBcz@T;&(a4f25vf$0sk>@DQzEhb!}zDL8acZ_tI`t&3Q45o$-G~3_cHrI5H zV-JrTcZ0|_oVep1Pa@pr8cptOqYP{}Pi_048XI%%2*7QwORId8P-riJD)l|rIPcm~a zvuFWG_$4L|6$7DT(A#-)xdB2@?Gwt-0t>$ zeRkbD_9sWo$Z@NGPi%RM;kzOo1iF|{ygl%fqw|;B{$oq+l!@)L5E-<05a|;dykLfu zYmU}Y9fN6LFmv$p?jXU`g5rh6AKb$*U9)Uv3v98&fV2I?g~K49L;pw%|DJ=5;=_*} zhl}Hf8Df^cXNRG%L-#k9E{PT)xR&W_2YC%guDX`74d#C{EfNSUNf|6H4Gu~vt;{Em z;?^t+&yIq@mSmV#IvHNScuC2|Ok4IsnjY+LMXNA+yi^lZ=N zY(MbqAo1+5;Owa3?0Dep1Wt1I&d%=6&XLY9aL+F(&#&0euf@)9RL^fs&+lB$L4oJ@ ziRTXm=ir8O$iO*t;rwy$9Cmm9gmm!&@8TuZ#Vd}B*WwolY8QxR7f7xb$UzqlIbd6?M`TP2m-7IRUO&vt~nRaIOH9<8Xb=d9GN?> z`I63fNger-o%Zh>zhT`7shtVxISQLGiy%9SiffB8I*Q|clSp!E%D<87tdt&f%9_8C zeJYa!If)^{d2WdUl`|#VtvQ{X;8e9FJlF)+w&)5(o5>OORGG~~%KZ1Fy}&rN9kKFaRi75O2C)GdbUAiK^Hng7#AaM#>} zud+y>``@l5LS6XU`6_euo&8#n?VrVZEy#K#z_P>lZG)R}hk^R~EjIWS`hQyg7Vw3n zApGC1R0Ifo?f&N)?|+K(!r%UPW!|)Z3-W^NC;w}N_y6$`Af$I2a&`A#v@Znu2w(pm z)rB{9|0j9gq~xT3&o2L${&KK&+J9{>|J#vhbTC2)T!{Z~U;m*r{ohLSe>wO+c=P|! zp8tRPHQYY8qW=F~;{Od@Vv9fi&s}27R|+B2q4%4ibUg`%p;R5}hGDD=Zi(S6{Qh4; z*zXQ<)p#QDjiM=G<~uRU?>=rt3z8k~#L3WTsPVXy`xf(c1`S)%Dz|*I?+Mg(lXa!skxJyDML_M7N?lisn@LS@_s$ACCMh+*X1ii zRZ7jxY144VabAmkVpxUy3CYLvjI$0a>-PAGu;`AvSA%w)FBU;|T?ogacHJlfoc2BF zS&jC+Z^J8B;m>FUy?sZLq-#R$PSb3vlS4D;$(rq1;mt{Bd< znZHkOmuzk5zbu>Yo7{z2H0mq@m|Ex?!wlmzK|nW0L=IS}J1ApejSEbFum0kp8eSGE_+vp2}T*zLMa9j>Cn((dEyio z*Df(5?0(12wfEtm5H4Fz8qeY94Kj9u^~dd=?X$1%BlsWttW7Gy^!;D#v&`RDctc%C z-2d2T1gd}O662SB@_IGYjR}tOB|*ni&qgTn5vZZDJ*vcM>sQhMYQ*VHXy4ej>XJRUga2ZFCc) zP`nJ=k0Zm+q8|8`8sn|HlS8mLG{BBI9cD&ugtg7t&ph)j(!wd11l}d)r+pjgdXr83 z+Pz2c{Z$xzu1$tFEJ63`Dw>^@oSct(Sd#f$OvG3oB}a3QxaLp)1nAC_5RDYEVQk#9 zeg1GTtmqOQU(rWOXJpZ%RPo#;HvVeCHNtiEKBxnlPedF$YDiEU(~4~hGcA?@eXC7* zQMdc8P*PUB138rl4xVQV;X_!ZfO+&n&dOvNyPnFlHIYKDeX4N>xP8W_+vm>3A9H7~ z&b)(R8}Mwx?KAg}%!eIH{?}4He(za-L2e3#@T9(95#40}W1l@Mh3M@BiugwD7OruR(dR^ zOyh1&KH4RJ=y?X%k07OozC-&=CI5HlGgtW39JhKcG( z*D)iE-g`ghit6Z~@J_<(x=i#KY-(h!xG_Zj_g4j@)qj{BhVB_9gyW=HT7= z$3kDZx*Rnkb5+cispyLHY`c~NDJ_ED2(gWfFXM;ja;f=AnDs?y>4&dvTV{(?&kEJJ zk5pSzJM-B$ij`!K0Tr70l@qr`Mmk*@i{Qngc4sMPS!?O*mh32`h8m@>*73NI$ zB(Dhm&*~7s(nLc;fXyiE_)|TP}zt2a}i&jjn53AW;C}GmqMr+i<$fnVhVzL9&rN@l-KaD9->{a%~Z$@_$rO6rv`S;0#b!4^S=oDOF@FbKtLy5)iRZsD>YC$Qfvi;*Dai$cy5s z-4uv{>#w&&Xo4T~lQT#uSWmMd!1~~iE{aFDV35y!(63}aGkitYqCj`IVAxZAkQo(` zAG}L^ADn9zq!AbtJme9|>FJFUlG+rKe(x9?Y!a^?66hK-Fc_TS77Dk|w;aKrRDxxx zLaR{hzu*K^XFuELrURQSHxPRS&(wf40w(L!qRicAIX|MC`)vQ^IKj zBi=2&V-dl}e2DpE;SOs0^+7U*z%&LqF$$I+^ZDQ%F&F;lkFYrAX6G-<9uyX__<^x{ zK`}G~vCIdt%sVkGT=62!KiQV`XhY&4`EiJe@l}b@-9s^gsBxki397^P;;3F6#qnqZ z@lJzrBzti+ckdW!@YUQC&6jO8n)T$0<8@Ppt9EQc$86c$QJgxlv9lo%4{7^L9@ z92#MtVz+Siq~)P^CLi%Vnv=t69K4nl{(N-&wQOML?&dJ8Z@6q_%#~oeoSYewWX0v3 z#Fc`mn(}fX5uA`RgcR>0nUM96s`@e2=2t4EMQSQX>YIYp*@l$z<&>(2G+~;wI?0#@ z$yohmgBH~HA*lFW%jwKC=}nTUuT<07-P5&9lLeWL?uF(^zC8C#JVG zXLcNBp|?c5piOzj{r4Mo3c;Wu%1G*)k&HDL1R_8-2{`)`K@J&r4!LFyrAH1aZ6I|^ z4jmweVI+qZoCD7hvwGyze9V3i{vKGB%L~Zm2j_kV22m|feSQ3 z^X<6{*=P%$JPH{A`MRO{<|PFdQU&U!1!&WSFdu>f>mwZ7(85qaj!R2XBzH~(xG450 z+oPorNvtR!HSd>)$?uZ4$*ILg;6Uq`qBzYG5`y9aa8XfeNf?|zOX+95DG_KXmRTr9 zeOFpTo0rpq3*Y34YbojQDC{CAb37`k*RU)be4{^AQZ`m%JmK+nGqrSf1ZRGv+^MDfL@FO1{`qlKzJ8>)Pg}a3YP@Ut z7WAg%um$Iswh}-P_$sXMQnQLhs`7S3?=iLb;f?t{S7Kj$*)&1P?mh0yuqqXgDuUx2 zIDe)qsX{B&!_X?iS}}rXzNI)Wd@6zAd_=2Jl&WGX%_rrlrKGL-(pqEbQNx>9gOFY8 z+fr(IS;PJ{mrbiKnzmMgFrTxv>igFM-c}=ip11N=MM7z~BCT~yC3Tuwh1x6isE}kL zwi-WFK^&`UERno-r70h*8q9b~)xvN!&>AQ`>YPTi;rv-vt5T)4>|I_%EqOsXlMHJ3gOCuF7R6SztLYl{wH^B{M# z1VKGFd;KfF7W0)TyO%9+`&gfY^S6(y zCRXCMN}Fd|Yj=76=@Peg?yq!kf;%V)I}NxxZM8b-JUb1$JKwZ*q0_a(2(w>!b!})R z`wyl4&S!6_YLv{#j&cZ;j{$JeeQ$u92HUeWY!>z93U(7qqxIYM+9BG&b6yj>h8 zLhxQO&k3#qeA^V-uOySIa?+^g)u#az(z5Q?DeE?X4%nac81bf<$TXXIWmt>}Sy>O* z0Q(%EgRoz1U5@C<&gm^;;e%vs!k*TH-fg&k(4pw`jz41w0nio<><;%fp)l(qnUkRy z=FI9l*A(blg6o@tN?d0U6UFui_@)n02}&K&E3d9CwyzVoRoM zUOW1whsg+0TiV?C1!Uap+r$OYQ#IGE^i1@ ziQ(bNSnAv)H+0gLcM8s&Sv9Brx=qm}POZ02p^x`to({f$oc?5!dvo&h&U%_8aC)r_ zHcdD_NPIf{`EiCxw)l&;6NOC{U*ODX+057R;RvF!Z;!K#veRwmGw~^tJgXzeUUR&w zGyE8Ha>Ua@5#g7^#+(t|+~sr9MD1sb3lMXS{9k#DEyb z*1@YQ2d(R{^7Z}pwO9NbCy(o`k85^(u2-__=$LsiHaL|w8}DJOTYQ_i{J@uT8w6)S zJcd;kZ-qVdY`LZl4Bf4=$K`pg9O90xPMu9U*j7WvCL#a!FvfOG#D>!8A9C9*4A_Rs zyG?eIo$AvqA=_h75H(Ke0J&NcFfl{H7a%qCU##-D(d+-SW)j8bpT8laLhXPV0aaKUi_OjXM3+P z_pwBxkuo-P&GudSm ZJYoCq&-SBX>wXLe$Fc{Q#s@eN2NHz`VYUnIBsfw0hcNoX zJj{&)t3yeK9chLw*@MHZin(k|oLrxy2b-e?-L-^@ql1V;jJ!kP@k2)B*%muEB zUwsv)k7K8Do2OeOt7H7#aIZjdwXBfDQ=XI=4TjSfy=eszhsWAE!PqA}chU3^bB;I=Cs z!5d}0TUF8>F~)X@$~7rQMH$izYOGsIhFfljTT|aV^QX&KBv)EdYdZ45Tv&HJjCW3Y zoyJ)oEV4izouIai+q9KCTSj3D(lFVlMQ7i8PcIN>HwgYbituw#0NVY;<6SvEsE6b( zSbk5S6FYMKA=CFZ`l%sy9T-mc5T>Q)@+3@4%|LNJGV}=N?#cK zW1pY9#P*+%0x^jB{qd(iV~66<>-x`#J$H%!#Xd{KQpoxc#XNV3zsNPjP)|?&XZ!rz zB^LD^2w#%@4_)G1q^^JO68}g0yxI{!h*v7~N6dYuKMjvjvBT>dto&XPZl41%8ZA=P zcSk!gPx+tiGrUV2#%^n_@=ur86&6SM+$Dat&l#Gx8tt#>C#{LK*i8W#FJJSgYk|(X zLvdIN9yOosbA&*}qsGI}Jyo@T?Gn#t4dOCrd9DHK?Vfg@yTlP4A6^f7X~XUF=~pT{ z5Ak0oT1l8?lnNeJ~;zp8tSvhQur8~Q(X z{8$1`wgUfji9b{xM=_vLO;qk=V!EZMJ2twf`I!zV@@kiaixmS4ZXL7&eupTQ~`Ix8m&##UAc z8plxCR%KIF%Zj#1s9`knHrHEX0 z7-Fg-d;3rnpeCkClbmD@JK1n+ zv6zzxV3+GmcxTnz%Ihjx@%f6osFhTx`CHAf7>|ATw(`o0$`uzL`6i5X!s9Bcm6hr? z-_W+~4hWd%u$yC_cen>joal9lcumV?1}RnCfhpBu@y|ep{jZLBJcaEpkNjqYm(!xO zt2dDfQDe^N>UyfTEjqFqE(tbf9S?{0gt}e{>wHKg%$p(S7LdgORT9-|%g>!& z*OTG`-nWZpo!+2z0aDZZ{lZQk$e~$>{Q(P3H2C;QZ|Vs6rJWiz{MR~<<~=Njtpma~ z<%i{!1^vV+_(q7y7wnlD4=&_<;qsR6_-Oj2nsL`uHzv&+IxThDCL!Dj`QP;Z2I%9i zg6N7ee;BT^ke%JWylfEn$0hr`C4>I~yCckxS;P=cFIj|AE;^8{Zvmq?zL!|F`pdGg z9IEhAZ#r~J1C=f(H*!gYncY6bL?jo@23eF4VDU$##*nCTsQ=dOQb5ppL=_4c~p&B>GHzjVQVE5D`^P@Z~d`2EU+fY;+*6ap?PI z8cb&9$Vk>uVr1&!FomnI;nqC-#{)@um)JyK1QY5;mJwb0nRpVBT@!7XySVCtNP_t* zBf7BoVXap)iQ{xe49+x!x-O$hoe26&8mwa~B=Xik5lXs*VoFn?4-u2BR3GxW#utjcSmi6laYT2bv3h7Sx6u+!UfO4$D0?y$i|@r(z1zNcUK9$Y!xP_|o4j zPj<`lR|4TcG@(iC_uXK|$3JF5gdFnOA~&3%It~8MLJB`86my@vmZfutrz0)*b2-q8 zC3eMT($1PdJN?-n;3}29EqeZVDlhlkO?`{%Kt5yE7ZE7l=p9u&B0aS z7uTUhOdwE2#+)l|W(Ejua?V?;;`j;m(W1sATtM}@QZTq5j9{WM7-Ig5Lz}q<2{@1!^ zAsj9{5%5`Xs~$`-sXfohj(2mE;vq1oqp$WH^>Q>F#=g{z)o|kLDY>MF=_ZZ1H}0pA zq)*0hU-uTtAy_nB4pl3zr=YGXk*SRkLq4+C^TyszoYx3Ou-Ftr;j8A_-gGhuIR9?;DMn3htTBE~E;nHGFZCC=HKXj-214P;8EBHJgP(U?qp{l@&# zx>}gUe=_~0QyxWzt{@dd*Agr1?-T80Q5MbFd~a4|NKW?m<*j66k=&G^cT`h-AJrU4Fo~#MJ{62oc-Vi==2@9kX;PBvaLg3G-l1-c9eEhP%3Stp z{^1S!YQc~amPNjEb>=>ok2#d}I)e;yhcO+-a6JvcJtS&mUrNYy$|UFA=g#r~%ro?s zXb~TGPJ_i$ZDYebBUcS8xfZPq?`m00PJNM~2rHO3jagJ@Bq^SfNBnKAo^9JykbAex zj?*r9m-w2HcLdG%Z||hSIjdi@DjLakeh{qohHKMvJ>jSOLL-THO4R+H#*F)97Hn5n zt#P}z0#d#0O;xPcejKpwv9zys$CC3X_Fg`=U&|TL8U&U9wGP@;>%8j616@Mmy;_!G zl-Xt{`-fZ}(_sRQ9Hf;;kG9@-rNofY1)s#Gb?=%d5)e{l=i#-y{k8nl$tm*pV$V+H z*QjRFMZ1I{dsb}+e>(og@ZYpD-fD%u$m_}={4Vr0N>`d60UH(3ix=6tt0JUL;bncg zBdNsqZfxc5f3?s4-T3j{AGNz-Io*VP-9&SOL^3tRH{GN+-Dq{(7s&$L+r^b}ndHhs z@1R|u->fzb9>Aq?`6FJtW#BEl3-9b;}i z{9!_j{=%GXJ)C*MbUQuVeZ9EYJxu7_XDmWjMlGz^BCOiN;#R`c##y||eWdBVqE3DE zA~oXLeSAB;rG&jdSx{N}It6z`yfnY#^N47A3QLmr<5~A9iu7Z*^(x;8NtN|I2%|IC zaeklcl&cf9r4i9U6IGBAQN8I`x)D{>?$_@VQri($hYDYh_G=l7A)W9cuJo613L1)t z>gNrJ5)D|z3mKsc8^`x2UU$S<4mhO8YKIRP5{lY5iC8HQa*qwT00nJ{gzWl6e9^?W zKf#|tgz3mDUXm>422&PsL6Bhd8uV)uba!f%uFI6k6NSwV2JN)B^)~x>h5E8eaAOaJ z)%8luNf3)j^e9P$8cCQyMS@u+ee#9^qz5BUdcut*Y3PQMoVugt+M>0aW7@<6nTIp_ z(qijs;<4)!;)iLShO>d)$*fX1dBaP!!`Z#VkB-!t@lpd;J@9aG-En^&xfE<>B!ai5 z!oNEoTUY=(P(CWTl{```GF-aDo{cb?yED@0FBus>ii16RVl`6c*b+FFQwJQbHy%ZG z8f|Io&LNjk${X$V_iy#@Z1Zm|yx}9g8tuFpW28`E8;6ce7|XmOZ!zW_ z-AtAlDU*VYwvFW@b zm&$>fCjOwvoyrKD&7oiBO@iy>FUcnxBqtx?UE(~sj=6+8)?mm@zPtBB0^ygv%{r!a4)uudhA>p!BxyTtXfZ%nYzC{WNTQifN4 z)AdNL@4QI&kC_A@X%xOjw|6VDcKw89?z6c8xpHS6aWS?6ga z=XLldRd6EJ5LMO3e{7|zEVMn_=jO3_+|7B@2su6P2z_sr`|vKqh*0DH1?z-i6O6a; zw&g0qlyZ!!TE41zoodn4f|H7x_!yfl-?(eQqFaJm8kgFG`l4sQ8l$xuAuMCj=XTK- zQT<2xV!_bjZ#MN$K(%(1r2rGSeO~mliTsnW6q3>Hzl#aC&*Agx-u~))f1m9$PTf-b z(o!tja-3{Wq)ueCiAE@~M$7l*rEjJF9Yk%|2pf4nsU{=&!Q%UNt9X{X`o6adfF zW&am|JQYAJj^-papm2U6S2Q?3A5em^R6wj*G!HOJ0Q{+Xw$HBpniETan)3Myw%{t2 zm3p?}>Q(gGfE7v6mEZa+E%hr}PAd=LEA5Z7%@o0{h`=tDp0@fo9c}S-P{v4wZP4_LAKS|i0*kD`KyfS1)D;W=C!~F-5+gvcl0{D6vHe| z>lYMDm$$1|j;=7h$JgW{H@3&n<#hDs4h`&64z(6+Z+HJd|!02GFKyUHq*Zt5VCJR zeBZqLVc_a+z#g7YiV48%(4Udkg#;)-6LcSS3}N{&-6tH~7m=G}3Qgu9(wrILiV0n;uCeoPu>=~Qif)ky3SJ}1%S0;N%!g5TZ>w)^ zgEDr|?=}@&cBJ;S1sM#4bWMc$4MYm`MJWx%3fAxGbAB}FYYuEERTy)wv2(#pxNR|c zRHNhrakLlol`7V80!LE9j3KushObR6a836}9{&$r%wR)7nqqGOLi<|CzY&&c5nO(#Zzr5iWO3-nRIj3^Wb}`@e7xJZ|@KBft3! zF#7u>{kGjPAvp*NG*2)&(B#*@QZzqkIWSK-&~Z5kzB`Con~GpJlo~MqX>1nfVy2EM z;)V3wCDy?{r1dc!8i7Ao{!l&SP$2U#Y40#Iu`3bHs3-;eLvR`+H`KCvR z!j|dD2H4D&&SDk`?njdEj|vu!%Gt|HZS%|4wo7!YigiC!n(9{V9o4BGOEVw86thww z8H|fOjz8NO@!zZ;IBsJoX;9s0^x0`%Gpjbm?||udE*$rYS(|@8DdN}dZZIEoN$OWU z>MJ-IIa_a$8*e4C8rq|;QT;H?ZVelScZpRory|WluTHY}tov0DHOWn8;9cT{%>|dC zjJuLKIis#KGr-yCY~txUl5H`Q%}Rmgs@%c+fW?}NX)NZmeJ*-Yw$Hv_8wl7vGd!4lWSAE->T=J#PfQW^M}lNIDdxvSU?x- z&UVgWNEbn{^A~2LaQ^(7$_&n*eUvW{T`x`}&yhRFkdiLm*lE6Lw7>1WK;OS`T)n_l zYl8FVcc60=Du-nD%MWS}Sn`)RPls^+jL+y$7<(y1r5oX0;@iSxXBqKZ-9dmJo=ZFBT?yx%VbGGX z+FhNgOR?LXDdU29l1o8>iyqdUCFzpYqD$u9UBUgGZReOh9w>^^HJ=moQ-0V<4df^1 z>S6~n_XoMbvi4mkT|AN|-3MKNHn=LRgSCpibHxw9EPBnk8- z7rseNa?h)NNKE=kHL4st3deJG1cCy}F}dSbnghO1C||xZ`!Nvq4zoq7U1p z&nW5BIpf2Hfb$K9ud&+GEmrQKfG0>Ee3#^l`1>ip^68`y1|4(*H~Ksw2iv|veotq9 z@u|oE4IZ=g!Nupk;P+IDW#*S;1K|W5Kb<%az6?c^Av@DqT#=8&)2h{2A6`+&#D6jS z9c~d#DVxUadUbMmO*QpbDCj-Crp46AE^uyZ2p?t+c#d6DA+J!RB#-FD!08YtJ zp}v&|z11BZpw4o!#^!k8SiOdK+sDfa#IV-p0lGRp22tt6^1Xhdx4viE>I=nVA(3)p zS{;a`QmU|iU^Z=x+83KRd0;u1$`OytY;xZ}oGDSOwLJwp1LoLGdMj)o>}S9h=NY*r zPmYU?o}dqmXRWp3I|E59c4tucy>;Y#;Y!;_?zV!WM-N1pqOt--V#{wdyvo1?{A zyr_;9$lcZcY^5*6+Y15)U7xSxcm9N-a(?ndyh7C1Mxt%{^asN>U_%{Kit}>-&dyn+-LMS_Z^J4K>~CHzszIvx)c$p-K{@D!6&cgj?Y zl4i;@o0bR4bcYcxstjjg)gl59*u{+7{~E2yQTSo(&?x O3!eX#WcdHFbN?^Do3}jx literal 0 HcmV?d00001 From cae75299edb936b1451a0e31c49be4295314e4a9 Mon Sep 17 00:00:00 2001 From: Nathaniel Lyra Date: Tue, 13 Jul 2021 20:02:38 -0400 Subject: [PATCH 7/8] Removes error from merge conflict resolution. --- frontend/toolkit-webapp/src/components/TopNavBar.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/frontend/toolkit-webapp/src/components/TopNavBar.js b/frontend/toolkit-webapp/src/components/TopNavBar.js index 1a15c90..bc073c3 100644 --- a/frontend/toolkit-webapp/src/components/TopNavBar.js +++ b/frontend/toolkit-webapp/src/components/TopNavBar.js @@ -401,13 +401,6 @@ export default function TopNavBar(props) { const handleChanges = async () => { - if (data.user.roleID === 2) { - setNumUsers(data.numUsers) - setNumCourses(data.numCourses) - } - - setOpenDialog(true) - if (user.email !== newEmail) { if (newEmail.indexOf('@') == -1) { alert('Please input a valid email format.') From 3747731a1628aef37844bcdde2238ac1523c2c71 Mon Sep 17 00:00:00 2001 From: Collyn Lindley Date: Wed, 14 Jul 2021 21:32:50 -0400 Subject: [PATCH 8/8] fixed course count on dashboard issue --- server/routes/courses.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/routes/courses.js b/server/routes/courses.js index 2d89ad8..7a58a25 100644 --- a/server/routes/courses.js +++ b/server/routes/courses.js @@ -175,7 +175,7 @@ router.post('/info', VerifyToken, async (req, res) => { try { let courses = [] - let totalCourses = await Course.find().countDocuments() + let totalCourses = await Course.find({isEnabled: true}).countDocuments() if (req.body.search_query != undefined) { const query = req.body.search_query; @@ -192,7 +192,7 @@ router.post('/info', VerifyToken, async (req, res) => { else res.json({ "status": "search", "courses": courses, "totalCourses": totalCourses }); } else { - courses = await Course.find({}, '_id name description urlImage categories', { limit: req.body.cardAmount }).skip(req.body.skip); + courses = await Course.find({isEnabled: true}, '_id name description urlImage categories', { limit: req.body.cardAmount }).skip(req.body.skip); if (req.body.newToken != undefined) res.json({ "status": "loading", "courses": courses, "totalCourses": totalCourses, "newToken": req.body.newToken });