fix email settings: missing providers, a11y, no-JS support
show all 10 providers in three groups (popular, transactional, advanced) with category headings. fix phx-change clobbering text fields, async test email sending state, integer parse crash on bad port. add keyboard focus on card radios, fieldset legend, WCAG-compliant badge contrast, responsive grid. extract shared save_config into Mailer, add no-JS controller fallback with configured_adapter hidden field for adapter change detection. remove CardRadioScroll JS hook (no longer needed). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
54
lib/berrypod_web/controllers/email_settings_controller.ex
Normal file
54
lib/berrypod_web/controllers/email_settings_controller.ex
Normal file
@@ -0,0 +1,54 @@
|
||||
defmodule BerrypodWeb.EmailSettingsController do
|
||||
@moduledoc """
|
||||
No-JS fallback for email settings form submission.
|
||||
|
||||
With JS enabled, the LiveView handles everything. Without JS,
|
||||
the form POSTs here and we redirect back to the LiveView page.
|
||||
"""
|
||||
use BerrypodWeb, :controller
|
||||
|
||||
alias Berrypod.Mailer
|
||||
|
||||
def update(conn, %{"email" => params}) do
|
||||
selected = params["adapter"]
|
||||
configured = params["configured_adapter"]
|
||||
|
||||
if selected != configured do
|
||||
# User changed adapter radio but config fields are for the old adapter.
|
||||
# Redirect to show the new adapter's config fields.
|
||||
redirect(conn, to: ~p"/admin/settings/email?adapter=#{selected}")
|
||||
else
|
||||
case Mailer.save_config(selected, params, conn.assigns.current_scope.user.email) do
|
||||
{:ok, _adapter_info} ->
|
||||
conn
|
||||
|> put_flash(:info, "Settings saved — send a test email to check it works")
|
||||
|> redirect(to: ~p"/admin/settings/email")
|
||||
|
||||
{:error, field_errors} when is_map(field_errors) ->
|
||||
message = field_errors |> Map.values() |> Enum.join(". ")
|
||||
|
||||
conn
|
||||
|> put_flash(:error, message)
|
||||
|> redirect(to: ~p"/admin/settings/email?adapter=#{selected}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test(conn, _params) do
|
||||
user = conn.assigns.current_scope.user
|
||||
|
||||
case Mailer.send_test_email(user.email, Mailer.from_address()) do
|
||||
{:ok, _} ->
|
||||
Mailer.mark_email_verified()
|
||||
|
||||
conn
|
||||
|> put_flash(:info, "Test email sent to #{user.email}")
|
||||
|> redirect(to: ~p"/admin/settings/email")
|
||||
|
||||
{:error, reason} ->
|
||||
conn
|
||||
|> put_flash(:error, Mailer.friendly_error(reason))
|
||||
|> redirect(to: ~p"/admin/settings/email")
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user