Packages

phoenix_kit

1.7.219
1.7.220 1.7.219 1.7.218 1.7.217 1.7.216 1.7.215 1.7.214 1.7.213 1.7.212 1.7.211 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
phoenix_kit lib phoenix_kit_web live settings email_sending.html.heex
Raw

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="flex flex-col 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} &lt;{@effective_from_email}&gt;
</:subtitle>
<%!-- A sender the tracking module cannot log is the one failure mode with
no symptom: mail still goes out, the log stays empty, and nothing in
the UI says why. Warn where the address is edited. --%>
<div :if={!@sender_loggable?} class="alert alert-warning">
<.icon name="hero-exclamation-triangle" class="w-5 h-5 shrink-0" />
<div>
<div class="font-semibold">
{gettext("This sender address cannot be logged")}
</div>
<div class="text-sm">
{gettext(
"The email tracking module only records messages sent from a full address (name@domain.tld). With %{email} mail is still delivered, but nothing is written to the email log — silently.",
email: @effective_from_email
)}
</div>
</div>
</div>
<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/website/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>