Packages
livebook
0.9.2
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
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/livebook_web/live/output/control_component.ex
defmodule LivebookWeb.Output.ControlComponent do
use LivebookWeb, :live_component
@impl true
def mount(socket) do
{:ok, assign(socket, keyboard_enabled: false)}
end
@impl true
def render(%{attrs: %{type: :keyboard}} = assigns) do
~H"""
<div
class="flex"
id={"#{@id}-root"}
phx-hook="KeyboardControl"
data-keydown-enabled={to_string(@keyboard_enabled and :keydown in @attrs.events)}
data-keyup-enabled={to_string(@keyboard_enabled and :keyup in @attrs.events)}
data-target={@myself}
>
<span class="tooltip right" data-tooltip="Toggle keyboard control">
<button
class={
"button-base #{if @keyboard_enabled, do: "button-blue", else: "button-gray"} button-square-icon"
}
type="button"
aria-label="toggle keyboard control"
phx-click={JS.push("toggle_keyboard", target: @myself)}
>
<.remix_icon icon="keyboard-line" />
</button>
</span>
</div>
"""
end
def render(%{attrs: %{type: :button}} = assigns) do
~H"""
<div class="flex">
<button
class="button-base button-gray"
type="button"
phx-click={JS.push("button_click", target: @myself)}
>
<%= @attrs.label %>
</button>
</div>
"""
end
def render(%{attrs: %{type: :form}} = assigns) do
~H"""
<div>
<.live_component
module={LivebookWeb.Output.ControlFormComponent}
id={@id}
attrs={@attrs}
input_values={@input_values}
session_pid={@session_pid}
client_id={@client_id}
/>
</div>
"""
end
def render(assigns) do
~H"""
<div class="text-red-600">
Unknown control type <%= @attrs.type %>
</div>
"""
end
@impl true
def handle_event("toggle_keyboard", %{}, socket) do
socket = update(socket, :keyboard_enabled, ¬/1)
maybe_report_status(socket)
{:noreply, socket}
end
def handle_event("disable_keyboard", %{}, socket) do
socket =
if socket.assigns.keyboard_enabled do
socket = assign(socket, keyboard_enabled: false)
maybe_report_status(socket)
socket
else
socket
end
{:noreply, socket}
end
def handle_event("button_click", %{}, socket) do
report_event(socket, %{type: :click})
{:noreply, socket}
end
def handle_event("keydown", %{"key" => key}, socket) do
report_event(socket, %{type: :keydown, key: key})
{:noreply, socket}
end
def handle_event("keyup", %{"key" => key}, socket) do
report_event(socket, %{type: :keyup, key: key})
{:noreply, socket}
end
defp maybe_report_status(socket) do
if :status in socket.assigns.attrs.events do
report_event(socket, %{type: :status, enabled: socket.assigns.keyboard_enabled})
end
end
defp report_event(socket, attrs) do
topic = socket.assigns.attrs.ref
event = Map.merge(%{origin: socket.assigns.client_id}, attrs)
send(socket.assigns.attrs.destination, {:event, topic, event})
end
end