← back to Rentv 2026

public/admin/pr-intelligence/tasks.html

47 lines

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>CRE PR Intelligence — Tasks</title>
<link rel="stylesheet" href="/admin/pr-intelligence/pr-shared.css">
</head>
<body>
<script src="/admin/pr-intelligence/pr-shared.js"></script>
<script>
(async function () {
  const c = PR.frame('tasks', 'Tasks', 'Follow-ups, verification chores, and referral actions. Each card shows its created date + time.');
  c.innerHTML = `
    <div class="filters">
      <select id="t-status"><option value="open">Open</option><option value="done">Done</option><option value="dismissed">Dismissed</option><option value="all">All</option></select>
      <button class="btn" id="t-add">+ Add task</button>
    </div>
    <div id="t-list"><span class="spin"></span></div>`;

  async function load() {
    const rows = (await PR.api('/tasks?status=' + document.getElementById('t-status').value)).rows;
    document.getElementById('t-list').innerHTML = rows.length ? rows.map((t) => `
      <div class="panel" style="padding:12px 16px;display:flex;gap:12px;align-items:center">
        <div style="flex:1"><b>${PR.esc(t.title)}</b>
          ${t.entity_name ? ` · <a href="/admin/pr-intelligence/${t.entity_type === 'person' ? 'people' : 'organizations'}?id=${t.entity_id}">${PR.esc(t.entity_name)}</a>` : ''}
          ${t.detail ? `<div style="color:var(--muted);font-size:12.5px">${PR.esc(t.detail)}</div>` : ''}
          <div style="color:var(--muted);font-size:11.5px" title="${PR.esc(t.created_at)}">🕓 created ${PR.date(t.created_at)}${t.due_at ? ' · due ' + PR.date(t.due_at) : ''}${t.created_by ? ' · by ' + PR.esc(t.created_by) : ''}</div></div>
        ${PR.statusBadge(t.status === 'open' ? (t.due_at && new Date(t.due_at) < new Date() ? 'follow_up_due' : 'queued') : t.status === 'done' ? 'completed' : 'cancelled')}
        ${t.status === 'open' ? `<button class="btn sm primary" data-done="${t.id}">✓ Done</button><button class="btn sm" data-dismiss="${t.id}">Dismiss</button>` : ''}
      </div>`).join('') : '<div class="empty">No tasks</div>';
    document.querySelectorAll('[data-done]').forEach((b) => b.addEventListener('click', () =>
      PR.guard(() => PR.api('/tasks/' + b.dataset.done, { method: 'PUT', body: { status: 'done' } }), 'Done').then(load)));
    document.querySelectorAll('[data-dismiss]').forEach((b) => b.addEventListener('click', () =>
      PR.guard(() => PR.api('/tasks/' + b.dataset.dismiss, { method: 'PUT', body: { status: 'dismissed' } }), 'Dismissed').then(load)));
  }
  document.getElementById('t-status').addEventListener('change', load);
  document.getElementById('t-add').addEventListener('click', async () => {
    const title = prompt('Task:'); if (!title) return;
    await PR.guard(() => PR.api('/tasks', { method: 'POST', body: { title } }), 'Added');
    load();
  });
  load();
})();
</script>
</body>
</html>