From 37eae68cdbf902b8cd9b182dc2c0e27782486ae5 Mon Sep 17 00:00:00 2001 From: Shamim Rezaie Date: Sun, 26 May 2024 18:43:08 +1000 Subject: [PATCH 1/3] MDL-80745 core_course: group selector renderer for actionbar in course --- course/amd/build/actionbar/group.min.js | 11 ++ course/amd/build/actionbar/group.min.js.map | 1 + course/amd/src/actionbar/group.js | 61 ++++++++++ .../output/actionbar/group_selector.php | 113 ++++++++++++++++++ course/classes/output/actionbar/renderer.php | 38 ++++++ 5 files changed, 224 insertions(+) create mode 100644 course/amd/build/actionbar/group.min.js create mode 100644 course/amd/build/actionbar/group.min.js.map create mode 100644 course/amd/src/actionbar/group.js create mode 100644 course/classes/output/actionbar/group_selector.php create mode 100644 course/classes/output/actionbar/renderer.php diff --git a/course/amd/build/actionbar/group.min.js b/course/amd/build/actionbar/group.min.js new file mode 100644 index 00000000000..8286e61c733 --- /dev/null +++ b/course/amd/build/actionbar/group.min.js @@ -0,0 +1,11 @@ +define("core_course/actionbar/group",["exports","core_group/comboboxsearch/group"],(function(_exports,_group){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_group=(obj=_group)&&obj.__esModule?obj:{default:obj}; +/** + * Allow the user to search for groups in the action bar. + * + * @module core_course/actionbar/group + * @copyright 2024 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class Group extends _group.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,"baseUrl",void 0),this.baseUrl=baseUrl}static init(baseUrl){return new Group(baseUrl)}selectOneLink(groupID){const url=new URL(this.baseUrl);return url.searchParams.set("groupsearchvalue",this.getSearchTerm()),url.searchParams.set("group",groupID),url.toString()}}return _exports.default=Group,_exports.default})); + +//# sourceMappingURL=group.min.js.map \ No newline at end of file diff --git a/course/amd/build/actionbar/group.min.js.map b/course/amd/build/actionbar/group.min.js.map new file mode 100644 index 00000000000..b5f395a2ef9 --- /dev/null +++ b/course/amd/build/actionbar/group.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"group.min.js","sources":["../../src/actionbar/group.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\nimport GroupSearch from 'core_group/comboboxsearch/group';\n\n/**\n * Allow the user to search for groups in the action bar.\n *\n * @module core_course/actionbar/group\n * @copyright 2024 Shamim Rezaie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nexport default class Group extends GroupSearch {\n\n baseUrl;\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 /**\n * Allow the class to be invoked via PHP.\n *\n * @param {string} baseUrl The base URL for the page.\n * @returns {Group}\n */\n static init(baseUrl) {\n return new Group(baseUrl);\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} groupID The ID of the group selected.\n * @returns {string}\n */\n selectOneLink(groupID) {\n const url = new URL(this.baseUrl);\n url.searchParams.set('groupsearchvalue', this.getSearchTerm());\n url.searchParams.set('group', groupID);\n\n return url.toString();\n }\n}\n"],"names":["Group","GroupSearch","constructor","baseUrl","selectOneLink","groupID","url","URL","this","searchParams","set","getSearchTerm","toString"],"mappings":";;;;;;;;MAwBqBA,cAAcC,eAQ/BC,YAAYC,uLAEHA,QAAUA,oBASPA,gBACD,IAAIH,MAAMG,SASrBC,cAAcC,eACJC,IAAM,IAAIC,IAAIC,KAAKL,gBACzBG,IAAIG,aAAaC,IAAI,mBAAoBF,KAAKG,iBAC9CL,IAAIG,aAAaC,IAAI,QAASL,SAEvBC,IAAIM"} \ No newline at end of file diff --git a/course/amd/src/actionbar/group.js b/course/amd/src/actionbar/group.js new file mode 100644 index 00000000000..6b175735a2d --- /dev/null +++ b/course/amd/src/actionbar/group.js @@ -0,0 +1,61 @@ +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see . + +import GroupSearch from 'core_group/comboboxsearch/group'; + +/** + * Allow the user to search for groups in the action bar. + * + * @module core_course/actionbar/group + * @copyright 2024 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +export default class Group extends GroupSearch { + + baseUrl; + + /** + * Construct the class. + * @param {string} baseUrl The base URL for the page. + */ + constructor(baseUrl) { + super(); + this.baseUrl = baseUrl; + } + + /** + * Allow the class to be invoked via PHP. + * + * @param {string} baseUrl The base URL for the page. + * @returns {Group} + */ + static init(baseUrl) { + return new Group(baseUrl); + } + + /** + * Build up the link that is dedicated to a particular result. + * + * @param {Number} groupID The ID of the group selected. + * @returns {string} + */ + selectOneLink(groupID) { + const url = new URL(this.baseUrl); + url.searchParams.set('groupsearchvalue', this.getSearchTerm()); + url.searchParams.set('group', groupID); + + return url.toString(); + } +} diff --git a/course/classes/output/actionbar/group_selector.php b/course/classes/output/actionbar/group_selector.php new file mode 100644 index 00000000000..e5450786d38 --- /dev/null +++ b/course/classes/output/actionbar/group_selector.php @@ -0,0 +1,113 @@ +. + +namespace core_course\output\actionbar; + +use core\output\comboboxsearch; +use renderable; +use renderer_base; +use stdClass; +use templatable; + +/** + * Renderable class for the group selector element in the action bar. + * + * @package core_course + * @copyright 2024 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class group_selector implements renderable, templatable { + + /** + * @var stdClass The course object. + */ + protected $course; + + /** + * The class constructor. + * + * @param stdClass $course The course object. + */ + public function __construct(stdClass $course) { + $this->course = $course; + } + + /** + * Export the data for the mustache template. + * + * @param renderer_base $output The renderer that will be used to render the output. + * @return array + */ + public function export_for_template(renderer_base $output) { + global $USER, $OUTPUT; + + $course = $this->course; + $groupmode = $course->groupmode; + + $sbody = $OUTPUT->render_from_template('core_group/comboboxsearch/searchbody', [ + 'courseid' => $course->id, + 'currentvalue' => optional_param('groupsearchvalue', '', PARAM_NOTAGS), + 'instance' => rand(), + ]); + + $label = $groupmode == VISIBLEGROUPS ? get_string('selectgroupsvisible') : get_string('selectgroupsseparate'); + + $buttondata = ['label' => $label]; + + $context = \context_course::instance($course->id); + + if ($groupmode == VISIBLEGROUPS || has_capability('moodle/site:accessallgroups', $context)) { + $allowedgroups = groups_get_all_groups($course->id, 0, $course->defaultgroupingid); + } else { + $allowedgroups = groups_get_all_groups($course->id, $USER->id, $course->defaultgroupingid); + } + + $activegroup = groups_get_course_group($course, true, $allowedgroups); + $buttondata['group'] = $activegroup; + + if ($activegroup) { + $group = groups_get_group($activegroup); + $buttondata['selectedgroup'] = format_string($group->name, true, ['context' => $context]); + } else if ($activegroup === 0) { + $buttondata['selectedgroup'] = get_string('allparticipants'); + } + + $groupdropdown = new comboboxsearch( + false, + $OUTPUT->render_from_template('core_group/comboboxsearch/group_selector', $buttondata), + $sbody, + 'group-search', + 'groupsearchwidget', + 'groupsearchdropdown overflow-auto', + null, + true, + $label, + 'group', + $activegroup + ); + + return $groupdropdown->export_for_template($OUTPUT); + } + + /** + * Returns the template for the group selector. + * + * @return string + */ + public function get_template(): string { + return 'core/comboboxsearch'; + } +} diff --git a/course/classes/output/actionbar/renderer.php b/course/classes/output/actionbar/renderer.php new file mode 100644 index 00000000000..26f0f1b243f --- /dev/null +++ b/course/classes/output/actionbar/renderer.php @@ -0,0 +1,38 @@ +. + +namespace core_course\output\actionbar; + +/** + * Renderer class for the action bar. + * + * @package core_course + * @copyright 2024 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class renderer extends \plugin_renderer_base { + + /** + * Renders the group selector trigger element in the action bar. + * + * @param group_selector $groupselector The group selector object. + * @return string The HTML output. + */ + protected function render_group_selector(group_selector $groupselector) { + $data = $groupselector->export_for_template($this); + return parent::render_from_template($groupselector->get_template(), $data); + } +} From c1a2436cb5401085e6f736d3d26eeae0e8e12d0d Mon Sep 17 00:00:00 2001 From: Shamim Rezaie Date: Sun, 26 May 2024 18:41:02 +1000 Subject: [PATCH 2/3] MDL-80745 core_grades: deprecate core_grades_renderer::group_selector --- .upgradenotes/MDL-80745-2024060602320785.yml | 23 +++++++++++++++++++ grade/renderer.php | 9 ++++++++ grade/report/grader/amd/build/group.min.js | 2 +- .../report/grader/amd/build/group.min.js.map | 2 +- grade/report/grader/amd/src/group.js | 7 ++++++ .../grader/classes/output/action_bar.php | 6 ++++- grade/report/grader/index.php | 3 ++- .../report/singleview/amd/build/group.min.js | 2 +- .../singleview/amd/build/group.min.js.map | 2 +- grade/report/singleview/amd/src/group.js | 7 ++++++ .../singleview/classes/report/singleview.php | 8 ++++--- grade/report/singleview/index.php | 3 ++- grade/report/user/amd/build/group.min.js | 2 +- grade/report/user/amd/build/group.min.js.map | 2 +- grade/report/user/amd/src/group.js | 7 ++++++ .../report/user/classes/output/action_bar.php | 6 ++++- grade/report/user/index.php | 3 ++- 17 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 .upgradenotes/MDL-80745-2024060602320785.yml diff --git a/.upgradenotes/MDL-80745-2024060602320785.yml b/.upgradenotes/MDL-80745-2024060602320785.yml new file mode 100644 index 00000000000..886ca56498c --- /dev/null +++ b/.upgradenotes/MDL-80745-2024060602320785.yml @@ -0,0 +1,23 @@ +issueNumber: MDL-80745 +notes: + core_grades: + - message: > + The `core_grades_renderer::group_selector()` method has been deprecated. + Please use `\core_course\output\actionbar\renderer` to render a + `group_selector` renderable instead. + type: deprecated + gradereport_grader: + - message: > + The `gradereport_grader/group` ESM has been deprecated. Please use + `core_course/actionbar/group` instead. + type: deprecated + gradereport_singleview: + - message: > + The `gradereport_singleview/group` ESM has been deprecated. Please use + `core_course/actionbar/group` instead. + type: deprecated + gradereport_user: + - message: > + The `gradereport_user/group` ESM has been deprecated. Please use + `core_course/actionbar/group` instead. + type: deprecated diff --git a/grade/renderer.php b/grade/renderer.php index 8beccd2549f..d3f772d7f7b 100644 --- a/grade/renderer.php +++ b/grade/renderer.php @@ -47,10 +47,19 @@ class core_grades_renderer extends plugin_renderer_base { * @param object $course The course object. * @param string|null $groupactionbaseurl This parameter has been deprecated since 4.4 and should not be used anymore. * @return string|null The raw HTML to render. + * @deprecated since 4.5. Use \core_course\output\actionbar\renderer' instead. + * @todo Final deprecation in Moodle 6.0. See MDL-82116. */ + #[\core\attribute\deprecated( + replacement: null, + since: '4.5', + reason: 'Moved to \core_course\output\actionbar\renderer.' + )] public function group_selector(object $course, ?string $groupactionbaseurl = null): ?string { global $USER; + \core\deprecation::emit_deprecation_if_present([$this, __FUNCTION__]); + if ($groupactionbaseurl !== null) { debugging( 'The $groupactionbaseurl argument has been deprecated. Please remove it from your method calls.', diff --git a/grade/report/grader/amd/build/group.min.js b/grade/report/grader/amd/build/group.min.js index 759e108fad6..f7a49354103 100644 --- a/grade/report/grader/amd/build/group.min.js +++ b/grade/report/grader/amd/build/group.min.js @@ -1,3 +1,3 @@ -define("gradereport_grader/group",["exports","core_group/comboboxsearch/group","core/url"],(function(_exports,_group,_url){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_group=_interopRequireDefault(_group),_url=_interopRequireDefault(_url);class Group extends _group.default{constructor(){var obj,key,value;super(),value=void 0,(key="courseID")in(obj=this)?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,this.selectors={...this.selectors,courseid:'[data-region="courseid"]'};const component=document.querySelector(this.componentSelector());this.courseID=component.querySelector(this.selectors.courseid).dataset.courseid}static init(){return new Group}selectOneLink(groupID){return _url.default.relativeUrl("/grade/report/grader/index.php",{id:this.courseID,groupsearchvalue:this.getSearchTerm(),group:groupID},!1)}}return _exports.default=Group,_exports.default})); +define("gradereport_grader/group",["exports","core_group/comboboxsearch/group","core/url"],(function(_exports,_group,_url){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_group=_interopRequireDefault(_group),_url=_interopRequireDefault(_url);class Group extends _group.default{constructor(){var obj,key,value;window.console.warn("The gradereport_grader/group module has been deprecated since Moodle 4.5. Please use core_course/actionbar/group instead."),super(),value=void 0,(key="courseID")in(obj=this)?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,this.selectors={...this.selectors,courseid:'[data-region="courseid"]'};const component=document.querySelector(this.componentSelector());this.courseID=component.querySelector(this.selectors.courseid).dataset.courseid}static init(){return new Group}selectOneLink(groupID){return _url.default.relativeUrl("/grade/report/grader/index.php",{id:this.courseID,groupsearchvalue:this.getSearchTerm(),group:groupID},!1)}}return _exports.default=Group,_exports.default})); //# sourceMappingURL=group.min.js.map \ No newline at end of file diff --git a/grade/report/grader/amd/build/group.min.js.map b/grade/report/grader/amd/build/group.min.js.map index d3833d64d78..8d578e41dd2 100644 --- a/grade/report/grader/amd/build/group.min.js.map +++ b/grade/report/grader/amd/build/group.min.js.map @@ -1 +1 @@ -{"version":3,"file":"group.min.js","sources":["../src/group.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 groups within the grader report.\n *\n * @module gradereport_grader/group\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport GroupSearch from 'core_group/comboboxsearch/group';\nimport Url from 'core/url';\n\nexport default class Group extends GroupSearch {\n\n courseID;\n\n constructor() {\n super();\n\n // Define our standard lookups.\n this.selectors = {...this.selectors,\n courseid: '[data-region=\"courseid\"]',\n };\n const component = document.querySelector(this.componentSelector());\n this.courseID = component.querySelector(this.selectors.courseid).dataset.courseid;\n }\n\n static init() {\n return new Group();\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} groupID The ID of the group selected.\n * @returns {string|*}\n */\n selectOneLink(groupID) {\n return Url.relativeUrl('/grade/report/grader/index.php', {\n id: this.courseID,\n groupsearchvalue: this.getSearchTerm(),\n group: groupID,\n }, false);\n }\n}\n"],"names":["Group","GroupSearch","constructor","selectors","this","courseid","component","document","querySelector","componentSelector","courseID","dataset","selectOneLink","groupID","Url","relativeUrl","id","groupsearchvalue","getSearchTerm","group"],"mappings":"2WAyBqBA,cAAcC,eAI/BC,6LAISC,UAAY,IAAIC,KAAKD,UACtBE,SAAU,kCAERC,UAAYC,SAASC,cAAcJ,KAAKK,0BACzCC,SAAWJ,UAAUE,cAAcJ,KAAKD,UAAUE,UAAUM,QAAQN,8BAIlE,IAAIL,MASfY,cAAcC,gBACHC,aAAIC,YAAY,iCAAkC,CACrDC,GAAIZ,KAAKM,SACTO,iBAAkBb,KAAKc,gBACvBC,MAAON,UACR"} \ No newline at end of file +{"version":3,"file":"group.min.js","sources":["../src/group.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 groups within the grader report.\n *\n * @module gradereport_grader/group\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @deprecated since Moodle 4.5 - please use core_course/actionbar/group instead.\n * @todo Final deprecation in Moodle 6.0. See MDL-82116.\n */\nimport GroupSearch from 'core_group/comboboxsearch/group';\nimport Url from 'core/url';\n\nexport default class Group extends GroupSearch {\n\n courseID;\n\n constructor() {\n window.console.warn(\n 'The gradereport_grader/group module has been deprecated since Moodle 4.5.' +\n ' Please use core_course/actionbar/group instead.',\n );\n\n super();\n\n // Define our standard lookups.\n this.selectors = {...this.selectors,\n courseid: '[data-region=\"courseid\"]',\n };\n const component = document.querySelector(this.componentSelector());\n this.courseID = component.querySelector(this.selectors.courseid).dataset.courseid;\n }\n\n static init() {\n return new Group();\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} groupID The ID of the group selected.\n * @returns {string|*}\n */\n selectOneLink(groupID) {\n return Url.relativeUrl('/grade/report/grader/index.php', {\n id: this.courseID,\n groupsearchvalue: this.getSearchTerm(),\n group: groupID,\n }, false);\n }\n}\n"],"names":["Group","GroupSearch","constructor","window","console","warn","selectors","this","courseid","component","document","querySelector","componentSelector","courseID","dataset","selectOneLink","groupID","Url","relativeUrl","id","groupsearchvalue","getSearchTerm","group"],"mappings":"2WA2BqBA,cAAcC,eAI/BC,gCACIC,OAAOC,QAAQC,KACX,0RAOCC,UAAY,IAAIC,KAAKD,UACtBE,SAAU,kCAERC,UAAYC,SAASC,cAAcJ,KAAKK,0BACzCC,SAAWJ,UAAUE,cAAcJ,KAAKD,UAAUE,UAAUM,QAAQN,8BAIlE,IAAIR,MASfe,cAAcC,gBACHC,aAAIC,YAAY,iCAAkC,CACrDC,GAAIZ,KAAKM,SACTO,iBAAkBb,KAAKc,gBACvBC,MAAON,UACR"} \ No newline at end of file diff --git a/grade/report/grader/amd/src/group.js b/grade/report/grader/amd/src/group.js index 1a22571c641..c97f52456e6 100644 --- a/grade/report/grader/amd/src/group.js +++ b/grade/report/grader/amd/src/group.js @@ -19,6 +19,8 @@ * @module gradereport_grader/group * @copyright 2023 Mathew May * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @deprecated since Moodle 4.5 - please use core_course/actionbar/group instead. + * @todo Final deprecation in Moodle 6.0. See MDL-82116. */ import GroupSearch from 'core_group/comboboxsearch/group'; import Url from 'core/url'; @@ -28,6 +30,11 @@ export default class Group extends GroupSearch { courseID; constructor() { + window.console.warn( + 'The gradereport_grader/group module has been deprecated since Moodle 4.5.' + + ' Please use core_course/actionbar/group instead.', + ); + super(); // Define our standard lookups. diff --git a/grade/report/grader/classes/output/action_bar.php b/grade/report/grader/classes/output/action_bar.php index 240ef44face..e7fa25e1008 100644 --- a/grade/report/grader/classes/output/action_bar.php +++ b/grade/report/grader/classes/output/action_bar.php @@ -110,7 +110,11 @@ class action_bar extends \core_grades\output\action_bar { ]) ); $data['initialselector'] = $initialselector->export_for_template($output); - $data['groupselector'] = $gradesrenderer->group_selector($course); + + if ($course->groupmode) { + $actionbarrenderer = $PAGE->get_renderer('core_course', 'actionbar'); + $data['groupselector'] = $actionbarrenderer->render(new \core_course\output\actionbar\group_selector($course)); + } $resetlink = new moodle_url('/grade/report/grader/index.php', ['id' => $courseid]); $searchinput = $OUTPUT->render_from_template('core_user/comboboxsearch/user_selector', [ diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index a4641213b7a..ad44a4683d0 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -60,7 +60,8 @@ if (!$course = $DB->get_record('course', array('id' => $courseid))) { // Conditionally add the group JS if we have groups enabled. if ($course->groupmode) { - $PAGE->requires->js_call_amd('gradereport_grader/group', 'init'); + $baseurl = new moodle_url('/grade/report/grader/index.php', ['id' => $courseid]); + $PAGE->requires->js_call_amd('core_course/actionbar/group', 'init', [$baseurl->out(false)]); } require_login($course); diff --git a/grade/report/singleview/amd/build/group.min.js b/grade/report/singleview/amd/build/group.min.js index ac6fb23657f..aca008d88ee 100644 --- a/grade/report/singleview/amd/build/group.min.js +++ b/grade/report/singleview/amd/build/group.min.js @@ -1,3 +1,3 @@ -define("gradereport_singleview/group",["exports","core_group/comboboxsearch/group","core/url"],(function(_exports,_group,_url){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_group=_interopRequireDefault(_group),_url=_interopRequireDefault(_url);class Group extends _group.default{constructor(item){super(),_defineProperty(this,"courseID",void 0),_defineProperty(this,"item",null),this.item=item,this.selectors={...this.selectors,courseid:'[data-region="courseid"]'};const component=document.querySelector(this.componentSelector());this.courseID=component.querySelector(this.selectors.courseid).dataset.courseid}static init(item){return new Group(item)}selectOneLink(groupID){return _url.default.relativeUrl("/grade/report/singleview/index.php",{id:this.courseID,groupsearchvalue:this.getSearchTerm(),group:groupID,item:this.item},!1)}}return _exports.default=Group,_exports.default})); +define("gradereport_singleview/group",["exports","core_group/comboboxsearch/group","core/url"],(function(_exports,_group,_url){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_group=_interopRequireDefault(_group),_url=_interopRequireDefault(_url);class Group extends _group.default{constructor(item){window.console.warn("The gradereport_singleview/group module has been deprecated since Moodle 4.5. Please use core_course/actionbar/group instead."),super(),_defineProperty(this,"courseID",void 0),_defineProperty(this,"item",null),this.item=item,this.selectors={...this.selectors,courseid:'[data-region="courseid"]'};const component=document.querySelector(this.componentSelector());this.courseID=component.querySelector(this.selectors.courseid).dataset.courseid}static init(item){return new Group(item)}selectOneLink(groupID){return _url.default.relativeUrl("/grade/report/singleview/index.php",{id:this.courseID,groupsearchvalue:this.getSearchTerm(),group:groupID,item:this.item},!1)}}return _exports.default=Group,_exports.default})); //# sourceMappingURL=group.min.js.map \ No newline at end of file diff --git a/grade/report/singleview/amd/build/group.min.js.map b/grade/report/singleview/amd/build/group.min.js.map index aac4a97824c..d70ba16f88b 100644 --- a/grade/report/singleview/amd/build/group.min.js.map +++ b/grade/report/singleview/amd/build/group.min.js.map @@ -1 +1 @@ -{"version":3,"file":"group.min.js","sources":["../src/group.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 groups within the singleview report.\n *\n * @module gradereport_singleview/group\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport GroupSearch from 'core_group/comboboxsearch/group';\nimport Url from 'core/url';\n\nexport default class Group extends GroupSearch {\n\n courseID;\n\n item = null;\n\n /**\n * Construct the class.\n *\n * @param {string} item The page type we are currently on.\n */\n constructor(item) {\n super();\n this.item = item;\n\n // Define our standard lookups.\n this.selectors = {...this.selectors,\n courseid: '[data-region=\"courseid\"]',\n };\n const component = document.querySelector(this.componentSelector());\n this.courseID = component.querySelector(this.selectors.courseid).dataset.courseid;\n }\n\n /**\n * Allow the class to be invoked via PHP.\n *\n * @param {string} item The page type we are currently on.\n * @returns {Group}\n */\n static init(item) {\n return new Group(item);\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} groupID The ID of the group selected.\n * @returns {string|*}\n */\n selectOneLink(groupID) {\n return Url.relativeUrl('/grade/report/singleview/index.php', {\n id: this.courseID,\n groupsearchvalue: this.getSearchTerm(),\n group: groupID,\n item: this.item\n }, false);\n }\n}\n"],"names":["Group","GroupSearch","constructor","item","selectors","this","courseid","component","document","querySelector","componentSelector","courseID","dataset","selectOneLink","groupID","Url","relativeUrl","id","groupsearchvalue","getSearchTerm","group"],"mappings":"mhBAyBqBA,cAAcC,eAW/BC,YAAYC,kFAPL,WASEA,KAAOA,UAGPC,UAAY,IAAIC,KAAKD,UACtBE,SAAU,kCAERC,UAAYC,SAASC,cAAcJ,KAAKK,0BACzCC,SAAWJ,UAAUE,cAAcJ,KAAKD,UAAUE,UAAUM,QAAQN,qBASjEH,aACD,IAAIH,MAAMG,MASrBU,cAAcC,gBACHC,aAAIC,YAAY,qCAAsC,CACzDC,GAAIZ,KAAKM,SACTO,iBAAkBb,KAAKc,gBACvBC,MAAON,QACPX,KAAME,KAAKF,OACZ"} \ No newline at end of file +{"version":3,"file":"group.min.js","sources":["../src/group.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 groups within the singleview report.\n *\n * @module gradereport_singleview/group\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @deprecated since Moodle 4.5 - please use core_course/actionbar/group instead.\n * @todo Final deprecation in Moodle 6.0. See MDL-82116.\n */\nimport GroupSearch from 'core_group/comboboxsearch/group';\nimport Url from 'core/url';\n\nexport default class Group extends GroupSearch {\n\n courseID;\n\n item = null;\n\n /**\n * Construct the class.\n *\n * @param {string} item The page type we are currently on.\n */\n constructor(item) {\n window.console.warn(\n 'The gradereport_singleview/group module has been deprecated since Moodle 4.5.' +\n ' Please use core_course/actionbar/group instead.',\n );\n\n super();\n this.item = item;\n\n // Define our standard lookups.\n this.selectors = {...this.selectors,\n courseid: '[data-region=\"courseid\"]',\n };\n const component = document.querySelector(this.componentSelector());\n this.courseID = component.querySelector(this.selectors.courseid).dataset.courseid;\n }\n\n /**\n * Allow the class to be invoked via PHP.\n *\n * @param {string} item The page type we are currently on.\n * @returns {Group}\n */\n static init(item) {\n return new Group(item);\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} groupID The ID of the group selected.\n * @returns {string|*}\n */\n selectOneLink(groupID) {\n return Url.relativeUrl('/grade/report/singleview/index.php', {\n id: this.courseID,\n groupsearchvalue: this.getSearchTerm(),\n group: groupID,\n item: this.item\n }, false);\n }\n}\n"],"names":["Group","GroupSearch","constructor","item","window","console","warn","selectors","this","courseid","component","document","querySelector","componentSelector","courseID","dataset","selectOneLink","groupID","Url","relativeUrl","id","groupsearchvalue","getSearchTerm","group"],"mappings":"mhBA2BqBA,cAAcC,eAW/BC,YAAYC,MACRC,OAAOC,QAAQC,KACX,6MATD,WAcEH,KAAOA,UAGPI,UAAY,IAAIC,KAAKD,UACtBE,SAAU,kCAERC,UAAYC,SAASC,cAAcJ,KAAKK,0BACzCC,SAAWJ,UAAUE,cAAcJ,KAAKD,UAAUE,UAAUM,QAAQN,qBASjEN,aACD,IAAIH,MAAMG,MASrBa,cAAcC,gBACHC,aAAIC,YAAY,qCAAsC,CACzDC,GAAIZ,KAAKM,SACTO,iBAAkBb,KAAKc,gBACvBC,MAAON,QACPd,KAAMK,KAAKL,OACZ"} \ No newline at end of file diff --git a/grade/report/singleview/amd/src/group.js b/grade/report/singleview/amd/src/group.js index acd0f80f9ad..10d4ffd8ce4 100644 --- a/grade/report/singleview/amd/src/group.js +++ b/grade/report/singleview/amd/src/group.js @@ -19,6 +19,8 @@ * @module gradereport_singleview/group * @copyright 2023 Mathew May * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @deprecated since Moodle 4.5 - please use core_course/actionbar/group instead. + * @todo Final deprecation in Moodle 6.0. See MDL-82116. */ import GroupSearch from 'core_group/comboboxsearch/group'; import Url from 'core/url'; @@ -35,6 +37,11 @@ export default class Group extends GroupSearch { * @param {string} item The page type we are currently on. */ constructor(item) { + window.console.warn( + 'The gradereport_singleview/group module has been deprecated since Moodle 4.5.' + + ' Please use core_course/actionbar/group instead.', + ); + super(); this.item = item; diff --git a/grade/report/singleview/classes/report/singleview.php b/grade/report/singleview/classes/report/singleview.php index a2d3df6b701..23b10e9620c 100644 --- a/grade/report/singleview/classes/report/singleview.php +++ b/grade/report/singleview/classes/report/singleview.php @@ -131,7 +131,9 @@ class singleview extends grade_report { protected function setup_groups() { parent::setup_groups(); - $this->group_selector = static::groups_course_menu($this->course); + if ($this->groupmode) { + $this->group_selector = static::groups_course_menu($this->course); + } } /** @@ -144,8 +146,8 @@ class singleview extends grade_report { protected static function groups_course_menu(stdClass $course) { global $PAGE; - $renderer = $PAGE->get_renderer('core_grades'); - return $renderer->group_selector($course); + $renderer = $PAGE->get_renderer('core_course', 'actionbar'); + return $renderer->render(new \core_course\output\actionbar\group_selector($course)); } /** diff --git a/grade/report/singleview/index.php b/grade/report/singleview/index.php index f0bdeafff0e..dd1034330e1 100644 --- a/grade/report/singleview/index.php +++ b/grade/report/singleview/index.php @@ -175,7 +175,8 @@ if ($itemtype == 'user' || $itemtype == 'user_select') { ['id' => $courseid]), 'report', 'singleview'); } if ($course->groupmode && $itemtype !== 'select') { - $PAGE->requires->js_call_amd('gradereport_singleview/group', 'init', [$itemtype]); + $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)]); } if ($itemtype == 'user') { diff --git a/grade/report/user/amd/build/group.min.js b/grade/report/user/amd/build/group.min.js index a8f95c01734..a17814d20b1 100644 --- a/grade/report/user/amd/build/group.min.js +++ b/grade/report/user/amd/build/group.min.js @@ -1,3 +1,3 @@ -define("gradereport_user/group",["exports","core_group/comboboxsearch/group","core/url"],(function(_exports,_group,_url){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_group=_interopRequireDefault(_group),_url=_interopRequireDefault(_url);class Group extends _group.default{constructor(){var obj,key,value;super(),value=void 0,(key="courseID")in(obj=this)?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,this.selectors={...this.selectors,courseid:'[data-region="courseid"]'};const component=document.querySelector(this.componentSelector());this.courseID=component.querySelector(this.selectors.courseid).dataset.courseid}static init(){return new Group}selectOneLink(groupID){return _url.default.relativeUrl("/grade/report/user/index.php",{id:this.courseID,groupsearchvalue:this.getSearchTerm(),group:groupID},!1)}}return _exports.default=Group,_exports.default})); +define("gradereport_user/group",["exports","core_group/comboboxsearch/group","core/url"],(function(_exports,_group,_url){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_group=_interopRequireDefault(_group),_url=_interopRequireDefault(_url);class Group extends _group.default{constructor(){var obj,key,value;window.console.warn("The gradereport_user/group module has been deprecated since Moodle 4.5. Please use core_course/actionbar/group instead."),super(),value=void 0,(key="courseID")in(obj=this)?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,this.selectors={...this.selectors,courseid:'[data-region="courseid"]'};const component=document.querySelector(this.componentSelector());this.courseID=component.querySelector(this.selectors.courseid).dataset.courseid}static init(){return new Group}selectOneLink(groupID){return _url.default.relativeUrl("/grade/report/user/index.php",{id:this.courseID,groupsearchvalue:this.getSearchTerm(),group:groupID},!1)}}return _exports.default=Group,_exports.default})); //# sourceMappingURL=group.min.js.map \ No newline at end of file diff --git a/grade/report/user/amd/build/group.min.js.map b/grade/report/user/amd/build/group.min.js.map index e9e7f723a9b..defa719c447 100644 --- a/grade/report/user/amd/build/group.min.js.map +++ b/grade/report/user/amd/build/group.min.js.map @@ -1 +1 @@ -{"version":3,"file":"group.min.js","sources":["../src/group.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 groups within the user report.\n *\n * @module gradereport_user/group\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport GroupSearch from 'core_group/comboboxsearch/group';\nimport Url from 'core/url';\n\nexport default class Group extends GroupSearch {\n\n courseID;\n\n constructor() {\n super();\n\n // Define our standard lookups.\n this.selectors = {...this.selectors,\n courseid: '[data-region=\"courseid\"]',\n };\n const component = document.querySelector(this.componentSelector());\n this.courseID = component.querySelector(this.selectors.courseid).dataset.courseid;\n }\n\n static init() {\n return new Group();\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} groupID The ID of the group selected.\n * @returns {string|*}\n */\n selectOneLink(groupID) {\n return Url.relativeUrl('/grade/report/user/index.php', {\n id: this.courseID,\n groupsearchvalue: this.getSearchTerm(),\n group: groupID,\n }, false);\n }\n}\n"],"names":["Group","GroupSearch","constructor","selectors","this","courseid","component","document","querySelector","componentSelector","courseID","dataset","selectOneLink","groupID","Url","relativeUrl","id","groupsearchvalue","getSearchTerm","group"],"mappings":"yWAyBqBA,cAAcC,eAI/BC,6LAISC,UAAY,IAAIC,KAAKD,UACtBE,SAAU,kCAERC,UAAYC,SAASC,cAAcJ,KAAKK,0BACzCC,SAAWJ,UAAUE,cAAcJ,KAAKD,UAAUE,UAAUM,QAAQN,8BAIlE,IAAIL,MASfY,cAAcC,gBACHC,aAAIC,YAAY,+BAAgC,CACnDC,GAAIZ,KAAKM,SACTO,iBAAkBb,KAAKc,gBACvBC,MAAON,UACR"} \ No newline at end of file +{"version":3,"file":"group.min.js","sources":["../src/group.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 groups within the user report.\n *\n * @module gradereport_user/group\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @deprecated since Moodle 4.5 - please use core_course/actionbar/group instead.\n * @todo Final deprecation in Moodle 6.0. See MDL-82116.\n */\nimport GroupSearch from 'core_group/comboboxsearch/group';\nimport Url from 'core/url';\n\nexport default class Group extends GroupSearch {\n\n courseID;\n\n constructor() {\n window.console.warn(\n 'The gradereport_user/group module has been deprecated since Moodle 4.5.' +\n ' Please use core_course/actionbar/group instead.',\n );\n\n super();\n\n // Define our standard lookups.\n this.selectors = {...this.selectors,\n courseid: '[data-region=\"courseid\"]',\n };\n const component = document.querySelector(this.componentSelector());\n this.courseID = component.querySelector(this.selectors.courseid).dataset.courseid;\n }\n\n static init() {\n return new Group();\n }\n\n /**\n * Build up the link that is dedicated to a particular result.\n *\n * @param {Number} groupID The ID of the group selected.\n * @returns {string|*}\n */\n selectOneLink(groupID) {\n return Url.relativeUrl('/grade/report/user/index.php', {\n id: this.courseID,\n groupsearchvalue: this.getSearchTerm(),\n group: groupID,\n }, false);\n }\n}\n"],"names":["Group","GroupSearch","constructor","window","console","warn","selectors","this","courseid","component","document","querySelector","componentSelector","courseID","dataset","selectOneLink","groupID","Url","relativeUrl","id","groupsearchvalue","getSearchTerm","group"],"mappings":"yWA2BqBA,cAAcC,eAI/BC,gCACIC,OAAOC,QAAQC,KACX,wRAOCC,UAAY,IAAIC,KAAKD,UACtBE,SAAU,kCAERC,UAAYC,SAASC,cAAcJ,KAAKK,0BACzCC,SAAWJ,UAAUE,cAAcJ,KAAKD,UAAUE,UAAUM,QAAQN,8BAIlE,IAAIR,MASfe,cAAcC,gBACHC,aAAIC,YAAY,+BAAgC,CACnDC,GAAIZ,KAAKM,SACTO,iBAAkBb,KAAKc,gBACvBC,MAAON,UACR"} \ No newline at end of file diff --git a/grade/report/user/amd/src/group.js b/grade/report/user/amd/src/group.js index afd2f0dc33c..da953219766 100644 --- a/grade/report/user/amd/src/group.js +++ b/grade/report/user/amd/src/group.js @@ -19,6 +19,8 @@ * @module gradereport_user/group * @copyright 2023 Mathew May * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @deprecated since Moodle 4.5 - please use core_course/actionbar/group instead. + * @todo Final deprecation in Moodle 6.0. See MDL-82116. */ import GroupSearch from 'core_group/comboboxsearch/group'; import Url from 'core/url'; @@ -28,6 +30,11 @@ export default class Group extends GroupSearch { courseID; constructor() { + window.console.warn( + 'The gradereport_user/group module has been deprecated since Moodle 4.5.' + + ' Please use core_course/actionbar/group instead.', + ); + super(); // Define our standard lookups. diff --git a/grade/report/user/classes/output/action_bar.php b/grade/report/user/classes/output/action_bar.php index f096d829763..254c4e049cc 100644 --- a/grade/report/user/classes/output/action_bar.php +++ b/grade/report/user/classes/output/action_bar.php @@ -81,7 +81,11 @@ class action_bar extends \core_grades\output\action_bar { // and the view mode selector (if applicable). if (has_capability('moodle/grade:viewall', $this->context)) { $userreportrenderer = $PAGE->get_renderer('gradereport_user'); - $data['groupselector'] = $PAGE->get_renderer('core_grades')->group_selector(get_course($courseid)); + $course = get_course($courseid); + if ($course->groupmode) { + $groupselector = new \core_course\output\actionbar\group_selector($course); + $data['groupselector'] = $PAGE->get_renderer('core_course', 'actionbar')->render($groupselector); + } $data['userselector'] = [ 'courseid' => $courseid, 'content' => $userreportrenderer->users_selector(get_course($courseid), $this->userid, $this->currentgroupid) diff --git a/grade/report/user/index.php b/grade/report/user/index.php index 2c9aea19f5c..d5cd825223c 100644 --- a/grade/report/user/index.php +++ b/grade/report/user/index.php @@ -95,7 +95,8 @@ if (has_capability('moodle/grade:viewall', $context)) { $currentgroup = $gpr->groupid; // Conditionally add the group JS if we have groups enabled. if ($groupmode) { - $PAGE->requires->js_call_amd('gradereport_user/group', 'init'); + $baseurl = new moodle_url('/grade/report/user/index.php', ['id' => $courseid]); + $PAGE->requires->js_call_amd('core_course/actionbar/group', 'init', [$baseurl->out(false)]); } // To make some other functions work better later. From 859a54b1c0eabd4da797fd23492d71370e079b7c Mon Sep 17 00:00:00 2001 From: Shamim Rezaie Date: Thu, 6 Jun 2024 02:42:38 +1000 Subject: [PATCH 3/3] MDL-80745 mod_assign: Move group selector on grading page to action bar AMOS BEGIN MOV [clearall,gradereport_grader],[clearall,core] AMOS END --- .../grader/lang/en/gradereport_grader.php | 1 - .../grader/templates/action_bar.mustache | 2 +- lang/en/moodle.php | 1 + .../classes/output/grading_actionmenu.php | 29 +++++++++++++++---- mod/assign/locallib.php | 9 +++--- .../templates/grading_actionmenu.mustache | 22 ++++++++++++-- .../tests/behat/group_submission.feature | 4 +-- .../boost/scss/moodle/tertiarynavigation.scss | 7 +++++ theme/boost/style/moodle.css | 6 ++++ theme/classic/style/moodle.css | 6 ++++ 10 files changed, 72 insertions(+), 15 deletions(-) diff --git a/grade/report/grader/lang/en/gradereport_grader.php b/grade/report/grader/lang/en/gradereport_grader.php index 2b8d854d71d..35fcada9e9d 100644 --- a/grade/report/grader/lang/en/gradereport_grader.php +++ b/grade/report/grader/lang/en/gradereport_grader.php @@ -24,7 +24,6 @@ */ $string['aria:dropdowncolumns'] = 'Collapsed columns found'; -$string['clearall'] = 'Clear all'; $string['clearsearch'] = 'Clear searched users'; $string['collapsedcolumns'] = 'Collapsed columns {$a}'; $string['editingmode_title'] = 'Editing the grader report'; diff --git a/grade/report/grader/templates/action_bar.mustache b/grade/report/grader/templates/action_bar.mustache index 594e7d582f9..27ea85ca3f5 100644 --- a/grade/report/grader/templates/action_bar.mustache +++ b/grade/report/grader/templates/action_bar.mustache @@ -93,7 +93,7 @@ {{/initialselector}} {{#pagereset}} {{/pagereset}} diff --git a/lang/en/moodle.php b/lang/en/moodle.php index cdf4733f8bb..13d916783ac 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -262,6 +262,7 @@ $string['changesmadereallygoaway'] = 'You have made changes. Are you sure you wa $string['city'] = 'City/town'; $string['cleaningtempdata'] = 'Cleaning temp data'; $string['clear'] = 'Clear'; +$string['clearall'] = 'Clear all'; $string['clearfilterrow'] = 'Remove filter row'; $string['clearfilters'] = 'Clear filters'; $string['clearsearch'] = 'Clear search input'; diff --git a/mod/assign/classes/output/grading_actionmenu.php b/mod/assign/classes/output/grading_actionmenu.php index ab58ec68283..657655aac6e 100644 --- a/mod/assign/classes/output/grading_actionmenu.php +++ b/mod/assign/classes/output/grading_actionmenu.php @@ -66,12 +66,31 @@ class grading_actionmenu implements templatable, renderable { * @return array Data to render. */ public function export_for_template(\renderer_base $output): array { - $downloadall = ''; + global $PAGE; + + $course = $PAGE->course; + $data = []; + if ($this->submissionpluginenabled && $this->submissioncount) { - $downloadall = (new moodle_url('/mod/assign/view.php', ['id' => $this->cmid, 'action' => 'downloadall']))->out(false); + $data['downloadall'] = ( + new moodle_url('/mod/assign/view.php', ['id' => $this->cmid, 'action' => 'downloadall']) + )->out(false); } - return [ - 'downloadall' => $downloadall - ]; + + if ($course->groupmode) { + $actionbarrenderer = $PAGE->get_renderer('core_course', 'actionbar'); + $data['groupselector'] = $actionbarrenderer->render(new \core_course\output\actionbar\group_selector($course)); + } + + if (groups_get_course_group($course)) { + $reset = new moodle_url('/mod/assign/view.php', [ + 'id' => $this->cmid, + 'action' => 'grading', + 'group' => 0, + ]); + $data['pagereset'] = $reset->out(false); + } + + return $data; } } diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 094706ffa36..64052b2b70f 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -4567,9 +4567,13 @@ class assign { $buttons = new \mod_assign\output\grading_actionmenu($this->get_course_module()->id, $this->is_any_submission_plugin_enabled(), $this->count_submissions()); $actionformtext = $this->get_renderer()->render($buttons); + $currenturl = new moodle_url('/mod/assign/view.php', ['id' => $this->get_course_module()->id, 'action' => 'grading']); $PAGE->activityheader->set_attrs(['hidecompletion' => true]); - $currenturl = new moodle_url('/mod/assign/view.php', ['id' => $this->get_course_module()->id, 'action' => 'grading']); + // Conditionally add the group JS if we have groups enabled. + if ($this->get_course()->groupmode) { + $PAGE->requires->js_call_amd('core_course/actionbar/group', 'init', [$currenturl->out(false)]); + } $header = new assign_header($this->get_instance(), $this->get_context(), @@ -4583,11 +4587,8 @@ class assign { $o .= $actionformtext; - $o .= $this->get_renderer()->heading(get_string('gradeitem:submissions', 'mod_assign'), 2); $o .= $this->get_renderer()->render($gradingactions); - $o .= groups_print_activity_menu($this->get_course_module(), $currenturl, true); - // Plagiarism update status apearring in the grading book. if (!empty($CFG->enableplagiarism)) { require_once($CFG->libdir . '/plagiarismlib.php'); diff --git a/mod/assign/templates/grading_actionmenu.mustache b/mod/assign/templates/grading_actionmenu.mustache index 09fa68333c2..0ac9701d1b0 100644 --- a/mod/assign/templates/grading_actionmenu.mustache +++ b/mod/assign/templates/grading_actionmenu.mustache @@ -23,16 +23,34 @@ * none Context variables required for this template: - * see mod/lesson/classes/output/grading_actionmenu.php + * groupselector - (optional) HTML that outputs the group selector Example context (json): { + "groupselector": "
", + "pagereset": "http://moodle.local/mod/assign/view.php?id=2&action=grading&group=0", "downloadall": "https://moodle.org" } }} -
+
+ + + {{#groupselector}} + + + {{/groupselector}} + {{#pagereset}} + + + {{/pagereset}} {{#downloadall}}