← back to New Import Viewer
NET NEW view: new MINUS already-on-Shopify (Steve: 'new - on shopify = new not on shopify'). NETNEW_PRED excludes any flagged-new row whose mfr pattern number already exists in shopify_products (index-friendly equality, 240ms). New default status + header pill + health-strip chip + dup-overlap warning. Found 62,030 'new' rows are actually already on Shopify -> true net-new 134,247 not 196,277
bde393a09e6cfcb7136c64d57b74fb4444b8d0b2 · 2026-06-09 19:23:25 -0700 · SteveStudio2
Files touched
Diff
commit bde393a09e6cfcb7136c64d57b74fb4444b8d0b2
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date: Tue Jun 9 19:23:25 2026 -0700
NET NEW view: new MINUS already-on-Shopify (Steve: 'new - on shopify = new not on shopify'). NETNEW_PRED excludes any flagged-new row whose mfr pattern number already exists in shopify_products (index-friendly equality, 240ms). New default status + header pill + health-strip chip + dup-overlap warning. Found 62,030 'new' rows are actually already on Shopify -> true net-new 134,247 not 196,277
---
public/index.html | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/public/index.html b/public/index.html
index 72a2913..4bcb1b4 100644
--- a/public/index.html
+++ b/public/index.html
@@ -140,7 +140,8 @@ body.armed .chip.act-toggle{border-color:#fca5a5;color:#fecaca}
<span class="muted" id="meta"></span>
<div class="ctl"><label class="muted">Status</label>
<select id="status">
- <option value="new">🟠 New to import</option>
+ <option value="netnew">✨ NET NEW (not on Shopify)</option>
+ <option value="new">🟠 New — flagged (incl. dupes)</option>
<option value="onshopify">🔵 On Shopify (all)</option>
<option value="published">🟢 Published</option>
<option value="unpublished">⚪ Unpublished</option>
@@ -254,7 +255,7 @@ function syncSel(){const n=sel.size;$('#seln').textContent=n.toLocaleString()+'
function togglePick(id,cb){if(cb.checked)sel.add(id);else sel.delete(id);cb.closest('.card').classList.toggle('sel',cb.checked);syncSel();}
function togglePane(el,which){el.closest('.card').classList.toggle(which==='info'?'info-open':'acts-open');}
// persisted prefs (CLAUDE.md: sort + density persist in localStorage)
-$('#status').value=localStorage.getItem('nip.status')||'new';
+$('#status').value=localStorage.getItem('nip.status')||'netnew';
$('#sort').value=localStorage.getItem('nip.sort')||'newest';
const dens=localStorage.getItem('nip.density')||'6'; $('#density').value=dens;
document.documentElement.style.setProperty('--cols',dens);
@@ -342,7 +343,7 @@ async function boot(){
const s=await (await fetch('/api/stats')).json();
state.armable=!!s.armable; state.liveActions=s.liveActions||[]; state.store=s.store||''; state.armed=false; const c=s.counts||{};
setHeaderCount(c);
- [['new','🟠 New to import'],['onshopify','🔵 On Shopify (all)'],['published','🟢 Published'],['unpublished','⚪ Unpublished'],['archived','🔴 Archived'],['noimage','🚫 No image'],['all','▦ All']].forEach(([k,lbl])=>{
+ [['netnew','✨ NET NEW (not on Shopify)'],['new','🟠 New — flagged (incl. dupes)'],['onshopify','🔵 On Shopify (all)'],['published','🟢 Published'],['unpublished','⚪ Unpublished'],['archived','🔴 Archived'],['noimage','🚫 No image'],['all','▦ All']].forEach(([k,lbl])=>{
const o=$('#status').querySelector(`option[value="${k}"]`); if(o&&c[k]!=null) o.textContent=`${lbl} (${c[k].toLocaleString()})`;
});
renderArm();
@@ -355,14 +356,14 @@ async function boot(){
function renderHealth(c){
const el=$('#health'); if(!el)return;
const cur=$('#status').value;
- const defs=[['new','🟠 New','warn'],['published','🟢 Published','ok'],['unpublished','⚪ Unpublished','warn'],
+ const defs=[['netnew','✨ NET NEW','ok'],['new','🟠 New(flagged)','warn'],['published','🟢 Published','ok'],['unpublished','⚪ Unpublished','warn'],
['archived','🔴 Archived','bad'],['noimage','🚫 No image','bad'],['onshopify','🔵 On Shopify','ok'],['all','▦ All','ok']];
el.innerHTML='<span class="hlabel">catalog health</span>'+defs.map(([k,lbl,sev])=>{
const n=(c||{})[k]||0; let cls='hc';
if(n===0) cls+=' zero'; else if(sev==='bad') cls+=' bad'; else if(sev==='warn') cls+=' warn';
if(k===cur) cls+=' active';
return `<span class="${cls}" onclick="pickHealth('${k}')">${lbl} <span class="n">${n.toLocaleString()}</span></span>`;
- }).join('');
+ }).join('')+ (c.newButOnShopify? `<span class="hc warn" title="flagged 'new' but the mfr pattern number is ALREADY on Shopify — excluded from NET NEW">⚠ ${c.newButOnShopify.toLocaleString()} flagged-new already on Shopify (dupes)</span>`:'');
}
function pickHealth(k){const s=$('#status'); s.value=k; s.onchange();}
$('#status').onchange=async()=>{localStorage.setItem('nip.status',$('#status').value);setHeaderCount(window.__counts);renderHealth(window.__counts);await reloadVendors();load(true);};
← 1833735 Full action suite per chip + select 1→all: every card render
·
back to New Import Viewer
·
NET NEW by vendor panel: per-vendor breakdown (count + image 58e24b2 →