From 8ed9adeea0eb3e6d59a28f18ff2c1de4f499f4dd Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 16 Dec 2025 11:59:39 +0100 Subject: [PATCH] fix: preserve form values when only interval field changes - Merge existing form values with new params to prevent field loss - Add get_existing_form_values helper to extract current form state - Fixes issue where name and amount were cleared when selecting interval --- .../live/membership_fee_type_live/form.ex | 71 ++++++++++++++++--- 1 file changed, 63 insertions(+), 8 deletions(-) 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 96611c8..16a3b67 100644 --- a/lib/mv_web/live/membership_fee_type_live/form.ex +++ b/lib/mv_web/live/membership_fee_type_live/form.ex @@ -56,20 +56,35 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do @@ -192,10 +207,27 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do @impl true def handle_event("validate", %{"membership_fee_type" => params}, socket) do - validated_form = AshPhoenix.Form.validate(socket.assigns.form, params) + # Merge with existing form values to preserve unchanged fields + existing_values = get_existing_form_values(socket.assigns.form) + + # Merge existing values with new params (new params take precedence) + merged_params = Map.merge(existing_values, params) + + # Convert interval string to atom if present + merged_params = + if Map.has_key?(merged_params, "interval") && is_binary(merged_params["interval"]) && + merged_params["interval"] != "" do + Map.update!(merged_params, "interval", fn val -> + String.to_existing_atom(val) + end) + else + merged_params + end + + validated_form = AshPhoenix.Form.validate(socket.assigns.form, merged_params) # Check if amount changed on edit - socket = check_amount_change(socket, params) + socket = check_amount_change(socket, merged_params) {:noreply, assign(socket, form: validated_form)} end @@ -289,6 +321,29 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do assign(socket, form: to_form(form)) end + # 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() + + _ -> + # No existing params, return empty map + %{} + end + end + @spec return_path(String.t(), MembershipFeeType.t() | nil) :: String.t() defp return_path("index", _membership_fee_type), do: ~p"/membership_fee_types"