defmodule ToweropsWeb.MaintenanceLive.Form do @moduledoc false use ToweropsWeb, :live_view alias Towerops.Maintenance alias Towerops.Maintenance.MaintenanceWindow @impl true def mount(_params, _session, socket) do org_id = socket.assigns.current_scope.organization.id sites = Towerops.Sites.list_organization_sites(org_id) devices = Towerops.Devices.list_organization_devices(org_id) {:ok, socket |> assign(:sites, sites) |> assign(:devices, devices) |> assign(:timezone, socket.assigns.current_scope.timezone)} end @impl true def handle_params(params, _url, socket) do case socket.assigns.live_action do :new -> window = %MaintenanceWindow{suppress_alerts: true, recurring: false} changeset = MaintenanceWindow.changeset(window, %{}) {:noreply, socket |> assign(:page_title, t("New Maintenance Window")) |> assign(:window, window) |> assign(:form, to_form(changeset)) |> assign(:scope_type, "org")} :edit -> window = Maintenance.get_window!(params["id"]) scope_type = cond do window.device_id -> "device" window.site_id -> "site" true -> "org" end changeset = MaintenanceWindow.changeset(window, %{}) {:noreply, socket |> assign(:page_title, t("Edit Maintenance Window")) |> assign(:window, window) |> assign(:form, to_form(changeset)) |> assign(:scope_type, scope_type)} end end @impl true def handle_event("validate", %{"maintenance_window" => params}, socket) do changeset = socket.assigns.window |> MaintenanceWindow.changeset(params) |> Map.put(:action, :validate) {:noreply, assign(socket, :form, to_form(changeset))} end def handle_event("change_scope", %{"scope_type" => scope_type}, socket) do {:noreply, assign(socket, :scope_type, scope_type)} end def handle_event("save", %{"maintenance_window" => params}, socket) do scope = socket.assigns.current_scope params = params |> Map.put("organization_id", scope.organization.id) |> Map.put("created_by_id", scope.user.id) |> maybe_clear_scope(socket.assigns.scope_type) case socket.assigns.live_action do :new -> save_window(socket, :create, params) :edit -> save_window(socket, :update, params) end end defp maybe_clear_scope(params, "org"), do: Map.merge(params, %{"site_id" => nil, "device_id" => nil}) defp maybe_clear_scope(params, "site"), do: Map.put(params, "device_id", nil) defp maybe_clear_scope(params, _), do: params defp format_datetime_local(nil), do: "" defp format_datetime_local(%DateTime{} = dt), do: Calendar.strftime(dt, "%Y-%m-%dT%H:%M") defp format_datetime_local(_), do: "" defp save_window(socket, :create, params) do case Maintenance.create_window(params) do {:ok, window} -> {:noreply, socket |> put_flash(:info, t("Maintenance window created")) |> push_navigate(to: ~p"/maintenance/#{window.id}")} {:error, changeset} -> {:noreply, assign(socket, :form, to_form(changeset))} end end defp save_window(socket, :update, params) do case Maintenance.update_window(socket.assigns.window, params) do {:ok, window} -> {:noreply, socket |> put_flash(:info, t("Maintenance window updated")) |> push_navigate(to: ~p"/maintenance/#{window.id}")} {:error, changeset} -> {:noreply, assign(socket, :form, to_form(changeset))} end end end