[object Object]

← back to Recycledwallpaper

Wire sort select to API: hydrate from localStorage before first load

e5f25ed6d7cc02025dd4e9222b5578b6130ade14 · 2026-05-19 07:56:14 -0700 · Steve Abrams

- state.sort hydrated from localStorage at definition (before first grid load).
- loadGridPage() now sends sort param so server sort is honored.
- sort select reflects saved value; change handler persists + reloads.
- window.open external link gets noopener,noreferrer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit e5f25ed6d7cc02025dd4e9222b5578b6130ade14
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue May 19 07:56:14 2026 -0700

    Wire sort select to API: hydrate from localStorage before first load
    
    - state.sort hydrated from localStorage at definition (before first grid load).
    - loadGridPage() now sends sort param so server sort is honored.
    - sort select reflects saved value; change handler persists + reloads.
    - window.open external link gets noopener,noreferrer.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 public/index.html | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/public/index.html b/public/index.html
index 30d41d6..47d4775 100644
--- a/public/index.html
+++ b/public/index.html
@@ -389,13 +389,17 @@ textarea:focus-visible,
       const isCurrent = n.dataset.slug === SLUG;
       n.querySelector('circle').setAttribute('fill-opacity', isCurrent ? '1' : '0.55');
     });
-    n.addEventListener('click', () => window.open('https://' + n.dataset.slug + '.com', '_blank'));
+    n.addEventListener('click', () => window.open('https://' + n.dataset.slug + '.com', '_blank', 'noopener,noreferrer'));
   });
 })();
 </script>
 
 <script>
-const state = { q:'', facet:'all', page:1, pages:1, total:0, loading:false, exhausted:false };
+const SORT_KEY = location.hostname.replace(/\./g, '_') + '_sort';
+const VALID_SORTS = ['newest','light-dark','dark-light','wheel','color','style','sku','title','price-asc','price-desc'];
+let _savedSort = 'newest';
+try { const s = localStorage.getItem(SORT_KEY); if (s && VALID_SORTS.includes(s)) _savedSort = s; } catch(e){}
+const state = { q:'', facet:'all', page:1, pages:1, total:0, loading:false, exhausted:false, sort:_savedSort };
 const LABELS = {"recycled":"Recycled","sustainable":"Sustainable"};
 
 function escAttr(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, c => ({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;' }[c])); }
@@ -508,6 +512,7 @@ async function loadGridPage() {
   const params = new URLSearchParams({ page:state.page, limit:24 });
   if (state.q) params.set('q', state.q);
   if (state.facet !== 'all') params.set('aesthetic', state.facet);
+  if (state.sort && state.sort !== 'newest') params.set('sort', state.sort);
   let data;
   try {
     const r = await fetch('/api/products?' + params);
@@ -835,17 +840,17 @@ loadGridPage();
 })();
 
 
-// DW STANDARD sort-select wire-up (added by fleet patcher)
+// DW STANDARD sort-select wire-up — hydrates from saved state.sort, persists + reloads grid.
 (function(){
   const sortSel = document.getElementById('sortSelect');
   if (!sortSel) return;
-  const KEY = location.hostname.replace(/\./g, '_') + '_sort';
-  const saved = localStorage.getItem(KEY);
-  if (saved) { try { sortSel.value = saved; } catch(e){} }
-  if (typeof state !== 'undefined') state.sort = sortSel.value;
+  // Reflect the value already hydrated into state before the first grid load.
+  if (typeof state !== 'undefined' && state.sort) {
+    try { sortSel.value = state.sort; } catch(e){}
+  }
   sortSel.addEventListener('change', e => {
     const v = e.target.value;
-    try { localStorage.setItem(KEY, v); } catch(e){}
+    try { localStorage.setItem(SORT_KEY, v); } catch(e){}
     if (typeof state !== 'undefined') state.sort = v;
     if (typeof resetGrid === 'function') resetGrid();
     else location.reload();

← 70cfb8b Add .bak/.pre- 404-guard, clean-URL nav routes, explicit fac  ·  back to Recycledwallpaper  ·  Untrack editor snapshot files; broaden .gitignore d9e1d6a →