import { useState, useEffect, useMemo } from "react"; import { Plus, Trash2, Pencil, RefreshCcw } from "lucide-react"; import MaterialTable from "@material-table/core"; import { fetchProjects, createConcentrator } from "./concentrators.api"; /* ================= TYPES ================= */ interface Concentrator { "Area Name": string; "Device S/N": string; "Device Name": string; "Device Time": string; "Device Status": string; "Operator": string; "Installed Time": string; "Communication Time": string; "Instruction Manual": string; } interface User { name: string; role: "SUPER_ADMIN" | "USER"; project?: string; // asignado si no es superadmin } /* ================= COMPONENT ================= */ export default function ConcentratorsPage() { // Simulación de usuario actual const currentUser: User = { name: "Admin GRH", role: "SUPER_ADMIN", // cambiar a USER para probar otro caso project: "CESPT", }; const [allProjects, setAllProjects] = useState([]); const [loadingProjects, setLoadingProjects] = useState(true); useEffect(() => { const loadProjects = async () => { try { const projects = await fetchProjects(); setAllProjects(projects); } catch (error) { console.error('Error loading projects:', error); setAllProjects(["GRH (PADRE)", "CESPT", "Proyecto A", "Proyecto B"]); } finally { setLoadingProjects(false); } }; loadProjects(); }, []); // Proyectos visibles según el usuario const visibleProjects = useMemo(() => currentUser.role === "SUPER_ADMIN" ? allProjects : currentUser.project ? [currentUser.project] : [], [allProjects, currentUser.role, currentUser.project] ); const [selectedProject, setSelectedProject] = useState(""); useEffect(() => { if (visibleProjects.length > 0 && !selectedProject) { setSelectedProject(visibleProjects[0]); } }, [visibleProjects, selectedProject]); const [concentrators, setConcentrators] = useState([ { "Area Name": "GRH (PADRE)", "Device S/N": "SN001", "Device Name": "Concentrador A", "Device Time": "2025-12-17T10:00:00Z", "Device Status": "ACTIVE", "Operator": "Operador 1", "Installed Time": "2025-12-17", "Communication Time": "2025-12-17T10:30:00Z", "Instruction Manual": "Manual A", }, { "Area Name": "CESPT", "Device S/N": "SN002", "Device Name": "Concentrador B", "Device Time": "2025-12-16T11:00:00Z", "Device Status": "INACTIVE", "Operator": "Operador 2", "Installed Time": "2025-12-16", "Communication Time": "2025-12-16T11:30:00Z", "Instruction Manual": "Manual B", }, { "Area Name": "Proyecto A", "Device S/N": "SN003", "Device Name": "Concentrador C", "Device Time": "2025-12-15T12:00:00Z", "Device Status": "ACTIVE", "Operator": "Operador 3", "Installed Time": "2025-12-15", "Communication Time": "2025-12-15T12:30:00Z", "Instruction Manual": "Manual C", }, ]); const [activeConcentrator, setActiveConcentrator] = useState(null); const [search, setSearch] = useState(""); const [showModal, setShowModal] = useState(false); const [editingSerial, setEditingSerial] = useState(null); const getEmptyConcentrator = (): Omit => ({ "Area Name": selectedProject, "Device S/N": "", "Device Name": "", "Device Time": new Date().toISOString(), "Device Status": "ACTIVE", "Operator": "", "Installed Time": new Date().toISOString().slice(0, 10), "Communication Time": new Date().toISOString(), "Instruction Manual": "", }); const [form, setForm] = useState>(getEmptyConcentrator()); /* ================= CRUD ================= */ const handleSave = async () => { try { if (editingSerial) { setConcentrators((prev) => prev.map((c) => c["Device S/N"] === editingSerial ? { ...form } : c ) ); } else { await createConcentrator(form); setConcentrators((prev) => [...prev, { ...form }]); } setShowModal(false); setEditingSerial(null); setForm({ ...getEmptyConcentrator(), "Area Name": selectedProject }); setActiveConcentrator(null); } catch (error) { console.error('Error saving concentrator:', error); setConcentrators((prev) => [...prev, { ...form }]); setShowModal(false); setEditingSerial(null); setForm({ ...getEmptyConcentrator(), "Area Name": selectedProject }); setActiveConcentrator(null); } }; const handleDelete = () => { if (!activeConcentrator) return; setConcentrators((prev) => prev.filter((c) => c["Device S/N"] !== activeConcentrator["Device S/N"]) ); setActiveConcentrator(null); }; /* ================= FILTER ================= */ const filtered = concentrators.filter( (c) => (c["Device Name"].toLowerCase().includes(search.toLowerCase()) || c["Device S/N"].toLowerCase().includes(search.toLowerCase())) && c["Area Name"] === selectedProject ); /* ================= UI ================= */ return (
{/* LEFT INFO SIDEBAR */}

Project Information

{/* MAIN */}
{/* HEADER */}

Concentrator Management

Concentradores registrados

{/* SEARCH */} setSearch(e.target.value)} /> {/* TABLE */} ( {rowData["Device Status"]} ), }, { title: "Operator", field: "Operator" }, { title: "Area Name", field: "Area Name" }, { title: "Installed Time", field: "Installed Time", type: "date" }, ]} data={filtered} onRowClick={(_, rowData) => setActiveConcentrator(rowData as Concentrator)} options={{ actionsColumnIndex: -1, search: false, paging: true, sorting: true, rowStyle: (rowData) => ({ backgroundColor: activeConcentrator?.["Device S/N"] === (rowData as Concentrator)["Device S/N"] ? "#EEF2FF" : "#FFFFFF", }), }} />
{/* MODAL */} {showModal && (

{editingSerial ? "Edit Concentrator" : "Add Concentrator"}

setForm({ ...form, "Device Name": e.target.value })} />
setForm({ ...form, "Device S/N": e.target.value })} />
setForm({ ...form, "Operator": e.target.value })} />
setForm({ ...form, "Instruction Manual": e.target.value })} />
setForm({ ...form, "Installed Time": e.target.value })} />
setForm({ ...form, "Device Time": new Date(e.target.value).toISOString() })} />
setForm({ ...form, "Communication Time": new Date(e.target.value).toISOString() })} />
)}
); }