diff --git a/frontend/src/pages/DirectorsForecast.tsx b/frontend/src/pages/DirectorsForecast.tsx
index d7155e0e..67610afe 100644
--- a/frontend/src/pages/DirectorsForecast.tsx
+++ b/frontend/src/pages/DirectorsForecast.tsx
@@ -1,5 +1,5 @@
import { useCallback, useEffect, useState } from 'react'
-import { Save, RefreshCw, Camera, Trash2, Printer } from 'lucide-react'
+import { Save, RefreshCw, Camera, Trash2, Printer, Repeat2 } from 'lucide-react'
import { useAuth } from '../components/AuthGate'
import { dfGetWorksheet, dfSaveWorksheet, dfGetReport, dfSaveSnapshot, dfDeleteSnapshot } from '../api'
import type { WorksheetDay, WorksheetData, ForecastReportData, ForecastSnapshot } from '../types'
@@ -81,6 +81,28 @@ function WorksheetTab({ year, month }: { year: number; month: number }) {
setDirty(true)
}
+ function fillFnBFromLast7() {
+ if (!data) return
+ const last7 = data.days
+ .filter(d => d.is_past && (d.actual_dry != null || d.actual_wet != null))
+ .slice(-7)
+ if (!last7.length) return
+ setOverrides(prev => {
+ const next = { ...prev }
+ const futureDays = data.days.filter(d => !d.is_past)
+ futureDays.forEach((day, i) => {
+ const src = last7[i % last7.length]
+ next[day.date] = {
+ ...next[day.date],
+ dry_override: String(src.actual_dry ?? src.forecast_dry ?? ''),
+ wet_override: String(src.actual_wet ?? src.forecast_wet ?? ''),
+ }
+ })
+ return next
+ })
+ setDirty(true)
+ }
+
async function handleSave() {
if (!canEdit) return
setSaving(true)
@@ -147,6 +169,11 @@ function WorksheetTab({ year, month }: { year: number; month: number }) {
+ {canEdit && (
+
+ )}
{canEdit && (