From bd6ca8f0b55eba4413295aff113f5d0e25f62e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20K=C5=82osko?= Date: Wed, 7 Jul 2021 11:21:13 +0200 Subject: [PATCH] Rewrite tooltips into function component --- lib/livebook_web/helpers.ex | 52 +++++++++++++++++++ lib/livebook_web/live/home_live.ex | 9 ++-- .../live/output/table_dynamic_live.ex | 4 +- lib/livebook_web/live/session_live.ex | 8 +-- .../live/session_live/bin_component.ex | 8 +-- .../live/session_live/cell_component.ex | 32 ++++++------ .../live/session_live/indicators_component.ex | 36 ++++++------- .../live/session_live/section_component.ex | 16 +++--- lib/livebook_web/live/sidebar_helpers.ex | 12 ++--- 9 files changed, 113 insertions(+), 64 deletions(-) diff --git a/lib/livebook_web/helpers.ex b/lib/livebook_web/helpers.ex index b1dc85313..7f7ca41ef 100644 --- a/lib/livebook_web/helpers.ex +++ b/lib/livebook_web/helpers.ex @@ -193,4 +193,56 @@ defmodule LivebookWeb.Helpers do """ end + + @doc """ + Adds a tooltip to the inner content. + + ## Example + + <.tooltip label="Click me"> + + <./tooltip> + + <.tooltip + label="Click me" + direction="right" + distance="28px" + if={@some_condition}> + + <./tooltip> + """ + def tooltip(assigns) + + def tooltip(%{if: false} = assigns) do + ~H""" + + <%= render_block(@inner_block) %> + + """ + end + + def tooltip(assigns) do + assigns = + assigns + |> assign_new(:direction, fn -> "top" end) + |> assign_new(:distance, fn -> "4px" end) + |> assign_new(:class, fn -> "" end) + |> assign_new(:style, fn -> "" end) + |> assign(:attrs, assigns_to_attributes(assigns, [:direction, :label, :class, :style])) + + if assigns.direction not in ["top", "bottom", "right", "left"] do + raise ArgumentError, + ~s{expected direction to be either "top", "bottom", "right" or "left", got: #{inspect(assigns.direction)}} + end + + ~H""" + + <%= render_block(@inner_block) %> + + """ + end end diff --git a/lib/livebook_web/live/home_live.ex b/lib/livebook_web/live/home_live.ex index fcac07ccc..bb89d647f 100644 --- a/lib/livebook_web/live/home_live.ex +++ b/lib/livebook_web/live/home_live.ex @@ -72,17 +72,14 @@ defmodule LivebookWeb.HomeLive do to: Routes.session_path(@socket, :page, session_id_by_path(@path, @session_summaries)), class: "button button-blue" %> <% else %> - + <.tooltip label="This file is write-protected, please fork instead" + if={File.regular?(@path) and not file_writable?(@path)}> - + <% end %> <% end %> diff --git a/lib/livebook_web/live/output/table_dynamic_live.ex b/lib/livebook_web/live/output/table_dynamic_live.ex index 42134946d..c278c4772 100644 --- a/lib/livebook_web/live/output/table_dynamic_live.ex +++ b/lib/livebook_web/live/output/table_dynamic_live.ex @@ -51,11 +51,11 @@ defmodule LivebookWeb.Output.TableDynamicLive do
<%= if :refetch in @features do %> - + <.tooltip label="Refetch" direction="left"> - + <% end %>
diff --git a/lib/livebook_web/live/session_live.ex b/lib/livebook_web/live/session_live.ex index 67d8d47b0..5482b745e 100644 --- a/lib/livebook_web/live/session_live.ex +++ b/lib/livebook_web/live/session_live.ex @@ -147,20 +147,20 @@ defmodule LivebookWeb.SessionLive do <%= user.name || "Anonymous" %> <%= if client_pid != @self do %> - - - + <.tooltip label="Unfollow this user" direction="left" data-element="client-follow-toggle" data-meta="unfollow"> - + <% end %> <% end %> diff --git a/lib/livebook_web/live/session_live/bin_component.ex b/lib/livebook_web/live/session_live/bin_component.ex index a5fa4cad6..531edd936 100644 --- a/lib/livebook_web/live/session_live/bin_component.ex +++ b/lib/livebook_web/live/session_live/bin_component.ex @@ -70,22 +70,22 @@ defmodule LivebookWeb.SessionLive.BinComponent do <%= format_date_relatively(entry.deleted_at) %>

- + <.tooltip label="Copy source" direction="left"> - - + + <.tooltip label="Restore" direction="left"> - +
diff --git a/lib/livebook_web/live/session_live/cell_component.ex b/lib/livebook_web/live/session_live/cell_component.ex index 7541f7c3e..6ddb7d570 100644 --- a/lib/livebook_web/live/session_live/cell_component.ex +++ b/lib/livebook_web/live/session_live/cell_component.ex @@ -20,17 +20,17 @@ defmodule LivebookWeb.SessionLive.CellComponent do
<.cell_link_button cell_id={@cell_view.id} /> - + <.tooltip label="Edit content" data-element="enable-insert-mode-button"> - - + + <.tooltip label="Insert image" data-element="insert-image-button"> <%= live_patch to: Routes.session_path(@socket, :cell_upload, @session_id, @cell_view.id), class: "icon-button" do %> <.remix_icon icon="image-add-line" class="text-xl" /> <% end %> - + <.move_cell_up_button cell_id={@cell_view.id} /> <.move_cell_down_button cell_id={@cell_view.id} /> <.delete_cell_button cell_id={@cell_view.id} /> @@ -158,59 +158,59 @@ defmodule LivebookWeb.SessionLive.CellComponent do defp cell_link_button(assigns) do ~H""" - + <.tooltip label="Link"> <.remix_icon icon="link" class="text-xl" /> - + """ end defp cell_settings_button(assigns) do ~H""" - + <.tooltip label="Cell settings"> <%= live_patch to: Routes.session_path(@socket, :cell_settings, @session_id, @cell_id), class: "icon-button" do %> <.remix_icon icon="list-settings-line" class="text-xl" /> <% end %> - + """ end defp move_cell_up_button(assigns) do ~H""" - + <.tooltip label="Move up"> - + """ end defp move_cell_down_button(assigns) do ~H""" - + <.tooltip label="Move down"> - + """ end defp delete_cell_button(assigns) do ~H""" - + <.tooltip label="Delete"> - + """ end @@ -312,7 +312,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do |> assign_new(:tooltip, fn -> nil end) ~H""" -
+ <.tooltip label={@tooltip} direction="bottom" distance="10px" if={@tooltip != nil}>
<%= render_block(@inner_block) %> @@ -327,7 +327,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
-
+ """ end diff --git a/lib/livebook_web/live/session_live/indicators_component.ex b/lib/livebook_web/live/session_live/indicators_component.ex index f4bf685e3..e3f535940 100644 --- a/lib/livebook_web/live/session_live/indicators_component.ex +++ b/lib/livebook_web/live/session_live/indicators_component.ex @@ -7,27 +7,27 @@ defmodule LivebookWeb.SessionLive.IndicatorsComponent do
<%= if @path do %> <%= if @dirty do %> - + <.tooltip label="Autosave pending" direction="left"> <%= live_patch to: Routes.session_path(@socket, :file_settings, @session_id), class: "icon-button icon-outlined-button border-blue-400 hover:bg-blue-50 focus:bg-blue-50" do %> <.remix_icon icon="save-line" class="text-xl text-blue-500" /> <% end %> - + <% else %> - + <.tooltip label="Notebook saved" direction="left"> <%= live_patch to: Routes.session_path(@socket, :file_settings, @session_id), class: "icon-button icon-outlined-button border-green-300 hover:bg-green-50 focus:bg-green-50" do %> <.remix_icon icon="save-line" class="text-xl text-green-400" /> <% end %> - + <% end %> <% else %> - + <.tooltip label="Choose a file to save the notebook" direction="left"> <%= live_patch to: Routes.session_path(@socket, :file_settings, @session_id), class: "icon-button icon-outlined-button border-gray-200 hover:bg-gray-100 focus:bg-gray-100" do %> <.remix_icon icon="save-line" class="text-xl text-gray-400" /> <% end %> - + <% end %> <%= if @runtime do %> @@ -35,67 +35,67 @@ defmodule LivebookWeb.SessionLive.IndicatorsComponent do status={elem(@global_evaluation_status, 0)} cell_id={elem(@global_evaluation_status, 1)} /> <% else %> - + <.tooltip label="Choose a runtime to run the notebook in" direction="left"> <%= live_patch to: Routes.session_path(@socket, :runtime_settings, @session_id), class: "icon-button icon-outlined-button border-gray-200 hover:bg-gray-100 focus:bg-gray-100" do %> <.remix_icon icon="loader-3-line" class="text-xl text-gray-400" /> <% end %> - + <% end %> <%# Note: this indicator is shown/hidden using CSS based on the current mode %> - + <.tooltip label="Insert mode" data-element="insert-mode-indicator" direction="left"> ins - +
""" end defp global_evaluation_status(%{status: :evaluating} = assigns) do ~H""" - + <.tooltip label="Go to evaluating cell" direction="left"> - + """ end defp global_evaluation_status(%{status: :evaluated} = assigns) do ~H""" - + <.tooltip label="Go to last evaluated cell" direction="left"> - + """ end defp global_evaluation_status(%{status: :stale} = assigns) do ~H""" - + <.tooltip label="Go to first stale cell" direction="left"> - + """ end defp global_evaluation_status(%{status: :fresh} = assigns) do ~H""" - + <.tooltip label="Ready to evaluate" direction="left"> - + """ end end diff --git a/lib/livebook_web/live/session_live/section_component.ex b/lib/livebook_web/live/session_live/section_component.ex index 026449e7a..53ef98733 100644 --- a/lib/livebook_web/live/session_live/section_component.ex +++ b/lib/livebook_web/live/session_live/section_component.ex @@ -18,33 +18,33 @@ defmodule LivebookWeb.SessionLive.SectionComponent do <%# ^ Note it's important there's no space between

and

because we want the content to exactly match section name. %>
- + <.tooltip label="Link"> <.remix_icon icon="link" class="text-xl" /> - - + + <.tooltip label="Move up"> - - + + <.tooltip label="Move down"> - - + + <.tooltip label="Delete"> <%= live_patch to: Routes.session_path(@socket, :delete_section, @session_id, @section_view.id), class: "icon-button" do %> <.remix_icon icon="delete-bin-6-line" class="text-xl" /> <% end %> - +
diff --git a/lib/livebook_web/live/sidebar_helpers.ex b/lib/livebook_web/live/sidebar_helpers.ex index 656f8133e..4ea708097 100644 --- a/lib/livebook_web/live/sidebar_helpers.ex +++ b/lib/livebook_web/live/sidebar_helpers.ex @@ -32,23 +32,23 @@ defmodule LivebookWeb.SidebarHelpers do def button_item(assigns) do ~H""" - + <.tooltip label={@label} direction="right" distance="28px"> - + """ end def link_item(assigns) do ~H""" - + <.tooltip label={@label} direction="right" distance="28px"> <%= live_patch to: @path, class: "text-gray-400 hover:text-gray-50 focus:text-gray-50 rounded-xl h-10 w-10 flex items-center justify-center #{if(@active, do: "text-gray-50 bg-gray-700")}" do %> <.remix_icon icon={@icon} class="text-2xl" /> <% end %> - + """ end @@ -60,11 +60,11 @@ defmodule LivebookWeb.SidebarHelpers do def user_item(assigns) do ~H""" - + <.tooltip label="User profile" direction="right" distance="28px"> <%= live_patch to: @path, class: "text-gray-400 rounded-xl h-8 w-8 flex items-center justify-center" do %> <.user_avatar user={@current_user} text_class="text-xs" /> <% end %> - + """ end end