[object Object]

← back to Marketing Command Center

clients panel: 'not actioned' filter + LinkedIn/Instagram actioned timestamp columns in CSV export

05fccc41cb5bc1e1da256c3a7fa45bc71396d96b · 2026-07-16 17:39:37 -0700 · steve

Files touched

Diff

commit 05fccc41cb5bc1e1da256c3a7fa45bc71396d96b
Author: steve <steve@designerwallcoverings.com>
Date:   Thu Jul 16 17:39:37 2026 -0700

    clients panel: 'not actioned' filter + LinkedIn/Instagram actioned timestamp columns in CSV export
---
 public/panels/clients.html |  1 +
 public/panels/clients.js   | 15 ++++++++++-----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/public/panels/clients.html b/public/panels/clients.html
index da7b2e9..0802c1d 100644
--- a/public/panels/clients.html
+++ b/public/panels/clients.html
@@ -57,6 +57,7 @@
       <button class="btn ghost" data-filter="instagram" style="font-size:10.5px;padding:4px 9px;">IG</button>
       <button class="btn ghost" data-filter="linkedin" style="font-size:10.5px;padding:4px 9px;">LinkedIn</button>
       <button class="btn ghost" data-filter="uncontacted" style="font-size:10.5px;padding:4px 9px;">○ uncontacted</button>
+      <button class="btn ghost" data-filter="unactioned" style="font-size:10.5px;padding:4px 9px;">⏱ not actioned</button>
       <span style="flex:1;"></span>
       <span class="muted" id="cl-copymsg" style="font-size:10.5px;"></span>
       <button class="btn ghost" id="cl-copyemails" style="font-size:10.5px;padding:4px 9px;">⧉ Copy emails</button>
diff --git a/public/panels/clients.js b/public/panels/clients.js
index 55a14af..182cf99 100644
--- a/public/panels/clients.js
+++ b/public/panels/clients.js
@@ -141,11 +141,13 @@ window.MCC_PANELS['clients'] = {
       let list = q ? RECS.filter(r => r._all.includes(q)) : RECS;
       if (FILTERS.size) {
         const set = FILTERS.has('uncontacted') ? done(current.id) : null;
+        const A = FILTERS.has('unactioned') ? acts(current.id) : null;
         list = list.filter(r =>
           (!FILTERS.has('email') || r.email) &&
           (!FILTERS.has('instagram') || r._raw.instagram) &&
           (!FILTERS.has('linkedin') || r._raw.linkedin) &&
-          (!FILTERS.has('uncontacted') || !set.has(r.id)));
+          (!FILTERS.has('uncontacted') || !set.has(r.id)) &&
+          (!FILTERS.has('unactioned') || !(A[r.id] && (A[r.id].in || A[r.id].ig))));
       }
       return sortRecs(list);
     }
@@ -172,14 +174,17 @@ window.MCC_PANELS['clients'] = {
     // this does NOT send anything to Constant Contact.
     function exportCSV(d) {
       const rows = currentMatches();
+      const A = acts(d.id);
+      const actedIn = r => { const a = A[r.id]; return a && a.in ? fmtWhen(a.in) : ''; };
+      const actedIg = r => { const a = A[r.id]; return a && a.ig ? fmtWhen(a.ig) : ''; };
       const cell = v => { v = String(v == null ? '' : v); return /[",\n]/.test(v) ? '"' + v.replace(/"/g, '""') + '"' : v; };
       let headers, line;
       if (d.kind === 'prospects') {
-        headers = ['Business', 'City', 'Phone', 'Website', 'Email', 'LinkedIn', 'Instagram'];
-        line = r => [r._raw.title, r._raw.city, r._raw.phone, r._raw.website, r._raw.email, r._raw.linkedin || liURL(r.q), r._raw.instagram || igURL(r.q)];
+        headers = ['Business', 'City', 'Phone', 'Website', 'Email', 'LinkedIn', 'Instagram', 'LinkedIn actioned', 'Instagram actioned'];
+        line = r => [r._raw.title, r._raw.city, r._raw.phone, r._raw.website, r._raw.email, r._raw.linkedin || liURL(r.q), r._raw.instagram || igURL(r.q), actedIn(r), actedIg(r)];
       } else {
-        headers = ['Account', 'Company', 'Name', 'City', 'State', 'Email', 'Phone', 'LinkedIn Search', 'Instagram Search'];
-        line = r => [r._raw.account, r._raw.company, r._raw.name, r._raw.city, r._raw.state, r._raw.email, r._raw.phone, liURL(r.q), igURL(r.q)];
+        headers = ['Account', 'Company', 'Name', 'City', 'State', 'Email', 'Phone', 'LinkedIn Search', 'Instagram Search', 'LinkedIn actioned', 'Instagram actioned'];
+        line = r => [r._raw.account, r._raw.company, r._raw.name, r._raw.city, r._raw.state, r._raw.email, r._raw.phone, liURL(r.q), igURL(r.q), actedIn(r), actedIg(r)];
       }
       const csv = [headers.join(','), ...rows.map(r => line(r).map(cell).join(','))].join('\r\n');
       const blob = new Blob(['' + csv], { type: 'text/csv;charset=utf-8;' });

← 88eb92d clients panel: inline LinkedIn/Instagram Follow chips under  ·  back to Marketing Command Center  ·  clients panel: one-click 'Copy not-actioned emails' (respect 5e38c36 →