Skip to content
Snippets Groups Projects
suivi.js 29.96 KiB
// 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/>.

/**
 * Handle add/remove competency links.
 *
 * @module     format_iena/suivi
 * @package    format_iena
 * @copyright  2021 Myriam Delaruelle
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
define(['jquery', 'core/ajax', 'core/templates', 'core/str'],
       function($, ajax, templates, str) {
       	var all_selected=false;
       	var data=[];
       	var cours_massif=false;

       	return{
       		
       		registerFilters:function(){
       			
	    		$("#group-select").on('change', function(e){
	    			changeGroup();
	    			e.stopPropagation();
	    		});
	    		
       		},
       		
       		registerSubmit:function(){
       
       			$("#id_submit_iena").on('click', function(e){
	    			triggerAction(e);
	    		});
	    		$("#section-select").on('change', function(){
	    			//changeSection();
	    			wrapperChangeSection();
	    		});
	    		$("#completion-select").on('change', function(){
	    			//showHideStudents();
	    			wrapperChangeCompletion();
	    		});
	    		$("#symbol-select").on('change', function(){
	    			//showHideStudents();
	    			wrapperChangeCompletion();
	    		});
                $('.dropdown-menu-form').on('click', function (e) {
                   e.stopPropagation();
                });
                $('#iena-button-search').on('click', function(e){
                	searchStudent();
                	e.preventDefault()
         			e.stopPropagation()
                })
               
	    		
	    		
                //registerSelectAllActivitiesFilter();
       		}, 

       		//Evenement pour le selectall : créé une seule fois au chargement de la page
		    registerSelectAllActivitiesFilter:function(){
		        $('.selectallactivities').click(function() {

		            if ($(".selectallactivities").is(':checked')) {
		                checkAllActivitiesFilter();
		                showHideActivities();
		            } else {
		                $('.option').prop('checked', false);
		                var message=str.get_string('selectedActivities', 'format_iena');
		                $.when(message).done(function(localizedEditString) {
		                    $(".dropdown-text").html('0 '+localizedEditString);
		                }); 
		                $(".select-text").html(' Select');
		                showHideActivities();
		            }
		            reloadTable();
		        });
		        //initActivityFilter();
		    },
		    registerSelectAllGroupsFilter:function(){
		    
		    	if(data.countstudents<1000){
		    		checkAllGroupsFilter();
		    	}
		    	
		    	$('.selectallgroups').click(function(e) {
		    		e.stopPropagation();
		            if ($(".selectallgroups").is(':checked')) {
		                checkAllGroupsFilter();
		            } else {
		                $('.group-option').prop('checked', false);
		                updateGroupsFilterLabel(); 
		            	
		            }
		
		        });
		    },
		    initTable:function(){
		    	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){

			$( element ).css("zIndex",nb_counts-index);
		})
    }



    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() + $("#completion-select").val();
    	completeUrl='suivi_unit.php?courseid='+courseid;
    	if(sectionid){
    		completeUrl+='&sectionid='+sectionid;
    	}
    	if(groupid){
    		completeUrl+="&groupid="+groupid;
    	}
    	if(filter){
    		completeUrl+="&filter="+filter;
    	}
    	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);
    	}
    	
    	if(groupsid.length==0){
    		groupsid.push(-2);
    	}
    	$.ajax({ url: completeUrl,
        	data: {action: 'fetchgroups', groupsid:groupsid},
        	type: 'post',
        	success: function(request) { 
        		
        		showHideActivities();
        		parsedrequest=JSON.parse(request);
        		data=calcPercentage(parsedrequest);
        		
        		showHideStudents();
        		if(data.countstudents<1500){
        	
        			localStorage.setItem("courseid",parsedrequest["courseid"] )
        			localStorage.setItem("groups",JSON.stringify(parsedrequest["groups"]));
        			
        		}
        		reloadTable(data);
        		updateGroupsFilterLabel(false);
			}
		});
    }


  	//Affiche ou non (dynamiquement, pas de requête) les étudiants selon le filtre d'achèvement
    function showHideStudents(changefilter=true){
    	symbol=$("#symbol-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;
    		}

    		
    		if(symbol=="<"){
    			if(data.students[i].percentage < completion){
    				data.count_results++;
    				data.students[i].visible=true;
    			}
    			else{
					data.students[i].visible=false;
    			}
    		}
    		else if(symbol==">"){
    			if(data.students[i].percentage > completion){
    				data.count_results++;
    				data.students[i].visible=true;
    			}
    			else{
					data.students[i].visible=false;
    			}
    		}
    		else if(symbol=="≤"){
    			if(data.students[i].percentage <= completion){
    				data.count_results++;
    				data.students[i].visible=true;
    			}
    			else{
					data.students[i].visible=false;
    			}
    		}
    		else if(symbol == "≥"){
    			if(data.students[i].percentage >= completion){
    				data.count_results++;
    				data.students[i].visible=true;
    			}
    			else{
					data.students[i].visible=false;
    			}
    		}
    		else{
    			if(data.students[i].percentage == completion){
    				data.count_results++;
    				data.students[i].visible=true;
    			}
    			else{
					data.students[i].visible=false;
    			}
    		}
    		
    	}
    	/*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;
    			data.count_results++;
    			for(var j = 0; j<data.students.length; j++){
    				var prog=data.students[j].progress.find(progress => progress.idmodule === data.modules[i].id);
					prog.visible=true;
    			}
    		}
    		else{
    			data.modules[i].visible=false;
    			for(var j = 0; j<data.students.length; j++){
    				data.students[j].progress.find(progress => progress.idmodule === data.modules[i].id).visible=false;
    			}
    		}
    	}
    	//Si pas de résultats on recharge juste la table
    	if(data.count_results==0 && changefilter ==true){
    		//reloadTable(data);
    	}
    	else{
    		data=calcPercentage(data);
    		showHideStudents(changefilter);
    	}
        changeActivitiesDropdown();

        //Vérifier si ça passe ou s'il faut attendre la promise
        registerActivityFilter();
        checkAllActivitiesFilter();
    }



    //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);
            if(activities[i].checked){
                prog.visible=true;
                for(var j = 0; j<data.students.length; j++){
                    data.students[j].progress.find(progress => progress.idmodule === activities[i].value).visible=true;
                }
                activitiesToStore.push(activities[i].value);
            }
            else{
                prog.visible=false;
                for(var j = 0; j<data.students.length; j++){
                    data.students[j].progress.find(progress => progress.idmodule === activities[i].value).visible=false;
                }
            }
        }
        if(data.countstudents<1500){
        	localStorage.setItem("activities",JSON.stringify(activitiesToStore));
        }
        
       /* if(changefilter==true){
        	reloadTable(data);
        }*/
        
    }


 

    //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){
     		 $("#partial-table").html(html);
     		 templates.runTemplateJS(js);
     		 window.history.pushState('suivi',"", url);
     		 initHeaders();
             
     	})
        .fail(function(){
        	loadMessage("error");
        });	
    }


   


	//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=[];
		for(var i=0; i < selectedChecks.length; i++){
			
			students.push(selectedChecks[i].value);
		}
	
		return students;
	}

	//Si on veut envoyer un message à tout le monde on ajoute deux champs cachés :
	//La liste des étudiants (array d'id)
	//L'url de retour pour revenir sur le tableau de suivi
	function triggerAction(e){
		value=$("#select-actions-suivi-iena").val();
		
		if(value=="msg"){
			url=window.location.search;
    		urlParams = new URLSearchParams(url);
    		courseid=urlParams.get('courseid');
			students=getSelectedStudents();
			var form=$("#form_send_message_iena");
			form.attr("action", "send_message.php?courseid="+courseid);
			var field=$("<input></input>");
			field.attr("type", "hidden");
        	field.attr("name", "students");
        	field.attr("value", students.toString());
        	form.append(field);
        	var fieldUrl=$("<input></input>");
			fieldUrl.attr("type", "hidden");
        	fieldUrl.attr("name", "back_url");
        	fieldUrl.attr("value", url);
        	form.append(fieldUrl);
        	$(document.body).append(form);
    		form.submit();
		}
		else if(value=="download"){
			e.stopPropagation();
			e.preventDefault();
			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 ;
	}

	


	function table_download() {
		
		var students=getSelectedStudents();
		var csvContent = "data:text/csv;charset=utf-8,";
		var head = ['Moodle_id', 'Prénom', 'Nom', 'Groupe', 'Complétion (en %)'];
		data.active_section_id=$("#section-select").val();
		for ( var m = 0; m < data.modules.length; m++ ) {
			if ( data.active_section_id != data.modules[m].section && data.active_section_id != 0 ) {
				continue;
			}
			head.push('"'+data.modules[m].displayname.replace(',', '')+'"');

		}
		csvContent += head.join(",");
		csvContent += "\n";
		
		/* Pour chaque étudiant */
		
		for ( var s = 0; s < data.students.length; s++ ) {
			if(students.includes(data.students[s].id)){
				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 */
					
					if ( data.active_section_id != data.modules[mod].section && data.active_section_id != 0 ) {
						continue;
					}
					var stud_progress = data.students[s].progress
					/* Si l'étudiant n'a pas de progres*/
					if ( stud_progress.length == 0 ) {
						arr_cpl.push(0);
					} else {
						// var prog = 0;
						/* Pour chaque trace d'achèvement */
						var cpl = 0;
						for (var i =0; i<stud_progress.length; i++) {
							
							/* Quand l'index de progression correspond à l'id du module */
							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++;
						}
						arr_cpl.push(cpl);
					}
					activities_nbr++;
				}
				var perc = Math.round(100 * 100 * done_activities_nbr / activities_nbr) / 100;
				var groups = '"';
				active_group_id=$('#group-select').val();
				data.active_group_name=$('#group-select').find('option:selected').html()

				if ( data.active_group_name != "" && active_group_id != 0 ) {
					groups += data.active_group_name.replace('"', '');
				} else {
					groups += data.students[s].groups.replace('"', '');
				}
				groups += '"';
				var arr = [
				data.students[s].id,
				data.students[s].firstname,
				data.students[s].lastname,
				groups,
				'"'+perc.toLocaleString()+'"',
				arr_cpl
				];
				var dataString = arr.join(",");
				csvContent += dataString + "\n";
			}
		}
		var encodedUri = encodeURI(csvContent);
		var section_name = data.active_section_id;
		if ( section_name == 0 ) {
			section_name = "cours-complet";
		} else {
			section_name = slug_it($('#section-select').find('option:selected').html()).substring(0, 20);
		}
		var d = new Date;
		month = d.getMonth()+1;


		date = d.getFullYear() +"."+ padLeft(month) +"."+ padLeft(d.getDate()) +"-"+ padLeft(d.getHours()) +"."+ padLeft(d.getMinutes()) +"."+ padLeft(d.getSeconds());
		
		var link = document.createElement("a");
		link.setAttribute("href", encodedUri);
		link.setAttribute("download", "report-"+section_name+"-"+ date +".csv");
		document.body.appendChild(link);
		link.click();
		document.body.removeChild(link); 
	}


});