Add filter to show only personalised orders

This commit is contained in:
Andymick
2026-07-18 10:13:21 +01:00
parent 64b57b8680
commit 0145f425b1
+43 -2
View File
@@ -13,10 +13,11 @@ const STATUS_STYLES: Record<string, string> = {
FAILED: 'bg-splash-pink/10 text-splash-pink', FAILED: 'bg-splash-pink/10 text-splash-pink',
}; };
export default async function OrdersPage({ searchParams }: { searchParams: { archived?: string } }) { export default async function OrdersPage({ searchParams }: { searchParams: { archived?: string; personalised?: string } }) {
await autoArchiveOldOrders(); await autoArchiveOldOrders();
const showArchived = searchParams.archived === '1'; const showArchived = searchParams.archived === '1';
const showOnlyPersonalised = searchParams.personalised === '1';
let orders = []; let orders = [];
try { try {
@@ -28,10 +29,28 @@ export default async function OrdersPage({ searchParams }: { searchParams: { arc
include: { items: true }, include: { items: true },
}); });
orders.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()); orders.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
// Filter to personalised orders if requested
if (showOnlyPersonalised) {
orders = orders.filter((order) =>
order.items.some((item) => {
const design = JSON.parse(item.designJson) as { front: unknown[]; back: unknown[] };
return design.front.length > 0 || design.back.length > 0;
})
);
}
} catch (err) { } catch (err) {
console.error('Error fetching orders:', err); console.error('Error fetching orders:', err);
} }
const filterHref = (personalised: boolean) => {
const params = new URLSearchParams();
if (showArchived) params.set('archived', '1');
if (personalised) params.set('personalised', '1');
const qs = params.toString();
return `/admin/orders${qs ? `?${qs}` : ''}`;
};
return ( return (
<div className="mx-auto max-w-4xl px-6 py-12"> <div className="mx-auto max-w-4xl px-6 py-12">
<AdminNav /> <AdminNav />
@@ -48,8 +67,30 @@ export default async function OrdersPage({ searchParams }: { searchParams: { arc
</p> </p>
)} )}
{!showArchived && (
<div className="mt-6 flex flex-wrap items-center gap-2">
<span className="text-sm text-muted">Filter:</span>
<div className="inline-flex border border-line">
<Link
href={filterHref(false)}
className={`px-4 py-1.5 text-sm ${!showOnlyPersonalised ? 'bg-ink text-paper' : 'hover:text-clay'}`}
>
All
</Link>
<Link
href={filterHref(true)}
className={`px-4 py-1.5 text-sm ${showOnlyPersonalised ? 'bg-ink text-paper' : 'hover:text-clay'}`}
>
Personalised only
</Link>
</div>
</div>
)}
{orders.length === 0 ? ( {orders.length === 0 ? (
<p className="mt-10 text-sm text-muted">{showArchived ? 'Nothing archived yet.' : 'No orders yet.'}</p> <p className="mt-10 text-sm text-muted">
{showArchived ? 'Nothing archived yet.' : showOnlyPersonalised ? 'No personalised orders yet.' : 'No orders yet.'}
</p>
) : ( ) : (
<div className="mt-8 divide-y divide-line border-t border-line"> <div className="mt-8 divide-y divide-line border-t border-line">
{orders.map((order) => { {orders.map((order) => {