Merged
Conversation
- Replace raw data table with visual card layout per committee - Replace "User ID" text field with searchable Autocomplete user picker that shows name, email, and avatar - Add confirmation dialogs for deactivate and remove member actions - Add helpful descriptions, placeholder text, and helper text on all forms - Add friendly empty state with guidance when no committees exist - Show member avatars, email, and role chips (Chair/Member) inline - Separate inactive committees into a dimmed section below - Add tooltips on action buttons - Update tests to match new UI (14 tests)
- AppBar: kill navy-to-sage gradient, use clean white with subtle border - Drawer/sidebar: kill gradient background, use plain white - Cards: remove hover gradient bar and float animation, keep subtle shadow - Nav items: remove gradient left-border indicator, use solid selected state - Chips: remove gradient on primary color variant - Sidebar title: remove gradient text clip effect, use solid color - Buttons: remove drop shadows on contained variant - Avatar: add explicit bgcolor so it's visible on white AppBar - Update theme snapshots
ArcRequestsPage: - Rename "Architectural Review Requests" → "My Review Requests" - Add page description explaining what the page is for - Kill raw IDs → show "#1" format with font weight - Rename column headers: ID→Request, Property Address→Property - Add tooltip on truncated addresses - Add chevron arrow on rows to indicate they're clickable - Add aria-label on clickable rows for screen readers - Add visually-hidden text on empty header column (axe fix) - Proper empty state with icon, friendly copy, and CTA ArcSubmitPage: - Rename to "Submit a Review Request" - Add intro paragraph explaining the process and timeline - Friendlier validation messages (sentences, not fragments) - Category dropdown shows descriptions alongside names - Field labels reworded: "Category" → "What type of change?" - "Description" → "Describe your project" with detailed placeholder - Helper text on every field even when no error - Add info alert about uploading photos after submission - Button shows "Submitting..." during pending state ArcDetailPage: - Title shows category name: "Fence Request" instead of "ARC Request #1" - Request number shown smaller as secondary info - Break wall-of-text into icon+label detail fields - Rename sections: "Actions" → inline action bar, "Comments" → "Discussion" with helper text, "Attachments" → "Supporting Documents" with helper text, "Timeline" → "Status History" - Better not-found state with explanation and back button - Add email notification tip for submitters ArcCommitteeQueuePage: - Rename to "Review Queue" with description - Human-readable request types via lookup map - Show request_id instead of workflow_id - Friendlier filter labels: "submitted" → "Needs Review" - Proper empty state with contextual message per filter - Add aria-pressed on filter chips, aria-label on rows - Add chevron arrow on clickable rows ArcCategoryManagementPage: - Add page description explaining what categories do - Rename "Sort Order" → "Display Order" with helper text - Add deactivate confirmation dialog - Replace Delete icon with Block icon (deactivate ≠ delete) - Add tooltips on action buttons - Proper empty state with guidance - Active categories sorted above inactive (dimmed) - Form dialog shows placeholder text and helper text - Edit dialog title includes category name
Date formatting: - Create shared utils/dates.ts with formatDate, formatDateTime, formatRelativeDate, formatDateLong helpers using date-fns - Replace raw toLocaleDateString() calls across 8 admin and member pages with consistent formatDate() output (e.g. "Mar 27, 2026") Admin Dashboard: - Replace empty "coming soon" placeholder with functional dashboard - Add quick-stat cards (total users, pending vendors) with live data - Add 9 quick-link cards to all admin sections with descriptions Admin Audit Logs: - Fix action labels: "USER_CREATED" → "User Created" (title case) - Replace useless Summary card (Total/Filtered/Current Page chips) with single-line "Showing X of Y" text Admin Announcements: - Fix "Never" expiry label → "No Expiration" - Fix "Email this announcement to all approved members" jargon → "Send an email notification to all community members" Documents Page: - Shorten verbose search placeholder to "Search documents..." - Fix "Uploader" column header → "Uploaded By" Discussions: - Replace HTML entity formatting hint (<b>bold</b>) with plain-language "**bold**, *italic*, or press Enter" Dashboard: - Kill translateX(4px) hover animation on announcement cards - Fix word-boundary truncation (120 chars with conditional ellipsis)
Profile page: - Add password requirement hint below New Password field - Use formatDateLong for Member Since date Events page: - "Organized by" → "Posted by" (less ambiguous) - Past events opacity 0.8 → 0.85 (less harsh dimming) - Better empty state messages for both tabs Polls page: - "Binding" → "Official Vote", "Informal" → "Survey" everywhere (card badges, filter buttons, create form dropdown) - Filter aria-labels updated to match Vendors page: - Guest prompt: "You are viewing limited information. Log in" → "Sign in to see full contact details, ratings, and notes. Sign In" - "Moderation Status" → "Review Status" with capitalized value Discussions: - Fix HTML hint on thread reply page (same fix as discussions list) "<b>bold</b>" → "**bold**, *italic*, or press Enter" Update affected test assertions.
- Fix password field selector: getByLabel(/password/i) matched both
the input AND the "Show password" toggle button. Changed to
locator('input[name="password"]') across all 15 E2E spec files.
This was causing 148 out of 213 tests to fail.
- Fix ARC E2E tests to match renamed UI text:
"Architectural Review Requests" → "My Review Requests"
"Submit New Request" → "New Request"
"Submit Architectural Review Request" → "Submit a Review Request"
"property address is required" → "please enter the property address"
"category" → "what type of change"
"description" → "describe your project"
"Timeline" → "Status History"
"ARC Categories" heading → "Request Categories"
"arc request" in queue → "Architectural Review"
"ARC Requests" breadcrumb → "My Requests"
"Committee Review Queue" → "Review Queue"
- Fix duplicate sidebar element resolution: all nav link clicks
and visibility checks use .first() since desktop and mobile
drawers both render the same link text
- Fix poll E2E: "votes" regex now uses "total votes" to avoid
matching the "Official Votes" filter button we renamed
Results: 184 passed, 8 ARC data-dependent failures (seed data
join issue), ~17 pre-existing failures in accessibility/vendor specs
Root causes fixed:
- Password field selector: getByLabel(/password/i) matched both input
AND "Show password" button. Fixed to locator('input[name="password"]')
across all 15 E2E spec files. (rescued 127 tests)
- API response shape mismatch: backend returns { data: [...] } but
frontend expected { arcRequests: [...] } and { workflows: [...] }.
Fixed getArcRequests and getWorkflows to normalize response shape.
- Missing seed config: arc_default_committee_id not set in test seed,
causing all ARC request creation to fail with 500. Added to seed script.
- Vendor/poll mutation context loss: mutationFn passed as unbound method
reference (apiService.createVendor) losing `this` context. Fixed
useCreateVendor and useCreatePoll to use arrow function wrappers.
- Poll vote test: member already voted on seeded poll. Fixed test to
handle "already voted" state gracefully.
- Vendor approve/deny assertion: text=/approved|success/i matched tab
labels. Changed to check snackbar container visibility instead.
- ARC E2E text updates: all selectors updated for renamed page text
(My Review Requests, New Request, Submit a Review Request, etc.)
- Duplicate sidebar elements: desktop+mobile drawers render same text.
Added .first() to all sidebar navigation clicks and assertions.
- Accessibility focus test: increased tab count and added body click
to ensure focus enters content area.
Final results: 203 E2E passed, 0 failed, 4 skipped
368 unit tests passed, 0 failed
Remove unused imports (HowToVote, Alert, Chip) and suppress eslint for intentional destructuring discard (_confirmPassword). Increase ArcSubmitPage submit test timeout to 15s for slow CI runners.
Root causes found and fixed: - ARC detail page: workflow data never loaded because API returns workflow as sibling field, not nested in arcRequest. Fixed hook to expose detailWorkflow and unwrap double-wrapped useWorkflow response. - ARC detail crash: null created_at/performed_at dates caused "Invalid time value" in date-fns format(). Added null guards. - Poll creation 404: frontend POST'd to /admin/polls but backend route is /polls. Fixed API service endpoint. - Poll creation dialog: submit button selector matched both the dialog trigger and the dialog's own button. Scoped to dialog. - Poll type dropdown: /informal/i didn't match "Survey — advisory, non-binding", leaving dropdown open. Updated to match /survey|advisory/. - Poll options: form uses single multiline field, not individual inputs. Updated tests to use "Options (one per line)" field. - Vendor tests: "Plumbing" category not in seeded data, changed to "Landscaping". Fixed user switching by clearing localStorage. - Screenshot test: ARC form label is "What type of change?" not "category". Fixed selector. - CI workflows: health check used port 5000 but backend defaults to 3001. Fixed both ci.yml and generate-screenshots.yml. Local results: 213 E2E passed, 368 unit tests passed, 0 lint errors.
A single "one per line" textarea is confusing for non-technical users. Replaced with individual "Option 1", "Option 2", etc. input fields with an "Add another option" button and X to remove. Minimum 2 options enforced by hiding remove buttons at that count.
- Screenshot spec: use individual Option 1/2/3 fields + "Add another
option" button instead of old textarea approach
- Screenshot 47 (ARC detail): wait for Status History sidebar to load
before capture (now renders correctly after workflow fix)
- USER_GUIDE.md: fix button label to match UI ("Add another option")
- ADMIN_USER_GUIDE.md: describe individual option fields in poll
creation steps
The PDF user guide (built from USER_GUIDE.md) had no ARC content despite the feature being fully implemented. Added a complete member-facing section covering: - What needs ARC approval (fences, paint, landscaping, etc.) - Step-by-step submission with screenshots - Tips for faster approvals (detail, photos, material specs) - Uploading supporting documents - Status tracking with full status table - Detail page walkthrough (discussion, documents, status history) - How to appeal a denial Also added ARC to the Quick Reference Card and Glossary.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Describe the change. Link issues.
Type of change
How to test
Steps for reviewers to validate locally.
Checklist