"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { Card, CardHeader, CardContent } from "@/components/ui/Card"; import Button from "@/components/ui/Button"; import Badge from "@/components/ui/Badge"; import PageContainer from "@/components/ui/PageContainer"; import PageHeader from "@/components/ui/PageHeader"; import SearchBar from "@/components/ui/SearchBar"; import FilterBar from "@/components/ui/FilterBar"; import { LoadingState } from "@/components/ui/States"; import { formatDate } from "@/lib/utils"; import { useTranslation } from "@/lib/i18n"; export default function ContractsMainPage() { const { t } = useTranslation(); const [contracts, setContracts] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(""); const [filteredContracts, setFilteredContracts] = useState([]); const [sortBy, setSortBy] = useState("contract_number"); const [sortOrder, setSortOrder] = useState("asc"); const [statusFilter, setStatusFilter] = useState("all"); useEffect(() => { async function fetchContracts() { setLoading(true); try { const res = await fetch("/api/contracts"); const data = await res.json(); setContracts(data); setFilteredContracts(data); } catch (error) { console.error("Error fetching contracts:", error); } finally { setLoading(false); } } fetchContracts(); }, []); // Filter and sort contracts useEffect(() => { let filtered = [...contracts]; // Apply search filter if (searchTerm) { filtered = filtered.filter( (contract) => contract.contract_number ?.toLowerCase() .includes(searchTerm.toLowerCase()) || contract.contract_name ?.toLowerCase() .includes(searchTerm.toLowerCase()) || contract.customer?.toLowerCase().includes(searchTerm.toLowerCase()) || contract.investor?.toLowerCase().includes(searchTerm.toLowerCase()) ); } // Apply status filter if (statusFilter !== "all") { const currentDate = new Date(); filtered = filtered.filter((contract) => { if (statusFilter === "active" && contract.finish_date) { return new Date(contract.finish_date) >= currentDate; } else if (statusFilter === "completed" && contract.finish_date) { return new Date(contract.finish_date) < currentDate; } else if (statusFilter === "no_end_date") { return !contract.finish_date; } return true; }); } // Apply sorting filtered.sort((a, b) => { let aVal = a[sortBy] || ""; let bVal = b[sortBy] || ""; if (sortBy.includes("date")) { aVal = new Date(aVal || "1900-01-01"); bVal = new Date(bVal || "1900-01-01"); } if (aVal < bVal) return sortOrder === "asc" ? -1 : 1; if (aVal > bVal) return sortOrder === "asc" ? 1 : -1; return 0; }); setFilteredContracts(filtered); }, [searchTerm, contracts, sortBy, sortOrder, statusFilter]); async function handleDelete(id) { const confirmed = confirm("Czy na pewno chcesz usunąć tę umowę?"); if (!confirmed) return; try { const res = await fetch(`/api/contracts/${id}`, { method: "DELETE", }); if (res.ok) { setContracts(contracts.filter((c) => c.contract_id !== id)); } else { alert("Błąd podczas usuwania umowy."); } } catch (error) { console.error("Error deleting contract:", error); alert("Błąd podczas usuwania umowy."); } } // Get contract statistics const getContractStats = () => { const currentDate = new Date(); const total = contracts.length; const active = contracts.filter( (c) => !c.finish_date || new Date(c.finish_date) >= currentDate ).length; const completed = contracts.filter( (c) => c.finish_date && new Date(c.finish_date) < currentDate ).length; const withoutEndDate = contracts.filter((c) => !c.finish_date).length; return { total, active, completed, withoutEndDate }; }; const getContractStatus = (contract) => { if (!contract.finish_date) return "ongoing"; const currentDate = new Date(); const finishDate = new Date(contract.finish_date); return finishDate >= currentDate ? "active" : "completed"; }; const getStatusBadge = (status) => { switch (status) { case "active": return {t('contracts.active')}; case "completed": return {t('common.completed')}; case "ongoing": return {t('contracts.withoutEndDate')}; default: return {t('common.unknown')}; } }; async function handleDelete(id) { const confirmed = confirm("Czy na pewno chcesz usunąć tę umowę?"); if (!confirmed) return; try { const res = await fetch(`/api/contracts/${id}`, { method: "DELETE", }); if (res.ok) { setContracts(contracts.filter((c) => c.contract_id !== id)); } else { alert("Błąd podczas usuwania umowy."); } } catch (error) { console.error("Error deleting contract:", error); alert("Błąd podczas usuwania umowy."); } } const handleSearchChange = (e) => { setSearchTerm(e.target.value); }; if (loading) { return ( ); } const stats = getContractStats(); const filterOptions = [ { label: "Status", value: statusFilter, onChange: (e) => setStatusFilter(e.target.value), options: [ { value: "all", label: "Wszystkie" }, { value: "active", label: "Aktywne" }, { value: "completed", label: "Zakończone" }, { value: "no_end_date", label: "Bez daty końca" }, ], }, { label: "Sortuj według", value: sortBy, onChange: (e) => setSortBy(e.target.value), options: [ { value: "contract_number", label: "Numer umowy" }, { value: "contract_name", label: "Nazwa umowy" }, { value: "customer", label: "Klient" }, { value: "start_date", label: "Data rozpoczęcia" }, { value: "finish_date", label: "Data zakończenia" }, ], }, { label: "Kolejność", value: sortOrder, onChange: (e) => setSortOrder(e.target.value), options: [ { value: "asc", label: "Rosnąco" }, { value: "desc", label: "Malejąco" }, ], }, ]; return ( {" "} {/* Statistics Cards */}

Wszystkie

{stats.total}

Aktywne

{stats.active}

Zakończone

{stats.completed}

W trakcie

{stats.withoutEndDate}

{" "}
{" "} {/* Contracts List */} {filteredContracts.length === 0 ? (

{searchTerm || statusFilter !== "all" ? "Brak pasujących umów" : "Brak umów"}

{searchTerm || statusFilter !== "all" ? "Spróbuj zmienić kryteria wyszukiwania lub filtry." : "Rozpocznij od dodania pierwszej umowy."}

{" "} {!searchTerm && statusFilter === "all" && ( Dodaj pierwszą umowę )}
) : (
{filteredContracts.map((contract) => { const status = getContractStatus(contract); return (
{/* Header */}

{contract.contract_number}

{getStatusBadge(status)} {contract.contract_name && ( — {contract.contract_name} )}
{/* Details Grid */}
{contract.customer && (
Zleceniodawca: {contract.customer}
)} {contract.investor && (
Inwestor: {contract.investor}
)} {contract.date_signed && (
Zawarcie: {" "} {formatDate(contract.date_signed)}
)} {contract.finish_date && (
Zakończenie: {" "} {formatDate(contract.finish_date)}
)}
{" "} {/* Actions */}
Szczegóły
); })}
)} {/* Results Summary */} {filteredContracts.length > 0 && (

Wyświetlono {filteredContracts.length} z {contracts.length} umów {(searchTerm || statusFilter !== "all") && ( )}

{" "}
)}
); }