// WealthIntelligence — Inventory page (unified list) + ItemDetailDrawer const InventoryPage = ({state, t, setRoute, openItemDetail, openItemEditor}) => { const [cat, setCat] = useState('all'); const [coverage, setCoverage] = useState('all'); // all | in | out const [q, setQ] = useState(''); const cassetteByItem = useMemo(() => { const map = {}; state.cassette.forEach(c => c.itemIds.forEach(iid => { (map[iid] = map[iid] || []).push(c); })); return map; }, [state.cassette]); const filtered = state.inventory.filter(it => { if (cat !== 'all' && it.category !== cat) return false; const inAny = (cassetteByItem[it.id] || []).length > 0; if (coverage === 'in' && !inAny) return false; if (coverage === 'out' && inAny) return false; if (q) { const s = q.toLowerCase(); const hay = `${it.name||''} ${it.value||''} ${it.note||''}`.toLowerCase(); if (!hay.includes(s)) return false; } return true; }); const counts = { all: state.inventory.length, in: state.inventory.filter(it => (cassetteByItem[it.id]||[]).length > 0).length, out: state.inventory.filter(it => (cassetteByItem[it.id]||[]).length === 0).length, }; return
openItemEditor()}>{t.inventory.add}} /> {/* Coverage filter chips */}
{/* Sidebar filters */}
{t.inventory.categories}
{window.WI.CATEGORIES.map(k => { const n = state.inventory.filter(it => it.category===k).length; if (!n) return null; return ; })}
{/* Main list */}
setQ(e.target.value)}/>
{filtered.length === 0 ? (

{t.inventory.empty}

) : (
{filtered.map(it => { const inCass = cassetteByItem[it.id] || []; return openItemDetail(it)}> ; })}
Voce Categoria Valore Coperta da cassette
{it.name}
{it.value}
{t.inventory.cat[it.category]||it.category} {typeof it.valueEur === 'number' ? {fmtEur(it.valueEur)} : } {inCass.length === 0 ? ( {t.inventory.not_yet} ) : (
{inCass.slice(0,3).map(c => ( {c.icon} {c.name} ))} {inCass.length > 3 && +{inCass.length - 3}}
)}
)}
; }; function filterBtn(active){ return { display:'flex', alignItems:'center', gap:10, padding:'8px 10px', borderRadius:8, border:0, background: active?'var(--paper-2)':'transparent', cursor:'pointer', fontFamily:'inherit', fontSize:13, color:'var(--ink)', textAlign:'left', }; } // ------- Item detail drawer ------- const ItemDetailDrawer = ({item, state, t, onClose, onOpenCassetta, onEdit}) => { const cassette = state.cassette.filter(c => c.itemIds.includes(item.id)); const peopleSet = new Set(); cassette.forEach(c => c.assignees.forEach(pid => peopleSet.add(pid))); const accessible = [...peopleSet].map(pid => state.people.find(p=>p.id===pid)).filter(Boolean); return <>
{t.inventory.cat[item.category] || item.category}
{item.value || '—'}
{/* Estimated value */}
{t.inventory.detail.value_eur}
{typeof item.valueEur === 'number' ? (
{fmtEur(item.valueEur)}
) : (
{t.inventory.detail.no_value_eur}
)}
{/* Note */}
{t.inventory.detail.note}

{item.note || t.inventory.detail.no_note}

{/* In cassette */}
{t.inventory.detail.in_cassette}
{cassette.length === 0 ? (

{t.inventory.detail.not_in_any}

) : (
{cassette.map(c => ( ))}
)}
{/* Accessible to */}
{t.inventory.detail.accessible_to}
{t.inventory.detail.accessible_to_help}
{accessible.length === 0 ? (

{t.inventory.detail.accessible_nobody}

) : (
{accessible.map(p => ( {p.name} ))}
)}
; }; // ------- Item editor (drawer) ------- const ItemEditor = ({item, isNew, t, onClose, onSave, onDelete}) => { const [draft, setDraft] = useState(() => item || { id:null, name:'', category:'altri', icon:'◇', color:'#27666D', value:'', valueEur:null, note:'', }); const [confirmDel, setConfirmDel] = useState(false); const valid = draft.name.trim().length > 0; const set = (k, v) => setDraft(d => ({...d, [k]:v})); return <>
set('name', e.target.value)}/>
{window.WI.ICON_OPTIONS.map(ic => ( ))}
{window.WI.COLOR_OPTIONS.map(co => (
set('value', e.target.value)}/> set('valueEur', e.target.value === '' ? null : Number(e.target.value))}/>