Skip to content
Snippets Groups Projects
Commit 363daa54 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Merge branch '45-mini-timetables-should-also-work-with-parallel-lessons' into 'master'

Resolve "Mini timetables should also work with parallel lessons"

Closes #45

See merge request AlekSIS/onboarding/AlekSIS-App-Lesrooster!39
parents 988a8bab b09a0b61
No related branches found
No related tags found
1 merge request!39Resolve "Mini timetables should also work with parallel lessons"
Pipeline #181037 canceled
...@@ -21,6 +21,11 @@ export default defineComponent({ ...@@ -21,6 +21,11 @@ export default defineComponent({
required: false, required: false,
default: () => [], default: () => [],
}, },
oneLine: {
type: Boolean,
default: false,
required: false,
},
}, },
computed: { computed: {
subject() { subject() {
...@@ -69,8 +74,12 @@ export default defineComponent({ ...@@ -69,8 +74,12 @@ export default defineComponent({
v-bind="$attrs" v-bind="$attrs"
v-on="$listeners" v-on="$listeners"
> >
<div v-if="!loading" class="d-flex flex-column align-center my-1"> <div
<v-card-title 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" class="color d-flex justify-center flex-wrap px-3 py-0 ma-0"
> >
<span> <span>
...@@ -92,11 +101,11 @@ export default defineComponent({ ...@@ -92,11 +101,11 @@ export default defineComponent({
> >
{{ "course" in lesson ? lesson.course.name : lesson.name }} {{ "course" in lesson ? lesson.course.name : lesson.name }}
</v-card-subtitle> </v-card-subtitle>
</v-card-title> </component>
<v-card-subtitle <v-card-subtitle
class="color pa-0 ma-0 d-flex flex-wrap justify-center small-gap" 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> <v-tooltip bottom>
<template #activator="{ on, attrs }"> <template #activator="{ on, attrs }">
<colored-short-name-chip <colored-short-name-chip
...@@ -112,9 +121,7 @@ export default defineComponent({ ...@@ -112,9 +121,7 @@ export default defineComponent({
<span>{{ teacher.fullName }}</span> <span>{{ teacher.fullName }}</span>
</v-tooltip> </v-tooltip>
</span> </span>
<span v-for="(room, index) in lesson.rooms" :key="room.id"> <span v-for="room in lesson.rooms" :key="room.id">
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
<span v-if="index !== 0">, </span>
<v-tooltip bottom> <v-tooltip bottom>
<template #activator="{ on, attrs }"> <template #activator="{ on, attrs }">
<colored-short-name-chip <colored-short-name-chip
......
...@@ -17,6 +17,7 @@ export default defineComponent({ ...@@ -17,6 +17,7 @@ export default defineComponent({
return { return {
periods: [], periods: [],
weekdays: [], weekdays: [],
slots: [],
}; };
}, },
apollo: { apollo: {
...@@ -63,15 +64,40 @@ export default defineComponent({ ...@@ -63,15 +64,40 @@ export default defineComponent({
lessons() { lessons() {
return []; 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: { methods: {
styleForLesson(lesson) { styleForWeekdayAndPeriod(weekday, period) {
return { return {
gridArea: gridArea: `period-${period} / ${weekday} / ` + `span 1 / ${weekday}`,
`period-${lesson.slotStart.period} / ${lesson.slotStart.weekday} / ` +
`span ${lesson.slotEnd.period - lesson.slotStart.period + 1} / ${
lesson.slotEnd.weekday
}`,
}; };
}, },
}, },
...@@ -99,12 +125,21 @@ export default defineComponent({ ...@@ -99,12 +125,21 @@ export default defineComponent({
> >
<v-card-text>{{ $t("weekdays." + weekday) }}</v-card-text> <v-card-text>{{ $t("weekdays." + weekday) }}</v-card-text>
</v-card> </v-card>
<lesson-card <template v-for="weekday in weekdays">
v-for="lesson in lessons" <div
:lesson="lesson" v-for="period in periods"
:style="styleForLesson(lesson)" :key="'lesson-container-' + weekday + '-' + period"
:key="lesson.id" :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"
one-line
/>
</div>
</template>
<message-box type="info" v-if="!lessons || lessons.length === 0"> <message-box type="info" v-if="!lessons || lessons.length === 0">
{{ $t("lesrooster.timetable_management.no_lessons") }} {{ $t("lesrooster.timetable_management.no_lessons") }}
...@@ -119,11 +154,15 @@ export default defineComponent({ ...@@ -119,11 +154,15 @@ export default defineComponent({
.timetable { .timetable {
display: grid; display: grid;
grid-template: v-bind(gridTemplate); grid-template: v-bind(gridTemplate);
gap: 1em; gap: 0.7em;
} }
.timetable > * { .timetable > * {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.gap-small {
gap: 0.15em;
}
</style> </style>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment