Packages
livebook
0.9.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/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(:notebook, 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-drop-target={@uploads.notebook.ref}
phx-target={@myself}
class="flex flex-col items-start"
>
<.live_file_input
upload={@uploads.notebook}
class="hidden"
aria-labelledby="import-from-file"
/>
<div
class="flex flex-col justify-center items-center w-full rounded-xl border-2 border-dashed border-gray-400 h-48"
phx-hook="Dropzone"
id="import-file-upload-dropzone"
>
<%= if @uploads.notebook.entries == [] do %>
<span name="placeholder" class="font-medium text-gray-400">Drop your notebook here</span>
<% else %>
<div :for={file <- @uploads.notebook.entries} class="flex items-center">
<span class="font-medium text-gray-400"><%= file.client_name %></span>
<button
type="button"
class="icon-button"
phx-click="clear-file"
phx-target={@myself}
tabindex="-1"
>
<.remix_icon icon="close-line" class="text-xl text-gray-300 hover:text-gray-500" />
</button>
</div>
<% end %>
</div>
<%= if @error do %>
<div class="text-red-500 text-sm py-2">
You can only upload files with .livemd extension.
</div>
<% end %>
<button
type="submit"
class="mt-5 button-base button-blue"
disabled={@uploads.notebook.entries == [] || @error}
>
Import
</button>
</form>
</div>
"""
end
@impl Phoenix.LiveComponent
def handle_event("clear-file", _params, socket) do
{socket, _entries} = Phoenix.LiveView.Upload.maybe_cancel_uploads(socket)
{:noreply, assign(socket, error: false)}
end
@impl Phoenix.LiveComponent
def handle_event("validate", _params, socket) do
has_error? = Enum.any?(socket.assigns.uploads.notebook.entries, &(not &1.valid?))
{:noreply, assign(socket, error: has_error?)}
end
@impl Phoenix.LiveComponent
def handle_event("save", _params, socket) do
consume_uploaded_entries(socket, :notebook, fn %{path: path}, _entry ->
content = File.read!(path)
send(self(), {:import_source, content, []})
{:ok, :ok}
end)
{:noreply, socket}
end
end