Fix output ids within grid and tabs

This commit is contained in:
Jonatan Kłosko 2023-10-30 12:51:22 +07:00
parent b87eb8eb28
commit 0e06d8c0e7
3 changed files with 40 additions and 6 deletions

View file

@ -13,8 +13,8 @@ defmodule LivebookWeb.Output.GridComponent do
socket = assign(socket, assigns) socket = assign(socket, assigns)
stream_items = stream_items =
for {idx, output} <- Enum.reverse(outputs) do for {idx, output} <- outputs do
id = "#{socket.assigns.id}-grid-item-#{idx}" id = "#{idx}-grid-item"
%{id: id, idx: idx, output: output} %{id: id, idx: idx, output: output}
end end
@ -35,7 +35,7 @@ defmodule LivebookWeb.Output.GridComponent do
> >
<div :for={{dom_id, output} <- @streams.outputs} id={dom_id}> <div :for={{dom_id, output} <- @streams.outputs} id={dom_id}>
<LivebookWeb.Output.output <LivebookWeb.Output.output
id={"#{dom_id}-output"} id={"outputs-#{output.idx}"}
output={output.output} output={output.output}
session_id={@session_id} session_id={@session_id}
session_pid={@session_pid} session_pid={@session_pid}

View file

@ -24,8 +24,8 @@ defmodule LivebookWeb.Output.TabsComponent do
socket = assign(socket, assigns) socket = assign(socket, assigns)
stream_items = stream_items =
for {idx, output} <- Enum.reverse(outputs) do for {idx, output} <- outputs do
id = "#{socket.assigns.id}-tab-content-#{idx}" id = "#{idx}-tabs-item"
%{id: id, idx: idx, output: output} %{id: id, idx: idx, output: output}
end end
@ -61,7 +61,7 @@ defmodule LivebookWeb.Output.TabsComponent do
class={[output.idx != @active_idx && "hidden"]} class={[output.idx != @active_idx && "hidden"]}
> >
<LivebookWeb.Output.output <LivebookWeb.Output.output
id={"#{dom_id}-output"} id={"outputs-#{output.idx}"}
output={output.output} output={output.output}
session_id={@session_id} session_id={@session_id}
session_pid={@session_pid} session_pid={@session_pid}

View file

@ -686,6 +686,40 @@ defmodule LivebookWeb.SessionLiveTest do
refute content =~ "In frame" refute content =~ "In frame"
end end
test "frame output update when within grid", %{conn: conn, session: session} do
Session.subscribe(session.id)
evaluate_setup(session.pid)
section_id = insert_section(session.pid)
cell_id = insert_text_cell(session.pid, section_id, :code)
Session.queue_cell_evaluation(session.pid, cell_id)
frame = %{type: :frame, ref: "1", outputs: [terminal_text("In frame")], placeholder: true}
grid = %{type: :grid, outputs: [frame], columns: ["Frame"], gap: 8, boxed: false}
send(session.pid, {:runtime_evaluation_output, cell_id, grid})
{:ok, view, _} = live(conn, ~p"/sessions/#{session.id}")
assert render(view) =~ "In frame"
frame_update = %{
type: :frame_update,
ref: "1",
update: {:replace, [terminal_text("Updated frame")]}
}
send(session.pid, {:runtime_evaluation_output, cell_id, frame_update})
wait_for_session_update(session.pid)
# Render once, so that frame send_update is processed
_ = render(view)
content = render(view)
assert content =~ "Updated frame"
refute content =~ "In frame"
end
test "client-specific output is sent only to one target", %{conn: conn, session: session} do test "client-specific output is sent only to one target", %{conn: conn, session: session} do
user1 = build(:user, name: "Jake Peralta") user1 = build(:user, name: "Jake Peralta")
{_, client_id} = Session.register_client(session.pid, self(), user1) {_, client_id} = Session.register_client(session.pid, self(), user1)