← back to Re Flyer Aggregator
properties viewer: show 'assessed $X' for no-sale public-record parcels + graceful 'no recorded sale' sub-line (renders the 122k assessed-only LA rows meaningfully)
749d916743b8339e196ef08b193d602ad1dd636e · 2026-08-24 13:24:52 -0700 · Steve Abrams
Files touched
M public/properties/index.html
Diff
commit 749d916743b8339e196ef08b193d602ad1dd636e
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Mon Aug 24 13:24:52 2026 -0700
properties viewer: show 'assessed $X' for no-sale public-record parcels + graceful 'no recorded sale' sub-line (renders the 122k assessed-only LA rows meaningfully)
---
public/properties/index.html | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/public/properties/index.html b/public/properties/index.html
index 4267b35..891c710 100644
--- a/public/properties/index.html
+++ b/public/properties/index.html
@@ -35,6 +35,8 @@
const esc=s=>(s||'').replace(/[<>&]/g,c=>({'<':'<','>':'>','&':'&'}[c]));
const dt=s=>{const d=new Date(s);return isNaN(d)?'':d.toLocaleDateString('en-US',{month:'short',day:'numeric',year:'2-digit'});};
const pn=l=>{if(!l)return 0;const m=(''+l).match(/[\d.]+/);if(!m)return 0;return parseFloat(m[0])*(/b/i.test(l)?1e9:/k/i.test(l)?1e3:1e6);};
+// compact $ for the raw assessed_total on no-sale public-record parcels (they carry no transaction price)
+const am=n=>{n=+n;if(!n||n<=0)return '';return n>=1e9?'$'+(n/1e9).toFixed(1)+'B':n>=1e6?'$'+Math.round(n/1e6)+'M':'$'+Math.round(n/1e3)+'K';};
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;
@@ -46,8 +48,8 @@ function render(){
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));
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||''}</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>
- <div class="sub">latest: ${esc(p.latest_txn||'')} ${dt(p.latest)}</div>${open?hist(p):''}</div>`;}).join('')||'<div style="padding:24px;color:#9aa">No properties.</div>';
+ 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>
+ <div class="sub">${p.entries&&p.entries.length?`latest: ${esc(p.latest_txn||'')} ${dt(p.latest)}`:'public-record parcel · no recorded sale'}</div>${open?hist(p):''}</div>`;}).join('')||'<div style="padding:24px;color:#9aa">No properties.</div>';
}
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);};
← b767d0f re-flyer /properties: include no-sale parcels in the 4 index
·
back to Re Flyer Aggregator
·
auto-data-snapshot: 2026-08-24T13:25:50 (1 data files) — pub acf296e →