--- loncom/interface/coursecatalog.pm 2012/02/14 00:29:50 1.58.4.8.2.1
+++ loncom/interface/coursecatalog.pm 2014/04/28 22:12:55 1.84
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler for displaying the course catalog interface
#
-# $Id: coursecatalog.pm,v 1.58.4.8.2.1 2012/02/14 00:29:50 raeburn Exp $
+# $Id: coursecatalog.pm,v 1.84 2014/04/28 22:12:55 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -66,8 +66,11 @@ sub handler {
}
my $formname = 'coursecatalog';
if ($env{'form.showdom'} ne '') {
+ $env{'form.showdom'} = &LONCAPA::clean_domain($env{'form.showdom'});
if (&Apache::lonnet::domain($env{'form.showdom'}) ne '') {
$codedom = $env{'form.showdom'};
+ } else {
+ $env{'form.showdom'} = '';
}
}
my $domdesc = &Apache::lonnet::domain($codedom,'description');
@@ -75,23 +78,151 @@ sub handler {
my %domconfig =
&Apache::lonnet::get_dom('configuration',['coursecategories'],$codedom);
- my (@cats,@trails,%allitems,%idx,@jsarray,%subcathash,$cathash);
+ my $knownuser = &user_is_known();
+
+ my ($cathash,$cattype);
if (ref($domconfig{'coursecategories'}) eq 'HASH') {
$cathash = $domconfig{'coursecategories'}{'cats'};
+ if ($knownuser) {
+ $cattype = $domconfig{'coursecategories'}{'auth'};
+ } else {
+ $cattype = $domconfig{'coursecategories'}{'unauth'};
+ }
} else {
$cathash = {};
+ $cattype = 'std';
+ }
+ if ($cattype eq 'none') {
+ $r->print(&Apache::loncommon::start_page('Course/Community Catalog'));
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/coursecatalog",
+ text=>"Course/Community Catalog"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog'));
+ if ($knownuser) {
+ $r->print('
'.&mt('No catalog of LON-CAPA courses/communities is provided for: [_1]',$domdesc).'
');
+ } else {
+ if ($domconfig{'coursecategories'}{'auth'} eq 'none') {
+ $r->print(''.&mt('No catalog of LON-CAPA courses/communities is provided for: [_1]',$domdesc).'
');
+ } else {
+ $r->print(''.&mt('The catalog of LON-CAPA courses/communities provided for: "[_1]" is only available to users who are logged in.',$domdesc).'
');
+ }
+ }
+ $r->print(&Apache::loncommon::end_page());
+ return OK;
}
- my $subcats;
+
+ my $cnum;
+ if ($cattype eq 'codesrch') {
+ my ($uniquecode,$codemsg,$brtext);
+ if ($env{'form.uniquecode'}) {
+ $uniquecode = $env{'form.uniquecode'};
+ $uniquecode =~ s/^\s+|\s+$//g;
+ }
+ my $js = ''."\n";
+ $r->print(&Apache::loncommon::start_page('Search for a Course/Community',$js));
+ if ($uniquecode =~ /^\w{6}$/) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/coursecatalog",
+ text=>"Course/Community Catalog"});
+ $brtext = 'Search Result';
+ } else {
+ $brtext = 'Course/Community Catalog';
+ }
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/coursecatalog",
+ text=>"$brtext"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog'));
+ $r->print(&coursesearch($codedom,$domdesc,$uniquecode));
+ if ($uniquecode =~ /^\w{6}$/) {
+ $r->print(' ');
+ my $confname = $codedom.'-domainconfig';
+ my %codes = &Apache::lonnet::get('uniquecodes',[$uniquecode],$codedom,$confname);
+ if ($codes{$uniquecode}) {
+ $cnum = $codes{$uniquecode};
+ my %courses = &Apache::lonnet::courseiddump($codedom,'.',1,'.','.',
+ $cnum,undef,undef,'.',1);
+ if (keys(%courses)) {
+ $env{'form.coursenum'} = $cnum;
+ my %courseinfo = &build_courseinfo_hash(\%courses,$knownuser,$codedom);
+ undef($env{'form.coursenum'});
+ if (ref($courseinfo{$codedom.'_'.$cnum}) eq 'HASH') {
+ $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ my @cols = ('title','ownerlastnames','seclist','access');
+ my %lt = &Apache::lonlocal::texthash(
+ title => 'Title',
+ ownerlastnames => 'Owner & Co-owner(s)',
+ seclist => 'Sections',
+ access => 'Default Access Dates for Students',
+ );
+ my @shown;
+ foreach my $item (@cols) {
+ if ($courseinfo{$codedom.'_'.$cnum}{$item}) {
+ push(@shown,$item);
+ }
+ }
+ my $num = 0;
+ foreach my $item (@shown) {
+ $num ++;
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{$item}).
+ $courseinfo{$codedom.'_'.$cnum}{$item});
+ if ($item eq 'title') {
+ if ($courseinfo{$codedom.'_'.$cnum}{'showsyllabus'}) {
+ $r->print(' '.
+ ''.
+ &mt('Syllabus').' ');
+ }
+ }
+ my $arg = ( $num == scalar(@shown) ? 1 : '' );
+ $r->print(&Apache::lonhtmlcommon::row_closure($arg));
+ }
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
+ my $selfenroll = &selfenroll_status($courseinfo{$codedom.'_'.$cnum},$codedom.'_'.$cnum);
+ if ($selfenroll) {
+ $r->print(' '.$selfenroll);
+ }
+ $r->print(''."\n");
+
+ } else {
+ $codemsg = &mt('Code matched, but course ID to which this mapped is invalid.');
+ }
+ } else {
+ $codemsg = &mt('Code matched, but course ID to which this mapped is invalid.');
+ }
+ } else {
+ $codemsg = &mt('No match');
+ }
+ }
+ $r->print(' '.&Apache::loncommon::end_page());
+ return OK;
+ } else {
+ if ($env{'form.coursenum'}) {
+ $cnum = $env{'form.coursenum'};
+ }
+ }
+
+ if ($env{'form.catalog_maxdepth'} ne '') {
+ $env{'form.catalog_maxdepth'} =~ s{\D}{}g;
+ }
+
+ my (@cats,@trails,%allitems,%idx,@jsarray,%subcathash,$subcats);
if ($env{'form.withsubcats'}) {
$subcats = \%subcathash;
}
&Apache::loncommon::extract_categories($cathash,\@cats,\@trails,\%allitems,
\%idx,\@jsarray,$subcats);
my ($numtitles,@codetitles);
- if ($env{'form.coursenum'} ne '' && &user_is_known()) {
+ if (($env{'form.coursenum'} ne '') && ($knownuser)) {
&course_details($r,$codedom,$formname,$domdesc,\@trails,\%allitems,\@codetitles);
} else {
my ($catlinks,$has_subcats,$selitem) = &category_breadcrumbs($codedom,@cats);
+ my $wasacctext = &get_wasactive_text();
my $catjs = <<"ENDSCRIPT";
function setCatDepth(depth) {
@@ -114,10 +245,39 @@ function setCourseId(caller) {
}
ENDSCRIPT
- $catjs .= &courselink_javascript();
+ $catjs .= &courselink_javascript();
+ if (&user_is_dc($codedom)) {
+ $catjs .= <print(&print_course_listing($codedom,$numtitles,undef,undef,undef,
\@codetitles));
@@ -140,7 +300,7 @@ function check_selected() {
ENDJS
}
$catjs = '';
- &cat_header($r,$codedom,$catjs,\%add_entries,$catlinks);
+ &cat_header($r,$codedom,$catjs,\%add_entries,$catlinks,undef,$cattype);
if ($env{'form.currcat_0'} ne '') {
$r->print('');
+ $r->print(
+ &Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog').
+ ''.
+ (($env{'form.currcat_0'} eq 'communities::0') ?
+ &mt('Detailed community information:') :
+ &mt('Detailed course information:')).
+ ' '.
+ &print_course_listing($codedom,undef,$trails,$allitems,undef,$codetitles).
+ ' '.
+ '');
return;
}
+sub coursesearch {
+ my ($codedom,$domdesc,$uniquecode) = @_;
+ my %lt = &Apache::lonlocal::texthash (
+ crlk => 'Course look-up',
+ code => 'Code',
+ ifyo => 'Enter the course code (six letters and numbers)',
+ srch => 'Find course',
+ );
+ return <<"END";
+$lt{'crlk'} ($domdesc)
+$lt{'ifyo'}
+
+END
+}
+
sub courselink_javascript {
return <<"END";
@@ -250,7 +428,7 @@ END
}
sub instcode_course_selector {
- my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs,$codetitles) = @_;
+ my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs,$codetitles,$cattype) = @_;
my %coursecodes = ();
my %codes = ();
my %cat_titles = ();
@@ -263,13 +441,19 @@ sub instcode_course_selector {
my ($jscript,$totcodes,$numtitles,$lasttitle) =
&Apache::courseclassifier::instcode_selectors_data($codedom,$formname,
\%cat_items,$codetitles,\%cat_titles,\%cat_order);
- my $js = '';
+ my $js = '';
if ($totcodes) {
if (($env{'form.state'} eq 'listing') && ($numtitles > 0)) {
- $add_entries{'onLoad'} = 'setElements()';
+ $add_entries{'onLoad'} = 'setElements();';
}
- &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles);
+ if (&user_is_dc($codedom)) {
+ $add_entries{'onLoad'} .= ' toggleStatuses();toggleWasActive();'
+ }
+ &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles,$cattype);
my $cat_maxdepth = $env{'form.catalog_maxdepth'};
$r->print(' ');
} else {
- $js = '';
- &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles);
+ $js = '';
+ &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles,$cattype);
my $cat_maxdepth = $env{'form.catalog_maxdepth'};
$r->print('');
}
@@ -380,8 +563,6 @@ sub category_breadcrumbs {
if (($env{'form.currcat_0'} ne '') &&
($env{'form.currcat_0'} ne 'instcode::0')) {
$catlinks .= $crumbsymbol;
- } else {
- $catlinks .= '';
}
}
} else {
@@ -500,8 +681,13 @@ sub get_depth_values {
sub additional_filters {
my ($codedom,$has_subcats) = @_;
- my $output = '';
- if (($env{'form.currcat_0'} ne 'instcode::0') &&
+ my $is_dc = &user_is_dc($codedom);
+ my $output = '';
+ if ($is_dc) {
+ $output .= '
'.&mt('Options').' ';
+ }
+ $output .= '';
+ if (($env{'form.currcat_0'} ne 'instcode::0') &&
($env{'form.currcat_0'} ne '') && ($has_subcats)) {
my $include_subcat_status;
if ($env{'form.withsubcats'}) {
@@ -517,11 +703,11 @@ sub additional_filters {
}
my ($catname) = split(/:/,$env{'form.currcat_'.$counter});
if ($catname ne '') {
- $output .= ' '.
+ $output .= ''.
' '.
&mt('Include subcategories within "[_1]"',
- &unescape($catname)).' ';
+ &unescape($catname)).' ';
}
}
my $show_selfenroll_status;
@@ -530,25 +716,38 @@ sub additional_filters {
}
my $selfenroll_text;
if ($env{'form.currcat_0'} eq 'communities::0') {
- $selfenroll_text = &mt('Only show communities which allow self-enrollment');
+ $selfenroll_text = &mt('Only show communities which currently allow self-enrollment (or will allow it in the future)');
} else {
- $selfenroll_text = &mt('Only show courses which allow self-enrollment');
+ $selfenroll_text = &mt('Only show courses which currently allow self-enrollment (or will allow it in the future)');
}
- $output .= ''.
+ $output .= ''.
' '.$selfenroll_text.
- ' ';
- if (&user_is_dc($codedom)) {
+ ' ';
+ if ($is_dc) {
+ my ($titlesref,$orderref) = &get_statustitles('filters');
my $showdetails_status;
if ($env{'form.showdetails'}) {
$showdetails_status = 'checked="checked" ';
}
my $showhidden_status;
if ($env{'form.showhidden'}) {
- $showhidden_status = 'checked="checked" ';
+ $showhidden_status = 'checked="checked" ';
}
+ my @currstatuses = &Apache::loncommon::get_env_multiple('form.showcounts');
my $dc_title = &Apache::lonnet::plaintext('dc');
- my ($details_text,$hidden_text);
+ my ($details_text,$hidden_text,$statusdisplay,$cellborder);
+ my $wasactivedisplay = 'none';
+ if ($env{'form.showdetails'}) {
+ $statusdisplay = 'block';
+ $cellborder = 'border-left: 1px solid;';
+ if (grep(/^Previous$/,@currstatuses)) {
+ $wasactivedisplay = 'block';
+ }
+ } else {
+ $statusdisplay = 'none';
+ $cellborder = 'border-left: 0px';
+ }
if ($env{'form.currcat_0'} eq 'communities::0') {
$details_text = &mt('Show full details for each community ([_1] only)',$dc_title);
$hidden_text = &mt('Include communities set to be hidden from catalog ([_1] only)',$dc_title);
@@ -556,15 +755,100 @@ sub additional_filters {
$details_text = &mt('Show full details for each course ([_1] only)',$dc_title);
$hidden_text = &mt('Include courses set to be hidden from catalog ([_1] only)',$dc_title);
}
- $output .= ''."\n".
- ' '.$details_text.
- ' '."\n".' '.
+ $output .= ''.
' '.$hidden_text.
- ' '."\n".' ';
+ ' '."\n".
+ ''.
+ ' '.
+ $details_text.' '."\n".
+ ''.
+ '';
+ if (ref($orderref) eq 'ARRAY') {
+ if (@{$orderref} > 0) {
+ foreach my $type (@{$orderref}) {
+ my $checked;
+ if (grep(/^\Q$type\E$/,@currstatuses)) {
+ $checked = ' checked="checked"';
+ }
+ my $title;
+ if (ref($titlesref) eq 'HASH') {
+ $title = $titlesref->{$type};
+ }
+ unless ($title) {
+ $title = &mt($type);
+ }
+ my $onclick;
+ if ($type eq 'Previous') {
+ $onclick = ' onclick="toggleWasActive();"';
+ }
+ $output .= '
'.
+ ' '.$title.' ';
+ if ($type eq 'Previous') {
+ my %milestonetext = &Apache::lonlocal::texthash (
+ accessend => 'immediately prior to default end access date',
+ enrollend => 'immediately prior to end date for auto-enrollment',
+ date => 'immediately prior to specific date:',
+ );
+ my @statuses = &Apache::loncommon::get_env_multiple('form.showcounts');
+ $output .= '
';
+ if ($checked) {
+ $output .= &get_wasactive_text();
+ }
+ $output .= ' '.
+ '
'.
+ '
';
+ my @milestones = ('accessend');
+ if (&Apache::lonnet::auto_run(undef,$codedom)) {
+ push(@milestones,'enrollend');
+ }
+ push(@milestones,'date');
+ foreach my $item (@milestones) {
+ my $checked;
+ if ($env{'form.state'} eq 'listing') {
+ if ($env{'form.wasactive'} eq $item) {
+ $checked = ' checked="checked"';
+ }
+ } elsif ($item eq 'accessend') {
+ $checked = ' checked="checked"';
+ }
+ $output .=
+ ' '.
+ ''.
+ ' '.
+ $milestonetext{$item}.' ';
+ if ($item eq 'date') {
+ my $wasactiveon;
+ if (grep(/^Previous$/,@currstatuses)) {
+ $wasactiveon =
+ &Apache::lonhtmlcommon::get_date_from_form('wasactiveon');
+ } else {
+ $wasactiveon = 'now';
+ }
+ $output .= ' '.
+ &Apache::lonhtmlcommon::date_setter('coursecatalog',
+ 'wasactiveon',
+ $wasactiveon,
+ '','','',1,'',
+ '','',1);
+ }
+ $output .= ' ';
+ }
+ $output .= '
';
+ }
+ $output .= '
';
+ }
+ }
+ }
+ $output .= '
';
+ } else {
+ $output .= '';
}
- $output .= '
';
+ $output .= '
'.
+ '
';
return $output;
}
@@ -581,6 +865,40 @@ sub user_is_dc {
return;
}
+sub get_statustitles {
+ my ($caller) = @_;
+ my @status_order = ('Active','Future','Previous');
+ my %status_title;
+ if ($caller eq 'filters') {
+ %status_title = &Apache::lonlocal::texthash(
+ Previous => 'Show count for past access',
+ Active => 'Show count for current student access',
+ Future => 'Show count for future student access',
+ );
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $status_title{'Active'} = 'Show count for current member access';
+ $status_title{'Future'} = 'Show count for future member access';
+ }
+ } else {
+ %status_title = &Apache::lonlocal::texthash(
+ Previous => 'Previous access',
+ Active => 'Current access',
+ Future => 'Future access',
+ );
+ }
+ return (\%status_title,\@status_order);
+}
+
+sub get_wasactive_text {
+ my $wasacctext = ' -- ';
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $wasacctext .= &mt('where member access status was current ...');
+ } else {
+ $wasacctext .= &mt('where student access status was current ...');
+ }
+ return $wasacctext;
+}
+
sub search_official_courselist {
my ($domain,$numtitles,$codetitles) = @_;
my $instcode = &Apache::courseclassifier::instcode_search_str($domain,$numtitles,$codetitles);
@@ -655,11 +973,13 @@ sub print_course_listing {
$env{'form.coursenum'},
undef,undef,'.',1);
if (keys(%courses) == 0) {
+ $output = '';
if ($env{'form.currcat_0'} eq 'communities::0') {
$output .= &mt('The courseID provided does not match a community in this domain.');
- } else {
+ } else {
$output .= &mt('The courseID provided does not match a course in this domain.');
}
+ $output .= '
';
return $output;
}
} else {
@@ -669,11 +989,13 @@ sub print_course_listing {
%courses = &search_courselist($domain,$subcats);
}
if (keys(%courses) == 0) {
+ $output = '';
if ($env{'form.currcat_0'} eq 'communities::0') {
- $output = &mt('No communities match the criteria you selected.');
+ $output .= &mt('No communities match the criteria you selected.');
} else {
- $output = &mt('No courses match the criteria you selected.');
+ $output .= &mt('No courses match the criteria you selected.');
}
+ $output .= '
';
return $output;
}
if (($knownuser) && (!$env{'form.showdetails'}) && (!&user_is_dc($domain))) {
@@ -683,9 +1005,8 @@ sub print_course_listing {
}
}
my $now = time;
- my %domconfig =
- &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
- $output .= &construct_data_table($knownuser,\%courses,$details,undef,$now,\%domconfig,$trails,$allitems);
+ $output .= &construct_data_table($knownuser,$domain,\%courses,$details,undef,
+ $now,$trails,$allitems);
$output .= "\n".'