[object Object]

← back to Re Flyer Aggregator

flyers viewer: add recency filter (7/30/90d / all-time), default Past-90-days + Newest sort (Steve: deals in past 90 days, sort new order); stat shows window (TK-10708)

8d6d8a70ed33cbd5f1093068c433bd68c91f0e97 · 2026-08-19 20:38:13 -0700 · Steve Abrams

Files touched

Diff

commit 8d6d8a70ed33cbd5f1093068c433bd68c91f0e97
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 19 20:38:13 2026 -0700

    flyers viewer: add recency filter (7/30/90d / all-time), default Past-90-days + Newest sort (Steve: deals in past 90 days, sort new order); stat shows window (TK-10708)
---
 public/flyers/index.html      | 11 +++++++----
 scripts/build-flyers-site.mjs | 11 +++++++----
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/public/flyers/index.html b/public/flyers/index.html
index 8924e6c..eeb81e8 100644
--- a/public/flyers/index.html
+++ b/public/flyers/index.html
@@ -25,6 +25,7 @@
 <div class="controls">
  <div><label>Type</label><select id="ftype"><option value="">All</option><option>Sale</option><option>Loan</option><option>Lease</option><option>Development</option></select></div>
  <div><label>Market</label><select id="fmk"><option value="">All</option></select></div>
+ <div><label>Show</label><select id="recency"><option value="0">All time</option><option value="7">Past 7 days</option><option value="30">Past 30 days</option><option value="90">Past 90 days</option></select></div>
  <div><label>Sort</label><select id="sort"><option value="price">Price ↓</option><option value="date">Newest</option><option value="type">Type</option></select></div>
  <div><label>Density</label><input type="range" id="dens" min="1" max="5" step="1" value="3"></div>
  <div class="stat" id="stat"></div>
@@ -51,18 +52,20 @@ function markets(){return [...new Set(DEALS.map(d=>d.market).filter(Boolean))].s
 function render(){let a=[...DEALS];
  const ft=ftype.value,fk=fmk.value;
  if(ft)a=a.filter(d=>d.type===ft); if(fk)a=a.filter(d=>d.market===fk);
+ const rc=+recency.value; if(rc){const cut=Date.now()-rc*864e5;a=a.filter(d=>{const t=Date.parse(d.date||'');return !isNaN(t)&&t>=cut;});}
  const s=sort.value;
  a.sort(s==='date'?(x,y)=>(y.date||'').localeCompare(x.date||''):s==='type'?(x,y)=>(x.type||'').localeCompare(y.type||''):(x,y)=>(y.price||0)-(x.price||0));
- grid.innerHTML=a.map(card).join(''); stat.textContent=a.length+' flyers';
- localStorage.flyType=ft;localStorage.flyMk=fk;localStorage.flySort=s;}
+ grid.innerHTML=a.map(card).join(''); stat.textContent=a.length+' flyers'+(rc?' · past '+rc+'d':'');
+ localStorage.flyType=ft;localStorage.flyMk=fk;localStorage.flySort=s;localStorage.flyRecency=recency.value;}
 function dens(){document.documentElement.style.setProperty('--cols',document.getElementById('dens').value);localStorage.flyDens=document.getElementById('dens').value;}
-['ftype','fmk','sort'].forEach(id=>document.getElementById(id).onchange=render);
+['ftype','fmk','sort','recency'].forEach(id=>document.getElementById(id).onchange=render);
 document.getElementById('dens').oninput=dens;
 fetch('flyers.json').then(r=>r.json()).then(j=>{DEALS=j;
  fmk.innerHTML='<option value="">All</option>'+markets().map(m=>'<option>'+m+'</option>').join('');
  if(localStorage.flyType)ftype.value=localStorage.flyType;
  if(localStorage.flyMk)fmk.value=localStorage.flyMk;
- if(localStorage.flySort)sort.value=localStorage.flySort;
+ sort.value=localStorage.flySort||'date';          // default: Newest first
+ recency.value=localStorage.flyRecency||'90';       // default: Past 90 days
  if(localStorage.flyDens)document.getElementById('dens').value=localStorage.flyDens;
  dens();render();});
 </script></body></html>
\ No newline at end of file
diff --git a/scripts/build-flyers-site.mjs b/scripts/build-flyers-site.mjs
index f02d7b4..70ef3c8 100644
--- a/scripts/build-flyers-site.mjs
+++ b/scripts/build-flyers-site.mjs
@@ -76,6 +76,7 @@ const html = `<!doctype html><html lang="en"><head><meta charset="utf-8">
 <div class="controls">
  <div><label>Type</label><select id="ftype"><option value="">All</option><option>Sale</option><option>Loan</option><option>Lease</option><option>Development</option></select></div>
  <div><label>Market</label><select id="fmk"><option value="">All</option></select></div>
+ <div><label>Show</label><select id="recency"><option value="0">All time</option><option value="7">Past 7 days</option><option value="30">Past 30 days</option><option value="90">Past 90 days</option></select></div>
  <div><label>Sort</label><select id="sort"><option value="price">Price ↓</option><option value="date">Newest</option><option value="type">Type</option></select></div>
  <div><label>Density</label><input type="range" id="dens" min="1" max="5" step="1" value="3"></div>
  <div class="stat" id="stat"></div>
@@ -102,18 +103,20 @@ function markets(){return [...new Set(DEALS.map(d=>d.market).filter(Boolean))].s
 function render(){let a=[...DEALS];
  const ft=ftype.value,fk=fmk.value;
  if(ft)a=a.filter(d=>d.type===ft); if(fk)a=a.filter(d=>d.market===fk);
+ const rc=+recency.value; if(rc){const cut=Date.now()-rc*864e5;a=a.filter(d=>{const t=Date.parse(d.date||'');return !isNaN(t)&&t>=cut;});}
  const s=sort.value;
  a.sort(s==='date'?(x,y)=>(y.date||'').localeCompare(x.date||''):s==='type'?(x,y)=>(x.type||'').localeCompare(y.type||''):(x,y)=>(y.price||0)-(x.price||0));
- grid.innerHTML=a.map(card).join(''); stat.textContent=a.length+' flyers';
- localStorage.flyType=ft;localStorage.flyMk=fk;localStorage.flySort=s;}
+ grid.innerHTML=a.map(card).join(''); stat.textContent=a.length+' flyers'+(rc?' · past '+rc+'d':'');
+ localStorage.flyType=ft;localStorage.flyMk=fk;localStorage.flySort=s;localStorage.flyRecency=recency.value;}
 function dens(){document.documentElement.style.setProperty('--cols',document.getElementById('dens').value);localStorage.flyDens=document.getElementById('dens').value;}
-['ftype','fmk','sort'].forEach(id=>document.getElementById(id).onchange=render);
+['ftype','fmk','sort','recency'].forEach(id=>document.getElementById(id).onchange=render);
 document.getElementById('dens').oninput=dens;
 fetch('flyers.json').then(r=>r.json()).then(j=>{DEALS=j;
  fmk.innerHTML='<option value="">All</option>'+markets().map(m=>'<option>'+m+'</option>').join('');
  if(localStorage.flyType)ftype.value=localStorage.flyType;
  if(localStorage.flyMk)fmk.value=localStorage.flyMk;
- if(localStorage.flySort)sort.value=localStorage.flySort;
+ sort.value=localStorage.flySort||'date';          // default: Newest first
+ recency.value=localStorage.flyRecency||'90';       // default: Past 90 days
  if(localStorage.flyDens)document.getElementById('dens').value=localStorage.flyDens;
  dens();render();});
 </script></body></html>`;

← 3384361 deploy: Kamatera SSL+nginx finish script — flyers.crcp (publ  ·  back to Re Flyer Aggregator  ·  flyers viewer: default to All-time (was 90d) so full ~2650 i f2b08f4 →