mirror of
https://github.com/livebook-dev/livebook.git
synced 2024-09-20 18:15:56 +08:00
Add star/unstar to the session page menu (#1753)
This commit is contained in:
parent
36cc988eb2
commit
503f8df76a
|
@ -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
|
||||
|
|
|
@ -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"/")
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue