From 051e15b83c2bd20282b700cd5aee0c75014df819 Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Thu, 13 Jun 2024 17:23:13 +0200
Subject: [PATCH] Show extramarks in the coursebook overview

---
 .../absences/participationStatus.graphql      |  1 +
 .../components/coursebook/coursebook.graphql  |  1 +
 .../coursebook/documentation/LessonNotes.vue  | 41 +++++++++++++++
 .../components/extra_marks/ExtraMarkChip.vue  | 51 +++++++++++++++++++
 4 files changed, 94 insertions(+)
 create mode 100644 aleksis/apps/alsijil/frontend/components/extra_marks/ExtraMarkChip.vue

diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
index aafb3409f..61c486a70 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
@@ -39,6 +39,7 @@ mutation touchDocumentation($documentationId: ID!) {
           id
           extraMark {
             id
+            showInCoursebook
           }
         }
         notesWithNote {
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
index f1c4012c3..2505ee24b 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
@@ -83,6 +83,7 @@ query documentationsForCoursebook(
         id
         extraMark {
           id
+          showInCoursebook
         }
       }
       notesWithNote {
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
index bc0da4a74..641e346b6 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
@@ -1,5 +1,6 @@
 <script setup>
 import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.vue";
+import ExtraMarkChip from "../../extra_marks/ExtraMarkChip.vue";
 </script>
 
 <template>
@@ -35,6 +36,32 @@ import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.
       </template>
     </absence-reason-chip>
 
+    <extra-mark-chip
+      v-for="[markId, [mark, ...participations]] in Object.entries(extraMarkChips)"
+      :key="'extra-mark-' + markId"
+      :extra-mark="mark"
+      dense
+    >
+      <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>
+    </extra-mark-chip>
+
     <manage-students-trigger v-bind="documentationPartProps" />
   </div>
 </template>
@@ -65,6 +92,20 @@ export default {
         ({ absenceReason }) => absenceReason.id,
       );
     },
+    extraMarkChips() {
+      return this.documentation.participations.reduce((value, p) => {
+        p.notesWithExtraMark.forEach(({ extraMark }) => {
+          if (extraMark.showInCoursebook) {
+            if (value[extraMark.id]) {
+              value[extraMark.id].push(p);
+            } else {
+              value[extraMark.id] = [this.extraMarks.find(e => e.id === extraMark.id), p];
+            }
+          }
+        });
+        return value;
+      }, {});
+    },
   },
 };
 </script>
diff --git a/aleksis/apps/alsijil/frontend/components/extra_marks/ExtraMarkChip.vue b/aleksis/apps/alsijil/frontend/components/extra_marks/ExtraMarkChip.vue
new file mode 100644
index 000000000..28bdc85d5
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/extra_marks/ExtraMarkChip.vue
@@ -0,0 +1,51 @@
+<script>
+import CounterChip from "aleksis.core/components/generic/chips/CounterChip.vue";
+
+export default {
+  name: "ExtraMarkChip",
+  components: { CounterChip },
+  props: {
+    extraMark: {
+      type: Object,
+      required: true,
+    },
+    short: {
+      type: Boolean,
+      required: false,
+      default: false,
+    },
+    loading: {
+      type: Boolean,
+      required: false,
+      default: false,
+    },
+  },
+  extends: CounterChip,
+  computed: {
+    text() {
+      return this.short
+        ? this.extraMark.shortName
+        : this.extraMark.name;
+    },
+  },
+};
+</script>
+
+<template>
+  <counter-chip
+    :color="extraMark.colourBg"
+    :text-color="extraMark.colourFg"
+    :value="extraMark.id"
+    :count="count"
+    :outlined="false"
+    v-bind="$attrs"
+    v-on="$listeners"
+  >
+    <slot name="prepend" />
+    {{ text }}
+    <slot name="append" />
+    <v-avatar right v-if="loading">
+      <v-progress-circular indeterminate :size="16" :width="2" />
+    </v-avatar>
+  </counter-chip>
+</template>
-- 
GitLab