Merge branch 'MDL-82681-main-3' of https://github.com/mihailges/moodle
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -7,3 +7,4 @@ viewgrader,mod_assign
|
||||
downloadasfolders_help,mod_assign
|
||||
editaction,mod_assign
|
||||
saveallquickgradingchanges,mod_assign
|
||||
gradingoptions,mod_assign
|
||||
|
||||
+27
-105
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user