Add boolean custom field filters to member overview closes #309 #362
2 changed files with 114 additions and 0 deletions
|
|
@ -263,5 +263,38 @@ defmodule MvWeb.Components.MemberFilterComponentTest do
|
||||||
# (String fields should not appear in boolean filter section)
|
# (String fields should not appear in boolean filter section)
|
||||||
refute dropdown_html =~ "String Field"
|
refute dropdown_html =~ "String Field"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "dropdown shows scrollbar when many boolean custom fields exist", %{conn: conn} do
|
||||||
|
conn = conn_with_oidc_user(conn)
|
||||||
|
|
||||||
|
# Create 15 boolean custom fields (more than typical, should trigger scrollbar)
|
||||||
|
boolean_fields =
|
||||||
|
Enum.map(1..15, fn i ->
|
||||||
|
create_boolean_custom_field(%{name: "Field #{i}"})
|
||||||
|
end)
|
||||||
|
|
||||||
|
{:ok, view, _html} = live(conn, "/members")
|
||||||
|
|
||||||
|
# Open dropdown
|
||||||
|
view
|
||||||
|
|> element("#member-filter button[aria-haspopup='true']")
|
||||||
|
|> render_click()
|
||||||
|
|
||||||
|
# Extract dropdown panel HTML
|
||||||
|
dropdown_html =
|
||||||
|
view
|
||||||
|
|> element("#member-filter div[role='dialog']")
|
||||||
|
|> render()
|
||||||
|
|
||||||
|
# Should have scrollbar classes: max-h-60 overflow-y-auto pr-2
|
||||||
|
# Check for the scrollable container (the div with max-h-60 and overflow-y-auto)
|
||||||
|
assert dropdown_html =~ "max-h-60"
|
||||||
|
assert dropdown_html =~ "overflow-y-auto"
|
||||||
|
|
||||||
|
# Verify all fields are present in the dropdown
|
||||||
|
Enum.each(boolean_fields, fn field ->
|
||||||
|
assert dropdown_html =~ field.name
|
||||||
|
end)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1525,5 +1525,86 @@ defmodule MvWeb.MemberLive.IndexTest do
|
||||||
assert html =~ "TrueMember"
|
assert html =~ "TrueMember"
|
||||||
refute html =~ "FalseMember"
|
refute html =~ "FalseMember"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "boolean custom field appears in filter dropdown after being added", %{conn: conn} do
|
||||||
|
conn = conn_with_oidc_user(conn)
|
||||||
|
|
||||||
|
# Start with no boolean custom fields
|
||||||
|
{:ok, view, _html} = live(conn, "/members")
|
||||||
|
|
||||||
|
state_before = :sys.get_state(view.pid)
|
||||||
|
boolean_fields_before = state_before.socket.assigns.boolean_custom_fields
|
||||||
|
assert length(boolean_fields_before) == 0
|
||||||
|
|
||||||
|
# Create a new boolean custom field
|
||||||
|
new_boolean_field = create_boolean_custom_field(%{name: "Newly Added Field"})
|
||||||
|
|
||||||
|
# Navigate again - the new field should appear
|
||||||
|
{:ok, view2, _html} = live(conn, "/members")
|
||||||
|
|
||||||
|
state_after = :sys.get_state(view2.pid)
|
||||||
|
boolean_fields_after = state_after.socket.assigns.boolean_custom_fields
|
||||||
|
|
||||||
|
# New boolean field should be present
|
||||||
|
assert length(boolean_fields_after) == 1
|
||||||
|
assert Enum.any?(boolean_fields_after, &(&1.id == new_boolean_field.id))
|
||||||
|
assert Enum.any?(boolean_fields_after, &(&1.name == "Newly Added Field"))
|
||||||
|
end
|
||||||
|
|
||||||
|
test "boolean filter performance with 150 members", %{conn: conn} do
|
||||||
|
conn = conn_with_oidc_user(conn)
|
||||||
|
boolean_field = create_boolean_custom_field()
|
||||||
|
|
||||||
|
# Create 150 members - 75 with true, 75 with false
|
||||||
|
members_with_true =
|
||||||
|
Enum.map(1..75, fn i ->
|
||||||
|
create_member_with_boolean_value(
|
||||||
|
%{
|
||||||
|
first_name: "TrueMember#{i}",
|
||||||
|
email: "truemember#{i}@example.com"
|
||||||
|
},
|
||||||
|
boolean_field,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
end)
|
||||||
|
|
||||||
|
members_with_false =
|
||||||
|
Enum.map(1..75, fn i ->
|
||||||
|
create_member_with_boolean_value(
|
||||||
|
%{
|
||||||
|
first_name: "FalseMember#{i}",
|
||||||
|
email: "falsemember#{i}@example.com"
|
||||||
|
},
|
||||||
|
boolean_field,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
end)
|
||||||
|
|
||||||
|
# Verify all members were created
|
||||||
|
assert length(members_with_true) == 75
|
||||||
|
assert length(members_with_false) == 75
|
||||||
|
|
||||||
|
# Test filter performance - should complete in reasonable time (< 1 second)
|
||||||
|
start_time = System.monotonic_time(:millisecond)
|
||||||
|
|
||||||
|
{:ok, _view, html} =
|
||||||
|
live(conn, "/members?bf_#{boolean_field.id}=true")
|
||||||
|
|
||||||
|
end_time = System.monotonic_time(:millisecond)
|
||||||
|
duration = end_time - start_time
|
||||||
|
|
||||||
|
# Should complete in less than 1 second (1000ms)
|
||||||
|
assert duration < 1000, "Filter took #{duration}ms, expected < 1000ms"
|
||||||
|
|
||||||
|
# Verify filtering worked correctly - should show all true members
|
||||||
|
Enum.each(1..75, fn i ->
|
||||||
|
assert html =~ "TrueMember#{i}"
|
||||||
|
end)
|
||||||
|
|
||||||
|
# Should not show false members
|
||||||
|
Enum.each(1..75, fn i ->
|
||||||
|
refute html =~ "FalseMember#{i}"
|
||||||
|
end)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue