Add frontend/modules/loyalty with types, API client, design system, feature pages and thin App Router routes under app/loyalty/. BFF proxy at app/api/loyalty/. Include loyalty frontend docs. Co-authored-by: Cursor <cursoragent@cursor.com>
4.2 KiB
4.2 KiB
Beauty Validation Report
Date: 2026-07-26
Validator: Automated + self-audit
Quality Gates
| Gate | Command / Method | Result | Notes |
|---|---|---|---|
| Type check (beauty scope) | read_lints modules/beauty |
✅ Pass | Zero diagnostics |
| ESLint (beauty scope) | IDE lints on modules/beauty |
✅ Pass | |
| Route architecture | npm run validate:beauty-routes |
✅ Pass | 98 pages, 8 layouts, thin adapters |
| Import boundaries | npm run validate:beauty-imports |
✅ Pass | No cross-module imports |
| Module location | Manual audit | ✅ Pass | Business code in modules/beauty only |
| App directory | Manual audit | ✅ Pass | Routes re-export from modules |
| Mock data | Grep audit | ✅ Pass | No mock fixtures in beauty module |
| API connection | Resource config audit | ✅ Pass | All buttons wired to beautyBusinessApi |
Build & Typecheck (Monolith)
| Check | Result | Notes |
|---|---|---|
npm run typecheck |
⚠ Partial | Pre-existing errors in hospitality, healthcare/admin, accounting — zero beauty errors |
npm run build |
⚠ Blocked | Fails on hospitality/HospitalityListCrudPage.tsx missing z import — unrelated to beauty |
| Beauty compile | ✅ | Next.js compiled successfully before type gate failed on other module |
CRUD Validation (Owner Entities)
| Entity | Create tested via config | List | Update | Delete | Workflow |
|---|---|---|---|---|---|
| organizations | ✅ API method | ✅ | ✅ API | ✅ API | — |
| branches | ✅ | ✅ | ✅ | ✅ | — |
| appointments | ✅ | ✅ | ✅ | — | ✅ 5 actions |
| All other entities | ✅ createFn | ✅ listFn | N/A (no API) | N/A (no API) | — |
Permission Validation
useBeautyPermissionsgates workspace view/manage- Tenant owner + platform admin → full manage
.viewpermissions allow read for authenticated tenant membersPermissionDeniedStateshown when view denied- Settings + admin permissions page read
permissions/catalog
Responsive Validation
- Workspace:
sm:grid-cols-2forms, card gridsm:grid-cols-2 xl:grid-cols-3 - TableToolbar wraps on mobile
- Detail drawer
side="left"RTL-friendly - Portal shells use existing responsive nav
Accessibility Validation
- Action buttons have
aria-label(view/edit/delete icons) - Timeline uses semantic
<ol>+<time datetime> - Form fields labeled
- Confirm dialogs for destructive/workflow actions
Performance Validation
- TanStack Query with
staleTimeon permissions catalog (5 min) - Debounced search (300ms via
useDebouncedValue) - Lookup queries shared via
useBeautyLookups - No N+1 in new components (list + optional audit on detail open only)
Design System Validation
- Uses
@/components/dsprimitives BeautyStatusChip, tokens frommodules/beauty/design-system- CSS variables:
--beauty-*,--surface,--border,--muted - Consistent with healthcare
ResourceWorkspacepattern
Self-Audit Findings & Repairs
| Issue | Resolution |
|---|---|
| Owner pages partial CRUD | Replaced with BeautyResourceWorkspace |
| Reception check-in disconnected | Added ReceptionAppointmentRow with real mutations |
| Admin lists basic | Switched to read-only workspace |
| Settings no edit | Added upsert edit flow |
| Integrations read-only | Added create + tabs per integration type |
| Missing permission hook | Added useBeautyPermissions |
| Broken admin.tsx after edit | Removed orphaned JSX |
Remaining Items (Out of Frontend Scope)
- Backend PATCH/delete routes for secondary entities — enables full CRUD in UI
- Monolith build fix for hospitality module
- Customer reviews/messages — require CRM/Communication APIs
validate:beauty-bundle— run after monolith build succeeds
Sign-Off
Beauty frontend module meets production-ready criteria for all API-supported operations across 98 routes. Full monolith build blocked by unrelated hospitality TypeScript error; beauty-specific validations all pass.