import { useEffect, useState } from 'react'; import { SearchableSelect } from '../../components/SearchableSelect'; import { Alert, LoadingBlock, errorMessage } from '../../components/Feedback'; import { Icon } from '../../components/Icon'; import { getInventoryTechnicalValues, replaceInventoryTechnicalValues } from '../../lib/inventoryStructureApi'; import type { InventoryFamilyAttribute, InventoryTechnicalValues } from '../../lib/inventoryStructureApi'; function localDateTime(value:unknown){ if(typeof value!=='string'||!value)return ''; const date=new Date(value); if(Number.isNaN(date.getTime()))return value.slice(0,16); const local=new Date(date.getTime()-date.getTimezoneOffset()*60000); return local.toISOString().slice(0,16); } function displayValue(definition:InventoryFamilyAttribute,value:unknown){ if(value===undefined||value===null||value==='')return 'Sin completar'; if(definition.dataType==='BOOLEAN')return value?'Sí':'No'; if(definition.dataType==='DATETIME'&&typeof value==='string')return new Date(value).toLocaleString('es-AR'); return `${String(value)}${definition.unit?` ${definition.unit}`:''}`; } export function AssetTechnicalDataPanel({assetId,canEdit}:{assetId:string;canEdit:boolean}){ const [data,setData]=useState(null); const [values,setValues]=useState>({}); const [loading,setLoading]=useState(true); const [saving,setSaving]=useState(false); const [unsupported,setUnsupported]=useState(false); const [error,setError]=useState(''); const [success,setSuccess]=useState(''); useEffect(()=>{ let active=true; setLoading(true); setUnsupported(false); setError(''); getInventoryTechnicalValues(assetId).then((loaded)=>{if(!active)return;setData(loaded);setValues(Object.fromEntries(loaded.definitions.map((definition)=>{ const raw=loaded.values[definition.id]; return [definition.id,definition.dataType==='DATETIME'?localDateTime(raw):raw??'']; })))}).catch((requestError)=>{if(!active)return;const message=errorMessage(requestError);if(message.includes('no tiene clasificación técnica'))setUnsupported(true);else setError(message);}).finally(()=>active&&setLoading(false)); return()=>{active=false}; },[assetId]); if(loading)return
; if(unsupported)return null; if(error&&!data)return
{error}
; if(!data)return null; const activeDefinitions=data.definitions.filter((item)=>item.isActive); const save=async()=>{ setSaving(true);setError('');setSuccess(''); try{ const normalized:Record={}; for(const definition of activeDefinitions){const raw=values[definition.id];if(raw===''||raw===null||raw===undefined)continue; if(definition.dataType==='NUMBER')normalized[definition.id]=Number(raw); else if(definition.dataType==='BOOLEAN')normalized[definition.id]=Boolean(raw); else if(definition.dataType==='DATETIME')normalized[definition.id]=new Date(String(raw)).toISOString(); else normalized[definition.id]=raw; } const saved=await replaceInventoryTechnicalValues(assetId,normalized);setData(saved);setSuccess('Datos técnicos guardados.'); }catch(requestError){setError(errorMessage(requestError));}finally{setSaving(false)} }; return

Información técnica · {data.family.name}

Estos campos pertenecen a la clasificación concreta del elemento, no al nivel genérico.

{error&&{error}}{success&&{success}} {activeDefinitions.length===0?
Esta clasificación todavía no tiene campos técnicos configurados.
:canEdit?
{activeDefinitions.map((definition)=>{ const value=values[definition.id];const label={definition.name}{definition.unit?` (${definition.unit})`:''}{definition.isRequired?obligatorio:opcional}; if(definition.dataType==='BOOLEAN')return ; if(definition.dataType==='SELECT')return ; const inputType=definition.dataType==='NUMBER'?'number':definition.dataType==='DATE'?'date':definition.dataType==='DATETIME'?'datetime-local':'text'; return ; })}
:
{activeDefinitions.map((definition)=>
{definition.name}{definition.code}{displayValue(definition,data.values[definition.id])}
)}
} {canEdit&&activeDefinitions.length>0&&
}
; }