Packages
livebook
0.15.1
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/grid_component.ex
defmodule LivebookWeb.Output.GridComponent do
use LivebookWeb, :live_component
@impl true
def mount(socket) do
{:ok, stream(socket, :outputs, [])}
end
@impl true
def update(assigns, socket) do
{outputs, assigns} = Map.pop!(assigns, :outputs)
socket = assign(socket, assigns)
stream_items =
for {idx, output} <- outputs do
id = "#{idx}-grid-item"
%{id: id, idx: idx, output: output}
end
socket = stream(socket, :outputs, stream_items)
{:ok, socket}
end
@impl true
def render(assigns) do
~H"""
<div
id={@id}
phx-hook="ScrollOnUpdate"
class="overflow-auto tiny-scrollbar pr-1.5 -mr-1.5"
style={max_height_style(@max_height)}
>
<div
id={"#{@id}-grid"}
class="grid grid-cols-2 w-full"
style={join_styles([columns_style(@columns), gap_style(@gap)])}
phx-update="stream"
>
<div :for={{dom_id, output} <- @streams.outputs} id={dom_id}>
<LivebookWeb.Output.output
id={"outputs-#{output.idx}"}
output={output.output}
session_id={@session_id}
session_pid={@session_pid}
input_views={@input_views}
client_id={@client_id}
cell_id={@cell_id}
/>
</div>
</div>
</div>
"""
end
defp columns_style(columns) when is_tuple(columns) do
columns = Tuple.to_list(columns)
if Enum.all?(columns, &is_integer/1) do
template = Enum.map_join(columns, " ", fn n -> "minmax(0, #{n}fr)" end)
"grid-template-columns: #{template}"
end
end
defp columns_style(columns) when is_integer(columns) do
"grid-template-columns: repeat(#{columns}, minmax(0, 1fr))"
end
defp columns_style(_columns), do: nil
defp gap_style(gap) when is_integer(gap) do
"gap: #{gap}px"
end
defp gap_style(_other), do: nil
defp max_height_style(max_height) when is_integer(max_height) do
"max-height: #{max_height}px"
end
defp max_height_style(_other), do: nil
defp join_styles(styles) do
styles
|> Enum.reject(&is_nil/1)
|> Enum.join("; ")
end
end