Packages
livebook
0.6.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
Current section
Files
Jump to
Current section
Files
lib/livebook_web/live/output/control_form_component.ex
defmodule LivebookWeb.Output.ControlFormComponent do
use LivebookWeb, :live_component
@impl true
def mount(socket) do
{:ok, assign(socket, data: %{})}
end
@impl true
def update(assigns, socket) do
prev_data = socket.assigns.data
socket = assign(socket, assigns)
data =
Map.new(assigns.attrs.fields, fn {field, input_attrs} ->
{field, assigns.input_values[input_attrs.id]}
end)
if data != prev_data do
change_data =
for {field, value} <- data,
assigns.attrs.report_changes[field],
into: %{},
do: {field, value}
if change_data != %{} do
report_event(socket, %{type: :change, data: change_data})
end
end
{:ok, assign(socket, data: data)}
end
@impl true
def render(%{attrs: %{type: :form}} = assigns) do
~H"""
<div class="flex flex-col space-y-3">
<%= for {_field, input_attrs} <- @attrs.fields do %>
<.live_component module={LivebookWeb.Output.InputComponent}
id={"#{@id}-#{input_attrs.id}"}
attrs={input_attrs}
input_values={@input_values}
local={true} />
<% end %>
<%= if @attrs.submit do %>
<div>
<button class="button-base button-blue"
type="button"
phx-click="submit"
phx-target={@myself}>
<%= @attrs.submit %>
</button>
</div>
<% end %>
</div>
"""
end
@impl true
def handle_event("submit", %{}, socket) do
report_event(socket, %{type: :submit, data: socket.assigns.data})
if socket.assigns.attrs.reset_on_submit do
reset_inputs(socket)
end
{:noreply, socket}
end
defp report_event(socket, attrs) do
topic = socket.assigns.attrs.ref
event = Map.merge(%{origin: self()}, attrs)
send(socket.assigns.attrs.destination, {:event, topic, event})
end
defp reset_inputs(socket) do
values =
for {field, input_attrs} <- socket.assigns.attrs.fields,
field in socket.assigns.attrs.reset_on_submit,
do: {input_attrs.id, input_attrs.default}
send(self(), {:set_input_values, values, true})
end
end