refactor: integrate approval ui review changes
This commit is contained in:
parent
28f97184b3
commit
f53a3ce3cc
13 changed files with 153 additions and 139 deletions
|
|
@ -44,8 +44,10 @@ defmodule MvWeb.Layouts do
|
|||
|
||||
def app(assigns) do
|
||||
club_name = get_club_name()
|
||||
join_form_enabled = get_join_form_enabled()
|
||||
join_form_enabled = Mv.Membership.join_form_enabled?()
|
||||
|
||||
# TODO: get_join_form_enabled and unprocessed count run on every page load; consider
|
||||
# loading count only on navigation or caching briefly if performance becomes an issue.
|
||||
unprocessed_join_requests_count =
|
||||
get_unprocessed_join_requests_count(assigns.current_user, join_form_enabled)
|
||||
|
||||
|
|
@ -136,13 +138,6 @@ defmodule MvWeb.Layouts do
|
|||
end
|
||||
end
|
||||
|
||||
defp get_join_form_enabled do
|
||||
case Mv.Membership.get_settings() do
|
||||
{:ok, %{join_form_enabled: true}} -> true
|
||||
_ -> false
|
||||
end
|
||||
end
|
||||
|
||||
defp get_unprocessed_join_requests_count(nil, _), do: 0
|
||||
defp get_unprocessed_join_requests_count(_user, false), do: 0
|
||||
|
||||
|
|
|
|||
47
lib/mv_web/live/join_request_live/helpers.ex
Normal file
47
lib/mv_web/live/join_request_live/helpers.ex
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
defmodule MvWeb.JoinRequestLive.Helpers do
|
||||
@moduledoc """
|
||||
Shared helpers for JoinRequest LiveViews (Index, Show): status display,
|
||||
badge variants, and reviewer display.
|
||||
"""
|
||||
use Gettext, backend: MvWeb.Gettext
|
||||
|
||||
@doc "Human-readable label for a join request status atom."
|
||||
def format_status(:pending_confirmation), do: gettext("Pending confirmation")
|
||||
def format_status(:submitted), do: gettext("Submitted")
|
||||
def format_status(:approved), do: gettext("Approved")
|
||||
def format_status(:rejected), do: gettext("Rejected")
|
||||
def format_status(other), do: to_string(other)
|
||||
|
||||
@doc "Badge variant for the status (used with CoreComponents.badge)."
|
||||
def status_badge_variant(:submitted), do: :info
|
||||
def status_badge_variant(:approved), do: :success
|
||||
def status_badge_variant(:rejected), do: :error
|
||||
def status_badge_variant(_), do: :neutral
|
||||
|
||||
@doc """
|
||||
Returns the reviewer display string (e.g. email) for a join request, or nil if none.
|
||||
|
||||
Accepts a join request struct or map with optional :reviewed_by_user (loaded User struct).
|
||||
"""
|
||||
def reviewer_display(req) when is_map(req) do
|
||||
user = Map.get(req, :reviewed_by_user)
|
||||
|
||||
case user do
|
||||
nil ->
|
||||
nil
|
||||
|
||||
%{email: email} when is_binary(email) ->
|
||||
s = String.trim(email)
|
||||
if s == "", do: nil, else: s
|
||||
|
||||
%{"email" => email} when is_binary(email) ->
|
||||
s = String.trim(email)
|
||||
if s == "", do: nil, else: s
|
||||
|
||||
_ ->
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
def reviewer_display(_), do: nil
|
||||
end
|
||||
|
|
@ -20,13 +20,14 @@ defmodule MvWeb.JoinRequestLive.Index do
|
|||
|
||||
alias Mv.Membership
|
||||
alias MvWeb.Helpers.DateFormatter
|
||||
alias MvWeb.JoinRequestLive.Helpers, as: JoinRequestHelpers
|
||||
|
||||
@impl true
|
||||
def mount(_params, _session, socket) do
|
||||
actor = current_actor(socket)
|
||||
|
||||
cond do
|
||||
not join_form_enabled?() ->
|
||||
not Membership.join_form_enabled?() ->
|
||||
{:ok, redirect(socket, to: ~p"/members")}
|
||||
|
||||
not can_access_page?(actor, "/join_requests") ->
|
||||
|
|
@ -81,8 +82,8 @@ defmodule MvWeb.JoinRequestLive.Index do
|
|||
{req.email}
|
||||
</:col>
|
||||
<:col :let={req} label={gettext("Status")}>
|
||||
<.badge variant={status_badge_variant(req.status)}>
|
||||
{format_status(req.status)}
|
||||
<.badge variant={JoinRequestHelpers.status_badge_variant(req.status)}>
|
||||
{JoinRequestHelpers.format_status(req.status)}
|
||||
</.badge>
|
||||
</:col>
|
||||
</.table>
|
||||
|
|
@ -119,15 +120,15 @@ defmodule MvWeb.JoinRequestLive.Index do
|
|||
</.maybe_value>
|
||||
</:col>
|
||||
<:col :let={req} label={gettext("Status")}>
|
||||
<.badge variant={status_badge_variant(req.status)}>
|
||||
{format_status(req.status)}
|
||||
<.badge variant={JoinRequestHelpers.status_badge_variant(req.status)}>
|
||||
{JoinRequestHelpers.format_status(req.status)}
|
||||
</.badge>
|
||||
</:col>
|
||||
<:col :let={req} label={gettext("Reviewed at")}>
|
||||
{review_date(req)}
|
||||
</:col>
|
||||
<:col :let={req} label={gettext("Review by")}>
|
||||
{reviewer_display(req)}
|
||||
{JoinRequestHelpers.reviewer_display(req) || ""}
|
||||
</:col>
|
||||
</.table>
|
||||
<% end %>
|
||||
|
|
@ -137,13 +138,6 @@ defmodule MvWeb.JoinRequestLive.Index do
|
|||
"""
|
||||
end
|
||||
|
||||
defp join_form_enabled? do
|
||||
case Membership.get_settings() do
|
||||
{:ok, %{join_form_enabled: true}} -> true
|
||||
_ -> false
|
||||
end
|
||||
end
|
||||
|
||||
defp load_join_requests(socket, actor) do
|
||||
socket =
|
||||
case Membership.list_join_requests(actor: actor, status: :submitted) do
|
||||
|
|
@ -168,17 +162,6 @@ defmodule MvWeb.JoinRequestLive.Index do
|
|||
assign(socket, :page_title, gettext("Join requests"))
|
||||
end
|
||||
|
||||
defp format_status(:pending_confirmation), do: gettext("Pending confirmation")
|
||||
defp format_status(:submitted), do: gettext("Submitted")
|
||||
defp format_status(:approved), do: gettext("Approved")
|
||||
defp format_status(:rejected), do: gettext("Rejected")
|
||||
defp format_status(other), do: to_string(other)
|
||||
|
||||
defp status_badge_variant(:submitted), do: :info
|
||||
defp status_badge_variant(:approved), do: :success
|
||||
defp status_badge_variant(:rejected), do: :error
|
||||
defp status_badge_variant(_), do: :neutral
|
||||
|
||||
defp review_date(req) do
|
||||
date =
|
||||
case req.status do
|
||||
|
|
@ -189,12 +172,4 @@ defmodule MvWeb.JoinRequestLive.Index do
|
|||
|
||||
if date, do: DateFormatter.format_datetime(date), else: ""
|
||||
end
|
||||
|
||||
defp reviewer_display(req) do
|
||||
case req.reviewed_by_user do
|
||||
nil -> ""
|
||||
%{email: email} when not is_nil(email) -> to_string(email) |> String.trim()
|
||||
_ -> ""
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -22,10 +22,12 @@ defmodule MvWeb.JoinRequestLive.Show do
|
|||
alias Mv.Constants
|
||||
alias Mv.Membership
|
||||
alias MvWeb.Helpers.DateFormatter
|
||||
alias MvWeb.JoinRequestLive.Helpers, as: JoinRequestHelpers
|
||||
alias MvWeb.Translations.MemberFields, as: MemberFieldsTranslations
|
||||
|
||||
@impl true
|
||||
def mount(_params, _session, socket) do
|
||||
if join_form_enabled?() do
|
||||
if Membership.join_form_enabled?() do
|
||||
{:ok,
|
||||
socket
|
||||
|> assign(:join_request, nil)
|
||||
|
|
@ -40,7 +42,7 @@ defmodule MvWeb.JoinRequestLive.Show do
|
|||
def handle_params(%{"id" => id}, _url, socket) do
|
||||
actor = current_actor(socket)
|
||||
|
||||
if join_form_enabled?() and can_access_page?(actor, "/join_requests/:id") do
|
||||
if Membership.join_form_enabled?() and can_access_page?(actor, "/join_requests/:id") do
|
||||
case Membership.get_join_request(id, actor: actor) do
|
||||
{:ok, nil} ->
|
||||
{:noreply,
|
||||
|
|
@ -106,13 +108,6 @@ defmodule MvWeb.JoinRequestLive.Show do
|
|||
end
|
||||
end
|
||||
|
||||
defp join_form_enabled? do
|
||||
case Membership.get_settings() do
|
||||
{:ok, %{join_form_enabled: true}} -> true
|
||||
_ -> false
|
||||
end
|
||||
end
|
||||
|
||||
@impl true
|
||||
def render(assigns) do
|
||||
~H"""
|
||||
|
|
@ -154,8 +149,8 @@ defmodule MvWeb.JoinRequestLive.Show do
|
|||
<div class="flex gap-2">
|
||||
<span class="text-base-content/60 min-w-32 shrink-0">{gettext("Status")}:</span>
|
||||
<span>
|
||||
<.badge variant={status_badge_variant(@join_request.status)}>
|
||||
{format_status(@join_request.status)}
|
||||
<.badge variant={JoinRequestHelpers.status_badge_variant(@join_request.status)}>
|
||||
{JoinRequestHelpers.format_status(@join_request.status)}
|
||||
</.badge>
|
||||
</span>
|
||||
</div>
|
||||
|
|
@ -191,7 +186,7 @@ defmodule MvWeb.JoinRequestLive.Show do
|
|||
<% end %>
|
||||
<.field_row
|
||||
label={gettext("Review by")}
|
||||
value={reviewer_display(@join_request)}
|
||||
value={JoinRequestHelpers.reviewer_display(@join_request)}
|
||||
empty_text="-"
|
||||
/>
|
||||
</div>
|
||||
|
|
@ -245,33 +240,6 @@ defmodule MvWeb.JoinRequestLive.Show do
|
|||
"""
|
||||
end
|
||||
|
||||
defp format_status(:pending_confirmation), do: gettext("Pending confirmation")
|
||||
defp format_status(:submitted), do: gettext("Submitted")
|
||||
defp format_status(:approved), do: gettext("Approved")
|
||||
defp format_status(:rejected), do: gettext("Rejected")
|
||||
defp format_status(other), do: to_string(other)
|
||||
|
||||
defp status_badge_variant(:submitted), do: :info
|
||||
defp status_badge_variant(:approved), do: :success
|
||||
defp status_badge_variant(:rejected), do: :error
|
||||
defp status_badge_variant(_), do: :neutral
|
||||
|
||||
defp reviewer_display(%{reviewed_by_user: user}) do
|
||||
case user do
|
||||
nil ->
|
||||
nil
|
||||
|
||||
%{email: email} when not is_nil(email) ->
|
||||
s = to_string(email) |> String.trim()
|
||||
if s == "", do: nil, else: s
|
||||
|
||||
_ ->
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
defp reviewer_display(_), do: nil
|
||||
|
||||
# Formats form_data for display in join-form order; legacy keys (not in current
|
||||
# join_form_field_ids) are appended at the end, sorted by label for stability.
|
||||
# Labels: member field keys → human-readable; UUID keys kept as-is (custom field IDs).
|
||||
|
|
@ -307,14 +275,10 @@ defmodule MvWeb.JoinRequestLive.Show do
|
|||
end
|
||||
|
||||
defp field_key_to_label(key, member_field_strings) when is_binary(key) do
|
||||
if key in member_field_strings, do: humanize_field(key), else: key
|
||||
if key in member_field_strings,
|
||||
do: MemberFieldsTranslations.label(String.to_existing_atom(key)),
|
||||
else: key
|
||||
end
|
||||
|
||||
defp field_key_to_label(key, _), do: to_string(key)
|
||||
|
||||
defp humanize_field(key) when is_binary(key) do
|
||||
key
|
||||
|> String.replace("_", " ")
|
||||
|> String.capitalize()
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue