diff --git a/web-v2/src/features/inspections/FindingCatalogTypeApplicabilityPanel.tsx b/web-v2/src/features/inspections/FindingCatalogTypeApplicabilityPanel.tsx index 627dba4..f3e68d9 100644 --- a/web-v2/src/features/inspections/FindingCatalogTypeApplicabilityPanel.tsx +++ b/web-v2/src/features/inspections/FindingCatalogTypeApplicabilityPanel.tsx @@ -12,9 +12,14 @@ import { import type { InventoryFamily } from '../../lib/inventoryStructureApi'; const EMPTY_CATALOG: FindingAdminCatalog = { categories: [], items: [] }; - type ViewMode = 'ASSOCIATED' | 'ALL'; +function familyContext(family: InventoryFamily) { + if (family.level === 'INSTALLATION') return `Instalación · ${family.name}`; + const parents = family.parentFamilies.map((parent) => parent.name).join(', '); + return `Subinstalación · ${family.name}${parents ? ` · compatible con ${parents}` : ''}`; +} + export function FindingCatalogTypeApplicabilityPanel() { const [searchParams] = useSearchParams(); const requestedFamilyId = searchParams.get('familyId') ?? ''; @@ -37,137 +42,50 @@ export function FindingCatalogTypeApplicabilityPanel() { Promise.all([listInventoryFamiliesAdmin(), getFindingCatalogAdmin()]) .then(([loadedFamilies, loadedCatalog]) => { const activeFamilies = loadedFamilies.filter((family) => family.isActive !== false); - setFamilies(activeFamilies); - setCatalog(loadedCatalog); - setFamilyId(activeFamilies.some((family) => family.id === requestedFamilyId) - ? requestedFamilyId - : activeFamilies[0]?.id ?? ''); + setFamilies(activeFamilies); setCatalog(loadedCatalog); + setFamilyId(activeFamilies.some((family) => family.id === requestedFamilyId) ? requestedFamilyId : activeFamilies[0]?.id ?? ''); }) - .catch((requestError) => setError(errorMessage(requestError))) - .finally(() => setLoading(false)); + .catch((requestError) => setError(errorMessage(requestError))).finally(() => setLoading(false)); }, [requestedFamilyId]); useEffect(() => { const selected = families.find((family) => family.id === familyId); - setEnabled(new Set(selected?.findingItemIds ?? [])); - setViewMode('ASSOCIATED'); - setSearch(''); - setSuccess(''); - setError(''); + setEnabled(new Set(selected?.findingItemIds ?? [])); setViewMode('ASSOCIATED'); setSearch(''); setSuccess(''); setError(''); }, [familyId, families]); - const activeCategoryIds = useMemo(() => new Set( - catalog.categories.filter((category) => category.isActive).map((category) => category.id), - ), [catalog.categories]); - - const categoryName = useMemo(() => new Map( - catalog.categories.map((category) => [category.id, category.name]), - ), [catalog.categories]); - + const activeCategoryIds = useMemo(() => new Set(catalog.categories.filter((category) => category.isActive).map((category) => category.id)), [catalog.categories]); + const categoryName = useMemo(() => new Map(catalog.categories.map((category) => [category.id, category.name])), [catalog.categories]); const available = useMemo(() => { const needle = search.trim().toLocaleLowerCase('es-AR'); - return catalog.items.filter((item) => - item.isActive - && activeCategoryIds.has(item.categoryId) - && (!needle || [item.title, item.code, categoryName.get(item.categoryId) ?? ''] - .some((value) => value.toLocaleLowerCase('es-AR').includes(needle))), - ); + return catalog.items.filter((item) => item.isActive && activeCategoryIds.has(item.categoryId) + && (!needle || [item.title, item.code, categoryName.get(item.categoryId) ?? ''].some((value) => value.toLocaleLowerCase('es-AR').includes(needle)))); }, [catalog.items, search, activeCategoryIds, categoryName]); + const visible = useMemo(() => viewMode === 'ASSOCIATED' ? available.filter((item) => savedIds.has(item.id)) : available, [available, savedIds, viewMode]); - const visible = useMemo(() => viewMode === 'ASSOCIATED' - ? available.filter((item) => savedIds.has(item.id)) - : available, - [available, savedIds, viewMode]); - - const toggle = (id: string) => setEnabled((current) => { - const next = new Set(current); - if (next.has(id)) next.delete(id); else next.add(id); - return next; - }); - - const selectVisible = () => setEnabled((current) => { - const next = new Set(current); - visible.forEach((item) => next.add(item.id)); - return next; - }); - + const toggle = (id: string) => setEnabled((current) => { const next = new Set(current); if (next.has(id)) next.delete(id); else next.add(id); return next; }); + const selectVisible = () => setEnabled((current) => { const next = new Set(current); visible.forEach((item) => next.add(item.id)); return next; }); const save = async () => { if (!selectedFamily) return; setSaving(true); setError(''); setSuccess(''); try { - const saved = await replaceInventoryFamilyFindings(selectedFamily.id, { - itemIds: [...enabled], - reason, - }); - const itemIds = saved.items.map((item) => item.id); - setEnabled(new Set(itemIds)); - setFamilies((current) => current.map((family) => family.id === selectedFamily.id - ? { ...family, findingItemIds: itemIds, findingCount: itemIds.length } - : family)); - setViewMode('ASSOCIATED'); - setSuccess(`Hallazgos guardados para ${selectedFamily.name}.`); - } catch (requestError) { - setError(errorMessage(requestError)); - } finally { - setSaving(false); - } + const saved = await replaceInventoryFamilyFindings(selectedFamily.id, { itemIds: [...enabled], reason }); + const itemIds = saved.items.map((item) => item.id); setEnabled(new Set(itemIds)); + setFamilies((current) => current.map((family) => family.id === selectedFamily.id ? { ...family, findingItemIds: itemIds, findingCount: itemIds.length } : family)); + setViewMode('ASSOCIATED'); setSuccess(`Hallazgos guardados para ${selectedFamily.name}.`); + } catch (requestError) { setError(errorMessage(requestError)); } + finally { setSaving(false); } }; if (loading) return
Al elegir una clasificación se filtra inmediatamente a sus Hallazgos asociados. Para modificar la relación, abrí “Todos para vincular”.
-Al elegir una clasificación se muestran sólo sus Hallazgos asociados. “Todos para vincular” se usa exclusivamente para modificar la relación.
{selectedFamily.level === 'INSTALLATION' ? 'Instalación' : 'Subinstalación'}: {selectedFamily.parentFamilyName ? `${selectedFamily.parentFamilyName} → ` : ''}{selectedFamily.name}. Tiene {savedIds.size} Hallazgo{savedIds.size === 1 ? '' : 's'} asociado{savedIds.size === 1 ? '' : 's'}.
-{selectedFamily.name}: {selectedFamily.level === 'SUBINSTALLATION' && selectedFamily.parentFamilies.length ? `compatible con ${selectedFamily.parentFamilies.map((parent) => parent.name).join(', ')}. ` : ''}Tiene {savedIds.size} Hallazgo{savedIds.size === 1 ? '' : 's'} asociado{savedIds.size === 1 ? '' : 's'}.