mirror of
https://github.com/asgeirtj/system_prompts_leaks.git
synced 2026-07-31 17:27:24 +02:00
Dashboard: move Daily Clones to bottom; show top 20 pages/referrers aggregated across all snapshots
This commit is contained in:
@@ -162,10 +162,9 @@ DASHBOARD_TEMPLATE = r"""<!DOCTYPE html>
|
||||
<p class="subtitle">Traffic dashboard — auto-updated daily from the <code>traffic</code> branch</p>
|
||||
<div class="stats" id="stats"></div>
|
||||
<div class="card"><div class="card-title">Daily Views</div><div id="viewsChart"></div><p class="drill-info">Drag to zoom — click Reset to restore</p></div>
|
||||
<div class="card"><div class="card-title">Daily Clones</div><div id="clonesChart"></div></div>
|
||||
<div class="grid-2">
|
||||
<div class="card"><div class="card-title">Top Pages (14-day window)</div><table id="pathsTable"></table></div>
|
||||
<div class="card"><div class="card-title">Top Referrers (14-day window)</div><table id="refsTable"></table></div>
|
||||
<div class="card"><div class="card-title">Top Pages (top 20 — peak 14-day count across all snapshots)</div><table id="pathsTable"></table></div>
|
||||
<div class="card"><div class="card-title">Top Referrers (top 20 — peak 14-day count across all snapshots)</div><table id="refsTable"></table></div>
|
||||
</div>
|
||||
<p class="section">All Referrers — peak 14-day count per source across all snapshots</p>
|
||||
<div class="card"><div id="allRefsChart"></div></div>
|
||||
@@ -175,6 +174,8 @@ DASHBOARD_TEMPLATE = r"""<!DOCTYPE html>
|
||||
<div class="card"><div id="pathTrendChart"></div></div>
|
||||
<p class="section">Day Detail</p>
|
||||
<div class="card"><div class="card-title" id="dayDetailTitle">Click a day on the views chart to see that day's breakdown</div><div id="dayDetail" style="min-height:60px"></div></div>
|
||||
<p class="section">Daily Clones</p>
|
||||
<div class="card"><div id="clonesChart"></div></div>
|
||||
|
||||
<script>
|
||||
const DATA = __DATA_PLACEHOLDER__;
|
||||
@@ -251,28 +252,35 @@ new ApexCharts(document.getElementById('clonesChart'), {
|
||||
legend:{position:'top',horizontalAlign:'left',fontSize:'12px'},
|
||||
}).render();
|
||||
|
||||
const latestPaths = DATA.paths_series.length ? DATA.paths_series[DATA.paths_series.length-1].paths : [];
|
||||
const latestRefs = DATA.referrer_series.length ? DATA.referrer_series[DATA.referrer_series.length-1].referrers : [];
|
||||
const prevRefs = DATA.referrer_series.length > 7 ? DATA.referrer_series[DATA.referrer_series.length-8].referrers : null;
|
||||
|
||||
document.getElementById('pathsTable').innerHTML = '<thead><tr><th>#</th><th>Page</th><th>Views</th><th>Unique</th></tr></thead><tbody>'+
|
||||
latestPaths.map((p,i)=>{
|
||||
const w = Math.round(p.count/(latestPaths[0]?.count||1)*100);
|
||||
return `<tr><td style="color:var(--text2)">${i+1}</td><td class="bar-wrap"><div class="bar-fill" style="width:${w}%;background:${colors[i]}"></div><span class="mono">${shortenPath(p.path)}</span></td><td>${fmt(p.count)}</td><td>${fmt(p.uniques)}</td></tr>`;
|
||||
}).join('')+'</tbody>';
|
||||
|
||||
document.getElementById('refsTable').innerHTML = '<thead><tr><th>#</th><th>Referrer</th><th>Views</th><th>Unique</th></tr></thead><tbody>'+
|
||||
latestRefs.map((r,i)=>{
|
||||
const w = Math.round(r.count/(latestRefs[0]?.count||1)*100);
|
||||
let badge = '';
|
||||
if(prevRefs){ const p=prevRefs.find(x=>x.referrer===r.referrer); if(p){const d=Math.round((r.count-p.count)/p.count*100); if(d!==0) badge=`<span class="badge ${d>0?'badge-up':'badge-down'}">${d>0?'+':''}${d}%</span>`;}else{badge='<span class="badge badge-new">new</span>';}}
|
||||
return `<tr><td style="color:var(--text2)">${i+1}</td><td class="bar-wrap"><div class="bar-fill" style="width:${w}%;background:${colors[i]}"></div>${r.referrer}${badge}</td><td>${fmt(r.count)}</td><td>${fmt(r.uniques)}</td></tr>`;
|
||||
}).join('')+'</tbody>';
|
||||
// GitHub's API only returns 10 paths/referrers per snapshot, so aggregate the
|
||||
// peak 14-day count per source across all snapshots to surface up to 20.
|
||||
const allPathsMap = {};
|
||||
DATA.paths_series.forEach(s=>s.paths.forEach(p=>{ if(!allPathsMap[p.path]||p.count>allPathsMap[p.path].count) allPathsMap[p.path]={count:p.count,uniques:p.uniques,peak:s.date}; }));
|
||||
const allPaths = Object.entries(allPathsMap).sort((a,b)=>b[1].count-a[1].count);
|
||||
|
||||
const allRefsMap = {};
|
||||
DATA.referrer_series.forEach(s=>s.referrers.forEach(r=>{ if(!allRefsMap[r.referrer]||r.count>allRefsMap[r.referrer].count) allRefsMap[r.referrer]={count:r.count,uniques:r.uniques,peak:s.date}; }));
|
||||
const allRefs = Object.entries(allRefsMap).sort((a,b)=>b[1].count-a[1].count);
|
||||
|
||||
const topPaths = allPaths.slice(0,20);
|
||||
document.getElementById('pathsTable').innerHTML = '<thead><tr><th>#</th><th>Page</th><th>Peak Views</th><th>Unique</th></tr></thead><tbody>'+
|
||||
topPaths.map(([path,d],i)=>{
|
||||
const w = Math.round(d.count/(topPaths[0]?.[1].count||1)*100);
|
||||
return `<tr><td style="color:var(--text2)">${i+1}</td><td class="bar-wrap"><div class="bar-fill" style="width:${w}%;background:${colors[i%colors.length]}"></div><span class="mono">${shortenPath(path)}</span></td><td>${fmt(d.count)}</td><td>${fmt(d.uniques)}</td></tr>`;
|
||||
}).join('')+'</tbody>';
|
||||
|
||||
const topRefs = allRefs.slice(0,20);
|
||||
document.getElementById('refsTable').innerHTML = '<thead><tr><th>#</th><th>Referrer</th><th>Peak Views</th><th>Unique</th></tr></thead><tbody>'+
|
||||
topRefs.map(([ref,d],i)=>{
|
||||
const w = Math.round(d.count/(topRefs[0]?.[1].count||1)*100);
|
||||
let badge = '';
|
||||
if(prevRefs){ const cur=latestRefs.find(x=>x.referrer===ref); const p=prevRefs.find(x=>x.referrer===ref); if(cur&&p){const delta=Math.round((cur.count-p.count)/p.count*100); if(delta!==0) badge=`<span class="badge ${delta>0?'badge-up':'badge-down'}">${delta>0?'+':''}${delta}%</span>`;}else if(cur&&!p){badge='<span class="badge badge-new">new</span>';}}
|
||||
return `<tr><td style="color:var(--text2)">${i+1}</td><td class="bar-wrap"><div class="bar-fill" style="width:${w}%;background:${colors[i%colors.length]}"></div>${ref}${badge}</td><td>${fmt(d.count)}</td><td>${fmt(d.uniques)}</td></tr>`;
|
||||
}).join('')+'</tbody>';
|
||||
|
||||
new ApexCharts(document.getElementById('allRefsChart'), {
|
||||
...baseOpts,
|
||||
chart:{...baseOpts.chart, type:'bar', height:Math.max(250, allRefs.length*32)},
|
||||
@@ -307,7 +315,7 @@ new ApexCharts(document.getElementById('refTrendChart'), {
|
||||
|
||||
const allPathNames = new Set();
|
||||
DATA.paths_series.forEach(s=>s.paths.forEach(p=>allPathNames.add(p.path)));
|
||||
const topPathNames = [...allPathNames].map(n=>({n,c:(latestPaths.find(p=>p.path===n)||{count:0}).count})).sort((a,b)=>b.c-a.c).slice(0,6).map(x=>x.n);
|
||||
const topPathNames = [...allPathNames].map(n=>({n,c:(allPathsMap[n]||{count:0}).count})).sort((a,b)=>b.c-a.c).slice(0,6).map(x=>x.n);
|
||||
|
||||
new ApexCharts(document.getElementById('pathTrendChart'), {
|
||||
...baseOpts,
|
||||
|
||||
Reference in New Issue
Block a user