defmodule MicrowavepropWeb.UserManagementLive.Index do @moduledoc "Admin user list at `/admin/users`." use MicrowavepropWeb, :live_view use MicrowavepropWeb.LiveTableResource, schema: Microwaveprop.Accounts.User alias Microwaveprop.Accounts @spec table_options() :: map() def table_options do %{exports: %{formats: [:csv]}} end @impl true def mount(_params, _session, socket) do {:ok, assign(socket, :page_title, "Users")} end @spec fields() :: keyword() def fields do [ id: %{label: "ID", hidden: true}, callsign: %{label: "Callsign", sortable: true, searchable: true}, name: %{label: "Name", sortable: true, searchable: true}, email: %{label: "Email", sortable: true, searchable: true}, is_admin: %{label: "Admin", sortable: true, renderer: &admin_badge/1}, confirmed_at: %{label: "Confirmed", sortable: true, renderer: &confirmed_cell/1} ] end @spec filters() :: list() def filters, do: [] @spec actions() :: keyword() def actions do [ edit: fn %{record: user} -> assigns = %{user: user} ~H""" <.link navigate={~p"/users/#{@user.id}/edit"} class="btn btn-xs btn-ghost">Edit """ end, delete: fn %{record: user} -> assigns = %{user: user} ~H""" <.link phx-click={JS.push("delete", value: %{id: @user.id})} data-confirm={"Delete user #{@user.callsign}? This cannot be undone."} class="btn btn-xs btn-ghost text-error" > Delete """ end ] end @impl true def render(assigns) do ~H""" <.header> Users <:subtitle>Manage registered accounts and admin flags. <.live_table fields={fields()} filters={filters()} options={@options} streams={@streams} actions={actions()} /> """ end @impl true def handle_event("delete", %{"id" => id}, socket) do case Accounts.get_user!(id) do nil -> {:noreply, put_flash(socket, :error, "User not found.")} user -> if user.id == socket.assigns.current_scope.user.id do {:noreply, put_flash(socket, :error, "You cannot delete your own account here.")} else {:ok, _} = Accounts.delete_user(user) {:noreply, stream_delete(socket, :resources, user)} end end end defp admin_badge(true) do assigns = %{} ~H|admin| end defp admin_badge(_), do: Phoenix.HTML.raw("") defp confirmed_cell(nil) do assigns = %{} ~H|pending| end defp confirmed_cell(%DateTime{} = dt), do: Calendar.strftime(dt, "%Y-%m-%d") defp confirmed_cell(_), do: "" end