mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-09-10 23:14:35 +08:00
Change text inputs to apply change on blur (#1243)
This commit is contained in:
parent
2e29167229
commit
a7d7e6332d
2 changed files with 33 additions and 23 deletions
|
@ -150,11 +150,20 @@ defmodule LivebookWeb.Output.InputComponent do
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_event("change", %{"value" => html_value}, socket) do
|
def handle_event("change", %{"value" => html_value}, socket) do
|
||||||
{:noreply, handle_html_value(socket, html_value)}
|
socket = handle_html_value(socket, html_value)
|
||||||
|
|
||||||
|
socket =
|
||||||
|
if report_immediately?(socket.assigns.attrs.type) do
|
||||||
|
maybe_report_change(socket)
|
||||||
|
else
|
||||||
|
socket
|
||||||
|
end
|
||||||
|
|
||||||
|
{:noreply, socket}
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_event("blur", %{"value" => html_value}, socket) do
|
def handle_event("blur", %{"value" => html_value}, socket) do
|
||||||
socket = handle_html_value(socket, html_value)
|
socket = socket |> handle_html_value(html_value) |> maybe_report_change()
|
||||||
|
|
||||||
if socket.assigns.error do
|
if socket.assigns.error do
|
||||||
{:noreply, assign(socket, value: socket.assigns.initial_value, error: nil)}
|
{:noreply, assign(socket, value: socket.assigns.initial_value, error: nil)}
|
||||||
|
@ -164,28 +173,14 @@ defmodule LivebookWeb.Output.InputComponent do
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_event("submit", %{"value" => html_value}, socket) do
|
def handle_event("submit", %{"value" => html_value}, socket) do
|
||||||
socket = handle_html_value(socket, html_value)
|
socket = socket |> handle_html_value(html_value) |> maybe_report_change()
|
||||||
send(self(), {:queue_bound_cells_evaluation, socket.assigns.attrs.id})
|
send(self(), {:queue_bound_cells_evaluation, socket.assigns.attrs.id})
|
||||||
{:noreply, socket}
|
{:noreply, socket}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp handle_html_value(socket, html_value) do
|
defp handle_html_value(socket, html_value) do
|
||||||
current_value = socket.assigns.value
|
|
||||||
|
|
||||||
case parse(html_value, socket.assigns.attrs) do
|
case parse(html_value, socket.assigns.attrs) do
|
||||||
{:ok, ^current_value} ->
|
|
||||||
socket
|
|
||||||
|
|
||||||
{:ok, value} ->
|
{:ok, value} ->
|
||||||
send(
|
|
||||||
self(),
|
|
||||||
{:set_input_values, [{socket.assigns.attrs.id, value}], socket.assigns.local}
|
|
||||||
)
|
|
||||||
|
|
||||||
unless socket.assigns.local do
|
|
||||||
report_event(socket, value)
|
|
||||||
end
|
|
||||||
|
|
||||||
assign(socket, value: value, error: nil)
|
assign(socket, value: value, error: nil)
|
||||||
|
|
||||||
{:error, error, value} ->
|
{:error, error, value} ->
|
||||||
|
@ -193,6 +188,21 @@ defmodule LivebookWeb.Output.InputComponent do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp report_immediately?(type), do: type in [:select, :checkbox]
|
||||||
|
|
||||||
|
defp maybe_report_change(socket) when socket.assigns.error != nil, do: socket
|
||||||
|
defp maybe_report_change(%{assigns: %{value: value, initial_value: value}} = socket), do: socket
|
||||||
|
|
||||||
|
defp maybe_report_change(%{assigns: assigns} = socket) do
|
||||||
|
send(self(), {:set_input_values, [{assigns.attrs.id, assigns.value}], assigns.local})
|
||||||
|
|
||||||
|
unless assigns.local do
|
||||||
|
report_event(socket, assigns.value)
|
||||||
|
end
|
||||||
|
|
||||||
|
socket
|
||||||
|
end
|
||||||
|
|
||||||
defp parse(html_value, %{type: :text}) do
|
defp parse(html_value, %{type: :text}) do
|
||||||
{:ok, html_value}
|
{:ok, html_value}
|
||||||
end
|
end
|
||||||
|
|
|
@ -245,8 +245,8 @@ defmodule LivebookWeb.SessionLiveTest do
|
||||||
{:ok, view, _} = live(conn, "/sessions/#{session.id}")
|
{:ok, view, _} = live(conn, "/sessions/#{session.id}")
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element(~s/[data-el-outputs-container] form/)
|
|> element(~s/[data-el-outputs-container] input/)
|
||||||
|> render_change(%{"value" => "10"})
|
|> render_blur(%{"value" => "10"})
|
||||||
|
|
||||||
assert %{input_values: %{"input1" => 10}} = Session.get_data(session.pid)
|
assert %{input_values: %{"input1" => 10}} = Session.get_data(session.pid)
|
||||||
|
|
||||||
|
@ -274,8 +274,8 @@ defmodule LivebookWeb.SessionLiveTest do
|
||||||
{:ok, view, _} = live(conn, "/sessions/#{session.id}")
|
{:ok, view, _} = live(conn, "/sessions/#{session.id}")
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element(~s/[data-el-outputs-container] form/)
|
|> element(~s/[data-el-outputs-container] textarea/)
|
||||||
|> render_change(%{"value" => "line\r\nline"})
|
|> render_blur(%{"value" => "line\r\nline"})
|
||||||
|
|
||||||
assert %{input_values: %{"input1" => "line\nline"}} = Session.get_data(session.pid)
|
assert %{input_values: %{"input1" => "line\nline"}} = Session.get_data(session.pid)
|
||||||
end
|
end
|
||||||
|
@ -312,8 +312,8 @@ defmodule LivebookWeb.SessionLiveTest do
|
||||||
{:ok, view, _} = live(conn, "/sessions/#{session.id}")
|
{:ok, view, _} = live(conn, "/sessions/#{session.id}")
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element(~s/[data-el-outputs-container] form/)
|
|> element(~s/[data-el-outputs-container] input/)
|
||||||
|> render_change(%{"value" => "sherlock"})
|
|> render_blur(%{"value" => "sherlock"})
|
||||||
|
|
||||||
# The new value is on the page
|
# The new value is on the page
|
||||||
assert render(view) =~ "sherlock"
|
assert render(view) =~ "sherlock"
|
||||||
|
|
Loading…
Add table
Reference in a new issue