[object Object]

← back to Commercialrealestate

auto-save: 2026-08-01T19:38:57 (1 files) — public/deals-flow.html

8591e8471092236ac5a482ef228d07427eba2d79 · 2026-08-01 19:39:05 -0700 · Steve Abrams

Files touched

Diff

commit 8591e8471092236ac5a482ef228d07427eba2d79
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sat Aug 1 19:39:05 2026 -0700

    auto-save: 2026-08-01T19:38:57 (1 files) — public/deals-flow.html
---
 public/deals-flow.html | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/public/deals-flow.html b/public/deals-flow.html
index 1b45ee0..f102b9a 100644
--- a/public/deals-flow.html
+++ b/public/deals-flow.html
@@ -189,14 +189,14 @@ function buildRail(){
 }
 function card(r){
   const isE=r.kind==='reit-filing', isF=r.kind==='fha', isC=r.kind==='county-sale';
-  const srcBadge=isE?'<span class="src edgar">📄 SEC EDGAR</span>':isF?'<span class="src fha">🏦 HUD FHA</span>':'<span class="src county">🏛️ Assessor</span>';
+  const srcBadge=`<span class="src ${isE?'edgar':isF?'fha':'county'}" data-fs="${esc(r.source_label)}" style="cursor:pointer" title="Filter to ${esc(r.source_label)}">${isE?'📄 SEC EDGAR':isF?'🏦 HUD FHA':'🏛️ Assessor'}</span>`;
   const price=money(r.price);
   const details=[];
   if(price&&isE) details.push(`<span class="i">💰 <b>${price}</b></span>`);
   if(r.rate!=null) details.push(`<span class="i">💵 <b>${(+r.rate).toFixed(2)}%</b> rate</span>`);
   if(isF&&r.belowMarket) details.push(`<span class="i" style="color:var(--gold)">◆ assumable (below-market)</span>`);
   if(r.units) details.push(`<span class="i">🏢 <b>${r.units}</b> units</span>`);
-  if(r.use) details.push(`<span class="i">🏷️ ${esc(r.use)}</span>`);
+  if(r.use) details.push(`<span class="i" data-fu="${esc(r.use)}" style="cursor:pointer" title="Filter to ${esc(r.use)}">🏷️ ${esc(r.use)}</span>`);
   if(r.deal_city) details.push(`<span class="i">📍 ${esc(r.deal_city)}</span>`);
   if(r.year_built) details.push(`<span class="i">🏗️ built ${r.year_built}</span>`);
   if(r.date) details.push(`<span class="i">📅 ${esc(r.date)}</span>`);
@@ -294,7 +294,12 @@ async function loadWatch(){const r=await api('/api/watchlist');WATCH=new Set(r.i
 $('#saveBtn').addEventListener('click',async()=>{if(!ME||!ME.email){signIn();return;}const name=prompt('Name this saved search:','My deal filter');if(name===null)return;const filters={src:[...F.src],use:[...F.use],year:[...F.year],conf:[...F.conf],pMin:F.pMin,uMin:F.uMin,q};await api('/api/saved-searches',{method:'POST',body:JSON.stringify({name,filters})});loadSaved();});
 $('#watchBtn').addEventListener('click',()=>{if(!ME||!ME.email){signIn();return;}watchOnly=!watchOnly;$('#watchBtn').style.borderColor=watchOnly?'var(--gold)':'var(--line)';render();});
 $('#fSaved').addEventListener('click',async e=>{const del=e.target.closest('[data-del]');if(del){await fetch('/api/saved-searches/'+del.dataset.del,{method:'DELETE'});loadSaved();return;}const c=e.target.closest('[data-sid]');if(!c)return;const s=(window._saved||[]).find(x=>x.id===c.dataset.sid);if(!s)return;const f=s.filters||{};F.src=new Set(f.src||[]);F.use=new Set(f.use||[]);F.year=new Set(f.year||[]);F.conf=new Set(f.conf||[]);F.pMin=f.pMin??null;F.uMin=f.uMin??null;q=f.q||'';$('#q').value=q;render();});
-$('#grid').addEventListener('click',async e=>{const b=e.target.closest('.starbtn');if(!b)return;if(!ME||!ME.email){signIn();return;}const r=await api('/api/watchlist',{method:'POST',body:JSON.stringify({id:b.dataset.k})});WATCH=new Set(r.ids||[]);render();});
+// href-drill rule: card values drill to their filtered view (reuses the rail F filters + keeps rail chips in sync)
+function syncRailActive(attr,set){const map={s:'#fSrc',u:'#fUse',y:'#fYear',c:'#fConf'},el=$(map[attr]);if(el)el.querySelectorAll('.chip').forEach(ch=>ch.classList.toggle('active',set.has(ch.dataset[attr])));}
+$('#grid').addEventListener('click',async e=>{
+  const fu=e.target.closest('[data-fu]');if(fu){tog(F.use,fu.dataset.fu);syncRailActive('u',F.use);render();return;}
+  const fs=e.target.closest('[data-fs]');if(fs){tog(F.src,fs.dataset.fs);syncRailActive('s',F.src);render();return;}
+  const b=e.target.closest('.starbtn');if(!b)return;if(!ME||!ME.email){signIn();return;}const r=await api('/api/watchlist',{method:'POST',body:JSON.stringify({id:b.dataset.k})});WATCH=new Set(r.ids||[]);render();});
 Promise.all([
   fetch('/data/deals-flow.json').then(r=>r.json()).catch(()=>({deals:[]})),
   fetch('/data/edgar-reit-deals.json').then(r=>r.json()).catch(()=>({deals:[]})),

← 9101210 crcp: wire display to prefer firm_direct_url deep-links + Br  ·  back to Commercialrealestate  ·  crcp: apply 31 Lee firm-direct deep-links to ranked.json (St 5f8c270 →