Resout les 5 findings de la review automatique + couverture ManyToMany annoncee dans CLAUDE.md : - AuditListener : resolution de la classe via ClassMetadata plutot que `$entity::class` direct (defense proxy Doctrine : sous ORM 2 les lazies sont des `Proxies\__CG__\...`). Test de regression via getReference(). - AuditListener : capture des modifications de collections to-many (OneToMany / ManyToMany) via getScheduledCollectionUpdates / getScheduledCollectionDeletions. Les diffs sont mergees dans le changeset existant ou creent une entree "update" dediee. - AuditLogResource + Provider : filtre multi-valeurs `entity_type[]=X&entity_type[]=Y` (IN clause DBAL via ArrayParameterType::STRING), endpoint `/audit-log-entity-types` pour alimenter le MalioSelectCheckbox cote front. - audit-log.vue : refonte complete. Passage a `MalioDataTable`, composants `Malio*` (MalioInputText, MalioSelectCheckbox, MalioButton), suppression complete de la persistance URL (`readQuery` / `syncQuery` / `route.query`). `datetime-local` conserve avec TODO pointant l'exception CLAUDE.md. - AuditTimeline : fix du saut d'items 11-30. `PAGE_SIZE = 10` aligne avec un `itemsPerPage=10` passe au backend. Token anti-race pour ignorer les reponses tardives quand l'entite affichee change. - AuditLogDetail : affichage des diffs de collections to-many (+ / -) dans le tableau field/old/new existant. - logout.vue : ajout du `resetAuditLog()` au logout pour eviter qu'un user suivant (meme onglet) voie l'etat audit de l'ancien. - Permission / Role / Site : marquage `#[Auditable]`. - Version bump 0.1.32 → 0.1.34. Tests : 228 / 228 (221 assertions → 851, dont regressions proxy + M2M). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
34 lines
1.0 KiB
Vue
34 lines
1.0 KiB
Vue
<template>
|
|
<div class="flex h-full items-center justify-center">
|
|
<p class="text-neutral-500">{{ $t('auth.logout') }}...</p>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
definePageMeta({ layout: 'auth' })
|
|
|
|
const auth = useAuthStore()
|
|
const { resetSidebar } = useSidebar()
|
|
const { resetModules } = useModules()
|
|
const { resetCurrentSite } = useCurrentSite()
|
|
const { resetAuditLog } = useAuditLog()
|
|
|
|
onMounted(async () => {
|
|
try {
|
|
await auth.logout()
|
|
} finally {
|
|
// Les resets sont garantis meme si auth.logout() rejette : eviter
|
|
// qu'un user suivant (connecte sur le meme onglet) voie l'etat de
|
|
// l'ancien. Toutes les fonctions reset sont synchrones et ne
|
|
// peuvent pas throw (juste des assignations reactives).
|
|
// navigateTo est dans le finally pour garantir la redirection
|
|
// meme si auth.logout() lance une exception (ex: reseau coupé).
|
|
resetSidebar()
|
|
resetModules()
|
|
resetCurrentSite()
|
|
resetAuditLog()
|
|
await navigateTo('/login')
|
|
}
|
|
})
|
|
</script>
|