From e65d2f4c88c8f637a21a0d558f4c17501210411d Mon Sep 17 00:00:00 2001
From: Jannik Menzel <jnk.menzel@gmail.com>
Date: Mon, 23 Jun 2025 11:36:04 +0200
Subject: [PATCH] added description to event-calendar

---
 layouts/_partials/event-calendar.html | 201 +++++++++++++-------------
 1 file changed, 103 insertions(+), 98 deletions(-)

diff --git a/layouts/_partials/event-calendar.html b/layouts/_partials/event-calendar.html
index 70909ea..7f8ace3 100644
--- a/layouts/_partials/event-calendar.html
+++ b/layouts/_partials/event-calendar.html
@@ -1,121 +1,126 @@
 {{ if or (eq .RelPermalink "/events/") (eq .RelPermalink "/en/events/") }}
-  <link href='https://cdn.jsdelivr.net/npm/fullcalendar@5/main.min.css' rel='stylesheet'/>
-  <script src='https://cdn.jsdelivr.net/npm/fullcalendar@5/main.min.js'></script>
-  <script src='https://cdn.jsdelivr.net/npm/fullcalendar@5/locales/de.js'></script>
-  <script src='https://cdn.jsdelivr.net/npm/ical.js@1.4.0/build/ical.min.js'></script>
-  <script>
-    /* global bootstrap */
-    document.addEventListener('DOMContentLoaded', async function () {
-      const calendarEl = document.getElementById('calendar');
-      const calendar = new FullCalendar.Calendar(calendarEl, {
-        initialView: 'dayGridMonth',
-        dayMaxEventRows: true,
-        height: 'auto',
-        locale: 'de',
-        firstDay: 1,
-        eventClick: function(info) {
-          const event = info.event;
-          const title = event.title;
-          const location = event.extendedProps.location || 'Nicht angegeben';
+    <link href='https://cdn.jsdelivr.net/npm/fullcalendar@5/main.min.css' rel='stylesheet'/>
+    <script src='https://cdn.jsdelivr.net/npm/fullcalendar@5/main.min.js'></script>
+    <script src='https://cdn.jsdelivr.net/npm/fullcalendar@5/locales/de.js'></script>
+    <script src='https://cdn.jsdelivr.net/npm/ical.js@1.4.0/build/ical.min.js'></script>
+    <script>
+        /* global bootstrap */
+        document.addEventListener('DOMContentLoaded', async function () {
+            const calendarEl = document.getElementById('calendar');
+            const calendar = new FullCalendar.Calendar(calendarEl, {
+                initialView: 'dayGridMonth',
+                dayMaxEventRows: true,
+                height: 'auto',
+                locale: 'de',
+                firstDay: 1,
+                eventClick: function (info) {
+                    const event = info.event;
+                    const title = event.title;
+                    const location = event.extendedProps.location || 'Nicht angegeben';
 
-          const start = event.start;
-          const end = event.end;
-          let dateStr = '';
+                    const start = event.start;
+                    const end = event.end;
+                    let dateStr = '';
 
-          if (start && end) {
-            dateStr = start.toLocaleString() + ' – ' + end.toLocaleString();
-          } else if (start) {
-            dateStr = start.toLocaleString();
-          }
+                    if (start && end) {
+                        dateStr = start.toLocaleString() + ' – ' + end.toLocaleString();
+                    } else if (start) {
+                        dateStr = start.toLocaleString();
+                    }
 
-          document.getElementById('modalEventTitle').textContent = title;
-          document.getElementById('modalEventDate').textContent = dateStr;
-          document.getElementById('modalEventLocation').textContent = location;
+                    document.getElementById('modalEventTitle').textContent = title;
+                    document.getElementById('modalEventDate').textContent = dateStr;
+                    document.getElementById('modalEventLocation').textContent = location;
+                    document.getElementById('modalEventDescription').textContent = event.extendedProps.description || 'Keine Beschreibung verfügbar';
 
-          const modal = new bootstrap.Modal(document.getElementById('eventModal'));
-          modal.show();
-        },
-      });
-      calendar.render();
+                    const modal = new bootstrap.Modal(document.getElementById('eventModal'));
+                    modal.show();
+                },
+            });
+            calendar.render();
 
-      try {
-        const response = await fetch('https://nc.ifsr.de/remote.php/dav/public-calendars/W5Sk7zLD28n6ze44/?export');
-        const icsData = await response.text();
+            try {
+                const response = await fetch('https://nc.ifsr.de/remote.php/dav/public-calendars/W5Sk7zLD28n6ze44/?export');
+                const icsData = await response.text();
 
-        const jcalData = ICAL.parse(icsData);
-        const comp = new ICAL.Component(jcalData, null);
-        const events = comp.getAllSubcomponents('vevent');
+                const jcalData = ICAL.parse(icsData);
+                const comp = new ICAL.Component(jcalData, null);
+                const events = comp.getAllSubcomponents('vevent');
 
-        console.log("ICS enthält", events.length, "Events");
+                console.log("ICS enthält", events.length, "Events");
 
-        const fcEvents = [];
+                const fcEvents = [];
 
-        events.forEach(event => {
-          try {
-            const icalEvent = new ICAL.Event(event);
+                events.forEach(event => {
+                    try {
+                        const icalEvent = new ICAL.Event(event);
 
-            if (icalEvent.isRecurring()) {
-              const expand = new ICAL.RecurExpansion({
-                component: event,
-                dtstart: icalEvent.startDate
-              });
+                        if (icalEvent.isRecurring()) {
+                            const expand = new ICAL.RecurExpansion({
+                                component: event,
+                                dtstart: icalEvent.startDate
+                            });
 
-              for (let i = 0; i < 30; i++) {
-                if (!expand.next()) break;
+                            for (let i = 0; i < 30; i++) {
+                                if (!expand.next()) break;
 
-                const next = expand.last;
-                fcEvents.push({
-                  title: icalEvent.summary || "Ohne Titel",
-                  start: next.toJSDate(),
-                  allDay: icalEvent.startDate.isDate,
-                  location: icalEvent.location,
+                                const next = expand.last;
+                                fcEvents.push({
+                                    title: icalEvent.summary || "Ohne Titel",
+                                    start: next.toJSDate(),
+                                    allDay: icalEvent.startDate.isDate,
+                                    location: icalEvent.location,
+                                    description: icalEvent.description,
+                                });
+                            }
+                        } else {
+                            const start = icalEvent.startDate?.toJSDate();
+                            const end = icalEvent.endDate?.toJSDate();
+                            if (!start) return;
+
+                            fcEvents.push({
+                                title: icalEvent.summary || "Ohne Titel",
+                                start: start,
+                                end: end,
+                                allDay: icalEvent.startDate.isDate,
+                                location: icalEvent.location,
+                                description: icalEvent.description,
+                            });
+                        }
+                    } catch (e) {
+                        console.warn("Fehler beim Parsen eines Events:", e);
+                    }
                 });
-              }
-            } else {
-              const start = icalEvent.startDate?.toJSDate();
-              const end = icalEvent.endDate?.toJSDate();
-              if (!start) return;
 
-              fcEvents.push({
-                title: icalEvent.summary || "Ohne Titel",
-                start: start,
-                end: end,
-                allDay: icalEvent.startDate.isDate,
-                location: icalEvent.location,
-              });
+                console.log("Nach dem Mapping:", fcEvents.length, "Events");
+
+                calendar.addEventSource(fcEvents);
+
+            } catch (error) {
+                console.error('Fehler beim Laden oder Parsen der ICS-Datei:', error);
             }
-          } catch (e) {
-            console.warn("Fehler beim Parsen eines Events:", e);
-          }
         });
-
-        console.log("Nach dem Mapping:", fcEvents.length, "Events");
-
-        calendar.addEventSource(fcEvents);
-
-      } catch (error) {
-        console.error('Fehler beim Laden oder Parsen der ICS-Datei:', error);
-      }
-    });
-  </script>
+    </script>
 {{ end }}
 
 <!-- Event Details Modal -->
 <div class="modal fade" id="eventModal" tabindex="-1" aria-labelledby="eventModalLabel" aria-hidden="true">
-  <div class="modal-dialog">
-    <div class="modal-content">
-      <div class="modal-header">
-        <h2 class="modal-title" id="eventModalLabel">Event Details</h2>
-        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
-      </div>
-      <div class="modal-body">
-        <h4 id="modalEventTitle"></h4>
-        <p><strong>Datum:</strong> <span id="modalEventDate"></span></p>
-        <p><strong>Ort:</strong> <span id="modalEventLocation"></span></p>
-      </div>
-      <div class="modal-footer">
-        <button type="button" class="btn btn-secondary btn-lg" data-bs-dismiss="modal">Schließen</button>
-      </div>
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h2 class="modal-title" id="eventModalLabel">Event Details</h2>
+                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+            </div>
+            <div class="modal-body">
+                <h4 id="modalEventTitle"></h4>
+                <p><strong>Datum:</strong> <span id="modalEventDate"></span></p>
+                <p><strong>Ort:</strong> <span id="modalEventLocation"></span></p>
+                <p><strong>Beschreibung:</strong></p>
+                <div id="modalEventDescription" style="overflow-wrap: anywhere; word-break: break-word;"></div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary btn-lg" data-bs-dismiss="modal">Schließen</button>
+            </div>
+        </div>
     </div>
-  </div>
 </div>