defmodule PrymnWeb.CreateApp do use PrymnWeb, :live_component alias Prymn.Apps @impl true def mount(socket) do servers = Prymn.Servers.list_registered_servers() {:ok, assign(socket, :servers, servers)} end @impl true def update(assigns, socket) do changeset = Apps.change_app(%Apps.App{server: nil}) {:ok, socket |> assign(assigns) |> assign(:form, to_form(changeset))} end @impl true def render(assigns) do ~H"""
App Type
<.wordpress_app_form :if={@app_type == "wordpress"} form={@form} servers={@servers} myself={@myself} /> <.plain_app_form :if={@app_type == "plain"} form={@form} servers={@servers} myself={@myself} />
""" end @impl true def handle_event("create_wordpress_app", %{"app" => params}, socket) do server = Enum.find(socket.assigns.servers, %Prymn.Servers.Server{}, fn server -> Integer.to_string(server.id) == params["server_id"] end) socket = case Apps.create_app(server, params) do %Ecto.Changeset{valid?: false} = changeset -> assign(socket, :form, to_form(changeset)) %Apps.App{} -> push_navigate(socket, to: ~p"/apps") end {:noreply, socket} end def handle_event("create_plain_app", _params, socket) do {:noreply, socket} end defp wordpress_app_form(assigns) do ~H""" <.simple_form method="POST" for={@form} phx-submit="create_wordpress_app" phx-target={@myself}> <.input type="select" label="Hosting Server" prompt="Select a server" field={@form[:server_id]} options={Enum.map(@servers, &{&1.name, &1.id})} /> <.input type="text" label="App Name" field={@form[:name]} /> <.input type="text" label="Domain Name" field={@form[:domain]} />
WordPress Settings
<.inputs_for :let={wordpress} field={@form[:wordpress]}> <.input type="email" label="Admin Email" field={wordpress[:admin_email]} /> <.input type="text" label="Admin Username" field={wordpress[:admin_username]} /> <.input type="text" label="Installation Path" field={wordpress[:path]} /> <.input type="text" label="Database Host" field={wordpress[:db_host]} value="127.0.0.1" readonly /> <.input type="text" label="Database Name" field={wordpress[:db_name]} /> <.input type="text" label="Database User" field={wordpress[:db_user]} /> <.input type="password" label="Database Password" field={wordpress[:db_pass]} />
<:actions> Create """ end defp plain_app_form(assigns) do ~H""" <.simple_form method="POST" for={@form} phx-submit="create_plain_app" phx-target={@myself}> <.input type="select" label="Hosting Server" prompt="Select a server" field={@form[:server_id]} options={Enum.map(@servers, &{&1.name, &1.id})} /> <:actions> Create """ end end