diff --git a/lib/mv_web/live/membership_fee_type_live/form.ex b/lib/mv_web/live/membership_fee_type_live/form.ex index 16a3b67..5a1d1d8 100644 --- a/lib/mv_web/live/membership_fee_type_live/form.ex +++ b/lib/mv_web/live/membership_fee_type_live/form.ex @@ -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()