diff --git a/grade/report/singleview/index.php b/grade/report/singleview/index.php
index f03a4134cfe..29a201f08c0 100644
--- a/grade/report/singleview/index.php
+++ b/grade/report/singleview/index.php
@@ -148,54 +148,28 @@ if ($data = data_submitted()) {
// Make sure we have proper final grades.
grade_regrade_final_grades_if_required($course);
-$graderrightnav = $graderleftnav = null;
-
-$options = $report->screen->options();
-
-if (!empty($options)) {
-
- $optionkeys = array_keys($options);
- $optionitemid = array_shift($optionkeys);
-
- $relreport = new gradereport_singleview\report\singleview(
- $courseid, $gpr, $context,
- $report->screen->item_type(), $optionitemid
- );
- $reloptions = $relreport->screen->options();
- $reloptionssorting = array_keys($relreport->screen->options());
-
- $i = array_search($itemid, $reloptionssorting);
- $navparams = ['item' => $itemtype, 'id' => $courseid, 'group' => $groupid];
- if ($i > 0) {
- $navparams['itemid'] = $reloptionssorting[$i - 1];
- $link = new moodle_url('/grade/report/singleview/index.php', $navparams);
- $navprev = html_writer::link($link, $OUTPUT->larrow() . ' ' . $reloptions[$reloptionssorting[$i - 1]]);
- $graderleftnav = html_writer::tag('div', $navprev, ['class' => 'itemnav previtem']);
- }
- if ($i < count($reloptionssorting) - 1) {
- $navparams['itemid'] = $reloptionssorting[$i + 1];
- $link = new moodle_url('/grade/report/singleview/index.php', $navparams);
- $navnext = html_writer::link($link, $reloptions[$reloptionssorting[$i + 1]] . ' ' . $OUTPUT->rarrow());
- $graderrightnav = html_writer::tag('div', $navnext, ['class' => 'itemnav nextitem']);
- }
-}
-
-if ($report->screen->supports_paging()) {
- echo $report->screen->pager();
-}
-
echo $report->output();
-if ($report->screen->supports_paging()) {
- echo $report->screen->perpage_select();
- echo $report->screen->pager();
-}
+if (($itemtype !== 'select') && ($itemtype !== 'grade_select') &&($itemtype !== 'user_select')) {
+ $item = (isset($userid)) ? $userid : $itemid;
-if (!is_null($graderleftnav)) {
- echo $graderleftnav;
-}
-if (!is_null($graderrightnav)) {
- echo $graderrightnav;
+ $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
+ $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
+ $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $context);
+
+ $currentgroup = $gpr->groupid;
+
+ // To make some other functions work better later.
+ if (!$currentgroup) {
+ $currentgroup = null;
+ }
+ $gui = new graded_users_iterator($course, null, $currentgroup);
+ $gui->require_active_enrolment($showonlyactiveenrol);
+ $gui->init();
+
+ $userreportrenderer = $PAGE->get_renderer('gradereport_singleview');
+ // Add previous/next user navigation.
+ echo $userreportrenderer->report_navigation($gpr, $courseid, $context, $report, $groupid, $itemtype, $itemid);
}
$event = \gradereport_singleview\event\grade_report_viewed::create(
diff --git a/grade/report/singleview/lang/en/gradereport_singleview.php b/grade/report/singleview/lang/en/gradereport_singleview.php
index 08e40ee08f3..a299b807d84 100644
--- a/grade/report/singleview/lang/en/gradereport_singleview.php
+++ b/grade/report/singleview/lang/en/gradereport_singleview.php
@@ -43,6 +43,8 @@ $string['feedbackfor'] = 'Feedback for {$a}';
$string['gradefor'] = 'Grade for {$a}';
$string['gradeitem'] = 'Grade item: {$a}';
$string['gradeuser'] = 'Grade user: {$a}';
+$string['gotonextreport'] = 'Go to next user report';
+$string['gotopreviousreport'] = 'Go to previous user report';
$string['noscreens'] = 'Could not find a suitable single view screen.';
$string['gradeitemcannotbeoverridden'] = 'This grade item cannot be overridden.';
$string['itemsperpage'] = 'Items per page';
diff --git a/grade/report/singleview/renderer.php b/grade/report/singleview/renderer.php
index a40a183deb6..70b7998e1cc 100644
--- a/grade/report/singleview/renderer.php
+++ b/grade/report/singleview/renderer.php
@@ -22,6 +22,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
+use gradereport_singleview\report\singleview;
+
/**
* Custom renderer for the single view report.
*
@@ -86,4 +88,67 @@ class gradereport_singleview_renderer extends plugin_renderer_base {
$this->page->requires->js_call_amd('gradereport_singleview/grade', 'init');
return $this->render_from_template('gradereport_singleview/grade_item_selector', $data);
}
+
+ /**
+ * Creates and renders previous/next user/grade item navigation.
+ *
+ * @param object $gpr grade plugin return tracking object
+ * @param int $courseid The course ID.
+ * @param \context_course $context Context of the report.
+ * @param singleview $report The single view report class.
+ * @param int|null $groupid Group ID
+ * @param string $itemtype User or Grade item type
+ * @param int $itemid Either User ID or Grade item ID
+ * @return string The raw HTML to render.
+ * @throws moodle_exception
+ */
+ public function report_navigation(object $gpr, int $courseid, \context_course $context, singleview $report,
+ ?int $groupid, string $itemtype, int $itemid): string {
+
+ $navigation = '';
+ $options = $report->screen->options();
+
+ $optionkeys = array_keys($options);
+ $optionitemid = array_shift($optionkeys);
+
+ $relreport = new gradereport_singleview\report\singleview(
+ $courseid, $gpr, $context,
+ $report->screen->item_type(), $optionitemid
+ );
+ $reloptions = $relreport->screen->options();
+ $reloptionssorting = array_keys($relreport->screen->options());
+
+ $i = array_search($itemid, $reloptionssorting);
+ $navparams = ['item' => $itemtype, 'id' => $courseid, 'group' => $groupid];
+
+ if ($i > 0) {
+ $navparams['itemid'] = $reloptionssorting[$i - 1];
+ $link = (new moodle_url('/grade/report/singleview/index.php', $navparams))
+ ->out(false);
+ $navigationdata['previoususer'] = [
+ 'name' => $reloptions[$navparams['itemid']],
+ 'url' => $link
+ ];
+ }
+ if ($i < count($reloptionssorting) - 1) {
+ $navparams['itemid'] = $reloptionssorting[$i + 1];
+ $link = (new moodle_url('/grade/report/singleview/index.php', $navparams))
+ ->out(false);
+ $navigationdata['nextuser'] = [
+ 'name' => $reloptions[$navparams['itemid']],
+ 'url' => $link
+ ];
+ }
+
+ if ($report->screen->supports_paging()) {
+ $navigationdata['perpageselect'] = $report->screen->perpage_select();
+ $navigationdata['pager'] = $report->screen->pager();
+ }
+
+ if (isset($navigationdata)) {
+ $navigation = $this->render_from_template('gradereport_singleview/report_navigation', $navigationdata);
+ }
+ return $navigation;
+ }
+
}
diff --git a/grade/report/singleview/styles.css b/grade/report/singleview/styles.css
index 1ca310c3034..196f849b3ac 100644
--- a/grade/report/singleview/styles.css
+++ b/grade/report/singleview/styles.css
@@ -42,6 +42,11 @@
color: #2ca14f;
}
+.path-grade-report-singleview .report-navigation .container {
+ max-width: 1060px;
+ margin-left: 0;
+}
+
.path-grade-report-singleview .reporttable tbody th,
.path-grade-report-singleview .reporttable tbody td.range {
white-space: nowrap;
diff --git a/grade/report/singleview/templates/report_navigation.mustache b/grade/report/singleview/templates/report_navigation.mustache
new file mode 100644
index 00000000000..03da8ddf203
--- /dev/null
+++ b/grade/report/singleview/templates/report_navigation.mustache
@@ -0,0 +1,65 @@
+{{!
+ 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