'."\n";
$Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);
$Str .= ' ';
+ $Str .= &Apache::lonstatistics::GroupSelect('Group','multiple',5);
+ $Str .= ' ';
$Str .= &Apache::lonstatistics::StudentDataSelect('StudentData','multiple',
5,undef);
$Str .= ' '."\n";
@@ -650,6 +658,18 @@ sub html_initialize {
&mt('Unable to retrieve course information.').
'');
}
+
+ # If we're showing links, show a checkbox to open in new
+ # windows.
+ if ($show_links ne 'no') {
+ $r->print(<new_window = true;
+Show links in new window:
+
+
+NEW_WINDOW_CHECKBOX
+ }
+
#
$r->print("".$env{'course.'.$env{'request.course.id'}.'.description'}.
" ".localtime(time)." ");
@@ -719,6 +739,61 @@ sub html_initialize {
$Str .= "";
$r->print($Str);
$r->rflush();
+
+ $r->print(<
+// get the left offset of a given widget as an absolute position
+function getLeftOffset (element) {
+ return collect(element, "offsetLeft");
+}
+
+// get the top offset of a given widget as an absolute position
+function getTopOffset (element) {
+ return collect(element, "offsetTop");
+}
+
+function collect(element, att) {
+ var val = 0;
+ while(element) {
+ val += element[att];
+ element = element.offsetParent;
+ }
+ return val;
+}
+
+var currentDiv;
+var oldBorder;
+var currentElement;
+function popup_score(element, score) {
+ popdown_score();
+ var left = getLeftOffset(element);
+ var top = getTopOffset(element);
+ var div = document.createElement("div");
+ div.style.border = "1px solid #8888FF";
+ div.style.backgroundColor = "#CCCCFF";
+ div.appendChild(document.createTextNode(score));
+ div.style.position = "absolute";
+ div.style.top = (top - 25) + "px";
+ div.style.left = (left - 10) + "px";
+ currentDiv = div;
+ document.body.insertBefore(div, document.body.childNodes[0]);
+ oldBorder = element.style.border;
+ element.style.border = "1px solid yellow";
+ currentElement = element;
+}
+
+function popdown_score() {
+ if (currentDiv) {
+ document.body.removeChild(currentDiv);
+ }
+ if (currentElement) {
+ currentElement.style.border = oldBorder;
+ }
+ currentDiv = undefined;
+}
+
+JS
+
#
# Let the user know what we are doing
my $studentcount = scalar(@Apache::lonstatistics::Students);
@@ -1374,7 +1449,7 @@ sub excel_outputstudent {
foreach my $field (@to_show) {
my $value = $student->{$field};
if ($field eq 'comments') {
- $value = &Apache::lonmsg::retrieve_instructor_comments
+ $value = &Apache::lonmsgdisplay::retrieve_instructor_comments
($student->{'username'},$student->{'domain'});
}
$excel_sheet->write($rows_output,$cols_output++,$value);
@@ -1656,7 +1731,7 @@ sub csv_outputstudent {
foreach my $field (@to_show) {
my $value = $student->{$field};
if ($field eq 'comments') {
- $value = &Apache::lonmsg::retrieve_instructor_comments
+ $value = &Apache::lonmsgdisplay::retrieve_instructor_comments
($student->{'username'},$student->{'domain'});
}
$Str .= '"'.&Apache::loncommon::csv_translate($value).'",';
@@ -1748,6 +1823,18 @@ sub csv_finish {
}
+# This function will return an HTML string including a star, with
+# a mouseover popup showing the "real" value. An optional second
+# argument lets you show something other than a star.
+sub show_star {
+ my $popup = shift;
+ my $symbol = shift || '*';
+ # Escape the popup for JS.
+ $popup =~ s/([^-a-zA-Z0-9:;,._ ()|!\/?=&*])/'\\' . sprintf("%lo", ord($1))/ge;
+
+ return "$symbol ";
+}
+
#######################################################
#######################################################
@@ -1813,12 +1900,12 @@ sub student_tries_on_sequence {
if ($status eq 'excused') {
$symbol = 'x';
$max--;
- } elsif ($status eq 'correct_by_override') {
+ } elsif ($status eq 'correct_by_override' && !$resource->is_task()) {
$symbol = '+';
$sum++;
} elsif ($tries > 0) {
if ($tries > 9) {
- $symbol = '*';
+ $symbol = show_star($tries);
} else {
$symbol = $tries;
}
@@ -1861,11 +1948,12 @@ sub student_tries_on_sequence {
if (length($symbol) > 1) {
&Apache::lonnet::logthis('length of symbol "'.$symbol.'" > 1');
}
- $symbol = ''.$symbol.' ';
+ '&command=submission';
+ $symbol = &link($symbol, $link);
}
$value .= $symbol;
}
@@ -1880,6 +1968,37 @@ sub student_tries_on_sequence {
return ($Str,$performance_length,$sum,$max,\@TriesData);
}
+=pod
+
+=item &link
+
+Inputs:
+
+=over 4
+
+=item $text
+
+=item $target
+
+=back
+
+Takes the text and creates a link to the $text that honors
+the value of 'new window' if clicked on, but uses a real
+'href' so middle and right clicks still work.
+
+$target and $text are assumed to be already correctly escaped; i.e., it
+can be dumped out directly into the output stream as-is.
+
+=cut
+
+sub link {
+ my ($text,$target) = @_;
+ return
+ "$text ";
+}
+
#######################################################
#######################################################
@@ -1953,7 +2072,7 @@ sub student_performance_on_sequence {
$symbol = sprintf("%.0f",$symbol);
}
if (length($symbol) > 1) {
- $symbol = '*';
+ $symbol = show_star($symbol);
}
if (exists($resource_data->{'resource.'.$part.'.solved'}) &&
$resource_data->{'resource.'.$part.'.solved'} ne '') {
@@ -1984,11 +2103,12 @@ sub student_performance_on_sequence {
push (@ScoreData,$partscore);
#
if ( ($links eq 'yes' && $symbol ne ' ') || ($links eq 'all')) {
- $symbol = ''.$symbol.' ';
+ '&command=submission';
+ $symbol = &link($symbol, $link);
}
$Str .= $symbol;
}