[object Object]

← back to Stringwallpaper

frontend: cleanSku() strips vendor names from displayed sku (.ven/list/detail) + defer renderRailSections call (fix ReferenceError) — click-through verified

147844d5cc64d54ee880cdd91ce5f5888b11d4a9 · 2026-05-26 15:25:19 -0700 · Steve

Files touched

Diff

commit 147844d5cc64d54ee880cdd91ce5f5888b11d4a9
Author: Steve <steve@designerwallcoverings.com>
Date:   Tue May 26 15:25:19 2026 -0700

    frontend: cleanSku() strips vendor names from displayed sku (.ven/list/detail) + defer renderRailSections call (fix ReferenceError) — click-through verified
---
 public/index.html | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/public/index.html b/public/index.html
index 50ea49b..3597440 100644
--- a/public/index.html
+++ b/public/index.html
@@ -492,6 +492,10 @@ const HOSTKEY = location.hostname.replace(/\./g, '_');
 const LABELS = {"string":"String"};
 
 function escAttr(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, c => ({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;' }[c])); }
+function cleanSku(s){
+  var V=/(?:^|-)(versace|kravet|fentucci|sandberg|harlequin|blithfield|westport|thibaut|koroseal|schumacher|scalamandre|fromental|dedar|carnegie|marburg|fabricut|coordonne|nina-campbell|lee-jofa(?:-modern)?|clarke(?:-and)?-clarke|clarke|brunschwig(?:-and)?(?:-fils)?|designers-guild|graham-(?:and-)?brown|andrew-martin|candice-olson|ronald-redding|jeffrey-stevens|sister-parish|arte-international|wolf-gordon|phillip-jeffries|cole-(?:and-)?son|maya-romanoff|g-p-j-baker|les-ensembliers|breegan(?:-jane)?)(?:-\\d+)?(?=-|$)/gi;
+  return String(s||'').replace(V,'').replace(/--+/g,'-').replace(/^-+|-+$/g,'');
+}
 // Image-URL allowlist: only DW Shopify CDN + designerwallcoverings.com (defends against XSS via crafted products.json)
 function safeImg(u) { return /^https:\/\/(?:cdn\.shopify\.com|designerwallcoverings\.com)\//.test(u || '') ? u : '/hero-bg.jpg'; }
 function cardHTML(p) {
@@ -499,7 +503,7 @@ function cardHTML(p) {
   return '<img loading="' + (eager ? 'eager' : 'lazy') + '"' + (eager ? ' fetchpriority="high"' : '') + ' src="' + escAttr(safeImg(p.image_url)) + '" alt="' + escAttr(p.title) + '">'
     + '<div class="overlay">'
     + '<div class="pat">' + escAttr(p.pattern_name || p.title) + '</div>'
-    + '<div class="ven">Designer Wallcoverings · ' + escAttr(p.sku || p.handle || '') + '</div>'
+    + '<div class="ven">Designer Wallcoverings' + (cleanSku(p.sku || p.handle) ? ' · ' + escAttr(cleanSku(p.sku || p.handle)) : '') + '</div>'
     + '<div class="actions">'
     + '<button class="sample-btn" onclick="event.stopPropagation();dwmOpen(\'Sample\',' + JSON.stringify({sku:p.sku||p.handle, title:p.title, image_url:safeImg(p.image_url)}).replace(/"/g,'&quot;') + ')">Sample</button>'
     + '</div></div>';
@@ -513,7 +517,7 @@ function rowHTML(p) {
   const aes = LABELS[p.aesthetic] || p.aesthetic || '—';
   return '<img loading="lazy" src="' + escAttr(safeImg(p.image_url)) + '" alt="' + escAttr(p.title) + '">'
     + '<div class="r-pat">' + escAttr(p.pattern_name || p.title) + '</div>'
-    + '<div class="r-col r-sku">' + escAttr(p.sku || p.handle || '—') + '</div>'
+    + '<div class="r-col r-sku">' + escAttr(cleanSku(p.sku || p.handle) || '—') + '</div>'
     + '<div class="r-col r-aes">' + escAttr(String(aes).replace(/-/g, ' ')) + '</div>'
     + '<div class="r-col r-price">' + price + '</div>';
 }
@@ -538,7 +542,7 @@ function openDetails(p) {
   m.querySelector('[data-d-img]').src = safeP.image_url;
   m.querySelector('[data-d-img]').alt = safeP.title;
   m.querySelector('[data-d-pat]').textContent = safeP.pattern;
-  m.querySelector('[data-d-brand]').textContent = 'Designer Wallcoverings · ' + safeP.sku;
+  m.querySelector('[data-d-brand]').textContent = 'Designer Wallcoverings' + (cleanSku(safeP.sku) ? ' · ' + cleanSku(safeP.sku) : '');
   const priceEl = m.querySelector('[data-d-price]');
   priceEl.textContent = safeP.price != null && !isNaN(safeP.price) ? ('$' + safeP.price.toFixed(2) + ' / roll') : 'Pricing on request';
   const chipsEl = m.querySelector('[data-d-chips]');
@@ -817,7 +821,8 @@ async function renderRailSections(){
 
 loadFacets();
 loadGridPage();
-renderRailSections();
+// renderRailSections is defined in a later <script> block; defer to DOMContentLoaded.
+document.addEventListener('DOMContentLoaded', function(){ try { renderRailSections(); } catch(e){ console.warn('rails defer', e); } });
 </script>
 <!-- ============================================================
      DW UNIVERSAL CONTACT MODULE — fashion-house UX

← f9f39a6 stringwallpaper: commit config-rails fix — real aesthetic bu  ·  back to Stringwallpaper  ·  feat(fleet): theme1/theme2 query-param-gated toggle on catal 02710b5 →