From fe975f9463ad1b2976f6cb0b5785bd4ee08b15da Mon Sep 17 00:00:00 2001 From: Myriam Delaruelle <myriam.delaruelle@univ-lorraine.fr> Date: Thu, 13 Feb 2025 14:26:36 +0100 Subject: [PATCH] fin optimisation js --- amd/build/suivi.js | 562 +++++++++++++++++++++------------------ templates/suivi.mustache | 2 +- 2 files changed, 303 insertions(+), 261 deletions(-) diff --git a/amd/build/suivi.js b/amd/build/suivi.js index f37d605..790fd57 100644 --- a/amd/build/suivi.js +++ b/amd/build/suivi.js @@ -44,13 +44,16 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], 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(); @@ -64,6 +67,7 @@ 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(); showHideActivities(); @@ -76,17 +80,18 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], $(".select-text").html(' Select'); showHideActivities(); } + reloadTable(); }); //initActivityFilter(); }, registerSelectAllGroupsFilter:function(){ if(data.countstudents<1000){ - console.log("on rentre ici"); checkAllGroupsFilter(); } - $('.selectallgroups').click(function() { + $('.selectallgroups').click(function(e) { + e.stopPropagation(); if ($(".selectallgroups").is(':checked')) { checkAllGroupsFilter(); } else { @@ -94,12 +99,11 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], updateGroupsFilterLabel(); } - changeGroup(); + //changeGroup(); }); }, initTable:function(){ data=fetchProgress(); - @@ -111,25 +115,25 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], } function fetchProgress(){ - console.log("non plutôt on fetch le progress") + completeUrl=getCompleteUrl(); $.ajax({ url: completeUrl, data: {action: 'fetchprogress'}, type: 'post', success: function(request) { - + data=calcPercentage(JSON.parse(request)); if(data.students.length<1000){ //localStorage.setItem("groups",request); } initActivityFilter(false); - displayTotalActivitiesFilter(false); + updateActivitiesFilterLabel(false); + initGroupFilter(false); updateGroupsFilterLabel(false); showHideActivities(false); - initGroupFilter(false); - registerGroupFilter(); + changeSection(false); reloadTable(data); return data; @@ -137,7 +141,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], }); } function initHeaders(){ - var nb_counts=$(".th-rotate").length; $(".th-rotate").each(function(index, element){ @@ -154,7 +157,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], 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+='§ionid='+sectionid; @@ -170,7 +173,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], //À changer pour intégrer une fonction plus générique function changeGroup(){ - console.log("on va changer le groupe ?"); var completeUrl=getCompleteUrl(); var groupscheckboxes= $('input[name="groupoptions[]"]:checked'); var groupsid=[]; @@ -185,16 +187,16 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], data: {action: 'fetchgroups', groupsid:groupsid}, type: 'post', success: function(request) { - data=calcPercentage(JSON.parse(request)); - //initGroupFilter(); - // - changeSection(); + showHideActivities(); + + data=calcPercentage(JSON.parse(request)); + showHideStudents(); if(data.students.length<1000){ localStorage.setItem("groups",request); } - + reloadTable(data); updateGroupsFilterLabel(false); } }); @@ -202,9 +204,9 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], //Affiche ou non (dynamiquement, pas de requête) les étudiants selon le filtre d'achèvement - function changeCompletion(changefilter=true){ + 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){ @@ -213,7 +215,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; } @@ -222,7 +224,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; } @@ -231,7 +233,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; } @@ -240,7 +242,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; } @@ -249,7 +251,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; } @@ -259,15 +261,37 @@ 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"); @@ -290,39 +314,28 @@ 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(); } - //Affiche/cache dynamiquement les activités sélectionnées + + //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[]"]'); - console.log(data.modules); for(var i=0; i<activities.length;i++){ prog=data.modules.find(element => element.id === activities[i].value); @@ -344,31 +357,20 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], localStorage.setItem("activities",JSON.stringify(activitiesToStore)); } - if(changefilter==true){ + /* if(changefilter==true){ reloadTable(data); - } + }*/ } - //Charge message de chargement ou d'erreur - 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 new parameters JUST FOR DISPLAYING THE TABLE. function reloadTable(params){ - console.log("on est dans le reloadTable") + if(!params){ + params=data; + } url=getCompleteUrl(); templates.render('format_iena/suivi-table', params) .done(function(html, js){ @@ -385,6 +387,241 @@ 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; + } + + + + + + + + + + + + + + + + + + /*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){ + 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{ + if(data.countstudents<1000){ + checkAllGroupsFilter(); + } + + } + } + + + //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 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){ + 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>"); + }); + } + + + + //****************************** 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"); @@ -555,199 +792,4 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], } - //Pour chaque module non caché, on va regarder pour chaque étudiant - //Calcule le pourcentage pour les modules VISIBLES ? - function calcPercentage(data){ - for (var i = 0; i < data.students.length; i++) { - data.students[i].percentage=0; - 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; - } - - - - - //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); - }); - } - } - - - - //Coche toutes les activités quand on change de section - function checkAllActivitiesFilter(){ - $('.selectallactivities').prop('checked', true); - $('.option').prop('checked', true); - updateActivitiesFilterLabel(); - $(".select-text").html(' Deselect'); - - } - - - - - - //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 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); - }); - } - } - - - - - /*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(); - showHideActivities(); - }); - - - } - - 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); - } - //Pourquoi ? - //displayTotalActivitiesFilter(); - }); - } - - - //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; - } - } - } - } - } - } - - 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{ - if(data.countstudents<1000){ - checkAllGroupsFilter(); - } - - } - //Pourquoi ? - // displayTotalActivitiesFilter(); - } - - - - - - }); diff --git a/templates/suivi.mustache b/templates/suivi.mustache index e16d344..21c15f1 100644 --- a/templates/suivi.mustache +++ b/templates/suivi.mustache @@ -126,7 +126,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> -- GitLab