Commit 604a09fe authored by Thomas Fradet's avatar Thomas Fradet

dashboard

parent 6da2f746
......@@ -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.
......@@ -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>";
......
(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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment