import { useEffect, useState, type FormEvent } from "react"; import { Link } from "react-router"; import { ProtectedRoute } from "~/components/ProtectedRoute"; import { LoadingSpinner } from "~/components/LoadingSpinner"; import { Button } from "~/components/Button"; import { Input } from "~/components/Input"; import { api } from "~/api/client"; import type { ReportPeriod, ReportPeriodCreate, ReportPeriodUpdate } from "~/types/api"; export default function ReportPeriods() { const [periods, setPeriods] = useState([]); const [loading, setLoading] = useState(true); const [showAddForm, setShowAddForm] = useState(false); const [editingPeriod, setEditingPeriod] = useState(null); const [name, setName] = useState(""); const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); const [error, setError] = useState(""); useEffect(() => { loadPeriods(); }, []); const loadPeriods = async () => { try { const data = await api.getPeriods(); setPeriods(data); } catch (error) { console.error("Failed to load periods:", error); } finally { setLoading(false); } }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setError(""); if (new Date(endDate) <= new Date(startDate)) { setError("End date must be after start date"); return; } try { if (editingPeriod) { // Update existing period const updateData: ReportPeriodUpdate = { name: name.trim(), start_date: new Date(startDate).toISOString(), end_date: new Date(endDate).toISOString(), }; const updated = await api.updatePeriod(editingPeriod._id, updateData); setPeriods(periods.map((p) => (p._id === editingPeriod._id ? updated : p))); } else { // Create new period const periodData: ReportPeriodCreate = { name: name.trim(), start_date: new Date(startDate).toISOString(), end_date: new Date(endDate).toISOString(), }; const newPeriod = await api.createPeriod(periodData); setPeriods([newPeriod, ...periods]); } setName(""); setStartDate(""); setEndDate(""); setShowAddForm(false); setEditingPeriod(null); } catch (err) { setError(err instanceof Error ? err.message : editingPeriod ? "Failed to update period" : "Failed to create period"); } }; const handleEdit = (period: ReportPeriod) => { setEditingPeriod(period); setName(period.name); setStartDate(new Date(period.start_date).toISOString().split("T")[0]); setEndDate(new Date(period.end_date).toISOString().split("T")[0]); setShowAddForm(true); }; const handleCancelEdit = () => { setEditingPeriod(null); setName(""); setStartDate(""); setEndDate(""); setShowAddForm(false); }; const handleDelete = async (periodId: string) => { if (!confirm("Delete this report period?")) return; try { await api.deletePeriod(periodId); setPeriods(periods.filter((p) => p._id !== periodId)); } catch (error) { alert("Failed to delete period"); } }; if (loading) { return (
); } return (
← Back to Dashboard

Report Periods

Define time periods for your report cards (e.g., semesters, quarters)

{/* Add Period Button/Form */}
{!showAddForm ? ( ) : (

{editingPeriod ? "Edit Report Period" : "Create Report Period"}

setName(e.target.value)} placeholder="e.g., First Semester 2024/2025" required />
setStartDate(e.target.value)} required /> setEndDate(e.target.value)} required />
{error && (
{error}
)}
)}
{/* Periods List */} {periods.length > 0 ? (
{periods.map((period) => (

{period.name}

{new Date(period.start_date).toLocaleDateString()} -{" "} {new Date(period.end_date).toLocaleDateString()}

Duration:{" "} {Math.ceil( (new Date(period.end_date).getTime() - new Date(period.start_date).getTime()) / (1000 * 60 * 60 * 24) )}{" "} days

))}
) : (

No report periods yet. Create your first period!

)}
); }