25cc41b02e
feat: implement automatic cycle generation for members
...
- Add CycleGenerator module with advisory lock mechanism
- Add SetMembershipFeeStartDate change for auto-calculation
- Extend Settings with include_joining_cycle and default_membership_fee_type_id
- Add scheduled job skeleton for future Oban integration
2025-12-16 16:40:11 +01:00
a7285915e6
docs: fix CalendarCycles documentation to match actual implementation
continuous-integration/drone/push Build is passing
2025-12-16 15:06:45 +01:00
da6c495d04
refactor: improve CalendarCycles API and tests based on code review
2025-12-16 15:06:45 +01:00
3fc4440bce
feat: implement calendar-based cycle calculation functions
...
Add CalendarCycles module with functions for all interval types.
Includes comprehensive tests for edge cases.
2025-12-16 15:06:45 +01:00
62d04add8e
fix: standardize 'Custom Field' capitalization in i18n
...
Change 'Save Custom field' to 'Save Custom Field' and
'Save Custom field value' to 'Save Custom Field Value' for consistency.
Update gettext files accordingly.
2025-12-16 14:54:43 +01:00
be6ea56860
fix: improve mailto BCC encoding
...
Use URI.encode_www_form() instead of URI.encode() for mailto query parameters.
This is the safer choice for query parameter encoding.
Add comment about mailto URL length limits that vary by email client.
2025-12-16 14:51:42 +01:00
fb91f748c2
perf: optimize member index selection calculations
...
Calculate selected_count, any_selected? and mailto_bcc once in assigns
instead of recalculating Enum.any? and Enum.count multiple times in template.
This improves render performance and makes the template code more readable.
2025-12-16 14:50:52 +01:00
222af635ae
fix: make disabled links more robust in CoreComponents.button
...
Remove navigation attributes (href, navigate, patch) when disabled=true
to prevent 'Open in new tab' and 'Copy link' from working on disabled links.
This makes the disabled state semantically stronger and independent of CSS themes.
2025-12-16 14:48:18 +01:00
dd4048669c
fix: update clubname on save
continuous-integration/drone/push Build is passing
2025-12-16 14:35:00 +01:00
e0712d47bc
chore: change payment filter text
2025-12-16 14:35:00 +01:00
4e86351e1c
feat: disable email buttons instead hide them
2025-12-16 14:35:00 +01:00
8bfa5b7d1d
chore: remove immutable from custom fields
2025-12-16 14:35:00 +01:00
ebbf347e42
fix(membership-fees): add DB constraints for enum and decimal precision
continuous-integration/drone/push Build is passing
2025-12-11 18:46:48 +01:00
4d1b33357e
feat(membership-fees): add database schema and Ash domain structure
2025-12-11 18:46:48 +01:00
9dba4d1019
fix: credo warnings
continuous-integration/drone/push Build is passing
2025-12-11 14:21:40 +01:00
00fe471bc0
fix: custom field substring search - pass id as parameter
...
continuous-integration/drone/push Build is passing
Fragment 'member_id = id' did not resolve correctly. Now passes id as
Ash expression. Also changed LIKE to ILIKE for case-insensitive search.
2025-12-11 14:04:13 +01:00
ca5fad0dcc
security: add input sanitization for search queries
...
continuous-integration/drone/push Build is passing
- Escape SQL LIKE wildcards (% and _) to prevent pattern injection
- Limit search query length to 100 characters
- Apply sanitization in both :search action and linking filters
- FTS and fuzzy search use unsanitized query (wildcards not special there)
2025-12-11 13:49:07 +01:00
1ec6188884
perf: remove custom field search from user-linking autocomplete
...
Custom field LIKE queries on JSONB are expensive (no index).
User linking only needs name/email search for autocomplete.
Custom fields are still searchable via main member search (uses FTS index).
Remove unnecessary credo:disable as function complexity is now acceptable.
2025-12-11 13:49:07 +01:00
062dad99fb
refactor: remove unused fields parameter from fuzzy_search API
...
The fields parameter was accepted but never used in the :search action.
Simplify API to only accept the query parameter.
Update @doc to reflect the actual functionality.
2025-12-11 13:49:07 +01:00
12f95c1998
docs: document fuzzy search similarity threshold strategy
...
Explain the two-tier matching approach:
- % operator with server-wide threshold (0.3) for fast index scans
- similarity functions with configurable threshold (0.2) for edge cases
Add rationale for threshold value based on German name testing
2025-12-11 13:49:06 +01:00
add855c8cb
refactor: remove redundant ilike filter in build_substring_filter
...
contains(city, ^query) already produces ILIKE '%query%'
ilike(city, ^pattern) with pattern="%query%" is identical
2025-12-11 13:49:06 +01:00
265e976d94
fix: simplify JSONB extraction - remove redundant operators
...
- Replace 4 LIKE checks with 2 in build_custom_field_filter
- Simplify CASE blocks in migration trigger functions
- ->> operator always returns text, no need for -> + ::text fallback
- Performance improvement: 50% fewer LIKE operations
2025-12-11 13:49:05 +01:00
8c361cfc88
feat: updates query in member ressource
2025-12-11 13:44:30 +01:00
b1f6d29ca1
Merge remote-tracking branch 'origin/main' into feature/220_ui_issues_2
continuous-integration/drone/push Build is passing
2025-12-11 01:49:12 +01:00
1675d66b67
translate field names for visibility dropdown
continuous-integration/drone/push Build is failing
2025-12-11 00:51:26 +01:00
c3e95ca711
formatting
continuous-integration/drone/push Build is passing
2025-12-08 11:51:45 +01:00
1b06f885bf
Merge branch 'main' into feature/223_member_checkbox
continuous-integration/drone/push Build is failing
2025-12-08 11:43:54 +01:00
8512be0282
feat: reuse form_section in settings
continuous-integration/drone/push Build is failing
2025-12-04 12:32:24 +01:00
89b02aeacf
Merge branch 'main' into feature/220_ui_issues_2
continuous-integration/drone/push Build is failing
2025-12-04 12:25:46 +01:00
94de429529
style: translate fieldtypes and payment as button
2025-12-03 22:18:18 +01:00
9cda832b82
fix: request scopes email and profile
continuous-integration/drone/push Build is passing
2025-12-03 22:02:23 +01:00
613a5f2643
feat: support email scope to retrieve oidc info
continuous-integration/drone/push Build is passing
2025-12-03 21:51:12 +01:00
5ae4450444
Merge branch 'main' into feature/209_hide_field_dropdown
continuous-integration/drone/push Build is passing
2025-12-03 18:58:40 +01:00
cf6a108049
refactor: DRY - use Mv.Constants.custom_field_prefix() instead of string literals
continuous-integration/drone/push Build is passing
2025-12-03 18:47:27 +01:00
fabfe64468
refactor: rename custom_fields/member_fields to extract_*_field_keys for clarity
2025-12-03 18:44:17 +01:00
6029920c3f
refactor: cleanup dropdown_menu component (required attr, remove redundant defaults, fix checkbox)
2025-12-03 18:42:49 +01:00
6cf955b024
fix: get_from_cookie now correctly handles list return from get_req_header
2025-12-03 18:37:51 +01:00
217ed632fa
fix: preserve paid_filter in URL when toggling field visibility
2025-12-03 18:36:13 +01:00
3b038d451d
fix: use all_custom_fields in prepare_dynamic_cols
...
Allows users to enable globally hidden custom fields in the table view
2025-12-03 18:20:32 +01:00
690083bdf0
refactor: fix Credo warnings in field visibility modules
...
Use Enum.map_join and reduce nesting in format_custom_field_label
2025-12-03 18:10:13 +01:00
4bbba65038
fix: remove duplicate member_fields_visible assignment in mount/3
...
Removes dead code and fixes initialization to use FieldVisibility module
2025-12-03 18:09:08 +01:00
75e1fc8a3a
fix: use all_custom_fields in handle_info(:field_toggled)
...
Fixes bug where globally hidden custom fields could not be enabled via dropdown
2025-12-03 18:07:37 +01:00
8ce89a7227
formatting
continuous-integration/drone/push Build is passing
2025-12-03 17:44:01 +01:00
f5b67de870
Merge branch 'main' into feature/209_hide_field_dropdown
continuous-integration/drone/push Build is failing
2025-12-03 17:38:50 +01:00
ba5fc34d80
Move custom fields to global admin settings
continuous-integration/drone/push Build is failing
2025-12-03 16:32:40 +01:00
2542bcf9e4
fix: improve gettext translations and deduplicate email formatting in member views
continuous-integration/drone/push Build was killed
2025-12-03 15:30:09 +01:00
ed961f7585
Redesign member view/edit UI with improved accessibility
...
- Group fields into Personal Data, Custom Fields, and Payment Data sections
- Fix WCAG AA contrast issues and semantic HTML (dt/dd in dl)
- Format mailto links with member name in href attribute
2025-12-03 15:29:29 +01:00
c17445975c
Merge branch 'main' into feature/209_hide_field_dropdown
continuous-integration/drone/push Build is failing
2025-12-03 14:57:56 +01:00
c9678231f9
fix: hide paid column and add tests
continuous-integration/drone/push Build was killed
2025-12-03 14:56:39 +01:00
c3b33b55a5
chore: moved component and added mix_quiet to justfile
2025-12-03 14:56:01 +01:00