github.com/quickfeed/quickfeed@v0.0.0-20240507093252-ed8ca812a09c/public/src/components/ComponentsHelpers.ts (about) 1 import { Assignment, Course, Enrollment, Group, Submission } from "../../proto/qf/types_pb" 2 import { groupRepoLink, SubmissionsForCourse, SubmissionSort, userRepoLink } from "../Helpers" 3 import { useActions, useAppState } from "../overmind" 4 import { AssignmentsMap } from "../overmind/state" 5 import { RowElement, Row } from "./DynamicTable" 6 7 8 export const generateSubmissionRows = (elements: Enrollment[] | Group[], generator: (s: Submission, e?: Enrollment | Group) => RowElement): Row[] => { 9 const state = useAppState() 10 const course = state.courses.find(c => c.ID === state.activeCourse) 11 const assignments = state.getAssignmentsMap(state.activeCourse) 12 return elements.map(element => { 13 return generateRow(element, assignments, state.submissionsForCourse, generator, course, state.isCourseManuallyGraded) 14 }) 15 } 16 17 const generateRow = (enrollment: Enrollment | Group, assignments: AssignmentsMap, submissions: SubmissionsForCourse, generator: (s: Submission, e?: Enrollment | Group) => RowElement, course?: Course, withID?: boolean): Row => { 18 const row: Row = [] 19 const isEnrollment = enrollment instanceof Enrollment 20 const isGroup = enrollment instanceof Group 21 22 if (withID) { 23 isEnrollment 24 ? row.push({ value: enrollment.userID.toString() }) 25 : row.push({ value: enrollment.ID.toString() }) 26 } 27 28 if (isEnrollment && enrollment.user) { 29 row.push({ value: enrollment.user.Name, link: userRepoLink(enrollment.user, course) }) 30 } else if (isGroup) { 31 row.push({ value: enrollment.name, link: groupRepoLink(enrollment, course) }) 32 } 33 34 Object.entries(assignments)?.forEach(([assignmentID, isGroupLab]) => { 35 let submission: Submission | undefined 36 if (isGroup && !isGroupLab) { 37 // If the assignment is not a group assignment, and we're dealing with a group 38 // we should exit early without adding to the row. 39 return 40 } 41 if (isGroupLab) { 42 submission = submissions.ForGroup(enrollment)?.find(s => s.AssignmentID.toString() === assignmentID) 43 } else if (isEnrollment) { 44 submission = submissions.ForUser(enrollment)?.find(s => s.AssignmentID.toString() === assignmentID) 45 } 46 if (submission) { 47 row.push(generator(submission, enrollment)) 48 return 49 } 50 row.push("N/A") 51 }) 52 return row 53 } 54 55 export const generateAssignmentsHeader = (assignments: Assignment[], group: boolean): Row => { 56 const isCourseManuallyGraded = useAppState((state) => state.isCourseManuallyGraded) 57 const actions = useActions() 58 const base: Row = [ 59 { value: "Name", onClick: () => actions.setSubmissionSort(SubmissionSort.Name) } 60 ] 61 if (isCourseManuallyGraded) { 62 base.unshift({ value: "ID", onClick: () => actions.setSubmissionSort(SubmissionSort.ID) }) 63 } 64 for (const assignment of assignments) { 65 if (group && assignment.isGroupLab) { 66 base.push({ value: `${assignment.name} (g)`, onClick: () => actions.review.setAssignmentID(assignment.ID) }) 67 } 68 if (!group) { 69 base.push({ value: assignment.isGroupLab ? `${assignment.name} (g)` : assignment.name, onClick: () => actions.review.setAssignmentID(assignment.ID) }) 70 } 71 } 72 return base 73 }