Work in progress

This commit is contained in:
Ramon Wenger 2024-12-03 17:45:42 +01:00
parent cc2ae195c0
commit 34efe68842
6 changed files with 48 additions and 7 deletions

View File

@ -722,13 +722,25 @@ export function useVVByLink() {
return { href }; return { href };
} }
export function useAllCompetenceCertificates(userId: string, courseSlug: string) { export function useAllCompetenceCertificates(
userId: string,
courseSlug: string,
currentCourseSessionOnly: boolean = false
) {
const courseSessionsStore = useCourseSessionsStore(); const courseSessionsStore = useCourseSessionsStore();
const certificateQueries = courseSessionsStore.allCourseSessions.map( let certificateQueries;
(courseSession) => { if (currentCourseSessionOnly) {
const courseSession = useCurrentCourseSession();
certificateQueries = [
useCertificateQuery([userId], courseSlug, courseSession.value).certificatesQuery,
];
} else {
// wtf
certificateQueries = courseSessionsStore.allCourseSessions.map((courseSession) => {
// todo: use a single query, instead of one for every courseSession
return useCertificateQuery([userId], courseSlug, courseSession).certificatesQuery; return useCertificateQuery([userId], courseSlug, courseSession).certificatesQuery;
} });
); }
const competenceCertificatesPerCs = computed(() => const competenceCertificatesPerCs = computed(() =>
certificateQueries.map((query) => { certificateQueries.map((query) => {

View File

@ -22,7 +22,8 @@ const { id: currentUserId } = useUserStore();
const { competenceCertificates } = useAllCompetenceCertificates( const { competenceCertificates } = useAllCompetenceCertificates(
props.userId ?? currentUserId, props.userId ?? currentUserId,
props.courseSlug props.courseSlug,
true
); );
const assignments = computed(() => { const assignments = computed(() => {

View File

@ -23,14 +23,21 @@ export function assignmentsUserPoints(assignments: CompetenceCertificateAssignme
).toFixed(1); ).toFixed(1);
} }
/**
* Calculates the grade by summing up all the weighted percentage of points of each assignment.
*
* @param assignments - list of assignments
* @param roundedToHalfGrade - should the grade be rounded?
*/
export function calcCompetenceCertificateGrade( export function calcCompetenceCertificateGrade(
assignments: CompetenceCertificateAssignment[], assignments: CompetenceCertificateAssignment[],
roundedToHalfGrade = true roundedToHalfGrade: boolean = true
) { ) {
const evaluatedAssignments = assignments.filter( const evaluatedAssignments = assignments.filter(
(a) => a.completions?.[0]?.completion_status === "EVALUATION_SUBMITTED" (a) => a.completions?.[0]?.completion_status === "EVALUATION_SUBMITTED"
); );
// sum((points_x / max_points) * weight_x)
const adjustedResults = evaluatedAssignments.map((a) => { const adjustedResults = evaluatedAssignments.map((a) => {
return ( return (
((a.completions?.[0]?.evaluation_points_final ?? 0) / a.max_points) * ((a.completions?.[0]?.evaluation_points_final ?? 0) / a.max_points) *
@ -38,6 +45,7 @@ export function calcCompetenceCertificateGrade(
); );
}); });
// count only assignments with weight
const adjustedAssignmentCount = _.sum( const adjustedAssignmentCount = _.sum(
evaluatedAssignments.map((a) => a.competence_certificate_weight) evaluatedAssignments.map((a) => a.competence_certificate_weight)
); );

View File

@ -15,6 +15,7 @@ import { onboardingRedirect } from "@/router/onboarding";
import { createRouter, createWebHistory } from "vue-router"; import { createRouter, createWebHistory } from "vue-router";
import { import {
ATTENDANCE_ROUTE, ATTENDANCE_ROUTE,
CERTIFICATE_OVERVIEW_ROUTE,
CERTIFICATES_ROUTE, CERTIFICATES_ROUTE,
COCKPIT_ROUTE, COCKPIT_ROUTE,
COMPETENCE_ROUTE, COMPETENCE_ROUTE,
@ -89,6 +90,12 @@ const router = createRouter({
component: () => import("@/pages/dashboard/DashboardCostPage.vue"), component: () => import("@/pages/dashboard/DashboardCostPage.vue"),
props: true, props: true,
}, },
{
path: "/dashboard/certificates/:courseSlug",
component: () =>
import("@/pages/competence/CompetenceCertificateOverviewPage.vue"),
props: true,
},
{ {
path: "/course/:courseSlug", path: "/course/:courseSlug",
props: true, props: true,
@ -117,6 +124,7 @@ const router = createRouter({
}, },
], ],
}, },
{ {
path: "competence", path: "competence",
component: () => import("@/pages/competence/CompetenceParentPage.vue"), component: () => import("@/pages/competence/CompetenceParentPage.vue"),
@ -189,6 +197,14 @@ const router = createRouter({
}, },
], ],
}, },
{
path: "certificates",
name: CERTIFICATE_OVERVIEW_ROUTE,
props: true,
component: () =>
import("@/pages/competence/CompetenceCertificateOverviewPage.vue"),
},
{ {
path: "profile/:userId", path: "profile/:userId",
component: () => import("@/pages/userProfile/UserProfilePage.vue"), component: () => import("@/pages/userProfile/UserProfilePage.vue"),

View File

@ -7,3 +7,7 @@ export const COCKPIT_ROUTE = "cockpit-home";
export const ATTENDANCE_ROUTE = "attendance"; export const ATTENDANCE_ROUTE = "attendance";
export const DOCUMENTS_ROUTE = "documents"; export const DOCUMENTS_ROUTE = "documents";
export const PERSONAL_PROFILE_ROUTE = "personalProfile"; export const PERSONAL_PROFILE_ROUTE = "personalProfile";
export const MENTORS_PARTICIPANTS_ROUTE = "mentorsAndParticipants";
export const MENTOR_OVERVIEW_ROUTE = "learningMentorOverview";
export const LEARN_ROUTE = "learn";
export const CERTIFICATE_OVERVIEW_ROUTE = "certificateOverview";