6 Commits (9f059bcbfe0f15692b45e1919d7436b2fa93e0f2)

Author SHA1 Message Date
Guillermo Pages 9f059bcbfe feat: add plan template picker for membership plan creation
continuous-integration/drone/push Build is passing Details
- Add PlanTemplate type and listPlanTemplates API function
- Create TemplateCard and TemplatePicker components
- Modify PlanFormModal to accept initialValues from template
- Update MembershipPlansComponent to show template picker first
- Add missing translations (Venue Management, Club Management, etc.)
3 weeks ago
Guillermo Pages 826c42442e fix: handle 204 No Content in DELETE responses
continuous-integration/drone/push Build is passing Details
DELETE endpoints (deletePlan, deleteEntitlement, deleteMember) return
204 with empty body. handleApiResponse was trying to parse JSON from
empty response, causing: 'Unexpected end of JSON input'

Fix: Check for status 204 before calling response.json()
Return { success: true, data: undefined } for 204 responses

This resolves console error while maintaining successful delete operations.
3 weeks ago
Guillermo Pages 7c1c3a7568 feat: add admin context support and fix API type mismatches
continuous-integration/drone/push Build is passing Details
Add admin context API client:
- Create /admin/context types (ManagedFacility, AdminSettings)
- Add getAdminContext() API client function
- Separate admin context from player context

Fix API response type mismatches:
- UserSettings: API uses 'origin' terminology, map to internal 'remote'
- Fix transformApiSettings to use default_origin_sport/default_origin_member_id
- Update UserSettingsContext to read origin_members from API
- Fix getPolicy to handle direct object response (not wrapped)
- Fix listPlans/listMembers to extract nested arrays from API responses

These fixes ensure TypeScript types match actual API responses.
3 weeks ago
Guillermo Pages cc29ac453c fix: extract nested properties from list API responses
continuous-integration/drone/push Build is passing Details
Backend returns { plans: [...] } and { members: [...] } for list
endpoints, not direct arrays. Update listPlans() and listMembers()
to extract the nested property from the response.

Fixes:
- TypeError: t.map is not a function on Plans page
- TypeError: l is not iterable on Members page
3 weeks ago
Guillermo Pages 238320b015 fix: handle Flask API response wrapper format
continuous-integration/drone/push Build is passing Details
Fix TypeError: t.map is not a function on Plans and Members pages

Issue: Backend wraps responses in { status: 'success', data: {...} }
but frontend was expecting direct data.

Changes:
- Update handleApiResponse to extract data from Flask wrapper
- Special handling for policy endpoint (returns { policy: {...} })
- Handles both wrapped and unwrapped responses for compatibility

Fixes the 'Application error' on Plans and Members pages.
3 weeks ago
Guillermo Pages 5dd283525b feat: add facility admin management UI (plans, members, policy)
continuous-integration/drone/push Build is passing Details
Implements Phase B1-B4 of the admin portal frontend:

Phase B1 - Setup & Types:
- Add TypeScript type definitions for all admin APIs
- Add complete API client with all 15 endpoint integrations

Phase B2 - Membership Plans UI:
- Add plans listing page with create/edit/delete functionality
- Add PlanCard, PlanFormModal, and PlanListSkeleton components
- Support billing periods, pricing, and activation status

Phase B3 - Member Management UI:
- Add members listing page with search and filters
- Add member CRUD modals with role/plan assignment
- Add RoleBadge, StatusBadge, and MemberCard components
- Support filtering by role and status

Phase B4 - Policy Configuration UI:
- Add facility settings page for policy management
- Add AccessModelSelector for membership/payg/open models
- Add GuestPricingInput and BookingLimitsForm components
- Support configuring booking limits and access control

All components follow existing design patterns with purple/indigo
gradients, responsive layouts, and loading states.
3 weeks ago