add first-in-first-out queue for image prompts, and add pagination

This commit is contained in:
2022-08-31 15:45:06 -04:00
parent 559f6f959f
commit 7990246675
27 changed files with 236 additions and 143 deletions

View File

@@ -42,9 +42,9 @@ defmodule DiffuserWeb.PromptRequestLive.FormComponent do
end
defp save_prompt_request(socket, :new, prompt_request_params) do
with {:ok, prompt_request} <- Generator.create_prompt_request(prompt_request_params),
{:ok, _pid} <-
Diffuser.Generator.PromptRequestSupervisor.start_prompt_request(prompt_request) do
with {:ok, prompt_request} <- Generator.create_prompt_request(prompt_request_params) do
Diffuser.Generator.PromptRequestQueue.enqueue(prompt_request)
{:noreply,
socket
|> put_flash(:info, "Prompt request created successfully")

View File

@@ -6,12 +6,14 @@ defmodule DiffuserWeb.PromptRequestLive.Index do
@impl true
def mount(_params, _session, socket) do
{:ok, assign(socket, :prompt_requests, list_prompt_requests())}
{:ok, socket}
end
@impl true
def handle_params(params, _url, socket) do
{:noreply, apply_action(socket, socket.assigns.live_action, params)}
page = list_prompt_requests(params)
socket = socket |> apply_action(socket.assigns.live_action, params) |> assign(:page, page)
{:noreply, socket}
end
defp apply_action(socket, :edit, %{"id" => id}) do
@@ -37,10 +39,10 @@ defmodule DiffuserWeb.PromptRequestLive.Index do
prompt_request = Generator.get_prompt_request!(id)
{:ok, _} = Generator.delete_prompt_request(prompt_request)
{:noreply, assign(socket, :prompt_requests, list_prompt_requests())}
{:noreply, assign(socket, :page, list_prompt_requests(%{"page" => "2"}))}
end
defp list_prompt_requests do
Generator.list_prompt_requests()
defp list_prompt_requests(params) do
Generator.paginate_prompt_requests(params)
end
end

View File

@@ -15,14 +15,20 @@
<table>
<thead>
<tr>
<th>Image</th>
<th>Prompt</th>
<th></th>
</tr>
</thead>
<tbody id="prompt_requests">
<%= for prompt_request <- @prompt_requests do %>
<%= for prompt_request <- @page.entries do %>
<tr id={"prompt_request-#{prompt_request.id}"}>
<td>
<%= for result <- prompt_request.images do %>
<img src={"#{Diffuser.Uploaders.Image.url({result.image, result})}"} />
<% end %>
</td>
<td><%= prompt_request.prompt %></td>
<td>
@@ -35,4 +41,18 @@
</tbody>
</table>
<div class="pagination">
<%= if @page.page_number > 1 do %>
<%= live_patch "<< Prev Page",
to: Routes.prompt_request_index_path(@socket, :index, page: @page.page_number - 1),
class: "pagination-link" %>
<% end %>
<%= if @page.page_number < @page.total_pages do %>
<%= live_patch "Next Page >>",
to: Routes.prompt_request_index_path(@socket, :index, page: @page.page_number + 1),
class: "pagination-link" %>
<% end %>
</div>
<span><%= live_patch "New Prompt request", to: Routes.prompt_request_index_path(@socket, :new) %></span>

View File

@@ -7,12 +7,16 @@ defmodule DiffuserWeb.PromptRequestLive.Show do
alias Diffuser.Repo
alias Phoenix.Socket.Broadcast
alias DiffuserWeb.Endpoint
alias Ecto.Association.NotLoaded
@impl true
def mount(%{"id" => id}, _session, socket) do
Endpoint.subscribe("request:#{id}")
{:ok, socket |> assign(:prompt_request, Generator.get_prompt_request!(id))}
{:ok,
socket
|> assign(:prompt_request, Generator.get_prompt_request!(id))
|> assign(:prompt_request_progress, 0)}
end
@impl true
@@ -38,6 +42,21 @@ defmodule DiffuserWeb.PromptRequestLive.Show do
do:
{:noreply,
assign(socket, %{
prompt_request: prompt_request
prompt_request: prompt_request |> Repo.preload(:images)
})}
@impl true
def handle_info(
%Broadcast{
topic: _,
event: "progress",
payload: progress
},
socket
),
do:
{:noreply,
assign(socket, %{
prompt_request_progress: progress
})}
end

View File

@@ -23,6 +23,14 @@
<strong>Status:</strong>
<%= @prompt_request.status %>
</li>
<%= if @prompt_request_progress > 0 do %>
<li><strong>Progress:</strong>
<%= @prompt_request_progress %> / <%= @prompt_request.steps %> steps
</li>
<% end %>
<li><strong>Guidance Scale:</strong>
<%= @prompt_request.guidance_scale %>
</li>
<li>
<strong>Images:</strong>
<%= if @prompt_request.images do %>