// #139: saved pastes table. function toast(msg, kind) { let t = document.querySelector('.toast'); if (!t) { t = document.createElement('div'); t.className = 'toast'; document.body.appendChild(t); } t.textContent = msg; t.classList.remove('success', 'error'); if (kind === 'success') t.classList.add('success'); if (kind === 'error') t.classList.add('error'); t.classList.add('show'); clearTimeout(t._h); t._h = setTimeout(() => t.classList.remove('show'), 2000); } const t = PaletteTable.init({ endpoint: '/api/mine', perPage: 25, hasPager: true, rowHtml: it => `` + (it.title ? `${t.esc(it.title)}${it.is_can ? ' can' : ''}` : `${t.esc(it.id)}${it.is_can ? ' can' : ''}`) + `` + `${t.esc(it.language || 'text')}` + `${t.fmtSize(it.size)}${t.ago(it.created_at)}` + (it.custom_slug ? `/${t.esc(it.custom_slug)}` : `none`) + `${t.esc(it.id)}` + ``, emptyFiltered: 'No pastes from this browser match your search.', emptyAll: 'No pastes from this browser yet.', }); // delete buttons (viewer-scoped, enforced server-side #37) document.getElementById('rows').addEventListener('click', async e => { const del = e.target.closest('button.del'); if (!del) return; e.stopPropagation(); del.disabled = true; try { const res = await fetch('/api/pastes/' + del.dataset.id, { method: 'DELETE' }); if (res.ok) { toast('Deleted', 'success'); t.load(); } else { toast('Delete failed', 'error'); del.disabled = false; } } catch (err) { toast('Delete failed', 'error'); del.disabled = false; } }); t.load();