From 5bc778435e9e168033b96847598f221340c30a81 Mon Sep 17 00:00:00 2001
From: Myriam Delaruelle
 <Myriam Delaruelle@bdn-un-mdelarue.ad.univ-lorraine.fr>
Date: Wed, 13 Oct 2021 11:19:00 +0200
Subject: [PATCH] competency/student dashboard

---
 course_competency.php                         | 291 +++++++-----------
 js/cpt-stud-course.js                         |  11 +-
 js/dropdown.js                                |  28 +-
 lang/en/block_competency_iena.php             |   1 +
 lang/fr/block_competency_iena.php             |   1 +
 renderer.php                                  |   4 +
 styles.css                                    |   7 +-
 templates/dashboard_competencies.mustache     |  46 +--
 .../dashboard_competency_student.mustache     | 180 +++++++++++
 9 files changed, 363 insertions(+), 206 deletions(-)
 create mode 100644 templates/dashboard_competency_student.mustache

diff --git a/course_competency.php b/course_competency.php
index 5d286ae..c503926 100644
--- a/course_competency.php
+++ b/course_competency.php
@@ -22,7 +22,9 @@ $PAGE->requires->js("/blocks/competency_iena/js/cpt-stud-course.js");
 /* <<< GESTION DROITS D'ACCÈS >>> */
 
 $context = context_course::instance($courseid);
-
+$coursenode = $PAGE->navigation->find($courseid, navigation_node::TYPE_COURSE);
+$thingnode = $coursenode->add(get_string('details_competency', 'block_competency_iena'));
+$thingnode->make_active();
 /* Check if studentid is a course participant */
 $is_enrolled = is_enrolled($context, $studentid, '', true);
 
@@ -82,22 +84,6 @@ if ( isset($_POST['review']) ) {
 
 /* <<< HELPERS >>> */
 
-function _html($el, $str, $class = "") {
-	$class = " class='" . $class . "'";
-	echo "<" . $el . $class . ">" . $str . "</" . $el . ">";
-}
-
-function _modal_builder($id, $title, $body) {
-	return "<div class='modal fade' id='{$id}' tabindex='-1' role='dialog' aria-labelledby='exampleModalScrollableTitle' aria-hidden='true'><div class='modal-dialog modal-dialog-scrollable' role='document'><div class='modal-content'><div class='modal-header'><h5 class='modal-title' id='exampleModalScrollableTitle'>{$title}</h5><button type='button' class='close' data-dismiss='modal' aria-label='Close'><span aria-hidden='true'>&times;</span></button></div><div class='modal-body'>{$body}</div></div></div></div>";
-}
-
-
-/* <<< GESTION ERREUR ACCÈS >>> */
-
-if ( $is_enrolled === false ) {
-	_html("p", "L'étudiant demandé n'est pas inscrit dans ce cours.", "alert alert-warning");
-}
-
 
 /* <<< DATA >>> */
 
@@ -111,12 +97,16 @@ if ( $is_teacher ) {
 	$students = get_enrolled_users($context);
 }
 
+
+
 /* Course modules linked to this competency */
 $cm_ids = \core_competency\api::list_course_modules_using_competency($competencyid, $courseid);
 
 /* Competency */
 $u_c_cpt = \core_competency\api::get_user_competency_in_course($courseid, $studentid, $competencyid);
 $cpt = new \core_competency\competency($competencyid);
+$cpt->shortname=$cpt->get('shortname');
+
 $cpt_scale = $cpt->get_scale()->scale_items;
 $eval = "-"; /* current eval string */
 if ( $u_c_cpt->get('grade') != null ) {
@@ -129,36 +119,11 @@ $proficiency_class = $u_c_cpt->get('proficiency') == 1 ? "success" : "secondary"
 $course_cpts = \core_competency\course_competency::list_competencies($COURSE->id);
 
 
-/* <<< PAGE >>> */
-
-/* STUDENT NAME */
-
-_html("h2", $student->firstname . " " . $student->lastname, "h3' style='margin-bottom: 0.3rem;'");
-
-/* SWITCH STUDENT FORM */
-
-if ( $is_teacher && $students != NULL && count($students) != 0 ) {
-	echo "<form action='{$CFG->wwwroot}/blocks/competency_iena/course_competency.php' id='change_student' class='form-inline m-b-1' autocomplete='off' style='display: block;height: 1.5rem;'>";
-	echo "<input type='text' hidden name='courseid' value='{$courseid}'>";
-	echo "<input type='text' hidden name='competencyid' value='{$competencyid}'>";
-	echo "<span hidden id='studentid'>{$studentid}</span>";
-
-	echo "<div id='student_dropdown' class='iena-dropdown' style='z-index: 10;'>";
-	echo "<input type='text' hidden name='studentid' id='studentid_sel' class='iena-drop-input-value' value=''>";
-	echo "<input type='text' value='' class='form-control iena-drop-input' style='font-size: .7rem; line-height: 1; width: 300px;' placeholder='{$student->firstname} {$student->lastname}'><button class='btn btn-secondary' id='prevStud' style='font-size: .8rem;line-height: 1.09; margin-left: 0.5rem;'>Précédent</button><button class='btn btn-secondary' id='nextStud' style='font-size: .8rem;line-height: 1.09; margin-left: 0.5rem;'>Suivant</button>";
-	echo "<div class='iena-droplist' id='student_list'>";
-	foreach ($students as $stud) {
-		echo "<a href='#' data-value='{$stud->id}' class='iena-drop-item' style='display: none;'>{$stud->firstname} {$stud->lastname}</a>";
-	}
-	echo "</div>";
-	echo "</div>";
-	
-	echo "</form>";
+foreach ($course_cpts as $course_cpt) {
+	$course_cpt->shortname=$course_cpt->get("shortname");
 }
 
-/* INFO ABOUT COMPETENCIES, FRAMEWORK AND CURRENT GRADE */
 
-_html('h2', $cpt->get('shortname'), "h3' style='margin-bottom: 0.3rem;'");
 
 /* COMPETENCY TREE PATH */
 
@@ -171,93 +136,54 @@ while ($cptid > 0) {
 	$cptid = $tmp_cpt->get('parentid');
 }
 /* Framework infos */
-$cpt_path_link = "<a href='#' data-toggle='modal' data-target='#modalref'>{$cpt->get_framework()->get('shortname')}</a>" . _modal_builder('modalref', $cpt->get_framework()->get('shortname'), $cpt->get_framework()->get('description'));
+//$cpt_path_link = "<a href='#' data-toggle='modal' data-target='#modalref'>{$cpt->get_framework()->get('shortname')}</a>" . _modal_builder('modalref', $cpt->get_framework()->get('shortname'), $cpt->get_framework()->get('description'));
 /* Each competency info */
-foreach ($parent_cpts as $parent_cpt) {
+/*foreach ($parent_cpts as $parent_cpt) {
 	$cpt_path_link .= " / <a href='#' data-toggle='modal' data-target='#modal{$parent_cpt['id']}'>{$parent_cpt['shortname']}</a>" . _modal_builder("modal{$parent_cpt['id']}", $parent_cpt['shortname'], $parent_cpt['description']);
-}
-echo "<div style='margin-bottom: 0.7rem;'>" . $cpt_path_link . "</div>";
+}*/
+
+
 
-/* SWITCH COMPETENCY FORM */
 
-echo "<form action='{$CFG->wwwroot}/blocks/competency_iena/course_competency.php' id='change_cpt_form' class='form-inline m-b-1' autocomplete='off' style='display: block;height: 1.5rem;'>";
-echo "<input type='text' hidden name='courseid' value='{$courseid}'>";
-echo "<input type='text' hidden name='studentid' value='{$studentid}'>";
-echo "<span hidden id='competencyid'>{$competencyid}</span>";
 
-echo "<div id='student_dropdown' class='iena-dropdown' style='z-index: 1;'>";
-echo "<input type='text' hidden name='competencyid' id='competencyid_sel' class='iena-drop-input-value' value=''>";
-echo "<input type='text' value='' class='form-control iena-drop-input' style='font-size: .7rem; line-height: 1; width: 300px;' placeholder='{$cpt->get('shortname')}' autocomplete='nope'><button class='btn btn-secondary' id='prevCpt' style='font-size: .8rem;line-height: 1.09; margin-left: 0.5rem;'>Précédent</button><button class='btn btn-secondary' id='nextCpt' style='font-size: .8rem;line-height: 1.09; margin-left: 0.5rem;'>Suivant</button>";
-echo "<div class='iena-droplist' id='competency_list'>";
-foreach ($course_cpts as $course_cpt) {
-	echo "<a href='#' data-value='{$course_cpt->get('id')}' class='iena-drop-item' style='display: none;'>{$course_cpt->get('shortname')}</a>";
-}
-echo "</div>";
-echo "</div>";
-
-echo "</form>";
-/* END switch competency form */
-
-/* EVALUATION INFOS AND ACTIONS */
-
-echo "<div class='row'>";
-/* Proficiency info */
-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' 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' style='cursor: text;'>{$eval}</p>";
-echo "</div>";
-echo "</div>";
 /* Review and grade ASK and ACTION */
 $review_class = $review_asked ? "info" : "secondary";
 $review_msg = $review_asked ? "Évaluation demandée" : "Aucune évaluation demandée";
-echo "<div class='col-12 col-lg-6'>";
-echo "<div class='alert alert-{$review_class}'>";
-echo "<h3 class='h4'>{$review_msg}</h3>";
+
+$is_me=false;
+
+
+
 if ( $review_asked ) {
 	/* Request review and cancel buttons */
 	if ( $USER->id == $studentid ) {
-		/* Student cancel his own review */
-		echo "<form method='post' action='{$CFG->wwwroot}/blocks/competency_iena/course_competency.php?courseid={$courseid}&studentid={$studentid}&competencyid={$competencyid}' style='display: inline; margin-right: 1rem;'>";
-		echo "<input hidden style='display: none;' type='text' name='review' value='cancel'>";
-		echo "<button type='submit' class='btn btn-secondary'>Annuler la demande</button>";
-		echo "</form>";
+		$is_me=true;
 	}
 } else {
 	if ( $USER->id == $studentid ) {
-		/* Student ask review */
-		echo "<form method='post' action='{$CFG->wwwroot}/blocks/competency_iena/course_competency.php?courseid={$courseid}&studentid={$studentid}&competencyid={$competencyid}' style='display: inline; margin-right: 1rem;'>";
-		echo "<input hidden style='display: none;' type='text' name='review' value='request'>";
-		echo "<button type='submit' class='btn btn-primary'>Demande d'évaluation</button>";
-		echo "</form>";
+		$is_me=true;
 	}
 }
+
+
+
 if ( $is_teacher ) {
-	/* Evaluation button and modal */
-	echo "<a href='#' data-toggle='modal' data-target='#modaleval' class='btn btn-primary'>Évaluer</a>";
-	$eval_modale_echo = "";
-	$eval_modale_echo .= "<form method='post' action='{$CFG->wwwroot}/blocks/competency_iena/course_competency.php?courseid={$courseid}&studentid={$studentid}&competencyid={$competencyid}'><div class='form-group'><div class='form-group'><label>Évaluation</label><select name='grade' class='form-control'>";
+	$scale=array();
 	foreach ($cpt_scale as $key => $item) {
-		$grade = $key + 1;
-		$selected = "";
+		$scaleItem=new StdClass();
+		$scaleItem->label=$item;
+		$scaleItem->grade = $key + 1;
 		if ( $item == $eval ) {
-			$selected = " selected";
+			$scaleItem->selected = " selected";
 		}
-		$eval_modale_echo .= "<option value='{$grade}'{$selected}>{$item}</option>";
+		array_push($scale, $scaleItem);
 	}
-	$eval_modale_echo .= "</select></div><div class='form-group'><textarea name='note' class='form-control' placeholder=\"Commentaire d'évaluation\"></textarea></div><button type='submit' class='btn btn-primary'>Évaluer</button></form></div>";
-	echo _modal_builder("modaleval", "Évaluation", $eval_modale_echo);
+
+
 }
-echo "</div>"; /* END review and grade ASK and ACTION - col */
-echo "</div>"; /* END review and grade ASK and ACTION - alert */
-echo "</div>"; /* END evaluation info and actions row */
+
+
+
 
 /* GRADES AND EVIDENCES HISTORY CHART AND LIST */
 
@@ -271,6 +197,7 @@ $user_cpt_all_data = new \tool_lp\output\user_competency_summary($user_competenc
 $user_cpt_all_data = $user_cpt_all_data->export_for_template($tool_lp_renderer);
 $all_evidences = $user_cpt_all_data->evidence;
 
+
 if ( count($all_evidences) != 0 ) {
 
 	$user_cpt_course_data = new \tool_lp\output\user_competency_summary_in_course($studentid, $competencyid, $courseid);
@@ -288,6 +215,7 @@ if ( count($all_evidences) != 0 ) {
 	$series_data_course = array();
 	$series_data_other = array();
 	foreach ($all_evidences as $key => $ev) {
+		//partie chart
 		if ( isset($ev->grade) ) {
 			$labels[] = userdate($ev->timemodified, "%d/%m/%y");
 			$series_data_all[] = $ev->grade;
@@ -299,9 +227,31 @@ if ( count($all_evidences) != 0 ) {
 				$series_data_other[] = $ev->grade;
 			}
 		}
+		//fin partie chart
+		/* mark difference between this course evidences in html for JS filter with tabs */
+		if ( in_array($ev->id, $course_evidences_ids) ) {
+			$ev->is_course_evidence = " data-evidenceorigin=course";
+		} else {
+			$ev->is_course_evidence = " data-evidenceorigin=other";
+		}
+		if ( $ev->action === "0" ) {
+			$ev->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 ) {
+					$ev->grade_make_proficient = ' list-group-item-success';
+					break;
+				} else {
+					$ev->grade_make_proficient = '';
+				}
+			}
+		}
+		$ev->date = date("d/m/y – H:i", $ev->timemodified);
 	}
 
-	echo "<div class='alert alert-secondary'>";
+	
 	/* $chart = new core\chart_line(); */
 	$chart = new core\chart_bar();
 	$axis_labels = $cpt_scale;
@@ -314,72 +264,18 @@ if ( count($all_evidences) != 0 ) {
 	$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'";
-		}
-		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';
-					break;
-				} 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>";
-	}
-	echo "</ul>";
-	echo "</div>"; /* evidences list col */
-	echo "</div>"; /* evidences list row */
+	
+
 
 } /* END IF count all evidences (course and outside) == 0 */
 
-echo "<pre>";
-// print_r($all_evidences);
-echo "</pre>";
+
 
 /* 
 
@@ -391,24 +287,63 @@ Remonter ces données en haut et commenter les données préalablement récupér
 
 /* LINKED MODULES */
 
-_html("h3", "Lié à cette compétence");
+
+
+
 if ( count($cm_ids) !== 0 ) {
+	$modules=array();
 	$modinfo = get_fast_modinfo($courseid);
-	echo "<div class='list-group'>";
 	foreach ($cm_ids as $cm_id) {
-		$url = $modinfo->cms[$cm_id]->url->out();
+		$module=new StdClass();
+		$module->url = $modinfo->cms[$cm_id]->url->out();
 		$is_assign = strpos($url, '/mod/assign') !== false;
 		if ($is_teacher && $is_assign) {
-			$url = $url . "&rownum=0&action=grader&userid=" . $studentid;
+			$module->url = $url . "&rownum=0&action=grader&userid=" . $studentid;
 		}
-		echo "<a href='{$url}' 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>";
+		$module->link_icon=$CFG->wwwroot."/theme/image.php/boost/".$modinfo->cms[$cm_id]->modname."/1/icon";
+		$module->name=$modinfo->cms[$cm_id]->name;
+		array_push($modules, $module);
 	}
-	echo "</div>";
-} else {
-	_html("p", "Aucune ressource ou activité n'est liée à cette compétence dans ce cours. ", "alert alert-secondary");
+
 }
 
 
+
+
+$data=array();
+$data['is_enrolled']=$is_enrolled;
+$data['link_switch']=$CFG->wwwroot."/blocks/competency_iena/course_competency.php";
+$data['courseid']=$courseid;
+$data['competencyid']=$competencyid;
+$data['studentid']=$studentid;
+$data['student']=$student;
+$data['students']=array_values($students);
+$data['cpt']=$cpt;
+$data['course_cpts']=array_values($course_cpts);
+$data['is_teacher']=$is_teacher;
+$data['review_class']=$review_class;
+$data['review_msg']=$review_msg;
+$data['is_me']=$is_me;
+$data['link_review']=$CFG->wwwroot."/blocks/competency_iena/course_competency.php?courseid=".$courseid."&studentid=".$studentid."&competencyid=".$competencyid;
+$data['scale']=$scale;
+$data['all_evidences']=$all_evidences;
+$data['count_all_evidences']=count($all_evidences);
+if(isset($chart)){
+	$data['chart']=$OUTPUT->render($chart);
+}
+
+
+$data['count_cm_ids']=count($cm_ids);
+$data['cm_ids']=$modules;
+$data['proficiency']=$proficiency;
+$data['proficiency_class']=$proficiency_class;
+$data['eval']=$eval;
+
+$renderer = $PAGE->get_renderer('block_competency_iena');
+
+$renderer->get_dashboard_competency_student($data);
+
+
 echo $OUTPUT->footer();
 
 ?>
\ No newline at end of file
diff --git a/js/cpt-stud-course.js b/js/cpt-stud-course.js
index 8941979..040164e 100644
--- a/js/cpt-stud-course.js
+++ b/js/cpt-stud-course.js
@@ -1,5 +1,6 @@
 (function() {
 	function active_tabs(active_tab) {
+		console.log(active_tab);
 		var tabs = document.querySelectorAll('#hist-tabs .nav-link');
 		for ( var i=0; i < tabs.length; i++ ) {
 			tabs[i].setAttribute('class', 'nav-link');
@@ -17,8 +18,12 @@
 		}
 	}
 	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'); });
+		var history=document.getElementById('all_history_tab');
+		if(history){
+			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
diff --git a/js/dropdown.js b/js/dropdown.js
index b470b92..720f0ec 100644
--- a/js/dropdown.js
+++ b/js/dropdown.js
@@ -2,8 +2,10 @@
 	function filter (e) {
 		let filter = e.target.value.toUpperCase();
 		let a = e.target.parentNode.querySelectorAll('a');
+		console.log(a);
 		for (let k = 0; k < a.length; k++) {
 			let txtValue = a[k].textContent || a[k].innerText;
+			console.log(txtValue);
 			if (txtValue.toUpperCase().indexOf(filter) > -1) {
 				a[k].style.display = "block";
 			} else {
@@ -13,7 +15,7 @@
 	}
 	window.addEventListener('load', function () {
 		/* Activation of dropdowns in the page */
-
+		console.log("on load");
 		let drops = document.querySelectorAll('.iena-dropdown');
 		
 		for (var i = 0; i < drops.length; i++) {
@@ -22,8 +24,19 @@
 				for (var i = 0; i < a.length; i++) {
 					a[i].style.display = "block";
 				}*/
+			
 				let list = e.target.parentNode.getElementsByClassName('iena-droplist')[0];
+				//Pas propre mais sinon c'est le template qui est pas propre 
+				//pour le dashboard compétence/étudiant, on a rajouté un div inline-form
+				if(!list){
+					console.log("pas list");
+					console.log(e.target.parentNode.parentNode.parentNode);
+					list=e.target.parentNode.parentNode.parentNode.getElementsByClassName('iena-droplist')[0]
+					console.log(list);
+				}
+				console.log(list);
 				list.style.display="block";
+				console.log("c'était ici l'erreur");
 				filter(e);
 			});
 			
@@ -39,6 +52,11 @@
 					input.value = e.target.innerText;
 
 					let list = e.target.parentNode;
+					if(!list){
+						console.log("pas list");
+						list=e.target.parentNode.parentNode.parentNode;
+					}
+					console.log(list);
 					list.style.display="none";
 					
 					list.parentNode.parentNode.submit();
@@ -50,7 +68,15 @@
 				for (var i = 0; i < a.length; i++) {
 					a[i].style.display = "none";
 				}*/
+				console.log("hello");
+				
 				let list = e.target.parentNode.getElementsByClassName('iena-droplist')[0];
+				if(!list){
+					console.log("pas list");
+					list=e.target.parentNode.parentNode.parentNode.getElementsByClassName('iena-droplist')[0]
+				}
+				console.log(list);
+
 				list.style.display="none";
 			});
 			
diff --git a/lang/en/block_competency_iena.php b/lang/en/block_competency_iena.php
index 806d7f6..845cdbe 100644
--- a/lang/en/block_competency_iena.php
+++ b/lang/en/block_competency_iena.php
@@ -92,4 +92,5 @@
     $string['not_assessed']="Not assessed";
     $string['validated_competencies']="Students who validated the competency";
     $string['assessments']="Assessments";
+    $string['details_competency']="Details competency/student";
 ?>
\ No newline at end of file
diff --git a/lang/fr/block_competency_iena.php b/lang/fr/block_competency_iena.php
index 6a4bb6c..35e730d 100644
--- a/lang/fr/block_competency_iena.php
+++ b/lang/fr/block_competency_iena.php
@@ -91,6 +91,7 @@
     $string['not_assessed']="Non évalués";
     $string['validated_competencies']="Étudiants ayant validé la compétence";
     $string['assessments']="Évaluations";
+    $string['details_competency']="Détails compétence/étudiant";
 
 
 
diff --git a/renderer.php b/renderer.php
index a0fc081..d0c65cc 100644
--- a/renderer.php
+++ b/renderer.php
@@ -83,4 +83,8 @@ class block_competency_iena_renderer extends plugin_renderer_base {
     function get_dashboard_competency($data){
          echo $this->render_from_template('block_competency_iena/dashboard_competencies', $data);
     }
+
+    function get_dashboard_competency_student($data){
+         echo $this->render_from_template('block_competency_iena/dashboard_competency_student', $data);
+    }
 }
diff --git a/styles.css b/styles.css
index 1969ffe..ce99302 100644
--- a/styles.css
+++ b/styles.css
@@ -87,7 +87,7 @@
 /* Dropdown selectors */
 
 .iena-dropdown {
-    position: absolute;
+    position: relative;
 }
 
 .iena-dropdown a:hover, .framework-dropdown a:hover{ background-color: #ddd; }
@@ -102,6 +102,8 @@
     border: 1px solid lightgrey;
     box-shadow: 1px 1px 4px 0px lightgrey;
     display: none;
+    position: absolute;
+    z-index: 10;
 }
 
 .iena-drop-item {
@@ -317,3 +319,6 @@ table.dataTable{
     margin-right: 20px;
 }
 
+.iena-history{
+    margin-bottom: 30px;
+}
diff --git a/templates/dashboard_competencies.mustache b/templates/dashboard_competencies.mustache
index 1793b54..0c9b614 100644
--- a/templates/dashboard_competencies.mustache
+++ b/templates/dashboard_competencies.mustache
@@ -91,34 +91,34 @@
 					
 				</div>
 				<div class='modal fade' id="modal-assess-{{id}}" tabindex='-1' role='dialog' aria-labelledby='exampleModalScrollableTitle' aria-hidden='true'>
-						<div class='modal-dialog modal-dialog-scrollable modal-dialog-centered' role='document'>
-							<div class='modal-content'>
-								<div class='modal-header'>
-									<h5 class='modal-title'>{{#str}} eval, block_competency_iena {{/str}}</h5>
-									<button type='button' class='close' data-dismiss='modal' aria-label='Close'><span aria-hidden='true'>&times;</span></button>
-								</div>
-								<div class='modal-body'>
-									<form method='post' action='{{link_assess}}'>
-										<div class='form-group'><div class='form-group'>
-											<label>Évaluation</label>
-											<select name='grade' class='form-control'>
-											{{#scale}}
-												<option value='{{value}}'{{selected}}>{{title}}</option>
-											{{/scale}}
-											</select>
-										</div>
-										<div class='form-group'>
-											<textarea name='note' class='form-control' placeholder="Commentaire d'évaluation"></textarea>
-										</div>
-										<button type='submit' class='btn btn-primary'>Évaluer</button>
-									</form>
-									
+					<div class='modal-dialog modal-dialog-scrollable modal-dialog-centered' role='document'>
+						<div class='modal-content'>
+							<div class='modal-header'>
+								<h5 class='modal-title'>{{#str}} eval, block_competency_iena {{/str}}</h5>
+								<button type='button' class='close' data-dismiss='modal' aria-label='Close'><span aria-hidden='true'>&times;</span></button>
+							</div>
+							<div class='modal-body'>
+								<form method='post' action='{{link_assess}}'>
+									<div class='form-group'><div class='form-group'>
+										<label>Évaluation</label>
+										<select name='grade' class='form-control'>
+										{{#scale}}
+											<option value='{{value}}'{{selected}}>{{title}}</option>
+										{{/scale}}
+										</select>
+									</div>
+									<div class='form-group'>
+										<textarea name='note' class='form-control' placeholder="Commentaire d'évaluation"></textarea>
+									</div>
+									<button type='submit' class='btn btn-primary'>Évaluer</button>
+								</form>
+								
 
-								</div>
 							</div>
 						</div>
 					</div>
 				</div>
+			</div>
 			{{/cpt_studs}}
 			{{^cpt_studs}}
 				<div class='alert alert-warning'>{{message}}</div>
diff --git a/templates/dashboard_competency_student.mustache b/templates/dashboard_competency_student.mustache
new file mode 100644
index 0000000..ea32a47
--- /dev/null
+++ b/templates/dashboard_competency_student.mustache
@@ -0,0 +1,180 @@
+<h2>{{# str }} details_competency, block_competency_iena{{/ str }}</h2>
+{{#is_enrolled}}
+
+	{{#is_teacher}}
+		<div class="row" style="margin-top:20px; margin-bottom:20px">
+			<div class="col-md-6">
+				<form action='{{link_switch}}' id='change_student' class='m-b-1' autocomplete='off'>
+					<input type='text' hidden name='courseid' value='{{courseid}}'>
+					<input type='text' hidden name='competencyid' value='{{competencyid}}'>
+					<span hidden id='studentid'>{{studentid}}</span>
+					<div id='student_dropdown' class='iena-dropdown' style='z-index: 10;'>
+						<input type='text' hidden name='studentid' id='studentid_sel' class='iena-drop-input-value' value=''>
+						<div class="form-group" style="margin-bottom:0">
+    						<label for="exampleInputEmail1">Etudiant</label>
+							<div class="form-inline "><input type='text' value='' class='form-control iena-drop-input' style='font-size: .7rem; line-height: 1; width: 300px;' placeholder='{{student.firstname}} {{student.lastname}}'>
+							<button class='btn btn-secondary' id='prevStud' style='font-size: .8rem;line-height: 1.09; margin-left: 0.5rem;'>Précédent</button><button class='btn btn-secondary' id='nextStud' style='font-size: .8rem;line-height: 1.09; margin-left: 0.5rem;'>Suivant</button></div>
+						</div>
+						<div class='iena-droplist' id='student_list'>
+						{{#students}}
+							<a href='#' data-value='{{id}}' class='iena-drop-item' style='display: block;'>{{firstname}} {{lastname}}</a>
+						{{/students}}
+						</div>
+					</div>
+				</form>
+			</div>
+			<div class="col-md-6">
+				<form action='{{link_switch}}' id='change_cpt_form' class='m-b-1' autocomplete='off' style='display: block;height: 1.5rem;'>
+					<input type='text' hidden name='courseid' value='{{courseid}}'>
+					<input type='text' hidden name='studentid' value='{{studentid}}'>
+					<span hidden id='competencyid'>{{competencyid}}</span>
+					<div id='student_dropdown' class='iena-dropdown' style='z-index: 1;'>
+						<input type='text' hidden name='competencyid' id='competencyid_sel' class='iena-drop-input-value' value=''>
+						<div class="form-group" style="margin-bottom:0">
+							<label for="exampleInputEmail1">Compétence</label>
+							<div class="form-inline">
+								<input type='text' value='' class='form-control iena-drop-input' style='font-size: .7rem; line-height: 1; width: 300px;' placeholder='{{cpt.shortname}}' autocomplete='nope'><button class='btn btn-secondary' id='prevCpt' style='font-size: .8rem;line-height: 1.09; margin-left: 0.5rem;'>Précédent</button><button class='btn btn-secondary' id='nextCpt' style='font-size: .8rem;line-height: 1.09; margin-left: 0.5rem;'>Suivant</button>
+							</div>
+						</div>
+						<div class='iena-droplist' id='competency_list'>
+						{{#course_cpts}}
+							<a href='#' data-value='{{id}}' class='iena-drop-item' style='display: block;'>{{shortname}}</a>
+						{{/course_cpts}}
+						</div>
+					</div>
+				</form>
+			</div>
+		</div>
+	{{/is_teacher}}
+	<div class='row'>
+	
+		<div class='col-12 col-lg-3'>
+			<div class='alert alert-{{proficiency_class}}'>
+				<h3 class='h4'>Validé</h3>
+				<p class='m-b-0 btn p-l-0' style='cursor: text;'>{{proficiency}}</p>
+			</div>
+		</div>
+	
+		<div class='col-12 col-lg-3'>
+			<div class='alert alert-{{proficiency_class}}'>
+				<h3 class='h4'>Évaluation</h3>
+				<p class='m-b-0 btn p-l-0' style='cursor: text;'>{{eval}}</p>
+			</div>
+		</div>
+		<div class='col-12 col-lg-6'>
+			<div class='alert alert-{{review_class}}' style="text-align:center">
+				<h3 class='h4'>{{review_msg}}</h3>
+				{{#review_asked}}
+					{{#is_me}}
+						<form method='post' action='{{link_review}}' style='display: inline; margin-right: 1rem;'>
+							<input hidden style='display: none;' type='text' name='review' value='cancel'>
+							<button type='submit' class='btn btn-secondary'>Annuler la demande</button>
+						</form>
+					{{/is_me}}
+				{{/review_asked}}
+				{{^review_asked}}
+					{{#is_me}}
+						<form method='post' action='{{link_review}}' style='display: inline; margin-right: 1rem;'>
+							<input hidden style='display: none;' type='text' name='review' value='request'>
+							<button type='submit' class='btn btn-primary'>Demande d'évaluation</button>
+						</form>
+					{{/is_me}}
+				{{/review_asked}}
+				{{#is_teacher}}
+					<button data-toggle='modal' data-target='#modal-assess' class='btn btn-primary'>Évaluer</Button>
+					<div class='modal fade' id="modal-assess" tabindex='-1' role='dialog' aria-labelledby='exampleModalScrollableTitle' aria-hidden='true'>
+						<div class='modal-dialog modal-dialog-scrollable modal-dialog-centered' role='document'>
+							<div class='modal-content'>
+								<div class='modal-header'>
+									<h5 class='modal-title'>{{#str}} eval, block_competency_iena {{/str}}</h5>
+									<button type='button' class='close' data-dismiss='modal' aria-label='Close'><span aria-hidden='true'>&times;</span></button>
+								</div>
+								<div class='modal-body'>
+									<form method='post' action='{{link_review}}'>
+										<div class='form-group'><div class='form-group'>
+											<label>Évaluation</label>
+											<select name='grade' class='form-control'>
+											{{#scale}}
+												<option value='{{value}}'{{selected}}>{{title}}</option>
+											{{/scale}}
+											</select>
+										</div>
+										<div class='form-group'>
+											<textarea name='note' class='form-control' placeholder="Commentaire d'évaluation"></textarea>
+										</div>
+										<button type='submit' class='btn btn-primary'>Évaluer</button>
+									</form>
+									
+
+								</div>
+							</div>
+						</div>
+					</div>
+				{{/is_teacher}}
+			</div>
+
+		</div>
+	</div>
+	</div>
+	{{#count_all_evidences}}
+		<div class='alert alert-secondary'>
+			<div class='col-12'>
+				<h2 class='h4'>{{#str}} eval_2, block_competency_iena {{/str}}</h2>
+				<div class="iena-chart-unique">
+					{{{chart}}}
+				</div>
+			</div>
+		</div>
+		<div class='row iena-history'>
+			<div class='col-12'>
+				<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>
+				<ul class='list-group' style='max-height: 40vh; overflow-y: auto;'>
+				{{#all_evidences}}
+					<li class='list-group-item{{grade_make_proficient}}'{{is_course_evidence}}>
+						<div class='d-flex w-100 justify-content-between'>
+							{{#gradename}}
+								<p class='mb-1'><b>Évaluation :</b> {{gradename}}</p>
+							{{/gradename}}
+							<small>{{date}}</small>
+						</div>
+						
+						{{#note}}
+							<p class='mb-1' ><b>Commentaire :</b> "{{note}}"</p>
+						{{/note}}
+						{{#actionuser}}
+							<p><b>Évalué par :</b> <a target='_blank' href='{{profileurl}}'>{{fullname}}</a></p>
+						{{/actionuser}}
+						<p class='mb-1 font-weight-light'><em>{{description}}</em></p>
+					</li>
+
+				{{/all_evidences}}
+				</ul>
+			</div>
+		</div>
+	{{/count_all_evidences}}
+	<h3>Lié à cette compétence</h3>
+	{{#count_cm_ids}}
+		<div class='list-group'>
+			{{#cm_ids}}
+				<a href='{{url}}' target='_blank' class='list-group-item list-group-item-action'><img src='{{link_icon}}' style='height: 1.3rem;'><span class='align-middle'> {{name}}</span></a>
+			{{/cm_ids}}
+		</div>
+	{{/count_cm_ids}}
+	{{^count_cm_ids}}
+		<p class="alert alert-secondary">Aucune ressource ou activité n'est liée à cette compétence dans ce cours.</p>
+	{{/count_cm_ids}}
+
+{{/is_enrolled}}
+{{^is_enrolled}}
+	<p class="alert alert-warning">L'étudiant demandé n'est pas inscrit dans ce cours.</p>
+{{/is_enrolled}}
\ No newline at end of file
-- 
GitLab