// WealthIntelligence — Trustworthy People page + PersonDetailDrawer const TrustworthyPage = ({state, t, openPersonDetail, openPersonEditor}) => { return
openPersonEditor()}>{t.trustworthy.add}} />
{state.people.map(p => { const cassette = state.cassette.filter(c => c.assignees.includes(p.id)); const permanent = cassette.filter(c => c.trigger==='permanent'); const temporary = cassette.filter(c => c.trigger==='temporary'); return
openPersonDetail(p)}>

{p.name}

{p.rel}
{p.invited ? t.trustworthy.invited : t.trustworthy.not_invited}
{cassette.length}
{cassette.length===1 ? t.trustworthy.cassetta_assigned_one : t.trustworthy.cassette_assigned}

{permanent.length} {t.trustworthy.permanent_count}
{temporary.length} {t.trustworthy.temporary_count}
{cassette.length > 0 && (
{cassette.map(c => ( {c.icon} {c.name} ))}
)}
{p.phone} · {p.email}
; })}
; }; // ------- Person detail drawer ------- const PersonDetailDrawer = ({person, state, t, onClose, onOpenCassetta, onEdit}) => { const cassette = state.cassette.filter(c => c.assignees.includes(person.id)); const permanent = cassette.filter(c => c.trigger==='permanent'); const temporary = cassette.filter(c => c.trigger==='temporary'); // Items covered = union of items in all assigned cassette const itemSet = new Set(); cassette.forEach(c => c.itemIds.forEach(iid => itemSet.add(iid))); const items = [...itemSet].map(iid => state.inventory.find(it=>it.id===iid)).filter(Boolean); const totalEur = items.reduce((s, it) => s + (it.valueEur || 0), 0); const renderCassetteGroup = (list) => (
{list.map(c => ( ))}
); return <>

{person.name}

{person.rel}
{person.invited ? t.trustworthy.invited : t.trustworthy.not_invited}
{/* Contact */}
{t.trustworthy.detail.contact}
{person.email}
{person.phone}
{/* Cassette assigned */}
{t.trustworthy.detail.cassette}
{cassette.length}
{cassette.length === 0 ? (

{t.trustworthy.detail.no_cassette}

) : (
{permanent.length > 0 && (
{t.vault.triggers.permanent}
{renderCassetteGroup(permanent)}
)} {temporary.length > 0 && (
{t.vault.triggers.temporary}
{renderCassetteGroup(temporary)}
)}
)}
{/* Items covered */}
{t.trustworthy.detail.items_covered}
{totalEur > 0 && {fmtEur(totalEur)}}
{t.trustworthy.detail.items_covered_help}
{items.length === 0 ? (

{t.trustworthy.detail.no_items_covered}

) : (
{items.map((it, i) => (
{it.name}
{t.inventory.cat[it.category] || it.category}
{typeof it.valueEur === 'number' && ( {fmtEur(it.valueEur)} )}
))}
)}
{!person.invited ? ( ) : }
; }; // ------- Person editor (drawer) ------- const PersonEditor = ({person, isNew, t, onClose, onSave, onDelete}) => { const computeInitials = (name) => (name||'').split(/\s+/).filter(Boolean).map(w => w[0]).join('').slice(0,2).toUpperCase(); const [draft, setDraft] = useState(() => person || { id:null, name:'', rel:'', phone:'', email:'', invited:false, color: window.WI.PEOPLE_COLORS[0], initials:'', }); const [confirmDel, setConfirmDel] = useState(false); const set = (k, v) => setDraft(d => { const next = {...d, [k]:v}; if (k === 'name') next.initials = computeInitials(v); return next; }); const valid = draft.name.trim().length > 0; return <>
{/* Live preview monogram */}
{draft.name || 'Nome cognome'}
{draft.rel || 'relazione'}
set('name', e.target.value)}/> set('rel', e.target.value)}/>
set('email', e.target.value)}/> set('phone', e.target.value)}/>
{window.WI.PEOPLE_COLORS.map(co => (
{!isNew ? ( confirmDel ? (
Eliminare questa persona?
) : ( ) ) : }
; }; Object.assign(window, { TrustworthyPage, PersonDetailDrawer, PersonEditor });