From cc35161e7479e74a69fb102373851158b2b2a17e Mon Sep 17 00:00:00 2001 From: marc Date: Sat, 5 Sep 2026 07:50:19 +0200 Subject: [PATCH] feat(calendar): Kalenderwahl wieder als Ausklappliste, weiterhin mit Farbe Die Plaketten aus dem vorigen Stand nahmen bei mehreren Kalendern viel Platz im Formular und liefen ueber mehrere Zeilen um. Also zurueck zur Ausklappliste -- aber nicht zurueck zum reinen Text. Ein natives `: Dessen Einträge lassen sich in keinem + * Browser verlässlich einfärben, und ausgerechnet die Farbe ist das, woran + * man einen Kalender im Raster wiedererkennt. Wer „Arbeit" wählt, soll dabei * schon das Blau sehen, in dem der Termin gleich erscheint. * * Der Punkt spricht dieselbe Sprache wie überall sonst im Kalender: gefüllt * heißt gewählt, ein leerer Ring heißt nicht gewählt. */ -export function CalendarPicker({ calendars, value, onChange, disabled }: { +export function CalendarSelect({ calendars, value, onChange, disabled }: { calendars: { id: string; name: string; color: string }[] value: string onChange: (id: string) => void disabled?: boolean }) { + const [open, setOpen] = useState(false) + const ref = useRef(null) + const current = calendars.find(c => c.id === value) + + useEffect(() => { + if (!open) return + function onDoc(e: globalThis.MouseEvent) { + if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) + } + document.addEventListener('mousedown', onDoc) + return () => document.removeEventListener('mousedown', onDoc) + }, [open]) + + const field: CSSProperties = { + width: '100%', boxSizing: 'border-box', display: 'flex', alignItems: 'center', gap: 9, + background: 'var(--color-surface-2)', border: '1px solid var(--color-border)', + borderRadius: 8, padding: '8px 10px', fontSize: 13.5, color: 'var(--color-text)', + cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.6 : 1, textAlign: 'left', + } + + const dot = (color: string, filled: boolean) => ( + + ) + return ( -
- {calendars.map(cal => { - const on = cal.id === value - return ( - - ) - })} +
{ if (open && e.key === 'Escape') { e.stopPropagation(); setOpen(false) } }} + > + + + {open && !disabled && ( +
+ {calendars.map(cal => { + const on = cal.id === value + return ( + + ) + })} +
+ )}
) }