From 9612e9218512478ece336969a20dcd87f2d6943d Mon Sep 17 00:00:00 2001 From: nicolasconnault Date: Wed, 22 Apr 2009 08:25:10 +0000 Subject: [PATCH] MDL-18083 MDL-12380 MDL-18228 MDL-17807 Implementing grades over 100% in the grader report, new tab navigation, fixed student column and mouseover tooltips for grade cells. --- grade/report/grader/lib.php | 381 +++++++++++++++++++++++++----------- 1 file changed, 266 insertions(+), 115 deletions(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 1fe237f15ae..3dee6d322d7 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -85,6 +85,8 @@ class grade_report_grader extends grade_report { * */ var $canviewhidden; + var $preferences_page=false; + /** * Constructor. Sets local copies of user preferences and initialises grade_tree. * @param int $courseid @@ -201,10 +203,13 @@ class grade_report_grader extends grade_report { // Warn if the grade is out of bounds. if (is_null($finalgrade)) { // ok - } else if ($finalgrade < $grade_item->grademin) { - $errorstr = 'lessthanmin'; - } else if ($finalgrade > $grade_item->grademax) { - $errorstr = 'morethanmax'; + } else { + $bounded = $grade_item->bounded_grade($finalgrade); + if ($bounded > $finalgrade) { + $errorstr = 'lessthanmin'; + } else if ($bounded < $finalgrade) { + $errorstr = 'morethanmax'; + } } if ($errorstr) { $user = get_record('user', 'id', $userid, '', '', '', '', 'id, firstname, lastname'); @@ -489,31 +494,38 @@ class grade_report_grader extends grade_report { function get_headerhtml() { global $CFG, $USER; - $strsortasc = $this->get_lang_string('sortasc', 'grades'); - $strsortdesc = $this->get_lang_string('sortdesc', 'grades'); - $strfirstname = $this->get_lang_string('firstname'); - $strlastname = $this->get_lang_string('lastname'); - $showuseridnumber = $this->get_pref('showuseridnumber'); + $this->rowcount = 0; + $fixedstudents = empty($USER->screenreader) && $CFG->grade_report_fixedstudents; - if ($this->sortitemid === 'lastname') { - if ($this->sortorder == 'ASC') { - $lastarrow = print_arrow('up', $strsortasc, true); + if (!$fixedstudents) { + $strsortasc = $this->get_lang_string('sortasc', 'grades'); + $strsortdesc = $this->get_lang_string('sortdesc', 'grades'); + $strfirstname = $this->get_lang_string('firstname'); + $strlastname = $this->get_lang_string('lastname'); + $showuseridnumber = $this->get_pref('showuseridnumber'); + + if ($this->sortitemid === 'lastname') { + if ($this->sortorder == 'ASC') { + $lastarrow = print_arrow('up', $strsortasc, true); + } else { + $lastarrow = print_arrow('down', $strsortdesc, true); + } } else { - $lastarrow = print_arrow('down', $strsortdesc, true); + $lastarrow = ''; } - } else { - $lastarrow = ''; + + if ($this->sortitemid === 'firstname') { + if ($this->sortorder == 'ASC') { + $firstarrow = print_arrow('up', $strsortasc, true); + } else { + $firstarrow = print_arrow('down', $strsortdesc, true); + } + } else { + $firstarrow = ''; + } + } - if ($this->sortitemid === 'firstname') { - if ($this->sortorder == 'ASC') { - $firstarrow = print_arrow('up', $strsortasc, true); - } else { - $firstarrow = print_arrow('down', $strsortdesc, true); - } - } else { - $firstarrow = ''; - } // Prepare Table Headers $headerhtml = ''; @@ -521,7 +533,6 @@ class grade_report_grader extends grade_report { $columns_to_unset = array(); - foreach ($this->gtree->levels as $key=>$row) { $columncount = 0; if ($key == 0) { @@ -529,38 +540,42 @@ class grade_report_grader extends grade_report { // continue; } - $headerhtml .= ''; - - if ($key == $numrows - 1) { - $headerhtml .= '' - . $strfirstname . ' ' - . $firstarrow. '/ ' . $strlastname . ''. $lastarrow .''; - if ($showuseridnumber) { - if ('idnumber' == $this->sortitemid) { - if ($this->sortorder == 'ASC') { - $idnumberarrow = print_arrow('up', $strsortasc, true); + if ($fixedstudents) { + $headerhtml .= ''; + } else { + $headerhtml .= ''; + if ($key == $numrows - 1) { + $headerhtml .= '' + . $strfirstname . ' ' + . $firstarrow. '/ ' . $strlastname . ''. $lastarrow .''; + if ($showuseridnumber) { + if ('idnumber' == $this->sortitemid) { + if ($this->sortorder == 'ASC') { + $idnumberarrow = print_arrow('up', $strsortasc, true); + } else { + $idnumberarrow = print_arrow('down', $strsortdesc, true); + } } else { - $idnumberarrow = print_arrow('down', $strsortdesc, true); + $idnumberarrow = ''; } - } else { - $idnumberarrow = ''; + $headerhtml .= '' + . get_string('idnumber') . ' ' . $idnumberarrow . ''; + } + } else { + $colspan=''; + if ($showuseridnumber) { + $colspan = 'colspan="2" '; } - $headerhtml .= '' - . get_string('idnumber') . ' ' . $idnumberarrow . ''; - } - } else { - $colspan=''; - if ($showuseridnumber) { - $colspan = 'colspan="2" '; - } - $headerhtml .= ' '; + $headerhtml .= ' '; - if ($showuseridnumber) { - $columncount++; + if ($showuseridnumber) { + $columncount++; + } } } + foreach ($row as $columnkey => $element) { $sort_link = ''; if (isset($element['object']->id)) { @@ -594,7 +609,7 @@ class grade_report_grader extends grade_report { } // Element is a category else if ($type == 'category') { - $headerhtml .= '' + $headerhtml .= '' . shorten_text($element['object']->get_name()); $headerhtml .= $this->get_collapsing_icon($element); @@ -626,7 +641,7 @@ class grade_report_grader extends grade_report { } $headerlink = $this->gtree->get_element_header($element, true, $this->get_pref('showactivityicons'), false); - $headerhtml .= '' + $headerhtml .= '' . shorten_text($headerlink) . $arrow; $headerhtml .= ''; } @@ -649,9 +664,10 @@ class grade_report_grader extends grade_report { $strfeedback = $this->get_lang_string("feedback"); $strgrade = $this->get_lang_string('grade'); $gradetabindex = 1; + $numusers = count($this->users); $showuserimage = $this->get_pref('showuserimage'); $showuseridnumber = $this->get_pref('showuseridnumber'); - $numusers = count($this->users); + $fixedstudents = empty($USER->screenreader) && $CFG->grade_report_fixedstudents; // Preload scale objects for items with a scaleid $scales_list = ''; @@ -690,20 +706,25 @@ class grade_report_grader extends grade_report { } $columncount = 0; - // Student name and link - $user_pic = null; - if ($showuserimage) { - $user_pic = '
' . print_user_picture($user, $this->courseid, NULL, 0, true) . '
'; - } + if ($fixedstudents) { + $studentshtml .= ''; + } else { + // Student name and link + $user_pic = null; + if ($showuserimage) { + $user_pic = '
' . print_user_picture($user, $this->courseid, null, 0, true) . '
'; + } - $studentshtml .= '' - .''.$user_pic - .'' - .fullname($user).''; + $studentshtml .= '' + .''.$user_pic + .'' + .fullname($user).''; + + if ($showuseridnumber) { + $studentshtml .= ''. + $user->idnumber.''; + } - if ($showuseridnumber) { - $studentshtml .= ''. - $user->idnumber.''; } foreach ($this->gtree->items as $itemid=>$unused) { @@ -737,7 +758,7 @@ class grade_report_grader extends grade_report { $eid = $this->gtree->get_grade_eid($grade); $element = array('eid'=>$eid, 'object'=>$grade, 'type'=>'grade'); - $cellclasses = 'cell c'.$columncount++; + $cellclasses = 'grade cell c'.$columncount++; if ($item->is_category_item()) { $cellclasses .= ' cat'; } @@ -749,13 +770,23 @@ class grade_report_grader extends grade_report { } if ($grade->is_excluded()) { - $cellclasses .= ' excluded'; + // $cellclasses .= ' excluded'; } - $studentshtml .= ''; + $grade_title = '<div class="fullname">'.fullname($user).'</div>'; + $grade_title .= '<div class="itemname">'.$item->get_name(true).'</div>'; + + if (!empty($grade->feedback) && !$USER->gradeediting[$this->courseid]) { + $grade_title .= '<div class="feedback">' + .wordwrap(trim(format_string($grade->feedback, $grade->feedbackformat)), 34, '<br/ >') . '</div>'; + } else { + + } + + $studentshtml .= ''; if ($grade->is_excluded()) { - $studentshtml .= get_string('excluded', 'grades') . ' '; + $studentshtml .= ''.get_string('excluded', 'grades') . ' '; } // Do not show any icons if no grade (no record in DB to match) @@ -817,7 +848,7 @@ class grade_report_grader extends grade_report { if ($gradeval < 1) { $studentshtml .= '-'; } else { - $gradeval = (int)bounded_number($grade->grade_item->grademin, $gradeval, $grade->grade_item->grademax); //just in case somebody changes scale + $gradeval = $grade->grade_item->bounded_grade($gradeval); //just in case somebody changes scale $studentshtml .= ''.$scales[$gradeval-1].''; } } else { @@ -839,9 +870,7 @@ class grade_report_grader extends grade_report { // If quickfeedback is on, print an input element if ($this->get_pref('showquickfeedback') and $grade->is_editable()) { - if ($this->get_pref('quickgrading')) { - $studentshtml .= '
'; - } + $studentshtml .= ''; $studentshtml .= ''; - } if ($item->needsupdate) { $studentshtml .= ''.get_string('error').''; @@ -885,6 +907,138 @@ class grade_report_grader extends grade_report { return $studentshtml; } + function get_studentnameshtml() { + global $CFG, $USER; + $studentshtml = ''; + + $showuserimage = $this->get_pref('showuserimage'); + $showuseridnumber = $this->get_pref('showuseridnumber'); + $fixedstudents = empty($USER->screenreader) && $CFG->grade_report_fixedstudents; + + $strsortasc = $this->get_lang_string('sortasc', 'grades'); + $strsortdesc = $this->get_lang_string('sortdesc', 'grades'); + $strfirstname = $this->get_lang_string('firstname'); + $strlastname = $this->get_lang_string('lastname'); + + if ($this->sortitemid === 'lastname') { + if ($this->sortorder == 'ASC') { + $lastarrow = print_arrow('up', $strsortasc, true); + } else { + $lastarrow = print_arrow('down', $strsortdesc, true); + } + } else { + $lastarrow = ''; + } + + if ($this->sortitemid === 'firstname') { + if ($this->sortorder == 'ASC') { + $firstarrow = print_arrow('up', $strsortasc, true); + } else { + $firstarrow = print_arrow('down', $strsortdesc, true); + } + } else { + $firstarrow = ''; + } + + if ($fixedstudents) { + $studentshtml .= '
+ + '; + + $colspan = ''; + if ($showuseridnumber) { + $colspan = 'colspan="2"'; + } + + $levels = count($this->gtree->levels) - 1; + + + for ($i = 0; $i < $levels; $i++) { + $studentshtml .= ' + + + + '; + } + + $studentshtml .= ''; + + if ($showuseridnumber) { + if ('idnumber' == $this->sortitemid) { + if ($this->sortorder == 'ASC') { + $idnumberarrow = print_arrow('up', $strsortasc, true); + } else { + $idnumberarrow = print_arrow('down', $strsortdesc, true); + } + } else { + $idnumberarrow = ''; + } + $studentshtml .= ''; + } + + $studentshtml .= ''; + + if ($USER->gradeediting[$this->courseid]) { + $studentshtml .= ''; + } + + $row_classes = array(' even ', ' odd '); + + foreach ($this->users as $userid => $user) { + + $user_pic = null; + if ($showuserimage) { + $user_pic = '
' . print_user_picture($user, $this->courseid, NULL, 0, true) . "
\n"; + } + + $studentshtml .= '' + .'\n"; + + if ($showuseridnumber) { + $studentshtml .= '\n"; + } + $studentshtml .= "\n"; + } + + if ($this->get_pref('showranges')) { + $studentshtml .= '' . ''; + } + + // Averages heading + + $straverage_group = get_string('groupavg', 'grades'); + $showaverages_group = $this->currentgroup && $this->get_pref('showgroups'); + $straverage = get_string('overallaverage', 'grades'); + $showaverages = $this->get_pref('showaverages'); + + if ($showaverages_group) { + $studentshtml .= ''; + } + + if ($showaverages) { + $studentshtml .= ''; + } + + $studentshtml .= ' +
' + . $strfirstname . ' ' + . $firstarrow. '/ ' . $strlastname . ''. $lastarrow .'' + . get_string('idnumber') . ' ' . $idnumberarrow . '
'.$this->get_lang_string('controls','grades').'
'.$user_pic + .'' + .fullname($user)."'. $user->idnumber."
'.$this->get_lang_string('range','grades').'
'.$straverage_group.'
'.$straverage.'
+
+
+ + '; + + } else { + $studentshtml .= '
+ '; + } + + return $studentshtml; + } + /** * Builds and return the HTML row of column totals. * @param bool $grouponly Whether to return only group averages or all averages. @@ -903,7 +1057,6 @@ class grade_report_grader extends grade_report { $averagesdecimalpoints = $this->get_pref('averagesdecimalpoints'); $meanselection = $this->get_pref('meanselection'); $shownumberofgrades = $this->get_pref('shownumberofgrades'); - $showuseridnumber = $this->get_pref('showuseridnumber'); $avghtml = ''; $avgcssclass = 'avg'; @@ -950,16 +1103,8 @@ class grade_report_grader extends grade_report { } $columncount=0; - $colspan=''; - if ($showuseridnumber) { - $colspan = 'colspan="2" '; - } - $avghtml = ''; - - if ($showuseridnumber) { - $columncount++; - } + $avghtml = ''; // MDL-10875 Empty grades must be evaluated as grademin, NOT always 0 // This query returns a count of ungraded grades (NULL finalgrade OR no matching record in grade_grades table) @@ -978,6 +1123,15 @@ class grade_report_grader extends grade_report { $ungraded_counts = get_records_sql($SQL); + $fixedstudents = empty($USER->screenreader) && $CFG->grade_report_fixedstudents; + if (!$fixedstudents) { + $colspan=''; + if ($this->get_pref('showuseridnumber')) { + $colspan = 'colspan="2" '; + } + $avghtml .= ''; + } + foreach ($this->gtree->items as $itemid=>$unused) { $item =& $this->gtree->items[$itemid]; @@ -1049,25 +1203,23 @@ class grade_report_grader extends grade_report { * @return string HTML */ function get_rangehtml() { - global $USER; - $showuseridnumber = $this->get_pref('showuseridnumber'); + global $USER, $CFG; - $scalehtml = ''; + $rangehtml = ''; if ($this->get_pref('showranges')) { $rangesdisplaytype = $this->get_pref('rangesdisplaytype'); $rangesdecimalpoints = $this->get_pref('rangesdecimalpoints'); $columncount=0; - $colspan=''; - if ($showuseridnumber) { - $colspan = 'colspan="2" '; - } + $rangehtml = ''; - $scalehtml = '' - . ''; - - if ($showuseridnumber) { - $columncount++; + $fixedstudents = empty($USER->screenreader) && $CFG->grade_report_fixedstudents; + if (!$fixedstudents) { + $colspan=''; + if ($this->get_pref('showuseridnumber')) { + $colspan = 'colspan="2" '; + } + $rangehtml .= ''; } foreach ($this->gtree->items as $itemid=>$unused) { @@ -1081,12 +1233,12 @@ class grade_report_grader extends grade_report { $formatted_range = $item->get_formatted_range($rangesdisplaytype, $rangesdecimalpoints); - $scalehtml .= ''; + $rangehtml .= ''; } - $scalehtml .= ''; + $rangehtml .= ''; } - return $scalehtml; + return $rangehtml; } /** @@ -1099,15 +1251,9 @@ class grade_report_grader extends grade_report { $iconshtml = ''; if ($USER->gradeediting[$this->courseid]) { - $colspan=''; - if ($this->get_pref('showuseridnumber')) { - $colspan = 'colspan="2" '; - } + $iconshtml = ''; - $iconshtml = '' - . ''; - - $columncount = 1; + $columncount = 0; foreach ($this->gtree->items as $itemid=>$unused) { // emulate grade element $item =& $this->gtree->items[$itemid]; @@ -1115,7 +1261,7 @@ class grade_report_grader extends grade_report { $eid = $this->gtree->get_item_eid($item); $element = $this->gtree->locate_element($eid); - $iconshtml .= ''; + $iconshtml .= ''; } $iconshtml .= ''; } @@ -1138,7 +1284,12 @@ class grade_report_grader extends grade_report { } // Init all icons - $edit_icon = $this->gtree->get_edit_icon($element, $this->gpr); + $edit_icon = ''; + + if ($element['type'] != 'categoryitem' && $element['type'] != 'courseitem') { + $edit_icon = $this->gtree->get_edit_icon($element, $this->gpr); + } + $edit_calculation_icon = ''; $show_hide_icon = ''; $lock_unlock_icon = ''; @@ -1182,7 +1333,7 @@ class grade_report_grader extends grade_report { if (in_array($element['object']->id, $this->collapsed['aggregatesonly'])) { $expand_contract = 'switch_plus'; - } elseif (in_array($element['object']->id, $this->collapsed['gradesonly'])) { + } elseif (!empty($this->collapsed['gradesonly']) && in_array($element['object']->id, $this->collapsed['gradesonly'])) { $expand_contract = 'switch_whole'; } $url = $this->gpr->get_return_url(null, array('target'=>$element['eid'], 'action'=>$expand_contract, 'sesskey'=>sesskey()));
'.$straverage.'
'.$straverage.'
'.$this->get_lang_string('range','grades').''.$this->get_lang_string('range','grades').''. $formatted_range .''. $formatted_range .'
'.$this->get_lang_string('controls','grades').'' . $this->get_icons($element) . '' . $this->get_icons($element) . '