Compare commits

...

2 Commits

Author SHA1 Message Date
40c01fe62f chore : ajouter cible test-db-setup pour provisionner la BDD de test
Nouvelle cible idempotente qui cree la base coltura_test, joue les
migrations, charge les fixtures et synchronise les permissions RBAC
(ordre important : sync-permissions apres fixtures qui purge la table
permission). Branchee automatiquement sur install et db-reset pour que
chaque dev ait la BDD de test prete au premier clone et que make test
passe sans etape manuelle.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 10:46:12 +02:00
681775d367 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>
2026-04-17 10:45:57 +02:00
7 changed files with 34 additions and 44 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: '',
}))
)

View File

@@ -38,7 +38,7 @@ restart: env-init
$(DOCKER_COMPOSE) down
CURRENT_UID=$(shell id -u) CURRENT_GID=$(shell id -g) $(DOCKER_COMPOSE) up -d
install: copy-git-hook composer-install cache-clear node-use build-nuxtJS migration-migrate
install: copy-git-hook composer-install cache-clear node-use build-nuxtJS migration-migrate test-db-setup
# Supprime tout est réinstalle tout (Attention ça supprime la bdd aussi)
reset: delete_built_dir remove_orphans build-without-cache start wait install
@@ -83,6 +83,15 @@ build-without-cache:
migration-migrate:
$(SYMFONY_CONSOLE) doctrine:migrations:migrate --no-interaction
# Cree et initialise la base de test utilisee par PHPUnit
# (le suffixe "_test" est applique automatiquement par Doctrine en APP_ENV=test)
# Ordre : fixtures -> sync-permissions, car fixtures:load purge la table permission
test-db-setup:
$(SYMFONY_CONSOLE) doctrine:database:create --env=test --if-not-exists
$(SYMFONY_CONSOLE) doctrine:migrations:migrate --env=test --no-interaction
$(SYMFONY_CONSOLE) --env=test --no-interaction doctrine:fixtures:load
$(SYMFONY_CONSOLE) --env=test --no-interaction app:sync-permissions
fixtures:
$(SYMFONY_CONSOLE) --no-interaction doctrine:fixtures:load
@@ -100,6 +109,7 @@ db-reset:
$(MAKE) migration-migrate
$(MAKE) fixtures
$(MAKE) sync-permissions
$(MAKE) test-db-setup
# Restart la bdd
db-restart: