// === Orders / Sales history === function OrdersScreen({ orders, setOrders, goto }) { const { PRODUCTS } = window.MOCK; const [statusFilter, setStatusFilter] = useState("all"); const [search, setSearch] = useState(""); const [selected, setSelected] = useState(new Set()); const filtered = useMemo(() => { return orders.filter(o => { if (statusFilter !== "all" && o.status !== statusFilter) return false; if (search) { const q = search.toLowerCase(); if (!o.buyer.toLowerCase().includes(q) && !o.id.toLowerCase().includes(q) && !o.phone.includes(q)) return false; } return true; }); }, [orders, statusFilter, search]); const toggleAll = () => { if (selected.size === filtered.length) setSelected(new Set()); else setSelected(new Set(filtered.map(o => o.id))); }; const toggleOne = (id) => { const s = new Set(selected); if (s.has(id)) s.delete(id); else s.add(id); setSelected(s); }; const orderTotal = (o) => o.items.reduce((s, it) => { const p = PRODUCTS.find(x => x.id === it.pid); return s + (p ? p.price * it.qty : 0); }, 0); const counts = { paid: orders.filter(o => o.status === "paid").length, shipped: orders.filter(o => o.status === "shipped").length, delivered: orders.filter(o => o.status === "delivered").length, }; return (
전체 {orders.length}건 · 결제완료 {counts.paid}건 · 배송중 {counts.shipped}건
| 0 && selected.size === filtered.length} onChange={toggleAll} /> | 주문번호 | 구매자 | 상품 | 결제금액 | 상태 | 주문일시 | |
|---|---|---|---|---|---|---|---|
| toggleOne(o.id)} /> | {o.id} |
{o.buyer}
{o.phone}
|
{firstItem?.name}{o.items.length > 1 ? ` 외 ${o.items.length - 1}건` : ""}
총 {o.items.reduce((s, it) => s + it.qty, 0)}개
|
{formatKRW(orderTotal(o))} | {o.date} |