OUAREDAEK commited on
Commit
ee45443
·
verified ·
1 Parent(s): c091bee

Upload cross_reading/cross_readers.html with huggingface_hub

Browse files
Files changed (1) hide show
  1. cross_reading/cross_readers.html +728 -0
cross_reading/cross_readers.html ADDED
@@ -0,0 +1,728 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Analyse Croisée des Évaluations - ReflAgent</title>
7
+
8
+ <style>
9
+ * {
10
+ margin: 0;
11
+ padding: 0;
12
+ box-sizing: border-box;
13
+ font-family: 'Segoe UI', Arial, sans-serif;
14
+ }
15
+
16
+ body {
17
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
18
+ color: #333;
19
+ min-height: 100vh;
20
+ padding: 20px;
21
+ }
22
+
23
+ .container {
24
+ max-width: 1400px;
25
+ margin: 0 auto;
26
+ background: white;
27
+ border-radius: 20px;
28
+ padding: 30px;
29
+ box-shadow: 0 10px 40px rgba(0,0,0,0.08);
30
+ border: 1px solid #e0e0e0;
31
+ }
32
+
33
+ header {
34
+ text-align: center;
35
+ margin-bottom: 30px;
36
+ padding-bottom: 20px;
37
+ border-bottom: 2px solid #e3f2fd;
38
+ }
39
+
40
+ h1 {
41
+ color: #1976D2;
42
+ background: linear-gradient(90deg, #1976D2, #2196F3);
43
+ -webkit-background-clip: text;
44
+ -webkit-text-fill-color: transparent;
45
+ margin-bottom: 10px;
46
+ }
47
+
48
+ .subtitle {
49
+ color: #666;
50
+ font-size: 16px;
51
+ margin-bottom: 20px;
52
+ }
53
+
54
+ .back-btn {
55
+ display: inline-flex;
56
+ align-items: center;
57
+ gap: 8px;
58
+ padding: 10px 20px;
59
+ background: linear-gradient(135deg, #1976D2, #2196F3);
60
+ color: white;
61
+ text-decoration: none;
62
+ border-radius: 10px;
63
+ margin-bottom: 20px;
64
+ font-weight: 600;
65
+ transition: transform 0.3s, box-shadow 0.3s;
66
+ }
67
+
68
+ .back-btn:hover {
69
+ transform: translateY(-2px);
70
+ box-shadow: 0 5px 15px rgba(25, 118, 210, 0.3);
71
+ }
72
+
73
+ .stats-grid {
74
+ display: grid;
75
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
76
+ gap: 20px;
77
+ margin-bottom: 30px;
78
+ }
79
+
80
+ .stat-card {
81
+ background: linear-gradient(135deg, #e3f2fd, #f3e5f5);
82
+ padding: 20px;
83
+ border-radius: 12px;
84
+ text-align: center;
85
+ transition: transform 0.3s;
86
+ }
87
+
88
+ .stat-card:hover {
89
+ transform: translateY(-5px);
90
+ box-shadow: 0 8px 20px rgba(0,0,0,0.1);
91
+ }
92
+
93
+ .stat-value {
94
+ font-size: 36px;
95
+ font-weight: bold;
96
+ color: #1976D2;
97
+ margin: 10px 0;
98
+ }
99
+
100
+ .stat-label {
101
+ font-size: 14px;
102
+ color: #666;
103
+ font-weight: 500;
104
+ }
105
+
106
+ .section {
107
+ margin: 30px 0;
108
+ padding: 20px;
109
+ background: #f8f9fa;
110
+ border-radius: 15px;
111
+ }
112
+
113
+ .section h2 {
114
+ color: #1976D2;
115
+ margin-bottom: 20px;
116
+ padding-bottom: 10px;
117
+ border-bottom: 2px solid #e3f2fd;
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 10px;
121
+ }
122
+
123
+ .filter-controls {
124
+ display: flex;
125
+ gap: 15px;
126
+ margin-bottom: 20px;
127
+ flex-wrap: wrap;
128
+ align-items: center;
129
+ }
130
+
131
+ .filter-controls select, .filter-controls input {
132
+ padding: 10px 15px;
133
+ border: 2px solid #1976D2;
134
+ border-radius: 8px;
135
+ background: white;
136
+ font-size: 14px;
137
+ min-width: 200px;
138
+ }
139
+
140
+ .filter-controls label {
141
+ font-weight: 600;
142
+ color: #1976D2;
143
+ }
144
+
145
+ table {
146
+ width: 100%;
147
+ border-collapse: collapse;
148
+ margin: 20px 0;
149
+ background: white;
150
+ border-radius: 10px;
151
+ overflow: hidden;
152
+ box-shadow: 0 3px 15px rgba(0,0,0,0.05);
153
+ }
154
+
155
+ th {
156
+ background: linear-gradient(135deg, #1976D2, #2196F3);
157
+ color: white;
158
+ padding: 15px;
159
+ text-align: left;
160
+ font-weight: 600;
161
+ }
162
+
163
+ td {
164
+ padding: 12px 15px;
165
+ border-bottom: 1px solid #e0e0e0;
166
+ }
167
+
168
+ tr:hover {
169
+ background: #f5f5f5;
170
+ }
171
+
172
+ .scenario-badge {
173
+ display: inline-block;
174
+ padding: 5px 10px;
175
+ border-radius: 20px;
176
+ font-size: 12px;
177
+ font-weight: bold;
178
+ background: #e3f2fd;
179
+ color: #1976D2;
180
+ }
181
+
182
+ .confidence-bar {
183
+ height: 20px;
184
+ background: #e0e0e0;
185
+ border-radius: 10px;
186
+ overflow: hidden;
187
+ margin: 5px 0;
188
+ }
189
+
190
+ .confidence-fill {
191
+ height: 100%;
192
+ border-radius: 10px;
193
+ transition: width 0.5s ease;
194
+ }
195
+
196
+ .high-confidence { background: linear-gradient(135deg, #43a047, #4caf50); }
197
+ .medium-confidence { background: linear-gradient(135deg, #fb8c00, #ff9800); }
198
+ .low-confidence { background: linear-gradient(135deg, #e53935, #f44336); }
199
+
200
+ .metrics-container {
201
+ display: flex;
202
+ flex-direction: column;
203
+ gap: 5px;
204
+ }
205
+
206
+ .metric-item {
207
+ display: flex;
208
+ justify-content: space-between;
209
+ align-items: center;
210
+ padding: 3px 0;
211
+ font-size: 12px;
212
+ }
213
+
214
+ .metric-name {
215
+ color: #666;
216
+ }
217
+
218
+ .metric-value {
219
+ font-weight: bold;
220
+ color: #1976D2;
221
+ }
222
+
223
+ .conflict-indicator {
224
+ display: inline-block;
225
+ width: 12px;
226
+ height: 12px;
227
+ border-radius: 50%;
228
+ margin-right: 5px;
229
+ }
230
+
231
+ .conflict-high {
232
+ background: #e53935;
233
+ animation: pulse 2s infinite;
234
+ }
235
+
236
+ .conflict-medium {
237
+ background: #fb8c00;
238
+ }
239
+
240
+ .conflict-low {
241
+ background: #43a047;
242
+ }
243
+
244
+ @keyframes pulse {
245
+ 0% { transform: scale(1); }
246
+ 50% { transform: scale(1.2); }
247
+ 100% { transform: scale(1); }
248
+ }
249
+
250
+ .chart-container {
251
+ height: 400px;
252
+ margin: 20px 0;
253
+ background: white;
254
+ border-radius: 10px;
255
+ padding: 20px;
256
+ box-shadow: 0 3px 15px rgba(0,0,0,0.05);
257
+ }
258
+
259
+ .scenario-details {
260
+ background: white;
261
+ border-radius: 10px;
262
+ padding: 20px;
263
+ margin: 20px 0;
264
+ box-shadow: 0 3px 15px rgba(0,0,0,0.05);
265
+ display: none;
266
+ }
267
+
268
+ .scenario-details.active {
269
+ display: block;
270
+ animation: fadeIn 0.5s ease;
271
+ }
272
+
273
+ @keyframes fadeIn {
274
+ from { opacity: 0; transform: translateY(10px); }
275
+ to { opacity: 1; transform: translateY(0); }
276
+ }
277
+
278
+ .details-grid {
279
+ display: grid;
280
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
281
+ gap: 20px;
282
+ margin-top: 20px;
283
+ }
284
+
285
+ .details-card {
286
+ background: #f8f9fa;
287
+ padding: 15px;
288
+ border-radius: 8px;
289
+ border-left: 4px solid #1976D2;
290
+ }
291
+
292
+ .details-card h4 {
293
+ color: #1976D2;
294
+ margin-bottom: 10px;
295
+ }
296
+
297
+ .comparison-chart {
298
+ display: grid;
299
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
300
+ gap: 15px;
301
+ margin: 20px 0;
302
+ }
303
+
304
+ .comparison-item {
305
+ background: white;
306
+ padding: 15px;
307
+ border-radius: 8px;
308
+ border: 1px solid #e0e0e0;
309
+ text-align: center;
310
+ }
311
+
312
+ .loading {
313
+ text-align: center;
314
+ padding: 40px;
315
+ color: #666;
316
+ }
317
+
318
+ .loading-spinner {
319
+ display: inline-block;
320
+ width: 40px;
321
+ height: 40px;
322
+ border: 4px solid #f3f3f3;
323
+ border-top: 4px solid #1976D2;
324
+ border-radius: 50%;
325
+ animation: spin 1s linear infinite;
326
+ margin-bottom: 20px;
327
+ }
328
+
329
+ @keyframes spin {
330
+ 0% { transform: rotate(0deg); }
331
+ 100% { transform: rotate(360deg); }
332
+ }
333
+
334
+ /* Styles pour les étoiles */
335
+ .stars-container {
336
+ display: flex;
337
+ gap: 2px;
338
+ margin-top: 5px;
339
+ }
340
+
341
+ .star {
342
+ font-size: 18px;
343
+ color: #FFD700;
344
+ }
345
+
346
+ .star.empty {
347
+ color: #e0e0e0;
348
+ }
349
+
350
+ /* Styles pour les métriques détaillées */
351
+ .metric-detail {
352
+ background: #f8f9fa;
353
+ padding: 10px;
354
+ border-radius: 8px;
355
+ margin-bottom: 10px;
356
+ border-left: 3px solid #1976D2;
357
+ }
358
+
359
+ .metric-question {
360
+ font-size: 12px;
361
+ color: #666;
362
+ margin-top: 5px;
363
+ font-style: italic;
364
+ }
365
+
366
+ /* Styles pour le modal */
367
+ .modal {
368
+ display: none;
369
+ position: fixed;
370
+ top: 0;
371
+ left: 0;
372
+ width: 100%;
373
+ height: 100%;
374
+ background: rgba(0,0,0,0.5);
375
+ z-index: 1000;
376
+ align-items: center;
377
+ justify-content: center;
378
+ }
379
+
380
+ .modal-content {
381
+ background: white;
382
+ border-radius: 15px;
383
+ padding: 30px;
384
+ max-width: 600px;
385
+ width: 90%;
386
+ max-height: 80vh;
387
+ overflow-y: auto;
388
+ box-shadow: 0 10px 40px rgba(0,0,0,0.2);
389
+ }
390
+
391
+ /* Badge pour le review */
392
+ .review-badge {
393
+ display: inline-block;
394
+ padding: 3px 8px;
395
+ border-radius: 12px;
396
+ font-size: 11px;
397
+ font-weight: bold;
398
+ margin-left: 5px;
399
+ }
400
+
401
+ .review-approved {
402
+ background: #E8F5E9;
403
+ color: #2E7D32;
404
+ }
405
+
406
+ .review-revision {
407
+ background: #FFF3E0;
408
+ color: #EF6C00;
409
+ }
410
+
411
+ .review-rejected {
412
+ background: #FFEBEE;
413
+ color: #C62828;
414
+ }
415
+
416
+ /* Styles pour les métriques dans les tableaux */
417
+ .metrics-table-cell {
418
+ max-width: 350px;
419
+ }
420
+
421
+ .compact-metric {
422
+ display: flex;
423
+ align-items: center;
424
+ margin-bottom: 3px;
425
+ font-size: 11px;
426
+ }
427
+
428
+ .compact-metric-name {
429
+ width: 30px;
430
+ font-weight: bold;
431
+ color: #1976D2;
432
+ }
433
+
434
+ .compact-stars {
435
+ display: flex;
436
+ gap: 1px;
437
+ margin: 0 5px;
438
+ }
439
+
440
+ .compact-star {
441
+ font-size: 10px;
442
+ color: #FFD700;
443
+ }
444
+
445
+ .compact-star.empty {
446
+ color: #e0e0e0;
447
+ }
448
+
449
+ .error-message {
450
+ background: #FFEBEE;
451
+ color: #C62828;
452
+ padding: 20px;
453
+ border-radius: 10px;
454
+ margin: 20px 0;
455
+ border-left: 4px solid #C62828;
456
+ }
457
+
458
+ .success-message {
459
+ background: #E8F5E9;
460
+ color: #2E7D32;
461
+ padding: 15px;
462
+ border-radius: 8px;
463
+ margin: 10px 0;
464
+ display: none;
465
+ }
466
+
467
+ .warning-message {
468
+ background: #FFF3E0;
469
+ color: #EF6C00;
470
+ padding: 15px;
471
+ border-radius: 8px;
472
+ margin: 10px 0;
473
+ border-left: 4px solid #EF6C00;
474
+ }
475
+
476
+ .test-data-btn {
477
+ background: linear-gradient(135deg, #4CAF50, #8BC34A);
478
+ color: white;
479
+ border: none;
480
+ padding: 10px 20px;
481
+ border-radius: 8px;
482
+ cursor: pointer;
483
+ font-weight: 600;
484
+ margin: 10px 0;
485
+ text-decoration: none;
486
+ display: inline-block;
487
+ transition: transform 0.3s;
488
+ }
489
+
490
+ .test-data-btn:hover {
491
+ transform: translateY(-2px);
492
+ }
493
+
494
+ @media (max-width: 768px) {
495
+ .container {
496
+ padding: 15px;
497
+ }
498
+
499
+ .filter-controls {
500
+ flex-direction: column;
501
+ align-items: stretch;
502
+ }
503
+
504
+ .filter-controls select, .filter-controls input {
505
+ width: 100%;
506
+ }
507
+
508
+ table {
509
+ display: block;
510
+ overflow-x: auto;
511
+ }
512
+
513
+ .modal-content {
514
+ width: 95%;
515
+ padding: 15px;
516
+ }
517
+
518
+ .metric-detail {
519
+ padding: 8px;
520
+ font-size: 12px;
521
+ }
522
+
523
+ .star {
524
+ font-size: 14px;
525
+ }
526
+ }
527
+ </style>
528
+
529
+ <!-- Chart.js pour les visualisations -->
530
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
531
+ </head>
532
+ <body>
533
+ <div class="container">
534
+ <a href="index.html" class="back-btn">⬅️ Retour au Dashboard</a>
535
+
536
+ <header>
537
+ <h1>📊 Analyse Croisée des Évaluations</h1>
538
+ <p class="subtitle">Analyse des niveaux de confiance contradictoires entre les évaluateurs</p>
539
+ </header>
540
+
541
+ <!-- Messages d'information -->
542
+ <div id="successMessage" class="success-message"></div>
543
+ <div id="warningMessage" class="warning-message" style="display:none;">
544
+ <strong>⚠️ Données manquantes</strong>
545
+ <p>Il semble qu'aucune donnée d'évaluation n'ait été trouvée.</p>
546
+ <p>Vous pouvez générer des données de test pour commencer :</p>
547
+ <button onclick="generateTestData()" class="test-data-btn">
548
+ 🧪 Générer des données de test
549
+ </button>
550
+ </div>
551
+
552
+ <!-- Statistiques globales -->
553
+ <div class="stats-grid" id="globalStats">
554
+ <div class="stat-card">
555
+ <div class="stat-label">Total d'évaluations</div>
556
+ <div class="stat-value" id="totalEvaluations">0</div>
557
+ </div>
558
+ <div class="stat-card">
559
+ <div class="stat-label">Scénarios évalués</div>
560
+ <div class="stat-value" id="totalScenarios">0</div>
561
+ </div>
562
+ <div class="stat-card">
563
+ <div class="stat-label">Évaluateurs uniques</div>
564
+ <div class="stat-value" id="totalEvaluators">0</div>
565
+ </div>
566
+ <div class="stat-card">
567
+ <div class="stat-label">Taux de conflit</div>
568
+ <div class="stat-value" id="conflictRate">0%</div>
569
+ </div>
570
+ </div>
571
+
572
+ <!-- Contrôles de filtrage -->
573
+ <div class="section">
574
+ <h2>🔍 Filtres d'analyse</h2>
575
+ <div class="filter-controls">
576
+ <div>
577
+ <label for="scenarioFilter">Filtrer par scénario :</label>
578
+ <select id="scenarioFilter" onchange="filterData()">
579
+ <option value="all">Tous les scénarios</option>
580
+ </select>
581
+ </div>
582
+ <div>
583
+ <label for="confidenceFilter">Filtrer par niveau de conflit :</label>
584
+ <select id="confidenceFilter" onchange="filterData()">
585
+ <option value="all">Tous les niveaux</option>
586
+ <option value="high">Conflit élevé (différence > 40%)</option>
587
+ <option value="medium">Conflit moyen (20-40%)</option>
588
+ <option value="low">Conflit faible (0-20%)</option>
589
+ </select>
590
+ </div>
591
+ <div>
592
+ <label for="sortBy">Trier par :</label>
593
+ <select id="sortBy" onchange="filterData()">
594
+ <option value="scenario">Scénario</option>
595
+ <option value="conflict">Niveau de conflit</option>
596
+ <option value="evaluations">Nombre d'évaluations</option>
597
+ <option value="confidence">Confiance moyenne</option>
598
+ </select>
599
+ </div>
600
+ </div>
601
+ </div>
602
+
603
+ <!-- Tableau des évaluations par scénario -->
604
+ <div class="section">
605
+ <h2>📋 Liste des évaluations par scénario</h2>
606
+ <div id="evaluationsTable">
607
+ <div class="loading">
608
+ <div class="loading-spinner"></div>
609
+ <p>Chargement des données d'évaluation...</p>
610
+ </div>
611
+ </div>
612
+ </div>
613
+
614
+ <!-- Section : Toutes les évaluations détaillées -->
615
+ <div class="section">
616
+ <h2>📝 Toutes les évaluations détaillées</h2>
617
+
618
+ <div class="filter-controls">
619
+ <div>
620
+ <label for="evaluatorFilter">Filtrer par évaluateur :</label>
621
+ <select id="evaluatorFilter" onchange="filterAllEvaluations()">
622
+ <option value="all">Tous les évaluateurs</option>
623
+ </select>
624
+ </div>
625
+ <div>
626
+ <label for="scoreFilter">Filtrer par score :</label>
627
+ <select id="scoreFilter" onchange="filterAllEvaluations()">
628
+ <option value="all">Tous les scores</option>
629
+ <option value="high">Élevé (70-100%)</option>
630
+ <option value="medium">Moyen (40-69%)</option>
631
+ <option value="low">Faible (0-39%)</option>
632
+ </select>
633
+ </div>
634
+ <div>
635
+ <label for="sortEvaluations">Trier par :</label>
636
+ <select id="sortEvaluations" onchange="filterAllEvaluations()">
637
+ <option value="date_desc">Date (récent)</option>
638
+ <option value="date_asc">Date (ancien)</option>
639
+ <option value="score_desc">Score (haut)</option>
640
+ <option value="score_asc">Score (bas)</option>
641
+ <option value="scenario">Scénario</option>
642
+ </select>
643
+ </div>
644
+ </div>
645
+
646
+ <div id="allEvaluationsTable">
647
+ <div class="loading">
648
+ <div class="loading-spinner"></div>
649
+ <p>Chargement des évaluations détaillées...</p>
650
+ </div>
651
+ </div>
652
+ </div>
653
+
654
+ <!-- Graphiques -->
655
+ <div class="section">
656
+ <h2>📈 Visualisations</h2>
657
+ <div class="chart-container">
658
+ <canvas id="confidenceChart"></canvas>
659
+ </div>
660
+ <div class="chart-container">
661
+ <canvas id="conflictChart"></canvas>
662
+ </div>
663
+ </div>
664
+
665
+ <!-- Détails d'un scénario -->
666
+ <div class="scenario-details" id="scenarioDetails">
667
+ <h2>🔍 Détails du scénario <span id="detailScenarioTitle"></span></h2>
668
+ <div id="scenarioContent"></div>
669
+ </div>
670
+
671
+ <!-- Section d'aide -->
672
+ <div class="section" id="helpSection" style="display:none;">
673
+ <h2>🆘 Aide et dépannage</h2>
674
+ <p>Si aucune donnée n'apparaît, essayez :</p>
675
+ <ol>
676
+ <li>Vérifier que le serveur Flask est en cours d'exécution</li>
677
+ <li>Générer des données de test avec le bouton ci-dessous</li>
678
+ <li>Vérifier la console du navigateur pour les erreurs (F12 → Console)</li>
679
+ </ol>
680
+ <button onclick="generateTestData()" class="test-data-btn">
681
+ 🧪 Générer des données de test
682
+ </button>
683
+ <button onclick="location.reload()" class="test-data-btn" style="background:linear-gradient(135deg, #2196F3, #1976D2);margin-left:10px;">
684
+ 🔄 Recharger la page
685
+ </button>
686
+ </div>
687
+ </div>
688
+
689
+ <!-- Modale pour ajouter un review -->
690
+ <div id="reviewModal" class="modal">
691
+ <div class="modal-content">
692
+ <h2 style="color:#1976D2; margin-bottom:20px;">✍️ Ajouter un Review</h2>
693
+
694
+ <div style="margin-bottom:20px; padding:15px; background:#f8f9fa; border-radius:8px;">
695
+ <strong>Évaluateur :</strong> <span id="modalEvaluator"></span><br>
696
+ <strong>Scénario :</strong> <span id="modalScenario"></span><br>
697
+ <strong>Score :</strong> <span id="modalScore"></span>
698
+ </div>
699
+
700
+ <div style="margin-bottom:20px;">
701
+ <label for="reviewDecision" style="display:block; margin-bottom:5px; font-weight:bold;">Décision :</label>
702
+ <select id="reviewDecision" style="width:100%; padding:10px; border:2px solid #1976D2; border-radius:8px;">
703
+ <option value="approved">✅ Approuvé</option>
704
+ <option value="needs_revision">⚠️ Nécessite révision</option>
705
+ <option value="rejected">❌ Rejeté</option>
706
+ </select>
707
+ </div>
708
+
709
+ <div style="margin-bottom:20px;">
710
+ <label for="reviewComment" style="display:block; margin-bottom:5px; font-weight:bold;">Commentaire du review :</label>
711
+ <textarea id="reviewComment" rows="5" style="width:100%; padding:10px; border:2px solid #1976D2; border-radius:8px;"
712
+ placeholder="Ajoutez vos commentaires sur cette évaluation..."></textarea>
713
+ </div>
714
+
715
+ <div style="display:flex; gap:10px; justify-content:flex-end;">
716
+ <button onclick="closeReviewModal()" style="padding:10px 20px; background:#666; color:white; border:none; border-radius:8px; cursor:pointer;">
717
+ Annuler
718
+ </button>
719
+ <button onclick="saveReview()" style="padding:10px 20px; background:#1976D2; color:white; border:none; border-radius:8px; cursor:pointer;">
720
+ 💾 Sauvegarder
721
+ </button>
722
+ </div>
723
+ </div>
724
+ </div>
725
+
726
+ <script src="cross_readers.js"></script>
727
+ </body>
728
+ </html>