defmodule MicrowavepropWeb.BeaconLive.Index do @moduledoc false use MicrowavepropWeb, :live_view alias Microwaveprop.Beacons @impl true def render(assigns) do ~H""" <.header> Beacons <:subtitle>Microwave beacons tracked by NTMS. <:actions> <.button :if={admin?(@current_scope)} variant="primary" navigate={~p"/beacons/new"}> <.icon name="hero-plus" /> New Beacon <.table id="beacons" rows={@streams.beacons} row_click={fn {_id, beacon} -> JS.navigate(~p"/beacons/#{beacon}") end} > <:col :let={{_id, beacon}} label="Frequency (MHz)">{beacon.frequency_mhz} <:col :let={{_id, beacon}} label="Call">{beacon.callsign} <:col :let={{_id, beacon}} label="Grid">{beacon.grid} <:col :let={{_id, beacon}} label="Lat">{beacon.lat} <:col :let={{_id, beacon}} label="Lon">{beacon.lon} <:col :let={{_id, beacon}} label="Power (W)">{beacon.power_watts} <:col :let={{_id, beacon}} label="Height AGL (m)">{beacon.height_m} <:action :let={{_id, beacon}}>
<.link navigate={~p"/beacons/#{beacon}"}>Show
<.link :if={admin?(@current_scope)} navigate={~p"/beacons/#{beacon}/edit"}>Edit <:action :let={{id, beacon}}> <.link :if={admin?(@current_scope)} phx-click={JS.push("delete", value: %{id: beacon.id}) |> hide("##{id}")} data-confirm="Delete this beacon?" > Delete
""" end @impl true def mount(_params, _session, socket) do if connected?(socket), do: Beacons.subscribe_beacons() {:ok, socket |> assign(:page_title, "Beacons") |> stream(:beacons, Beacons.list_beacons())} end @impl true def handle_event("delete", %{"id" => id}, socket) do if admin?(socket.assigns.current_scope) do beacon = Beacons.get_beacon!(id) {:ok, _} = Beacons.delete_beacon(beacon) {:noreply, stream_delete(socket, :beacons, beacon)} else {:noreply, put_flash(socket, :error, "Admins only.")} end end @impl true def handle_info({type, %Microwaveprop.Beacons.Beacon{}}, socket) when type in [:created, :updated, :deleted] do {:noreply, stream(socket, :beacons, Beacons.list_beacons(), reset: true)} end defp admin?(%{user: %{is_admin: true}}), do: true defp admin?(_), do: false end