Skip to content

Commit 8c01e96

Browse files
authored
Merge pull request #256 from makeopensource/115-updated-code-grader
115 - Updated code grader modal
2 parents 3864809 + 82c012c commit 8c01e96

File tree

6 files changed

+80
-50
lines changed

6 files changed

+80
-50
lines changed

devU-client/src/assets/variables.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ $text-color: var(--text-color);
1010
$text-color-secondary: var(--text-color-secondary);
1111

1212
$primary: var(--primary);
13+
$hover-darker: var(--hover-darker);
1314

1415
$secondary-lighter: var(--secondary-lighter);
1516
$secondary: var(--secondary);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ const AddAssignmentModal = ({ open, onClose }: Props) => {
119119
})
120120
}
121121

122-
useEffect(() => { RequestService.get(`/api/course/${courseId}/assignments`).then((res) => { setAssignments(res) }) }, [formData])
122+
useEffect(() => { RequestService.get(`/api/course/${courseId}/assignments`).then((res) => { setAssignments(res) }) }, [])
123123

124124

125125
useEffect(() => {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ input[type='datetime-local'] {
149149

150150
.fileUpload{
151151
text-transform: none;
152-
border: 3px solid var(--primary);
153-
background-color: var(--primary);
152+
border: 3px solid $primary;
153+
background-color: $primary;
154154
border-radius: 100px;
155155
font-weight: 700;
156156
font-size: 14px;
@@ -161,8 +161,8 @@ input[type='datetime-local'] {
161161
transition: all 0.2s ease;
162162
}
163163
.fileUpload:hover{
164-
border: 3px solid var(--hover-darker);
165-
background-color: var(--hover-darker)
164+
border: 3px solid $hover-darker;
165+
background-color: $hover-darker;
166166
}
167167

168168

devU-client/src/components/pages/forms/assignments/assignmentUpdatePage.tsx

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ const AssignmentUpdatePage = () => {
3030
const currentAssignmentId = parseInt(assignmentId)
3131
const [assignmentProblems, setAssignmentProblems] = useState<AssignmentProblem[]>([])
3232
const [nonContainerAutograders, setNonContainerAutograders] = useState<NonContainerAutoGrader[]>([])
33-
const [containerAutoGraderModal, setContainerAutoGraderModal] = useState(false);
34-
const handleCloseContainerAutoGraderModal = () => setContainerAutoGraderModal(false);
3533
const [containerAutograders, setContainerAutograders] = useState<ContainerAutoGrader[]>([])
3634

3735
const [mcqProblemId, setMcqProblemId] = useState<number>()
@@ -81,17 +79,26 @@ const AssignmentUpdatePage = () => {
8179
}
8280

8381
const fetchAssignmentProblems = async () => {
84-
await RequestService.get(`/api/course/${courseId}/assignment/${assignmentId}/non-container-auto-graders`)
85-
.then((res) => { setNonContainerAutograders(res) })
8682
await RequestService.get(`/api/course/${courseId}/assignment/${currentAssignmentId}/assignment-problems`)
8783
.then((res) => { setAssignmentProblems(res)})
8884
}
85+
const fetchNcags = async () => {
86+
await RequestService.get(`/api/course/${courseId}/assignment/${assignmentId}/non-container-auto-graders`)
87+
.then((res) => { setNonContainerAutograders(res) })
88+
}
89+
const fetchCags = async () => {
90+
await RequestService.get(`/api/course/${courseId}/assignment/${assignmentId}/container-auto-graders`)
91+
.then((res) => { setContainerAutograders(res) })
92+
}
8993

90-
useEffect(() => {RequestService.get(`/api/course/${courseId}/assignments/${assignmentId}`).then((res) => { setFormData(res) })}, [])
91-
useEffect(() => {RequestService.get(`/api/course/${courseId}/assignment/${assignmentId}/assignment-problems`).then((res) => { setAssignmentProblems(res) })}, [])
92-
useEffect(() => {RequestService.get(`/api/course/${courseId}/assignment/${assignmentId}/non-container-auto-graders`).then((res) => { setNonContainerAutograders(res) })}, [])
93-
useEffect(() => {RequestService.get(`/api/course/${courseId}/assignment/${assignmentId}/container-auto-graders`).then((res) => { setContainerAutograders(res) })}, [])
94-
useEffect(() => {RequestService.get(`/api/course/${courseId}/assignments`).then((res) => { setAssignments(res) })}, [formData])
94+
95+
96+
97+
useEffect(() => { RequestService.get(`/api/course/${courseId}/assignments/${assignmentId}`).then((res) => { setFormData(res) }) }, [])
98+
useEffect(() => { RequestService.get(`/api/course/${courseId}/assignment/${assignmentId}/assignment-problems`).then((res) => { setAssignmentProblems(res) }) }, [])
99+
useEffect(() => { RequestService.get(`/api/course/${courseId}/assignment/${assignmentId}/non-container-auto-graders`).then((res) => { setNonContainerAutograders(res) }) }, [])
100+
useEffect(() => { RequestService.get(`/api/course/${courseId}/assignment/${assignmentId}/container-auto-graders`).then((res) => { setContainerAutograders(res) }) }, [])
101+
useEffect(() => { RequestService.get(`/api/course/${courseId}/assignments`).then((res) => { setAssignments(res) }) }, [formData])
95102
useEffect(() => {
96103
const categories = [...new Set(assignments.map(a => a.categoryName))];
97104
const options = categories.map((category) => ({
@@ -160,17 +167,21 @@ const AssignmentUpdatePage = () => {
160167
const handleCloseTextModal = () => {
161168
setTextModal(false)
162169
fetchAssignmentProblems()
170+
fetchNcags()
163171
}
172+
164173
const [codeModal, setCodeModal] = useState(false);
165174
const handleCloseCodeModal = async () => {
166175
setCodeModal(false)
167-
fetchAssignmentProblems()
168-
}
176+
fetchAssignmentProblems()
177+
}
169178
const [mcqModal, setMcqModal] = useState(false);
170179
const handleCloseMcqModal = async () => {
171180
setMcqModal(false)
172-
fetchAssignmentProblems()
173-
}
181+
fetchAssignmentProblems()
182+
fetchNcags()
183+
}
184+
174185
const [mcqEditModal, setMcqEditModal] = useState(false);
175186
const handleCloseEditMcqModal = async () => {
176187
setMcqEditModal(false)
@@ -182,6 +193,13 @@ const AssignmentUpdatePage = () => {
182193
fetchAssignmentProblems()
183194
}
184195

196+
const [containerAutoGraderModal, setContainerAutoGraderModal] = useState(false);
197+
const handleCloseContainerAutoGraderModal = () => {
198+
setContainerAutoGraderModal(false);
199+
fetchCags();
200+
}
201+
202+
185203

186204

187205
const handleDeleteProblem = async (problem: AssignmentProblem) => {

devU-client/src/components/pages/forms/containers/containerAutoGraderModal.tsx

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ const ContainerAutoGraderForm = ({ open, onClose }: Props) => {
2121
const [setAlert] = useActionless(SET_ALERT)
2222
const { assignmentId, courseId } = useParams<{ assignmentId: string; courseId: string }>();
2323
// const history = useHistory()
24-
const [graderFile, setGraderFile] = useState<File | null>()
25-
const [makefile, setMakefile] = useState<File | null>()
24+
const [dockerfile, setDockerfile] = useState<File | null>()
25+
const [jobFiles, setJobFiles] = useState<File[]>()
26+
2627
const [formData, setFormData] = useState({
2728
assignmentId: assignmentId,
28-
autogradingImage: '',
2929
timeout: '',
3030
})
31+
formData
3132
// const [invalidFields, setInvalidFields] = useState(new Map<string, string>())
3233

3334
// const handleChange = (value: String, e : React.ChangeEvent<HTMLInputElement>) => {
@@ -39,31 +40,42 @@ const ContainerAutoGraderForm = ({ open, onClose }: Props) => {
3940

4041
//This is janky but it works and I'm too tired to come up with a better solution
4142
//this is done because the files need to be uniquely identified for multer to parse them from the multipart
42-
const handleGraderfileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
43-
setGraderFile(e.target.files?.item(0))
43+
const handleDockerfile = (e: React.ChangeEvent<HTMLInputElement>) => {
44+
setDockerfile(e.target.files?.item(0))
4445
}
45-
const handleMakefileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
46-
setMakefile(e.target.files?.item(0))
46+
const handleJobFiles = (e: React.ChangeEvent<HTMLInputElement>) => {
47+
if (!e.target.files) {return}
48+
setJobFiles(Array.from(e.target.files))
4749
}
4850
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
4951
const key = e.target.id;
5052
const value = e.target.value;
5153
setFormData(prevState => ({ ...prevState, [key]: value }));
5254
};
55+
const isSubmittable = () => {
56+
if (dockerfile && jobFiles && formData.timeout.length > 0){
57+
return true;
58+
}
59+
return false;
60+
}
61+
const handleSubmit = () => {
62+
if (!dockerfile || !jobFiles) {return}
5363

64+
const body = new FormData
65+
body.append('assignmentId', formData.assignmentId)
66+
body.append('timeoutInSeconds', formData.timeout)
67+
body.append('dockerfile', dockerfile)
5468

69+
for (let i = 0; i < jobFiles.length; i ++){
70+
const f = jobFiles.at(i)
71+
if (f){
72+
body.append('jobFiles', f)
73+
}
74+
}
75+
5576

56-
const handleSubmit = () => {
57-
if (!graderFile || !makefile) return;
58-
59-
const multipart = new FormData
60-
multipart.append('assignmentId', formData.assignmentId)
61-
multipart.append('autogradingImage', formData.autogradingImage)
62-
multipart.append('timeout', String(formData.timeout))
63-
if (graderFile) multipart.append('graderFile', graderFile)
64-
if (makefile) multipart.append('makefileFile', makefile)
6577

66-
RequestService.postMultipart(`/api/course/${courseId}/assignment/${assignmentId}/container-auto-graders/`, multipart)
78+
RequestService.postMultipart(`/api/course/${courseId}/assignment/${assignmentId}/container-auto-graders/`, body)
6779
.then(() => {
6880
setAlert({ autoDelete: true, type: 'success', message: 'Container Auto-Grader Added' })
6981
})
@@ -79,33 +91,32 @@ const ContainerAutoGraderForm = ({ open, onClose }: Props) => {
7991

8092
setFormData({
8193
assignmentId: assignmentId,
82-
autogradingImage: '',
8394
timeout: '',
8495
})
8596

8697
onClose();
8798
}
8899

89100
return (
90-
<Modal title="Add Container Auto Grader" buttonAction={handleSubmit} open={open} onClose={onClose}>
101+
<Modal title="Add Container Auto Grader"
102+
buttonAction={handleSubmit}
103+
open={open}
104+
onClose={onClose}
105+
isSubmittable={isSubmittable}>
91106
<div className="input-group">
92-
<label htmlFor="autogradingImage">Autograding Image*:</label>
93-
{/* <input type="text" id="autogradingImage" onChange={(e) => setFormData({ ...formData, autogradingImage: e.target.value })} placeholder="e.g. Assignment 1 Image" /> */}
94-
<input type="text" id="autogradingImage" onChange={handleChange} placeholder="e.g. Assignment 1 Image" />
107+
<label htmlFor="dockerfile">Dockerfile*:</label>
108+
<input type="file" id="graderFile" onChange={handleDockerfile} />
95109
</div>
96110
<div className="input-group">
97-
<label htmlFor="timeout">Timeout (ms):</label>
98-
{/* <input type="number" id="timeout" placeholder="e.g. 3000" onChange={(e) => setFormData({ ...formData, timeout: e.target.value })} /> */}
99-
<input type="number" id="timeout" placeholder="e.g. 3000" onChange={handleChange} />
100-
</div>
101-
<div className="input-group">
102-
<label htmlFor="graderFile">Graderfile*:</label>
103-
<input type="file" id="graderFile" onChange={handleGraderfileChange} />
111+
<label htmlFor="dockerfile">Job Files*:</label>
112+
<input type="file" id="graderFile" multiple onChange={handleJobFiles} />
104113
</div>
105114
<div className="input-group">
106-
<label htmlFor="makefile">Makefile*:</label>
107-
<input type="file" id="makefile" onChange={handleMakefileChange} />
115+
<label htmlFor="timeout">Timeout (s):</label>
116+
{/* <input type="number" id="timeout" placeholder="e.g. 3000" onChange={(e) => setFormData({ ...formData, timeout: e.target.value })} /> */}
117+
<input type="number" id="timeout" placeholder="e.g. 1" onChange={handleChange} />
108118
</div>
119+
109120
</Modal>
110121
);
111122
};

devU-client/src/components/utils/userOptionsDropdown.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
transition: background-color 0.2s ease;
4242

4343
&:hover {
44-
background-color: var(--hover-darker);
44+
background-color: $hover-darker;
4545
}
4646
}
4747

0 commit comments

Comments
 (0)