[object Object]

← back to Rentv

pr-intelligence dashboard: KPI cards now drill to filtered lists (href rule) — stale→people?status=stale, no-PR→orgs?no_pr_contact=1, drafts→review, replies→inbox, followups→tasks, coverage/AZ→orgs?state=

b34da7ac3c3d7eb8f7b248a109dd622ded170d03 · 2026-08-05 14:09:09 -0700 · Steve Abrams

Files touched

Diff

commit b34da7ac3c3d7eb8f7b248a109dd622ded170d03
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 5 14:09:09 2026 -0700

    pr-intelligence dashboard: KPI cards now drill to filtered lists (href rule) — stale→people?status=stale, no-PR→orgs?no_pr_contact=1, drafts→review, replies→inbox, followups→tasks, coverage/AZ→orgs?state=
---
 public/admin/pr-intelligence/index.html | 28 ++++++++++++++++++----------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/public/admin/pr-intelligence/index.html b/public/admin/pr-intelligence/index.html
index 4c494ffe..a8d5cf09 100644
--- a/public/admin/pr-intelligence/index.html
+++ b/public/admin/pr-intelligence/index.html
@@ -21,16 +21,16 @@
   const gate = d.california.gate || {};
   c.innerHTML = `
     <div class="kpis">
-      <div class="kpi"><b>${d.california.completion_pct}%</b><span>CA coverage (metro×category cells: ${d.california.cells_covered}/${d.california.cells_total})</span></div>
-      <div class="kpi ${d.arizona.unlocked ? 'ok' : 'warn'}"><b>${d.arizona.unlocked ? 'ACTIVE' : '🔒 LOCKED'}</b><span>Arizona phase (${d.arizona.organizations} orgs)</span></div>
-      <div class="kpi"><b>${d.organizations.total.toLocaleString()}</b><span>Organizations (${d.organizations.verified} verified · ${d.organizations.unreviewed} unreviewed)</span></div>
-      <div class="kpi"><b>${d.people.total.toLocaleString()}</b><span>People (${d.people.verified} verified · ${d.people.unverified} unverified)</span></div>
-      <div class="kpi ${d.people.stale ? 'warn' : ''}"><b>${d.people.stale}</b><span>Stale contacts</span></div>
-      <div class="kpi"><b>${d.orgs_without_pr_contact}</b><span>Orgs without a PR contact</span></div>
-      <div class="kpi ${d.drafts_awaiting_review ? 'warn' : ''}"><b>${d.drafts_awaiting_review}</b><span>Drafts awaiting review</span></div>
-      <div class="kpi ${d.replies_requiring_action ? 'bad' : ''}"><b>${d.replies_requiring_action}</b><span>Replies requiring action</span></div>
-      <div class="kpi ${d.followups_due ? 'warn' : ''}"><b>${d.followups_due}</b><span>Follow-ups due</span></div>
-      <div class="kpi"><b>${d.organizations.new7 + d.people.new7}</b><span>New discoveries (7d)</span></div>
+      ${kcard('', d.california.completion_pct + '%', `CA coverage (metro×category cells: ${d.california.cells_covered}/${d.california.cells_total})`, '/admin/pr-intelligence/organizations?state=CA')}
+      ${kcard(d.arizona.unlocked ? 'ok' : 'warn', d.arizona.unlocked ? 'ACTIVE' : '🔒 LOCKED', `Arizona phase (${d.arizona.organizations} orgs)`, '/admin/pr-intelligence/organizations?state=AZ')}
+      ${kcard('', d.organizations.total.toLocaleString(), `Organizations (${d.organizations.verified} verified · ${d.organizations.unreviewed} unreviewed)`, '/admin/pr-intelligence/organizations')}
+      ${kcard('', d.people.total.toLocaleString(), `People (${d.people.verified} verified · ${d.people.unverified} unverified)`, '/admin/pr-intelligence/people')}
+      ${kcard(d.people.stale ? 'warn' : '', d.people.stale, 'Stale contacts', '/admin/pr-intelligence/people?status=stale')}
+      ${kcard('', d.orgs_without_pr_contact, 'Orgs without a PR contact', '/admin/pr-intelligence/organizations?no_pr_contact=1')}
+      ${kcard(d.drafts_awaiting_review ? 'warn' : '', d.drafts_awaiting_review, 'Drafts awaiting review', '/admin/pr-intelligence/review')}
+      ${kcard(d.replies_requiring_action ? 'bad' : '', d.replies_requiring_action, 'Replies requiring action', '/admin/pr-intelligence/inbox')}
+      ${kcard(d.followups_due ? 'warn' : '', d.followups_due, 'Follow-ups due', '/admin/pr-intelligence/tasks')}
+      ${kcard('', d.organizations.new7 + d.people.new7, 'New discoveries (7d)', '/admin/pr-intelligence/organizations')}
     </div>
 
     <div class="cols3">
@@ -72,6 +72,14 @@
       : '<div class="empty">No coverage report yet — queue <code>generate-coverage-report</code> from Runs & Jobs.</div>'}
     </div>`;
 
+  // KPI card — a link when a drill target is given (every data point hrefs deeper); .kpi styles
+  // the anchor as the card + grid item so layout is unchanged.
+  function kcard(cls, val, label, href) {
+    const inner = `<b>${val}</b><span>${label}</span>`;
+    return href
+      ? `<a class="kpi ${cls}" href="${href}" style="text-decoration:none" title="Open ${PR.esc(label)}">${inner}</a>`
+      : `<div class="kpi ${cls}">${inner}</div>`;
+  }
   function bar(label, n, max, href) {
     const row = `<div style="display:flex;align-items:center;gap:8px;padding:2px 0;font-size:12.5px">
       <span style="width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${PR.esc(label)}</span>

← 25e5df28 PR intel: OpenClaw masthead extractor + per-person phone/ema  ·  back to Rentv  ·  fix: KPI card links inherit text color (was rendering number ba1e3bf2 →