From 6c37563e00a67f7a80bd95e1712c090013eec27a Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Mon, 22 Sep 2014 18:32:50 +0800 Subject: [PATCH] MDL-47146 core_grades: Use a checkbox to override weights Part of: MDL-46576 --- grade/edit/tree/functions.js | 12 ++++++++++++ grade/edit/tree/index.php | 18 +++++++++++++++--- grade/edit/tree/lib.php | 18 ++++++++++++------ lang/en/grades.php | 2 +- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/grade/edit/tree/functions.js b/grade/edit/tree/functions.js index 5649ea22d70..2da2f011658 100644 --- a/grade/edit/tree/functions.js +++ b/grade/edit/tree/functions.js @@ -69,6 +69,18 @@ function update_category_aggregation(e, args) { window.location = 'index.php?id='+args.courseid+'&category='+args.category+'&aggregationtype='+selectmenu.get('value')+'&sesskey='+args.sesskey; } +/** + * The weight override checkboxes toggle the disabled status of their associated weight fields. + */ +YUI().use('node', 'delegate', function(Y) { + Y.on('domready', function() { + Y.delegate('click', function(e) { + var t = e.currentTarget, + itemid = t.get('id').split('_')[1]; + Y.one('input[name=weight_' + itemid + ']').set('disabled', t.get('checked') ? false : true); + }, Y.config.doc.body, 'input.weightoverride'); + }); +}); /* TODO: finish and rewrite for YUI3... Y.YUI2.namespace('grade_edit_tree'); diff --git a/grade/edit/tree/index.php b/grade/edit/tree/index.php index 9252164ecf8..84dac1af3d0 100644 --- a/grade/edit/tree/index.php +++ b/grade/edit/tree/index.php @@ -197,10 +197,9 @@ if ($data = data_submitted() and confirm_sesskey()) { // Convert weight to aggregation coef2. $aggcoef = $grade_item->get_coefstring(); if ($aggcoef == 'aggregationcoefextraweightsum') { + // The field 'weight' should only be sent when the checkbox 'weighoverride' is checked, + // so there is not need to set weightoverride here, it is done below. $value = $value / 100.0; - if (round($grade_item->aggregationcoef2, 4) != round($value, 4)) { - $grade_item->weightoverride = 1; - } $grade_item->aggregationcoef2 = $value; } else if ($aggcoef == 'aggregationcoefweight' || $aggcoef == 'aggregationcoefextraweight') { $grade_item->aggregationcoef = $value; @@ -208,6 +207,19 @@ if ($data = data_submitted() and confirm_sesskey()) { $grade_item->update(); + $recreatetree = true; + + // Grade item checkbox inputs. + } elseif (preg_match('/^(weightoverride)_([0-9]+)$/', $key, $matches)) { + $param = $matches[1]; + $aid = $matches[2]; + $value = clean_param($value, PARAM_BOOL); + + $grade_item = grade_item::fetch(array('id' => $aid, 'courseid' => $courseid)); + $grade_item->$param = $value; + + $grade_item->update(); + $recreatetree = true; } } diff --git a/grade/edit/tree/lib.php b/grade/edit/tree/lib.php index 557b7d4e684..0e75d7d178a 100644 --- a/grade/edit/tree/lib.php +++ b/grade/edit/tree/lib.php @@ -375,10 +375,15 @@ class grade_edit_tree { ''; } else if ($aggcoef == 'aggregationcoefextraweightsum') { - $label = ''; - if ($item->weightoverride && $parent_category->aggregation == GRADE_AGGREGATE_SUM) { - $label = ' '.get_string('adjusted', 'grades'); - } + + $checkboxname = 'weightoverride_' . $item->id; + $checkboxlbl = html_writer::tag('label', get_string('overrideweight', 'grades'), + array('for' => $checkboxname, 'class' => 'accesshide')); + $checkbox = html_writer::empty_tag('input', array('name' => $checkboxname, + 'type' => 'hidden', 'value' => 0)); + $checkbox .= html_writer::empty_tag('input', array('name' => $checkboxname, + 'type' => 'checkbox', 'value' => 1, 'id' => $checkboxname, 'class' => 'weightoverride', + 'checked' => ($item->weightoverride ? 'checked' : null))); $name = 'weight_' . $item->id; $hiddenlabel = html_writer::tag( @@ -397,11 +402,12 @@ class grade_edit_tree { 'size' => 6, 'id' => $name, 'name' => $name, - 'value' => grade_edit_tree::format_number($item->aggregationcoef2 * 100.0) + 'value' => grade_edit_tree::format_number($item->aggregationcoef2 * 100.0), + 'disabled' => ($item->weightoverride ? null : 'disabled') ) ); - $str .= $hiddenlabel . $input . $label; + $str .= $checkboxlbl . $checkbox . $hiddenlabel . $input; if ($item->aggregationcoef > 0) { $str .= ' ' . html_writer::tag('abbr', get_string('aggregationcoefextrasumabbr', 'grades'), diff --git a/lang/en/grades.php b/lang/en/grades.php index 85874d720ac..882cbccee4f 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -34,7 +34,6 @@ $string['additem'] = 'Add grade item'; $string['addoutcome'] = 'Add an outcome'; $string['addoutcomeitem'] = 'Add outcome item'; $string['addscale'] = 'Add a scale'; -$string['adjusted'] = 'Adjusted'; $string['adjustedweight'] = 'Weight adjusted'; $string['aggregateextracreditmean'] = 'Mean of grades (with extra credits)'; $string['aggregatemax'] = 'Highest grade'; @@ -512,6 +511,7 @@ When a grade is edited in the grader report, the overridden checkbox is ticked a $string['overriddennotice'] = 'Your final grade from this activity was manually adjusted.'; $string['overridesitedefaultgradedisplaytype'] = 'Override site defaults'; $string['overridesitedefaultgradedisplaytype_help'] = 'If ticked, grade letters and boundaries for the course may be set, rather than using the site defaults.'; +$string['overrideweight'] = 'Override weight'; $string['parentcategory'] = 'Parent category'; $string['pctoftotalgrade'] = '% of total grade'; $string['percent'] = 'Percent';