feat: onglets Réglages & Aide + icône Gitea

Réglages : préférences (langue, notifications push + test), gestion complète des tokens d'accès (liste/création/révocation, garde anti lock-out sur le dernier token), URL Gitea configurable, infos serveur en lecture seule (port/bind/origines/VAPID + flags CLI). Aide : documentation bilingue EN/FR de toutes les fonctionnalités, avec recherche. Icône Gitea (lien externe) dans la nav (sidebar + MoreSheet mobile).

Backend : routes /api/v1/auth/tokens (GET/POST/DELETE) + tokenId dans /me ; routes/settings.ts (GET/PATCH, allow-list stricte gitea_url, aucun secret exposé, URL validée http/https anti-XSS) ; AuthService.listTokens/revokeToken (transaction). Front : NavItem gère les liens externes, nav primaire/secondaire, store settings, vues SettingsView/HelpView.

236 tests verts (+15 nouveaux : auth-tokens, settings-routes).
This commit is contained in:
2026-06-18 14:16:53 +02:00
parent 5c1c2a8591
commit c9670ca309
23 changed files with 1469 additions and 24 deletions

View File

@@ -177,6 +177,9 @@ const fr: typeof en = {
sessions: 'Sessions',
groups: 'Groupes',
settings: 'Réglages',
help: 'Aide',
more: 'Plus',
gitea: 'Ouvrir Gitea',
waiting: 'en attente',
},
controls: {
@@ -295,6 +298,66 @@ const fr: typeof en = {
count: 'aucune session en attente | 1 session en attente | {n} sessions en attente',
empty: 'Rien à traiter',
},
settings: {
title: 'Réglages',
// Préférences
preferences: 'Préférences',
preferencesHint: 'Ces réglages ne sappliquent quà ce navigateur.',
language: 'Langue',
notifications: 'Notifications',
notificationsEnabled: 'Activées — vous serez notifié lorsquune session attend une réponse.',
notificationsDisabled: 'Désactivées.',
enableNotifications: 'Activer les notifications',
disableNotifications: 'Désactiver les notifications',
testNotification: 'Envoyer un test',
testSent: 'Notification de test envoyée',
pushUnsupported: 'Le push exige HTTPS (ex. Tailscale Serve) ; sur iOS, installez dabord lapp sur lécran daccueil.',
// Accès & sécurité
security: 'Accès & sécurité',
securityHint: 'Les jetons donnent un accès complet à ce serveur. Créez-en un par appareil et révoquez ceux que vous nutilisez plus.',
tokens: 'Jetons daccès',
newTokenLabel: 'Libellé',
newTokenPlaceholder: 'ex. téléphone, portable',
createToken: 'Créer un jeton',
tokenCreated: 'Jeton créé',
copyTokenHint: 'Copiez ce jeton maintenant — par sécurité il ne sera plus jamais affiché.',
copy: 'Copier',
copied: 'Copié',
current: 'courant',
created: 'Créé le {date}',
lastUsed: 'utilisé le {date}',
neverUsed: 'jamais utilisé',
revoke: 'Révoquer',
confirmRevoke: 'Confirmer la révocation',
tokenRevoked: 'Jeton révoqué',
lastTokenError: 'Impossible de révoquer le dernier jeton actif — créez-en un autre dabord.',
// Intégrations
integrations: 'Intégrations',
gitea: 'Gitea',
giteaUrlLabel: 'URL de linstance Gitea',
giteaUrlPlaceholder: 'https://git.exemple.com',
giteaUrlHint: 'Ajoute une icône de raccourci dans la navigation. Laissez vide pour la masquer.',
save: 'Enregistrer',
saved: 'Enregistré',
// Serveur (lecture seule)
server: 'Serveur',
serverHint: 'Définis au démarrage via des flags CLI — les modifier nécessite de redémarrer le daemon.',
version: 'Version',
port: 'Port',
bind: 'Adresse de liaison',
allowedOrigins: 'Origines autorisées',
dataDir: 'Répertoire de données',
vapidPublicKey: 'Clé publique VAPID',
vapidContact: 'Contact VAPID',
none: 'aucune',
flagHint: 'Flag CLI : {flag}',
},
help: {
title: 'Aide',
intro: 'Tout ce quArboretum sait faire, et comment lutiliser.',
searchPlaceholder: 'Rechercher dans laide…',
noMatch: 'Aucun sujet correspondant',
},
};
export default fr;