@@ -621,201 +623,6 @@ defmodule LivebookWeb.SessionLive do
"""
end
- defp secrets_list(assigns) do
- ~H"""
-
@@ -1372,27 +1179,6 @@ defmodule LivebookWeb.SessionLive do
)}
end
- def handle_event("toggle_secret", %{"data" => data}, socket) do
- if data["toggled"] == "true" do
- secret = %{name: data["name"], value: data["value"]}
- Livebook.Session.set_secret(socket.assigns.session.pid, secret)
- else
- Livebook.Session.unset_secret(socket.assigns.session.pid, data["name"])
- end
-
- {:noreply, socket}
- end
-
- def handle_event("delete_session_secret", %{"secret_name" => secret_name}, socket) do
- Livebook.Session.unset_secret(socket.assigns.session.pid, secret_name)
- {:noreply, socket}
- end
-
- def handle_event("delete_app_secret", %{"secret_name" => secret_name}, socket) do
- Livebook.Secrets.unset_secret(secret_name)
- {:noreply, socket}
- end
-
@impl true
def handle_info({:operation, operation}, socket) do
{:noreply, handle_operation(socket, operation)}
@@ -2253,24 +2039,10 @@ defmodule LivebookWeb.SessionLive do
end)
end
- defp secret_toggled?(secret, secrets) do
- Map.has_key?(secrets, secret.name) and secrets[secret.name] == secret.value
- end
-
defp get_saved_secrets do
Enum.sort(Hubs.get_secrets() ++ Secrets.get_secrets())
end
- defp secret_label(%{origin: {:hub, id}}, hubs), do: fetch_hub!(id, hubs).emoji
- defp secret_label(_, _), do: nil
-
- defp secret_tooltip(%{origin: {:hub, id}}, hubs), do: fetch_hub!(id, hubs).name
- defp secret_tooltip(_, _), do: nil
-
- defp fetch_hub!(id, hubs) do
- Enum.find(hubs, &(&1.id == id)) || raise "unknown hub id: #{id}"
- end
-
defp app_status_color(nil), do: "bg-gray-400"
defp app_status_color(:booting), do: "bg-blue-500"
defp app_status_color(:running), do: "bg-green-bright-400"
diff --git a/lib/livebook_web/live/session_live/secrets_list_component.ex b/lib/livebook_web/live/session_live/secrets_list_component.ex
new file mode 100644
index 000000000..5a2ab8e22
--- /dev/null
+++ b/lib/livebook_web/live/session_live/secrets_list_component.ex
@@ -0,0 +1,240 @@
+defmodule LivebookWeb.SessionLive.SecretsListComponent do
+ use LivebookWeb, :live_component
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+
+
+ Secrets
+
+ <.secrets_info_icon />
+
+
Available only to this session
+
+
+
+
toggle_class("bg-gray-100", to: "#session-secret-#{secret_name}-wrapper")
+ }
+ >
+ <%= secret_name %>
+
+
+
+ <%= secret_value %>
+
+
+
+
+
+
+ <.link
+ patch={~p"/sessions/#{@session.id}/secrets"}
+ class="inline-flex items-center justify-center p-8 py-1 mt-6 space-x-2 text-sm font-medium text-gray-500 border border-gray-400 border-dashed rounded-xl hover:bg-gray-100"
+ role="button"
+ >
+ <.remix_icon icon="add-line" class="text-lg align-center" />
+
New secret
+
+
+
+
+ App secrets
+
+
+ <%= if @saved_secrets == [] do %>
+ No secrets stored in Livebook so far
+ <% else %>
+ Toggle to share with this session
+ <% end %>
+
+
+
+
+ <.secrets_item
+ :for={secret when secret.origin in [:app, :startup] <- @saved_secrets}
+ secret={secret}
+ prefix={to_string(secret.origin)}
+ data_secrets={@secrets}
+ hubs={@hubs}
+ myself={@myself}
+ />
+
+
+
+
+ Hub secrets
+
+
+ <%= if @saved_secrets == [] do %>
+ No secrets stored in Livebook so far
+ <% else %>
+ Toggle to share with this session
+ <% end %>
+
+
+
+
+ <.secrets_item
+ :for={%{origin: {:hub, id}} = secret <- @saved_secrets}
+ secret={secret}
+ prefix={"hub-#{id}"}
+ data_secrets={@secrets}
+ hubs={@hubs}
+ />
+
+
+
+ """
+ end
+
+ defp secrets_item(assigns) do
+ ~H"""
+
+
+
+
+ toggle_class("bg-gray-100", to: "##{@prefix}-secret-#{@secret.name}-wrapper")
+ }
+ >
+ <%= @secret.name %>
+
+ <.form
+ :let={f}
+ id={"#{@prefix}-secret-#{@secret.name}-toggle"}
+ for={%{"toggled" => secret_toggled?(@secret, @data_secrets)}}
+ as={:data}
+ phx-change="toggle_secret"
+ phx-target={@myself}
+ >
+ <.switch_field
+ field={f[:toggled]}
+ label={secret_label(@secret, @hubs)}
+ tooltip={secret_tooltip(@secret, @hubs)}
+ />
+ <.hidden_field field={f[:name]} value={@secret.name} />
+ <.hidden_field field={f[:value]} value={@secret.value} />
+
+
+
+
+ <%= @secret.value %>
+
+
+
+
+
+
+ """
+ end
+
+ defp secrets_info_icon(assigns) do
+ ~H"""
+
+ <.remix_icon icon="question-line" class="text-xl leading-none" />
+
+ """
+ end
+
+ @impl true
+ def handle_event("toggle_secret", %{"data" => data}, socket) do
+ if data["toggled"] == "true" do
+ secret = %{name: data["name"], value: data["value"]}
+ Livebook.Session.set_secret(socket.assigns.session.pid, secret)
+ else
+ Livebook.Session.unset_secret(socket.assigns.session.pid, data["name"])
+ end
+
+ {:noreply, socket}
+ end
+
+ def handle_event("delete_session_secret", %{"secret_name" => secret_name}, socket) do
+ Livebook.Session.unset_secret(socket.assigns.session.pid, secret_name)
+ {:noreply, socket}
+ end
+
+ def handle_event("delete_app_secret", %{"secret_name" => secret_name}, socket) do
+ Livebook.Secrets.unset_secret(secret_name)
+ {:noreply, socket}
+ end
+
+ defp secret_toggled?(secret, secrets) do
+ Map.has_key?(secrets, secret.name) and secrets[secret.name] == secret.value
+ end
+
+ defp secret_label(%{origin: {:hub, id}}, hubs), do: fetch_hub!(id, hubs).emoji
+ defp secret_label(_, _), do: nil
+
+ defp secret_tooltip(%{origin: {:hub, id}}, hubs), do: fetch_hub!(id, hubs).name
+ defp secret_tooltip(_, _), do: nil
+
+ defp fetch_hub!(id, hubs) do
+ Enum.find(hubs, &(&1.id == id)) || raise "unknown hub id: #{id}"
+ end
+end