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