/* Hallmark · pre-emit critique: P5 H5 E5 S5 R5 V5 */ /* Hallmark · component: shift-matrix-table · genre: editorial · theme: Atelier (Dark & Light) · studied-DNA: https://inihaus.de */ import React from 'react'; import { Clock, UserCheck, Shield, Printer, Download, Award, CheckCircle2, UserX, UserPlus, MapPin, Edit3, Trash2 } from 'lucide-react'; export default function ShiftMatrixTable({ event, user, onSignupClick, onCancelClick, onRemoveUserFromShift, onGenerateClaimLink, onExportPdf, onPrintView, onEditEvent, onDeleteEvent }) { const [guestDisplayName, setGuestDisplayName] = React.useState(() => localStorage.getItem('guest_display_name') || ''); React.useEffect(() => { const handleUpdate = () => setGuestDisplayName(localStorage.getItem('guest_display_name') || ''); window.addEventListener('guest_name_updated', handleUpdate); window.addEventListener('storage', handleUpdate); return () => { window.removeEventListener('guest_name_updated', handleUpdate); window.removeEventListener('storage', handleUpdate); }; }, []); if (!event || !event.task_areas || event.task_areas.length === 0) { return (

Keine Aufgabenfelder vorhanden

[ Event hat noch keine definierten Aufgabenfelder oder Schichten ]

{user && (user.is_admin_user || user.is_staff || user.is_superuser || event?.created_by === user.id || event?.created_by?.id === user.id || (event?.co_managers && event.co_managers.some(cm => (typeof cm === 'object' ? cm.id === user.id : cm === user.id)))) && onEditEvent && ( )}
); } const isGuest = !user; const isCoManager = user && event?.co_managers && event.co_managers.some(cm => (typeof cm === 'object' ? cm.id === user.id : cm === user.id)); const isManager = user && (user.is_admin_user || user.is_staff || user.is_superuser || event?.created_by === user.id || event?.created_by?.id === user.id || isCoManager); return (
{/* Event Header Panel */}
{new Date(event.start_date).toLocaleDateString('de-DE')} — {new Date(event.end_date).toLocaleDateString('de-DE')} {event.location && ( {event.location} )} {event.is_active === false && ( [ DEAKTIVIERT ] )}

{event.title}

{event.description &&

{event.description}

}
{isManager && onEditEvent && ( )} {user && (user.is_admin_user || user.is_staff || user.is_superuser || event?.created_by === user.id || event?.created_by?.id === user.id) && onDeleteEvent && ( )}
{/* Guest Privacy Banner */} {isGuest && (
[ GAST-DATENSCHUTZ ]: Belegungszahlen sichtbar, Namensanzeige aus Datenschutzgründen anonymisiert.
)} {/* Hallmark Matrix Schedule Table */}
{event.task_areas.map((area) => { if (!area.shifts || area.shifts.length === 0) { return ( ); } return area.shifts.map((shift, idx) => { const isFirst = idx === 0; const isFull = shift.is_full; const userSignup = user ? shift.signups.find(s => !s.is_guest && s.display_name === user.display_name) : null; const isUserSignedUp = Boolean(userSignup); const hasSkillReqs = shift.required_skills && shift.required_skills.length > 0; return ( {isFirst ? ( ) : null} ); }); })}
Aufgabenfeld Schicht & Zeitraum Qualifikation Belegung & Personen Aktion
{area.name} [ Keine Schichten angelegt ]
{area.name}
{area.description &&
{area.description}
}
{shift.title} {shift.date && ( 📅 {new Date(shift.date + 'T00:00:00').toLocaleDateString('de-DE', { weekday: 'short', day: '2-digit', month: '2-digit' })} )}
{shift.start_time} — {shift.end_time} Uhr
{hasSkillReqs ? (
{shift.required_skills.map((s) => ( {s.name} ))}
) : ( )}
[ {shift.signups_count} / {shift.max_participants} BELEGT ]
{/* Attendees List */}
{shift.signups.map((su) => { const isOwnGuest = isGuest && su.is_guest && guestDisplayName && su.display_name?.trim().toLowerCase() === guestDisplayName.trim().toLowerCase(); return (
{su.display_name} {su.is_guest && GAST} {isOwnGuest && DU}
{user && su.is_guest && onGenerateClaimLink && ( )} {isManager && onRemoveUserFromShift && ( )}
); })}
{isUserSignedUp ? ( ) : isFull ? ( [ VOLL ] ) : ( )}
); }