towerops/lib/towerops_web/live/maintenance_live/index.ex

66 lines
1.7 KiB
Elixir

defmodule ToweropsWeb.MaintenanceLive.Index do
use ToweropsWeb, :live_view
alias Towerops.Maintenance
@impl true
def mount(_params, _session, socket) do
organization = socket.assigns.current_scope.organization
{:ok,
socket
|> assign(:page_title, t("Maintenance Windows"))
|> assign(:filter, "all")
|> assign(:timezone, socket.assigns.current_scope.timezone)
|> load_windows(organization.id)}
end
@impl true
def handle_params(params, _url, socket) do
filter = Map.get(params, "filter", "all")
{:noreply,
socket
|> assign(:filter, filter)
|> load_windows(socket.assigns.current_scope.organization.id)}
end
defp load_windows(socket, org_id) do
filter_atom =
case socket.assigns.filter do
"active" -> :active
"upcoming" -> :upcoming
"past" -> :past
_ -> nil
end
opts = if filter_atom, do: [filter: filter_atom], else: []
windows = Maintenance.list_windows(org_id, opts)
assign(socket, :windows, windows)
end
defp status_for(window) do
now = DateTime.utc_now()
cond do
DateTime.compare(window.starts_at, now) == :gt -> :upcoming
DateTime.compare(window.ends_at, now) == :lt -> :past
true -> :active
end
end
defp scope_label(window) do
cond do
window.device -> "Device: #{window.device.name}"
window.site -> "Site: #{window.site.name}"
true -> "Org-wide"
end
end
defp format_datetime(dt, timezone) do
case DateTime.shift_zone(dt, timezone) do
{:ok, local} -> Calendar.strftime(local, "%b %d, %Y %I:%M %p")
_ -> Calendar.strftime(dt, "%b %d, %Y %I:%M %p UTC")
end
end
end