Merge branch 'main' into feature/filter-boolean-custom-fields
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
commit
01dea8bb8b
41 changed files with 1886 additions and 6203 deletions
|
|
@ -13,7 +13,7 @@ defmodule MvWeb.MemberLive.Form do
|
|||
## Form Sections
|
||||
- Personal Data: Name, address, contact information, membership dates, notes
|
||||
- Custom Fields: Dynamic fields in uniform grid layout (displayed sorted by name)
|
||||
- Payment Data: Mockup section (not editable)
|
||||
- Membership Fee: Selection of membership fee type with interval validation
|
||||
|
||||
## Events
|
||||
- `validate` - Real-time form validation
|
||||
|
|
@ -355,55 +355,72 @@ defmodule MvWeb.MemberLive.Form do
|
|||
|
||||
# Extracts a user-friendly error message from form errors
|
||||
defp extract_error_message(form) do
|
||||
# Try to extract message from source errors first
|
||||
source_errors = get_source_errors(form)
|
||||
|
||||
case source_errors do
|
||||
[%Ash.Error.Invalid{errors: errors} | _] when is_list(errors) ->
|
||||
# Extract first error message
|
||||
case List.first(errors) do
|
||||
%{message: message} when is_binary(message) ->
|
||||
gettext("Validation failed: %{message}", message: message)
|
||||
cond do
|
||||
has_invalid_error?(source_errors) ->
|
||||
extract_invalid_error_message(source_errors)
|
||||
|
||||
%{field: field, message: message} when is_binary(message) ->
|
||||
gettext("Validation failed: %{field} %{message}", field: field, message: message)
|
||||
has_other_error?(source_errors) ->
|
||||
extract_other_error_message(source_errors)
|
||||
|
||||
_ ->
|
||||
gettext("Validation failed. Please check your input.")
|
||||
end
|
||||
has_form_errors?(form) ->
|
||||
gettext("Please correct the errors in the form and try again.")
|
||||
|
||||
[error | _] ->
|
||||
# Try to extract message from other error types
|
||||
case error do
|
||||
%{message: message} when is_binary(message) ->
|
||||
message
|
||||
true ->
|
||||
gettext("Failed to save member. Please try again.")
|
||||
end
|
||||
end
|
||||
|
||||
error when is_struct(error) ->
|
||||
# Try to use Ash.ErrorKind protocol if available
|
||||
try do
|
||||
Ash.ErrorKind.message(error)
|
||||
rescue
|
||||
Protocol.UndefinedError -> gettext("Failed to save member. Please try again.")
|
||||
end
|
||||
# Checks if source errors contain an Ash.Error.Invalid
|
||||
defp has_invalid_error?([%Ash.Error.Invalid{errors: errors} | _]) when is_list(errors), do: true
|
||||
defp has_invalid_error?(_), do: false
|
||||
|
||||
_ ->
|
||||
gettext("Failed to save member. Please try again.")
|
||||
end
|
||||
# Extracts message from Ash.Error.Invalid
|
||||
defp extract_invalid_error_message([%Ash.Error.Invalid{errors: errors} | _]) do
|
||||
case List.first(errors) do
|
||||
%{message: message} when is_binary(message) ->
|
||||
gettext("Validation failed: %{message}", message: message)
|
||||
|
||||
%{field: field, message: message} when is_binary(message) ->
|
||||
gettext("Validation failed: %{field} %{message}", field: field, message: message)
|
||||
|
||||
_ ->
|
||||
# Check if there are any field errors in the form
|
||||
if has_form_errors?(form) do
|
||||
gettext("Please correct the errors in the form and try again.")
|
||||
else
|
||||
gettext("Failed to save member. Please try again.")
|
||||
end
|
||||
gettext("Validation failed. Please check your input.")
|
||||
end
|
||||
end
|
||||
|
||||
# Checks if source errors contain other error types
|
||||
defp has_other_error?([_ | _]), do: true
|
||||
defp has_other_error?(_), do: false
|
||||
|
||||
# Extracts message from other error types
|
||||
defp extract_other_error_message([error | _]) do
|
||||
cond do
|
||||
Map.has_key?(error, :message) and is_binary(error.message) ->
|
||||
error.message
|
||||
|
||||
is_struct(error) ->
|
||||
extract_struct_error_message(error)
|
||||
|
||||
true ->
|
||||
gettext("Failed to save member. Please try again.")
|
||||
end
|
||||
end
|
||||
|
||||
# Extracts message from struct error using Ash.ErrorKind protocol
|
||||
defp extract_struct_error_message(error) do
|
||||
try do
|
||||
Ash.ErrorKind.message(error)
|
||||
rescue
|
||||
Protocol.UndefinedError -> gettext("Failed to save member. Please try again.")
|
||||
end
|
||||
end
|
||||
|
||||
# Checks if form has any errors
|
||||
defp has_form_errors?(form) do
|
||||
case Map.get(form, :errors) do
|
||||
errors when is_list(errors) and length(errors) > 0 -> true
|
||||
errors when is_list(errors) and errors != [] -> true
|
||||
_ -> false
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ defmodule MvWeb.MemberLive.Show do
|
|||
## Sections
|
||||
- Personal Data: Name, address, contact information, membership dates, notes
|
||||
- Custom Fields: Dynamic fields in uniform grid layout (sorted by name)
|
||||
- Payment Data: Mockup section with placeholder data
|
||||
- Membership Fees: Tab showing all membership fee cycles with status management (via MembershipFeesComponent)
|
||||
|
||||
## Navigation
|
||||
- Back to member list
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue