import { useState } from "react"; import { useNavigate } from "react-router-dom"; import { useQuery } from "@tanstack/react-query"; import { useAlert } from "../context/AlertContext"; import { useAuth } from "../context/AuthContext"; import Forbidden from "../components/Forbidden"; import AdminDatePicker from "../components/AdminDatePicker"; import { motion, AnimatePresence } from "framer-motion"; import Pagination from "../components/Pagination"; import useDebounce from "../hooks/useDebounce"; import { usePaginatedQuery } from "../hooks/usePaginatedQuery"; import { formatDate } from "../utils/formatters"; import { warehouseIssueListOptions, type WarehouseIssue, } from "../lib/queries/warehouse"; import { projectListOptions, type Project } from "../lib/queries/projects"; const PER_PAGE = 20; const STATUS_BADGE: Record = { DRAFT: "admin-badge-warning", CONFIRMED: "admin-badge-active", CANCELLED: "admin-badge-danger", }; const STATUS_LABEL: Record = { DRAFT: "Návrh", CONFIRMED: "Potvrzeno", CANCELLED: "Zrušeno", }; export default function WarehouseIssues() { const { hasPermission } = useAuth(); const [page, setPage] = useState(1); const [search, setSearch] = useState(""); const [statusFilter, setStatusFilter] = useState(""); const [projectId, setProjectId] = useState(""); const [dateFrom, setDateFrom] = useState(""); const [dateTo, setDateTo] = useState(""); const debouncedSearch = useDebounce(search, 300); const { data: projectsData } = useQuery(projectListOptions({ perPage: 100 })); const projects = projectsData?.data ?? []; const { items, pagination, isPending, isFetching } = usePaginatedQuery( warehouseIssueListOptions({ search: debouncedSearch || undefined, page, perPage: PER_PAGE, status: statusFilter || undefined, project_id: projectId ? Number(projectId) : undefined, date_from: dateFrom || undefined, date_to: dateTo || undefined, }), ); const navigate = useNavigate(); if (!hasPermission("warehouse.view")) return ; const canOperate = hasPermission("warehouse.operate"); const handleRowClick = (issue: WarehouseIssue) => { navigate(`/warehouse/issues/${issue.id}`); }; const resetFilters = () => { setSearch(""); setStatusFilter(""); setProjectId(""); setDateFrom(""); setDateTo(""); setPage(1); }; const hasActiveFilters = statusFilter || projectId || dateFrom || dateTo; if (isPending) { return (
); } return (

Výdejky

{pagination?.total ?? items.length}{" "} {pagination?.total === 1 ? "doklad" : pagination?.total !== undefined && pagination.total >= 2 && pagination.total <= 4 ? "doklady" : "dokladů"}

{canOperate && ( )}
{ setSearch(e.target.value); setPage(1); }} placeholder="Hledat podle čísla dokladu..." className="admin-form-input" />
{projects.length > 0 && ( )} { setDateFrom(val); setPage(1); }} placeholder="Od" /> { setDateTo(val); setPage(1); }} placeholder="Do" /> {hasActiveFilters && ( )}
{items.length === 0 && (

{search || hasActiveFilters ? "Žádné doklady pro zadaný filtr." : "Zatím nejsou žádné výdejky."}

{canOperate && !search && !hasActiveFilters && ( )}
)} {items.length > 0 && (
{items.map((issue) => ( handleRowClick(issue)} style={{ cursor: "pointer" }} > ))}
Číslo dokladu Projekt Stav Vydal Vytvořeno Položek
{issue.issue_number || "—"} {issue.project ? `${issue.project.project_number} – ${issue.project.name}` : "—"} {STATUS_LABEL[issue.status] ?? issue.status} {issue.issued_by_user ? `${issue.issued_by_user.first_name} ${issue.issued_by_user.last_name}` : "—"} {formatDate(issue.created_at)} {issue._count?.items ?? 0}
)}
); }