diff --git a/config/packages/security.yaml b/config/packages/security.yaml index f440a21..0152ffc 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -33,9 +33,14 @@ security: stateless: true provider: app_user_provider jwt: ~ + # API JWT stateless : pas de `target` (redirection 302) — le logout + # renvoie 204 via ApiLogoutSuccessListener. Une redirection generait + # une URL absolue basee sur le Host (en dev : l'upstream proxy + # « nginx », non resolvable par le navigateur => ERR_NAME_NOT_RESOLVED + # + ~3 s de timeout DNS). Le cookie BEARER reste efface par + # delete_cookies. logout: path: /api/logout - target: /login enable_csrf: false delete_cookies: BEARER: diff --git a/config/sidebar.php b/config/sidebar.php index fd45eda..7fd5bea 100644 --- a/config/sidebar.php +++ b/config/sidebar.php @@ -184,6 +184,9 @@ return [ // Section "Mon compte" : espace personnel. Accessible a tout user authentifie // (aucune permission RBAC requise, tous les items restent dans `core` pour // rester toujours presents meme quand les modules metier sont desactives). + // La deconnexion a quitte cette section : elle vit desormais dans le footer + // de la sidebar (compte connecte + lien deconnexion + version, cf. + // frontend/app/layouts/default.vue + useLogout). [ 'label' => 'sidebar.account.section', 'icon' => 'mdi:account-circle-outline', @@ -194,12 +197,6 @@ return [ 'icon' => 'mdi:view-dashboard-outline', 'module' => 'core', ], - [ - 'label' => 'sidebar.account.logout', - 'to' => '/logout', - 'icon' => 'mdi:logout', - 'module' => 'core', - ], ], ], ]; diff --git a/frontend/app/layouts/default.vue b/frontend/app/layouts/default.vue index ee46cf8..e8978b6 100644 --- a/frontend/app/layouts/default.vue +++ b/frontend/app/layouts/default.vue @@ -21,6 +21,45 @@ + + + + + +
@@ -42,6 +81,18 @@ const {isModuleActive} = useModules() const auth = useAuthStore() const route = useRoute() +// Footer de la sidebar : compte connecte + deconnexion inline + version. +const {logout: onLogout} = useLogout() +const {version, load: loadAppVersion} = useAppVersion() + +const username = computed(() => auth.user?.username ?? '') +// Pastille avatar : 1re lettre du compte (meme convention que la maquette Malio). +const initials = computed(() => username.value.charAt(0).toUpperCase() || '?') + +onMounted(() => { + void loadAppVersion() +}) + // Le SiteSelector est rendu si : // - le module Sites est actif dans config/modules.php (sinon la feature // n'a pas de sens, cf. ticket 3 spec criteres d'acceptation) ; diff --git a/frontend/i18n/locales/fr.json b/frontend/i18n/locales/fr.json index 00d3da2..d17f6f8 100644 --- a/frontend/i18n/locales/fr.json +++ b/frontend/i18n/locales/fr.json @@ -53,7 +53,7 @@ }, "catalog": { "categories": "Gestion des catégories", - "products": "Produits" + "products": "Catalogue produits" } }, "dashboard": { @@ -72,7 +72,7 @@ "companyName": "Nom", "categories": "Catégories", "sites": "Site", - "lastActivity": "Dernière modification" + "lastActivity": "Dernière activité" }, "filters": { "title": "Filtres", @@ -218,7 +218,7 @@ "companyName": "Nom", "categories": "Catégories", "sites": "Site", - "lastActivity": "Dernière modification" + "lastActivity": "Dernière activité" }, "filters": { "title": "Filtres", @@ -389,7 +389,7 @@ "companyName": "Nom", "categories": "Catégories", "sites": "Site", - "lastActivity": "Dernière modification" + "lastActivity": "Dernière activité" }, "filters": { "title": "Filtres", @@ -745,7 +745,8 @@ "weighbridge": { "auto": "Pesée bascule", "manual": "Pesée manuelle", - "confirmTitle": "Êtes-vous sûr de vouloir déclencher une pesée ?", + "confirmTitle": "Pesée bascule", + "confirmMessage": "Êtes-vous sûr de vouloir déclencher une pesée ?", "validate": "Valider", "unavailable": "Pont bascule indisponible — passez en pesée manuelle." }, diff --git a/frontend/modules/catalog/components/CategoryDeleteModal.vue b/frontend/modules/catalog/components/CategoryDeleteModal.vue index 5842904..a402328 100644 --- a/frontend/modules/catalog/components/CategoryDeleteModal.vue +++ b/frontend/modules/catalog/components/CategoryDeleteModal.vue @@ -1,5 +1,6 @@