diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 9f9fb63..869747c 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -323,6 +323,9 @@ interface RawSupplier { contact_person?: string | null; tax_id?: string | null; categories?: string[] | null; // متریال‌های تأمین‌شده + // v2.6: هر تأمین‌کننده دقیقاً یک دسته دارد (FK) — بک‌اند این را می‌فرستد + category_id?: string | null; + category?: { id: string; slug: string; name: string } | null; } interface RawProject { id: string; @@ -676,14 +679,24 @@ function deriveSupplierTopics( return rawSuppliers.map((s) => { const t = topics.get(s.id); const c = cats.get(s.id); - // اگر از quotes topic/category پیدا نشد، registry را چک کن - if (!t || t.size === 0) { + const derivedTopic = t && t.size ? [...t][0] : ""; + const derivedCats = c ? [...c].sort((a, b) => a.localeCompare(b, "fa")) : []; + // اگر از quotes چیزی پیدا نشد، registry را چک کن + if (!derivedTopic && !derivedCats.length) { const reg = supplierTopicRegistry.get(s.id); if (reg) { return adaptSupplier(s, reg.topic, reg.categories); } } - return adaptSupplier(s, t ? [...t][0] : "", c ? [...c].sort((a, b) => a.localeCompare(b, "fa")) : []); + // v2.7: متریال‌ها از دسته جدا شدند، پس استنتاج از اقلام پیشنهاد معمولاً + // دسته‌ای نمی‌دهد و صفحه‌ی تأمین‌کننده‌ها بی‌نام می‌شد. دستهٔ ثبت‌شده روی + // خودِ تأمین‌کننده (FK بک‌اند) منبع اصلی است؛ نامش با نام تاپیک‌ها یکی است. + const backendCat = s.category?.name || ""; + return adaptSupplier( + s, + derivedTopic || backendCat, + derivedCats.length ? derivedCats : backendCat ? [backendCat] : [], + ); }); }