diff --git a/amd/build/header.js b/amd/build/header.js
index 9b2cf7a3add3095bf10b014ba8afe65f239fda62..c35f6a28849dbc9725ea9fffa88bb74c6f6920dd 100644
--- a/amd/build/header.js
+++ b/amd/build/header.js
@@ -67,7 +67,6 @@ define(['jquery', 'core/ajax', 'core/str'],
                 for(var i=0; i<split.length-1; i++){
                     fullurl+=split[i]+"/";
                 }
-                
                 urlParams = new URLSearchParams(window.location.search);
                 course=urlParams.get('id');
                 fullurl+='format/iena/suivi_unit.php?courseid='+course+'&sectionid=0&groupid=0';
@@ -79,7 +78,6 @@ define(['jquery', 'core/ajax', 'core/str'],
                 $("#drawermenu .nav.navbar .nav-item .nav-link").css('padding', "0.5rem 0.2rem");
                 $("#iena-global-progress .nav-link").css('padding-right', '0');
                 $("#drawermenu .nav.navbar li:last-child .btn").addClass("iena-custom-button");
-             
 	    		
        		}
 
diff --git a/amd/build/suivi-table.js b/amd/build/suivi-table.js
index e43d9b419e92552b6e133660212b4e18177b740a..01c415c75a4620a353730c9a06f477bb662c2de8 100644
--- a/amd/build/suivi-table.js
+++ b/amd/build/suivi-table.js
@@ -38,6 +38,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
                     checkSelectActions();
                   })
                 }
+                
        		},
                 //Si l'option de détails au clic est activée, on register l'événement du clic
             registerDetailsClick:function(){
@@ -79,7 +80,9 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
                     });
 
                 })
-            }
+            },
+
+
 
        	}
 
@@ -117,4 +120,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 
 
 
+
+
+
 });
diff --git a/amd/build/suivi.js b/amd/build/suivi.js
index bca339df414a84a34a75224339f9626697911bd3..c6e6a85a0f5fe9d65aaa0d71dcd24be0493c1c8d 100644
--- a/amd/build/suivi.js
+++ b/amd/build/suivi.js
@@ -25,6 +25,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
        function($, ajax, templates, str) {
        	var all_selected=false;
        	var data=[];
+       	var cours_massif=false;
 
        	return{
        		
@@ -32,27 +33,36 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
        			
 	    		$("#group-select").on('change', function(e){
 	    			changeGroup();
+	    			e.stopPropagation();
 	    		});
 	    		
        		},
        		
-       		registerSubmit:function(infos){
-       			data=infos;
+       		registerSubmit:function(){
+       
        			$("#id_submit_iena").on('click', function(e){
 	    			triggerAction(e);
 	    		});
 	    		$("#section-select").on('change', function(){
-	    			changeSection();
+	    			//changeSection();
+	    			wrapperChangeSection();
 	    		});
-	    		$("#filter-select").on('change', function(){
-	    			changeCompletion();
+	    		$("#completion-select").on('change', function(){
+	    			//showHideStudents();
+	    			wrapperChangeCompletion();
 	    		});
 	    		$("#symbol-select").on('change', function(){
-	    			changeCompletion();
+	    			//showHideStudents();
+	    			wrapperChangeCompletion();
 	    		});
                 $('.dropdown-menu-form').on('click', function (e) {
                    e.stopPropagation();
                 });
+                $('#iena-button-search').on('click', function(e){
+                	searchStudent();
+                	e.preventDefault()
+         			e.stopPropagation()
+                })
                
 	    		
 	    		
@@ -62,9 +72,10 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
        		//Evenement pour le selectall : créé une seule fois au chargement de la page
 		    registerSelectAllActivitiesFilter:function(){
 		        $('.selectallactivities').click(function() {
+
 		            if ($(".selectallactivities").is(':checked')) {
 		                checkAllActivitiesFilter();
-		                displayActivities();
+		                showHideActivities();
 		            } else {
 		                $('.option').prop('checked', false);
 		                var message=str.get_string('selectedActivities', 'format_iena');
@@ -72,43 +83,102 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 		                    $(".dropdown-text").html('0 '+localizedEditString);
 		                }); 
 		                $(".select-text").html(' Select');
-		                displayActivities();
+		                showHideActivities();
 		            }
+		            reloadTable();
 		        });
 		        //initActivityFilter();
 		    },
 		    registerSelectAllGroupsFilter:function(){
-		    	checkAllGroupsFilter();
-		    	$('.selectallgroups').click(function() {
+		    
+		    	if(data.countstudents<1000){
+		    		checkAllGroupsFilter();
+		    	}
+		    	
+		    	$('.selectallgroups').click(function(e) {
+		    		e.stopPropagation();
 		            if ($(".selectallgroups").is(':checked')) {
 		                checkAllGroupsFilter();
 		            } else {
 		                $('.group-option').prop('checked', false);
-		                displayTotalGroupsFilter(); 
+		                updateGroupsFilterLabel(); 
 		            	
 		            }
-		            changeGroup();
+		
 		        });
 		    },
 		    initTable:function(){
-		    	initActivityFilter(false);
-		    	displayTotalActivitiesFilter(false);
-		    	displayTotalGroupsFilter(false);
-        		displayActivities(false);
-        		initGroupFilter(false);
-        		registerGroupFilter();
-        		changeSection(false);
-        		reloadTable(data);
+		    	data=fetchProgress();
+		    	
+        		$("#link-more-filters").on("click", function(){
+        			$("#iena-more-filters").toggle();
+        		});
+
+    
+        		$("#check-more-filters").on("click", function(){
+        			applyMoreFilters();
+        		});
+        		
 
-		    }
+		    },
+		    
        		
 
        		
        		
        	}
 
+    function fetchProgress(){
+    	completeUrl=getCompleteUrl();
+    	data={action: 'fetchprogress'};
+    	url=window.location.search;
+		urlParams = new URLSearchParams(url);
+		courseid=urlParams.get('courseid');
+    	if(localStorage.groups && JSON.parse(localStorage.groups).length > 0 && localStorage.courseid && localStorage.courseid==courseid){
+    		var cachedgroupsid=JSON.parse(localStorage.groups);
+    		var groupsid=[];
+	    	for (var i = 0; i < cachedgroupsid.length; i++) {
+	    		groupsid.push(cachedgroupsid[i]);
+	    	}
+	    	
+	    	if(groupsid.length==0){
+	    		groupsid.push(-2);
+	    	}
+	    	data.groupsid=groupsid;
+    	}
+    	$.ajax({ url: completeUrl,
+        	data: data,
+        	type: 'post',
+        	success: function(request) { 
+        		
+        		
+			   
+
+        		
+			    parsedrequest=JSON.parse(request);
+        		data=calcPercentage(parsedrequest);
+        		if(data.countstudents<1500 && !localStorage.groups){
+        		
+        			localStorage.setItem("courseid",parsedrequest["courseid"]);
+        			localStorage.setItem("groups",parsedrequest["groups"]);
+        		}
+        		initActivityFilter(false);
+			    updateActivitiesFilterLabel(false);
+			    changeSection(false);
+			    initGroupFilter(false);
+	        		
+	        	updateGroupsFilterLabel(false);
+	        	reloadTable(data);
+        		
+
+        	
+        		
+
+        		return data;
+			}
+		});
+    }
     function initHeaders(){
-
     	var nb_counts=$(".th-rotate").length;
 
 		$(".th-rotate").each(function(index, element){
@@ -117,13 +187,15 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 		})
     }
 
+
+
     function getCompleteUrl(){
     	url=window.location.search;
     	urlParams = new URLSearchParams(url);
     	courseid=urlParams.get('courseid');
     	groupid=$("#group-select").val();
     	sectionid=$("#section-select").val();
-    	filter=$("#symbol-select").val() + $("#filter-select").val();
+    	filter=$("#symbol-select").val() + $("#completion-select").val();
     	completeUrl='suivi_unit.php?courseid='+courseid;
     	if(sectionid){
     		completeUrl+='&sectionid='+sectionid;
@@ -137,35 +209,59 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     	return completeUrl;
     }
 
+    //À changer pour intégrer une fonction plus générique 
     function changeGroup(){
+    	loadMessage("loading");
+
     	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");
+    	
     	if(groupsid.length==0){
     		groupsid.push(-2);
     	}
+
+    	// FAIRE EN JS ? 
+    	// OUI : sinon le cache va tout défoncer
+    	// NON : performances 
+    	// Pour les gros cours, on mettrait les paramas des activités à envoyer
+    	//var params=[];
+    	
     	$.ajax({ url: completeUrl,
         	data: {action: 'fetchgroups', groupsid:groupsid},
         	type: 'post',
         	success: function(request) { 
-        		data=calcPercentage(JSON.parse(request));
-        		//initGroupFilter();
-        		changeSection();
-        		localStorage.setItem("groups",request);
-        		displayTotalGroupsFilter(false);
+        		
+        		parsedrequest=JSON.parse(request);
+        		data=parsedrequest;
+        		showHideActivities();
+        		data=calcPercentage(data);
+        		
+        		
+        		showHideStudents();
+        		if(data.countstudents<1500){
+        	
+        			localStorage.setItem("courseid",parsedrequest["courseid"] )
+        			localStorage.setItem("groups",JSON.stringify(parsedrequest["groups"]));
+        			
+        		}
+
+        		reloadTable(data);
+        		updateGroupsFilterLabel(false);
 			}
 		});
     }
 
-  
-    function changeCompletion(changefilter=true){
+
+  	//Affiche ou non (dynamiquement, pas de requête) les étudiants selon le filtre d'achèvement
+    function showHideStudents(changefilter=true){
     	symbol=$("#symbol-select").val();
-    	filter=$("#filter-select").val();
+    	completion=$("#completion-select").val();
     	data.count_results=0;
+
     	for(var i=0; i<data.students.length; i++){
     		if(data.display_groups==1){
     			data.students[i].display_groups=true;
@@ -173,7 +269,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 
     		
     		if(symbol=="<"){
-    			if(data.students[i].percentage < filter){
+    			if(data.students[i].percentage < completion){
     				data.count_results++;
     				data.students[i].visible=true;
     			}
@@ -182,7 +278,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     			}
     		}
     		else if(symbol==">"){
-    			if(data.students[i].percentage > filter){
+    			if(data.students[i].percentage > completion){
     				data.count_results++;
     				data.students[i].visible=true;
     			}
@@ -191,7 +287,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     			}
     		}
     		else if(symbol=="≤"){
-    			if(data.students[i].percentage <= filter){
+    			if(data.students[i].percentage <= completion){
     				data.count_results++;
     				data.students[i].visible=true;
     			}
@@ -200,7 +296,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     			}
     		}
     		else if(symbol == "≥"){
-    			if(data.students[i].percentage >= filter){
+    			if(data.students[i].percentage >= completion){
     				data.count_results++;
     				data.students[i].visible=true;
     			}
@@ -209,7 +305,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     			}
     		}
     		else{
-    			if(data.students[i].percentage == filter){
+    			if(data.students[i].percentage == completion){
     				data.count_results++;
     				data.students[i].visible=true;
     			}
@@ -219,18 +315,43 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     		}
     		
     	}
-    	if(changefilter==true){
+    	/*if(changefilter==true){
     		reloadTable(data);
-    	}
+    	}*/
     	
     }
 
     //on va devoir calculer le pourcentage, check la completion et reload la table à chaque fois
 
+
+    function wrapperChangeSection(changefilter=true){
+    	changeSection();
+    	reloadTable();
+
+    }
+
+    function wrapperChangeActivities(changefilter=true){
+    	showHideActivities();
+    	data=calcPercentage();
+    	
+
+    	reloadTable();
+
+    }
+
+
+    function wrapperChangeCompletion(changefilter=true){
+    	showHideStudents();
+    	reloadTable();
+    }
+
+
+
     function changeSection(changefilter=true){
     	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;
@@ -247,36 +368,29 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     			}
     		}
     	}
-    	
+    	//Si pas de résultats on recharge juste la table
     	if(data.count_results==0 && changefilter ==true){
-    		reloadTable(data);
+    		//reloadTable(data);
     	}
     	else{
     		data=calcPercentage(data);
-    		changeCompletion(changefilter);
+    		showHideStudents(changefilter);
     	}
-        changeActivitiesDropdown(data.modules);
-    }
+        changeActivitiesDropdown();
 
-    //Charge les activités dynamiquement en fonction de la section choisie
-    function changeActivitiesDropdown(modules){
-        //html='<li><label class="checkbox"><input type="checkbox" class="selectall" value="all" checked>Toutes les activités</label></li><li class="divider"></li>';
-        html="";
-        for (var i = 0; i<modules.length;i++){
-            if(modules[i].visible){
-                html+='<li><label class="checkbox"><input type="checkbox" name="options[]" checked value='+modules[i].id+' class="option justone-activity">'+modules[i].displayname+'</label></li>';
-
-            }
-        }
-        $(".iena-dynamic-activities").html(html);
+        //Vérifier si ça passe ou s'il faut attendre la promise
         registerActivityFilter();
         checkAllActivitiesFilter();
     }
 
-    function displayActivities(changefilter=true){
+
+
+    //Affiche/cache dynamiquement les activités sélectionnées DANS LE TABLEAU
+    function showHideActivities(changefilter=true){
         var arrayActivitiesID=[];
         var activitiesToStore=[];
         var activities = $('input[name="options[]"]');
+
         for(var i=0; i<activities.length;i++){
 
             prog=data.modules.find(element => element.id === activities[i].value);
@@ -293,34 +407,25 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
                     data.students[j].progress.find(progress => progress.idmodule === activities[i].value).visible=false;
                 }
             }
-           
-          
         }
-        localStorage.setItem("activities",JSON.stringify(activitiesToStore));
-        if(changefilter==true){
-        	reloadTable(data);
+        if(data.countstudents<1500){
+        	localStorage.setItem("activities",JSON.stringify(activitiesToStore));
         }
+       
+       /* if(changefilter==true){
+        	reloadTable(data);
+        }*/
         
     }
 
 
+ 
 
-    function loadMessage(type){
-    	if(type=="loading"){
-    		var message = str.get_string('loadingResults', 'format_iena');
-	    	
-    	}
-    	else if(type=="error"){
-			var message = str.get_string('errorLoadingResults', 'format_iena');
-    	}
-
-    	$.when(message).done(function(localizedEditString) {
-		    $("#partial-table").html("<div class='alert alert-primary' role='alert'>"+localizedEditString+"</div>");
-		});	
-    }
-
-    //Reload table with nex parameters.
+    //Reload table with new parameters JUST FOR DISPLAYING THE TABLE.
     function reloadTable(params){
+    	if(!params){
+    		params=data;
+    	}
     	url=getCompleteUrl();
     	templates.render('format_iena/suivi-table', params)
      	.done(function(html, js){
@@ -336,8 +441,404 @@ 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(request){
+		if(!request){
+			request=data;
+		}
+		for (var i = 0; i < request.students.length; i++) {
+			request.students[i].percentage=0;
+			var done=0;
+			var nb_modules=0;
+			for(var j=0; j < request.students[i].progress.length;j++){
+				if(request.modules.find(module => module.id === request.students[i].progress[j].idmodule).visible){
+					nb_modules++;
+					if(request.students[i].progress[j].completionstate == 1 || request.students[i].progress[j].completionstate ==2){
+						done++;
+					}
+				}
+			}
+			request.students[i].percentage=Math.floor(100 * done / nb_modules);
+		}
+		return request;
+	}
+
+
+    
+
+  
+    
+
+
+
+
+	function deleteSearch(old_data){
+		$('#iena-search-tag').html("");
+		data=old_data;
+		$(".iena-filters .custom-select").prop('disabled', false);
+		$(".iena-filters .iena-custom-dropdown > button").prop('disabled', false);
+		showHideStudents();
+		reloadTable(data);
+        		
+	}
+
+	function deleteAdvancedFilter(old_data){
+		loadMessage("loading");
+		$('#iena-filters-tag').html("");
+		data=old_data;
+		$(".iena-filters #symbol-select").prop('disabled', false);
+		$(".iena-filters #completion-select").prop('disabled', false);
+		$("#completion-select").prop("disabled", false);
+		$("#iena-search-form").children().prop("disabled", false);
+		$("#iena-filters-error").hide();
+		showHideStudents();
+		reloadTable(data);
+        		
+	}
+    
+    
+	function applyMoreFilters(){
+	
+    	completionBegin=$("#completion-select-begin").val();
+    	
+    	completionEnd=$("#completion-select-end").val();
+
+		if($("#iena-close-advanced").length == 0){
+			old_data=$.extend(true,{},data);
+		}
+
+    	if(( isNaN(Number(completionBegin)) || (completionBegin < 0 || completionBegin > 100)) || (isNaN(Number(completionEnd)) || (completionEnd <0 || completionBegin > 100)) ){
+    		$("#iena-filters-error").show();
+    		if($('#iena-filters-tag').is(":hidden")){
+    			//$('#iena-filters-tag').hide();
+    			$("#symbol-select").prop("disabled", false);
+				$("#completion-select").prop("disabled", false);
+    		}
+    	
+    		
+
+    	}
+    	else{
+    		loadMessage("loading");
+    		$("#iena-search-form").children().prop("disabled", true);
+    		$("#symbol-select").prop("disabled", true);
+			$("#completion-select").prop("disabled", true);
+    		$('#iena-filters-tag').show();
+    		$('#iena-filters-tag').html(`<span role="option" data-value="" aria-selected="true" class="badge badge-secondary clickable text-wrap text-break line-height-4 m-1" id="form_autocomplete_selection-1739873966209-0" data-active-selection="true">
+	        ≥`+completionBegin+`% ≤`+completionEnd+`%<i id="iena-close-advanced" class="icon fa fa-times pl-2 mr-0"></i></span>`);
+	 		
+	    	$('#iena-filters-tag').on('click', 'i', function(e){
+	    		
+	    		deleteAdvancedFilter(old_data);
+	    	});
+    		$("#iena-filters-error").hide();
+    		showHideStudentsAdvancedFilters(completionBegin, completionEnd);
+    		reloadTable(data);
+    	}
+	}
+
+
+
+	function showHideStudentsAdvancedFilters(completionBegin, completionEnd){
+    	
+    	data.count_results=0;
+    	for(var i=0; i<data.students.length; i++){
+    		/*if(data.display_groups==1){
+    			data.students[i].display_groups=true;
+    		}*/
+    		if(data.students[i].percentage >= completionBegin && data.students[i].percentage <= completionEnd){
+				data.count_results++;
+				data.students[i].visible=true;
+			}
+			else{
+				data.students[i].visible=false;
+			}
+
+    		
+    	}
+
+    	
+    }
+
+    function searchStudent(){
+		var searchinput= $('input[name="iena-search-student"]').val();
+		var searchform=document.querySelector("#iena-search-form");
+		 
+		if(searchinput.length<=2){
+			
+			$('input[name="iena-search-student"]').css("border-color","#dc3545");
+			$("#iena-search-error").show();
+			$('#iena-search-tag').hide();
+
+		}
+		else{
+			loadMessage("loading");
+			$('input[name="iena-search-student"]').css("border-color","#8f959e");
+			$("#iena-search-error").hide();
+
+			$(".iena-filters .custom-select").prop('disabled', true);
+	
+			$(".iena-filters .iena-custom-dropdown > button").prop('disabled', true);
+			$("#iena-more-filters .form-control").prop('disabled', true);
+			$("#check-more-filters").addClass("disabled");
+			
+
+			if($("#iena-close-tag").length == 0){
+				old_data=$.extend(true,{},data);
+			}
+	 		$('#iena-search-tag').show();
+			var completeUrl=getCompleteUrl();
+	    	
+	 		$('#iena-search-tag').html(`<span role="option" data-value="`+searchinput+`" aria-selected="true" class="badge badge-secondary clickable text-wrap text-break line-height-4 m-1" id="form_autocomplete_selection-1739873966209-0" data-active-selection="true">
+	        `+searchinput+`<i id="iena-close-tag" class="icon fa fa-times pl-2 mr-0"></i></span>`);
+	 		
+	    	$('#iena-search-tag').on('click', 'i', function(e){
+	    		
+	    		deleteSearch(old_data);
+	    	});
+
+	    	$.ajax({ url: completeUrl,
+	        	data: {action: 'search_student', search_input:searchinput},
+	        	type: 'post',
+	        	success: function(request) { 
+	        		showHideActivities();
+	        		data=calcPercentage(JSON.parse(request));
+	        		showHideStudents();
+	        		
+	        		$('input[name="iena-search-student"]').val("");
+	        		reloadTable(data);
+	        		updateGroupsFilterLabel(false);
+				}
+			});
+		}
+		
+	}
+
+	function deleteSearch(old_data){
+		loadMessage("loading");
+		$('#iena-search-tag').html("");
+		data=old_data;
+		$(".iena-filters .custom-select").prop('disabled', false);
+		$(".iena-filters .iena-custom-dropdown > button").prop('disabled', false);
+		$("#iena-more-filters .form-control").prop('disabled', false);
+		$("#check-more-filters").removeClass("disabled");
+		showHideStudents();
+		reloadTable(data);
+        		
+	}
+
+     
+
+
+
+
+
+    /*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
+	*/
+
+    //On va recharger dynamiquement les options donc on doit recréer les événements à chaque fois qu'on change de section
+    function registerActivityFilter(){
+        $("input[type='checkbox'].justone-activity").on('click', function(e){
+            e.stopPropagation();
+            var a = $("input[type='checkbox'].justone-activity");
+            if(a.length == a.filter(":checked").length){
+                $('.selectallactivities').prop('checked', true);
+                $(".select-text").html(' Deselect');
+            }
+            else {
+
+                $('.selectallactivities').prop('checked', false);
+                $(".select-text").html(' Select');
+            }
+            updateActivitiesFilterLabel();
+            wrapperChangeActivities();
+            
+        });
+
+        
+    }
+
+
+
+
+    //Stocke le filtre des activités en localStorage pour ne pas avoir 50 id dans l'url
+    //On fait bien attention à rétablir cocher le selectall si toutes les activités sont bien cochées
+    function initActivityFilter(){
+        if(localStorage.activities){
+            var checkedActivities=JSON.parse(localStorage.activities);
+            var activities=$("input[type='checkbox'].justone-activity");
+            if($("input[type='checkbox'].justone-activity[value="+checkedActivities[0]+"]").length > 0){
+            	if(activities.length===checkedActivities.length ){
+	                $(".selectallactivities").prop("checked", true);
+	                $("input[type='checkbox'].justone-activity").prop("checked", true);
+	            }
+	            else{
+	                $(".selectallactivities").prop("checked", false);
+	                for(var i=0; i<activities.length; i++){
+	                    if(checkedActivities.includes(activities[i].value)){
+	                        activities[i].checked=true;
+	                    }
+	                    else{
+	                        activities[i].checked=false;
+	                    }
+	                }
+	            }
+            }
+        }
+    }
+
+
+        //Coche toutes les activités quand on change de section
+    function checkAllActivitiesFilter(){
+        $('.selectallactivities').prop('checked', true);
+        $('.option').prop('checked', true);
+        updateActivitiesFilterLabel();
+
+        
+    }
+
+      //Update activities filter label
+    function updateActivitiesFilterLabel(){
+        var total = $('input[name="options[]"]:checked').length;
+        if(total == $('input[name="options[]"]').length){
+            var message=str.get_string('allActivities', 'format_iena');
+            $.when(message).done(function(localizedEditString) {
+                $(".dropdown-text").html(localizedEditString);
+            }); 
+        }
+        else{
+            var message=str.get_string('selectedActivities', 'format_iena');
+            $.when(message).done(function(localizedEditString) {
+                $(".dropdown-text").html(total + ' '+localizedEditString);
+            }); 
+        }
+    }
+  
+
+  	    //Charge les activités dynamiquement en fonction de la section choisie
+    function changeActivitiesDropdown(){
+        html="";
+        for (var i = 0; i<data.modules.length;i++){
+            if(data.modules[i].visible){
+                html+='<li><label class="checkbox"><input type="checkbox" name="options[]" checked value='+data.modules[i].id+' class="option justone-activity">'+data.modules[i].displayname+'</label></li>';
+
+            }
+        }
+        $(".iena-dynamic-activities").html(html);
+  
+        
+    }
+
+
+   
+    function initGroupFilter(){
+    	$("input[type='checkbox'].justone-group").on('click', function(e){
+            e.stopPropagation();
+             var a = $("input[type='checkbox'].justone-group");
+            if(a.length == a.filter(":checked").length){
+                $('.selectallgroups').prop('checked', true);
+            }
+            else {
+                $('.selectallgroups').prop('checked', false);
+            }
+            updateGroupsFilterLabel();
+        }); 
+        if(localStorage.groups && JSON.parse(localStorage.groups) != 0 && localStorage.courseid && localStorage.courseid==courseid ){
+        	var checkedGroups=JSON.parse(localStorage.groups);
+            //var checkedGroups=JSON.parse(localStorage.groups);
+            
+            var groups=$("input[type='checkbox'].justone-group");
+            //if($("input[type='checkbox'].justone-group[value="+checkedGroups[0]+"]").length > 0){
+            	if(groups.length===checkedGroups.length  && checkedGroups[0]!=0){
+	                $(".selectallgroups").prop("checked", true);
+	                $("input[type='checkbox'].justone-group").prop("checked", true);
+	            }
+	            else{
+	                $(".selectallgroups").prop("checked", false);
+	                for(var i=0; i<groups.length; i++){
+	                    if(checkedGroups.includes(groups[i].value)){
+	                        groups[i].checked=true;
+	                    }
+	                    else{
+	                        groups[i].checked=false;
+	                    }
+	                }
+	            }
+            //}
+        }
+        else{
+        	if(data.countstudents<1500){
+        		checkAllGroupsFilter();
+        	}
+        	else{
+        		$('.selectallgroups').prop('checked', false);
+        		$('.group-option').prop('checked', false);
+        	}
+        	
+        }
+    }
+
+
+        //Coche tous les groupes quand le select all est coché
+    function checkAllGroupsFilter(){
+        $('.selectallgroups').prop('checked', true);
+        $('.group-option').prop('checked', true);
+
+        $(".select-text").html(' Deselect');
+        
+    }
+
+
+    //Update activities filter label
+    function updateGroupsFilterLabel(){
+        var total = $('input[name="groupoptions[]"]:checked').length;
+        if(total == $('input[name="groupoptions[]"]').length){
+            var message=str.get_string('allGroups', 'format_iena');
+            $.when(message).done(function(localizedEditString) {
+                $(".dropdown-text-group").html(localizedEditString);
+            }); 
+        }
+        else{
+            var message=str.get_string('selectedGroups', 'format_iena');
+            $.when(message).done(function(localizedEditString) {
+                $(".dropdown-text-group").html(total + ' '+localizedEditString);
+            }); 
+        }
+    }
+  
+   
+   	   //Charge message de chargement ou d'erreur
+    function loadMessage(type){
+    	var loard="";
+    	if(type=="loading"){
+    		var message = str.get_string('loadingResults', 'format_iena');
+    		loader="<div class=loader></div>";
+	    	
+    	}
+    	else if(type=="error"){
+			var message = str.get_string('errorLoadingResults', 'format_iena');
+    	}
+
+    	$.when(message).done(function(localizedEditString) {
+		    $("#partial-table").html("<div class='alert alert-primary' role='alert'>"+localizedEditString+loader+"</div>");
+		});	
+    }
 
+  
 
+    //****************************** Fonctions liées à l'envoi de messages aux étudiants et au téléchargement du csv **************************//
+    
+    //Récupère les étudiants sélectionnées par les checkbox
 	function getSelectedStudents(){
 		var selectedChecks=$("#table-body input:checked");
 		var students=[];
@@ -377,6 +878,8 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
     		form.submit();
 		}
 		else if(value=="download"){
+			e.stopPropagation();
+			e.preventDefault();
 			table_download(data);
 		}
 	}
@@ -387,7 +890,8 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 		.replace(/\s+/g, '-')           /* Replace spaces with - */
 		.replace(/&/g, '-and-')         /* Replace & with 'and' */
 		.replace(/[^\w\-]+/g, '')       /* Remove all non-word chars */
-		.replace(/\-\-+/g, '-');        /* Replace multiple - with single - */
+		.replace(/\-\-+/g, '-')        /* Replace multiple - with single - */
+
 	}
 
 
@@ -410,9 +914,8 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 				continue;
 			}
 			head.push('"'+data.modules[m].displayname.replace(',', '')+'"');
-		}
-
 
+		}
 		csvContent += head.join(",");
 		csvContent += "\n";
 		
@@ -483,9 +986,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 				csvContent += dataString + "\n";
 			}
 		}
-		
 		var encodedUri = encodeURI(csvContent);
-
 		var section_name = data.active_section_id;
 		if ( section_name == 0 ) {
 			section_name = "cours-complet";
@@ -507,178 +1008,4 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
 	}
 
 
-	//Pour chaque module non caché, on va regarder pour chaque étudiant 
-	function calcPercentage(data){
-		for (var i = 0; i < data.students.length; i++) {
-			data.students[i].percentage=0;
-			var done=0;
-			var nb_modules=0;
-			for(var j=0; j < data.students[i].progress.length;j++){
-				if(data.modules.find(module => module.id === data.students[i].progress[j].idmodule).visible){
-					nb_modules++;
-					if(data.students[i].progress[j].completionstate == 1 || data.students[i].progress[j].completionstate ==2){
-						done++;
-					}
-				}
-			}
-			data.students[i].percentage=Math.floor(100 * done / nb_modules);
-		}
-		return data;
-	}
-
-
-    //On va recharger dynamiquement les options donc on doit recréer les événements à chaque fois qu'on change de section
-    function registerActivityFilter(){
-        $("input[type='checkbox'].justone-activity").on('click', function(e){
-            e.stopPropagation();
-             var a = $("input[type='checkbox'].justone-activity");
-            if(a.length == a.filter(":checked").length){
-                $('.selectallactivities').prop('checked', true);
-                $(".select-text").html(' Deselect');
-            }
-            else {
-
-                $('.selectallactivities').prop('checked', false);
-                $(".select-text").html(' Select');
-            }
-            displayTotalActivitiesFilter();
-            displayActivities();
-        });
-
-        
-    }
-
-    //Update activities filter label
-    function displayTotalActivitiesFilter(){
-        var total = $('input[name="options[]"]:checked').length;
-        if(total == $('input[name="options[]"]').length){
-            var message=str.get_string('allActivities', 'format_iena');
-            $.when(message).done(function(localizedEditString) {
-                $(".dropdown-text").html(localizedEditString);
-            }); 
-        }
-        else{
-            var message=str.get_string('selectedActivities', 'format_iena');
-            $.when(message).done(function(localizedEditString) {
-                $(".dropdown-text").html(total + ' '+localizedEditString);
-            }); 
-        }
-    }
-  
-    //Stocke le filtre des activités en localStorage pour ne pas avoir 50 id dans l'url
-    //On fait bien attention à rétablir cocher le selectall si toutes les activités sont bien cochées
-    function initActivityFilter(){
-        if(localStorage.activities){
-            var checkedActivities=JSON.parse(localStorage.activities);
-            var activities=$("input[type='checkbox'].justone-activity");
-            if($("input[type='checkbox'].justone-activity[value="+checkedActivities[0]+"]").length > 0){
-            	if(activities.length===checkedActivities.length ){
-	                $(".selectallactivities").prop("checked", true);
-	                $("input[type='checkbox'].justone-activity").prop("checked", true);
-	            }
-	            else{
-	                $(".selectallactivities").prop("checked", false);
-	                for(var i=0; i<activities.length; i++){
-	                    if(checkedActivities.includes(activities[i].value)){
-	                        activities[i].checked=true;
-	                    }
-	                    else{
-	                        activities[i].checked=false;
-	                    }
-	                }
-	            }
-            }
-            
-
-        }
-        //displayTotalActivitiesFilter();
-        //displayActivities();
-    }
-
-    //Coche toutes les activités quand on change de section
-    function checkAllActivitiesFilter(){
-        $('.selectallactivities').prop('checked', true);
-        $('.option').prop('checked', true);
-        displayTotalActivitiesFilter();
-        $(".select-text").html(' Deselect');
-        
-    }
-
-    function registerGroupFilter(){
-        $("input[type='checkbox'].justone-group").on('click', function(e){
-            e.stopPropagation();
-             var a = $("input[type='checkbox'].justone-group");
-            if(a.length == a.filter(":checked").length){
-                $('.selectallgroups').prop('checked', true);
-            }
-            else {
-                $('.selectallgroups').prop('checked', false);
-            }
-            displayTotalActivitiesFilter();
-            //displayActivities();
-        });
-
-        
-    }
-
-     function initGroupFilter(){
-        if(localStorage.groups){
-            var checkedGroups=JSON.parse(localStorage.groups);
-            var groups=$("input[type='checkbox'].justone-group");
-
-            if($("input[type='checkbox'].justone-group[value="+checkedGroups[0]+"]").length > 0){
-            	if(groups.length===checkedGroups.length ){
-	                $(".selectallgroups").prop("checked", true);
-	                $("input[type='checkbox'].justone-group").prop("checked", true);
-	            }
-	            else{
-	                $(".selectallgroups").prop("checked", false);
-	                for(var i=0; i<groups.length; i++){
-	                    if(checkedGroups.includes(groups[i].value)){
-	                        groups[i].checked=true;
-	                    }
-	                    else{
-	                        groups[i].checked=false;
-	                    }
-	                }
-	            }
-            }
-        }
-        else{
-        	checkAllGroupsFilter();
-        }
-        displayTotalActivitiesFilter();
-        //displayActivities();
-    }
-
-    //Coche tous les groupes quand le select all est coché
-    function checkAllGroupsFilter(){
-        $('.selectallgroups').prop('checked', true);
-        $('.group-option').prop('checked', true);
-        //changeGroup();
-        $(".select-text").html(' Deselect');
-        
-    }
-
-
-    //Update activities filter label
-    function displayTotalGroupsFilter(){
-        var total = $('input[name="groupoptions[]"]:checked').length;
-        if(total == $('input[name="groupoptions[]"]').length){
-            var message=str.get_string('allGroups', 'format_iena');
-            $.when(message).done(function(localizedEditString) {
-                $(".dropdown-text-group").html(localizedEditString);
-            }); 
-        }
-        else{
-            var message=str.get_string('selectedGroups', 'format_iena');
-            $.when(message).done(function(localizedEditString) {
-                $(".dropdown-text-group").html(total + ' '+localizedEditString);
-            }); 
-        }
-    }
-  
-
-
-  
 });
diff --git a/classes/output/courseformat/content.php b/classes/output/courseformat/content.php
index 548df63ce4134b6a585843df2a54472ade765bb1..dc28d4281231e9df62feae72ba8017e9f7d41435 100644
--- a/classes/output/courseformat/content.php
+++ b/classes/output/courseformat/content.php
@@ -108,8 +108,9 @@ class content extends content_base {
             }
             $course_data['student']=true;
         }
-    
-        $course_data['summary']=$COURSE->summary;
+        $summary = file_rewrite_pluginfile_urls($COURSE->summary, 'pluginfile.php', $context->id, 'course', 'summary', NULL);
+        $course_data['summary']=$summary;
+        //$course_data['summary']=$COURSE->summary;
         $course_data['enableclickicons']=$formatoptions['enableclickicons'];
 
         return $course_data;
diff --git a/db/install.xml b/db/install.xml
index dba54149d4746cf474ac366f1a11ba87a4a83a2a..4f2f417c2d7249d9f974f62c54eaeae87c7dd5c7 100644
--- a/db/install.xml
+++ b/db/install.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="course/format/iena/db" VERSION="20240131" COMMENT="XMLDB file for Moodle course/format/iena"
+<XMLDB PATH="course/format/iena/db" VERSION="20241018" COMMENT="XMLDB file for Moodle course/format/iena"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../../../lib/xmldb/xmldb.xsd"
 >
diff --git a/db/upgrade.php b/db/upgrade.php
index 7f1aebccdb20826362caf4ff62a0787206c733d8..608527c857ef2c881ae2387225607f990361eb7f 100644
--- a/db/upgrade.php
+++ b/db/upgrade.php
@@ -93,28 +93,28 @@ function xmldb_format_iena_upgrade($oldversion) {
         // Format_iena savepoint reached.
         upgrade_plugin_savepoint(true, 2021070600, 'format', 'iena');
     }
-      if ($oldversion < 2024012500) {
-
+      if ($oldversion < 2024101505) {
         // Define field id to be added to format_iena.
-        $table = new xmldb_table('format_iena_options');
-        $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
-        $table->add_field('optionname', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, 'id');
-        $table->add_field('optionvalue', XMLDB_TYPE_INTEGER, '1', null, null, null, null, 'optionname');
-        $table->add_field('courseid', XMLDB_TYPE_INTEGER, '8', null, XMLDB_NOTNULL, null, null, 'optionvalue');
-        $table->add_field('userid', XMLDB_TYPE_INTEGER, '8', null, XMLDB_NOTNULL, null, null, 'courseid');
-        $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '16', null, XMLDB_NOTNULL, null, null, 'userid');
-        $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '16', null, null, null, null, 'timecreated');
 
-         $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']);
+        $table2 = new xmldb_table('format_iena_options');
+        $table2->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null);
+        $table2->add_field('optionname', XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, 'id');
+        $table2->add_field('optionvalue', XMLDB_TYPE_INTEGER, '1', null, null, null, null, 'optionname');
+        $table2->add_field('courseid', XMLDB_TYPE_INTEGER, '8', null, XMLDB_NOTNULL, null, null, 'optionvalue');
+        $table2->add_field('userid', XMLDB_TYPE_INTEGER, '8', null, XMLDB_NOTNULL, null, null, 'courseid');
+        $table2->add_field('timecreated', XMLDB_TYPE_INTEGER, '16', null, XMLDB_NOTNULL, null, null, 'userid');
+        $table2->add_field('timemodified', XMLDB_TYPE_INTEGER, '16', null, null, null, null, 'timecreated');
+
+        $table2->add_key('primary', XMLDB_KEY_PRIMARY, ['id']);
 
         // Conditionally launch add field id.
-        if (!$dbman->table_exists($table)) {
-            $dbman->create_table($table);
+        if (!$dbman->table_exists($table2)) {
+            $dbman->create_table($table2);
         }
         
 
         // Iena savepoint reached.
-        upgrade_plugin_savepoint(true, 2024012500, 'format','iena');
+        upgrade_plugin_savepoint(true, 2024101505, 'format','iena');
     }
 
     return $result;
diff --git a/entity/course_format_iena_helper.php b/entity/course_format_iena_helper.php
new file mode 100644
index 0000000000000000000000000000000000000000..f45f72051703720c0942802151cb9f46a2840948
--- /dev/null
+++ b/entity/course_format_iena_helper.php
@@ -0,0 +1,200 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+ *
+ * course_format_iena_sections
+ *
+ * @package    format_iena
+ * @copyright  2018 Softia/Université lorraine
+ * @author     Thomas Fradet
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class course_format_iena_helper {
+
+    /**
+     * @param $idcourse
+     * @return array
+     * @throws dml_exception
+     */
+    public function get_activities($completion, $activesectionid) {
+        $activities = $completion->get_activities();
+        $modules = [];
+        foreach ($activities as $activity) {
+            $module = new StdClass();
+            $module->id = $activity->id;
+            $module->name = $activity->name;
+            $displayname = format_string($activity->name, true, array('context' => $activity->context));
+            $module->displayname = strlen($displayname) > 50 ? mb_substr($displayname, 0, 49, 'UTF-8').'…' : $displayname;
+            $module->section = $activity->section;
+            if($activity->get_url()){
+                 $module->link=$activity->get_url()->out();
+            }
+           
+            $modules[] = $module;
+            if ($activity->section == $activesectionid || $activesectionid == 0 ) {
+                $module->visible = true;
+            } else {
+                $module->visible = false;
+            }
+
+        }
+        return $modules;
+    }
+
+    public function get_groups($groups) {
+        global $USER, $COURSE;
+        // Groupe du GET provenant du sélecteur de la page du cours
+        // ou premier groupe de l'utilisateur, ou groupe 0 (tous les groupes).
+        $groupsall = new StdClass();
+        // TODO à supprimer si pas utilisé dans le JS (mettre dans la clause IF pour éviter un appel inutile si le GET existe).
+        $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).
+       
+
+        // 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).
+
+        $activegroupname = "";
+
+        foreach ($groups as $group) {
+
+            if (in_array($group->id, $currentusergroupsids)) {
+                $currentusergroups[] = $group;
+            } else {
+                $othergroups[] = $group;
+            }
+        }
+
+
+        $groupsall->othergroups = $othergroups;
+        $groupsall->current_user_groups = $currentusergroups;
+        return $groupsall;
+
+    }
+
+    public function get_sections($activesectionid){
+        global $COURSE;
+        // Liste des sections du cours.
+        $modinfo = get_fast_modinfo($COURSE->id);
+        $sectionsinfoall = $modinfo->get_section_info_all();
+        $sections = [];
+
+        foreach ($sectionsinfoall as $key => $sectioninfo) {
+            $section = new StdClass();
+            $section->id = $sectioninfo->id;
+            $section->name = $sectioninfo->name === null || $sectioninfo->name === '' ? 'Section ' . $key : $sectioninfo->name;
+            if ($section->id == $activesectionid) {
+                $section->selected = "selected";
+            }
+
+            $sections[] = $section;
+        }
+        return $sections;
+    }
+
+    public function set_data($data, $modules, $progress, $groups, $activegroupsids, $activesectionid, $listoptions) {
+        global $COURSE, $USER, $CFG;
+
+        $data["modules"] = $modules;;
+        $countmodules = count($data["modules"]);
+        $data["students"] = $this->format_progress($progress, $modules, $groups, $activegroupsids, $activesectionid);
+        $countstudents = count($data["students"]);
+
+        if ($countstudents > 0 && $countmodules > 0) {
+            $data['count_results'] = count($data["students"]);
+        }
+
+        if (has_capability('course/iena:suivi_edit', $context = context_course::instance($COURSE->id), $USER->id)) {
+            $data['link_bulkcompletion'] = $CFG->wwwroot . "/course/bulkcompletion.php?id=" . $COURSE->id;
+        }
+
+        $data['link_classicview'] = $CFG->wwwroot . "/report/progress/index.php?course=" . $COURSE->id;
+        $data['link_editview']=$CFG->wwwroot . "/course/format/iena/suivi_edit.php?courseid=" . $COURSE->id;
+        if($listoptions->listoptions['display_groups']["value"]){
+            $data["display_groups"]=1;
+        }
+        if($listoptions->listoptions['display_details']["value"]){
+            $data["display_details"]=1;
+        }
+
+        // Pour le téléchargement du tableau ?
+        /*if (!isset($data['data'])) {
+            $data['data'] = array();
+        }
+
+        $data['data'] = json_encode($data);*/
+        return $data;
+    }
+
+    public function format_progress($progress, $modules, $groups, $activegroupids, $activesectionid) {
+        global $CFG, $COURSE;
+        $students = array();
+        foreach ($progress as $proginfo) {
+            $progressstudent = new StdClass();
+            $progressstudent->firstname = $proginfo->firstname;
+            $progressstudent->lastname = $proginfo->lastname;
+            $progressstudent->id = $proginfo->id;
+            $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->message_link = $CFG->wwwroot . "/message/index.php?id=" . $progressstudent->id;
+//var_dump($progressstudent);
+            //if ($activegroupid == 0) {
+                $progressstudent->groups = "";
+                $progressstudent->groupsid=array();
+                foreach ($groups as $group) {
+                    
+                    if (in_array($progressstudent->id, $group->members)) {
+                        if(empty( $progressstudent->groups)){
+                            $progressstudent->groups .= $group->name . "";
+                        }
+                        else{
+                            $progressstudent->groups .= ", " .$group->name . " ";
+                        }
+                        array_push( $progressstudent->groupsid, $group->id);
+                    }
+
+                }
+            //}
+
+            foreach ($modules as $key => $module) {
+                $moduleprogress = new StdClass();
+
+                if (!isset($proginfo->progress[$module->id])) {
+                    $moduleprogress->completionstate = '0';
+                } else {
+                    $moduleprogress->completionstate = $proginfo->progress[$module->id]->completionstate;
+                }
+                $moduleprogress->namemodule = $module->name;
+                $moduleprogress->idmodule = $module->id;
+
+                $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;
+            
+        }
+        return $students;
+    }
+
+
+}
diff --git a/lang/en/format_iena.php b/lang/en/format_iena.php
index ae2972cbc296d7b318d05c0ba695eb22e1dec87a..18d6200d0ad3a07787f91537564f13eb55a0e106 100644
--- a/lang/en/format_iena.php
+++ b/lang/en/format_iena.php
@@ -121,3 +121,6 @@ $string['messagesSent']="Messages sent";
 $string['messagesNotSent']="An error occured: the messages could not be sent";
 $string['enable_icon_click']="Enable clicks on student progress";
 $string['enable_icon_click_help']="By default, students can access directly their activies by clicking on their bubbles in their progress dashboard. You can disable these links so they can't have access to them out of context.";
+$string['searchplaceholder']="Name, student ID...";
+$string['searchstudent']="Search";
+$string['filterstudent']="Filters";
\ No newline at end of file
diff --git a/lang/fr/format_iena.php b/lang/fr/format_iena.php
index 5a846b6d3c13f89b92e4eaef91d20dc5780e10f1..13b77cab8294d49bb066b56a66ef2c5066eec5af 100644
--- a/lang/fr/format_iena.php
+++ b/lang/fr/format_iena.php
@@ -121,3 +121,6 @@ $string['messagesSent']="Message(s) envoyé(s)";
 $string['messagesNotSent']="Une erreur s'est produite : le()s message(s) n'ont pas été envoyé(s)";
 $string['enable_icon_click']="Activer les pastilles cliquables";
 $string['enable_icon_click_help']="Par défaut, les étudiants peuvent accéder directement aux activités en cliquant sur leur pastille dans leur interface de progression. Vous pouvez désactiver ces liens pour que les étudiants ne puissent pas accéder aux ressources en dehors d'un certain contexte.";
+$string['searchplaceholder']="Nom, numéro étudiant...";
+$string['searchstudent']="Rechercher un étudiant";
+$string['filterstudent']="Filtres";
diff --git a/styles.css b/styles.css
index 09b35d32170ff0e2f0090c49e2f902c29785768d..253f5635985eb6744459028d361b481a1ba57efa 100644
--- a/styles.css
+++ b/styles.css
@@ -737,7 +737,7 @@ span#days-text{
 /* Permet la rotation des entêtes du tableau */
 th.th-rotate {
 	/* Something you can count on */
-	height: 185px;
+	height: 205px;
 	white-space: nowrap;
 	position: sticky;
 	top:0;
@@ -748,7 +748,7 @@ th.th-rotate > div {
 	transform: 
 	/* Magic Numbers */
 	/*translate(18px, 53px)*/
-    translate(18px, 74px)
+    translate(18px, 84px)
 	/* 45 is really 360 - 45 */
 	rotate(315deg);
 	width: 30px;
@@ -935,6 +935,18 @@ tbody th{
 	padding-bottom: .5rem;
 }
 
+.group-column-iena{
+	padding-left: 6px;
+	padding-right: 10px;
+
+}
+
+th.group-column-iena{
+	background: white;
+	  z-index: 200;
+	  position: sticky;
+}
+
 #caption-iena .caption-status{
 	display: flex;
 	margin-right: 20px;
@@ -943,7 +955,7 @@ tbody th{
 
 #caption-iena .caption-status .pointer-help{
 	width: 32px;
-	height: 25px;
+	height: 26px;
 	margin-right: 7px;
 	display: flex;
     align-items: center;
@@ -1112,6 +1124,10 @@ th.first-column-iena, th.second-column-iena, th.actions-column-iena, th.third-co
     top: 13px;
 }
 
+.iena-custom-dropdown .dropdown-toggle:disabled{
+	background-color: #e9ecef;
+}
+
 .iena-dynamic-options, .iena-dynamic-activities{
     list-style: none;
     padding: 0;
@@ -1256,6 +1272,70 @@ border-bottom: 1px solid #dee2e6;
 	margin:0!important;
 }
 
+
 #drawermenu > ul.navbar{
 	padding:0;
+
+#iena-search-tag, #iena-filters-tag{
+	display: none;
+	vertical-align: middle;
+}
+
+#iena-search-bar{
+	margin-top: 30px;
+}
+
+#iena-search-bar input{
+	width: auto;
+  	display: inline-block;
+  	vertical-align: middle;
+}
+
+#iena-more-filters input{
+	flex-basis: 50px;
+  	flex-grow: 0;
+  	flex-shrink: 0;
+	margin: 0 3px 0 10px;
+	border-color: #e9ecef;
+	border-radius: 0.5rem;
+	text-align: right;
+}
+
+#iena-more-filters span{
+	line-height: 35px;
+}
+
+#check-more-filters{
+	line-height: 35px;
+	margin-left: 20px;
+	cursor: pointer;
+	color: #2a657d;
+	pointer-events: auto;
+}
+
+#check-more-filters:hover{
+	color: #204e60;
+}
+
+#check-more-filters.disabled{
+	pointer-events: none;
+	color:grey;
+}
+
+/* HTML: <div class="loader"></div> */
+.loader {
+  width: 50px;
+  aspect-ratio: 1;
+  border-radius: 50%;
+  background: radial-gradient(farthest-side,#2a657d 94%,#0000) top/8px 8px no-repeat,conic-gradient(#0000 30%,#2a657d);
+  -webkit-mask: radial-gradient(farthest-side,#0000 calc(100% - 8px),#000 0);
+  animation: l13 1s infinite linear;
+  display: inline-block;
+  width: 20px;
+  line-height: 20px;
+  vertical-align: bottom;
+}
+@keyframes l13{ 
+  100%{transform: rotate(1turn)}
+
 }
\ No newline at end of file
diff --git a/suivi_edit.php b/suivi_edit.php
index e040ad188aafe7a45d0f8840289db7e0c6e32f3a..f894f193a9cad663f4c335d5a8c2558ac8bc86f6 100644
--- a/suivi_edit.php
+++ b/suivi_edit.php
@@ -29,7 +29,7 @@ define('NO_OUTPUT_BUFFERING', true);
 
 
 require_once('../../../config.php');
-require_once($CFG->dirroot. '\course\format\iena\classes\form\edittable_form.php');
+require_once($CFG->dirroot. '/course/format/iena/classes/form/edittable_form.php');
 
 
 
diff --git a/suivi_unit.php b/suivi_unit.php
index 3deaa00b5e7cd9e81061468e7a6817e1b23c8f4e..74c8d29939f59824f07d8da5a7d7deee2da5455c 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 {
@@ -103,10 +89,12 @@ function get_groups($context, $activegroupids, $groups) {
 
 // Formate l'achèvement d'activités pour le tableau de suivi. Pour chaque étudiant, on aura
 // dans le bon ordre la liste des modules et le completionstate.
-function format_progress($progress, $modules, $groups, $activegroupids, $activesectionid) {
+function format_progress($progress, $modules, $groups, $search=false, $activegroupids=0, $activesectionid=0) {
+
     global $CFG, $COURSE;
     $students = array();
     foreach ($progress as $proginfo) {
+
         $progressstudent = new StdClass();
         $progressstudent->firstname = $proginfo->firstname;
         $progressstudent->lastname = $proginfo->lastname;
@@ -116,10 +104,10 @@ function format_progress($progress, $modules, $groups, $activegroupids, $actives
         $progressstudent->report_link = $CFG->wwwroot . "/report/outline/user.php?id=" .
         $progressstudent->id . "&course=" . $COURSE->id . "&mode=outline";
         $progressstudent->message_link = $CFG->wwwroot . "/message/index.php?id=" . $progressstudent->id;
-
-        //if ($activegroupid == 0) {
-            $progressstudent->groups = "";
-            $progressstudent->groupsid=array();
+        $progressstudent->groups = "";
+        $progressstudent->groupsid=array();
+       
+        if (!$search) {
             foreach ($groups as $group) {
                 if (in_array($progressstudent->id, $group->members)) {
                     if(empty( $progressstudent->groups)){
@@ -131,8 +119,12 @@ function format_progress($progress, $modules, $groups, $activegroupids, $actives
                     array_push( $progressstudent->groupsid, $group->id);
                 }
             }
-        //}
-
+        }
+        else{
+            $progressstudent->groups= $proginfo->groups;
+            $progressstudent->groupsid= $proginfo->groupsid;
+        }
+        
         foreach ($modules as $key => $module) {
             $moduleprogress = new StdClass();
 
@@ -146,10 +138,7 @@ 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;
-        }*/
+        //error_log(print_r($progressstudent, true));
         $students[] = $progressstudent;
         
     }
@@ -202,7 +191,7 @@ function get_sections($activesectionid) {
     return $sections;
 }
 
-function set_filters($data, $filters, $symbols, $sections, $groups, $currentusergroups, $othergroups, $activesectionid) {
+function set_filters($data, $filters, $symbols, $sections, $currentusergroups, $othergroups, $activesectionid) {
     if (isset($_GET['filter'])) {
         $filtercomplete = $_GET['filter'];
         $symbols[mb_substr($filtercomplete, 0, 1, 'UTF-8')]->selected = "selected";
@@ -214,6 +203,12 @@ function set_filters($data, $filters, $symbols, $sections, $groups, $currentuser
 
     $data['filters'] = array_values($filters);
     $data['symbols'] = array_values($symbols);
+    
+
+   
+
+
+
     $data["sections"] = $sections;
     //Ici on récupère les groupes "autres" auxquels je n'appartiens pas
     //$data["groups"] = array_values($groups);
@@ -232,17 +227,17 @@ function set_filters($data, $filters, $symbols, $sections, $groups, $currentuser
     return $data;
 }
 
-function set_data($data, $modules, $progress, $groups, $activegroupsids, $activesectionid, $listoptions) {
+//
+function set_links($data, $modules,$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"]);
+    $countmodules = count($modules);
 
+    //$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,14 +252,119 @@ function set_data($data, $modules, $progress, $groups, $activegroupsids, $active
     if($listoptions->listoptions['display_details']["value"]){
         $data["display_details"]=1;
     }
+    
+
+    //$data['data'] = json_encode($data);
+    return $data;
+}
 
-    // Pour le téléchargement du tableau ?
-    if (!isset($data['data'])) {
-        $data['data'] = array();
+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){
+            error_log("on est passé dans le cache");
+            $progress=$cache->get($courseid."-".$activegroupsids[$i]);
+            
+        }
+        else{
+            //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<1500){
+                error_log("on set le cache");
+                $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, false, $activegroupsids, $activesectionid);
+}
+
+function get_progress_student($identifier, $completion, $modules){
+    global $DB;
+    global $COURSE;
+    $countmethod=0;
+    $users=array();
+    
+    //Essayer de faire des switch case avec counttries
+    $arrayparams=array();
+    
+    $explodedname=explode(" ", $identifier);
+    $sql="SELECT DISTINCT u.id, u.firstname, u.lastname, u.email, u.idnumber
+            FROM {user} u
+            JOIN {user_enrolments} ue ON ue.userid = u.id
+            JOIN {enrol} e ON e.id = ue.enrolid
+            JOIN {role_assignments} ra ON ra.userid = u.id
+            JOIN {context} ct ON ct.id = ra.contextid AND ct.contextlevel = 50
+            JOIN {course} c ON c.id = ct.instanceid AND e.courseid = c.id
+            JOIN {role} r ON r.id = ra.roleid AND r.shortname = 'student'
+            WHERE e.status = 0 AND u.suspended = 0 AND u.deleted = 0 AND c.id= ?";
+    $arrayparams[]=$COURSE->id;
+    if(count($explodedname)>1){
+
+        
+        $sql.=" AND (u.lastname LIKE ? AND u.firstname LIKE ?) OR (u.lastname LIKE ? AND u.firstname LIKE ?)";
+        
+        array_push($arrayparams, $explodedname[0], $explodedname[1], $explodedname[1], $explodedname[0]);
+    }
+    else{
+        $sql.=" AND u.lastname LIKE ? OR u.idnumber = ?";
+
+        array_push($arrayparams, "".$identifier."%", $identifier);
+    }
+
+
+    $users=array_values($DB->get_records_sql($sql, $arrayparams));
+    if(count($users)>0){
+
+        $completion_student=array();
+        $where = array();
+        $where_params = array();
+       
+        //regarder get_in_or_equal
+        for($i=0; $i<count($users);$i++){
+       // foreach($users as $user){
+            
+            $where = $DB->sql_equal('u.id', ':idstudent', false, false);
+            $where_params['idstudent'] = $users[$i]->id.'%';
+            $completion_student=array_values($completion->get_progress_all($where, $where_params));
+            $usergroup=groups_get_all_groups($COURSE->id, $users[$i]->id);
+            $completion_student[0]->groups="";
+            $completion_student[0]->groupsid=array();
+            
+            foreach($usergroup as $group){
+
+                $completion_student[0]->groups.=$group->name;
+                $completion_student[0]->groupsid[]=$group->id;
+                
+            }
+            $arrayprogress=(object) array_unique(array_merge((array) $arrayprogress, (array) $completion_student), SORT_REGULAR);   
+        }
+        return format_progress($arrayprogress, $modules, false, true);
+
+    }
+    else{
+        
+        //On a pas trouvé d'utilisateur
+        return array("error"=>"Pas d'utilisateurs trouvés");
+    }
+    
 
-    $data['data'] = json_encode($data);
-    return $data;
 }
 
 $filters = [
@@ -313,10 +413,12 @@ $symbols = [
     ]
 ];
 
-//On s'occupe des options ici
 
 
+//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 +431,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();
@@ -339,42 +443,28 @@ if (!has_capability('course/iena:suivi', $context = context_course::instance($co
     exit;
 }
 
+$countstudents=count_enrolled_users($context);
 
-
+//Si on a sélectionné des groupes dans les filtres
 if (isset($_POST['groupsid'])) {
+    
     $activegroupsids = $_POST['groupsid'];
 } else {
-    $activegroupsids = array(0);
-}
-
-
-$cache = cache::make('format_iena', 'students');
+    if($countstudents>1500){
 
-//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]);
-       
-        
+        $activegroupsids = array();
     }
     else{
-        $progressrequest = $completion->get_progress_all(
-            '',
-            array(),
-            $activegroupsids[$i],
-            'u.lastname ASC, u.firstname ASC',
-            '',
-            '',
-            $context
-        );
-        $cache->set($activegroupsids[$i], $progressrequest);
-        $progress=$progressrequest;
+        $activegroupsids = array(0);
     }
-     $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.
@@ -383,9 +473,10 @@ if (isset($_GET['sectionid'])) {
 }
 
 // On récupère les ids des membres parce que dans l'excel on veut savoir qui appartient à quel groupe.
-$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');
@@ -400,8 +491,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{
@@ -423,9 +512,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;*/
       
     }
@@ -439,29 +526,46 @@ 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["competiondetails"] = $completiondetails;
+    $data["completiondetails"] = $completiondetails;
     $data["activityname"]=$cm->name;
 
   
     echo json_encode($data);
 } 
+else if(isset($_POST['action']) && $_POST['action'] == 'search_student' && isset($_POST['search_input'])){
+
+    $data=[];
+    $sanitized=filter_var($_POST['search_input'], FILTER_SANITIZE_STRING);
+    $modules = get_activities($completion, $activesectionid);
+    $data["modules"]=$modules;
+    $data["students"]=get_progress_student($sanitized, $completion, $modules);
+    //$data = set_links($data, $modules, $listoptions);
+    echo json_encode($data);
+}
 // 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.
+    
+    $groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true);
     $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"]=$countstudents;
+
+    $data["groups"]=$activegroupsids;
+    $data["courseid"]=$courseid;
+    //$data = set_links($data, $modules, $listoptions);
+
     echo json_encode($data);
-} else {
+} 
 
+else {
     init_page($course, $PAGE);
     echo $OUTPUT->header();
-
     //$progress=$cache->get($activegroupids);
-    $progress=$arrayprogress;
+    $groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true);
     $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){
@@ -472,6 +576,7 @@ else if (isset($_POST['action']) && !empty($_POST['action'])) {
         $data["completion_enabled"]=1;
         $currentusergroups = [];
         $activegroupname = "";
+
         
 
         $modules = get_activities($completion, $activesectionid);
@@ -483,15 +588,16 @@ else if (isset($_POST['action']) && !empty($_POST['action'])) {
         }
         //$groups = $groupsall->groups;
         $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, $arrayprogress, $groups, $activegroupsids, $activesectionid, $listoptions);
-
+        //$data["countstudents"]=$countstudents;
+        $data = set_links($data, $modules, $listoptions);
+        $data = set_filters($data, $filters, $symbols, $sections,  $groupsall->current_user_groups, $groupsall->othergroups, $activesectionid);
+        $data["groups"]=$activegroupsids;
         if (isset($_GET["msg_success"])) {
             $msg = $_GET["msg_success"];
             $data["msg_success"] = $msg;
         }
-        
+
+
       
 }
  
diff --git a/templates/courseformat/content.mustache b/templates/courseformat/content.mustache
index 48288f14758c868777e2c7fa06893a6ba9ca951d..02ee1db0f459e70fddadfb0867bb495fbf1418b0 100644
--- a/templates/courseformat/content.mustache
+++ b/templates/courseformat/content.mustache
@@ -308,6 +308,7 @@
             {{> core_courseformat/local/content/bulkedittools}}
         {{/ core_courseformat/local/content/bulkedittools}}
     {{/bulkedittools}}
+
 </div>
 {{#js}}
 require(['core_courseformat/local/content'], function(component) {
diff --git a/templates/suivi-table.mustache b/templates/suivi-table.mustache
index 58e09a60d6f8ac4d96ce2c63486f7a2f59c87d92..314f9abbc13c238ddbcc19358562b093395dc005 100644
--- a/templates/suivi-table.mustache
+++ b/templates/suivi-table.mustache
@@ -2,6 +2,7 @@
 	
 	<div class="table-wrapper">
 		<table id="suivi">
+
 			<thead>
 				<tr id="modules">
 					
diff --git a/templates/suivi.mustache b/templates/suivi.mustache
index 0e84aa4b894cc2d292327af8688624bf13a3c967..6e1947537953591f98ce2e436c14ecc3105e6a4a 100644
--- a/templates/suivi.mustache
+++ b/templates/suivi.mustache
@@ -1,7 +1,7 @@
 {{#completion_enabled}}
 <div>
 
-	<h2 class="mb1" style="display: inline-block;">{{#str}}table_progress, format_iena{{/str}}</h2>
+	
 	<div class="context-header-settings-menu">
         <div class="action-menu moodle-actionmenu d-inline" id="action-menu-3" data-enhance="moodle-core-actionmenu">
 	        <div class="menubar d-flex " id="action-menu-3-menubar" role="menubar">
@@ -30,7 +30,10 @@
 	</div>
 </div>
 
+<h4 style="margin-top:30px;">{{# str }} filterstudent, format_iena {{/ str}}</h4>
 <form style="clear: right;" class="form-inline iena-filters" action="" method="GET">
+
+<br>
 	<input name="courseid" type="number" hidden="hidden" style="display: none;" value="">
 
 	<label class="sr-only" for="section-select">Section</label>
@@ -82,7 +85,7 @@
 		<ul class="dropdown-menu dropdown-menu-form" id="iena-group-dropdown">
 			<li>
 				<label class="checkbox">
-				<input type="checkbox" class="selectallgroups" checked value='0' {{default_group}}>{{# str }} allGroupsLabel, format_iena {{/ str}}</label>
+				<input type="checkbox" class="selectallgroups" value='0' {{default_group}}>{{# str }} allGroupsLabel, format_iena {{/ str}}</label>
 			</li>
 			
 			<li class="divider"></li>
@@ -126,7 +129,7 @@
 			{{/symbols}}
 			
 		</select>
-		<select class="custom-select mr-sm-2" id="filter-select" name="filter">
+		<select class="custom-select mr-sm-2" id="completion-select" name="filter">
 			
 			{{#filters}}
 				<option {{selected}} value='{{value}}'>{{name}}</option>
@@ -134,7 +137,54 @@
 			
 		</select>
 	</div>
+	<div style="width: 100%;margin-top:15px">
+		<a href="#" id="link-more-filters">Filtres avancés</a>
+		<div id="iena-more-filters" style="display:none">
+		
+			<div class="input-group">
+				<div class="input-group-prepend">
+					<label>Achèvement compris entre</label>
+				</div>
+				
+				<input type="text" class="form-control" id="completion-select-begin"></input>
+				<span>% et </span>
+				
+				<input type="text" class="form-control" id="completion-select-end"></input><span>%</span>
+				<i id="check-more-filters" class="icon fas fa-floppy-disk fa-fw " title="Enregistrer les filtres" aria-label="Enregistrer les filtres"></i>
+			</div>
+			<div id="iena-filters-error" class="invalid-feedback">
+				Veuillez entrer des valeurs numériques comprises entre 0 et 100.
+			</div>
+			<div id="iena-filters-tag">
+				<div class="form-autocomplete-selection d-inline-block my-0 form-autocomplete-multiple h5" role="listbox" aria-atomic="true" tabindex="0"></div>
+
+			</div>
+			
+		</div>
+	</div>
+
 </form>
+
+<div>
+
+	<div id="iena-search-bar">
+		<h4>{{# str }} searchstudent, format_iena {{/ str}}</h4>
+		<form class="needs-validation" id="iena-search-form">
+			<input type="text" class="form-control" name="iena-search-student" placeholder="{{# str }} searchplaceholder, format_iena {{/ str}}"></input>
+			
+			<button id="iena-button-search" type="submit" class="btn btn-primary">Rechercher</button>
+			<div id="iena-search-tag">
+				<div class="form-autocomplete-selection d-inline-block my-0 form-autocomplete-multiple h5" role="listbox" aria-atomic="true" tabindex="0"></div>
+
+			</div>
+			<div id="iena-search-error" class="invalid-feedback">
+				Veuillez entrer au moins 3 caractères.
+			</div>
+		</form>
+		
+	</div>
+</div>
+
 {{#msg_success}}
 	<div class="alert alert-success iena-message">{{# str }} messagesSent, format_iena {{/ str}}</div>
 {{/msg_success}}
@@ -155,7 +205,7 @@
 {{#js}}
 require(['format_iena/suivi', 'core/templates'], function(module) {
     module.registerFilters();
-   	module.registerSubmit({{{ data }}});
+   	module.registerSubmit();
    	module.registerSelectAllActivitiesFilter();
    	module.registerSelectAllGroupsFilter();
    	module.initTable();
diff --git a/version.php b/version.php
index 12a61a7d403e0b82b4ec48962cad4f7d9240ddf0..886faaf591a0d5cd7d37b470fe13e82bab973956 100644
--- a/version.php
+++ b/version.php
@@ -27,7 +27,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2024101506;
+$plugin->version = 2025040300;
 $plugin->requires = 2014111000;
 $plugin->component = 'format_iena';
 $plugin->release = "1.0";