Skip to content

Commit bcf7677

Browse files
authored
Merge pull request #214 from makeopensource/41-add-assignment-modal
#41 - Implement add assignment modal
2 parents 1fae3e4 + 3606fed commit bcf7677

11 files changed

Lines changed: 256 additions & 226 deletions

File tree

devU-client/src/assets/global.scss

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,59 @@
6969
border: 3px solid var(--btn-delete-border);
7070
}
7171

72+
label {
73+
color: var(--text-color);
74+
}
75+
76+
label>span {
77+
color: var(--input-field-label);
78+
margin-left: 3px;
79+
font-style: italic;
80+
}
81+
82+
.input-group {
83+
display: flex;
84+
flex-direction: column;
85+
gap: 7px;
86+
width: 100%
87+
}
88+
89+
.input-group>input, .input-group>textarea{
90+
padding: 10px;
91+
border-radius: 10px;
92+
// border: 1px solid var(--input-field-label);
93+
border: none;
94+
background-color: var(--input-field-background);
95+
color: var(--text-color);
96+
font-family: 'Source Sans Pro', 'Helvetica', 'Arial', sans-serif;;
97+
}
98+
99+
.input-group>input::placeholder, .input-group>textarea::placeholder {
100+
color: var(--input-field-label);
101+
}
102+
103+
.modal-header, .input-subgroup-2col {
104+
display: flex;
105+
justify-content: space-between;
106+
gap: 20px;
107+
}
108+
109+
.modal-header>h3 {
110+
color: var(--text-color);
111+
margin: 0;
112+
}
113+
114+
.modal-header>button {
115+
background: var(--input-field-background);
116+
color: var(--text-color);
117+
border: none;
118+
border-radius: 5px;
119+
}
120+
121+
button.modalAction {
122+
align-self: center;
123+
}
124+
72125
body {
73126
font-family: 'Source Sans Pro', 'Helvetica', 'Arial', sans-serif;
74127
margin: 0;
@@ -97,6 +150,8 @@
97150
--list-simple-item-background-hover: #a0a0a0;
98151
--list-simple-item-subtext: #4b4b4b;
99152

153+
--modal-background: var(--grey-lightest);
154+
100155
--blue-lighter: #74b9ff;
101156
--blue: #0984e3;
102157
--blue-darker: #083967;
@@ -112,7 +167,7 @@
112167
--btn-delete-background: #FFF;
113168
--btn-delete-text: var(--red);
114169

115-
--input-field-background: var(--grey-lightest);
170+
--input-field-background: #fff;
116171
--input-field-label: var(--grey);
117172

118173
--table-row-even: var(--grey-lighter);
@@ -122,7 +177,7 @@
122177
--yellow-text: var(--yellow-dark);
123178

124179
// Non theme colors - will not update with light/dark toggle
125-
--grey-lightest: #e5e5e5;
180+
--grey-lightest: #efefef;
126181
--grey-lighter: #c5c5c5;
127182
--grey: #555555;
128183
--grey-darker: #444444;
@@ -169,6 +224,8 @@
169224
--list-simple-item-background-hover: #626262;
170225
--list-simple-item-subtext: #4b4b4b;
171226

227+
--modal-background: var(--grey-darkest);
228+
172229
--btn-secondary-border: var(--primary);
173230
--btn-secondary-background: var(--purple-darker);
174231
--btn-secondary-text: #FFF;
@@ -183,7 +240,7 @@
183240
--btn-delete-text: #FFF;
184241

185242
--input-field-background: var(--grey);
186-
--input-field-label: var(--grey-lightest);
243+
--input-field-label: var(--grey-lighter);
187244

188245
--table-row-even: var(--grey-darker);
189246
--table-row-odd: var(--grey-darkest);

devU-client/src/components/authenticatedRouter.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React from 'react'
22
import {Route, Switch} from 'react-router-dom'
33

44
import AssignmentDetailPage from 'components/pages/assignments/assignmentDetailPage'
5-
import AssignmentCreatePage from 'components/pages/forms/assignments/assignmentFormPage'
65
import AssignmentUpdatePage from 'components/pages/forms/assignments/assignmentUpdatePage'
76
import CourseDetailPage from 'components/pages/courses/courseDetailPage'
87
import EditCourseFormPage from 'components/pages/forms/courses/coursesFormPage'
@@ -25,6 +24,7 @@ import UserCoursesListPage from "./pages/listPages/courses/coursesListPage";
2524
import JoinCoursePage from "./pages/listPages/joinwithcodepage";
2625

2726
import WebhookURLForm from './pages/webhookURLForm'
27+
// import AddAssignmentModal from 'components/pages/forms/assignments/assignmentFormPage'
2828

2929
const AuthenticatedRouter = () => (
3030
<Switch>
@@ -39,7 +39,6 @@ const AuthenticatedRouter = () => (
3939
<Route exact path='/course/:courseId/preview' component={CoursePreviewPage}/>
4040
<Route exact path='/course/:courseId/update' component={CourseUpdatePage}/>
4141
<Route exact path='/course/:courseId/gradebook' component={GradebookStudentPage}/>
42-
<Route exact path='/course/:courseId/createAssignment' component={AssignmentCreatePage}/>
4342
<Route exact path='/course/:courseId/gradebook/instructor' component={GradebookInstructorPage}/>
4443

4544
<Route exact path='/course/:courseId/assignment/:assignmentId' component={AssignmentDetailPage}/>

devU-client/src/components/listItems/courseListItem.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const CourseListItem = ({course, isOpen}: Props) => {
3030
setIsOpen(isOpen);
3131
}, [isOpen]);
3232

33-
if (!course || !course.isPublic) {
33+
if (!course) {
3434
return null;
3535
}
3636

@@ -47,13 +47,13 @@ const CourseListItem = ({course, isOpen}: Props) => {
4747
{infoSection("Semester", prettyPrintSemester(course.semester))}
4848
{infoSection("Start/End Date", prettyPrintDate(course.startDate), prettyPrintDate(course.endDate))}
4949
<div className={styles.courseVisibility}>
50-
{course && (
50+
{/* {course && (
5151
course.isPublic ? (
5252
<span className={styles.public}>Public Course</span>
5353
) : (
5454
<span className={styles.private}>Private Course</span>
5555
)
56-
)}
56+
)} */}
5757
</div>
5858
</Link>
5959

devU-client/src/components/misc/globalToolbar.scss

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ $font-size: 16px;
3131
text-decoration: none;
3232
color: #FFF;
3333
font-weight: 700;
34-
height: 60%; // Centers text in navbar
35-
line-height: 100%;
3634
}
3735

3836
.bar {

devU-client/src/components/misc/globalToolbar.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ const GlobalToolbar = () => {
2828
<RoleDispatcher/>
2929
<DarkModeToggle />
3030
{
31-
<Link to={`/courses`} className={styles.link} >
32-
Join a Course
33-
</Link>
31+
// <Link to={`/courses`} className={styles.link} >
32+
// Join a Course
33+
// </Link>
3434
}
3535
{/*<Link to={`/myCourses`} className={styles.link}>*/}
3636
{/* My Courses*/}
Lines changed: 70 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,77 @@
1-
import React, {useEffect, useState} from 'react'
2-
import {useHistory, useParams} from 'react-router-dom'
3-
import RequestService from 'services/request.service'
4-
import {Assignment, Course} from 'devu-shared-modules'
5-
//import {useHistory} from "react-router-dom";
6-
import PageWrapper from 'components/shared/layouts/pageWrapper'
7-
import {wordPrintDate} from 'utils/date.utils'
1+
import React, { useEffect, useState } from 'react';
2+
import { useHistory, useParams } from 'react-router-dom';
3+
import RequestService from 'services/request.service';
4+
import { Assignment, Course } from 'devu-shared-modules';
5+
import PageWrapper from 'components/shared/layouts/pageWrapper';
6+
7+
import Card from '@mui/material/Card';
8+
import CardContent from '@mui/material/CardContent';
9+
import Typography from '@mui/material/Typography';
10+
import List from '@mui/material/List';
11+
import ListItem from '@mui/material/ListItem';
12+
import ListItemButton from '@mui/material/ListItemButton';
13+
import ListItemText from '@mui/material/ListItemText';
14+
15+
import styles from './courseDetailPage.scss';
16+
//import { SET_ALERT } from '../../../redux/types/active.types';
17+
import { useAppSelector} from "../../../redux/hooks";
18+
import AddAssignmentModal from '../forms/assignments/assignmentFormPage';
19+
import { prettyPrintSemester } from 'utils/semester.utils';
20+
import { wordPrintDate } from 'utils/date.utils';
821

22+
const CourseDetailPage = () => {
23+
const { courseId } = useParams<{ courseId: string }>();
24+
const [courseInfo, setCourseInfo] = useState<Course | null>(null);
25+
const [categoryMap, setCategoryMap] = useState<Record<string, Assignment[]>>({});
26+
const history = useHistory();
27+
const role = useAppSelector((store) => store.roleMode);
928

10-
import Card from '@mui/material/Card'
11-
import CardContent from '@mui/material/CardContent'
12-
import Typography from '@mui/material/Typography'
13-
import List from '@mui/material/List'
14-
import ListItem from '@mui/material/ListItem'
15-
import ListItemButton from '@mui/material/ListItemButton'
16-
import ListItemText from '@mui/material/ListItemText'
17-
//import Button from '@mui/material/Button'
18-
19-
20-
21-
import styles from './courseDetailPage.scss'
22-
//import {SET_ALERT} from "../../../redux/types/active.types";
23-
import {useAppSelector} from "../../../redux/hooks"; //useActionless,
24-
import {prettyPrintSemester} from "../../../utils/semester.utils";
25-
26-
//import TextField from "../../shared/inputs/textField";
27-
//import {useActionless, useAppSelector} from "redux/hooks";
28-
29+
const [openModal, setOpenModal] = useState(false);
2930

31+
const handleCloseModal = () => {
32+
setOpenModal(false);
33+
};
3034

35+
// const[User, setUser]= useState < User <string>,preferredName>>({})
3136

37+
// const role = useAppSelector((store) => store.roleMode)
38+
/* const fetchUserinfo = async () => {
39+
RequestService.get< typeof User>('api/users')
40+
.then((User) =>{
41+
setUser(User)
3242
33-
const CourseDetailPage = () => {
34-
const { courseId } = useParams<{courseId: string}>()
35-
const [courseInfo, setCourseInfo] = useState<Course | null>(null)
36-
const [categoryMap, setCategoryMap] = useState<Record<string, Assignment[]>>({})
37-
//const [setAlert] = useActionless(SET_ALERT)
38-
const role = useAppSelector((store) => store.roleMode);
39-
const history = useHistory()
43+
})
44+
*/
4045

4146

4247
const fetchCourseInfo = async () => {
43-
RequestService.get<Course>(`/api/courses/${courseId}`)
44-
.then((course) => {
45-
setCourseInfo(course)
46-
47-
})
48-
RequestService.get<Assignment[]>(`/api/course/${courseId}/assignments/released`)
49-
.then((assignments) => {
50-
console.log(assignments)
51-
let categoryMap : Record<string, Assignment[]> = {}
52-
assignments.forEach((assignment : Assignment) => {
48+
RequestService.get<Course>(`/api/courses/${courseId}`).then((course) => {
49+
setCourseInfo(course);
50+
});
51+
52+
RequestService.get<Assignment[]>(`/api/course/${courseId}/assignments/released`).then((assignments) => {
53+
let categoryMap: Record<string, Assignment[]> = {};
54+
assignments.forEach((assignment: Assignment) => {
5355
if (assignment.categoryName in categoryMap) {
54-
categoryMap[assignment.categoryName].push(assignment)
55-
}
56-
else {
57-
categoryMap[assignment.categoryName] = [assignment]
56+
categoryMap[assignment.categoryName].push(assignment);
57+
} else {
58+
categoryMap[assignment.categoryName] = [assignment];
5859
}
59-
})
60-
setCategoryMap(categoryMap)
61-
})
62-
63-
64-
}
65-
60+
});
61+
setCategoryMap(categoryMap);
62+
});
63+
};
6664

6765
useEffect(() => {
68-
fetchCourseInfo()
66+
fetchCourseInfo();
67+
}, []);
6968

70-
}, [])
71-
return(
69+
return (
7270
<PageWrapper>
73-
{courseInfo ? (
74-
<div>
75-
71+
<div className={styles.courseDetailPage}>
72+
{courseInfo ? (
73+
<div>
74+
{/* Course Title */}
7675
<div className={styles.header}>
7776
<h1 className={styles.class_title}>{courseInfo.number}: {courseInfo.name}</h1>
7877
{role.isInstructor() && (
@@ -102,22 +101,22 @@ const CourseDetailPage = () => {
102101
}}>Gradebook
103102
</button>
104103
</div>
104+
<AddAssignmentModal open={openModal} onClose={handleCloseModal} />
105105
</div>
106106
</div>
107107
<div className={styles.subheader}><h3>Assignments</h3>
108108
{role.isInstructor() &&(
109109
<button className='btnPrimary' id={styles.parallel_button} onClick={() => {
110-
history.push(`/course/${courseId}/createAssignment`)
111-
}}>add assignment
110+
setOpenModal(true)}}>add assignment
112111
</button>
113112
)}
114113
</div>
115114

116-
117115

118116

119117

120-
<div className={styles.coursesContainer}>
118+
119+
<div className={styles.coursesContainer}>
121120
{Object.keys(categoryMap).map((category, index) => (
122121

123122
<Card key={index} className={styles.courseCard} style = {{borderRadius: '15px', height: 'fit-content', boxShadow: 'none', backgroundColor: 'var(--primary)'}}>
@@ -148,7 +147,6 @@ const CourseDetailPage = () => {
148147
</React.Fragment>
149148
}
150149
/>
151-
152150
</ListItemButton>
153151
</ListItem>
154152
))}
@@ -163,16 +161,12 @@ const CourseDetailPage = () => {
163161
</div>
164162

165163

166-
167-
168-
) : (
164+
) : (
169165
<h1>Error fetching Course Information</h1>
170-
)}
171-
172-
173-
</PageWrapper>
174-
)
175-
}
176-
166+
)}
167+
</div>
168+
</PageWrapper>
169+
);
170+
};
177171

178-
export default CourseDetailPage
172+
export default CourseDetailPage;

devU-client/src/components/pages/forms/assignments/assignmentFormPage.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ p {
4040
text-align: center;
4141
display: flex;
4242
justify-content: space-between;
43-
gap: 5px;
43+
gap: 10px;
4444
}
4545

4646
.header {

0 commit comments

Comments
 (0)