Add star/unstar to the session page menu (#1753)

This commit is contained in:
Jonatan Kłosko 2023-03-06 19:36:45 +01:00 committed by GitHub
parent 36cc988eb2
commit 503f8df76a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 2 deletions

View file

@ -26,6 +26,7 @@ defmodule LivebookWeb.SessionLive do
Session.subscribe(session_id)
Secrets.subscribe()
Hubs.subscribe(:secrets)
Livebook.NotebookManager.subscribe_starred_notebooks()
{data, client_id}
else
@ -63,7 +64,8 @@ defmodule LivebookWeb.SessionLive do
saved_secrets: get_saved_secrets(),
select_secret_ref: nil,
select_secret_options: nil,
allowed_uri_schemes: Livebook.Config.allowed_uri_schemes()
allowed_uri_schemes: Livebook.Config.allowed_uri_schemes(),
starred_files: Livebook.NotebookManager.starred_notebooks() |> starred_files()
)
|> assign_private(data: data)
|> prune_outputs()
@ -300,6 +302,19 @@ defmodule LivebookWeb.SessionLive do
<span>Fork</span>
</button>
</.menu_item>
<.menu_item disabled={@data_view.file == nil}>
<%= if @data_view.file in @starred_files do %>
<button type="button" role="menuitem" phx-click="unstar_notebook">
<.remix_icon icon="star-fill" />
<span>Unstar notebook</span>
</button>
<% else %>
<button type="button" role="menuitem" phx-click="star_notebook">
<.remix_icon icon="star-line" />
<span>Star notebook</span>
</button>
<% end %>
</.menu_item>
<.menu_item>
<a role="menuitem" href={live_dashboard_process_path(@session.pid)} target="_blank">
<.remix_icon icon="dashboard-2-line" />
@ -1149,6 +1164,17 @@ defmodule LivebookWeb.SessionLive do
{:noreply, create_session(socket, notebook: notebook, copy_images_from: images_dir)}
end
def handle_event("star_notebook", %{}, socket) do
data = socket.private.data
Livebook.NotebookManager.add_starred_notebook(data.file, data.notebook.name)
{:noreply, socket}
end
def handle_event("unstar_notebook", %{}, socket) do
Livebook.NotebookManager.remove_starred_notebook(socket.private.data.file)
{:noreply, socket}
end
def handle_event("erase_outputs", %{}, socket) do
Session.erase_outputs(socket.assigns.session.pid)
{:noreply, socket}
@ -1328,6 +1354,10 @@ defmodule LivebookWeb.SessionLive do
{:noreply, push_patch(socket, to: to)}
end
def handle_info({:starred_notebooks_updated, starred_notebooks}, socket) do
{:noreply, assign(socket, starred_files: starred_files(starred_notebooks))}
end
def handle_info(_message, socket), do: {:noreply, socket}
defp handle_relative_path(socket, path, requested_url) do
@ -1767,6 +1797,10 @@ defmodule LivebookWeb.SessionLive do
end
end
defp starred_files(starred_notebooks) do
for info <- starred_notebooks, into: MapSet.new(), do: info.file
end
# Builds view-specific structure of data by cherry-picking
# only the relevant attributes.
# We then use `@data_view` in the templates and consequently

View file

@ -144,7 +144,6 @@ defmodule LivebookWeb.HomeLiveTest do
{:ok, session} = Sessions.create_session()
Session.set_file(session.pid, file)
Session.set_notebook_name(session.pid, "Special notebook")
Session.save_sync(session.pid)
{:ok, view, _} = live(conn, ~p"/")

View file

@ -674,6 +674,33 @@ defmodule LivebookWeb.SessionLiveTest do
close_session_by_id(session_id)
end
@tag :tmp_dir
test "starring and unstarring the notebook", %{conn: conn, session: session, tmp_dir: tmp_dir} do
notebook_path = Path.join(tmp_dir, "notebook.livemd")
file = Livebook.FileSystem.File.local(notebook_path)
Session.set_file(session.pid, file)
Livebook.NotebookManager.subscribe_starred_notebooks()
{:ok, view, _} = live(conn, ~p"/sessions/#{session.id}")
view
|> element("button", "Star notebook")
|> render_click()
assert_receive {:starred_notebooks_updated, starred_notebooks}
assert Enum.any?(starred_notebooks, &(&1.file == file))
view
|> element("button", "Unstar notebook")
|> render_click()
assert_receive {:starred_notebooks_updated, starred_notebooks}
refute Enum.any?(starred_notebooks, &(&1.file == file))
end
describe "connected users" do
test "lists connected users", %{conn: conn, session: session} do
user1 = build(:user, name: "Jake Peralta")