// ============================================================ // هسته‌ی نمایش مشترک لیست متریال‌های انبار برای بخش‌های لیست‌محور // (برداشت / ضایعات / اتلاف / مفقودی / انتقال داخلی / شمارش موجودی) // // دسکتاپ (sm+): جدول فشرده با هدر چسبان و ارتفاع بهینه. // موبایل (<640px): کارت‌های عمودی لمسی با فیلد بزرگ ورود مقدار. // هر بخش ستون‌های نمایش یکسان را از اینجا می‌گیرد و فقط رفتار ورودی // (تعداد ساده یا شمارش‌شده) را با isCount انتخاب می‌کند. // ============================================================ import { faNum } from "../../../lib/formatters"; export interface StockRecord { id: string; material: { id: string; name: string }; brand: { id: string; name: string } | null; unit: { id: number; code: string; name_fa: string | null } | null; quantity_number: number; specs: Record; } export interface RowDraft { key: string; qty: string; note: string; } export function specsLine(specs: Record | undefined): string { return ( Object.entries(specs || {}) .map(([k, v]) => `${k}: ${v}`) .join(" · ") || "—" ); } interface StockTableProps { records: StockRecord[]; rows: RowDraft[]; setRows: (r: RowDraft[]) => void; /** شمارش موجودی: placeholder «شمارش‌شده» و پیش‌نمایش مقدار فعلی هنگام خالی بودن */ isCount?: boolean; /** نمایش ستون متریال در دسکتاپ — وقتی فیلتر نام فعال است می‌توان پنهان کرد */ showMaterial?: boolean; emptyMsg: string; unitNameFn: (id: number | null | undefined) => string; } export function StockTable({ records, rows, setRows, isCount = false, showMaterial = true, emptyMsg, unitNameFn }: StockTableProps) { if (emptyMsg) { return
{emptyMsg}
; } const qtyPlaceholder = isCount ? "شمارش‌شده" : "۰"; return ( <> {/* دسکتاپ: جدول فشرده با هدر چسبان */}
{showMaterial && } {records.map((r, i) => ( {showMaterial && ( )} ))}
متریالمشخصه‌ها برند واحد موجودی فعلی {isCount ? "شمارش‌شده" : "تعداد"} یادداشت
{r.material?.name || "—"}{specsLine(r.specs)} {r.brand?.name || "—"} {unitNameFn(r.unit?.id)} {faNum(r.quantity_number)} setRows(rows.map((x, xi) => (xi === i ? { ...x, qty: e.target.value } : x)))} /> setRows(rows.map((x, xi) => (xi === i ? { ...x, note: e.target.value } : x)))} />
ستون «موجودی فعلی» مقدار موجود هر رکورد است. برای هر ردیف تعداد و یادداشت وارد کنید. {faNum(records.length)} قلم کالا
{/* موبایل: کارت‌های عمودی لمسی */}
{records.map((r, i) => (
{r.material?.name || "—"}
{r.brand?.name || "بدون برند"} · {unitNameFn(r.unit?.id)}
{r.specs && Object.keys(r.specs).length > 0 && (
{specsLine(r.specs)}
)}
موجودی
{faNum(r.quantity_number)}
setRows(rows.map((x, xi) => (xi === i ? { ...x, qty: e.target.value } : x)))} /> setRows(rows.map((x, xi) => (xi === i ? { ...x, note: e.target.value } : x)))} />
))}
{faNum(records.length)} قلم کالا — برای هر قلم، مقدار را وارد کنید.
); }