defmodule MicrowavepropWeb.BeaconLive.Form do @moduledoc false use MicrowavepropWeb, :live_view alias Microwaveprop.Beacons alias Microwaveprop.Beacons.Beacon @impl true def render(assigns) do ~H""" <.header> {@page_title} <:subtitle>Leave the grid blank to auto-fill it from lat/lon. <.form for={@form} id="beacon-form" phx-change="validate" phx-submit="save"> <.input field={@form[:frequency_mhz]} type="number" label="Frequency (MHz)" step="any" required /> <.input field={@form[:callsign]} type="text" label="Call" required /> <.input field={@form[:grid]} type="text" label="Grid (auto if blank)" /> <.input field={@form[:lat]} type="number" label="Latitude" step="any" required /> <.input field={@form[:lon]} type="number" label="Longitude" step="any" required /> <.input field={@form[:power_watts]} type="number" label="Power (W)" step="any" required /> <.input field={@form[:height_m]} type="number" label="Height above ground (m)" step="any" required /> """ end @impl true def mount(params, _session, socket) do {:ok, socket |> assign(:return_to, return_to(params["return_to"])) |> apply_action(socket.assigns.live_action, params)} end defp return_to("show"), do: "show" defp return_to(_), do: "index" defp apply_action(socket, :edit, %{"id" => id}) do beacon = Beacons.get_beacon!(id) socket |> assign(:page_title, "Edit beacon") |> assign(:beacon, beacon) |> assign(:form, to_form(Beacons.change_beacon(beacon))) end defp apply_action(socket, :new, _params) do beacon = %Beacon{} socket |> assign(:page_title, "New beacon") |> assign(:beacon, beacon) |> assign(:form, to_form(Beacons.change_beacon(beacon))) end @impl true def handle_event("validate", %{"beacon" => beacon_params}, socket) do changeset = Beacons.change_beacon(socket.assigns.beacon, beacon_params) {:noreply, assign(socket, form: to_form(changeset, action: :validate))} end def handle_event("save", %{"beacon" => beacon_params}, socket) do save_beacon(socket, socket.assigns.live_action, beacon_params) end defp save_beacon(socket, :edit, beacon_params) do case Beacons.update_beacon(socket.assigns.beacon, beacon_params) do {:ok, beacon} -> {:noreply, socket |> put_flash(:info, "Beacon updated") |> push_navigate(to: return_path(socket.assigns.return_to, beacon))} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, form: to_form(changeset))} end end defp save_beacon(socket, :new, beacon_params) do user = socket.assigns.current_scope.user case Beacons.create_beacon(user, beacon_params) do {:ok, beacon} -> {:noreply, socket |> put_flash(:info, "Beacon created") |> push_navigate(to: return_path(socket.assigns.return_to, beacon))} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, form: to_form(changeset))} end end defp return_path("index", _beacon), do: ~p"/beacons" defp return_path("show", beacon), do: ~p"/beacons/#{beacon}" end