fix: extract form values directly from form fields to preserve them

- 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
This commit is contained in:
Moritz 2025-12-16 12:10:25 +01:00
parent aece03c9c2
commit 4c66628802
Signed by: moritz
GPG key ID: 1020A035E5DD0824

View file

@ -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()