diff --git a/amd/build/suivi.js b/amd/build/suivi.js
index 9659ffdff0d2580385156637d3119a28d5816c50..78c80bde8cbf57934835a301f991f31eb555c15e 100644
--- a/amd/build/suivi.js
+++ b/amd/build/suivi.js
@@ -22,21 +22,69 @@
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 define(['jquery'],
-       function($, ajax, templates) {
+       function($, ajax, templates, data) {
        	var all_selected=false;
+      
        	return{
        		registerSelectAll:function(data){
+       			var datas=data;
+       			console.log(datas);
        			$('#iena-select-all').on('click', function(e){
-	    		select_all_studs(e, data);
+	    		select_all_studs(e);
 
-	    	})
-       		} 
+	    		});
+	    		$("#section-select").on('change', function(e){
+	    			changeFilter(e, 'section');
+	    		});
+	    		$("#group-select").on('change', function(e){
+	    			changeFilter(e, 'group');
+	    		});
+	    		
+       		},
+       		registerSubmit:function(data){
+       			$("#id_submit_iena").on('click', function(e){
+	    		
+	    			triggerAction(e, data);
+	    		})
+       		}
        		
        	}
 
-    
-    function select_all_studs(e, data) {
-		//e.preventDefault();
+    function changeFilter(e, list){
+
+    	url=window.location.search;
+    	urlParams = new URLSearchParams(url);
+    	courseid=urlParams.get('courseid');
+    	sectionid=urlParams.get('sectionid');
+    	groupid=urlParams.get('groupid');
+    	if(list=='section'){
+    		sectionid=$("#section-select").val();
+    	}
+    	else if(list=="group"){
+    		groupid=$("#group-select").val();
+    	}
+    	completeUrl='suivi_unit.php?courseid='+courseid;
+    	if(sectionid){
+    		completeUrl+='&sectionid='+sectionid;
+    	}
+    	if(groupid){
+    		completeUrl+="&groupid="+groupid;
+    	}
+    	
+
+    	$.ajax({ url: completeUrl,
+         data: {action: 'test'},
+         type: 'post',
+         success: function(request) { 
+         	$("#partial-table").html(request);
+         	
+         	window.history.pushState('suivi',"", completeUrl);
+         	
+		}
+		});
+    }
+
+    function select_all_studs(e) {
 		all_selected=!all_selected;
 		var counter = 0;
 		var checks = document.querySelectorAll("#table-body tr");
@@ -46,11 +94,57 @@ define(['jquery'],
 				box.checked = all_selected;
 				counter++;
 			}
-			
 		}
 	}
 
-	function table_download() {
+
+	function getSelectedStudents(){
+		var selectedChecks=$("#table-body input:checked");
+		var students=[];
+		for(var i=0; i < selectedChecks.length; i++){
+			console.log(selectedChecks[i]);
+			students.push(selectedChecks[i].value);
+		}
+		console.log(students);
+		return students;
+
+	}
+
+
+	function triggerAction(e, data){
+		value=$("#select-actions-suivi-iena").val();
+		
+		if(value=="msg"){
+			console.log("on va envoyer un message");
+		}
+		else if(value=="download"){
+			table_download(data);
+		}
+	}
+
+
+	function slug_it(str) {
+		return str.toString().toLowerCase().trim()
+		.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 - */
+	}
+
+
+	function padLeft(date){
+		
+		return String(date).length > 1? date : '0'+date ;
+	}
+
+	/*Number.prototype.padLeft = function(base,chr){
+		var  len = (String(base || 10).length - String(this).length)+1;
+		return len > 0? new Array(len).join(chr || '0')+this : this;
+	}*/
+
+
+	function table_download(data) {
+		var students=getSelectedStudents();
 		var csvContent = "data:text/csv;charset=utf-8,";
 		var head = ['Moodle_id', 'Prénom', 'Nom', 'Groupe', 'Complétion (en %)'];
 
@@ -64,20 +158,26 @@ define(['jquery'],
 
 		csvContent += head.join(",");
 		csvContent += "\n";
+		data.active_section_id=$("#section-select").val();
 		/* Pour chaque étudiant */
-		for ( var s = 0; s < data.progress.length; s++ ) {
+		for ( var s = 0; s < data.students.length; s++ ) {
 			var arr_cpl = [];
 
 			/* Pour chaque activité du cours */
 			var activities_nbr = 0;
 			var done_activities_nbr = 0;
+			
+
 			for ( var mod = 0; mod < data.modules.length; mod++ ) {
 				/* Si le module n'est pas dans la section actuellement filtrée */
+				
+				console.log(data.modules[mod].section);
 				if ( data.active_section_id != data.modules[mod].section && data.active_section_id != 0 ) {
 					continue;
 				}
+				
 
-				var stud_progress = data.progress[s].progress
+				var stud_progress = data.students[s].progress
 				/* Si l'étudiant n'a pas de progres*/
 				if ( stud_progress.length == 0 ) {
 					arr_cpl.push(0);
@@ -85,16 +185,18 @@ define(['jquery'],
 					// var prog = 0;
 					/* Pour chaque trace d'achèvement */
 					var cpl = 0;
-					for (progress in stud_progress) {
+					for (var i =0; i<stud_progress.length; i++) {
+						
 						/* Quand l'index de progression correspond à l'id du module */
-						if ( data.modules[mod].id == progress ) {
-							cpl = stud_progress[progress].completionstate;
+						if ( data.modules[mod].id == stud_progress[i].idmodule ) {
+							cpl = stud_progress[i].completionstate;
 							if (cpl == 3) {
 								cpl = 0.5;
 								cpl = '"' + cpl.toLocaleString() + '"';
 							}
 						}
 					}
+					
 					if (cpl == 1 || cpl == 2) {
 						done_activities_nbr++;
 					}
@@ -102,24 +204,25 @@ define(['jquery'],
 				}
 				activities_nbr++;
 			}
-
-			// console.log(done_activities_nbr)
-			// console.log(activities_nbr)
 			
 			var perc = Math.round(100 * 100 * done_activities_nbr / activities_nbr) / 100;
 
-			// console.log(data.progress[s]);
+			// console.log(data.students[s]);
 			var groups = '"';
+			
+			
+			data.active_group_name=$('#group-select').find('option:selected').html()
+			console.log(data.active_group_name);
 			if ( data.active_group_name != "" ) {
 				groups += data.active_group_name.replace('"', '');
 			} else {
-				groups += data.progress[s].groups.replace('"', '');
+				groups += data.students[s].groups.replace('"', '');
 			}
 			groups += '"';
 			var arr = [
-			data.progress[s].id,
-			data.progress[s].firstname,
-			data.progress[s].lastname,
+			data.students[s].id,
+			data.students[s].firstname,
+			data.students[s].lastname,
 			groups,
 			'"'+perc.toLocaleString()+'"',
 			arr_cpl
@@ -148,7 +251,11 @@ define(['jquery'],
 		// var section_name = slug_it(this.active_section.section_name).substring(0, 10);
 		var d = new Date;
 		month = d.getMonth()+1;
-		date = d.getFullYear() +"."+ month.padLeft() +"."+ d.getDate().padLeft() +"-"+ d.getHours().padLeft() +"."+ d.getMinutes().padLeft() +"."+ d.getSeconds().padLeft();
+
+
+		//date = d.getFullYear() +"."+ month.padLeft() +"."+ d.getDate().padLeft() +"-"+ d.getHours().padLeft() +"."+ d.getMinutes().padLeft() +"."+ d.getSeconds().padLeft();
+		date = d.getFullYear() +"."+ padLeft(month) +"."+ padLeft(d.getDate()) +"-"+ padLeft(d.getHours()) +"."+ padLeft(d.getMinutes()) +"."+ padLeft(d.getSeconds());
+		//stringdate = d.getFullYear() +"."+ month +"."+ d.getDate().padLeft() +"-"+ d.getHours().padLeft() +"."+ d.getMinutes().padLeft() +"."+ d.getSeconds().padLeft();
 
 		var link = document.createElement("a");
 		link.setAttribute("href", encodedUri);
@@ -158,18 +265,7 @@ define(['jquery'],
 		document.body.removeChild(link); 
 	}
 
-	function slug_it(str) {
-		return str.toString().toLowerCase().trim()
-		.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 - */
-	}
-
-	Number.prototype.padLeft = function(base,chr){
-		var  len = (String(base || 10).length - String(this).length)+1;
-		return len > 0? new Array(len).join(chr || '0')+this : this;
-	}
+	
 
 
 	console.log("on passe par le js");
diff --git a/amd/src/suivi.js b/amd/src/suivi.js
index 741d063fb5266cf800413a4b2bd6460e51e0a408..fd6876501f81f10be807131c8fa18760b538e979 100644
--- a/amd/src/suivi.js
+++ b/amd/src/suivi.js
@@ -43,6 +43,7 @@ define(['jquery'],
 
     function select_all_studs(e) {
 		//e.preventDefault();
+		console.log("this one src");
 		var counter = 0;
 		var checks = document.querySelectorAll("#table-body tr");
 		for (var i = 0; i < checks.length; i++) {
diff --git a/renderer.php b/renderer.php
index a00c6e0445b6133fbfe06cd45e432044305d2965..23fcb3ca25b69ad4c4c8d1ed7e2032a7bad2f45b 100644
--- a/renderer.php
+++ b/renderer.php
@@ -1272,4 +1272,8 @@ class format_iena_renderer extends format_topics_renderer{
 	public function display_completion($data){
 		echo $this->render_from_template('format_iena/suivi', $data);
 	}
+
+	public function display_table_completion($data){
+		echo $this->render_from_template('format_iena/suivi-table', $data);
+	}
 }
diff --git a/suivi_unit.php b/suivi_unit.php
index eb6a04165e688927bcc163fc9aa30f79aeea516b..4c32eb9869242348ff901e235d6746f6174d80a6 100644
--- a/suivi_unit.php
+++ b/suivi_unit.php
@@ -30,74 +30,245 @@ 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');
 
-global $COURSE, $DB, $USER;
+global $COURSE, $DB, $USER, $PAGE;
 
-// global $CFG;
-// require_once ($CFG->libdir . '/csvlib.class.php');
-// $arr = [
-// 	["a", "b", "c"],
-// 	["d", "e", "f"]
-// ];
-// csv_export_writer::download_array("machin.csv", $arr);
+function init_page($course){
+	global $PAGE;
+	// Defines the id of the course with a get parameter
+	
+	// Getting DB information (*)  of the course
+	
+	$PAGE->set_title($course->fullname);
+	$PAGE->set_heading($course->fullname . " – Suivi des étudiants");
 
+	$PAGE->set_pagelayout('incourse');
 
 
+	/* Cache le menu dans le header ?  */
+	$coursenode = $PAGE->navbar->add('suiviiena', null, navigation_node::TYPE_CONTAINER, null, 'suiviena');
+	$coursenode->make_active();
+	$coursenode->force_open();
 
-// Defines the id of the course with a get parameter
-$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));
+}
 
+function get_groups($context, $active_group_id, $progress, $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). */
+	
 
-$PAGE->set_url($url);
+	// @TODO à supprimer si pas utilisé dans le JS (mettre dans la clause IF pour éviter un appel inutile si le GET existe)
+	$current_user_groups_ids=array();
+	/* 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 ($active_group_id == NULL || ($active_group_id == 0 && !has_capability('course/iena:suivi_edit', $context, $USER->id)) ) {
+		if ( count($current_user_groups_ids) == 0 ) {
+			$active_group_id = 0;
+		} else {
+			$current_user_groups_ids = groups_get_user_groups($COURSE->id, $USER->id)[0];
+			$active_group_id = $current_user_groups_ids[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) */
+	
 
-// Getting DB information (*)  of the course
-$course = $DB->get_record('course', array('id' => $courseID), '*', MUST_EXIST);
+	$current_user_groups = [];
+	$active_group_name = "";
+	
+	foreach ($groups as $group) {
+		/* Récupération du nom du group actif au passage */
+		if ( $group->id == $active_group_id ) {
+			$active_group_name = $group->name;
+			
+			$group->selected='selected';
+		}
+		foreach ($current_user_groups_ids as $ugi) {
+			if ( $group->id == $ugi ) {
+				$current_user_groups[] = $group;
+			}
+		}
+	}
 
-//require_login($course, false, NULL);
-require_login($course);
-$PAGE->set_title($course->fullname);
-$PAGE->set_heading($course->fullname . " – Suivi des étudiants");
+	//Réservé pour l'export ?
+	/*if ( $active_group_id == 0 ) {
+		foreach ($progress as $prog) {
 
-$PAGE->set_pagelayout('incourse');
+			
+			$prog->groups = "";
+			foreach ($groups as $group) {
+				if ( in_array($prog->id, $group->members) ) {
+					$prog->groups .= $group->name . " ";
+				}
+			}
+		}
+	}*/
+	return $groups;
 
+}
 
-/* Cache le menu dans le header ?  */
-$coursenode = $PAGE->navbar->add('suiviiena', null, navigation_node::TYPE_CONTAINER, null, 'suiviena');
-$coursenode->make_active();
-$coursenode->force_open();
+//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, $active_group_id){
+	global $CFG, $COURSE;
+	$students=array();
+	foreach ($progress as $prog_info) {
+		$progress_student=new StdClass();
+		$progress_student->firstname=$prog_info->firstname;
+		$progress_student->lastname=$prog_info->lastname;
+		//$progress_student->name=$prog_info->firstname." ".$prog_info->lastname;
+		$progress_student->id=$prog_info->id;
+		$progress_student->email=$prog_info->email;
+		$progress_student->progress=array();
+		$progress_student->report_link=$CFG->wwwroot . "/report/outline/user.php?id=" . $progress_student->id . "&course=" . $COURSE->id . "&mode=outline";
+		$progress_student->message_link=$CFG->wwwroot . "/message/index.php?id=" . $progress_student->id;
 
 
+		if ( $active_group_id == 0 ) {
+			
 
+				
+			$progress_student->groups = "";
+			foreach ($groups as $group) {
+				if ( in_array($progress_student->id, $group->members) ) {
+					$progress_student->groups .= $group->name . " ";
+				}
+			}
+			
+		}
 
 
-require_once($CFG->libdir . '/completionlib.php');
-$completion = new completion_info($course);
-$context = context_course::instance($COURSE->id);
+		foreach($modules as $key=>$module){
+			
+			$module_progress=new StdClass();
+			
+			if(!isset($prog_info->progress[$module->id])){
+				
+				$module_progress->completionstate='0';
+			}
+			else{
+				$module_progress->completionstate=$prog_info->progress[$module->id]->completionstate;
+			}
+			$module_progress->namemodule=$module->name;
+			$module_progress->idmodule=$module->id;
+			
+			$progress_student->progress[$key]=$module_progress;
+		}
 
-// if (!has_capability('moodle/course:sectionvisibility', $context = context_course::instance($courseID), $USER->id)) {
-if (!has_capability('course/iena:suivi', $context = context_course::instance($courseID), $USER->id)) {
-	$link = $CFG->wwwroot . '/course/view.php?id=' . $courseID;
-	header("Location: {$link}");
-	exit;
+		$students[]=$progress_student;
+	}
+	return $students;
+	
+}
+
+
+function get_activities($completion, $active_section_id){
+	$activities = $completion->get_activities();
+	$modules = [];
+	foreach ($activities as $activity) {
+		if($activity->section == $active_section_id || $active_section_id==0 ){
+			$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) > 20 ? mb_substr($displayname, 0, 19, 'UTF-8').'…' : $displayname;
+			$module->section = $activity->section;
+			$modules[] = $module;
+		}
+		
+	}
+	return $modules;
+}
+
+function get_sections($active_section_id){
+	global $COURSE;
+	// Liste des sections du cours
+	$modinfo = get_fast_modinfo($COURSE->id);
+	$sections_info_all = $modinfo->get_section_info_all();
+	$sections = [];
+
+	
+
+
+	foreach ($sections_info_all as $key => $section_info) {
+		$section = new StdClass();
+		$section->id = $section_info->id;
+		$section->name = $section_info->name === NULL || $section_info->name === '' ? 'Section ' . $key : $section_info->name;
+		if($section->id==$active_section_id){
+			$section->selected="selected";
+		}
+
+		$sections[] = $section;
+
+	}
+	return $sections;
+}
+
+
+
+//useless ?
+function set_filter(){
+	// Filtre actif si il existe (si la page est rechargée pour un filtre de groupe p.ex.)
+	if (isset($_GET['filter'])) {
+		$filter = $_GET['filter'];
+	} else {
+		$filter = 'all';
+	}
+	return $filter;
 }
-//$PAGE->requires->js_call_amd('format_iena/suivi', 'init');
 
+function set_filters($data, $filters, $sections, $groups, $current_user_groups, $active_group_name, $active_section_id){
+	
+	$data['filters']=$filters;
+	$data["sections"]=$sections;
+	$data["groups"]=array_values($groups);
+	$data['current_user_groups']=$current_user_groups;
+	//$data['active_section_id']=$active_section_id;
+
+	if($active_group_name==""){
+		$data['default_group']='selected';	
+	}
+
+
+	$data['data']=array();
+	$data['data']["sections"]=$sections;
+	$data['data']["groups"]=array_values($groups);
+	$data['data']['current_user_groups']=$current_user_groups;
+	$data['data']['active_group_name']=$active_group_name;
+	$data['data']['active_section_id']=$active_section_id;
+
+	return $data;
+}
+
+function set_data($data, $modules, $progress, $groups, $active_group_id){
+	
+	global $COURSE, $USER, $CFG;
 
 
-echo $OUTPUT->header();
 
-/*$filters = [
-	"all" => "Tous",
-	"=100" => "100%",
-	"=0" => "0%",
-	"<100" => "&lt;100%",
-	"<50" => "&lt;50%",
-	"<25" => "&lt;25%",
-	">50" => "&gt;=50%",
-	">25" => "&gt;=25%",
-	">0" => "&gt;0%",
-];*/
+
+	$data["modules"]=$modules;
+
+
+	$data["students"]=format_progress($progress, $modules, $groups, $active_group_id);
+
+	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;
+
+
+	//Pour le téléchargement du tableau ?
+	if(!isset($data['data'])){
+		$data['data']=array();
+	}
+	
+	$data['data']["modules"]=$modules;
+	$data['data']["students"]=$data["students"];
+	$data['data']=json_encode($data['data']);
+
+
+	return $data;
+
+
+}
 
 $filters=[
 	"0"=>array(
@@ -140,57 +311,37 @@ $filters=[
 
 
 
-/* Groupe du GET provenant du sélecteur de la page du cours, ou premier groupe de l'utilisateur, ou groupe 0 (tous les groupes). */
-if(isset($_GET['groupid'])){
-	$active_group_id = $_GET['groupid'];
-}
-else{
-	$active_group_id=NULL;
-}
+$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));
 
-// @TODO à supprimer si pas utilisé dans le JS (mettre dans la clause IF pour éviter un appel inutile si le GET existe)
-$current_user_groups_ids=array();
-/* 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 ($active_group_id == NULL || ($active_group_id == 0 && !has_capability('course/iena:suivi_edit', $context, $USER->id)) ) {
-	if ( count($current_user_groups_ids) == 0 ) {
-		$active_group_id = 0;
-	} else {
-		$current_user_groups_ids = groups_get_user_groups($COURSE->id, $USER->id)[0];
-		$active_group_id = $current_user_groups_ids[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) */
-if ( $active_group_id == 0 ) {
-	//On récupère les ids des membres
-	$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true);
-} else {
-	//On ne récupère pas les ids des membres
-	$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', false);
-}
+$PAGE->set_url($url);
 
-$current_user_groups = [];
-$active_group_name = "";
-foreach ($groups as $group) {
-	/* Récupération du nom du group actif au passage */
-	if ( $group->id == $active_group_id ) {
-		$active_group_name = $group->name;
-		$group->selected='selected';
-	}
-	foreach ($current_user_groups_ids as $ugi) {
-		if ( $group->id == $ugi ) {
-			$current_user_groups[] = $group;
-		}
-	}
+
+
+$course = $DB->get_record('course', array('id' => $courseID), '*', MUST_EXIST);
+require_login($course);
+
+require_once($CFG->libdir . '/completionlib.php');
+$completion = new completion_info($course);
+$context = context_course::instance($COURSE->id);
+
+// if (!has_capability('moodle/course:sectionvisibility', $context = context_course::instance($courseID), $USER->id)) {
+if (!has_capability('course/iena:suivi', $context = context_course::instance($courseID), $USER->id)) {
+	$link = $CFG->wwwroot . '/course/view.php?id=' . $courseID;
+	header("Location: {$link}");
+	exit;
 }
 
-echo "CURRENT USER GROUPS";
-var_dump($current_user_groups);
 
+if(isset($_GET['groupid'])){
+	$active_group_id = $_GET['groupid'];
+}
+else{
+	$active_group_id=0;
+}
 
-/* Liste de tous les utilisateurs avec : 
-- informations personnelles (tous les utilisateurs du cours)
-- liste des activités avec état d'achèvement (si achevées, sinon vide) */
 $progress = $completion->get_progress_all(
 	'',
 	array(),
@@ -201,172 +352,63 @@ $progress = $completion->get_progress_all(
 	$context
 );
 
-//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){
-	global $CFG, $COURSE;
-	$students=array();
-	foreach ($progress as $prog_info) {
-		$progress_student=new StdClass();
-		$progress_student->name=$prog_info->firstname." ".$prog_info->lastname;
-		$progress_student->id=$prog_info->id;
-		$progress_student->email=$prog_info->email;
-		$progress_student->progress=array();
-		$progress_student->report_link=$CFG->wwwroot . "/report/outline/user.php?id=" . $progress_student->id . "&course=" . $COURSE->id . "&mode=outline";
-		$progress_student->message_link=$CFG->wwwroot . "/message/index.php?id=" . $progress_student->id;
-		foreach($modules as $key=>$module){
-			
-			$module_progress=new StdClass();
-			
-			if(!isset($prog_info->progress[$module->id])){
-				
-				$module_progress->completionstate='0';
-			}
-			else{
-				$module_progress->completionstate=$prog_info->progress[$module->id]->completionstate;
-			}
-			$module_progress->namemodule=$module->name;
-			
-			$progress_student->progress[$key]=$module_progress;
-		}
-
-		$students[]=$progress_student;
-	}
-	return $students;
-	
-}
-
-/* Ajoute les groupes de l'utilisateur pour l'afficher dans l'export */
-/* Si le user a le droit d'afficher pour tous les groupes ou qu'il n'y en a pas, on récupère le groupe de l'utilisateur pour qu'il puisse être téléchargé dans le tableau blobal intergroupe. */
-if ( $active_group_id == 0 ) {
-	foreach ($progress as $prog) {
-
-		
-		$prog->groups = "";
-		foreach ($groups as $group) {
-			if ( in_array($prog->id, $group->members) ) {
-				$prog->groups .= $group->name . " ";
-			}
-		}
-	}
-}
-
-/* Liste de toutes les activités du cours (sauf en attente de suppression). La liste est épurée et constitue un tableau d'objet. */
-$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) > 20 ? mb_substr($displayname, 0, 19, 'UTF-8').'…' : $displayname;
-	$module->section = $activity->section;
-	$modules[] = $module;
-}
-
-
-function get_sections(){
-	
-}
-// Liste des sections du cours
-$modinfo = get_fast_modinfo($COURSE->id);
-$sections_info_all = $modinfo->get_section_info_all();
-$sections = [];
 
+$active_section_id=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. 
 
 if(isset($_GET['sectionid'])){
 	$active_section_id = $_GET['sectionid'];
 }
-else{
-	$active_section_id=0;
-}
-
-
-foreach ($sections_info_all as $key => $section_info) {
-	$section = new StdClass();
-	$section->id = $section_info->id;
-	$section->name = $section_info->name === NULL || $section_info->name === '' ? 'Section ' . $key : $section_info->name;
-	if($section->id==$active_section_id){
-		$section->selected="selected";
-	}
-
-	$sections[] = $section;
-
-}
 
 
-// $active_section_name = "Toutes les sections";
-// foreach ($sections as $section) {
-// 	if ($section->id == $active_section_id) {
-// 		$active_section_name = $section->name;
-// 	}
-// }
 
-// Filtre actif si il existe (si la page est rechargée pour un filtre de groupe p.ex.)
-if (isset($_GET['filter'])) {
-	$filter = $_GET['filter'];
+if ( $active_group_id == 0 ) {
+	//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);
+	$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true);
 } else {
-	$filter = 'all';
-}
-
-
-
-
-
-
-
-/*On a récupéré toutes les données, on met ça dans un tableau pour le template*/
-$data=array();
-$data['filters']=$filters;
-$data["sections"]=$sections;
-$data["groups"]=array_values($groups);
-$data['current_user_groups']=$current_user_groups;
-
-if($active_group_name==""){
-	$data['default_group']='selected';	
-}
-
-$data["modules"]=$modules;
-
-
-$data["students"]=format_progress($progress, $modules);
-
-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;
+	//On ne récupère pas les ids des membres
+	$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', false);
 }
 
-$data['link_classicview']= $CFG->wwwroot . "/report/progress/index.php?course=" . $COURSE->id;
-
-
-
-
-$data['data']=array();
-$data['data']["sections"]=$sections;
-$data['data']["groups"]=array_values($groups);
-$data['data']['current_user_groups']=$current_user_groups;
-$data['data']["modules"]=$modules;
-$data['data']["students"]=format_progress($progress, $modules);
-$data['data']=json_encode($data['data']);
-
 
 
 // If a post is sent trought the page
-if ($_POST) {
+if ($_POST && !isset($_POST["action"])) {
 	require_once("$CFG->libdir/formslib.php");
 	require_once('view/view_send_message.php');
 	$usersID = $_POST["api_url"];
 	$view = new view_send_message();
 	echo $view->get_content($usersID);
-} else {
+} else if(isset($_POST['action']) && !empty($_POST['action'])) {
+	
 
-	//require_once('view/view_suivi_unit3.php');
+	$data=[];
+	$modules=get_activities($completion, $active_section_id);
 
+	$data=set_data($data, $modules, $progress, $groups, $active_group_id);
+	$renderer = $PAGE->get_renderer('format_iena');
+	$renderer->display_table_completion($data);
+   	//echo json_encode($data);
+}
+else {
+
+	init_page($course, $PAGE);
+	echo $OUTPUT->header();
+	$current_user_groups=[];
+	$active_group_name="";
+	$data=[];
+
+	$modules=get_activities($completion, $active_section_id);
+	$groups=get_groups($context, $active_group_id, $progress, $groups);
+	$sections=get_sections($active_section_id);
+	$data=set_filters($data, $filters, $sections, $groups, $current_user_groups, $active_group_name, $active_section_id);
+	$data=set_data($data, $modules, $progress, $groups, $active_group_id);
 	$renderer = $PAGE->get_renderer('format_iena');
 	$renderer->display_completion($data);
+	echo $OUTPUT->footer();
 }
 
 
 
-
-echo $OUTPUT->footer();
\ No newline at end of file
+?>
\ No newline at end of file
diff --git a/suivi_unit_old.php b/suivi_unit_old.php
new file mode 100644
index 0000000000000000000000000000000000000000..b69a4491bdf0fc22d1df55d7ec052fa7c46ce6f9
--- /dev/null
+++ b/suivi_unit_old.php
@@ -0,0 +1,353 @@
+<?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/>.
+
+/**
+ *
+ * @package    format_iena
+ * @category   format
+ * @copyright  2018 Softia/Université lorraine
+ * @author     vrignaud camille / Thomas Fradet
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+define('NO_OUTPUT_BUFFERING', true);
+require_once('../../../config.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');
+
+global $COURSE, $DB, $USER;
+
+
+
+// Defines the id of the course with a get parameter
+$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));
+
+
+$PAGE->set_url($url);
+
+// Getting DB information (*)  of the course
+$course = $DB->get_record('course', array('id' => $courseID), '*', MUST_EXIST);
+
+//require_login($course, false, NULL);
+require_login($course);
+$PAGE->set_title($course->fullname);
+$PAGE->set_heading($course->fullname . " – Suivi des étudiants");
+
+$PAGE->set_pagelayout('incourse');
+
+
+/* Cache le menu dans le header ?  */
+$coursenode = $PAGE->navbar->add('suiviiena', null, navigation_node::TYPE_CONTAINER, null, 'suiviena');
+$coursenode->make_active();
+$coursenode->force_open();
+
+
+
+
+
+require_once($CFG->libdir . '/completionlib.php');
+$completion = new completion_info($course);
+$context = context_course::instance($COURSE->id);
+
+// if (!has_capability('moodle/course:sectionvisibility', $context = context_course::instance($courseID), $USER->id)) {
+if (!has_capability('course/iena:suivi', $context = context_course::instance($courseID), $USER->id)) {
+	$link = $CFG->wwwroot . '/course/view.php?id=' . $courseID;
+	header("Location: {$link}");
+	exit;
+}
+//$PAGE->requires->js_call_amd('format_iena/suivi', 'init');
+
+
+
+echo $OUTPUT->header();
+
+/*$filters = [
+	"all" => "Tous",
+	"=100" => "100%",
+	"=0" => "0%",
+	"<100" => "&lt;100%",
+	"<50" => "&lt;50%",
+	"<25" => "&lt;25%",
+	">50" => "&gt;=50%",
+	">25" => "&gt;=25%",
+	">0" => "&gt;0%",
+];*/
+
+$filters=[
+	"0"=>array(
+		"value"=>"all",
+		"name"=>"Tous",
+	),
+	"1"=>array(
+		"value"=>"=100%",
+		"name"=>"100%",
+	),
+	"2"=>array(
+		"value"=>"=0",
+		"name"=>"0",
+	),
+	"3"=>array(
+		"value"=>"<100",
+		"name"=>"<100%",
+	),
+	"4"=>array(
+		"value"=>"<50",
+		"name"=>"<50%",
+	),
+	"5"=>array(
+		"value"=>"<25",
+		"name"=>"<25%",
+	),
+	"6"=>array(
+		"value"=>">50",
+		"name"=>">=50%",
+	),
+	"7"=>array(
+		"value"=>">25",
+		"name"=>">=25%",
+	),
+	"8"=>array(
+		"value"=>"0",
+		"name"=>">0%",
+	),
+];
+
+
+
+/* Groupe du GET provenant du sélecteur de la page du cours, ou premier groupe de l'utilisateur, ou groupe 0 (tous les groupes). */
+if(isset($_GET['groupid'])){
+	$active_group_id = $_GET['groupid'];
+}
+else{
+	$active_group_id=NULL;
+}
+
+// @TODO à supprimer si pas utilisé dans le JS (mettre dans la clause IF pour éviter un appel inutile si le GET existe)
+$current_user_groups_ids=array();
+/* 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 ($active_group_id == NULL || ($active_group_id == 0 && !has_capability('course/iena:suivi_edit', $context, $USER->id)) ) {
+	if ( count($current_user_groups_ids) == 0 ) {
+		$active_group_id = 0;
+	} else {
+		$current_user_groups_ids = groups_get_user_groups($COURSE->id, $USER->id)[0];
+		$active_group_id = $current_user_groups_ids[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) */
+if ( $active_group_id == 0 ) {
+	//On récupère les ids des membres
+	//$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true);
+	$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true);
+} else {
+	//On ne récupère pas les ids des membres
+	$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', false);
+}
+
+$current_user_groups = [];
+$active_group_name = "";
+foreach ($groups as $group) {
+	/* Récupération du nom du group actif au passage */
+	if ( $group->id == $active_group_id ) {
+		$active_group_name = $group->name;
+		$group->selected='selected';
+	}
+	foreach ($current_user_groups_ids as $ugi) {
+		if ( $group->id == $ugi ) {
+			$current_user_groups[] = $group;
+		}
+	}
+}
+
+
+/* Liste de tous les utilisateurs avec : 
+- informations personnelles (tous les utilisateurs du cours)
+- liste des activités avec état d'achèvement (si achevées, sinon vide) */
+$progress = $completion->get_progress_all(
+	'',
+	array(),
+	$active_group_id,
+	'u.lastname ASC, u.firstname ASC',
+	'',
+	'',
+	$context
+);
+
+//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){
+	global $CFG, $COURSE;
+	$students=array();
+	foreach ($progress as $prog_info) {
+		$progress_student=new StdClass();
+		$progress_student->name=$prog_info->firstname." ".$prog_info->lastname;
+		$progress_student->id=$prog_info->id;
+		$progress_student->email=$prog_info->email;
+		$progress_student->progress=array();
+		$progress_student->report_link=$CFG->wwwroot . "/report/outline/user.php?id=" . $progress_student->id . "&course=" . $COURSE->id . "&mode=outline";
+		$progress_student->message_link=$CFG->wwwroot . "/message/index.php?id=" . $progress_student->id;
+		foreach($modules as $key=>$module){
+			
+			$module_progress=new StdClass();
+			
+			if(!isset($prog_info->progress[$module->id])){
+				
+				$module_progress->completionstate='0';
+			}
+			else{
+				$module_progress->completionstate=$prog_info->progress[$module->id]->completionstate;
+			}
+			$module_progress->namemodule=$module->name;
+			
+			$progress_student->progress[$key]=$module_progress;
+		}
+
+		$students[]=$progress_student;
+	}
+	return $students;
+	
+}
+
+/* Ajoute les groupes de l'utilisateur pour l'afficher dans l'export */
+/* Si le user a le droit d'afficher pour tous les groupes ou qu'il n'y en a pas, on récupère le groupe de l'utilisateur pour qu'il puisse être téléchargé dans le tableau blobal intergroupe. */
+if ( $active_group_id == 0 ) {
+	foreach ($progress as $prog) {
+
+		
+		$prog->groups = "";
+		foreach ($groups as $group) {
+			if ( in_array($prog->id, $group->members) ) {
+				$prog->groups .= $group->name . " ";
+			}
+		}
+	}
+}
+
+/* Liste de toutes les activités du cours (sauf en attente de suppression). La liste est épurée et constitue un tableau d'objet. */
+$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) > 20 ? mb_substr($displayname, 0, 19, 'UTF-8').'…' : $displayname;
+	$module->section = $activity->section;
+	$modules[] = $module;
+}
+
+// Liste des sections du cours
+$modinfo = get_fast_modinfo($COURSE->id);
+$sections_info_all = $modinfo->get_section_info_all();
+$sections = [];
+
+// 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. 
+
+if(isset($_GET['sectionid'])){
+	$active_section_id = $_GET['sectionid'];
+}
+else{
+	$active_section_id=0;
+}
+
+
+foreach ($sections_info_all as $key => $section_info) {
+	$section = new StdClass();
+	$section->id = $section_info->id;
+	$section->name = $section_info->name === NULL || $section_info->name === '' ? 'Section ' . $key : $section_info->name;
+	if($section->id==$active_section_id){
+		$section->selected="selected";
+	}
+
+	$sections[] = $section;
+
+}
+
+
+
+// Filtre actif si il existe (si la page est rechargée pour un filtre de groupe p.ex.)
+if (isset($_GET['filter'])) {
+	$filter = $_GET['filter'];
+} else {
+	$filter = 'all';
+}
+
+
+
+
+
+
+
+/*On a récupéré toutes les données, on met ça dans un tableau pour le template*/
+$data=array();
+$data['filters']=$filters;
+$data["sections"]=$sections;
+$data["groups"]=array_values($groups);
+$data['current_user_groups']=$current_user_groups;
+
+if($active_group_name==""){
+	$data['default_group']='selected';	
+}
+
+$data["modules"]=$modules;
+
+
+$data["students"]=format_progress($progress, $modules);
+
+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['data']=array();
+$data['data']["sections"]=$sections;
+$data['data']["groups"]=array_values($groups);
+$data['data']['current_user_groups']=$current_user_groups;
+$data['data']["modules"]=$modules;
+$data['data']["students"]=format_progress($progress, $modules);
+$data['data']=json_encode($data['data']);
+
+
+
+// If a post is sent trought the page
+if ($_POST && !isset($_POST["action"])) {
+	require_once("$CFG->libdir/formslib.php");
+	require_once('view/view_send_message.php');
+	$usersID = $_POST["api_url"];
+	$view = new view_send_message();
+	echo $view->get_content($usersID);
+} else if(isset($_POST['action']) && !empty($_POST['action'])) {
+   return $data;
+}
+else {
+
+	//require_once('view/view_suivi_unit3.php');
+
+	$renderer = $PAGE->get_renderer('format_iena');
+	$renderer->display_completion($data);
+}
+
+
+
+
+echo $OUTPUT->footer();
\ No newline at end of file
diff --git a/templates/suivi-table.mustache b/templates/suivi-table.mustache
index 1c7ed28debc41a81fc69468b9d543abeef95aab7..dff54abc51e16c6823b36da9343fc99301ae26ca 100644
--- a/templates/suivi-table.mustache
+++ b/templates/suivi-table.mustache
@@ -18,10 +18,10 @@
 		{{#students}}
 			<tr data-userid="{{id}}" data-percent={{percent}}>
 				<th>
-					<input type="checkbox" name="checkstudent">
+					<input type="checkbox" name="checkstudent" value="{{id}}">
 					<span class="stud_perc">{{percent}}</span>
 					<a href="{{report_link}}" target="_blank"><i class="icon fa fa-graduation-cap fa-fw"></i></a>
-					<a href="{{message_link}}" target="_blank"><i class="icon fa fa-envelope fa-fw"></i></a>{{name}}
+					<a href="{{message_link}}" target="_blank"><i class="icon fa fa-envelope fa-fw"></i></a>{{firstname}} {{lastname}}
 				</th>
 				{{#progress}}
 					<td title="{{namemodule}}" data-section="{{id}}" class="pointer-help state-{{completionstate}}"><span class="icon-progress"></span></td>
@@ -33,5 +33,6 @@
 {{#js}}
 require(['format_iena/suivi'], function(module) {
     module.registerSelectAll({{{ data }}});
+    module.registerSubmit({{{ data }}});
 });
 {{/js}}
\ No newline at end of file
diff --git a/templates/suivi.mustache b/templates/suivi.mustache
index 343bb9d1f28ce1bb31621eb478027ee67c67f2c4..d9ea37fa485e11f9730a404bdcc131072b74b830 100644
--- a/templates/suivi.mustache
+++ b/templates/suivi.mustache
@@ -108,5 +108,24 @@
 
 </form>
 
+<div id="partial-table">
+{{> format_iena/suivi-table }}
+</div>
+
 
-{{> format_iena/suivi-table}}
\ No newline at end of file
+<div class="actions-suivi-iena">
+	<div class="input-group">
+		<div class="input-group-prepend col-md-3">
+			<div class="col-form-label d-inline">Avec la sélection : </div>
+		</div>
+		<div class="col-md-9">
+			<select class="custom-select mr-sm-2" id="select-actions-suivi-iena" name="actions">
+				
+					<option  value='msg'>Envoyer un message</option>
+					<option  value='download'>Télécharger le tableau en csv</option>
+				
+			</select>
+			<input type="submit" class="btn btn-primary" name="submit" id="id_submit_iena" value="Valider">
+		</div>
+	</div>
+</div>
\ No newline at end of file