Skip to content

Commit a93ebf5

Browse files
committed
added button to save submission as csv, it works!
1 parent 2a8d028 commit a93ebf5

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

devU-client/src/assets/global.scss

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@
2323
text-align: center;
2424
}
2525

26-
span {
27-
color: var(--text-color)
28-
}
26+
2927

3028
hr {
3129
border: 1px solid #ddd;
@@ -45,6 +43,7 @@
4543
font-weight: 700;
4644
font-size: 16px;
4745
transition: all 0.2s ease;
46+
font-family: 'Source Sans Pro', 'Helvetica', 'Arial', sans-serif;
4847

4948
&:disabled {
5049
opacity: 60%;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ const AssignmentUpdatePage = () => {
7676
assignmentId: currentAssignmentId,
7777
problemName: '',
7878
maxScore: -1,
79+
metadata: {}
7980
})
8081

8182

devU-client/src/components/pages/submissions/submissionDetailPage.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import RequestService from 'services/request.service'
77
import { Assignment, AssignmentProblem, Submission, SubmissionProblemScore, SubmissionScore } from 'devu-shared-modules'
88
import { useParams, useHistory, Link } from 'react-router-dom'
99
import styles from './submissionDetailPage.scss'
10+
import {createSubmissionCsv} from "utils/download.utils"
1011
import ManualGradeModal from './manualGradeModal'
1112

1213
const SubmissionDetailPage = () => {
@@ -111,6 +112,11 @@ const SubmissionDetailPage = () => {
111112
history.push(`/course/${courseId}/assignment/${assignmentId}/submission/${submissionId}/fileView`)
112113
}}>View Source</button>
113114
<button className="btnSecondary">Download Submission</button>
115+
{submissionScore && <a
116+
className="btnSecondary"
117+
style={{textDecoration: 'none', textAlign: 'center'}}
118+
download={`${assignment?.name.toLowerCase().replace(" ","")}_submission.csv`}
119+
href={createSubmissionCsv(submissionScore,submissionProblemScores,assignmentProblems)}>Download as CSV</a>}
114120
{role.isInstructor() && (
115121
<button className="btnPrimary" onClick={handleClick}>Manually Grade</button>
116122
)}

devU-client/src/utils/download.utils.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
import { Assignment, User, AssignmentScore } from 'devu-shared-modules';
1+
import { Assignment, User, AssignmentScore, SubmissionScore, SubmissionProblemScore, AssignmentProblem } from 'devu-shared-modules';
2+
23
export function createGradebookCsv(assignments: Assignment[], users: User[], assignmentScores: AssignmentScore[], maxScores: Map<number, number>){
34
const toCSV = []
45
let header = "externalId,email,preferredName"
56
assignments.forEach((assignment) => {header+=`,${assignment.name}`})
67
toCSV.push(header + '\n')
7-
//console.log(header)
88

99

1010
users.forEach((user) => {
1111
let csvString = `${user.externalId},${user.email},${user.preferredName ?? "N/A"}`
12-
//console.log(csvString)
1312
assignments.forEach((assignment) => {
1413
const assignmentScore = assignmentScores.find(as => as.assignmentId === assignment?.id && as.userId == user.id)
1514
if (assignment?.id && assignmentScore){ // Submission defined, so...
@@ -24,6 +23,25 @@ export function createGradebookCsv(assignments: Assignment[], users: User[], ass
2423
})
2524
toCSV.push(csvString + '\n')
2625
})
26+
let final = 'data:text/csv;charset=utf-8,'
27+
toCSV.forEach((row)=>{final += row})
28+
return encodeURI(final)
29+
}
30+
31+
export function createSubmissionCsv(submissionScore: SubmissionScore, submissionProblemScores: SubmissionProblemScore[], assignmentProblems: AssignmentProblem[], ){
32+
const toCSV = []
33+
let header = "Total_Score"
34+
let scores = `${submissionScore.score}`
35+
assignmentProblems.forEach((ap) => {
36+
header += "," + ap.problemName
37+
const correspondingScore = submissionProblemScores.find(
38+
(scoreItem) => scoreItem.assignmentProblemId === ap.id
39+
);
40+
scores += "," + (correspondingScore ? correspondingScore.score : "N/A")
41+
})
42+
toCSV.push(header + '\n')
43+
toCSV.push(scores + '\n')
44+
2745
let final = 'data:text/csv;charset=utf-8,'
2846
toCSV.forEach((row)=>{final += row})
2947
return encodeURI(final)

0 commit comments

Comments
 (0)