Packages
phoenix_kit
1.7.204
1.7.210
1.7.209
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
Current section
Files
lib/phoenix_kit_web/live/settings/email_sending.html.heex
<PhoenixKitWeb.Components.LayoutWrapper.app_layout
socket={@socket}
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title={@page_title}
page_subtitle={@page_subtitle}
current_path={@current_path}
project_title={@project_title}
current_locale={@current_locale}
>
<div class="container flex flex-col mx-auto px-4 py-6 gap-6">
<.form_section
title={gettext("Sender Identity")}
icon="hero-identification"
body_class="space-y-4"
>
<:subtitle>
{gettext("Currently effective:")} {@effective_from_name} <{@effective_from_email}>
</:subtitle>
<form id="sender-identity-form" phx-submit="save_sender_identity" class="space-y-4">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<.input
name="from_name"
type="text"
value={@from_name}
label={gettext("From name")}
placeholder={@effective_from_name}
/>
<.input
name="from_email"
type="email"
value={@from_email}
label={gettext("From email")}
placeholder={@effective_from_email}
/>
</div>
<p class="text-xs text-base-content/50">
{gettext(
"Leave a field blank to fall back to the application config or built-in default."
)}
</p>
<button type="submit" class="btn btn-primary btn-sm">
{gettext("Save sender identity")}
</button>
</form>
</.form_section>
<.form_section title={gettext("Transport")} icon="hero-server-stack" body_class="space-y-4">
<:subtitle>
{gettext("Used when no default transactional integration is selected below.")}
</:subtitle>
<div class={["alert", if(@mailer_adapter, do: "alert-success", else: "alert-warning")]}>
<.icon name="hero-server-stack" class="w-5 h-5 shrink-0" />
<div>
<h3 class="font-bold flex items-center gap-2">
<%= if @mailer_built_in? do %>
{gettext("Static mailer: built-in PhoenixKit mailer")}
<% else %>
{gettext("Static mailer: parent app mailer (%{module})",
module: inspect(@mailer_module)
)}
<% end %>
<span class={[
"badge badge-sm",
if(@mailer_adapter, do: "badge-success", else: "badge-warning")
]}>
{if @mailer_adapter, do: gettext("Configured"), else: gettext("Not configured")}
</span>
</h3>
<p :if={@mailer_adapter} class="text-sm mt-1">
{gettext("adapter")}: {inspect(@mailer_adapter)}
</p>
<p :if={!@mailer_adapter} class="text-sm mt-1">
{gettext(
"No adapter configured for the static mailer. Set one in your application config, or connect an email-capable integration below and pick it as the default transactional integration."
)}
</p>
</div>
</div>
<div>
<h4 class="font-medium text-sm mb-2">{gettext("Email-capable integrations")}</h4>
<%= if @email_connections == [] do %>
<p class="text-sm text-base-content/60">
{gettext("No email-capable integrations connected yet.")}
<.pk_link navigate="/admin/settings/integrations/new" class="link link-primary">
{gettext("Add one")}
</.pk_link>
</p>
<% else %>
<.table_default variant="zebra" size="sm" class="w-full">
<.table_default_header>
<.table_default_row>
<.table_default_header_cell>{gettext("Service")}</.table_default_header_cell>
<.table_default_header_cell>{gettext("Name")}</.table_default_header_cell>
<.table_default_header_cell>{gettext("Status")}</.table_default_header_cell>
</.table_default_row>
</.table_default_header>
<.table_default_body>
<.table_default_row :for={conn <- @email_connections}>
<.table_default_cell>
<div class="flex items-center gap-2">
<.icon name={conn.provider.icon} class="w-4 h-4 text-base-content/60" />
<span>{conn.provider.name}</span>
</div>
</.table_default_cell>
<.table_default_cell>{conn.name}</.table_default_cell>
<.table_default_cell>
<% {badge_class, badge_text} = integration_status_badge(conn.data["status"]) %>
<span class={"badge badge-sm #{badge_class}"}>{badge_text}</span>
<span
:if={conn.data["validation_status"] not in [nil, "", "ok"]}
class="text-xs block mt-0.5 text-base-content/70"
>
{conn.data["validation_status"]}
</span>
</.table_default_cell>
</.table_default_row>
</.table_default_body>
</.table_default>
<% end %>
</div>
</.form_section>
<.form_section title={gettext("Default Transactional Integration")} icon="hero-paper-airplane">
<:subtitle>
{gettext(
"All outbound core mail — authentication, notifications — routes through this integration when set. Leave unset to use the static mailer above. For newsletter broadcasts, see"
)}
<.pk_link navigate="/admin/settings/email-sending/profiles" class="link link-primary">
{gettext("Send Profiles")}
</.pk_link>.
</:subtitle>
<form id="default-integration-form" phx-change="select_default_integration">
<.select
name="integration_uuid"
value={@default_integration_uuid}
prompt={gettext("None — use the static mailer")}
options={Enum.map(@email_connections, &{"#{&1.provider.name} — #{&1.name}", &1.uuid})}
class="max-w-md"
/>
</form>
</.form_section>
<.form_section title={gettext("Test Send")} icon="hero-paper-airplane">
<form
id="test-send-form"
phx-submit="send_test_email"
class="flex flex-col sm:flex-row gap-3 items-start sm:items-end"
>
<.input
name="recipient"
type="email"
value=""
label={gettext("Recipient")}
placeholder="you@example.com"
wrapper_class="w-full max-w-sm"
required
/>
<button type="submit" class="btn btn-outline btn-sm">
{gettext("Send test email")}
</button>
</form>
</.form_section>
<.form_section title={gettext("Send Profiles")} icon="hero-adjustments-horizontal">
<:subtitle>
{gettext("Per-account sender identity, rate limits, and provider-specific options.")}
</:subtitle>
<.pk_link navigate="/admin/settings/email-sending/profiles" class="btn btn-outline btn-sm">
{gettext("Manage send profiles")}
</.pk_link>
</.form_section>
<.form_section
:for={section <- @email_settings_sections}
title={section.title}
icon="hero-puzzle-piece"
>
<.live_component module={section.component} id={section.id} />
</.form_section>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>