defmodule ToweropsWeb.CoverageLive.Index do @moduledoc false use ToweropsWeb, :live_view alias Towerops.Coverages alias Towerops.Sites @impl true def mount(_params, _session, socket) do organization = socket.assigns.current_scope.organization _ = if connected?(socket), do: Coverages.subscribe_organization(organization.id) {:ok, socket |> assign(:page_title, t("Coverage")) |> assign(:organization, organization) |> assign(:sites, Sites.list_organization_sites(organization.id)) |> load_coverages()} end @impl true def handle_params(_params, _url, socket), do: {:noreply, socket} @impl true def handle_event("delete", %{"id" => id}, socket) do coverage = Coverages.get_coverage!(socket.assigns.organization.id, id) case Coverages.delete_coverage(coverage) do {:ok, _} -> {:noreply, socket |> put_flash(:info, t("Coverage deleted")) |> load_coverages()} {:error, _} -> {:noreply, put_flash(socket, :error, t("Unable to delete coverage"))} end end @impl true def handle_event("recompute", %{"id" => id}, socket) do coverage = Coverages.get_coverage!(socket.assigns.organization.id, id) case Coverages.queue_compute(coverage) do {:ok, _} -> {:noreply, socket |> put_flash(:info, t("Coverage queued for recompute")) |> load_coverages()} {:error, :compute_in_progress} -> {:noreply, put_flash(socket, :error, t("Coverage is already being computed"))} {:error, _} -> {:noreply, put_flash(socket, :error, t("Failed to queue coverage"))} end end @impl true def handle_info({:coverage_status, _status, _arg}, socket) do {:noreply, load_coverages(socket)} end defp load_coverages(socket) do assign(socket, :coverages, Coverages.list_for_organization(socket.assigns.organization.id)) end @doc false def status_badge_class("draft"), do: "bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300" def status_badge_class("queued"), do: "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300" def status_badge_class("computing"), do: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300" def status_badge_class("ready"), do: "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300" def status_badge_class("failed"), do: "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300" def status_badge_class(_), do: "bg-gray-100 text-gray-700" end