'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { Plus, Pencil, Trash2, FileDown, Sprout, BadgeCheck, Undo2 } from 'lucide-react'; import ConfirmSpreadingModal from './_components/ConfirmSpreadingModal'; import Navbar from '@/components/Navbar'; import { api } from '@/lib/api'; import { FertilizationPlan } from '@/types'; const currentYear = new Date().getFullYear(); export default function FertilizerPage() { const router = useRouter(); const [year, setYear] = useState(() => { if (typeof window !== 'undefined') { const saved = localStorage.getItem('fertilizerYear'); if (saved) return parseInt(saved); } return currentYear; }); const [plans, setPlans] = useState([]); const [loading, setLoading] = useState(true); const [deleteError, setDeleteError] = useState(null); const [actionError, setActionError] = useState(null); const [confirmTarget, setConfirmTarget] = useState(null); useEffect(() => { localStorage.setItem('fertilizerYear', String(year)); fetchPlans(); }, [year]); const fetchPlans = async () => { setLoading(true); try { const res = await api.get(`/fertilizer/plans/?year=${year}`); setPlans(res.data); } catch (e) { console.error(e); } finally { setLoading(false); } }; const handleDelete = async (id: number, name: string) => { setDeleteError(null); setActionError(null); try { await api.delete(`/fertilizer/plans/${id}/`); await fetchPlans(); } catch (e) { console.error(e); setDeleteError(`「${name}」の削除に失敗しました`); } }; const handleUnconfirm = async (id: number, name: string) => { setActionError(null); try { await api.post(`/fertilizer/plans/${id}/unconfirm/`); await fetchPlans(); } catch (e) { console.error(e); setActionError(`「${name}」の確定取消に失敗しました`); } }; const handlePdf = async (id: number, name: string) => { setActionError(null); try { const res = await api.get(`/fertilizer/plans/${id}/pdf/`, { responseType: 'blob' }); const url = URL.createObjectURL(new Blob([res.data], { type: 'application/pdf' })); const a = document.createElement('a'); a.href = url; a.download = `施肥計画_${year}_${name}.pdf`; a.click(); URL.revokeObjectURL(url); } catch (e) { console.error(e); setActionError('PDF出力に失敗しました'); } }; const years = Array.from({ length: 5 }, (_, i) => currentYear + 1 - i); return (

施肥計画

{/* 年度セレクタ */}
{deleteError && (
{deleteError}
)} {actionError && (
{actionError}
)} {loading ? (

読み込み中...

) : plans.length === 0 ? (

{year}年度の施肥計画はありません

) : (
{plans.map((plan) => ( ))}
計画名 作物 / 品種 状態 圃場数 肥料種数
{plan.name} {plan.is_confirmed && ( 確定済み )}
{plan.crop_name} / {plan.variety_name} {plan.is_confirmed ? `散布確定 ${plan.confirmed_at ? new Date(plan.confirmed_at).toLocaleString('ja-JP') : ''}` : '未確定'} {plan.field_count}筆 {plan.fertilizer_count}種
{!plan.is_confirmed ? ( ) : ( )}
)}
setConfirmTarget(null)} onConfirmed={fetchPlans} />
); }