From 80ede8b19bc74feef5f7a6912cd0df56dd460172 Mon Sep 17 00:00:00 2001 From: Norman Niati Date: Thu, 4 Jun 2026 15:47:37 +0200 Subject: [PATCH] feat(ui-2026): redistribute the 2026 System/Project/API views into plugin-ui The 2026 redesign of the System (Bench, Cache, Configuration, Information, Node, Plugin, Role, User), Project (List, Detail, Edit), API (Home, Token), Home (Dashboard) and Subscribe Wizard surfaces was first integrated as part of the host app-ui in ligoj#106. Following review feedback, the views are now moved to plugin-ui under the existing file names (singular form for System*View, ProjectListView, HomeView, SubscribeWizardView), with the 2026 i18n keys merged into plugin-ui's own bundle. Generic 2026 building blocks (VibrantDataTable, VibrantConfirmDialog, AuditDialog, LigojIcon) stay in the host and are imported via @/... Companion to ligoj#106 and plugin-id#53. --- ui/src/i18n/en.js | 168 +++- ui/src/i18n/fr.js | 174 +++- ui/src/views/ApiHomeView.vue | 445 ++++++--- ui/src/views/ApiTokenView.vue | 403 +++++--- ui/src/views/HomeView.vue | 471 +++++---- ui/src/views/NodeEditDialog.vue | 311 ++++++ ui/src/views/ProjectDetailView.vue | 683 +++++++------ ui/src/views/ProjectEditDialog.vue | 199 ++++ ui/src/views/ProjectListView.vue | 422 ++++---- ui/src/views/SubscribeWizardView.vue | 1135 ++++++---------------- ui/src/views/SystemBenchView.vue | 205 ++-- ui/src/views/SystemCacheView.vue | 275 ++++-- ui/src/views/SystemConfigurationView.vue | 569 ++++++----- ui/src/views/SystemInfoView.vue | 354 ++++--- ui/src/views/SystemNodeView.vue | 352 ++++--- ui/src/views/SystemPluginView.vue | 591 ++++++----- ui/src/views/SystemRoleView.vue | 405 +++++--- ui/src/views/SystemUserView.vue | 328 ++++--- 18 files changed, 4483 insertions(+), 3007 deletions(-) create mode 100644 ui/src/views/NodeEditDialog.vue create mode 100644 ui/src/views/ProjectEditDialog.vue diff --git a/ui/src/i18n/en.js b/ui/src/i18n/en.js index 3271723..6fdf49d 100644 --- a/ui/src/i18n/en.js +++ b/ui/src/i18n/en.js @@ -188,15 +188,15 @@ export default { // Projects 'project.title': 'Projects', - 'project.new': 'New Project', - 'project.edit': 'Edit Project', + 'project.new': 'New project', + 'project.edit': 'Edit project', 'project.detail': 'Project', 'project.name': 'Name', - 'project.pkey': 'Project Key', - 'project.pkeyHint': 'Unique identifier, cannot be changed after creation', + 'project.pkey': 'Project key', + 'project.pkeyHint': 'Lowercase letters, digits and dashes', 'project.description': 'Description', - 'project.teamLeader': 'Team Leader', - 'project.teamLeaderHint': 'User login ID (e.g. admin)', + 'project.teamLeader': 'Team leader', + 'project.teamLeaderHint': 'User managing this project', 'project.created': 'Created', 'project.subscriptions': 'Subs', 'project.subscriptionsTooltip': 'Number of subscriptions attached to this project', @@ -206,13 +206,13 @@ export default { 'project.empty': 'No projects yet. Create a project to start managing subscriptions.', // Project → detail view - 'project.detail.addSubscription': 'Add subscription', + 'project.detail.addSubscription': 'Subscribe to a tool', 'project.detail.edit': 'Edit', 'project.detail.manager': 'Manager:', 'project.detail.created': 'Created:', 'project.detail.updated': 'Updated:', 'project.detail.subscriptions': 'Subscriptions', - 'project.detail.noSubscriptions': 'No subscriptions attached to this project.', + 'project.detail.noSubscriptions': 'No subscription on this project yet.', 'project.detail.editTitle': 'Edit project', 'project.detail.fieldName': 'Name', 'project.detail.fieldPkey': 'Project key (pkey)', @@ -224,21 +224,21 @@ export default { 'project.detail.remove': 'Remove', // Subscribe / node wizard - 'wizard.title': 'Add subscription', + 'wizard.title': 'Subscribe to a tool', 'wizard.contextBefore': 'Adding a subscription to', 'wizard.contextAfter': 'Subscribing is not an idempotent operation — removing a subscription later may not clean up remote data automatically.', 'wizard.loadingProject': 'Loading project…', - 'wizard.step.service': '1. Service', - 'wizard.step.tool': '2. Tool', - 'wizard.step.instance': '3. Instance', - 'wizard.step.mode': '4. Mode', - 'wizard.step.parameters': '5. Parameters', + 'wizard.step.service': 'Service', + 'wizard.step.tool': 'Tool', + 'wizard.step.instance': 'Instance', + 'wizard.step.mode': 'Mode', + 'wizard.step.parameters': 'Parameters', 'wizard.hint.service': 'A service groups features implemented by one or more tools.', 'wizard.hint.tool': 'A tool is one implementation of the service; several instances may be deployed.', 'wizard.hint.instance': 'An instance is a running node of the tool. Pick an existing one or declare a new one.', - 'wizard.label.service': 'Service', - 'wizard.label.tool': 'Tool', - 'wizard.label.instance': 'Instance', + 'wizard.label.service': 'Pick a service', + 'wizard.label.tool': 'Pick a tool', + 'wizard.label.instance': 'Pick an instance', 'wizard.label.name': 'Name', 'wizard.label.id': 'ID', 'wizard.newInstance': 'New instance', @@ -249,8 +249,8 @@ export default { 'wizard.createInstance': 'Create instance', 'wizard.modeLink': 'Link', 'wizard.modeCreate': 'Create', - 'wizard.modeHintLink': 'attaches this project to an existing instance.', - 'wizard.modeHintCreate': 'additionally provisions a new instance inside the tool.', + 'wizard.modeHintLink': 'Attaches this project to an existing instance.', + 'wizard.modeHintCreate': 'Additionally provisions a new instance inside the tool.', 'wizard.modeDescLink': 'attach this project to an existing object', 'wizard.modeDescCreate': 'provision a new object inside the instance', 'wizard.params.createNode': 'Initial values for {id}. You can edit them later from System → Nodes.', @@ -268,10 +268,138 @@ export default { 'wizard.error.subscriptionFailed': 'Subscription creation failed — please review the highlighted parameters.', 'wizard.error.nodeCreationFailed': 'Node creation failed — please review the highlighted fields.', 'wizard.error.saveFailed': 'Save failed — please review the highlighted parameters.', - 'wizard.error.newNodeRejected': 'Backend rejected the new node — see the notification for details.', + 'wizard.error.newNodeRejected': 'Backend rejected the new instance — see the notification for details.', 'wizard.success.nodeCreated': 'Node "{name}" created', 'wizard.success.nodeUpdated': 'Node "{name}" updated', 'wizard.success.subscriptionCreated': 'Subscription created', 'wizard.rule.required': 'Required', 'wizard.rule.nodeId': 'Use the colon-separated form, e.g. service:scm:git:internal', + + // --- 2026 redesign additions (chantier ui-2026) --- + 'project.pkeyRule': 'Use lowercase letters, digits and dashes', + 'project.pkeyLocked': 'Locked — the project already has subscriptions', + 'project.countLabel': 'projects', + 'project.searchPlaceholder': 'Search a project…', + 'project.subsShort': 'subs.', + 'project.open': 'Open project', + 'project.noTool': 'No tool', + 'project.createSoon': 'Project creation — coming soon', + 'project.detailSoon': '“{name}” details — coming soon', + 'project.detail.activeShort': 'active', + 'project.detail.configure': 'Configure', + 'project.detail.more': 'more', + 'project.detail.demoSubscribe': 'Subscriptions need a real project (this is a preview).', + 'subscription.deleteConfirm': 'Delete this subscription?', + 'subscription.status.ok': 'up', + 'subscription.status.warn': 'unstable', + 'subscription.status.err': 'down', + 'subscription.status.idle': 'idle', + 'system.plugin.countLabel': 'installed plug-ins', + 'system.plugin.headerType': 'Type', + 'system.plugin.active': 'Active', + 'system.plugin.type.service': 'Service', + 'system.plugin.type.tool': 'Tool', + 'system.plugin.type.feature': 'Feature', + 'system.plugin.statTotal': 'Plug-ins', + 'system.plugin.statServices': 'Services', + 'system.plugin.statTools': 'Tools', + 'system.plugin.statFeatures': 'Features', + 'system.plugin.headerKey': 'Key', + 'system.plugin.headerStatus': 'Status', + 'system.plugin.headerEnabled': 'Enabled', + 'system.plugin.status.ok': 'Active', + 'system.plugin.status.idle': 'Inactive', + 'system.plugin.status.warn': 'Removal scheduled', + 'system.plugin.toggleHint': 'Enable / disable this tool', + 'system.plugin.disable': 'Disable', + 'system.plugin.confirmDisableTitle': 'Disable the tool', + 'system.plugin.confirmDisableText': 'Disable {name}? Its nodes and subscriptions stay configured but become unavailable until re-enabled.', + 'system.node.countLabel': 'declared nodes', + 'system.node.filtered': 'shown', + 'system.node.filterAll': 'All types', + 'system.node.instanceStep': 'Identity', + 'system.node.statTotal': 'Nodes', + 'system.node.deleteConfirmBefore': 'Delete the node ', + 'system.node.deleteConfirmAfter': ' and its parameters?', + 'system.config.countLabel': 'configuration keys', + 'system.config.filtered': 'shown', + 'system.config.searchPlaceholder': 'Search a key, value or source…', + 'system.config.filterAll': 'All keys', + 'system.config.statTotal': 'Keys', + 'system.config.statSecured': 'Secured', + 'system.config.statOverridden': 'Overridden', + 'system.config.statDatabase': 'Database', + 'system.config.encryptToggle': 'Encryption tool', + 'system.config.encryptHint': 'Encrypt a value to store it secured at rest.', + 'system.config.copied': 'Copied to clipboard', + 'system.config.deleteConfirmBefore': 'Remove the key ', + 'system.config.deleteConfirmAfter': '?', + 'system.role.new': 'New role', + 'system.role.countLabel': 'roles defined', + 'system.role.filtered': 'shown', + 'system.role.searchPlaceholder': 'Search a role or pattern…', + 'system.role.filterAll': 'All roles', + 'system.role.statTotal': 'Roles', + 'system.role.statApi': 'With API', + 'system.role.statUi': 'With UI', + 'system.role.statAdmin': 'Unrestricted', + 'system.role.noAuth': 'No restriction', + 'system.role.deleteConfirmBefore': 'Delete the role ', + 'system.role.deleteConfirmAfter': '?', + 'system.user.countLabel': 'system accounts', + 'system.user.filtered': 'shown', + 'system.user.searchPlaceholder': 'Search a login…', + 'system.user.new': 'New account', + 'system.user.newTitle': 'New system user', + 'system.user.editTitle': 'Edit system user', + 'system.user.fieldLogin': 'Login', + 'system.user.fieldRoles': 'Roles', + 'system.user.rolesHint': 'Pick at least one role', + 'system.user.statTotal': 'Accounts', + 'system.user.statRoles': 'Defined roles', + 'system.user.noRoles': 'No role', + 'system.user.headerLogin': 'Login', + 'system.user.headerRoles': 'Roles', + 'system.user.deleteTitle': 'Delete system user', + 'system.user.deleteConfirmBefore': 'Remove ', + 'system.user.deleteConfirmAfter': ' from system accounts?', + 'system.cache.countLabel': 'active caches', + 'system.cache.statCaches': 'Caches', + 'system.cache.statEntries': 'Entries', + 'system.cache.statHitRate': 'Hit rate', + 'system.cache.statAvgGet': 'Avg get', + 'system.cache.invalidateAll': 'Flush all', + 'system.cache.searchPlaceholder': 'Search a cache…', + 'system.cache.subActive': 'active', + 'system.cache.subInCaches': 'in {n} caches', + 'system.cache.subRequests': 'requests', + 'system.cache.subAcrossActive': 'across active caches', + 'api.subtitle': 'Interactive REST API explorer', + 'api.downloadOpenapi': 'Download OpenAPI', + 'api.endpoints': 'Endpoints', + 'api.groups': 'Groups', + 'api.searchPlaceholder': 'Search an endpoint, path or summary…', + 'api.noResults': 'No endpoint matches your search.', + 'api.allMethods': 'All', + 'api.params': 'Parameters', + 'api.noParams': 'No parameter', + 'api.requestBody': 'Request body', + 'api.responses': 'Responses', + 'api.required': 'required', + 'api.deprecated': 'deprecated', + 'api.expandAll': 'Expand all', + 'api.collapseAll': 'Collapse all', + 'system.apiToken.subtitle': 'Password-less access keys for the REST API', + 'system.apiToken.countLabel': 'API tokens', + 'system.apiToken.statTokens': 'Tokens', + 'system.apiToken.searchPlaceholder': 'Search a token…', + 'system.apiToken.deleteConfirmBefore': 'Revoke the token ', + 'system.apiToken.deleteConfirmAfter': '?', + 'system.apiToken.empty': 'No API token yet', + 'system.bench.subtitle': 'Database persistence benchmark', + 'system.bench.total': 'Total', + 'system.bench.idle': 'Run the bench to measure each step.', + 'system.bench.ms': 'ms', + 'system.info.subtitle': 'Runtime, memory, time zone, session and build', + 'system.info.copy': 'Copy', } diff --git a/ui/src/i18n/fr.js b/ui/src/i18n/fr.js index b434194..96af54f 100644 --- a/ui/src/i18n/fr.js +++ b/ui/src/i18n/fr.js @@ -192,10 +192,10 @@ export default { 'project.detail': 'Projet', 'project.name': 'Nom', 'project.pkey': 'Clé du projet', - 'project.pkeyHint': 'Identifiant unique, non modifiable après la création', + 'project.pkeyHint': 'Minuscules, chiffres et tirets', 'project.description': 'Description', - 'project.teamLeader': 'Chef d\'équipe', - 'project.teamLeaderHint': 'Identifiant utilisateur (ex: admin)', + 'project.teamLeader': 'Responsable', + 'project.teamLeaderHint': 'Utilisateur gérant ce projet', 'project.created': 'Créé le', 'project.subscriptions': 'Sub.', 'project.subscriptionsTooltip': 'Nombre de souscriptions rattachées à ce projet', @@ -205,13 +205,13 @@ export default { 'project.empty': 'Aucun projet. Créez un projet pour commencer à gérer les souscriptions.', // Projet → vue détail - 'project.detail.addSubscription': 'Ajouter une souscription', + 'project.detail.addSubscription': 'Souscrire à un outil', 'project.detail.edit': 'Modifier', 'project.detail.manager': 'Chef d\'équipe :', 'project.detail.created': 'Créé le :', 'project.detail.updated': 'Mis à jour le :', 'project.detail.subscriptions': 'Souscriptions', - 'project.detail.noSubscriptions': 'Aucune souscription rattachée à ce projet.', + 'project.detail.noSubscriptions': 'Aucune souscription sur ce projet.', 'project.detail.editTitle': 'Modifier le projet', 'project.detail.fieldName': 'Nom', 'project.detail.fieldPkey': 'Clé du projet (pkey)', @@ -223,21 +223,21 @@ export default { 'project.detail.remove': 'Supprimer', // Assistant de souscription / nœud - 'wizard.title': 'Ajouter une souscription', - 'wizard.contextBefore': 'Ajout d\'une souscription au projet', + 'wizard.title': 'Souscrire à un outil', + 'wizard.contextBefore': 'Ajout d’une souscription à', 'wizard.contextAfter': 'La souscription n\'est pas une opération idempotente — la suppression ultérieure d\'une souscription peut ne pas nettoyer automatiquement les données distantes.', 'wizard.loadingProject': 'Chargement du projet…', - 'wizard.step.service': '1. Service', - 'wizard.step.tool': '2. Outil', - 'wizard.step.instance': '3. Instance', - 'wizard.step.mode': '4. Mode', - 'wizard.step.parameters': '5. Paramètres', + 'wizard.step.service': 'Service', + 'wizard.step.tool': 'Outil', + 'wizard.step.instance': 'Instance', + 'wizard.step.mode': 'Mode', + 'wizard.step.parameters': 'Paramètres', 'wizard.hint.service': 'Un service regroupe des fonctionnalités mises en œuvre par un ou plusieurs outils.', 'wizard.hint.tool': 'Un outil est une implémentation du service ; plusieurs instances peuvent être déployées.', 'wizard.hint.instance': 'Une instance est un nœud actif de l\'outil. Choisissez-en une existante ou déclarez-en une nouvelle.', - 'wizard.label.service': 'Service', - 'wizard.label.tool': 'Outil', - 'wizard.label.instance': 'Instance', + 'wizard.label.service': 'Choisir un service', + 'wizard.label.tool': 'Choisir un outil', + 'wizard.label.instance': 'Choisir une instance', 'wizard.label.name': 'Nom', 'wizard.label.id': 'Identifiant', 'wizard.newInstance': 'Nouvelle instance', @@ -245,11 +245,11 @@ export default { 'wizard.newNodeHint': 'Suggéré : {prefix}', 'wizard.newNodeBlurb': 'Déclare un nœud sous {parent}. Les paramètres propres à l\'outil pourront être ajoutés ultérieurement en éditant la nouvelle instance.', 'wizard.newNodeBlurbNoParent': 'Déclare un nœud sous l\'outil sélectionné. Les paramètres propres à l\'outil pourront être ajoutés ultérieurement en éditant la nouvelle instance.', - 'wizard.createInstance': 'Créer l\'instance', - 'wizard.modeLink': 'Lier', - 'wizard.modeCreate': 'Créer', - 'wizard.modeHintLink': 'rattache ce projet à une instance existante.', - 'wizard.modeHintCreate': 'provisionne en plus un nouvel objet dans l\'outil.', + 'wizard.createInstance': 'Créer l’instance', + 'wizard.modeLink': 'Lien', + 'wizard.modeCreate': 'Création', + 'wizard.modeHintLink': 'Rattache ce projet à une instance existante.', + 'wizard.modeHintCreate': 'Provisionne en plus une nouvelle instance dans l’outil.', 'wizard.modeDescLink': 'rattacher ce projet à un objet existant', 'wizard.modeDescCreate': 'provisionner un nouvel objet dans l\'instance', 'wizard.params.createNode': 'Valeurs initiales pour {id}. Vous pourrez les modifier plus tard depuis Système → Nœuds.', @@ -259,18 +259,146 @@ export default { 'wizard.params.edit': 'Valeurs de configuration liées à {id}.', 'wizard.params.emptyEdit': 'Aucun paramètre configuré pour ce nœud.', 'wizard.params.emptyCreateNode': 'Ce nœud n\'a pas de paramètre additionnel.', - 'wizard.params.emptySubscribe': 'Cette souscription ne nécessite aucun paramètre additionnel.', + 'wizard.params.emptySubscribe': 'Cette souscription ne requiert aucun paramètre supplémentaire.', 'wizard.action.cancel': 'Annuler', 'wizard.action.save': 'Enregistrer', 'wizard.action.createNode': 'Créer le nœud', 'wizard.action.createSubscription': 'Créer la souscription', - 'wizard.error.subscriptionFailed': 'Échec de la création de la souscription — veuillez vérifier les paramètres mis en évidence.', + 'wizard.error.subscriptionFailed': 'Échec de la création — vérifiez les paramètres en surbrillance.', 'wizard.error.nodeCreationFailed': 'Échec de la création du nœud — veuillez vérifier les champs mis en évidence.', 'wizard.error.saveFailed': 'Échec de l\'enregistrement — veuillez vérifier les paramètres mis en évidence.', - 'wizard.error.newNodeRejected': 'Le serveur a rejeté le nouveau nœud — voir la notification pour plus de détails.', + 'wizard.error.newNodeRejected': 'Instance refusée par le backend — voir la notification.', 'wizard.success.nodeCreated': 'Nœud « {name} » créé', 'wizard.success.nodeUpdated': 'Nœud « {name} » mis à jour', 'wizard.success.subscriptionCreated': 'Souscription créée', 'wizard.rule.required': 'Requis', 'wizard.rule.nodeId': 'Utilisez la forme séparée par des deux-points, ex. service:scm:git:internal', + + // --- 2026 redesign additions (chantier ui-2026) --- + 'project.pkeyRule': 'Utilisez minuscules, chiffres et tirets', + 'project.pkeyLocked': 'Verrouillée — le projet a déjà des souscriptions', + 'project.countLabel': 'projets', + 'project.searchPlaceholder': 'Rechercher un projet…', + 'project.subsShort': 'souscr.', + 'project.open': 'Ouvrir le projet', + 'project.noTool': 'Aucun outil', + 'project.createSoon': 'Création de projet — bientôt', + 'project.detailSoon': 'Détail de « {name} » — bientôt', + 'project.detail.activeShort': 'actifs', + 'project.detail.configure': 'Configurer', + 'project.detail.more': 'de plus', + 'project.detail.demoSubscribe': 'La souscription nécessite un vrai projet (ceci est un aperçu).', + 'subscription.deleteConfirm': 'Supprimer cette souscription ?', + 'subscription.status.ok': 'actif', + 'subscription.status.warn': 'instable', + 'subscription.status.err': 'hors-ligne', + 'subscription.status.idle': 'inactif', + 'system.plugin.countLabel': 'plugins installés', + 'system.plugin.headerType': 'Type', + 'system.plugin.active': 'Actif', + 'system.plugin.type.service': 'Service', + 'system.plugin.type.tool': 'Outil', + 'system.plugin.type.feature': 'Fonction', + 'system.plugin.statTotal': 'Plugins', + 'system.plugin.statServices': 'Services', + 'system.plugin.statTools': 'Outils', + 'system.plugin.statFeatures': 'Fonctions', + 'system.plugin.headerKey': 'Clé', + 'system.plugin.headerStatus': 'Statut', + 'system.plugin.headerEnabled': 'Activé', + 'system.plugin.status.ok': 'Actif', + 'system.plugin.status.idle': 'Inactif', + 'system.plugin.status.warn': 'Suppression planifiée', + 'system.plugin.toggleHint': 'Activer / désactiver cet outil', + 'system.plugin.disable': 'Désactiver', + 'system.plugin.confirmDisableTitle': 'Désactiver l’outil', + 'system.plugin.confirmDisableText': 'Désactiver {name} ? Ses nœuds et souscriptions restent configurés mais deviennent indisponibles jusqu’à réactivation.', + 'system.node.countLabel': 'nœuds déclarés', + 'system.node.filtered': 'affichés', + 'system.node.filterAll': 'Tous les types', + 'system.node.instanceStep': 'Identité', + 'system.node.statTotal': 'Nœuds', + 'system.node.deleteConfirmBefore': 'Supprimer le nœud ', + 'system.node.deleteConfirmAfter': ' et ses paramètres ?', + 'system.config.countLabel': 'clés de configuration', + 'system.config.filtered': 'affichées', + 'system.config.searchPlaceholder': 'Rechercher une clé, valeur ou source…', + 'system.config.filterAll': 'Toutes les clés', + 'system.config.statTotal': 'Clés', + 'system.config.statSecured': 'Sécurisées', + 'system.config.statOverridden': 'Surchargées', + 'system.config.statDatabase': 'En base', + 'system.config.encryptToggle': 'Outil de chiffrement', + 'system.config.encryptHint': 'Chiffrez une valeur pour la stocker sécurisée au repos.', + 'system.config.copied': 'Copié dans le presse-papiers', + 'system.config.deleteConfirmBefore': 'Supprimer la clé ', + 'system.config.deleteConfirmAfter': ' ?', + 'system.role.new': 'Nouveau rôle', + 'system.role.countLabel': 'rôles définis', + 'system.role.filtered': 'affichés', + 'system.role.searchPlaceholder': 'Rechercher un rôle ou un pattern…', + 'system.role.filterAll': 'Tous les rôles', + 'system.role.statTotal': 'Rôles', + 'system.role.statApi': 'Avec API', + 'system.role.statUi': 'Avec UI', + 'system.role.statAdmin': 'Sans restriction', + 'system.role.noAuth': 'Aucune restriction', + 'system.role.deleteConfirmBefore': 'Supprimer le rôle ', + 'system.role.deleteConfirmAfter': ' ?', + 'system.user.countLabel': 'comptes système', + 'system.user.filtered': 'affichés', + 'system.user.searchPlaceholder': 'Rechercher un identifiant…', + 'system.user.new': 'Nouveau compte', + 'system.user.newTitle': 'Nouvel utilisateur système', + 'system.user.editTitle': 'Modifier l\'utilisateur système', + 'system.user.fieldLogin': 'Identifiant', + 'system.user.fieldRoles': 'Rôles', + 'system.user.rolesHint': 'Choisir au moins un rôle', + 'system.user.statTotal': 'Comptes', + 'system.user.statRoles': 'Rôles définis', + 'system.user.noRoles': 'Aucun rôle', + 'system.user.headerLogin': 'Identifiant', + 'system.user.headerRoles': 'Rôles', + 'system.user.deleteTitle': 'Supprimer l\'utilisateur système', + 'system.user.deleteConfirmBefore': 'Retirer ', + 'system.user.deleteConfirmAfter': ' des comptes système ?', + 'system.cache.countLabel': 'caches actifs', + 'system.cache.statCaches': 'Caches', + 'system.cache.statEntries': 'Entrées', + 'system.cache.statHitRate': 'Taux de hits', + 'system.cache.statAvgGet': 'Get moyen', + 'system.cache.invalidateAll': 'Tout vider', + 'system.cache.searchPlaceholder': 'Rechercher un cache…', + 'system.cache.subActive': 'actifs', + 'system.cache.subInCaches': 'dans {n} caches', + 'system.cache.subRequests': 'requêtes', + 'system.cache.subAcrossActive': 'sur les caches actifs', + 'api.subtitle': 'Explorateur interactif de l\'API REST', + 'api.downloadOpenapi': 'Télécharger OpenAPI', + 'api.endpoints': 'Points de terminaison', + 'api.groups': 'Groupes', + 'api.searchPlaceholder': 'Rechercher un endpoint, chemin ou résumé…', + 'api.noResults': 'Aucun endpoint ne correspond à votre recherche.', + 'api.allMethods': 'Toutes', + 'api.params': 'Paramètres', + 'api.noParams': 'Aucun paramètre', + 'api.requestBody': 'Corps de requête', + 'api.responses': 'Réponses', + 'api.required': 'requis', + 'api.deprecated': 'déprécié', + 'api.expandAll': 'Tout déplier', + 'api.collapseAll': 'Tout replier', + 'system.apiToken.subtitle': 'Clés d\'accès sans mot de passe pour l\'API REST', + 'system.apiToken.countLabel': 'jetons d\'API', + 'system.apiToken.statTokens': 'Jetons', + 'system.apiToken.searchPlaceholder': 'Rechercher un jeton…', + 'system.apiToken.deleteConfirmBefore': 'Révoquer le jeton ', + 'system.apiToken.deleteConfirmAfter': ' ?', + 'system.apiToken.empty': 'Aucun jeton d\'API', + 'system.bench.subtitle': 'Benchmark de persistance base de données', + 'system.bench.total': 'Total', + 'system.bench.idle': 'Lancez le bench pour mesurer chaque étape.', + 'system.bench.ms': 'ms', + 'system.info.subtitle': 'Runtime, mémoire, fuseau horaire, session et build', + 'system.info.copy': 'Copier', } diff --git a/ui/src/views/ApiHomeView.vue b/ui/src/views/ApiHomeView.vue index 92664f6..2d4e0e4 100644 --- a/ui/src/views/ApiHomeView.vue +++ b/ui/src/views/ApiHomeView.vue @@ -1,150 +1,365 @@ + diff --git a/ui/src/views/ApiTokenView.vue b/ui/src/views/ApiTokenView.vue index 52b5acc..b448f64 100644 --- a/ui/src/views/ApiTokenView.vue +++ b/ui/src/views/ApiTokenView.vue @@ -1,128 +1,148 @@ +