89 lines
2.6 KiB
TypeScript
89 lines
2.6 KiB
TypeScript
import { useCourseSessionDetailQuery } from "@/composables";
|
|
import { itGet } from "@/fetchHelpers";
|
|
import type {
|
|
Assignment,
|
|
AssignmentCompletion,
|
|
CourseSessionUser,
|
|
UserAssignmentCompletionStatus,
|
|
} from "@/types";
|
|
import { sum } from "d3";
|
|
import pick from "lodash/pick";
|
|
|
|
export interface GradedUser {
|
|
user: CourseSessionUser;
|
|
points: number;
|
|
}
|
|
|
|
export async function loadAssignmentCompletionStatusData(
|
|
assignmentId: string,
|
|
courseSessionId: string,
|
|
learningContentId: string
|
|
) {
|
|
const courseSessionDetailResult = useCourseSessionDetailQuery();
|
|
|
|
const assignmentCompletionData = (await itGet(
|
|
`/api/assignment/${assignmentId}/${courseSessionId}/status/`
|
|
)) as UserAssignmentCompletionStatus[];
|
|
|
|
const members = courseSessionDetailResult.filterMembers();
|
|
|
|
const gradedUsers: GradedUser[] = [];
|
|
const assignmentSubmittedUsers: CourseSessionUser[] = [];
|
|
for (const csu of members) {
|
|
const userAssignmentStatus = assignmentCompletionData.find(
|
|
(s) =>
|
|
s.assignment_user_id === csu.user_id &&
|
|
s.learning_content_page_id === learningContentId
|
|
);
|
|
if (
|
|
userAssignmentStatus?.completion_status === "SUBMITTED" ||
|
|
userAssignmentStatus?.completion_status === "EVALUATION_IN_PROGRESS" ||
|
|
userAssignmentStatus?.completion_status === "EVALUATION_SUBMITTED"
|
|
) {
|
|
assignmentSubmittedUsers.push(csu);
|
|
}
|
|
if (userAssignmentStatus?.completion_status === "EVALUATION_SUBMITTED") {
|
|
gradedUsers.push({
|
|
user: csu,
|
|
points: userAssignmentStatus.evaluation_points ?? 0,
|
|
});
|
|
}
|
|
}
|
|
return {
|
|
assignmentSubmittedUsers: assignmentSubmittedUsers,
|
|
gradedUsers: gradedUsers,
|
|
total: members.length,
|
|
};
|
|
}
|
|
|
|
export function maxAssignmentPoints(assignment: Assignment) {
|
|
return sum(assignment.evaluation_tasks.map((task) => task.value.max_points));
|
|
}
|
|
|
|
export function userAssignmentPoints(
|
|
assignment: Assignment,
|
|
assignmentCompletion: AssignmentCompletion
|
|
) {
|
|
const evaluationTaskIds = assignment.evaluation_tasks.map((task) => {
|
|
return task.id;
|
|
});
|
|
|
|
return sum(
|
|
// transform the object of { [expert_id]: { expert_data: { points } } } to an array
|
|
// of [ [expert_id, { expert_data: { points } }], ... ] so that we can easily sum
|
|
// the points of the user
|
|
Object.entries(pick(assignmentCompletion.completion_data, evaluationTaskIds)).map(
|
|
(entry) => {
|
|
return entry[1]?.expert_data?.points ?? 0;
|
|
}
|
|
)
|
|
);
|
|
}
|
|
|
|
export function pointsToGrade(points: number, maxPoints: number) {
|
|
// round to half-grades
|
|
const grade = Math.round((points / maxPoints) * 10);
|
|
const halfGrade = grade / 2;
|
|
return Math.min(halfGrade, 5) + 1;
|
|
}
|