From b2f53942a234474be9cdf7be82e26392ca3c2c32 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Wed, 18 Mar 2026 09:21:34 -0600 Subject: [PATCH] working on delete --- lib/elixir_ai/data/ai_provider.ex | 29 ++++++++- .../components/form_components.ex | 21 +++++++ lib/elixir_ai_web/home/ai_providers_live.ex | 63 +++++++++++++++---- lib/elixir_ai_web/home/home_live.ex | 12 ++++ 4 files changed, 113 insertions(+), 12 deletions(-) diff --git a/lib/elixir_ai/data/ai_provider.ex b/lib/elixir_ai/data/ai_provider.ex index f9a5248..271db62 100644 --- a/lib/elixir_ai/data/ai_provider.ex +++ b/lib/elixir_ai/data/ai_provider.ex @@ -29,7 +29,7 @@ defmodule ElixirAi.AiProvider do sql = "SELECT id, name, model_name FROM ai_providers" params = %{} - case DbHelpers.run_sql(sql, params, "ai_providers", AiProviderSchema.partial_schema()) do + case DbHelpers.run_sql(sql, params, providers_topic(), AiProviderSchema.partial_schema()) do {:error, _} -> [] @@ -83,6 +83,10 @@ defmodule ElixirAi.AiProvider do {:error, :db_error} _result -> + Logger.info( + "Provider created, broadcasting :provider_added message to topic #{providers_topic()}" + ) + Phoenix.PubSub.broadcast( ElixirAi.PubSub, providers_topic(), @@ -110,6 +114,29 @@ defmodule ElixirAi.AiProvider do end end + def delete(id) do + sql = "DELETE FROM ai_providers WHERE id = $(id)::uuid" + params = %{"id" => id} + + case DbHelpers.run_sql(sql, params, providers_topic()) do + {:error, :db_error} -> + {:error, :db_error} + + _result -> + Logger.info( + "Provider deleted, broadcasting :provider_deleted message to topic #{providers_topic()}" + ) + + Phoenix.PubSub.broadcast( + ElixirAi.PubSub, + providers_topic(), + {:provider_deleted, id} + ) + + :ok + end + end + def ensure_default_provider do sql = "SELECT COUNT(*) FROM ai_providers" params = %{} diff --git a/lib/elixir_ai_web/components/form_components.ex b/lib/elixir_ai_web/components/form_components.ex index 15ce5d2..0b105a7 100644 --- a/lib/elixir_ai_web/components/form_components.ex +++ b/lib/elixir_ai_web/components/form_components.ex @@ -32,4 +32,25 @@ defmodule ElixirAiWeb.FormComponents do """ end + + @doc """ + Renders a centered overlay modal. Pass content via the `:inner_block` slot. + + ## Examples + + <.modal> +

Are you sure?

+ + """ + slot :inner_block, required: true + + def modal(assigns) do + ~H""" +
+
+ {render_slot(@inner_block)} +
+
+ """ + end end diff --git a/lib/elixir_ai_web/home/ai_providers_live.ex b/lib/elixir_ai_web/home/ai_providers_live.ex index a177ceb..1d55299 100644 --- a/lib/elixir_ai_web/home/ai_providers_live.ex +++ b/lib/elixir_ai_web/home/ai_providers_live.ex @@ -2,18 +2,13 @@ defmodule ElixirAiWeb.AiProvidersLive do use ElixirAiWeb, :live_component import ElixirAiWeb.FormComponents alias ElixirAi.AiProvider - import ElixirAi.PubsubTopics def update(assigns, socket) do - if connected?(socket) do - Phoenix.PubSub.subscribe(ElixirAi.PubSub, providers_topic()) - end - {:ok, socket |> assign(assigns) - |> assign_new(:providers, fn -> AiProvider.all() end) |> assign_new(:show_form, fn -> false end) + |> assign_new(:confirm_delete_id, fn -> nil end) |> assign_new( :form_data, fn -> @@ -81,10 +76,43 @@ defmodule ElixirAiWeb.AiProvidersLive do

{provider.name}

Model: {provider.model_name}

+ <% end %> + + <%= if @confirm_delete_id do %> + <.modal> +

Delete Provider

+

+ Are you sure you want to delete this provider? This action cannot be undone. +

+
+ + +
+ + <% end %> """ end @@ -93,6 +121,24 @@ defmodule ElixirAiWeb.AiProvidersLive do {:noreply, assign(socket, show_form: !socket.assigns.show_form, error: nil)} end + def handle_event("delete_provider", %{"id" => id}, socket) do + {:noreply, assign(socket, confirm_delete_id: id)} + end + + def handle_event("cancel_delete", _params, socket) do + {:noreply, assign(socket, confirm_delete_id: nil)} + end + + def handle_event("confirm_delete", _params, socket) do + case AiProvider.delete(socket.assigns.confirm_delete_id) do + :ok -> + {:noreply, assign(socket, confirm_delete_id: nil)} + + _ -> + {:noreply, assign(socket, confirm_delete_id: nil, error: "Failed to delete provider")} + end + end + def handle_event("create_provider", params, socket) do name = String.trim(params["name"]) model_name = String.trim(params["model_name"]) @@ -135,14 +181,9 @@ defmodule ElixirAiWeb.AiProvidersLive do ) |> assign(error: nil)} - _ -> {:noreply, assign(socket, error: "Failed to create provider")} end end end - - def handle_info({:provider_added, _attrs}, socket) do - {:noreply, assign(socket, providers: AiProvider.all())} - end end diff --git a/lib/elixir_ai_web/home/home_live.ex b/lib/elixir_ai_web/home/home_live.ex index 64a283b..ae27986 100644 --- a/lib/elixir_ai_web/home/home_live.ex +++ b/lib/elixir_ai_web/home/home_live.ex @@ -33,6 +33,14 @@ defmodule ElixirAiWeb.HomeLive do

{@error}

<% end %> + +
+ <.live_component + module={ElixirAiWeb.AiProvidersLive} + id="ai-providers" + providers={@ai_providers} + /> +
""" end @@ -130,4 +138,8 @@ defmodule ElixirAiWeb.HomeLive do def handle_info({:provider_added, _attrs}, socket) do {:noreply, assign(socket, ai_providers: AiProvider.all())} end + + def handle_info({:provider_deleted, _id}, socket) do + {:noreply, assign(socket, ai_providers: AiProvider.all())} + end end