--- loncom/interface/coursecatalog.pm 2009/07/31 02:13:05 1.53
+++ loncom/interface/coursecatalog.pm 2013/11/21 16:34:23 1.58.4.9
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler for displaying the course catalog interface
#
-# $Id: coursecatalog.pm,v 1.53 2009/07/31 02:13:05 raeburn Exp $
+# $Id: coursecatalog.pm,v 1.58.4.9 2013/11/21 16:34:23 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -66,13 +66,20 @@ 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');
&Apache::lonhtmlcommon::clear_breadcrumbs();
+ if ($env{'form.catalog_maxdepth'} ne '') {
+ $env{'form.catalog_maxdepth'} =~ s{\D}{}g;
+ }
+
my %domconfig =
&Apache::lonnet::get_dom('configuration',['coursecategories'],$codedom);
my (@cats,@trails,%allitems,%idx,@jsarray,%subcathash,$cathash);
@@ -87,8 +94,9 @@ sub handler {
}
&Apache::loncommon::extract_categories($cathash,\@cats,\@trails,\%allitems,
\%idx,\@jsarray,$subcats);
+ my ($numtitles,@codetitles);
if ($env{'form.coursenum'} ne '' && &user_is_known()) {
- &course_details($r,$codedom,$formname,$domdesc,\@trails,\%allitems);
+ &course_details($r,$codedom,$formname,$domdesc,\@trails,\%allitems,\@codetitles);
} else {
my ($catlinks,$has_subcats,$selitem) = &category_breadcrumbs($codedom,@cats);
my $catjs = <<"ENDSCRIPT";
@@ -114,12 +122,12 @@ function setCourseId(caller) {
ENDSCRIPT
$catjs .= &courselink_javascript();
- my $numtitles;
if ($env{'form.currcat_0'} eq 'instcode::0') {
$numtitles = &instcode_course_selector($r,$codedom,$formname,$domdesc,
- $catlinks,$catjs);
+ $catlinks,$catjs,\@codetitles);
if ($env{'form.state'} eq 'listing') {
- $r->print(&print_course_listing($codedom,$numtitles));
+ $r->print(&print_course_listing($codedom,$numtitles,undef,undef,undef,
+ \@codetitles));
}
} else {
my (%add_entries);
@@ -149,16 +157,22 @@ ENDJS
for (my $i=0; $i<$deeper; $i++) {
$r->print(' '."\n");
}
+ my $display_button;
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $display_button = &mt('Display communities');
+ } else {
+ $display_button = &mt('Display courses');
+ }
$r->print(' '."\n".
' '."\n".
' '."\n".
' '.
' ');
+ $display_button.'" /> ');
}
if ($env{'form.state'} eq 'listing') {
- $r->print(&print_course_listing($codedom,undef,\@trails,\%allitems,$subcats));
+ $r->print(&print_course_listing($codedom,undef,\@trails,\%allitems,$subcats,\@codetitles));
}
}
}
@@ -167,14 +181,14 @@ ENDJS
}
sub course_details {
- my ($r,$codedom,$formname,$domdesc,$trails,$allitems) = @_;
+ my ($r,$codedom,$formname,$domdesc,$trails,$allitems,$codetitles) = @_;
my $output;
my %add_entries = (topmargin => "0",
marginheight => "0",);
my $js = ''."\n";
my $start_page =
- &Apache::loncommon::start_page('Course Catalog',$js,
+ &Apache::loncommon::start_page('Course/Community Catalog',$js,
{
'add_entries' => \%add_entries,
'no_inline_link' => 1,});
@@ -182,19 +196,35 @@ sub course_details {
if ($env{'form.numtitles'} > 0) {
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/coursecatalog",
- text=>"Select courses"});
+ text=>"Course/Community Catalog"});
+ }
+ my $brtextone = 'Course listing';
+ my $brtexttwo = 'Course details';
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $brtextone = 'Community listing';
+ $brtexttwo = 'Community details';
}
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"javascript:document.$formname.submit()",
- text=>"Course listing"},
- {text=>"Course details"});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Details'));
- $r->print(' '.&mt('Detailed course information:').' '.
- &print_course_listing($codedom,undef,$trails,$allitems).
+ text=>$brtextone},
+ {text=>$brtexttwo});
+ $r->print(' ');
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $r->print(&mt('Detailed community information:'));
+ } else {
+ $r->print(&mt('Detailed course information:'));
+ }
+ $r->print(' '.
+ &print_course_listing($codedom,undef,$trails,$allitems,undef,$codetitles).
' ');
$r->print('
');
return;
@@ -227,10 +257,9 @@ END
}
sub instcode_course_selector {
- my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs) = @_;
+ my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs,$codetitles) = @_;
my %coursecodes = ();
my %codes = ();
- my @codetitles = ();
my %cat_titles = ();
my %cat_order = ();
my %cat_items;
@@ -240,7 +269,7 @@ sub instcode_course_selector {
marginheight => "0",);
my ($jscript,$totcodes,$numtitles,$lasttitle) =
&Apache::courseclassifier::instcode_selectors_data($codedom,$formname,
- \%cat_items,\@codetitles,\%cat_titles,\%cat_order);
+ \%cat_items,$codetitles,\%cat_titles,\%cat_order);
my $js = '';
if ($totcodes) {
@@ -257,12 +286,11 @@ sub instcode_course_selector {
if ($numtitles > 0) {
$r->print(''.&mt('Choose which course(s) to list.').' '.
&Apache::courseclassifier::build_instcode_selectors($numtitles,
- $lasttitle,\%cat_items,\@codetitles,\%cat_titles,\%cat_order));
+ $lasttitle,\%cat_items,$codetitles,\%cat_titles,\%cat_order));
}
$r->print(' '."\n".
' '."\n".
' '."\n".
- ' '."\n".
' '.
' "Select courses"},
- {text=>"Course listing"});
+ text=>"Course/Community Catalog"},
+ {text=>$brtext});
} else {
&Apache::lonhtmlcommon::add_breadcrumb
- ({text=>"Course listing"});
+ ({text=>$brtext});
}
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Listing'));
} else {
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/coursecatalog",
- text=>"Select courses"});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('Select courses'));
+ text=>"Course/Community Catalog"});
}
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog'));
my $onchange;
unless ($env{'form.interface'} eq 'textual') {
$onchange = 'this.form.submit()';
@@ -326,73 +357,71 @@ sub category_breadcrumbs {
my ($dom,@cats) = @_;
my $crumbsymbol = ' ▶ ';
my ($currdepth,$deeper) = &get_depth_values();
- my $currcat_str = ' ';
- my $catlinks = ''.&mt('Catalog:').' ';
+ my $currcat_str =
+ ' '.
+ ' ';
+ my $catlinks = ''.&mt('Catalog:').' ';
my $has_subcats;
my $selitem;
- for (my $i=0; $i<$deeper; $i++) {
- $currcat_str .= ' ';
- my ($cattitle,$shallower);
- if ($i == 0) {
- if (ref($cats[0]) eq 'ARRAY') {
- if (@{$cats[0]} > 1) {
- $cattitle = &mt('Main Categories');
- }
+ if (ref($cats[0]) eq 'ARRAY') {
+ if (@{$cats[0]} == 0) {
+ $catlinks .= &mt('No categories defined in this domain');
+ } elsif (@{$cats[0]} == 1) {
+ if ($cats[0][0] eq 'instcode') {
+ $catlinks .= &mt('Official courses (with institutional codes)');
+ $env{'form.currcat_0'} = 'instcode::0';
+ } elsif ($cats[0][0] eq 'communities') {
+ $catlinks .= &mt('Communities');
+ $env{'form.currcat_0'} = 'communities::0';
+ } else {
+ my $name = $cats[0][0];
+ my $item = &escape($name).'::0';
+ $catlinks .= $name;
+ $env{'form.currcat_0'} = $item;
}
+ $currcat_str .= ' ';
} else {
- $shallower = $i-1;
- my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$env{'form.currcat_'.$shallower});
- $cattitle = $cat;
- }
- if ($cattitle ne '') {
- $catlinks .= ' '.$cattitle.' '.$crumbsymbol.' ';
- }
- }
- if ($deeper == 0) {
- $catlinks .= '';
- if (ref($cats[0]) eq 'ARRAY') {
- if ((@{$cats[0]} == 1) && (@cats == 1)) {
- if ($cats[0][0] eq 'instcode') {
- $catlinks .= &mt('Official courses (with institutional codes)').
- ' ';
- $env{'form.currcat_0'} = 'instcode::0';
- } else {
- my $name = $cats[0][0];
- my $item = &escape($name).'::0';
- $catlinks .= $name.
- ' ';
- $env{'form.currcat_0'} = $item;
- }
+ $catlinks .= &main_category_selector(@cats);
+ if (($env{'form.currcat_0'} ne '') &&
+ ($env{'form.currcat_0'} ne 'instcode::0')) {
+ $catlinks .= $crumbsymbol;
} else {
- $has_subcats = 1;
- my $buttontext = &mt('Show subcategories');
- $selitem = 'currcat_0';
- $catlinks .= ''."\n";
- if (@{$cats[0]} > 1) {
- $catlinks .= ''.&mt('Select').' '."\n";
- $buttontext = &mt('Pick main category');
- }
- for (my $i=0; $i<@{$cats[0]}; $i++) {
- my $name = $cats[0][$i];
- my $item = &escape($name).'::0';
- $catlinks .= '';
- if ($name eq 'instcode') {
- $catlinks .= &mt('Official courses (with institutional codes)');
- } else {
- $catlinks .= $name;
+ $catlinks .= ' ';
+ }
+ }
+ } else {
+ $catlinks .= &mt('Official courses (with institutional codes)');
+ $env{'form.currcat_0'} = 'instcode::0';
+ $currcat_str .= ' ';
+ }
+ if ($deeper) {
+ for (my $i=1; $i<=$deeper; $i++) {
+ my $shallower = $i-1;
+ next if ($shallower == 0);
+ my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$env{'form.currcat_'.$shallower});
+ if ($cat ne '') {
+ $catlinks .= ''.
+ '';
+ if (ref($cats[$shallower]{$container}) eq 'ARRAY') {
+ $catlinks .= ''.&mt('De-select').' ';
+ for (my $j=0; $j<@{$cats[$shallower]{$container}}; $j++) {
+ my $name = $cats[$shallower]{$container}[$j];
+ my $item = &escape($name).':'.&escape($container).':'.$shallower;
+ my $selected = '';
+ if ($item eq $env{'form.currcat_'.$shallower}) {
+ $selected = ' selected="selected"';
+ }
+ $catlinks .=
+ ''.$name.' ';
}
- $catlinks .= ''."\n";
}
- $catlinks .= ' '."\n".
- ' ';
+ $catlinks .= '';
}
- } else {
- $catlinks .= &mt('Official courses (with institutional codes)').
- ' ';
- $env{'form.currcat_0'} = 'instcode::0';
+ unless ($i == $deeper) {
+ $catlinks .= $crumbsymbol;
+ }
}
- } else {
my ($cat,$container,$depth);
if ($env{'form.currcat_'.$currdepth} eq '') {
my $shallower = $currdepth - 1;
@@ -400,38 +429,66 @@ sub category_breadcrumbs {
} else {
($cat,$container,$depth) = map { &unescape($_); } split(/:/,$env{'form.currcat_'.$currdepth});
}
- my $deeper = $depth +1;
- my $currcat = $cat;
- if ($cat eq 'instcode') {
- $currcat = &mt('Official courses (with institutional codes)');
- }
- $catlinks .= ' '.$currcat.' ';
- if (ref($cats[$deeper]{$cat}) eq 'ARRAY') {
+ my $deeperlevel = $depth +1;
+ if (ref($cats[$deeperlevel]{$cat}) eq 'ARRAY') {
$has_subcats = 1;
my $buttontext = &mt('Show subcategories');
- $selitem = 'currcat_'.$deeper;
- $catlinks .= ': ';
- if (@{$cats[$deeper]{$cat}} > 1) {
+ my $selitem = 'currcat_'.$deeperlevel;
+ $catlinks .= ' ';
+ if (@{$cats[$deeperlevel]{$cat}}) {
$catlinks .= ''.
- &mt('Select').' ';
- $buttontext = &mt('Pick subcategory');
+ &mt('Subcategory ...').'';
}
- for (my $k=0; $k<@{$cats[$deeper]{$cat}}; $k++) {
- my $name = $cats[$deeper]{$cat}[$k];
- my $item = &escape($name).':'.&escape($cat).':'.$deeper;
+ for (my $k=0; $k<@{$cats[$deeperlevel]{$cat}}; $k++) {
+ my $name = $cats[$deeperlevel]{$cat}[$k];
+ my $item = &escape($name).':'.&escape($cat).':'.$deeperlevel;
$catlinks .= ''.$name.' '."\n";
}
- $catlinks .= ' '."\n".
- ' ';
+ $catlinks .= ' '."\n";
} elsif ($cat ne 'instcode') {
$catlinks .= ' '.&mt('(No subcategories)');
}
+ } else {
+ $selitem = 'currcat_0';
}
$catlinks .= $currcat_str.'
';
return ($catlinks,$has_subcats,$selitem);
}
+sub main_category_selector {
+ my (@cats) = @_;
+ my $maincatlinks = ''."\n";
+ if (ref($cats[0]) eq 'ARRAY') {
+ if (@{$cats[0]} > 1) {
+ my $selected = '';
+ if ($env{'form.currcat_0'} eq '') {
+ $selected = ' selected="selected"';
+ }
+ $maincatlinks .=
+ ''.&mt('Select').' '."\n";
+ }
+ for (my $i=0; $i<@{$cats[0]}; $i++) {
+ my $name = $cats[0][$i];
+ my $item = &escape($name).'::0';
+ my $selected;
+ if ($env{'form.currcat_0'} eq $item) {
+ $selected = ' selected="selected"';
+ }
+ $maincatlinks .= '';
+ if ($name eq 'instcode') {
+ $maincatlinks .= &mt('Official courses (with institutional codes)');
+ } elsif ($name eq 'communities') {
+ $maincatlinks .= &mt('Communities');
+ } else {
+ $maincatlinks .= $name;
+ }
+ $maincatlinks .= ' '."\n";
+ }
+ $maincatlinks .= ' '."\n";
+ }
+ return $maincatlinks;
+}
+
sub get_depth_values {
my $currdepth = 0;
my $deeper = 0;
@@ -476,10 +533,15 @@ sub additional_filters {
if ($env{'form.showselfenroll'}) {
$show_selfenroll_status = 'checked="checked" ';
}
+ my $selfenroll_text;
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $selfenroll_text = &mt('Only show communities which allow self-enrollment');
+ } else {
+ $selfenroll_text = &mt('Only show courses which allow self-enrollment');
+ }
$output .= ' '.
' '.
- &mt('Only show courses which allow self-enrollment').
+ $show_selfenroll_status.'/>'.$selfenroll_text.
' ';
if (&user_is_dc($codedom)) {
my $showdetails_status;
@@ -491,14 +553,20 @@ sub additional_filters {
$showhidden_status = 'checked="checked" ';
}
my $dc_title = &Apache::lonnet::plaintext('dc');
+ my ($details_text,$hidden_text);
+ 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);
+ } else {
+ $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".
' '.
- &mt('Show full details for each course ([_1] only)',$dc_title).
+ $showdetails_status.'/>'.$details_text.
' '."\n".' '.
' '.
- &mt('Include courses set to be hidden from catalog ([_1] only)',$dc_title).
+ $showhidden_status.'/>'.$hidden_text.
' '."\n".' ';
}
$output .= '
';
@@ -519,8 +587,8 @@ sub user_is_dc {
}
sub search_official_courselist {
- my ($domain,$numtitles) = @_;
- my $instcode = &Apache::courseclassifier::instcode_search_str($domain,$numtitles);
+ my ($domain,$numtitles,$codetitles) = @_;
+ my $instcode = &Apache::courseclassifier::instcode_search_str($domain,$numtitles,$codetitles);
my $showhidden;
if (&user_is_dc($domain)) {
$showhidden = $env{'form.showhidden'};
@@ -559,20 +627,25 @@ sub search_courselist {
} else {
$filterstr = $filter;
}
- my $showhidden;
+ my ($showhidden,$typefilter);
if (&user_is_dc($domain)) {
$showhidden = $env{'form.showhidden'};
}
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $typefilter = 'Community';
+ } else {
+ $typefilter = '.';
+ }
%courses =
&Apache::lonnet::courseiddump($domain,'.',1,'.','.','.',undef,undef,
- '.',1,$env{'form.showselfenroll'},
+ $typefilter,1,$env{'form.showselfenroll'},
$filterstr,$showhidden,'coursecatalog');
}
return %courses;
}
sub print_course_listing {
- my ($domain,$numtitles,$trails,$allitems,$subcats) = @_;
+ my ($domain,$numtitles,$trails,$allitems,$subcats,$codetitles) = @_;
my $output;
my %courses;
my $knownuser = &user_is_known();
@@ -587,17 +660,25 @@ sub print_course_listing {
$env{'form.coursenum'},
undef,undef,'.',1);
if (keys(%courses) == 0) {
- $output .= &mt('The courseID provided does not match a course in this domain.');
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $output .= &mt('The courseID provided does not match a community in this domain.');
+ } else {
+ $output .= &mt('The courseID provided does not match a course in this domain.');
+ }
return $output;
}
} else {
if ($env{'form.currcat_0'} eq 'instcode::0') {
- %courses = &search_official_courselist($domain,$numtitles);
+ %courses = &search_official_courselist($domain,$numtitles,$codetitles);
} else {
%courses = &search_courselist($domain,$subcats);
}
if (keys(%courses) == 0) {
- $output = &mt('No courses match the criteria you selected.');
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $output = &mt('No communities match the criteria you selected.');
+ } else {
+ $output = &mt('No courses match the criteria you selected.');
+ }
return $output;
}
if (($knownuser) && (!$env{'form.showdetails'}) && (!&user_is_dc($domain))) {
@@ -652,10 +733,14 @@ sub construct_data_table {
}
if ($knownuser) {
if ($details) {
- $output .=
- ''.&mt('Default Access Dates for Students').' '.
- ''.&mt('Student Counts').' '.
- ''.&mt('Auto-enrollment of[_1]registered students',' ').' ';
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $output .= ''.&mt('Default Access Dates for Members').' ';
+ } else {
+ $output .=
+ ''.&mt('Default Access Dates for Students').' '.
+ ''.&mt('Student Counts').' '.
+ ''.&mt('Auto-enrollment of[_1]registered students',' ').' ';
+ }
} else {
$output .= ''.&mt('Details').' ';
}
@@ -726,14 +811,14 @@ sub build_courseinfo_hash {
$selfenroll_end = $courses->{$course}{'selfenroll_end_date'};
$categories = $courses->{$course}{'categories'};
push(@owners,$singleowner);
- if (ref($courses->{$course}{'co-owners'}) eq 'ARRAY') {
- foreach my $item (@{$courses->{$course}{'co-owners'}}) {
+ if ($courses->{$course}{'co-owners'} ne '') {
+ foreach my $item (split(/,/,$courses->{$course}{'co-owners'})) {
push(@owners,$item);
}
}
}
foreach my $owner (@owners) {
- my ($ownername,$ownerdom) = @_;
+ my ($ownername,$ownerdom);
if ($owner =~ /:/) {
($ownername,$ownerdom) = split(/:/,$owner);
} else {
@@ -924,10 +1009,14 @@ sub courseinfo_row {
''.$ownerlast.' ';
if ($knownuser) {
if ($details) {
- $output .=
- ''.$accessdates.' '.
- ''.$counts.' '.
- ''.$autoenrollment.' ';
+ if ($env{'form.currcat_0'} eq 'communities::0') {
+ $output .= ''.$accessdates.' ';
+ } else {
+ $output .=
+ ''.$accessdates.' '.
+ ''.$counts.' '.
+ ''.$autoenrollment.' ';
+ }
} else {
$output .= "".&mt('Show more details').' ';
}
@@ -940,7 +1029,13 @@ sub courseinfo_row {
if (($info->{'selfenroll_start'} > 0) && ($info->{'selfenroll_start'} > $now)) {
$output .= ''.&mt('Starts: [_1]',''.$showstart.' ').' '.&mt('Ends: [_1]',''.$showend.' ').' ';
} else {
- $output .= ''.&mt('Enroll in course').' ';
+ $output .= ''.&mt('Enroll in course').' ';
+ if ($info->{'selfenroll_end'} == 0) {
+ $output .= &mt('Available permanently');
+ } elsif ($info->{'selfenroll_end'} > $now) {
+ $output .= &mt('Self-enrollment ends: [_1]',''.$showend.' ');
+ }
+ $output .= ' ';
}
$selfenroll = 1;
}