mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-03-13 00:04:42 +08:00
Move session markup to a separate file (#2452)
This commit is contained in:
parent
9bc0832e03
commit
8e6a017414
6 changed files with 1265 additions and 1221 deletions
|
@ -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}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
@ -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
|
|
1247
lib/livebook_web/live/session_live/render.ex
Normal file
1247
lib/livebook_web/live/session_live/render.ex
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue