Improve UX of join requests and fix minor bugs #492

Merged
simon merged 12 commits from bugfix/480-fix-minor-bugs into main 2026-05-06 14:34:44 +02:00
2 changed files with 89 additions and 7 deletions
Showing only changes of commit 0159d5352a - Show all commits

View file

@ -156,14 +156,16 @@ defmodule MvWeb.JoinRequestLive.Show do
label={gettext("Submitted at")} label={gettext("Submitted at")}
value={DateFormatter.format_datetime(@join_request.submitted_at, @browser_timezone)} value={DateFormatter.format_datetime(@join_request.submitted_at, @browser_timezone)}
/> />
<div class="flex gap-2"> <dl class="grid gap-1 md:grid-cols-[14rem_minmax(0,1fr)] md:gap-2">
<span class="text-base-content/60 min-w-32 shrink-0">{gettext("Status")}:</span> <dt class="m-0 text-base-content/60 whitespace-normal break-words">
<span> {gettext("Status")}:
</dt>
<dd class="m-0 min-w-0">
<.badge variant={JoinRequestHelpers.status_badge_variant(@join_request.status)}> <.badge variant={JoinRequestHelpers.status_badge_variant(@join_request.status)}>
{JoinRequestHelpers.format_status(@join_request.status)} {JoinRequestHelpers.format_status(@join_request.status)}
</.badge> </.badge>
</span> </dd>
</div> </dl>
<%= if @join_request.status in [:approved, :rejected] do %> <%= if @join_request.status in [:approved, :rejected] do %>
<%= if @join_request.approved_at do %> <%= if @join_request.approved_at do %>
<.field_row <.field_row
@ -285,11 +287,38 @@ defmodule MvWeb.JoinRequestLive.Show do
defp format_applicant_value(value) when is_boolean(value), defp format_applicant_value(value) when is_boolean(value),
do: if(value, do: gettext("Yes"), else: gettext("No")) do: if(value, do: gettext("Yes"), else: gettext("No"))
defp format_applicant_value(value) when is_binary(value) or is_number(value), defp format_applicant_value(value) when is_binary(value),
do: to_string(value) do: format_binary_applicant_value(value)
defp format_applicant_value(value) when is_number(value), do: to_string(value)
defp format_applicant_value(value), do: to_string(value) defp format_applicant_value(value), do: to_string(value)
defp format_binary_applicant_value(value) do
trimmed_value = String.trim(value)
cond do
trimmed_value == "" ->
nil
String.downcase(trimmed_value) in ["on", "true", "1"] ->
gettext("Yes")
String.downcase(trimmed_value) in ["off", "false", "0"] ->
gettext("No")
true ->
format_iso_date_string(trimmed_value)
end
end
defp format_iso_date_string(value) do
case Date.from_iso8601(value) do
{:ok, date} -> DateFormatter.format_date(date)
_ -> value
end
end
defp format_applicant_value_from_map(value) do defp format_applicant_value_from_map(value) do
raw = Map.get(value, "_union_value") || Map.get(value, "value") raw = Map.get(value, "_union_value") || Map.get(value, "value")
type = Map.get(value, "_union_type") || Map.get(value, "type") type = Map.get(value, "_union_type") || Map.get(value, "type")

View file

@ -11,6 +11,7 @@ defmodule MvWeb.JoinRequestLive.ShowTest do
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership alias Mv.Membership
alias MvWeb.Helpers.DateFormatter
setup do setup do
{:ok, settings} = Membership.get_settings() {:ok, settings} = Membership.get_settings()
@ -67,5 +68,57 @@ defmodule MvWeb.JoinRequestLive.ShowTest do
assert has_element?(view, "dd", "Alice Example") assert has_element?(view, "dd", "Alice Example")
refute has_element?(view, "dt", "#{custom_field.id}:") refute has_element?(view, "dt", "#{custom_field.id}:")
end end
@tag role: :normal_user
test "formats boolean/date values and renders status in aligned row", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
{:ok, settings} = Membership.get_settings()
{:ok, boolean_field} =
Membership.create_custom_field(
%{
name: "Privacy accepted",
value_type: :boolean
},
actor: system_actor
)
{:ok, date_field} =
Membership.create_custom_field(
%{
name: "Birth date",
value_type: :date
},
actor: system_actor
)
{:ok, _} =
Membership.update_settings(settings, %{
join_form_enabled: true,
join_form_field_ids: ["email", boolean_field.id, date_field.id],
join_form_field_required: %{
"email" => true,
boolean_field.id => false,
date_field.id => false
}
})
join_request =
Fixtures.submitted_join_request_fixture(%{
form_data: %{
boolean_field.id => "on",
date_field.id => "2000-01-12"
}
})
{:ok, view, _html} = live(conn, "/join_requests/#{join_request.id}")
assert has_element?(view, "dt", "Privacy accepted:")
assert has_element?(view, "dd", "Yes")
assert has_element?(view, "dt", "Birth date:")
assert has_element?(view, "dd", DateFormatter.format_date(~D[2000-01-12]))
assert has_element?(view, "dt", "Status:")
assert has_element?(view, "dd", "Submitted")
end
end end
end end