defmodule Oban.Web.Queues.DetailInstanceComponent do use Oban.Web, :live_component import Oban.Web.Helpers.QueueHelper alias Oban.Web.Components.Core @impl Phoenix.LiveComponent def update(%{local_limit: local_limit}, socket) do {:ok, assign(socket, local_limit: local_limit)} end def update(assigns, socket) do socket = socket |> assign(access: assigns.access, checks: assigns.checks) |> assign(node_history: assigns[:node_history] || []) |> assign(queue: assigns.checks["queue"]) |> assign(paused: assigns.checks["paused"]) |> assign_new(:local_limit, fn -> assigns.checks["local_limit"] end) |> assign_new(:editing?, fn -> false end) {:ok, socket} end @impl Phoenix.LiveComponent def render(assigns) do ~H"""
{node_name(@checks)} <.status_indicators checks={@checks} paused={@paused} />
<%= if @editing? do %>
<% else %> {executing_count(@checks)} {@checks["local_limit"]} {started_at(@checks)}
<.pause_button disabled={not can?(:pause_queues, @access)} node={node_name(@checks)} paused={@paused} queue={@queue} target={@myself} /> <.edit_button disabled={not can?(:scale_queues, @access)} node={@checks["node"]} target={@myself} />
<% end %> """ end defp status_indicators(assigns) do terminating? = not is_nil(assigns.checks["shutdown_started_at"]) assigns = assign(assigns, terminating?: terminating?) ~H""" Stopping Paused """ end defp pause_button(assigns) do assigns = assigns |> assign_new(:id, fn -> "#{assigns.node}-toggle-pause" end) |> assign_new(:tooltip, fn -> if assigns.paused, do: "Resume queue", else: "Pause queue" end) ~H""" """ end defp edit_button(assigns) do ~H""" """ end @impl Phoenix.LiveComponent def handle_event("toggle-pause", _params, socket) do enforce_access!(:pause_queues, socket.assigns.access) checks = socket.assigns.checks action = if socket.assigns.paused, do: :resume_queue, else: :pause_queue send(self(), {action, checks["queue"], checks["name"], checks["node"]}) {:noreply, assign(socket, paused: not socket.assigns.paused)} end def handle_event("toggle-edit", _params, socket) do {:noreply, assign(socket, editing?: not socket.assigns.editing?)} end def handle_event("cancel-edit", _params, socket) do {:noreply, assign(socket, editing?: false, local_limit: socket.assigns.checks["local_limit"])} end def handle_event("update", %{"local_limit" => limit}, socket) do enforce_access!(:scale_queues, socket.assigns.access) limit = String.to_integer(limit) checks = socket.assigns.checks send(self(), {:scale_queue, checks["queue"], checks["name"], checks["node"], limit}) {:noreply, assign(socket, local_limit: limit, editing?: false)} end end