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