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  }