Packages
livebook
0.13.1
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/session_live/rename_file_entry_component.ex
defmodule LivebookWeb.SessionLive.RenameFileEntryComponent do
use LivebookWeb, :live_component
import Ecto.Changeset
@impl true
def update(assigns, socket) do
socket =
socket
|> assign(assigns)
|> assign_new(:changeset, fn -> changeset(assigns.file_entry) end)
{:ok, socket}
end
defp changeset(file_entry, attrs \\ %{}) do
data = %{name: file_entry.name}
types = %{name: :string}
cast({data, types}, attrs, [:name])
|> validate_required([:name])
|> Livebook.Notebook.validate_file_entry_name(:name)
end
@impl true
def render(assigns) do
~H"""
<div class="flex flex-col space-y-4">
<h3 class="text-2xl font-semibold text-gray-800">
Rename file
</h3>
<.form
:let={f}
for={@changeset}
as={:data}
id="rename-file-entry-form"
phx-change="validate"
phx-submit="submit"
phx-target={@myself}
>
<.text_field
field={f[:name]}
label="Name"
id="add-file-entry-form-name"
autocomplete="off"
phx-debounce="200"
autofocus
/>
<div class="mt-6 flex space-x-3">
<.button type="submit" disabled={not @changeset.valid?}>
<.spinner class="hidden phx-submit-loading:block mr-2" />
<span>Rename</span>
</.button>
<.button color="gray" outlined patch={~p"/sessions/#{@session.id}"}>
Cancel
</.button>
</div>
</.form>
</div>
"""
end
@impl true
def handle_event("validate", %{"data" => data}, socket) do
changeset =
socket.assigns.file_entry
|> changeset(data)
|> Map.replace!(:action, :validate)
{:noreply, assign(socket, changeset: changeset)}
end
def handle_event("submit", %{"data" => data}, socket) do
%{file_entry: file_entry} = socket.assigns
file_entry
|> changeset(data)
|> apply_action(:insert)
|> case do
{:ok, data} ->
Livebook.Session.rename_file_entry(socket.assigns.session.pid, file_entry.name, data.name)
{:noreply, push_patch(socket, to: ~p"/sessions/#{socket.assigns.session.id}")}
{:error, changeset} ->
{:noreply, assign(socket, changeset: changeset)}
end
end
end