diff --git a/lib/mv_web/live/join_request_live/show.ex b/lib/mv_web/live/join_request_live/show.ex index cdc6521..644dbbe 100644 --- a/lib/mv_web/live/join_request_live/show.ex +++ b/lib/mv_web/live/join_request_live/show.ex @@ -156,14 +156,16 @@ defmodule MvWeb.JoinRequestLive.Show do label={gettext("Submitted at")} value={DateFormatter.format_datetime(@join_request.submitted_at, @browser_timezone)} /> -
- {gettext("Status")}: - +
+
+ {gettext("Status")}: +
+
<.badge variant={JoinRequestHelpers.status_badge_variant(@join_request.status)}> {JoinRequestHelpers.format_status(@join_request.status)} - -
+ + <%= if @join_request.status in [:approved, :rejected] do %> <%= if @join_request.approved_at do %> <.field_row @@ -285,11 +287,38 @@ defmodule MvWeb.JoinRequestLive.Show do defp format_applicant_value(value) when is_boolean(value), do: if(value, do: gettext("Yes"), else: gettext("No")) - defp format_applicant_value(value) when is_binary(value) or is_number(value), - do: to_string(value) + defp format_applicant_value(value) when is_binary(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_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 raw = Map.get(value, "_union_value") || Map.get(value, "value") type = Map.get(value, "_union_type") || Map.get(value, "type") diff --git a/test/mv_web/live/join_request_live/show_test.exs b/test/mv_web/live/join_request_live/show_test.exs index 5497d22..40d5d5d 100644 --- a/test/mv_web/live/join_request_live/show_test.exs +++ b/test/mv_web/live/join_request_live/show_test.exs @@ -11,6 +11,7 @@ defmodule MvWeb.JoinRequestLive.ShowTest do alias Mv.Fixtures alias Mv.Membership + alias MvWeb.Helpers.DateFormatter setup do {:ok, settings} = Membership.get_settings() @@ -67,5 +68,57 @@ defmodule MvWeb.JoinRequestLive.ShowTest do assert has_element?(view, "dd", "Alice Example") refute has_element?(view, "dt", "#{custom_field.id}:") 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