116 lines
3.5 KiB
Elixir
116 lines
3.5 KiB
Elixir
defmodule ToweropsWeb.MaintenanceLive.Form do
|
|
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 ->
|
|
changeset = MaintenanceWindow.changeset(%MaintenanceWindow{suppress_alerts: true}, %{})
|
|
|
|
{:noreply,
|
|
socket
|
|
|> assign(:page_title, t("New Maintenance Window"))
|
|
|> assign(:window, %MaintenanceWindow{suppress_alerts: true, recurring: false})
|
|
|> assign(:changeset, 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(:changeset, 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, :changeset, 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, :changeset, 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, :changeset, changeset)}
|
|
end
|
|
end
|
|
end
|