diff --git a/amd/build/suivi.js b/amd/build/suivi.js
index 7878e86d39a63129e4fb53f72887fe88814de84c..a98f7f95b6edc397f7e857e5980b503f87f4d877 100644
--- a/amd/build/suivi.js
+++ b/amd/build/suivi.js
@@ -77,11 +77,26 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 		        });
 		        //initActivityFilter();
 		    },
+		    registerSelectAllGroupsFilter:function(){
+		    	$('.selectallgroups').click(function() {
+		            if ($(".selectallgroups").is(':checked')) {
+		                checkAllGroupsFilter();
+		            } else {
+		                $('.group-option').prop('checked', false);
+		                var message=str.get_string('selectedActivities', 'format_iena');
+		                $.when(message).done(function(localizedEditString) {
+		                    $(".group-dropdown-text").html('0 '+localizedEditString);
+		                }); 
+		            changeGroup();
+		            }
+		        });
+		    },
 		    initTable:function(){
 		    	initActivityFilter(false);
 		    	displayTotalActivitiesFilter(false);
         		displayActivities(false);
-        		initGroupFilter(false)
+        		initGroupFilter(false);
+        		registerGroupFilter();
         		changeSection(false);
         		reloadTable(data);
 
@@ -131,16 +146,21 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     }
 
     function changeGroup(){
-    	completeUrl=getCompleteUrl();
+    	var completeUrl=getCompleteUrl();
+    	var groupscheckboxes= $('input[name="groupoptions[]"]:checked');
+    	var groupsid=[];
+    	for (var i = 0; i < groupscheckboxes.length; i++) {
+    		groupsid.push(groupscheckboxes[i].value);
+    	}
     	loadMessage("loading");
     	
     	$.ajax({ url: completeUrl,
-        	data: {action: 'test'},
+        	data: {action: 'fetchgroups', groupsid:groupsid},
         	type: 'post',
         	success: function(request) { 
-        		console.log(request);
+        	
         		data=calcPercentage(JSON.parse(request));
-        		initGroupFilter();
+        		//initGroupFilter();
         		changeSection();
 			}
 		});
@@ -511,25 +531,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 		return data;
 	}
 
-    //Evenement pour le selectall : créé une seule fois au chargement de la page
-    /*function registerSelectAllActivitiesFilter(){
-        $('.selectall').click(function() {
-            if ($(".selectall").is(':checked')) {
-                checkAllActivitiesFilter();
-                displayActivities();
-            } else {
-                $('.option').prop('checked', false);
-                var message=str.get_string('selectedActivities', 'format_iena');
-                $.when(message).done(function(localizedEditString) {
-                    $(".dropdown-text").html('0 '+localizedEditString);
-                }); 
-                $(".select-text").html(' Select');
-                displayActivities();
-            }
-        });
-        initActivityFilter();
-    }*/
-
 
     //On va recharger dynamiquement les options donc on doit recréer les événements à chaque fois qu'on change de section
     function registerActivityFilter(){
@@ -614,12 +615,9 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
              var a = $("input[type='checkbox'].justone-group");
             if(a.length == a.filter(":checked").length){
                 $('.selectallgroups').prop('checked', true);
-                $(".select-text").html(' Deselect');
             }
             else {
-
                 $('.selectallgroups').prop('checked', false);
-                $(".select-text").html(' Select');
             }
             //displayTotalActivitiesFilter();
             //displayActivities();
@@ -649,12 +647,20 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 	                }
 	            }
             }
-            
         }
         //displayTotalActivitiesFilter();
         //displayActivities();
     }
 
+    //Coche toutes les activités quand on change de section
+    function checkAllGroupsFilter(){
+        $('.selectallgroups').prop('checked', true);
+        $('.group-option').prop('checked', true);
+        changeGroup();
+        $(".select-text").html(' Deselect');
+        
+    }
+
 
   
 });
diff --git a/styles.css b/styles.css
index 59c3846d40343ba790da0c334b5587db58454e39..e74d2fb1c1db6327442c1f8cf9ce552be50279be 100644
--- a/styles.css
+++ b/styles.css
@@ -1094,13 +1094,13 @@ th.first-column-iena, th.second-column-iena, th.actions-column-iena, th.third-co
     top: 13px;
 }
 
-.iena-dynamic-options{
+.iena-dynamic-options, .iena-dynamic-activities{
     list-style: none;
     padding: 0;
     margin-left: 0;
 }
 
-.iena-dynamic-options label{
+.iena-dynamic-options label, .iena-dynamic-activities label{
     white-space: nowrap;
 text-overflow: ellipsis;
 width: 94%;
diff --git a/suivi_unit.php b/suivi_unit.php
index 2d229dd6a49798805ab1900e29168784e46d8ead..b6cd3f16d43ddce91a66a3307d515ff7742e3134 100644
--- a/suivi_unit.php
+++ b/suivi_unit.php
@@ -114,7 +114,7 @@ function format_progress($progress, $modules, $groups, $activegroupids, $actives
         $progressstudent->email = $proginfo->email;
         $progressstudent->progress = array();
         $progressstudent->report_link = $CFG->wwwroot . "/report/outline/user.php?id=" .
-            $progressstudent->id . "&course=" . $COURSE->id . "&mode=outline";
+        $progressstudent->id . "&course=" . $COURSE->id . "&mode=outline";
         $progressstudent->message_link = $CFG->wwwroot . "/message/index.php?id=" . $progressstudent->id;
 
         //if ($activegroupid == 0) {
@@ -228,13 +228,13 @@ function set_filters($data, $filters, $symbols, $sections, $groups, $currentuser
     return $data;
 }
 
-function set_data($data, $modules, $progress, $groups, $activegroupid, $activesectionid, $listoptions) {
+function set_data($data, $modules, $progress, $groups, $activegroupsids, $activesectionid, $listoptions) {
     global $COURSE, $USER, $CFG;
 
     $data["modules"] = $modules;
     $countmodules = count($data["modules"]);
 
-    $data["students"] = format_progress($progress, $modules, $groups, $activegroupid, $activesectionid);
+    $data["students"] = format_progress($progress, $modules, $groups, $activegroupsids, $activesectionid);
     $countstudents = count($data["students"]);
 
     if ($countstudents > 0 && $countmodules > 0) {
@@ -335,47 +335,43 @@ if (!has_capability('course/iena:suivi', $context = context_course::instance($co
     exit;
 }
 
-if (isset($_POST['groupids'])) {
-    $activegroupids = $_POST['groupids'];
+
+
+if (isset($_POST['groupsid'])) {
+    $activegroupsids = $_POST['groupsid'];
 } else {
-    $activegroupids = [0];
+    $activegroupsids = array(0);
 }
 
-/*$progressrequest = $completion->get_progress_all(
-        '',
-        array(),
-        $activegroupid,
-        'u.lastname ASC, u.firstname ASC',
-        '',
-        '',
-        $context
-    );
-
-    */
-    
+
 $cache = cache::make('format_iena', 'students');
-if($cache->get($activegroupids) !== false){
-    $progress=$cache->get($activegroupids);
-}
-else{
-    $arrayprogressgroups=array();
-    //for($i=0; $i<count($activegroupids); $i++){
-          $progressrequest = $completion->get_progress_all(
+
+//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($activegroupsids[$i]) !== false){
+        $progress=$cache->get($activegroupsids[$i]);
+       
+        
+    }
+    else{
+        $progressrequest = $completion->get_progress_all(
             '',
             array(),
-            0,
+            $activegroupsids[$i],
             'u.lastname ASC, u.firstname ASC',
             '',
             '',
             $context
         );
-        //array_push($arrayprogressgroups, $progressrequest);
-    //}
-  
-    $progress=$cache->set($activegroupids, $progressrequest);
-
-    
+        $cache->set($activegroupsids[$i], $progressrequest);
+        $progress=$progressrequest;
+    }
+     $arrayprogress=(object) array_unique(array_merge((array) $arrayprogress, (array) $progress), SORT_REGULAR);
 }
+
+
+
 $activesectionid = 0;
 // Section du get acquise depuis le clic sur l'indicateur dans la page du cours,
 // section depuis laquelle on a cliqué sur le bouton pour voir le suivi.
@@ -387,20 +383,14 @@ if (isset($_GET['sectionid'])) {
 $groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true);
 $renderer = $PAGE->get_renderer('format_iena');
 
+//Si on cherche les détails d'une activité
 if (isset($_POST['action']) && $_POST['action'] == "details") {
     require_once($CFG->libdir . '/gradelib.php');
-    // Si on cherche les détails d'une activité
     $data = [];
     $idetu=$_POST['idetudiant'];
     $idmodule=$_POST['idmodule'];
     $modinfo = get_fast_modinfo($COURSE->id, $idetu);
-
-
     $cm = $modinfo->get_cm($idmodule);
-    
-
-    
-   
     //Utile ?
     $completioninfo = new \completion_info($COURSE);
     $completiondetails = new cm_completion_details($completioninfo, $cm, $idetu);
@@ -446,7 +436,7 @@ if (isset($_POST['action']) && $_POST['action'] == "details") {
     $data =array();
     $data['url']=strval($cm->url);
     $data['completion']=strval($cm->completion);
- $data["grades"]=$lastgrade;
+    $data["grades"]=$lastgrade;
     $data["customcompletion"]=$cm->customdata;
     $data["completioninfos"]=$activityhtml;
     $data["completionstate"]=$completiondetails->get_overall_completion();
@@ -455,23 +445,22 @@ if (isset($_POST['action']) && $_POST['action'] == "details") {
   
     echo json_encode($data);
 } 
-// If a post is sent trought the page --> Si on change les filtres, le template est appelé en JS
+// 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 = [];
-    $progress=$cache->get($activegroupids);
-
     $modules = get_activities($completion, $activesectionid);
     
-    $data = set_data($data, $modules, $progress, $groups, $activegroupids, $activesectionid, $listoptions);
+    $data = set_data($data, $modules, $arrayprogress, $groups, $activegroupsids, $activesectionid, $listoptions);
     
     echo json_encode($data);
 } else {
-    //Si on cherche les détails d'une activité
+
     init_page($course, $PAGE);
     echo $OUTPUT->header();
 
-    $progress=$cache->get($activegroupids);
+    //$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){
@@ -486,7 +475,7 @@ else if (isset($_POST['action']) && !empty($_POST['action'])) {
 
         $modules = get_activities($completion, $activesectionid);
         //Répartit les groupes en "mes groupes" et "les groupes dont je ne fais pas partie"
-        $groupsall = get_groups($context, $activegroupids, $groups);
+        $groupsall = get_groups($context, $activegroupsids, $groups);
 
         if (isset($groupsall->current_user_groups) && !empty($groupsall->current_user_groups)) {
             $currentusergroups = $groupsall->current_user_groups;
@@ -495,7 +484,7 @@ else if (isset($_POST['action']) && !empty($_POST['action'])) {
         $sections = get_sections($activesectionid);
 
         $data = set_filters($data, $filters, $symbols, $sections, array_values($groups), $groupsall->current_user_groups, $groupsall->othergroups, $activesectionid);
-        $data = set_data($data, $modules, $progress, $groups, $activegroupids, $activesectionid, $listoptions);
+        $data = set_data($data, $modules, $arrayprogress, $groups, $activegroupsids, $activesectionid, $listoptions);
 
         if (isset($_GET["msg_success"])) {
             $msg = $_GET["msg_success"];
diff --git a/templates/suivi.mustache b/templates/suivi.mustache
index 118f89ab24e513d5850c02dc6b45f62d076a091c..2a866bb2ff931f340e1c20e6e4d683f8ea5c8173 100644
--- a/templates/suivi.mustache
+++ b/templates/suivi.mustache
@@ -77,7 +77,7 @@
 		</div>
 		<div class="dropdown mr-sm-2 iena-custom-dropdown" id="group-select" name="groupid">
 		<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
-		<span class="dropdown-text">Tous les groupes</span>
+		<span class="group-dropdown-text">Tous les groupes</span>
 		<span class="caret"></span></button>
 		<ul class="dropdown-menu dropdown-menu-form" id="iena-group-dropdown">
 			<li>
@@ -90,7 +90,7 @@
 				</optgroup>
 				<ul class="iena-dynamic-options">
 					{{#current_user_groups}}
-	  					<li><label class="checkbox"><input type="checkbox" name="groupoptions[]" value={{id}} class="groupe-option justone-group">{{name}}</label></li>
+	  					<li><label class="checkbox"><input type="checkbox" name="groupoptions[]" value={{id}} class="group-option justone-group">{{name}}</label></li>
 						
 	  				{{/current_user_groups}}
 				</ul>
@@ -100,7 +100,7 @@
 					
 				</optgroup>
 				{{#othergroups}}
-						<li><label class="checkbox"><input type="checkbox" name="groupoptions[]" value={{id}} class="groupe-option justone-group">{{name}}</label></li>
+						<li><label class="checkbox"><input type="checkbox" name="groupoptions[]" value={{id}} class="group-option justone-group">{{name}}</label></li>
 
 					{{/othergroups}}
 			</ul>
@@ -173,6 +173,7 @@ require(['format_iena/suivi', 'core/templates'], function(module) {
     module.registerFilters();
    	module.registerSubmit({{{ data }}});
    	module.registerSelectAllActivitiesFilter();
+   	module.registerSelectAllGroupsFilter();
    	module.initTable();
 });
 {{/js}}