Packages
livebook
0.19.5
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Automate code & data workflows with interactive notebooks
Current section
Files
Jump to
Current section
Files
lib/livebook_web/live/output/frame_component.ex
defmodule LivebookWeb.Output.FrameComponent do
use LivebookWeb, :live_component
@impl true
def mount(socket) do
{:ok, stream(socket, :outputs, [])}
end
@impl true
def update(%{event: {:update, update_type, outputs, input_views}}, socket) do
socket = assign(socket, input_views: input_views)
socket =
case update_type do
:replace ->
socket
|> assign(num_outputs: length(outputs))
|> stream(:outputs, stream_items(outputs), reset: true)
:append ->
socket
|> update(:num_outputs, &(length(outputs) + &1))
|> stream(:outputs, stream_items(outputs))
end
{:ok, socket}
end
def update(assigns, socket) do
{outputs, assigns} = Map.pop!(assigns, :outputs)
socket = assign(socket, assigns)
socket = assign_new(socket, :num_outputs, fn -> length(outputs) end)
socket = stream(socket, :outputs, stream_items(outputs))
{:ok, socket}
end
defp stream_items(outputs) do
for {idx, output} <- Enum.reverse(outputs) do
%{id: Integer.to_string(idx), idx: idx, output: output}
end
end
@impl true
def render(assigns) do
~H"""
<div id={@id}>
<%= if @num_outputs == 0 do %>
<div :if={@placeholder} class="text-gray-300 p-4 rounded-lg border border-gray-200">
Nothing here...
</div>
<% else %>
<div id={"#{@id}-outputs"} phx-update="stream">
<LivebookWeb.Output.output
:for={{dom_id, output} <- @streams.outputs}
id={dom_id}
output={output.output}
session_id={@session_id}
session_pid={@session_pid}
input_views={@input_views}
client_id={@client_id}
cell_id={@cell_id}
/>
</div>
<% end %>
</div>
"""
end
end