--- loncom/interface/statistics/lonstathelpers.pm 2013/07/15 14:33:02 1.71
+++ loncom/interface/statistics/lonstathelpers.pm 2020/08/31 14:36:19 1.77
@@ -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.77 2020/08/31 14:36:19 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -108,10 +108,17 @@ sub render_resource {
####################################################
####################################################
sub get_resources {
- my ($navmap,$sequence) = @_;
- my @resources = $navmap->retrieveResources($sequence,
- sub { shift->is_problem(); },
- 0,0,0);
+ my ($navmap,$sequence,$include_tools) = @_;
+ my @resources;
+ if ($include_tools) {
+ @resources = $navmap->retrieveResources($sequence,
+ sub { shift->is_gradable(); },
+ 0,0,0);
+ } else {
+ @resources = $navmap->retrieveResources($sequence,
+ sub { shift->is_problem(); },
+ 0,0,0);
+ }
return @resources;
}
@@ -135,9 +142,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;
@@ -155,60 +165,123 @@ sub problem_selector {
return $navmap if (! ref($navmap)); # error
foreach my $seq (@sequences) {
my $seq_str = '';
- foreach my $res (&get_resources($navmap,$seq)) {
+ foreach my $res (&get_resources($navmap,$seq,$include_tools)) {
+ 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);
+ my (@response_ids,@response_types);
+ if ($res->is_tool) {
+ @response_ids = ();
+ @response_types = ('tool');
+ } else {
+ @response_ids = $res->responseIds($part);
+ @response_types = $res->responseType($part);
+ }
for (my $i=0;$i$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) {
+ unless (exists($partsseen{$part})) {
+ 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}) {
+ $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().
+ ''.$seq->compTitle.' '.
+ &Apache::loncommon::end_data_table_header_row().
+ $seq_str;
+ } else {
$Str .= &Apache::loncommon::start_data_table_header_row().
- (' 'x2).
- ''.$sequence_addendum.' '.
- &Apache::loncommon::end_data_table_header_row()."\n";
+ ''.
+ ($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 +359,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";