diff --git a/css/event_overview.css b/css/event_overview.css index cbe87b6..e437782 100644 --- a/css/event_overview.css +++ b/css/event_overview.css @@ -782,6 +782,27 @@ font-weight: 600; } +.detail-action-btn-wrap { + display: flex; + flex-direction: column; + align-items: center; + gap: 4px; +} + +.detail-dereg-hint { + display: block; + font-size: 11px; + font-weight: 400; + color: var(--olive); + opacity: 0.75; +} + +.detail-dereg-hint--closed { + color: var(--tomato); + font-weight: 500; + opacity: 1; +} + .detail-primary-btn { border-radius: var(--radius-pill); color: var(--white); diff --git a/css/stylesheet_global.css b/css/stylesheet_global.css index f3d8ded..ab73b3c 100644 --- a/css/stylesheet_global.css +++ b/css/stylesheet_global.css @@ -279,7 +279,7 @@ p { } .hidden { - display: none; + display: none !important; } /* Card Footer */ diff --git a/js/event_detail.js b/js/event_detail.js index a83870e..7180880 100644 --- a/js/event_detail.js +++ b/js/event_detail.js @@ -117,6 +117,25 @@ return msUntilStart <= twelveHoursInMs; } + // Abmeldefrist: 1 Tag (24 h) vor Eventstart. + function getDeregistrationInfo(event) { + const eventDateTime = parseEventDateTime(event); + if (!eventDateTime || Number.isNaN(eventDateTime.getTime())) { + return { daysLeft: null, isClosed: false }; + } + + const oneDayMs = 24 * 60 * 60 * 1000; + const deadlineMs = eventDateTime.getTime() - oneDayMs; + const msUntilDeadline = deadlineMs - Date.now(); + + if (msUntilDeadline <= 0) { + return { daysLeft: 0, isClosed: true }; + } + + const daysLeft = Math.ceil(msUntilDeadline / oneDayMs); + return { daysLeft, isClosed: false }; + } + // Adresse ist nur im 12h-Fenster VOR Eventstart sichtbar. function isAddressVisibleWindow(event) { const eventDateTime = parseEventDateTime(event); @@ -276,6 +295,7 @@ const isFull = freePlaces === 0; const isRegistrationClosed = isRegistrationClosedForEvent(event); const isOwnEvent = isEventOwnedByCurrentUser(event, currentUser); + const deregInfo = getDeregistrationInfo(event); const userRegistrations = currentUser?.email && Array.isArray(registrationMap[currentUser.email]) ? registrationMap[currentUser.email].map(id => Number(id)) : []; @@ -287,11 +307,13 @@ : !currentUser ? 'Einloggen' : isRegistered - ? 'Abmelden' + ? (deregInfo.isClosed ? 'Abmeldung geschlossen' : 'Abmelden') : isRegistrationClosed ? 'Anmeldung geschlossen' : 'Anmelden'; - const actionButtonDisabled = isOwnEvent || (!isRegistered && (isFull || isRegistrationClosed)); + const actionButtonDisabled = isOwnEvent + || (!isRegistered && (isFull || isRegistrationClosed)) + || (isRegistered && deregInfo.isClosed); const actionButtonVariantClass = isOwnEvent ? ' detail-primary-btn-own' : isRegistered @@ -367,7 +389,6 @@