perioderooster: resulterende conflicten in voltooien-preview tonen

This commit is contained in:
bes-r 2026-06-19 23:12:37 +02:00
parent 6024a46b35
commit e435ddd961

View file

@ -2870,8 +2870,15 @@ export function PeriodeRoosterPage() {
try { try {
const live = await listResource("roosterblokken", `?schooljaar=${schooljaar}`); // sjabloon=False const live = await listResource("roosterblokken", `?schooljaar=${schooljaar}`); // sjabloon=False
const keys = new Set(blokken.map(doelKey)); const keys = new Set(blokken.map(doelKey));
const verwijderen = live.filter((b) => keys.has(doelKey(b)) && overlaptPeriode(b, van, tot)); const overlappend = live.filter((b) => overlaptPeriode(b, van, tot));
setPreview({ toevoegen: blokken, verwijderen, van, tot }); const verwijderen = overlappend.filter((b) => keys.has(doelKey(b)));
const behouden = overlappend.filter((b) => !keys.has(doelKey(b)));
// Resultaat na toepassen = behouden bestaande blokken + nieuwe periodeblokken
// (met de periodedatums). Zelfde conflictcheck als het Rooster.
const nieuwe = blokken.map((b) => ({ ...b, geldig_van: van, geldig_tot: tot }));
const resultaat = [...behouden, ...nieuwe];
const resConflict = berekenRoosterConflicten(resultaat, ctx, tijdsloten);
setPreview({ toevoegen: blokken, verwijderen, conflicten: resConflict.meldingen, van, tot });
setError(null); setError(null);
} catch (e) { setError(e.message); } } catch (e) { setError(e.message); }
} }
@ -3020,6 +3027,14 @@ export function PeriodeRoosterPage() {
</ul> </ul>
</> </>
) : <p className="muted small">Geen overlappende bestaande blokken.</p>} ) : <p className="muted small">Geen overlappende bestaande blokken.</p>}
{preview.conflicten.length > 0 ? (
<>
<p className="fout"><b>{preview.conflicten.length}</b> conflict(en) in het rooster toepassen (nieuwe + behouden blokken):</p>
<ul className="conflict-lijst">
{preview.conflicten.map((m, i) => <li key={i} className={m.ernst === "fout" ? "fout" : "waarschuwing"}>{m.tekst}</li>)}
</ul>
</>
) : <p className="wm-status ok" style={{ display: "inline-block", marginTop: 4 }}> geen conflicten toepassen</p>}
</div> </div>
<div className="editor-actions"> <div className="editor-actions">
<button type="button" className="btn primary" disabled={applyBezig} onClick={bevestigVoltooien}>{applyBezig ? "Bezig…" : `Toepassen (${preview.verwijderen.length} verwijderen, ${preview.toevoegen.length} plaatsen)`}</button> <button type="button" className="btn primary" disabled={applyBezig} onClick={bevestigVoltooien}>{applyBezig ? "Bezig…" : `Toepassen (${preview.verwijderen.length} verwijderen, ${preview.toevoegen.length} plaatsen)`}</button>