updates
This commit is contained in:
@@ -192,6 +192,7 @@ export function AdminPanel({ open, onClose, bare }: { open: boolean; onClose: ()
|
|||||||
const [editTarget, setEditTarget] = useState<User | null>(null);
|
const [editTarget, setEditTarget] = useState<User | null>(null);
|
||||||
const [resetTarget, setResetTarget] = useState<User | null>(null);
|
const [resetTarget, setResetTarget] = useState<User | null>(null);
|
||||||
const [resetSent, setResetSent] = useState<{ username: string; email: string } | null>(null);
|
const [resetSent, setResetSent] = useState<{ username: string; email: string } | null>(null);
|
||||||
|
const [regenTarget, setRegenTarget] = useState<User | null>(null);
|
||||||
// Listing: search + sort + filter + pagination (server-side).
|
// Listing: search + sort + filter + pagination (server-side).
|
||||||
const [q, setQ] = useState("");
|
const [q, setQ] = useState("");
|
||||||
const [debouncedQ, setDebouncedQ] = useState("");
|
const [debouncedQ, setDebouncedQ] = useState("");
|
||||||
@@ -264,6 +265,7 @@ export function AdminPanel({ open, onClose, bare }: { open: boolean; onClose: ()
|
|||||||
|
|
||||||
async function regenerate(u: User) {
|
async function regenerate(u: User) {
|
||||||
setError("");
|
setError("");
|
||||||
|
setFreshKey(null);
|
||||||
try {
|
try {
|
||||||
const res = await api.adminRegenerate(u.id);
|
const res = await api.adminRegenerate(u.id);
|
||||||
setFreshKey({ username: u.username, key: res.key });
|
setFreshKey({ username: u.username, key: res.key });
|
||||||
@@ -390,7 +392,7 @@ export function AdminPanel({ open, onClose, bare }: { open: boolean; onClose: ()
|
|||||||
{!u.isAdmin && (
|
{!u.isAdmin && (
|
||||||
<div className="flex shrink-0 gap-1">
|
<div className="flex shrink-0 gap-1">
|
||||||
<button title={t("admin.editProfile")} onClick={() => setEditTarget(u)} className="rounded-full p-2 transition hover:bg-stone-100 dark:hover:bg-zinc-800"><Pencil size={15} /></button>
|
<button title={t("admin.editProfile")} onClick={() => setEditTarget(u)} className="rounded-full p-2 transition hover:bg-stone-100 dark:hover:bg-zinc-800"><Pencil size={15} /></button>
|
||||||
<button title={t("admin.regenKey")} onClick={() => regenerate(u)} className="rounded-full p-2 transition hover:bg-stone-100 dark:hover:bg-zinc-800"><RefreshCw size={15} /></button>
|
<button title={t("admin.regenKey")} onClick={() => setRegenTarget(u)} className="rounded-full p-2 transition hover:bg-stone-100 dark:hover:bg-zinc-800"><RefreshCw size={15} /></button>
|
||||||
<button title={t("admin.resetLink")} onClick={() => setResetTarget(u)} className="rounded-full p-2 transition hover:bg-stone-100 dark:hover:bg-zinc-800"><Mail size={15} /></button>
|
<button title={t("admin.resetLink")} onClick={() => setResetTarget(u)} className="rounded-full p-2 transition hover:bg-stone-100 dark:hover:bg-zinc-800"><Mail size={15} /></button>
|
||||||
<button title={t("admin.deleteAccount")} onClick={() => setDeleteTarget(u)} className="rounded-full p-2 text-red-600 transition hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40"><Trash2 size={15} /></button>
|
<button title={t("admin.deleteAccount")} onClick={() => setDeleteTarget(u)} className="rounded-full p-2 text-red-600 transition hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40"><Trash2 size={15} /></button>
|
||||||
</div>
|
</div>
|
||||||
@@ -443,6 +445,19 @@ export function AdminPanel({ open, onClose, bare }: { open: boolean; onClose: ()
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<ConfirmDialog
|
||||||
|
open={regenTarget !== null}
|
||||||
|
onClose={() => setRegenTarget(null)}
|
||||||
|
title={t("admin.regenTitle", { user: regenTarget?.username ?? "" })}
|
||||||
|
message={t("admin.regenMsg")}
|
||||||
|
confirmLabel={t("admin.regenConfirm")}
|
||||||
|
onConfirm={() => {
|
||||||
|
const u = regenTarget;
|
||||||
|
setRegenTarget(null);
|
||||||
|
if (u) void regenerate(u);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
<EditUserDialog user={editTarget} onClose={() => setEditTarget(null)} onSaved={refresh} />
|
<EditUserDialog user={editTarget} onClose={() => setEditTarget(null)} onSaved={refresh} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -245,6 +245,9 @@ const en = {
|
|||||||
"admin.createFailed": "Create failed",
|
"admin.createFailed": "Create failed",
|
||||||
"admin.regenFailed": "Regenerate failed",
|
"admin.regenFailed": "Regenerate failed",
|
||||||
"admin.resetLink": "Email a password reset link",
|
"admin.resetLink": "Email a password reset link",
|
||||||
|
"admin.regenTitle": "Regenerate the key for @{user}?",
|
||||||
|
"admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.",
|
||||||
|
"admin.regenConfirm": "Regenerate",
|
||||||
"admin.resetTitle": "Email a reset link to @{user}?",
|
"admin.resetTitle": "Email a reset link to @{user}?",
|
||||||
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
||||||
"admin.resetConfirm": "Send link",
|
"admin.resetConfirm": "Send link",
|
||||||
@@ -964,6 +967,9 @@ const es: Dict = {
|
|||||||
"admin.createFailed": "No se pudo crear",
|
"admin.createFailed": "No se pudo crear",
|
||||||
"admin.regenFailed": "No se pudo regenerar",
|
"admin.regenFailed": "No se pudo regenerar",
|
||||||
"admin.resetLink": "Email a password reset link",
|
"admin.resetLink": "Email a password reset link",
|
||||||
|
"admin.regenTitle": "Regenerate the key for @{user}?",
|
||||||
|
"admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.",
|
||||||
|
"admin.regenConfirm": "Regenerate",
|
||||||
"admin.resetTitle": "Email a reset link to @{user}?",
|
"admin.resetTitle": "Email a reset link to @{user}?",
|
||||||
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
||||||
"admin.resetConfirm": "Send link",
|
"admin.resetConfirm": "Send link",
|
||||||
@@ -1675,6 +1681,9 @@ const fr: Dict = {
|
|||||||
"admin.createFailed": "Création impossible",
|
"admin.createFailed": "Création impossible",
|
||||||
"admin.regenFailed": "Régénération impossible",
|
"admin.regenFailed": "Régénération impossible",
|
||||||
"admin.resetLink": "Email a password reset link",
|
"admin.resetLink": "Email a password reset link",
|
||||||
|
"admin.regenTitle": "Regenerate the key for @{user}?",
|
||||||
|
"admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.",
|
||||||
|
"admin.regenConfirm": "Regenerate",
|
||||||
"admin.resetTitle": "Email a reset link to @{user}?",
|
"admin.resetTitle": "Email a reset link to @{user}?",
|
||||||
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
||||||
"admin.resetConfirm": "Send link",
|
"admin.resetConfirm": "Send link",
|
||||||
@@ -2380,6 +2389,9 @@ const ru: Dict = {
|
|||||||
"admin.createFailed": "Не создалось",
|
"admin.createFailed": "Не создалось",
|
||||||
"admin.regenFailed": "Не сменилось",
|
"admin.regenFailed": "Не сменилось",
|
||||||
"admin.resetLink": "Email a password reset link",
|
"admin.resetLink": "Email a password reset link",
|
||||||
|
"admin.regenTitle": "Regenerate the key for @{user}?",
|
||||||
|
"admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.",
|
||||||
|
"admin.regenConfirm": "Regenerate",
|
||||||
"admin.resetTitle": "Email a reset link to @{user}?",
|
"admin.resetTitle": "Email a reset link to @{user}?",
|
||||||
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
||||||
"admin.resetConfirm": "Send link",
|
"admin.resetConfirm": "Send link",
|
||||||
@@ -3080,6 +3092,9 @@ const it: Dict = {
|
|||||||
"admin.createFailed": "Creazione fallita",
|
"admin.createFailed": "Creazione fallita",
|
||||||
"admin.regenFailed": "Rigenerazione fallita",
|
"admin.regenFailed": "Rigenerazione fallita",
|
||||||
"admin.resetLink": "Email a password reset link",
|
"admin.resetLink": "Email a password reset link",
|
||||||
|
"admin.regenTitle": "Regenerate the key for @{user}?",
|
||||||
|
"admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.",
|
||||||
|
"admin.regenConfirm": "Regenerate",
|
||||||
"admin.resetTitle": "Email a reset link to @{user}?",
|
"admin.resetTitle": "Email a reset link to @{user}?",
|
||||||
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
||||||
"admin.resetConfirm": "Send link",
|
"admin.resetConfirm": "Send link",
|
||||||
@@ -3781,6 +3796,9 @@ const pt: Dict = {
|
|||||||
"admin.createFailed": "Falha ao criar",
|
"admin.createFailed": "Falha ao criar",
|
||||||
"admin.regenFailed": "Falha ao regenerar",
|
"admin.regenFailed": "Falha ao regenerar",
|
||||||
"admin.resetLink": "Email a password reset link",
|
"admin.resetLink": "Email a password reset link",
|
||||||
|
"admin.regenTitle": "Regenerate the key for @{user}?",
|
||||||
|
"admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.",
|
||||||
|
"admin.regenConfirm": "Regenerate",
|
||||||
"admin.resetTitle": "Email a reset link to @{user}?",
|
"admin.resetTitle": "Email a reset link to @{user}?",
|
||||||
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
"admin.resetMsg": "A one-time key-recovery link will be sent to {email}.",
|
||||||
"admin.resetConfirm": "Send link",
|
"admin.resetConfirm": "Send link",
|
||||||
|
|||||||
Reference in New Issue
Block a user