diff --git a/lib/membership/membership.ex b/lib/membership/membership.ex index c711bcd..982b837 100644 --- a/lib/membership/membership.ex +++ b/lib/membership/membership.ex @@ -57,6 +57,9 @@ defmodule Mv.Membership do # Settings should be created via seed script define :update_settings, action: :update define :update_member_field_visibility, action: :update_member_field_visibility + + define :update_single_member_field_visibility, + action: :update_single_member_field_visibility end end @@ -186,4 +189,42 @@ defmodule Mv.Membership do }) |> Ash.update(domain: __MODULE__) end + + @doc """ + Atomically updates a single field in the member field visibility configuration. + + This action uses PostgreSQL's jsonb_set function to atomically update a single key + in the JSONB map, preventing lost updates in concurrent scenarios. This is the + preferred method for updating individual field visibility settings. + + ## Parameters + + - `settings` - The settings record to update + - `field` - The member field name as a string (e.g., "street", "house_number") + - `show_in_overview` - Boolean value indicating visibility + + ## Returns + + - `{:ok, updated_settings}` - Successfully updated settings + - `{:error, error}` - Validation or update error + + ## Examples + + iex> {:ok, settings} = Mv.Membership.get_settings() + iex> {:ok, updated} = Mv.Membership.update_single_member_field_visibility(settings, field: "street", show_in_overview: false) + iex> updated.member_field_visibility["street"] + false + + """ + def update_single_member_field_visibility(settings, + field: field, + show_in_overview: show_in_overview + ) do + settings + |> Ash.Changeset.new() + |> Ash.Changeset.set_argument(:field, field) + |> Ash.Changeset.set_argument(:show_in_overview, show_in_overview) + |> Ash.Changeset.for_update(:update_single_member_field_visibility, %{}) + |> Ash.update(domain: __MODULE__) + end end diff --git a/lib/mv_web/components/core_components.ex b/lib/mv_web/components/core_components.ex index ccec5a5..45bcae0 100644 --- a/lib/mv_web/components/core_components.ex +++ b/lib/mv_web/components/core_components.ex @@ -692,10 +692,11 @@ defmodule MvWeb.CoreComponents do """ attr :name, :string, required: true attr :class, :string, default: "size-4" + attr :rest, :global, include: ~w(aria-hidden) def icon(%{name: "hero-" <> _} = assigns) do ~H""" - + """ end