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": "Mail host",
"mailboxCount": "{count} mailboxes",
"mailboxesSubtitle": "Accounts, aliases, CSV import and the second-factor policy.",
"mailboxesTitle": "Mailboxes",
"mailboxesTitle": "Users",
"mfaAdmins": "Required for admins",
"mfaEveryone": "Required for everyone",
"mfaOptional": "Optional",
@@ -96,7 +96,15 @@
"reconcileErrors": "The provider refused these:",
"selectDomain": "Select",
"domainSelected": "Selected",
"tlsSelfSigned": "This certificate is self-signed (issuer: {issuer}). Clients that verify certificates will refuse the connection on the mail ports. Set TRAEFIK_ACME_DIR or STATIC_CERT_PATH to serve an issued certificate."
"tlsSelfSigned": "This certificate is self-signed (issuer: {issuer}). Clients that verify certificates will refuse the connection on the mail ports. Set TRAEFIK_ACME_DIR or STATIC_CERT_PATH to serve an issued certificate.",
"aliasesForUser": "Aliases delivering to this mailbox",
"noAliasesForUser": "No alias delivers to this mailbox.",
"testsTitle": "Tests",
"testsSubtitle": "Checks you can run at any time. They all read state; none sends mail or changes a setting.",
"serverChecks": "Server",
"userChecks": "User",
"runChecks": "Run",
"checksRun": "{count} checks"
},
"auth": {
"adminLoginTitle": "Admin console",
@@ -358,12 +366,52 @@
"italic": "Italic",
"underline": "Underline",
"insertLink": "Link",
"insertImage": "Image"
"insertImage": "Image",
"showingRange": "Showing {from} to {to} of {total}",
"noResults": "No results",
"previousPage": "Previous page",
"nextPage": "Next page",
"searchPlaceholder": "Search...",
"all": "All",
"filters": "Filters",
"editUser": "Edit user",
"quotaMb": "Quota (MB)",
"selectUser": "Select a user"
},
"folders": {
"new": "New folder",
"newPlaceholder": "New folder…",
"delete": "Delete {name}",
"deleteConfirm": "Delete the folder \"{name}\" and every message in it? This cannot be undone from the interface."
},
"checks": {
"userActive": "The account is enabled",
"userDisabled": "The account is disabled",
"userLockedOut": "Locked out after failed sign-ins",
"userNotLockedOut": "No active lockout",
"userHasPassword": "Has a password set",
"userHasNoPassword": "Has no password set",
"quotaFull": "The quota is full",
"quotaNearlyFull": "The quota is nearly full",
"quotaHealthy": "The quota has headroom",
"quotaUnlimited": "No quota limit",
"mfaEnrolled": "Second factor enrolled",
"mfaNotEnrolled": "No second factor",
"aliasesDelivering": "Aliases delivering to this mailbox",
"sieveScriptPresent": "Has filing rules",
"vacationActive": "Autoresponder is on",
"vacationWindowPast": "Autoresponder is on, but its window has passed",
"vacationWindowFuture": "Autoresponder is on, its window has not started",
"dnsVerified": "DNS records verified",
"dnsNotVerified": "DNS records not verified",
"noDomains": "No domains configured",
"dkimMissing": "No DKIM key: the domain signs nothing",
"queueHasBounces": "Bounced messages in the queue",
"queueNoBounces": "No bounces in the queue",
"queueHasDeferred": "Deferred messages in the queue",
"queueNoDeferred": "No deferred messages",
"queueHasFrozen": "Frozen messages in the queue",
"usersOverQuota": "Users over their quota",
"noUsersOverQuota": "No user is over quota"
}
}