Packages
livebook
0.8.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
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/livebook_web/live/output/file_input_component.ex
defmodule LivebookWeb.Output.FileInputComponent do
use LivebookWeb, :live_component
@impl true
def mount(socket) do
{:ok, assign(socket, initialized: false)}
end
@impl true
def update(assigns, socket) do
socket = assign(socket, assigns)
socket =
if socket.assigns.initialized do
socket
else
socket
|> allow_upload(:file,
accept: socket.assigns.accept,
max_entries: 1,
progress: &handle_progress/3,
auto_upload: true
)
|> assign(initialized: true)
end
{:ok, socket}
end
@impl true
def render(assigns) do
~H"""
<form id={"#{@id}-root"} phx-change="validate" phx-target={@myself}>
<label
class="inline-flex flex-col gap-4 p-4 border-2 border-dashed border-gray-200 rounded-lg cursor-pointer"
phx-drop-target={@uploads.file.ref}
phx-hook="Dropzone"
id="upload-file-dropzone"
>
<div class="flex justify-center text-gray-500">
<%= if @value do %>
<%= @value.client_name %>
<% else %>
Click to select a file or drag a local file here
<% end %>
</div>
<.live_file_input upload={@uploads.file} class="hidden" />
</label>
</form>
"""
end
@impl true
def handle_event("validate", %{}, socket) do
{:noreply, socket}
end
defp handle_progress(:file, entry, socket) do
if entry.done? do
socket
|> consume_uploaded_entries(:file, fn %{path: path}, entry ->
destination_path =
Livebook.Session.local_file_input_path(
socket.assigns.session_id,
socket.assigns.input_id
)
destination_path |> Path.dirname() |> File.mkdir_p!()
File.cp!(path, destination_path)
{:ok, {destination_path, entry.client_name}}
end)
|> case do
[{path, client_name}] ->
# The path is always the same, so we include a random version
# to reflect a new value
value = %{
path: path,
client_name: client_name,
version: Livebook.Utils.random_short_id()
}
send_update(LivebookWeb.Output.InputComponent,
id: socket.assigns.input_component_id,
event: :change,
value: value
)
[] ->
:ok
end
end
{:noreply, socket}
end
end