diff --git a/lib/livebook_web/live/path_select_component.ex b/lib/livebook_web/live/path_select_component.ex index 371a3caed..2633c21b7 100644 --- a/lib/livebook_web/live/path_select_component.ex +++ b/lib/livebook_web/live/path_select_component.ex @@ -20,14 +20,22 @@ defmodule LivebookWeb.PathSelectComponent do @impl true def mount(socket) do inner_block = Map.get(socket.assigns, :inner_block, nil) - {:ok, assign(socket, inner_block: inner_block, current_dir: nil)} + {:ok, assign(socket, inner_block: inner_block, current_dir: nil, new_directory_name: nil)} end @impl true def update(assigns, socket) do {force_reload?, assigns} = Map.pop(assigns, :force_reload, false) - %{assigns: assigns} = socket = assign(socket, assigns) + socket = + socket + |> assign(assigns) + |> update_files(force_reload?) + + {:ok, socket} + end + + defp update_files(%{assigns: assigns} = socket, force_reload?) do {dir, basename} = split_path(assigns.path) dir = Path.expand(dir) @@ -38,14 +46,14 @@ defmodule LivebookWeb.PathSelectComponent do assigns.files end - {:ok, assign(socket, files: annotate_matching(files, basename), current_dir: dir)} + assign(socket, files: annotate_matching(files, basename), current_dir: dir) end @impl true def render(assigns) do ~L"""
-
+
@@ -64,6 +72,17 @@ defmodule LivebookWeb.PathSelectComponent do spellcheck="false" autocomplete="off" />
+
+ + +
<%= if @inner_block do %>
<%= render_block(@inner_block) %> @@ -71,6 +90,31 @@ defmodule LivebookWeb.PathSelectComponent do <% end %>
+ <%= if @new_directory_name do %> +
+
+ + <%= remix_icon("folder-add-fill", class: "text-xl align-middle text-gray-400") %> + + +
+ +
+
+
+
+ <% end %> + <%= if highlighting?(@files) do %>
<%= for file <- @files, file.highlighted != "" do %> @@ -210,4 +254,35 @@ defmodule LivebookWeb.PathSelectComponent do path <> "/" end end + + @impl true + def handle_event("new_directory", %{}, socket) do + {:noreply, assign(socket, new_directory_name: "")} + end + + def handle_event("cancel_new_directory", %{}, socket) do + {:noreply, assign(socket, new_directory_name: nil)} + end + + def handle_event("create_directory", %{"name" => name}, socket) do + socket = + case create_directory(socket.assigns.current_dir, name) do + :ok -> + socket + |> assign(new_directory_name: nil) + |> update_files(true) + + _ -> + assign(socket, new_directory_name: name) + end + + {:noreply, socket} + end + + defp create_directory(_parent_dir, ""), do: {:error, :empty} + + defp create_directory(parent_dir, name) do + new_dir = Path.join(parent_dir, name) + File.mkdir(new_dir) + end end