[object Object]

← back to Marketing Command Center

clients panel: one-click 'Copy not-actioned emails' (respects search+filters, skips already-actioned)

5e38c367d616df9c487aa34e8ffd865fe56fa798 · 2026-07-16 17:43:40 -0700 · steve

Files touched

Diff

commit 5e38c367d616df9c487aa34e8ffd865fe56fa798
Author: steve <steve@designerwallcoverings.com>
Date:   Thu Jul 16 17:43:40 2026 -0700

    clients panel: one-click 'Copy not-actioned emails' (respects search+filters, skips already-actioned)
---
 public/panels/clients.html |  1 +
 public/panels/clients.js   | 14 +++++++++++---
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/public/panels/clients.html b/public/panels/clients.html
index 0802c1d..6143920 100644
--- a/public/panels/clients.html
+++ b/public/panels/clients.html
@@ -61,6 +61,7 @@
       <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>
+      <button class="btn ghost" id="cl-copyunacted" style="font-size:10.5px;padding:4px 9px;">⧉ Not-actioned</button>
       <button class="btn ghost" id="cl-density" style="font-size:10.5px;padding:4px 9px;">Compact</button>
     </div>
     <div class="muted" id="cl-groupnote" style="font-size:11.5px;margin-top:8px;"></div>
diff --git a/public/panels/clients.js b/public/panels/clients.js
index 182cf99..c6a2df1 100644
--- a/public/panels/clients.js
+++ b/public/panels/clients.js
@@ -112,6 +112,7 @@ window.MCC_PANELS['clients'] = {
       });
       $('#cl-copymsg').textContent = '';
       $('#cl-copyemails').onclick = copyEmails;
+      $('#cl-copyunacted').onclick = copyUnactioned;
       $('#cl-density').onclick = toggleDensity;
       applyDensity();
       $('#cl-reset').onclick = () => { if (confirm('Clear contacted checks for ' + d.label + '?')) { save(d.id, new Set()); render(); } };
@@ -152,12 +153,19 @@ window.MCC_PANELS['clients'] = {
       return sortRecs(list);
     }
 
-    async function copyEmails() {
-      const emails = Array.from(new Set(currentMatches().map(r => r.email).filter(Boolean)));
+    async function copyList(emails, label) {
       if (!emails.length) { $('#cl-copymsg').textContent = 'no emails in view'; return; }
-      try { await navigator.clipboard.writeText(emails.join(', ')); $('#cl-copymsg').textContent = `copied ${emails.length.toLocaleString()} emails`; }
+      try { await navigator.clipboard.writeText(emails.join(', ')); $('#cl-copymsg').textContent = `copied ${emails.length.toLocaleString()} ${label}`; }
       catch { $('#cl-copymsg').textContent = 'copy blocked — export CSV instead'; }
     }
+    function copyEmails() { copyList(Array.from(new Set(currentMatches().map(r => r.email).filter(Boolean))), 'emails'); }
+    function copyUnactioned() {
+      const A = acts(current.id);
+      const emails = Array.from(new Set(currentMatches()
+        .filter(r => { const a = A[r.id]; return !(a && (a.in || a.ig)); })
+        .map(r => r.email).filter(Boolean)));
+      copyList(emails, 'not-actioned emails');
+    }
     function applyDensity() {
       const compact = (() => { try { return localStorage.getItem(DK) === 'compact'; } catch { return false; } })();
       $('#cl-list').classList.toggle('cl-compact', compact);

← 05fccc4 clients panel: 'not actioned' filter + LinkedIn/Instagram ac  ·  back to Marketing Command Center  ·  composer: new central board — combine asset/banner + copy → 8b2fd01 →