Anpassungen zu der Darstellung von Messages und Adresse im Profil. Disable Button wenn keine Abmeldung mehr möglich ist.

This commit is contained in:
viiivo 2026-04-23 21:04:39 +02:00
parent ae631cd463
commit f4463bbd9a
3 changed files with 111 additions and 44 deletions

View File

@ -471,12 +471,20 @@ label {
transition: background-color 0.2s ease, border-color 0.2s ease; transition: background-color 0.2s ease, border-color 0.2s ease;
} }
.button-primary-abmelden:hover, .button-primary-abmelden:hover:not(:disabled),
.button-primary-abmelden:focus-visible { .button-primary-abmelden:focus-visible:not(:disabled) {
background: var(--blue-dark); background: var(--blue-dark);
border-color: 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{ .button-primary-eigener-event{
display: inline-block; display: inline-block;
padding: 0.375rem 1.5rem; padding: 0.375rem 1.5rem;

View File

@ -286,28 +286,42 @@
day = Number(isoDateMatch[3]); day = Number(isoDateMatch[3]);
} else { } else {
const monthMap = { const monthMap = {
JAN: 1, jan: 1,
FEB: 2, januar: 1,
'MÄR': 3, feb: 2,
MRZ: 3, februar: 2,
APR: 4, 'mär': 3,
MAI: 5, mrz: 3,
JUN: 6, mar: 3,
JUL: 7, maerz: 3,
AUG: 8, märz: 3,
SEP: 9, apr: 4,
OKT: 10, april: 4,
NOV: 11, mai: 5,
DEZ: 12 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) { if (!localizedMatch) {
return null; return null;
} }
day = Number(localizedMatch[1]); day = Number(localizedMatch[1]);
month = monthMap[localizedMatch[2]]; month = monthMap[String(localizedMatch[2]).toLowerCase()];
year = Number(localizedMatch[3]); year = Number(localizedMatch[3]);
if (!month) { if (!month) {
@ -473,7 +487,9 @@
const actionMarkup = isOwnEvent const actionMarkup = isOwnEvent
? '<button class="button-primary-eigener-event" type="button" data-registration-action="own" disabled>Dein Event!</button>' ? '<button class="button-primary-eigener-event" type="button" data-registration-action="own" disabled>Dein Event!</button>'
: isRegistered : isRegistered
? '<button class="button-primary button-primary-abmelden" type="button" data-registration-action="unregister">Abmelden</button>' ? (isRegistrationClosed
? '<button class="button-primary button-primary-abmelden" type="button" disabled>Abmeldung geschlossen</button>'
: '<button class="button-primary button-primary-abmelden" type="button" data-registration-action="unregister">Abmelden</button>')
: isRegistrationClosed : isRegistrationClosed
? '<button class="button-primary" button-plaetze" type="button" data-registration-action="closed" disabled>Anmeldung geschlossen</button>' ? '<button class="button-primary" button-plaetze" type="button" data-registration-action="closed" disabled>Anmeldung geschlossen</button>'
: isFull : isFull

View File

@ -494,6 +494,16 @@
}, 'registrations'); }, '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. // Baut die Eventkarten für beide Listen in einheitlichem Markup.
function renderEventCards(container, events, emptyStateConfig, mode) { function renderEventCards(container, events, emptyStateConfig, mode) {
container.innerHTML = ''; container.innerHTML = '';
@ -515,6 +525,11 @@
const card = document.createElement('article'); const card = document.createElement('article');
card.className = 'profile-event-card profile-event-card-clickable'; card.className = 'profile-event-card profile-event-card-clickable';
card.setAttribute('data-event-id', String(event.id)); 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 const addressMarkup = mode === 'registrations' && event.address
? (isAddressVisibleWindow(event) ? (isAddressVisibleWindow(event)
? ` ? `
@ -526,17 +541,25 @@
: ` : `
<div class="profile-event-address-block" aria-label="Hinweis zur Adresse"> <div class="profile-event-address-block" aria-label="Hinweis zur Adresse">
<p class="profile-event-address-label">Adresse</p> <p class="profile-event-address-label">Adresse</p>
<p class="profile-event-address">Vielen Dank für die Anmeldung! Die Adresse für diesen Event wird 24 Stunden vorher genau hier sichtbar sein.</p> <p class="profile-event-address">${addressMessage}</p>
</div> </div>
`) `)
: ''; : '';
const isDeregClosed = isDeregistrationClosed(event);
const actionMarkup = mode === 'registrations' const actionMarkup = mode === 'registrations'
? (isDeregClosed
? ` ? `
<div class="event-side">
<button class="button-primary-abmelden" type="button" disabled>Abmeldung geschlossen</button>
</div>
`
: `
<div class="event-side"> <div class="event-side">
<button class="button-primary-abmelden" type="button" data-unregister-id="${event.id}">Abmelden</button> <button class="button-primary-abmelden" type="button" data-unregister-id="${event.id}">Abmelden</button>
</div> </div>
` `)
: ` : `
<div class="event-side"> <div class="event-side">
<button class="button-primary-eigener-event" type="button" data-cancel-event-id="${event.id}">Event absagen</button> <button class="button-primary-eigener-event" type="button" data-cancel-event-id="${event.id}">Event absagen</button>
@ -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) { function isAddressVisibleWindow(event) {
const eventDateTime = parseEventDateTime(event); const eventDateTime = parseEventDateTime(event);
if (!eventDateTime || Number.isNaN(eventDateTime.getTime())) { if (!eventDateTime || Number.isNaN(eventDateTime.getTime())) return false;
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(); // Gibt true zurück, wenn ein Event bereits vorbei ist (1h nach Start).
const twentyfourHoursInMs = 24 * 60 * 60 * 1000; function isEventPastAddressWindow(event) {
const eventDateTime = parseEventDateTime(event);
return msUntilStart >= 0 && msUntilStart <= twentyfourHoursInMs; 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. // Parse für ISO- und lokalisierte Datumsformate aus den Eventdaten.
@ -587,28 +616,42 @@
day = Number(isoDateMatch[3]); day = Number(isoDateMatch[3]);
} else { } else {
const monthMap = { const monthMap = {
JAN: 1, jan: 1,
FEB: 2, januar: 1,
'MÄR': 3, feb: 2,
MRZ: 3, februar: 2,
APR: 4, 'mär': 3,
MAI: 5, mrz: 3,
JUN: 6, mar: 3,
JUL: 7, maerz: 3,
AUG: 8, märz: 3,
SEP: 9, apr: 4,
OKT: 10, april: 4,
NOV: 11, mai: 5,
DEZ: 12 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) { if (!localizedMatch) {
return null; return null;
} }
day = Number(localizedMatch[1]); day = Number(localizedMatch[1]);
month = monthMap[localizedMatch[2]]; month = monthMap[String(localizedMatch[2]).toLowerCase()];
year = Number(localizedMatch[3]); year = Number(localizedMatch[3]);
if (!month) { if (!month) {