diff --git a/App/components/layout/sidebar.tsx b/App/components/layout/sidebar.tsx index 39f97fc..4eba98d 100644 --- a/App/components/layout/sidebar.tsx +++ b/App/components/layout/sidebar.tsx @@ -56,17 +56,21 @@ const HISTORY_ROLES: Role[] = [ const NAV_ITEMS: NavItem[] = [ { href: "/dashboard", label: "Dashboard", icon: LayoutDashboard }, - { href: "/po/new", label: "New PO", icon: Plus, 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: "/approvals", label: "Approvals", icon: CheckSquare, roles: ["MANAGER", "SUPERUSER"] }, { href: "/payments", label: "Payments", icon: CreditCard, roles: ["ACCOUNTS"] }, { href: "/payments/history", label: "Payment History", icon: Receipt, roles: ["ACCOUNTS", "SUPERUSER"] }, - { href: "/history", label: "History", icon: History, roles: HISTORY_ROLES }, { href: "/profile", label: "My Profile", icon: UserCircle }, ]; // ── Purchasing section ──────────────────────────────────────────────────────── +// Purchase Order actions (create / browse / import / history) +const PURCHASING_PO: NavItem[] = [ + { href: "/po/new", label: "New Purchase Order", icon: Plus, roles: ["TECHNICAL", "MANNING", "MANAGER", "SUPERUSER"] }, + { href: "/my-orders", label: "Closed Purchase Orders", icon: FileText, roles: ["TECHNICAL", "MANNING", "MANAGER", "SUPERUSER"] }, + { href: "/po/import", label: "Import Purchase Order", icon: Upload, roles: ["MANAGER", "SUPERUSER"] }, + { href: "/history", label: "Purchase Order History", icon: History, roles: HISTORY_ROLES }, +]; + // Staff browsing items (product catalogue + cart for PO creation) const PURCHASING_STAFF: NavItem[] = [ { href: "/catalogue/items", label: "Items", icon: Package, roles: ["TECHNICAL", "MANNING", "SUPERUSER"] }, @@ -85,7 +89,7 @@ const PURCHASING_MGMT: NavItem[] = [ : []), ]; -const PURCHASING_ITEMS: NavItem[] = [...PURCHASING_STAFF, ...PURCHASING_MGMT]; +const PURCHASING_ITEMS: NavItem[] = [...PURCHASING_PO, ...PURCHASING_STAFF, ...PURCHASING_MGMT]; // ── Crewing section (feature-flagged) ───────────────────────────────────────── // Gated by CREWING_ENABLED. Phase 2 adds Requisitions (Manager + MPO, per diff --git a/App/tests/unit/sidebar.test.tsx b/App/tests/unit/sidebar.test.tsx index 7b88292..5facd73 100644 --- a/App/tests/unit/sidebar.test.tsx +++ b/App/tests/unit/sidebar.test.tsx @@ -100,3 +100,37 @@ describe("Sidebar collapsible sections", () => { expect(within(adminVendors).queryByText("Vendors")).toBeTruthy(); }); }); + +describe("Purchase Order links under Purchasing", () => { + it("renders the renamed PO links inside the Purchasing section (not top-level)", () => { + render(); + + // Collapsed by default → PO links are not in the DOM until Purchasing opens. + expect(screen.queryByRole("link", { name: /New Purchase Order/i })).not.toBeInTheDocument(); + + fireEvent.click(headerButton("Purchasing")); + + expect(screen.getByRole("link", { name: /New Purchase Order/i })).toBeInTheDocument(); + expect(screen.getByRole("link", { name: /Closed Purchase Orders/i })).toBeInTheDocument(); + expect(screen.getByRole("link", { name: /Import Purchase Order/i })).toBeInTheDocument(); + expect(screen.getByRole("link", { name: /Purchase Order History/i })).toBeInTheDocument(); + }); + + it("auto-expands Purchasing when a PO route is active", () => { + mockPathname = "/po/new"; + render(); + + expect(headerButton("Purchasing")).toHaveAttribute("aria-expanded", "true"); + expect(screen.getByRole("link", { name: /New Purchase Order/i })).toBeInTheDocument(); + }); + + it("drops the old PO labels", () => { + render(); + fireEvent.click(headerButton("Purchasing")); + + // Old labels were "New PO" / "Import PO" / "History". + expect(screen.queryByRole("link", { name: /^New PO$/i })).not.toBeInTheDocument(); + expect(screen.queryByRole("link", { name: /^Import PO$/i })).not.toBeInTheDocument(); + expect(screen.queryByRole("link", { name: /^History$/i })).not.toBeInTheDocument(); + }); +});