← 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=>({'&':'&','<':'<','>':'>',
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 →