diff --git a/grade/grading/form/rubric/js/rubriceditor.js b/grade/grading/form/rubric/js/rubriceditor.js index 6b9137a4e0a..51eb9ebcb90 100644 --- a/grade/grading/form/rubric/js/rubriceditor.js +++ b/grade/grading/form/rubric/js/rubriceditor.js @@ -143,7 +143,7 @@ M.gradingform_rubriceditor.buttonclick = function(e, confirmed) { elements_str = '#rubric-'+name+' .criterion' } // prepare the id of the next inserted level or criterion - if (action == 'addcriterion' || action == 'addlevel') { + 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') } @@ -204,6 +204,41 @@ M.gradingform_rubriceditor.buttonclick = function(e, confirmed) { dialog_options['message'] = M.util.get_string('confirmdeletecriterion', 'gradingform_rubric') M.util.show_confirm_dialog(e, dialog_options); } + } else if (chunks.length == 4 && action == 'duplicate') { + // Duplicate criterion. + var levelsdef = [], levelsscores = [0], levidx = null; + var parentel = Y.one('#'+name+'-criteria'); + if (parentel.one('>tbody')) { parentel = parentel.one('>tbody'); } + + var source = Y.one('#'+name+'-criteria-'+chunks[2]); + if (source.all('.level')) { + var lastcriterion = source.all('.level'); + for (levidx = 0; levidx < lastcriterion.size(); levidx++) { + levelsdef[levidx] = lastcriterion.item(levidx).one('.definition .textvalue').get('innerHTML'); + } + for (levidx = 0; levidx < lastcriterion.size(); levidx++) { + levelsscores[levidx] = lastcriterion.item(levidx).one('.score input[type=text]').get('value'); + } + } + + 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]) + .replace(/\{LEVEL-definition\}/g, Y.Escape.html(levelsdef[levidx])); + } + var description = source.one('.description .textvalue'); + var newcriterion = M.gradingform_rubriceditor.templates[name].criterion + .replace(/\{LEVELS\}/, levelsstr) + .replace(/\{CRITERION-description\}/, Y.Escape.html(description.get('innerHTML'))); + parentel.append(newcriterion.replace(/\{CRITERION-id\}/g, 'NEWID'+newid).replace(/\{.+?\}/g, '')); + M.gradingform_rubriceditor.assignclasses('#rubric-'+name+' #'+name+'-criteria-NEWID'+newid+'-levels .level'); + 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); } else if (chunks.length == 6 && action == 'delete') { // DELETE LEVEL if (confirmed) { @@ -241,4 +276,4 @@ M.gradingform_rubriceditor.calculatenewid = function (elements_str) { if (id.match(/^NEWID(\d+)$/)) newid = Math.max(newid, parseInt(id.substring(5))+1); } ); return newid -} \ No newline at end of file +} diff --git a/grade/grading/form/rubric/lang/en/gradingform_rubric.php b/grade/grading/form/rubric/lang/en/gradingform_rubric.php index 9e45bfc3a1c..f23b914f280 100644 --- a/grade/grading/form/rubric/lang/en/gradingform_rubric.php +++ b/grade/grading/form/rubric/lang/en/gradingform_rubric.php @@ -31,6 +31,7 @@ $string['confirmdeletecriterion'] = 'Are you sure you want to delete this criter $string['confirmdeletelevel'] = 'Are you sure you want to delete this level?'; $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'; diff --git a/grade/grading/form/rubric/renderer.php b/grade/grading/form/rubric/renderer.php index b2ba8ff44d7..c539535f652 100644 --- a/grade/grading/form/rubric/renderer.php +++ b/grade/grading/form/rubric/renderer.php @@ -71,7 +71,7 @@ class gradingform_rubric_renderer extends plugin_renderer_base { $criteriontemplate = html_writer::start_tag('tr', array('class' => 'criterion'. $criterion['class'], 'id' => '{NAME}-criteria-{CRITERION-id}')); if ($mode == gradingform_rubric_controller::DISPLAY_EDIT_FULL) { $criteriontemplate .= html_writer::start_tag('td', array('class' => 'controls')); - foreach (array('moveup', 'delete', 'movedown') as $key) { + 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)); diff --git a/grade/grading/form/rubric/styles.css b/grade/grading/form/rubric/styles.css index 35b22bf83d0..b889762d332 100644 --- a/grade/grading/form/rubric/styles.css +++ b/grade/grading/form/rubric/styles.css @@ -95,9 +95,11 @@ /* replace buttons with images */ .gradingform_rubric.editor .delete input, +.gradingform_rubric.editor .duplicate input, .gradingform_rubric.editor .moveup input, .gradingform_rubric.editor .movedown input{text-indent: -1000em;cursor:pointer;border:none;} .gradingform_rubric.editor .criterion .controls .delete input {width:12px;height:12px;background: transparent url([[pix:t/delete]]) no-repeat center top; margin: .3em .3em 0 .3em;} +.gradingform_rubric.editor .criterion .controls .duplicate input {width:12px;height:12px;background: transparent url([[pix:t/copy]]) no-repeat center top; margin: .3em .3em 0 .3em;} .gradingform_rubric.editor .levels .level .delete input {width:12px;height:16px;background: transparent url([[pix:t/delete]]) no-repeat center center; } .dir-rtl .gradingform_rubric.editor .levels .level .delete input { margin-right: .45em; margin-left: 0; } .gradingform_rubric.editor .moveup input {width:12px;height:12px;background: transparent url([[pix:t/up]]) no-repeat center top; margin: .3em .3em 0 .3em; } diff --git a/grade/grading/form/rubric/version.php b/grade/grading/form/rubric/version.php index 8e4bc805893..01f13c66aa0 100644 --- a/grade/grading/form/rubric/version.php +++ b/grade/grading/form/rubric/version.php @@ -25,7 +25,7 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'gradingform_rubric'; -$plugin->version = 2015051100; +$plugin->version = 2015051101; $plugin->requires = 2015050500;