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+='§ionid='+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" => "<100%", - "<50" => "<50%", - "<25" => "<25%", - ">50" => ">=50%", - ">25" => ">=25%", - ">0" => ">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" => "<100%", + "<50" => "<50%", + "<25" => "<25%", + ">50" => ">=50%", + ">25" => ">=25%", + ">0" => ">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