From 1a895e4b29cb0e7692274bed0efd6a605f8cf1b0 Mon Sep 17 00:00:00 2001 From: Adarsh Menon Date: Thu, 29 Dec 2022 22:32:52 +0100 Subject: [PATCH] Make image a block item instead of a button in the Markdown editor (#1439) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jonatan Kłosko --- lib/livebook_web/live/session_live.ex | 32 +++++++++++++++++-- .../live/session_live/cell_component.ex | 14 -------- .../session_live/cell_upload_component.ex | 9 ++---- .../session_live/insert_buttons_component.ex | 7 ++++ .../live/session_live/section_component.ex | 2 ++ lib/livebook_web/router.ex | 2 +- 6 files changed, 43 insertions(+), 23 deletions(-) diff --git a/lib/livebook_web/live/session_live.ex b/lib/livebook_web/live/session_live.ex index b8df279d1..008910213 100644 --- a/lib/livebook_web/live/session_live.ex +++ b/lib/livebook_web/live/session_live.ex @@ -352,8 +352,8 @@ defmodule LivebookWeb.SessionLive do id="cell-upload" session={@session} return_to={@self_path} - cell={@cell} uploads={@uploads} + cell_upload_metadata={@cell_upload_metadata} /> <% end %> @@ -890,11 +890,22 @@ defmodule LivebookWeb.SessionLive do @impl true def handle_params(%{"cell_id" => cell_id}, _url, socket) - when socket.assigns.live_action in [:cell_settings, :cell_upload] do + when socket.assigns.live_action == :cell_settings do {:ok, cell, _} = Notebook.fetch_cell_and_section(socket.private.data.notebook, cell_id) {:noreply, assign(socket, cell: cell)} end + def handle_params(%{"section_id" => section_id, "cell_id" => cell_id}, _url, socket) + when socket.assigns.live_action == :cell_upload do + cell_id = + case cell_id do + "" -> nil + id -> id + end + + {:noreply, assign(socket, cell_upload_metadata: %{section_id: section_id, cell_id: cell_id})} + end + def handle_params(%{"section_id" => section_id}, _url, socket) when socket.assigns.live_action == :delete_section do {:ok, section} = Notebook.fetch_section(socket.private.data.notebook, section_id) @@ -1425,6 +1436,17 @@ defmodule LivebookWeb.SessionLive do {:noreply, socket} end + def handle_info({:cell_upload_complete, metadata, url}, socket) do + params = %{ + "type" => "image", + "section_id" => metadata.section_id, + "cell_id" => metadata.cell_id, + "url" => url + } + + handle_event("insert_cell_below", params, socket) + end + def handle_info({:set_secret, secret}, socket) do livebook_secrets = Map.put(socket.assigns.livebook_secrets, secret.name, secret.value) @@ -1795,6 +1817,12 @@ defmodule LivebookWeb.SessionLive do {:markdown, %{source: source}} end + defp cell_type_and_attrs_from_params(%{"type" => "image", "url" => url}) do + source = "![](#{url})" + + {:markdown, %{source: source}} + end + defp section_with_next_index(notebook, section_id, cell_id) defp section_with_next_index(notebook, section_id, nil) do diff --git a/lib/livebook_web/live/session_live/cell_component.ex b/lib/livebook_web/live/session_live/cell_component.ex index 1d5b63022..755a53cae 100644 --- a/lib/livebook_web/live/session_live/cell_component.ex +++ b/lib/livebook_web/live/session_live/cell_component.ex @@ -28,7 +28,6 @@ defmodule LivebookWeb.SessionLive.CellComponent do <.cell_actions> <:secondary> <.enable_insert_mode_button /> - <.insert_image_button cell_id={@cell_view.id} session_id={@session_id} socket={@socket} /> <.cell_link_button cell_id={@cell_view.id} /> <.move_cell_up_button cell_id={@cell_view.id} /> <.move_cell_down_button cell_id={@cell_view.id} /> @@ -381,19 +380,6 @@ defmodule LivebookWeb.SessionLive.CellComponent do """ end - defp insert_image_button(assigns) do - ~H""" - - <%= live_patch to: Routes.session_path(@socket, :cell_upload, @session_id, @cell_id), - class: "icon-button", - aria_label: "insert image", - role: "button" do %> - <.remix_icon icon="image-add-line" class="text-xl" /> - <% end %> - - """ - end - defp toggle_source_button(assigns) do ~H""" diff --git a/lib/livebook_web/live/session_live/cell_upload_component.ex b/lib/livebook_web/live/session_live/cell_upload_component.ex index 67a63dc1c..44b1fd8bb 100644 --- a/lib/livebook_web/live/session_live/cell_upload_component.ex +++ b/lib/livebook_web/live/session_live/cell_upload_component.ex @@ -92,12 +92,9 @@ defmodule LivebookWeb.SessionLive.CellUploadComponent do end) |> case do [{:ok, filename}] -> - src_path = "images/#{URI.encode(filename, &URI.char_unreserved?/1)}" - - {:noreply, - socket - |> push_patch(to: socket.assigns.return_to) - |> push_event("cell_upload", %{cell_id: socket.assigns.cell.id, url: src_path})} + url = "images/#{URI.encode(filename, &URI.char_unreserved?/1)}" + send(self(), {:cell_upload_complete, socket.assigns.cell_upload_metadata, url}) + {:noreply, push_patch(socket, to: socket.assigns.return_to)} [{:error, message}] -> {:noreply, assign(socket, error_message: message)} diff --git a/lib/livebook_web/live/session_live/insert_buttons_component.ex b/lib/livebook_web/live/session_live/insert_buttons_component.ex index 2183707bd..1bcc03b9e 100644 --- a/lib/livebook_web/live/session_live/insert_buttons_component.ex +++ b/lib/livebook_web/live/session_live/insert_buttons_component.ex @@ -59,6 +59,13 @@ defmodule LivebookWeb.SessionLive.InsertButtonsComponent do <.remix_icon icon="organization-chart" /> Diagram + <%= live_patch to: Routes.session_path(@socket, :cell_upload, @session_id, section_id: @section_id, cell_id: @cell_id), + class: "menu-item text-gray-500", + aria_label: "insert image", + role: "menuitem" do %> + <.remix_icon icon="image-add-line" /> + Image + <% end %> <%= cond do %> diff --git a/lib/livebook_web/live/session_live/section_component.ex b/lib/livebook_web/live/session_live/section_component.ex index f665231b4..bc266f9b4 100644 --- a/lib/livebook_web/live/session_live/section_component.ex +++ b/lib/livebook_web/live/session_live/section_component.ex @@ -133,6 +133,7 @@ defmodule LivebookWeb.SessionLive.SectionComponent do runtime={@runtime} section_id={@section_view.id} cell_id={nil} + session_id={@session_id} /> <%= for {cell_view, index} <- Enum.with_index(@section_view.cell_views) do %> <.live_component @@ -152,6 +153,7 @@ defmodule LivebookWeb.SessionLive.SectionComponent do runtime={@runtime} section_id={@section_view.id} cell_id={cell_view.id} + session_id={@session_id} /> <% end %> diff --git a/lib/livebook_web/router.ex b/lib/livebook_web/router.ex index 6720cd749..b6614fc7a 100644 --- a/lib/livebook_web/router.ex +++ b/lib/livebook_web/router.ex @@ -82,7 +82,7 @@ defmodule LivebookWeb.Router do get "/sessions/:id/export/download/:format", SessionController, :download_source live "/sessions/:id/export/:tab", SessionLive, :export live "/sessions/:id/cell-settings/:cell_id", SessionLive, :cell_settings - live "/sessions/:id/cell-upload/:cell_id", SessionLive, :cell_upload + live "/sessions/:id/cell-upload", SessionLive, :cell_upload live "/sessions/:id/delete-section/:section_id", SessionLive, :delete_section live "/sessions/:id/package-search", SessionLive, :package_search get "/sessions/:id/images/:image", SessionController, :show_image