feat(member): let members tailor overview density and visible columns
The View dropdown drives row density and whether the Member and Address fields render as composite cells or split into their underlying columns; the column manager toggles visibility and resets to the curated default. All choices persist per browser through the URL/session/cookie/global chain, so a saved layout survives reloads without a per-account store.
This commit is contained in:
parent
af2cc2e0d4
commit
dfc616257d
21 changed files with 1643 additions and 263 deletions
102
test/mv_web/member_live/index_view_settings_test.exs
Normal file
102
test/mv_web/member_live/index_view_settings_test.exs
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
defmodule MvWeb.MemberLive.IndexViewSettingsTest do
|
||||
@moduledoc """
|
||||
§1.20 — the view-settings dropdown toggles: the composite "Member" and address
|
||||
fields, the "include email" sub-toggle and their effect on the rendered
|
||||
columns. Turning a composite off surfaces the underlying separate columns.
|
||||
§1.2 — email is not in the Member cell by default.
|
||||
"""
|
||||
use MvWeb.ConnCase, async: false
|
||||
|
||||
import Phoenix.LiveViewTest
|
||||
|
||||
alias Mv.Helpers.SystemActor
|
||||
|
||||
setup %{conn: conn} do
|
||||
{:ok, _} =
|
||||
Mv.Membership.create_member(
|
||||
%{
|
||||
first_name: "Ada",
|
||||
last_name: "Lovelace",
|
||||
email: "ada@example.com",
|
||||
street: "Baker Street",
|
||||
house_number: "221",
|
||||
postal_code: "10115",
|
||||
city: "Berlin"
|
||||
},
|
||||
actor: SystemActor.get_system_actor()
|
||||
)
|
||||
|
||||
%{conn: conn_with_oidc_user(conn)}
|
||||
end
|
||||
|
||||
defp open_view_settings(view) do
|
||||
view |> element("[data-testid='view-settings-button']") |> render_click()
|
||||
view
|
||||
end
|
||||
|
||||
test "member cell hides the email line by default", %{conn: conn} do
|
||||
{:ok, view, _html} = live(conn, ~p"/members")
|
||||
|
||||
assert has_element?(view, "[data-testid='member-name']")
|
||||
refute has_element?(view, "[data-testid='member-name-email']")
|
||||
end
|
||||
|
||||
test "the include-email sub-toggle surfaces the email line in the member cell", %{conn: conn} do
|
||||
{:ok, view, _html} = live(conn, ~p"/members")
|
||||
|
||||
open_view_settings(view)
|
||||
view |> element("[data-testid='view-setting-member-include-email']") |> render_click()
|
||||
|
||||
assert has_element?(view, "[data-testid='member-name-email']", "ada@example.com")
|
||||
end
|
||||
|
||||
test "turning off the compact member field shows separate name columns", %{conn: conn} do
|
||||
{:ok, view, _html} = live(conn, ~p"/members")
|
||||
|
||||
open_view_settings(view)
|
||||
view |> element("[data-testid='view-setting-compact-member']") |> render_click()
|
||||
|
||||
refute has_element?(view, "[data-testid='member-name']")
|
||||
assert has_element?(view, "[data-testid='first_name']")
|
||||
assert has_element?(view, "[data-testid='last_name']")
|
||||
# With the composite off, the email is surfaced as its own column.
|
||||
assert has_element?(view, "[data-testid='email']")
|
||||
end
|
||||
|
||||
test "with the compact member field off, the include-email sub-toggle is hidden",
|
||||
%{conn: conn} do
|
||||
{:ok, view, _html} = live(conn, ~p"/members")
|
||||
|
||||
open_view_settings(view)
|
||||
# While the composite Member field is on, the sub-toggle is available.
|
||||
assert has_element?(view, "[data-testid='view-setting-member-include-email']")
|
||||
|
||||
view |> element("[data-testid='view-setting-compact-member']") |> render_click()
|
||||
|
||||
# Once the composite is off, the email is a separate column, so the
|
||||
# in-cell "include email" sub-toggle no longer applies and is hidden.
|
||||
refute has_element?(view, "[data-testid='view-setting-member-include-email']")
|
||||
assert has_element?(view, "[data-testid='email']")
|
||||
end
|
||||
|
||||
test "the compact address field renders a composite address cell by default", %{conn: conn} do
|
||||
{:ok, view, _html} = live(conn, ~p"/members")
|
||||
|
||||
assert has_element?(view, "[data-testid='member-address']")
|
||||
refute has_element?(view, "[data-testid='street']")
|
||||
refute has_element?(view, "[data-testid='postal_code']")
|
||||
refute has_element?(view, "[data-testid='city']")
|
||||
end
|
||||
|
||||
test "turning off the compact address field shows separate address columns", %{conn: conn} do
|
||||
{:ok, view, _html} = live(conn, ~p"/members")
|
||||
|
||||
open_view_settings(view)
|
||||
view |> element("[data-testid='view-setting-compact-address']") |> render_click()
|
||||
|
||||
refute has_element?(view, "[data-testid='member-address']")
|
||||
assert has_element?(view, "[data-testid='street']")
|
||||
assert has_element?(view, "[data-testid='postal_code']")
|
||||
assert has_element?(view, "[data-testid='city']")
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue