'use client'; import React, { useState, useEffect } from 'react'; import { OrderStatus, QuoteOrder } from '@/types'; import { ClipboardList, Search, Printer, Trash2, Eye, CheckCircle, Clock, Wrench, Truck, AlertCircle, RefreshCw, } from 'lucide-react'; interface OrdersManagerProps { onViewOrder?: (order: QuoteOrder) => void; } export const OrdersManager: React.FC = ({ onViewOrder }) => { const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); const [selectedOrder, setSelectedOrder] = useState(null); const fetchOrders = async () => { try { setLoading(true); const url = new URL('/api/orders', window.location.origin); if (statusFilter !== 'all') url.searchParams.set('status', statusFilter); if (search) url.searchParams.set('search', search); const res = await fetch(url.toString()); const data = await res.json(); if (Array.isArray(data)) { setOrders(data); } } catch (err) { console.error('Fetch orders error:', err); } finally { setLoading(false); } }; useEffect(() => { fetchOrders(); }, [statusFilter]); const handleSearchSubmit = (e: React.FormEvent) => { e.preventDefault(); fetchOrders(); }; const handleUpdateStatus = async (orderId: number, newStatus: OrderStatus) => { try { const res = await fetch('/api/orders', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'status', id: orderId, status: newStatus }), }); if (res.ok) { setOrders((prev) => prev.map((o) => (o.id === orderId ? { ...o, status: newStatus } : o)) ); } } catch (err) { console.error('Update order status error:', err); } }; const handleDeleteOrder = async (orderId: number) => { if (!confirm('Bạn có chắc chắn muốn xóa đơn hàng này?')) return; try { const res = await fetch(`/api/orders?id=${orderId}`, { method: 'DELETE' }); if (res.ok) { setOrders((prev) => prev.filter((o) => o.id !== orderId)); } } catch (err) { console.error('Delete order error:', err); } }; const getStatusBadge = (status: OrderStatus) => { switch (status) { case 'quote': return Báo Giá; case 'approved': return Đã Duyệt / Đặt Cọc; case 'printing': return Đang In Máy; case 'finishing': return Đang Gia Công; case 'completed': return Đã Hoàn Thành; case 'delivered': return Đã Giao Hàng; case 'cancelled': return Đã Hủy; default: return {status}; } }; return (
{/* Thanh tìm kiếm & lọc trạng thái */}
setSearch(e.target.value)} className="w-full pl-9 pr-3 py-2 text-xs border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
{/* Bảng danh sách đơn hàng */}
{loading ? ( ) : orders.length === 0 ? ( ) : ( orders.map((order) => ( )) )}
Mã Đơn Khách Hàng Tên Ấn Phẩm Công Nghệ Số Lượng Tổng Tiền Trạng Thái Thao Tác
Đang tải danh sách đơn hàng...
Không tìm thấy đơn hàng nào
{order.code} {new Date(order.createdAt).toLocaleDateString('vi-VN')} {order.customerName} {order.customerPhone} {order.jobName} {order.widthMm}x{order.heightMm}mm • {order.paperName} {order.printTech} {order.quantity.toLocaleString('vi-VN')} {order.finalPrice.toLocaleString('vi-VN')}đ ({order.unitPrice.toLocaleString('vi-VN')}đ/c)
); };