MDL-50283 rubric: Add duplicate row button
authorSyxton <davidso1@rose-hulman.edu>
Tue, 19 May 2015 12:33:48 +0000 (08:33 -0400)
committerDavid Monllao <davidm@moodle.com>
Fri, 19 Jun 2015 04:00:23 +0000 (12:00 +0800)
Adds the ability to duplicate a row in a rubric.

grade/grading/form/rubric/js/rubriceditor.js
grade/grading/form/rubric/lang/en/gradingform_rubric.php
grade/grading/form/rubric/renderer.php
grade/grading/form/rubric/styles.css

index 6b9137a..a40533c 100644 (file)
@@ -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 = 1;
+        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) {
index 9e45bfc..f23b914 100644 (file)
@@ -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';
index b2ba8ff..c539535 100644 (file)
@@ -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));
index 35b22bf..b889762 100644 (file)
 
 /* 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; }