[object Object]

← back to Rentv

TK-10520: CRM left-rail — add Persona + LinkedIn facets, fix City facet

7991631429d900a9abc6bc27f7d2cf89e9ab112a · 2026-08-13 04:10:40 -0700 · steve@designerwallcoverings.com

FACETS now: Persona (all 5013 contacts, top values: Commercial Broker/CRE Pro/Law Firms),
Source, LinkedIn (li_rel signal: Connected/Invited/Messaged/Follows firm), List (list_category),
City (state-only codes like 'CA' now excluded), Segment.

Persona replaces city as the default open facet (city was only showing 'CA' as top value).
LinkedIn facet surfaces the 231 contacts with a real relationship signal for targeted outreach.

Files touched

Diff

commit 7991631429d900a9abc6bc27f7d2cf89e9ab112a
Author: steve@designerwallcoverings.com <steve@designerwallcoverings.com>
Date:   Thu Aug 13 04:10:40 2026 -0700

    TK-10520: CRM left-rail — add Persona + LinkedIn facets, fix City facet
    
    FACETS now: Persona (all 5013 contacts, top values: Commercial Broker/CRE Pro/Law Firms),
    Source, LinkedIn (li_rel signal: Connected/Invited/Messaged/Follows firm), List (list_category),
    City (state-only codes like 'CA' now excluded), Segment.
    
    Persona replaces city as the default open facet (city was only showing 'CA' as top value).
    LinkedIn facet surfaces the 231 contacts with a real relationship signal for targeted outreach.
---
 public/crm.html | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/public/crm.html b/public/crm.html
index e5614212..0432f12d 100644
--- a/public/crm.html
+++ b/public/crm.html
@@ -248,10 +248,12 @@ const FIELDS=[['type','Type'],['firm','Firm'],['email','Email'],['phone','Phone'
 // ── left-rail facet filters: each derives its values (with live counts) from the loaded contacts ──
 const prettySeg=v=>String(v||'').replace(/^[a-z]+:/,'').replace(/[-_]/g,' ').replace(/\b\w/g,m=>m.toUpperCase());
 const FACETS=[
-  {key:'city',          label:'City',    get:c=>c.city?[c.city]:[]},
-  {key:'source',        label:'Source',  get:c=>c.source?[c.source]:[]},
-  {key:'list_category', label:'List',    get:c=>c.list_category?[c.list_category]:[]},
-  {key:'segment',       label:'Segment', get:c=>c.segments||[], fmt:prettySeg},
+  {key:'persona',       label:'Persona',   get:c=>c.persona?[c.persona]:[]},
+  {key:'source',        label:'Source',    get:c=>c.source?[c.source]:[]},
+  {key:'li_rel',        label:'LinkedIn',  get:c=>c.li_rel?[c.li_rel]:c.li_follow?['Following']:[]},
+  {key:'list_category', label:'List',      get:c=>c.list_category?[c.list_category]:[]},
+  {key:'city',          label:'City',      get:c=>(c.city&&c.city.length>2)?[c.city]:[]},  // skip bare state codes like "CA"
+  {key:'segment',       label:'Segment',   get:c=>c.segments||[], fmt:prettySeg},
 ];
 const FACET_TOPN=12;
 let S={
@@ -261,7 +263,7 @@ let S={
   tcolHidden: (()=>{try{return JSON.parse(LS('tcolHidden',''))||{};}catch{return {};}})(),
   fields: (()=>{ try{return JSON.parse(LS('fields',''))||null;}catch{return null;} })() || {type:1,firm:1,email:1,phone:1,city:1,created:1,drill:1},
   facet: (()=>{ try{return JSON.parse(LS('facet',''))||null;}catch{return null;} })() || {},
-  facetOpen: (()=>{ try{return JSON.parse(LS('facetOpen',''))||null;}catch{return null;} })() || {city:1},
+  facetOpen: (()=>{ try{return JSON.parse(LS('facetOpen',''))||null;}catch{return null;} })() || {persona:1},
   facetMore: {},   // transient "show all values" per facet, not persisted
 };
 FACETS.forEach(f=>{ if(!Array.isArray(S.facet[f.key])) S.facet[f.key]=[]; if(S.facetOpen[f.key]==null) S.facetOpen[f.key]=0; });

← b8c1c337 auto-data-snapshot: 2026-08-13T03:45:50 (7 data files) — dat  ·  back to Rentv  ·  auto-data-snapshot: 2026-08-13T04:16:27 (7 data files) — dat 66b0d3a9 →