Add EvaluationIntro

This commit is contained in:
Daniel Egger 2023-05-05 11:29:52 +02:00
parent 26caf06391
commit d9a6f2dd94
5 changed files with 123 additions and 21 deletions

View File

@ -1,5 +1,10 @@
<script setup lang="ts">
import EvaluationIntro from "@/pages/cockpit/assignmentEvaluationPage/EvaluationIntro.vue";
import EvaluationTask from "@/pages/cockpit/assignmentEvaluationPage/EvaluationTask.vue";
import { calcAssignmentLearningContents } from "@/services/assignmentService";
import { useCourseSessionsStore } from "@/stores/courseSessions";
import { useLearningPathStore } from "@/stores/learningPath";
import { useUserStore } from "@/stores/user";
import type { Assignment, AssignmentCompletion, CourseSessionUser } from "@/types";
import dayjs from "dayjs";
import * as log from "loglevel";
@ -14,6 +19,7 @@ const props = defineProps<{
log.debug("UserEvaluation setup");
interface StateInterface {
// 0 = introduction, 1 - n = tasks, n+1 = submission
pageIndex: number;
}
@ -21,48 +27,77 @@ const state: StateInterface = reactive({
pageIndex: 0,
});
const courseSessionStore = useCourseSessionsStore();
const numTasks = computed(() => props.assignment.evaluation_tasks?.length ?? 0);
function previousTask() {
function previousPage() {
log.debug("previousTask");
state.pageIndex = Math.max(0, state.pageIndex - 1);
}
function nextTask() {
function nextPage() {
log.debug("nextTask");
state.pageIndex = Math.min(numTasks.value - 1, state.pageIndex + 1);
state.pageIndex = Math.min(numTasks.value + 1, state.pageIndex + 1);
}
function findAssignmentDetail() {
const learningPathStore = useLearningPathStore();
const userStore = useUserStore();
// TODO: filter by selected circle
if (!courseSessionStore.currentCourseSession) {
return [];
}
const learningContents = calcAssignmentLearningContents(
learningPathStore.learningPathForUser(
courseSessionStore.currentCourseSession.course.slug,
userStore.id
)
);
const learningContent = learningContents.find(
(lc) => lc.assignmentId === props.assignment.id
);
return courseSessionStore.findAssignmentDetails(learningContent.id);
}
const assignmentDetail = computed(() => findAssignmentDetail());
const dueDate = computed(() =>
dayjs(assignmentDetail.value?.evaluationDeadlineDateTimeUtc)
);
</script>
<template>
<div class="flex min-h-full flex-col">
<div class="flex-1 overflow-y-auto">
<section class="p-10">
<div class="mb-4">
{{ props.assignmentUser.first_name }} {{ props.assignmentUser.last_name }} hat
die Ergebnisse am
{{ dayjs(props.assignmentCompletion.submitted_at).format("DD.MM.YYYY") }} um
{{ dayjs(props.assignmentCompletion.submitted_at).format("HH.mm") }} Uhr
abgegeben.
</div>
<h3>Bewertung</h3>
<EvaluationTask
<EvaluationIntro
v-if="state.pageIndex === 0"
:assignment-user="props.assignmentUser"
:assignment="props.assignment"
:task-index="state.pageIndex"
:assignment-completion="props.assignmentCompletion"
:due-date="dueDate"
@start-evaluation="nextPage"
></EvaluationIntro>
<EvaluationTask
v-else-if="state.pageIndex >= 1 && state.pageIndex <= numTasks"
:assignment-user="props.assignmentUser"
:assignment="props.assignment"
:task-index="state.pageIndex - 1"
/>
</section>
</div>
<nav class="sticky bottom-0 border-t bg-blue-400 p-10">
<nav class="sticky bottom-0 border-t p-6">
<div class="relative flex flex-row place-content-end">
<button
v-if="true"
class="btn-secondary mr-2 flex items-center"
data-cy="previous-step"
@click="previousTask()"
@click="previousPage()"
>
<it-icon-arrow-left class="mr-2 h-6 w-6"></it-icon-arrow-left>
{{ $t("general.backCapitalized") }}
@ -71,7 +106,7 @@ function nextTask() {
v-if="true"
class="btn-secondary z-10 flex items-center"
data-cy="next-step"
@click="nextTask()"
@click="nextPage()"
>
{{ $t("general.next") }}
<it-icon-arrow-right class="ml-2 h-6 w-6"></it-icon-arrow-right>

View File

@ -0,0 +1,65 @@
<script setup lang="ts">
import { useAssignmentStore } from "@/stores/assignmentStore";
import { useCourseSessionsStore } from "@/stores/courseSessions";
import type { Assignment, CourseSessionUser } from "@/types";
import { AssignmentCompletion } from "@/types";
import dayjs, { Dayjs } from "dayjs";
import * as log from "loglevel";
const props = defineProps<{
assignmentUser: CourseSessionUser;
assignment: Assignment;
assignmentCompletion: AssignmentCompletion;
dueDate?: Dayjs;
}>();
const emit = defineEmits(["startEvaluation"]);
log.debug("EvaluationIntro setup");
const courseSessionStore = useCourseSessionsStore();
const assignmentStore = useAssignmentStore();
async function startEvaluation() {
log.debug("startEvaluation");
await assignmentStore.evaluateAssignmentCompletion({
assignment_user_id: Number(props.assignmentUser.user_id),
assignment_id: props.assignment.id,
course_session_id: courseSessionStore.currentCourseSession!.id,
completion_data: {},
completion_status: "evaluation_in_progress",
});
emit("startEvaluation");
}
</script>
<template>
<div>
<div class="mb-4">
{{ props.assignmentUser.first_name }} {{ props.assignmentUser.last_name }} hat die
Ergebnisse am
{{ dayjs(props.assignmentCompletion.submitted_at).format("DD.MM.YYYY") }} um
{{ dayjs(props.assignmentCompletion.submitted_at).format("HH.mm") }} Uhr
abgegeben.
</div>
<h3>Bewertung</h3>
<p v-if="props.dueDate" class="my-4">
Du musst die Bewertung bis am {{ props.dueDate.format("DD.MM.YYYY") }} um
{{ props.dueDate.format("HH.mm") }} Uhr abschliessen und freigeben.
</p>
<p class="my-4">
Auf Grund dieser Bewertung wird eine Gesamtpunktzahl und die daraus reslutierende
Note berechnet. Genauere Informationen dazu findest du im folgenden
Beurteilungsinstrument:
</p>
<div>
<button class="btn-primary" @click="startEvaluation()">Bewertung starten</button>
</div>
</div>
</template>
<style lang="scss" scoped></style>

View File

@ -67,7 +67,7 @@ const showPreviousButton = computed(() => state.pageIndex != 0);
const showNextButton = computed(() => state.pageIndex + 1 < numPages.value);
const showExitButton = computed(() => numPages.value === state.pageIndex + 1);
const dueDate = computed(() =>
dayjs(state.courseSessionAssignmentDetails?.deadlineDateTimeUtc)
dayjs(state.courseSessionAssignmentDetails?.submissionDeadlineDateTimeUtc)
);
const courseSessionId = computed(
() => courseSessionStore.currentCourseSession?.id ?? 0

View File

@ -430,7 +430,8 @@ export interface CourseSessionAttendanceDay {
export interface CourseSessionAssignmentDetails {
learningContentId: number;
deadlineDateTimeUtc: string;
submissionDeadlineDateTimeUtc: string;
evaluationDeadlineDateTimeUtc: string;
}
export interface CourseSession {

View File

@ -166,7 +166,8 @@ def create_course_uk_de():
"learningContentId": LearningContent.objects.get(
slug="überbetriebliche-kurse-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice"
).id,
"deadlineDateTimeUtc": "2023-05-30T19:00:00Z",
"submissionDeadlineDateTimeUtc": "2023-06-13T19:00:00Z",
"evaluationDeadlineDateTimeUtc": "2023-06-27T19:00:00Z",
}
],
)