fix(frontend) : ERP-26/27 - review fixes: shared types, accents i18n, escape key, self-edit refresh, row-clickable guard

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-04-16 10:45:21 +02:00
parent 580ea01941
commit d49c317c49
9 changed files with 70 additions and 103 deletions

View File

@@ -24,7 +24,7 @@
"suppliers": "Répertoire fournisseurs"
},
"core": {
"roles": "Gestion des roles",
"roles": "Gestion des rôles",
"users": "Utilisateurs"
}
},
@@ -63,33 +63,33 @@
},
"admin": {
"roles": {
"title": "Gestion des roles",
"newRole": "Nouveau role",
"editRole": "Modifier le role",
"createRole": "Creer un role",
"noRoles": "Aucun role configure",
"title": "Gestion des rôles",
"newRole": "Nouveau rôle",
"editRole": "Modifier le rôle",
"createRole": "Créer un rôle",
"noRoles": "Aucun rôle configuré",
"table": {
"label": "Libelle",
"label": "Libellé",
"code": "Code",
"permissions": "Permissions",
"system": "Systeme",
"system": "Système",
"actions": "Actions"
},
"form": {
"label": "Libelle",
"label": "Libellé",
"code": "Code",
"description": "Description",
"permissions": "Permissions"
},
"delete": {
"title": "Supprimer le role",
"message": "Etes-vous sur de vouloir supprimer le role \"{label}\" ? Cette action est irreversible.",
"systemTooltip": "Role systeme non supprimable"
"title": "Supprimer le rôle",
"message": "Êtes-vous sûr de vouloir supprimer le rôle \"{label}\" ? Cette action est irréversible.",
"systemTooltip": "Rôle système non supprimable"
},
"toast": {
"created": "Role cree avec succes",
"updated": "Role mis a jour avec succes",
"deleted": "Role supprime avec succes"
"created": "Rôle créé avec succès",
"updated": "Rôle mis à jour avec succès",
"deleted": "Rôle supprimé avec succès"
},
"permissions": {
"selectAll": "Tout selectionner",
@@ -110,16 +110,16 @@
"title": "Permissions de {username}",
"selfWarning": "Vous modifiez vos propres droits",
"adminToggle": "Administrateur (bypass total)",
"rolesSection": "Roles",
"rolesSection": "Rôles",
"directPermissionsSection": "Permissions directes",
"summarySection": "Resume des permissions effectives",
"summarySection": "Résumé des permissions effectives",
"noEffectivePermissions": "Aucune permission effective",
"sourceRole": "via {role}",
"sourceDirect": "Direct",
"lastAdminWarning": "Impossible de retirer le statut administrateur du dernier admin"
},
"toast": {
"updated": "Permissions mises a jour avec succes"
"updated": "Permissions mises à jour avec succès"
}
}
}

View File

@@ -40,14 +40,9 @@
</template>
<script setup lang="ts">
const { t } = useI18n()
import type { EffectivePermission } from '~/shared/types/rbac'
interface EffectivePermission {
code: string
label: string
module: string
sources: string[]
}
const { t } = useI18n()
const props = defineProps<{
permissions: EffectivePermission[]

View File

@@ -30,13 +30,7 @@
</template>
<script setup lang="ts">
interface Permission {
id: number
code: string
label: string
module: string
orphan: boolean
}
import type { Permission } from '~/shared/types/rbac'
const props = defineProps<{
module: string

View File

@@ -55,6 +55,14 @@ function cancel() {
function confirm() {
emit('confirm')
}
// Fermer la modale avec la touche Escape
function onKeydown(e: KeyboardEvent) {
if (e.key === 'Escape') cancel()
}
onMounted(() => document.addEventListener('keydown', onKeydown))
onUnmounted(() => document.removeEventListener('keydown', onKeydown))
</script>
<style scoped>

View File

@@ -70,22 +70,7 @@
</template>
<script setup lang="ts">
interface Permission {
id: number
code: string
label: string
module: string
orphan: boolean
}
interface Role {
id: number
code: string
label: string
description: string | null
isSystem: boolean
permissions: (Permission | string)[]
}
import type { Permission, Role } from '~/shared/types/rbac'
interface PermissionModule {
module: string

View File

@@ -91,37 +91,7 @@
</template>
<script setup lang="ts">
interface Permission {
id: number
code: string
label: string
module: string
orphan: boolean
}
interface Role {
id: number
code: string
label: string
description: string | null
isSystem: boolean
permissions: (Permission | string)[]
}
interface UserListItem {
id: number
username: string
isAdmin: boolean
roles: string[]
directPermissions: string[]
}
interface EffectivePermission {
code: string
label: string
module: string
sources: string[]
}
import type { Permission, Role, UserListItem, EffectivePermission } from '~/shared/types/rbac'
interface PermissionModule {
module: string
@@ -276,6 +246,10 @@ async function handleSave() {
}, {
toastSuccessMessage: t('admin.users.toast.updated'),
})
// Rafraichir les donnees du user courant si auto-edition
if (isSelfEdit.value) {
await auth.refreshUser()
}
emit('saved')
emit('update:modelValue', false)
} finally {

View File

@@ -19,7 +19,7 @@
:columns="columns"
:items="roleItems"
:total-items="roles.length"
:row-clickable="true"
:row-clickable="canManage"
:empty-message="t('admin.roles.noRoles')"
@row-click="onRowClick"
>
@@ -76,26 +76,12 @@
</template>
<script setup lang="ts">
interface Permission {
id: number
code: string
label: string
module: string
orphan: boolean
}
interface Role {
id: number
code: string
label: string
description: string | null
isSystem: boolean
permissions: (Permission | string)[]
}
import type { Role } from '~/shared/types/rbac'
const { t } = useI18n()
const api = useApi()
const { can } = usePermissions()
const canManage = can('core.roles.manage')
useHead({ title: t('admin.roles.title') })

View File

@@ -48,13 +48,7 @@
</template>
<script setup lang="ts">
interface UserListItem {
id: number
username: string
isAdmin: boolean
roles: string[]
directPermissions: string[]
}
import type { UserListItem } from '~/shared/types/rbac'
const { t } = useI18n()
const api = useApi()

View File

@@ -0,0 +1,31 @@
export interface Permission {
id: number
code: string
label: string
module: string
orphan: boolean
}
export interface Role {
id: number
code: string
label: string
description: string | null
isSystem: boolean
permissions: (Permission | string)[]
}
export interface UserListItem {
id: number
username: string
isAdmin: boolean
roles: string[]
directPermissions: string[]
}
export interface EffectivePermission {
code: string
label: string
module: string
sources: string[]
}