174 lines
5.2 KiB
Vue
174 lines
5.2 KiB
Vue
<script setup lang="ts">
|
|
import EvaluationIntro from "@/pages/cockpit/assignmentEvaluationPage/EvaluationIntro.vue";
|
|
import EvaluationSummary from "@/pages/cockpit/assignmentEvaluationPage/EvaluationSummary.vue";
|
|
import EvaluationTask from "@/pages/cockpit/assignmentEvaluationPage/EvaluationTask.vue";
|
|
import type {
|
|
Assignment,
|
|
AssignmentCompletion,
|
|
AssignmentEvaluationTask,
|
|
CourseSessionUser,
|
|
} from "@/types";
|
|
import { useRouteQuery } from "@vueuse/router";
|
|
import dayjs from "dayjs";
|
|
import { findIndex } from "lodash";
|
|
import * as log from "loglevel";
|
|
import { computed, onMounted } from "vue";
|
|
import { useCourseSessionDetailQuery } from "@/composables";
|
|
|
|
const props = defineProps<{
|
|
assignmentUser: CourseSessionUser;
|
|
assignmentCompletion: AssignmentCompletion;
|
|
assignment: Assignment;
|
|
}>();
|
|
|
|
const emit = defineEmits(["close"]);
|
|
|
|
log.debug("UserEvaluation setup");
|
|
|
|
// 0 = introduction, 1 - n = tasks, n+1 = submission
|
|
const stepIndex = useRouteQuery("step", "0", { transform: Number, mode: "push" });
|
|
|
|
const numTasks = computed(() => props.assignment.evaluation_tasks?.length ?? 0);
|
|
const evaluationSubmitted = computed(
|
|
() => props.assignmentCompletion.completion_status === "EVALUATION_SUBMITTED"
|
|
);
|
|
|
|
onMounted(() => {
|
|
if (stepIndex.value === 0 && evaluationSubmitted.value) {
|
|
stepIndex.value = props.assignment.evaluation_tasks?.length + 1 ?? 0;
|
|
}
|
|
});
|
|
|
|
function previousPage() {
|
|
log.debug("previousTask");
|
|
stepIndex.value = Math.max(0, stepIndex.value - 1);
|
|
}
|
|
|
|
function nextPage() {
|
|
log.debug("nextTask");
|
|
stepIndex.value = Math.min(numTasks.value + 1, stepIndex.value + 1);
|
|
}
|
|
|
|
function editTask(task: AssignmentEvaluationTask) {
|
|
log.debug("editTask", task);
|
|
const taskIndex =
|
|
findIndex(props.assignment.evaluation_tasks, {
|
|
id: task.id,
|
|
}) ?? 0;
|
|
stepIndex.value = taskIndex + 1;
|
|
}
|
|
|
|
const courseSessionDetailResult = useCourseSessionDetailQuery();
|
|
|
|
const assignmentDetail = computed(() => {
|
|
return courseSessionDetailResult.findAssignmentByAssignmentId(
|
|
props.assignment.id.toString()
|
|
);
|
|
});
|
|
|
|
const dueDate = computed(() =>
|
|
dayjs(assignmentDetail.value?.evaluation_deadline.start)
|
|
);
|
|
|
|
const inEvaluationTask = computed(
|
|
() => stepIndex.value >= 1 && stepIndex.value <= numTasks.value
|
|
);
|
|
const taskIndex = computed(() => stepIndex.value - 1);
|
|
const task = computed(() => props.assignment.evaluation_tasks[taskIndex.value]);
|
|
|
|
const taskExpertDataText = computed(() => {
|
|
let result = "";
|
|
if (inEvaluationTask.value) {
|
|
result =
|
|
props.assignmentCompletion?.completion_data?.[task.value.id]?.expert_data?.text ??
|
|
"";
|
|
}
|
|
return result;
|
|
});
|
|
|
|
function nextButtonEnabled() {
|
|
if (inEvaluationTask.value) {
|
|
return taskExpertDataText.value ?? false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function finishButtonEnabled() {
|
|
return props.assignmentCompletion.completion_status === "EVALUATION_SUBMITTED";
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div class="flex min-h-full flex-col">
|
|
<div class="overflow-y-auto">
|
|
<section class="p-10">
|
|
<EvaluationIntro
|
|
v-if="stepIndex === 0"
|
|
:assignment-user="props.assignmentUser"
|
|
:assignment="props.assignment"
|
|
:assignment-completion="props.assignmentCompletion"
|
|
:due-date="dueDate"
|
|
@start-evaluation="nextPage"
|
|
></EvaluationIntro>
|
|
<EvaluationTask
|
|
v-else-if="inEvaluationTask"
|
|
:assignment-user="props.assignmentUser"
|
|
:assignment="props.assignment"
|
|
:assignment-completion="props.assignmentCompletion"
|
|
:task-index="stepIndex - 1"
|
|
:allow-edit="
|
|
props.assignmentCompletion.completion_status !== 'EVALUATION_SUBMITTED'
|
|
"
|
|
/>
|
|
<EvaluationSummary
|
|
v-else
|
|
:assignment-user="props.assignmentUser"
|
|
:assignment="props.assignment"
|
|
:assignment-completion="props.assignmentCompletion"
|
|
:due-date="dueDate"
|
|
@edit-task="editTask"
|
|
></EvaluationSummary>
|
|
</section>
|
|
</div>
|
|
|
|
<nav v-if="stepIndex > 0" class="sticky bottom-0 border-t bg-gray-200 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="previousPage()"
|
|
>
|
|
<it-icon-arrow-left class="mr-2 h-6 w-6"></it-icon-arrow-left>
|
|
{{ $t("general.backCapitalized") }}
|
|
</button>
|
|
<button
|
|
v-if="stepIndex <= numTasks"
|
|
:disabled="!nextButtonEnabled()"
|
|
class="btn-secondary z-10 flex items-center"
|
|
data-cy="next-step"
|
|
@click="nextPage()"
|
|
>
|
|
{{ $t("general.next") }}
|
|
<it-icon-arrow-right class="ml-2 h-6 w-6"></it-icon-arrow-right>
|
|
</button>
|
|
|
|
<button
|
|
v-if="stepIndex > numTasks"
|
|
:disabled="!finishButtonEnabled()"
|
|
class="btn-secondary z-10"
|
|
data-cy="next-step"
|
|
@click="emit('close')"
|
|
>
|
|
<span class="flex items-center">
|
|
{{ $t("a.Bewertung abschliessen") }}
|
|
<it-icon-check class="ml-2 h-6 w-6"></it-icon-check>
|
|
</span>
|
|
</button>
|
|
</div>
|
|
</nav>
|
|
</div>
|
|
</template>
|
|
|
|
<style lang="scss" scoped></style>
|