ui(users): banner explaining the disabled-username re-enable flow
CI / Test (rest) (pull_request) Successful in 29s
CI / Lint (pull_request) Successful in 32s
CI / Test (server-http) (pull_request) Successful in 1m9s
CI / Test (store) (pull_request) Successful in 1m13s
CI / Build (windows/amd64) (pull_request) Successful in 23s
CI / Build (linux/amd64) (pull_request) Successful in 21s
CI / Build (linux/arm64) (pull_request) Successful in 37s

This commit is contained in:
2026-05-05 10:43:11 +01:00
parent 0415a96e27
commit dfff6d1ef9
2 changed files with 28 additions and 0 deletions
+6
View File
@@ -153,6 +153,11 @@ type userFormPage struct {
SetupURL string SetupURL string
SetupExpAt time.Time SetupExpAt time.Time
Error string Error string
// Reenable is set when the admin landed here because they tried
// to add a username that already exists (disabled). Triggers a
// banner on the edit page explaining why and steering them at
// the Re-enable button. See handleUIUserNewPost's collision branch.
Reenable bool
} }
func (s *Server) handleUIUserNewGet(w stdhttp.ResponseWriter, r *stdhttp.Request) { func (s *Server) handleUIUserNewGet(w stdhttp.ResponseWriter, r *stdhttp.Request) {
@@ -290,6 +295,7 @@ func (s *Server) handleUIUserEditGet(w stdhttp.ResponseWriter, r *stdhttp.Reques
Mode: "edit", ID: target.ID, Username: target.Username, Mode: "edit", ID: target.ID, Username: target.Username,
Email: em, Role: string(target.Role), Email: em, Role: string(target.Role),
Disabled: target.DisabledAt != nil, Disabled: target.DisabledAt != nil,
Reenable: r.URL.Query().Get("reenable") == "1",
} }
_ = s.deps.UI.Render(w, "user_edit", view) _ = s.deps.UI.Render(w, "user_edit", view)
} }
+22
View File
@@ -16,6 +16,28 @@
{{else}}Edit <span class="mono">{{$page.Username}}</span>{{end}} {{else}}Edit <span class="mono">{{$page.Username}}</span>{{end}}
</h1> </h1>
{{/* Re-enable banner — fires when the admin tried to add a user
whose name already exists in a disabled state. We were
redirected here from /settings/users/new with ?reenable=1. */}}
{{if and $page.Reenable $page.Disabled}}
<div class="panel mt-5 rounded-[7px] p-5"
style="border-color: color-mix(in oklch, var(--warn), transparent 50%);
background: color-mix(in oklch, var(--warn), transparent 95%);">
<div class="text-[13px] font-medium text-warn mb-2">Username already exists (disabled)</div>
<p class="text-pretty text-[12.5px] text-ink-mute leading-[1.6] mb-4">
A user with this name was created previously and then disabled.
Re-enable them to restore access (their existing role + email
are kept), or pick a different name.
</p>
<div class="flex gap-2">
<form method="post" action="/settings/users/{{$page.ID}}/enable">
<button type="submit" class="btn btn-primary">Re-enable {{$page.Username}}</button>
</form>
<a href="/settings/users/new" class="btn">Pick a different username</a>
</div>
</div>
{{end}}
{{if eq $page.Mode "setup-link"}} {{if eq $page.Mode "setup-link"}}
{{if eq $page.Error "expired"}} {{if eq $page.Error "expired"}}
<div class="panel mt-7 rounded-[7px] p-6" <div class="panel mt-7 rounded-[7px] p-6"