[object Object]

← back to Commercialrealestate

CRCP: migrate last 4 pages (index/mls/fha-loans/graphics) off stale crcp-theme2 key -> crcp-theme, so day/night choice syncs fleet-wide

50e13d6fc0447d68e6f30c83d9cfa579052afa30 · 2026-08-19 08:26:27 -0700 · Steve Abrams

Files touched

Diff

commit 50e13d6fc0447d68e6f30c83d9cfa579052afa30
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 19 08:26:27 2026 -0700

    CRCP: migrate last 4 pages (index/mls/fha-loans/graphics) off stale crcp-theme2 key -> crcp-theme, so day/night choice syncs fleet-wide
---
 public/fha-loans.html |  8 ++++----
 public/graphics.html  |  8 ++++----
 public/index.html     |  6 +++---
 public/mls.html       | 12 ++++++------
 4 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/public/fha-loans.html b/public/fha-loans.html
index d58a3d9..dde3bdc 100644
--- a/public/fha-loans.html
+++ b/public/fha-loans.html
@@ -2,7 +2,7 @@
 <html lang="en">
 <head>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
-<script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -557,17 +557,17 @@ load();
 (function(){
   var root=document.documentElement;
   function applyTheme(t){ root.setAttribute('data-theme',t); }
-  var cur; try{ cur=localStorage.getItem('crcp-theme2'); }catch(e){}
+  var cur; try{ cur=localStorage.getItem('crcp-theme'); }catch(e){}
   applyTheme(cur==='dark'?'dark':'light');
   // Wire up the toggle button injected by crcp-theme.js (defer — may not exist yet;
-  // observe the header for it and intercept its click to persist crcp-theme2).
+  // observe the header for it and intercept its click to persist crcp-theme).
   function wireToggle(){
     var btn=document.getElementById('crcpThemeToggle'); if(!btn||btn.__wired2) return;
     btn.__wired2=true;
     btn.addEventListener('click',function(e){
       e.stopImmediatePropagation();   // suppress crcp-theme.js's own handler so we don't double-toggle
       var nt=root.getAttribute('data-theme')==='light'?'dark':'light';
-      applyTheme(nt); try{ localStorage.setItem('crcp-theme2',nt); }catch(e){}
+      applyTheme(nt); try{ localStorage.setItem('crcp-theme',nt); }catch(e){}
     },true);   // capture phase — fires before crcp-theme.js's own click handler
   }
   if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',wireToggle); else wireToggle();
diff --git a/public/graphics.html b/public/graphics.html
index 3469a7a..fbcbc15 100644
--- a/public/graphics.html
+++ b/public/graphics.html
@@ -1,7 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
-<script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -111,17 +111,17 @@
 (function(){
   var root=document.documentElement;
   function applyTheme(t){ root.setAttribute('data-theme',t); }
-  var cur; try{ cur=localStorage.getItem('crcp-theme2'); }catch(e){}
+  var cur; try{ cur=localStorage.getItem('crcp-theme'); }catch(e){}
   applyTheme(cur==='dark'?'dark':'light');
   // Wire up the toggle button injected by crcp-theme.js (defer — may not exist yet;
-  // observe the header for it and intercept its click to persist crcp-theme2).
+  // observe the header for it and intercept its click to persist crcp-theme).
   function wireToggle(){
     var btn=document.getElementById('crcpThemeToggle'); if(!btn||btn.__wired2) return;
     btn.__wired2=true;
     btn.addEventListener('click',function(e){
       e.stopImmediatePropagation();   // suppress crcp-theme.js's own handler so we don't double-toggle
       var nt=root.getAttribute('data-theme')==='light'?'dark':'light';
-      applyTheme(nt); try{ localStorage.setItem('crcp-theme2',nt); }catch(e){}
+      applyTheme(nt); try{ localStorage.setItem('crcp-theme',nt); }catch(e){}
     },true);   // capture phase — fires before crcp-theme.js's own click handler
   }
   if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',wireToggle); else wireToggle();
diff --git a/public/index.html b/public/index.html
index c053fee..988daa6 100644
--- a/public/index.html
+++ b/public/index.html
@@ -2,7 +2,7 @@
 <html lang="en">
 <head>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
-<script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -2254,7 +2254,7 @@ function loadRanked(_retry){ return fetch('data/ranked.json').then(r=>{ if(!r.ok
 <script src="/corner-nav.js" defer></script>
 <script>
 // Day/Night toggle — theme already applied before first paint by the head snippet.
-// crcp-theme2 key; Day (light) is the default. Only an explicit click persists.
+// crcp-theme key; Day (light) is the default. Only an explicit click persists.
 (function(){
   var root=document.documentElement;
   function label(t){
@@ -2270,7 +2270,7 @@ function loadRanked(_retry){ return fetch('data/ranked.json').then(r=>{ if(!r.ok
     btn.addEventListener('click',function(){
       var nt=root.getAttribute('data-theme')==='light'?'dark':'light';
       applyTheme(nt);
-      try{ localStorage.setItem('crcp-theme2',nt); }catch(e){}
+      try{ localStorage.setItem('crcp-theme',nt); }catch(e){}
     });
     var host=document.querySelector('header .nav')||document.querySelector('header');
     if(host){ host.appendChild(btn); } else { btn.style.cssText+=';position:fixed;top:12px;right:14px;z-index:99999'; document.body.appendChild(btn); }
diff --git a/public/mls.html b/public/mls.html
index 0f95899..85cc30a 100644
--- a/public/mls.html
+++ b/public/mls.html
@@ -10,7 +10,7 @@
      Same-origin so the Basic-auth session cookie (set on this navigation) authenticates it. Must run
      before any fetch(). Also tidy the visible address bar. -->
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
-<script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
 <!-- Self-heal: the Nav Agent grid controls can persist a "removed"/"collapsed" state that hides the
      WHOLE records grid with no obvious way back (this is how the listings went blank). The main data
      grid should never stay removed/collapsed across loads, so clear that state before nav-agent runs. -->
@@ -237,17 +237,17 @@
 (function(){
   var root=document.documentElement;
   function applyTheme(t){ root.setAttribute('data-theme',t); }
-  var cur; try{ cur=localStorage.getItem('crcp-theme2'); }catch(e){}
+  var cur; try{ cur=localStorage.getItem('crcp-theme'); }catch(e){}
   applyTheme(cur==='dark'?'dark':'light');
   // Wire up the toggle button injected by crcp-theme.js (defer — may not exist yet;
-  // observe the header for it and intercept its click to persist crcp-theme2).
+  // observe the header for it and intercept its click to persist crcp-theme).
   function wireToggle(){
     var btn=document.getElementById('crcpThemeToggle'); if(!btn||btn.__wired2) return;
     btn.__wired2=true;
     btn.addEventListener('click',function(e){
       e.stopImmediatePropagation();   // suppress crcp-theme.js's own handler so we don't double-toggle
       var nt=root.getAttribute('data-theme')==='light'?'dark':'light';
-      applyTheme(nt); try{ localStorage.setItem('crcp-theme2',nt); }catch(e){}
+      applyTheme(nt); try{ localStorage.setItem('crcp-theme',nt); }catch(e){}
     },true);   // capture phase — fires before crcp-theme.js's own click handler
   }
   if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',wireToggle); else wireToggle();
@@ -416,7 +416,7 @@ function rehydrateView(){
   try{ const a=JSON.parse(localStorage.getItem('mlsColOrder')||'[]'); COLORDER=Array.isArray(a)?a:[]; }catch(e){ COLORDER=[]; }
   const sk=localStorage.getItem('mlsSortKey'); if(sk) sortKey=sk;
   const sd=localStorage.getItem('mlsSortDir'); if(sd!==null&&sd!=='') sortDir=(+sd<0?-1:1);
-  const th=localStorage.getItem('crcp-theme2'); if(th) document.documentElement.setAttribute('data-theme', th==='dark'?'dark':'light');
+  const th=localStorage.getItem('crcp-theme'); if(th) document.documentElement.setAttribute('data-theme', th==='dark'?'dark':'light');
   lastColSig='';                                   // force column widths/resize-handles to re-init
   try{ hydrateFilters(); }catch(e){}                // TK-10687: apply the profile-synced saved filters too
   try{ buildRail(); }catch(e){}                    // keep the left rail's field-toggles in sync with the restored columns
@@ -743,7 +743,7 @@ if($('#csv2')) $('#csv2').addEventListener('click',exportCSV);
 //    existing CRCP accounts system (scrypt-hashed passwords, session cookie). ──
 (function(){
   const bar=$('#acctbar'); if(!bar) return;
-  const SKEYS=/^mls|^cre_mls|^crcp-theme2$/;   // the localStorage keys that make up a user's view
+  const SKEYS=/^mls|^cre_mls|^crcp-theme$/;   // the localStorage keys that make up a user's view
   const collect=()=>{ const o={}; for(let i=0;i<localStorage.length;i++){ const k=localStorage.key(i); if(SKEYS.test(k)) o[k]=localStorage.getItem(k); } return o; };
   const applyLocal=o=>{ Object.keys(o||{}).forEach(k=>{ try{localStorage.setItem(k,o[k]);}catch(e){} }); };
   const fmt=ts=>{ if(!ts) return 'never'; try{ return new Date(ts).toLocaleString(undefined,{month:'short',day:'numeric',hour:'numeric',minute:'2-digit'}); }catch(e){ return '—'; } };

← 92d0cec CRCP firms: new /api/firms directory endpoint (firm rosters:  ·  back to Commercialrealestate  ·  rent-rolls: convert bare dark-surface literals to themed var a206405 →