Merge branch 'MDL-82681-main-3' of https://github.com/mihailges/moodle

This commit is contained in:
Sara Arjona
2024-09-23 07:17:03 +02:00
17 changed files with 438 additions and 367 deletions
@@ -0,0 +1,7 @@
issueNumber: MDL-82681
notes:
mod_assign:
- message: >-
The method process_save_grading_options() has been deprecated as it is
no longer used.
type: deprecated
@@ -5,6 +5,6 @@ define("mod_assign/actionbar/grading/extra_filters_dropdown",["exports","core/lo
* @module mod_assign/actionbar/grading/extra_filters_dropdown
* @copyright 2024 Mihail Geshoski <mihail@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_jquery=(obj=_jquery)&&obj.__esModule?obj:{default:obj};const Selectors_extraFiltersDropdown=".dropdown.extrafilters",Selectors_extraFiltersClose='a[data-action="close"]',Selectors_workflowFilterElement='select[name="workflowfilter"]',restoreAppliedWorkflowFilter=async extraFiltersDropdown=>{const appliedWorkflowFilter=await(0,_repository.getUserPreference)("assign_workflowfilter");extraFiltersDropdown.getElement().querySelector(Selectors_workflowFilterElement).value=appliedWorkflowFilter};_exports.init=()=>{const extraFiltersDropdown=(0,_dialog.getDropdownDialog)(Selectors_extraFiltersDropdown);extraFiltersDropdown&&(extraFiltersDropdown=>{extraFiltersDropdown.getElement().addEventListener("click",(e=>{e.target.closest(Selectors_extraFiltersClose)&&(e.preventDefault(),extraFiltersDropdown.setVisible(!1))})),(0,_jquery.default)(extraFiltersDropdown.getElement()).on("hide.bs.dropdown",(()=>{restoreAppliedWorkflowFilter(extraFiltersDropdown)}))})(extraFiltersDropdown)}}));
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_jquery=(obj=_jquery)&&obj.__esModule?obj:{default:obj};const Selectors_extraFiltersDropdown=".dropdown.extrafilters",Selectors_extraFiltersClose='a[data-action="close"]',Selectors_workflowFilterElement='select[name="workflowfilter"]',Selectors_markerFilterElement='select[name="markingallocationfilter"]',Selectors_suspendedParticipantsFilterCheckbox='input[type="checkbox"][name="suspendedparticipantsfilter"]',Selectors_suspendedParticipantsFilterHidden='input[type="hidden"][name="suspendedparticipantsfilter"]',restoreAppliedWorkflowFilter=async extraFiltersDropdown=>{const appliedWorkflowFilter=await(0,_repository.getUserPreference)("assign_workflowfilter");extraFiltersDropdown.getElement().querySelector(Selectors_workflowFilterElement).value=appliedWorkflowFilter},restoreAppliedMarkerFilter=async extraFiltersDropdown=>{const markerFilterSelect=extraFiltersDropdown.getElement().querySelector(Selectors_markerFilterElement);if(markerFilterSelect){const appliedMarkerFilter=await(0,_repository.getUserPreference)("assign_markerfilter");markerFilterSelect.value=appliedMarkerFilter}},restoreAppliedSuspendedParticipantsFilter=async extraFiltersDropdown=>{const suspendedParticipantsFilterCheckbox=extraFiltersDropdown.getElement().querySelector(Selectors_suspendedParticipantsFilterCheckbox);if(suspendedParticipantsFilterCheckbox){const suspendedParticipantsFilterHidden=suspendedParticipantsFilterCheckbox.parentNode.querySelector(Selectors_suspendedParticipantsFilterHidden),showOnlyActiveParticipants=await(0,_repository.getUserPreference)("grade_report_showonlyactiveenrol");suspendedParticipantsFilterCheckbox.checked=!showOnlyActiveParticipants,suspendedParticipantsFilterHidden.disabled=!showOnlyActiveParticipants}};_exports.init=()=>{const extraFiltersDropdown=(0,_dialog.getDropdownDialog)(Selectors_extraFiltersDropdown);extraFiltersDropdown&&(extraFiltersDropdown=>{extraFiltersDropdown.getElement().addEventListener("click",(e=>{e.target.closest(Selectors_extraFiltersClose)&&(e.preventDefault(),extraFiltersDropdown.setVisible(!1))})),extraFiltersDropdown.getElement().addEventListener("change",(e=>{const suspendedParticipantsFilterCheckbox=e.target.closest(Selectors_suspendedParticipantsFilterCheckbox);suspendedParticipantsFilterCheckbox&&(suspendedParticipantsFilterCheckbox.parentNode.querySelector(Selectors_suspendedParticipantsFilterHidden).disabled=suspendedParticipantsFilterCheckbox.checked)})),(0,_jquery.default)(extraFiltersDropdown.getElement()).on("hide.bs.dropdown",(()=>{restoreAppliedWorkflowFilter(extraFiltersDropdown),restoreAppliedMarkerFilter(extraFiltersDropdown),restoreAppliedSuspendedParticipantsFilter(extraFiltersDropdown)}))})(extraFiltersDropdown)}}));
//# sourceMappingURL=extra_filters_dropdown.min.js.map
File diff suppressed because one or more lines are too long
@@ -29,7 +29,10 @@ import $ from 'jquery';
const Selectors = {
extraFiltersDropdown: '.dropdown.extrafilters',
extraFiltersClose: 'a[data-action="close"]',
workflowFilterElement: 'select[name="workflowfilter"]'
workflowFilterElement: 'select[name="workflowfilter"]',
markerFilterElement: 'select[name="markingallocationfilter"]',
suspendedParticipantsFilterCheckbox: 'input[type="checkbox"][name="suspendedparticipantsfilter"]',
suspendedParticipantsFilterHidden: 'input[type="hidden"][name="suspendedparticipantsfilter"]'
};
/**
@@ -46,10 +49,27 @@ const registerEventListeners = (extraFiltersDropdown) => {
extraFiltersDropdown.setVisible(false);
}
});
// Change event listener to the extra filters dropdown element.
extraFiltersDropdown.getElement().addEventListener('change', e => {
const suspendedParticipantsFilterCheckbox = e.target.closest(Selectors.suspendedParticipantsFilterCheckbox);
// The target is the 'Suspended participants' filter checkbox.
if (suspendedParticipantsFilterCheckbox) {
// The 'Suspended participants' filter uses a hidden input and a checkbox. The hidden input is used to
// submit '0' as a workaround when the checkbox is unchecked since unchecked checkboxes are not submitted
// with the form. Therefore, we need to enable or disable the hidden input based on the checkbox state.
const suspendedParticipantsFilterHidden = suspendedParticipantsFilterCheckbox.parentNode
.querySelector(Selectors.suspendedParticipantsFilterHidden);
suspendedParticipantsFilterHidden.disabled = suspendedParticipantsFilterCheckbox.checked;
}
});
// Event listener triggered upon hiding of the dropdown.
$(extraFiltersDropdown.getElement()).on('hide.bs.dropdown', () => {
// Restore the filters to their stored preference values once the dropdown is closed.
restoreAppliedWorkflowFilter(extraFiltersDropdown);
restoreAppliedMarkerFilter(extraFiltersDropdown);
restoreAppliedSuspendedParticipantsFilter(extraFiltersDropdown);
});
};
@@ -64,6 +84,36 @@ const restoreAppliedWorkflowFilter = async(extraFiltersDropdown) => {
workflowFilterSelect.value = appliedWorkflowFilter;
};
/**
* Restores the currently applied marker filter to its stored preference value.
*
* @param {DropdownDialog} extraFiltersDropdown The dropdown dialog instance.
*/
const restoreAppliedMarkerFilter = async(extraFiltersDropdown) => {
const markerFilterSelect = extraFiltersDropdown.getElement().querySelector(Selectors.markerFilterElement);
if (markerFilterSelect) {
const appliedMarkerFilter = await getUserPreference('assign_markerfilter');
markerFilterSelect.value = appliedMarkerFilter;
}
};
/**
* Restores the currently suspended participants filter to its stored preference value.
*
* @param {DropdownDialog} extraFiltersDropdown The dropdown dialog instance.
*/
const restoreAppliedSuspendedParticipantsFilter = async(extraFiltersDropdown) => {
const suspendedParticipantsFilterCheckbox = extraFiltersDropdown.getElement()
.querySelector(Selectors.suspendedParticipantsFilterCheckbox);
if (suspendedParticipantsFilterCheckbox) {
const suspendedParticipantsFilterHidden = suspendedParticipantsFilterCheckbox.parentNode
.querySelector(Selectors.suspendedParticipantsFilterHidden);
const showOnlyActiveParticipants = await getUserPreference('grade_report_showonlyactiveenrol');
suspendedParticipantsFilterCheckbox.checked = !showOnlyActiveParticipants;
suspendedParticipantsFilterHidden.disabled = !showOnlyActiveParticipants;
}
};
/**
* Initialize module.
*/
@@ -1,80 +0,0 @@
<?php
// 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 <http://www.gnu.org/licenses/>.
/**
* This file contains the temporary form used on the submissions page to apply assignment grading options.
*
* @package mod_assign
* @copyright 2024 Mihail Geshoski <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_assign\form;
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
require_once($CFG->libdir.'/formslib.php');
require_once($CFG->dirroot . '/mod/assign/locallib.php');
/**
* Assignment grading options temporary form.
*
* This form class is a copy of mod_assign_grading_options_form. The only purpose of this form is to be temporarily used
* on the submission page until the gradual removal of the current form elements is completed. After that, this form
* class will be removed.
*
* @package mod_assign
* @copyright 2024 Mihail Geshoski <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class grading_options_temp_form extends \moodleform {
/**
* Define this form - called from the parent constructor.
*/
public function definition() {
$mform = $this->_form;
$instance = $this->_customdata;
$mform->disable_form_change_checker();
$mform->addElement('header', 'general', get_string('gradingoptions', 'assign'));
if (!empty($instance['markingallocationopt'])) {
$markingfilter = get_string('markerfilter', 'assign');
$mform->addElement('select', 'markerfilter', $markingfilter, $instance['markingallocationopt']);
}
// Show active/suspended user option.
if ($instance['showonlyactiveenrolopt']) {
$mform->addElement('checkbox', 'showonlyactiveenrol', get_string('showonlyactiveenrol', 'grades'));
$mform->addHelpButton('showonlyactiveenrol', 'showonlyactiveenrol', 'grades');
$mform->setDefault('showonlyactiveenrol', $instance['showonlyactiveenrol']);
}
// Hidden params.
$mform->addElement('hidden', 'contextid', $instance['contextid']);
$mform->setType('contextid', PARAM_INT);
$mform->addElement('hidden', 'id', $instance['cm']);
$mform->setType('id', PARAM_INT);
$mform->addElement('hidden', 'userid', $instance['userid']);
$mform->setType('userid', PARAM_INT);
$mform->addElement('hidden', 'action', 'saveoptions');
$mform->setType('action', PARAM_ALPHA);
// Buttons.
$this->add_action_buttons(false, get_string('updatetable', 'assign'));
}
}
@@ -126,6 +126,8 @@ class grading_actionmenu implements templatable, renderable {
'group' => 0,
'status' => '',
'workflowfilter' => '',
'markingallocationfilter' => '',
'suspendedparticipantsfilter' => 0,
]);
$data['pagereset'] = $url->out(false);
}
@@ -308,6 +310,20 @@ class grading_actionmenu implements templatable, renderable {
$dropdowncontentdata['filters']['markingworkflow'] = [
'workflowfilteroptions' => $this->assign->get_marking_workflow_filters(true),
];
// If marking allocation is enabled and the user has the capability to manage marker allocations.
if ($this->assign->get_instance()->markingallocation &&
has_capability('mod/assign:manageallocations', $this->assign->get_context())) {
$dropdowncontentdata['filters']['markingallocation'] = [
'markingallocationoptions' => $this->assign->get_marking_allocation_filters(true),
];
}
}
if (has_capability('moodle/course:viewsuspendedusers', $this->assign->get_context())) {
$dropdowncontentdata['filters']['suspendedparticipants'] = [
'active' => !$this->assign->show_only_active_users(),
];
}
// If there are no available filters, return null.
@@ -350,6 +366,18 @@ class grading_actionmenu implements templatable, renderable {
if (get_user_preferences('assign_workflowfilter')) {
$appliedextrafilterscount++;
}
$canallocatemarker = $this->assign->get_instance()->markingallocation &&
has_capability('mod/assign:manageallocations', $this->assign->get_context());
if ($canallocatemarker && get_user_preferences('assign_markerfilter')) {
$appliedextrafilterscount++;
}
}
// If suspended participants are included.
if (!$this->assign->show_only_active_users()) {
$appliedextrafilterscount++;
}
return $appliedextrafilterscount;
+4 -107
View File
@@ -15,115 +15,12 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* This file contains the forms to create and edit an instance of this module
* File only retained to prevent fatal errors in code that tries to require/include this.
*
* @package mod_assign
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @deprecated since 4.5. This file is no longer required.
* @todo This file should be removed in Moodle 6.0. See MDL-82876.
*/
defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.');
require_once($CFG->libdir.'/formslib.php');
require_once($CFG->dirroot . '/mod/assign/locallib.php');
/**
* Assignment grading options form
*
* @deprecated since 4.5
* @package mod_assign
* @copyright 2012 NetSpot {@link http://www.netspot.com.au}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
#[\core\attribute\deprecated(
replacement: null,
since: '4.5',
reason: 'It is no longer used.',
mdl: 'MDL-82857',
)]
class mod_assign_grading_options_form extends moodleform {
/**
* Define this form - called from the parent constructor.
*
* @deprecated since 4.5
*/
#[\core\attribute\deprecated(
replacement: null,
since: '4.5',
reason: 'It is no longer used.',
mdl: 'MDL-82857',
)]
public function definition() {
\core\deprecation::emit_deprecation_if_present(__FUNCTION__);
$mform = $this->_form;
$instance = $this->_customdata;
$mform->disable_form_change_checker();
$mform->addElement('header', 'general', get_string('gradingoptions', 'assign'));
// Visible elements.
$options = array(10 => '10', 20 => '20', 50 => '50', 100 => '100', -1 => get_string('all'));
$maxperpage = get_config('assign', 'maxperpage');
if (isset($maxperpage) && $maxperpage != -1) {
unset($options[-1]);
foreach ($options as $val) {
if ($val > $maxperpage) {
unset($options[$val]);
}
}
}
$mform->addElement('select', 'perpage', get_string('assignmentsperpage', 'assign'), $options);
$options = array('' => get_string('filternone', 'assign'),
ASSIGN_FILTER_NOT_SUBMITTED => get_string('filternotsubmitted', 'assign'),
ASSIGN_FILTER_DRAFT => get_string('filterdraft', 'assign'),
ASSIGN_FILTER_SUBMITTED => get_string('filtersubmitted', 'assign'),
ASSIGN_FILTER_REQUIRE_GRADING => get_string('filterrequiregrading', 'assign'),
ASSIGN_FILTER_GRANTED_EXTENSION => get_string('filtergrantedextension', 'assign'));
if ($instance['submissionsenabled']) {
$mform->addElement('select', 'filter', get_string('filter', 'assign'), $options);
}
if (!empty($instance['markingallocationopt'])) {
$markingfilter = get_string('markerfilter', 'assign');
$mform->addElement('select', 'markerfilter', $markingfilter, $instance['markingallocationopt']);
}
if (!empty($instance['markingworkflowopt'])) {
$workflowfilter = get_string('workflowfilter', 'assign');
$mform->addElement('select', 'workflowfilter', $workflowfilter, $instance['markingworkflowopt']);
}
// Quickgrading.
if ($instance['showquickgrading']) {
$mform->addElement('checkbox', 'quickgrading', get_string('quickgrading', 'assign'));
$mform->addHelpButton('quickgrading', 'quickgrading', 'assign');
$mform->setDefault('quickgrading', $instance['quickgrading']);
}
// Show active/suspended user option.
if ($instance['showonlyactiveenrolopt']) {
$mform->addElement('checkbox', 'showonlyactiveenrol', get_string('showonlyactiveenrol', 'grades'));
$mform->addHelpButton('showonlyactiveenrol', 'showonlyactiveenrol', 'grades');
$mform->setDefault('showonlyactiveenrol', $instance['showonlyactiveenrol']);
}
// Place student downloads in seperate folders.
if ($instance['submissionsenabled']) {
$mform->addElement('checkbox', 'downloadasfolders', get_string('downloadasfolders', 'assign'));
$mform->addHelpButton('downloadasfolders', 'downloadasfolders', 'assign');
$mform->setDefault('downloadasfolders', $instance['downloadasfolders']);
}
// Hidden params.
$mform->addElement('hidden', 'contextid', $instance['contextid']);
$mform->setType('contextid', PARAM_INT);
$mform->addElement('hidden', 'id', $instance['cm']);
$mform->setType('id', PARAM_INT);
$mform->addElement('hidden', 'userid', $instance['userid']);
$mform->setType('userid', PARAM_INT);
$mform->addElement('hidden', 'action', 'saveoptions');
$mform->setType('action', PARAM_ALPHA);
// Buttons.
$this->add_action_buttons(false, get_string('updatetable', 'assign'));
}
}
debugging('This file is no longer required in Moodle 4.5+. Please do not include/require it.', DEBUG_DEVELOPER);
+2 -1
View File
@@ -331,7 +331,6 @@ $string['gradingdueduedatevalidation'] = 'Remind me to grade by date cannot be e
$string['gradingduefromdatevalidation'] = 'Remind me to grade by date cannot be earlier than the allow submissions from date.';
$string['gradechangessaveddetail'] = 'The changes to the grade and feedback were saved';
$string['gradingmethodpreview'] = 'Grading criteria';
$string['gradingoptions'] = 'Options';
$string['gradingstatus'] = 'Grading status';
$string['gradingstudent'] = 'Grading student';
$string['gradingsummary'] = 'Grading summary';
@@ -344,6 +343,7 @@ Note that this setting has no effect on the comments box on the grading page.';
$string['hideshow'] = 'Hide/Show';
$string['hiddenuser'] = 'Participant ';
$string['inactiveoverridehelp'] = '* This override is inactive because the user\'s access to the activity is restricted. This can be due to group or role assignments, other access restrictions, or the activity being hidden.';
$string['includesuspendedparticipants'] = 'Include suspended participants';
$string['indicator:cognitivedepth'] = 'Assignment cognitive';
$string['indicator:cognitivedepth_help'] = 'This indicator is based on the cognitive depth reached by the student in an assignment activity.';
$string['indicator:cognitivedepthdef'] = 'Assignment cognitive';
@@ -708,6 +708,7 @@ $string['attemptreopenmethod_none'] = 'Never';
$string['choosegradingaction'] = 'Grading action';
$string['downloadasfolders_help'] = 'Assignment submissions may be downloaded in folders. Each submission is then put in a separate folder, with the folder structure kept for any subfolders, and files are not renamed.';
$string['editaction'] = 'Actions...';
$string['gradingoptions'] = 'Options';
$string['groupoverridesdeleted'] = 'Group overrides deleted';
$string['saveallquickgradingchanges'] = 'Save all quick grading changes';
$string['updategrade'] = 'Update grade';
+1
View File
@@ -7,3 +7,4 @@ viewgrader,mod_assign
downloadasfolders_help,mod_assign
editaction,mod_assign
saveallquickgradingchanges,mod_assign
gradingoptions,mod_assign
+27 -105
View File
@@ -634,10 +634,6 @@ class assign {
} else if ($action == 'quickgrade') {
$message = $this->process_save_quick_grades();
$action = 'quickgradingresult';
} else if ($action == 'saveoptions') {
$this->process_save_grading_options();
$action = 'redirect';
$nextpageparams['action'] = 'grading';
} else if ($action == 'saveextension') {
$action = 'grantextension';
if ($this->process_save_extension($mform)) {
@@ -4480,8 +4476,6 @@ class assign {
protected function view_grading_table() {
global $USER, $CFG, $SESSION, $PAGE, $OUTPUT;
// Include grading options form.
require_once($CFG->dirroot . '/mod/assign/gradingoptionsform.php');
require_once($CFG->dirroot . '/mod/assign/quickgradingform.php');
$submittedfilter = optional_param('status', null, PARAM_ALPHA);
@@ -4515,7 +4509,6 @@ class assign {
$perpage = $this->get_assign_perpage();
$filter = get_user_preferences('assign_filter', '');
$markerfilter = get_user_preferences('assign_markerfilter', '');
// Retrieve the 'workflowfilter' parameter, or set it to null if not provided.
$workflowfilter = optional_param('workflowfilter', null, PARAM_ALPHA);
@@ -4525,53 +4518,32 @@ class assign {
set_user_preference('assign_workflowfilter', $workflowfilter);
}
// Retrieve the 'markingallocationfilter' parameter, or set it to null if not provided.
$markingallocationfilter = optional_param('markingallocationfilter', null, PARAM_ALPHANUMEXT);
// Check if the parameter is not null and if it exists in the list of valid marking allocation filters.
if ($markingallocationfilter !== null &&
array_key_exists($markingallocationfilter, $this->get_marking_allocation_filters())) {
// Save the valid 'markingallocationfilter' value as a user preference.
set_user_preference('assign_markerfilter', $markingallocationfilter);
}
// Retrieve the 'suspendedparticipantsfilter' parameter, or set it to null if not provided.
$suspendedparticipantsfilter = optional_param('suspendedparticipantsfilter', null, PARAM_BOOL);
if ($suspendedparticipantsfilter !== null &&
has_capability('moodle/course:viewsuspendedusers', $this->get_context())) {
// Save the 'suspendedparticipantsfilter' value as a user preference.
set_user_preference('grade_report_showonlyactiveenrol', !$suspendedparticipantsfilter);
}
$controller = $gradingmanager->get_active_controller();
$showquickgrading = empty($controller) && $this->can_grade();
$quickgrading = get_user_preferences('assign_quickgrading', false);
$showonlyactiveenrolopt = has_capability('moodle/course:viewsuspendedusers', $this->context);
$markingallocation = $this->get_instance()->markingworkflow &&
$this->get_instance()->markingallocation &&
has_capability('mod/assign:manageallocations', $this->context);
// Get markers to use in drop lists.
$markingallocationoptions = array();
if ($markingallocation) {
list($sort, $params) = users_order_by_sql('u');
// Only enrolled users could be assigned as potential markers.
$markers = get_enrolled_users($this->context, 'mod/assign:grade', 0, 'u.*', $sort);
$markingallocationoptions[''] = get_string('filternone', 'assign');
$markingallocationoptions[ASSIGN_MARKER_FILTER_NO_MARKER] = get_string('markerfilternomarker', 'assign');
$viewfullnames = has_capability('moodle/site:viewfullnames', $this->context);
foreach ($markers as $marker) {
$markingallocationoptions[$marker->id] = fullname($marker, $viewfullnames);
}
}
$markingworkflow = $this->get_instance()->markingworkflow;
// Get marking states to show in form.
$markingworkflowoptions = $this->get_marking_workflow_filters();
// Print options for changing the filter and changing the number of results per page.
$gradingoptionsformparams = [
'cm' => $cmid,
'contextid' => $this->context->id,
'userid' => $USER->id,
'markingworkflowopt' => $markingworkflowoptions,
'markingallocationopt' => $markingallocationoptions,
'showonlyactiveenrolopt' => $showonlyactiveenrolopt,
'showonlyactiveenrol' => $this->show_only_active_users(),
];
$classoptions = array('class'=>'gradingoptionsform');
$gradingoptionsform = new \mod_assign\form\grading_options_temp_form(null,
$gradingoptionsformparams,
'post',
'',
$classoptions);
$gradingoptionsdata = new stdClass();
$gradingoptionsdata->markerfilter = $markerfilter;
$gradingoptionsform->set_data($gradingoptionsdata);
$buttons = new \mod_assign\output\grading_actionmenu(cmid: $this->get_course_module()->id, assign: $this);
$actionformtext = $this->get_renderer()->render($buttons);
@@ -4639,11 +4611,6 @@ class assign {
$SESSION->mod_assign_useridlist[$this->get_useridlist_key()] = $useridlist;
}
$assignform = new assign_form('gradingoptionsform',
$gradingoptionsform,
'M.mod_assign.init_grading_options');
$o .= $this->get_renderer()->render($assignform);
$currentgroup = groups_get_activity_group($this->get_course_module(), true);
$users = array_keys($this->list_participants($currentgroup, true));
if (count($users) != 0 && $this->can_grade()) {
@@ -7375,63 +7342,18 @@ class assign {
/**
* Save grading options.
*
* @deprecated since Moodle 4.5
* @todo Final deprecation in Moodle 6.0. See MDL-82876.
* @return void
*/
#[\core\attribute\deprecated(
'null',
since: '4.5',
reason: 'It is no longer used.',
mdl: 'MDL-82681',
)]
protected function process_save_grading_options() {
global $USER, $CFG;
// Include grading options form.
require_once($CFG->dirroot . '/mod/assign/gradingoptionsform.php');
// Need submit permission to submit an assignment.
$this->require_view_grades();
require_sesskey();
if (!is_null($this->context)) {
$showonlyactiveenrolopt = has_capability('moodle/course:viewsuspendedusers', $this->context);
} else {
$showonlyactiveenrolopt = false;
}
$markingallocation = $this->get_instance()->markingworkflow &&
$this->get_instance()->markingallocation &&
has_capability('mod/assign:manageallocations', $this->context);
// Get markers to use in drop lists.
$markingallocationoptions = array();
if ($markingallocation) {
$markingallocationoptions[''] = get_string('filternone', 'assign');
$markingallocationoptions[ASSIGN_MARKER_FILTER_NO_MARKER] = get_string('markerfilternomarker', 'assign');
list($sort, $params) = users_order_by_sql('u');
// Only enrolled users could be assigned as potential markers.
$markers = get_enrolled_users($this->context, 'mod/assign:grade', 0, 'u.*', $sort);
foreach ($markers as $marker) {
$markingallocationoptions[$marker->id] = fullname($marker);
}
}
// Get marking states to show in form.
$markingworkflowoptions = $this->get_marking_workflow_filters();
$gradingoptionsparams = [
'cm' => $this->get_course_module()->id,
'contextid' => $this->context->id,
'userid' => $USER->id,
'markingworkflowopt' => $markingworkflowoptions,
'markingallocationopt' => $markingallocationoptions,
'showonlyactiveenrolopt' => $showonlyactiveenrolopt,
'showonlyactiveenrol' => $this->show_only_active_users(),
];
$mform = new mod_assign\form\grading_options_temp_form(null, $gradingoptionsparams);
if ($formdata = $mform->get_data()) {
if (isset($formdata->markerfilter)) {
set_user_preference('assign_markerfilter', $formdata->markerfilter);
}
if (!empty($showonlyactiveenrolopt)) {
$showonlyactiveenrol = isset($formdata->showonlyactiveenrol);
set_user_preference('grade_report_showonlyactiveenrol', $showonlyactiveenrol);
$this->showonlyactiveenrol = $showonlyactiveenrol;
}
}
\core\deprecation::emit_deprecation_if_present([self::class, __FUNCTION__]);
}
/**
@@ -9612,7 +9534,7 @@ class assign {
}
return $result;
}
return $markingworkflowoptions;
return $markingallocationoptions;
}
/**
-23
View File
@@ -78,29 +78,6 @@ M.mod_assign.init_grading_table = function(Y) {
});
};
M.mod_assign.init_grading_options = function(Y) {
Y.use('node', function(Y) {
var markerfilterelement = Y.one('#id_markerfilter');
if (markerfilterelement) {
markerfilterelement.on('change', function(e) {
Y.one('form.gradingoptionsform').submit();
});
}
var showonlyactiveenrolelement = Y.one('#id_showonlyactiveenrol');
if (showonlyactiveenrolelement) {
showonlyactiveenrolelement.on('change', function(e) {
Y.one('form.gradingoptionsform').submit();
});
}
var downloadasfolderselement = Y.one('#id_downloadasfolders');
if (downloadasfolderselement) {
downloadasfolderselement.on('change', function(e) {
Y.one('form.gradingoptionsform').submit();
});
}
});
};
M.mod_assign.init_plugin_summary = function(Y, subtype, type, submissionid) {
var suffix = subtype + '_' + type + '_' + submissionid;
var classname = 'contract_' + suffix;
-4
View File
@@ -43,10 +43,6 @@
font-weight: 900;
}
.path-mod-assign.jsenabled .gradingoptionsform [type=submit] {
display: none;
}
.path-mod-assign.jsenabled .gradingtable .c1 select {
display: none;
}
@@ -25,6 +25,13 @@
* key - The key of the workflow filter option
* name - The name of the workflow filter option
* active - Whether the workflow filter option is currently active
* markingallocation
* markingallocationoptions - Array of marking allocation filter options
* key - The key of the marking allocation filter option
* name - The name of the marking allocation filter option
* active - Whether the marking allocation filter option is currently active
* suspendedparticipants
* active - Whether the suspended participants filter is currently active
Example context (json):
{
@@ -41,6 +48,18 @@
"active": true
}
]
},
"markingallocation": {
"markingallocationoptions": [
{
"key": "-1",
"name": "No marker",
"active": true
}
]
},
"suspendedparticipants": {
"active": true
}
}
]
@@ -63,6 +82,25 @@
</select>
</div>
{{/markingworkflow}}
{{#markingallocation}}
<div class="row m-0 pb-3">
<label class="w-100" for="filter-marking-allocation-{{uniqid}}">
{{#str}}marker, mod_assign{{/str}}
</label>
<select name="markingallocationfilter" id="filter-marking-allocation-{{uniqid}}" class="custom-select w-100">
{{#markingallocationoptions}}
<option value="{{key}}" {{#active}}selected="selected"{{/active}}>{{name}}</option>
{{/markingallocationoptions}}
</select>
</div>
{{/markingallocation}}
{{#suspendedparticipants}}
<div class="row m-0 pb-3 pt-2 mx-1 align-items-center">
<input type="hidden" name="suspendedparticipantsfilter" value="0" {{#active}}disabled{{/active}}>
<input type="checkbox" id="filter-suspended-participants-{{uniqid}}" name="suspendedparticipantsfilter" value="1" {{#active}}checked{{/active}}>
<label for="filter-suspended-participants-{{uniqid}}" class='m-0' >{{#str}} includesuspendedparticipants, mod_assign {{/str}}</label>
</div>
{{/suspendedparticipants}}
{{/filters}}
<div class="d-flex flex-row justify-content-end align-items-center pt-2">
<a href="#" class="pull-right mx-3 text-decoration-none text-dark" data-action="close">{{#str}}closebuttontitle{{/str}}</a>
+146 -38
View File
@@ -4,48 +4,156 @@ Feature: In an assignment, teachers can filter displayed submissions by assigned
As a teacher
I need to view submissions allocated to markers.
Background:
Given the following "courses" exist:
| fullname | shortname | category |
| Course 1 | C1 | 0 |
And the following "users" exist:
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@example.com |
| student1 | Student | 1 | student1@example.com |
| student2 | Student | 2 | student2@example.com |
| marker1 | Marker | 1 | marker1@example.com |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | editingteacher |
| student1 | C1 | student |
| student2 | C1 | student |
| marker1 | C1 | teacher |
And the following "activity" exists:
| activity | assign |
| course | C1 |
| name | Test assignment name |
@javascript
Scenario: The marker filter is available only when marking workflow and marking allocation is enabled in the assignment
Given I am on the "Test assignment name" Activity page logged in as teacher1
And I navigate to "Submissions" in current page administration
And I change window size to "large"
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And "Marker" "select" should not exist in the ".extrafilters .dropdown-menu" "css_element"
And I am on the "Test assignment name" "assign activity editing" page
And I expand all fieldsets
When I set the field "Use marking workflow" to "Yes"
And I set the field "Use marking allocation" to "Yes"
And I press "Save and display"
And I navigate to "Submissions" in current page administration
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
Then "Marker" "select" should exist in the ".extrafilters .dropdown-menu" "css_element"
And the field "Marker" matches value "No filter"
And the "Marker" select box should contain "No filter"
And the "Marker" select box should contain "No marker"
And the "Marker" select box should contain "Teacher 1"
And the "Marker" select box should contain "Marker 1"
And the "Marker" select box should not contain "Student 1"
And the "Marker" select box should not contain "Student 2"
@javascript
Scenario: Allocate markers to submissions and filter by marker
Given the following "courses" exist:
| fullname | shortname | category | groupmode |
| Course 1 | C1 | 0 | 1 |
And the following "users" exist:
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@example.com |
| student1 | Student | 1 | student1@example.com |
| student2 | Student | 2 | student2@example.com |
| marker1 | Marker | 1 | marker1@example.com |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | editingteacher |
| student1 | C1 | student |
| student2 | C1 | student |
| marker1 | C1 | teacher |
And the following "activity" exists:
| activity | assign |
| course | C1 |
| name | Test assignment name |
| intro | Submit your online text |
| submissiondrafts | 0 |
| assignsubmission_onlinetext_enabled | 1 |
| assignsubmission_file_enabled | 0 |
| markingworkflow | 1 |
| markingallocation | 1 |
And I am on the "Test assignment name" Activity page logged in as teacher1
Given I am on the "Test assignment name" "assign activity editing" page logged in as teacher1
And I expand all fieldsets
And I set the field "Use marking workflow" to "Yes"
And I set the field "Use marking allocation" to "Yes"
And I press "Save and display"
And I am on the "Test assignment name" "assign activity" page
And I go to "Student 1" "Test assignment name" activity advanced grading page
And I set the field "allocatedmarker" to "Marker 1"
And I set the field "Notify student" to "0"
And I press "Save changes"
And I click on "Edit settings" "link"
When I am on the "Test assignment name" Activity page
And I am on the "Test assignment name" Activity page
And I navigate to "Submissions" in current page administration
And I set the field "markerfilter" to "Marker 1"
Then I should see "Student 1"
And I should not see "Student 2"
And I set the field "markerfilter" to "No marker"
And I should not see "Student 1"
And I should see "Student 2"
And I set the field "markerfilter" to "No filter"
And I should see "Student 1"
And I should see "Student 2"
And I change window size to "large"
# Set the Marker filter to 'Marker 1'.
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And I set the field "Marker" in the ".extrafilters .dropdown-menu" "css_element" to "Marker 1"
When I click on "Apply" "button" in the ".extrafilters .dropdown-menu" "css_element"
# Ensure only Student 1 is now displayed in the submissions table.
Then the following should exist in the "submissions" table:
| -2- |
| Student 1 |
And the following should not exist in the "submissions" table:
| -2- |
| Student 2 |
# Ensure the badge indicating the number of applied filters is present.
And ".badge" "css_element" should exist in the ".extrafilters .dropdown-toggle" "css_element"
And I should see "+1" in the ".extrafilters .badge" "css_element"
# Ensure the filter remains applied when navigating away from and returning to the assignment submissions page.
And I am on the "Test assignment name" Activity page
And I navigate to "Submissions" in current page administration
And the following should exist in the "submissions" table:
| -2- |
| Student 1 |
And the following should not exist in the "submissions" table:
| -2- |
| Student 2 |
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And the field "Marker" matches value "Marker 1"
# Ensure the filter is not applied unless the 'Apply' button is pressed.
And I set the field "Marker" in the ".extrafilters .dropdown-menu" "css_element" to "No marker"
And I click on "Close" "link" in the ".extrafilters .dropdown-menu" "css_element"
And the following should exist in the "submissions" table:
| -2- |
| Student 1 |
And the following should not exist in the "submissions" table:
| -2- |
| Student 2 |
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And the field "Marker" matches value "Marker 1"
# Set the Marker filter to 'No marker'.
And I set the field "Marker" in the ".extrafilters .dropdown-menu" "css_element" to "No marker"
And I click on "Apply" "button" in the ".extrafilters .dropdown-menu" "css_element"
# Ensure only Student 2 is now displayed in the submissions table.
And the following should exist in the "submissions" table:
| -2- |
| Student 2 |
And the following should not exist in the "submissions" table:
| -2- |
| Student 1 |
# Set the Marker filter to 'No filter'.
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And I set the field "Marker" in the ".extrafilters .dropdown-menu" "css_element" to "No filter"
And I click on "Apply" "button" in the ".extrafilters .dropdown-menu" "css_element"
# Ensure all student are now displayed in the submissions table.
And the following should exist in the "submissions" table:
| -2- |
| Student 1 |
| Student 2 |
@javascript
Scenario: The applied marker filter can be reset using the 'Clear all' option
Given I am on the "Test assignment name" "assign activity editing" page logged in as teacher1
And I expand all fieldsets
And I set the field "Use marking workflow" to "Yes"
And I set the field "Use marking allocation" to "Yes"
And I press "Save and display"
And I am on the "Test assignment name" "assign activity" page
And I change window size to "large"
And I go to "Student 1" "Test assignment name" activity advanced grading page
# Allocate Marker 1 as the marker of Student 1.
And I set the field "allocatedmarker" to "Marker 1"
And I set the field "Notify student" to "0"
And I press "Save changes"
And I follow "View all submissions"
# Ensure the 'Clear all' option is not available until the marker filter has been applied.
And "Clear all" "link" should not exist in the ".tertiary-navigation" "css_element"
# Set the Marker filter to 'Marker 1'.
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And I set the field "Marker" in the ".extrafilters .dropdown-menu" "css_element" to "Marker 1"
And I click on "Apply" "button" in the ".extrafilters .dropdown-menu" "css_element"
# Ensure only Student 1 is now displayed in the submissions table.
And the following should exist in the "submissions" table:
| -2- |
| Student 1 |
And the following should not exist in the "submissions" table:
| -2- |
| Student 2 |
# Ensure the 'Clear all' option is now available.
And "Clear all" "link" should exist in the ".tertiary-navigation" "css_element"
# Ensure the marker filter is reset when the 'Clear All' option is triggered.
When I click on "Clear all" "link" in the ".tertiary-navigation" "css_element"
Then the following should exist in the "submissions" table:
| -2- |
| Student 1 |
| Student 2 |
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And the field "Marker" matches value "No filter"
@@ -30,15 +30,13 @@ Feature: In an assignment, teachers can filter displayed submissions by marking
Given I am on the "Test assignment" Activity page logged in as teacher1
And I navigate to "Submissions" in current page administration
And I change window size to "large"
And "Advanced" "button" should not exist in the ".tertiary-navigation" "css_element"
When I am on the "Test assignment" "assign activity editing" page
And I expand all fieldsets
And I set the field "Use marking workflow" to "Yes"
And I press "Save and display"
And I navigate to "Submissions" in current page administration
Then "Advanced" "button" should exist in the ".tertiary-navigation" "css_element"
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And "Marking state" "select" should exist in the ".extrafilters .dropdown-menu" "css_element"
Then "Marking state" "select" should exist in the ".extrafilters .dropdown-menu" "css_element"
And the field "Marking state" matches value "No filter"
And the "Marking state" select box should contain "No filter"
And the "Marking state" select box should contain "Not marked"
@@ -140,7 +138,7 @@ Feature: In an assignment, teachers can filter displayed submissions by marking
And I set the field "Marking state" in the ".extrafilters .dropdown-menu" "css_element" to "In marking"
And I click on "Apply" "button" in the ".extrafilters .dropdown-menu" "css_element"
# Ensure only Student 2 is now displayed in the submissions table.
Then the following should exist in the "submissions" table:
And the following should exist in the "submissions" table:
| -2- |
| Student 2 |
And the following should not exist in the "submissions" table:
@@ -0,0 +1,128 @@
@mod @mod_assign
Feature: In an assignment, teachers can include or exclude submissions from suspended participants
In order to manage submissions more easily
As a teacher
I need to be able to include or exclude submissions from suspended participants.
Background:
Given the following "courses" exist:
| fullname | shortname | category |
| Course 1 | C1 | 0 |
And the following "users" exist:
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@example.com |
| student1 | Student | 1 | student1@example.com |
| student2 | Student | 2 | student2@example.com |
And the following "course enrolments" exist:
| user | course | role | status |
| teacher1 | C1 | editingteacher | 0 |
| student1 | C1 | student | 0 |
| student2 | C1 | student | 1 |
And the following "activity" exists:
| activity | assign |
| course | C1 |
| name | Test assignment name |
@javascript
Scenario: The suspended participants filter is available only when the teacher has the capability to view suspended participants
Given the following "permission overrides" exist:
| capability | permission | role | contextlevel | reference |
| moodle/course:viewsuspendedusers | Prevent | editingteacher | Course | C1 |
And I am on the "Test assignment name" Activity page logged in as teacher1
And I navigate to "Submissions" in current page administration
When I change window size to "large"
# Ensure the Advanced filters component is not available. This validates that the Suspended participants filer is
# not available as well since it's part of this component.
Then "Advanced" "button" should not exist in the ".tertiary-navigation" "css_element"
And the following "permission overrides" exist:
| capability | permission | role | contextlevel | reference |
| moodle/course:viewsuspendedusers | Allow | editingteacher | Course | C1 |
And I reload the page
And "Advanced" "button" should exist in the ".tertiary-navigation" "css_element"
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And "Include suspended participants" "checkbox" should exist in the ".extrafilters .dropdown-menu" "css_element"
And the field "Include suspended participants" matches value ""
@javascript
Scenario: Teacher can include or exclude submissions from suspended participants
Given I am on the "Test assignment name" Activity page logged in as teacher1
And I navigate to "Submissions" in current page administration
And I change window size to "large"
And the following should exist in the "submissions" table:
| -2- |
| Student 1 |
And the following should not exist in the "submissions" table:
| -2- |
| Student 2 |
# Set to include submissions from suspended participants.
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
When I click on "Include suspended participants" "checkbox" in the ".extrafilters .dropdown-menu" "css_element"
And I click on "Apply" "button" in the ".extrafilters .dropdown-menu" "css_element"
# Ensure that the suspended Student 2 is now also displayed in the submissions table.
Then the following should exist in the "submissions" table:
| -2- |
| Student 1 |
| Student 2 |
# Ensure the badge indicating the number of applied filters is present.
And ".badge" "css_element" should exist in the ".extrafilters .dropdown-toggle" "css_element"
And I should see "+1" in the ".extrafilters .badge" "css_element"
# Ensure the filter remains applied when navigating away from and returning to the assignment submissions page.
And I am on the "Test assignment name" Activity page
And I navigate to "Submissions" in current page administration
And the following should exist in the "submissions" table:
| -2- |
| Student 1 |
| Student 2 |
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And the field "Include suspended participants" matches value "1"
# Ensure the filter is not applied unless the 'Apply' button is pressed.
And I click on "Include suspended participants" "checkbox" in the ".extrafilters .dropdown-menu" "css_element"
And the field "Include suspended participants" matches value ""
And I click on "Close" "link" in the ".extrafilters .dropdown-menu" "css_element"
And the following should exist in the "submissions" table:
| -2- |
| Student 1 |
| Student 2 |
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And the field "Include suspended participants" matches value "1"
# Set to exclude submissions from suspended participants.
And I click on "Include suspended participants" "checkbox" in the ".extrafilters .dropdown-menu" "css_element"
And the field "Include suspended participants" matches value ""
And I click on "Apply" "button" in the ".extrafilters .dropdown-menu" "css_element"
# Ensure only Student 1 is now displayed in the submissions table.
And the following should exist in the "submissions" table:
| -2- |
| Student 1 |
And the following should not exist in the "submissions" table:
| -2- |
| Student 2 |
@javascript
Scenario: The applied suspended participants filter can be reset using the 'Clear all' option
Given I am on the "Test assignment name" Activity page logged in as teacher1
And I navigate to "Submissions" in current page administration
And I change window size to "large"
# Ensure the 'Clear all' option is not available until the suspended participants filter has been applied.
And "Clear all" "link" should not exist in the ".tertiary-navigation" "css_element"
# Set to include submissions from suspended participants.
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And I click on "Include suspended participants" "checkbox" in the ".extrafilters .dropdown-menu" "css_element"
And the field "Include suspended participants" matches value "1"
And I click on "Apply" "button" in the ".extrafilters .dropdown-menu" "css_element"
# Ensure that the suspended Student 2 is now also displayed in the submissions table.
And the following should exist in the "submissions" table:
| -2- |
| Student 1 |
| Student 2 |
# Ensure the 'Clear all' option is now available.
And "Clear all" "link" should exist in the ".tertiary-navigation" "css_element"
# Ensure the marker filter is reset when the 'Clear All' option is triggered.
When I click on "Clear all" "link" in the ".tertiary-navigation" "css_element"
Then the following should exist in the "submissions" table:
| -2- |
| Student 1 |
And the following should not exist in the "submissions" table:
| -2- |
| Student 2 |
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And the field "Include suspended participants" matches value ""
@@ -47,8 +47,8 @@ Feature: In an assignment, teachers can change filters in the grading app
And I am on the "Test assignment name &" Activity page
And I navigate to "Submissions" in current page administration
And I set the field "Status" to "Not submitted"
And I set the field "markerfilter" to "Marker 1"
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And I set the field "Marker" in the ".extrafilters .dropdown-menu" "css_element" to "Marker 1"
And I set the field "Marking state" in the ".extrafilters .dropdown-menu" "css_element" to "In marking"
And I click on "Apply" "button" in the ".extrafilters .dropdown-menu" "css_element"
And I change window size to "large"
@@ -76,6 +76,6 @@ Feature: In an assignment, teachers can change filters in the grading app
And I set the field "workflowfilter" to "In marking"
And I click on "View all submissions" "link"
Then the field "Status" matches value "Not submitted"
And the field "markerfilter" matches value "Marker 1"
And I click on "Advanced" "button" in the ".tertiary-navigation" "css_element"
And the field "Marker" matches value "Marker 1"
And the field "Marking state" matches value "In marking"