2023-03-07 01:14:33 +08:00
|
|
|
defmodule LivebookWeb.OpenLive.UploadComponent do
|
2021-11-01 20:59:39 +08:00
|
|
|
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">
|
2022-02-05 00:05:38 +08:00
|
|
|
<p class="text-gray-700" id="import-from-file">
|
2023-03-07 01:14:33 +08:00
|
|
|
Drag and drop a .livemd file below to import it.
|
2021-11-01 20:59:39 +08:00
|
|
|
</p>
|
2023-07-19 03:31:25 +08:00
|
|
|
<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.notebook}
|
|
|
|
label="Notebook"
|
|
|
|
on_clear={JS.push("clear_file", target: @myself)}
|
|
|
|
/>
|
2021-11-01 20:59:39 +08:00
|
|
|
</div>
|
|
|
|
<%= if @error do %>
|
|
|
|
<div class="text-red-500 text-sm py-2">
|
|
|
|
You can only upload files with .livemd extension.
|
|
|
|
</div>
|
|
|
|
<% end %>
|
2022-08-02 21:51:02 +08:00
|
|
|
<button
|
|
|
|
type="submit"
|
|
|
|
class="mt-5 button-base button-blue"
|
2023-07-19 03:31:25 +08:00
|
|
|
disabled={@error or upload_disabled?(@uploads.notebook)}
|
2022-08-02 21:51:02 +08:00
|
|
|
>
|
2021-11-01 20:59:39 +08:00
|
|
|
Import
|
|
|
|
</button>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
"""
|
|
|
|
end
|
|
|
|
|
2023-07-06 02:01:12 +08:00
|
|
|
@impl true
|
2021-11-01 20:59:39 +08:00
|
|
|
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
|
|
|
|
|
2023-07-19 03:31:25 +08:00
|
|
|
def handle_event("clear_file", _params, socket) do
|
|
|
|
{socket, _entries} = Phoenix.LiveView.Upload.maybe_cancel_uploads(socket)
|
|
|
|
{:noreply, assign(socket, error: false)}
|
|
|
|
end
|
|
|
|
|
2021-11-01 20:59:39 +08:00
|
|
|
def handle_event("save", _params, socket) do
|
|
|
|
consume_uploaded_entries(socket, :notebook, fn %{path: path}, _entry ->
|
|
|
|
content = File.read!(path)
|
|
|
|
|
2023-03-07 01:14:33 +08:00
|
|
|
send(self(), {:import_source, content, []})
|
2022-03-16 18:33:53 +08:00
|
|
|
|
|
|
|
{:ok, :ok}
|
2021-11-01 20:59:39 +08:00
|
|
|
end)
|
|
|
|
|
|
|
|
{:noreply, socket}
|
|
|
|
end
|
|
|
|
end
|