Add comments for documentation
This commit is contained in:
parent
2f9fbed8f5
commit
8793b30b56
|
|
@ -30,8 +30,10 @@ onMounted(() => {
|
||||||
log.debug("App mounted");
|
log.debug("App mounted");
|
||||||
|
|
||||||
eventBus.on("switchedCourseSession", () => {
|
eventBus.on("switchedCourseSession", () => {
|
||||||
// FIXME: clean up with VBV-305
|
// Rerender the component tree, when the course session gets switched.
|
||||||
|
// Mainly so that the `useCurrentCourseSession` composable gets re-evaluated
|
||||||
componentKey.value++;
|
componentKey.value++;
|
||||||
|
log.info("Switched course session, re-evaluate component tree");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,29 @@
|
||||||
import { useCourseSessionsStore } from "@/stores/courseSessions";
|
import { useCourseSessionsStore } from "@/stores/courseSessions";
|
||||||
import type { CourseSession } from "@/types";
|
import type { CourseSession } from "@/types";
|
||||||
|
import log from "loglevel";
|
||||||
import { computed } from "vue";
|
import { computed } from "vue";
|
||||||
|
|
||||||
export function useCurrentCourseSession(): CourseSession {
|
export function useCurrentCourseSession(): CourseSession {
|
||||||
|
/**
|
||||||
|
* We often need the current course session in our components.
|
||||||
|
* With this composable we can get it easily.
|
||||||
|
* ATTENTION: The value is not reactive! So the components need to be re-rendered
|
||||||
|
* when the value changes. This is currently done with the "switchedCourseSession"
|
||||||
|
* event handler in the App.vue component.
|
||||||
|
*/
|
||||||
const store = useCourseSessionsStore();
|
const store = useCourseSessionsStore();
|
||||||
const currentCourseSession = computed(() => store.currentCourseSession);
|
const currentCourseSession = computed(() => store.currentCourseSession);
|
||||||
|
|
||||||
// This will always return a defined value, but you should still handle the case where currentCourseSession is undefined in the store.
|
|
||||||
if (!currentCourseSession.value) {
|
if (!currentCourseSession.value) {
|
||||||
throw new Error("currentCourseSession is not defined in the store");
|
log.error(
|
||||||
|
"currentCourseSession is only defined in pages with :courseSlug in the route"
|
||||||
|
);
|
||||||
|
throw new Error(
|
||||||
|
`currentCourseSession is not defined in the store.
|
||||||
|
It is only defined in pages with :courseSlug in the route`
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
// return a non-reactive copy of the value
|
// return a NON-REACTIVE copy of the value (read above)
|
||||||
return currentCourseSession.value;
|
return currentCourseSession.value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ onMounted(async () => {
|
||||||
// noinspection TypeScriptValidateTypes
|
// noinspection TypeScriptValidateTypes
|
||||||
await upsertAssignmentCompletionMutation.executeMutation({
|
await upsertAssignmentCompletionMutation.executeMutation({
|
||||||
assignmentId: props.learningContent.content_assignment_id.toString(),
|
assignmentId: props.learningContent.content_assignment_id.toString(),
|
||||||
courseSessionId: courseSessionsStore.currentCourseSession!.id.toString(),
|
courseSessionId: courseSession.id.toString(),
|
||||||
completionDataString: JSON.stringify({}),
|
completionDataString: JSON.stringify({}),
|
||||||
completionStatus: "IN_PROGRESS",
|
completionStatus: "IN_PROGRESS",
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
|
@ -109,9 +109,6 @@ const showExitButton = computed(() => numPages.value === stepIndex.value + 1);
|
||||||
const dueDate = computed(() =>
|
const dueDate = computed(() =>
|
||||||
dayjs(state.courseSessionAssignmentDetails?.submissionDeadlineDateTimeUtc)
|
dayjs(state.courseSessionAssignmentDetails?.submissionDeadlineDateTimeUtc)
|
||||||
);
|
);
|
||||||
const courseSessionId = computed(
|
|
||||||
() => courseSessionsStore.currentCourseSession?.id ?? 0
|
|
||||||
);
|
|
||||||
const currentTask = computed(() => {
|
const currentTask = computed(() => {
|
||||||
if (stepIndex.value > 0 && stepIndex.value <= numTasks.value) {
|
if (stepIndex.value > 0 && stepIndex.value <= numTasks.value) {
|
||||||
return assignment.value?.tasks[stepIndex.value - 1];
|
return assignment.value?.tasks[stepIndex.value - 1];
|
||||||
|
|
@ -154,7 +151,7 @@ const getTitle = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const assignmentUser = computed(() => {
|
const assignmentUser = computed(() => {
|
||||||
return (courseSessionsStore.currentCourseSession?.users ?? []).find(
|
return courseSession.users.find(
|
||||||
(user) => user.user_id === Number(userStore.id)
|
(user) => user.user_id === Number(userStore.id)
|
||||||
) as CourseSessionUser;
|
) as CourseSessionUser;
|
||||||
});
|
});
|
||||||
|
|
@ -199,7 +196,7 @@ const assignmentUser = computed(() => {
|
||||||
:due-date="dueDate"
|
:due-date="dueDate"
|
||||||
:assignment="assignment"
|
:assignment="assignment"
|
||||||
:assignment-completion="assignmentCompletion"
|
:assignment-completion="assignmentCompletion"
|
||||||
:course-session-id="courseSessionId!"
|
:course-session-id="courseSession.id"
|
||||||
@edit-task="jumpToTask($event)"
|
@edit-task="jumpToTask($event)"
|
||||||
></AssignmentSubmissionView>
|
></AssignmentSubmissionView>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -43,3 +43,16 @@ export const expertRequired: NavigationGuard = (to: RouteLocationNormalized) =>
|
||||||
return `/course/${courseSlug}/learn`;
|
return `/course/${courseSlug}/learn`;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export async function handleCourseSessions(to: RouteLocationNormalized) {
|
||||||
|
// register after login hooks
|
||||||
|
const courseSessionsStore = useCourseSessionsStore();
|
||||||
|
if (to.params.courseSlug) {
|
||||||
|
courseSessionsStore._currentCourseSlug = to.params.courseSlug as string;
|
||||||
|
} else {
|
||||||
|
courseSessionsStore._currentCourseSlug = "";
|
||||||
|
}
|
||||||
|
if (!courseSessionsStore.loaded) {
|
||||||
|
await courseSessionsStore.loadCourseSessionsData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
import DashboardPage from "@/pages/DashboardPage.vue";
|
import DashboardPage from "@/pages/DashboardPage.vue";
|
||||||
import LoginPage from "@/pages/LoginPage.vue";
|
import LoginPage from "@/pages/LoginPage.vue";
|
||||||
import { redirectToLoginIfRequired, updateLoggedIn } from "@/router/guards";
|
import {
|
||||||
import { useCourseSessionsStore } from "@/stores/courseSessions";
|
handleCourseSessions,
|
||||||
|
redirectToLoginIfRequired,
|
||||||
|
updateLoggedIn,
|
||||||
|
} from "@/router/guards";
|
||||||
import { createRouter, createWebHistory } from "vue-router";
|
import { createRouter, createWebHistory } from "vue-router";
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
|
|
@ -181,19 +184,7 @@ const router = createRouter({
|
||||||
router.beforeEach(updateLoggedIn);
|
router.beforeEach(updateLoggedIn);
|
||||||
router.beforeEach(redirectToLoginIfRequired);
|
router.beforeEach(redirectToLoginIfRequired);
|
||||||
|
|
||||||
router.beforeEach(async (to) => {
|
// register after login hooks
|
||||||
// register after login hooks
|
router.beforeEach(handleCourseSessions);
|
||||||
const courseSessionsStore = useCourseSessionsStore();
|
|
||||||
if (to.params.courseSlug) {
|
|
||||||
courseSessionsStore._currentCourseSlug = to.params.courseSlug as string;
|
|
||||||
if (!courseSessionsStore.loaded) {
|
|
||||||
await courseSessionsStore.loadCourseSessionsData();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
courseSessionsStore._currentCourseSlug = "";
|
|
||||||
// load async
|
|
||||||
courseSessionsStore.loadCourseSessionsData();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,6 @@ import { computed, ref } from "vue";
|
||||||
import { useCircleStore } from "./circle";
|
import { useCircleStore } from "./circle";
|
||||||
import { useUserStore } from "./user";
|
import { useUserStore } from "./user";
|
||||||
|
|
||||||
export type LearningSequenceCircleDocument = {
|
|
||||||
id: number;
|
|
||||||
title: string;
|
|
||||||
documents: CircleDocument[];
|
|
||||||
};
|
|
||||||
|
|
||||||
const SELECTED_COURSE_SESSIONS_KEY = "selectedCourseSessionMap";
|
const SELECTED_COURSE_SESSIONS_KEY = "selectedCourseSessionMap";
|
||||||
|
|
||||||
export const useCourseSessionsStore = defineStore("courseSessions", () => {
|
export const useCourseSessionsStore = defineStore("courseSessions", () => {
|
||||||
|
|
@ -96,7 +90,7 @@ export const useCourseSessionsStore = defineStore("courseSessions", () => {
|
||||||
function switchCourseSession(courseSession: CourseSession) {
|
function switchCourseSession(courseSession: CourseSession) {
|
||||||
log.debug("switchCourseSession", courseSession);
|
log.debug("switchCourseSession", courseSession);
|
||||||
selectedCourseSessionMap.value.set(courseSession.course.slug, courseSession.id);
|
selectedCourseSessionMap.value.set(courseSession.course.slug, courseSession.id);
|
||||||
// FIXME: clean up with VBV-305
|
// Emit event so that the App can re-render with the new courseSession
|
||||||
eventBus.emit("switchedCourseSession", courseSession.id);
|
eventBus.emit("switchedCourseSession", courseSession.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
import mitt from "mitt";
|
import mitt from "mitt";
|
||||||
|
|
||||||
export type MittEvents = {
|
export type MittEvents = {
|
||||||
// FIXME: clean up with VBV-305
|
// event needed so that the App components do re-render when the course session changes
|
||||||
switchedCourseSession: number;
|
switchedCourseSession: number;
|
||||||
|
|
||||||
finishedLearningContent: boolean;
|
finishedLearningContent: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue