@@ -12,8 +12,14 @@ import moment from "moment";
12
12
import { Button , Divider , capitalize } from "@mui/material" ;
13
13
import ArrowBackIcon from '@mui/icons-material/ArrowBack' ;
14
14
import ArrowForwardIcon from '@mui/icons-material/ArrowForward' ;
15
+ import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox' ;
16
+ import CheckBoxOutlineBlankIcon from '@mui/icons-material/CheckBoxOutlineBlank' ;
17
+ import CheckBoxIcon from '@mui/icons-material/CheckBox' ;
15
18
import "./schedule.css" ;
16
19
20
+ // Set monday to the first day of the week
21
+ moment . updateLocale ( 'en' , { week : { dow : 1 , } } ) ;
22
+
17
23
const AttendancePage : React . FC = ( ) => {
18
24
const navigate = useNavigate ( ) ;
19
25
const { response, error, loading, sendRequest } = useAxiosRequest < Empty , ScheduleLecture [ ] > ( ) ;
@@ -46,21 +52,29 @@ const AttendancePage: React.FC = () => {
46
52
}
47
53
} , [ response ] ) ;
48
54
49
- const setStudentAttendence = ( lecture_id : number ) => {
55
+ const setStudentAttendence = ( lecture_id : number , attended : boolean ) => {
50
56
const new_lectures = lectures ?. map (
51
57
( lectures : ScheduleLecture [ ] ) =>
52
58
lectures . map (
53
- ( lecture : ScheduleLecture ) => ( lecture . id == lecture_id ? { ...lecture , attended_student : true } : lecture ) )
59
+ ( lecture : ScheduleLecture ) => ( lecture . id == lecture_id ? { ...lecture , attended_student : attended } : lecture ) )
54
60
)
55
61
setLectures ( new_lectures )
56
62
}
57
63
58
64
const handleAttendanceChange =
59
- ( lecture_id : number ) =>
65
+ ( lecture : ScheduleLecture ) =>
60
66
( event : React . ChangeEvent < HTMLInputElement > ) => {
61
- backend_post ( `lecture/${ lecture_id } /student_att` , "" , true )
67
+ var url = `lecture/${ lecture . id } /student_set_att`
68
+ var attended = true
69
+
70
+ if ( lecture . attended_student == true ) {
71
+ url = `lecture/${ lecture . id } /student_unset_att`
72
+ attended = false
73
+ }
74
+
75
+ backend_post ( url , "" , true )
62
76
. then ( ( resp ) => {
63
- if ( resp . status == 200 ) setStudentAttendence ( lecture_id )
77
+ if ( resp . status == 200 ) setStudentAttendence ( lecture . id , attended )
64
78
}
65
79
)
66
80
. catch ( ( error ) => console . log ( error ) ) ;
@@ -84,6 +98,18 @@ const AttendancePage: React.FC = () => {
84
98
return moment ( Date . parse ( time ) ) . format ( "HH:mm" )
85
99
}
86
100
101
+ const getCheckboxColor = ( lecture : ScheduleLecture , attended_box : boolean ) => {
102
+ if ( lecture . attended_student && lecture . attended_teacher ) return "green"
103
+ if ( attended_box == false ) return "rgb(224, 6, 31)"
104
+ return "white"
105
+ }
106
+
107
+ // Get date of a specific weekday in the current week
108
+ const getDateDay = ( dayIndex : number ) => {
109
+ const new_date = schedule_date . weekday ( dayIndex )
110
+ return new_date . date ( )
111
+ }
112
+
87
113
return (
88
114
< RootPage >
89
115
< Container
@@ -113,29 +139,52 @@ const AttendancePage: React.FC = () => {
113
139
{ lectures ?. map ( ( day : ScheduleLecture [ ] , dayIndex ) => (
114
140
< div key = { dayConvert [ dayIndex ] } style = { { background : alternatingColor [ dayIndex % 2 ] , paddingTop : "0" , marginTop : "0" } } >
115
141
< h2 style = { { paddingLeft : "2%" , paddingTop : "1%" , paddingBottom : "0" , marginBottom : "0" , marginTop : "0" } } >
116
- { dayConvert [ dayIndex ] }
142
+ { ` ${ getDateDay ( dayIndex ) } ${ dayConvert [ dayIndex ] } ` }
117
143
</ h2 >
118
144
119
145
{ ( day . length != 0 ) ? < Divider variant = "middle" style = { { marginTop : "1.5%" } } /> : null }
120
146
121
147
< List >
122
148
{ day . map ( ( lecture , lectureIndex ) => (
123
149
< ListItem key = { lecture . id } style = { { marginTop : "-0.5%" , marginBottom : "-1%" } } >
124
- < div style = { { marginRight : "3 %" } } >
150
+ < div style = { { marginRight : "1 %" } } >
125
151
< ListItemText primary = { convertToScheduleTime ( lecture . start_time ) } />
126
152
< ListItemText primary = { convertToScheduleTime ( lecture . end_time ) } />
127
153
</ div >
128
- < ListItemText primary = { lecture . course } secondary = { capitalize ( lecture . lecture_type ) } />
154
+ < Button
155
+ variant = "string"
156
+ color = "inherit"
157
+ disableTouchRipple
158
+ onClick = { ( ) => navigate ( `/course/${ lecture . course } ` )
159
+ }
160
+ sx = { {
161
+ textTransform : 'none' ,
162
+ textAlign : 'left' , "&.MuiButtonBase-root:hover" : {
163
+ bgcolor : "transparent" ,
164
+ textDecoration : "underline"
165
+ }
166
+ } }
167
+ >
168
+ < ListItemText primary = { lecture . course_name } secondary = { capitalize ( lecture . lecture_type ) } />
169
+ </ Button >
170
+
171
+ < ListItemText primary = { "" } />
129
172
130
173
< Checkbox
131
- checked = { lecture . attended_student }
132
- onChange = { handleAttendanceChange ( lecture . id ) }
133
- sx = { { "& .MuiSvgIcon-root" : { color : "white" } } }
174
+ indeterminateIcon = { < CheckBoxOutlineBlankIcon /> }
175
+ icon = { < IndeterminateCheckBoxIcon /> }
176
+ indeterminate = { lecture . attended_student == null }
177
+ checked = { lecture . attended_student == true }
178
+ onChange = { handleAttendanceChange ( lecture ) }
179
+ sx = { { "& .MuiSvgIcon-root" : { color : getCheckboxColor ( lecture , lecture . attended_student ) } } }
134
180
/>
135
181
< Checkbox
136
- checked = { lecture . attended_teacher }
182
+ indeterminateIcon = { < CheckBoxOutlineBlankIcon /> }
183
+ icon = { < IndeterminateCheckBoxIcon /> }
184
+ indeterminate = { lecture . attended_teacher == null }
185
+ checked = { lecture . attended_teacher == true }
137
186
disabled = { true }
138
- sx = { { "& .MuiSvgIcon-root" : { color : "white" } } }
187
+ sx = { { "& .MuiSvgIcon-root" : { color : getCheckboxColor ( lecture , lecture . attended_teacher ) } } }
139
188
/>
140
189
</ ListItem >
141
190
) )
0 commit comments