← 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
M public/panels/clients.htmlM public/panels/clients.js
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 →