defmodule LivebookWeb.Hub.Edit.TeamComponent do use LivebookWeb, :live_component alias Livebook.Hubs.Team alias Livebook.Teams alias LivebookWeb.LayoutHelpers alias LivebookWeb.NotFoundError @impl true def update(assigns, socket) do socket = assign(socket, assigns) changeset = Team.change_hub(assigns.hub) show_key? = assigns.params["show-key"] == "true" secrets = Livebook.Hubs.get_secrets(assigns.hub) secret_name = assigns.params["secret_name"] secret_value = if assigns.live_action == :edit_secret do Enum.find_value(secrets, &(&1.name == secret_name and &1.value)) || raise(NotFoundError, "could not find secret matching #{inspect(secret_name)}") end {:ok, socket |> assign( secrets: secrets, show_key: show_key?, secret_name: secret_name, secret_value: secret_value ) |> assign_dockerfile() |> assign_form(changeset)} end @impl true def render(assigns) do ~H"""

A shared Teams hub. All resources here are shared with your team. Manage users and billing on livebook.dev.

General

<.form :let={f} id={@id} class="flex flex-col mt-4 space-y-4" for={@form} phx-submit="save" phx-change="validate" phx-target={@myself} >
<.text_field field={f[:hub_name]} label="Name" disabled help="Name cannot be changed" class="bg-gray-200/50 border-200/80 cursor-not-allowed" /> <.emoji_field field={f[:hub_emoji]} label="Emoji" />

Secrets

Secrets are a safe way to share credentials and tokens with notebooks. They are often shared with Smart cells and can be read as environment variables using the LB_ prefix.

<.live_component module={LivebookWeb.Hub.SecretListComponent} id="hub-secrets-list" hub={@hub} secrets={@secrets} target={@myself} />

Offline Deployment

Deploy your stamped notebooks with your Hub using an instance of the Hub using environment variables.

Dockerfile
<.code_preview source_id={"offline-deployment-#{@hub.id}-source"} source={@dockerfile} language="dockerfile" wrap />

Danger Zone

Delete this hub

Once deleted, you won’t be able to access its features unless you rejoin.

<.modal show={@show_key} id="show-key-modal" width={:medium} patch={~p"/hub/#{@hub.id}"}> <.teams_key_modal teams_key={@hub.teams_key} /> <.modal :if={@live_action in [:new_secret, :edit_secret]} id="secrets-modal" show width={:medium} patch={~p"/hub/#{@hub.id}"} > <.live_component module={LivebookWeb.Hub.SecretFormComponent} id="secrets" hub={@hub} secret_name={@secret_name} secret_value={@secret_value} return_to={~p"/hub/#{@hub.id}"} />
""" end defp teams_key_modal(assigns) do ~H"""

Teams Key

This is your Teams Key. If you want to join or invite others to your organization, you will need to share your Teams Key with them. We recommend storing it somewhere safe:
""" end @impl true def handle_event("save", %{"team" => params}, socket) do case Teams.update_hub(socket.assigns.hub, params) do {:ok, hub} -> {:noreply, socket |> put_flash(:success, "Hub updated successfully") |> push_navigate(to: ~p"/hub/#{hub.id}")} {:error, changeset} -> {:noreply, assign_form(socket, changeset)} end end def handle_event("validate", %{"team" => attrs}, socket) do changeset = socket.assigns.hub |> Team.change_hub(attrs) |> Map.replace!(:action, :validate) {:noreply, assign_form(socket, changeset)} end def handle_event("delete_hub_secret", attrs, socket) do %{hub: hub} = socket.assigns on_confirm = fn socket -> {:ok, secret} = Livebook.Secrets.update_secret(%Livebook.Secrets.Secret{}, attrs) case Livebook.Hubs.delete_secret(hub, secret) do :ok -> socket |> put_flash(:success, "Secret deleted successfully") |> push_navigate(to: ~p"/hub/#{hub.id}") {:transport_error, reason} -> put_flash(socket, :error, reason) end end {:noreply, confirm(socket, on_confirm, title: "Delete hub secret - #{attrs["name"]}", description: "Are you sure you want to delete this hub secret?", confirm_text: "Delete", confirm_icon: "delete-bin-6-line" )} end defp assign_form(socket, %Ecto.Changeset{} = changeset) do assign(socket, form: to_form(changeset)) end defp assign_dockerfile(socket) do version = to_string(Application.spec(:livebook, :vsn)) version = if version =~ "dev", do: "edge", else: version assign(socket, :dockerfile, """ FROM livebook/livebook:#{version} COPY /path/to/my/notebooks /data ENV LIVEBOOK_APPS_PATH "/data" ENV LIVEBOOK_APPS_PATH_HUB_ID "#{socket.assigns.hub.id}" ENV LIVEBOOK_TEAMS_NAME "#{socket.assigns.hub.hub_name}" ENV LIVEBOOK_TEAMS_OFFLINE_KEY "#{socket.assigns.hub.org_public_key}" CMD [ "/app/bin/livebook", "start" ]\ """) end end