From 3cb1db81c03c4641b44bf7fee1d85e3b3b49d2ac Mon Sep 17 00:00:00 2001 From: Tiago Yamamoto Date: Wed, 31 Dec 2025 11:47:15 -0300 Subject: [PATCH] feat(frontend): i18n for admin users page --- frontend/src/app/dashboard/users/page.tsx | 104 +++++++++++----------- frontend/src/i18n/en.json | 58 ++++++++++++ frontend/src/i18n/es.json | 58 ++++++++++++ frontend/src/i18n/pt-BR.json | 58 ++++++++++++ 4 files changed, 227 insertions(+), 51 deletions(-) diff --git a/frontend/src/app/dashboard/users/page.tsx b/frontend/src/app/dashboard/users/page.tsx index a179b4a..c39e47b 100644 --- a/frontend/src/app/dashboard/users/page.tsx +++ b/frontend/src/app/dashboard/users/page.tsx @@ -23,6 +23,7 @@ import { usersApi, adminCompaniesApi, type ApiUser, type AdminCompany } from "@/ import { getCurrentUser, isAdminUser } from "@/lib/auth" import { toast } from "sonner" import { Skeleton } from "@/components/ui/skeleton" +import { useTranslation } from "@/lib/i18n" const userDateFormatter = new Intl.DateTimeFormat("en-US", { dateStyle: "medium", @@ -31,6 +32,7 @@ const userDateFormatter = new Intl.DateTimeFormat("en-US", { export default function AdminUsersPage() { const router = useRouter() + const { t } = useTranslation() const [users, setUsers] = useState([]) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState("") @@ -105,7 +107,7 @@ export default function AdminUsersPage() { setPage(data?.pagination?.page || targetPage) } catch (error) { console.error("[USER_FLOW] Error loading users:", error) - toast.error("Failed to load users") + toast.error(t('admin.users.messages.load_error')) } finally { setLoading(false) } @@ -120,14 +122,14 @@ export default function AdminUsersPage() { roles: [formData.role], } await usersApi.create(payload) - toast.success("User created successfully!") + toast.success(t('admin.users.messages.create_success')) setIsDialogOpen(false) setFormData({ name: "", email: "", password: "", role: "candidate", status: "active", companyId: "" }) setPage(1) loadUsers(1) } catch (error) { console.error("[USER_FLOW] Error creating user:", error) - toast.error("Failed to create user") + toast.error(t('admin.users.messages.create_error')) } finally { setCreating(false) } @@ -169,12 +171,12 @@ export default function AdminUsersPage() { roles: [editFormData.role], } await usersApi.update(selectedUser.id, payload) - toast.success("User updated successfully!") + toast.success(t('admin.users.messages.update_success')) setIsEditDialogOpen(false) loadUsers() } catch (error) { console.error("[USER_FLOW] Error updating user:", error) - toast.error("Failed to update user") + toast.error(t('admin.users.messages.update_error')) } finally { setUpdating(false) } @@ -193,7 +195,7 @@ export default function AdminUsersPage() { try { setDeleting(true) await usersApi.delete(selectedUser.id) - toast.success("User deleted!") + toast.success(t('admin.users.messages.delete_success')) // UI Update logic if (users.length === 1 && page > 1) { @@ -210,7 +212,7 @@ export default function AdminUsersPage() { if (error.message && error.message.includes("403")) { toast.error("You don't have permission to delete this user (403)") } else { - toast.error("Failed to delete user") + toast.error(t('admin.users.messages.delete_error')) } } finally { setDeleting(false) @@ -247,44 +249,44 @@ export default function AdminUsersPage() { {/* Header */}
-

User management

-

Manage all platform users

+

{t('admin.users.title')}

+

{t('admin.users.subtitle')}

- Create new user - Fill in the new user details + {t('admin.users.create_dialog.title')} + {t('admin.users.create_dialog.description')}
- + setFormData({ ...formData, name: e.target.value })} - placeholder="Full name" + placeholder={t('admin.users.table.name')} />
- + setFormData({ ...formData, email: e.target.value })} - placeholder="email@example.com" + placeholder={t('admin.users.table.email')} />
@@ -314,7 +316,7 @@ export default function AdminUsersPage() {
)}
- +
- + setEditFormData({ ...editFormData, name: e.target.value })} - placeholder="Full name" + placeholder={t('admin.users.table.name')} readOnly={viewing} disabled={viewing} />
- + setEditFormData({ ...editFormData, email: e.target.value })} - placeholder="email@example.com" + placeholder={t('admin.users.table.email')} readOnly={viewing} disabled={viewing} /> @@ -421,7 +423,7 @@ export default function AdminUsersPage() { {viewing ? ( <> )} @@ -446,9 +448,9 @@ export default function AdminUsersPage() { - Delete User + {t('admin.users.delete_confirm.title')} - Are you sure you want to delete this user? This action cannot be undone. + {t('admin.users.delete_confirm.description')}
@@ -462,11 +464,11 @@ export default function AdminUsersPage() {
@@ -478,13 +480,13 @@ export default function AdminUsersPage() {
- Total users + {t('admin.users.total')} {totalUsers} - Admins (page) + {t('admin.users.admins')} {users.filter((u) => u.role === "superadmin" || u.role === "admin" || u.role === "admin").length} @@ -492,13 +494,13 @@ export default function AdminUsersPage() { - Recruiters (page) + {t('admin.users.recruiters')} {users.filter((u) => u.role === "recruiter").length} - Candidates (page) + {t('admin.users.candidates')} {users.filter((u) => u.role === "candidate" || u.role === "candidate").length} @@ -511,7 +513,7 @@ export default function AdminUsersPage() {
setSearchTerm(e.target.value)} className="pl-10" @@ -534,19 +536,19 @@ export default function AdminUsersPage() { - Name - Email - Role - Status - Created - Actions + {t('admin.users.table.name')} + {t('admin.users.table.email')} + {t('admin.users.table.role')} + {t('admin.users.table.status')} + {t('admin.users.table.created')} + {t('admin.users.table.actions')} {filteredUsers.length === 0 ? ( - No users found + {t('admin.users.table.no_users')} ) : ( @@ -607,8 +609,8 @@ export default function AdminUsersPage() {
{totalUsers === 0 - ? "No users to display" - : `Showing ${(page - 1) * limit + 1}-${Math.min(page * limit, totalUsers)} of ${totalUsers}`} + ? t('admin.users.pagination.no_users_display') + : t('admin.users.pagination.showing', { start: (page - 1) * limit + 1, end: Math.min(page * limit, totalUsers), total: totalUsers })}
- Page {page} of {totalPages} + {t('admin.users.pagination.page', { current: page, total: totalPages })}
diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index bf3659f..a540b72 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -660,5 +660,63 @@ "a": "Use the Contact page to reach our support team." } } + }, + "admin": { + "users": { + "title": "User management", + "subtitle": "Manage all platform users", + "total": "Total users", + "admins": "Admins", + "recruiters": "Recruiters", + "candidates": "Candidates", + "new_user": "New user", + "refresh": "Refresh", + "search_placeholder": "Search users by name or email...", + "table": { + "name": "Name", + "email": "Email", + "role": "Role", + "status": "Status", + "created": "Created", + "actions": "Actions", + "no_users": "No users found" + }, + "pagination": { + "showing": "Showing {start}-{end} of {total}", + "previous": "Previous", + "next": "Next", + "page": "Page {current} of {total}", + "no_users_display": "No users to display" + }, + "delete_confirm": { + "title": "Delete User", + "description": "Are you sure you want to delete this user? This action cannot be undone.", + "cancel": "Cancel", + "confirm": "Delete User" + }, + "create_dialog": { + "title": "Create new user", + "description": "Fill in the new user details", + "cancel": "Cancel", + "submit": "Create user" + }, + "edit_dialog": { + "title_edit": "Edit User", + "title_view": "User Details", + "description_edit": "Update user details", + "description_view": "View user information", + "close": "Close", + "save": "Save Changes" + }, + "messages": { + "create_success": "User created successfully!", + "create_error": "Failed to create user", + "update_success": "User updated successfully!", + "update_error": "Failed to update user", + "delete_success": "User deleted!", + "delete_error": "Failed to delete user", + "load_error": "Failed to load users" + } + } } } \ No newline at end of file diff --git a/frontend/src/i18n/es.json b/frontend/src/i18n/es.json index cf66ed9..f611357 100644 --- a/frontend/src/i18n/es.json +++ b/frontend/src/i18n/es.json @@ -660,5 +660,63 @@ "a": "Usa la página de contacto para hablar con nuestro equipo." } } + }, + "admin": { + "users": { + "title": "Gestión de Usuarios", + "subtitle": "Gestione todos los usuarios de la plataforma", + "total": "Total de usuarios", + "admins": "Admins", + "recruiters": "Reclutadores", + "candidates": "Candidatos", + "new_user": "Nuevo usuario", + "refresh": "Actualizar", + "search_placeholder": "Buscar usuarios por nombre o correo...", + "table": { + "name": "Nombre", + "email": "Correo", + "role": "Rol", + "status": "Estado", + "created": "Creado el", + "actions": "Acciones", + "no_users": "No se encontraron usuarios" + }, + "pagination": { + "showing": "Mostrando {start}-{end} de {total}", + "previous": "Anterior", + "next": "Siguiente", + "page": "Página {current} de {total}", + "no_users_display": "No hay usuarios para mostrar" + }, + "delete_confirm": { + "title": "Eliminar Usuario", + "description": "¿Está seguro de querer eliminar este usuario? Esta acción no se puede deshacer.", + "cancel": "Cancelar", + "confirm": "Eliminar Usuario" + }, + "create_dialog": { + "title": "Crear nuevo usuario", + "description": "Complete los detalles del nuevo usuario", + "cancel": "Cancelar", + "submit": "Crear usuario" + }, + "edit_dialog": { + "title_edit": "Editar Usuario", + "title_view": "Detalles del Usuario", + "description_edit": "Actualizar detalles del usuario", + "description_view": "Ver información del usuario", + "close": "Cerrar", + "save": "Guardar Cambios" + }, + "messages": { + "create_success": "¡Usuario creado con éxito!", + "create_error": "Error al crear usuario", + "update_success": "¡Usuario actualizado con éxito!", + "update_error": "Error al actualizar usuario", + "delete_success": "¡Usuario eliminado!", + "delete_error": "Error al eliminar usuario", + "load_error": "Error al cargar usuarios" + } + } } } \ No newline at end of file diff --git a/frontend/src/i18n/pt-BR.json b/frontend/src/i18n/pt-BR.json index cdd8c95..b1e0690 100644 --- a/frontend/src/i18n/pt-BR.json +++ b/frontend/src/i18n/pt-BR.json @@ -660,5 +660,63 @@ "a": "Use a página de contato para falar com nosso suporte." } } + }, + "admin": { + "users": { + "title": "Gestão de Usuários", + "subtitle": "Gerencie todos os usuários da plataforma", + "total": "Total de usuários", + "admins": "Admins", + "recruiters": "Recrutadores", + "candidates": "Candidatos", + "new_user": "Novo usuário", + "refresh": "Atualizar", + "search_placeholder": "Buscar usuários por nome ou e-mail...", + "table": { + "name": "Nome", + "email": "E-mail", + "role": "Função", + "status": "Status", + "created": "Criado em", + "actions": "Ações", + "no_users": "Nenhum usuário encontrado" + }, + "pagination": { + "showing": "Mostrando {start}-{end} de {total}", + "previous": "Anterior", + "next": "Próximo", + "page": "Página {current} de {total}", + "no_users_display": "Nenhum usuário para mostrar" + }, + "delete_confirm": { + "title": "Excluir Usuário", + "description": "Tem certeza que deseja excluir este usuário? Esta ação não pode ser desfeita.", + "cancel": "Cancelar", + "confirm": "Excluir Usuário" + }, + "create_dialog": { + "title": "Criar novo usuário", + "description": "Preencha os detalhes do novo usuário", + "cancel": "Cancelar", + "submit": "Criar usuário" + }, + "edit_dialog": { + "title_edit": "Editar Usuário", + "title_view": "Detalhes do Usuário", + "description_edit": "Atualizar detalhes do usuário", + "description_view": "Ver informações do usuário", + "close": "Fechar", + "save": "Salvar Alterações" + }, + "messages": { + "create_success": "Usuário criado com sucesso!", + "create_error": "Falha ao criar usuário", + "update_success": "Usuário atualizado com sucesso!", + "update_error": "Falha ao atualizar usuário", + "delete_success": "Usuário excluído!", + "delete_error": "Falha ao excluir usuário", + "load_error": "Falha ao carregar usuários" + } + } } } \ No newline at end of file