diff --git a/grade/grading/form/rubric/edit_form.php b/grade/grading/form/rubric/edit_form.php index 94e329a7406..67aaf11174c 100644 --- a/grade/grading/form/rubric/edit_form.php +++ b/grade/grading/form/rubric/edit_form.php @@ -50,8 +50,8 @@ class gradingform_rubric_editrubric extends moodleform { $form->setType('returnurl', PARAM_LOCALURL); // name - $form->addElement('text', 'name', get_string('name', 'gradingform_rubric'), array('size'=>52)); - $form->addRule('name', get_string('required'), 'required'); + $form->addElement('text', 'name', get_string('name', 'gradingform_rubric'), array('size' => 52, 'aria-required' => 'true')); + $form->addRule('name', get_string('required'), 'required', null, 'client'); $form->setType('name', PARAM_TEXT); // description diff --git a/grade/grading/form/rubric/js/rubric.js b/grade/grading/form/rubric/js/rubric.js index d44639b4ff1..dbed9a83e35 100644 --- a/grade/grading/form/rubric/js/rubric.js +++ b/grade/grading/form/rubric/js/rubric.js @@ -5,6 +5,10 @@ M.gradingform_rubric = {}; */ M.gradingform_rubric.init = function(Y, options) { Y.on('click', M.gradingform_rubric.levelclick, '#rubric-'+options.name+' .level', null, Y, options.name); + // Capture also space and enter keypress. + Y.on('key', M.gradingform_rubric.levelclick, '#rubric-' + options.name + ' .level', 'space', Y, options.name); + Y.on('key', M.gradingform_rubric.levelclick, '#rubric-' + options.name + ' .level', 'enter', Y, options.name); + Y.all('#rubric-'+options.name+' .radio').setStyle('display', 'none') Y.all('#rubric-'+options.name+' .level').each(function (node) { if (node.one('input[type=radio]').get('checked')) { @@ -19,12 +23,19 @@ M.gradingform_rubric.levelclick = function(e, Y, name) { if (!el) return e.preventDefault(); el.siblings().removeClass('checked'); + + // Set aria-checked attribute for siblings to false. + el.siblings().setAttribute('aria-checked', 'false'); chb = el.one('input[type=radio]') if (!chb.get('checked')) { chb.set('checked', true) el.addClass('checked') + // Set aria-checked attribute to true if checked. + el.setAttribute('aria-checked', 'true'); } else { el.removeClass('checked'); + // Set aria-checked attribute to false if unchecked. + el.setAttribute('aria-checked', 'false'); el.get('parentNode').all('input[type=radio]').set('checked', false) } } diff --git a/grade/grading/form/rubric/js/rubriceditor.js b/grade/grading/form/rubric/js/rubriceditor.js index 5304b826625..7b84e2979e2 100644 --- a/grade/grading/form/rubric/js/rubriceditor.js +++ b/grade/grading/form/rubric/js/rubriceditor.js @@ -143,9 +143,11 @@ M.gradingform_rubriceditor.buttonclick = function(e, confirmed) { elements_str = '#rubric-'+name+' .criterion' } // prepare the id of the next inserted level or criterion + var newlevid = 0; + var newid = 0; if (action == 'addcriterion' || action == 'addlevel' || action == 'duplicate' ) { - var newid = M.gradingform_rubriceditor.calculatenewid('#rubric-'+name+' .criterion') - var newlevid = M.gradingform_rubriceditor.calculatenewid('#rubric-'+name+' .level') + newid = M.gradingform_rubriceditor.calculatenewid('#rubric-'+name+' .criterion'); + newlevid = M.gradingform_rubriceditor.calculatenewid('#rubric-'+name+' .level'); } var dialog_options = { 'scope' : this, @@ -164,7 +166,10 @@ M.gradingform_rubriceditor.buttonclick = function(e, confirmed) { for (levidx;levidx<3;levidx++) levelsscores[levidx] = parseFloat(levelsscores[levidx-1])+1 var levelsstr = ''; for (levidx=0;levidxget_current_instance(); if ($currentinstance && $currentinstance->get_status() == gradingform_instance::INSTANCE_STATUS_NEEDUPDATE) { - $html .= html_writer::tag('div', get_string('needregrademessage', 'gradingform_rubric'), array('class' => 'gradingform_rubric-regrade')); + $html .= html_writer::div(get_string('needregrademessage', 'gradingform_rubric'), 'gradingform_rubric-regrade', + array('role' => 'alert')); } $haschanges = false; if ($currentinstance) { diff --git a/grade/grading/form/rubric/renderer.php b/grade/grading/form/rubric/renderer.php index c539535f652..6ea8a4b27a5 100644 --- a/grade/grading/form/rubric/renderer.php +++ b/grade/grading/form/rubric/renderer.php @@ -74,12 +74,22 @@ class gradingform_rubric_renderer extends plugin_renderer_base { foreach (array('moveup', 'delete', 'movedown', 'duplicate') as $key) { $value = get_string('criterion'.$key, 'gradingform_rubric'); $button = html_writer::empty_tag('input', array('type' => 'submit', 'name' => '{NAME}[criteria][{CRITERION-id}]['.$key.']', - 'id' => '{NAME}-criteria-{CRITERION-id}-'.$key, 'value' => $value, 'title' => $value, 'tabindex' => -1)); + 'id' => '{NAME}-criteria-{CRITERION-id}-'.$key, 'value' => $value)); $criteriontemplate .= html_writer::tag('div', $button, array('class' => $key)); } + $criteriontemplate .= html_writer::empty_tag('input', array('type' => 'hidden', + 'name' => '{NAME}[criteria][{CRITERION-id}][sortorder]', + 'value' => $criterion['sortorder'])); $criteriontemplate .= html_writer::end_tag('td'); // .controls - $criteriontemplate .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => '{NAME}[criteria][{CRITERION-id}][sortorder]', 'value' => $criterion['sortorder'])); - $description = html_writer::tag('textarea', s($criterion['description']), array('name' => '{NAME}[criteria][{CRITERION-id}][description]', 'cols' => '10', 'rows' => '5')); + + // Criterion description text area. + $descriptiontextareaparams = array( + 'name' => '{NAME}[criteria][{CRITERION-id}][description]', + 'id' => '{NAME}-criteria-{CRITERION-id}-description', + 'aria-label' => get_string('criterion', 'gradingform_rubric', ''), + 'cols' => '10', 'rows' => '5' + ); + $description = html_writer::tag('textarea', s($criterion['description']), $descriptiontextareaparams); } else { if ($mode == gradingform_rubric_controller::DISPLAY_EDIT_FROZEN) { $criteriontemplate .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => '{NAME}[criteria][{CRITERION-id}][sortorder]', 'value' => $criterion['sortorder'])); @@ -91,8 +101,35 @@ class gradingform_rubric_renderer extends plugin_renderer_base { if (isset($criterion['error_description'])) { $descriptionclass .= ' error'; } - $criteriontemplate .= html_writer::tag('td', $description, array('class' => $descriptionclass, 'id' => '{NAME}-criteria-{CRITERION-id}-description')); - $levelsstrtable = html_writer::tag('table', html_writer::tag('tr', $levelsstr, array('id' => '{NAME}-criteria-{CRITERION-id}-levels'))); + + // Description cell params. + $descriptiontdparams = array( + 'class' => $descriptionclass, + 'id' => '{NAME}-criteria-{CRITERION-id}-description-cell' + ); + if ($mode != gradingform_rubric_controller::DISPLAY_EDIT_FULL && + $mode != gradingform_rubric_controller::DISPLAY_EDIT_FROZEN) { + // Set description's cell as tab-focusable. + $descriptiontdparams['tabindex'] = '0'; + // Set label for the criterion cell. + $descriptiontdparams['aria-label'] = get_string('criterion', 'gradingform_rubric', s($criterion['description'])); + } + + // Description cell. + $criteriontemplate .= html_writer::tag('td', $description, $descriptiontdparams); + + // Levels table. + $levelsrowparams = array('id' => '{NAME}-criteria-{CRITERION-id}-levels'); + if ($mode != gradingform_rubric_controller::DISPLAY_EDIT_FULL) { + $levelsrowparams['role'] = 'radiogroup'; + } + $levelsrow = html_writer::tag('tr', $levelsstr, $levelsrowparams); + + $levelstableparams = array( + 'id' => '{NAME}-criteria-{CRITERION-id}-levels-table', + 'aria-label' => get_string('levelsgroup', 'gradingform_rubric') + ); + $levelsstrtable = html_writer::tag('table', $levelsrow, $levelstableparams); $levelsclass = 'levels'; if (isset($criterion['error_levels'])) { $levelsclass .= ' error'; @@ -101,7 +138,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base { if ($mode == gradingform_rubric_controller::DISPLAY_EDIT_FULL) { $value = get_string('criterionaddlevel', 'gradingform_rubric'); $button = html_writer::empty_tag('input', array('type' => 'submit', 'name' => '{NAME}[criteria][{CRITERION-id}][levels][addlevel]', - 'id' => '{NAME}-criteria-{CRITERION-id}-levels-addlevel', 'value' => $value, 'title' => $value)); + 'id' => '{NAME}-criteria-{CRITERION-id}-levels-addlevel', 'value' => $value)); $criteriontemplate .= html_writer::tag('td', $button, array('class' => 'addlevel')); } $displayremark = ($options['enableremarks'] && ($mode != gradingform_rubric_controller::DISPLAY_VIEW || $options['showremarksstudent'])); @@ -110,13 +147,34 @@ class gradingform_rubric_renderer extends plugin_renderer_base { if (isset($value['remark'])) { $currentremark = $value['remark']; } + + // Label for criterion remark. + $remarkinfo = new stdClass(); + $remarkinfo->description = s($criterion['description']); + $remarkinfo->remark = $currentremark; + $remarklabeltext = get_string('criterionremark', 'gradingform_rubric', $remarkinfo); + if ($mode == gradingform_rubric_controller::DISPLAY_EVAL) { - $input = html_writer::tag('textarea', s($currentremark), array('name' => '{NAME}[criteria][{CRITERION-id}][remark]', 'cols' => '10', 'rows' => '5')); + // HTML parameters for remarks text area. + $remarkparams = array( + 'name' => '{NAME}[criteria][{CRITERION-id}][remark]', + 'id' => '{NAME}-criteria-{CRITERION-id}-remark', + 'cols' => '10', 'rows' => '5', + 'aria-label' => $remarklabeltext + ); + $input = html_writer::tag('textarea', s($currentremark), $remarkparams); $criteriontemplate .= html_writer::tag('td', $input, array('class' => 'remark')); } else if ($mode == gradingform_rubric_controller::DISPLAY_EVAL_FROZEN) { $criteriontemplate .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => '{NAME}[criteria][{CRITERION-id}][remark]', 'value' => $currentremark)); }else if ($mode == gradingform_rubric_controller::DISPLAY_REVIEW || $mode == gradingform_rubric_controller::DISPLAY_VIEW) { - $criteriontemplate .= html_writer::tag('td', s($currentremark), array('class' => 'remark')); + // HTML parameters for remarks cell. + $remarkparams = array( + 'class' => 'remark', + 'tabindex' => '0', + 'id' => '{NAME}-criteria-{CRITERION-id}-remark', + 'aria-label' => $remarklabeltext + ); + $criteriontemplate .= html_writer::tag('td', s($currentremark), $remarkparams); } } $criteriontemplate .= html_writer::end_tag('tr'); // .criterion @@ -153,7 +211,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base { if (!isset($level['id'])) { $level = array('id' => '{LEVEL-id}', 'definition' => '{LEVEL-definition}', 'score' => '{LEVEL-score}', 'class' => '{LEVEL-class}', 'checked' => false); } else { - foreach (array('score', 'definition', 'class', 'checked') as $key) { + foreach (array('score', 'definition', 'class', 'checked', 'index') as $key) { // set missing array elements to empty strings to avoid warnings if (!array_key_exists($key, $level)) { $level[$key] = ''; @@ -161,17 +219,37 @@ class gradingform_rubric_renderer extends plugin_renderer_base { } } + // Get level index. + $levelindex = isset($level['index']) ? $level['index'] : '{LEVEL-index}'; + // Template for one level within one criterion - $tdattributes = array('id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}', 'class' => 'level'. $level['class']); + $tdattributes = array( + 'id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}', + 'class' => 'level' . $level['class'] + ); if (isset($level['tdwidth'])) { $tdattributes['width'] = round($level['tdwidth']).'%'; } - $leveltemplate = html_writer::start_tag('td', $tdattributes); - $leveltemplate .= html_writer::start_tag('div', array('class' => 'level-wrapper')); + + $leveltemplate = html_writer::start_tag('div', array('class' => 'level-wrapper')); if ($mode == gradingform_rubric_controller::DISPLAY_EDIT_FULL) { - $definition = html_writer::tag('textarea', s($level['definition']), array('name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][definition]', 'cols' => '10', 'rows' => '4')); - $score = html_writer::label(get_string('criterionempty', 'gradingform_rubric'), '{NAME}criteria{CRITERION-id}levels{LEVEL-id}', false, array('class' => 'accesshide')); - $score .= html_writer::empty_tag('input', array('type' => 'text','id' => '{NAME}criteria{CRITERION-id}levels{LEVEL-id}', 'name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][score]', 'size' => '3', 'value' => $level['score'])); + $definitionparams = array( + 'id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}-definition', + 'name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][definition]', + 'aria-label' => get_string('leveldefinition', 'gradingform_rubric', $levelindex), + 'cols' => '10', 'rows' => '4' + ); + $definition = html_writer::tag('textarea', s($level['definition']), $definitionparams); + + $scoreparams = array( + 'type' => 'text', + 'id' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][score]', + 'name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][score]', + 'aria-label' => get_string('scoreinputforlevel', 'gradingform_rubric', $levelindex), + 'size' => '3', + 'value' => $level['score'] + ); + $score = html_writer::empty_tag('input', $scoreparams); } else { if ($mode == gradingform_rubric_controller::DISPLAY_EDIT_FROZEN) { $leveltemplate .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][definition]', 'value' => $level['definition'])); @@ -181,19 +259,58 @@ class gradingform_rubric_renderer extends plugin_renderer_base { $score = $level['score']; } if ($mode == gradingform_rubric_controller::DISPLAY_EVAL) { - $input = html_writer::empty_tag('input', array('type' => 'radio', 'name' => '{NAME}[criteria][{CRITERION-id}][levelid]', 'value' => $level['id']) + - ($level['checked'] ? array('checked' => 'checked') : array())); - $leveltemplate .= html_writer::tag('div', $input, array('class' => 'radio')); + $levelradioparams = array( + 'type' => 'radio', + 'id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}-definition', + 'name' => '{NAME}[criteria][{CRITERION-id}][levelid]', + 'value' => $level['id'] + ); + if ($level['checked']) { + $levelradioparams['checked'] = 'checked'; + } + $input = html_writer::empty_tag('input', $levelradioparams); + $leveltemplate .= html_writer::div($input, 'radio'); } if ($mode == gradingform_rubric_controller::DISPLAY_EVAL_FROZEN && $level['checked']) { - $leveltemplate .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => '{NAME}[criteria][{CRITERION-id}][levelid]', 'value' => $level['id'])); + $leveltemplate .= html_writer::empty_tag('input', + array( + 'type' => 'hidden', + 'name' => '{NAME}[criteria][{CRITERION-id}][levelid]', + 'value' => $level['id'] + ) + ); } $score = html_writer::tag('span', $score, array('id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}-score', 'class' => 'scorevalue')); $definitionclass = 'definition'; if (isset($level['error_definition'])) { $definitionclass .= ' error'; } - $leveltemplate .= html_writer::tag('div', $definition, array('class' => $definitionclass, 'id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}-definition')); + + if ($mode != gradingform_rubric_controller::DISPLAY_EDIT_FULL && + $mode != gradingform_rubric_controller::DISPLAY_EDIT_FROZEN) { + + $tdattributes['tabindex'] = '0'; + $levelinfo = new stdClass(); + $levelinfo->definition = s($level['definition']); + $levelinfo->score = $level['score']; + $tdattributes['aria-label'] = get_string('level', 'gradingform_rubric', $levelinfo); + + if ($mode != gradingform_rubric_controller::DISPLAY_PREVIEW && + $mode != gradingform_rubric_controller::DISPLAY_PREVIEW_GRADED) { + // Add role of radio button to level cell if not in edit and preview mode. + $tdattributes['role'] = 'radio'; + if ($level['checked']) { + $tdattributes['aria-checked'] = 'true'; + } else { + $tdattributes['aria-checked'] = 'false'; + } + } + } + + $leveltemplateparams = array( + 'id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}-definition-container' + ); + $leveltemplate .= html_writer::div($definition, $definitionclass, $leveltemplateparams); $displayscore = true; if (!$options['showscoreteacher'] && in_array($mode, array(gradingform_rubric_controller::DISPLAY_EVAL, gradingform_rubric_controller::DISPLAY_EVAL_FROZEN, gradingform_rubric_controller::DISPLAY_REVIEW))) { $displayscore = false; @@ -209,12 +326,19 @@ class gradingform_rubric_renderer extends plugin_renderer_base { $leveltemplate .= html_writer::tag('div', get_string('scorepostfix', 'gradingform_rubric', $score), array('class' => $scoreclass)); } if ($mode == gradingform_rubric_controller::DISPLAY_EDIT_FULL) { - $value = get_string('leveldelete', 'gradingform_rubric'); - $button = html_writer::empty_tag('input', array('type' => 'submit', 'name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][delete]', 'id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}-delete', 'value' => $value, 'title' => $value, 'tabindex' => -1)); + $value = get_string('leveldelete', 'gradingform_rubric', $levelindex); + $buttonparams = array( + 'type' => 'submit', + 'name' => '{NAME}[criteria][{CRITERION-id}][levels][{LEVEL-id}][delete]', + 'id' => '{NAME}-criteria-{CRITERION-id}-levels-{LEVEL-id}-delete', + 'value' => $value + ); + $button = html_writer::empty_tag('input', $buttonparams); $leveltemplate .= html_writer::tag('div', $button, array('class' => 'delete')); } $leveltemplate .= html_writer::end_tag('div'); // .level-wrapper - $leveltemplate .= html_writer::end_tag('td'); // .level + + $leveltemplate = html_writer::tag('td', $leveltemplate, $tdattributes); // The .level cell. $leveltemplate = str_replace('{NAME}', $elementname, $leveltemplate); $leveltemplate = str_replace('{CRITERION-id}', $criterionid, $leveltemplate); @@ -262,10 +386,23 @@ class gradingform_rubric_renderer extends plugin_renderer_base { } $rubrictemplate = html_writer::start_tag('div', array('id' => 'rubric-{NAME}', 'class' => 'clearfix gradingform_rubric'.$classsuffix)); - $rubrictemplate .= html_writer::tag('table', $criteriastr, array('class' => 'criteria', 'id' => '{NAME}-criteria')); + + // Rubric table. + $rubrictableparams = array( + 'class' => 'criteria', + 'id' => '{NAME}-criteria', + 'aria-label' => get_string('rubric', 'gradingform_rubric')); + $rubrictable = html_writer::tag('table', $criteriastr, $rubrictableparams); + $rubrictemplate .= $rubrictable; if ($mode == gradingform_rubric_controller::DISPLAY_EDIT_FULL) { $value = get_string('addcriterion', 'gradingform_rubric'); - $input = html_writer::empty_tag('input', array('type' => 'submit', 'name' => '{NAME}[criteria][addcriterion]', 'id' => '{NAME}-criteria-addcriterion', 'value' => $value, 'title' => $value)); + $criteriainputparams = array( + 'type' => 'submit', + 'name' => '{NAME}[criteria][addcriterion]', + 'id' => '{NAME}-criteria-addcriterion', + 'value' => $value + ); + $input = html_writer::empty_tag('input', $criteriainputparams); $rubrictemplate .= html_writer::tag('div', $input, array('class' => 'addcriterion')); } $rubrictemplate .= $this->rubric_edit_options($mode, $options); @@ -364,6 +501,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base { } else { $criterionvalue = null; } + $index = 1; foreach ($criterion['levels'] as $levelid => $level) { $level['id'] = $levelid; $level['class'] = $this->get_css_class_suffix($levelcnt++, sizeof($criterion['levels']) -1); @@ -376,7 +514,9 @@ class gradingform_rubric_renderer extends plugin_renderer_base { $level['class'] .= ' currentchecked'; } $level['tdwidth'] = 100/count($criterion['levels']); + $level['index'] = $index; $levelsstr .= $this->level_template($mode, $options, $elementname, $id, $level); + $index++; } $criteriastr .= $this->criterion_template($mode, $options, $elementname, $criterion, $levelsstr, $criterionvalue); } @@ -462,7 +602,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base { * @return string */ public function display_regrade_confirmation($elementname, $changelevel, $value) { - $html = html_writer::start_tag('div', array('class' => 'gradingform_rubric-regrade')); + $html = html_writer::start_tag('div', array('class' => 'gradingform_rubric-regrade', 'role' => 'alert')); if ($changelevel<=2) { $html .= html_writer::label(get_string('regrademessage1', 'gradingform_rubric'), 'menu' . $elementname . 'regrade'); $selectoptions = array( diff --git a/grade/grading/form/rubric/rubriceditor.php b/grade/grading/form/rubric/rubriceditor.php index d9901267257..533e81e5994 100644 --- a/grade/grading/form/rubric/rubriceditor.php +++ b/grade/grading/form/rubric/rubriceditor.php @@ -119,7 +119,7 @@ class MoodleQuickForm_rubriceditor extends HTML_QuickForm_input { 'requires' => array('base', 'dom', 'event', 'event-touch', 'escape'), 'strings' => array(array('confirmdeletecriterion', 'gradingform_rubric'), array('confirmdeletelevel', 'gradingform_rubric'), array('criterionempty', 'gradingform_rubric'), array('levelempty', 'gradingform_rubric') - )); + )); $PAGE->requires->js_init_call('M.gradingform_rubriceditor.init', array( array('name' => $this->getName(), 'criteriontemplate' => $renderer->criterion_template($mode, $data['options'], $this->getName()), @@ -141,7 +141,7 @@ class MoodleQuickForm_rubriceditor extends HTML_QuickForm_input { $html .= $renderer->display_regrade_confirmation($this->getName(), $this->regradeconfirmation, $data['regrade']); } if ($this->validationerrors) { - $html .= $renderer->notification($this->validationerrors, 'error'); + $html .= html_writer::div($renderer->notification($this->validationerrors, 'error'), '', array('role' => 'alert')); } $html .= $renderer->display_rubric($data['criteria'], $data['options'], $mode, $this->getName()); return $html; diff --git a/grade/grading/form/rubric/tests/behat/behat_gradingform_rubric.php b/grade/grading/form/rubric/tests/behat/behat_gradingform_rubric.php index 4ab11d21584..e01387b16a5 100644 --- a/grade/grading/form/rubric/tests/behat/behat_gradingform_rubric.php +++ b/grade/grading/form/rubric/tests/behat/behat_gradingform_rubric.php @@ -81,7 +81,7 @@ class behat_gradingform_rubric extends behat_base { $addcriterionbutton = $this->find_button(get_string('addcriterion', 'gradingform_rubric')); // Cleaning the current ones. - $deletebuttons = $this->find_all('css', "input[title='" . get_string('criteriondelete', 'gradingform_rubric') . "']"); + $deletebuttons = $this->find_all('css', "input[value='" . get_string('criteriondelete', 'gradingform_rubric') . "']"); if ($deletebuttons) { // We should reverse the deletebuttons because otherwise once we delete @@ -100,6 +100,12 @@ class behat_gradingform_rubric extends behat_base { if ($criteria) { foreach ($criteria as $criterionit => $criterion) { + // Unset empty levels in criterion. + foreach ($criterion as $i => $value) { + if (empty($value)) { + unset($criterion[$i]); + } + } // Checking the number of cells. if (count($criterion) % 2 === 0) { diff --git a/grade/grading/form/rubric/tests/behat/edit_rubric.feature b/grade/grading/form/rubric/tests/behat/edit_rubric.feature index e6996837efc..c2ee6f434e5 100644 --- a/grade/grading/form/rubric/tests/behat/edit_rubric.feature +++ b/grade/grading/form/rubric/tests/behat/edit_rubric.feature @@ -35,9 +35,9 @@ Feature: Rubrics can be created and edited | TMP Criterion 4 | TMP Level 41 | 41 | TMP Level 42 | 42 | # Checking that only the last ones are saved. And I define the following rubric: - | Criterion 1 | Level 11 | 1 | Level 12 | 20 | Level 13 | 40 | Level 14 | 50 | - | Criterion 2 | Level 21 | 10 | Level 22 | 20 | Level 23 | 30 | - | Criterion 3 | Level 31 | 5 | Level 32 | 20 | + | Criterion 1 | Level 11 | 1 | Level 12 | 20 | Level 13 | 40 | Level 14 | 50 | + | Criterion 2 | Level 21 | 10 | Level 22 | 20 | Level 23 | 30 | | | + | Criterion 3 | Level 31 | 5 | Level 32 | 20 | | | | | And I press "Save as draft" And I go to "Test assignment 1 name" advanced grading definition page And I click on "Move down" "button" in the "Criterion 1" "table_row" diff --git a/grade/grading/form/rubric/tests/behat/reuse_own_rubrics.feature b/grade/grading/form/rubric/tests/behat/reuse_own_rubrics.feature index e26c7765f17..1f196737100 100644 --- a/grade/grading/form/rubric/tests/behat/reuse_own_rubrics.feature +++ b/grade/grading/form/rubric/tests/behat/reuse_own_rubrics.feature @@ -28,7 +28,7 @@ Feature: Reuse my rubrics in other activities And I define the following rubric: | Criterion 1 | Level 11 | 11 | Level 12 | 12 | Level 3 | 13 | | Criterion 2 | Level 21 | 21 | Level 22 | 22 | Level 3 | 23 | - | Criterion 3 | Level 31 | 31 | Level 32 | 32 | + | Criterion 3 | Level 31 | 31 | Level 32 | 32 | | | And I press "Save rubric and make it ready" And I follow "Course 1" When I add a "Assignment" to section "1" and I fill the form with: @@ -40,7 +40,6 @@ Feature: Reuse my rubrics in other activities And I should see "Criterion 1" And I should see "Criterion 2" And I should see "Criterion 3" - And I follow "C1" And I go to "Test assignment 1 name" advanced grading definition page And I should see "Criterion 1" And I should see "Criterion 2"