import * as React from 'react' import { AppField } from '@/components/app/AppField' import { AppDataTable, type AppDataTableColumn } from '@/components/app/AppDataTable' import { AppEmptyState } from '@/components/app/AppEmptyState' import { AppFilterBar } from '@/components/app/AppFilterBar' import { AppPage } from '@/components/app/AppPage' import { AppPageHeader } from '@/components/app/AppPageHeader' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Switch } from '@/components/ui/switch' import { createUser, listRoles, listUserGroups, listUsers, setUserGroups, setUserRoles, updateUser } from './api' import type { RoleDetail, SystemUser, UserGroup } from './types' type UserForm = { username: string display_name: string email: string password: string } const emptyForm: UserForm = { username: '', display_name: '', email: '', password: '' } export function SystemUsersPage() { const [users, setUsers] = React.useState([]) const [roles, setRoles] = React.useState([]) const [groups, setGroups] = React.useState([]) const [query, setQuery] = React.useState('') const [form, setForm] = React.useState(emptyForm) const [editingUser, setEditingUser] = React.useState(null) const [error, setError] = React.useState('') const load = React.useCallback(async () => { try { const [nextUsers, nextRoles, nextGroups] = await Promise.all([listUsers(), listRoles(), listUserGroups()]) setUsers(nextUsers) setRoles(nextRoles) setGroups(nextGroups) setError('') } catch (reason) { setError(reason instanceof Error ? reason.message : '加载失败') } }, []) React.useEffect(() => { void load() }, [load]) const filteredUsers = users.filter((user) => { const keyword = query.trim().toLowerCase() if (!keyword) return true return `${user.username} ${user.display_name} ${user.email}`.toLowerCase().includes(keyword) }) async function handleCreateUser(event: React.FormEvent) { event.preventDefault() await createUser({ ...form, is_active: true }) setForm(emptyForm) await load() } async function toggleUserActive(user: SystemUser, checked: boolean) { await updateUser(user.id, { is_active: checked }) await load() } const columns: AppDataTableColumn[] = [ { key: 'user', header: '用户', cell: (user) => (

{user.display_name || user.username}

{user.username}

) }, { key: 'email', header: '邮箱', cell: (user) => {user.email || '-'} }, { key: 'roles', header: '角色', cell: (user) => (
{user.roles.length ? user.roles.map((role) => {role.name}) : '-'}
) }, { key: 'groups', header: '用户组', cell: (user) => (
{user.user_groups.length ? user.user_groups.map((group) => {group.name}) : '-'}
) }, { key: 'active', header: '状态', cell: (user) => ( event.stopPropagation()} onCheckedChange={(checked) => void toggleUserActive(user, checked)} /> ) }, { key: 'actions', header: '操作', cell: (user) => ( ) } ] return (
setForm({ ...form, username: event.target.value })} required /> setForm({ ...form, display_name: event.target.value })} /> setForm({ ...form, email: event.target.value })} /> setForm({ ...form, password: event.target.value })} required />
setQuery(event.target.value)} /> {error ? : null} {!error ? ( user.id} emptyTitle="暂无用户" footer={

当前显示 {filteredUsers.length} 个用户

} /> ) : null} setEditingUser(null)} onSaved={load} />
) } function UserAccessDialog({ user, roles, groups, onClose, onSaved }: { user: SystemUser | null roles: RoleDetail[] groups: UserGroup[] onClose: () => void onSaved: () => Promise }) { const [roleIds, setRoleIds] = React.useState([]) const [groupIds, setGroupIds] = React.useState([]) React.useEffect(() => { setRoleIds(user?.roles.map((role) => role.id) ?? []) setGroupIds(user?.user_groups.map((group) => group.id) ?? []) }, [user]) async function handleSave() { if (!user) return await Promise.all([setUserRoles(user.id, roleIds), setUserGroups(user.id, groupIds)]) await onSaved() onClose() } return ( !open && onClose()}> 用户授权{user ? `:${user.display_name || user.username}` : ''}
{roles.map((role) => ( ))}
{groups.map((group) => ( ))}
) }