diff --git a/lib/livebook_web/live/session_live.ex b/lib/livebook_web/live/session_live.ex index 86c04ec38..d31244715 100644 --- a/lib/livebook_web/live/session_live.ex +++ b/lib/livebook_web/live/session_live.ex @@ -195,11 +195,13 @@ defmodule LivebookWeb.SessionLive do <.clients_list data_view={@data_view} client_id={@client_id} />
- <.secrets_list - data_view={@data_view} + <.live_component + module={LivebookWeb.SessionLive.SecretsListComponent} + id="secrets-list" + session={@session} saved_secrets={@saved_secrets} hubs={@saved_hubs} - session={@session} + secrets={@data_view.secrets} />
@@ -621,201 +623,6 @@ defmodule LivebookWeb.SessionLive do """ end - defp secrets_list(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 %> - - -
-
- - <.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={@data_view.secrets} - hubs={@hubs} - /> -
- -
-

- 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={@data_view.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" - > - <.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} /> - -
- -
-
-
- """ - end - - defp secrets_info_icon(assigns) do - ~H""" - - <.remix_icon icon="question-line" class="text-xl leading-none" /> - - """ - end - defp runtime_info(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 %> + + +
+
+ + <.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} /> + +
+ +
+
+
+ """ + 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