From a94c06d893ac33869fcc3ad85a75c71981db92a1 Mon Sep 17 00:00:00 2001 From: Zan <62830223+Zan1456@users.noreply.github.com> Date: Thu, 15 Jan 2026 19:10:30 +0100 Subject: [PATCH] =?UTF-8?q?Dupla=20=C3=B3ra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- timetable/timetable.css | 25 ++++++++- timetable/timetable.js | 114 +++++++++++++++++++++++++++++++++------- 2 files changed, 119 insertions(+), 20 deletions(-) diff --git a/timetable/timetable.css b/timetable/timetable.css index 9c97b97..7ed0bc8 100644 --- a/timetable/timetable.css +++ b/timetable/timetable.css @@ -147,7 +147,8 @@ body { transition:all 0.3s cubic-bezier(0.4,0,0.2,1); transform:translateY(0); } -.lesson-card:hover { +.lesson-card:hover, +.lesson-card.group-hover { transform:translateY(-4px); box-shadow:0 8px 12px var(--accent-shadow); } @@ -162,6 +163,28 @@ body { opacity:0.5; text-decoration:line-through; } + +.lesson-card.lesson-spans-multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.lesson-card.lesson-continuation.continuation-middle { + border-radius: 0; +} +.lesson-card.lesson-continuation.continuation-end { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.lesson-slot.has-multi-start { + padding-bottom: 0; +} + +.lesson-slot.has-continuation { + padding-top: 0; +} + .lesson-subject { align-self:stretch; color:var(--text-primary); diff --git a/timetable/timetable.js b/timetable/timetable.js index 03f38fd..a145a80 100644 --- a/timetable/timetable.js +++ b/timetable/timetable.js @@ -313,10 +313,6 @@ } } - let cachedTestData = null; - let testDataTimestamp = 0; - const TEST_DATA_CACHE_DURATION = 60000; - async function loadAllTestDataFromAPI() { const now = Date.now(); if (cachedTestData && (now - testDataTimestamp) < TEST_DATA_CACHE_DURATION) { @@ -539,6 +535,26 @@ return timeA - timeB; }, ); + + function getLessonTimeSlots(lesson, allTimes) { + const startMinutes = helper.convertTimeToMinutes(lesson.startTime); + const endMinutes = helper.convertTimeToMinutes(lesson.endTime); + const slots = []; + for (let i = 0; i < allTimes.length; i++) { + const slotMinutes = helper.convertTimeToMinutes(allTimes[i]); + if (slotMinutes >= startMinutes && slotMinutes < endMinutes) { + slots.push(i); + } + } + return slots.length > 0 ? slots : [allTimes.indexOf(lesson.startTime)]; + } + + const lessonSlotMap = new Map(); + regularLessons.forEach(lesson => { + const slots = getLessonTimeSlots(lesson, times); + lessonSlotMap.set(lesson, slots); + }); + const days = [ LanguageManager.t("timetable.monday"), LanguageManager.t("timetable.tuesday"), @@ -604,31 +620,73 @@ const dayLessons = regularLessons.filter( (l) => l.startTime === time && l.day === dayIndex, ); + + const continuingInSlot = regularLessons.filter(lesson => { + if (lesson.day !== dayIndex) return false; + const slots = lessonSlotMap.get(lesson); + return slots && slots.includes(timeIndex) && slots[0] !== timeIndex; + }); + const hasMultiLesson = dayLessons.some(lesson => { + const slots = lessonSlotMap.get(lesson); + return slots && slots.length > 1; + }); + const lastLessonTime = lastLessonTimes[dayIndex]; const isAfterLastLesson = lastLessonTime && helper.convertTimeToMinutes(time) > helper.convertTimeToMinutes(lastLessonTime); - - if (dayLessons.length === 0 && isAfterLastLesson) { + + if (dayLessons.length === 0 && continuingInSlot.length === 0 && isAfterLastLesson) { return `
`; } - + + if (continuingInSlot.length > 0) { return ` -