fix(catalog): show real material names, not categories, across quote views

New shared materialLabel() renders the global materials.name with brand/specs
appended only when not already part of the name (deduped; «؟» fallback kept).
Replaces the category-first composer in five places: supplier card badges
(CategoryPage), dashboard item lines (QuoteCard), ledger items summary,
project rows and purchase history. Also fixes the stale Units subtitle
«ضریب تبدیل همان دسته» → «ضریب تبدیل متریال» (category model kept).
This commit is contained in:
2026-09-06 19:03:35 +03:30
parent 1f123a0a05
commit fd1831b3fc
6 changed files with 26 additions and 14 deletions
@@ -11,6 +11,7 @@ import { Header, PageLayout } from "../../components/layout/Header";
import { EmptyState } from "../../components/EmptyState";
import { Combobox } from "../../components/Combobox";
import { SupplierCard, suppliersOfCategory } from "./supplierUtils";
import { materialLabel } from "../../lib/quoteUtils";
import { Button } from "../../components/ui/button";
// صفحه‌ی تأمین‌کننده‌های یک دسته + فرم افزودن تأمین‌کننده
@@ -53,7 +54,7 @@ export function CategoryPage() {
if (li.rejected) return;
const m = materials.find((x) => x.id === li.material_id);
if (!m) return;
const label = `${m.category}${m.brand ? " " + m.brand : ""}${m.specs.length ? " (" + m.specs.join("، ") + ")" : ""}`;
const label = materialLabel(m);
if (!map.has(q.supplier_id)) map.set(q.supplier_id, []);
const list = map.get(q.supplier_id)!;
if (!list.includes(label)) list.push(label);
@@ -3,7 +3,7 @@ import { Link } from "react-router-dom";
import { Building2, Paperclip, Plus } from "lucide-react";
import type { Attachment, Material, Quote, Supplier } from "../../lib/types";
import { api } from "../../lib/api";
import { activeItems, materialById, materialSpecs, quoteTotal, specsLabel } from "../../lib/quoteUtils";
import { activeItems, materialById, materialLabel, quoteTotal } from "../../lib/quoteUtils";
import { fmtDate, faNum } from "../../lib/formatters";
import { groupCommas } from "../../lib/numutil";
import { STATUS_LABEL } from "../../lib/constants";
@@ -85,8 +85,7 @@ export function PurchaseHistory({ supplier, quotes, materials }: PurchaseHistory
{purchases.map((q) => {
const items = activeItems(q).map((li) => {
const m = materialById(materials, li.material_id);
const specs = materialSpecs(m);
return `${m.category} ${m.brand}${specs.length ? " " + specsLabel(specs) : ""}`.trim();
return materialLabel(m);
});
const total = quoteTotal(q);
const attach = attachments[q.id];