← back to Re Flyer Aggregator
properties viewer: add 'Assessed value' sort + County filter — makes the 127k assessed-only parcels navigable (surfaces trophy properties like 4000 Warner Blvd $737M / 525 S Flower $909M that were buried at mentions=0); reversible viewer-only
50e3f57221c17a3c2a8d9930bf2eb0ded90684ac · 2026-08-24 14:30:37 -0700 · Steve Abrams
Files touched
M public/properties/index.html
Diff
commit 50e3f57221c17a3c2a8d9930bf2eb0ded90684ac
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Mon Aug 24 14:30:37 2026 -0700
properties viewer: add 'Assessed value' sort + County filter — makes the 127k assessed-only parcels navigable (surfaces trophy properties like 4000 Warner Blvd $737M / 525 S Flower $909M that were buried at mentions=0); reversible viewer-only
---
public/properties/index.html | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/public/properties/index.html b/public/properties/index.html
index 891c710..eefd94d 100644
--- a/public/properties/index.html
+++ b/public/properties/index.html
@@ -27,7 +27,8 @@
<div class="controls">
<input id="q" placeholder="Search by address, city, buyer, seller…" autofocus autocomplete="off">
<div><label>Type</label><select id="pt"><option value="">All</option><option>Office</option><option>Industrial</option><option>Retail</option><option>Multifamily</option><option>Hotel</option><option>Land</option></select></div>
- <div><label>Sort</label><select id="sort"><option value="mentions">Most-tracked</option><option value="date">Newest</option><option value="price">Biggest $</option></select></div>
+ <div><label>County</label><select id="county"><option value="">All</option><option>Los Angeles County</option><option>Miami-Dade County</option><option>Wake County</option><option>Clackamas County</option></select></div>
+ <div><label>Sort</label><select id="sort"><option value="mentions">Most-tracked</option><option value="date">Newest</option><option value="price">Biggest $</option><option value="assessed">Assessed value</option></select></div>
<div class="stat" id="stat">loading…</div>
</div>
<div class="rows" id="rows"></div>
@@ -40,12 +41,13 @@ const am=n=>{n=+n;if(!n||n<=0)return '';return n>=1e9?'$'+(n/1e9).toFixed(1)+'B'
let DATA=[],Q='',EXP=new Set();
function hl(t){if(!Q)return esc(t);const i=t.toLowerCase().indexOf(Q);return i<0?esc(t):esc(t.slice(0,i))+'<mark>'+esc(t.slice(i,i+Q.length))+'</mark>'+esc(t.slice(i+Q.length));}
function match(p){ if(document.getElementById('pt').value&&p.property_type!==document.getElementById('pt').value)return false;
+ if(document.getElementById('county').value&&p.county!==document.getElementById('county').value)return false;
if(!Q)return true; return (p.address+' '+(p.city||'')+' '+(p.state||'')+' '+(p.property_type||'')+' '+p.entries.map(e=>e.title+' '+(e.buyer||'')+' '+(e.seller||'')).join(' ')).toLowerCase().includes(Q); }
function hist(p){return `<div class="hist">${p.entries.map(e=>`<div class="e"><span class="d">${dt(e.date)}</span> ${e.price_label?'<b>'+esc(e.price_label)+'</b> ':''}${esc(e.txn||'')} · ${e.link?`<a href="${e.link}" target="_blank" rel="noopener">${hl(e.title||'')}</a>`:hl(e.title||'')} <span class="src">[${esc(e.source)}]</span>${e.buyer?' · buyer '+esc(e.buyer):''}${e.seller?' · seller '+esc(e.seller):''}</div>`).join('')}</div>`;}
function render(){
const sort=document.getElementById('sort').value;
let a=DATA.filter(match);
- a.sort(sort==='date'?(x,y)=>(Date.parse(y.latest)||0)-(Date.parse(x.latest)||0):sort==='price'?(x,y)=>pn(y.top_price)-pn(x.top_price):(x,y)=>y.mentions-x.mentions||(Date.parse(y.latest)||0)-(Date.parse(x.latest)||0));
+ a.sort(sort==='date'?(x,y)=>(Date.parse(y.latest)||0)-(Date.parse(x.latest)||0):sort==='price'?(x,y)=>pn(y.top_price)-pn(x.top_price):sort==='assessed'?(x,y)=>(+y.assessed_total||0)-(+x.assessed_total||0):(x,y)=>y.mentions-x.mentions||(Date.parse(y.latest)||0)-(Date.parse(x.latest)||0));
document.getElementById('stat').textContent=`${a.length.toLocaleString()} properties${Q?` · “${Q}”`:''}`;
document.getElementById('rows').innerHTML=a.slice(0,600).map((p,i)=>{const k=p.address+'|'+(p.city||'');const open=EXP.has(k);
return `<div class="p" data-k="${esc(k)}"><div class="top"><span class="addr">${open?'▾ ':'▸ '}${hl(p.address)}</span><span class="chip">${(p.property_type||'CRE').toUpperCase()}</span><span class="pr">${p.top_price||p.latest_price||(p.assessed_total?'<span style="color:#9aa;font-weight:500">assessed '+am(p.assessed_total)+'</span>':'')}</span><span class="loc">📍 ${esc([p.city,p.state].filter(Boolean).join(', '))}</span>${p.units?`<span class="mn" style="background:#e0f2fe;color:#075985">${p.units} units</span>`:''}${p.sqft?`<span class="mn" style="background:#e0f2fe;color:#075985">${(+p.sqft).toLocaleString()} sf</span>`:''}${p.occupancy_pct?`<span class="mn" style="background:#dcfce7;color:#166534">${p.occupancy_pct}% occ</span>`:''}<span class="mn">${p.mentions}× · ${p.source_count} src</span></div>
@@ -53,6 +55,6 @@ function render(){
}
document.getElementById('rows').addEventListener('click',e=>{ if(e.target.closest('a'))return; const row=e.target.closest('.p'); if(!row)return; const k=row.dataset.k; EXP.has(k)?EXP.delete(k):EXP.add(k); render(); });
let deb;document.getElementById('q').oninput=e=>{clearTimeout(deb);deb=setTimeout(()=>{Q=e.target.value.trim().toLowerCase();render();},120);};
-['pt','sort'].forEach(id=>document.getElementById(id).onchange=render);
+['pt','county','sort'].forEach(id=>document.getElementById(id).onchange=render);
fetch('/properties/property-index.json?t='+Date.now()).then(r=>r.json()).then(j=>{DATA=j;render();}).catch(()=>document.getElementById('stat').textContent='load error');
</script></body></html>
← 46ea05e ingest: skip parenthetical placeholder addresses ('(PYLON SI
·
back to Re Flyer Aggregator
·
auto-data-snapshot: 2026-08-24T16:31:44 (6 data files) — dat 4c87c25 →