← 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 →