fix: normalize checkbox value and improve UI layout

- Normalize checkbox 'on' value to boolean true in settings
- Change Payment Data layout to flex-nowrap for horizontal display
- Replace membership fee type dropdown with display-only view
- Fix tests to use correct button selectors and switch to membership fees tab
This commit is contained in:
Moritz 2025-12-16 12:32:04 +01:00
parent 3f723a3c3a
commit 803d9a0a94
Signed by: moritz
GPG key ID: 1020A035E5DD0824
10 changed files with 262 additions and 91 deletions

View file

@ -168,7 +168,7 @@ defmodule MvWeb.MemberLive.Show do
<div class="max-w-xl">
<.section_box title={gettext("Payment Data")}>
<%= if @member.membership_fee_type do %>
<div class="flex gap-6 flex-wrap">
<div class="flex gap-6 flex-nowrap overflow-x-auto">
<.data_field
label={gettext("Type")}
value={@member.membership_fee_type.name}

View file

@ -24,31 +24,22 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do
~H"""
<div id={@id}>
<.section_box title={gettext("Membership Fees")}>
<%!-- Membership Fee Type Selection --%>
<%!-- Membership Fee Type Display --%>
<div class="mb-6">
<label class="label">
<span class="label-text font-semibold">{gettext("Membership Fee Type")}</span>
</label>
<select
class="select select-bordered w-full max-w-xs"
phx-change="change_membership_fee_type"
phx-target={@myself}
value={@member.membership_fee_type_id || ""}
>
<option value="">{gettext("None")}</option>
<%= for fee_type <- @available_fee_types do %>
<option value={fee_type.id} selected={fee_type.id == @member.membership_fee_type_id}>
{fee_type.name} ({MembershipFeeHelpers.format_currency(fee_type.amount)}, {MembershipFeeHelpers.format_interval(
fee_type.interval
<%= if @member.membership_fee_type do %>
<div class="flex items-center gap-2">
<span class="font-medium">{@member.membership_fee_type.name}</span>
<span class="text-base-content/60">
({MembershipFeeHelpers.format_currency(@member.membership_fee_type.amount)}, {MembershipFeeHelpers.format_interval(
@member.membership_fee_type.interval
)})
</option>
<% end %>
</select>
<%= if @interval_warning do %>
<div class="alert alert-warning mt-2">
<.icon name="hero-exclamation-triangle" class="size-5" />
<span>{@interval_warning}</span>
</span>
</div>
<% else %>
<span class="text-base-content/60 italic">{gettext("No membership fee type assigned")}</span>
<% end %>
</div>

View file

@ -30,11 +30,39 @@ defmodule MvWeb.MembershipFeeSettingsLive do
@impl true
def handle_event("validate", %{"settings" => params}, socket) do
{:noreply, assign(socket, form: AshPhoenix.Form.validate(socket.assigns.form, params))}
# Normalize checkbox value: "on" -> true, missing -> false
normalized_params =
if Map.has_key?(params, "include_joining_cycle") do
params
|> Map.update("include_joining_cycle", false, fn
"on" -> true
"true" -> true
true -> true
_ -> false
end)
else
Map.put(params, "include_joining_cycle", false)
end
{:noreply, assign(socket, form: AshPhoenix.Form.validate(socket.assigns.form, normalized_params))}
end
def handle_event("save", %{"settings" => params}, socket) do
case AshPhoenix.Form.submit(socket.assigns.form, params: params) do
# Normalize checkbox value: "on" -> true, missing -> false
normalized_params =
if Map.has_key?(params, "include_joining_cycle") do
params
|> Map.update("include_joining_cycle", false, fn
"on" -> true
"true" -> true
true -> true
_ -> false
end)
else
Map.put(params, "include_joining_cycle", false)
end
case AshPhoenix.Form.submit(socket.assigns.form, params: normalized_params) do
{:ok, updated_settings} ->
{:noreply,
socket