From 7171e21a1041a5ebcd22132ddfab3a59e33ad1ed Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 20 Jan 2026 19:12:13 +0100 Subject: [PATCH] feat: load boolean custom fields --- lib/mv_web/live/member_live/index.ex | 7 ++++ test/mv_web/member_live/index_test.exs | 48 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/lib/mv_web/live/member_live/index.ex b/lib/mv_web/live/member_live/index.ex index 8e3d5f1..bba6d8a 100644 --- a/lib/mv_web/live/member_live/index.ex +++ b/lib/mv_web/live/member_live/index.ex @@ -84,6 +84,12 @@ defmodule MvWeb.MemberLive.Index do |> Ash.Query.sort(name: :asc) |> Ash.read!(actor: actor) + # Load boolean custom fields (filtered and sorted from all_custom_fields) + boolean_custom_fields = + all_custom_fields + |> Enum.filter(&(&1.value_type == :boolean)) + |> Enum.sort_by(& &1.name, :asc) + # Load settings once to avoid N+1 queries settings = case Membership.get_settings() do @@ -118,6 +124,7 @@ defmodule MvWeb.MemberLive.Index do |> assign(:settings, settings) |> assign(:custom_fields_visible, custom_fields_visible) |> assign(:all_custom_fields, all_custom_fields) + |> assign(:boolean_custom_fields, boolean_custom_fields) |> assign(:all_available_fields, all_available_fields) |> assign(:user_field_selection, initial_selection) |> assign( diff --git a/test/mv_web/member_live/index_test.exs b/test/mv_web/member_live/index_test.exs index 20cfd68..97dbd39 100644 --- a/test/mv_web/member_live/index_test.exs +++ b/test/mv_web/member_live/index_test.exs @@ -696,6 +696,54 @@ defmodule MvWeb.MemberLive.IndexTest do assert state.socket.assigns.boolean_custom_field_filters == %{} end + test "mount initializes boolean_custom_fields as empty list when no boolean fields exist", %{ + conn: conn + } do + conn = conn_with_oidc_user(conn) + {:ok, view, _html} = live(conn, "/members") + + state = :sys.get_state(view.pid) + assert state.socket.assigns.boolean_custom_fields == [] + end + + test "mount loads and filters boolean custom fields correctly", %{conn: conn} do + conn = conn_with_oidc_user(conn) + + # Create boolean and non-boolean custom fields + boolean_field1 = create_boolean_custom_field(%{name: "Active Member"}) + boolean_field2 = create_boolean_custom_field(%{name: "Newsletter Subscription"}) + _string_field = create_string_custom_field(%{name: "Phone Number"}) + + {:ok, view, _html} = live(conn, "/members") + + state = :sys.get_state(view.pid) + boolean_custom_fields = state.socket.assigns.boolean_custom_fields + + # Should only contain boolean fields + assert length(boolean_custom_fields) == 2 + assert Enum.all?(boolean_custom_fields, &(&1.value_type == :boolean)) + assert Enum.any?(boolean_custom_fields, &(&1.id == boolean_field1.id)) + assert Enum.any?(boolean_custom_fields, &(&1.id == boolean_field2.id)) + end + + test "mount sorts boolean custom fields by name ascending", %{conn: conn} do + conn = conn_with_oidc_user(conn) + + # Create boolean fields with specific names to test sorting + _boolean_field_z = create_boolean_custom_field(%{name: "Zebra Field"}) + _boolean_field_a = create_boolean_custom_field(%{name: "Alpha Field"}) + _boolean_field_m = create_boolean_custom_field(%{name: "Middle Field"}) + + {:ok, view, _html} = live(conn, "/members") + + state = :sys.get_state(view.pid) + boolean_custom_fields = state.socket.assigns.boolean_custom_fields + + # Should be sorted by name ascending + names = Enum.map(boolean_custom_fields, & &1.name) + assert names == ["Alpha Field", "Middle Field", "Zebra Field"] + end + test "handle_params parses bf_ values correctly", %{conn: conn} do conn = conn_with_oidc_user(conn) boolean_field = create_boolean_custom_field()