[object Object]

← back to Wallco Ai

etsy-bucket: add Sort (newest/oldest/id↑↓/dpi) + persist; format the date chip via toLocaleString (was raw ISO) per standing rule [yolo tick6/N7, local-only]

a375967864cf95a6e2514927d63757be6b2036a3 · 2026-06-02 13:36:21 -0700 · Steve Abrams

Files touched

Diff

commit a375967864cf95a6e2514927d63757be6b2036a3
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jun 2 13:36:21 2026 -0700

    etsy-bucket: add Sort (newest/oldest/id↑↓/dpi) + persist; format the date chip via toLocaleString (was raw ISO) per standing rule [yolo tick6/N7, local-only]
---
 public/admin/etsy-bucket.html | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/public/admin/etsy-bucket.html b/public/admin/etsy-bucket.html
index a8bcd22..e4b5739 100644
--- a/public/admin/etsy-bucket.html
+++ b/public/admin/etsy-bucket.html
@@ -36,6 +36,7 @@
   <h1><span class="ico">🛒</span> Etsy bucket</h1>
   <span class="pill" id="stat">loading…</span>
   <label class="ctl">State <select id="state"><option value="">all</option><option value="queued">queued</option><option value="exported">exported</option><option value="listed">listed</option><option value="sold">sold</option></select></label>
+  <label class="ctl">Sort <select id="sort"><option value="newest">Newest</option><option value="oldest">Oldest</option><option value="id_desc">ID ↓</option><option value="id">ID ↑</option><option value="dpi">DPI ↓</option></select></label>
   <label class="ctl">Density <input type="range" id="density" min="3" max="8" step="1" value="5"></label>
   <a href="javascript:void(0)" id="explink" style="margin-left:auto;color:var(--etsy);font-size:13px;text-decoration:none;border:1px solid #5a3f17;padding:5px 10px;border-radius:7px">📦 Run export script</a>
 </header>
@@ -59,6 +60,19 @@ const $=id=>document.getElementById(id);
 $('density').value=+(localStorage.getItem('etsy_density')||5); document.documentElement.style.setProperty('--cols',$('density').value);
 $('density').addEventListener('input',e=>{localStorage.setItem('etsy_density',e.target.value);document.documentElement.style.setProperty('--cols',e.target.value);});
 $('state').addEventListener('change',load);
+// Sort persists (Steve standing rule); client-side over the loaded bucket — no refetch.
+$('sort').value=localStorage.getItem('etsy_sort')||'newest';
+$('sort').addEventListener('change',e=>{localStorage.setItem('etsy_sort',e.target.value);render();});
+function fmtDate(s){ if(!s) return '—'; const d=new Date(s); return isNaN(d)?String(s):d.toLocaleString(undefined,{year:'numeric',month:'short',day:'numeric',hour:'numeric',minute:'2-digit'}); }
+function sortItems(rows){
+  const r=rows.slice(), m=$('sort').value;
+  if(m==='newest')      r.sort((a,b)=>String(b.added_at||'').localeCompare(String(a.added_at||'')));
+  else if(m==='oldest') r.sort((a,b)=>String(a.added_at||'').localeCompare(String(b.added_at||'')));
+  else if(m==='id_desc')r.sort((a,b)=>b.design_id-a.design_id);
+  else if(m==='id')     r.sort((a,b)=>a.design_id-b.design_id);
+  else if(m==='dpi')    r.sort((a,b)=>(b.target_dpi||0)-(a.target_dpi||0)||(b.design_id-a.design_id));
+  return r;
+}
 $('explink').addEventListener('click',()=>{
   alert('From your terminal:\n\n  cd ~/Projects/wallco-ai\n  node scripts/export-etsy-digital.js --limit 0\n\nThis writes per-design assets + a listings.csv manifest to data/etsy-exports/<today>/. After upload, designs auto-progress from queued → exported.');
 });
@@ -71,7 +85,7 @@ async function rm(id){
 function render(){
   $('empty').style.display=ALL.length?'none':'block';
   $('stat').innerHTML=`<b>${ALL.length}</b> in bucket`;
-  $('grid').innerHTML=ALL.map(x=>`
+  $('grid').innerHTML=sortItems(ALL).map(x=>`
     <div class="card">
       <div class="thumb">
         <div class="badges"><span class="b ${({queued:'q',exported:'exp',listed:'list'})[x.state]||''}">${x.state}</span></div>
@@ -79,7 +93,7 @@ function render(){
         <button class="rm" onclick="rm(${x.design_id})">✕ remove</button>
       </div>
       <div class="meta"><span class="id">#${x.design_id}</span><span class="dpi">${x.target_dpi}dpi</span></div>
-      <div class="when" title="${x.added_at} added">🕓 ${x.added_at}</div>
+      <div class="when" title="${x.added_at} added">🕓 ${fmtDate(x.added_at)}</div>
     </div>`).join('');
 }
 async function load(){

← 26deee2 LA Toile: staged recipe-B winners gallery builder  ·  back to Wallco Ai  ·  elements: add Sort (newest/oldest/category/color-by-hue/id↑↓ 82cf88b →