SalesOrdersPage.tsx
2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import { useEffect, useState } from 'react'
import { Link } from 'react-router-dom'
import { salesOrders } from '@/api/client'
import type { SalesOrder } from '@/types/api'
import { PageHeader } from '@/components/PageHeader'
import { Loading } from '@/components/Loading'
import { ErrorBox } from '@/components/ErrorBox'
import { DataTable, type Column } from '@/components/DataTable'
import { StatusBadge } from '@/components/StatusBadge'
export function SalesOrdersPage() {
const [rows, setRows] = useState<SalesOrder[]>([])
const [error, setError] = useState<Error | null>(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
salesOrders
.list()
.then((rs) => setRows([...rs].sort((a, b) => a.code.localeCompare(b.code))))
.catch((e: unknown) => setError(e instanceof Error ? e : new Error(String(e))))
.finally(() => setLoading(false))
}, [])
const columns: Column<SalesOrder>[] = [
{
header: 'Code',
key: 'code',
render: (r) => (
<Link to={`/sales-orders/${r.id}`} className="font-mono text-brand-600 hover:underline">
{r.code}
</Link>
),
},
{ header: 'Customer', key: 'partnerCode', render: (r) => <span className="font-mono">{r.partnerCode}</span> },
{ header: 'Date', key: 'orderDate' },
{ header: 'Status', key: 'status', render: (r) => <StatusBadge status={r.status} /> },
{
header: 'Total',
key: 'totalAmount',
render: (r) => (
<span className="font-mono tabular-nums">
{Number(r.totalAmount).toLocaleString(undefined, {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
})}{' '}
{r.currencyCode}
</span>
),
},
{
header: 'Lines',
key: 'lines',
render: (r) => <span className="text-slate-500">{r.lines.length}</span>,
},
]
return (
<div>
<PageHeader
title="Sales Orders"
subtitle="Customer-facing orders. Confirm to auto-generate production work orders."
actions={
<Link to="/sales-orders/new" className="btn-primary">+ New Order</Link>
}
/>
{loading && <Loading />}
{error && <ErrorBox error={error} />}
{!loading && !error && <DataTable rows={rows} columns={columns} />}
</div>
)
}