From 68cbaf603d2d2f9a94238b958e86a9e4f2c04435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torben=20B=C3=B6hnke?= <torben.boehnke-makerspace@ruhr-uni-bochum.de> Date: Thu, 7 Sep 2023 17:43:07 +0200 Subject: [PATCH] Kalender-Demo Update --- docs/javascripts/colorswitchcalendar2.js | 2 +- docs/javascripts/ics_calendar2.js | 144 ++++++++++++++++++----- 2 files changed, 115 insertions(+), 31 deletions(-) diff --git a/docs/javascripts/colorswitchcalendar2.js b/docs/javascripts/colorswitchcalendar2.js index 9866f72bb..9b24ac92c 100644 --- a/docs/javascripts/colorswitchcalendar2.js +++ b/docs/javascripts/colorswitchcalendar2.js @@ -7,7 +7,7 @@ window.addEventListener('load', function() { if (palette && palette.index === 1) { iframe.src = "../calendar_dark2.html"; } else { - iframe.src = "../calendar.html2"; + iframe.src = "../calendar2.html"; } }, 100); // delay of 100 milliseconds }; diff --git a/docs/javascripts/ics_calendar2.js b/docs/javascripts/ics_calendar2.js index 9cba8521d..a1c49d40f 100644 --- a/docs/javascripts/ics_calendar2.js +++ b/docs/javascripts/ics_calendar2.js @@ -1,13 +1,6 @@ -let showPastEvents = false; +var showPastEvents = false; // Load iCalendar data -function adjustHeight() { - setTimeout(function() { - var calendarHeight = document.getElementById('calendar').offsetHeight; - window.parent.postMessage({ height: calendarHeight }, '*'); - }, 200); // wait for x milliseconds before measuring -} - window.addEventListener('message', function(event) { adjustHeight(); }, false); @@ -57,35 +50,24 @@ fetchAndParseICS() initialView: initialViewType, customButtons: { togglePastEvents: { - text: 'Toggle Past Events', - click: function() { - showPastEvents = !showPastEvents; - var view = calendar.view; - var displayStyle = view.type.includes('list') ? 'table-row' : 'block'; - var pastEvents = document.querySelectorAll('.past-event'); - pastEvents.forEach(function(eventEl) { - eventEl.style.display = showPastEvents ? displayStyle : 'none'; - }); - if (view.type.includes('list')) { - var pastDays = document.querySelectorAll('.fc-day-past'); - pastDays.forEach(function(dayEl) { - dayEl.style.display = showPastEvents ? 'table-row' : 'none'; - }); - } - adjustHeight(); + text: 'Zeige/Verstecke vergangene Termine', + click: function() { + showPastEvents = !showPastEvents; + handlePastEventsVisibility(); + } } - } }, headerToolbar: { - start: 'prev,next,today,togglePastEvents', + start: 'prev,next,today', center: 'title', - end: 'dayGridMonth,timeGridWeek,timeGridDay,listYear' + end: 'dayGridMonth,listYear' + }, + footerToolbar: { + start: 'togglePastEvents' }, views: { - dayGridMonth: { buttonText: 'Monat'}, + dayGridMonth: { buttonText: 'Kalender'}, listYear: { buttonText: 'Liste' }, - timeGridDay: { buttonText: 'Tag' }, - timeGridWeek: { buttonText: 'Woche' }, }, contentHeight: "auto", events: calendarEvents, @@ -110,6 +92,7 @@ fetchAndParseICS() eventDidMount: function(info) { clearTimeout(debounceTimer); debounceTimer = setTimeout(adjustHeight, 200); + handlePastEventsVisibility(); }, eventWillUnmount: function() { @@ -132,5 +115,106 @@ fetchAndParseICS() calendar.render(); + + function getWeekNumber(d) { + // Copy date so we don't modify the original + d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate())); + // Set to nearest Thursday: current date + 4 - current day number + d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7)); + // Get first day of the year + var yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); + // Calculate full weeks to nearest Thursday + var weekNo = Math.ceil((((d - yearStart) / 86400000) + 1) / 7); + return weekNo; + } + + function weeks(startDate, endDate) { + var startWeek = getWeekNumber(startDate); + var endWeek = getWeekNumber(endDate); + return (endWeek - startWeek) + 1; + } + + function getVisibleMultiDayEvents(calendarInstance, showPastEvents) { + var view = calendarInstance.view; + var visibleRangeStart = view.activeStart; + var visibleRangeEnd = view.activeEnd; + var currentDate = new Date(); // Current date + + var allEvents = calendarInstance.getEvents(); + var trulyVisibleEvents = allEvents.filter(function(event) { + // If showing past events, or the event end date is in the future + var isEventRelevant = showPastEvents || (event.end || event.start) >= currentDate; + + // Check if the event is within the visible range and is relevant + return event.start < visibleRangeEnd && (event.end || event.start) > visibleRangeStart && isEventRelevant; + }); + + var multiDayEvents = trulyVisibleEvents.filter(function(event) { + var start = event.start; + var end = event.end || start; + return (end.getTime() - start.getTime()) > 86400000; + }); + + return multiDayEvents; + } + + function getMultiDayEventsAdditionalHeight(calendarInstance) { + var additionalHeight = 0; + var multiDayEventHeight = 24.6; // As given by you + + var multiDayEvents = getVisibleMultiDayEvents(calendar, showPastEvents); // You'll need to implement this function + + for (var event of multiDayEvents) { + var startDate = event.start; + var endDate = event.end; + + // Calculate the number of weeks this event spans + var weeksSpanned = weeks(startDate, endDate); // Convert difference to weeks + + additionalHeight += weeksSpanned * multiDayEventHeight; + } + console.log("additionalHeight: ", additionalHeight); + return additionalHeight; + } + + function adjustHeight() { + setTimeout(function() { + var calendarHeight = document.getElementById('calendar').offsetHeight; + var additionalHeight = getMultiDayEventsAdditionalHeight(calendar); + + calendarHeight += additionalHeight; + + window.parent.postMessage({ height: calendarHeight }, '*'); + }, 200); // wait for x milliseconds before measuring + } + + // Show/Hide past events + function handlePastEventsVisibility() { + var view = calendar.view; + var displayStyle = view.type.includes('list') ? 'table-row' : 'block'; + var pastEvents = document.querySelectorAll('.past-event'); + pastEvents.forEach(function(eventEl) { + eventEl.style.display = showPastEvents ? displayStyle : 'none'; + }); + if (view.type.includes('list')) { + var pastDays = document.querySelectorAll('.fc-day-past'); + pastDays.forEach(function(dayEl) { + dayEl.style.display = showPastEvents ? 'table-row' : 'none'; + }); + } + adjustHeight(); + var visibleEvents = calendar.getEvents(); + console.log("All visible events:", visibleEvents); + var multiDayEvents = visibleEvents.filter(function(event) { + var start = event.start; + var end = event.end || start; + return (end.getTime() - start.getTime()) > 86400000; + }); + console.log("Filtered multi-day events:", multiDayEvents); + + } + adjustHeight(); }); + + -- GitLab