From d64a78eeca9bdef94156b1bfb5fabd9a8339991e Mon Sep 17 00:00:00 2001
From: Myriam Delaruelle <myriam.delaruelle@univ-lorraine.fr>
Date: Thu, 16 Jan 2025 10:10:34 +0100
Subject: [PATCH] Cleaned php

---
 amd/build/suivi.js |  71 ++++++++++++++++++------
 suivi_unit.php     | 133 ++++++++++++++++++++++-----------------------
 2 files changed, 118 insertions(+), 86 deletions(-)

diff --git a/amd/build/suivi.js b/amd/build/suivi.js
index 7dff6ca..e7b5205 100644
--- a/amd/build/suivi.js
+++ b/amd/build/suivi.js
@@ -38,6 +38,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
        		
        		registerSubmit:function(infos){
        			data=infos;
+       			console.log(infos);
        			$("#id_submit_iena").on('click', function(e){
 	    			triggerAction(e);
 	    		});
@@ -96,14 +97,10 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 		        });
 		    },
 		    initTable:function(){
-		    	initActivityFilter(false);
-		    	displayTotalActivitiesFilter(false);
-		    	displayTotalGroupsFilter(false);
-        		displayActivities(false);
-        		initGroupFilter(false);
-        		registerGroupFilter();
-        		changeSection(false);
-        		reloadTable(data);
+		    	data=fetchProgress();
+		    	
+        		
+        		
 
 		    }
        		
@@ -112,6 +109,32 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
        		
        	}
 
+    function fetchProgress(){
+    	completeUrl=getCompleteUrl();
+    	console.log(completeUrl);
+    	$.ajax({ url: completeUrl,
+        	data: {action: 'fetchprogress'},
+        	type: 'post',
+        	success: function(request) { 
+        		
+        		data=calcPercentage(JSON.parse(request));
+        		if(data.students.length<1000){
+        			
+        			//localStorage.setItem("groups",request);
+        		}
+        		initActivityFilter(false);
+		    	displayTotalActivitiesFilter(false);
+		    	displayTotalGroupsFilter(false);
+        		displayActivities(false);
+        		initGroupFilter(false);
+        		registerGroupFilter();
+        		changeSection(false);
+        		reloadTable(data);
+        		//displayTotalGroupsFilter(false);
+        		return data;
+			}
+		});
+    }
     function initHeaders(){
 
     	var nb_counts=$(".th-rotate").length;
@@ -149,6 +172,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     	for (var i = 0; i < groupscheckboxes.length; i++) {
     		groupsid.push(groupscheckboxes[i].value);
     	}
+    	console.log(groupsid);
     	loadMessage("loading");
     	if(groupsid.length==0){
     		groupsid.push(-2);
@@ -170,7 +194,8 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 		});
     }
 
-  
+
+  	//Affiche ou non (dynamiquement, pas de requête) les étudiants selon le filtre d'achèvement
     function changeCompletion(changefilter=true){
     	symbol=$("#symbol-select").val();
     	filter=$("#filter-select").val();
@@ -240,6 +265,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     	loadMessage("loading");
     	sectionid=$("#section-select").val();
     	data.count_results=0;
+    	//Si les modules font partie de la section on les affiche, et on affiche également le progrès de ces modules
     	for(var i = 0; i<data.modules.length; i++){
     		if(data.modules[i].section == sectionid || sectionid == 0){
     			data.modules[i].visible=true;
@@ -282,6 +308,8 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
         checkAllActivitiesFilter();
     }
 
+
+    //Affiche/cache dynamiquement les activités sélectionnées
     function displayActivities(changefilter=true){
         var arrayActivitiesID=[];
         var activitiesToStore=[];
@@ -302,8 +330,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
                     data.students[j].progress.find(progress => progress.idmodule === activities[i].value).visible=false;
                 }
             }
-           
-          
         }
         if(data.students.length<1000){
         	localStorage.setItem("activities",JSON.stringify(activitiesToStore));
@@ -316,7 +342,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     }
 
 
-
+    //Charge message de chargement ou d'erreur
     function loadMessage(type){
     	if(type=="loading"){
     		var message = str.get_string('loadingResults', 'format_iena');
@@ -331,8 +357,9 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 		});	
     }
 
-    //Reload table with nex parameters.
+    //Reload table with new parameters.
     function reloadTable(params){
+    	console.log("on est dans le reloadTable")
     	url=getCompleteUrl();
     	templates.render('format_iena/suivi-table', params)
      	.done(function(html, js){
@@ -349,7 +376,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 
 
 
-
+    //Récupère les étudiants sélectionnées par les checkbox
 	function getSelectedStudents(){
 		var selectedChecks=$("#table-body input:checked");
 		var students=[];
@@ -520,6 +547,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 
 
 	//Pour chaque module non caché, on va regarder pour chaque étudiant 
+	//Calcule le pourcentage pour les modules VISIBLES ?
 	function calcPercentage(data){
 		for (var i = 0; i < data.students.length; i++) {
 			data.students[i].percentage=0;
@@ -603,8 +631,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
             
 
         }
-        //displayTotalActivitiesFilter();
-        //displayActivities();
     }
 
     //Coche toutes les activités quand on change de section
@@ -627,7 +653,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
                 $('.selectallgroups').prop('checked', false);
             }
             displayTotalActivitiesFilter();
-            //displayActivities();
         });
 
         
@@ -663,7 +688,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
         	
         }
         displayTotalActivitiesFilter();
-        //displayActivities();
     }
 
     //Coche tous les groupes quand le select all est coché
@@ -695,5 +719,16 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
   
 
 
+
+    /*Etapes 
+    Premier chargement :
+    - On initialise les filtres (on les register)
+    - On a chargé les données en même temps (avec ces filtres par défaut)
+    - On affiche/cache les modules selon la section
+	- On calcule le pourcentage selon les modules VISIBLES
+	- On affiche/cache les étudiants selon le % d'achèvement
+	*/
+
+
   
 });
diff --git a/suivi_unit.php b/suivi_unit.php
index 2ac9449..b5c3bb9 100644
--- a/suivi_unit.php
+++ b/suivi_unit.php
@@ -23,7 +23,7 @@
 
 define('NO_OUTPUT_BUFFERING', true);
 require_once('../../../config.php');
-require_once('view/view_param_indicateur.php');
+//require_once('view/view_param_indicateur.php');
 require_once('entity/course_format_iena_section_ressources.php');
 require_once('entity/course_format_iena_sections.php');
 require_once('entity/course_format_iena_groups.php');
@@ -65,16 +65,6 @@ function get_groups($context, $activegroupids, $groups) {
     $currentusergroupsids = groups_get_user_groups($COURSE->id, $USER->id)[0];
     $currentusergroups = [];
     $othergroups = [];
-    // Si pas de groupe dans le get ou groupe 0 (tous) mais pas le droit => premier groupe existant du user ou groupe 0 (tous).
-    
-    /*if ($activegroupid == null || ($activegroupid == 0 &&
-        !has_capability('course/iena:suivi_edit', $context, $USER->id)) ) {
-        if ( count($currentusergroupsids) == 0 ) {
-            $activegroupid = 0;
-        } else {
-            $activegroupid = $currentusergroupsids[0];
-        }
-    }*/
 
     // Groupes du cours avec id, nom et liste des id utilisateur de tous les
     // membres (3 clefs d'un tableau de groupes : id, name, member).
@@ -82,11 +72,7 @@ function get_groups($context, $activegroupids, $groups) {
     $activegroupname = "";
 
     foreach ($groups as $group) {
-        // Récupération du nom du group actif au passage.
-        /*if ( $group->id == $activegroupid ) {
-            $activegroupname = $group->name;
-            $group->selected = 'selected';
-        }*/
+        // Récupération des groupes dont fait partie l'utilisateur
         if (in_array($group->id, $currentusergroupsids)) {
             $currentusergroups[] = $group;
         } else {
@@ -106,6 +92,7 @@ function get_groups($context, $activegroupids, $groups) {
 function format_progress($progress, $modules, $groups, $activegroupids, $activesectionid) {
     global $CFG, $COURSE;
     $students = array();
+
     foreach ($progress as $proginfo) {
         $progressstudent = new StdClass();
         $progressstudent->firstname = $proginfo->firstname;
@@ -146,10 +133,6 @@ function format_progress($progress, $modules, $groups, $activegroupids, $actives
 
             $progressstudent->progress[$key] = $moduleprogress;
         }
-        //On a les données de tous les étudiants, c'est ici qu'on filtre selon le groupe actif - DEPRECATED
-        /*if ($activegroupid == 0 || ($activegroupid>0 && in_array($activegroupid, $progressstudent->groupsid))) {
-            $students[] = $progressstudent;
-        }*/
         $students[] = $progressstudent;
         
     }
@@ -232,17 +215,18 @@ function set_filters($data, $filters, $symbols, $sections, $groups, $currentuser
     return $data;
 }
 
-function set_data($data, $modules, $progress, $groups, $activegroupsids, $activesectionid, $listoptions) {
+//
+function set_data($data, $modules, $groups, $activegroupsids, $activesectionid, $listoptions) {
     global $COURSE, $USER, $CFG;
 
     $data["modules"] = $modules;;
     $countmodules = count($data["modules"]);
 
-    $data["students"] = format_progress($progress, $modules, $groups, $activegroupsids, $activesectionid);
-    $countstudents = count($data["students"]);
-
+    //$data["students"] = format_progress($progress, $modules, $groups, $activegroupsids, $activesectionid);
+    //$countstudents = count($data["students"]);
+    
     if ($countstudents > 0 && $countmodules > 0) {
-        $data['count_results'] = count($data["students"]);
+        $data['count_results'] = $countstudents;
     }
 
     if (has_capability('course/iena:suivi_edit', $context = context_course::instance($COURSE->id), $USER->id)) {
@@ -257,16 +241,51 @@ function set_data($data, $modules, $progress, $groups, $activegroupsids, $active
     if($listoptions->listoptions['display_details']["value"]){
         $data["display_details"]=1;
     }
-
-    // Pour le téléchargement du tableau ?
+  
+    // Pas que pour le téléchargement du tableau, partie à optimiser
     if (!isset($data['data'])) {
         $data['data'] = array();
     }
 
-    $data['data'] = json_encode($data);
+    //$data['data'] = json_encode($data);
     return $data;
 }
 
+function get_progress_students($modules, $progress, $groups, $activegroupsids, $activesectionid, $courseid, $cache, $completion){
+   
+
+    //Si le progrès de chacun des groupes existe déjà en cache on va les charger, sinon on les récupère dans la BDD et on les stocke
+    $arrayprogress=array();
+    for($i=0; $i<count($activegroupsids); $i++){
+        if($cache->get($courseid."-".$activegroupsids[$i]) !== false){
+            $progress=$cache->get($courseid."-".$activegroupsids[$i]);
+            
+        }
+        else{
+            error_log("pas dans le cache");
+            //On récupère le progrès des étudiants qui font partie des groupes activegroupsids
+            $progressrequest = $completion->get_progress_all(
+                '',
+                array(),
+                $activegroupsids[$i],
+                'u.lastname ASC, u.firstname ASC',
+                '',
+                '',
+                $context
+            );  
+            //On active le cache seulement s'il y a plus de x étudiants
+            if($countstudents<1000){
+                $cache->set($courseid."-".$activegroupsids[$i], $progressrequest);
+            }
+            $progress=$progressrequest;
+
+        }
+
+         $arrayprogress=(object) array_unique(array_merge((array) $arrayprogress, (array) $progress), SORT_REGULAR);
+    }
+        return format_progress($arrayprogress, $modules, $groups, $activegroupsids, $activesectionid);
+}
+
 $filters = [
     "0" => (object)[
         "value" => "0",
@@ -316,7 +335,7 @@ $symbols = [
 //On s'occupe des options ici
 
 
-
+$cache = cache::make('format_iena', 'students');
 $courseid = required_param('courseid', PARAM_INT);
 // Define the url of the view.
 $url = new moodle_url('/course/format/iena/suivi_unit.php', array('courseid' => $courseid));
@@ -329,6 +348,8 @@ require_once($CFG->libdir . '/completionlib.php');
 $completion = new completion_info($course);
 $context = context_course::instance($COURSE->id);
 
+
+//On récupère les options du tableau de suivi : affichage du groupe, modale détails....
 $listoptions=new \format_iena\output\course_format_iena_table_option();
 $listoptions->setCourseid($courseid);
 $listoptions->get_request_options();
@@ -340,12 +361,15 @@ if (!has_capability('course/iena:suivi', $context = context_course::instance($co
 }
 
 
-
 $countstudents=count_enrolled_users($context);
+
+//Si on a sélectionné des groupes dans les filtres
 if (isset($_POST['groupsid'])) {
+    
     $activegroupsids = $_POST['groupsid'];
 } else {
     if($countstudents>1000){
+
         $activegroupsids = array();
     }
     else{
@@ -355,32 +379,8 @@ if (isset($_POST['groupsid'])) {
 }
 
 
-$cache = cache::make('format_iena', 'students');
 
-//Si le progrès de chacun des groupes existe déjà en cache on va les charger, sinon on les récupère dans la BDD et on les stocke
-$arrayprogress=array();
-for($i=0; $i<count($activegroupsids); $i++){
-    if($cache->get($courseid."-".$activegroupsids[$i]) !== false){
-        $progress=$cache->get($courseid."-".$activegroupsids[$i]);
-    }
-    else{
-        $progressrequest = $completion->get_progress_all(
-            '',
-            array(),
-            $activegroupsids[$i],
-            'u.lastname ASC, u.firstname ASC',
-            '',
-            '',
-            $context
-        );  
-        //On active le cache seulement s'il y a plus de x étudiants
-        if($countstudents<1000){
-            $cache->set($courseid."-".$activegroupsids[$i], $progressrequest);
-        }
-        $progress=$progressrequest;
-    }
-     $arrayprogress=(object) array_unique(array_merge((array) $arrayprogress, (array) $progress), SORT_REGULAR);
-}
+
 
 
 $activesectionid = 0;
@@ -408,8 +408,6 @@ if (isset($_POST['action']) && $_POST['action'] == "details") {
     $activitydates = \core\activity_dates::get_dates_for_module($cm, $idetu);
 
     $activityinfo = new \core_course\output\activity_information($cm, $completiondetails, $activitydates);
-    //$activity = $activityinfo->export_for_template($renderer);
-
     $activityhtml=$renderer->render_activity_information($activityinfo);
     $gradesobject=array();
     try{
@@ -431,9 +429,7 @@ if (isset($_POST['action']) && $_POST['action'] == "details") {
         if(isset($gradesobject->items[0]->gradepass)){
             $lastgrade["passgrade"]=number_format($gradesobject->items[0]->gradepass, 2, ',', ''); 
         }
-        else{
-           
-        }
+
         /*$lastgrade["passgrade"]=$gradesobject->items[0]->gradepass ? number_format($gradesobject->items[0]->gradepass, 2, ',', '') : null;*/
       
     }
@@ -447,6 +443,7 @@ if (isset($_POST['action']) && $_POST['action'] == "details") {
     $data["grades"]=$lastgrade;
     $data["customcompletion"]=$cm->customdata;
     $data["completioninfos"]=$activityhtml;
+    //Récupère le pourcentage de complétion total
     $data["completionstate"]=$completiondetails->get_overall_completion();
     $data["completiondetails"] = $completiondetails;
     $data["activityname"]=$cm->name;
@@ -456,20 +453,20 @@ if (isset($_POST['action']) && $_POST['action'] == "details") {
 } 
 // If a post is sent trought the page --> Si on change les filtres (de groupes), le template est appelé en JS
 else if (isset($_POST['action']) && !empty($_POST['action'])) {
-    // Si on change les filtres.
     $data = [];
     $modules = get_activities($completion, $activesectionid);
-    
-    $data = set_data($data, $modules, $arrayprogress, $groups, $activegroupsids, $activesectionid, $listoptions);
-    
+    $data["students"]=get_progress_students($modules, $arrayprogress, $groups, $activegroupsids, $activesectionid, $courseid, $cache, $completion);
+    $data["modules"]=$modules;
+    $data["countstudents"]=count($data["students"]);
     echo json_encode($data);
-} else {
+} 
 
+else {
     init_page($course, $PAGE);
     echo $OUTPUT->header();
 
     //$progress=$cache->get($activegroupids);
-    $progress=$arrayprogress;
+    
     $data = [];
     //Si la complétion du cours n'est pas activée on redirige l'enseignant vers l'interface pour l'activer
     if(!$COURSE->enablecompletion){
@@ -491,9 +488,9 @@ else if (isset($_POST['action']) && !empty($_POST['action'])) {
         }
         //$groups = $groupsall->groups;
         $sections = get_sections($activesectionid);
-        $data["countstudents"]=$countstudents;
+        //$data["countstudents"]=$countstudents;
         $data = set_filters($data, $filters, $symbols, $sections, array_values($groups), $groupsall->current_user_groups, $groupsall->othergroups, $activesectionid);
-        $data = set_data($data, $modules, $arrayprogress, $groups, $activegroupsids, $activesectionid, $listoptions);
+        $data = set_data($data, $modules, $groups, $activegroupsids, $activesectionid, $listoptions);
         
         if (isset($_GET["msg_success"])) {
             $msg = $_GET["msg_success"];
-- 
GitLab