Fix bug so that you can select different attendance courses

This commit is contained in:
Daniel Egger 2023-09-06 16:47:38 +02:00
parent 5cb60bbbcf
commit abe923b2e4
3 changed files with 35 additions and 23 deletions

View File

@ -5,14 +5,15 @@ import ItPersonRow from "@/components/ui/ItPersonRow.vue";
import { useCurrentCourseSession } from "@/composables"; import { useCurrentCourseSession } from "@/composables";
import type { AttendanceUserStatus } from "@/gql/graphql"; import type { AttendanceUserStatus } from "@/gql/graphql";
import { ATTENDANCE_CHECK_MUTATION } from "@/graphql/mutations"; import { ATTENDANCE_CHECK_MUTATION } from "@/graphql/mutations";
import { ATTENDANCE_CHECK_QUERY } from "@/graphql/queries";
import { useCockpitStore } from "@/stores/cockpit"; import { useCockpitStore } from "@/stores/cockpit";
import type { DropdownSelectable } from "@/types"; import type { DropdownSelectable } from "@/types";
import { useMutation, useQuery } from "@urql/vue"; import { useMutation } from "@urql/vue";
import dayjs from "dayjs"; import dayjs from "dayjs";
import log from "loglevel"; import log from "loglevel";
import { computed, reactive, watch } from "vue"; import { computed, onMounted, reactive, watch } from "vue";
import { useTranslation } from "i18next-vue"; import { useTranslation } from "i18next-vue";
import { ATTENDANCE_CHECK_QUERY } from "@/graphql/queries";
import { graphqlClient } from "@/graphql/client";
const { t } = useTranslation(); const { t } = useTranslation();
const cockpitStore = useCockpitStore(); const cockpitStore = useCockpitStore();
@ -35,10 +36,6 @@ const presenceCoursesDropdownOptions = computed(() => {
); );
}); });
const attendanceCourseSelected = computed(
() => state.attendanceCourseSelected.id != "-1"
);
const state = reactive({ const state = reactive({
userPresence: new Map<string, boolean>(), userPresence: new Map<string, boolean>(),
attendanceCourseSelected: presenceCoursesDropdownOptions.value[0], attendanceCourseSelected: presenceCoursesDropdownOptions.value[0],
@ -46,13 +43,11 @@ const state = reactive({
attendanceSaved: false, attendanceSaved: false,
}); });
const attendanceQuery = useQuery({ function resetState() {
query: ATTENDANCE_CHECK_QUERY, state.userPresence = new Map<string, boolean>();
pause: true, state.disclaimerConfirmed = false;
variables: { state.attendanceSaved = false;
courseSessionId: state.attendanceCourseSelected.id.toString(), }
},
});
const onSubmit = async () => { const onSubmit = async () => {
type UserPresence = { type UserPresence = {
@ -79,9 +74,19 @@ const onSubmit = async () => {
}; };
const loadAttendanceData = async () => { const loadAttendanceData = async () => {
const res = await attendanceQuery.executeQuery(); resetState();
// with changing variables `useQuery` does not seem to work correctly
const res = await graphqlClient.query(
ATTENDANCE_CHECK_QUERY,
{
courseSessionId: state.attendanceCourseSelected.id.toString(),
},
{
requestPolicy: "network-only",
}
);
const attendanceUserList = const attendanceUserList =
res?.data?.value?.course_session_attendance_course?.attendance_user_list ?? []; res.data?.course_session_attendance_course?.attendance_user_list ?? [];
for (const user of attendanceUserList) { for (const user of attendanceUserList) {
if (!user) continue; if (!user) continue;
state.userPresence.set(user.user_id.toString(), user.status === "PRESENT"); state.userPresence.set(user.user_id.toString(), user.status === "PRESENT");
@ -91,15 +96,23 @@ const loadAttendanceData = async () => {
} }
}; };
loadAttendanceData(); onMounted(() => {
watch(state.attendanceCourseSelected, () => { log.debug("AttendanceCheckPage mounted");
loadAttendanceData(); loadAttendanceData();
}); });
watch(
() => state.attendanceCourseSelected,
() => {
log.debug("attendanceCourseSelected changed", state.attendanceCourseSelected);
loadAttendanceData();
}
);
</script> </script>
<template> <template>
<div class="bg-gray-200"> <div class="bg-gray-200">
<div class="container-large"> <div v-if="courseSession" class="container-large">
<nav class="py-4 pb-4"> <nav class="py-4 pb-4">
<router-link <router-link
class="btn-text inline-flex items-center pl-0" class="btn-text inline-flex items-center pl-0"
@ -117,7 +130,6 @@ watch(state.attendanceCourseSelected, () => {
></ItDropdownSelect> ></ItDropdownSelect>
<div v-if="!state.attendanceSaved" class="flex flex-row items-center"> <div v-if="!state.attendanceSaved" class="flex flex-row items-center">
<ItCheckbox <ItCheckbox
:disabled="!attendanceCourseSelected"
:checkbox-item="{ :checkbox-item="{
value: true, value: true,
checked: state.disclaimerConfirmed, checked: state.disclaimerConfirmed,
@ -158,7 +170,7 @@ watch(state.attendanceCourseSelected, () => {
> >
<template #leading> <template #leading>
<ItCheckbox <ItCheckbox
:disabled="!attendanceCourseSelected || state.attendanceSaved" :disabled="state.attendanceSaved"
:checkbox-item="{ :checkbox-item="{
value: true, value: true,
checked: state.userPresence.get(csu.user_id.toString()) as boolean, checked: state.userPresence.get(csu.user_id.toString()) as boolean,

View File

@ -130,7 +130,7 @@ function setActiveClasses(translationKey: string) {
</div> </div>
<div> <div>
<router-link <router-link
:to="`/course/${props.courseSlug}/cockpit/attendanceCheck`" :to="`/course/${props.courseSlug}/cockpit/attendance`"
class="btn-secondary min-w-min" class="btn-secondary min-w-min"
> >
{{ $t("Anwesenheit prüfen") }} {{ $t("Anwesenheit prüfen") }}

View File

@ -152,7 +152,7 @@ const router = createRouter({
props: true, props: true,
}, },
{ {
path: "attendanceCheck", path: "attendance",
component: () => component: () =>
import("@/pages/cockpit/attendanceCheckPage/AttendanceCheckPage.vue"), import("@/pages/cockpit/attendanceCheckPage/AttendanceCheckPage.vue"),
props: true, props: true,