Reviewed-on: https://git.nikos.gg/prymn/prymn/pulls/9 Co-authored-by: Nikos Papadakis <nikos@papadakis.xyz> Co-committed-by: Nikos Papadakis <nikos@papadakis.xyz>
151 lines
4.6 KiB
Elixir
151 lines
4.6 KiB
Elixir
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"""
|
|
<div class="mx-auto max-w-2xl">
|
|
<fieldset>
|
|
<legend class="mb-6 border-b border-slate-200 pb-2 text-base font-semibold">App Type</legend>
|
|
<span>
|
|
<input
|
|
id="wordpress"
|
|
type="radio"
|
|
name="app_type"
|
|
value="wordpress"
|
|
class="peer hidden"
|
|
checked={@app_type == "wordpress"}
|
|
/>
|
|
<label
|
|
for="wordpress"
|
|
class="inline-block cursor-pointer rounded p-5 shadow peer-checked:bg-black peer-checked:text-white"
|
|
phx-click={JS.patch(~p"/apps/new?app_type=wordpress")}
|
|
>
|
|
WordPress
|
|
</label>
|
|
</span>
|
|
<span>
|
|
<input
|
|
id="plain"
|
|
type="radio"
|
|
name="app_type"
|
|
value="plain"
|
|
class="peer hidden"
|
|
checked={@app_type == "plain"}
|
|
/>
|
|
<label
|
|
for="plain"
|
|
class="inline-block cursor-pointer rounded p-5 shadow peer-checked:bg-black peer-checked:text-white"
|
|
phx-click={JS.patch(~p"/apps/new?app_type=plain")}
|
|
>
|
|
Plain HTML
|
|
</label>
|
|
</span>
|
|
</fieldset>
|
|
<.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} />
|
|
</div>
|
|
"""
|
|
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]} />
|
|
<fieldset>
|
|
<legend class="text-sm font-semibold leading-6 text-gray-900">
|
|
WordPress Settings
|
|
</legend>
|
|
<div class="mt-6 grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-2">
|
|
<.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]} />
|
|
</.inputs_for>
|
|
</div>
|
|
</fieldset>
|
|
<:actions>
|
|
<Button.primary type="submit">Create</Button.primary>
|
|
</:actions>
|
|
</.simple_form>
|
|
"""
|
|
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>
|
|
<Button.primary type="submit">Create</Button.primary>
|
|
</:actions>
|
|
</.simple_form>
|
|
"""
|
|
end
|
|
end
|