up
This commit is contained in:
@@ -222,3 +222,12 @@ try {
|
|||||||
<script>
|
<script>
|
||||||
window.__events = <?= json_encode($eventsForJs, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
|
window.__events = <?= json_encode($eventsForJs, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
|
||||||
</script>
|
</script>
|
||||||
|
<div class="modal" id="eventModal">
|
||||||
|
<div class="panel">
|
||||||
|
<div class="head flex between center-y">
|
||||||
|
<h3 id="eventModalTitle" style="margin:0;">Event</h3>
|
||||||
|
<button class="btn ghost" type="button" data-event-modal-close>✕</button>
|
||||||
|
</div>
|
||||||
|
<div id="eventModalBody" class="stack gap-8" style="margin-top:12px;"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|||||||
@@ -61,7 +61,11 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
ageSelect: document.getElementById('ageSelect'),
|
ageSelect: document.getElementById('ageSelect'),
|
||||||
btnSearch: document.getElementById('btnSearch'),
|
btnSearch: document.getElementById('btnSearch'),
|
||||||
btnGeo: document.getElementById('btnGeo'),
|
btnGeo: document.getElementById('btnGeo'),
|
||||||
|
modal: document.getElementById('eventModal'),
|
||||||
|
modalBody: document.getElementById('eventModalBody'),
|
||||||
|
modalTitle: document.getElementById('eventModalTitle'),
|
||||||
};
|
};
|
||||||
|
const searchState = { active: false };
|
||||||
|
|
||||||
const fmtDate = (iso) => {
|
const fmtDate = (iso) => {
|
||||||
const d = new Date(iso);
|
const d = new Date(iso);
|
||||||
@@ -107,8 +111,8 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
<div class="event__tags">${tags}</div>
|
<div class="event__tags">${tags}</div>
|
||||||
${contact}
|
${contact}
|
||||||
<div class="flex gap-12">
|
<div class="flex gap-12">
|
||||||
<button class="btn ghost">Details</button>
|
<button class="btn ghost" data-event-detail="${item.id}">Details</button>
|
||||||
${!guest ? '<button class="btn">Teilnehmen</button>' : '<button class="btn">Anmelden</button>'}
|
${guest ? '' : '<button class="btn">Teilnehmen</button>'}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</article>`;
|
</article>`;
|
||||||
@@ -131,7 +135,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
let filtered = events.filter(matchesFilter);
|
let filtered = events.filter(matchesFilter);
|
||||||
filtered.sort((a,b) => new Date(a.startsAt) - new Date(b.startsAt));
|
filtered.sort((a,b) => new Date(a.startsAt) - new Date(b.startsAt));
|
||||||
|
|
||||||
if (state.geo) {
|
if (state.geo && !searchState.active) {
|
||||||
const withCoords = filtered.filter(ev => ev.lat !== null && ev.lng !== null);
|
const withCoords = filtered.filter(ev => ev.lat !== null && ev.lng !== null);
|
||||||
withCoords.forEach(ev => { ev._distance = haversine(state.geo.lat, state.geo.lng, ev.lat, ev.lng); });
|
withCoords.forEach(ev => { ev._distance = haversine(state.geo.lat, state.geo.lng, ev.lat, ev.lng); });
|
||||||
withCoords.sort((a,b) => (a._distance || Infinity) - (b._distance || Infinity));
|
withCoords.sort((a,b) => (a._distance || Infinity) - (b._distance || Infinity));
|
||||||
@@ -144,11 +148,29 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
}
|
}
|
||||||
return copy;
|
return copy;
|
||||||
});
|
});
|
||||||
} else {
|
} else if (!searchState.active) {
|
||||||
filtered = filtered.slice(0,5);
|
filtered = filtered.slice(0,5);
|
||||||
}
|
}
|
||||||
|
|
||||||
el.list.innerHTML = filtered.map(renderCard).join('') || '<p class="muted">Keine Events gefunden.</p>';
|
el.list.innerHTML = filtered.map(renderCard).join('') || '<p class="muted">Keine Events gefunden.</p>';
|
||||||
|
|
||||||
|
// wire detail buttons
|
||||||
|
el.list.querySelectorAll('[data-event-detail]').forEach(btn => {
|
||||||
|
btn.addEventListener('click', () => {
|
||||||
|
const id = parseInt(btn.getAttribute('data-event-detail'), 10);
|
||||||
|
const ev = events.find(e => e.id === id);
|
||||||
|
if (!ev || !el.modal || !el.modalBody || !el.modalTitle) return;
|
||||||
|
el.modalTitle.textContent = ev.title;
|
||||||
|
el.modalBody.innerHTML = `
|
||||||
|
<div class="muted small">${fmtDate(ev.startsAt)} · ${ev.region || ev.city || ''}</div>
|
||||||
|
<p class="muted">${ev.teaser}</p>
|
||||||
|
${ev.locationLabel ? `<p><strong>Ort:</strong> ${ev.locationLabel}</p>` : ''}
|
||||||
|
<p><strong>Kinder:</strong> ${ev.allowKids ? 'Mit Kindern' : 'Ohne Kinder'}</p>
|
||||||
|
<p><strong>Sichtbarkeit:</strong> ${ev.visibility === 'public' ? 'Öffentlich' : 'Nur Mitglieder'}</p>
|
||||||
|
`;
|
||||||
|
el.modal.classList.add('open');
|
||||||
|
});
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
if (el.chips.length > 0) {
|
if (el.chips.length > 0) {
|
||||||
@@ -169,6 +191,8 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
state.region = (el.locInput?.value || '').trim().toLowerCase();
|
state.region = (el.locInput?.value || '').trim().toLowerCase();
|
||||||
state.topic = el.topicSelect?.value || 'all';
|
state.topic = el.topicSelect?.value || 'all';
|
||||||
state.age = el.ageSelect?.value || '';
|
state.age = el.ageSelect?.value || '';
|
||||||
|
state.query = state.region; // keep simple search for now
|
||||||
|
searchState.active = true;
|
||||||
renderEvents();
|
renderEvents();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -182,6 +206,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
navigator.geolocation.getCurrentPosition(
|
navigator.geolocation.getCurrentPosition(
|
||||||
(pos) => {
|
(pos) => {
|
||||||
state.geo = { lat: pos.coords.latitude, lng: pos.coords.longitude };
|
state.geo = { lat: pos.coords.latitude, lng: pos.coords.longitude };
|
||||||
|
searchState.active = false;
|
||||||
renderEvents();
|
renderEvents();
|
||||||
},
|
},
|
||||||
() => alert('Standort konnte nicht ermittelt werden.')
|
() => alert('Standort konnte nicht ermittelt werden.')
|
||||||
@@ -189,5 +214,11 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close modal
|
||||||
|
document.querySelectorAll('[data-event-modal-close]').forEach(btn => {
|
||||||
|
btn.addEventListener('click', () => el.modal?.classList.remove('open'));
|
||||||
|
});
|
||||||
|
el.modal?.addEventListener('click', (e) => { if (e.target === el.modal) el.modal.classList.remove('open'); });
|
||||||
|
|
||||||
renderEvents();
|
renderEvents();
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user