feat: platzhalter-bilder finalisiert und gemerget
This commit is contained in:
parent
fdbb70a4e5
commit
4ff703b4ff
BIN
assets/platzhalter_brunch.jpeg
Normal file
BIN
assets/platzhalter_brunch.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 566 KiB |
BIN
assets/platzhalter_dinner.jpeg
Normal file
BIN
assets/platzhalter_dinner.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 689 KiB |
BIN
assets/platzhalter_kaffee.jpeg
Normal file
BIN
assets/platzhalter_kaffee.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 666 KiB |
BIN
assets/platzhalter_lunch.jpeg
Normal file
BIN
assets/platzhalter_lunch.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 604 KiB |
@ -445,6 +445,30 @@
|
|||||||
grid-row: 1 / 3;
|
grid-row: 1 / 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.detail-gallery-large--single {
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
grid-template-rows: auto;
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-gallery-large--single .detail-gallery-item {
|
||||||
|
grid-column: 1 / -1;
|
||||||
|
grid-row: auto;
|
||||||
|
align-self: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-gallery-large--single .detail-gallery-image {
|
||||||
|
height: auto;
|
||||||
|
min-height: 0;
|
||||||
|
object-fit: contain;
|
||||||
|
object-position: top center;
|
||||||
|
background: var(--butter-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-gallery-large--single img:first-child {
|
||||||
|
grid-row: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.detail-lightbox {
|
.detail-lightbox {
|
||||||
/* Full-screen overlay for enlarged gallery image view. */
|
/* Full-screen overlay for enlarged gallery image view. */
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@ -847,6 +871,11 @@
|
|||||||
grid-row: auto;
|
grid-row: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.detail-gallery-large--single {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
grid-template-rows: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.detail-lightbox {
|
.detail-lightbox {
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -425,6 +425,42 @@ function mapEventTypeToCategory(value) {
|
|||||||
return categoryMap[value] || value.toUpperCase();
|
return categoryMap[value] || value.toUpperCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Liefert je Eventtyp ein passendes Platzhalterbild.
|
||||||
|
*/
|
||||||
|
function getPlaceholderImageByEventType(eventType) {
|
||||||
|
const normalizedType = String(eventType || "")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.normalize("NFD")
|
||||||
|
.replace(/[\u0300-\u036f]/g, "")
|
||||||
|
.replace(/[+&/_-]/g, " ")
|
||||||
|
.replace(/\s+/g, " ");
|
||||||
|
|
||||||
|
if (normalizedType.includes("brunch")) {
|
||||||
|
return "assets/platzhalter_brunch.jpeg";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (normalizedType.includes("lunch")) {
|
||||||
|
return "assets/platzhalter_lunch.jpeg";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
normalizedType.includes("kaffee")
|
||||||
|
|| normalizedType.includes("coffee")
|
||||||
|
|| normalizedType.includes("cafe")
|
||||||
|
|| normalizedType.includes("kuchen")
|
||||||
|
) {
|
||||||
|
return "assets/platzhalter_kaffee.jpeg";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (normalizedType.includes("dinner")) {
|
||||||
|
return "assets/platzhalter_dinner.jpeg";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "assets/platzhalter_dinner.jpeg";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Baut aus den Formulardaten ein lokal speicherbares Event-Objekt.
|
* Baut aus den Formulardaten ein lokal speicherbares Event-Objekt.
|
||||||
*/
|
*/
|
||||||
@ -436,6 +472,8 @@ function buildStoredEvent() {
|
|||||||
const eventDate = form.elements.eventDate.value;
|
const eventDate = form.elements.eventDate.value;
|
||||||
const eventTime = form.elements.eventTime.value;
|
const eventTime = form.elements.eventTime.value;
|
||||||
const eventCity = form.elements.eventCity.value.trim();
|
const eventCity = form.elements.eventCity.value.trim();
|
||||||
|
const fallbackGallery = [getPlaceholderImageByEventType(eventType)];
|
||||||
|
const resolvedGallery = galleryImages.length > 0 ? [...galleryImages] : fallbackGallery;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: Date.now(),
|
id: Date.now(),
|
||||||
@ -444,6 +482,7 @@ function buildStoredEvent() {
|
|||||||
address: form.elements.eventAddress.value.trim(),
|
address: form.elements.eventAddress.value.trim(),
|
||||||
date: formatDateForStorage(eventDate),
|
date: formatDateForStorage(eventDate),
|
||||||
time: formatTimeForStorage(eventTime),
|
time: formatTimeForStorage(eventTime),
|
||||||
|
eventType,
|
||||||
category: mapEventTypeToCategory(eventType),
|
category: mapEventTypeToCategory(eventType),
|
||||||
diet: dietType,
|
diet: dietType,
|
||||||
spots: Number(form.elements.maxGuests.value),
|
spots: Number(form.elements.maxGuests.value),
|
||||||
@ -460,7 +499,7 @@ function buildStoredEvent() {
|
|||||||
allergiesNote: form.elements.allergiesOther.value.trim(),
|
allergiesNote: form.elements.allergiesOther.value.trim(),
|
||||||
// Host wird separat geführt und nicht als angemeldeter Gast gezählt.
|
// Host wird separat geführt und nicht als angemeldeter Gast gezählt.
|
||||||
participants: [],
|
participants: [],
|
||||||
gallery: [...galleryImages],
|
gallery: resolvedGallery,
|
||||||
createdAt: new Date().toISOString(),
|
createdAt: new Date().toISOString(),
|
||||||
source: "local"
|
source: "local"
|
||||||
};
|
};
|
||||||
|
|||||||
@ -198,6 +198,39 @@
|
|||||||
return labels[diet] || diet;
|
return labels[diet] || diet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getPlaceholderImageByEventType(event) {
|
||||||
|
const rawType = String(event?.eventType || event?.category || '')
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.normalize('NFD')
|
||||||
|
.replace(/[\u0300-\u036f]/g, '')
|
||||||
|
.replace(/[+&/_-]/g, ' ')
|
||||||
|
.replace(/\s+/g, ' ');
|
||||||
|
|
||||||
|
if (rawType.includes('brunch')) {
|
||||||
|
return 'assets/platzhalter_brunch.jpeg';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rawType.includes('lunch')) {
|
||||||
|
return 'assets/platzhalter_lunch.jpeg';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
rawType.includes('kaffee')
|
||||||
|
|| rawType.includes('coffee')
|
||||||
|
|| rawType.includes('cafe')
|
||||||
|
|| rawType.includes('kuchen')
|
||||||
|
) {
|
||||||
|
return 'assets/platzhalter_kaffee.jpeg';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rawType.includes('dinner')) {
|
||||||
|
return 'assets/platzhalter_dinner.jpeg';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'assets/platzhalter_dinner.jpeg';
|
||||||
|
}
|
||||||
|
|
||||||
// Fetch data source and resolve the matching event record.
|
// Fetch data source and resolve the matching event record.
|
||||||
try {
|
try {
|
||||||
const response = await fetch('data/events.json');
|
const response = await fetch('data/events.json');
|
||||||
@ -234,9 +267,15 @@
|
|||||||
.map(name => getParticipantNameForViewer(name, isOwnEvent))
|
.map(name => getParticipantNameForViewer(name, isOwnEvent))
|
||||||
.filter(Boolean);
|
.filter(Boolean);
|
||||||
const galleryImages = Array.isArray(event.gallery) ? event.gallery.filter(Boolean) : [];
|
const galleryImages = Array.isArray(event.gallery) ? event.gallery.filter(Boolean) : [];
|
||||||
const galleryMarkup = galleryImages.length > 0
|
const resolvedGalleryImages = galleryImages.length > 0
|
||||||
? `<div class="detail-gallery detail-gallery-large">
|
? galleryImages
|
||||||
${galleryImages.slice(0, 9).map((img, index) => `
|
: [getPlaceholderImageByEventType(event)];
|
||||||
|
const galleryLayoutClass = resolvedGalleryImages.length === 1
|
||||||
|
? 'detail-gallery detail-gallery-large detail-gallery-large--single'
|
||||||
|
: 'detail-gallery detail-gallery-large';
|
||||||
|
const galleryMarkup = resolvedGalleryImages.length > 0
|
||||||
|
? `<div class="${galleryLayoutClass}">
|
||||||
|
${resolvedGalleryImages.slice(0, 9).map((img, index) => `
|
||||||
<button class="detail-gallery-item" type="button" aria-label="Bild ${index + 1} gross anzeigen" data-fullsrc="${img}">
|
<button class="detail-gallery-item" type="button" aria-label="Bild ${index + 1} gross anzeigen" data-fullsrc="${img}">
|
||||||
<img src="${img}" alt="${event.title} Bild ${index + 1}" class="detail-gallery-image">
|
<img src="${img}" alt="${event.title} Bild ${index + 1}" class="detail-gallery-image">
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user