feat:账号设置+密码重置

This commit is contained in:
xiaozhu
2026-09-01 15:03:45 +08:00
parent 64d33fb1d0
commit 1532feedde
13 changed files with 815 additions and 29 deletions
@@ -16,6 +16,7 @@ import {
import { AdminColgroup, USER_PROJECT_COL_WIDTHS } from "./AdminTable";
import { AdminPagination } from "./AdminPagination";
import { UserFormDialog, type UserFormState } from "./UserFormDialog";
import { ResetPasswordDialog } from "./ResetPasswordDialog";
import { useCursorPage } from "./useCursorPage";
import {
adminEmptyClass,
@@ -61,6 +62,8 @@ export function UserManagementPage({
const [form, setForm] = useState<UserFormState>(EMPTY_FORM);
const [userSearchTerm, setUserSearchTerm] = useState("");
const [deleteTarget, setDeleteTarget] = useState<Employee | null>(null);
const [resetTarget, setResetTarget] = useState<Employee | null>(null);
const [resetSaving, setResetSaving] = useState(false);
const [createProjects, setCreateProjects] = useState<Workspace[]>([]);
const [createProjectsLoading, setCreateProjectsLoading] = useState(false);
const [selectedWorkspaceIds, setSelectedWorkspaceIds] = useState<string[]>([]);
@@ -262,6 +265,23 @@ export function UserManagementPage({
}
};
const executeResetPassword = async (newPassword: string): Promise<void> => {
if (!resetTarget) return;
setResetSaving(true);
try {
await api.resetPlatformEmployeePassword(resetTarget.user_id, newPassword);
onNotify({ tone: "success", message: "密码已重置" });
setResetTarget(null);
} catch (error) {
onNotify({
tone: "error",
message: error instanceof Error ? error.message : "重置密码失败",
});
} finally {
setResetSaving(false);
}
};
const emptyMessage = useMemo(() => {
if (loading) return "正在加载用户…";
if (debouncedSearch.trim()) return "未找到匹配的用户";
@@ -379,6 +399,14 @@ export function UserManagementPage({
onToggleWorkspace={toggleCreateWorkspace}
onSubmit={(event) => void submit(event)}
onClose={() => setDialogOpen(false)}
onResetPassword={
editing
? () => {
setResetTarget(editing);
setDialogOpen(false);
}
: undefined
}
/>
<ConfirmDialog
@@ -400,6 +428,15 @@ export function UserManagementPage({
setDeleteTarget(null);
}}
/>
<ResetPasswordDialog
open={resetTarget !== null}
displayName={resetTarget?.display_name ?? ""}
username={resetTarget?.username ?? ""}
saving={resetSaving}
onSubmit={executeResetPassword}
onClose={() => setResetTarget(null)}
/>
</section>
);
}