From c7974989c2dd86ebfbfe10af576e8689bf62a099 Mon Sep 17 00:00:00 2001 From: fullsizemalt <106900403+fullsizemalt@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:16:32 -0800 Subject: [PATCH] feat: Daily Walkthrough - All Checklists Complete! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🎉 Frontend UI Complete (Phase 1.5) 📁 Files Created: - frontend/src/components/walkthrough/IrrigationChecklist.tsx - frontend/src/components/walkthrough/PlantHealthChecklist.tsx ✨ Irrigation Checklist Features: - Zone-by-zone checks (4 zones) - Dripper counter (+/- buttons) - Failed dripper tracking - Water flow toggle - Nutrients mixed toggle - Schedule active toggle - Auto status detection (all good vs issues) - Issue notes field - Photo upload for problems - Touch-friendly controls ✨ Plant Health Checklist Features: - Zone-by-zone inspection (4 zones) - Health status selector (Good/Fair/Needs Attention) - Emoji-based UI (😊😐😟) - Pest observation toggle - Pest type input - Water access toggle - Food access toggle - Auto flag for attention - Issue + reference photos - Notes field 📱 Mobile Optimizations: - Large tap targets (56px buttons) - Visual feedback (active states) - Color-coded status (green/yellow/red) - Touch-friendly toggles - Grid layouts for options - Progress tracking - Zone-by-zone workflow 🎨 UX Highlights: - Consistent design across all 3 checklists - Clear visual hierarchy - Intuitive controls - Minimal typing required - Photo placeholders ready - Auto-save ready 📊 Frontend Progress: 80% Complete ⏭️ Next: Integration + Summary Screen --- .../walkthrough/IrrigationChecklist.tsx | 265 +++++++++++++++++ .../walkthrough/PlantHealthChecklist.tsx | 278 ++++++++++++++++++ 2 files changed, 543 insertions(+) create mode 100644 frontend/src/components/walkthrough/IrrigationChecklist.tsx create mode 100644 frontend/src/components/walkthrough/PlantHealthChecklist.tsx diff --git a/frontend/src/components/walkthrough/IrrigationChecklist.tsx b/frontend/src/components/walkthrough/IrrigationChecklist.tsx new file mode 100644 index 0000000..8091925 --- /dev/null +++ b/frontend/src/components/walkthrough/IrrigationChecklist.tsx @@ -0,0 +1,265 @@ +import { useState } from 'react'; + +interface Zone { + name: string; + defaultDrippers: number; +} + +interface IrrigationCheckData { + zoneName: string; + drippersTotal: number; + drippersWorking: number; + drippersFailed: string[]; + waterFlow: boolean; + nutrientsMixed: boolean; + scheduleActive: boolean; + photoUrl?: string; + issues?: string; +} + +interface IrrigationChecklistProps { + onComplete: (checks: IrrigationCheckData[]) => void; + onBack: () => void; +} + +export default function IrrigationChecklist({ onComplete, onBack }: IrrigationChecklistProps) { + const zones: Zone[] = [ + { name: 'Veg Upstairs', defaultDrippers: 48 }, + { name: 'Veg Downstairs', defaultDrippers: 48 }, + { name: 'Flower Upstairs', defaultDrippers: 64 }, + { name: 'Flower Downstairs', defaultDrippers: 64 }, + ]; + + const [checks, setChecks] = useState>(new Map()); + const [currentZoneIndex, setCurrentZoneIndex] = useState(0); + + const [drippersWorking, setDrippersWorking] = useState(zones[0].defaultDrippers); + const [waterFlow, setWaterFlow] = useState(true); + const [nutrientsMixed, setNutrientsMixed] = useState(true); + const [scheduleActive, setScheduleActive] = useState(true); + const [issues, setIssues] = useState(''); + + const currentZone = zones[currentZoneIndex]; + const isLastZone = currentZoneIndex === zones.length - 1; + const drippersFailed = currentZone.defaultDrippers - drippersWorking; + const allGood = waterFlow && nutrientsMixed && scheduleActive && drippersFailed === 0; + + const handleNext = () => { + // Save current check + const checkData: IrrigationCheckData = { + zoneName: currentZone.name, + drippersTotal: currentZone.defaultDrippers, + drippersWorking, + drippersFailed: drippersFailed > 0 ? [`${drippersFailed} drippers`] : [], + waterFlow, + nutrientsMixed, + scheduleActive, + issues: issues || undefined, + }; + + const newChecks = new Map(checks); + newChecks.set(currentZone.name, checkData); + setChecks(newChecks); + + if (isLastZone) { + // Complete + onComplete(Array.from(newChecks.values())); + } else { + // Next zone + const nextZone = zones[currentZoneIndex + 1]; + setCurrentZoneIndex(currentZoneIndex + 1); + setDrippersWorking(nextZone.defaultDrippers); + setWaterFlow(true); + setNutrientsMixed(true); + setScheduleActive(true); + setIssues(''); + } + }; + + return ( +
+
+ {/* Header */} +
+
+ +
+

+ Irrigation System +

+

+ Zone {currentZoneIndex + 1} of {zones.length} +

+
+
+ + {/* Progress */} +
+
+
+
+ + {/* Zone Card */} +
+ {/* Zone Info */} +
+
🚿
+

+ {currentZone.name} +

+

+ {currentZone.defaultDrippers} drippers total +

+
+ + {/* Status Badge */} + {allGood ? ( +
+ All Systems Operational +
+ ) : ( +
+ ⚠️ Issues Detected +
+ )} + + {/* Drippers Working */} +
+ +
+ +
+
+ {drippersWorking} +
+ {drippersFailed > 0 && ( +
+ {drippersFailed} failed +
+ )} +
+ +
+
+ + {/* System Checks */} +
+ + + {/* Water Flow */} + + + {/* Nutrients Mixed */} + + + {/* Schedule Active */} + +
+ + {/* Issues/Notes */} + {!allGood && ( +
+ +