[object Object]

← back to Abrams

persist ideas-page sort/filter/density + apply density on hydrate

7a3c2c97cbabbfb9b82b7a4ea78640b347c8f356 · 2026-05-19 17:22:00 -0700 · SteveStudio2

Sort + filter previously not persisted. Density was persisted but only
re-applied on input event, so the grid layout was stale after reload.
Hoisted apply-side into applyDensity() and called it after the initial
fetch + on every control change.

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

Files touched

Diff

commit 7a3c2c97cbabbfb9b82b7a4ea78640b347c8f356
Author: SteveStudio2 <steve@designerwallcoverings.com>
Date:   Tue May 19 17:22:00 2026 -0700

    persist ideas-page sort/filter/density + apply density on hydrate
    
    Sort + filter previously not persisted. Density was persisted but only
    re-applied on input event, so the grid layout was stale after reload.
    Hoisted apply-side into applyDensity() and called it after the initial
    fetch + on every control change.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 public/ideas.html | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/public/ideas.html b/public/ideas.html
index ac8e12cb..509529a4 100644
--- a/public/ideas.html
+++ b/public/ideas.html
@@ -96,15 +96,29 @@ function renderIdeas() {
     </div>
   `).join('') || '<div style="color:var(--fg-3);padding:48px;text-align:center;font-family:var(--mono);">no SWOTs match filter</div>';
 }
-fetch('/api/ideas').then(r=>r.json()).then(j => { allIdeas = j.ideas || []; renderIdeas(); });
-document.getElementById('sort').addEventListener('change', renderIdeas);
-document.getElementById('filter').addEventListener('input', renderIdeas);
+function applyDensity(v) {
+  document.querySelectorAll('.idea-card .swot').forEach(el => el.style.gridTemplateColumns = v === '1' ? '1fr 1fr' : (v === '2' ? '1fr 1fr 1fr 1fr' : '1fr'));
+}
+
+// hydrate sort + filter + density from localStorage BEFORE first render (Steve standing rule)
+const savedSort = localStorage.getItem('abrams.ideas.sort');
+if (savedSort) {
+  const sortEl = document.getElementById('sort');
+  if ([...sortEl.options].some(o => o.value === savedSort)) sortEl.value = savedSort;
+}
+const savedFilter = localStorage.getItem('abrams.ideas.filter');
+if (savedFilter) document.getElementById('filter').value = savedFilter;
+const sd = localStorage.getItem('abrams.ideas.density');
+if (sd) { document.getElementById('density').value = sd; }
+
+fetch('/api/ideas').then(r=>r.json()).then(j => { allIdeas = j.ideas || []; renderIdeas(); applyDensity(document.getElementById('density').value); });
+document.getElementById('sort').addEventListener('change', e => { localStorage.setItem('abrams.ideas.sort', e.target.value); renderIdeas(); applyDensity(document.getElementById('density').value); });
+document.getElementById('filter').addEventListener('input', e => { localStorage.setItem('abrams.ideas.filter', e.target.value); renderIdeas(); applyDensity(document.getElementById('density').value); });
 document.getElementById('density').addEventListener('input', e => {
   const v = e.target.value;
-  document.querySelectorAll('.idea-card .swot').forEach(el => el.style.gridTemplateColumns = v === '1' ? '1fr 1fr' : (v === '2' ? '1fr 1fr 1fr 1fr' : '1fr'));
+  applyDensity(v);
   localStorage.setItem('abrams.ideas.density', v);
 });
-const sd = localStorage.getItem('abrams.ideas.density'); if (sd) { document.getElementById('density').value = sd; }
 </script>
 </body>
 </html>

← 8931bdf8 persist projects-grid sort to localStorage + hydrate before  ·  back to Abrams  ·  persist terminal market sort/group controls to localStorage d2d61bc0 →