← back to Mfr Review Viewer Corruption
viewer: per-chip red 'Remove suggested (N)' button — one-click mark the auto-suggested broken masters for deletion
377ff9b67c9bafe9c2476f4d2165932cfa36a090 · 2026-08-27 09:08:01 -0700 · Steve Abrams
Files touched
Diff
commit 377ff9b67c9bafe9c2476f4d2165932cfa36a090
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Aug 27 09:08:01 2026 -0700
viewer: per-chip red 'Remove suggested (N)' button — one-click mark the auto-suggested broken masters for deletion
---
public/index.html | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/public/index.html b/public/index.html
index 0666bb9..9532985 100644
--- a/public/index.html
+++ b/public/index.html
@@ -109,6 +109,9 @@
background:#2a1417; color:#fca5a5; border:1px solid var(--red); white-space:nowrap; }
.keep-del-btn:hover { background:#3a1a1f; }
.keep-del-btn:disabled { opacity:.4; cursor:not-allowed; }
+ .remove-sug-btn { font-size:10px; padding:2px 8px; border-radius:6px; cursor:pointer; font-weight:700;
+ background:#3a1a1f; color:#ff9aa6; border:1px solid #6b2b33; margin-right:6px; }
+ .remove-sug-btn:hover { background:#5a2028; }
.cand-row .del-wrap { display:flex; align-items:center; gap:3px; margin-left:auto; }
.cand-row .del-chk { transform:scale(1.05); cursor:pointer; accent-color:var(--red); }
.cand-row .del-lbl { font-size:9px; color:var(--red); text-transform:uppercase; letter-spacing:.03em; }
@@ -428,6 +431,10 @@ function renderCandidates(sku, panel){
const otherCount = fm.filter(c=>String(c.recordId)!==String(keepRid)).length;
h += `<div class="cand-group">`;
h += `<div class="cand-group-head"><h4>FmPro records (${fm.length})</h4>`;
+ const sugRids = fm.filter(c=>c.deleteSuggested).map(c=>String(c.recordId));
+ if(sugRids.length){
+ h += `<button class="remove-sug-btn" data-removesug="${esc(sku)}" title="One-click: mark the ${sugRids.length} auto-suggested broken no-sample master(s) for deletion — keeps every real sample record">🗑 Remove suggested (${sugRids.length})</button>`;
+ }
if(fm.length>1){
h += `<button class="keep-del-btn" data-keepdel="${esc(sku)}" ${keepRid?'':'disabled'} title="Mark every OTHER FmPro record of this SKU for deletion (keeps the one you chose)">🗑 Keep selected · delete the other ${otherCount}</button>`;
}
@@ -563,6 +570,23 @@ function renderCandidates(sku, panel){
updateSel();
};
}
+
+ // wire the red "Remove suggested (N)" button — one-click marks the auto-suggested
+ // broken no-sample masters for deletion (keeps every real sample record).
+ const rsBtn = panel.querySelector('.remove-sug-btn');
+ if(rsBtn){
+ rsBtn.onclick = (ev)=>{
+ ev.preventDefault();
+ const sug = (state.cand[sku]?.suggestion?.deleteRids)||[];
+ if(!state.delRids[sku]) state.delRids[sku] = new Set();
+ for(const rid of sug) state.delRids[sku].add(String(rid));
+ // ensure a keep is set (the suggested keeper) so staging isn't blocked
+ const kr = state.cand[sku]?.suggestion?.keepRid;
+ if(!state.keepRid[sku] && kr) state.keepRid[sku]=String(kr);
+ renderCandidates(sku, panel);
+ updateSel();
+ };
+ }
}
// Per-SKU running "N to delete, 1 to keep" summary line.
← 8c74f84 viewer: auto-apply keep/delete rule (delete broken no-sample
·
back to Mfr Review Viewer Corruption
·
mfr-master-sweep: gated executor (dry-run default, snapshot- 23d36ff →