- Add translations for all membership fee related UI elements
- Fix fuzzy translations for membership fee types and cycles
- Add translations for cycle management actions
- Add translations for membership fee status and filters
- Follow same pattern as postal_code field in member form
- Ash validates Decimal format automatically
- Text input allows better control and validation feedback
- Remove validate_amount_format function - Ash handles Decimal validation automatically
- Remove oninput and pattern attributes - not needed with Ash validation
- Simplify validate handler - let AshPhoenix.Form.validate do its job
- Follows Ash best practices for form validation
- Match {:ok, cycles, notifications} tuple correctly
- Handle case when no cycles are generated ({:ok, [], []})
- Prevents CaseClauseError when regeneration produces no new cycles
- Set join_date in past to ensure cycles can be generated
- Check for flash message to verify action completion
- More reliable test that works with cycle generation logic
- Add tab switching to membership fees tab in all tests
- Update button selectors to use correct phx-value attributes
- Fix cycle display test to check for formatted dates
- All membership fees tests now pass
- Normalize checkbox 'on' value to boolean true in settings
- Change Payment Data layout to flex-nowrap for horizontal display
- Replace membership fee type dropdown with display-only view
- Fix tests to use correct button selectors and switch to membership fees tab
- Fix Protocol.UndefinedError when iterating over form errors
- Handle both tuple and list error formats
- Prevents crash when saving settings with validation errors
- Add pattern="[0-9]+(\.[0-9]{1,2})?" to prevent invalid input
- Browser now validates number format before submission
- Improves UX by catching errors earlier
- Change get_existing_form_values to read from form[:field].value
- This ensures current form state is preserved when only interval changes
- Fixes issue where name and amount were cleared on interval selection
- Add current cycle status calculation and display
- Show both Last Cycle and Current Cycle status badges
- Replace single Status field with two separate fields
- Merge existing form values with new params to prevent field loss
- Add get_existing_form_values helper to extract current form state
- Fixes issue where name and amount were cleared when selecting interval
- Add Payment Data section showing membership fee amount, interval, and last cycle status
- Use real membership fee type data instead of mockup
- Calculate last cycle status from loaded cycles
Extract nested conditionals into separate helper functions:
- check_amount_change/2 and related helpers in MembershipFeeTypeLive.Form
- check_interval_change/2 and related helpers in MemberLive.Form
This reduces nesting depth from 3 to 2, improving code readability.
- Add list view showing name, amount, interval, member count
- Add create/edit forms for membership fee types
- Gray out interval field on edit (immutable)
- Show warning on amount change with impact information
- Prevent deletion if type is in use
- Add membership fee type selection in member create/edit form
- Show warning if different interval selected
- Filter available types to same interval only
- Add status column showing last completed or current cycle status
- Add toggle to switch between last/current cycle view
- Add color coding (green/red/gray) for paid/unpaid/suspended
- Add filters for unpaid cycles in last/current cycle
- Efficiently load cycles to avoid N+1 queries
MembershipFeeHelpers: formatting functions for currency, intervals, cycles
MembershipFeeStatus: helper for loading and determining cycle status in member list