From 4ffe5501b2f2d7d2a9a3e34328a02336933b1a85 Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Thu, 18 Apr 2024 16:31:17 +0200
Subject: [PATCH 1/4] Add `slots` field to data

---
 .../components/timetable_management/timetables/MiniTimeTable.vue | 1 +
 1 file changed, 1 insertion(+)

diff --git a/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue b/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue
index ff4de452..a444d6b6 100644
--- a/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue
+++ b/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue
@@ -17,6 +17,7 @@ export default defineComponent({
     return {
       periods: [],
       weekdays: [],
+      slots: [],
     };
   },
   apollo: {
-- 
GitLab


From fe76d41c46bf930788b383f3528ba1e0457c4bea Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Thu, 18 Apr 2024 16:34:52 +0200
Subject: [PATCH 2/4] Support concurrent lessons in mini timetables

---
 .../timetables/MiniTimeTable.vue              | 61 +++++++++++++++----
 1 file changed, 49 insertions(+), 12 deletions(-)

diff --git a/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue b/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue
index a444d6b6..98cede35 100644
--- a/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue
+++ b/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue
@@ -64,15 +64,40 @@ export default defineComponent({
     lessons() {
       return [];
     },
+    lessonsPerSlot() {
+      let weekdayPeriodSlots = Object.fromEntries(
+        this.weekdays.map((weekday) => [
+          weekday,
+          Object.fromEntries(this.periods.map((period) => [period, []])),
+        ]),
+      );
+
+      this.lessons?.forEach((lesson) => {
+        const weekdayStart = lesson.slotStart.weekday;
+        const weekdayEnd = lesson.slotEnd.weekday;
+        const periodStart = lesson.slotStart.period;
+        const periodEnd = lesson.slotEnd.period;
+
+        // If lesson start and end is on the same day, just add it in between the periods
+        if (weekdayStart === weekdayEnd) {
+          this.periods.map((period) => {
+            if (period <= periodEnd && period >= periodStart) {
+              weekdayPeriodSlots[weekdayStart][period].push(lesson);
+            }
+          });
+        } else {
+          // this is more complicated.
+          // As it is currently not possible to create timetables like this, we will just ignore it
+        }
+      });
+
+      return weekdayPeriodSlots;
+    },
   },
   methods: {
-    styleForLesson(lesson) {
+    styleForWeekdayAndPeriod(weekday, period) {
       return {
-        gridArea:
-          `period-${lesson.slotStart.period} / ${lesson.slotStart.weekday} / ` +
-          `span ${lesson.slotEnd.period - lesson.slotStart.period + 1} / ${
-            lesson.slotEnd.weekday
-          }`,
+        gridArea: `period-${period} / ${weekday} / ` + `span 1 / ${weekday}`,
       };
     },
   },
@@ -100,12 +125,20 @@ export default defineComponent({
     >
       <v-card-text>{{ $t("weekdays." + weekday) }}</v-card-text>
     </v-card>
-    <lesson-card
-      v-for="lesson in lessons"
-      :lesson="lesson"
-      :style="styleForLesson(lesson)"
-      :key="lesson.id"
-    />
+    <template v-for="weekday in weekdays">
+      <div
+        v-for="period in periods"
+        :key="'lesson-container-' + weekday + '-' + period"
+        :style="styleForWeekdayAndPeriod(weekday, period)"
+        class="d-flex flex-column gap-small"
+      >
+        <lesson-card
+          v-for="lesson in lessonsPerSlot[weekday][period]"
+          :lesson="lesson"
+          :key="lesson.id"
+        />
+      </div>
+    </template>
 
     <message-box type="info" v-if="!lessons || lessons.length === 0">
       {{ $t("lesrooster.timetable_management.no_lessons") }}
@@ -127,4 +160,8 @@ export default defineComponent({
   width: 100%;
   height: 100%;
 }
+
+.gap-small {
+  gap: 0.4em;
+}
 </style>
-- 
GitLab


From 1e5610332662114b649b4400061448e533f1c5c9 Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Thu, 18 Apr 2024 17:02:50 +0200
Subject: [PATCH 3/4] Remove comma separators in LessonCards

---
 .../frontend/components/timetable_management/LessonCard.vue | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/aleksis/apps/lesrooster/frontend/components/timetable_management/LessonCard.vue b/aleksis/apps/lesrooster/frontend/components/timetable_management/LessonCard.vue
index 1a2407e3..354ce790 100644
--- a/aleksis/apps/lesrooster/frontend/components/timetable_management/LessonCard.vue
+++ b/aleksis/apps/lesrooster/frontend/components/timetable_management/LessonCard.vue
@@ -96,7 +96,7 @@ export default defineComponent({
       <v-card-subtitle
         class="color pa-0 ma-0 d-flex flex-wrap justify-center small-gap"
       >
-        <span v-for="(teacher, index) in teachers" :key="teacher.id">
+        <span v-for="teacher in teachers" :key="teacher.id">
           <v-tooltip bottom>
             <template #activator="{ on, attrs }">
               <colored-short-name-chip
@@ -112,9 +112,7 @@ export default defineComponent({
             <span>{{ teacher.fullName }}</span>
           </v-tooltip>
         </span>
-        <span v-for="(room, index) in lesson.rooms" :key="room.id">
-          <!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
-          <span v-if="index !== 0">, </span>
+        <span v-for="room in lesson.rooms" :key="room.id">
           <v-tooltip bottom>
             <template #activator="{ on, attrs }">
               <colored-short-name-chip
-- 
GitLab


From b09a0b61e5ec70f6a935f40301ba86aa209c7725 Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Thu, 18 Apr 2024 17:03:41 +0200
Subject: [PATCH 4/4] Create one-line mode for LessonCards for Minitables

---
 .../timetable_management/LessonCard.vue           | 15 ++++++++++++---
 .../timetables/MiniTimeTable.vue                  |  5 +++--
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/aleksis/apps/lesrooster/frontend/components/timetable_management/LessonCard.vue b/aleksis/apps/lesrooster/frontend/components/timetable_management/LessonCard.vue
index 354ce790..2a27199d 100644
--- a/aleksis/apps/lesrooster/frontend/components/timetable_management/LessonCard.vue
+++ b/aleksis/apps/lesrooster/frontend/components/timetable_management/LessonCard.vue
@@ -21,6 +21,11 @@ export default defineComponent({
       required: false,
       default: () => [],
     },
+    oneLine: {
+      type: Boolean,
+      default: false,
+      required: false,
+    },
   },
   computed: {
     subject() {
@@ -69,8 +74,12 @@ export default defineComponent({
     v-bind="$attrs"
     v-on="$listeners"
   >
-    <div v-if="!loading" class="d-flex flex-column align-center my-1">
-      <v-card-title
+    <div
+      v-if="!loading"
+      :class="{ 'd-flex align-center my-1': true, 'flex-column': !oneLine }"
+    >
+      <component
+        :is="oneLine ? 'div' : 'v-card-title'"
         class="color d-flex justify-center flex-wrap px-3 py-0 ma-0"
       >
         <span>
@@ -92,7 +101,7 @@ export default defineComponent({
         >
           {{ "course" in lesson ? lesson.course.name : lesson.name }}
         </v-card-subtitle>
-      </v-card-title>
+      </component>
       <v-card-subtitle
         class="color pa-0 ma-0 d-flex flex-wrap justify-center small-gap"
       >
diff --git a/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue b/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue
index 98cede35..988a9b83 100644
--- a/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue
+++ b/aleksis/apps/lesrooster/frontend/components/timetable_management/timetables/MiniTimeTable.vue
@@ -136,6 +136,7 @@ export default defineComponent({
           v-for="lesson in lessonsPerSlot[weekday][period]"
           :lesson="lesson"
           :key="lesson.id"
+          one-line
         />
       </div>
     </template>
@@ -153,7 +154,7 @@ export default defineComponent({
 .timetable {
   display: grid;
   grid-template: v-bind(gridTemplate);
-  gap: 1em;
+  gap: 0.7em;
 }
 
 .timetable > * {
@@ -162,6 +163,6 @@ export default defineComponent({
 }
 
 .gap-small {
-  gap: 0.4em;
+  gap: 0.15em;
 }
 </style>
-- 
GitLab