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:
@@ -72,8 +72,7 @@
|
|||||||
"label": "Libellé",
|
"label": "Libellé",
|
||||||
"code": "Code",
|
"code": "Code",
|
||||||
"permissions": "Permissions",
|
"permissions": "Permissions",
|
||||||
"system": "Système",
|
"system": "Système"
|
||||||
"actions": "Actions"
|
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"label": "Libellé",
|
"label": "Libellé",
|
||||||
@@ -103,8 +102,7 @@
|
|||||||
"username": "Nom d'utilisateur",
|
"username": "Nom d'utilisateur",
|
||||||
"admin": "Administrateur",
|
"admin": "Administrateur",
|
||||||
"roles": "Roles",
|
"roles": "Roles",
|
||||||
"directPermissions": "Permissions directes",
|
"directPermissions": "Permissions directes"
|
||||||
"actions": "Actions"
|
|
||||||
},
|
},
|
||||||
"drawer": {
|
"drawer": {
|
||||||
"title": "Permissions de {username}",
|
"title": "Permissions de {username}",
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
<MalioButton
|
<MalioButton
|
||||||
:label="t('common.delete')"
|
:label="t('common.delete')"
|
||||||
variant="danger"
|
variant="danger"
|
||||||
|
icon-name="mdi:delete-outline"
|
||||||
|
icon-position="left"
|
||||||
:disabled="loading"
|
:disabled="loading"
|
||||||
@click="confirm"
|
@click="confirm"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -53,8 +53,18 @@
|
|||||||
<!-- Boutons -->
|
<!-- Boutons -->
|
||||||
<div class="flex justify-end gap-3 border-t border-neutral-200 pt-4">
|
<div class="flex justify-end gap-3 border-t border-neutral-200 pt-4">
|
||||||
<MalioButton
|
<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')"
|
:label="t('common.cancel')"
|
||||||
variant="secondary"
|
variant="tertiary"
|
||||||
@click="emit('update:modelValue', false)"
|
@click="emit('update:modelValue', false)"
|
||||||
/>
|
/>
|
||||||
<MalioButton
|
<MalioButton
|
||||||
@@ -87,6 +97,7 @@ const props = defineProps<{
|
|||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
'update:modelValue': [value: boolean]
|
'update:modelValue': [value: boolean]
|
||||||
saved: []
|
saved: []
|
||||||
|
delete: []
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
const saving = ref(false)
|
const saving = ref(false)
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
<div class="flex justify-end gap-3 border-t border-neutral-200 pt-4">
|
<div class="flex justify-end gap-3 border-t border-neutral-200 pt-4">
|
||||||
<MalioButton
|
<MalioButton
|
||||||
:label="t('common.cancel')"
|
:label="t('common.cancel')"
|
||||||
variant="secondary"
|
variant="tertiary"
|
||||||
@click="emit('update:modelValue', false)"
|
@click="emit('update:modelValue', false)"
|
||||||
/>
|
/>
|
||||||
<MalioButton
|
<MalioButton
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
v-if="can('core.roles.manage')"
|
v-if="can('core.roles.manage')"
|
||||||
:label="t('admin.roles.newRole')"
|
:label="t('admin.roles.newRole')"
|
||||||
icon-name="mdi:plus"
|
icon-name="mdi:plus"
|
||||||
|
icon-position="left"
|
||||||
@click="openCreateDrawer"
|
@click="openCreateDrawer"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -37,25 +38,6 @@
|
|||||||
{{ t('admin.roles.table.system') }}
|
{{ t('admin.roles.table.system') }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</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>
|
</MalioDataTable>
|
||||||
|
|
||||||
<!-- Drawer creation/edition -->
|
<!-- Drawer creation/edition -->
|
||||||
@@ -63,6 +45,7 @@
|
|||||||
v-model="drawerOpen"
|
v-model="drawerOpen"
|
||||||
:role="selectedRole"
|
:role="selectedRole"
|
||||||
@saved="onRoleSaved"
|
@saved="onRoleSaved"
|
||||||
|
@delete="onDeleteRequest"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- Modale de suppression -->
|
<!-- Modale de suppression -->
|
||||||
@@ -93,7 +76,6 @@ const columns = [
|
|||||||
{ key: 'code', label: t('admin.roles.table.code') },
|
{ key: 'code', label: t('admin.roles.table.code') },
|
||||||
{ key: 'permissions', label: t('admin.roles.table.permissions') },
|
{ key: 'permissions', label: t('admin.roles.table.permissions') },
|
||||||
{ key: 'system', label: t('admin.roles.table.system') },
|
{ key: 'system', label: t('admin.roles.table.system') },
|
||||||
{ key: 'actions', label: t('admin.roles.table.actions') },
|
|
||||||
]
|
]
|
||||||
|
|
||||||
// Transformer les roles en items compatibles MalioDataTable
|
// Transformer les roles en items compatibles MalioDataTable
|
||||||
@@ -105,7 +87,6 @@ const roleItems = computed(() =>
|
|||||||
permissions: role.permissions.length,
|
permissions: role.permissions.length,
|
||||||
isSystem: role.isSystem,
|
isSystem: role.isSystem,
|
||||||
system: '', // colonne geree par le slot
|
system: '', // colonne geree par le slot
|
||||||
actions: '', // colonne geree par le slot
|
|
||||||
}))
|
}))
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -148,9 +129,9 @@ function openEditDrawer(role: Role) {
|
|||||||
drawerOpen.value = true
|
drawerOpen.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmDelete(role: Role) {
|
function onDeleteRequest() {
|
||||||
if (role.isSystem) return
|
if (!selectedRole.value || selectedRole.value.isSystem) return
|
||||||
roleToDelete.value = role
|
roleToDelete.value = selectedRole.value
|
||||||
deleteModalOpen.value = true
|
deleteModalOpen.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,6 +144,7 @@ async function handleDelete() {
|
|||||||
})
|
})
|
||||||
deleteModalOpen.value = false
|
deleteModalOpen.value = false
|
||||||
roleToDelete.value = null
|
roleToDelete.value = null
|
||||||
|
drawerOpen.value = false
|
||||||
await loadRoles()
|
await loadRoles()
|
||||||
} finally {
|
} finally {
|
||||||
deleting.value = false
|
deleting.value = false
|
||||||
|
|||||||
@@ -25,17 +25,6 @@
|
|||||||
{{ t('admin.users.table.admin') }}
|
{{ t('admin.users.table.admin') }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</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>
|
</MalioDataTable>
|
||||||
|
|
||||||
<!-- Drawer RBAC -->
|
<!-- Drawer RBAC -->
|
||||||
@@ -68,7 +57,6 @@ const columns = [
|
|||||||
{ key: 'admin', label: t('admin.users.table.admin') },
|
{ key: 'admin', label: t('admin.users.table.admin') },
|
||||||
{ key: 'roles', label: t('admin.users.table.roles') },
|
{ key: 'roles', label: t('admin.users.table.roles') },
|
||||||
{ key: 'directPermissions', label: t('admin.users.table.directPermissions') },
|
{ key: 'directPermissions', label: t('admin.users.table.directPermissions') },
|
||||||
{ key: 'actions', label: t('admin.users.table.actions') },
|
|
||||||
]
|
]
|
||||||
|
|
||||||
const userItems = computed(() =>
|
const userItems = computed(() =>
|
||||||
@@ -78,7 +66,6 @@ const userItems = computed(() =>
|
|||||||
admin: user.isAdmin,
|
admin: user.isAdmin,
|
||||||
roles: user.roles.length,
|
roles: user.roles.length,
|
||||||
directPermissions: user.directPermissions.length,
|
directPermissions: user.directPermissions.length,
|
||||||
actions: '',
|
|
||||||
}))
|
}))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user