Packages
livebook
0.19.3
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/open_live/upload_component.ex
defmodule LivebookWeb.OpenLive.UploadComponent do
use LivebookWeb, :live_component
@impl true
def mount(socket) do
{:ok,
socket
|> assign(:error, false)
|> allow_upload(:file, accept: ~w(.livemd), max_entries: 1)}
end
@impl true
def render(assigns) do
~H"""
<div class="flex-col space-y-5">
<p class="text-gray-700" id="import-from-file">
Drag and drop a .livemd file below to import it.
</p>
<form id="upload-file-form" phx-submit="save" phx-change="validate" phx-target={@myself}>
<div class="flex flex-col space-y-4">
<.file_drop_input
upload={@uploads.file}
label="Notebook"
on_clear={JS.push("clear_file", target: @myself)}
/>
</div>
<%= if @error do %>
<div class="text-red-500 text-sm py-2">
You can only upload files with .livemd extension.
</div>
<% end %>
<div class="mt-5">
<.button type="submit" disabled={@error or upload_disabled?(@uploads.file)}>
Import
</.button>
</div>
</form>
</div>
"""
end
@impl true
def handle_event("validate", _params, socket) do
has_error? = Enum.any?(socket.assigns.uploads.file.entries, &(not &1.valid?))
{:noreply, assign(socket, error: has_error?)}
end
def handle_event("clear_file", %{"ref" => ref}, socket) do
{:noreply,
socket
|> cancel_upload(:file, ref)
|> assign(error: false)}
end
def handle_event("save", _params, socket) do
consume_uploaded_entries(socket, :file, fn %{path: path}, _entry ->
content = File.read!(path)
send(self(), {:import_source, content, []})
{:ok, :ok}
end)
{:noreply, socket}
end
end