MDL-36404 gradingform_rubric: Accessibility fixes rubric grading

This commit is contained in:
Jun Pataleta 2016-01-06 13:24:42 +08:00
parent e8d5100212
commit e9088e28ac
10 changed files with 222 additions and 45 deletions

View File

@ -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

View File

@ -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)
}
}

View File

@ -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;levidx<levelsscores.length;levidx++) {
levelsstr += M.gradingform_rubriceditor.templates[name]['level'].replace(/\{LEVEL-id\}/g, 'NEWID'+(newlevid+levidx)).replace(/\{LEVEL-score\}/g, levelsscores[levidx])
levelsstr += M.gradingform_rubriceditor.templates[name].level.
replace(/\{LEVEL-id\}/g, 'NEWID'+(newlevid+levidx)).
replace(/\{LEVEL-score\}/g, levelsscores[levidx]).
replace(/\{LEVEL-index\}/g, levidx + 1);
}
var newcriterion = M.gradingform_rubriceditor.templates[name]['criterion'].replace(/\{LEVELS\}/, levelsstr)
parentel.append(newcriterion.replace(/\{CRITERION-id\}/g, 'NEWID'+newid).replace(/\{.+?\}/g, ''))
@ -172,14 +177,23 @@ M.gradingform_rubriceditor.buttonclick = function(e, confirmed) {
M.gradingform_rubriceditor.addhandlers();
M.gradingform_rubriceditor.disablealleditors()
M.gradingform_rubriceditor.assignclasses(elements_str)
M.gradingform_rubriceditor.editmode(Y.one('#rubric-'+name+' #'+name+'-criteria-NEWID'+newid+'-description'),true)
M.gradingform_rubriceditor.editmode(
Y.one('#rubric-' + name + ' #' + name + '-criteria-NEWID' + newid + '-description-cell'), true
);
} else if (chunks.length == 5 && action == 'addlevel') {
// ADD NEW LEVEL
var newscore = 0;
parent = Y.one('#'+name+'-criteria-'+chunks[2]+'-levels')
parent.all('.level').each(function (node) { newscore = Math.max(newscore, parseFloat(node.one('.score input[type=text]').get('value'))+1) })
var levelIndex = 1;
parent.all('.level').each(function (node) {
newscore = Math.max(newscore, parseFloat(node.one('.score input[type=text]').get('value')) + 1);
levelIndex++;
});
var newlevel = M.gradingform_rubriceditor.templates[name]['level'].
replace(/\{CRITERION-id\}/g, chunks[2]).replace(/\{LEVEL-id\}/g, 'NEWID'+newlevid).replace(/\{LEVEL-score\}/g, newscore).replace(/\{.+?\}/g, '')
replace(/\{CRITERION-id\}/g, chunks[2]).replace(/\{LEVEL-id\}/g, 'NEWID'+newlevid).
replace(/\{LEVEL-score\}/g, newscore).
replace(/\{LEVEL-index\}/g, levelIndex).
replace(/\{.+?\}/g, '');
parent.append(newlevel)
M.gradingform_rubriceditor.addhandlers();
M.gradingform_rubriceditor.disablealleditors()
@ -238,7 +252,7 @@ M.gradingform_rubriceditor.buttonclick = function(e, confirmed) {
M.gradingform_rubriceditor.addhandlers();
M.gradingform_rubriceditor.disablealleditors();
M.gradingform_rubriceditor.assignclasses(elements_str);
M.gradingform_rubriceditor.editmode(Y.one('#rubric-'+name+' #'+name+'-criteria-NEWID'+newid+'-description'),true);
M.gradingform_rubriceditor.editmode(Y.one('#rubric-'+name+' #'+name+'-criteria-NEWID'+newid+'-description-cell'),true);
} else if (chunks.length == 6 && action == 'delete') {
// DELETE LEVEL
if (confirmed) {

View File

@ -29,12 +29,14 @@ $string['alwaysshowdefinition'] = 'Allow users to preview rubric used in the mod
$string['backtoediting'] = 'Back to editing';
$string['confirmdeletecriterion'] = 'Are you sure you want to delete this criterion?';
$string['confirmdeletelevel'] = 'Are you sure you want to delete this level?';
$string['criterion'] = 'Criterion {$a}';
$string['criterionaddlevel'] = 'Add level';
$string['criteriondelete'] = 'Delete criterion';
$string['criterionduplicate'] = 'Duplicate criterion';
$string['criterionempty'] = 'Click to edit criterion';
$string['criterionmovedown'] = 'Move down';
$string['criterionmoveup'] = 'Move up';
$string['criterionremark'] = 'Remark for criterion {$a->description}: {$a->remark}';
$string['definerubric'] = 'Define rubric';
$string['description'] = 'Description';
$string['enableremarks'] = 'Allow grader to add text remarks for each criterion';
@ -45,8 +47,11 @@ $string['err_nodescription'] = 'Criterion description can not be empty';
$string['err_scoreformat'] = 'Number of points for each level must be a valid non-negative number';
$string['err_totalscore'] = 'Maximum number of points possible when graded by the rubric must be more than zero';
$string['gradingof'] = '{$a} grading';
$string['leveldelete'] = 'Delete level';
$string['level'] = 'Level {$a->definition}, {$a->score} points.';
$string['leveldelete'] = 'Delete level {$a}';
$string['leveldefinition'] = 'Level {$a} definition';
$string['levelempty'] = 'Click to edit level';
$string['levelsgroup'] = 'Levels group';
$string['name'] = 'Name';
$string['needregrademessage'] = 'The rubric definition was changed after this student had been graded. The student can not see this rubric until you check the rubric and update the grade.';
$string['pluginname'] = 'Rubric';
@ -68,6 +73,7 @@ $string['rubricstatus'] = 'Current rubric status';
$string['save'] = 'Save';
$string['saverubric'] = 'Save rubric and make it ready';
$string['saverubricdraft'] = 'Save as draft';
$string['scoreinputforlevel'] = 'Score input for level {$a}';
$string['scorepostfix'] = '{$a}points';
$string['showdescriptionstudent'] = 'Display rubric description to those being graded';
$string['showdescriptionteacher'] = 'Display rubric description during evaluation';

View File

@ -927,7 +927,8 @@ class gradingform_rubric_instance extends gradingform_instance {
}
$currentinstance = $this->get_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) {

View File

@ -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(

View File

@ -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;

View File

@ -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) {

View File

@ -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"

View File

@ -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"