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