import React,{useEffect,useMemo,useState}from'react'; const WorkshopOrderList=React.lazy(()=>import('./WorkshopOrderList.jsx')); import{WorkshopStockOperation}from'./workshop-stock-operation.js'; const params=value=>new URLSearchParams(Object.fromEntries(Object.entries(value).filter(([,v])=>v!==''&&v!==null))).toString(); export function EquipmentPicker({api,context,clientId,disabled}){ const[query,setQuery]=useState({search:'',page:1,per_page:25}),[search,setSearch]=useState(''),[data,setData]=useState(null),[selected,setSelected]=useState(''),[error,setError]=useState(''); useEffect(()=>{setSelected('');setData(null);},[clientId,context.token]);useEffect(()=>{if(!clientId)return;let active=true;setError('');api('/api/workshop-equipment?'+params({...query,client_id:clientId})).then(r=>{if(active)setData(r.records);}).catch(e=>{if(active)setError(e.message);});return()=>{active=false;};},[clientId,context.token,query]); return
; } export default function WorkshopEquipmentWorkspace({api,context,can,navigate}){ const [selectedEquipment,setSelectedEquipment]=useState(null); const[query,setQuery]=useState({search:'',page:1,per_page:25}),[search,setSearch]=useState(''),[data,setData]=useState(null),[clients,setClients]=useState(null),[clientQuery,setClientQuery]=useState({search:'',page:1,per_page:25}),[clientSearch,setClientSearch]=useState(''),[form,setForm]=useState(null),[preview,setPreview]=useState(null),[busy,setBusy]=useState(false),[error,setError]=useState(''),[notice,setNotice]=useState('');const command=useMemo(()=>new WorkshopStockOperation(api),[context.token]),create=can('workshop.open',context.unit?.id),locked=busy||command.uncertain; const load=async()=>setData((await api('/api/workshop-equipment?'+params(query))).records); useEffect(()=>{let active=true;api('/api/workshop-equipment?'+params(query)).then(r=>{if(active)setData(r.records);}).catch(e=>{if(active)setError(e.message);});return()=>{active=false;};},[context.token,query]); useEffect(()=>{if(!create)return;let active=true;api('/api/workshop-equipment?'+params({view:'clients',...clientQuery})).then(r=>{if(active)setClients(r.records);}).catch(e=>{if(active)setError(e.message);});return()=>{active=false;};},[context.token,clientQuery,create]); const prepare=async e=>{e.preventDefault();setBusy(true);setError('');try{setPreview(await api('/api/workshop-equipment/preview','POST',{...form,client_id:Number(form.client_id)},undefined,crypto.randomUUID()));}catch(e){setError(e.message);}finally{setBusy(false);}}; const confirm=async retry=>{setBusy(true);setError('');try{const r=retry?await command.retry():await command.send('/api/workshop-equipment/confirm',{preview:preview.preview},crypto.randomUUID());setNotice(`Equipamento registado${r.replayed?' · recibo recuperado':''}. Pode ser escolhido numa nova ordem.`);setForm(null);setPreview(null);await load();}catch(e){setError(e.message);if(!command.uncertain)setPreview(null);}finally{setBusy(false);}}; if(selectedEquipment)returnCadastro individual por cliente, código, descrição/marca/modelo e série. Reutilize a identificação ao abrir outra ordem. As identificações existentes permanecem imutáveis.
{error&&{error}
}{notice&&{notice}
} {create&&}{navigate&&} {data&&<>| Código | Descrição | Série | Cliente | Ordens |
|---|---|---|---|---|
| {e.identifier} | {e.description} | {e.serial??'Não registada'} | {e.client_name} |
Sem equipamentos visíveis para esta pesquisa.
} Página {data.current_page}/{data.last_page} >} {form&&Registar {preview.impact.identifier} · {preview.impact.description} para {preview.impact.client}. Não abre ordem nem cria efeitos físicos/financeiros.