refactor(core) : reponse aux retours de review

- extrait PermissionAccordion (modules/core/components) : source unique pour
  l'accordeon de permissions par module, utilise par RoleDrawer et UserRbacDrawer
  (supprime la duplication selectedCountFor/directSelectedCount + ~25 lignes de markup)
- expose le type PermissionModule dans shared/types/rbac
- audit-log : simplifie toggleEntity (filter au lieu de Set, valeurs uniques par construction)
- default.vue : commente les valeurs en dur (232/170/47) comme issues de la maquette Figma
- audit-log : corrige iconSize -> icon-size (warning eslint vue/attribute-hyphenation)
This commit is contained in:
2026-05-28 14:14:34 +02:00
parent 256b8d4ff2
commit 5c4bc32827
6 changed files with 111 additions and 110 deletions
@@ -66,39 +66,14 @@
<div v-if="permissionsByModule.length === 0" class="text-sm text-neutral-400">
{{ t('admin.roles.permissions.noPermissions') }}
</div>
<!-- Un panneau d'accordeon par module (mode multiple) ; le compteur
selectionnees/total reste visible dans l'en-tete replie. -->
<MalioAccordion v-else v-model="openDirectModules">
<MalioAccordionItem
v-for="group in permissionsByModule"
:key="group.module"
:value="group.module"
:title="`${group.module} (${directSelectedCount(group)}/${group.permissions.length})`"
header-class="capitalize"
>
<div class="flex flex-col gap-3">
<!-- Tout selectionner pour ce module -->
<MalioCheckbox
:id="`direct-group-${group.module}`"
:label="t('admin.roles.permissions.selectAll')"
:model-value="directAllSelected(group)"
label-class="font-semibold text-sm text-neutral-700"
@update:model-value="(val: boolean) => handleToggleAll(group.module, val)"
/>
<div class="flex flex-col gap-2">
<MalioCheckbox
v-for="perm in group.permissions"
:id="`direct-perm-${perm.id}`"
:key="perm.id"
:label="perm.label"
:model-value="selectedDirectPermissionIds.has(perm.id)"
label-class="text-sm text-neutral-600"
@update:model-value="(val: boolean) => handleTogglePermission(perm.id, val)"
/>
</div>
</div>
</MalioAccordionItem>
</MalioAccordion>
<PermissionAccordion
v-else
:groups-by-module="permissionsByModule"
:selected-ids="selectedDirectPermissionIds"
id-prefix="direct"
@toggle="handleTogglePermission"
@toggle-all="handleToggleAll"
/>
</div>
<!-- Section Sites autorises (ticket 2 module Sites) -->
@@ -153,14 +128,9 @@
</template>
<script setup lang="ts">
import type { Permission, Role, UserListItem, UserRbacDetail, EffectivePermission } from '~/shared/types/rbac'
import type { Permission, PermissionModule, Role, UserListItem, UserRbacDetail, EffectivePermission } from '~/shared/types/rbac'
import type { Site } from '~/shared/types/sites'
interface PermissionModule {
module: string
permissions: Permission[]
}
const { t } = useI18n()
const api = useApi()
const auth = useAuthStore()
@@ -189,19 +159,6 @@ const selectedRoleIds = ref(new Set<number>())
const selectedDirectPermissionIds = ref(new Set<number>())
const selectedSiteIds = ref(new Set<number>())
// Modules ouverts dans l'accordeon des permissions directes (mode multiple)
const openDirectModules = ref<string[]>([])
// Nombre de permissions directes selectionnees pour un module donne
function directSelectedCount(group: PermissionModule): number {
return group.permissions.filter(p => selectedDirectPermissionIds.value.has(p.id)).length
}
// Vrai si toutes les permissions directes du module sont selectionnees
function directAllSelected(group: PermissionModule): boolean {
return group.permissions.length > 0 && directSelectedCount(group) === group.permissions.length
}
// Detecter l'auto-edition
const isSelfEdit = computed(() => props.user?.id === auth.user?.id)