towerops/lib/towerops_web/live/org/preseem_devices_live.ex
Graham McIntire f2608e8f16
fix: status emoji accumulating in page title and add missing page titles
Fix JS regex in StatusTitle hook to use unicode flag so emoji are
properly matched and replaced instead of accumulating. Add page_title
to 8 LiveViews that were missing it, which caused "TowerOps | TowerOps"
duplication from the live_title suffix.
2026-03-11 09:54:18 -05:00

151 lines
4 KiB
Elixir

defmodule ToweropsWeb.Org.PreseemDevicesLive do
@moduledoc false
use ToweropsWeb, :live_view
alias Towerops.Devices
alias Towerops.Preseem
alias Towerops.Repo
@impl true
def mount(_params, _session, socket) do
org = socket.assigns.current_scope.organization
{:ok,
socket
|> assign(:page_title, t("Preseem Devices"))
|> assign(:organization, org)
|> assign(:filter, "all")
|> assign(:linking_ap_id, nil)
|> assign(:device_search, "")
|> assign(:search_results, [])
|> load_access_points()}
end
@impl true
def handle_params(params, _url, socket) do
filter =
case params["filter"] do
f when f in ~w(all unmatched matched) -> f
_ -> "all"
end
{:noreply, socket |> assign(:filter, filter) |> load_access_points()}
end
@impl true
def handle_event("filter", %{"filter" => filter}, socket) do
org = socket.assigns.organization
{:noreply,
push_patch(socket,
to: ~p"/orgs/#{org.slug}/settings/integrations/preseem/devices?filter=#{filter}"
)}
end
@impl true
def handle_event("start_link", %{"ap-id" => ap_id}, socket) do
{:noreply,
socket
|> assign(:linking_ap_id, ap_id)
|> assign(:device_search, "")
|> assign(:search_results, [])}
end
@impl true
def handle_event("cancel_link", _params, socket) do
{:noreply,
socket
|> assign(:linking_ap_id, nil)
|> assign(:device_search, "")
|> assign(:search_results, [])}
end
@impl true
def handle_event("search_devices", %{"query" => query}, socket) do
org = socket.assigns.organization
results =
if String.length(query) >= 2 do
Devices.search_devices(org.id, query)
else
[]
end
{:noreply, socket |> assign(:device_search, query) |> assign(:search_results, results)}
end
@impl true
def handle_event("link_device", %{"ap-id" => ap_id, "device-id" => device_id}, socket) do
case Preseem.link_access_point(ap_id, device_id) do
{:ok, _} ->
{:noreply,
socket
|> assign(:linking_ap_id, nil)
|> assign(:device_search, "")
|> assign(:search_results, [])
|> load_access_points()
|> put_flash(:info, t("Device linked successfully"))}
{:error, _} ->
{:noreply, put_flash(socket, :error, t("Failed to link device"))}
end
end
@impl true
def handle_event("unlink_device", %{"ap-id" => ap_id}, socket) do
case Preseem.unlink_access_point(ap_id) do
{:ok, _} ->
{:noreply,
socket
|> load_access_points()
|> put_flash(:info, t("Device unlinked"))}
{:error, _} ->
{:noreply, put_flash(socket, :error, t("Failed to unlink device"))}
end
end
defp match_confidence_classes(confidence) do
case confidence do
"unmatched" ->
"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400"
"ambiguous" ->
"bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400"
"manual" ->
"bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400"
_ ->
"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400"
end
end
defp humanize_confidence(confidence) do
case confidence do
"auto_mac" -> "Auto (MAC)"
"auto_ip" -> "Auto (IP)"
"auto_hostname" -> "Auto (Hostname)"
"manual" -> "Manual"
"ambiguous" -> "Ambiguous"
"unmatched" -> "Unmatched"
other -> String.capitalize(other || "unknown")
end
end
defp load_access_points(socket) do
org_id = socket.assigns.organization.id
filter = socket.assigns.filter
access_points =
case filter do
"unmatched" -> Preseem.list_unmatched_access_points(org_id)
"matched" -> Preseem.list_matched_access_points(org_id)
_ -> Preseem.list_access_points(org_id)
end
access_points = Repo.preload(access_points, :device)
assign(socket, :access_points, access_points)
end
end