From ff5f2ab8a6deb130706566d4a9d31d5a140574c0 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Thu, 28 Mar 2024 17:29:00 +0100
Subject: [PATCH] Use common base component for lesson details and event bar

---
 .../calendar_feeds/details/LessonDetails.vue  | 18 ++--
 .../details/SupervisionDetails.vue            | 94 ++-----------------
 .../event_bar/LessonEventBar.vue              | 18 +++-
 .../event_bar/SupervisionEventBar.vue         | 87 ++---------------
 4 files changed, 39 insertions(+), 178 deletions(-)

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 d82baa74..cd91c0cd 100644
--- a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/LessonDetails.vue
@@ -5,13 +5,17 @@
     without-location
   >
     <template #title>
-      <div
-        :style="{
-          color: currentSubject ? currentSubject.colour_fg || 'white' : 'white',
-        }"
-      >
-        <lesson-event-subject :event="selectedEvent" />
-      </div>
+      <slot name="title">
+        <div
+          :style="{
+            color: currentSubject
+              ? currentSubject.colour_fg || 'white'
+              : 'white',
+          }"
+        >
+          <lesson-event-subject :event="selectedEvent" />
+        </div>
+      </slot>
     </template>
     <template #badge>
       <cancelled-calendar-status-chip
diff --git a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/SupervisionDetails.vue b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/SupervisionDetails.vue
index dce19848..2aa6f026 100644
--- a/aleksis/apps/chronos/frontend/components/calendar_feeds/details/SupervisionDetails.vue
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/details/SupervisionDetails.vue
@@ -1,102 +1,20 @@
 <template>
-  <base-calendar-feed-details
-    v-bind="$props"
-    :color="currentSubject ? currentSubject.colour_bg : null"
-    without-location
-  >
+  <lesson-details v-bind="$attrs" v-on="$listeners">
     <template #title>
       <v-icon class="mr-1">mdi-coffee</v-icon>
       {{ $t("chronos.supervisions.title") }}
     </template>
-    <template #badge>
-      <cancelled-calendar-status-chip
-        v-if="selectedEvent.meta.cancelled"
-        class="ml-4"
-      />
-      <calendar-status-chip
-        color="warning"
-        icon="mdi-clipboard-alert-outline"
-        v-else-if="selectedEvent.meta.amended"
-        class="ml-4"
-      >
-        {{ $t("chronos.event.current_changes") }}
-      </calendar-status-chip>
-    </template>
-    <template #description>
-      <v-divider inset />
-      <v-list-item>
-        <v-list-item-icon>
-          <v-icon color="primary">mdi-human-male-board </v-icon>
-        </v-list-item-icon>
-        <v-list-item-content>
-          <v-list-item-title>
-            <span v-if="teachers.length === 0" class="body-2 text--secondary">{{
-              $t("chronos.event.no_teacher")
-            }}</span>
-            <lesson-related-object-chip
-              v-for="teacher in teachers"
-              :status="teacher.status"
-              :key="teacher.id"
-              new-icon="mdi-account-plus-outline"
-              >{{ teacher.full_name }}</lesson-related-object-chip
-            >
-          </v-list-item-title>
-        </v-list-item-content>
-      </v-list-item>
-      <v-list-item>
-        <v-list-item-icon>
-          <v-icon color="primary">mdi-door </v-icon>
-        </v-list-item-icon>
-        <v-list-item-content>
-          <v-list-item-title>
-            <span v-if="rooms.length === 0" class="body-2 text--secondary">{{
-              $t("chronos.event.no_room")
-            }}</span>
-            <lesson-related-object-chip
-              v-for="room in rooms"
-              :status="room.status"
-              :key="room.id"
-              new-icon="mdi-door-open"
-              >{{ room.name }}</lesson-related-object-chip
-            >
-          </v-list-item-title>
-        </v-list-item-content>
-      </v-list-item>
-      <v-divider inset />
-      <v-list-item v-if="selectedEvent.meta.comment">
-        <v-list-item-content>
-          <v-list-item-title>
-            <v-alert
-              dense
-              outlined
-              type="warning"
-              icon="mdi-information-outline"
-            >
-              {{ selectedEvent.meta.comment }}
-            </v-alert>
-          </v-list-item-title>
-        </v-list-item-content>
-      </v-list-item>
-    </template>
-  </base-calendar-feed-details>
+  </lesson-details>
 </template>
 
 <script>
-import calendarFeedDetailsMixin from "aleksis.core/mixins/calendarFeedDetails.js";
-import BaseCalendarFeedDetails from "aleksis.core/components/calendar/BaseCalendarFeedDetails.vue";
-import CalendarStatusChip from "aleksis.core/components/calendar/CalendarStatusChip.vue";
-import CancelledCalendarStatusChip from "aleksis.core/components/calendar/CancelledCalendarStatusChip.vue";
+import LessonDetails from "./LessonDetails.vue";
 
-import LessonRelatedObjectChip from "../../LessonRelatedObjectChip.vue";
-import lessonEvent from "../mixins/lessonEvent";
 export default {
-  name: "LessonDetails",
+  name: "SupervisionDetails",
+  extends: [LessonDetails],
   components: {
-    LessonRelatedObjectChip,
-    BaseCalendarFeedDetails,
-    CalendarStatusChip,
-    CancelledCalendarStatusChip,
+    LessonDetails,
   },
-  mixins: [calendarFeedDetailsMixin, lessonEvent],
 };
 </script>
diff --git a/aleksis/apps/chronos/frontend/components/calendar_feeds/event_bar/LessonEventBar.vue b/aleksis/apps/chronos/frontend/components/calendar_feeds/event_bar/LessonEventBar.vue
index fa5d2fb1..b63154d6 100644
--- a/aleksis/apps/chronos/frontend/components/calendar_feeds/event_bar/LessonEventBar.vue
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/event_bar/LessonEventBar.vue
@@ -11,9 +11,9 @@
         class="d-flex justify-start"
         :class="{
           'px-1': true,
-          'orange-border':
+          'current-changes':
             selectedEvent.meta.amended && !selectedEvent.meta.cancelled,
-          'red-border': selectedEvent.meta.cancelled,
+          cancelled: selectedEvent.meta.cancelled,
           'text-decoration-line-through': selectedEvent.meta.cancelled,
         }"
         :style="{
@@ -32,6 +32,8 @@
           class="d-flex justify-center align-center flex-grow-1 text-truncate"
         >
           <div class="d-flex justify-center align-center flex-wrap text">
+            <slot name="additionalElements"></slot>
+
             <lesson-event-link-iterator
               v-if="!selectedEvent.meta.is_member"
               :items="selectedEvent.meta.groups"
@@ -47,6 +49,7 @@
             />
 
             <lesson-event-subject
+              v-if="withSubject"
               :event="selectedEvent"
               attr="short_name"
               class="font-weight-medium mr-1"
@@ -84,16 +87,23 @@ export default {
       return this.event;
     },
   },
+  props: {
+    withSubject: {
+      type: Boolean,
+      default: true,
+      required: false,
+    },
+  },
   mixins: [calendarFeedEventBarMixin, lessonEvent],
 };
 </script>
 
 <style scoped>
-.orange-border {
+.current-changes {
   border: 3px orange solid;
 }
 
-.red-border {
+.cancelled {
   border: 3px red solid;
 }
 
diff --git a/aleksis/apps/chronos/frontend/components/calendar_feeds/event_bar/SupervisionEventBar.vue b/aleksis/apps/chronos/frontend/components/calendar_feeds/event_bar/SupervisionEventBar.vue
index 5a8ccb01..59894990 100644
--- a/aleksis/apps/chronos/frontend/components/calendar_feeds/event_bar/SupervisionEventBar.vue
+++ b/aleksis/apps/chronos/frontend/components/calendar_feeds/event_bar/SupervisionEventBar.vue
@@ -1,90 +1,19 @@
 <template>
-  <base-calendar-feed-event-bar
-    :with-padding="false"
-    :without-time="true"
-    v-bind="$props"
-  >
-    <template #icon> </template>
-
-    <template #title>
-      <div
-        class="d-flex justify-start"
-        :class="{
-          'px-1': true,
-          'orange-border':
-            selectedEvent.meta.amended && !selectedEvent.meta.cancelled,
-          'red-border': selectedEvent.meta.cancelled,
-          'text-decoration-line-through': selectedEvent.meta.cancelled,
-        }"
-        :style="{
-          height: '100%',
-          borderRadius: '4px',
-        }"
-      >
-        <span
-          v-if="calendarType === 'month' && eventParsed.start.hasTime"
-          class="mr-1 font-weight-bold ml-1"
-        >
-          {{ eventParsed.start.time }}
-        </span>
-        <div
-          class="d-flex justify-center align-center flex-grow-1 text-truncate"
-        >
-          <div class="d-flex justify-center align-center flex-wrap text">
-            <v-icon size="12" color="white" class="mr-1">mdi-coffee</v-icon>
-
-            <lesson-event-old-new
-              v-if="!selectedEvent.meta.is_teacher || newTeachers.length > 0"
-              :new-items="newTeachers"
-              :old-items="oldTeachers"
-              attr="short_name"
-              class="mr-1"
-            />
-
-            <lesson-event-old-new
-              :new-items="newRooms"
-              :old-items="oldRooms"
-              attr="short_name"
-            />
-          </div>
-        </div>
-      </div>
+  <lesson-event-bar :with-subject="false" v-bind="$attrs" v-on="$listeners">
+    <template #additionalElements>
+      <v-icon size="12" color="white" class="mr-1">mdi-coffee</v-icon>
     </template>
-  </base-calendar-feed-event-bar>
+  </lesson-event-bar>
 </template>
 
 <script>
-import calendarFeedEventBarMixin from "aleksis.core/mixins/calendarFeedEventBar.js";
-import BaseCalendarFeedEventBar from "aleksis.core/components/calendar/BaseCalendarFeedEventBar.vue";
-import lessonEvent from "../mixins/lessonEvent";
-import LessonEventOldNew from "../../LessonEventOldNew.vue";
+import LessonEventBar from "./LessonEventBar.vue";
 
 export default {
-  name: "LessonEventBar",
+  name: "SupervisionEventBar",
   components: {
-    LessonEventOldNew,
-    BaseCalendarFeedEventBar,
-  },
-  computed: {
-    selectedEvent() {
-      return this.event;
-    },
+    LessonEventBar,
   },
-  mixins: [calendarFeedEventBarMixin, lessonEvent],
+  extends: [LessonEventBar],
 };
 </script>
-
-<style scoped>
-.orange-border {
-  border: 3px orange solid;
-}
-
-.red-border {
-  border: 3px red solid;
-}
-
-.text {
-  line-height: 1.1;
-  font-size: 12px;
-}
-</style>
-- 
GitLab