[object Object]

← 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 →