"use client" import { useState, useEffect } from "react" import { useApi } from "@/lib/use-api" import { DashboardLayout } from "@/components/dashboard-layout" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Search, Plus, Edit, Trash2, Wrench, CheckCircle2, XCircle } from "lucide-react" import { apiFetch, getErrorMessage } from "@/lib/apiutils" import { useSWRConfig } from "swr" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Label } from "@/components/ui/label" import { toast } from "sonner" import { PaginationControl } from "@/components/ui/pagination-control" interface Labor { id: number nombre: string descripcion: string | null status: string } export default function LaboresPage() { const [searchTerm, setSearchTerm] = useState("") const [statusFilter, setStatusFilter] = useState("todos") const [currentPage, setCurrentPage] = useState(1) const { mutate } = useSWRConfig() useEffect(() => { setCurrentPage(1) }, [searchTerm, statusFilter]) // Build query string const queryParams = new URLSearchParams() queryParams.append("page", currentPage.toString()) queryParams.append("limit", "10") if (searchTerm.trim() !== "") { queryParams.append("search", searchTerm) } if (statusFilter !== "todos") { queryParams.append("status", statusFilter) } const { data: rawData, isLoading } = useApi(`/labores?${queryParams.toString()}`) // Support both paginated and plain array responses const dataList: Labor[] = Array.isArray(rawData) ? rawData : (rawData?.data || []) const lastPage = rawData?.last_page || 1 const total = rawData?.total || dataList.length // Stats calculation const totalLabores = total const activasCount = dataList.filter((l) => l.status === "activo").length const inactivasCount = dataList.filter((l) => l.status === "inactivo").length const [isDialogOpen, setIsDialogOpen] = useState(false) const [editingLabor, setEditingLabor] = useState(null) const [formData, setFormData] = useState({ nombre: "", descripcion: "", status: "activo", }) const [saving, setSaving] = useState(false) const handleOpenDialog = (labor?: Labor) => { if (labor) { setEditingLabor(labor) setFormData({ nombre: labor.nombre, descripcion: labor.descripcion || "", status: labor.status || "activo", }) } else { setEditingLabor(null) setFormData({ nombre: "", descripcion: "", status: "activo", }) } setIsDialogOpen(true) } const handleSave = async (e: React.FormEvent) => { e.preventDefault() if (!formData.nombre.trim()) { toast.error("El nombre de la labor es obligatorio.") return } setSaving(true) try { const url = editingLabor ? `/labores/${editingLabor.id}` : "/labores" const method = editingLabor ? "PUT" : "POST" const res = await apiFetch(url, { method, body: JSON.stringify(formData), }) if (res.ok) { toast.success(editingLabor ? "Labor actualizada exitosamente" : "Labor creada exitosamente") mutate(`/labores?${queryParams.toString()}`) setIsDialogOpen(false) } else { const msg = await getErrorMessage(res) toast.error(msg) } } catch (error) { console.error(error) toast.error("Error de conexión al guardar") } finally { setSaving(false) } } const handleDelete = async (id: number) => { if (confirm("¿Estás seguro de eliminar esta labor?")) { try { const res = await apiFetch(`/labores/${id}`, { method: "DELETE" }) if (res.ok) { toast.success("Labor eliminada correctamente") mutate(`/labores?${queryParams.toString()}`) } else { toast.error("Error al eliminar la labor") } } catch (e) { console.error(e) toast.error("Error de conexión") } } } return (

Gestión de Labores

Catálogo de labores agrícolas y tareas del campo

{editingLabor ? "Editar Labor" : "Nueva Labor"} {editingLabor ? "Modifica los datos de la labor agrícola" : "Registra un nuevo tipo de labor o tarea"}
{ if (e.target.value.length <= 100) { setFormData({ ...formData, nombre: e.target.value }) } }} maxLength={100} placeholder="Ej: Pulverización, Siembra, Cosecha" required />