mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-10-27 13:56:21 +08:00
Add support for grid output max height (#2846)
This commit is contained in:
parent
65027853c2
commit
42e9f74beb
4 changed files with 51 additions and 18 deletions
|
|
@ -265,6 +265,7 @@ defprotocol Livebook.Runtime do
|
||||||
outputs: list(t()),
|
outputs: list(t()),
|
||||||
columns: pos_integer() | tuple(),
|
columns: pos_integer() | tuple(),
|
||||||
gap: non_neg_integer(),
|
gap: non_neg_integer(),
|
||||||
|
max_height: pos_integer() | nil,
|
||||||
boxed: boolean()
|
boxed: boolean()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3100,16 +3100,21 @@ defmodule Livebook.Session do
|
||||||
|
|
||||||
# Traverse composite outputs
|
# Traverse composite outputs
|
||||||
|
|
||||||
# defp normalize_runtime_output(output) when output.type in [:frame, :tabs, :grid] do
|
defp normalize_runtime_output(%{type: :grid} = grid) do
|
||||||
# outputs = Enum.map(output.outputs, &normalize_runtime_output/1)
|
grid
|
||||||
# %{output | outputs: outputs}
|
|> Map.update!(:outputs, fn outputs -> Enum.map(outputs, &normalize_runtime_output/1) end)
|
||||||
# end
|
|> Map.put_new(:max_height, nil)
|
||||||
|
end
|
||||||
|
|
||||||
# defp normalize_runtime_output(%{type: :frame_update} = output) do
|
defp normalize_runtime_output(%{type: type} = output) when type in [:frame, :tabs] do
|
||||||
# {update_type, new_outputs} = output.update
|
Map.update!(output, :outputs, fn outputs -> Enum.map(outputs, &normalize_runtime_output/1) end)
|
||||||
# new_outputs = Enum.map(new_outputs, &normalize_runtime_output/1)
|
end
|
||||||
# %{output | update: {update_type, new_outputs}}
|
|
||||||
# end
|
defp normalize_runtime_output(%{type: :frame_update} = output) do
|
||||||
|
{update_type, new_outputs} = output.update
|
||||||
|
new_outputs = Enum.map(new_outputs, &normalize_runtime_output/1)
|
||||||
|
%{output | update: {update_type, new_outputs}}
|
||||||
|
end
|
||||||
|
|
||||||
defp normalize_runtime_output(output) when is_map(output), do: output
|
defp normalize_runtime_output(output) when is_map(output), do: output
|
||||||
|
|
||||||
|
|
@ -3191,7 +3196,8 @@ defmodule Livebook.Session do
|
||||||
outputs: Enum.map(outputs, &normalize_runtime_output/1),
|
outputs: Enum.map(outputs, &normalize_runtime_output/1),
|
||||||
columns: Map.get(info, :columns, 1),
|
columns: Map.get(info, :columns, 1),
|
||||||
gap: Map.get(info, :gap, 8),
|
gap: Map.get(info, :gap, 8),
|
||||||
boxed: Map.get(info, :boxed, false)
|
boxed: Map.get(info, :boxed, false),
|
||||||
|
max_height: Map.get(info, :max_height)
|
||||||
}
|
}
|
||||||
|> normalize_runtime_output()
|
|> normalize_runtime_output()
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -174,6 +174,7 @@ defmodule LivebookWeb.Output do
|
||||||
id: id,
|
id: id,
|
||||||
columns: grid.columns,
|
columns: grid.columns,
|
||||||
gap: grid.gap,
|
gap: grid.gap,
|
||||||
|
max_height: grid.max_height,
|
||||||
outputs: grid.outputs,
|
outputs: grid.outputs,
|
||||||
session_id: session_id,
|
session_id: session_id,
|
||||||
session_pid: session_pid,
|
session_pid: session_pid,
|
||||||
|
|
@ -189,6 +190,7 @@ defmodule LivebookWeb.Output do
|
||||||
outputs={@outputs}
|
outputs={@outputs}
|
||||||
columns={@columns}
|
columns={@columns}
|
||||||
gap={@gap}
|
gap={@gap}
|
||||||
|
max_height={@max_height}
|
||||||
session_id={@session_id}
|
session_id={@session_id}
|
||||||
session_pid={@session_pid}
|
session_pid={@session_pid}
|
||||||
input_views={@input_views}
|
input_views={@input_views}
|
||||||
|
|
|
||||||
|
|
@ -26,11 +26,16 @@ defmodule LivebookWeb.Output.GridComponent do
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
<div id={@id} class="overflow-auto tiny-scrollbar">
|
<div
|
||||||
|
id={@id}
|
||||||
|
phx-hook="ScrollOnUpdate"
|
||||||
|
class="overflow-auto tiny-scrollbar pr-1.5 -mr-1.5"
|
||||||
|
style={max_height_style(@max_height)}
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
id={"#{@id}-grid"}
|
id={"#{@id}-grid"}
|
||||||
class="grid grid-cols-2 w-full"
|
class="grid grid-cols-2 w-full"
|
||||||
style={"grid-template-columns: #{make_template(@columns)}; gap: #{@gap}px"}
|
style={join_styles([columns_style(@columns), gap_style(@gap)])}
|
||||||
phx-update="stream"
|
phx-update="stream"
|
||||||
>
|
>
|
||||||
<div :for={{dom_id, output} <- @streams.outputs} id={dom_id}>
|
<div :for={{dom_id, output} <- @streams.outputs} id={dom_id}>
|
||||||
|
|
@ -49,17 +54,36 @@ defmodule LivebookWeb.Output.GridComponent do
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
defp make_template(columns) when is_tuple(columns) do
|
defp columns_style(columns) when is_tuple(columns) do
|
||||||
columns = Tuple.to_list(columns)
|
columns = Tuple.to_list(columns)
|
||||||
|
|
||||||
if Enum.all?(columns, &is_integer/1) do
|
if Enum.all?(columns, &is_integer/1) do
|
||||||
Enum.map_join(columns, " ", fn n -> "minmax(0, #{n}fr)" end)
|
template = Enum.map_join(columns, " ", fn n -> "minmax(0, #{n}fr)" end)
|
||||||
else
|
"grid-template-columns: #{template}"
|
||||||
""
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp make_template(columns) when is_integer(columns), do: "repeat(#{columns}, minmax(0, 1fr))"
|
defp columns_style(columns) when is_integer(columns) do
|
||||||
|
"grid-template-columns: repeat(#{columns}, minmax(0, 1fr))"
|
||||||
|
end
|
||||||
|
|
||||||
defp make_template(_columns), do: ""
|
defp columns_style(_columns), do: nil
|
||||||
|
|
||||||
|
defp gap_style(gap) when is_integer(gap) do
|
||||||
|
"#{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
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue