import { SearchableSelect } from '../components/SearchableSelect'; import { useEffect, useState } from 'react'; import type { FormEvent } from 'react'; import { Link, useSearchParams } from 'react-router'; import { PermissionGate } from '../auth/PermissionGate'; import { Alert, EmptyState, LoadingBlock, errorMessage } from '../components/Feedback'; import { Icon } from '../components/Icon'; import { listUsers } from '../lib/api'; import type { AdministrativeUser, PageMeta } from '../lib/api'; import { formatDate, initials } from '../lib/format'; export function UsersPage() { const [urlParams, setUrlParams] = useSearchParams(); const [users, setUsers] = useState([]); const [meta, setMeta] = useState({ page: 1, pageSize: 20, total: 0, totalPages: 0 }); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [draftSearch, setDraftSearch] = useState(urlParams.get('search') ?? ''); const search = urlParams.get('search') ?? ''; const rawStatus = urlParams.get('status'); const status = rawStatus === 'ACTIVE' || rawStatus === 'INACTIVE' ? rawStatus : ''; const page = Math.max(1, Number(urlParams.get('page') ?? 1) || 1); useEffect(() => { setLoading(true); setError(''); listUsers({ page, pageSize: 20, search, status }) .then((response) => { setUsers(response.data); setMeta(response.meta); }) .catch((requestError) => setError(errorMessage(requestError))) .finally(() => setLoading(false)); }, [page, search, status]); const applyFilters = (event: FormEvent) => { event.preventDefault(); const next = new URLSearchParams(); if (draftSearch.trim()) next.set('search', draftSearch.trim()); if (status) next.set('status', status); setUrlParams(next); }; const setStatus = (value: string) => { const next = new URLSearchParams(urlParams); value ? next.set('status', value) : next.delete('status'); next.delete('page'); setUrlParams(next); }; const setPage = (value: number) => { const next = new URLSearchParams(urlParams); value > 1 ? next.set('page', String(value)) : next.delete('page'); setUrlParams(next); }; return (
ADMINISTRACIÓN

Usuarios

Gestioná accesos, estados y roles del sistema.

Nuevo usuario
{error && {error}} {loading ? : users.length === 0 ? :
{meta.total} usuario{meta.total === 1 ? '' : 's'}Página {meta.page} de {Math.max(meta.totalPages, 1)}
{users.map((user) => )}
UsuarioRolesEstadoÚltimo acceso
{initials(user.firstName, user.lastName)}
{user.firstName} {user.lastName}@{user.username}{user.email ? ` · ${user.email}` : ''}
{user.roles.length ? user.roles.map((role) => {role.name}) : Sin rol}
{user.status === 'ACTIVE' ? 'Activo' : 'Inactivo'}{user.mustChangePassword && Clave temporal}{formatDate(user.lastLoginAt)}
{meta.total ? `${(page - 1) * meta.pageSize + 1}–${Math.min(page * meta.pageSize, meta.total)} de ${meta.total}` : '0 resultados'}
}
); }