Skip to content
Snippets Groups Projects
Commit 604a09fe authored by Thomas Fradet's avatar Thomas Fradet
Browse files

dashboard

parent 6da2f746
No related branches found
No related tags found
No related merge requests found
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment