defmodule ToweropsWeb.SiteLive.Form do @moduledoc false use ToweropsWeb, :live_view alias Towerops.Sites alias Towerops.Sites.Site @impl true def mount(_params, _session, socket) do organization = socket.assigns.current_organization {:ok, socket |> assign(:organization, organization) |> assign(:available_parent_sites, Sites.list_organization_sites(organization.id))} end @impl true def handle_params(params, _url, socket) do {:noreply, apply_action(socket, socket.assigns.live_action, params)} end defp apply_action(socket, :new, _params) do changeset = Sites.change_site(%Site{organization_id: socket.assigns.organization.id}) socket |> assign(:page_title, "New Site") |> assign(:site, %Site{}) |> assign(:form, to_form(changeset)) end defp apply_action(socket, :edit, %{"id" => id}) do site = Sites.get_organization_site!(socket.assigns.organization.id, id) changeset = Sites.change_site(site) # Filter out the current site and its descendants from parent options available_parent_sites = Enum.reject(socket.assigns.available_parent_sites, fn s -> s.id == site.id end) socket |> assign(:page_title, "Edit Site") |> assign(:site, site) |> assign(:form, to_form(changeset)) |> assign(:available_parent_sites, available_parent_sites) end @impl true def handle_event("validate", %{"site" => site_params}, socket) do changeset = socket.assigns.site |> Sites.change_site(site_params) |> Map.put(:action, :validate) {:noreply, assign(socket, :form, to_form(changeset))} end @impl true def handle_event("save", %{"site" => site_params}, socket) do save_site(socket, socket.assigns.live_action, site_params) end defp save_site(socket, :new, site_params) do site_params = Map.put(site_params, "organization_id", socket.assigns.organization.id) case Sites.create_site(site_params) do {:ok, _site} -> {:noreply, socket |> put_flash(:info, "Site created successfully") |> push_navigate(to: ~p"/orgs/#{socket.assigns.organization.slug}/sites")} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, :form, to_form(changeset))} end end defp save_site(socket, :edit, site_params) do case Sites.update_site(socket.assigns.site, site_params) do {:ok, _site} -> {:noreply, socket |> put_flash(:info, "Site updated successfully") |> push_navigate(to: ~p"/orgs/#{socket.assigns.organization.slug}/sites")} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, :form, to_form(changeset))} end end end