// panes/items.js — CRUD against /api/items. import { registerPane } from '../app.js'; import { jget, jpost, jdelete, escapeHtml } from '../lib/api.js'; import { ok, err } from '../lib/ui.js'; const TPL = `
Items
Backend-managed records (/api/items).

New item

List

loading…
`; async function load(host) { try { const j = await jget('/api/items'); const items = j.items || []; host.querySelector('#items-count').textContent = String(j.count ?? items.length); host.querySelector('#items-list').innerHTML = items.length ? items.map(it => `
#${it.id}
${escapeHtml(it.name)}
${escapeHtml(it.description || '')}
delete
`).join('') : '
no items
'; host.querySelectorAll('[data-del]').forEach(b => { b.addEventListener('click', async () => { try { await jdelete('/api/items/' + b.dataset.del); ok('deleted'); load(host); } catch (e) { err(e.message); } }); }); } catch (e) { host.querySelector('#items-list').innerHTML = `
${escapeHtml(e.message)}
`; } } registerPane('items', { label: 'Items', init(host) { host.innerHTML = TPL; host.querySelector('#items-refresh').addEventListener('click', () => load(host)); host.querySelector('#items-form').addEventListener('submit', async (e) => { e.preventDefault(); const name = host.querySelector('#items-name').value.trim(); const description = host.querySelector('#items-desc').value.trim(); if (!name) return; try { await jpost('/api/items', { name, description }); host.querySelector('#items-name').value = ''; host.querySelector('#items-desc').value = ''; ok('added'); load(host); } catch (e) { err(e.message); } }); load(host); }, refresh: load, });