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