import { Head, Link } from '@inertiajs/react'; import { useCallback } from 'react'; import type { Order } from '@/types/order'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Trash2, ShoppingBag, Printer, Bluetooth, Usb, Unplug, Plus, X, ArrowLeft } from 'lucide-react'; import { DataTable } from '@/components/data-table'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from "@/components/ui/dropdown-menu" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogTitle, } from "@/components/ui/alert-dialog" import * as orderRoutes from '@/routes/order'; import { useOrderIndex } from './hooks/use-order-index'; import { getColumns } from './partials/columns'; import { usePrinter } from '@/hooks/use-printer'; import { EscPosEncoder } from '@/lib/esc-pos-encoder'; import { format } from 'date-fns'; import { id } from 'date-fns/locale'; import { toast } from 'sonner'; export default function OrderIndex({ orders }: { orders: Order[] }) { const { isDeleteDialogOpen, isBulkDeleteDialogOpen, orderToDelete, rowsToDelete, rowSelection, setRowSelection, setRowsToDelete, setIsDeleteDialogOpen, setIsBulkDeleteDialogOpen, onDelete, confirmDelete, confirmBulkDelete, } = useOrderIndex(); const { isConnected, name, connectBluetooth, connectUsb, disconnect, sendData, paperSize, setPaperSize } = usePrinter(); const handlePrint = useCallback(async (order: Order) => { if (!isConnected) { toast.error('Hubungkan printer terlebih dahulu'); return; } const width = paperSize === '58' ? 32 : 48; const line = '-'.repeat(width); const encoder = new EscPosEncoder(); const result = encoder .initialize() .align(1) .size(1) .bold(true) .line('VN Grup') .size(0) .bold(false) .line(line) .align(0) .line(`No. Invoice : ${order.invoice_number}`) .line(`Tanggal : ${format(new Date(order.created_at), 'dd MMMM yyyy HH:mm', { locale: id })}`) .line(`Pelanggan : ${order.customer_name}`) .line(line); order.items?.forEach((item, index) => { if (index > 0) result.line(); result.line(item.product?.name || 'Produk'); const qtyPrice = `${item.qty} x ${item.price_formatted}`; const subtotal = item.total_formatted; const spaces = width - qtyPrice.length - subtotal.length; result.line(qtyPrice + ' '.repeat(Math.max(0, spaces)) + subtotal); }); result.line(line); const discountAmount = Number(order.discount || 0); if (discountAmount > 0) { const discountLabel = 'Diskon:'; const discountVal = `- Rp ${discountAmount.toLocaleString('id-ID')}`; const dSpaces = width - discountLabel.length - discountVal.length; result.line(discountLabel + ' '.repeat(Math.max(0, dSpaces)) + discountVal); } const totalLabel = 'TOTAL:'; const totalVal = order.total_formatted; const tSpaces = width - totalLabel.length - totalVal.length; result.bold(true).line(totalLabel + ' '.repeat(Math.max(0, tSpaces)) + totalVal).bold(false); result .line(line) .align(1) .feed(1) .line('Terima Kasih') .line('Selamat Belanja Kembali') .feed(1) .cut(); await sendData(result.encode()); }, [isConnected, sendData, paperSize]); const columns = getColumns({ onDelete, onPrint: handlePrint }); return (

Pesanan

Koneksi Printer {isConnected ? ( <> Ukuran Kertas: {paperSize}mm setPaperSize(v as any)}> 58mm 80mm Putus Koneksi ) : ( <> Bluetooth USB )}
{ setRowsToDelete(rows); setIsBulkDeleteDialogOpen(true); }, icon: Trash2, variant: 'destructive' }, ]} /> {/* Single Delete Confirmation */} Hapus pesanan? Tindakan ini tidak dapat dibatalkan. Data pesanan dengan nomor invoice {orderToDelete?.invoice_number} akan dihapus secara permanen dan stok akan dikembalikan. Batal Hapus {/* Bulk Delete Confirmation */} Hapus {rowsToDelete.length} data pesanan? Tindakan ini tidak dapat dibatalkan. {rowsToDelete.length} pesanan yang terpilih akan dihapus secara permanen. Batal Hapus
); } OrderIndex.layout = { breadcrumbs: [ { title: 'Kelola', } ], };