From 537539d03b675e6169ce9a655e867826499bba63 Mon Sep 17 00:00:00 2001 From: Myriam Delaruelle <myriam.delaruelle@univ-lorraine.fr> Date: Wed, 19 Feb 2025 16:00:43 +0100 Subject: [PATCH] search complete --- amd/build/suivi.js | 57 +++++++++++++++++- lang/en/format_iena.php | 3 + lang/fr/format_iena.php | 3 + styles.css | 9 +++ suivi_unit.php | 125 ++++++++++++++++++++++++++++++++------- templates/suivi.mustache | 20 ++++++- 6 files changed, 193 insertions(+), 24 deletions(-) diff --git a/amd/build/suivi.js b/amd/build/suivi.js index be83d90..0a2c975 100644 --- a/amd/build/suivi.js +++ b/amd/build/suivi.js @@ -58,6 +58,9 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], $('.dropdown-menu-form').on('click', function (e) { e.stopPropagation(); }); + $('#iena-button-search').on('click', function(e){ + searchStudent(); + }) @@ -99,7 +102,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], updateGroupsFilterLabel(); } - //changeGroup(); + }); }, initTable:function(){ @@ -127,6 +130,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], localStorage.setItem("groups",request); } + console.log(request); initActivityFilter(false); updateActivitiesFilterLabel(false); initGroupFilter(false); @@ -208,6 +212,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], symbol=$("#symbol-select").val(); completion=$("#completion-select").val(); data.count_results=0; + for(var i=0; i<data.students.length; i++){ if(data.display_groups==1){ data.students[i].display_groups=true; @@ -419,7 +424,55 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], + function searchStudent(){ + $(".iena-filters .custom-select").prop('disabled', true); + $(".iena-filters .iena-custom-dropdown > button").prop('disabled', true); + + if($("#iena-close-tag").length == 0){ + console.log("on a pas encore cherché"); + old_data=$.extend(true,{},data); + } + else{ + console.log("le tag existe : on a déjà cherché"); + } + + var completeUrl=getCompleteUrl(); + var searchinput= $('input[name="iena-search-student"]').val(); + $('#iena-search-tag').html(`<span role="option" data-value="`+searchinput+`" aria-selected="true" class="badge badge-secondary clickable text-wrap text-break line-height-4 m-1" id="form_autocomplete_selection-1739873966209-0" data-active-selection="true"> + `+searchinput+`<i id="iena-close-tag" class="icon fa fa-times pl-2 mr-0"></i> + </span>`); + + $('#iena-search-tag').on('click', 'i', function(e){ + + deleteSearch(old_data); + }); + $.ajax({ url: completeUrl, + data: {action: 'search_student', search_input:searchinput}, + type: 'post', + success: function(request) { + showHideActivities(); + data=calcPercentage(JSON.parse(request)); + showHideStudents(); + if(!request.error){ + + } + $('input[name="iena-search-student"]').val(""); + reloadTable(data); + updateGroupsFilterLabel(false); + } + }); + } + + function deleteSearch(old_data){ + $('#iena-search-tag').html(""); + data=old_data; + $(".iena-filters .custom-select").prop('disabled', false); + $(".iena-filters .iena-custom-dropdown > button").prop('disabled', false); + showHideStudents(); + reloadTable(data); + + } @@ -579,7 +632,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], function checkAllGroupsFilter(){ $('.selectallgroups').prop('checked', true); $('.group-option').prop('checked', true); - //changeGroup(); + $(".select-text").html(' Deselect'); } diff --git a/lang/en/format_iena.php b/lang/en/format_iena.php index ae2972c..18d6200 100644 --- a/lang/en/format_iena.php +++ b/lang/en/format_iena.php @@ -121,3 +121,6 @@ $string['messagesSent']="Messages sent"; $string['messagesNotSent']="An error occured: the messages could not be sent"; $string['enable_icon_click']="Enable clicks on student progress"; $string['enable_icon_click_help']="By default, students can access directly their activies by clicking on their bubbles in their progress dashboard. You can disable these links so they can't have access to them out of context."; +$string['searchplaceholder']="Name, student ID..."; +$string['searchstudent']="Search"; +$string['filterstudent']="Filters"; \ No newline at end of file diff --git a/lang/fr/format_iena.php b/lang/fr/format_iena.php index 5a846b6..13b77ca 100644 --- a/lang/fr/format_iena.php +++ b/lang/fr/format_iena.php @@ -121,3 +121,6 @@ $string['messagesSent']="Message(s) envoyé(s)"; $string['messagesNotSent']="Une erreur s'est produite : le()s message(s) n'ont pas été envoyé(s)"; $string['enable_icon_click']="Activer les pastilles cliquables"; $string['enable_icon_click_help']="Par défaut, les étudiants peuvent accéder directement aux activités en cliquant sur leur pastille dans leur interface de progression. Vous pouvez désactiver ces liens pour que les étudiants ne puissent pas accéder aux ressources en dehors d'un certain contexte."; +$string['searchplaceholder']="Nom, numéro étudiant..."; +$string['searchstudent']="Rechercher un étudiant"; +$string['filterstudent']="Filtres"; diff --git a/styles.css b/styles.css index 3e0aaf3..cbee038 100644 --- a/styles.css +++ b/styles.css @@ -1250,4 +1250,13 @@ border-bottom: 1px solid #dee2e6; #drawermenu .iena-custom-button{ margin:0!important; +} + +#iena-search-tag{ + display: inline-block; + vertical-align: middle; +} + +#iena-search-bar{ + margin-top: 30px; } \ No newline at end of file diff --git a/suivi_unit.php b/suivi_unit.php index f102f16..86d5a7a 100644 --- a/suivi_unit.php +++ b/suivi_unit.php @@ -89,11 +89,12 @@ function get_groups($context, $activegroupids, $groups) { // Formate l'achèvement d'activités pour le tableau de suivi. Pour chaque étudiant, on aura // dans le bon ordre la liste des modules et le completionstate. -function format_progress($progress, $modules, $groups, $activegroupids, $activesectionid) { +function format_progress($progress, $modules, $groups, $search=false, $activegroupids=0, $activesectionid=0) { + global $CFG, $COURSE; $students = array(); - foreach ($progress as $proginfo) { + $progressstudent = new StdClass(); $progressstudent->firstname = $proginfo->firstname; $progressstudent->lastname = $proginfo->lastname; @@ -103,10 +104,10 @@ function format_progress($progress, $modules, $groups, $activegroupids, $actives $progressstudent->report_link = $CFG->wwwroot . "/report/outline/user.php?id=" . $progressstudent->id . "&course=" . $COURSE->id . "&mode=outline"; $progressstudent->message_link = $CFG->wwwroot . "/message/index.php?id=" . $progressstudent->id; - - //if ($activegroupid == 0) { - $progressstudent->groups = ""; - $progressstudent->groupsid=array(); + $progressstudent->groups = ""; + $progressstudent->groupsid=array(); + + if (!$search) { foreach ($groups as $group) { if (in_array($progressstudent->id, $group->members)) { if(empty( $progressstudent->groups)){ @@ -118,8 +119,12 @@ function format_progress($progress, $modules, $groups, $activegroupids, $actives array_push( $progressstudent->groupsid, $group->id); } } - //} - + } + else{ + $progressstudent->groups= $proginfo->groups; + $progressstudent->groupsid= $proginfo->groupsid; + } + foreach ($modules as $key => $module) { $moduleprogress = new StdClass(); @@ -133,6 +138,7 @@ function format_progress($progress, $modules, $groups, $activegroupids, $actives $progressstudent->progress[$key] = $moduleprogress; } + //error_log(print_r($progressstudent, true)); $students[] = $progressstudent; } @@ -217,11 +223,10 @@ function set_filters($data, $filters, $symbols, $sections, $currentusergroups, $ } // -function set_data($data, $modules, $groups, $activegroupsids, $activesectionid, $listoptions) { +function set_links($data, $modules,$listoptions) { global $COURSE, $USER, $CFG; - $data["modules"] = $modules;; - $countmodules = count($data["modules"]); + $countmodules = count($modules); //$data["students"] = format_progress($progress, $modules, $groups, $activegroupsids, $activesectionid); //$countstudents = count($data["students"]); @@ -242,11 +247,7 @@ function set_data($data, $modules, $groups, $activegroupsids, $activesectionid, if($listoptions->listoptions['display_details']["value"]){ $data["display_details"]=1; } - - // Pas que pour le téléchargement du tableau, partie à optimiser - if (!isset($data['data'])) { - $data['data'] = array(); - } + //$data['data'] = json_encode($data); return $data; @@ -284,7 +285,78 @@ function get_progress_students($modules, $progress, $groups, $activegroupsids, $ $arrayprogress=(object) array_unique(array_merge((array) $arrayprogress, (array) $progress), SORT_REGULAR); } - return format_progress($arrayprogress, $modules, $groups, $activegroupsids, $activesectionid); + + return format_progress($arrayprogress, $modules, $groups, false, $activegroupsids, $activesectionid); +} + +function get_progress_student($identifier, $completion, $modules){ + global $DB; + global $COURSE; + $countmethod=0; + $users=array(); + + //Essayer de faire des switch case avec counttries + $arrayparams=array(); + $explodedname=explode(" ", $identifier); + $sql="SELECT DISTINCT u.id, u.firstname, u.lastname, u.email, u.idnumber + FROM {user} u + JOIN {user_enrolments} ue ON ue.userid = u.id + JOIN {enrol} e ON e.id = ue.enrolid + JOIN {role_assignments} ra ON ra.userid = u.id + JOIN {context} ct ON ct.id = ra.contextid AND ct.contextlevel = 50 + JOIN {course} c ON c.id = ct.instanceid AND e.courseid = c.id + JOIN {role} r ON r.id = ra.roleid AND r.shortname = 'student' + WHERE e.status = 0 AND u.suspended = 0 AND u.deleted = 0 AND c.id= ?"; + $arrayparams[]=$COURSE->id; + if(count($explodedname)>1){ + + + $sql.=" AND (u.lastname LIKE ? AND u.firstname LIKE '?') OR (u.lastname LIKE '?' AND u.firstname LIKE '?')"; + + array_push($arrayparams, $identifier[0], $identifier[1], $identifier[1], $identifier[0]); + } + else{ + $sql.=" AND u.lastname LIKE ? OR u.idnumber = ?"; + + array_push($arrayparams, "%".$identifier."%", $identifier); + } + + $users=array_values($DB->get_records_sql($sql, $arrayparams)); + + + if(count($users)>0){ + $completion_student=array(); + $where = array(); + $where_params = array(); + + //regarder get_in_or_equal + for($i=0; $i<count($users);$i++){ + // foreach($users as $user){ + + $where = $DB->sql_equal('u.id', ':idstudent', false, false); + $where_params['idstudent'] = $users[$i]->id.'%'; + $completion_student=array_values($completion->get_progress_all($where, $where_params)); + $usergroup=groups_get_all_groups($COURSE->id, $users[$i]->id); + $completion_student[0]->groups=""; + $completion_student[0]->groupsid=array(); + + foreach($usergroup as $group){ + + $completion_student[0]->groups.=$group->name; + $completion_student[0]->groupsid[]=$group->id; + + } + $arrayprogress=(object) array_unique(array_merge((array) $arrayprogress, (array) $completion_student), SORT_REGULAR); + } + return format_progress($arrayprogress, $modules, false, true); + + } + else{ + //On a pas trouvé d'utilisateur + return array("error"=>"Pas d'utilisateurs trouvés"); + } + + } $filters = [ @@ -361,7 +433,6 @@ if (!has_capability('course/iena:suivi', $context = context_course::instance($co exit; } - $countstudents=count_enrolled_users($context); //Si on a sélectionné des groupes dans les filtres @@ -453,15 +524,27 @@ if (isset($_POST['action']) && $_POST['action'] == "details") { echo json_encode($data); } +else if(isset($_POST['action']) && $_POST['action'] == 'search_student' && isset($_POST['search_input'])){ + + $data=[]; + $sanitized=filter_var($_POST['search_input'], FILTER_SANITIZE_STRING); + $modules = get_activities($completion, $activesectionid); + $data["modules"]=$modules; + $data["students"]=get_progress_student($sanitized, $completion, $modules); + $data = set_links($data, $modules, $listoptions); + echo json_encode($data); +} // If a post is sent trought the page --> Si on change les filtres (de groupes), le template est appelé en JS else if (isset($_POST['action']) && !empty($_POST['action'])) { - error_log("je change le filtre des groupes"); + error_log("on passe dans l'action "); $groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true); $data = []; $modules = get_activities($completion, $activesectionid); $data["students"]=get_progress_students($modules, $arrayprogress, $groups, $activegroupsids, $activesectionid, $courseid, $cache, $completion); $data["modules"]=$modules; $data["countstudents"]=count($data["students"]); + $data = set_links($data, $modules, $listoptions); + echo json_encode($data); } @@ -481,6 +564,7 @@ else { $data["completion_enabled"]=1; $currentusergroups = []; $activegroupname = ""; + $modules = get_activities($completion, $activesectionid); @@ -494,13 +578,12 @@ else { $sections = get_sections($activesectionid); //$data["countstudents"]=$countstudents; $data = set_filters($data, $filters, $symbols, $sections, $groupsall->current_user_groups, $groupsall->othergroups, $activesectionid); - //$data = set_data($data, $modules, $groups, $activegroupsids, $activesectionid, $listoptions); if (isset($_GET["msg_success"])) { $msg = $_GET["msg_success"]; $data["msg_success"] = $msg; } - + } diff --git a/templates/suivi.mustache b/templates/suivi.mustache index 21c15f1..36d82eb 100644 --- a/templates/suivi.mustache +++ b/templates/suivi.mustache @@ -1,7 +1,7 @@ {{#completion_enabled}} <div> - <h2 class="mb1" style="display: inline-block;">{{#str}}table_progress, format_iena{{/str}}</h2> + <div class="context-header-settings-menu"> <div class="action-menu moodle-actionmenu d-inline" id="action-menu-3" data-enhance="moodle-core-actionmenu"> <div class="menubar d-flex " id="action-menu-3-menubar" role="menubar"> @@ -30,7 +30,10 @@ </div> </div> +<h4 style="margin-top:30px;">{{# str }} filterstudent, format_iena {{/ str}}</h4> <form style="clear: right;" class="form-inline iena-filters" action="" method="GET"> + +<br> <input name="courseid" type="number" hidden="hidden" style="display: none;" value=""> <label class="sr-only" for="section-select">Section</label> @@ -135,6 +138,21 @@ </select> </div> </form> + +<div> + + <div id="iena-search-bar"> + <h4>{{# str }} searchstudent, format_iena {{/ str}}</h4> + <input type="text" name="iena-search-student" placeholder="{{# str }} searchplaceholder, format_iena {{/ str}}"></input> + + <button id="iena-button-search" class="btn btn-primary">Rechercher</button> + <div id="iena-search-tag"> + <div class="form-autocomplete-selection d-inline-block my-0 form-autocomplete-multiple h5" role="listbox" aria-atomic="true" tabindex="0"></div> + + </div> + </div> +</div> + {{#msg_success}} <div class="alert alert-success iena-message">{{# str }} messagesSent, format_iena {{/ str}}</div> {{/msg_success}} -- GitLab