diff --git a/grade/report/grader/amd/build/user.min.js b/grade/report/grader/amd/build/user.min.js index 89ef7719ca6c6..2f0514315c898 100644 --- a/grade/report/grader/amd/build/user.min.js +++ b/grade/report/grader/amd/build/user.min.js @@ -1,10 +1,10 @@ -define("gradereport_grader/user",["exports","core_user/comboboxsearch/user","core/url","gradereport_grader/local/user/repository"],(function(_exports,_user,_url,Repository){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +define("gradereport_grader/user",["exports","core_user/comboboxsearch/user","gradereport_grader/local/user/repository"],(function(_exports,_user,Repository){var obj; /** * Allow the user to search for learners within the grader report. * * @module gradereport_grader/user * @copyright 2023 Mathew May * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_user=_interopRequireDefault(_user),_url=_interopRequireDefault(_url),Repository=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Repository);const selectors_component=".user-search",selectors_courseid='[data-region="courseid"]',courseID=document.querySelector(selectors_component).querySelector(selectors_courseid).dataset.courseid;class User extends _user.default{constructor(){super()}static init(){return new User}fetchDataset(){return Repository.userFetch(courseID).then((r=>r.users))}selectAllResultsLink(){return _url.default.relativeUrl("/grade/report/grader/index.php",{id:courseID,gpr_search:this.getSearchTerm()},!1)}selectOneLink(userID){return _url.default.relativeUrl("/grade/report/grader/index.php",{id:courseID,gpr_search:this.getSearchTerm(),gpr_userid:userID},!1)}}return _exports.default=User,_exports.default})); + */function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_user=(obj=_user)&&obj.__esModule?obj:{default:obj},Repository=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Repository);const selectors_component=".user-search",selectors_courseid='[data-region="courseid"]',courseID=document.querySelector(selectors_component).querySelector(selectors_courseid).dataset.courseid;class User extends _user.default{constructor(baseUrl){super(),this.baseUrl=baseUrl}static init(baseUrl){return new User(baseUrl)}fetchDataset(){return Repository.userFetch(courseID).then((r=>r.users))}selectAllResultsLink(){const url=new URL(this.baseUrl);return url.searchParams.set("id",this.courseID),url.searchParams.set("gpr_search",this.getSearchTerm()),url.toString()}selectOneLink(userID){const url=new URL(this.baseUrl);return url.searchParams.set("id",this.courseID),url.searchParams.set("gpr_search",this.getSearchTerm()),url.searchParams.set("gpr_userid",userID),url.toString()}}return _exports.default=User,_exports.default})); //# sourceMappingURL=user.min.js.map \ No newline at end of file diff --git a/grade/report/grader/amd/build/user.min.js.map b/grade/report/grader/amd/build/user.min.js.map index 4da4df8ac4b25..6b563053e6dda 100644 --- a/grade/report/grader/amd/build/user.min.js.map +++ b/grade/report/grader/amd/build/user.min.js.map @@ -1 +1 @@ -{"version":3,"file":"user.min.js","sources":["../src/user.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Allow the user to search for learners within the grader report.\n *\n * @module gradereport_grader/user\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport UserSearch from 'core_user/comboboxsearch/user';\nimport Url from 'core/url';\nimport * as Repository from 'gradereport_grader/local/user/repository';\n\n// Define our standard lookups.\nconst selectors = {\n component: '.user-search',\n courseid: '[data-region=\"courseid\"]',\n};\nconst component = document.querySelector(selectors.component);\nconst courseID = component.querySelector(selectors.courseid).dataset.courseid;\n\nexport default class User extends UserSearch {\n\n constructor() {\n super();\n }\n\n static init() {\n return new User();\n }\n\n /**\n * Get the data we will be searching against in this component.\n *\n * @returns {Promise<*>}\n */\n fetchDataset() {\n return Repository.userFetch(courseID).then((r) => r.users);\n }\n\n /**\n * Build up the view all link.\n *\n * @returns {string|*}\n */\n selectAllResultsLink() {\n return Url.relativeUrl('/grade/report/grader/index.php', {\n id: courseID,\n gpr_search: this.getSearchTerm()\n }, false);\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} userID The ID of the user selected.\n * @returns {string|*}\n */\n selectOneLink(userID) {\n return Url.relativeUrl('/grade/report/grader/index.php', {\n id: courseID,\n gpr_search: this.getSearchTerm(),\n gpr_userid: userID,\n }, false);\n }\n}\n"],"names":["selectors","courseID","document","querySelector","dataset","courseid","User","UserSearch","constructor","fetchDataset","Repository","userFetch","then","r","users","selectAllResultsLink","Url","relativeUrl","id","gpr_search","this","getSearchTerm","selectOneLink","userID","gpr_userid"],"mappings":";;;;;;;q0BA2BMA,oBACS,eADTA,mBAEQ,2BAGRC,SADYC,SAASC,cAAcH,qBACdG,cAAcH,oBAAoBI,QAAQC,eAEhDC,aAAaC,cAE9BC,2CAKW,IAAIF,KAQfG,sBACWC,WAAWC,UAAUV,UAAUW,MAAMC,GAAMA,EAAEC,QAQxDC,8BACWC,aAAIC,YAAY,iCAAkC,CACrDC,GAAIjB,SACJkB,WAAYC,KAAKC,kBAClB,GASPC,cAAcC,eACHP,aAAIC,YAAY,iCAAkC,CACrDC,GAAIjB,SACJkB,WAAYC,KAAKC,gBACjBG,WAAYD,SACb"} \ No newline at end of file +{"version":3,"file":"user.min.js","sources":["../src/user.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Allow the user to search for learners within the grader report.\n *\n * @module gradereport_grader/user\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport UserSearch from 'core_user/comboboxsearch/user';\nimport * as Repository from 'gradereport_grader/local/user/repository';\n\n// Define our standard lookups.\nconst selectors = {\n component: '.user-search',\n courseid: '[data-region=\"courseid\"]',\n};\nconst component = document.querySelector(selectors.component);\nconst courseID = component.querySelector(selectors.courseid).dataset.courseid;\n\nexport default class User extends UserSearch {\n\n /**\n * Construct the class.\n * @param {string} baseUrl The base URL for the page.\n */\n constructor(baseUrl) {\n super();\n this.baseUrl = baseUrl;\n }\n\n static init(baseUrl) {\n return new User(baseUrl);\n }\n\n /**\n * Get the data we will be searching against in this component.\n *\n * @returns {Promise<*>}\n */\n fetchDataset() {\n return Repository.userFetch(courseID).then((r) => r.users);\n }\n\n /**\n * Build up the view all link.\n *\n * @returns {string|*}\n */\n selectAllResultsLink() {\n const url = new URL(this.baseUrl);\n url.searchParams.set('id', this.courseID);\n url.searchParams.set('gpr_search', this.getSearchTerm());\n return url.toString();\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} userID The ID of the user selected.\n * @returns {string|*}\n */\n selectOneLink(userID) {\n const url = new URL(this.baseUrl);\n url.searchParams.set('id', this.courseID);\n url.searchParams.set('gpr_search', this.getSearchTerm());\n url.searchParams.set('gpr_userid', userID);\n return url.toString();\n }\n}\n"],"names":["selectors","courseID","document","querySelector","dataset","courseid","User","UserSearch","constructor","baseUrl","fetchDataset","Repository","userFetch","then","r","users","selectAllResultsLink","url","URL","this","searchParams","set","getSearchTerm","toString","selectOneLink","userID"],"mappings":";;;;;;;skCA0BMA,oBACS,eADTA,mBAEQ,2BAGRC,SADYC,SAASC,cAAcH,qBACdG,cAAcH,oBAAoBI,QAAQC,eAEhDC,aAAaC,cAM9BC,YAAYC,sBAEHA,QAAUA,oBAGPA,gBACD,IAAIH,KAAKG,SAQpBC,sBACWC,WAAWC,UAAUX,UAAUY,MAAMC,GAAMA,EAAEC,QAQxDC,6BACUC,IAAM,IAAIC,IAAIC,KAAKV,gBACzBQ,IAAIG,aAAaC,IAAI,KAAMF,KAAKlB,UAChCgB,IAAIG,aAAaC,IAAI,aAAcF,KAAKG,iBACjCL,IAAIM,WASfC,cAAcC,cACJR,IAAM,IAAIC,IAAIC,KAAKV,gBACzBQ,IAAIG,aAAaC,IAAI,KAAMF,KAAKlB,UAChCgB,IAAIG,aAAaC,IAAI,aAAcF,KAAKG,iBACxCL,IAAIG,aAAaC,IAAI,aAAcI,QAC5BR,IAAIM"} \ No newline at end of file diff --git a/grade/report/grader/amd/src/user.js b/grade/report/grader/amd/src/user.js index 82c5992d760ee..09d15cbb282a9 100644 --- a/grade/report/grader/amd/src/user.js +++ b/grade/report/grader/amd/src/user.js @@ -21,7 +21,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ import UserSearch from 'core_user/comboboxsearch/user'; -import Url from 'core/url'; import * as Repository from 'gradereport_grader/local/user/repository'; // Define our standard lookups. @@ -34,12 +33,17 @@ const courseID = component.querySelector(selectors.courseid).dataset.courseid; export default class User extends UserSearch { - constructor() { + /** + * Construct the class. + * @param {string} baseUrl The base URL for the page. + */ + constructor(baseUrl) { super(); + this.baseUrl = baseUrl; } - static init() { - return new User(); + static init(baseUrl) { + return new User(baseUrl); } /** @@ -57,10 +61,10 @@ export default class User extends UserSearch { * @returns {string|*} */ selectAllResultsLink() { - return Url.relativeUrl('/grade/report/grader/index.php', { - id: courseID, - gpr_search: this.getSearchTerm() - }, false); + const url = new URL(this.baseUrl); + url.searchParams.set('id', this.courseID); + url.searchParams.set('gpr_search', this.getSearchTerm()); + return url.toString(); } /** @@ -70,10 +74,10 @@ export default class User extends UserSearch { * @returns {string|*} */ selectOneLink(userID) { - return Url.relativeUrl('/grade/report/grader/index.php', { - id: courseID, - gpr_search: this.getSearchTerm(), - gpr_userid: userID, - }, false); + const url = new URL(this.baseUrl); + url.searchParams.set('id', this.courseID); + url.searchParams.set('gpr_search', this.getSearchTerm()); + url.searchParams.set('gpr_userid', userID); + return url.toString(); } } diff --git a/grade/report/grader/classes/output/action_bar.php b/grade/report/grader/classes/output/action_bar.php index e7fa25e100852..29c4302119f12 100644 --- a/grade/report/grader/classes/output/action_bar.php +++ b/grade/report/grader/classes/output/action_bar.php @@ -117,30 +117,9 @@ public function export_for_template(\renderer_base $output): array { } $resetlink = new moodle_url('/grade/report/grader/index.php', ['id' => $courseid]); - $searchinput = $OUTPUT->render_from_template('core_user/comboboxsearch/user_selector', [ - 'currentvalue' => $this->usersearch, - 'courseid' => $courseid, - 'instance' => rand(), - 'resetlink' => $resetlink->out(false), - 'group' => 0, - 'name' => 'usersearch', - 'value' => json_encode([ - 'userid' => $this->userid, - 'search' => $this->usersearch, - ]), - ]); - $searchdropdown = new comboboxsearch( - true, - $searchinput, - null, - 'user-search d-flex', - null, - 'usersearchdropdown overflow-auto', - null, - false, - ); - $data['searchdropdown'] = $searchdropdown->export_for_template($output); - + // Why groupid = 0 + $userselectorrenderer = new \core_course\output\actionbar\user_selector($course, $resetlink, $this->userid, 0, $this->usersearch); + $data['searchdropdown'] = $userselectorrenderer->export_for_template($output); // The collapsed column dialog is aligned to the edge of the screen, we need to place it such that it also aligns. $collapsemenudirection = right_to_left() ? 'dropdown-menu-left' : 'dropdown-menu-right'; diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index ad44a4683d0f0..307b9015e03ba 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -45,11 +45,12 @@ $graderreportsilast = optional_param('silast', null, PARAM_NOTAGS); $studentsperpage = optional_param('perpage', null, PARAM_INT); +$baseurl = new moodle_url('/grade/report/grader/index.php', ['id' => $courseid]); $PAGE->set_url(new moodle_url('/grade/report/grader/index.php', array('id'=>$courseid))); $PAGE->set_pagelayout('report'); $PAGE->requires->js_call_amd('gradereport_grader/stickycolspan', 'init'); -$PAGE->requires->js_call_amd('gradereport_grader/user', 'init'); +$PAGE->requires->js_call_amd('gradereport_grader/user', 'init', [$baseurl->out(false)]); $PAGE->requires->js_call_amd('gradereport_grader/feedback_modal', 'init'); $PAGE->requires->js_call_amd('core_grades/gradebooksetup_forms', 'init'); @@ -60,7 +61,6 @@ // Conditionally add the group JS if we have groups enabled. if ($course->groupmode) { - $baseurl = new moodle_url('/grade/report/grader/index.php', ['id' => $courseid]); $PAGE->requires->js_call_amd('core_course/actionbar/group', 'init', [$baseurl->out(false)]); } diff --git a/grade/report/singleview/amd/build/grade.min.js b/grade/report/singleview/amd/build/grade.min.js index f2b9953674b4a..16640038d16cf 100644 --- a/grade/report/singleview/amd/build/grade.min.js +++ b/grade/report/singleview/amd/build/grade.min.js @@ -1,3 +1,3 @@ -define("gradereport_singleview/grade",["exports","core_grades/comboboxsearch/grade","core/url"],(function(_exports,_grade,_url){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_grade=_interopRequireDefault(_grade),_url=_interopRequireDefault(_url);const selectors_component=".grade-search",selectors_courseid='[data-region="courseid"]',component=document.querySelector(selectors_component);class GradeItems extends _grade.default{constructor(){var obj,key,value;super(),obj=this,key="courseID",value=component.querySelector(selectors_courseid).dataset.courseid,key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value}static init(){return new GradeItems}selectOneLink(gradeID){return _url.default.relativeUrl("/grade/report/singleview/index.php",{id:this.courseID,gradesearchvalue:this.getSearchTerm(),item:"grade",itemid:gradeID},!1)}}return _exports.default=GradeItems,_exports.default})); +define("gradereport_singleview/grade",["exports","core_grades/comboboxsearch/grade"],(function(_exports,_grade){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_grade=(obj=_grade)&&obj.__esModule?obj:{default:obj};const selectors_component=".grade-search",selectors_courseid='[data-region="courseid"]',component=document.querySelector(selectors_component);class GradeItems extends _grade.default{constructor(baseUrl){super(),function(obj,key,value){key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value}(this,"courseID",component.querySelector(selectors_courseid).dataset.courseid),this.baseUrl=baseUrl}static init(baseUrl){return new GradeItems(baseUrl)}selectOneLink(gradeID){const url=new URL(this.baseUrl);return url.searchParams.set("id",this.courseID),url.searchParams.set("gradesearchvalue",this.getSearchTerm()),url.searchParams.set("item","grade"),url.searchParams.set("itemid",gradeID),url.toString()}}return _exports.default=GradeItems,_exports.default})); //# sourceMappingURL=grade.min.js.map \ No newline at end of file diff --git a/grade/report/singleview/amd/build/grade.min.js.map b/grade/report/singleview/amd/build/grade.min.js.map index 1875accdc21cd..cc006892d812f 100644 --- a/grade/report/singleview/amd/build/grade.min.js.map +++ b/grade/report/singleview/amd/build/grade.min.js.map @@ -1 +1 @@ -{"version":3,"file":"grade.min.js","sources":["../src/grade.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Allow the user to search for grades within the singleview report.\n *\n * @module gradereport_singleview/grade\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport GradeItemSearch from 'core_grades/comboboxsearch/grade';\nimport Url from 'core/url';\n\n// Define our standard lookups.\nconst selectors = {\n component: '.grade-search',\n courseid: '[data-region=\"courseid\"]',\n};\nconst component = document.querySelector(selectors.component);\n\nexport default class GradeItems extends GradeItemSearch {\n\n courseID = component.querySelector(selectors.courseid).dataset.courseid;\n\n constructor() {\n super();\n }\n\n static init() {\n return new GradeItems();\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} gradeID The ID of the grade item selected.\n * @returns {string|*}\n */\n selectOneLink(gradeID) {\n return Url.relativeUrl('/grade/report/singleview/index.php', {\n id: this.courseID,\n gradesearchvalue: this.getSearchTerm(),\n item: 'grade',\n itemid: gradeID,\n }, false);\n }\n}\n"],"names":["selectors","component","document","querySelector","GradeItems","GradeItemSearch","constructor","dataset","courseid","selectOneLink","gradeID","Url","relativeUrl","id","this","courseID","gradesearchvalue","getSearchTerm","item","itemid"],"mappings":"gXA0BMA,oBACS,gBADTA,mBAEQ,2BAERC,UAAYC,SAASC,cAAcH,2BAEpBI,mBAAmBC,eAIpCC,sEAFWL,UAAUE,cAAcH,oBAAoBO,QAAQC,+IAOpD,IAAIJ,WASfK,cAAcC,gBACHC,aAAIC,YAAY,qCAAsC,CACzDC,GAAIC,KAAKC,SACTC,iBAAkBF,KAAKG,gBACvBC,KAAM,QACNC,OAAQT,UACT"} \ No newline at end of file +{"version":3,"file":"grade.min.js","sources":["../src/grade.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Allow the user to search for grades within the singleview report.\n *\n * @module gradereport_singleview/grade\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport GradeItemSearch from 'core_grades/comboboxsearch/grade';\n\n// Define our standard lookups.\nconst selectors = {\n component: '.grade-search',\n courseid: '[data-region=\"courseid\"]',\n};\nconst component = document.querySelector(selectors.component);\n\nexport default class GradeItems extends GradeItemSearch {\n\n courseID = component.querySelector(selectors.courseid).dataset.courseid;\n\n /**\n * Construct the class.\n * @param {string} baseUrl The base URL for the page.\n */\n constructor(baseUrl) {\n super();\n this.baseUrl = baseUrl;\n }\n\n static init(baseUrl) {\n return new GradeItems(baseUrl);\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} gradeID The ID of the grade item selected.\n * @returns {string|*}\n */\n selectOneLink(gradeID) {\n const url = new URL(this.baseUrl);\n url.searchParams.set('id', this.courseID);\n url.searchParams.set('gradesearchvalue', this.getSearchTerm());\n url.searchParams.set('item', 'grade');\n url.searchParams.set('itemid', gradeID);\n return url.toString();\n }\n}\n"],"names":["selectors","component","document","querySelector","GradeItems","GradeItemSearch","constructor","baseUrl","dataset","courseid","selectOneLink","gradeID","url","URL","this","searchParams","set","courseID","getSearchTerm","toString"],"mappings":"oQAyBMA,oBACS,gBADTA,mBAEQ,2BAERC,UAAYC,SAASC,cAAcH,2BAEpBI,mBAAmBC,eAQpCC,YAAYC,2KANDN,UAAUE,cAAcH,oBAAoBQ,QAAQC,eAQtDF,QAAUA,oBAGPA,gBACD,IAAIH,WAAWG,SAS1BG,cAAcC,eACJC,IAAM,IAAIC,IAAIC,KAAKP,gBACzBK,IAAIG,aAAaC,IAAI,KAAMF,KAAKG,UAChCL,IAAIG,aAAaC,IAAI,mBAAoBF,KAAKI,iBAC9CN,IAAIG,aAAaC,IAAI,OAAQ,SAC7BJ,IAAIG,aAAaC,IAAI,SAAUL,SACxBC,IAAIO"} \ No newline at end of file diff --git a/grade/report/singleview/amd/build/user.min.js b/grade/report/singleview/amd/build/user.min.js index 0c6f67481f496..46902ac214bf2 100644 --- a/grade/report/singleview/amd/build/user.min.js +++ b/grade/report/singleview/amd/build/user.min.js @@ -1,10 +1,10 @@ -define("gradereport_singleview/user",["exports","core_user/comboboxsearch/user","core/url","core/templates","core_grades/searchwidget/repository"],(function(_exports,_user,_url,_templates,Repository){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +define("gradereport_singleview/user",["exports","core_user/comboboxsearch/user","core/templates","core_grades/searchwidget/repository"],(function(_exports,_user,_templates,Repository){var obj; /** * Allow the user to search for learners within the singleview report. * * @module gradereport_singleview/user * @copyright 2023 Mathew May * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_user=_interopRequireDefault(_user),_url=_interopRequireDefault(_url),Repository=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Repository);class User extends _user.default{constructor(){super()}static init(){return new User}async renderDropdown(){const{html:html,js:js}=await(0,_templates.renderForPromise)("core_user/comboboxsearch/resultset",{instance:this.instance,users:this.getMatchedResults().slice(0,5),hasresults:this.getMatchedResults().length>0,searchterm:this.getSearchTerm()});(0,_templates.replaceNodeContents)(this.getHTMLElements().searchDropdown,html,js),this.searchInput.removeAttribute("aria-activedescendant")}selectAllResultsLink(){return null}selectOneLink(userID){return _url.default.relativeUrl("/grade/report/singleview/index.php",{id:this.courseID,searchvalue:this.getSearchTerm(),item:"user",userid:userID},!1)}fetchDataset(){const gts="string"==typeof this.groupID&&""===this.groupID?0:this.groupID;return Repository.userFetch(this.courseID,gts).then((r=>r.users))}}return _exports.default=User,_exports.default})); + */function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_user=(obj=_user)&&obj.__esModule?obj:{default:obj},Repository=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Repository);class User extends _user.default{constructor(baseUrl){super(),this.baseUrl=baseUrl}static init(baseUrl){return new User(baseUrl)}async renderDropdown(){const{html:html,js:js}=await(0,_templates.renderForPromise)("core_user/comboboxsearch/resultset",{instance:this.instance,users:this.getMatchedResults().slice(0,5),hasresults:this.getMatchedResults().length>0,searchterm:this.getSearchTerm()});(0,_templates.replaceNodeContents)(this.getHTMLElements().searchDropdown,html,js),this.searchInput.removeAttribute("aria-activedescendant")}selectAllResultsLink(){return null}selectOneLink(userID){const url=new URL(this.baseUrl);return url.searchParams.set("id",this.courseID),url.searchParams.set("searchvalue",this.getSearchTerm()),url.searchParams.set("item","user"),url.searchParams.set("userid",userID),url.toString()}fetchDataset(){const gts="string"==typeof this.groupID&&""===this.groupID?0:this.groupID;return Repository.userFetch(this.courseID,gts).then((r=>r.users))}}return _exports.default=User,_exports.default})); //# sourceMappingURL=user.min.js.map \ No newline at end of file diff --git a/grade/report/singleview/amd/build/user.min.js.map b/grade/report/singleview/amd/build/user.min.js.map index c66de9c8a70bc..d7ac17de0860e 100644 --- a/grade/report/singleview/amd/build/user.min.js.map +++ b/grade/report/singleview/amd/build/user.min.js.map @@ -1 +1 @@ -{"version":3,"file":"user.min.js","sources":["../src/user.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Allow the user to search for learners within the singleview report.\n *\n * @module gradereport_singleview/user\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport UserSearch from 'core_user/comboboxsearch/user';\nimport Url from 'core/url';\nimport {renderForPromise, replaceNodeContents} from 'core/templates';\nimport * as Repository from 'core_grades/searchwidget/repository';\n\nexport default class User extends UserSearch {\n\n constructor() {\n super();\n }\n\n static init() {\n return new User();\n }\n\n /**\n * Build the content then replace the node.\n */\n async renderDropdown() {\n const {html, js} = await renderForPromise('core_user/comboboxsearch/resultset', {\n instance: this.instance,\n users: this.getMatchedResults().slice(0, 5),\n hasresults: this.getMatchedResults().length > 0,\n searchterm: this.getSearchTerm(),\n });\n replaceNodeContents(this.getHTMLElements().searchDropdown, html, js);\n // Remove aria-activedescendant when the available options change.\n this.searchInput.removeAttribute('aria-activedescendant');\n }\n\n /**\n * Stub out default required function unused here.\n * @returns {null}\n */\n selectAllResultsLink() {\n return null;\n }\n\n /**\n * Build up the view all link that is dedicated to a particular result.\n *\n * @param {Number} userID The ID of the user selected.\n * @returns {string|*}\n */\n selectOneLink(userID) {\n return Url.relativeUrl('/grade/report/singleview/index.php', {\n id: this.courseID,\n searchvalue: this.getSearchTerm(),\n item: 'user',\n userid: userID,\n }, false);\n }\n\n /**\n * Get the data we will be searching against in this component.\n *\n * @returns {Promise<*>}\n */\n fetchDataset() {\n // Small typing checks as sometimes groups don't exist therefore the element returns a empty string.\n const gts = typeof (this.groupID) === \"string\" && this.groupID === '' ? 0 : this.groupID;\n return Repository.userFetch(this.courseID, gts).then((r) => r.users);\n }\n}\n"],"names":["User","UserSearch","constructor","html","js","instance","this","users","getMatchedResults","slice","hasresults","length","searchterm","getSearchTerm","getHTMLElements","searchDropdown","searchInput","removeAttribute","selectAllResultsLink","selectOneLink","userID","Url","relativeUrl","id","courseID","searchvalue","item","userid","fetchDataset","gts","groupID","Repository","userFetch","then","r"],"mappings":";;;;;;;q0BA2BqBA,aAAaC,cAE9BC,2CAKW,IAAIF,kCAOLG,KAACA,KAADC,GAAOA,UAAY,+BAAiB,qCAAsC,CAC5EC,SAAUC,KAAKD,SACfE,MAAOD,KAAKE,oBAAoBC,MAAM,EAAG,GACzCC,WAAYJ,KAAKE,oBAAoBG,OAAS,EAC9CC,WAAYN,KAAKO,qDAEDP,KAAKQ,kBAAkBC,eAAgBZ,KAAMC,SAE5DY,YAAYC,gBAAgB,yBAOrCC,8BACW,KASXC,cAAcC,eACHC,aAAIC,YAAY,qCAAsC,CACzDC,GAAIjB,KAAKkB,SACTC,YAAanB,KAAKO,gBAClBa,KAAM,OACNC,OAAQP,SACT,GAQPQ,qBAEUC,IAAgC,iBAAlBvB,KAAKwB,SAA0C,KAAjBxB,KAAKwB,QAAiB,EAAIxB,KAAKwB,eAC1EC,WAAWC,UAAU1B,KAAKkB,SAAUK,KAAKI,MAAMC,GAAMA,EAAE3B"} \ No newline at end of file +{"version":3,"file":"user.min.js","sources":["../src/user.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Allow the user to search for learners within the singleview report.\n *\n * @module gradereport_singleview/user\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport UserSearch from 'core_user/comboboxsearch/user';\nimport {renderForPromise, replaceNodeContents} from 'core/templates';\nimport * as Repository from 'core_grades/searchwidget/repository';\n\nexport default class User extends UserSearch {\n\n /**\n * Construct the class.\n * @param {string} baseUrl The base URL for the page.\n */\n constructor(baseUrl) {\n super();\n this.baseUrl = baseUrl;\n }\n\n static init(baseUrl) {\n return new User(baseUrl);\n }\n\n /**\n * Build the content then replace the node.\n */\n async renderDropdown() {\n const {html, js} = await renderForPromise('core_user/comboboxsearch/resultset', {\n instance: this.instance,\n users: this.getMatchedResults().slice(0, 5),\n hasresults: this.getMatchedResults().length > 0,\n searchterm: this.getSearchTerm(),\n });\n replaceNodeContents(this.getHTMLElements().searchDropdown, html, js);\n // Remove aria-activedescendant when the available options change.\n this.searchInput.removeAttribute('aria-activedescendant');\n }\n\n /**\n * Stub out default required function unused here.\n * @returns {null}\n */\n selectAllResultsLink() {\n return null;\n }\n\n /**\n * Build up the view all link that is dedicated to a particular result.\n *\n * @param {Number} userID The ID of the user selected.\n * @returns {string|*}\n */\n selectOneLink(userID) {\n const url = new URL(this.baseUrl);\n url.searchParams.set('id', this.courseID);\n url.searchParams.set('searchvalue', this.getSearchTerm());\n url.searchParams.set('item', 'user');\n url.searchParams.set('userid', userID);\n return url.toString();\n }\n\n /**\n * Get the data we will be searching against in this component.\n *\n * @returns {Promise<*>}\n */\n fetchDataset() {\n // Small typing checks as sometimes groups don't exist therefore the element returns a empty string.\n const gts = typeof (this.groupID) === \"string\" && this.groupID === '' ? 0 : this.groupID;\n return Repository.userFetch(this.courseID, gts).then((r) => r.users);\n }\n}\n"],"names":["User","UserSearch","constructor","baseUrl","html","js","instance","this","users","getMatchedResults","slice","hasresults","length","searchterm","getSearchTerm","getHTMLElements","searchDropdown","searchInput","removeAttribute","selectAllResultsLink","selectOneLink","userID","url","URL","searchParams","set","courseID","toString","fetchDataset","gts","groupID","Repository","userFetch","then","r"],"mappings":";;;;;;;skCA0BqBA,aAAaC,cAM9BC,YAAYC,sBAEHA,QAAUA,oBAGPA,gBACD,IAAIH,KAAKG,sCAOVC,KAACA,KAADC,GAAOA,UAAY,+BAAiB,qCAAsC,CAC5EC,SAAUC,KAAKD,SACfE,MAAOD,KAAKE,oBAAoBC,MAAM,EAAG,GACzCC,WAAYJ,KAAKE,oBAAoBG,OAAS,EAC9CC,WAAYN,KAAKO,qDAEDP,KAAKQ,kBAAkBC,eAAgBZ,KAAMC,SAE5DY,YAAYC,gBAAgB,yBAOrCC,8BACW,KASXC,cAAcC,cACJC,IAAM,IAAIC,IAAIhB,KAAKJ,gBACzBmB,IAAIE,aAAaC,IAAI,KAAMlB,KAAKmB,UAChCJ,IAAIE,aAAaC,IAAI,cAAelB,KAAKO,iBACzCQ,IAAIE,aAAaC,IAAI,OAAQ,QAC7BH,IAAIE,aAAaC,IAAI,SAAUJ,QACxBC,IAAIK,WAQfC,qBAEUC,IAAgC,iBAAlBtB,KAAKuB,SAA0C,KAAjBvB,KAAKuB,QAAiB,EAAIvB,KAAKuB,eAC1EC,WAAWC,UAAUzB,KAAKmB,SAAUG,KAAKI,MAAMC,GAAMA,EAAE1B"} \ No newline at end of file diff --git a/grade/report/singleview/amd/src/grade.js b/grade/report/singleview/amd/src/grade.js index d63e493be892a..937ed885e87af 100644 --- a/grade/report/singleview/amd/src/grade.js +++ b/grade/report/singleview/amd/src/grade.js @@ -21,7 +21,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ import GradeItemSearch from 'core_grades/comboboxsearch/grade'; -import Url from 'core/url'; // Define our standard lookups. const selectors = { @@ -34,12 +33,17 @@ export default class GradeItems extends GradeItemSearch { courseID = component.querySelector(selectors.courseid).dataset.courseid; - constructor() { + /** + * Construct the class. + * @param {string} baseUrl The base URL for the page. + */ + constructor(baseUrl) { super(); + this.baseUrl = baseUrl; } - static init() { - return new GradeItems(); + static init(baseUrl) { + return new GradeItems(baseUrl); } /** @@ -49,11 +53,11 @@ export default class GradeItems extends GradeItemSearch { * @returns {string|*} */ selectOneLink(gradeID) { - return Url.relativeUrl('/grade/report/singleview/index.php', { - id: this.courseID, - gradesearchvalue: this.getSearchTerm(), - item: 'grade', - itemid: gradeID, - }, false); + const url = new URL(this.baseUrl); + url.searchParams.set('id', this.courseID); + url.searchParams.set('gradesearchvalue', this.getSearchTerm()); + url.searchParams.set('item', 'grade'); + url.searchParams.set('itemid', gradeID); + return url.toString(); } } diff --git a/grade/report/singleview/amd/src/user.js b/grade/report/singleview/amd/src/user.js index caa16f0640a85..7e64743170d55 100644 --- a/grade/report/singleview/amd/src/user.js +++ b/grade/report/singleview/amd/src/user.js @@ -21,18 +21,22 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ import UserSearch from 'core_user/comboboxsearch/user'; -import Url from 'core/url'; import {renderForPromise, replaceNodeContents} from 'core/templates'; import * as Repository from 'core_grades/searchwidget/repository'; export default class User extends UserSearch { - constructor() { + /** + * Construct the class. + * @param {string} baseUrl The base URL for the page. + */ + constructor(baseUrl) { super(); + this.baseUrl = baseUrl; } - static init() { - return new User(); + static init(baseUrl) { + return new User(baseUrl); } /** @@ -65,12 +69,12 @@ export default class User extends UserSearch { * @returns {string|*} */ selectOneLink(userID) { - return Url.relativeUrl('/grade/report/singleview/index.php', { - id: this.courseID, - searchvalue: this.getSearchTerm(), - item: 'user', - userid: userID, - }, false); + const url = new URL(this.baseUrl); + url.searchParams.set('id', this.courseID); + url.searchParams.set('searchvalue', this.getSearchTerm()); + url.searchParams.set('item', 'user'); + url.searchParams.set('userid', userID); + return url.toString(); } /** diff --git a/grade/report/singleview/index.php b/grade/report/singleview/index.php index dd1034330e1e7..50fc0f5bc3171 100644 --- a/grade/report/singleview/index.php +++ b/grade/report/singleview/index.php @@ -164,18 +164,18 @@ $reportname = $report->screen->heading(); +$baseurl = new moodle_url('/grade/report/singleview/index.php', ['id' => $courseid, 'item' => $itemtype]); if ($itemtype == 'user' || $itemtype == 'user_select') { - $PAGE->requires->js_call_amd('gradereport_singleview/user', 'init'); + $PAGE->requires->js_call_amd('gradereport_singleview/user', 'init', [$baseurl->out(false)]); $actionbar = new \gradereport_singleview\output\action_bar($context, $report, 'user'); } else if ($itemtype == 'grade' || $itemtype == 'grade_select') { - $PAGE->requires->js_call_amd('gradereport_singleview/grade', 'init'); + $PAGE->requires->js_call_amd('gradereport_singleview/grade', 'init', [$baseurl->out(false)]); $actionbar = new \gradereport_singleview\output\action_bar($context, $report, 'grade'); } else { $actionbar = new \core_grades\output\general_action_bar($context, new moodle_url('/grade/report/singleview/index.php', ['id' => $courseid]), 'report', 'singleview'); } if ($course->groupmode && $itemtype !== 'select') { - $baseurl = new moodle_url('/grade/report/singleview/index.php', ['id' => $courseid, 'item' => $itemtype]); $PAGE->requires->js_call_amd('core_course/actionbar/group', 'init', [$baseurl->out(false)]); } diff --git a/grade/report/singleview/renderer.php b/grade/report/singleview/renderer.php index caee3494d839e..22192a1b5def9 100644 --- a/grade/report/singleview/renderer.php +++ b/grade/report/singleview/renderer.php @@ -42,39 +42,24 @@ class gradereport_singleview_renderer extends plugin_renderer_base { * @param object $course The course object. * @param int|null $userid The user ID. * @param int|null $groupid The group ID. + * @param string $usersearch Search string. * @return string The raw HTML to render. */ - public function users_selector(object $course, ?int $userid = null, ?int $groupid = null): string { + public function users_selector(object $course, ?int $userid = null, ?int $groupid = null, string $usersearch = ''): string { + $userid = optional_param('userid', 0, PARAM_INT); + $actionbarrenderer = $this->page->get_renderer('core_course', 'actionbar'); $resetlink = new moodle_url('/grade/report/singleview/index.php', ['id' => $course->id, 'group' => $groupid ?? 0]); - $submitteduserid = optional_param('userid', '', PARAM_INT); + // Why we need this? + $submitteduserid = optional_param('userid', '', PARAM_INT); if ($submitteduserid) { $user = core_user::get_user($submitteduserid); - $currentvalue = fullname($user); + $usersearch = fullname($user); } else { - $currentvalue = ''; + $usersearch = ''; } - $data = [ - 'currentvalue' => $currentvalue, - 'courseid' => $course->id, - 'instance' => rand(), - 'group' => $groupid ?? 0, - 'resetlink' => $resetlink->out(false), - 'name' => 'userid', - 'value' => $submitteduserid ?? '', - ]; - $dropdown = new comboboxsearch( - true, - $this->render_from_template('core_user/comboboxsearch/user_selector', $data), - null, - 'user-search d-flex', - null, - 'usersearchdropdown overflow-auto', - null, - false, - ); - return $this->render_from_template($dropdown->get_template(), $dropdown->export_for_template($this)); + return $actionbarrenderer->render(new \core_course\output\actionbar\user_selector($course, $resetlink, $userid, $groupid, $usersearch)); } /** diff --git a/grade/report/user/amd/build/user.min.js b/grade/report/user/amd/build/user.min.js index 754146210fdf3..3bfe4856544e5 100644 --- a/grade/report/user/amd/build/user.min.js +++ b/grade/report/user/amd/build/user.min.js @@ -1,10 +1,10 @@ -define("gradereport_user/user",["exports","core_user/comboboxsearch/user","core/url","core/templates","core_grades/searchwidget/repository"],(function(_exports,_user,_url,_templates,Repository){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +define("gradereport_user/user",["exports","core_user/comboboxsearch/user","core/templates","core_grades/searchwidget/repository"],(function(_exports,_user,_templates,Repository){var obj; /** * Allow the user to search for learners within the user report. * * @module gradereport_user/user * @copyright 2023 Mathew May * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_user=_interopRequireDefault(_user),_url=_interopRequireDefault(_url),Repository=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Repository);class User extends _user.default{constructor(){super()}static init(){return new User}async renderDropdown(){const{html:html,js:js}=await(0,_templates.renderForPromise)("core_user/comboboxsearch/resultset",{users:this.getMatchedResults().slice(0,5),hasresults:this.getMatchedResults().length>0,instance:this.instance,matches:this.getDatasetSize(),searchterm:this.getSearchTerm(),selectall:this.selectAllResultsLink()});(0,_templates.replaceNodeContents)(this.getHTMLElements().searchDropdown,html,js),this.searchInput.removeAttribute("aria-activedescendant")}selectAllResultsLink(){return _url.default.relativeUrl("/grade/report/user/index.php",{id:this.courseID,userid:0,searchvalue:this.getSearchTerm()},!1)}selectOneLink(userID){return _url.default.relativeUrl("/grade/report/user/index.php",{id:this.courseID,searchvalue:this.getSearchTerm(),userid:userID},!1)}fetchDataset(){const gts="string"==typeof this.groupID&&""===this.groupID?0:this.groupID;return Repository.userFetch(this.courseID,gts).then((r=>r.users))}}return _exports.default=User,_exports.default})); + */function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_user=(obj=_user)&&obj.__esModule?obj:{default:obj},Repository=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Repository);class User extends _user.default{constructor(baseUrl){super(),this.baseUrl=baseUrl}static init(baseUrl){return new User(baseUrl)}async renderDropdown(){const{html:html,js:js}=await(0,_templates.renderForPromise)("core_user/comboboxsearch/resultset",{users:this.getMatchedResults().slice(0,5),hasresults:this.getMatchedResults().length>0,instance:this.instance,matches:this.getDatasetSize(),searchterm:this.getSearchTerm(),selectall:this.selectAllResultsLink()});(0,_templates.replaceNodeContents)(this.getHTMLElements().searchDropdown,html,js),this.searchInput.removeAttribute("aria-activedescendant")}selectAllResultsLink(){const url=new URL(this.baseUrl);return url.searchParams.set("id",this.courseID),url.searchParams.set("userid",0),url.searchParams.set("searchvalue",this.getSearchTerm()),url.toString()}selectOneLink(userID){const url=new URL(this.baseUrl);return url.searchParams.set("id",this.courseID),url.searchParams.set("userid",userID),url.searchParams.set("searchvalue",this.getSearchTerm()),url.toString()}fetchDataset(){const gts="string"==typeof this.groupID&&""===this.groupID?0:this.groupID;return Repository.userFetch(this.courseID,gts).then((r=>r.users))}}return _exports.default=User,_exports.default})); //# sourceMappingURL=user.min.js.map \ No newline at end of file diff --git a/grade/report/user/amd/build/user.min.js.map b/grade/report/user/amd/build/user.min.js.map index 0ecff160bb274..f36b08c93256f 100644 --- a/grade/report/user/amd/build/user.min.js.map +++ b/grade/report/user/amd/build/user.min.js.map @@ -1 +1 @@ -{"version":3,"file":"user.min.js","sources":["../src/user.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Allow the user to search for learners within the user report.\n *\n * @module gradereport_user/user\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport UserSearch from 'core_user/comboboxsearch/user';\nimport Url from 'core/url';\nimport {renderForPromise, replaceNodeContents} from 'core/templates';\nimport * as Repository from 'core_grades/searchwidget/repository';\n\nexport default class User extends UserSearch {\n\n constructor() {\n super();\n }\n\n static init() {\n return new User();\n }\n\n /**\n * Build the content then replace the node.\n */\n async renderDropdown() {\n const {html, js} = await renderForPromise('core_user/comboboxsearch/resultset', {\n users: this.getMatchedResults().slice(0, 5),\n hasresults: this.getMatchedResults().length > 0,\n instance: this.instance,\n matches: this.getDatasetSize(),\n searchterm: this.getSearchTerm(),\n selectall: this.selectAllResultsLink(),\n });\n replaceNodeContents(this.getHTMLElements().searchDropdown, html, js);\n // Remove aria-activedescendant when the available options change.\n this.searchInput.removeAttribute('aria-activedescendant');\n }\n\n /**\n * Build up the view all link.\n *\n * @returns {string|*}\n */\n selectAllResultsLink() {\n return Url.relativeUrl('/grade/report/user/index.php', {\n id: this.courseID,\n userid: 0,\n searchvalue: this.getSearchTerm()\n }, false);\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} userID The ID of the user selected.\n * @returns {string|*}\n */\n selectOneLink(userID) {\n return Url.relativeUrl('/grade/report/user/index.php', {\n id: this.courseID,\n searchvalue: this.getSearchTerm(),\n userid: userID,\n }, false);\n }\n\n /**\n * Get the data we will be searching against in this component.\n *\n * @returns {Promise<*>}\n */\n fetchDataset() {\n // Small typing checks as sometimes groups don't exist therefore the element returns a empty string.\n const gts = typeof (this.groupID) === \"string\" && this.groupID === '' ? 0 : this.groupID;\n return Repository.userFetch(this.courseID, gts).then((r) => r.users);\n }\n}\n"],"names":["User","UserSearch","constructor","html","js","users","this","getMatchedResults","slice","hasresults","length","instance","matches","getDatasetSize","searchterm","getSearchTerm","selectall","selectAllResultsLink","getHTMLElements","searchDropdown","searchInput","removeAttribute","Url","relativeUrl","id","courseID","userid","searchvalue","selectOneLink","userID","fetchDataset","gts","groupID","Repository","userFetch","then","r"],"mappings":";;;;;;;q0BA2BqBA,aAAaC,cAE9BC,2CAKW,IAAIF,kCAOLG,KAACA,KAADC,GAAOA,UAAY,+BAAiB,qCAAsC,CAC5EC,MAAOC,KAAKC,oBAAoBC,MAAM,EAAG,GACzCC,WAAYH,KAAKC,oBAAoBG,OAAS,EAC9CC,SAAUL,KAAKK,SACfC,QAASN,KAAKO,iBACdC,WAAYR,KAAKS,gBACjBC,UAAWV,KAAKW,4DAEAX,KAAKY,kBAAkBC,eAAgBhB,KAAMC,SAE5DgB,YAAYC,gBAAgB,yBAQrCJ,8BACWK,aAAIC,YAAY,+BAAgC,CACnDC,GAAIlB,KAAKmB,SACTC,OAAQ,EACRC,YAAarB,KAAKS,kBACnB,GASPa,cAAcC,eACHP,aAAIC,YAAY,+BAAgC,CACnDC,GAAIlB,KAAKmB,SACTE,YAAarB,KAAKS,gBAClBW,OAAQG,SACT,GAQPC,qBAEUC,IAAgC,iBAAlBzB,KAAK0B,SAA0C,KAAjB1B,KAAK0B,QAAiB,EAAI1B,KAAK0B,eAC1EC,WAAWC,UAAU5B,KAAKmB,SAAUM,KAAKI,MAAMC,GAAMA,EAAE/B"} \ No newline at end of file +{"version":3,"file":"user.min.js","sources":["../src/user.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Allow the user to search for learners within the user report.\n *\n * @module gradereport_user/user\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport UserSearch from 'core_user/comboboxsearch/user';\nimport {renderForPromise, replaceNodeContents} from 'core/templates';\nimport * as Repository from 'core_grades/searchwidget/repository';\n\nexport default class User extends UserSearch {\n\n /**\n * Construct the class.\n * @param {string} baseUrl The base URL for the page.\n */\n constructor(baseUrl) {\n super();\n this.baseUrl = baseUrl;\n }\n\n static init(baseUrl) {\n return new User(baseUrl);\n }\n\n /**\n * Build the content then replace the node.\n */\n async renderDropdown() {\n const {html, js} = await renderForPromise('core_user/comboboxsearch/resultset', {\n users: this.getMatchedResults().slice(0, 5),\n hasresults: this.getMatchedResults().length > 0,\n instance: this.instance,\n matches: this.getDatasetSize(),\n searchterm: this.getSearchTerm(),\n selectall: this.selectAllResultsLink(),\n });\n replaceNodeContents(this.getHTMLElements().searchDropdown, html, js);\n // Remove aria-activedescendant when the available options change.\n this.searchInput.removeAttribute('aria-activedescendant');\n }\n\n /**\n * Build up the view all link.\n *\n * @returns {string|*}\n */\n selectAllResultsLink() {\n const url = new URL(this.baseUrl);\n url.searchParams.set('id', this.courseID);\n url.searchParams.set('userid', 0);\n url.searchParams.set('searchvalue', this.getSearchTerm());\n return url.toString();\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} userID The ID of the user selected.\n * @returns {string|*}\n */\n selectOneLink(userID) {\n const url = new URL(this.baseUrl);\n url.searchParams.set('id', this.courseID);\n url.searchParams.set('userid', userID);\n url.searchParams.set('searchvalue', this.getSearchTerm());\n return url.toString();\n }\n\n /**\n * Get the data we will be searching against in this component.\n *\n * @returns {Promise<*>}\n */\n fetchDataset() {\n // Small typing checks as sometimes groups don't exist therefore the element returns a empty string.\n const gts = typeof (this.groupID) === \"string\" && this.groupID === '' ? 0 : this.groupID;\n return Repository.userFetch(this.courseID, gts).then((r) => r.users);\n }\n}\n"],"names":["User","UserSearch","constructor","baseUrl","html","js","users","this","getMatchedResults","slice","hasresults","length","instance","matches","getDatasetSize","searchterm","getSearchTerm","selectall","selectAllResultsLink","getHTMLElements","searchDropdown","searchInput","removeAttribute","url","URL","searchParams","set","courseID","toString","selectOneLink","userID","fetchDataset","gts","groupID","Repository","userFetch","then","r"],"mappings":";;;;;;;skCA0BqBA,aAAaC,cAM9BC,YAAYC,sBAEHA,QAAUA,oBAGPA,gBACD,IAAIH,KAAKG,sCAOVC,KAACA,KAADC,GAAOA,UAAY,+BAAiB,qCAAsC,CAC5EC,MAAOC,KAAKC,oBAAoBC,MAAM,EAAG,GACzCC,WAAYH,KAAKC,oBAAoBG,OAAS,EAC9CC,SAAUL,KAAKK,SACfC,QAASN,KAAKO,iBACdC,WAAYR,KAAKS,gBACjBC,UAAWV,KAAKW,4DAEAX,KAAKY,kBAAkBC,eAAgBhB,KAAMC,SAE5DgB,YAAYC,gBAAgB,yBAQrCJ,6BACUK,IAAM,IAAIC,IAAIjB,KAAKJ,gBACzBoB,IAAIE,aAAaC,IAAI,KAAMnB,KAAKoB,UAChCJ,IAAIE,aAAaC,IAAI,SAAU,GAC/BH,IAAIE,aAAaC,IAAI,cAAenB,KAAKS,iBAClCO,IAAIK,WASfC,cAAcC,cACJP,IAAM,IAAIC,IAAIjB,KAAKJ,gBACzBoB,IAAIE,aAAaC,IAAI,KAAMnB,KAAKoB,UAChCJ,IAAIE,aAAaC,IAAI,SAAUI,QAC/BP,IAAIE,aAAaC,IAAI,cAAenB,KAAKS,iBAClCO,IAAIK,WAQfG,qBAEUC,IAAgC,iBAAlBzB,KAAK0B,SAA0C,KAAjB1B,KAAK0B,QAAiB,EAAI1B,KAAK0B,eAC1EC,WAAWC,UAAU5B,KAAKoB,SAAUK,KAAKI,MAAMC,GAAMA,EAAE/B"} \ No newline at end of file diff --git a/grade/report/user/amd/src/user.js b/grade/report/user/amd/src/user.js index bdc8d24a46ca1..132b02a46eb91 100644 --- a/grade/report/user/amd/src/user.js +++ b/grade/report/user/amd/src/user.js @@ -21,18 +21,22 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ import UserSearch from 'core_user/comboboxsearch/user'; -import Url from 'core/url'; import {renderForPromise, replaceNodeContents} from 'core/templates'; import * as Repository from 'core_grades/searchwidget/repository'; export default class User extends UserSearch { - constructor() { + /** + * Construct the class. + * @param {string} baseUrl The base URL for the page. + */ + constructor(baseUrl) { super(); + this.baseUrl = baseUrl; } - static init() { - return new User(); + static init(baseUrl) { + return new User(baseUrl); } /** @@ -58,11 +62,11 @@ export default class User extends UserSearch { * @returns {string|*} */ selectAllResultsLink() { - return Url.relativeUrl('/grade/report/user/index.php', { - id: this.courseID, - userid: 0, - searchvalue: this.getSearchTerm() - }, false); + const url = new URL(this.baseUrl); + url.searchParams.set('id', this.courseID); + url.searchParams.set('userid', 0); + url.searchParams.set('searchvalue', this.getSearchTerm()); + return url.toString(); } /** @@ -72,11 +76,11 @@ export default class User extends UserSearch { * @returns {string|*} */ selectOneLink(userID) { - return Url.relativeUrl('/grade/report/user/index.php', { - id: this.courseID, - searchvalue: this.getSearchTerm(), - userid: userID, - }, false); + const url = new URL(this.baseUrl); + url.searchParams.set('id', this.courseID); + url.searchParams.set('userid', userID); + url.searchParams.set('searchvalue', this.getSearchTerm()); + return url.toString(); } /** diff --git a/grade/report/user/classes/output/action_bar.php b/grade/report/user/classes/output/action_bar.php index 254c4e049cc81..d9e551b5ee389 100644 --- a/grade/report/user/classes/output/action_bar.php +++ b/grade/report/user/classes/output/action_bar.php @@ -37,6 +37,9 @@ class action_bar extends \core_grades\output\action_bar { /** @var int|null $currentgroupid The user report view mode. */ protected $currentgroupid; + /** @var string $usersearch String to search matching users. */ + protected $usersearch; + /** * The class constructor. * @@ -45,11 +48,12 @@ class action_bar extends \core_grades\output\action_bar { * @param int|null $userid The user ID or 0 if displaying all users. * @param int|null $currentgroupid The ID of the current group. */ - public function __construct(\context $context, int $userview, ?int $userid = null, ?int $currentgroupid = null) { + public function __construct(\context $context, int $userview, ?int $userid = null, ?int $currentgroupid = null, $usersearch = '') { parent::__construct($context); $this->userview = $userview; $this->userid = $userid; $this->currentgroupid = $currentgroupid; + $this->usersearch = $usersearch; } /** @@ -88,7 +92,7 @@ public function export_for_template(\renderer_base $output): array { } $data['userselector'] = [ 'courseid' => $courseid, - 'content' => $userreportrenderer->users_selector(get_course($courseid), $this->userid, $this->currentgroupid) + 'content' => $userreportrenderer->users_selector(get_course($courseid), $this->userid, $this->currentgroupid, $this->usersearch) ]; // Do not output the 'view mode' selector when in zero state or when the current user is viewing its own report. diff --git a/grade/report/user/index.php b/grade/report/user/index.php index d5cd825223ccc..cb8711050f71f 100644 --- a/grade/report/user/index.php +++ b/grade/report/user/index.php @@ -28,8 +28,9 @@ require_once $CFG->dirroot.'/grade/report/user/lib.php'; $courseid = required_param('id', PARAM_INT); -$userid = optional_param('userid', null, PARAM_INT); +$userid = optional_param('userid', 0, PARAM_INT); $userview = optional_param('userview', 0, PARAM_INT); +$usersearch = optional_param('search', '', PARAM_NOTAGS); $PAGE->set_url(new moodle_url('/grade/report/user/index.php', ['id' => $courseid])); diff --git a/grade/report/user/renderer.php b/grade/report/user/renderer.php index bae070df34ef9..1a5647ac8670d 100644 --- a/grade/report/user/renderer.php +++ b/grade/report/user/renderer.php @@ -88,42 +88,16 @@ public function view_user_selector(int $userid, int $userview): string { * @param object $course The course object. * @param int|null $userid The user ID. * @param int|null $groupid The group ID. + * @param string $usersearch Search string. * @return string The raw HTML to render. * @throws coding_exception */ - public function users_selector(object $course, ?int $userid = null, ?int $groupid = null): string { + public function users_selector(object $course, ?int $userid = null, ?int $groupid = null, string $usersearch = ''): string { + $actionbarrenderer = $this->page->get_renderer('core_course', 'actionbar'); $resetlink = new moodle_url('/grade/report/user/index.php', ['id' => $course->id, 'group' => 0]); - $submitteduserid = optional_param('userid', '', PARAM_INT); - - if ($submitteduserid) { - $user = core_user::get_user($submitteduserid); - $currentvalue = fullname($user); - } else { - $currentvalue = ''; - } - - $data = [ - 'currentvalue' => $currentvalue, - 'instance' => rand(), - 'resetlink' => $resetlink->out(false), - 'name' => 'userid', - 'value' => $submitteduserid ?? '', - 'courseid' => $course->id, - 'group' => $groupid ?? 0, - ]; - - $searchdropdown = new comboboxsearch( - true, - $this->render_from_template('core_user/comboboxsearch/user_selector', $data), - null, - 'user-search d-flex', - null, - 'usersearchdropdown overflow-auto', - null, - false, - ); - $this->page->requires->js_call_amd('gradereport_user/user', 'init'); - return $this->render_from_template($searchdropdown->get_template(), $searchdropdown->export_for_template($this)); + $baseurl = new moodle_url('/grade/report/user/index.php', ['id' => $course->id]); + $this->page->requires->js_call_amd('gradereport_user/user', 'init', [$baseurl->out(false)]); + return $actionbarrenderer->render(new \core_course\output\actionbar\user_selector($course, $resetlink, $userid, $groupid, $usersearch)); } /**