Membership Fee 6 - UI Components & LiveViews closes #280 #304
1 changed files with 49 additions and 18 deletions
|
|
@ -208,6 +208,7 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do
|
|||
@impl true
|
||||
def handle_event("validate", %{"membership_fee_type" => params}, socket) do
|
||||
# Merge with existing form values to preserve unchanged fields
|
||||
# Extract values directly from form fields to get current state
|
||||
existing_values = get_existing_form_values(socket.assigns.form)
|
||||
|
||||
# Merge existing values with new params (new params take precedence)
|
||||
|
|
@ -323,25 +324,55 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do
|
|||
|
||||
# Helper to extract existing form values to preserve them when only one field changes
|
||||
defp get_existing_form_values(form) do
|
||||
# Get current form values from the form source
|
||||
case form.source.params do
|
||||
%{"membership_fee_type" => existing_params} when is_map(existing_params) ->
|
||||
# Convert atoms to strings for form params
|
||||
existing_params
|
||||
|> Enum.map(fn
|
||||
{key, value} when is_atom(key) -> {Atom.to_string(key), value}
|
||||
{key, value} -> {key, value}
|
||||
end)
|
||||
|> Enum.map(fn
|
||||
{key, value} when is_atom(value) -> {key, Atom.to_string(value)}
|
||||
{key, value} -> {key, value}
|
||||
end)
|
||||
|> Map.new()
|
||||
# Extract values directly from form fields to get current state
|
||||
# This ensures we get the actual current values, not just initial params
|
||||
existing_values = %{}
|
||||
|
||||
_ ->
|
||||
# No existing params, return empty map
|
||||
%{}
|
||||
end
|
||||
existing_values =
|
||||
if form[:name] && form[:name].value do
|
||||
Map.put(existing_values, "name", to_string(form[:name].value))
|
||||
else
|
||||
existing_values
|
||||
end
|
||||
|
||||
existing_values =
|
||||
if form[:amount] && form[:amount].value do
|
||||
# Convert Decimal to string for form
|
||||
amount_str =
|
||||
case form[:amount].value do
|
||||
%Decimal{} = amount -> Decimal.to_string(amount, :normal)
|
||||
value when is_binary(value) -> value
|
||||
value -> to_string(value)
|
||||
end
|
||||
|
||||
Map.put(existing_values, "amount", amount_str)
|
||||
else
|
||||
existing_values
|
||||
end
|
||||
|
||||
existing_values =
|
||||
if form[:interval] && form[:interval].value do
|
||||
# Convert atom to string for form
|
||||
interval_str =
|
||||
case form[:interval].value do
|
||||
value when is_atom(value) -> Atom.to_string(value)
|
||||
value when is_binary(value) -> value
|
||||
value -> to_string(value)
|
||||
end
|
||||
|
||||
Map.put(existing_values, "interval", interval_str)
|
||||
else
|
||||
existing_values
|
||||
end
|
||||
|
||||
existing_values =
|
||||
if form[:description] && form[:description].value do
|
||||
Map.put(existing_values, "description", to_string(form[:description].value))
|
||||
else
|
||||
existing_values
|
||||
end
|
||||
|
||||
existing_values
|
||||
end
|
||||
|
||||
@spec return_path(String.t(), MembershipFeeType.t() | nil) :: String.t()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue