mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
редактирование и удаление сопоставлений
список накладных с позициями
This commit is contained in:
@@ -2,22 +2,18 @@
|
||||
|
||||
import React, { useState } from "react";
|
||||
import { useQuery } from "@tanstack/react-query";
|
||||
import {
|
||||
List,
|
||||
Typography,
|
||||
Tag,
|
||||
Spin,
|
||||
Empty,
|
||||
DatePicker,
|
||||
Flex,
|
||||
message,
|
||||
} from "antd";
|
||||
import { List, Typography, Tag, Spin, Empty, DatePicker, Flex } from "antd";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import {
|
||||
ArrowRightOutlined,
|
||||
ThunderboltFilled,
|
||||
HistoryOutlined,
|
||||
FileTextOutlined,
|
||||
CheckCircleOutlined,
|
||||
DeleteOutlined,
|
||||
PlusOutlined,
|
||||
ExclamationCircleOutlined,
|
||||
LoadingOutlined,
|
||||
CloseCircleOutlined,
|
||||
StopOutlined,
|
||||
} from "@ant-design/icons";
|
||||
import dayjs, { Dayjs } from "dayjs";
|
||||
import { api } from "../services/api";
|
||||
@@ -29,9 +25,9 @@ const { RangePicker } = DatePicker;
|
||||
export const DraftsList: React.FC = () => {
|
||||
const navigate = useNavigate();
|
||||
|
||||
// Состояние фильтра дат: по умолчанию последние 30 дней
|
||||
// Состояние фильтра дат: по умолчанию последние 7 дней
|
||||
const [dateRange, setDateRange] = useState<[Dayjs, Dayjs]>([
|
||||
dayjs().subtract(30, "day"),
|
||||
dayjs().subtract(7, "day"),
|
||||
dayjs(),
|
||||
]);
|
||||
|
||||
@@ -51,6 +47,9 @@ export const DraftsList: React.FC = () => {
|
||||
dateRange[0].format("YYYY-MM-DD"),
|
||||
dateRange[1].format("YYYY-MM-DD")
|
||||
),
|
||||
staleTime: 0,
|
||||
refetchOnMount: true,
|
||||
refetchOnWindowFocus: true,
|
||||
});
|
||||
|
||||
const getStatusTag = (item: UnifiedInvoice) => {
|
||||
@@ -64,26 +63,64 @@ export const DraftsList: React.FC = () => {
|
||||
|
||||
switch (item.status) {
|
||||
case "PROCESSING":
|
||||
return <Tag color="blue">Обработка</Tag>;
|
||||
return (
|
||||
<Tag icon={<LoadingOutlined />} color="blue">
|
||||
Обработка
|
||||
</Tag>
|
||||
);
|
||||
case "READY_TO_VERIFY":
|
||||
return <Tag color="orange">Проверка</Tag>;
|
||||
return (
|
||||
<Tag icon={<ExclamationCircleOutlined />} color="orange">
|
||||
Проверка
|
||||
</Tag>
|
||||
);
|
||||
case "COMPLETED":
|
||||
return <Tag color="green">Готово</Tag>;
|
||||
return (
|
||||
<Tag icon={<CheckCircleOutlined />} color="green">
|
||||
Готово
|
||||
</Tag>
|
||||
);
|
||||
case "ERROR":
|
||||
return <Tag color="red">Ошибка</Tag>;
|
||||
return (
|
||||
<Tag icon={<CloseCircleOutlined />} color="red">
|
||||
Ошибка
|
||||
</Tag>
|
||||
);
|
||||
case "CANCELED":
|
||||
return <Tag color="default">Отменен</Tag>;
|
||||
return (
|
||||
<Tag icon={<StopOutlined />} color="default">
|
||||
Отменен
|
||||
</Tag>
|
||||
);
|
||||
case "NEW":
|
||||
return (
|
||||
<Tag icon={<PlusOutlined />} color="blue">
|
||||
Новый
|
||||
</Tag>
|
||||
);
|
||||
case "PROCESSED":
|
||||
return (
|
||||
<Tag icon={<CheckCircleOutlined />} color="green">
|
||||
Обработан
|
||||
</Tag>
|
||||
);
|
||||
case "DELETED":
|
||||
return (
|
||||
<Tag icon={<DeleteOutlined />} color="red">
|
||||
Удален
|
||||
</Tag>
|
||||
);
|
||||
default:
|
||||
return <Tag>{item.status}</Tag>;
|
||||
}
|
||||
};
|
||||
|
||||
const handleInvoiceClick = (item: UnifiedInvoice) => {
|
||||
if (item.type === "SYNCED") {
|
||||
message.info("История доступна только для просмотра");
|
||||
return;
|
||||
if (item.type === "DRAFT") {
|
||||
navigate("/invoice/draft/" + item.id);
|
||||
} else if (item.type === "SYNCED") {
|
||||
navigate("/invoice/view/" + item.id);
|
||||
}
|
||||
navigate(`/invoice/${item.id}`);
|
||||
};
|
||||
|
||||
if (isError) {
|
||||
@@ -143,7 +180,7 @@ export const DraftsList: React.FC = () => {
|
||||
padding: 12,
|
||||
marginBottom: 10,
|
||||
borderRadius: 12,
|
||||
cursor: isSynced ? "default" : "pointer",
|
||||
cursor: "pointer",
|
||||
border: isSynced ? "1px solid #f0f0f0" : "1px solid #e6f7ff",
|
||||
boxShadow: "0 2px 4px rgba(0,0,0,0.02)",
|
||||
display: "block",
|
||||
@@ -158,34 +195,44 @@ export const DraftsList: React.FC = () => {
|
||||
{item.document_number || "Без номера"}
|
||||
</Text>
|
||||
{item.is_app_created && (
|
||||
<ThunderboltFilled
|
||||
style={{ color: "#faad14" }}
|
||||
title="Создано в RMSer"
|
||||
/>
|
||||
<span title="Создано в RMSer">📱</span>
|
||||
)}
|
||||
</Flex>
|
||||
<Flex vertical gap={2}>
|
||||
<Text type="secondary" style={{ fontSize: 13 }}>
|
||||
{item.items_count} поз.
|
||||
</Text>
|
||||
<Text type="secondary" style={{ fontSize: 13 }}>
|
||||
{dayjs(item.date_incoming).format("DD.MM.YYYY")}
|
||||
</Text>
|
||||
</Flex>
|
||||
{item.incoming_number && (
|
||||
<Text type="secondary" style={{ fontSize: 12 }}>
|
||||
Вх. № {item.incoming_number}
|
||||
</Text>
|
||||
)}
|
||||
</Flex>
|
||||
{getStatusTag(item)}
|
||||
<Flex vertical align="start" gap={4}>
|
||||
{getStatusTag(item)}
|
||||
{isSynced && item.items_preview && (
|
||||
<div>
|
||||
{item.items_preview
|
||||
.split(", ")
|
||||
.map((previewItem, idx) => (
|
||||
<div
|
||||
key={idx}
|
||||
style={{ fontSize: 12, color: "#666" }}
|
||||
>
|
||||
{previewItem}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</Flex>
|
||||
</Flex>
|
||||
|
||||
<Flex justify="space-between" style={{ marginTop: 4 }}>
|
||||
<Flex gap={8} align="center">
|
||||
<FileTextOutlined style={{ color: "#888" }} />
|
||||
<Text type="secondary" style={{ fontSize: 13 }}>
|
||||
{item.items_count} поз.
|
||||
</Text>
|
||||
<Text type="secondary" style={{ fontSize: 13 }}>
|
||||
•
|
||||
</Text>
|
||||
<Text type="secondary" style={{ fontSize: 13 }}>
|
||||
{dayjs(item.date_incoming).format("DD.MM.YYYY")}
|
||||
</Text>
|
||||
</Flex>
|
||||
<Flex justify="space-between" align="center">
|
||||
<div></div>
|
||||
{item.store_name && (
|
||||
<Tag
|
||||
style={{
|
||||
|
||||
Reference in New Issue
Block a user