Packages
livebook
0.15.2
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Automate code & data workflows with interactive notebooks
Current section
Files
Jump to
Current section
Files
lib/livebook_web/live/hub/edit_live.ex
defmodule LivebookWeb.Hub.EditLive do
use LivebookWeb, :live_view
alias LivebookWeb.LayoutComponents
alias Livebook.Hubs
alias Livebook.Hubs.Provider
on_mount LivebookWeb.SidebarHook
@impl true
def mount(_params, _session, socket) do
if connected?(socket) do
Hubs.Broadcasts.subscribe([:connection])
Livebook.Teams.Broadcasts.subscribe([:deployment_groups, :app_deployments, :agents])
end
{:ok,
assign(socket,
hub: nil,
counter: 0,
type: nil,
page_title: "Workspace - Livebook",
params: %{}
)}
end
@impl true
def handle_params(params, _url, socket) do
{id, params} = Map.pop(params, "id")
{:noreply,
socket
|> load_hub(id)
|> assign(:params, params)}
end
@impl true
def render(assigns) do
~H"""
<LayoutComponents.layout
current_page={~p"/hub/#{@hub.id}"}
current_user={@current_user}
saved_hubs={@saved_hubs}
>
<.hub_component
type={@type}
hub={@hub}
counter={@counter}
live_action={@live_action}
params={@params}
/>
</LayoutComponents.layout>
"""
end
defp hub_component(%{type: "personal"} = assigns) do
~H"""
<.live_component
module={LivebookWeb.Hub.Edit.PersonalComponent}
hub={@hub}
params={@params}
counter={@counter}
live_action={@live_action}
id="personal-form"
/>
"""
end
defp hub_component(%{type: "team"} = assigns) do
~H"""
<.live_component
module={LivebookWeb.Hub.Edit.TeamComponent}
hub={@hub}
live_action={@live_action}
params={@params}
counter={@counter}
id="team-form"
/>
"""
end
@impl true
def handle_event("delete_hub", %{"id" => id}, socket) do
on_confirm = fn socket ->
Hubs.delete_hub(id)
socket
|> put_flash(:success, "Workspace deleted successfully")
|> push_navigate(to: ~p"/")
end
{:noreply,
confirm(socket, on_confirm,
title: "Delete workspace",
description: "Are you sure you want to delete this workspace?",
confirm_text: "Delete",
confirm_icon: "close-circle-line"
)}
end
@impl true
def handle_info({:hub_connected, id}, %{assigns: %{hub: %{id: id}}} = socket) do
{:noreply, load_hub(socket, id)}
end
def handle_info({_event, id, _reason}, %{assigns: %{hub: %{id: id}}} = socket) do
{:noreply, load_hub(socket, id)}
end
def handle_info({_event, %{hub_id: id}}, %{assigns: %{hub: %{id: id}}} = socket) do
{:noreply, load_hub(socket, id)}
end
def handle_info({:hub_changed, id}, %{assigns: %{hub: %{id: id}}} = socket) do
{:noreply, load_hub(socket, id)}
end
def handle_info(_message, socket) do
{:noreply, socket}
end
defp load_hub(socket, id) do
hub = Hubs.fetch_hub!(id)
type = Provider.type(hub)
socket
|> assign(hub: hub, type: type)
# Hub-specific components load data, such as secrets and we use
# a counter to force re-render on every patch.
|> update(:counter, &(&1 + 1))
end
end