← back to NationalPaperHangers
find: default to verified-only, add 'Show directory listings' toggle (UX critic P1)
0b791b82d9f4950dae4aae1737d4aa002ff1b307 · 2026-05-06 10:57:52 -0700 · Steve
Files touched
A public/img/founder-steve.pngM routes/public.jsM views/public/find.ejs
Diff
commit 0b791b82d9f4950dae4aae1737d4aa002ff1b307
Author: Steve <steve@designerwallcoverings.com>
Date: Wed May 6 10:57:52 2026 -0700
find: default to verified-only, add 'Show directory listings' toggle (UX critic P1)
---
public/img/founder-steve.png | Bin 0 -> 81865 bytes
routes/public.js | 24 +++++++++++++++++++-----
views/public/find.ejs | 10 +++++++++-
3 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/public/img/founder-steve.png b/public/img/founder-steve.png
new file mode 100644
index 0000000..fbc9b84
Binary files /dev/null and b/public/img/founder-steve.png differ
diff --git a/routes/public.js b/routes/public.js
index efee0a9..babc42c 100644
--- a/routes/public.js
+++ b/routes/public.js
@@ -36,11 +36,15 @@ router.get('/find', async (req, res, next) => {
const material = (req.query.material || '').trim();
const zip = (req.query.zip || '').trim();
const state = (req.query.state || '').trim();
+ // Default: show claimed studios only (the 5 "real" verified ones).
+ // ?show=all surfaces unclaimed directory listings too. UX critic flagged
+ // (2026-05-06) that 519 unclaimed shells were drowning 5 claimed studios
+ // on the default landing.
+ const show = (req.query.show || 'claimed').trim();
- // Show active (claimed + verified) AND unclaimed listings (the seeded ones).
- // Unclaimed are visible so trade buyers can discover studios; the listing
- // gets a "Claim this listing" badge in the UI per DATA_POLICY §6.
- const where = [`(status = 'active' OR claim_status = 'unclaimed')`];
+ const where = (show === 'all')
+ ? [`(status = 'active' OR claim_status = 'unclaimed')`]
+ : [`status = 'active' AND (claim_status = 'self' OR claim_status = 'claimed')`];
const params = [];
let i = 1;
@@ -103,11 +107,21 @@ router.get('/find', async (req, res, next) => {
: 'Find a verified wallpaper installer · National Paper Hangers';
const metaDescription = `Browse ${installers.length}+ verified wallcovering installers${state ? ' in ' + state.toUpperCase() : ' across the United States'}. Filter by city, ZIP, market segment, and material. Luxury residential, hospitality, and commercial.`;
+ // Build a toggle URL preserving current filters.
+ const _filterParams = new URLSearchParams();
+ if (q) _filterParams.set('q', q);
+ if (zip) _filterParams.set('zip', zip);
+ if (state) _filterParams.set('state', state);
+ if (segment) _filterParams.set('segment', segment);
+ if (material) _filterParams.set('material', material);
+ if (show !== 'all') _filterParams.set('show', 'all');
+ const toggleHref = '/find' + (_filterParams.toString() ? '?' + _filterParams.toString() : '');
+
res.render('public/find', {
title, metaDescription,
canonicalPath: '/find',
installers,
- q, segment, material, zip, state
+ q, segment, material, zip, state, show, toggleHref
});
} catch (err) { next(err); }
});
diff --git a/views/public/find.ejs b/views/public/find.ejs
index 5bf0329..9a97556 100644
--- a/views/public/find.ejs
+++ b/views/public/find.ejs
@@ -43,7 +43,15 @@
</div>
</form>
- <p class="result-count"><%= installers.length %> installer<%= installers.length === 1 ? '' : 's' %></p>
+ <div class="result-bar" style="display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:12px;margin:0 0 16px">
+ <p class="result-count" style="margin:0">
+ <%= installers.length %> <%= show === 'all' ? '' : 'verified ' %>installer<%= installers.length === 1 ? '' : 's' %>
+ <% if (show !== 'all') { %><span class="muted" style="font-size:13px;margin-left:8px">· directory listings hidden</span><% } %>
+ </p>
+ <a href="<%= toggleHref %>" class="btn btn-ghost btn-sm" style="font-size:13px">
+ <%= show === 'all' ? 'Hide directory listings' : 'Show directory listings' %>
+ </a>
+ </div>
<div class="installer-grid">
<% installers.forEach(function(i){ %>
← 324d2ba post-launch QA fixes — header Dashboard label bug, /book gat
·
back to NationalPaperHangers
·
fix(public/installer): coerce market_segments/materials elem f65e1d4 →