Skip to content

fix(guest-list): show filter-aware empty state when search returns no results - #246

Draft
dccakes wants to merge 3 commits into
mainfrom
claude/sharp-feynman-wh82it
Draft

dccakes wants to merge 3 commits into
mainfrom
claude/sharp-feynman-wh82it

Conversation

@dccakes

@dccakes dccakes commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Daily Product Improvement

📝 TLDR

Correct the guest list empty state message so it reflects active filters instead of implying guests don't exist.

📝 Description

When a user types in the guest search box or activates an RSVP, tag, or country filter and no households match, the guest list previously displayed:

"No households yet"

This message implies the couple hasn't added any guests — potentially causing confusion or alarm. In reality, guests exist and the filter is simply hiding them. GuestsView is only mounted when totalGuests > 0, so sortedHouseholds.length === 0 inside that component is always caused by active filters, never by a genuinely empty guest list.

This Change

  • Changed the AsyncState emptyText prop at the filter-empty branch in GuestsView from 'No households yet' to 'No guests match your current search or filters'
  • The existing filter chip row (GuestSearchFilter) already renders a visible "Clear" button when filters are active, so users have a clear affordance to reset — the message now correctly explains why the list is empty

Recommendations Reviewed

The following areas were inspected during today's review pass. Issues without open PRs were considered as candidates.

Area: Dashboard – planning-overview.tsx VendorsCard
Issue: isLoading not destructured from query; shows "No vendors added yet" empty state while data is in-flight
Recommendation: Add a loading skeleton matching the BudgetCard pattern (PR #233 already covers BudgetCard)
Type: UX/UI · Priority: High · Effort: Small

Area: Dashboard – planning-overview.tsx MilestonesCard
Issue: visibleMilestones.map() renders nothing when the array is empty — card body is completely blank for new users
Recommendation: Add a minimal placeholder with guidance text
Type: UX/UI · Priority: Medium · Effort: Small

Area: Guest list – guests-view.tsx:680
Issue: Filter/search returning zero results shows "No households yet" — incorrect and potentially alarming
Recommendation: Change message to "No guests match your current search or filters" ✅ Selected today
Type: UX/UI · Priority: High · Effort: Small

Area: Vendor panel – vendor-detail-panel.tsx:394–403
Issue: Scratchpad save uses untrimmed value: notes: normalized ? scratchpad : null should be notes: normalized || null — whitespace-only notes saved verbatim
Recommendation: Fix the variable reference from scratchpad to normalized
Type: Frontend cleanup · Priority: Medium · Effort: Small

Area: Checklist – checklist-page-client.tsx:86–88
Issue: hasActiveTasks reads unfiltered tasks, not filteredTasks — "Everything is checked off" state never shows when a filter is hiding active items
Recommendation: Change to read from filteredTasks
Type: Frontend cleanup · Priority: Medium · Effort: Small

Area: Vendor timeline – vendor-note-timeline.tsx:17
Issue: actorLabel hardcodes "you" for all users — collaborators see their own notes attributed to "you"
Recommendation: Display the author's name/initials using the actor data
Type: Product flow · Priority: Medium · Effort: Small

Area: Settings – settings/page.tsx:48–56
Issue: Wedding details load failure shows dead-end text with no retry button or link
Recommendation: Add a Retry button matching the pattern in OrganizationMembersSettingsCard
Type: UX/UI · Priority: Medium · Effort: Small

Area: Budget – category-card.tsx
Issue: Delete action button always reads "Delete" even while mutation is pending — no loading state
Recommendation: Show "Deleting..." while deleteCategory.isPending is true
Type: UX/UI · Priority: Low · Effort: Small

Area: Settings – organization-members-settings-card.tsx + organization-outstanding-invites-card.tsx
Issue: authGet and authPost helper functions are defined identically in both files (18 total occurrences)
Recommendation: Extract to a shared ~/lib/auth-fetch.ts utility
Type: Frontend cleanup · Priority: Low · Effort: Small

Area: Multiple components
Issue: Font sizes as small as 0.52–0.58rem (~8–9px) are used across vendor cards, task rows, checklist categories, and dashboard stats — below WCAG AA legibility thresholds
Recommendation: Audit and raise all sub-12px text to at minimum 11–12px; define minimum-size tokens
Type: UX/UI · Priority: High · Effort: Large


Selected Improvement

Fix the guest list filter empty state: change emptyText from 'No households yet' to 'No guests match your current search or filters' in guests-view.tsx.

Why This Was Selected

GuestsView is only rendered when totalGuests > 0 (enforced by the parent index.tsx). Any time sortedHouseholds.length === 0 inside this component, the active search or filter is hiding results — the message "No households yet" is logically impossible to be correct here. The fix is a single-line change with zero risk, immediate user clarity, and no new dependencies.

Changes Made

  • Updated AsyncState emptyText prop in the sortedHouseholds.length === 0 branch of GuestsView

Files Changed

  • src/components/guest-list/guests-view.tsx

🧪 Testing

  • Ran Biome lint on changed file — no issues
  • Ran tsc --noEmit — no new errors (only a pre-existing baseUrl deprecation warning)
  • Manually verified the change is logically correct: GuestsView mounts only when guests exist, so the empty sortedHouseholds case is always filter-driven
  • Manually tested in browser (build environment not available in this session)

🧪 How to test as a user

  1. Open the Guest List with at least one guest added
  2. Type a name in the search box that doesn't match any guest (e.g. zzz)
  3. Before: "No households yet" (misleading)
  4. After: "No guests match your current search or filters"
  5. Repeat with RSVP, tag, or country filter applied — same result
  6. Clear filters and verify the list reappears normally

🎨 Style and code quality

  • Ran Biome on changed file — clean

Future Recommendations

VendorsCard loading skeleton (partner to PR #233)

  • Recommendation: Add isLoading check to VendorsCard in planning-overview.tsx and render a skeleton instead of the empty state during initial fetch
  • Priority: High · Effort: Small
  • Reason not included: Closely related to open PR fix(dashboard): add loading skeleton to BudgetCard to prevent empty-state flash #233; avoids potential conflicts until that PR merges
  • Should become GitHub issue: No (small enough to address in a follow-up daily run)

Scratchpad saves untrimmed value (vendor-detail-panel.tsx)

  • Recommendation: Change notes: normalized ? scratchpad : null to notes: normalized || null
  • Priority: Medium · Effort: Small
  • Reason not included: Correctness bug but narrow impact; warranted a dedicated focused PR
  • Should become GitHub issue: No

Checklist hasActiveTasks reads unfiltered tasks

  • Recommendation: Read from filteredTasks so the completion empty state appears correctly under filters
  • Priority: Medium · Effort: Small
  • Reason not included: Requires verifying interaction with other checklist state; didn't want to combine logic changes with message changes
  • Should become GitHub issue: No

Pervasive sub-12px font sizes failing WCAG AA

  • Recommendation: Audit and raise all text using text-[0.52rem]–text-[0.58rem] to at least 11–12px; establish minimum-size design tokens
  • Priority: High · Effort: Large
  • Reason not included: Cross-cutting change touching many components; needs design review
  • Should become GitHub issue: Yes — affects readability across the entire product for users with any visual impairment

GitHub Issues Created or Proposed

Proposed: One GitHub issue for the pervasive sub-12px font size problem. This issue affects vendor cards, dashboard stats, task rows, checklist category labels, and budget cells — it is too broad for a single daily PR and needs design input to establish acceptable minimums before implementation.


Generated by Claude Code

… results

When a user searches or applies filters on the guest list and no guests
match, the UI previously displayed "No households yet" — implying no
guests exist at all. GuestsView is only mounted when totalGuests > 0,
so sortedHouseholds.length === 0 always means active filters are hiding
results, never that the list is genuinely empty. Updated the message to
accurately describe the situation.
@vercel

vercel Bot commented Aug 10, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
scv Error Error Aug 10, 2026 10:39am

@github-actions

Copy link
Copy Markdown
Contributor

Jest Test Coverage

Coverage Summary

Lines Statements Branches Functions
Coverage: 81%
81.71% (35129/42990) 82.92% (3734/4503) 68.04% (1037/1524)

This branch had an error being deployed

1 failed deployment
Preview — a355eb31 Deployed Aug 10, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant