improve setup UX: password field, setup hook, checklist banners, theme tweaks
All checks were successful
deploy / deploy (push) Successful in 1m31s

- add password field and required shop name to setup wizard
- extract SetupHook for DRY redirect to /setup when no admin exists
- add ?from=checklist param to checklist hrefs with contextual banner on
  email settings and theme pages for easy return to dashboard
- remove email warning banner from admin layout (checklist covers it)
- make email a required checklist item (no longer optional)
- add DevReset module for wiping dev data without restart
- rename "Theme Studio" to "Theme", drop subtitle
- lower theme editor side-by-side breakpoint from 64em to 48em
- clean up login/registration pages (remove dead registration_open code)
- fix settings.put_secret to invalidate cache after write

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-03-03 17:41:08 +00:00
parent 0853b6f528
commit 64f083d271
23 changed files with 309 additions and 118 deletions

View File

@@ -12,17 +12,10 @@ defmodule BerrypodWeb.Auth.Login do
<.header>
<p>Log in</p>
<:subtitle>
<%= cond do %>
<% @current_scope -> %>
You need to reauthenticate to perform sensitive actions on your account.
<% @registration_open -> %>
Don't have an account? <.link
navigate={~p"/setup"}
class="font-semibold text-brand hover:underline"
phx-no-format
>Set up your shop</.link> to get started.
<% true -> %>
Log in with your admin credentials.
<%= if @current_scope do %>
You need to reauthenticate to perform sensitive actions on your account.
<% else %>
Log in with your admin credentials.
<% end %>
</:subtitle>
</.header>
@@ -116,7 +109,6 @@ defmodule BerrypodWeb.Auth.Login do
assign(socket,
form: form,
trigger_submit: false,
registration_open: !Accounts.has_admin?(),
email_configured: Mailer.email_verified?()
)}
end

View File

@@ -48,15 +48,11 @@ defmodule BerrypodWeb.Auth.Registration do
end
def mount(_params, _session, socket) do
if Accounts.has_admin?() do
{:ok,
socket
|> put_flash(:error, "Registration is closed")
|> redirect(to: ~p"/users/log-in")}
else
# Fresh install — account creation happens on the setup page
{:ok, redirect(socket, to: ~p"/setup")}
end
# Admin exists (hook handles no-admin), registration is single-user only
{:ok,
socket
|> put_flash(:error, "Registration is closed")
|> redirect(to: ~p"/users/log-in")}
end
@impl true