- Add appointment detail modal to CustomerDashboard with payment info display
- Shows service, date/time, duration, status, and notes
- Displays payment summary: service price, deposit paid, payment made, amount due
- Print receipt functionality with secure DOM manipulation
- Cancel appointment button for upcoming appointments
- Add CurrencyInput component for ATM-style price entry
- Digits entered as cents, shift left as more digits added (e.g., "1234" → $12.34)
- Robust input validation: handles keyboard, mobile, paste, drop, IME
- Only allows integer digits (0-9)
- Update useAppointments hook to map payment fields from backend
- Converts amounts from cents to dollars for display
- Update Services page to use CurrencyInput for price and deposit fields
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add request tenant validation to all ViewSets (EventViewSet, ResourceViewSet,
ParticipantViewSet, CustomerViewSet, StaffViewSet) to prevent cross-tenant
data access via subdomain/header manipulation
- Change permission_classes from AllowAny to IsAuthenticated for EventViewSet
and ResourceViewSet
- Filter events for customers to only show appointments where they are a
participant
- Add customer field to EventSerializer to create Customer participants when
appointments are created
- Update CustomerDashboard to fetch appointments from API instead of mock data
- Fix TenantViewSet.destroy() to properly handle cross-schema cascade when
deleting tenants
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit includes:
- Django backend with multi-tenancy (django-tenants)
- React + TypeScript frontend with Vite
- Platform administration API with role-based access control
- Authentication system with token-based auth
- Quick login dev tools for testing different user roles
- CORS and CSRF configuration for local development
- Docker development environment setup
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>