This commit is contained in:
Jake Kasper
2025-09-02 13:06:02 -05:00
parent 5a16f42e1c
commit f37b43bf4f
4 changed files with 243 additions and 2 deletions

View File

@@ -3,6 +3,7 @@ import { mowingAPI } from '../../services/api';
import LoadingSpinner from '../../components/UI/LoadingSpinner';
import MowingPlanModal from '../../components/Mowing/MowingPlanModal';
import MowingExecutionModal from '../../components/Mowing/MowingExecutionModal';
import MowingSessionViewModal from '../../components/Mowing/MowingSessionViewModal';
import toast from 'react-hot-toast';
const Mowing = () => {
@@ -10,12 +11,19 @@ const Mowing = () => {
const [loading, setLoading] = useState(true);
const [showPlanModal, setShowPlanModal] = useState(false);
const [execPlan, setExecPlan] = useState(null);
const [sessions, setSessions] = useState([]);
const [viewSession, setViewSession] = useState(null);
const fetchPlans = async () => {
try {
setLoading(true);
const r = await mowingAPI.getPlans();
setPlans(r.data.data.plans || []);
// also load recent sessions
try {
const s = await mowingAPI.getLogs();
setSessions(s.data?.data?.logs || []);
} catch {}
} catch (e) {
toast.error('Failed to load mowing plans');
} finally {
@@ -70,9 +78,41 @@ const Mowing = () => {
{execPlan && (
<MowingExecutionModal plan={execPlan} onClose={()=> setExecPlan(null)} onComplete={fetchPlans} />
)}
{/* Recent Sessions */}
<div className="mt-8">
<h2 className="text-lg font-semibold mb-3">Recent Sessions</h2>
<div className="bg-white rounded-lg shadow overflow-hidden">
<div className="grid grid-cols-6 gap-4 p-4 border-b text-sm font-medium text-gray-600">
<div>Property</div>
<div>Mower</div>
<div>Cut Height</div>
<div>Avg Speed</div>
<div>Distance</div>
<div>Actions</div>
</div>
{sessions.length === 0 ? (
<div className="p-4 text-gray-600">No sessions yet.</div>
) : sessions.map((s) => (
<div key={s.id} className="grid grid-cols-6 gap-4 p-4 border-b text-sm items-center">
<div className="font-medium">{s.property_name}</div>
<div>{s.equipment_name || '—'}</div>
<div>{Number(s.cut_height_inches || 0).toFixed(2)}"</div>
<div>{(s.average_speed_mph || s.averageSpeed || 0).toFixed?.(1) || Number(s.averageSpeed || 0).toFixed(1)} mph</div>
<div>{Math.round(((s.total_distance_meters || s.gpsTrack?.totalDistance || 0) * 3.28084) || 0)} ft</div>
<div>
<button className="btn-secondary" onClick={()=> setViewSession(s)}>View</button>
</div>
</div>
))}
</div>
</div>
{viewSession && (
<MowingSessionViewModal session={viewSession} onClose={()=> setViewSession(null)} />
)}
</div>
);
};
export default Mowing;