Merge pull request 'feat(sidebar): group Purchase Order links under Purchasing' (#113) from feat/sidebar-purchasing-section into master
All checks were successful
Refresh staging / refresh (push) Successful in 7s

Reviewed-on: #113
This commit is contained in:
shad0w 2026-06-24 00:45:23 +00:00
commit 21df005ab6
2 changed files with 43 additions and 5 deletions

View file

@ -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

View file

@ -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(<Sidebar userRole="MANAGER" />);
// 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(<Sidebar userRole="MANAGER" />);
expect(headerButton("Purchasing")).toHaveAttribute("aria-expanded", "true");
expect(screen.getByRole("link", { name: /New Purchase Order/i })).toBeInTheDocument();
});
it("drops the old PO labels", () => {
render(<Sidebar userRole="MANAGER" />);
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();
});
});