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
All checks were successful
Refresh staging / refresh (push) Successful in 7s
Reviewed-on: #113
This commit is contained in:
commit
21df005ab6
2 changed files with 43 additions and 5 deletions
|
|
@ -56,17 +56,21 @@ const HISTORY_ROLES: Role[] = [
|
||||||
|
|
||||||
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: "/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: "/approvals", label: "Approvals", icon: CheckSquare, roles: ["MANAGER", "SUPERUSER"] },
|
||||||
{ href: "/payments", label: "Payments", icon: CreditCard, roles: ["ACCOUNTS"] },
|
{ href: "/payments", label: "Payments", icon: CreditCard, roles: ["ACCOUNTS"] },
|
||||||
{ href: "/payments/history", label: "Payment History", icon: Receipt, roles: ["ACCOUNTS", "SUPERUSER"] },
|
{ 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 },
|
{ href: "/profile", label: "My Profile", icon: UserCircle },
|
||||||
];
|
];
|
||||||
|
|
||||||
// ── Purchasing section ────────────────────────────────────────────────────────
|
// ── 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)
|
// Staff browsing items (product catalogue + cart for PO creation)
|
||||||
const PURCHASING_STAFF: NavItem[] = [
|
const PURCHASING_STAFF: NavItem[] = [
|
||||||
{ href: "/catalogue/items", label: "Items", icon: Package, roles: ["TECHNICAL", "MANNING", "SUPERUSER"] },
|
{ 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) ─────────────────────────────────────────
|
// ── Crewing section (feature-flagged) ─────────────────────────────────────────
|
||||||
// Gated by CREWING_ENABLED. Phase 2 adds Requisitions (Manager + MPO, per
|
// Gated by CREWING_ENABLED. Phase 2 adds Requisitions (Manager + MPO, per
|
||||||
|
|
|
||||||
|
|
@ -100,3 +100,37 @@ describe("Sidebar collapsible sections", () => {
|
||||||
expect(within(adminVendors).queryByText("Vendors")).toBeTruthy();
|
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();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue