// Archiv tab — folder-organized archive of all generated docs. // Sidebar: folder structure by kind. Main: file list. Right: preview. function DocsArchiv({ docs, setDocs, rentals, equipment, company, templates, go, initialDocId }) { const t = useTheme(); const toast = useToast(); const [folder, setFolder] = useState('alle'); const [query, setQuery] = useState(''); const [selId, setSelId] = useState(initialDocId || (docs[0] && docs[0].id)); const [confirmDel, setConfirmDel] = useState(null); useEffect(() => { if (initialDocId) setSelId(initialDocId); }, [initialDocId]); const folders = useMemo(() => { const groups = { vertrag: docs.filter((d) => d.kind === 'vertrag').length, rechnung: docs.filter((d) => d.kind === 'rechnung').length, protokoll: docs.filter((d) => d.kind === 'protokoll' || d.kind === 'rueckgabe').length, reservierung: docs.filter((d) => d.kind === 'reservierung' || d.kind === 'erinnerung' || d.kind === 'inserat').length, custom: docs.filter((d) => !['vertrag','rechnung','protokoll','rueckgabe','reservierung','erinnerung','inserat'].includes(d.kind)).length, }; return [ { id: 'alle', label: 'Alle Dokumente', count: docs.length, icon: icons.folder, color: t.text }, { id: 'vertrag', label: 'Mietverträge', count: groups.vertrag, icon: icons.fileText, color: '#007AFF' }, { id: 'rechnung', label: 'Rechnungen', count: groups.rechnung, icon: icons.invoice, color: '#34C759' }, { id: 'protokoll', label: 'Übergabeprotokolle', count: groups.protokoll, icon: icons.doc, color: '#AF52DE' }, { id: 'schnelltext', label: 'Schnelltexte', count: groups.reservierung,icon: icons.mail, color: '#5856D6' }, { id: 'custom', label: 'Sonstiges', count: groups.custom, icon: icons.folder, color: '#8E8E93' }, ]; }, [docs, t.text]); const folderMatch = (d) => { if (folder === 'alle') return true; if (folder === 'vertrag') return d.kind === 'vertrag'; if (folder === 'rechnung') return d.kind === 'rechnung'; if (folder === 'protokoll') return d.kind === 'protokoll' || d.kind === 'rueckgabe'; if (folder === 'schnelltext') return ['reservierung','erinnerung','inserat'].includes(d.kind); if (folder === 'custom') return !['vertrag','rechnung','protokoll','rueckgabe','reservierung','erinnerung','inserat'].includes(d.kind); return false; }; const list = useMemo(() => { const filtered = docs.filter(folderMatch).filter((d) => { if (!query) return true; const r = rentals.find((x) => x.id === d.rentalId); return (d.title + ' ' + (r ? r.tenantName : '')).toLowerCase().includes(query.toLowerCase()); }); return filtered.sort((a, b) => (b.createdISO || '').localeCompare(a.createdISO || '')); }, [docs, folder, query, rentals]); const sel = docs.find((d) => d.id === selId) || list[0]; const selRental = sel && rentals.find((r) => r.id === sel.rentalId); const selEq = selRental && equipment.find((e) => e.id === selRental.equipmentId); const del = (d) => { setDocs((prev) => prev.filter((x) => x.id !== d.id)); if (selId === d.id) setSelId(null); setConfirmDel(null); toast('Dokument entfernt'); }; const copyText = (d) => { if (!d.body) return; try { navigator.clipboard.writeText(d.body); toast('Text kopiert'); } catch (e) { toast('Kopieren fehlgeschlagen'); } }; // Format-of-file label const fileBadge = (d) => d.format === 'text' ? 'TXT' : 'PDF'; return (
{/* ── Folder sidebar ── */}
Ordner
{folders.map((f) => { const s = folder === f.id; return ( setFolder(f.id)} scale={0.99} hoverBg={s ? undefined : t.cardAlt}>
{f.label}
{f.count}
); })}
{/* ── File list ── */}
{list.length === 0 &&
Keine Dokumente.
} {list.map((d) => { const r = rentals.find((x) => x.id === d.rentalId); const km = docKindMeta(d.kind); const s = sel && sel.id === d.id; return ( setSelId(d.id)} scale={0.997} hoverBg={s ? undefined : t.card}>
{fileBadge(d)}
{d.title}
{r ? r.tenantName : '—'}{r ? ' · ' + fmtRange(r.start, r.end) : ''}
{d.createdISO ? fmtDateDE(d.createdISO) : ''}
); })}
{/* ── Preview ── */}
{sel ? (
{/* Header with actions */}
{docKindMeta(sel.kind).label}
{sel.title}
{selRental ? <>Für go('rentals', { rentalId: selRental.id })} scale={0.98} style={{ display: 'inline-block' }}>{selRental.tenantName} · {fmtRange(selRental.start, selRental.end)} : '— ohne Mietvorgang —'} {sel.createdISO ? ' · erstellt ' + fmtDateDE(sel.createdISO) : ''}
{sel.format === 'text' && } {sel.format === 'pdf' && } setConfirmDel(sel)} title="Löschen"/>
{/* Body */} {sel.format === 'text' && (() => { // Fall back to the quick-text template body if the doc has none yet. let body = sel.body; if (!body) { const tpl = (typeof QUICK_TEXT_TEMPLATES !== 'undefined' ? QUICK_TEXT_TEMPLATES : []).find((x) => x.id === sel.templateId) || (typeof QUICK_TEXT_TEMPLATES !== 'undefined' ? QUICK_TEXT_TEMPLATES : []).find((x) => x.kind === sel.kind); if (tpl) body = selRental ? fillQuickText(tpl.body, selRental, selEq, company) : tpl.body; } return (
{body || Kein Inhalt hinterlegt.}
); })()} {sel.format === 'pdf' && selRental && (() => { const tpl = templates.find((x) => x.id === sel.templateId) || templates.find((x) => x.kind === sel.kind) || templates[0]; if (!tpl) return
Keine Vorlage gefunden.
; return ; })()}
) : ( )}
del(confirmDel)} onClose={() => setConfirmDel(null)}/>
); } Object.assign(window, { DocsArchiv });