Membership Fee 6 - UI Components & LiveViews closes #280 #304
1 changed files with 63 additions and 8 deletions
|
|
@ -56,20 +56,35 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do
|
||||||
<select
|
<select
|
||||||
class="select select-bordered w-full"
|
class="select select-bordered w-full"
|
||||||
disabled={!is_nil(@membership_fee_type)}
|
disabled={!is_nil(@membership_fee_type)}
|
||||||
name="interval"
|
name="membership_fee_type[interval]"
|
||||||
value={@form[:interval].value || ""}
|
id="membership-fee-type-form_interval"
|
||||||
|
phx-change="validate"
|
||||||
>
|
>
|
||||||
<option value="">{gettext("Select interval")}</option>
|
<option value="">{gettext("Select interval")}</option>
|
||||||
<option value="monthly" selected={@form[:interval].value == :monthly}>
|
<option
|
||||||
|
value="monthly"
|
||||||
|
selected={@form[:interval].value == :monthly || @form[:interval].value == "monthly"}
|
||||||
|
>
|
||||||
{gettext("Monthly")}
|
{gettext("Monthly")}
|
||||||
</option>
|
</option>
|
||||||
<option value="quarterly" selected={@form[:interval].value == :quarterly}>
|
<option
|
||||||
|
value="quarterly"
|
||||||
|
selected={@form[:interval].value == :quarterly || @form[:interval].value == "quarterly"}
|
||||||
|
>
|
||||||
{gettext("Quarterly")}
|
{gettext("Quarterly")}
|
||||||
</option>
|
</option>
|
||||||
<option value="half_yearly" selected={@form[:interval].value == :half_yearly}>
|
<option
|
||||||
|
value="half_yearly"
|
||||||
|
selected={
|
||||||
|
@form[:interval].value == :half_yearly || @form[:interval].value == "half_yearly"
|
||||||
|
}
|
||||||
|
>
|
||||||
{gettext("Half-yearly")}
|
{gettext("Half-yearly")}
|
||||||
</option>
|
</option>
|
||||||
<option value="yearly" selected={@form[:interval].value == :yearly}>
|
<option
|
||||||
|
value="yearly"
|
||||||
|
selected={@form[:interval].value == :yearly || @form[:interval].value == "yearly"}
|
||||||
|
>
|
||||||
{gettext("Yearly")}
|
{gettext("Yearly")}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
@ -192,10 +207,27 @@ 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
|
||||||
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
|
# 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)}
|
{:noreply, assign(socket, form: validated_form)}
|
||||||
end
|
end
|
||||||
|
|
@ -289,6 +321,29 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do
|
||||||
assign(socket, form: to_form(form))
|
assign(socket, form: to_form(form))
|
||||||
end
|
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()
|
@spec return_path(String.t(), MembershipFeeType.t() | nil) :: String.t()
|
||||||
defp return_path("index", _membership_fee_type), do: ~p"/membership_fee_types"
|
defp return_path("index", _membership_fee_type), do: ~p"/membership_fee_types"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue