MDL-19797 Upgraded most output code in grader report

This commit is contained in:
nicolasconnault 2009-08-28 05:29:05 +00:00
parent c402af03a8
commit 319770d747
8 changed files with 311 additions and 223 deletions

View file

@ -13,6 +13,10 @@ function set_row(idx) {
}
}
function yui_set_row(e) {
set_row(this.parentNode.rowIndex);
}
/** highlight/unset the column of a table **/
function set_col(idx) {
var table = document.getElementById('user-grades');

View file

@ -180,22 +180,14 @@ $reporthtml .= $report->get_endhtml();
$reporthtml .= '</div>';
// print submit button
if ($USER->gradeediting[$course->id] and !$report->get_pref('enableajax')) {
echo '<form action="index.php" method="post">';
echo '<div>';
echo '<input type="hidden" value="'.$courseid.'" name="id" />';
echo '<input type="hidden" value="'.sesskey().'" name="sesskey" />';
echo '<input type="hidden" value="grader" name="report"/>';
}
if ($USER->gradeediting[$course->id] && ($report->get_pref('showquickfeedback') || $report->get_pref('quickgrading')) && !$report->get_pref('enableajax')) {
$form = new html_form();
$form->url = new moodle_url('index.php', array('id' => $courseid, 'report' => 'grader'));
$form->button->text = get_string('update');
$form->button->add_class('submit');
echo $OUTPUT->form($form, $reporthtml);
} else {
echo $reporthtml;
// print submit button
if ($USER->gradeediting[$course->id] && ($report->get_pref('showquickfeedback')
||
$report->get_pref('quickgrading')) && !$report->get_pref('enableajax')) {
echo '<div class="submit"><input type="submit" value="'.get_string('update').'" /></div>';
echo '</div></form>';
}
// prints paging bar at bottom for large pages
@ -203,7 +195,7 @@ if (!empty($studentsperpage) && $studentsperpage >= 20) {
echo $OUTPUT->paging_bar(moodle_paging_bar::make($numusers, $report->page, $studentsperpage, $report->pbarurl));
}
echo '<div id="hiddentooltiproot">tooltip panel</div>';
echo $OUTPUT->container('tooltip panel', '', 'hiddentooltiproot');
// Print AJAX code
if ($report->get_pref('enableajax')) {
require_once 'ajax.php';

View file

@ -63,9 +63,9 @@ class grade_report_grader extends grade_report {
/**
* The bound params for $userselect
* @var array $userselect_params
* @var array $userselectparams
*/
public $userselect_params = array();
public $userselectparams = array();
/**
* List of collapsed categories from user preference
@ -84,7 +84,7 @@ class grade_report_grader extends grade_report {
* */
public $canviewhidden;
var $preferences_page=false;
var $preferencespage=false;
/**
* Constructor. Sets local copies of user preferences and initialises grade_tree.
@ -125,17 +125,15 @@ class grade_report_grader extends grade_report {
$this->sortitemid = $sortitemid;
// base url for sorting by first/last name
$this->baseurl = new moodle_url('index.php', array('id' => $this->courseid));
$studentsperpage = $this->get_pref('studentsperpage');
$perpage = '';
$curpage = '';
if (!empty($studentsperpage)) {
$perpage = '&amp;perpage='.$studentsperpage;
$curpage = '&amp;page='.$this->page;
$this->baseurl->params(array('perpage' => $studentsperpage, 'page' => $this->page));
}
$this->baseurl = 'index.php?id='.$this->courseid. $perpage.$curpage.'&amp;';
$this->pbarurl = 'index.php?id='.$this->courseid.$perpage.'&amp;';
$this->pbarurl = new moodle_url('index.php', array('id' => $this->courseid, 'perpage' => $studentsperpage));
$this->setup_groups();
@ -174,9 +172,9 @@ class grade_report_grader extends grade_report {
// skip, not a grade nor feedback
if (strpos($varname, 'grade') === 0) {
$data_type = 'grade';
$datatype = 'grade';
} else if (strpos($varname, 'feedback') === 0) {
$data_type = 'feedback';
$datatype = 'feedback';
} else {
continue;
}
@ -192,15 +190,15 @@ class grade_report_grader extends grade_report {
continue;
}
if (!$grade_item = grade_item::fetch(array('id'=>$itemid, 'courseid'=>$this->courseid))) { // we must verify course id here!
if (!$gradeitem = grade_item::fetch(array('id'=>$itemid, 'courseid'=>$this->courseid))) { // we must verify course id here!
print_error('invalidgradeitmeid');
}
// Pre-process grade
if ($data_type == 'grade') {
if ($datatype == 'grade') {
$feedback = false;
$feedbackformat = false;
if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
if ($gradeitem->gradetype == GRADE_TYPE_SCALE) {
if ($postedvalue == -1) { // -1 means no grade
$finalgrade = null;
} else {
@ -215,7 +213,7 @@ class grade_report_grader extends grade_report {
if (is_null($finalgrade)) {
// ok
} else {
$bounded = $grade_item->bounded_grade($finalgrade);
$bounded = $gradeitem->bounded_grade($finalgrade);
if ($bounded > $finalgrade) {
$errorstr = 'lessthanmin';
} else if ($bounded < $finalgrade) {
@ -226,11 +224,11 @@ class grade_report_grader extends grade_report {
$user = $DB->get_record('user', array('id' => $userid), 'id, firstname, lastname');
$gradestr = new object();
$gradestr->username = fullname($user);
$gradestr->itemname = $grade_item->get_name();
$gradestr->itemname = $gradeitem->get_name();
$warnings[] = get_string($errorstr, 'grades', $gradestr);
}
} else if ($data_type == 'feedback') {
} else if ($datatype == 'feedback') {
$finalgrade = false;
$trimmed = trim($postedvalue);
if (empty($trimmed)) {
@ -258,7 +256,7 @@ class grade_report_grader extends grade_report {
}
}
$grade_item->update_final_grade($userid, $finalgrade, 'gradebook', $feedback, FORMAT_MOODLE);
$gradeitem->update_final_grade($userid, $finalgrade, 'gradebook', $feedback, FORMAT_MOODLE);
}
return $warnings;
@ -328,10 +326,10 @@ class grade_report_grader extends grade_report {
public function load_users() {
global $CFG, $DB;
list($usql, $gbr_params) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
list($usql, $gbrparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
if (is_numeric($this->sortitemid)) {
$params = array_merge(array('gitemid'=>$this->sortitemid), $gbr_params, $this->groupwheresql_params);
$params = array_merge(array('gitemid'=>$this->sortitemid), $gbrparams, $this->groupwheresql_params);
// the MAX() magic is required in order to please PG
$sort = "MAX(g.finalgrade) $this->sortorder";
@ -357,7 +355,7 @@ class grade_report_grader extends grade_report {
$sort = "u.idnumber $this->sortorder"; break;
}
$params = array_merge($gbr_params, $this->groupwheresql_params);
$params = array_merge($gbrparams, $this->groupwheresql_params);
$sql = "SELECT DISTINCT u.id, u.firstname, u.lastname, u.imagealt, u.picture, u.idnumber
FROM {user} u
JOIN {role_assignments} ra ON u.id = ra.userid
@ -427,37 +425,37 @@ class grade_report_grader extends grade_report {
* @return string HTML code
*/
public function get_toggles_html() {
global $CFG, $USER, $COURSE;
global $CFG, $USER, $COURSE, $OUTPUT;
$html = '<div id="grade-report-toggles">';
$html = '';
if ($USER->gradeediting[$this->courseid]) {
if (has_capability('moodle/grade:manage', $this->context) or has_capability('moodle/grade:hide', $this->context)) {
$html .= $this->print_toggle('eyecons', true);
$html .= $this->print_toggle('eyecons');
}
if (has_capability('moodle/grade:manage', $this->context)
or has_capability('moodle/grade:lock', $this->context)
or has_capability('moodle/grade:unlock', $this->context)) {
$html .= $this->print_toggle('locks', true);
$html .= $this->print_toggle('locks');
}
if (has_capability('moodle/grade:manage', $this->context)) {
$html .= $this->print_toggle('quickfeedback', true);
$html .= $this->print_toggle('quickfeedback');
}
if (has_capability('moodle/grade:manage', $this->context)) {
$html .= $this->print_toggle('calculations', true);
$html .= $this->print_toggle('calculations');
}
}
if ($this->canviewhidden) {
$html .= $this->print_toggle('averages', true);
$html .= $this->print_toggle('averages');
}
$html .= $this->print_toggle('ranges', true);
$html .= $this->print_toggle('ranges');
if (!empty($CFG->enableoutcomes)) {
$html .= $this->print_toggle('nooutcomes', true);
$html .= $this->print_toggle('nooutcomes');
}
$html .= '</div>';
return $html;
return $OUTPUT->container($html, 'grade-report-toggles');
}
/**
@ -466,54 +464,53 @@ class grade_report_grader extends grade_report {
* @param bool $return Whether to return the HTML string rather than printing it
* @return void
*/
public function print_toggle($type, $return=false) {
public function print_toggle($type) {
global $CFG, $OUTPUT;
$icons = array('eyecons' => 't/hide.gif',
'calculations' => 't/calc.gif',
'locks' => 't/lock.gif',
'averages' => 't/mean.gif',
'quickfeedback' => 't/feedback.gif',
'nooutcomes' => 't/outcomes.gif');
$icons = array('eyecons' => 't/hide',
'calculations' => 't/calc',
'locks' => 't/lock',
'averages' => 't/mean',
'quickfeedback' => 't/feedback',
'nooutcomes' => 't/outcomes');
$pref_name = 'grade_report_show' . $type;
$prefname = 'grade_report_show' . $type;
if (array_key_exists($pref_name, $CFG)) {
$show_pref = get_user_preferences($pref_name, $CFG->$pref_name);
if (array_key_exists($prefname, $CFG)) {
$showpref = get_user_preferences($prefname, $CFG->$prefname);
} else {
$show_pref = get_user_preferences($pref_name);
$showpref = get_user_preferences($prefname);
}
$strshow = $this->get_lang_string('show' . $type, 'grades');
$strhide = $this->get_lang_string('hide' . $type, 'grades');
$show_hide = 'show';
$toggle_action = 1;
$showhide = 'show';
$toggleaction = 1;
if ($show_pref) {
$show_hide = 'hide';
$toggle_action = 0;
if ($showpref) {
$showhide = 'hide';
$toggleaction = 0;
}
if (array_key_exists($type, $icons)) {
$image_name = $icons[$type];
$imagename = $icons[$type];
} else {
$image_name = "t/$type.gif";
$imagename = "t/$type.gif";
}
$string = ${'str' . $show_hide};
$string = ${'str' . $showhide};
$img = '<img src="'.$OUTPUT->old_icon_url($image_name).'" class="iconsmall" alt="'
.$string.'" title="'.$string.'" />'. "\n";
$toggleicon = new moodle_action_icon();
$toggleicon->image->src = $OUTPUT->old_icon_url($imagename);
$toggleicon->image->add_class('iconsmall');
$toggleicon->alt = $string;
$toggleicon->title = $string;
$toggleicon->link->url = $this->baseurl->out(false, array('toggle' => $toggleaction, 'toggle_type' => $type), false);
$retval = '<div class="gradertoggle">' . $img . '<a href="' . $this->baseurl . "&amp;toggle=$toggle_action&amp;toggle_type=$type\">"
. $string . '</a></div>';
$retval = $OUTPUT->container($OUTPUT->action_icon($toggleicon, 'gradertoggle'));
if ($return) {
return $retval;
} else {
echo $retval;
}
}
/**
@ -521,7 +518,7 @@ class grade_report_grader extends grade_report {
* @return string $headerhtml
*/
public function get_headerhtml() {
global $CFG, $USER;
global $CFG, $USER, $OUTPUT;
$this->rowcount = 0;
$fixedstudents = $this->is_fixed_students();
@ -560,7 +557,7 @@ class grade_report_grader extends grade_report {
$numrows = count($this->gtree->get_levels());
$columns_to_unset = array();
$columnstounset = array();
foreach ($this->gtree->get_levels() as $key=>$row) {
$columncount = 0;
@ -574,9 +571,12 @@ class grade_report_grader extends grade_report {
} else {
$headerhtml .= '<tr class="heading r'.$this->rowcount++.'">';
if ($key == $numrows - 1) {
$headerhtml .= '<th class="header c'.$columncount++.'" scope="col"><a href="'.$this->baseurl.'&amp;sortitemid=firstname">'
. $strfirstname . '</a> '
. $firstarrow. '/ <a href="'.$this->baseurl.'&amp;sortitemid=lastname">' . $strlastname . '</a>'. $lastarrow .'</th>';
$sortfirstname = html_link::make(clone($this->baseurl), $strfirstname);
$sortfirstname->url->param('sortitemid', 'firstname');
$sortlastname = html_link::make(clone($this->baseurl), $strlastname);
$sortlastname->url->param('sortitemid', 'lastname');
$headerhtml .= '<th class="header c'.$columncount++.'" scope="col">' . $OUTPUT->link($sortfirstname)
. $firstarrow. '/ ' . $OUTPUT->link($sortlastname) . $lastarrow .'</th>';
if ($showuseridnumber) {
if ('idnumber' == $this->sortitemid) {
if ($this->sortorder == 'ASC') {
@ -587,8 +587,9 @@ class grade_report_grader extends grade_report {
} else {
$idnumberarrow = '';
}
$headerhtml .= '<th class="header c'.$columncount++.' useridnumber" scope="col"><a href="'.$this->baseurl.'&amp;sortitemid=idnumber">'
. get_string('idnumber') . '</a> ' . $idnumberarrow . '</th>';
$sortidnumber = html_link::make(clone($this->baseurl), get_string('idnumber'));
$sortidnumber->url->param('sortitemid', 'idnumber');
$headerhtml .= '<th class="header cc'.$columncount++.' useridnumber" scope="col">' . $OUTPUT->link($sortidnumber) . $idnumberarrow . '</th>';
}
} else {
$colspan='';
@ -606,9 +607,9 @@ class grade_report_grader extends grade_report {
foreach ($row as $columnkey => $element) {
$sort_link = '';
$sortlink = clone($this->baseurl);
if (isset($element['object']->id)) {
$sort_link = $this->baseurl.'&amp;sortitemid=' . $element['object']->id;
$sortlink->param('sortitemid', $element['object']->id);
}
$eid = $element['eid'];
@ -656,12 +657,12 @@ class grade_report_grader extends grade_report {
if ($element['object']->id == $this->sortitemid) {
if ($this->sortorder == 'ASC') {
$arrow = $this->get_sort_arrow('up', $sort_link);
$arrow = $this->get_sort_arrow('up', $sortlink);
} else {
$arrow = $this->get_sort_arrow('down', $sort_link);
$arrow = $this->get_sort_arrow('down', $sortlink);
}
} else {
$arrow = $this->get_sort_arrow('move', $sort_link);
$arrow = $this->get_sort_arrow('move', $sortlink);
}
$hidden = '';
@ -699,27 +700,27 @@ class grade_report_grader extends grade_report {
$fixedstudents = $this->is_fixed_students();
// Preload scale objects for items with a scaleid
$scales_list = array();
$scaleslist = array();
$tabindices = array();
foreach ($this->gtree->get_items() as $item) {
if (!empty($item->scaleid)) {
$scales_list[] = $item->scaleid;
$scaleslist[] = $item->scaleid;
}
$tabindices[$item->id]['grade'] = $gradetabindex;
$tabindices[$item->id]['feedback'] = $gradetabindex + $numusers;
$gradetabindex += $numusers * 2;
}
$scales_array = array();
$scalesarray = array();
if (!empty($scales_list)) {
$scales_array = $DB->get_records_list('scale', 'id', $scales_list);
if (!empty($scaleslist)) {
$scalesarray = $DB->get_records_list('scale', 'id', $scaleslist);
}
$row_classes = array(' even ', ' odd ');
$rowclasses = array(' even ', ' odd ');
$row_classes = array(' even ', ' odd ');
$rowclasses = array(' even ', ' odd ');
foreach ($this->users as $userid => $user) {
@ -727,26 +728,26 @@ class grade_report_grader extends grade_report {
$altered = array();
$unknown = array();
} else {
$hiding_affected = grade_grade::get_hiding_affected($this->grades[$userid], $this->gtree->get_items());
$altered = $hiding_affected['altered'];
$unknown = $hiding_affected['unknown'];
unset($hiding_affected);
$hidingaffected = grade_grade::get_hiding_affected($this->grades[$userid], $this->gtree->get_items());
$altered = $hidingaffected['altered'];
$unknown = $hidingaffected['unknown'];
unset($hidingaffected);
}
$columncount = 0;
if ($fixedstudents) {
$studentshtml .= '<tr class="r'.$this->rowcount++ . $row_classes[$this->rowcount % 2] . '">';
$studentshtml .= '<tr class="r'.$this->rowcount++ . $rowclasses[$this->rowcount % 2] . '">';
} else {
// Student name and link
$user_pic = null;
$userpic = null;
if ($showuserimage) {
$user_pic = '<div class="userpic">' . $OUTPUT->user_picture(moodle_user_picture::make($user, $this->courseid)) . '</div>';
$userpic = $OUTPUT->container($OUTPUT->user_picture(moodle_user_picture::make($user, $this->courseid)), 'userpic');
}
$studentshtml .= '<tr class="r'.$this->rowcount++ . $row_classes[$this->rowcount % 2] . '">'
.'<th class="c'.$columncount++.' user" scope="row" onclick="set_row(this.parentNode.rowIndex);">'.$user_pic
.'<a href="'.$CFG->wwwroot.'/user/view.php?id='.$user->id.'&amp;course='.$this->course->id.'">'
.fullname($user).'</a></th>';
$userlink = html_link::make(new moodle_url($CFG->wwwroot.'/user/view.php', array('id' => $user->id, 'course' => $this->course->id)), fullname($user));
$studentshtml .= '<tr class="r'.$this->rowcount++ . $rowclasses[$this->rowcount % 2] . '">'
.'<th class="c'.$columncount++.' user" scope="row" onclick="set_row(this.parentNode.rowIndex);">'.$userpic
.$OUTPUT->link($userlink).'</th>';
if ($showuseridnumber) {
$studentshtml .= '<th class="c'.$columncount++.' useridnumber" onclick="set_row(this.parentNode.rowIndex);">'.
@ -775,7 +776,8 @@ class grade_report_grader extends grade_report {
if (!$this->canviewhidden and $grade->is_hidden()) {
if (!empty($CFG->grade_hiddenasdate) and $grade->get_datesubmitted() and !$item->is_category_item() and !$item->is_course_item()) {
// the problem here is that we do not have the time when grade value was modified, 'timemodified' is general modification date for grade_grades records
$studentshtml .= '<td class="cell c'.$columncount++.'"><span class="datesubmitted">'.userdate($grade->get_datesubmitted(),get_string('strftimedatetimeshort')).'</span></td>';
$studentshtml .= '<td class="cell c'.$columncount++.'">'
. $OUTPUT->span(userdate($grade->get_datesubmitted(),get_string('strftimedatetimeshort')), 'datesubmitted') . '</td>';
} else {
$studentshtml .= '<td class="cell c'.$columncount++.'">-</td>';
}
@ -801,20 +803,17 @@ class grade_report_grader extends grade_report {
// $cellclasses .= ' excluded';
}
$grade_title = '<div class="fullname">'.fullname($user).'</div>';
$grade_title .= '<div class="itemname">'.$item->get_name(true).'</div>';
$gradetitle = $OUTPUT->container(fullname($user), 'fullname');
$gradetitle .= $OUTPUT->container($item->get_name(true), 'itemname');
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 {
$gradetitle .= $OUTPUT->container(wordwrap(trim(format_string($grade->feedback, $grade->feedbackformat)), 34, '<br/ >'), 'feedback');
}
$studentshtml .= '<td class="'.$cellclasses.'" title="'.s($grade_title).'">';
$studentshtml .= '<td class="'.$cellclasses.'" title="'.s($gradetitle).'">';
if ($grade->is_excluded()) {
$studentshtml .= '<span class="excludedfloater">'.get_string('excluded', 'grades') . '</span> ';
$studentshtml .= $OUTPUT->span(get_string('excluded', 'grades'), 'excludedfloater');
}
// Do not show any icons if no grade (no record in DB to match)
@ -838,12 +837,12 @@ class grade_report_grader extends grade_report {
// or a drop down (for scales)
// grades in item of type grade category or course are not directly editable
if ($item->needsupdate) {
$studentshtml .= '<span class="gradingerror'.$hidden.'">'.get_string('error').'</span>';
$studentshtml .= $OUTPUT->span(get_string('error'), "gradingerror$hidden");
} else if ($USER->gradeediting[$this->courseid]) {
if ($item->scaleid && !empty($scales_array[$item->scaleid])) {
$scale = $scales_array[$item->scaleid];
if ($item->scaleid && !empty($scalesarray[$item->scaleid])) {
$scale = $scalesarray[$item->scaleid];
$gradeval = (int)$gradeval; // scales use only integers
$scales = explode(",", $scale->scale);
// reindex because scale is off 1
@ -875,10 +874,10 @@ class grade_report_grader extends grade_report {
// invalid grade if gradeval < 1
if ($gradeval < 1) {
$studentshtml .= '<span class="gradevalue'.$hidden.$gradepass.'">-</span>';
$studentshtml .= $OUTPUT->span('-', "gradevalue$hidden$gradepass");
} else {
$gradeval = $grade->grade_item->bounded_grade($gradeval); //just in case somebody changes scale
$studentshtml .= '<span class="gradevalue'.$hidden.$gradepass.'">'.$scales[$gradeval-1].'</span>';
$studentshtml .= $OUTPUT->span($scales[$gradeval-1], "gradevalue$hidden$gradepass");
}
} else {
// no such scale, throw error?
@ -889,10 +888,10 @@ class grade_report_grader extends grade_report {
$value = format_float($gradeval, $decimalpoints);
$studentshtml .= '<input type="hidden" name="oldgrade_'.$userid.'_'.$item->id.'" value="'.$value.'" />';
$studentshtml .= '<input size="6" tabindex="' . $tabindices[$item->id]['grade']
. '" type="text" title="'. $strgrade .'" name="grade_'
. '" type="text" class="text" title="'. $strgrade .'" name="grade_'
.$userid.'_' .$item->id.'" value="'.$value.'" />';
} else {
$studentshtml .= '<span class="gradevalue'.$hidden.$gradepass.'">'.format_float($gradeval, $decimalpoints).'</span>';
$studentshtml .= $OUTPUT->span(format_float($gradeval, $decimalpoints), "gradevalue$hidden$gradepass");
}
}
@ -913,10 +912,9 @@ class grade_report_grader extends grade_report {
// If feedback present, surround grade with feedback tooltip: Open span here
if ($item->needsupdate) {
$studentshtml .= '<span class="gradingerror'.$hidden.$gradepass.'">'.get_string('error').'</span>';
$studentshtml .= $OUTPUT->span(get_string('error'), "gradingerror$hidden$gradepass");
} else {
$studentshtml .= '<span class="gradevalue'.$hidden.$gradepass.'">'.grade_format_gradevalue($gradeval, $item, true, $gradedisplaytype, null).'</span>';
$studentshtml .= $OUTPUT->span(grade_format_gradevalue($gradeval, $item, true, $gradedisplaytype, null), "gradevalue$hidden$gradepass");
}
}
@ -965,92 +963,155 @@ class grade_report_grader extends grade_report {
}
if ($fixedstudents) {
$studentshtml .= '<div class="left_scroller">
<table id="fixed_column" class="fixed_grades_column">
<tbody class="leftbody">';
$fixedcolumntable = new html_table();
$fixedcolumntable->id = 'fixed_column';
$fixedcolumntable->add_class('fixed_grades_column');
$fixedcolumntable->bodyclasses = array('leftbody');
$colspan = '';
$colspan = null;
if ($showuseridnumber) {
$colspan = 'colspan="2"';
$colspan = 2;
}
$levels = count($this->gtree->levels) - 1;
for ($i = 0; $i < $levels; $i++) {
$studentshtml .= '
<tr class="heading name_row">
<td '.$colspan.' class="fixedcolumn cell c0 topleft"> </td>
</tr>
';
$fillercell = new html_table_cell();
$fillercell->add_classes(array('fixedcolumn', 'cell', 'c0', 'topleft'));
$fillercell->text = ' ';
$fillercell->colspan = $colspan;
$fixedcolumntable->data[] = html_table_row::make(array($fillercell));
}
$studentshtml .= '<tr class="heading"><th id="studentheader" class="header c0" scope="col"><a href="'.$this->baseurl.'&amp;sortitemid=firstname">'
. $strfirstname . '</a> '
. $firstarrow. '/ <a href="'.$this->baseurl.'&amp;sortitemid=lastname">' . $strlastname . '</a>'. $lastarrow .'</th>';
$sortfirstname = html_link::make(clone($this->baseurl), $strfirstname);
$sortfirstname->url->param('sortitemid', 'firstname');
$sortlastname = html_link::make(clone($this->baseurl), $strlastname);
$sortlastname->url->param('sortitemid', 'lastname');
$headerrow = new html_table_row();
$headerrow->add_class('heading');
$studentheader = new html_table_cell();
$studentheader->add_classes(array('header', 'c0'));
$studentheader->scope = 'col';
$studentheader->header = true;
$studentheader->id = 'studentheader';
$studentheader->text = $OUTPUT->link($sortfirstname) . $firstarrow. '/ ' . $OUTPUT->link($sortlastname) . $lastarrow;
$headerrow->cells[] = $studentheader;
if ($showuseridnumber) {
$sortidnumberlink = html_link::make(clone($this->baseurl), get_string('idnumber'));
$sortidnumberlink->url->param('sortitemid', 'idnumber');
$idnumberheader = new html_table_cell();
$idnumberheader->add_classes(array('header', 'c0', 'useridnumber'));
$idnumberheader->scope = 'col';
$idnumberheader->header = true;
$idnumberheader->text = $OUTPUT->link($sortidnumberlink);
if ('idnumber' == $this->sortitemid) {
if ($this->sortorder == 'ASC') {
$idnumberarrow = print_arrow('up', $strsortasc, true);
$idnumberheader->text .= print_arrow('up', $strsortasc, true);
} else {
$idnumberarrow = print_arrow('down', $strsortdesc, true);
$idnumberheader->text .= print_arrow('down', $strsortdesc, true);
}
} else {
$idnumberarrow = '';
}
$studentshtml .= '<th class="header c0 useridnumber" scope="col"><a href="'.$this->baseurl.'&amp;sortitemid=idnumber">'
. get_string('idnumber') . '</a> ' . $idnumberarrow . '</th>';
$headerrow->cells[] = $idnumberheader;
}
$studentshtml .= '</tr>';
$fixedcolumntable->data[] = $headerrow;
if ($USER->gradeediting[$this->courseid]) {
$studentshtml .= '<tr class="controls"><th class="header c0 controls" scope="row" '.$colspan.'>'.$this->get_lang_string('controls','grades').'</th></tr>';
$controlsrow = new html_table_row();
$controlsrow->add_class('controls');
$controlscell = new html_table_cell();
$controlscell->add_classes(array('header', 'c0', 'controls'));
$controlscell->colspan = $colspan;
$controlscell->text = $this->get_lang_string('controls','grades');
$controlsrow->cells[] = $controlscell;
$fixedcolumntable->data[] = $controlsrow;
}
$row_classes = array(' even ', ' odd ');
$rowclasses = array('even', 'odd');
foreach ($this->users as $userid => $user) {
$userrow = new html_table_row();
$userrow->add_classes(array('r'.$this->rowcount++, $rowclasses[$this->rowcount % 2]));
$usercell = new html_table_cell();
$usercell->add_classes(array('c0', 'user'));
$usercell->header = true;
$usercell->scope = 'row';
$usercell->add_action('click', 'yui_set_row');
$user_pic = null;
if ($showuserimage) {
$user_pic = '<div class="userpic">' . $OUTPUT->user_picture(moodle_user_picture::make($user, $this->courseid)) . "</div>\n";
$usercell->text = $OUTPUT->container($OUTPUT->user_picture(moodle_user_picture::make($user, $this->courseid)), 'userpic');
}
$studentshtml .= '<tr class="r'.$this->rowcount++ . $row_classes[$this->rowcount % 2] . '">'
.'<th class="c0 user" scope="row" onclick="set_row(this.parentNode.rowIndex);">'.$user_pic
.'<a href="'.$CFG->wwwroot.'/user/view.php?id='.$user->id.'&amp;course='.$this->course->id.'">'
.fullname($user)."</a></th>\n";
$usercell->text .= $OUTPUT->link(html_link::make(new moodle_url($CFG->wwwroot.'/user/view.php', array('id' => $user->id, 'course' => $this->course->id)), fullname($user)));
$userrow->cells[] = $usercell;
if ($showuseridnumber) {
$studentshtml .= '<th class="header c0 useridnumber" onclick="set_row(this.parentNode.rowIndex);">'. $user->idnumber."</th>\n";
$idnumbercell = new html_table_cell();
$idnumbercell->add_classes(array('header', 'c0', 'useridnumber'));
$idnumbercell->header = true;
$idnumbercell->scope = 'row';
$idnumbercell->add_action('click', 'yui_set_row');
$userrow->cells[] = $idnumbercell;
}
$studentshtml .= "</tr>\n";
$fixedcolumntable->data[] = $userrow;
}
if ($this->get_pref('showranges')) {
$studentshtml .= '<tr class="range r'.$this->rowcount++.'">' . '<th class="header c0 range " '.$colspan.' scope="row">'.$this->get_lang_string('range','grades').'</th></tr>';
$rangerow = new html_table_row();
$rangerow->add_classes(array('range', 'r'.$this->rowcount++));
$rangecell = new html_table_cell();
$rangecell->add_classes(array('header', 'c0', 'range'));
$rangecell->colspan = $colspan;
$rangecell->header = true;
$rangecell->scope = 'row';
$rangecell->text = $this->get_lang_string('range','grades');
$rangerow->cells[] = $rangecell;
$fixedcolumntable->data[] = $rangerow;
}
// Averages heading
$straverage_group = get_string('groupavg', 'grades');
$straveragegroup = get_string('groupavg', 'grades');
$straverage = get_string('overallaverage', 'grades');
$showaverages = $this->get_pref('showaverages');
$showaverages_group = $this->currentgroup && $showaverages;
$showaveragesgroup = $this->currentgroup && $showaverages;
if ($showaverages_group) {
$studentshtml .= '<tr class="groupavg r'.$this->rowcount++.'"><th class="header c0" '.$colspan.'scope="row">'.$straverage_group.'</th></tr>';
if ($showaveragesgroup) {
$groupavgrow = new html_table_row();
$groupavgrow->add_classes(array('groupavg', 'r'.$this->rowcount++));
$groupavgcell = new html_table_cell();
$groupavgcell->add_classes(array('header', 'c0', 'range'));
$groupavgcell->colspan = $colspan;
$groupavgcell->header = true;
$groupavgcell->scope = 'row';
$groupavgcell->text = $straveragegroup;
$groupavgrow->cells[] = $groupavgcell;
$fixedcolumntable->data[] = $groupavgrow;
}
if ($showaverages) {
$studentshtml .= '<tr class="avg r'.$this->rowcount++.'"><th class="header c0" '.$colspan.'scope="row">'.$straverage.'</th></tr>';
$avgrow = new html_table_row();
$avgrow->add_classes(array('avg', 'r'.$this->rowcount++));
$avgcell = new html_table_cell();
$avgcell->add_classes(array('header', 'c0', 'range'));
$avgcell->colspan = $colspan;
$avgcell->header = true;
$avgcell->scope = 'row';
$avgcell->text = $straverage;
$avgrow->cells[] = $avgcell;
$fixedcolumntable->data[] = $avgrow;
}
$studentshtml .= '</tbody>
</table>
</div>
$studentshtml .= $OUTPUT->container($OUTPUT->table($fixedcolumntable), 'left_scroller');
$studentshtml .= '
<div class="right_scroller">
<table id="user-grades" class="">
<tbody class="righttest">';
@ -1105,14 +1166,14 @@ class grade_report_grader extends grade_report {
$showaverages = $this->currentgroup && $this->get_pref('showaverages');
$groupsql = $this->groupsql;
$groupwheresql = $this->groupwheresql;
$groupwheresql_params = $this->groupwheresql_params;
$groupwheresqlparams = $this->groupwheresql_params;
$avgcssclass = 'groupavg';
} else {
$straverage = get_string('overallaverage', 'grades');
$showaverages = $this->get_pref('showaverages');
$groupsql = "";
$groupwheresql = "";
$groupwheresql_params = array();
$groupwheresqlparams = array();
}
if ($shownumberofgrades) {
@ -1121,10 +1182,10 @@ class grade_report_grader extends grade_report {
$totalcount = $this->get_numusers($grouponly);
list($usql, $roles_params) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
list($usql, $rolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
if ($showaverages) {
$params = array_merge(array('courseid'=>$this->courseid), $roles_params, $groupwheresql_params);
$params = array_merge(array('courseid'=>$this->courseid), $rolesparams, $groupwheresqlparams);
// find sums of all grade items in course
$SQL = "SELECT g.itemid, SUM(g.finalgrade) AS sum
@ -1139,10 +1200,10 @@ class grade_report_grader extends grade_report {
AND g.finalgrade IS NOT NULL
$groupwheresql
GROUP BY g.itemid";
$sum_array = array();
$sumarray = array();
if ($sums = $DB->get_records_sql($SQL, $params)) {
foreach ($sums as $itemid => $csum) {
$sum_array[$itemid] = $csum->sum;
$sumarray[$itemid] = $csum->sum;
}
}
@ -1151,7 +1212,7 @@ class grade_report_grader extends grade_report {
// 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)
$params = array_merge(array('courseid'=>$this->courseid), $roles_params, $groupwheresql_params);
$params = array_merge(array('courseid'=>$this->courseid), $rolesparams, $groupwheresqlparams);
$SQL = "SELECT gi.id, COUNT(u.id) AS count
FROM {grade_items} gi
CROSS JOIN {user} u
@ -1165,7 +1226,7 @@ class grade_report_grader extends grade_report {
$groupwheresql
GROUP BY gi.id";
$ungraded_counts = $DB->get_records_sql($SQL, $params);
$ungradedcounts = $DB->get_records_sql($SQL, $params);
$fixedstudents = $this->is_fixed_students();
if (!$fixedstudents) {
@ -1184,21 +1245,21 @@ class grade_report_grader extends grade_report {
continue;
}
if (!isset($sum_array[$item->id])) {
$sum_array[$item->id] = 0;
if (!isset($sumarray[$item->id])) {
$sumarray[$item->id] = 0;
}
if (empty($ungraded_counts[$itemid])) {
$ungraded_count = 0;
if (empty($ungradedcounts[$itemid])) {
$ungradedcount = 0;
} else {
$ungraded_count = $ungraded_counts[$itemid]->count;
$ungradedcount = $ungradedcounts[$itemid]->count;
}
if ($meanselection == GRADE_REPORT_MEAN_GRADED) {
$mean_count = $totalcount - $ungraded_count;
$meancount = $totalcount - $ungradedcount;
} else { // Bump up the sum by the number of ungraded items * grademin
$sum_array[$item->id] += $ungraded_count * $item->grademin;
$mean_count = $totalcount;
$sumarray[$item->id] += $ungradedcount * $item->grademin;
$meancount = $totalcount;
}
$decimalpoints = $item->get_decimals();
@ -1222,16 +1283,16 @@ class grade_report_grader extends grade_report {
$decimalpoints = $averagesdecimalpoints;
}
if (!isset($sum_array[$item->id]) || $mean_count == 0) {
if (!isset($sumarray[$item->id]) || $meancount == 0) {
$avghtml .= '<td class="cell c' . $columncount++.'">-</td>';
} else {
$sum = $sum_array[$item->id];
$avgradeval = $sum/$mean_count;
$sum = $sumarray[$item->id];
$avgradeval = $sum/$meancount;
$gradehtml = grade_format_gradevalue($avgradeval, $item, true, $displaytype, $decimalpoints);
$numberofgrades = '';
if ($shownumberofgrades) {
$numberofgrades = " ($mean_count)";
$numberofgrades = " ($meancount)";
}
$avghtml .= '<td class="cell c' . $columncount++.'">'.$gradehtml.$numberofgrades.'</td>';
@ -1275,9 +1336,9 @@ class grade_report_grader extends grade_report {
$hidden = ' hidden ';
}
$formatted_range = $item->get_formatted_range($rangesdisplaytype, $rangesdecimalpoints);
$formattedrange = $item->get_formatted_range($rangesdisplaytype, $rangesdecimalpoints);
$rangehtml .= '<th class="header c'.$columncount++.' range"><span class="rangevalues'.$hidden.'">'. $formatted_range .'</span></th>';
$rangehtml .= '<th class="header c'.$columncount++.' range"><span class="rangevalues'.$hidden.'">'. $formattedrange .'</span></th>';
}
$rangehtml .= '</tr>';
@ -1333,39 +1394,39 @@ class grade_report_grader extends grade_report {
* @return string HTML
*/
protected function get_icons($element) {
global $CFG, $USER;
global $CFG, $USER, $OUTPUT;
if (!$USER->gradeediting[$this->courseid]) {
return '<div class="grade_icons" />';
}
// Init all icons
$edit_icon = '';
$editicon = '';
if ($element['type'] != 'categoryitem' && $element['type'] != 'courseitem') {
$edit_icon = $this->gtree->get_edit_icon($element, $this->gpr);
$editicon = $this->gtree->get_edit_icon($element, $this->gpr);
}
$edit_calculation_icon = '';
$show_hide_icon = '';
$lock_unlock_icon = '';
$editcalculationicon = '';
$showhideicon = '';
$lockunlockicon = '';
if (has_capability('moodle/grade:manage', $this->context)) {
if ($this->get_pref('showcalculations')) {
$edit_calculation_icon = $this->gtree->get_calculation_icon($element, $this->gpr);
$editcalculationicon = $this->gtree->get_calculation_icon($element, $this->gpr);
}
if ($this->get_pref('showeyecons')) {
$show_hide_icon = $this->gtree->get_hiding_icon($element, $this->gpr);
$showhideicon = $this->gtree->get_hiding_icon($element, $this->gpr);
}
if ($this->get_pref('showlocks')) {
$lock_unlock_icon = $this->gtree->get_locking_icon($element, $this->gpr);
$lockunlockicon = $this->gtree->get_locking_icon($element, $this->gpr);
}
}
return '<div class="grade_icons">'.$edit_icon.$edit_calculation_icon.$show_hide_icon.$lock_unlock_icon.'</div>';
return $OUTPUT->container($editicon.$editcalculationicon.$showhideicon.$lockunlockicon, 'grade_icons');
}
/**
@ -1376,26 +1437,32 @@ class grade_report_grader extends grade_report {
protected function get_collapsing_icon($element) {
global $OUTPUT;
$contract_expand_icon = '';
$icon = '';
// If object is a category, display expand/contract icon
if ($element['type'] == 'category') {
// Load language strings
$strswitch_minus = $this->get_lang_string('aggregatesonly', 'grades');
$strswitch_plus = $this->get_lang_string('gradesonly', 'grades');
$strswitch_whole = $this->get_lang_string('fullmode', 'grades');
$strswitchminus = $this->get_lang_string('aggregatesonly', 'grades');
$strswitchplus = $this->get_lang_string('gradesonly', 'grades');
$strswitchwhole = $this->get_lang_string('fullmode', 'grades');
$expand_contract = 'switch_minus'; // Default: expanded
$contractexpandicon = new moodle_action_icon();
$contractexpandicon->link->url = new moodle_url($this->gpr->get_return_url(null, array('target'=>$element['eid'], 'action'=>'switch_minus', 'sesskey'=>sesskey())));
$contractexpandicon->image->add_class('iconsmall');
$contractexpandicon->image->src = $OUTPUT->old_icon_url('t/switch_minus');
$contractexpandicon->image->alt = $strswitchminus;
if (in_array($element['object']->id, $this->collapsed['aggregatesonly'])) {
$expand_contract = 'switch_plus';
$contractexpandicon->image->src = $OUTPUT->old_icon_url('t/switch_plus');
$contractexpandicon->image->alt = $strswitchplus;
$contractexpandicon->link->url->param('action', 'switch_plus');
} elseif (in_array($element['object']->id, $this->collapsed['gradesonly'])) {
$expand_contract = 'switch_whole';
$contractexpandicon->image->src = $OUTPUT->old_icon_url('t/switch_whole');
$contractexpandicon->image->alt = $strswitchwhole;
$contractexpandicon->link->url->param('action', 'switch_whole');
}
$url = $this->gpr->get_return_url(null, array('target'=>$element['eid'], 'action'=>$expand_contract, 'sesskey'=>sesskey()));
$contract_expand_icon = '<a href="'.$url.'"><img src="'.$OUTPUT->old_icon_url('t/' . $expand_contract) . '" class="iconsmall" alt="'
.${'str'.$expand_contract}.'" title="'.${'str'.$expand_contract}.'" /></a>';
$icon = $OUTPUT->action_icon($contractexpandicon);
}
return $contract_expand_icon;
return $icon;
}
/**

View file

@ -323,12 +323,16 @@ vertical-align:middle;
padding:0;
}
.grade-report-grader td input {
.grade-report-grader td input.text {
border:1px solid #666;
margin-left:10px;
margin-right:10px;
}
.grade-report-grader td input.submit {
margin: 10px 10px 0px 10px;
}
.grade-report-grader table#quick_edit td.fullname {
border-left:none;
padding-left:5px;

View file

@ -316,15 +316,18 @@ abstract class grade_report {
/**
* Returns an arrow icon inside an <a> tag, for the purpose of sorting a column.
* @param string $direction
* @param string $sort_link
* @param moodle_url $sort_link
* @param string HTML
*/
protected function get_sort_arrow($direction='move', $sort_link=null) {
protected function get_sort_arrow($direction='move', $sortlink=null) {
global $OUTPUT;
$matrix = array('up' => 'desc', 'down' => 'asc', 'move' => 'desc');
$strsort = $this->get_lang_string('sort' . $matrix[$direction]);
$arrow = print_arrow($direction, $strsort, true);
$html = '<a href="'.$sort_link .'" title="'.$strsort.'">' . $arrow . '</a>';
$link = html_link::make($sortlink, $arrow);
$link->title = $strsort;
$html = $OUTPUT->link($link);
return $html;
}
}

View file

@ -475,6 +475,7 @@ $string['savepreferences'] = 'Save preferences';
$string['scaledpct'] = 'Scaled %%';
$string['scaleidhelp'] = 'When using the scale grade type, a scale can be selected. The scale for an activity-based grade item is selected on the update activity page.';
$string['scalestandardhelp'] = 'A standard scale is one that is available site-wide, for all courses.';
$string['scaleconfirmdelete'] = 'Are you sure you wish to delete the scale \"$a\"?';
$string['seeallcoursegrades'] = 'See all course grades';
$string['selectdestination'] = 'Select destination of $a';
$string['selectalloroneuser'] = 'Select all or one user';

View file

@ -1052,6 +1052,19 @@ class html_table extends labelled_html_component {
* @var bool true causes the contents of the heading cells to be rotated 90 degrees.
*/
public $rotateheaders = false;
/**
* @var array $headclasses Array of CSS classes to apply to the table's thead.
*/
public $headclasses = array();
/**
* @var array $bodyclasses Array of CSS classes to apply to the table's tbody.
*/
public $bodyclasses = array();
/**
* @var array $footclasses Array of CSS classes to apply to the table's tfoot.
*/
public $footclasses = array();
/**
* @see moodle_html_component::prepare()
@ -1416,12 +1429,8 @@ class html_form extends moodle_html_component {
* @return void
*/
public function __construct() {
static $yes;
$this->button = new html_button();
if (!isset($yes)) {
$yes = get_string('yes');
$this->button->text = $yes;
}
$this->button->text = get_string('yes');
}
/**

View file

@ -1554,10 +1554,18 @@ class moodle_core_renderer extends moodle_renderer_base {
/**
* Prints an inline span element with optional text contents.
*
* @param html_span $span A html_span object
* @param mixed $span A html_span object or some string content to wrap in a span
* @param mixed $classes A space-separated list or an array of classes. Only used if $span is a string
* @return string A HTML fragment
*/
public function span($span) {
public function span($span, $classes='') {
if (!($span instanceof html_span)) {
$text = $span;
$span = new html_span();
$span->contents = $text;
$span->add_classes($classes);
}
$span = clone($span);
$span->prepare();
$this->prepare_event_handlers($span);
@ -2028,7 +2036,7 @@ class moodle_core_renderer extends moodle_renderer_base {
if (!empty($table->head)) {
$countcols = count($table->head);
$output .= $this->output_start_tag('thead', array()) . "\n";
$output .= $this->output_start_tag('thead', $table->headclasses) . "\n";
$output .= $this->output_start_tag('tr', array()) . "\n";
$keys = array_keys($table->head);
$lastkey = end($keys);
@ -2077,7 +2085,7 @@ class moodle_core_renderer extends moodle_renderer_base {
$oddeven = 1;
$keys = array_keys($table->data);
$lastrowkey = end($keys);
$output .= $this->output_start_tag('tbody', array()) . "\n";
$output .= $this->output_start_tag('tbody', $table->bodyclasses) . "\n";
foreach ($table->data as $key => $row) {
if (($row === 'hr') && ($countcols)) {