diff --git a/web/src/routes/week/+page.svelte b/web/src/routes/week/+page.svelte index d75c031..95b839d 100644 --- a/web/src/routes/week/+page.svelte +++ b/web/src/routes/week/+page.svelte @@ -9,7 +9,7 @@ let dayKeys = $derived(weekDayKeys(weekKey)); let closedDaysMap: Record = $state({}); let closedWeek: ClosedWeek | null = $state(null); - let currentSettings: Settings | null = $state(null); + let currentSettings = $state(null); let error = $state(''); async function load() { @@ -61,10 +61,10 @@ currentSettings ? currentSettings.hours_per_week * 3_600_000 : 0 ); - const allWorkdaysClosed = $derived( - currentSettings - ? dayKeys.every((dk) => !isWorkday(dk, currentSettings!.workdays_mask) || !!closedDaysMap[dk]) - : false + // Week can be closed if it's not already closed and the week has started + // (i.e. Monday ≤ today). The server enforces the detailed per-day rules. + const canCloseWeek = $derived( + !closedWeek && dayKeys[0] <= todayKey() ); function prevWeek() { weekKey = offsetWeek(weekKey, -1); } @@ -132,10 +132,8 @@

Week closed — overtime: {formatDelta(closedWeek.delta_ms)}

- {:else if allWorkdaysClosed} + {:else if canCloseWeek} - {:else} -

Close all workdays to close the week.

{/if} @@ -167,5 +165,4 @@ .btn.close-week { background: #343a40; color: #fff; border: none; padding: 0.55rem 1.4rem; border-radius: 6px; font-size: 1rem; font-weight: 600; } .week-closed { background: #d4edda; border-radius: 8px; padding: 0.75rem 1rem; display: flex; align-items: center; justify-content: space-between; } .week-closed button { background: none; border: 1px solid #155724; color: #155724; border-radius: 6px; padding: 0.3rem 0.6rem; font-size: 0.875rem; } - .hint { color: #6c757d; font-size: 0.875rem; font-style: italic; }