--- loncom/interface/statistics/lonstathelpers.pm 2013/07/15 14:33:02 1.71
+++ loncom/interface/statistics/lonstathelpers.pm 2020/09/07 02:58:25 1.76.2.3
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonstathelpers.pm,v 1.71 2013/07/15 14:33:02 bisitz Exp $
+# $Id: lonstathelpers.pm,v 1.76.2.3 2020/09/07 02:58:25 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -135,9 +135,12 @@ Skips 'survey' problems.
####################################################
####################################################
sub problem_selector {
- my ($AcceptedResponseTypes,$sequence_addendum,$symbmode,$all,$prefix,$smallbox,$onclick) = @_;
+ my ($AcceptedResponseTypes,$sequence_addendum,$symbmode,$all,$prefix,
+ $byres,$include_tools,$smallbox,$onclick) = @_;
# all: also make sequences selectable
# prefix: prefix for all form names
+# byres: radiobutton shown per resource
+# include_tools: external tools included
# smallbox: use smaller box
# onclick: javascript to execute when clicked
my $Str;
@@ -156,6 +159,36 @@ sub problem_selector {
foreach my $seq (@sequences) {
my $seq_str = '';
foreach my $res (&get_resources($navmap,$seq)) {
+ if ($res->src() eq '/res/lib/templates/simpleproblem.problem') {
+ next if (grep(/^placeholder$/,@{$res->parts}));
+ }
+ my $title = $res->compTitle;
+ if (! defined($title) || $title eq '') {
+ ($title) = ($res->src =~ m:/([^/]*)$:);
+ }
+ my $totalresps = 0;
+ if ($byres) {
+ foreach my $part (@{$res->parts}) {
+ $totalresps += scalar($res->responseIds($part));
+ }
+ my $value = &HTML::Entities::encode($res->symb(),'<>&"');
+ my $checked;
+ if ($env{'form.problemchoice'} eq $res->symb()) {
+ $checked = ' checked="checked"';
+ }
+ my $rowspan;
+ if ($totalresps > 1) {
+ $rowspan = ' rowspan="'.$totalresps.'"';
+ }
+ $seq_str .= &Apache::loncommon::start_data_table_row().
+ '
'.
+ ' '.
+ $title.' ';
+ my $link = $res->link.'?symb='.&escape($res->shown_symb);
+ $seq_str .= (' 'x2).
+ ''.&mt('view').' ';
+ }
+ my %partsseen;
foreach my $part (@{$res->parts}) {
my @response_ids = $res->responseIds($part);
my @response_types = $res->responseType($part);
@@ -163,52 +196,85 @@ sub problem_selector {
my $respid = $response_ids[$i];
my $resptype = $response_types[$i];
if ($resptype =~ m/$AcceptedResponseTypes/) {
- my $value = &make_target_id({symb=>$res->symb,
- part=>$part,
- respid=>$respid,
- resptype=>$resptype});
- my $checked = '';
- if ($env{'form.problemchoice'} eq $value) {
- $checked = ' checked="checked"';
- }
- my $title = $res->compTitle;
- if (! defined($title) || $title eq '') {
- ($title) = ($res->src =~ m:/([^/]*)$:);
- }
- $seq_str .= &Apache::loncommon::start_data_table_row().
- ($symbmode?
- ' '
- :qq{ }).
- ''.$resptype.' '.
- ''.$title.' ';
- if (scalar(@response_ids) > 1) {
- $seq_str .= &mt('response').' '.$respid;
+ if ($byres) {
+ if (exists($partsseen{$part})) {
+ $seq_str .= &Apache::loncommon::continue_data_table_row();
+ } else {
+ my $parttitle = $part;
+ if ($part eq '0') {
+ $parttitle = '';
+ }
+ if ($parttitle ne '') {
+ $parttitle = (' 'x2).&mt('part').': '.$parttitle;
+ }
+ if (keys(%partsseen)) {
+ $seq_str .= &Apache::loncommon::continue_data_table_row();
+ }
+ unless ($partsseen{$part}) {
+ my $resprowspan;
+ if (scalar(@response_ids) > 1) {
+ $resprowspan = ' rowspan="'.scalar(@response_ids).'"';
+ }
+ $seq_str .= ''.
+ $parttitle.' ';
+ $partsseen{$part} = scalar(@response_ids);
+ }
+ }
+ $seq_str .= ''.$resptype;
+ if (scalar(@response_ids) > 1) {
+ $seq_str .= ' '.&mt('id').': '.$respid;
+ }
+ $seq_str .= ' '. &Apache::loncommon::end_data_table_row()."\n";
+ } else {
+ my $value = &make_target_id({symb=>$res->symb,
+ part=>$part,
+ respid=>$respid,
+ resptype=>$resptype});
+ my $checked = '';
+ if ($env{'form.problemchoice'} eq $value) {
+ $checked = ' checked="checked"';
+ }
+ $seq_str .= &Apache::loncommon::start_data_table_row().
+ ($symbmode?
+ ' '
+ :qq{ }).
+ ''.$resptype.' '.
+ ''.$title.' ';
+ if (scalar(@response_ids) > 1) {
+ $seq_str .= &mt('response').' '.$respid;
+ }
+ my $link = $res->link.'?symb='.&escape($res->shown_symb);
+ $seq_str .= (' 'x2).
+ ''.&mt('view').' ';
+ $seq_str .= " ". &Apache::loncommon::end_data_table_row()."\n";
+ $rb_count++;
}
- my $link = $res->link.'?symb='.&escape($res->shown_symb);
- $seq_str .= (' 'x2).
- ''.&mt('view').' ';
- $seq_str .= "". &Apache::loncommon::end_data_table_row()."\n";
- $rb_count++;
}
}
}
}
if ($seq_str ne '') {
- $Str .= &Apache::loncommon::start_data_table_header_row().
- ''.
- ($all?' ':'').
- $seq->compTitle.' '.
- &Apache::loncommon::end_data_table_header_row()."\n".$seq_str;
- if (defined($sequence_addendum)) {
+ if ($byres) {
$Str .= &Apache::loncommon::start_data_table_header_row().
- (' 'x2).
- ''.$sequence_addendum.' '.
- &Apache::loncommon::end_data_table_header_row()."\n";
+ ''.$seq->compTitle.' '.
+ &Apache::loncommon::end_data_table_header_row().
+ $seq_str;
+ } else {
+ $Str .= &Apache::loncommon::start_data_table_header_row().
+ ''.
+ ($all?' ':'').
+ $seq->compTitle.' '.
+ &Apache::loncommon::end_data_table_header_row()."\n".$seq_str;
+ if (defined($sequence_addendum)) {
+ $Str .= &Apache::loncommon::start_data_table_header_row().
+ (' 'x2).
+ ''.$sequence_addendum.' '.
+ &Apache::loncommon::end_data_table_header_row()."\n";
+ }
}
}
-
}
$Str .= &Apache::loncommon::end_data_table().&Apache::loncommon::end_scrollbox()."\n";
return $Str;
@@ -286,7 +352,8 @@ END
END
if (ref($anoncounter) eq 'HASH') {
if (keys(%{$anoncounter}) > 0) {
- my $anonwarning = &mt('Your selection includes both problems with and without anonymous submissions.').'\n'.&mt('You must select either only anonymous or only named problems.').'\n\n'.&mt('If a selection contains both anonymous and named parts, [_1]use the Anoymous/Named buttons to ensure selections will be either all anonymous [_1]or all named.','\n');
+ my $anonwarning = &mt('Your selection includes both problems with and without anonymous submissions.')."\n".&mt('You must select either only anonymous or only named problems.')."\n\n".&mt('If a selection contains both anonymous and named parts,[_1]use the Anonymous/Named buttons to ensure selections will be either all anonymous[_1]or all named.',"\n");
+ &js_escape(\$anonwarning);
$checkanonjs = <<"END";