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 0025974..4054dfb 100644 --- a/lib/mv_web/live/membership_fee_type_live/form.ex +++ b/lib/mv_web/live/membership_fee_type_live/form.ex @@ -44,6 +44,7 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do field={@form[:amount]} label={gettext("Amount")} required + phx-debounce="blur" />
@@ -257,11 +258,15 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do def handle_event("confirm_amount_change", _params, socket) do # Update form with pending amount and hide warning + # Preserve all existing form values (name, description, etc.) form = socket.assigns.form + existing_values = get_existing_form_values(form) updated_form = if socket.assigns.pending_amount do - AshPhoenix.Form.validate(form, %{"amount" => socket.assigns.pending_amount}) + # Merge existing values with confirmed amount to preserve all fields + merged_params = Map.put(existing_values, "amount", socket.assigns.pending_amount) + AshPhoenix.Form.validate(form, merged_params) else form end @@ -357,7 +362,20 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do # Checks if amount changed and updates socket assigns accordingly defp check_amount_change(socket, params) do if socket.assigns.membership_fee_type && Map.has_key?(params, "amount") do - handle_amount_change(socket, params["amount"], socket.assigns.membership_fee_type.amount) + # Get current amount from form and new amount from params + current_form_amount = get_existing_form_values(socket.assigns.form)["amount"] + new_amount_str = params["amount"] + + # Only check amount change if amount field is actually being changed in this validation + # This prevents re-triggering the warning when other fields (name, description) are edited + if current_form_amount != new_amount_str do + handle_amount_change(socket, new_amount_str, socket.assigns.membership_fee_type.amount) + else + # Amount didn't change in this validation - keep current warning state + # If warning was already confirmed (pending_amount is nil and show_amount_warning is false), keep it hidden + # If warning is shown but not confirmed, keep it shown + socket + end else socket end @@ -379,8 +397,17 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do end # Shows amount change warning with affected member count + # Only calculates count if warning is being shown for the first time (false -> true) defp show_amount_warning(socket, old_amount, new_amount, new_amount_str) do - affected_count = get_affected_member_count(socket.assigns.membership_fee_type.id) + # Only calculate count if warning is not already shown (optimization) + affected_count = + if socket.assigns.show_amount_warning do + # Warning already shown, reuse existing count + socket.assigns.affected_member_count + else + # Warning being shown for first time, calculate count + get_affected_member_count(socket.assigns.membership_fee_type.id) + end socket |> assign(:show_amount_warning, true)