From aa68ceacdb6bbd19831628332cc8d6d133a84c48 Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Fri, 30 Aug 2024 12:12:30 +0200
Subject: [PATCH] Load subjects once for the entire coursebook

---
 .../alsijil/frontend/components/coursebook/Coursebook.vue | 7 +++++++
 .../coursebook/documentation/DocumentationModal.vue       | 6 ++++++
 .../coursebook/documentation/LessonInformation.vue        | 2 +-
 .../coursebook/documentation/documentationPartMixin.js    | 8 ++++++++
 4 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
index ecf771d40..21b903a2f 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
@@ -53,6 +53,7 @@
           :is="itemComponent"
           :extra-marks="extraMarks"
           :absence-reasons="absenceReasons"
+          :subjects="subjects"
           :documentation="item"
           :affected-query="lastQuery"
           :value="(selectedParticipations[item.id] ??= [])"
@@ -87,6 +88,7 @@ import { extraMarks } from "../extra_marks/extra_marks.graphql";
 import DocumentationLoader from "./documentation/DocumentationLoader.vue";
 import sendToServerMixin from "./absences/sendToServerMixin";
 import { absenceReasons } from "./absences/absenceReasons.graphql";
+import { subjects } from "aleksis.apps.cursus/components/subject.graphql";
 
 export default {
   name: "Coursebook",
@@ -157,6 +159,7 @@ export default {
       hashUpdater: false,
       extraMarks: [],
       absenceReasons: [],
+      subjects: [],
       selectedParticipations: {},
     };
   },
@@ -169,6 +172,10 @@ export default {
       query: absenceReasons,
       update: (data) => data.items,
     },
+    subjects: {
+      query: subjects,
+      update: (data) => data.items,
+    },
   },
   computed: {
     // Assertion: Should only fire on page load or selection change.
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
index 177e886f5..5b5dd101b 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
@@ -10,6 +10,7 @@
         :dialog-activator="activator"
         :extra-marks="extraMarks"
         :absence-reasons="absenceReasons"
+        :subjects="subjects"
       />
     </template>
     <!-- dialog view -> deactivate dialog -->
@@ -18,6 +19,7 @@
       v-bind="$attrs"
       :extra-marks="extraMarks"
       :absence-reasons="absenceReasons"
+      :subjects="subjects"
       @close="popup = false"
     />
   </mobile-fullscreen-dialog>
@@ -47,6 +49,10 @@ export default {
       type: Array,
       required: true,
     },
+    subjects: {
+      type: Array,
+      required: true,
+    },
   },
 };
 </script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
index 2f692025e..a104d8442 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
@@ -63,8 +63,8 @@ import SubjectChipSelectField from "aleksis.apps.cursus/components/SubjectChipSe
       <template v-if="documentation.subject">
         <subject-chip-select-field
           v-if="documentation.canEdit"
+          :items="subjects"
           :value="documentation.subject"
-          :enable-create="false"
           :disabled="loading"
           :loading="loading"
           @input="editSubject"
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
index 886803b43..2b30e38d5 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
@@ -47,6 +47,13 @@ export default {
       type: Array,
       required: true,
     },
+    /**
+     * Once loaded list of subjects to avoid excessive network and database queries
+     */
+    subjects: {
+      type: Array,
+      required: true,
+    },
   },
 
   computed: {
@@ -62,6 +69,7 @@ export default {
         affectedQuery: this.affectedQuery,
         extraMarks: this.extraMarks,
         absenceReasons: this.absenceReasons,
+        subjects: this.subjects,
       };
     },
   },
-- 
GitLab