fronted fix
This commit is contained in:
@@ -16,7 +16,7 @@ import { Label } from "@/components/ui/label"
|
|||||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
||||||
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { BundleSale, BundleSaleTemplateSummary, BundleSaleTemplateLine, UpdateBundleSaleRequest } from "@/types/bundles"
|
import { BundleSale, BundleSaleTemplate, BundleSaleTemplateSummary, BundleSaleTemplateLine, UpdateBundleSaleRequest } from "@/types/bundles"
|
||||||
import { customersApi } from "@/lib/api/customers"
|
import { customersApi } from "@/lib/api/customers"
|
||||||
import { warehousesApi } from "@/lib/api/warehouses"
|
import { warehousesApi } from "@/lib/api/warehouses"
|
||||||
import { usersApi } from "@/lib/api/users"
|
import { usersApi } from "@/lib/api/users"
|
||||||
@@ -56,6 +56,7 @@ export default function BundleSaleDetailPage() {
|
|||||||
const [bundle, setBundle] = useState<BundleSale | null>(null)
|
const [bundle, setBundle] = useState<BundleSale | null>(null)
|
||||||
const [editing, setEditing] = useState(false)
|
const [editing, setEditing] = useState(false)
|
||||||
const [templates, setTemplates] = useState<BundleSaleTemplateSummary[]>([])
|
const [templates, setTemplates] = useState<BundleSaleTemplateSummary[]>([])
|
||||||
|
const [template, setTemplate] = useState<BundleSaleTemplate | null>(null)
|
||||||
const [customers, setCustomers] = useState<Customer[]>([])
|
const [customers, setCustomers] = useState<Customer[]>([])
|
||||||
const [items, setItems] = useState<ItemListItem[]>([])
|
const [items, setItems] = useState<ItemListItem[]>([])
|
||||||
const [uoms, setUoms] = useState<Uom[]>([])
|
const [uoms, setUoms] = useState<Uom[]>([])
|
||||||
@@ -118,6 +119,11 @@ export default function BundleSaleDetailPage() {
|
|||||||
.catch((err) => setError(errorMessage(err)))
|
.catch((err) => setError(errorMessage(err)))
|
||||||
}, [bundleSaleId, params.id, items])
|
}, [bundleSaleId, params.id, items])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!templateId) return
|
||||||
|
bundleApi.getTemplate(templateId).then(setTemplate).catch((err) => setError(errorMessage(err)))
|
||||||
|
}, [templateId])
|
||||||
|
|
||||||
const templateLabel = useMemo(() => templates.find((t) => t.bundleSaleTemplateId === templateId)?.templateName ?? "Template", [templates, templateId])
|
const templateLabel = useMemo(() => templates.find((t) => t.bundleSaleTemplateId === templateId)?.templateName ?? "Template", [templates, templateId])
|
||||||
const componentSubtotal = useMemo(() => lines.reduce((sum, line) => sum + Number(line.qty || 0) * Number(line.unitPrice || 0), 0), [lines])
|
const componentSubtotal = useMemo(() => lines.reduce((sum, line) => sum + Number(line.qty || 0) * Number(line.unitPrice || 0), 0), [lines])
|
||||||
const isDraft = bundle?.status === "Draft"
|
const isDraft = bundle?.status === "Draft"
|
||||||
@@ -432,47 +438,6 @@ export default function BundleSaleDetailPage() {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{bundle.status === "Draft" && shortageIssues.length > 0 ? (
|
|
||||||
<div className="rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm text-amber-900">
|
|
||||||
<div className="flex flex-col gap-3 md:flex-row md:items-start md:justify-between">
|
|
||||||
<div>
|
|
||||||
<div className="font-semibold">Stock shortage detected before posting</div>
|
|
||||||
<div className="mt-1">This bundle cannot be posted until every included component has enough available stock in the selected warehouse.</div>
|
|
||||||
</div>
|
|
||||||
<Link
|
|
||||||
href="/dashboard/receiving/grn/new"
|
|
||||||
className="inline-flex h-9 items-center gap-2 self-start rounded-full border border-amber-300 bg-white px-4 text-sm font-medium text-amber-950 shadow-sm hover:bg-amber-100"
|
|
||||||
>
|
|
||||||
<ExternalLink className="size-4" />
|
|
||||||
Create GRN
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
<div className="mt-3 overflow-x-auto">
|
|
||||||
<table className="w-full text-sm">
|
|
||||||
<thead className="text-left text-xs uppercase tracking-wide text-amber-900/70">
|
|
||||||
<tr>
|
|
||||||
<th className="py-1 pr-3">Item</th>
|
|
||||||
<th className="py-1 pr-3">Warehouse</th>
|
|
||||||
<th className="py-1 pr-3 text-right">Requested</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{shortageIssues.map((issue) => (
|
|
||||||
<tr key={issue.bundleSaleLineId} className="border-t border-amber-200/60">
|
|
||||||
<td className="py-2 pr-3">
|
|
||||||
<div className="font-medium">{issue.itemSku}</div>
|
|
||||||
<div className="text-xs text-amber-900/70">{issue.itemName}</div>
|
|
||||||
</td>
|
|
||||||
<td className="py-2 pr-3">{issue.warehouseId}</td>
|
|
||||||
<td className="py-2 pr-3 text-right font-mono tabular-nums">{issue.requestedQty.toFixed(0)}</td>
|
|
||||||
</tr>
|
|
||||||
))}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
) : null}
|
|
||||||
|
|
||||||
<section className="rounded-2xl border bg-card p-4 shadow-sm">
|
<section className="rounded-2xl border bg-card p-4 shadow-sm">
|
||||||
<div className="grid gap-3 md:grid-cols-3">
|
<div className="grid gap-3 md:grid-cols-3">
|
||||||
<div><div className="text-xs text-muted-foreground">Component subtotal</div><div className="text-lg font-semibold">{componentSubtotal.toFixed(2)}</div></div>
|
<div><div className="text-xs text-muted-foreground">Component subtotal</div><div className="text-lg font-semibold">{componentSubtotal.toFixed(2)}</div></div>
|
||||||
|
|||||||
Reference in New Issue
Block a user