--- loncom/interface/coursecatalog.pm 2010/09/14 03:10:00 1.58.4.3 +++ loncom/interface/coursecatalog.pm 2013/03/01 18:09:16 1.73 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler for displaying the course catalog interface # -# $Id: coursecatalog.pm,v 1.58.4.3 2010/09/14 03:10:00 raeburn Exp $ +# $Id: coursecatalog.pm,v 1.73 2013/03/01 18:09:16 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -89,10 +89,10 @@ sub handler { \%idx,\@jsarray,$subcats); my ($numtitles,@codetitles); if ($env{'form.coursenum'} ne '' && &user_is_known()) { - if ($env{'form.currcat_0'} eq 'instcode::0') { &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) { @@ -115,7 +115,36 @@ function setCourseId(caller) { } ENDSCRIPT - $catjs .= &courselink_javascript(); + $catjs .= &courselink_javascript(); + if (&user_is_dc($codedom)) { + $catjs .= <'."\n"; my $start_page = &Apache::loncommon::start_page('Course/Community Catalog',$js, - { - 'add_entries' => \%add_entries, - 'no_inline_link' => 1,}); + {'add_entries' => \%add_entries, }); $r->print($start_page); if ($env{'form.numtitles'} > 0) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursecatalog", text=>"Course/Community Catalog"}); } - my $brtextone = 'Course listing'; + my $brtextone = 'Course listing'; my $brtexttwo = 'Course details'; if ($env{'form.currcat_0'} eq 'communities::0') { $brtextone = 'Community listing'; @@ -202,6 +229,7 @@ sub course_details { ({href=>"javascript:document.$formname.submit()", text=>$brtextone}, {text=>$brtexttwo}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog')); $r->print('
'); if ($env{'form.currcat_0'} eq 'communities::0') { $r->print(&mt('Detailed community information:')); @@ -268,7 +296,10 @@ sub instcode_course_selector { ''; if ($totcodes) { if (($env{'form.state'} eq 'listing') && ($numtitles > 0)) { - $add_entries{'onLoad'} = 'setElements()'; + $add_entries{'onLoad'} = 'setElements();'; + } + if (&user_is_dc($codedom)) { + $add_entries{'onLoad'} .= ' toggleStatuses();toggleWasActive();' } &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles); my $cat_maxdepth = $env{'form.catalog_maxdepth'}; @@ -285,7 +316,6 @@ sub instcode_course_selector { $r->print(''."\n". ''."\n". ''."\n". - ''."\n". ''. 'print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog')); - my $onchange; - unless ($env{'form.interface'} eq 'textual') { - $onchange = 'this.form.submit()'; - } + my $onchange = 'this.form.submit()'; $r->print('
'. ''; } } } else { @@ -402,7 +425,7 @@ sub category_breadcrumbs { $catlinks .= ''; for (my $j=0; $j<@{$cats[$shallower]{$container}}; $j++) { my $name = $cats[$shallower]{$container}[$j]; - my $item = &escape($name).':'.$container.':'.$shallower; + my $item = &escape($name).':'.&escape($container).':'.$shallower; my $selected = ''; if ($item eq $env{'form.currcat_'.$shallower}) { $selected = ' selected="selected"'; @@ -500,8 +523,13 @@ sub get_depth_values { sub additional_filters { my ($codedom,$has_subcats) = @_; - my $output = '
'.&mt('Domain:').''. &Apache::loncommon::select_dom_form($codedom,'showdom','',1,$onchange)); @@ -380,8 +405,6 @@ sub category_breadcrumbs { if (($env{'form.currcat_0'} ne '') && ($env{'form.currcat_0'} ne 'instcode::0')) { $catlinks .= $crumbsymbol; - } else { - $catlinks .= '
'; - if (($env{'form.currcat_0'} ne 'instcode::0') && + my $is_dc = &user_is_dc($codedom); + my $output = '
'; + if ($is_dc) { + $output .= '
'.&mt('Options').''; + } + $output .= '
'; + &unescape($catname)).'
'; } } my $show_selfenroll_status; @@ -530,25 +558,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 .= ''; - 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 +597,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". + ''. + ''."\n". + ''; + } else { + $output .= ''; } - $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 +545,11 @@ sub additional_filters { } my ($catname) = split(/:/,$env{'form.currcat_'.$counter}); if ($catname ne '') { - $output .= '
'. + $output .= ''. '
'."\n". - ''."\n".'
'. + $output .= ''. ''."\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 .= ''. + ''; + if ($type eq 'Previous') { + my %milestonetext = &Apache::lonlocal::texthash ( + accessend => 'prior to default end access date', + enrollend => 'prior to end date for auto-enrollment', + date => '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 .= + ''; + } + $output .= '
 '. + ''; + 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 .= ''. + '
'; return $output; } @@ -581,6 +707,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 members had access ...'); + } else { + $wasacctext .= &mt('where students had access ...'); + } + return $wasacctext; +} + sub search_official_courselist { my ($domain,$numtitles,$codetitles) = @_; my $instcode = &Apache::courseclassifier::instcode_search_str($domain,$numtitles,$codetitles); @@ -657,7 +817,7 @@ sub print_course_listing { if (keys(%courses) == 0) { 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.'); } return $output; @@ -670,9 +830,15 @@ sub print_course_listing { } if (keys(%courses) == 0) { 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.') + .'

'; } return $output; } @@ -685,7 +851,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,\%domconfig,$trails,$allitems); $output .= "\n".''. ''. ''. @@ -694,14 +861,14 @@ sub print_course_listing { } sub construct_data_table { - my ($knownuser,$courses,$details,$usersections,$now,$domconfig,$trails, - $allitems) = @_; + my ($knownuser,$domain,$courses,$details,$usersections,$now,$domconfig, + $trails,$allitems) = @_; my %sortname; if (($details eq '') || ($env{'form.showdetails'})) { $sortname{'Code'} = 'code'; $sortname{'Categories'} = 'cats'; $sortname{'Title'} = 'title'; - $sortname{'Owner(s)'} = 'owner'; + $sortname{'Owner & Co-owner(s)'} = 'owner'; } my $output = &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(); @@ -711,7 +878,7 @@ sub construct_data_table { } else { push(@coltitles,'Categories'); } - push(@coltitles,('Sections','Crosslisted','Title','Owner(s)')); + push(@coltitles,('Sections','Crosslisted','Title','Owner & Co-owner(s)')); if (ref($usersections) eq 'HASH') { $coltitles[1] = 'Your Section'; } @@ -726,24 +893,70 @@ sub construct_data_table { } $output .= ''; } + my (@fields,%fieldtitles,$wasactiveon); if ($knownuser) { if ($details) { if ($env{'form.currcat_0'} eq 'communities::0') { - $output .= ''.&mt('Default Access Dates for Members').''; + $output .= ''.&mt('Default Access Dates for Members').''. + ''.&mt('Member Counts').''; } else { $output .= ''.&mt('Default Access Dates for Students').''. ''.&mt('Student Counts').''. ''.&mt('Auto-enrollment of[_1]registered students','
').''; } + my ($titlesref,$orderref) = &get_statustitles(); + my @statuses; + if (&user_is_dc($domain)) { + @statuses = &Apache::loncommon::get_env_multiple('form.showcounts'); + if (grep(/^Previous$/,@statuses)) { + if ($env{'form.wasactive'} eq 'date') { + $wasactiveon = + &Apache::lonhtmlcommon::get_date_from_form('wasactiveon'); + } else { + $wasactiveon = $env{'form.wasactive'}; + } + } + if (ref($orderref) eq 'ARRAY') { + foreach my $status (@{$orderref}) { + if (grep(/^\Q$status\E$/,@statuses)) { + push(@fields,$status); + } + } + } + } else { + @fields = ('Active','Future'); + } + foreach my $status (@fields) { + my $title; + if (ref($titlesref) eq 'HASH') { + $title = $titlesref->{$status}; + } + unless ($title) { + $title = &mt($status); + } + $fieldtitles{$status} = $title; + } } else { $output .= ''.&mt('Details').''; } } $output .= ''.&mt('Self-enroll (if permitted)').''; &Apache::loncommon::end_data_table_header_row(); - my %courseinfo = &build_courseinfo_hash($courses,$knownuser,$details, - $usersections); + my (%numbers,%creditsum); + my ($showcredits,$defofficial,$defunofficial); + my %domdefaults = &Apache::lonnet::get_domain_defaults($domain); + unless ($env{'form.currcat_0'} eq 'communities::0') { + if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) { + $showcredits = 1; + $defofficial = $domdefaults{'officialcredits'}; + $defunofficial = $domdefaults{'unofficialcredits'}; + } + } + my %courseinfo = &build_courseinfo_hash($courses,$knownuser,$domain,$details, + $usersections,\@fields,\%fieldtitles, + $wasactiveon,\%numbers,\%creditsum, + $showcredits,$defofficial,$defunofficial); my %Sortby; foreach my $course (sort(keys(%{$courses}))) { if ($env{'form.sortby'} eq 'code') { @@ -769,22 +982,84 @@ sub construct_data_table { @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby)); } my $count = 1; + my $totalsec = 0; foreach my $item (@sorted_courses) { foreach my $course (@{$Sortby{$item}}) { $output.=&Apache::loncommon::start_data_table_row(); $output.=&courseinfo_row($courseinfo{$course},$knownuser,$details, - \$count,$now,$course,$trails,$allitems); + \$count,$now,$course,$trails,$allitems,\%numbers); $output.=&Apache::loncommon::end_data_table_row(); } } + if (($knownuser) && ($count > 1) && $env{'form.showdetails'}) { + if (&user_is_dc($domain)) { + my %lt = &Apache::lonlocal::texthash ( + 'Active' => 'Total current students', + 'Future' => 'Total future students', + 'Previous' => 'Total previous students', + 'courses' => 'Total unique codes and courses without codes', + 'sections' => 'Total sections', + 'xlists' => 'Total cross-listings', + ); + if ($showcredits) { + $lt{'cr_Active'} = &mt('Total current student credit hours'); + $lt{'cr_Future'} = &mt('Total future student credit hours'); + $lt{'cr_Previous'} = &mt('Total previous student credit hours'); + } + if ($env{'form.currcat_0'} eq 'communities::0') { + $lt{'courses'} = &mt('Total communities'); + $lt{'Active'} = &mt('Total current members'); + $lt{'Future'} = &mt('Total future members'); + $lt{'Previous'} = &mt('Total previous members'); + } + my $colspan = 8; + if ($showcredits) { + $colspan = 4; + } + $output .= ''. + ' '. + ''. + ''; + foreach my $item ('courses','sections','xlists') { + $output .= ''. + ''. + ''. + ''."\n"; + } + if (@fields > 0) { + foreach my $status (@fields) { + $output .= ''. + ''. + ''. + ''."\n"; + } + } + $output .= '
'.$lt{$item}.' '.$numbers{$item}.'
'.$lt{$status}.' '.$numbers{$status}.'
'; + if ($showcredits) { + $output .= ''; + foreach my $status (@fields) { + $output .= ''. + ''. + ''; + } + $output .= '
'.$lt{'cr_'.$status}.' '.$creditsum{$status}.'
'; + } + } + } $output .= &Apache::loncommon::end_data_table(); return $output; } sub build_courseinfo_hash { - my ($courses,$knownuser,$details,$usersections) = @_; + my ($courses,$knownuser,$domain,$details,$usersections,$fields,$fieldtitles, + $wasactiveon,$numbers,$creditsum,$showcredits,$defofficial,$defunofficial) = @_; my %courseinfo; my $now = time; + my $gettotals; + if ((keys(%{$courses}) > 0) && (&user_is_dc($domain)) && ($details)) { + $gettotals = 1; + } + my (%uniquecodes,$nocodes,$defcreds); foreach my $course (keys(%{$courses})) { my $descr; if (ref($courses->{$course}) eq 'HASH') { @@ -806,12 +1081,17 @@ 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); } } } + if ($instcode ne '') { + $uniquecodes{$instcode} = 1; + } else { + $nocodes ++; + } foreach my $owner (@owners) { my ($ownername,$ownerdom); if ($owner =~ /:/) { @@ -849,26 +1129,54 @@ sub build_courseinfo_hash { my @crosslistings; my ($seclist,$numsec) = &identify_sections($coursehash{'internal.sectionnums'}); - if (ref($usersections) eq 'HASH') { - if (ref($usersections->{$course}) eq 'ARRAY') { - $seclist = join(', ',@{$usersections->{$course}}); - } - } $courseinfo{$course}{'seclist'} = $seclist; my ($xlist_items,$numxlist) = &identify_sections($coursehash{'internal.crosslistings'}); + if (ref($numbers) eq 'HASH') { + $numbers->{'sections'} += $numsec; + $numbers->{'xlists'} += $numxlist; + } my $showsyllabus = 1; # default is to include a syllabus link if (defined($coursehash{'showsyllabus'})) { $showsyllabus = $coursehash{'showsyllabus'}; } $courseinfo{$course}{'showsyllabus'} = $showsyllabus; + if ($showcredits) { + if ($coursehash{'internal.defaultcredits'}) { + $courseinfo{$course}{'defaultcredits'} = $coursehash{'internal.defaultcredits'}; + } elsif ($instcode ne '') { + $courseinfo{$course}{'defaultcredits'} = $defofficial; + } else { + $courseinfo{$course}{'defaultcredits'} = $defunofficial; + } + $defcreds = $courseinfo{$course}{'defaultcredits'}; + } if (((defined($env{'form.coursenum'}) && ($cnum eq $env{'form.coursenum'}))) || ($knownuser && ($details == 1))) { - $courseinfo{$course}{'counts'} = &count_students($cdom,$cnum,$numsec); - $courseinfo{$course}{'autoenrollment'} = - &autoenroll_info(\%coursehash,$now,$seclist,$xlist_items, - $instcode,\@owners,$cdom,$cnum); - + my $milestone; + if ($wasactiveon eq 'accessend') { + if ($coursehash{'default_enrollment_end_date'}) { + $milestone = $coursehash{'default_enrollment_end_date'}; + } else { + $milestone = time; + } + } elsif ($wasactiveon eq 'enrollend') { + if ($coursehash{'internal.autoend'}) { + $milestone = $coursehash{'internal.autoend'}; + } else { + $milestone = time; + } + } else { + $milestone = $wasactiveon; + } + $courseinfo{$course}{'counts'} = + &count_students($cdom,$cnum,$numsec,$fields,$fieldtitles,$gettotals, + $numbers,$creditsum,$showcredits,$defcreds,$milestone); + if ($instcode ne '') { + $courseinfo{$course}{'autoenrollment'} = + &autoenroll_info(\%coursehash,$now,$seclist,$xlist_items, + $instcode,\@owners,$cdom,$cnum); + } my $startaccess = ''; my $endaccess = ''; my $accessdates; @@ -921,39 +1229,83 @@ sub build_courseinfo_hash { } $courseinfo{$course}{'xlist'} = $xlist_items; } + if (ref($numbers) eq 'HASH') { + $numbers->{'courses'} = $nocodes + scalar(keys(%uniquecodes)); + } return %courseinfo; } sub count_students { - my ($cdom,$cnum,$numsec) = @_; + my ($cdom,$cnum,$numsec,$fieldsref,$titlesref,$getcounts,$numbers,$creditsum, + $showcredits,$defcreds,$wasactiveon) = @_; + my $countslist = ''. + &mt('[quant,_1,section,sections,No sections]',$numsec).''; + my (@fields,%titles,$showexpired); + if ((ref($fieldsref) eq 'ARRAY') && (ref($titlesref) eq 'HASH') && + (ref($numbers) eq 'HASH')) { + @fields = @{$fieldsref}; + %titles = %{$titlesref}; + if (grep(/^Previous$/,@fields)) { + $showexpired = 1; + } + } else { + return; + } my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cnum); - my %student_count = ( - Active => 0, - Future => 0, - Expired => 0, - ); + my (%student_count,%credit_count); + %student_count = ( + Active => 0, + Future => 0, + Previous => 0, + ); + if ($showcredits) { + %credit_count = ( + Active => 0, + Future => 0, + Previous => 0, + ); + } my %idx; $idx{'status'} = &Apache::loncoursedata::CL_STATUS(); - my %status_title = &Apache::lonlocal::texthash( - Expired => 'Previous access', - Active => 'Current access', - Future => 'Future access', - ); - + $idx{'end'} = &Apache::loncoursedata::CL_END(); + $idx{'credits'} = &Apache::loncoursedata::CL_CREDITS(); while (my ($student,$data) = each(%$classlist)) { - $student_count{$data->[$idx{'status'}]} ++; + my $status = $data->[$idx{'status'}]; + my $credits = $data->[$idx{'credits'}]; + if ($credits eq '') { + $credits = $defcreds; + } + if ($status eq 'Expired') { + if (($showexpired) && + ($data->[$idx{'end'}] >= $wasactiveon)) { + $student_count{'Previous'} ++; + if ($showcredits) { + $credit_count{'Previous'} += $credits; + } + } + } else { + $student_count{$status} ++; + if ($showcredits) { + $credit_count{$status} += $credits; + } + } } - - my $countslist = &mt('[quant,_1,section:,sections:,No sections]',$numsec).'
'; - foreach my $status ('Active','Future') { - $countslist .= ''.$status_title{$status}.': '. - $student_count{$status}.'
'; + if (@fields) { + $countslist .= ':
'; + foreach my $status (@fields) { + $countslist .= ''.$titles{$status}.': '. + $student_count{$status}.'
'; + $numbers->{$status} += $student_count{$status}; + if ($showcredits) { + $creditsum->{$status} += $credit_count{$status}; + } + } } return $countslist; } sub courseinfo_row { - my ($info,$knownuser,$details,$countref,$now,$course,$trails,$allitems) = @_; + my ($info,$knownuser,$details,$countref,$now,$course,$trails,$allitems,$numbers) = @_; my ($cdom,$cnum,$title,$ownerlast,$code,$owner,$seclist,$xlist_items, $accessdates,$showsyllabus,$counts,$autoenrollment,$output,$categories); if (ref($info) eq 'HASH') { @@ -1004,13 +1356,11 @@ sub courseinfo_row { ''.$ownerlast.''; if ($knownuser) { if ($details) { - if ($env{'form.currcat_0'} eq 'communities::0') { - $output .= ''.$accessdates.''; - } else { - $output .= - ''.$accessdates.''. - ''.$counts.''. - ''.$autoenrollment.''; + $output .= + ''.$accessdates.''. + ''.$counts.''; + unless ($env{'form.currcat_0'} eq 'communities::0') { + $output .= ''.$autoenrollment.''; } } else { $output .= "".&mt('Show more details').''; @@ -1024,7 +1374,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; }