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'>×</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'>×</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'>×</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'>×</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