From 186546f1fedd9d1c298980d2d2af65fa35fca647 Mon Sep 17 00:00:00 2001 From: Suriya Date: Thu, 16 Jul 2026 18:19:41 +0530 Subject: [PATCH] Make subcategory optional, source category picker from real tenant data Matches the backend: subcategory is no longer a required field in the import modal (defaults to none/0 instead of blocking submission), and the Category dropdown now comes from GET gettenantcategories (what this tenant's own products actually use) instead of the global categories list, which was missing categoryid 2 despite it being the category tenant 1135 actually needs. Co-Authored-By: Claude Sonnet 5 --- src/components/ImportProductModal.tsx | 23 ++++++++++------------- src/hooks/useCatalogueImport.ts | 8 ++++++++ src/services/catalogueApi.ts | 15 +++++++++++++++ 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/components/ImportProductModal.tsx b/src/components/ImportProductModal.tsx index 003011d..88b2251 100644 --- a/src/components/ImportProductModal.tsx +++ b/src/components/ImportProductModal.tsx @@ -1,9 +1,7 @@ import React, { useState } from 'react'; import { X, Save, AlertCircle } from 'lucide-react'; import { CatalogueProduct, ImportCatalogueProductRequest } from '../services/catalogueApi'; -import { useProductSubcategories } from '../hooks/useCatalogueImport'; -import { useFiestaProductCategories } from '../services/fiestaQueries'; -import { str as fstr } from '../services/fiestaApi'; +import { useProductSubcategories, useTenantCategories } from '../hooks/useCatalogueImport'; interface ImportProductModalProps { product: CatalogueProduct; @@ -27,14 +25,14 @@ export default function ImportProductModal({ const [taxPercent, setTaxPercent] = useState('0'); const [quantity, setQuantity] = useState('1'); - const { data: categoriesData = [], isLoading: isLoadingCategories } = useFiestaProductCategories(); - const categories = categoriesData.map((c: any) => ({ - categoryid: Number(c.categoryid), - categoryname: fstr(c.categoryname), - })); + // Categories this tenant's own products actually use — the global + // categories list is missing categoryids that are nonetheless in real use. + const { data: categories = [], isLoading: isLoadingCategories } = useTenantCategories(tenantid); // Subcategories are scoped to the selected category, so a product can't be // tagged with a subcategory that doesn't actually belong to its category. + // Optional: many subcategories are unowned/shared and a product can be + // imported without one (falls back to "Uncategorized" in subcategory views). const { data: subcategories = [], isLoading: isLoadingSubcats } = useProductSubcategories( tenantid, categoryId ? Number(categoryId) : undefined, @@ -42,7 +40,7 @@ export default function ImportProductModal({ const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - if (!categoryId || !subcategoryId || !retailPrice || !productCost) { + if (!categoryId || !retailPrice || !productCost) { alert("Please fill in all required fields."); return; } @@ -53,7 +51,7 @@ export default function ImportProductModal({ brand: product.brand, catalogueid: product.id, categoryid: Number(categoryId), - subcategoryid: Number(subcategoryId), + subcategoryid: subcategoryId ? Number(subcategoryId) : 0, quantity: Number(quantity), stocktype: "in", status: "Active", @@ -112,7 +110,7 @@ export default function ImportProductModal({ )}
- + {!categoryId ? (
Select a category first
) : isLoadingSubcats ? ( @@ -122,9 +120,8 @@ export default function ImportProductModal({ value={subcategoryId} onChange={e => setSubcategoryId(e.target.value)} className="w-full px-3 py-2 border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-purple-500/20 focus:border-purple-500 transition-colors bg-white" - required > - + {subcategories.map((s: any) => (