defmodule MvWeb.MemberLive.Show do @moduledoc """ LiveView for displaying a single member's details. ## Features - Display all member information (personal, contact, address) - Show linked user account (if exists) - Display custom field values - Navigate to edit form - Return to member list ## Displayed Information - Basic: name, email, dates (birth, join, exit) - Contact: phone number - Address: street, house number, postal code, city - Status: paid flag - Relationships: linked user account - Custom: dynamic custom field values from CustomFields ## Navigation - Back to member list - Edit member (with return_to parameter for back navigation) """ use MvWeb, :live_view import Ash.Query @impl true def render(assigns) do ~H""" <.header> {@member.first_name} {@member.last_name} <:subtitle>{gettext("This is a member record from your database.")} <:actions> <.button navigate={~p"/members"} aria-label={gettext("Back to members list")}> <.icon name="hero-arrow-left" /> {gettext("Back to members list")} <.button variant="primary" navigate={~p"/members/#{@member}/edit?return_to=show"}> <.icon name="hero-pencil-square" /> {gettext("Edit Member")} <.list> <:item title={gettext("Id")}>{@member.id} <:item title={gettext("First Name")}>{@member.first_name} <:item title={gettext("Last Name")}>{@member.last_name} <:item title={gettext("Email")}>{@member.email} <:item title={gettext("Birth Date")}>{@member.birth_date} <:item title={gettext("Paid")}> {if @member.paid, do: gettext("Yes"), else: gettext("No")} <:item title={gettext("Phone Number")}>{@member.phone_number} <:item title={gettext("Join Date")}>{@member.join_date} <:item title={gettext("Exit Date")}>{@member.exit_date} <:item title={gettext("Notes")}>{@member.notes} <:item title={gettext("City")}>{@member.city} <:item title={gettext("Street")}>{@member.street} <:item title={gettext("House Number")}>{@member.house_number} <:item title={gettext("Postal Code")}>{@member.postal_code} <:item title={gettext("Linked User")}> <%= if @member.user do %> <.link navigate={~p"/users/#{@member.user}"} class="text-blue-600 hover:text-blue-800 underline" > <.icon name="hero-user" class="h-4 w-4 inline mr-1" /> {@member.user.email} <% else %> {gettext("No user linked")} <% end %>

{gettext("Custom Field Values")}

<.generic_list items={ Enum.map(@member.custom_field_values, fn cfv -> { # name cfv.custom_field && cfv.custom_field.name, # value case cfv.value do %{value: v} -> v v -> v end } end) } />
""" end @impl true def mount(_params, _session, socket) do {:ok, socket} end @impl true def handle_params(%{"id" => id}, _, socket) do query = Mv.Membership.Member |> filter(id == ^id) |> load([:user, custom_field_values: [:custom_field]]) member = Ash.read_one!(query) {:noreply, socket |> assign(:page_title, page_title(socket.assigns.live_action)) |> assign(:member, member)} end defp page_title(:show), do: gettext("Show Member") defp page_title(:edit), do: gettext("Edit Member") end