diff --git a/lib/livebook_web/helpers.ex b/lib/livebook_web/helpers.ex index 9eb813544..ffab6393c 100644 --- a/lib/livebook_web/helpers.ex +++ b/lib/livebook_web/helpers.ex @@ -250,12 +250,14 @@ defmodule LivebookWeb.Helpers do <.labeled_text label="Name" text="Sherlock Holmes" /> """ def labeled_text(assigns) do + assigns = assign_new(assigns, :one_line, fn -> false end) + ~H"""
<%= @label %> - + <%= @text %>
diff --git a/lib/livebook_web/live/home_live.ex b/lib/livebook_web/live/home_live.ex index c357cfc53..cc7367d67 100644 --- a/lib/livebook_web/live/home_live.ex +++ b/lib/livebook_web/live/home_live.ex @@ -13,7 +13,7 @@ defmodule LivebookWeb.HomeLive do Phoenix.PubSub.subscribe(Livebook.PubSub, "tracker_sessions") end - sessions = sort_sessions(Sessions.list_sessions()) + sessions = Sessions.list_sessions() notebook_infos = Notebook.Explore.visible_notebook_infos() |> Enum.take(3) {:ok, @@ -87,7 +87,7 @@ defmodule LivebookWeb.HomeLive do
-

+

Explore

<%= live_redirect to: Routes.explore_path(@socket, :page), @@ -104,12 +104,10 @@ defmodule LivebookWeb.HomeLive do <% end %>
-
-

- Running sessions -

- <.sessions_list sessions={@sessions} socket={@socket} /> + <.live_component module={LivebookWeb.HomeLive.SessionListComponent} + id="session-list" + sessions={@sessions} />
@@ -149,68 +147,6 @@ defmodule LivebookWeb.HomeLive do end end - defp sessions_list(%{sessions: []} = assigns) do - ~H""" -
-
- <.remix_icon icon="windy-line" class="text-gray-400 text-xl" /> -
-
- You do not have any running sessions. -
- Please create a new one by clicking “New notebook” -
-
- """ - end - - defp sessions_list(assigns) do - ~H""" -
- <%= for session <- @sessions do %> -
-
- <%= live_redirect session.notebook_name, - to: Routes.session_path(@socket, :page, session.id), - class: "font-semibold text-gray-800 hover:text-gray-900" %> -
- <%= if session.file, do: session.file.path, else: "No file" %> -
-
- Created <%= format_creation_date(session.created_at) %> -
-
-
- - -
-
- <% end %> -
- """ - end - @impl true def handle_params(%{"session_id" => session_id}, _url, socket) do session = Enum.find(socket.assigns.sessions, &(&1.id == session_id)) @@ -323,8 +259,7 @@ defmodule LivebookWeb.HomeLive do if session in socket.assigns.sessions do {:noreply, socket} else - sessions = sort_sessions([session | socket.assigns.sessions]) - {:noreply, assign(socket, sessions: sessions)} + {:noreply, assign(socket, sessions: [session | socket.assigns.sessions])} end end @@ -349,10 +284,6 @@ defmodule LivebookWeb.HomeLive do def handle_info(_message, socket), do: {:noreply, socket} - defp sort_sessions(sessions) do - Enum.sort_by(sessions, & &1.created_at, {:desc, DateTime}) - end - defp files(sessions) do Enum.map(sessions, & &1.file) end @@ -390,11 +321,6 @@ defmodule LivebookWeb.HomeLive do session.id end - def format_creation_date(created_at) do - time_words = created_at |> DateTime.to_naive() |> Livebook.Utils.Time.time_ago_in_words() - time_words <> " ago" - end - defp import_content(socket, content, session_opts) do {notebook, messages} = Livebook.LiveMarkdown.Import.notebook_from_markdown(content) diff --git a/lib/livebook_web/live/home_live/session_list_component.ex b/lib/livebook_web/live/home_live/session_list_component.ex new file mode 100644 index 000000000..3062bfabc --- /dev/null +++ b/lib/livebook_web/live/home_live/session_list_component.ex @@ -0,0 +1,140 @@ +defmodule LivebookWeb.HomeLive.SessionListComponent do + use LivebookWeb, :live_component + + @impl true + def mount(socket) do + {:ok, assign(socket, order_by: "date")} + end + + @impl true + def update(assigns, socket) do + {sessions, assigns} = Map.pop!(assigns, :sessions) + + sessions = sort_sessions(sessions, socket.assigns.order_by) + + socket = + socket + |> assign(assigns) + |> assign(:sessions, sessions) + + {:ok, socket} + end + + @impl true + def render(assigns) do + ~H""" +
+
+

+ Running sessions (<%= length(@sessions) %>) +

+
+ + +
+
+ <.session_list sessions={@sessions} socket={@socket} /> +
+ """ + end + + defp session_list(%{sessions: []} = assigns) do + ~H""" +
+
+ <.remix_icon icon="windy-line" class="text-gray-400 text-xl" /> +
+
+ You do not have any running sessions. +
+ Please create a new one by clicking “New notebook” +
+
+ """ + end + + defp session_list(assigns) do + ~H""" +
+ <%= for session <- @sessions do %> +
+
+ <%= live_redirect session.notebook_name, + to: Routes.session_path(@socket, :page, session.id), + class: "font-semibold text-gray-800 hover:text-gray-900" %> +
+ <%= if session.file, do: session.file.path, else: "No file" %> +
+
+ Created <%= format_creation_date(session.created_at) %> +
+
+
+ + +
+
+ <% end %> +
+ """ + end + + @impl true + def handle_event("set_order", %{"order_by" => order_by}, socket) do + sessions = sort_sessions(socket.assigns.sessions, order_by) + {:noreply, assign(socket, sessions: sessions, order_by: order_by)} + end + + def format_creation_date(created_at) do + time_words = created_at |> DateTime.to_naive() |> Livebook.Utils.Time.time_ago_in_words() + time_words <> " ago" + end + + defp order_by_label("date"), do: "Date" + defp order_by_label("title"), do: "Title" + + defp order_by_icon("date"), do: "calendar-2-line" + defp order_by_icon("title"), do: "text" + + defp sort_sessions(sessions, "date") do + Enum.sort_by(sessions, & &1.created_at, {:desc, DateTime}) + end + + defp sort_sessions(sessions, "title") do + Enum.sort_by(sessions, fn session -> + {session.notebook_name, -DateTime.to_unix(session.created_at)} + end) + end +end diff --git a/lib/livebook_web/live/session_live.ex b/lib/livebook_web/live/session_live.ex index a49defd15..50ae15d3b 100644 --- a/lib/livebook_web/live/session_live.ex +++ b/lib/livebook_web/live/session_live.ex @@ -290,7 +290,7 @@ defmodule LivebookWeb.SessionLive do defp sections_list(assigns) do ~H"""
-

+

Sections

@@ -327,10 +327,10 @@ defmodule LivebookWeb.SessionLive do ~H"""
-

+

Users

- + <%= length(@data_view.clients) %> connected @@ -373,31 +373,34 @@ defmodule LivebookWeb.SessionLive do defp runtime_info(assigns) do ~H"""
-

- Runtime -

+
+

+ Runtime +

+ <%= live_patch to: Routes.session_path(@socket, :runtime_settings, @session.id), + class: "icon-button", + type: "button" do %> + <.remix_icon icon="settings-3-line text-xl" /> + <% end %> +
<%= if @data_view.runtime do %>
<.labeled_text label="Type" text={runtime_type_label(@data_view.runtime)} /> - <.labeled_text label="Node name" text={@data_view.runtime.node} /> + <.labeled_text label="Node name" text={@data_view.runtime.node} one_line={true} />
- -
- <%= live_patch to: Routes.session_path(@socket, :runtime_settings, @session.id), - class: "button button-gray button-square-icon", - type: "button" do %> - <.remix_icon icon="settings-3-line" /> - <% end %>
<% else %>
@@ -405,12 +408,13 @@ defmodule LivebookWeb.SessionLive do
<%= live_patch to: Routes.session_path(@socket, :runtime_settings, @session.id), - class: "button button-gray button-square-icon", + class: "button button-outlined-gray bg-transparent", type: "button" do %> - <.remix_icon icon="settings-3-line" /> + Configure <% end %>
<% end %> diff --git a/lib/livebook_web/live/session_live/runtime_component.ex b/lib/livebook_web/live/session_live/runtime_component.ex index 3d7d32351..64d09c73d 100644 --- a/lib/livebook_web/live/session_live/runtime_component.ex +++ b/lib/livebook_web/live/session_live/runtime_component.ex @@ -33,7 +33,7 @@ defmodule LivebookWeb.SessionLive.RuntimeComponent do ~H"""

- Runtime + Runtime settings