import { permissions } from "@mrp/shared"; import type { InventoryItemStatus, InventoryItemSummaryDto, InventoryItemType } from "@mrp/shared/dist/inventory/types.js"; import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { useAuth } from "../../auth/AuthProvider"; import { api, ApiError } from "../../lib/api"; import { inventoryStatusFilters, inventoryTypeFilters } from "./config"; import { InventoryStatusBadge } from "./InventoryStatusBadge"; import { InventoryTypeBadge } from "./InventoryTypeBadge"; export function InventoryListPage() { const { token, user } = useAuth(); const [items, setItems] = useState([]); const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState<"ALL" | InventoryItemStatus>("ALL"); const [typeFilter, setTypeFilter] = useState<"ALL" | InventoryItemType>("ALL"); const [status, setStatus] = useState("Loading inventory items..."); const canManage = user?.permissions.includes(permissions.inventoryWrite) ?? false; useEffect(() => { if (!token) { return; } api .getInventoryItems(token, { q: searchTerm.trim() || undefined, status: statusFilter === "ALL" ? undefined : statusFilter, type: typeFilter === "ALL" ? undefined : typeFilter, }) .then((nextItems) => { setItems(nextItems); setStatus(`${nextItems.length} item(s) matched the current filters.`); }) .catch((error: unknown) => { const message = error instanceof ApiError ? error.message : "Unable to load inventory items."; setStatus(message); }); }, [searchTerm, statusFilter, token, typeFilter]); return (

Inventory

Item Master

Core item and BOM definitions for purchased parts, manufactured items, assemblies, and service SKUs.

{canManage ? ( New item ) : null}
{status}
{items.length === 0 ? (
No inventory items have been added yet.
) : (
{items.map((item) => ( ))}
Item Type Status UOM Qty BOM Updated
{item.sku}
{item.name}
{item.unitOfMeasure}
Total {item.onHandQuantity}
Available {item.availableQuantity}
{item.bomLineCount} lines {new Date(item.updatedAt).toLocaleDateString()}
)}
); }