refactor(frontend) : RBAC - nettoyage UI admin users/roles

Supprime la colonne actions des tables users et roles (la ligne cliquable
ouvre deja le drawer). Deplace la suppression d'un role dans le drawer
d'edition (bouton danger avec icone, desactive pour les roles systeme).
Harmonise les boutons annuler en variant tertiary et ajoute les icones
manquantes (plus pour nouveau role, poubelle pour supprimer).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-17 10:45:57 +02:00
parent 60e424393c
commit 681775d367
6 changed files with 23 additions and 43 deletions

View File

@@ -72,8 +72,7 @@
"label": "Libellé",
"code": "Code",
"permissions": "Permissions",
"system": "Système",
"actions": "Actions"
"system": "Système"
},
"form": {
"label": "Libellé",
@@ -103,8 +102,7 @@
"username": "Nom d'utilisateur",
"admin": "Administrateur",
"roles": "Roles",
"directPermissions": "Permissions directes",
"actions": "Actions"
"directPermissions": "Permissions directes"
},
"drawer": {
"title": "Permissions de {username}",

View File

@@ -22,6 +22,8 @@
<MalioButton
:label="t('common.delete')"
variant="danger"
icon-name="mdi:delete-outline"
icon-position="left"
:disabled="loading"
@click="confirm"
/>

View File

@@ -53,8 +53,18 @@
<!-- Boutons -->
<div class="flex justify-end gap-3 border-t border-neutral-200 pt-4">
<MalioButton
v-if="isEditMode"
:label="t('common.delete')"
variant="danger"
icon-name="mdi:delete-outline"
icon-position="left"
:disabled="role?.isSystem"
@click="emit('delete')"
/>
<MalioButton
v-else
:label="t('common.cancel')"
variant="secondary"
variant="tertiary"
@click="emit('update:modelValue', false)"
/>
<MalioButton
@@ -87,6 +97,7 @@ const props = defineProps<{
const emit = defineEmits<{
'update:modelValue': [value: boolean]
saved: []
delete: []
}>()
const saving = ref(false)

View File

@@ -76,7 +76,7 @@
<div class="flex justify-end gap-3 border-t border-neutral-200 pt-4">
<MalioButton
:label="t('common.cancel')"
variant="secondary"
variant="tertiary"
@click="emit('update:modelValue', false)"
/>
<MalioButton

View File

@@ -9,6 +9,7 @@
v-if="can('core.roles.manage')"
:label="t('admin.roles.newRole')"
icon-name="mdi:plus"
icon-position="left"
@click="openCreateDrawer"
/>
</div>
@@ -37,25 +38,6 @@
{{ t('admin.roles.table.system') }}
</span>
</template>
<template #cell-actions="{ item }">
<div class="flex items-center justify-end gap-2" @click.stop>
<MalioButtonIcon
v-if="can('core.roles.manage')"
icon="mdi:pencil-outline"
:aria-label="t('common.edit')"
variant="ghost"
@click="openEditDrawer(getRoleById(item.id as number)!)"
/>
<MalioButtonIcon
v-if="can('core.roles.manage')"
icon="mdi:delete-outline"
:aria-label="t('common.delete')"
variant="ghost"
:disabled="item.isSystem as boolean"
@click="confirmDelete(getRoleById(item.id as number)!)"
/>
</div>
</template>
</MalioDataTable>
<!-- Drawer creation/edition -->
@@ -63,6 +45,7 @@
v-model="drawerOpen"
:role="selectedRole"
@saved="onRoleSaved"
@delete="onDeleteRequest"
/>
<!-- Modale de suppression -->
@@ -93,7 +76,6 @@ const columns = [
{ key: 'code', label: t('admin.roles.table.code') },
{ key: 'permissions', label: t('admin.roles.table.permissions') },
{ key: 'system', label: t('admin.roles.table.system') },
{ key: 'actions', label: t('admin.roles.table.actions') },
]
// Transformer les roles en items compatibles MalioDataTable
@@ -105,7 +87,6 @@ const roleItems = computed(() =>
permissions: role.permissions.length,
isSystem: role.isSystem,
system: '', // colonne geree par le slot
actions: '', // colonne geree par le slot
}))
)
@@ -148,9 +129,9 @@ function openEditDrawer(role: Role) {
drawerOpen.value = true
}
function confirmDelete(role: Role) {
if (role.isSystem) return
roleToDelete.value = role
function onDeleteRequest() {
if (!selectedRole.value || selectedRole.value.isSystem) return
roleToDelete.value = selectedRole.value
deleteModalOpen.value = true
}
@@ -163,6 +144,7 @@ async function handleDelete() {
})
deleteModalOpen.value = false
roleToDelete.value = null
drawerOpen.value = false
await loadRoles()
} finally {
deleting.value = false

View File

@@ -25,17 +25,6 @@
{{ t('admin.users.table.admin') }}
</span>
</template>
<template #cell-actions="{ item }">
<div class="flex items-center justify-end gap-2" @click.stop>
<MalioButtonIcon
v-if="canManage"
icon="mdi:shield-edit-outline"
:aria-label="t('common.edit')"
variant="ghost"
@click="openDrawer(getUserById(item.id as number)!)"
/>
</div>
</template>
</MalioDataTable>
<!-- Drawer RBAC -->
@@ -68,7 +57,6 @@ const columns = [
{ key: 'admin', label: t('admin.users.table.admin') },
{ key: 'roles', label: t('admin.users.table.roles') },
{ key: 'directPermissions', label: t('admin.users.table.directPermissions') },
{ key: 'actions', label: t('admin.users.table.actions') },
]
const userItems = computed(() =>
@@ -78,7 +66,6 @@ const userItems = computed(() =>
admin: user.isAdmin,
roles: user.roles.length,
directPermissions: user.directPermissions.length,
actions: '',
}))
)