Packages

phoenix_kit

1.7.21
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib modules ai web prompt_form.ex
Raw

lib/modules/ai/web/prompt_form.ex

defmodule PhoenixKit.Modules.AI.Web.PromptForm do
@moduledoc """
LiveView for creating and editing AI prompts.
A prompt is a reusable text template with variable substitution support.
Variables use the `{{VariableName}}` syntax.
"""
use PhoenixKitWeb, :live_view
alias PhoenixKit.Modules.AI
alias PhoenixKit.Modules.AI.Prompt
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
# ===========================================
# LIFECYCLE
# ===========================================
@impl true
def mount(params, _session, socket) do
if AI.enabled?() do
project_title = Settings.get_setting("project_title", "PhoenixKit")
socket =
socket
|> assign(:project_title, project_title)
|> assign(:current_path, Routes.path("/admin/ai"))
|> assign(:extracted_variables, [])
|> load_prompt(params["id"])
{:ok, socket}
else
{:ok,
socket
|> put_flash(:error, "AI module is not enabled")
|> push_navigate(to: Routes.path("/admin/modules"))}
end
end
defp load_prompt(socket, nil) do
changeset = AI.change_prompt(%Prompt{})
socket
|> assign(:page_title, "New AI Prompt")
|> assign(:prompt, nil)
|> assign(:form, to_form(changeset))
end
defp load_prompt(socket, id) do
case AI.get_prompt(String.to_integer(id)) do
nil ->
socket
|> put_flash(:error, "Prompt not found")
|> push_navigate(to: Routes.ai_path() <> "/prompts")
prompt ->
changeset = AI.change_prompt(prompt)
socket
|> assign(:page_title, "Edit AI Prompt")
|> assign(:prompt, prompt)
|> assign(:form, to_form(changeset))
|> assign(:extracted_variables, prompt.variables || [])
end
end
@impl true
def handle_params(_params, _url, socket) do
{:noreply, socket}
end
# ===========================================
# EVENT HANDLERS
# ===========================================
@impl true
def handle_event("validate", %{"prompt" => params}, socket) do
changeset =
(socket.assigns.prompt || %Prompt{})
|> AI.change_prompt(params)
# Extract variables from content for preview
content = params["content"] || ""
extracted_variables = Prompt.extract_variables(content)
socket =
socket
|> assign(:form, to_form(changeset))
|> assign(:extracted_variables, extracted_variables)
{:noreply, socket}
end
@impl true
def handle_event("save", %{"prompt" => params}, socket) do
save_prompt(socket, params)
end
# ===========================================
# PRIVATE HELPERS
# ===========================================
defp save_prompt(socket, params) do
result =
if socket.assigns.prompt do
AI.update_prompt(socket.assigns.prompt, params)
else
AI.create_prompt(params)
end
case result do
{:ok, _prompt} ->
action = if socket.assigns.prompt, do: "updated", else: "created"
{:noreply,
socket
|> put_flash(:info, "Prompt #{action} successfully")
|> push_navigate(to: Routes.ai_path() <> "/prompts")}
{:error, changeset} ->
{:noreply, assign(socket, :form, to_form(changeset))}
end
end
end