diff --git a/src/routes/courses/[name]/[assignment]/ops/+page.svelte b/src/routes/courses/[name]/[assignment]/ops/+page.svelte index db7aa6e..993a8b7 100644 --- a/src/routes/courses/[name]/[assignment]/ops/+page.svelte +++ b/src/routes/courses/[name]/[assignment]/ops/+page.svelte @@ -36,14 +36,18 @@ let targets = $derived(data.targets ?? []); let per = $derived(data.per); let selected = $state([]); + // The subset a shown plan was made with; a run/schedule uses this (via the + // token), not the current checkboxes — so checking a box does not clear the plan. + let plannedFor = $state([]); function toggleTarget(t: string) { selected = selected.includes(t) ? selected.filter((x) => x !== t) : [...selected, t]; - plan = null; } let plan = $state(null); let planning = $state(false); let planError = $state(''); + // True when the target selection changed since the shown plan was made. + let planStale = $derived(!!plan && plannedFor.join('\n') !== selected.join('\n')); let confirmPhrase = $state(''); @@ -122,6 +126,7 @@ return; } plan = d.planOp; + plannedFor = [...selected]; } catch (e) { planError = e instanceof Error ? e.message : String(e); } finally { @@ -291,21 +296,13 @@ {selected.length > 0 ? `(${selected.length} ausgewählt)` : '(optional — leer = alle)'}
- (selected = [])} + >keine (selected = [...targets])}>alle
@@ -322,6 +319,12 @@ {/each}
+ {#if planStale} +

+ Auswahl geändert — „Planen" erneut klicken, um sie zu übernehmen. (Der aktuelle Plan + betrifft {plannedFor.length > 0 ? `${plannedFor.length} ausgewählte` : 'alle'}.) +

+ {/if} {/if} {#if planError}