// Archive page: archived tasks scoped by role (server-side), with search. import { api } from '/static/js/api.js'; const host = document.getElementById('archive-list'); const errorBox = document.getElementById('error'); const search = document.getElementById('archive-search'); let names = {}; const esc = (s) => String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', }[c])); function render(tasks) { host.replaceChildren(...tasks.map((t) => { const card = document.createElement('div'); card.className = 'card'; const when = t.updatedAt ? new Date(t.updatedAt).toLocaleString() : ''; card.innerHTML = `
${esc((t.description || '').slice(0, 200))}
archived${when ? ' · ' + esc(when) : ''}
`; return card; })); if (!tasks.length) { host.innerHTML = 'No archived tasks match.
'; } } let timer = null; async function load() { try { const q = search.value.trim(); const res = await api('GET', '/api/v1/archive' + (q ? '?q=' + encodeURIComponent(q) : '')); names = res.customerNames || {}; render(res.tasks || []); } catch (e) { errorBox.textContent = e.message; } } search.addEventListener('input', () => { clearTimeout(timer); timer = setTimeout(load, 250); }); load();