Admin user editing, knight-rider demos, self-contained user seeds
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -54,6 +54,7 @@
|
||||
<body>
|
||||
<main class="card">
|
||||
<h1>Create account</h1>
|
||||
<p id="invite-banner" class="hint hidden"></p>
|
||||
<p class="hint">Username: letters, numbers, underscore (3–64). Password: at least 8 characters.</p>
|
||||
<div id="err" class="err"></div>
|
||||
<form id="form">
|
||||
@@ -67,9 +68,31 @@
|
||||
<p><a href="/login">Sign in</a> · <a href="/">Home</a></p>
|
||||
</main>
|
||||
<script>
|
||||
const inviteToken = new URLSearchParams(window.location.search).get("invite") || "";
|
||||
const inviteTokenRaw = new URLSearchParams(window.location.search).get("invite") || "";
|
||||
const inviteToken = inviteTokenRaw.trim();
|
||||
const inviteInput = document.getElementById("invite-token");
|
||||
if (inviteInput) inviteInput.value = inviteToken;
|
||||
if (inviteToken) {
|
||||
const banner = document.getElementById("invite-banner");
|
||||
if (banner) {
|
||||
banner.classList.remove("hidden");
|
||||
banner.textContent =
|
||||
"You're using an invite link. Choose a username and password — the link works for one signup only.";
|
||||
}
|
||||
}
|
||||
|
||||
function formatApiDetail(body) {
|
||||
if (!body || body.detail === undefined || body.detail === null) return "";
|
||||
const d = body.detail;
|
||||
if (typeof d === "string") return d;
|
||||
if (Array.isArray(d))
|
||||
return d
|
||||
.map((item) =>
|
||||
typeof item === "object" && item && item.msg ? String(item.msg) : JSON.stringify(item)
|
||||
)
|
||||
.join(" ");
|
||||
return String(d);
|
||||
}
|
||||
|
||||
(async function checkStatus() {
|
||||
try {
|
||||
@@ -98,7 +121,7 @@
|
||||
const body = {
|
||||
username: document.getElementById("username").value.trim(),
|
||||
password: document.getElementById("password").value,
|
||||
invite_token: inviteToken || null,
|
||||
invite_token: inviteToken ? inviteToken : null,
|
||||
};
|
||||
const res = await fetch("/api/auth/register", {
|
||||
method: "POST",
|
||||
@@ -107,7 +130,7 @@
|
||||
});
|
||||
if (!res.ok) {
|
||||
const j = await res.json().catch(() => ({}));
|
||||
err.textContent = typeof j.detail === "string" ? j.detail : JSON.stringify(j.detail) || res.statusText;
|
||||
err.textContent = formatApiDetail(j) || res.statusText;
|
||||
return;
|
||||
}
|
||||
window.location.href = "/login?next=/editor";
|
||||
|
||||
Reference in New Issue
Block a user