// src/pages/DraftsList.tsx import React, { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { List, Typography, Tag, Spin, Empty, DatePicker, Flex, message, } from "antd"; import { useNavigate } from "react-router-dom"; import { ArrowRightOutlined, ThunderboltFilled, HistoryOutlined, FileTextOutlined, } from "@ant-design/icons"; import dayjs, { Dayjs } from "dayjs"; import { api } from "../services/api"; import type { UnifiedInvoice } from "../services/types"; const { Title, Text } = Typography; const { RangePicker } = DatePicker; export const DraftsList: React.FC = () => { const navigate = useNavigate(); // Состояние фильтра дат: по умолчанию последние 30 дней const [dateRange, setDateRange] = useState<[Dayjs, Dayjs]>([ dayjs().subtract(30, "day"), dayjs(), ]); // Запрос данных с учетом дат (даты в ключе обеспечивают авто-перезапрос) const { data: invoices, isLoading, isError, } = useQuery({ queryKey: [ "drafts", dateRange[0].format("YYYY-MM-DD"), dateRange[1].format("YYYY-MM-DD"), ], queryFn: () => api.getDrafts( dateRange[0].format("YYYY-MM-DD"), dateRange[1].format("YYYY-MM-DD") ), }); const getStatusTag = (item: UnifiedInvoice) => { if (item.type === "SYNCED") { return ( } color="success"> Синхронизировано ); } switch (item.status) { case "PROCESSING": return Обработка; case "READY_TO_VERIFY": return Проверка; case "COMPLETED": return Готово; case "ERROR": return Ошибка; case "CANCELED": return Отменен; default: return {item.status}; } }; const handleInvoiceClick = (item: UnifiedInvoice) => { if (item.type === "SYNCED") { message.info("История доступна только для просмотра"); return; } navigate(`/invoice/${item.id}`); }; if (isError) { return (
Ошибка загрузки списка накладных
); } return (
Накладные {/* Фильтр дат */}
Период загрузки: dates && setDateRange([dates[0]!, dates[1]!])} style={{ width: "100%" }} allowClear={false} format="DD.MM.YYYY" />
{isLoading ? (
) : !invoices || invoices.length === 0 ? ( ) : ( { const isSynced = item.type === "SYNCED"; return ( handleInvoiceClick(item)} > {item.document_number || "Без номера"} {item.is_app_created && ( )} {item.incoming_number && ( Вх. № {item.incoming_number} )} {getStatusTag(item)} {item.items_count} поз. {dayjs(item.date_incoming).format("DD.MM.YYYY")} {item.store_name && ( {item.store_name} )} {item.total_sum.toLocaleString("ru-RU", { style: "currency", currency: "RUB", maximumFractionDigits: 0, })} {!isSynced && ( )} ); }} /> )}
); };