defmodule LivebookWeb.SessionLive.SectionComponent do
use LivebookWeb, :live_component
alias Phoenix.LiveView.JS
def render(assigns) do
~H"""
<.icon_button
aria-label="collapse section"
data-el-section-collapse-button
phx-click={
JS.set_attribute({"data-js-collapsed", ""},
to: ~s/section[data-section-id="#{@section_view.id}"]/
)
}
>
<.remix_icon icon="arrow-down-s-line" />
<.icon_button
aria-label="expand section"
data-el-section-expand-button
phx-click={
JS.remove_attribute("data-js-collapsed",
to: ~s/section[data-section-id="#{@section_view.id}"]/
)
}
>
<.remix_icon icon="arrow-right-s-line" />
<%= @section_view.name %>
<.branching_menu
section_view={@section_view}
scope="actions"
position="bottom-right"
disabled={cannot_branch_out_reason(@section_view) != nil}
>
<.icon_button
disabled={cannot_branch_out_reason(@section_view)}
aria-label="branch out from other section"
>
<.remix_icon icon="git-branch-line" class="flip-horizontally" />
<.icon_button href={"##{@section_view.html_id}"} aria-label="link to section">
<.remix_icon icon="link" />
<.icon_button
aria-label="move section up"
phx-click="move_section"
phx-value-section_id={@section_view.id}
phx-value-offset="-1"
>
<.remix_icon icon="arrow-up-s-line" />
<.icon_button
aria-label="move section down"
phx-click="move_section"
phx-value-section_id={@section_view.id}
phx-value-offset="1"
>
<.remix_icon icon="arrow-down-s-line" />
<.icon_button
disabled={@section_view.has_children?}
aria-label="delete section"
phx-click="delete_section"
phx-value-section_id={@section_view.id}
>
<.remix_icon icon="delete-bin-6-line" />
<.remix_icon
icon="git-branch-line"
class="text-lg font-normal flip-horizontally leading-none"
/>
<.branching_menu section_view={@section_view} scope="subheading" position="bottom-left">
from ”{@section_view.parent.name}”
{LivebookWeb.HTMLHelpers.pluralize(length(@section_view.cell_views), "cell", "cells")} collapsed
<.live_component
module={LivebookWeb.SessionLive.InsertButtonsComponent}
id={"insert-buttons-#{@section_view.id}-first"}
persistent={@section_view.cell_views == []}
smart_cell_definitions={@smart_cell_definitions}
example_snippet_definitions={@example_snippet_definitions}
runtime_status={@runtime_status}
section_id={@section_view.id}
cell_id={nil}
session_id={@session_id}
default_language={@default_language}
/>
<%= for {cell_view, index} <- Enum.with_index(@section_view.cell_views) do %>
<.live_component
module={LivebookWeb.SessionLive.CellComponent}
id={cell_view.id}
session_id={@session_id}
session_pid={@session_pid}
client_id={@client_id}
runtime_status={@runtime_status}
installing?={@installing?}
allowed_uri_schemes={@allowed_uri_schemes}
cell_view={cell_view}
/>
<.live_component
module={LivebookWeb.SessionLive.InsertButtonsComponent}
id={"insert-buttons-#{@section_view.id}-#{index}"}
persistent={false}
smart_cell_definitions={@smart_cell_definitions}
example_snippet_definitions={@example_snippet_definitions}
runtime_status={@runtime_status}
section_id={@section_view.id}
cell_id={cell_view.id}
session_id={@session_id}
default_language={@default_language}
/>
<% end %>
"""
end
attr :section_view, :map, required: true
attr :scope, :string, required: true
attr :position, :string, required: true
attr :disabled, :boolean, default: false
slot :inner_block, required: true
defp branching_menu(assigns) do
~H"""
<.menu
id={"section-#{@section_view.id}-branch-menu-#{@scope}"}
position={@position}
disabled={@disabled}
>
<:toggle>
{render_slot(@inner_block)}
<%= if @section_view.parent do %>
<.menu_item>
<.remix_icon icon="close-line" />
Clear
<% end %>
<.menu_item :for={parent <- @section_view.valid_parents}>
<.remix_icon
:if={@section_view.parent}
icon="arrow-right-s-line"
class={[(@section_view.parent && @section_view.parent.id == parent.id) || "invisible"]}
/>
{parent.name}
"""
end
defp cannot_branch_out_reason(%{valid_parents: []}),
do: "No section to branch out from"
defp cannot_branch_out_reason(%{has_children?: true}),
do: "Cannot branch out this section because\nother sections branch from it"
defp cannot_branch_out_reason(_section_view), do: nil
end