From be37ac4a80887a09f20e3a12794a6cca19db58f0 Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Wed, 14 Aug 2024 11:53:23 +0200
Subject: [PATCH] Update sendToServer to accept extramarks as well

---
 .../coursebook/absences/sendToServerMixin.js  | 39 +++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/sendToServerMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/absences/sendToServerMixin.js
index d75f72173..c417e016f 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/sendToServerMixin.js
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/sendToServerMixin.js
@@ -1,6 +1,7 @@
 /**
  * Mixin to provide shared functionality needed to send updated participation data to the server
  */
+import { createPersonalNotes } from "../personal_notes/personal_notes.graphql";
 import { updateParticipationStatuses } from "./participationStatus.graphql";
 import mutateMixin from "aleksis.core/mixins/mutateMixin.js";
 
@@ -18,6 +19,10 @@ export default {
         fieldValue = {
           tardiness: value,
         };
+      } else if (field === "extraMark") {
+        // Too much different logic → own method
+        this.addExtraMarks(participations, value);
+        return;
       } else {
         console.error(`Wrong field '${field}' for sendToServer`);
         return;
@@ -50,5 +55,39 @@ export default {
         },
       );
     },
+    addExtraMarks(participations, extraMarkId) {
+
+      // Get all participation statuses without this extra mark and get the respective person ids
+      const participants = participations.filter(
+          participation => !participation.notesWithExtraMark.some(note => note.extraMark.id === extraMarkId)
+      ).map(participation => participation.person.id)
+
+      // CREATE new personal note
+      this.mutate(
+        createPersonalNotes,
+        {
+          input: participants.map(person => (
+            {
+              documentation: this.documentation.id,
+              person: person,
+              extraMark: extraMarkId,
+            }
+          )),
+        },
+        (storedDocumentations, incomingPersonalNotes) => {
+          const documentation = storedDocumentations.find(
+            (doc) => doc.id === this.documentation.id,
+          );
+          incomingPersonalNotes.forEach((note, index) => {
+            const participationStatus = documentation.participations.find(
+                (part) => part.person.id === participants[index],
+            );
+            participationStatus.notesWithExtraMark.push(note);
+          });
+
+          return storedDocumentations;
+        },
+      );
+    }
   },
 };
-- 
GitLab