Membership Fee 6 - UI Components & LiveViews closes #280 #304

Open
moritz wants to merge 65 commits from feature/280_membership_fee_ui into main
Showing only changes of commit 4c66628802 - Show all commits

View file

@ -208,6 +208,7 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do
@impl true @impl true
def handle_event("validate", %{"membership_fee_type" => params}, socket) do def handle_event("validate", %{"membership_fee_type" => params}, socket) do
# Merge with existing form values to preserve unchanged fields # 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) existing_values = get_existing_form_values(socket.assigns.form)
# Merge existing values with new params (new params take precedence) # 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 # Helper to extract existing form values to preserve them when only one field changes
defp get_existing_form_values(form) do defp get_existing_form_values(form) do
# Get current form values from the form source # Extract values directly from form fields to get current state
case form.source.params do # This ensures we get the actual current values, not just initial params
%{"membership_fee_type" => existing_params} when is_map(existing_params) -> existing_values = %{}
# 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()
_ -> existing_values =
# No existing params, return empty map if form[:name] && form[:name].value do
%{} Map.put(existing_values, "name", to_string(form[:name].value))
else
existing_values
end 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 end
@spec return_path(String.t(), MembershipFeeType.t() | nil) :: String.t() @spec return_path(String.t(), MembershipFeeType.t() | nil) :: String.t()