Move session markup to a separate file (#2452)

This commit is contained in:
Jonatan Kłosko 2024-01-26 13:51:05 +01:00 committed by GitHub
parent 9bc0832e03
commit 8e6a017414
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 1265 additions and 1221 deletions

View file

@ -218,10 +218,8 @@ defimpl Livebook.FileSystem, for: Livebook.FileSystem.Local do
end end
def write_stream_chunk(_file_system, state, chunk) when is_binary(chunk) do def write_stream_chunk(_file_system, state, chunk) when is_binary(chunk) do
case IO.binwrite(state.device, chunk) do :ok = IO.binwrite(state.device, chunk)
:ok -> {:ok, state} {:ok, state}
{:error, error} -> FileSystem.Utils.posix_error(error)
end
end end
def write_stream_finish(_file_system, state) do def write_stream_finish(_file_system, state) do
@ -249,7 +247,7 @@ defimpl Livebook.FileSystem, for: Livebook.FileSystem.Local do
try do try do
result = result =
path path
|> File.stream!([], @stream_chunk_size_in_bytes) |> File.stream!(@stream_chunk_size_in_bytes, [])
|> Enum.into(collectable) |> Enum.into(collectable)
{:ok, result} {:ok, result}

View file

@ -180,7 +180,7 @@ defmodule Livebook.Runtime.ErlDist.RuntimeServer do
{:transfer, target_path, target_pid} -> {:transfer, target_path, target_pid} ->
try do try do
path path
|> File.stream!([], 2048) |> File.stream!(2048, [])
|> Enum.each(fn chunk -> IO.binwrite(target_pid, chunk) end) |> Enum.each(fn chunk -> IO.binwrite(target_pid, chunk) end)
target_path target_path
@ -910,7 +910,7 @@ defmodule Livebook.Runtime.ErlDist.RuntimeServer do
end end
defp file_md5(path) do defp file_md5(path) do
File.stream!(path, [], 2048) File.stream!(path, 2048, [])
|> Enum.reduce(:erlang.md5_init(), &:erlang.md5_update(&2, &1)) |> Enum.reduce(:erlang.md5_init(), &:erlang.md5_update(&2, &1))
|> :erlang.md5_final() |> :erlang.md5_final()
end end

View file

@ -382,7 +382,7 @@ defmodule LivebookWeb.FormComponents do
id={"#{@id}-button"} id={"#{@id}-button"}
type="button" type="button"
data-emoji-button data-emoji-button
class="p-1 pl-3 pr-3 rounded-tr-lg rounded-br-lg bg-gray-50 hover:bg-gray-100 active:bg-gray-200 border-l-[1px] bg-white flex justify-center items-center cursor-pointer" class="p-1 pl-3 pr-3 rounded-tr-lg rounded-br-lg bg-gray-50 hover:bg-gray-100 active:bg-gray-200 border-l-[1px] flex justify-center items-center cursor-pointer"
> >
<.remix_icon icon="emotion-line" class="text-xl" /> <.remix_icon icon="emotion-line" class="text-xl" />
</button> </button>
@ -478,7 +478,7 @@ defmodule LivebookWeb.FormComponents do
def label(assigns) do def label(assigns) do
~H""" ~H"""
<label for={@for} class="mb-1 block text-sm text-gray-800 font-medium flex items-center gap-1"> <label for={@for} class="mb-1 flex items-center gap-1 text-sm text-gray-800 font-medium">
<%= render_slot(@inner_block) %> <%= render_slot(@inner_block) %>
<.help :if={@help} text={@help} /> <.help :if={@help} text={@help} />
</label> </label>

File diff suppressed because it is too large Load diff

View file

@ -1,272 +0,0 @@
defmodule LivebookWeb.SessionLive.IndicatorsComponent do
use LivebookWeb, :html
def render(assigns) do
~H"""
<div class="flex items-center justify-between sticky px-2 top-0 left-0 right-0 z-[500] bg-white border-b border-gray-200">
<div class="sm:hidden text-2xl text-gray-400 hover:text-gray-600 focus:text-gray-600 rounded-xl h-10 w-10 flex items-center justify-center">
<button
aria-label="hide sidebar"
data-el-toggle-sidebar
phx-click={
JS.add_class("hidden sm:flex", to: "[data-el-sidebar]")
|> JS.toggle(to: "[data-el-toggle-sidebar]", display: "flex")
}
>
<.remix_icon icon="menu-fold-line" />
</button>
<button
class="hidden"
aria-label="show sidebar"
data-el-toggle-sidebar
phx-click={
JS.remove_class("hidden sm:flex", to: "[data-el-sidebar]")
|> JS.toggle(to: "[data-el-toggle-sidebar]", display: "flex")
}
>
<.remix_icon icon="menu-unfold-line" />
</button>
</div>
<div class="sm:fixed bottom-[0.4rem] right-[1.5rem]">
<div
class="flex flex-row-reverse sm:flex-col items-center justify-end p-2 sm:p-0 space-x-2 space-x-reverse sm:space-x-0 sm:space-y-2"
data-el-notebook-indicators
>
<.view_indicator />
<.persistence_indicator
file={@file}
dirty={@dirty}
persistence_warnings={@persistence_warnings}
autosave_interval_s={@autosave_interval_s}
session_id={@session_id}
/>
<.runtime_indicator
runtime={@runtime}
global_status={@global_status}
session_id={@session_id}
/>
<.insert_mode_indicator />
</div>
</div>
</div>
"""
end
defp view_indicator(assigns) do
~H"""
<div class="tooltip left" data-tooltip="Choose views to activate" data-el-views>
<.menu id="views-menu" position={:bottom_right} sm_position={:top_right}>
<:toggle>
<button
class="icon-button icon-outlined-button border-gray-200 hover:bg-gray-100 focus:bg-gray-100"
aria-label="choose views to activate"
data-el-views-disabled
>
<.remix_icon icon="layout-5-line" class="text-xl text-gray-400" />
</button>
<button
class="icon-button icon-outlined-button border-green-bright-300 hover:bg-green-bright-50 focus:bg-green-bright-50"
aria-label="choose views to activate"
data-el-views-enabled
>
<.remix_icon icon="layout-5-line" class="text-xl text-green-bright-400" />
</button>
</:toggle>
<.menu_item>
<button role="menuitem" data-el-view-toggle="code-zen">
<.remix_icon icon="code-line" />
<span>Code zen</span>
</button>
</.menu_item>
<.menu_item>
<button role="menuitem" data-el-view-toggle="presentation">
<.remix_icon icon="slideshow-2-line" />
<span>Presentation</span>
</button>
</.menu_item>
<.menu_item>
<button role="menuitem" data-el-view-toggle="custom">
<.remix_icon icon="settings-5-line" />
<span>Custom</span>
</button>
</.menu_item>
</.menu>
</div>
"""
end
defp persistence_indicator(%{file: nil} = assigns) do
~H"""
<span class="tooltip left" data-tooltip="Choose a file to save the notebook">
<.link
patch={~p"/sessions/#{@session_id}/settings/file"}
class="icon-button icon-outlined-button border-gray-200 hover:bg-gray-100 focus:bg-gray-100"
aria-label="choose a file to save the notebook"
>
<.remix_icon icon="save-line" class="text-xl text-gray-400" />
</.link>
</span>
"""
end
defp persistence_indicator(%{dirty: false} = assigns) do
~H"""
<span
class="tooltip left"
data-tooltip={
case @persistence_warnings do
[] ->
"Notebook saved"
warnings ->
"Notebook saved with warnings:\n" <> Enum.map_join(warnings, "\n", &("- " <> &1))
end
}
>
<.link
patch={~p"/sessions/#{@session_id}/settings/file"}
class="icon-button icon-outlined-button border-green-bright-300 hover:bg-green-bright-50 focus:bg-green-bright-50 relative"
aria-label="notebook saved, click to open file settings"
>
<.remix_icon icon="save-line" class="text-xl text-green-bright-400" />
<.remix_icon
:if={@persistence_warnings != []}
icon="error-warning-fill"
class="text-lg text-red-400 absolute -top-1.5 -right-2"
/>
</.link>
</span>
"""
end
defp persistence_indicator(%{autosave_interval_s: nil} = assigns) do
~H"""
<span class="tooltip left" data-tooltip="No autosave configured, make sure to save manually">
<.link
patch={~p"/sessions/#{@session_id}/settings/file"}
class="icon-button icon-outlined-button border-yellow-bright-200 hover:bg-red-50 focus:bg-red-50"
aria-label="no autosave configured, click to open file settings"
>
<.remix_icon icon="save-line" class="text-xl text-yellow-bright-300" />
</.link>
</span>
"""
end
defp persistence_indicator(assigns) do
~H"""
<span class="tooltip left" data-tooltip="Autosave pending">
<.link
patch={~p"/sessions/#{@session_id}/settings/file"}
class="icon-button icon-outlined-button border-blue-400 hover:bg-blue-50 focus:bg-blue-50"
aria-label="autosave pending, click to open file settings"
>
<.remix_icon icon="save-line" class="text-xl text-blue-500" />
</.link>
</span>
"""
end
defp runtime_indicator(assigns) do
~H"""
<%= if Livebook.Runtime.connected?(@runtime) do %>
<.global_status status={elem(@global_status, 0)} cell_id={elem(@global_status, 1)} />
<% else %>
<span class="tooltip left" data-tooltip="Choose a runtime to run the notebook in">
<.link
patch={~p"/sessions/#{@session_id}/settings/runtime"}
class="icon-button icon-outlined-button border-gray-200 hover:bg-gray-100 focus:bg-gray-100"
aria-label="choose a runtime to run the notebook in"
>
<.remix_icon icon="loader-3-line" class="text-xl text-gray-400" />
</.link>
</span>
<% end %>
"""
end
defp global_status(%{status: :evaluating} = assigns) do
~H"""
<span class="tooltip left" data-tooltip="Go to evaluating cell">
<button
class="border-blue-400 icon-button icon-outlined-button hover:bg-blue-50 focus:bg-blue-50"
aria-label="go to evaluating cell"
data-el-focus-cell-button
data-target={@cell_id}
>
<.remix_icon icon="loader-3-line" class="text-xl text-blue-500 animate-spin" />
</button>
</span>
"""
end
defp global_status(%{status: :evaluated} = assigns) do
~H"""
<span class="tooltip left" data-tooltip="Go to last evaluated cell">
<button
class="border-green-bright-300 icon-button icon-outlined-button hover:bg-green-bright-50 focus:bg-green-bright-50"
aria-label="go to last evaluated cell"
data-el-focus-cell-button
data-target={@cell_id}
>
<.remix_icon icon="loader-3-line" class="text-xl text-green-bright-400" />
</button>
</span>
"""
end
defp global_status(%{status: :errored} = assigns) do
~H"""
<span class="tooltip left" data-tooltip="Go to last evaluated cell">
<button
class="border-red-300 icon-button icon-outlined-button hover:bg-red-50 focus:bg-red-50"
aria-label="go to last evaluated cell"
data-el-focus-cell-button
data-target={@cell_id}
>
<.remix_icon icon="loader-3-line" class="text-xl text-red-400" />
</button>
</span>
"""
end
defp global_status(%{status: :stale} = assigns) do
~H"""
<span class="tooltip left" data-tooltip="Go to first stale cell">
<button
class="border-yellow-bright-200 icon-button icon-outlined-button hover:bg-yellow-bright-50 focus:bg-yellow-bright-50"
aria-label="go to first stale cell"
data-el-focus-cell-button
data-target={@cell_id}
>
<.remix_icon icon="loader-3-line" class="text-xl text-yellow-bright-300" />
</button>
</span>
"""
end
defp global_status(%{status: :fresh} = assigns) do
~H"""
<span class="tooltip left" data-tooltip="Ready to evaluate">
<div
class="border-gray-200 icon-button icon-outlined-button hover:bg-gray-100 focus:bg-gray-100"
aria-label="ready to evaluate"
>
<.remix_icon icon="loader-3-line" class="text-xl text-gray-400" />
</div>
</span>
"""
end
defp insert_mode_indicator(assigns) do
~H"""
<%!-- Note: this indicator is shown/hidden using CSS based on the current mode --%>
<span class="tooltip left" data-tooltip="Insert mode" data-el-insert-mode-indicator>
<span class="text-sm font-medium text-gray-400 cursor-default">
ins
</span>
</span>
"""
end
end

File diff suppressed because it is too large Load diff