[object Object]

← back to Ga Allsites

Add 'exclude main store' toggle — hides bot-inflated DW store so real fleet totals are visible (header/Global/Charts/Sites)

a252fa07b6f6316b9891bc557aa4fa4135fb6695 · 2026-08-05 07:58:07 -0700 · Steve Abrams

Files touched

Diff

commit a252fa07b6f6316b9891bc557aa4fa4135fb6695
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 5 07:58:07 2026 -0700

    Add 'exclude main store' toggle — hides bot-inflated DW store so real fleet totals are visible (header/Global/Charts/Sites)
---
 server.py | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/server.py b/server.py
index 047b6a5..f497f61 100644
--- a/server.py
+++ b/server.py
@@ -181,7 +181,8 @@ PAGE = r"""<!DOCTYPE html><html><head><meta charset="utf-8">
   <h1 id="htitle">All Sites</h1>
   <span class="stat" id="hstat">loading…</span>
   <span id="hbadge"></span>
-  <span class="stat muted" style="margin-left:auto" id="hgen"></span>
+  <label style="margin-left:auto;color:#bcd;font-size:12px;display:inline-flex;gap:5px;align-items:center;cursor:pointer" title="Hide the main DW store (bot-inflated) so the sister-site fleet is visible"><input type="checkbox" id="exstore"> exclude main store</label>
+  <span class="stat muted" id="hgen"></span>
  </header>
 
  <!-- SITES -->
@@ -273,6 +274,9 @@ const esc=s=>String(s).replace(/[&<>"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;',
 const dig=(o,k)=>k.split('.').reduce((a,x)=>a?.[x],o);
 const num=x=>{x=+x||0;return x?Math.round(x).toLocaleString():'<span class=z>0</span>'};
 let DATA={rows:[]},CDATA=null;
+const STORE_ID='294178030';
+let exStore=localStorage.gaExStore==='1';
+function activeRows(){return exStore?DATA.rows.filter(r=>r.property_id!==STORE_ID):DATA.rows;}
 let sortK=localStorage.gaSortK||'d30.sessions',sortDir=+(localStorage.gaSortDir||-1);
 // field selector: default from COLS[].def, then user override persists
 let hidden=new Set(JSON.parse(localStorage.gaHidden||'null')||COLS.filter(c=>!c.def).map(c=>c.k));
@@ -293,7 +297,7 @@ const vis=()=>COLS.filter(c=>!hidden.has(c.k));
 function renderTable(){
  const q=document.getElementById('q').value.toLowerCase();
  const onlyA=document.getElementById('onlyactive').checked;
- let rows=DATA.rows.filter(r=>(r.property||'').toLowerCase().includes(q));
+ let rows=activeRows().filter(r=>(r.property||'').toLowerCase().includes(q));
  if(onlyA)rows=rows.filter(r=>dig(r,'d30.sessions')>0);
  rows.sort((a,b)=>{const x=dig(a,sortK),y=dig(b,sortK);
    return typeof x==='string'?sortDir*String(x).localeCompare(String(y)):sortDir*((+x||0)-(+y||0));});
@@ -328,7 +332,7 @@ function liquidOrb(level,center,label,sub,color,i){
 }
 async function renderGlobal(){
  await ensureCountries();
- const rows=DATA.rows,total=rows.length,active=rows.filter(r=>dig(r,'d30.sessions')>0).length;
+ const rows=activeRows(),total=rows.length,active=rows.filter(r=>dig(r,'d30.sessions')>0).length;
  const t7=rows.reduce((s,r)=>s+dig(r,'d7.sessions'),0),t30=rows.reduce((s,r)=>s+dig(r,'d30.sessions'),0);
  const pv=rows.reduce((s,r)=>s+dig(r,'d30.screenPageViews'),0);
  const wsum=rows.reduce((s,r)=>s+(dig(r,'d30.averageSessionDuration')||0)*(dig(r,'d30.sessions')||0),0),wavg=t30?wsum/t30:0;
@@ -389,7 +393,7 @@ async function renderCountries(){
 /* ---- CHARTS overview (all domains on one page) ---- */
 async function renderCharts(){
  await ensureCountries();
- const rows=DATA.rows;
+ const rows=activeRows();
  const active=rows.filter(r=>dig(r,'d30.sessions')>0).length;
  const t7=rows.reduce((s,r)=>s+dig(r,'d7.sessions'),0),t30=rows.reduce((s,r)=>s+dig(r,'d30.sessions'),0);
  const pv=rows.reduce((s,r)=>s+dig(r,'d30.screenPageViews'),0);
@@ -485,11 +489,12 @@ document.querySelectorAll('.side button').forEach(b=>b.onclick=()=>showTab(b.dat
 /* ---- header + load ---- */
 function fmtAge(iso){const s=(Date.now()-new Date(iso))/1000;return s<90?'just now':s<3600?Math.round(s/60)+'m ago':Math.round(s/3600)+'h ago';}
 function header(){
- const active=DATA.rows.filter(x=>dig(x,'d30.sessions')>0).length;
- const t7=DATA.rows.reduce((s,x)=>s+dig(x,'d7.sessions'),0),t30=DATA.rows.reduce((s,x)=>s+dig(x,'d30.sessions'),0);
- const wsum=DATA.rows.reduce((s,x)=>s+(dig(x,'d30.averageSessionDuration')||0)*(dig(x,'d30.sessions')||0),0);
+ const R=activeRows();
+ const active=R.filter(x=>dig(x,'d30.sessions')>0).length;
+ const t7=R.reduce((s,x)=>s+dig(x,'d7.sessions'),0),t30=R.reduce((s,x)=>s+dig(x,'d30.sessions'),0);
+ const wsum=R.reduce((s,x)=>s+(dig(x,'d30.averageSessionDuration')||0)*(dig(x,'d30.sessions')||0),0);
  const wavg=t30?wsum/t30:0;
- document.getElementById('hstat').textContent=`${DATA.property_count} sites · ${active} with traffic · ${Math.round(t7).toLocaleString()} sess/7d · ${Math.round(t30).toLocaleString()} sess/30d · ⌀ ${fmtDurP(wavg)} on site`;
+ document.getElementById('hstat').textContent=`${R.length} sites${exStore?' (store hidden)':''} · ${active} with traffic · ${Math.round(t7).toLocaleString()} sess/7d · ${Math.round(t30).toLocaleString()} sess/30d · ⌀ ${fmtDurP(wavg)} on site`;
  const age=(Date.now()-new Date(DATA.generated_at))/60000;
  document.getElementById('hbadge').innerHTML=`<span class="badge ${age>45?'stale':'fresh'}">${age>45?'STALE':'fresh'} · ${fmtAge(DATA.generated_at)}</span>`;
  document.getElementById('hgen').textContent='cache '+DATA.generated_at.slice(0,16).replace('T',' ')+'Z';
@@ -503,6 +508,7 @@ async function load(){
 }
 document.getElementById('q').oninput=renderTable;
 document.getElementById('onlyactive').onchange=renderTable;
+(function(){const e=document.getElementById('exstore');e.checked=exStore;e.onchange=()=>{exStore=e.checked;localStorage.gaExStore=exStore?'1':'0';header();CDATA=CDATA;const cur=document.querySelector('.side button.on').dataset.tab;({sites:renderTable,global:renderGlobal,charts:renderCharts}[cur]||renderTable)();};})();
 document.getElementById('dens').oninput=e=>{document.documentElement.style.setProperty('--fs',e.target.value+'px');document.documentElement.style.setProperty('--pad',Math.max(3,e.target.value-7)+'px');localStorage.gaDens=e.target.value;};
 if(localStorage.gaDens){const el=document.getElementById('dens');el.value=localStorage.gaDens;el.dispatchEvent(new Event('input'));}
 document.getElementById('refresh').onclick=async()=>{const m=document.getElementById('rmsg');m.textContent='refreshing… (~50s)';

← c1f48fb ETL: flag-gated cache push to Kamatera (keeps analytics.agen  ·  back to Ga Allsites  ·  auto-save: 2026-08-05T23:16:37 (1 files) — etl.err 4130c3a →