Behoben in 189bcb6: jsdom-basierte Integrationstests. render.test.mjs treibt die echte UI (Mitarbeiter anlegen, Kalender-Grid via makeDayCell, Plan generieren, manuelle Slot-Änderung,…
Behoben in 836d0ee: kanonischer Name Meeting Mixer überall (<title>, README, .vch-description, package.json → meeting-mixer). README um Tech-Stack ergänzt und Port-Hinweis…
Behoben in b3eeca5: Monat/Jahr/Slots-Selects haben jetzt id + zugehöriges <label for>; Name-Input, Excel-Import- und JSON-Import-Datei-Inputs erhalten aria-label.
Behoben in 7ab2911: parseInt(month/year, 10) mit Radix; minGap-Check mit Null-Guard (c.minGapDays != null && c.minGapDays > 0); stille catch-Blöcke (korrupter localStorage-Load, `createEmploy…
Behoben in fd98708: neues js/utils.js mit toISO, monthPrefix, getWeekday, formatDateDE, buildNameMap. algorithm.js, calendar.js, excel.js, history.js importieren diese statt…
Behoben in 0efb9cb: saveState debounced (~400 ms), bündelt schnelle Änderungen; ausstehender Write wird bei beforeunload und visibilitychange→hidden geflusht (kein Verlust der letzten…
Behoben in 8cd8908: Tag-Zellen-Aufbau in makeDayCell(d) extrahiert. Slot-Änderungen und Feiertag/Betriebsurlaub-Toggles rendern jetzt nur die betroffene Zelle neu (cell.replaceWith)…
Behoben in c076b5e: histCount-Map einmal pro Generierung vorberechnet — scoreCandidate macht jetzt O(1)-Lookup statt History-Scan pro Kandidat. minGap ermittelt das letzte Datum per…
Behoben in 074635c: README um Abschnitt Datenschutz & Speicherung ergänzt (lokales Single-User-Tool, unverschlüsselter localStorage, keine geteilten Geräte, JSON-Export zur Sicherung).…
Behoben in e6452fa: neue sanitizeCell-Funktion — Zellwerte mit führendem = + - @ (oder Steuerzeichen) werden mit ' als Text neutralisiert, angewandt auf die Namensspalte beim Excel-Export.…