From d98f5e9f8be11f8b3f02a2e5c6fab76f691c53eb Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Wed, 12 Jun 2024 20:03:50 +0200
Subject: [PATCH] Show student names grouped by absence reason

---
 .../absences/participationStatus.graphql      |  1 +
 .../components/coursebook/coursebook.graphql  |  1 +
 .../coursebook/documentation/LessonNotes.vue  | 32 +++++++++++++++----
 3 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
index 2f15ef02d..81a3a5fb1 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
@@ -26,6 +26,7 @@ mutation touchDocumentation($documentationId: ID!) {
         id
         person {
           id
+          firstName
           fullName
         }
         absenceReason {
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
index 1e00bab2e..c7aaad283 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
@@ -70,6 +70,7 @@ query documentationsForCoursebook(
       id
       person {
         id
+        firstName
         fullName
       }
       absenceReason {
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
index 4c4c24675..bc0da4a74 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
@@ -10,12 +10,29 @@ import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.
       {{ $t("alsijil.coursebook.present_number", { present, total }) }}
     </v-chip>
     <absence-reason-chip
-      v-for="participation in absences"
-      :key="'absence-' + participation.id"
-      :absence-reason="participation.absenceReason"
+      v-for="[reasonId, participations] in Object.entries(absences)"
+      :key="'reason-' + reasonId"
+      :absence-reason="participations[0].absenceReason"
       dense
     >
-      <template #prepend> {{ participation.person.fullName }}: </template>
+      <template #append>
+        <span
+          >:
+          <span>
+            {{
+              participations
+                .slice(0, 5)
+                .map((participation) => participation.person.firstName)
+                .join(", ")
+            }}
+          </span>
+          <span v-if="participations.length > 5">
+            <!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
+            +{{ participations.length - 5 }}
+            <!-- eslint-enable @intlify/vue-i18n/no-raw-text -->
+          </span>
+        </span>
+      </template>
     </absence-reason-chip>
 
     <manage-students-trigger v-bind="documentationPartProps" />
@@ -41,8 +58,11 @@ export default {
     },
     absences() {
       // Get all course attendants who have an absence reason
-      return this.documentation.participations.filter(
-        (p) => p.absenceReason !== null,
+      return Object.groupBy(
+        this.documentation.participations.filter(
+          (p) => p.absenceReason !== null,
+        ),
+        ({ absenceReason }) => absenceReason.id,
       );
     },
   },
-- 
GitLab