From 27b9cbe8149e86a85aff09b73f1272e5a9e872f4 Mon Sep 17 00:00:00 2001 From: Moritz Date: Mon, 23 Feb 2026 22:11:11 +0100 Subject: [PATCH] Member form: required per field from settings and Vereinfacht Load settings, build member_field_required_map and pass required to inputs for asterisk, tooltip and validation. --- lib/mv_web/live/member_live/form.ex | 93 +++++++++++++++++++++++++---- 1 file changed, 83 insertions(+), 10 deletions(-) diff --git a/lib/mv_web/live/member_live/form.ex b/lib/mv_web/live/member_live/form.ex index 7c138c4..6b3ce67 100644 --- a/lib/mv_web/live/member_live/form.ex +++ b/lib/mv_web/live/member_live/form.ex @@ -23,6 +23,8 @@ defmodule MvWeb.MemberLive.Form do import MvWeb.LiveHelpers, only: [current_actor: 1, submit_form: 3] + alias Mv.Membership + alias Mv.Membership.Helpers.VisibilityConfig alias Mv.MembershipFees alias Mv.MembershipFees.MembershipFeeType alias MvWeb.Helpers.MembershipFeeHelpers @@ -84,30 +86,54 @@ defmodule MvWeb.MemberLive.Form do <%!-- Name Row --%>
- <.input field={@form[:first_name]} label={gettext("First Name")} /> + <.input + field={@form[:first_name]} + label={gettext("First Name")} + required={@member_field_required_map[:first_name]} + />
- <.input field={@form[:last_name]} label={gettext("Last Name")} /> + <.input + field={@form[:last_name]} + label={gettext("Last Name")} + required={@member_field_required_map[:last_name]} + />
<%!-- Address Row --%>
- <.input field={@form[:street]} label={gettext("Street")} /> + <.input + field={@form[:street]} + label={gettext("Street")} + required={@member_field_required_map[:street]} + />
- <.input field={@form[:house_number]} label={gettext("Nr.")} /> + <.input + field={@form[:house_number]} + label={gettext("Nr.")} + required={@member_field_required_map[:house_number]} + />
- <.input field={@form[:postal_code]} label={gettext("Postal Code")} /> + <.input + field={@form[:postal_code]} + label={gettext("Postal Code")} + required={@member_field_required_map[:postal_code]} + />
- <.input field={@form[:city]} label={gettext("City")} /> + <.input + field={@form[:city]} + label={gettext("City")} + required={@member_field_required_map[:city]} + />
- <%!-- Email --%> + <%!-- Email (always required) --%>
<.input field={@form[:email]} label={gettext("Email")} required type="email" />
@@ -115,16 +141,31 @@ defmodule MvWeb.MemberLive.Form do <%!-- Membership Dates Row --%>
- <.input field={@form[:join_date]} label={gettext("Join Date")} type="date" /> + <.input + field={@form[:join_date]} + label={gettext("Join Date")} + type="date" + required={@member_field_required_map[:join_date]} + />
- <.input field={@form[:exit_date]} label={gettext("Exit Date")} type="date" /> + <.input + field={@form[:exit_date]} + label={gettext("Exit Date")} + type="date" + required={@member_field_required_map[:exit_date]} + />
<%!-- Notes --%>
- <.input field={@form[:notes]} label={gettext("Notes")} type="textarea" /> + <.input + field={@form[:notes]} + label={gettext("Notes")} + type="textarea" + required={@member_field_required_map[:notes]} + />
@@ -254,6 +295,9 @@ defmodule MvWeb.MemberLive.Form do # Load available membership fee types available_fee_types = load_available_fee_types(member, actor) + # Load settings to know which member fields are required (for asterisk/tooltip) + member_field_required_map = get_member_field_required_map() + {:ok, socket |> assign(:return_to, return_to(params["return_to"])) @@ -263,9 +307,38 @@ defmodule MvWeb.MemberLive.Form do |> assign(:page_title, page_title) |> assign(:available_fee_types, available_fee_types) |> assign(:interval_warning, nil) + |> assign(:member_field_required_map, member_field_required_map) |> assign_form()} end + defp get_member_field_required_map do + vereinfacht_required? = Mv.Config.vereinfacht_configured?() + + case Membership.get_settings() do + {:ok, settings} -> + required_config = settings.member_field_required || %{} + normalized = VisibilityConfig.normalize(required_config) + + Mv.Constants.member_fields() + |> Enum.map(fn field -> + required = + field == :email || + (vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(field)) || + Map.get(normalized, field, false) + + {field, required} + end) + |> Map.new() + + {:error, _} -> + # Email always required; Vereinfacht fields when integration active + Map.new(Mv.Constants.member_fields(), fn f -> + {f, + f == :email || (vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(f))} + end) + end + end + defp return_to("show"), do: "show" defp return_to(_), do: "index"