migrate admin forms to inline feedback
All checks were successful
deploy / deploy (push) Successful in 1m26s

Replace put_flash calls with inline feedback for form saves:
- Email settings: "Now send a test email" after saving
- Settings: from address and signing secret saves
- Page editor: save button shows "Saved" checkmark

Inline feedback appears next to save buttons and auto-clears after
3 seconds. Banners (put_flash) remain for page-level outcomes like
deletions, state changes, and async operations.

Task 3 of notification overhaul. Theme editor skipped as it auto-saves.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-03-07 21:01:54 +00:00
parent bd07c9c7d9
commit 42542ac177
7 changed files with 56 additions and 13 deletions

View File

@@ -37,6 +37,7 @@ defmodule BerrypodWeb.Admin.EmailSettings do
|> assign(:test_retryable, false)
|> assign(:from_checklist, false)
|> assign(:field_errors, flash_errors)
|> assign(:save_status, :idle)
|> assign(:form, to_form(%{}, as: :email))}
end
@@ -93,6 +94,8 @@ defmodule BerrypodWeb.Admin.EmailSettings do
socket.assigns.current_scope.user.email
) do
{:ok, _adapter_info} ->
Process.send_after(self(), :clear_save_status, 3000)
{:noreply,
socket
|> assign(:adapter_key, adapter_key)
@@ -102,7 +105,7 @@ defmodule BerrypodWeb.Admin.EmailSettings do
|> assign(:field_errors, %{})
|> assign(:test_result, nil)
|> assign(:test_error, nil)
|> put_flash(:info, "Settings saved — send a test email to check it works")}
|> assign(:save_status, :saved)}
{:error, field_errors} when is_map(field_errors) ->
{:noreply, assign(socket, :field_errors, field_errors)}
@@ -142,6 +145,10 @@ defmodule BerrypodWeb.Admin.EmailSettings do
# Swoosh test adapter sends {:email, ...} messages — ignore them
def handle_info({:email, _}, socket), do: {:noreply, socket}
def handle_info(:clear_save_status, socket) do
{:noreply, assign(socket, :save_status, :idle)}
end
@impl true
def render(assigns) do
~H"""
@@ -235,6 +242,7 @@ defmodule BerrypodWeb.Admin.EmailSettings do
values={@all_values[adapter.key] || %{}}
field_errors={if(@adapter_key == adapter.key, do: @field_errors, else: %{})}
env_locked={@env_locked}
save_status={if(@adapter_key == adapter.key, do: @save_status, else: :idle)}
/>
</.form>
</section>
@@ -336,6 +344,7 @@ defmodule BerrypodWeb.Admin.EmailSettings do
attr :values, :map, required: true
attr :field_errors, :map, required: true
attr :env_locked, :boolean, required: true
attr :save_status, :atom, default: :idle
defp adapter_config(assigns) do
~H"""
@@ -377,6 +386,7 @@ defmodule BerrypodWeb.Admin.EmailSettings do
<.button phx-disable-with="Saving...">
Save settings
</.button>
<.inline_feedback status={@save_status} message="Now send a test email" />
</div>
<% end %>
</div>