Packages
moon
2.79.13
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/moon_web/examples/parts/modal_example/with_form2.ex
defmodule MoonWeb.Examples.Parts.ModalExample.WithForm2 do
@moduledoc false
use Moon.StatefulComponent
alias Moon.Design.Tabs
alias Moon.Design.Form
alias Moon.Design.Form.{Field, Input, Dropdown, Checkbox}
alias Moon.Parts.{Wizard, Modal}
alias Moon.Design.Button
alias MoonWeb.Schema.Flow
prop(is_open, :boolean, default: false)
data(changeset, :any, default: Flow.changeset(%{}))
data(steps, :any)
data(verification_types, :any)
data(provider_names, :any)
data(merchant_names, :any)
def render(assigns) do
form_id = "#{assigns.id}-form"
~F"""
<div>
<Button on_click="set_open">Open</Button>
<Modal id="modal_form" on_close="set_close" {=@is_open} class="p-1 bg-bulma">
<Wizard id="tabs-wizard" {=@steps}>
<:description>
<div class="py-8 flex flex-col gap-4 w-full">
<h3 class="text-moon-24 text-bulma font-grotesk">Create new flow</h3>
<p class="text-moon-14 text-bulma hidden lg:inline">
Set up a new KYC flow.
</p>
</div>
</:description>
<Wizard.Panels>
<Tabs.Panel>
<Form
id={form_id}
is_horizontal
change="on_form_change"
for={@changeset}
target={@myself}
submit="apply"
>
<Field class="flex justify-between" field={:flow_name} label="Flow name">
<Input size="lg" />
</Field>
<Field class="flex justify-between" field={:merchant_name} label="Merchant name">
<Dropdown id="merchant_dropdown" size="lg" options={@merchant_names} prompt="Select merchant" />
</Field>
<Field class="flex justify-between" field={:provider_name} label="Provider name">
<Dropdown id="provider_dropdown" size="lg" options={@provider_names} prompt="Select provider" />
</Field>
<Field class="flex justify-between" field={:verification_types} label="Verification types">
<Checkbox
:for={verification_type <- @verification_types}
label={verification_type.key}
hidden_input={false}
checked_value={verification_type.value}
is_multiple
/>
</Field>
</Form>
</Tabs.Panel>
<Tabs.Panel />
</Wizard.Panels>
<Wizard.Buttons />
</Wizard>
</Modal>
</div>
"""
end
def mount(socket) do
steps = list_flow_steps()
merchant_names = [
%{key: "Merchant1", value: "Merchant1"},
%{key: "Merchant2", value: "Merchant2"}
]
verification_types = list_verification_types()
{:ok,
socket
|> assign(:steps, steps)
|> assign(:merchant_names, merchant_names)
|> assign(:provider_names, [])
|> assign(:get_merchants_response, [
%{name: "Merchant1", providers: [%{name: "Provider1"}]},
%{name: "Merchant2", providers: [%{name: "Provider"}]}
])
|> assign(:verification_types, verification_types)
|> assign(:form, Flow.changeset(%{}))}
end
defp list_flow_steps() do
[
%{
title: "General",
text: "Basic information about the flow."
},
%{
title: "Details",
text: "We require some additional information based on the provider you choose."
}
]
end
defp list_verification_types() do
[
%{
key: "ID",
value: "id"
},
%{
key: "Selfie",
value: "selfie"
},
%{
key: "POA",
value: "poa"
},
%{
key: "Liveness",
value: "liveness"
}
]
end
def handle_event("set_open", _, socket) do
{:noreply, assign(socket, is_open: true)}
end
def handle_event("set_close", _, socket) do
{:noreply, assign(socket, is_open: false)}
end
def handle_event("on_form_change", params = %{"_target" => ["flow", "flow_name"]}, socket) do
flow_name = get_in(params, ["flow", "flow_name"])
form = Flow.changeset(socket.assigns.form, %{flow_name: flow_name})
socket =
socket
|> assign(:form, form)
{:noreply, socket}
end
def handle_event("on_form_change", params = %{"_target" => ["flow", "merchant_name"]}, socket) do
merchant_name = get_in(params, ["flow", "merchant_name"])
provider_names = list_provider_names(socket.assigns.get_merchants_response, merchant_name)
form = Flow.changeset(socket.assigns.form, %{merchant_name: merchant_name})
socket =
socket
|> assign(:form, form)
|> assign(:provider_names, provider_names)
{:noreply, socket}
end
def handle_event("on_form_change", params = %{"_target" => ["flow", "provider_name"]}, socket) do
provider_name = get_in(params, ["flow", "provider_name"])
form = Flow.changeset(socket.assigns.form, %{provider_name: provider_name})
socket =
socket
|> assign(:form, form)
{:noreply, socket}
end
def handle_event(
"on_form_change",
params = %{"_target" => ["flow", "verification_types"]},
socket
) do
verification_types = get_in(params, ["flow", "verification_types"])
form = Flow.changeset(socket.assigns.form, %{verification_types: verification_types})
{:noreply, socket |> assign(:form, form)}
end
def handle_event("apply", _params, socket) do
changeset = Map.merge(socket.assigns.changeset, %{action: :insert})
{:noreply, assign(socket, is_open: !changeset.valid?, changeset: changeset)}
end
defp list_provider_names(get_merchants_response, merchant_name) do
merchant =
get_merchants_response
|> Enum.find(fn merchant -> merchant.name == merchant_name end)
merchant.providers
|> Enum.map(fn provider -> %{key: provider["name"], value: provider["name"]} end)
end
end