[object Object]

← back to Commercialrealestate

viewer: Brokerage left-rail facet — filter deals by listing broker-of-record (Amazon-style)

3f752e8a9d9e87fe048502b312ce2aa78567c57f · 2026-07-31 08:05:50 -0700 · steve

Leverages the 96% broker-of-record coverage: top brokerages (Compass 133, Coldwell Banker 95, Lyon Stahl 66...) render as filter chips; crexi label excluded. Headless-verified: click Compass -> 133 of 22,995.

Files touched

Diff

commit 3f752e8a9d9e87fe048502b312ce2aa78567c57f
Author: steve <steve@designerwallcoverings.com>
Date:   Fri Jul 31 08:05:50 2026 -0700

    viewer: Brokerage left-rail facet — filter deals by listing broker-of-record (Amazon-style)
    
    Leverages the 96% broker-of-record coverage: top brokerages (Compass 133, Coldwell Banker 95, Lyon Stahl 66...) render as filter chips; crexi label excluded. Headless-verified: click Compass -> 133 of 22,995.
---
 public/mls.html | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/public/mls.html b/public/mls.html
index 3216b1d..e392146 100644
--- a/public/mls.html
+++ b/public/mls.html
@@ -111,6 +111,7 @@
   <div class="rsec"><h4>Status</h4><div class="chips" id="fStatus"></div></div>
   <div class="rsec"><h4>Submarket / city</h4><div class="chips" id="fCity"></div></div>
   <div class="rsec"><h4>Source of truth</h4><div class="chips" id="fSource"></div><div style="font-size:10px;color:var(--mut);margin-top:5px;line-height:1.4">firm-direct = the brokerage's own listing · broker-of-record = real listing broker known · aggregator = CREXi/portal only</div></div>
+  <div class="rsec"><h4>Brokerage <span style="font-size:10px;font-weight:400;color:var(--mut)">(listing broker)</span></h4><div class="chips" id="fFirm"></div></div>
   <div class="rsec"><h4>Price</h4><div class="row2"><div class="fld"><label>Min $</label><input type="number" id="pMin" placeholder="any" step="50000"></div><div class="fld"><label>Max $</label><input type="number" id="pMax" placeholder="any" step="50000"></div></div></div>
   <div class="rsec"><h4>Fields / columns — show / hide</h4>
     <div class="fieldtoggles" id="fFields"></div>
@@ -163,7 +164,7 @@ const COLS=[
 ];
 let DATA=[], view='table', sortKey='dom', sortDir=1, q='';  // default landing: freshest listings first (days-on-market asc); localStorage overrides for returning users
 const _rd=(function(){ const v=parseInt(localStorage.getItem('mlsRecentDays'),10); return (v>0&&v<=365)?v:7; })();
-const F={types:new Set(),cities:new Set(),status:new Set(),source:new Set(),pmin:null,pmax:null,unwarrantable:false,nonqm:false,shortlist:false,justsold:false,justlisted:false,inescrow:false,fellout:false,pricecut:false,recentDays:_rd};
+const F={types:new Set(),cities:new Set(),status:new Set(),source:new Set(),firms:new Set(),pmin:null,pmax:null,unwarrantable:false,nonqm:false,shortlist:false,justsold:false,justlisted:false,inescrow:false,fellout:false,pricecut:false,recentDays:_rd};
 const daysSince=d=>{ if(!d) return Infinity; const t=Date.parse(d); return isNaN(t)?Infinity:(Date.now()-t)/86400000; };
 // Real listing age: Redfin DAYS ON MARKET when present (gap-immune), else our first-seen date.
 const listAge=r=>{ if(r.dom!=null&&isFinite(+r.dom)) return +r.dom; return daysSince(r.first_seen); };
@@ -257,10 +258,10 @@ function autoCols(){
   }));
 }
 function buildRail(){
-  const tc={},cc={},sc={},oc={};
-  DATA.forEach(r=>{ if(r.type)tc[r.type]=(tc[r.type]||0)+1; if(r.city)cc[r.city]=(cc[r.city]||0)+1; const s=String(r.status||'').startsWith('Active')?'Active':'Off-market'; sc[s]=(sc[s]||0)+1; if(r.source_of_truth)oc[r.source_of_truth]=(oc[r.source_of_truth]||0)+1; });
+  const tc={},cc={},sc={},oc={},fc={};
+  DATA.forEach(r=>{ if(r.type)tc[r.type]=(tc[r.type]||0)+1; if(r.city)cc[r.city]=(cc[r.city]||0)+1; const s=String(r.status||'').startsWith('Active')?'Active':'Off-market'; sc[s]=(sc[s]||0)+1; if(r.source_of_truth)oc[r.source_of_truth]=(oc[r.source_of_truth]||0)+1; if(r.firm&&!/^crexi$/i.test(r.firm))fc[r.firm]=(fc[r.firm]||0)+1; });
   const chip=(obj,attr,limit)=>Object.entries(obj).sort((a,b)=>b[1]-a[1]).slice(0,limit||99).map(([k,c])=>`<span class="chip" data-${attr}="${esc(k)}">${esc(k)}<span class="ct">${c}</span></span>`).join('');
-  $('#fType').innerHTML=chip(tc,'ty'); $('#fStatus').innerHTML=chip(sc,'st'); $('#fCity').innerHTML=chip(cc,'cy',16); $('#fSource').innerHTML=chip(oc,'so');
+  $('#fType').innerHTML=chip(tc,'ty'); $('#fStatus').innerHTML=chip(sc,'st'); $('#fCity').innerHTML=chip(cc,'cy',16); $('#fSource').innerHTML=chip(oc,'so'); $('#fFirm').innerHTML=chip(fc,'fm',24);
   buildFieldToggles();
 }
 function buildFieldToggles(){ $('#fFields').innerHTML=COLS.map(c=>`<label class="ftog"><input type="checkbox" data-ck="${c.k}" ${colVis(c.k)?'checked':''}><span>${esc(c.l)}</span></label>`).join(''); }
@@ -268,11 +269,12 @@ function isNonQM(r){ const t=(r.type||'').toLowerCase();
   if(r.type==='Condo' && r.warrantable_status && r.warrantable_status!=='fha_approved') return true;
   if(/multi/.test(t) && r.units>=1 && r.units<=9) return true;
   if(/mixed/.test(t)) return true; return false; }
-function anySelection(){ return F.types.size||F.cities.size||F.status.size||F.source.size||F.pmin!=null||F.pmax!=null||F.unwarrantable||F.nonqm||F.shortlist||F.justsold||F.justlisted||F.inescrow||F.fellout||F.pricecut||(q&&q.length); }
+function anySelection(){ return F.types.size||F.cities.size||F.status.size||F.source.size||F.firms.size||F.pmin!=null||F.pmax!=null||F.unwarrantable||F.nonqm||F.shortlist||F.justsold||F.justlisted||F.inescrow||F.fellout||F.pricecut||(q&&q.length); }
 function passFacets(r){
   if(F.types.size && !F.types.has(r.type)) return false;
   if(F.cities.size && !F.cities.has(r.city)) return false;
   if(F.source.size && !F.source.has(r.source_of_truth)) return false;
+  if(F.firms.size && !F.firms.has(r.firm)) return false;
   if(F.status.size){ const s=String(r.status||'').startsWith('Active')?'Active':'Off-market'; if(!F.status.has(s)) return false; }
   if(F.pmin!=null && !(+r.price>=F.pmin)) return false;
   if(F.pmax!=null && !(+r.price<=F.pmax)) return false;
@@ -399,6 +401,7 @@ $('#fType').addEventListener('click',e=>{const c=e.target.closest('.chip');if(!c
 $('#fStatus').addEventListener('click',e=>{const c=e.target.closest('.chip');if(!c)return;tog(F.status,c.dataset.st);c.classList.toggle('active');render();});
 $('#fCity').addEventListener('click',e=>{const c=e.target.closest('.chip');if(!c)return;tog(F.cities,c.dataset.cy);c.classList.toggle('active');render();});
 $('#fSource').addEventListener('click',e=>{const c=e.target.closest('.chip');if(!c)return;tog(F.source,c.dataset.so);c.classList.toggle('active');render();});
+$('#fFirm').addEventListener('click',e=>{const c=e.target.closest('.chip');if(!c)return;tog(F.firms,c.dataset.fm);c.classList.toggle('active');render();});
 $('#pMin').addEventListener('input',()=>{F.pmin=$('#pMin').value?+$('#pMin').value:null;render();});
 $('#pMax').addEventListener('input',()=>{F.pmax=$('#pMax').value?+$('#pMax').value:null;render();});
 $('#fFields').addEventListener('change',e=>{const cb=e.target.closest('input[data-ck]');if(!cb)return;VISCOL[cb.dataset.ck]=cb.checked;saveCols();render();});

← 3d69f5c auto-save: 2026-07-31T07:25:03 (1 files) — data/alerts-state  ·  back to Commercialrealestate  ·  docs: residential (Redfin) sourcing section — writeback path 40ef73d →