// 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 ? (
) : (
| Voce |
Categoria |
Valore |
Coperta da cassette |
|
{filtered.map(it => {
const inCass = cassetteByItem[it.id] || [];
return openItemDetail(it)}>
|
|
{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))}/>
{!isNew ? (
confirmDel ? (
Eliminare questa voce?
) : (
)
) :
}
>;
};
Object.assign(window, { InventoryPage, ItemDetailDrawer, ItemEditor });