fix(ux): improve destructive action safety, accents, navigation and feedback
All checks were successful
Build and Publish Docker Images / Build Backend Image (push) Successful in 2m58s
Build and Publish Docker Images / Build Frontend Image (push) Successful in 3m19s
Build and Publish Docker Images / Build Summary (push) Successful in 3s

Replace window.confirm() with Modal dialogs for class deletion and grade
reset. Add unsaved-changes guards to AssessmentFormView. Warn before
deleting exercises/elements with existing grades. Surface invalid grades
in a detailed Modal after save. Replace GradingView local toasts with
global notification store. Fix missing French accents across CouncilView,
CouncilStudentDetail, and ConfigView. Make dashboard "À corriger" card
and student list rows clickable. Add visual hierarchy to assessment
detail actions. Add loading overlay to trimester switch. Simplify email
sending workflow by removing mode-switch pattern.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-19 14:25:56 +01:00
parent a0ab7224e1
commit bb15933e69
12 changed files with 266 additions and 182 deletions

View File

@@ -57,7 +57,11 @@
</div>
<!-- Stats principales - Grid 4 colonnes -->
<div v-if="stats" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
<div v-if="stats" class="relative">
<div v-if="statsLoading" class="absolute inset-0 bg-white/60 z-10 flex items-center justify-center rounded-xl">
<LoadingSpinner />
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
<!-- Moyenne classe -->
<div class="bg-white rounded-xl shadow-md p-6 hover:shadow-lg transition-all duration-300">
<p class="text-sm text-gray-500 mb-1">Moyenne classe</p>
@@ -96,6 +100,7 @@
</div>
</div>
</div>
</div>
<!-- Domaines et Compétences en 2 colonnes -->
<div v-if="stats" class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
@@ -243,6 +248,7 @@ const stats = ref(null)
const trimester = ref(null) // null = vision annuelle par défaut
const sortColumn = ref('name')
const sortDirection = ref('asc')
const statsLoading = ref(false)
async function fetchData() {
loading.value = true
@@ -257,7 +263,12 @@ async function fetchData() {
async function selectTrimester(t) {
trimester.value = t
stats.value = await classesStore.fetchClassStats(route.params.id, t)
statsLoading.value = true
try {
stats.value = await classesStore.fetchClassStats(route.params.id, t)
} finally {
statsLoading.value = false
}
}
// Récupérer la liste des évaluations triée par date