feat: adds email as fallback for name in member details
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
74a2d07c24
commit
b59a4ef61a
10 changed files with 212 additions and 10 deletions
|
|
@ -36,7 +36,7 @@ defmodule MvWeb.ContributionPeriodLive.Show do
|
|||
<.mockup_warning />
|
||||
|
||||
<.header>
|
||||
{gettext("Contributions for %{name}", name: "#{@member.first_name} #{@member.last_name}")}
|
||||
{gettext("Contributions for %{name}", name: MvWeb.MemberLive.Index.display_name(@member))}
|
||||
<:subtitle>
|
||||
{gettext("Contribution type")}:
|
||||
<span class="font-semibold">{@member.contribution_type}</span>
|
||||
|
|
|
|||
|
|
@ -289,6 +289,6 @@ defmodule MvWeb.CustomFieldValueLive.Form do
|
|||
end
|
||||
|
||||
defp member_options(members) do
|
||||
Enum.map(members, &{"#{&1.first_name} #{&1.last_name}", &1.id})
|
||||
Enum.map(members, &{MvWeb.MemberLive.Index.display_name(&1), &1.id})
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ defmodule MvWeb.MemberLive.Form do
|
|||
|
||||
<h1 class="text-2xl font-bold text-center flex-1">
|
||||
<%= if @member do %>
|
||||
{@member.first_name} {@member.last_name}
|
||||
{MvWeb.MemberLive.Index.display_name(@member)}
|
||||
<% else %>
|
||||
{gettext("New Member")}
|
||||
<% end %>
|
||||
|
|
|
|||
|
|
@ -1165,6 +1165,62 @@ defmodule MvWeb.MemberLive.Index do
|
|||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns a display name for a member.
|
||||
|
||||
Combines first_name and last_name if available, otherwise falls back to email.
|
||||
This ensures that members without names still have a meaningful display name.
|
||||
|
||||
## Examples
|
||||
|
||||
iex> member = %Member{first_name: "John", last_name: "Doe", email: "john@example.com"}
|
||||
iex> display_name(member)
|
||||
"John Doe"
|
||||
|
||||
iex> member = %Member{first_name: nil, last_name: nil, email: "john@example.com"}
|
||||
iex> display_name(member)
|
||||
"john@example.com"
|
||||
|
||||
iex> member = %Member{first_name: "John", last_name: nil, email: "john@example.com"}
|
||||
iex> display_name(member)
|
||||
"John"
|
||||
"""
|
||||
def display_name(member) do
|
||||
name_parts =
|
||||
[member.first_name, member.last_name]
|
||||
|> Enum.reject(&blank?/1)
|
||||
|> Enum.map(&String.trim/1)
|
||||
|> Enum.join(" ")
|
||||
|
||||
if name_parts == "" do
|
||||
member.email
|
||||
else
|
||||
name_parts
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Checks if a value is blank (nil, empty string, or only whitespace).
|
||||
|
||||
## Examples
|
||||
|
||||
iex> blank?(nil)
|
||||
true
|
||||
|
||||
iex> blank?("")
|
||||
true
|
||||
|
||||
iex> blank?(" ")
|
||||
true
|
||||
|
||||
iex> blank?("John")
|
||||
false
|
||||
"""
|
||||
def blank?(nil), do: true
|
||||
def blank?(""), do: true
|
||||
def blank?(value) when is_binary(value), do: String.trim(value) == ""
|
||||
def blank?(_), do: false
|
||||
|
||||
# Public helper function to format dates for use in templates
|
||||
def format_date(date), do: DateFormatter.format_date(date)
|
||||
|
||||
|
|
|
|||
|
|
@ -129,7 +129,12 @@
|
|||
"""
|
||||
}
|
||||
>
|
||||
{member.first_name}
|
||||
{if MvWeb.MemberLive.Index.blank?(member.first_name) &&
|
||||
MvWeb.MemberLive.Index.blank?(member.last_name) do
|
||||
MvWeb.MemberLive.Index.display_name(member)
|
||||
else
|
||||
member.first_name
|
||||
end}
|
||||
</:col>
|
||||
<:col
|
||||
:let={member}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ defmodule MvWeb.MemberLive.Show do
|
|||
</.button>
|
||||
|
||||
<h1 class="text-2xl font-bold text-center flex-1">
|
||||
{@member.first_name} {@member.last_name}
|
||||
{MvWeb.MemberLive.Index.display_name(@member)}
|
||||
</h1>
|
||||
|
||||
<.button variant="primary" navigate={~p"/members/#{@member}/edit?return_to=show"}>
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ defmodule MvWeb.UserLive.Form do
|
|||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="font-medium text-green-900">
|
||||
{@user.member.first_name} {@user.member.last_name}
|
||||
{MvWeb.MemberLive.Index.display_name(@user.member)}
|
||||
</p>
|
||||
<p class="text-sm text-green-700">{@user.member.email}</p>
|
||||
</div>
|
||||
|
|
@ -210,7 +210,7 @@ defmodule MvWeb.UserLive.Form do
|
|||
)
|
||||
]}
|
||||
>
|
||||
<p class="font-medium">{member.first_name} {member.last_name}</p>
|
||||
<p class="font-medium">{MvWeb.MemberLive.Index.display_name(member)}</p>
|
||||
<p class="text-sm text-base-content/70">{member.email}</p>
|
||||
</div>
|
||||
<% end %>
|
||||
|
|
@ -438,7 +438,7 @@ defmodule MvWeb.UserLive.Form do
|
|||
|
||||
member_name =
|
||||
if selected_member,
|
||||
do: "#{selected_member.first_name} #{selected_member.last_name}",
|
||||
do: MvWeb.MemberLive.Index.display_name(selected_member),
|
||||
else: ""
|
||||
|
||||
# Store the selected member ID and name in socket state and clear unlink flag
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
</:col>
|
||||
<:col :let={user} label={gettext("Linked Member")}>
|
||||
<%= if user.member do %>
|
||||
{user.member.first_name} {user.member.last_name}
|
||||
{MvWeb.MemberLive.Index.display_name(user.member)}
|
||||
<% else %>
|
||||
<span class="text-base-content/50">{gettext("No member linked")}</span>
|
||||
<% end %>
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ defmodule MvWeb.UserLive.Show do
|
|||
class="text-blue-600 underline hover:text-blue-800"
|
||||
>
|
||||
<.icon name="hero-users" class="inline w-4 h-4 mr-1" />
|
||||
{@user.member.first_name} {@user.member.last_name}
|
||||
{MvWeb.MemberLive.Index.display_name(@user.member)}
|
||||
</.link>
|
||||
<% else %>
|
||||
<span class="italic text-gray-500">{gettext("No member linked")}</span>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue