From 604a09fed77c48240541313ba44b292f562ab89e Mon Sep 17 00:00:00 2001 From: Thomas Fradet <t.fradet8@gmail.com> Date: Thu, 20 Jun 2019 12:36:02 +0200 Subject: [PATCH] dashboard --- CHANGELOG.md | 23 +-- course_competency.php | 321 +++++++++++++----------------------------- js/cpt-stud-course.js | 24 ++++ 3 files changed, 136 insertions(+), 232 deletions(-) create mode 100644 js/cpt-stud-course.js diff --git a/CHANGELOG.md b/CHANGELOG.md index ad9e8ef..6853526 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,9 +79,9 @@ Changement du nom du plugin (fichiers de langue). ### Page de gestion des compétences liées au cours -[ ] Ajout d'un bouton pour ajouter les compétences en haut du tableau. +[-] Ajout d'un bouton pour ajouter les compétences en haut du tableau. -[ ] Si aucune compétence n'est liée au cours, au lieu d'afficher le tableau, afficher uniquement le bouton d'ajout d'une compétence (un seul sur les deux). +[-] Si aucune compétence n'est liée au cours, au lieu d'afficher le tableau, afficher uniquement le bouton d'ajout d'une compétence (un seul sur les deux). ### Page statut des compétences pour un utilisateur @@ -135,8 +135,6 @@ Ne pas utiliser de méthodes root, quitte à abandonner des fonctionnalités. Tr ### Page cpt x user x course -[ ] Récupérer toutes les données (ne marchera sûrement pas) - __Récupérer les données de base :__ [x] Nom de l'étudiant [x] Nom et description de la compétence @@ -145,18 +143,22 @@ __Récupérer les données de base :__ [x] Info évaluation demandée (review) [x] Evaluer un étudiant avec : évaluation, commentaire d'évaluation [x] Lever une éventuelle demande d'évaluation (review) quand on évalue -[ ] Demande et annulation de demande d'évaluation (par l'étudiant) -[ ] Historique d'évaluation en liste : essayer de récupérer l'exporteur de moodle -[ ] Historique d'évaluation en graphique +[x] Demande et annulation de demande d'évaluation (par l'étudiant) +[x] Historique d'évaluation en liste : essayer de récupérer l'exporteur de moodle +[x] Historique d'évaluation en graphique [x] Liste des modules de cours liés à l'activité avec lien vers l'activité -[ ] Etat d'achèvement du module de cours (attention de vérifier si achèvement activé à tous les niv) +[-] Etat d'achèvement du module de cours (attention de vérifier si achèvement activé à tous les niv) -[ ] Formulaire de changement d'étudiant avec les boutons précédent et suivant -[ ] Formulaire de changement de compétence avec les boutons précédent et suivant +[x] Formulaire de changement d'étudiant avec les boutons précédent et suivant +[x] Formulaire de changement de compétence avec les boutons précédent et suivant [x] Message d'erreur si l'étudiant demandé n'appartient pas au cours [x] Redirection si un étudiant essaie d'accéder à la page d'un autre étudiant + +[x] vérifier si il y a des evidences dans les 3 onglets et afficher ou non l'onglet en conséquence + + ### Page par activité Créer une page qui permet d'évaluer les compétences en lien avec une activité particulière ? Ou de lister l'acquisition des compétences pour cette activité ? @@ -166,3 +168,4 @@ Créer une page qui permet d'évaluer les compétences en lien avec une activit Changement de l'ordre et de l'apparence des boutons. Ajout d'un bouton pour aller à la vue cpt x users en plus de celui pour aller vers la vue user x cpts. Nommage : "tableaux de bord" => "par étudiant" (user x cpts) et "par compétence" (cpt x users). Ces deux listes mèneront vers le cpt x user. + diff --git a/course_competency.php b/course_competency.php index 4f527d9..fe130c0 100644 --- a/course_competency.php +++ b/course_competency.php @@ -19,7 +19,7 @@ $PAGE->set_heading($OUTPUT->heading($COURSE->fullname, 2, 'headingblock header o $PAGE->requires->js("/blocks/competency_iena/js/datalist-polyfill.min.js"); $PAGE->requires->js("/blocks/competency_iena/js/stud-x-cpts.js"); $PAGE->requires->js("/blocks/competency_iena/js/cpt-x-studs.js"); - +$PAGE->requires->js("/blocks/competency_iena/js/cpt-stud-course.js"); /* <<< GESTION DROITS D'ACCÈS >>> */ @@ -207,14 +207,14 @@ echo "<div class='row'>"; echo "<div class='col-12 col-lg-3'>"; echo "<div class='alert alert-{$proficiency_class}'>"; echo "<h3 class='h4'>Validé</h3>"; -echo "<p class='m-b-0 btn p-l-0'>{$proficiency}</p>"; +echo "<p class='m-b-0 btn p-l-0' style='cursor: text;'>{$proficiency}</p>"; echo "</div>"; echo "</div>"; /* Grade info */ echo "<div class='col-12 col-lg-3'>"; echo "<div class='alert alert-{$proficiency_class}'>"; echo "<h3 class='h4'>Évaluation</h3>"; -echo "<p class='m-b-0 btn p-l-0'>{$eval}</p>"; +echo "<p class='m-b-0 btn p-l-0' style='cursor: text;'>{$eval}</p>"; echo "</div>"; echo "</div>"; /* Review and grade ASK and ACTION */ @@ -263,128 +263,121 @@ echo "</div>"; /* END evaluation info and actions row */ /* GRADES AND EVIDENCES HISTORY CHART AND LIST */ -// quelle différence -// read_user_evidence($id) -// read_evidence($evidenceid) - -// delete_user_evidence($id) - -// pour toutes les cpt -// list_user_evidence($userid) - -// lié à la compétence -// list_evidence($userid = 0, $competencyid = 0, $planid = 0, $sort = 'timecreated', -// $order = 'DESC', $skip = 0, $limit = 0) - -// list_evidence_in_course($userid = 0, $courseid = 0, $competencyid = 0, $sort = 'timecreated', - // $order = 'DESC', $skip = 0, $limit = 0) - - - -// OKOK - - - /* Utilisation des renderer du /admin/tool/lp/class/output pour obtenir toutes les données d'historique construites et organisées */ -/* Dabord dans le cours, puis dans l'absolu pour les différencier / filtrer */ +/* /admin/tool/lp/user_competency.php?id= */ $tool_lp_renderer = $PAGE->get_renderer('tool_lp'); -$user_cpt_course_data = new \tool_lp\output\user_competency_summary_in_course($studentid, $competencyid, $courseid); -$user_cpt_course_data = $user_cpt_course_data->export_for_template($tool_lp_renderer); -$course_evidences = $user_cpt_course_data->usercompetencysummary->evidence; -$course_evidences_ids = array(); -foreach ($course_evidences as $course_evidence) { - $course_evidences_ids[] = $course_evidence->id; -} - $user_competency = \core_competency\api::get_user_competency($studentid, $competencyid); $user_cpt_all_data = new \tool_lp\output\user_competency_summary($user_competency); $user_cpt_all_data = $user_cpt_all_data->export_for_template($tool_lp_renderer); $all_evidences = $user_cpt_all_data->evidence; -echo "<div class='row'>"; -echo "<div class='col-12 col-lg-6'>"; -echo "<h2 class='h3'>Historique</h2><ul class='nav nav-tabs' id='hist-tabs'> -<li class='nav-item'> -<a class='nav-link active' href='#' id='all_history_tab'>Complet</a> -</li> -<li class='nav-item'> -<a class='nav-link' href='#' id='course_history_tab'>Dans ce cours</a> -</li> -<li class='nav-item'> -<a class='nav-link' href='#' id='other_history_tab'>Hors de ce cours</a> -</li> -</ul>"; -echo "<ul class='list-group' style='height: 50vh; min-height: 300px; overflow: scroll;'>"; -/* proficient or not depending of rating in scale (set in framework by creator) */ -foreach ($all_evidences as $key => $ev) { - /* mark difference between this course evidences in html for JS filter with tabs */ - if ( in_array($ev->id, $course_evidences_ids) ) { - $is_course_evidence = " data-evidenceorigin='course'"; - } else { - $is_course_evidence = " data-evidenceorigin='other'"; +if ( count($all_evidences) != 0 ) { + + $user_cpt_course_data = new \tool_lp\output\user_competency_summary_in_course($studentid, $competencyid, $courseid); + $user_cpt_course_data = $user_cpt_course_data->export_for_template($tool_lp_renderer); + $course_evidences = $user_cpt_course_data->usercompetencysummary->evidence; + $course_evidences_ids = array(); + foreach ($course_evidences as $course_evidence) { + $course_evidences_ids[] = $course_evidence->id; } - if ( $ev->action === "0" ) { - $grade_make_proficient = ' list-group-item-light'; - } else { - $scale_rules = json_decode($user_cpt_all_data->competency->scaleconfiguration); - foreach ($scale_rules as $scale_rule) { - if ( isset($scale_rule->proficient) && $scale_rule->id == $ev->grade && $scale_rule->proficient == 1 ) { - $grade_make_proficient = ' list-group-item-success'; + + /* CHART EVALUATION HISTORY */ + + $labels = array(); + $series_data_all = array(); + $series_data_course = array(); + $series_data_other = array(); + foreach ($all_evidences as $key => $ev) { + if ( isset($ev->grade) ) { + $labels[] = userdate($ev->timemodified, "%d/%m/%y"); + $series_data_all[] = $ev->grade; + if ( in_array($ev->id, $course_evidences_ids) ) { + $series_data_course[] = $ev->grade; + $series_data_other[] = 0; } else { - $grade_make_proficient = ''; + $series_data_course[] = 0; + $series_data_other[] = $ev->grade; } } } - $date = date("d/m/y – H:i", $ev->timemodified); - echo "<li class='list-group-item{$grade_make_proficient}'{$is_course_evidence}> - <div class='d-flex w-100 justify-content-between'>"; - if ( isset($ev->gradename) ) { - echo "<h5 class='mb-1' style='font-weight: 600;'>$ev->gradename</h5>"; - } - echo "<small>{$date}</small> - </div> - <p class='mb-1 font-weight-light'><em>{$ev->description}</em></p>"; - if ( isset($ev->note) && $ev->note != "" ) { - echo "<p class='mb-1' style='font-weight: 500;'>{$ev->note}</p>"; - } - if ( isset($ev->actionuser) ) { - echo "<small>Évalué par : <a target='_blank' href='{$ev->actionuser->profileurl}'>{$ev->actionuser->fullname}</a></small>"; - } - echo "</li>"; -} -echo "</ul>"; -echo "</div>"; -echo "<script> -(function() { - function active_tabs(active_tab) { - var tabs = document.querySelectorAll('#hist-tabs .nav-link'); - for ( var i=0; i < tabs.length; i++ ) { - tabs[i].setAttribute('class', 'nav-link'); + + echo "<div class='alert alert-secondary'>"; + /* $chart = new core\chart_line(); */ + $chart = new core\chart_bar(); + $chart->get_yaxis(0, true)->set_labels(["", "Non compétent", "Compétent"]); + $series_all = new core\chart_series("Complet", array_reverse($series_data_all)); + $series_course = new core\chart_series('Dans ce cours', array_reverse($series_data_course)); + $series_other = new core\chart_series('Hors de ce cours', array_reverse($series_data_other)); + // $chart->add_series($series_all); + $chart->add_series($series_course); + $chart->add_series($series_other); + $chart->set_labels(array_reverse($labels)); + echo $OUTPUT->render($chart); + echo "</div>"; + + /* LIST COMPLETE HISTORY (evaluation and other evidences) */ + + echo "<div class='row'>"; + echo "<div class='col-12'>"; + echo "<h2 class='h3'>Historique</h2><ul class='nav nav-tabs' id='hist-tabs'> + <li class='nav-item'> + <a class='nav-link active' href='#' id='all_history_tab'>Complet</a> + </li> + <li class='nav-item'> + <a class='nav-link' href='#' id='course_history_tab'>Dans ce cours</a> + </li> + <li class='nav-item'> + <a class='nav-link' href='#' id='other_history_tab'>Hors de ce cours</a> + </li> + </ul>"; + echo "<ul class='list-group' style='max-height: 40vh; overflow: scroll;'>"; + foreach ($all_evidences as $key => $ev) { + /* mark difference between this course evidences in html for JS filter with tabs */ + if ( in_array($ev->id, $course_evidences_ids) ) { + $is_course_evidence = " data-evidenceorigin='course'"; + } else { + $is_course_evidence = " data-evidenceorigin='other'"; } - active_tab.setAttribute('class', 'nav-link active'); - } - function filter(type) { - var list_items = document.querySelectorAll('[data-evidenceorigin]'); - for ( var j = 0; j < list_items.length; j++ ) { - if ( list_items[j].dataset.evidenceorigin != type ) { - list_items[j].style.display = 'none'; - } else { - list_items[j].style.display = ''; + if ( $ev->action === "0" ) { + $grade_make_proficient = ' list-group-item-light'; + } else { + /* proficient or not depending of rating in scale (set in framework by creator) */ + $scale_rules = json_decode($user_cpt_all_data->competency->scaleconfiguration); + foreach ($scale_rules as $scale_rule) { + if ( isset($scale_rule->proficient) && $scale_rule->id == $ev->grade && $scale_rule->proficient == 1 ) { + $grade_make_proficient = ' list-group-item-success'; + } else { + $grade_make_proficient = ''; + } } } + $date = date("d/m/y – H:i", $ev->timemodified); + echo "<li class='list-group-item{$grade_make_proficient}'{$is_course_evidence}> + <div class='d-flex w-100 justify-content-between'>"; + if ( isset($ev->gradename) ) { + echo "<h5 class='mb-1' style='font-weight: 600;'>$ev->gradename ({$ev->id})</h5>"; + } + echo "<small>{$date}</small> + </div> + <p class='mb-1 font-weight-light'><em>{$ev->description}</em></p>"; + if ( isset($ev->note) && $ev->note != "" ) { + echo "<p class='mb-1' style='font-weight: 500;'>{$ev->note}</p>"; + } + if ( isset($ev->actionuser) ) { + echo "<small>Évalué par : <a target='_blank' href='{$ev->actionuser->profileurl}'>{$ev->actionuser->fullname}</a></small>"; + } + echo "</li>"; } - document.getElementById('all_history_tab').addEventListener('click', function (e) { e.preventDefault(); active_tabs(e.target); filter('course'); }); - document.getElementById('course_history_tab').addEventListener('click', function (e) { e.preventDefault(); active_tabs(e.target); filter('course'); }); - document.getElementById('other_history_tab').addEventListener('click', function (e) { e.preventDefault(); active_tabs(e.target); filter('other'); }); -})(); -</script>;"; -echo "</div>"; + echo "</ul>"; + echo "</div>"; /* evidences list col */ + echo "</div>"; /* evidences list row */ + +} /* END IF count all evidences (course and outside) == 0 */ echo "<pre>"; -var_dump($course_evidences_ids); -print_r($all_evidences); +// print_r($all_evidences); echo "</pre>"; /* @@ -395,127 +388,11 @@ Remonter ces données en haut et commenter les données préalablement récupér */ - -// echo $output_lp->render($cpt_base_page); - - - - - - -/* Data */ -$course_evidencies = \core_competency\api::list_evidence_in_course($studentid, $courseid, $competencyid, $sort = 'timecreated', $order = 'DESC', $skip = 0, $limit = 0); -$all_evidencies = \core_competency\api::list_evidence($studentid, $competencyid, $planid = 0, $sort = 'timecreated', $order = 'DESC', $skip = 0, $limit = 0); - -$evidences = array(); -foreach ($course_evidencies as $course_ev) { - $ev = new stdClass(); - // echo "<pre>"; - // var_dump($course_ev); - // echo "</pre>"; - $ev->id = $course_ev->get('id'); - $ev->usercompetencyid = $course_ev->get('usercompetencyid'); - $ev->contextid = $course_ev->get('contextid'); - $ev->actionuserid = $course_ev->get('actionuserid'); - $ev->descidentifier = $course_ev->get('descidentifier'); /* nature de l'événement */ - // $course_ev->get('actionuserid') - $ev->out = $course_ev->get_description()->out(); - $evidences[] = $ev; -} - -foreach ($evidences as $ev) { - // echo "<p>{$ev->out}</p>"; -} - -// $user_competency_summary_in_course = new \tool_lp\output\user_competency_summary_in_course($studentid, $competencyid, $courseid); -// $dataSumCourse = $user_competency_summary_in_course->export_for_template(new renderer_base(new moodle_page(), 'autre')); -// var_dump($dataSumCourse); - - -$labels = array(); -$series_data = array(); -$series_data_all = array(); - -foreach ($all_evidencies as $evidence) { - // echo "<ul>"; - - - // echo "<li>{$evidence->get('id')}</li>"; - - // echo "<li>Action : {$evidence->get('action')} (0 : log, 2 ou 3 : rating)</li>"; - $grade = $evidence->get('grade'); - - if ( $grade != NULL ) { /* liéer à descidentifier == evidence_manualoverrideincourse ??? */ - $grade_label = $cpt_scale[$grade - 1]; - // echo "<li>{$grade_label}</li>"; - if ( $evidence->get('contextid') == $context->__get('id') ) { - $series_data[] = $grade; - $series_data_all[] = end($series_data_all); - } else { - $series_data[] = end($series_data); - $series_data_all[] = $grade; - } - $labels[] = userdate($evidence->get('timecreated'), "%d/%m/%y"); - } else { - } - - // evidence_manualoverride - // evidence_manualoverrideinplan - // evidence_manualoverrideincourse - $evidence_type = $evidence->get('descidentifier'); - if ( $evidence_type == 'evidence_manualoverrideincourse' ) { - $emitter = user_get_users_by_id([$evidence->get('actionuserid')])[$evidence->get('actionuserid')]; - // echo "<li>{$emitter->firstname} {$emitter->lastname}</li>"; - } elseif ( $evidence_type == 'evidence_coursemodulecompleted' ) { - // echo "<li>{$evidence->get('desca')}</li>"; - } - - // var_dump($evidence->get_description()->out()); - - // echo "</ul>"; -} - - -// echo "<pre>"; -// var_dump($context->__get('id')); -// var_dump($all_evidencies); -// var_dump($series_data); -// var_dump($series_data_all); -// var_dump($labels); -// echo "</pre>"; - -// OK OK END - - - -echo "<div class='alert alert-secondary'>"; -_html('h2', "Historique d'évaluation", "h3"); - -// $chart = new core\chart_line(); -// $chart->get_yaxis(0, true)->set_labels(["Non évaluant", "Non compétent", "Compétent"]); -// $series = new core\chart_series('Donnée dans ce cours', array_reverse($series_data)); -// $series_all = new core\chart_series("Donnée dans d'autres cours", array_reverse($series_data_all)); -// $chart->add_series($series); -// $chart->add_series($series_all); -// $chart->set_labels(array_reverse($labels)); -// echo $OUTPUT->render($chart); -// echo "<hr>"; - -// $chart = new core\chart_bar(); -// $chart->get_yaxis(0, true)->set_labels(["Non évaluant", "Non compétent", "Compétent"]); -// $series = new core\chart_series('Donnée dans ce cours', array_reverse($series_data)); -// $series_all = new core\chart_series("Donnée dans d'autres cours", array_reverse($series_data_all)); -// $chart->add_series($series); -// $chart->add_series($series_all); -// $chart->set_labels(array_reverse($labels)); -// echo $OUTPUT->render($chart); -echo "</div>"; - /* LINKED MODULES */ +_html("h3", "Lié à cette compétence"); if ( count($cm_ids) !== 0 ) { $modinfo = get_fast_modinfo($courseid); - _html("h3", "Lié à cette compétence"); echo "<div class='list-group'>"; foreach ($cm_ids as $cm_id) { echo "<a href='{$modinfo->cms[$cm_id]->url->out()}' target='_blank' class='list-group-item list-group-item-action'><img src='$CFG->wwwroot/theme/image.php/boost/{$modinfo->cms[$cm_id]->modname}/1/icon>' style='height: 1.3rem;'><span class='align-middle'> {$modinfo->cms[$cm_id]->name}</span></a>"; diff --git a/js/cpt-stud-course.js b/js/cpt-stud-course.js new file mode 100644 index 0000000..8941979 --- /dev/null +++ b/js/cpt-stud-course.js @@ -0,0 +1,24 @@ +(function() { + function active_tabs(active_tab) { + var tabs = document.querySelectorAll('#hist-tabs .nav-link'); + for ( var i=0; i < tabs.length; i++ ) { + tabs[i].setAttribute('class', 'nav-link'); + } + active_tab.setAttribute('class', 'nav-link active'); + } + function filter(type) { + var list_items = document.querySelectorAll('[data-evidenceorigin]'); + for ( var j = 0; j < list_items.length; j++ ) { + if ( type.indexOf(list_items[j].dataset.evidenceorigin) != -1 ) { + list_items[j].style.display = ''; + } else { + list_items[j].style.display = 'none'; + } + } + } + window.addEventListener('load', function() { + document.getElementById('all_history_tab').addEventListener('click', function (e) { e.preventDefault(); active_tabs(e.target); filter('course and other'); }); + document.getElementById('course_history_tab').addEventListener('click', function (e) { e.preventDefault(); active_tabs(e.target); filter('course'); }); + document.getElementById('other_history_tab').addEventListener('click', function (e) { e.preventDefault(); active_tabs(e.target); filter('other'); }); + }) +})(); \ No newline at end of file -- GitLab