From f4463bbd9a5c7d26a030a2c921696e300d0f12e6 Mon Sep 17 00:00:00 2001 From: viiivo <«vivien.vonburg@outlook.com»> Date: Thu, 23 Apr 2026 21:04:39 +0200 Subject: [PATCH] =?UTF-8?q?Anpassungen=20zu=20der=20Darstellung=20von=20Me?= =?UTF-8?q?ssages=20und=20Adresse=20im=20Profil.=20Disable=20Button=20wenn?= =?UTF-8?q?=20keine=20Abmeldung=20mehr=20m=C3=B6glich=20ist.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/stylesheet_global.css | 12 ++++- js/event_overview.js | 48 +++++++++++++------- js/my_profil.js | 95 ++++++++++++++++++++++++++++----------- 3 files changed, 111 insertions(+), 44 deletions(-) diff --git a/css/stylesheet_global.css b/css/stylesheet_global.css index 1ff4ed6..4d0f4df 100644 --- a/css/stylesheet_global.css +++ b/css/stylesheet_global.css @@ -471,12 +471,20 @@ label { transition: background-color 0.2s ease, border-color 0.2s ease; } -.button-primary-abmelden:hover, -.button-primary-abmelden:focus-visible { +.button-primary-abmelden:hover:not(:disabled), +.button-primary-abmelden:focus-visible:not(:disabled) { background: var(--blue-dark); border-color: var(--blue-dark); } +.button-primary-abmelden:disabled { + background-color: var(--blue); + border-color: var(--blue); + color: var(--butter-light); + opacity: 0.6; + cursor: not-allowed; +} + .button-primary-eigener-event{ display: inline-block; padding: 0.375rem 1.5rem; diff --git a/js/event_overview.js b/js/event_overview.js index be91f5d..3f638cc 100644 --- a/js/event_overview.js +++ b/js/event_overview.js @@ -286,28 +286,42 @@ day = Number(isoDateMatch[3]); } else { const monthMap = { - JAN: 1, - FEB: 2, - 'MÄR': 3, - MRZ: 3, - APR: 4, - MAI: 5, - JUN: 6, - JUL: 7, - AUG: 8, - SEP: 9, - OKT: 10, - NOV: 11, - DEZ: 12 + jan: 1, + januar: 1, + feb: 2, + februar: 2, + 'mär': 3, + mrz: 3, + mar: 3, + maerz: 3, + märz: 3, + apr: 4, + april: 4, + mai: 5, + jun: 6, + juni: 6, + jul: 7, + juli: 7, + aug: 8, + august: 8, + sep: 9, + sept: 9, + september: 9, + okt: 10, + oktober: 10, + nov: 11, + november: 11, + dez: 12, + dezember: 12 }; - const localizedMatch = dateValue.match(/^(\d{1,2})\.\s*([A-ZÄÖÜ]{3})\.\s*(\d{4})$/); + const localizedMatch = dateValue.match(/^(\d{1,2})\.\s*([A-Za-zÄÖÜäöü]{3,9})\.?\s*(\d{4})$/); if (!localizedMatch) { return null; } day = Number(localizedMatch[1]); - month = monthMap[localizedMatch[2]]; + month = monthMap[String(localizedMatch[2]).toLowerCase()]; year = Number(localizedMatch[3]); if (!month) { @@ -473,7 +487,9 @@ const actionMarkup = isOwnEvent ? '' : isRegistered - ? '' + ? (isRegistrationClosed + ? '' + : '') : isRegistrationClosed ? '' : isFull diff --git a/js/my_profil.js b/js/my_profil.js index 3f4feb6..aa4d7d4 100644 --- a/js/my_profil.js +++ b/js/my_profil.js @@ -494,6 +494,16 @@ }, 'registrations'); } + // Gibt true zurück, wenn die Abmeldung gesperrt ist (innerhalb von 24h oder in der Vergangenheit). + function isDeregistrationClosed(event) { + const eventDateTime = parseEventDateTime(event); + if (!eventDateTime || Number.isNaN(eventDateTime.getTime())) { + return false; + } + const msUntilStart = eventDateTime.getTime() - Date.now(); + return msUntilStart <= 24 * 60 * 60 * 1000; + } + // Baut die Eventkarten für beide Listen in einheitlichem Markup. function renderEventCards(container, events, emptyStateConfig, mode) { container.innerHTML = ''; @@ -515,6 +525,11 @@ const card = document.createElement('article'); card.className = 'profile-event-card profile-event-card-clickable'; card.setAttribute('data-event-id', String(event.id)); + let addressMessage = 'Vielen Dank für die Anmeldung! Die Adresse für diesen Event wird 24 Stunden vorher genau hier sichtbar sein.'; + if (isEventPastAddressWindow(event)) { + addressMessage = 'Vielen Dank, dass du an diesem Event teilgenommen hast.'; + } + const addressMarkup = mode === 'registrations' && event.address ? (isAddressVisibleWindow(event) ? ` @@ -526,17 +541,25 @@ : `

Adresse

-

Vielen Dank für die Anmeldung! Die Adresse für diesen Event wird 24 Stunden vorher genau hier sichtbar sein.

+

${addressMessage}

`) : ''; + const isDeregClosed = isDeregistrationClosed(event); + const actionMarkup = mode === 'registrations' - ? ` + ? (isDeregClosed + ? ` +
+ +
+ ` + : `
- ` + `) : `
@@ -556,17 +579,23 @@ }); } - // Gibt true zurück, wenn ein Event innerhalb der nächsten 24 Stunden startet. + // Gibt true zurück, wenn die Adresse sichtbar sein soll (24h vor bis 1h nach Start). function isAddressVisibleWindow(event) { const eventDateTime = parseEventDateTime(event); - if (!eventDateTime || Number.isNaN(eventDateTime.getTime())) { - return false; - } + if (!eventDateTime || Number.isNaN(eventDateTime.getTime())) return false; + const now = Date.now(); + const start = eventDateTime.getTime(); + const revealStart = start - (24 * 60 * 60 * 1000); + const revealEnd = start + (1 * 60 * 60 * 1000); + return now >= revealStart && now <= revealEnd; + } - const msUntilStart = eventDateTime.getTime() - Date.now(); - const twentyfourHoursInMs = 24 * 60 * 60 * 1000; - - return msUntilStart >= 0 && msUntilStart <= twentyfourHoursInMs; + // Gibt true zurück, wenn ein Event bereits vorbei ist (1h nach Start). + function isEventPastAddressWindow(event) { + const eventDateTime = parseEventDateTime(event); + if (!eventDateTime || Number.isNaN(eventDateTime.getTime())) return false; + const revealEnd = eventDateTime.getTime() + (1 * 60 * 60 * 1000); + return Date.now() > revealEnd; } // Parse für ISO- und lokalisierte Datumsformate aus den Eventdaten. @@ -587,28 +616,42 @@ day = Number(isoDateMatch[3]); } else { const monthMap = { - JAN: 1, - FEB: 2, - 'MÄR': 3, - MRZ: 3, - APR: 4, - MAI: 5, - JUN: 6, - JUL: 7, - AUG: 8, - SEP: 9, - OKT: 10, - NOV: 11, - DEZ: 12 + jan: 1, + januar: 1, + feb: 2, + februar: 2, + 'mär': 3, + mrz: 3, + mar: 3, + maerz: 3, + märz: 3, + apr: 4, + april: 4, + mai: 5, + jun: 6, + juni: 6, + jul: 7, + juli: 7, + aug: 8, + august: 8, + sep: 9, + sept: 9, + september: 9, + okt: 10, + oktober: 10, + nov: 11, + november: 11, + dez: 12, + dezember: 12 }; - const localizedMatch = dateValue.match(/^(\d{1,2})\.\s*([A-ZÄÖÜ]{3})\.\s*(\d{4})$/); + const localizedMatch = dateValue.match(/^(\d{1,2})\.\s*([A-Za-zÄÖÜäöü]{3,9})\.?\s*(\d{4})$/); if (!localizedMatch) { return null; } day = Number(localizedMatch[1]); - month = monthMap[localizedMatch[2]]; + month = monthMap[String(localizedMatch[2]).toLowerCase()]; year = Number(localizedMatch[3]); if (!month) {