defmodule MicrowavepropWeb.UserManagementLive.Edit do @moduledoc "Admin edit page for a single user (roles, suspension, monitors)." use MicrowavepropWeb, :live_view alias Microwaveprop.Accounts alias Microwaveprop.BeaconMonitors @impl true def render(assigns) do ~H""" <.header> Edit user <:subtitle>{@user.callsign} · {@user.email} <.form for={@form} id="user-form" phx-change="validate" phx-submit="save"> <.input field={@form[:callsign]} type="text" label="Callsign" required /> <.input field={@form[:name]} type="text" label="Name" required /> <.input field={@form[:email]} type="email" label="Email" required />

Beacon monitors

Monitor hardware assigned to this user.

<%= if @monitors == [] do %>

No monitors assigned to this user.

<% else %>
Name Hardware Last seen
<.link navigate={~p"/admin/beacon-monitors/#{monitor.id}"} class="link link-hover font-semibold" > {monitor.name} {monitor.hardware_type} ({monitor.hardware_id}) <%= if monitor.last_seen_at do %> {Calendar.strftime(monitor.last_seen_at, "%Y-%m-%d %H:%M UTC")} <% else %> never <% end %> <.link phx-click={JS.push("unassign-monitor", value: %{id: monitor.id})} data-confirm={"Remove monitor '#{monitor.name}' from #{@user.callsign}?"} class="btn btn-xs btn-ghost text-error" > Remove
<% end %>
""" end @impl true def mount(%{"id" => id}, _session, socket) do case Accounts.get_user!(id) do nil -> {:ok, socket |> put_flash(:error, "User not found.") |> push_navigate(to: ~p"/users")} user -> monitors = BeaconMonitors.list_monitors_for_user(user) {:ok, socket |> assign(:page_title, "Edit user") |> assign(:user, user) |> assign(:monitors, monitors) |> assign(:form, to_form(Accounts.change_admin_user(user)))} end end @impl true def handle_event("validate", %{"user" => params}, socket) do changeset = Accounts.change_admin_user(socket.assigns.user, params) {:noreply, assign(socket, form: to_form(changeset, action: :validate))} end @impl true def handle_event("save", %{"user" => params}, socket) do case Accounts.admin_update_user(socket.assigns.user, params) do {:ok, _user} -> {:noreply, socket |> put_flash(:info, "User updated") |> push_navigate(to: ~p"/users")} {:error, changeset} -> {:noreply, assign(socket, form: to_form(changeset))} end end @impl true def handle_event("unassign-monitor", %{"id" => monitor_id}, socket) do user = socket.assigns.user case BeaconMonitors.delete_monitor!(monitor_id) do {:ok, monitor} -> monitors = BeaconMonitors.list_monitors_for_user(user) {:noreply, socket |> assign(:monitors, monitors) |> put_flash(:info, "Monitor '#{monitor.name}' removed from #{user.callsign}.")} {:error, :not_found} -> {:noreply, put_flash(socket, :error, "Monitor not found.")} end end end