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