Kalender-Tageskacheln: Ampelfärbung nach Mindestanforderungen
Monatsansicht: Tageskacheln werden grün (bg-green-50) eingefärbt wenn alle Mindestanforderungen für Training/Turnier/Heim-/Auswärtsspiel erfüllt sind, rot (bg-red-50) wenn nicht. Status hat Vorrang vor dem blauen Heute-Marker. Jahresansicht: Mini-Dots zeigen ebenfalls grün/rot statt der Event-Typ-Farbe, wenn Mindestanforderungen gesetzt sind. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -48,11 +48,7 @@
|
|||||||
<div class="grid grid-cols-7">
|
<div class="grid grid-cols-7">
|
||||||
<template x-for="(day, index) in calendarDays" :key="index">
|
<template x-for="(day, index) in calendarDays" :key="index">
|
||||||
<div
|
<div
|
||||||
:class="{
|
:class="[dayCellClass(day), 'min-h-[80px] sm:min-h-[100px]']"
|
||||||
'bg-gray-50 text-gray-400': !day.currentMonth,
|
|
||||||
'bg-blue-50': day.isToday,
|
|
||||||
'min-h-[80px] sm:min-h-[100px]': true
|
|
||||||
}"
|
|
||||||
class="border-b border-r p-1 text-xs"
|
class="border-b border-r p-1 text-xs"
|
||||||
>
|
>
|
||||||
<div class="flex items-center justify-between mb-0.5">
|
<div class="flex items-center justify-between mb-0.5">
|
||||||
@@ -111,7 +107,7 @@
|
|||||||
<template x-if="d.dayNum">
|
<template x-if="d.dayNum">
|
||||||
<span
|
<span
|
||||||
class="w-3.5 h-3.5 flex items-center justify-center rounded-full text-[8px] leading-none"
|
class="w-3.5 h-3.5 flex items-center justify-center rounded-full text-[8px] leading-none"
|
||||||
:class="d.isToday ? 'bg-blue-600 text-white font-bold' : (d.eventType ? eventDotClass(d.eventType) : 'text-gray-600')"
|
:class="miniDotClass(d)"
|
||||||
x-text="d.dayNum"
|
x-text="d.dayNum"
|
||||||
></span>
|
></span>
|
||||||
</template>
|
</template>
|
||||||
@@ -235,7 +231,7 @@
|
|||||||
|
|
||||||
// Leere Zellen vor dem 1.
|
// Leere Zellen vor dem 1.
|
||||||
for (let i = 0; i < startWeekDay; i++) {
|
for (let i = 0; i < startWeekDay; i++) {
|
||||||
days.push({ dayNum: 0, eventType: null, isToday: false });
|
days.push({ dayNum: 0, eventType: null, minMet: null, isToday: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tage
|
// Tage
|
||||||
@@ -246,6 +242,7 @@
|
|||||||
days.push({
|
days.push({
|
||||||
dayNum: d,
|
dayNum: d,
|
||||||
eventType: dayEvents ? dayEvents[0].type : null,
|
eventType: dayEvents ? dayEvents[0].type : null,
|
||||||
|
minMet: this.dayMinStatus(dayEvents || []),
|
||||||
isToday: this.isToday(date)
|
isToday: this.isToday(date)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -293,6 +290,37 @@
|
|||||||
this.currentYear = today.getFullYear();
|
this.currentYear = today.getFullYear();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Prüft ob ein Tag priorisierte Events hat (Training, Turnier, Heim-/Auswärtsspiel)
|
||||||
|
// und ob deren Mindestanforderungen erfüllt sind.
|
||||||
|
// Gibt true (alle erfüllt), false (nicht erfüllt) oder null (keine relevanten Events) zurück.
|
||||||
|
dayMinStatus(dayEvts) {
|
||||||
|
const priorityTypes = ['training', 'tournament', 'home_game', 'away_game'];
|
||||||
|
const relevant = dayEvts.filter(e => priorityTypes.includes(e.type));
|
||||||
|
if (!relevant.length) return null;
|
||||||
|
if (relevant.some(e => e.minMet === true)) return true;
|
||||||
|
if (relevant.some(e => e.minMet === false)) return false;
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
// CSS-Klasse für eine Tages-Kachel (Monatsansicht)
|
||||||
|
dayCellClass(day) {
|
||||||
|
if (!day.currentMonth) return 'bg-gray-50 text-gray-400';
|
||||||
|
const status = this.dayMinStatus(this.eventsForDate(day.dateStr));
|
||||||
|
if (status === true) return 'bg-green-50';
|
||||||
|
if (status === false) return 'bg-red-50';
|
||||||
|
if (day.isToday) return 'bg-blue-50';
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
|
||||||
|
// CSS-Klasse für Mini-Dots (Jahresansicht)
|
||||||
|
miniDotClass(d) {
|
||||||
|
if (d.isToday) return 'bg-blue-600 text-white font-bold';
|
||||||
|
if (d.minMet === true) return 'bg-green-500 text-white';
|
||||||
|
if (d.minMet === false) return 'bg-red-400 text-white';
|
||||||
|
if (d.eventType) return this.eventDotClass(d.eventType);
|
||||||
|
return 'text-gray-600';
|
||||||
|
},
|
||||||
|
|
||||||
// CSS-Klassen für Events in der Monatsansicht
|
// CSS-Klassen für Events in der Monatsansicht
|
||||||
eventBgClass(type) {
|
eventBgClass(type) {
|
||||||
const map = {
|
const map = {
|
||||||
|
|||||||
Reference in New Issue
Block a user