From 002c25a52d4ab9b401164997292ee08b509ad78f Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Wed, 5 Mar 2025 09:51:06 +0100
Subject: [PATCH] Allow extending the LessonDetails content slot

---
 .../calendar_feeds/details/LessonDetails.vue  | 17 ++++++++++++++++
 .../lessonEventAdditionalDetailsMixin.js      |  8 ++++++++
 aleksis/apps/chronos/frontend/index.js        | 20 +++++++++++++++++++
 3 files changed, 45 insertions(+)
 create mode 100644 aleksis/apps/chronos/frontend/components/calendar_feeds/mixins/lessonEventAdditionalDetailsMixin.js

diff --git a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
index 2f014dce..6fb7e652 100644
--- a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
@@ -100,6 +100,18 @@
           </v-list-item-title>
         </v-list-item-content>
       </v-list-item>
+      <template v-for="detail in additionalDetails">
+        <v-divider inset />
+        <v-list-item>
+          <v-list-item-content>
+            <component
+              :is="detail.component"
+              :key="detail.key"
+              :lesson="selectedEvent"
+            />
+          </v-list-item-content>
+        </v-list-item>
+      </template>
       <v-card-actions class="flex-wrap" style="gap: 0.5em">
         <amend-lesson
           v-if="selectedEvent"
@@ -149,6 +161,11 @@ export default {
         (action) => action.shouldDisplay.call(this, this.selectedEvent),
       );
     },
+    additionalDetails() {
+      return collections.chronosLessonEventCalendarAdditionalDetails.items.filter(
+        (detail) => detail.shouldDisplay.call(this, this.selectedEvent),
+      );
+    },
   },
 };
 </script>
diff --git a/aleksis/apps/chronos/frontend/components/calendar_feeds/mixins/lessonEventAdditionalDetailsMixin.js b/aleksis/apps/chronos/frontend/components/calendar_feeds/mixins/lessonEventAdditionalDetailsMixin.js
new file mode 100644
index 00000000..b08c58d1
--- /dev/null
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/mixins/lessonEventAdditionalDetailsMixin.js
@@ -0,0 +1,8 @@
+export default {
+  props: {
+    lesson: {
+      type: Object,
+      required: true,
+    },
+  },
+};
diff --git a/aleksis/apps/chronos/frontend/index.js b/aleksis/apps/chronos/frontend/index.js
index 2333a2d6..6d7b59e5 100644
--- a/aleksis/apps/chronos/frontend/index.js
+++ b/aleksis/apps/chronos/frontend/index.js
@@ -24,6 +24,26 @@ export const collections = [
     name: "lessonEventCalendarAdditionalActions",
     type: Object,
   },
+  /**
+   * List of components that show additional details for Lessons
+   * and Substitutions in the timetable/calendar.
+   *
+   * An object in this list looks like this:
+   * ```js
+   * {
+   *     component: () => import("foo.vue"),
+   *     shouldDisplay: (lessonEvent) => true || false,
+   *     key: "shouldBeUnique",
+   * }
+   * ```
+   *
+   * Please use the lessonEventAdditionalDetailsMixin
+   * as a base for the component.
+   */
+  {
+    name: "lessonEventCalendarAdditionalDetails",
+    type: Object,
+  },
 ];
 
 export default {
-- 
GitLab