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