diff --git a/grade/lib.php b/grade/lib.php index f3b637d71fa..fb340d81bea 100644 --- a/grade/lib.php +++ b/grade/lib.php @@ -2380,8 +2380,24 @@ class grade_structure { $url = $gpr->add_url_params($url); if ($element['type'] == 'category') { - // Grade categories themselves cannot be locked. - return null; + // Grade categories themselves cannot be locked. We lock/unlock their grade items. + $children = $element['object']->get_children(true); + $alllocked = true; + foreach ($children as $child) { + if (!$child['object']->is_locked()) { + $alllocked = false; + break; + } + } + if ($alllocked && has_capability('moodle/grade:unlock', $this->context)) { + $title = get_string('unlock', 'grades'); + $url->param('action', 'unlock'); + } else if (!$alllocked && has_capability('moodle/grade:lock', $this->context)) { + $title = get_string('lock', 'grades'); + $url->param('action', 'lock'); + } else { + return null; + } } else if (($element['type'] == 'grade') && ($element['object']->grade_item->is_locked())) { // Don't allow an unlocking action for a grade whose grade item is locked: just print a state icon. $strparamobj = new stdClass(); @@ -2504,7 +2520,6 @@ class grade_structure { $context = [ 'hidden' => $element['object']->is_hidden(), - 'locked' => $element['object']->is_locked(), ]; if ($element['object'] instanceof grade_grade) { @@ -2514,19 +2529,32 @@ class grade_structure { $context['feedback'] = !empty($grade->feedback) && $grade->load_grade_item()->gradetype != GRADE_TYPE_TEXT; } - // Early return if there aren't any statuses that we need to show. - if (!in_array(true, $context)) { - return null; - } - $context['classes'] = 'grade_icons data-collapse_gradeicons'; - if (isset($element['type']) && ($element['type'] == 'category')) { + if ($element['object'] instanceof grade_category) { $context['classes'] = 'category_grade_icons'; - $context['locked'] = false; + + $children = $element['object']->get_children(true); + $alllocked = true; + foreach ($children as $child) { + if (!$child['object']->is_locked()) { + $alllocked = false; + break; + } + } + if ($alllocked) { + $context['locked'] = true; + } + } else { + $context['locked'] = $element['object']->is_locked(); } - return $OUTPUT->render_from_template('core_grades/status_icons', $context); + // Don't even attempt rendering if there is no status to show. + if (in_array(true, $context)) { + return $OUTPUT->render_from_template('core_grades/status_icons', $context); + } else { + return null; + } } /** @@ -2655,6 +2683,7 @@ class grade_structure { } $context->editurl = $this->get_edit_link($element, $gpr); $context->hideurl = $this->get_hiding_link($element, $gpr); + $context->lockurl = $this->get_locking_link($element, $gpr); } }