OUAREDAEK commited on
Commit
7bb0d4b
·
verified ·
1 Parent(s): 44b7cd6

Upload templates/index.html with huggingface_hub

Browse files
Files changed (1) hide show
  1. templates/index.html +324 -19
templates/index.html CHANGED
@@ -1700,7 +1700,7 @@ textarea:focus {
1700
  </div>
1701
  </div>
1702
 
1703
- <!-- Colonne droite : Indicateurs de la persistance et du management de leffort -->
1704
  <div class="compact-heatmap-right">
1705
  <div class="compact-persistence-analysis" id="compact-persistenceAnalysis">
1706
  <h5>🧭 Indicateurs de la gestion du temps et régularité</h5>
@@ -1721,7 +1721,7 @@ textarea:focus {
1721
 
1722
  <div class="compact-persistence-text" style="margin-top: 10px;">
1723
  <div style="margin-bottom: 10px;">
1724
- <strong>Schéma d'effort :</strong>
1725
  <div style="margin-top: 5px; padding: 8px; background: transparent; border-radius: 6px; font-size: 13px;">
1726
  <span id="compact-patternText">Analyse en cours...</span>
1727
  </div>
@@ -1983,6 +1983,24 @@ const trustWeights = {
1983
  "SM": 0.20
1984
  };
1985
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1986
  // MAPPING PERSÉVÉRANCE PAR PROFIL
1987
  const perseveranceProfiles = {
1988
  "Étudiant engagé": {
@@ -2054,16 +2072,6 @@ const perseveranceProfiles = {
2054
  level: "Faible",
2055
  interpretation: "Manque de motivation, efforts sporadiques et peu soutenus",
2056
  color: "#E53935"
2057
- },
2058
- "Étudiant persévérant": {
2059
- level: "Élevée",
2060
- interpretation: "Constance dans l'effort malgré les doutes et difficultés",
2061
- color: "#4CAF50"
2062
- },
2063
- "Étudiant actif": {
2064
- level: "Moyenne",
2065
- interpretation: "Efforts soutenus mais parfois désorganisés ou mal canalisés",
2066
- color: "#FB8C00"
2067
  }
2068
  };
2069
 
@@ -2295,7 +2303,15 @@ function loadScenarios() {
2295
  function tryLoad(pathIndex) {
2296
  if (pathIndex >= possiblePaths.length) {
2297
  console.error("❌ Impossible de charger les scénarios depuis aucun chemin");
2298
- showError("Impossible de charger les scénarios. Vérifiez que le fichier scenarios.json existe.");
 
 
 
 
 
 
 
 
2299
  return;
2300
  }
2301
 
@@ -2309,12 +2325,11 @@ function loadScenarios() {
2309
  })
2310
  .then(data => {
2311
  console.log("✅ Scénarios chargés:", data.scenarios?.length || 0);
2312
- scenarios = data.scenarios || [];
2313
 
2314
  if (scenarios.length === 0) {
2315
  console.warn("Aucun scénario trouvé dans le fichier");
2316
- showError("Aucun scénario trouvé dans le fichier JSON");
2317
- return;
2318
  }
2319
 
2320
  loadScenario(0);
@@ -2329,6 +2344,156 @@ function loadScenarios() {
2329
  tryLoad(0);
2330
  }
2331
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2332
  function showError(message) {
2333
  const manifestList = document.getElementById("manifest-list");
2334
  if (manifestList) {
@@ -2637,6 +2802,61 @@ function drawCompactEnrichedHeatmap(scenario) {
2637
  title: "Autonome et stratégique",
2638
  emoji: "😊",
2639
  pattern: "Travail régulier et équilibré"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2640
  }
2641
  };
2642
 
@@ -2744,7 +2964,7 @@ function generateCompactPersistenceData(scenarioId, totalDays) {
2744
  const data = new Array(totalDays).fill(0);
2745
 
2746
  switch(scenarioId) {
2747
- case 1: // Scénario désorganisé - Effort concentré avant échéances
2748
  for (let i = 0; i < totalDays; i++) {
2749
  const weekday = i % 7;
2750
  if (weekday === 3 || weekday === 4) { // Jeudi et vendredi
@@ -2757,7 +2977,7 @@ function generateCompactPersistenceData(scenarioId, totalDays) {
2757
  }
2758
  break;
2759
 
2760
- case 2: // Scénario peu efficace - Démarrage lent, accélération tardive
2761
  for (let i = 0; i < totalDays; i++) {
2762
  const progress = i / totalDays;
2763
  if (progress < 0.3) {
@@ -2770,7 +2990,7 @@ function generateCompactPersistenceData(scenarioId, totalDays) {
2770
  }
2771
  break;
2772
 
2773
- case 3: // Scénario stratégique - Travail régulier
2774
  for (let i = 0; i < totalDays; i++) {
2775
  const weekday = i % 7;
2776
  if (weekday === 5 || weekday === 6) { // Weekend léger
@@ -2781,6 +3001,85 @@ function generateCompactPersistenceData(scenarioId, totalDays) {
2781
  }
2782
  break;
2783
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2784
  default:
2785
  for (let i = 0; i < totalDays; i++) {
2786
  data[i] = Math.floor(Math.random() * 5); // 0-4 aléatoire
@@ -2818,6 +3117,12 @@ function analyzeCompactPersistenceMetrics(activityData, scenarioId) {
2818
  } else if (weekData[0] < weekAvg * 0.7 && weekData[4] > weekAvg * 1.2) {
2819
  pattern = "Accélération progressive";
2820
  patternDescription = "Démarrage lent, fin forte";
 
 
 
 
 
 
2821
  }
2822
  }
2823
 
 
1700
  </div>
1701
  </div>
1702
 
1703
+ <!-- Colonne droite : Indicateurs de la persistance et du management de l'effort -->
1704
  <div class="compact-heatmap-right">
1705
  <div class="compact-persistence-analysis" id="compact-persistenceAnalysis">
1706
  <h5>🧭 Indicateurs de la gestion du temps et régularité</h5>
 
1721
 
1722
  <div class="compact-persistence-text" style="margin-top: 10px;">
1723
  <div style="margin-bottom: 10px;">
1724
+ <strong>Dynamique temporelle de l'effort :</strong>
1725
  <div style="margin-top: 5px; padding: 8px; background: transparent; border-radius: 6px; font-size: 13px;">
1726
  <span id="compact-patternText">Analyse en cours...</span>
1727
  </div>
 
1983
  "SM": 0.20
1984
  };
1985
 
1986
+ // SCÉNARIOS PAR DÉFAUT (14 profils)
1987
+ const DEFAULT_SCENARIOS = [
1988
+ { id: 1, title: "Étudiant engagé", manifest: { type: "Engagement élevé", manifeste: "Je suis très motivé et j'essaie de faire toutes les activités", description: "Étudiant avec un fort engagement et une régularité dans le travail" } },
1989
+ { id: 2, title: "Étudiant actif mais inefficace", manifest: { type: "Activité désorganisée", manifeste: "Je travaille beaucoup mais je ne vois pas les résultats", description: "Beaucoup d'effort mais peu de résultats concrets" } },
1990
+ { id: 3, title: "Étudiant orienté vers le succès", manifest: { type: "Performance orientée", manifeste: "Je vise l'excellence dans tout ce que je fais", description: "Très orienté vers les résultats et la réussite" } },
1991
+ { id: 4, title: "Étudiant motivé", manifest: { type: "Motivation soutenue", manifeste: "Je suis déterminé à réussir ce cours", description: "Bonne motivation avec des objectifs clairs" } },
1992
+ { id: 5, title: "Étudiant surmotivé", manifest: { type: "Surinvestissement", manifeste: "Je passe trop de temps sur le cours au détriment du reste", description: "Investissement excessif pouvant mener à l'épuisement" } },
1993
+ { id: 6, title: "Étudiant stratégique", manifest: { type: "Approche calculée", manifeste: "Je choisis les activités qui rapportent le plus de points", description: "Approche rationnelle et ciblée de l'apprentissage" } },
1994
+ { id: 7, title: "Étudiant en amélioration", manifest: { type: "Progression constante", manifeste: "Je vois mes progrès semaine après semaine", description: "Évolution positive des compétences et résultats" } },
1995
+ { id: 8, title: "Étudiant en difficulté", manifest: { type: "Difficultés persistantes", manifeste: "J'ai du mal à comprendre malgré mes efforts", description: "Rencontre des obstacles d'apprentissage importants" } },
1996
+ { id: 9, title: "Étudiant évitant l'échec", manifest: { type: "Évitement", manifeste: "J'ai peur de me tromper donc je ne tente pas", description: "Anxiété face à l'échec limitant les tentatives" } },
1997
+ { id: 10, title: "Étudiant à risque", manifest: { type: "Risque d'abandon", manifeste: "Je pense abandonner le cours", description: "Très faible engagement et motivation" } },
1998
+ { id: 11, title: "Étudiant en progression", manifest: { type: "Amélioration technique", manifeste: "Mes compétences techniques s'améliorent régulièrement", description: "Développement progressif des compétences techniques" } },
1999
+ { id: 12, title: "Étudiant acceptant l'échec", manifest: { type: "Résilience", manifeste: "Je vois l'échec comme une opportunité d'apprendre", description: "Attitude positive face aux erreurs et échecs" } },
2000
+ { id: 13, title: "Étudiant inactif", manifest: { type: "Inactivité", manifeste: "Je ne trouve pas la motivation pour commencer", description: "Très faible participation et engagement" } },
2001
+ { id: 14, title: "Étudiant non engagé", manifest: { type: "Désengagement", manifeste: "Ce cours ne m'intéresse pas vraiment", description: "Manque d'intérêt et d'implication" } }
2002
+ ];
2003
+
2004
  // MAPPING PERSÉVÉRANCE PAR PROFIL
2005
  const perseveranceProfiles = {
2006
  "Étudiant engagé": {
 
2072
  level: "Faible",
2073
  interpretation: "Manque de motivation, efforts sporadiques et peu soutenus",
2074
  color: "#E53935"
 
 
 
 
 
 
 
 
 
 
2075
  }
2076
  };
2077
 
 
2303
  function tryLoad(pathIndex) {
2304
  if (pathIndex >= possiblePaths.length) {
2305
  console.error("❌ Impossible de charger les scénarios depuis aucun chemin");
2306
+ console.log("Utilisation des scénarios par défaut (14 profils)");
2307
+ scenarios = generateDefaultScenarios();
2308
+
2309
+ if (scenarios.length === 0) {
2310
+ showError("Impossible de charger les scénarios.");
2311
+ return;
2312
+ }
2313
+
2314
+ loadScenario(0);
2315
  return;
2316
  }
2317
 
 
2325
  })
2326
  .then(data => {
2327
  console.log("✅ Scénarios chargés:", data.scenarios?.length || 0);
2328
+ scenarios = data.scenarios || generateDefaultScenarios();
2329
 
2330
  if (scenarios.length === 0) {
2331
  console.warn("Aucun scénario trouvé dans le fichier");
2332
+ scenarios = generateDefaultScenarios();
 
2333
  }
2334
 
2335
  loadScenario(0);
 
2344
  tryLoad(0);
2345
  }
2346
 
2347
+ // Générer les scénarios par défaut
2348
+ function generateDefaultScenarios() {
2349
+ console.log("Génération des 14 scénarios par défaut");
2350
+
2351
+ const defaultScenarios = [...DEFAULT_SCENARIOS];
2352
+
2353
+ // Ajouter des données complètes à chaque scénario
2354
+ defaultScenarios.forEach((scenario, index) => {
2355
+ // Compétences aléatoires
2356
+ scenario.competences = generateRandomCompetences(14);
2357
+
2358
+ // Données radar spécifiques au profil
2359
+ scenario.radar = generateProfileRadarData(scenario.title);
2360
+
2361
+ // Message ReflAgent spécifique
2362
+ scenario.reflAgent = generateReflAgentMessage(scenario.title);
2363
+
2364
+ // Niveau de risque selon le profil
2365
+ scenario.risk = calculateRiskLevel(scenario.title);
2366
+ });
2367
+
2368
+ return defaultScenarios;
2369
+ }
2370
+
2371
+ // Générer des compétences aléatoires
2372
+ function generateRandomCompetences(count) {
2373
+ const competenceLabels = [
2374
+ "Analyse de texte", "Rédaction académique", "Recherche documentaire",
2375
+ "Présentation orale", "Travail collaboratif", "Gestion du temps",
2376
+ "Résolution de problèmes", "Pensée critique", "Communication écrite",
2377
+ "Organisation personnelle", "Auto-évaluation", "Utilisation des TICE",
2378
+ "Métacognition", "Adaptabilité"
2379
+ ];
2380
+
2381
+ const competences = [];
2382
+ for (let i = 0; i < count; i++) {
2383
+ const labelIndex = i % competenceLabels.length;
2384
+ // Valeur aléatoire entre 30 et 95 selon l'index
2385
+ const value = 30 + Math.floor(Math.random() * 65);
2386
+ competences.push({
2387
+ label: competenceLabels[labelIndex],
2388
+ value: value
2389
+ });
2390
+ }
2391
+
2392
+ return competences;
2393
+ }
2394
+
2395
+ // Générer des données radar selon le profil
2396
+ function generateProfileRadarData(profileTitle) {
2397
+ let baseValues;
2398
+
2399
+ switch(profileTitle) {
2400
+ case "Étudiant engagé":
2401
+ baseValues = [85, 72, 68, 35, 74, 80, 78];
2402
+ break;
2403
+ case "Étudiant actif mais inefficace":
2404
+ baseValues = [90, 65, 60, 60, 70, 85, 65];
2405
+ break;
2406
+ case "Étudiant orienté vers le succès":
2407
+ baseValues = [90, 85, 80, 25, 90, 75, 85];
2408
+ break;
2409
+ case "Étudiant motivé":
2410
+ baseValues = [65, 70, 65, 45, 60, 70, 68];
2411
+ break;
2412
+ case "Étudiant surmotivé":
2413
+ baseValues = [95, 80, 75, 20, 88, 98, 82];
2414
+ break;
2415
+ case "Étudiant stratégique":
2416
+ baseValues = [70, 78, 72, 40, 75, 55, 80];
2417
+ break;
2418
+ case "Étudiant en amélioration":
2419
+ baseValues = [70, 68, 65, 50, 68, 72, 70];
2420
+ break;
2421
+ case "Étudiant en difficulté":
2422
+ baseValues = [72, 60, 55, 70, 65, 85, 58];
2423
+ break;
2424
+ case "Étudiant évitant l'échec":
2425
+ baseValues = [35, 40, 38, 80, 30, 45, 40];
2426
+ break;
2427
+ case "Étudiant à risque":
2428
+ baseValues = [75, 60, 55, 65, 55, 70, 58];
2429
+ break;
2430
+ case "Étudiant en progression":
2431
+ baseValues = [70, 78, 75, 45, 68, 65, 78];
2432
+ break;
2433
+ case "Étudiant acceptant l'échec":
2434
+ baseValues = [85, 70, 68, 55, 58, 62, 72];
2435
+ break;
2436
+ case "Étudiant inactif":
2437
+ baseValues = [15, 20, 18, 90, 10, 25, 22];
2438
+ break;
2439
+ case "Étudiant non engagé":
2440
+ baseValues = [30, 35, 32, 75, 25, 40, 38];
2441
+ break;
2442
+ default:
2443
+ baseValues = [70, 65, 62, 50, 65, 70, 68];
2444
+ }
2445
+
2446
+ // Ajouter une légère variation
2447
+ return DEFAULT_RADAR_METRICS.map((metric, index) => ({
2448
+ label: metric.label,
2449
+ value: Math.max(10, Math.min(100, baseValues[index] + (Math.random() * 10 - 5)))
2450
+ }));
2451
+ }
2452
+
2453
+ // Générer un message ReflAgent selon le profil
2454
+ function generateReflAgentMessage(profileTitle) {
2455
+ const messages = {
2456
+ "Étudiant engagé": "Félicitations ! Ton engagement est remarquable. Continue sur cette lancée en maintenant ta régularité de travail.",
2457
+ "Étudiant actif mais inefficace": "Tu travailles beaucoup, mais l'efficacité pourrait être améliorée. Concentre-toi sur la qualité plutôt que la quantité.",
2458
+ "Étudiant orienté vers le succès": "Ton orientation vers la réussite est excellente. N'oublie pas que l'apprentissage est aussi important que les résultats.",
2459
+ "Étudiant motivé": "Ta motivation est un atout précieux. Structure ton travail pour transformer cette motivation en résultats concrets.",
2460
+ "Étudiant surmotivé": "Attention au surinvestissement. Un équilibre est nécessaire pour éviter l'épuisement. Priorise les activités essentielles.",
2461
+ "Étudiant stratégique": "Ton approche stratégique est intelligente. Assure-toi de ne pas négliger les compétences transversales importantes.",
2462
+ "Étudiant en amélioration": "Tes progrès sont visibles ! Continue à travailler régulièrement pour consolider ces améliorations.",
2463
+ "Étudiant en difficulté": "Tu rencontres des difficultés, mais ne baisse pas les bras. Demande de l'aide et concentre-toi sur les bases.",
2464
+ "Étudiant évitant l'échec": "La peur de l'échec peut être paralysante. Rappelle-toi que l'erreur fait partie de l'apprentissage.",
2465
+ "Étudiant à risque": "Ton engagement est fragile. Commence par de petits objectifs réalisables pour reprendre confiance.",
2466
+ "Étudiant en progression": "Tes compétences techniques s'améliorent bien. Maintenant, travaille sur leur application dans des contextes variés.",
2467
+ "Étudiant acceptant l'échec": "Ton attitude face à l'échec est constructive. Utilise ces expériences pour identifier tes points d'amélioration.",
2468
+ "Étudiant inactif": "Le premier pas est le plus difficile. Choisis une seule activité simple pour commencer, sans pression.",
2469
+ "Étudiant non engagé": "Il est normal de manquer d'intérêt parfois. Cherche un aspect du cours qui pourrait te motiver davantage."
2470
+ };
2471
+
2472
+ return messages[profileTitle] || "Analyse de votre profil d'apprentissage en cours...";
2473
+ }
2474
+
2475
+ // Calculer le niveau de risque selon le profil
2476
+ function calculateRiskLevel(profileTitle) {
2477
+ const riskLevels = {
2478
+ "Étudiant engagé": 20,
2479
+ "Étudiant actif mais inefficace": 50,
2480
+ "Étudiant orienté vers le succès": 25,
2481
+ "Étudiant motivé": 30,
2482
+ "Étudiant surmotivé": 40,
2483
+ "Étudiant stratégique": 35,
2484
+ "Étudiant en amélioration": 45,
2485
+ "Étudiant en difficulté": 70,
2486
+ "Étudiant évitant l'échec": 65,
2487
+ "Étudiant à risque": 85,
2488
+ "Étudiant en progression": 40,
2489
+ "Étudiant acceptant l'échec": 55,
2490
+ "Étudiant inactif": 90,
2491
+ "Étudiant non engagé": 75
2492
+ };
2493
+
2494
+ return riskLevels[profileTitle] || 50;
2495
+ }
2496
+
2497
  function showError(message) {
2498
  const manifestList = document.getElementById("manifest-list");
2499
  if (manifestList) {
 
2802
  title: "Autonome et stratégique",
2803
  emoji: "😊",
2804
  pattern: "Travail régulier et équilibré"
2805
+ },
2806
+ 4: {
2807
+ title: "Motivé et constant",
2808
+ emoji: "👍",
2809
+ pattern: "Rythme régulier toute la semaine"
2810
+ },
2811
+ 5: {
2812
+ title: "Surinvestissement",
2813
+ emoji: "🔥",
2814
+ pattern: "Activité intense, risque de surcharge"
2815
+ },
2816
+ 6: {
2817
+ title: "Stratégique et ciblé",
2818
+ emoji: "🎯",
2819
+ pattern: "Efforts concentrés sur les priorités"
2820
+ },
2821
+ 7: {
2822
+ title: "Amélioration continue",
2823
+ emoji: "📈",
2824
+ pattern: "Progression visible semaine après semaine"
2825
+ },
2826
+ 8: {
2827
+ title: "Difficultés persistantes",
2828
+ emoji: "😔",
2829
+ pattern: "Efforts dispersés, peu de régularité"
2830
+ },
2831
+ 9: {
2832
+ title: "Évitement",
2833
+ emoji: "😨",
2834
+ pattern: "Activité minimale, pics sporadiques"
2835
+ },
2836
+ 10: {
2837
+ title: "Risque d'abandon",
2838
+ emoji: "⚠️",
2839
+ pattern: "Très faible activité, irrégularité totale"
2840
+ },
2841
+ 11: {
2842
+ title: "Progression technique",
2843
+ emoji: "🔧",
2844
+ pattern: "Amélioration régulière des compétences"
2845
+ },
2846
+ 12: {
2847
+ title: "Résilience",
2848
+ emoji: "💪",
2849
+ pattern: "Persévérance malgré les difficultés"
2850
+ },
2851
+ 13: {
2852
+ title: "Inactivité",
2853
+ emoji: "😴",
2854
+ pattern: "Très peu d'activité détectée"
2855
+ },
2856
+ 14: {
2857
+ title: "Désengagement",
2858
+ emoji: "😑",
2859
+ pattern: "Activité sporadique et décroissante"
2860
  }
2861
  };
2862
 
 
2964
  const data = new Array(totalDays).fill(0);
2965
 
2966
  switch(scenarioId) {
2967
+ case 1: // Étudiant engagé - Effort concentré avant échéances
2968
  for (let i = 0; i < totalDays; i++) {
2969
  const weekday = i % 7;
2970
  if (weekday === 3 || weekday === 4) { // Jeudi et vendredi
 
2977
  }
2978
  break;
2979
 
2980
+ case 2: // Étudiant actif mais inefficace - Démarrage lent, accélération tardive
2981
  for (let i = 0; i < totalDays; i++) {
2982
  const progress = i / totalDays;
2983
  if (progress < 0.3) {
 
2990
  }
2991
  break;
2992
 
2993
+ case 3: // Étudiant orienté vers le succès - Travail régulier
2994
  for (let i = 0; i < totalDays; i++) {
2995
  const weekday = i % 7;
2996
  if (weekday === 5 || weekday === 6) { // Weekend léger
 
3001
  }
3002
  break;
3003
 
3004
+ case 4: // Étudiant motivé - Rythme constant
3005
+ for (let i = 0; i < totalDays; i++) {
3006
+ const weekday = i % 7;
3007
+ if (weekday === 5 || weekday === 6) { // Weekend modéré
3008
+ data[i] = Math.floor(Math.random() * 2) + 1; // 1-2
3009
+ } else {
3010
+ data[i] = Math.floor(Math.random() * 2) + 2; // 2-3
3011
+ }
3012
+ }
3013
+ break;
3014
+
3015
+ case 5: // Étudiant surmotivé - Activité intense
3016
+ for (let i = 0; i < totalDays; i++) {
3017
+ data[i] = Math.floor(Math.random() * 2) + 3; // 3-4
3018
+ }
3019
+ break;
3020
+
3021
+ case 6: // Étudiant stratégique - Efforts ciblés
3022
+ for (let i = 0; i < totalDays; i++) {
3023
+ const weekday = i % 7;
3024
+ if (weekday === 1 || weekday === 3) { // Mardi et jeudi
3025
+ data[i] = Math.floor(Math.random() * 2) + 3; // 3-4
3026
+ } else {
3027
+ data[i] = Math.floor(Math.random() * 2) + 1; // 1-2
3028
+ }
3029
+ }
3030
+ break;
3031
+
3032
+ case 7: // Étudiant en amélioration - Progression
3033
+ for (let i = 0; i < totalDays; i++) {
3034
+ const progress = i / totalDays;
3035
+ data[i] = Math.floor(progress * 3) + 1; // 1-4 progressif
3036
+ }
3037
+ break;
3038
+
3039
+ case 8: // Étudiant en difficulté - Irrégulier
3040
+ for (let i = 0; i < totalDays; i++) {
3041
+ data[i] = Math.random() > 0.6 ? Math.floor(Math.random() * 2) + 1 : 0;
3042
+ }
3043
+ break;
3044
+
3045
+ case 9: // Étudiant évitant l'échec - Minimal
3046
+ for (let i = 0; i < totalDays; i++) {
3047
+ data[i] = Math.random() > 0.7 ? 1 : 0;
3048
+ }
3049
+ break;
3050
+
3051
+ case 10: // Étudiant à risque - Très irrégulier
3052
+ for (let i = 0; i < totalDays; i++) {
3053
+ data[i] = Math.random() > 0.8 ? 1 : 0;
3054
+ }
3055
+ break;
3056
+
3057
+ case 11: // Étudiant en progression - Amélioration constante
3058
+ for (let i = 0; i < totalDays; i++) {
3059
+ const base = Math.floor(i / 7);
3060
+ data[i] = Math.min(4, base + Math.floor(Math.random() * 2));
3061
+ }
3062
+ break;
3063
+
3064
+ case 12: // Étudiant acceptant l'échec - Résilient
3065
+ for (let i = 0; i < totalDays; i++) {
3066
+ data[i] = Math.floor(Math.random() * 3) + 1; // 1-3
3067
+ }
3068
+ break;
3069
+
3070
+ case 13: // Étudiant inactif - Très faible
3071
+ for (let i = 0; i < totalDays; i++) {
3072
+ data[i] = Math.random() > 0.9 ? 1 : 0;
3073
+ }
3074
+ break;
3075
+
3076
+ case 14: // Étudiant non engagé - Décroissant
3077
+ for (let i = 0; i < totalDays; i++) {
3078
+ const progress = i / totalDays;
3079
+ data[i] = Math.random() > (0.3 + progress * 0.5) ? Math.floor(Math.random() * 2) : 0;
3080
+ }
3081
+ break;
3082
+
3083
  default:
3084
  for (let i = 0; i < totalDays; i++) {
3085
  data[i] = Math.floor(Math.random() * 5); // 0-4 aléatoire
 
3117
  } else if (weekData[0] < weekAvg * 0.7 && weekData[4] > weekAvg * 1.2) {
3118
  pattern = "Accélération progressive";
3119
  patternDescription = "Démarrage lent, fin forte";
3120
+ } else if (weekData[5] > weekAvg * 1.3 && weekData[6] > weekAvg * 1.3) {
3121
+ pattern = "Travail weekend";
3122
+ patternDescription = "Activité principalement le weekend";
3123
+ } else if (weekAvg < 1) {
3124
+ pattern = "Très faible";
3125
+ patternDescription = "Activité minimale toute la semaine";
3126
  }
3127
  }
3128