feat(my-orders): rename to Closed Purchase Orders, show only closed POs

Open POs are already visible on the dashboard. The /my-orders page now
fetches and displays only completed/closed statuses (MGR_APPROVED through
REJECTED) and is labelled 'Closed Purchase Orders' throughout.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Hardik 2026-05-27 04:21:53 +05:30
parent cf9ff40262
commit d4007ee222
3 changed files with 15 additions and 20 deletions

View file

@ -63,7 +63,7 @@ async function SubmitterDashboard({ userId }: { userId: string }) {
+ New Purchase Order + New Purchase Order
</a> </a>
<Link href="/my-orders" className="text-sm text-primary-600 hover:text-primary-700 font-medium"> <Link href="/my-orders" className="text-sm text-primary-600 hover:text-primary-700 font-medium">
View all my purchase orders View closed purchase orders
</Link> </Link>
</div> </div>
{recentPos.length > 0 && ( {recentPos.length > 0 && (

View file

@ -2,11 +2,11 @@ import { auth } from "@/auth";
import { db } from "@/lib/db"; import { db } from "@/lib/db";
import { redirect } from "next/navigation"; import { redirect } from "next/navigation";
import Link from "next/link"; import Link from "next/link";
import { formatCurrency, formatDate, PO_STATUS_LABELS, PO_STATUS_VARIANTS } from "@/lib/utils"; import { formatCurrency, formatDate } from "@/lib/utils";
import { PoStatusBadge } from "@/components/po/po-status-badge"; import { PoStatusBadge } from "@/components/po/po-status-badge";
import type { Metadata } from "next"; import type { Metadata } from "next";
export const metadata: Metadata = { title: "My Purchase Orders" }; export const metadata: Metadata = { title: "Closed Purchase Orders" };
export default async function MyOrdersPage() { export default async function MyOrdersPage() {
const session = await auth(); const session = await auth();
@ -15,8 +15,11 @@ export default async function MyOrdersPage() {
const { role, id: userId } = session.user; const { role, id: userId } = session.user;
if (!["TECHNICAL", "MANNING", "MANAGER", "SUPERUSER"].includes(role)) redirect("/dashboard"); if (!["TECHNICAL", "MANNING", "MANAGER", "SUPERUSER"].includes(role)) redirect("/dashboard");
const pos = await db.purchaseOrder.findMany({ const closed = await db.purchaseOrder.findMany({
where: { submitterId: userId }, where: {
submitterId: userId,
status: { in: ["MGR_APPROVED", "SENT_FOR_PAYMENT", "PAID_DELIVERED", "CLOSED", "REJECTED"] },
},
orderBy: { updatedAt: "desc" }, orderBy: { updatedAt: "desc" },
include: { include: {
vessel: { select: { name: true } }, vessel: { select: { name: true } },
@ -24,17 +27,10 @@ export default async function MyOrdersPage() {
}, },
}); });
const open = pos.filter((p) =>
["DRAFT", "SUBMITTED", "MGR_REVIEW", "VENDOR_ID_PENDING", "EDITS_REQUESTED", "PARTIALLY_CLOSED", "PARTIALLY_PAID"].includes(p.status)
);
const closed = pos.filter((p) =>
["MGR_APPROVED", "SENT_FOR_PAYMENT", "PAID_DELIVERED", "CLOSED", "REJECTED"].includes(p.status)
);
return ( return (
<div> <div>
<div className="mb-6 flex items-center justify-between"> <div className="mb-6 flex items-center justify-between">
<h1 className="text-2xl font-semibold text-neutral-900">My Purchase Orders</h1> <h1 className="text-2xl font-semibold text-neutral-900">Closed Purchase Orders</h1>
<Link <Link
href="/po/new" href="/po/new"
className="rounded-lg bg-primary-600 px-4 py-2.5 text-sm font-semibold text-white hover:bg-primary-700 transition-colors" className="rounded-lg bg-primary-600 px-4 py-2.5 text-sm font-semibold text-white hover:bg-primary-700 transition-colors"
@ -43,13 +39,12 @@ export default async function MyOrdersPage() {
</Link> </Link>
</div> </div>
<PoTable title="Open Orders" rows={open} /> <PoTable title="Closed Orders" rows={closed} />
{closed.length > 0 && <PoTable title="Past Orders" rows={closed} className="mt-8" />} {closed.length === 0 && (
{pos.length === 0 && (
<div className="rounded-lg border border-neutral-200 bg-white p-12 text-center"> <div className="rounded-lg border border-neutral-200 bg-white p-12 text-center">
<p className="text-neutral-500">You haven't raised any purchase orders yet.</p> <p className="text-neutral-500">No closed purchase orders yet.</p>
<Link href="/po/new" className="mt-4 inline-block text-sm text-primary-600 hover:underline font-medium"> <Link href="/dashboard" className="mt-4 inline-block text-sm text-primary-600 hover:underline font-medium">
Create your first PO View active orders on the dashboard
</Link> </Link>
</div> </div>
)} )}

View file

@ -35,7 +35,7 @@ interface NavItem {
const NAV_ITEMS: NavItem[] = [ const NAV_ITEMS: NavItem[] = [
{ href: "/dashboard", label: "Dashboard", icon: LayoutDashboard }, { href: "/dashboard", label: "Dashboard", icon: LayoutDashboard },
{ href: "/po/new", label: "New PO", icon: Plus, roles: ["TECHNICAL", "MANNING", "MANAGER", "SUPERUSER"] }, { href: "/po/new", label: "New PO", icon: Plus, roles: ["TECHNICAL", "MANNING", "MANAGER", "SUPERUSER"] },
{ href: "/my-orders", label: "My Purchase Orders", icon: FileText, roles: ["TECHNICAL", "MANNING", "MANAGER", "SUPERUSER"] }, { href: "/my-orders", label: "Closed Purchase Orders", icon: FileText, roles: ["TECHNICAL", "MANNING", "MANAGER", "SUPERUSER"] },
{ href: "/po/import", label: "Import PO", icon: Upload, roles: ["MANAGER", "SUPERUSER"] }, { href: "/po/import", label: "Import PO", icon: Upload, roles: ["MANAGER", "SUPERUSER"] },
{ href: "/approvals", label: "Approvals", icon: CheckSquare, roles: ["MANAGER", "SUPERUSER"] }, { href: "/approvals", label: "Approvals", icon: CheckSquare, roles: ["MANAGER", "SUPERUSER"] },
{ href: "/payments", label: "Payments", icon: CreditCard, roles: ["ACCOUNTS"] }, { href: "/payments", label: "Payments", icon: CreditCard, roles: ["ACCOUNTS"] },