From 4aa505f821ef83c1d1279b0c6e16e40f67ce75fa Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Thu, 13 Jun 2024 17:22:38 +0200
Subject: [PATCH] Load extraMarks once for the coursebook

---
 .../frontend/components/coursebook/Coursebook.vue     |  9 +++++++++
 .../frontend/components/coursebook/CoursebookDay.vue  |  5 +++++
 .../coursebook/documentation/DocumentationModal.vue   |  8 +++++++-
 .../documentation/documentationPartMixin.js           |  8 ++++++++
 .../coursebook/personal_notes/ExtraMarksNote.vue      | 11 -----------
 5 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
index 4e673db88..1403a38bb 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
@@ -34,6 +34,7 @@
         @init="transition"
         :key="'day-' + date"
         ref="days"
+        :extra-marks="extraMarks"
       />
       <coursebook-loader />
 
@@ -73,6 +74,7 @@ import { documentationsForCoursebook } from "./coursebook.graphql";
 import CoursebookFilters from "./CoursebookFilters.vue";
 import CoursebookLoader from "./CoursebookLoader.vue";
 import CoursebookEmptyMessage from "./CoursebookEmptyMessage.vue";
+import { extraMarks } from "../extra_marks/extra_marks.graphql";
 
 export default {
   name: "Coursebook",
@@ -132,8 +134,15 @@ export default {
       initDate: false,
       currentDate: "",
       hashUpdater: false,
+      extraMarks: [],
     };
   },
+  apollo: {
+    extraMarks: {
+      query: extraMarks,
+      update: (data) => data.items,
+    },
+  },
   computed: {
     // Assertion: Should only fire on page load or selection change.
     //            Resets date range.
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
index 2f15c3fd0..c4a677c9f 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
@@ -12,6 +12,7 @@
         >
           <documentation-modal
             :documentation="doc"
+            :extra-marks="extraMarks"
             :affected-query="lastQuery"
           />
         </v-list-item>
@@ -45,6 +46,10 @@ export default {
       required: false,
       default: false,
     },
+    extraMarks: {
+      type: Array,
+      required: true,
+    },
   },
   emits: ["init"],
   methods: {
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
index 460f39f97..c10a5eb55 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
@@ -4,7 +4,7 @@
   <mobile-fullscreen-dialog v-model="popup" max-width="500px">
     <template #activator="activator">
       <!-- list view -> activate dialog -->
-      <documentation compact v-bind="$attrs" :dialog-activator="activator" />
+      <documentation compact v-bind="$attrs" :dialog-activator="activator" :extra-marks="extraMarks" />
     </template>
     <!-- dialog view -> deactivate dialog -->
     <!-- cancel | save (through lesson-summary) -->
@@ -27,5 +27,11 @@ export default {
       popup: false,
     };
   },
+  props: {
+    extraMarks: {
+      type: Array,
+      required: true,
+    },
+  },
 };
 </script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
index 88a8e852f..35243ee3c 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
@@ -33,6 +33,13 @@ export default {
       required: false,
       default: () => ({ attrs: {}, on: {} }),
     },
+    /**
+     * Once loaded list of all extra marks to avoid excessive network and database queries
+     */
+    extraMarks: {
+      type: Array,
+      required: true,
+    },
   },
 
   computed: {
@@ -46,6 +53,7 @@ export default {
         compact: this.compact,
         dialogActivator: this.dialogActivator,
         affectedQuery: this.affectedQuery,
+        extraMarks: this.extraMarks,
       };
     },
   },
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/personal_notes/ExtraMarksNote.vue b/aleksis/apps/alsijil/frontend/components/coursebook/personal_notes/ExtraMarksNote.vue
index d94a02f73..177b21e80 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/personal_notes/ExtraMarksNote.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/personal_notes/ExtraMarksNote.vue
@@ -13,17 +13,6 @@ export default {
       required: true,
     },
   },
-  data() {
-    return {
-      extraMarks: [],
-    };
-  },
-  apollo: {
-    extraMarks: {
-      query: extraMarks,
-      update: (data) => data.items,
-    },
-  },
 };
 </script>
 
-- 
GitLab