feat(admin): paginacao na interface, edicao de utilizadores e pagina de testes

- fila e utilizadores passam a pedir uma pagina de cada vez, com pesquisa e
  filtros; nada e cortado no browser, porque o que faltava nunca chegou a ser
  buscado. A pesquisa espera que se pare de escrever: cada tecla seria mais
  uma consulta, e as respostas podem chegar fora de ordem
- pageWindow e pageRange tem testes proprios: uma pagina fora do intervalo vem
  de um URL velho ou de uma lista que encolheu, e nao pode dar um paginador
  vazio ou negativo, nem dizer "76 a 100 de 82"
- editar utilizador: papel, quota, idioma, com os apelidos que entregam
  naquela caixa a mostra no mesmo painel
- "Caixas de e-mail" passa a chamar-se Utilizadores, que e o que sao

Pagina nova /admin/tests: verificacoes que o operador corre a mao, sobre o
servidor ou sobre um utilizador. Todas leem estado; nenhuma envia correio nem
altera definicoes -- uma pagina de diagnostico que mexe naquilo que
diagnostica e pior do que nao existir.

As regras de cada verificacao sao funcoes puras com testes, separadas da
recolha dos factos. Alguns casos que estes testes fixam: uma quota zero
significa sem limite, e um racio marcaria todas as caixas ilimitadas como
cheias; um bloqueio ja expirado nao bloqueia ninguem e nao deve mandar
ninguem investigar; e uma resposta de ausencia ligada com o periodo ja
passado esta ligada sem fazer nada, que e o que parece avariado a quem a pos.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lucas RayanandClaude Opus 5 committed 2026-08-24 09:36:35 -03:00
1 parent 52bf43b74f
commit 2b92abd185
16 files changed
+1431 -153

No files matched your search

+51 -3
View File
@@ -44,7 +44,7 @@
"mailHost": "Host de correo",
"mailboxCount": "{count} buzones",
"mailboxesSubtitle": "Cuentas, alias, importación CSV y la política de segundo factor.",
"mailboxesTitle": "Buzones",
"mailboxesTitle": "Usuarios",
"mfaAdmins": "Obligatorio para administradores",
"mfaEveryone": "Obligatorio para todos",
"mfaOptional": "Opcional",
@@ -96,7 +96,15 @@
"reconcileErrors": "El proveedor rechazó estos:",
"selectDomain": "Seleccionar",
"domainSelected": "Seleccionado",
"tlsSelfSigned": "Este certificado es autofirmado (emisor: {issuer}). Los clientes que verifican el certificado rechazaran la conexion en los puertos de correo. Defina TRAEFIK_ACME_DIR o STATIC_CERT_PATH para servir un certificado emitido."
"tlsSelfSigned": "Este certificado es autofirmado (emisor: {issuer}). Los clientes que verifican el certificado rechazaran la conexion en los puertos de correo. Defina TRAEFIK_ACME_DIR o STATIC_CERT_PATH para servir un certificado emitido.",
"aliasesForUser": "Alias que entregan en este buzon",
"noAliasesForUser": "Ningun alias entrega en este buzon.",
"testsTitle": "Pruebas",
"testsSubtitle": "Comprobaciones que puede ejecutar en cualquier momento. Todas leen el estado; ninguna envia correo ni cambia ajustes.",
"serverChecks": "Servidor",
"userChecks": "Usuario",
"runChecks": "Ejecutar",
"checksRun": "{count} comprobaciones"
},
"auth": {
"adminLoginTitle": "Consola de administración",
@@ -358,12 +366,52 @@
"italic": "Cursiva",
"underline": "Subrayado",
"insertLink": "Enlace",
"insertImage": "Imagen"
"insertImage": "Imagen",
"showingRange": "Mostrando {from} a {to} de {total}",
"noResults": "Sin resultados",
"previousPage": "Pagina anterior",
"nextPage": "Pagina siguiente",
"searchPlaceholder": "Buscar...",
"all": "Todos",
"filters": "Filtros",
"editUser": "Editar usuario",
"quotaMb": "Cuota (MB)",
"selectUser": "Elegir usuario"
},
"folders": {
"new": "Nueva carpeta",
"newPlaceholder": "Nueva carpeta…",
"delete": "Eliminar {name}",
"deleteConfirm": "¿Eliminar la carpeta \"{name}\" y todos sus mensajes? Esto no se puede deshacer desde la interfaz."
},
"checks": {
"userActive": "La cuenta esta activa",
"userDisabled": "La cuenta esta desactivada",
"userLockedOut": "Bloqueada por intentos fallidos",
"userNotLockedOut": "Sin bloqueo activo",
"userHasPassword": "Tiene contrasena definida",
"userHasNoPassword": "No tiene contrasena definida",
"quotaFull": "La cuota esta llena",
"quotaNearlyFull": "La cuota esta casi llena",
"quotaHealthy": "La cuota tiene margen",
"quotaUnlimited": "Sin limite de cuota",
"mfaEnrolled": "Segundo factor activo",
"mfaNotEnrolled": "Sin segundo factor",
"aliasesDelivering": "Alias que entregan en este buzon",
"sieveScriptPresent": "Tiene reglas de filtrado",
"vacationActive": "Respuesta de ausencia activada",
"vacationWindowPast": "Respuesta de ausencia activada, pero el periodo ya paso",
"vacationWindowFuture": "Respuesta de ausencia activada, el periodo aun no empezo",
"dnsVerified": "Registros DNS verificados",
"dnsNotVerified": "Registros DNS sin verificar",
"noDomains": "Ningun dominio configurado",
"dkimMissing": "Sin clave DKIM: el dominio no firma nada",
"queueHasBounces": "Hay mensajes devueltos en la cola",
"queueNoBounces": "Sin devoluciones en la cola",
"queueHasDeferred": "Hay mensajes aplazados en la cola",
"queueNoDeferred": "Sin mensajes aplazados",
"queueHasFrozen": "Hay mensajes congelados en la cola",
"usersOverQuota": "Usuarios con la cuota excedida",
"noUsersOverQuota": "Ningun usuario con la cuota excedida"
}
}