--- loncom/interface/loncommon.pm 2009/05/27 13:42:04 1.826 +++ loncom/interface/loncommon.pm 2009/11/04 14:08:36 1.909 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.826 2009/05/27 13:42:04 bisitz Exp $ +# $Id: loncommon.pm,v 1.909 2009/11/04 14:08:36 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -482,28 +482,22 @@ ENDAUTHORBRW } sub coursebrowser_javascript { - my ($domainfilter,$sec_element,$formname)=@_; - my $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Group - for which you wish to add/modify a user role'); - my $output = ' + my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_; + my $wintitle = &mt('Course Browser'); + if ($crstype ne '') { + $wintitle = &mt($crstype); + } + my $id_functions = &javascript_index_functions(); + my $output = ' '; + return $output; +} - function getFormIdByName(formname) { - for (var i=0;i -1) { + var domid = getIndexByName(formid,udom); + if (domid > -1) { + if (document.forms[formid].elements[domid].type == 'select-one') { + userdom=document.forms[formid].elements[domid].options[document.forms[formid].elements[domid].selectedIndex].value; + } + if (document.forms[formid].elements[domid].type == 'hidden') { + userdom=document.forms[formid].elements[domid].value; } } - return -1; } -ENDSTDBRW - if ($sec_element ne '') { - $output .= &setsec_javascript($sec_element,$formname); + return userdom; +} + +ENDJS + +} + +sub userbrowser_javascript { + my $id_functions = &javascript_index_functions(); + return <<"ENDUSERBRW"; + +function openuserbrowser(formname,uname,udom,ulast,ufirst,uemail,hideudom,crsdom,caller) { + var url = '/adm/pickuser?'; + var userdom = getDomainFromSelectbox(formname,udom); + if (userdom != null) { + if (userdom != '') { + url += 'srchdom='+userdom+'&'; + } } - $output .= ' -// ]]> -'; - return $output; + url += 'form=' + formname + '&unameelement='+uname+ + '&udomelement='+udom+ + '&ulastelement='+ulast+ + '&ufirstelement='+ufirst+ + '&uemailelement='+uemail+ + '&hideudomelement='+hideudom+ + '&coursedom='+crsdom; + if ((caller != null) && (caller != undefined)) { + url += '&caller='+caller; + } + var title = 'User_Browser'; + var options = 'scrollbars=1,resizable=1,menubar=0'; + options += ',width=700,height=600'; + var stdeditbrowser = open(url,title,options,'1'); + stdeditbrowser.focus(); +} + +function fix_domain (formname,udom,origdom,uname) { + var formid = getFormIdByName(formname); + if (formid > -1) { + var unameid = getIndexByName(formid,uname); + var domid = getIndexByName(formid,udom); + var hidedomid = getIndexByName(formid,origdom); + if (hidedomid > -1) { + var fixeddom = document.forms[formid].elements[hidedomid].value; + var unameval = document.forms[formid].elements[unameid].value; + if ((fixeddom != '') && (fixeddom != undefined) && (fixeddom != null) && (unameval != '') && (unameval != undefined) && (unameval != null)) { + if (domid > -1) { + var slct = document.forms[formid].elements[domid]; + if (slct.type == 'select-one') { + var i; + for (i=0;i' ."".&mt('Select Course').'' + .'","'.$multflag.'","'.$type.'","'.$typeelement.'");' + ."'>".$linktext.'' .''; } @@ -635,6 +782,14 @@ sub selectauthor_link { &mt('Select Author').''; } +sub selectuser_link { + my ($form,$unameelem,$domelem,$lastelem,$firstelem,$emailelem,$hdomelem, + $coursedom,$linktext,$caller) = @_; + return ''.$linktext.''; +} + sub check_uncheck_jscript { my $jscript = <<"ENDSCRT"; function checkAll(field) { @@ -1015,7 +1170,7 @@ sub general_help { my $helptopic='Student_Intro'; if ($env{'request.role'}=~/^(ca|au)/) { $helptopic='Authoring_Intro'; - } elsif ($env{'request.role'}=~/^cc/) { + } elsif ($env{'request.role'}=~/^(cc|co)/) { $helptopic='Course_Coordination_Intro'; } elsif ($env{'request.role'}=~/^dc/) { $helptopic='Domain_Coordination_Intro'; @@ -1111,8 +1266,8 @@ sub help_menu_js { my $template .= <<"ENDTEMPLATE"; ENDTEMPLATE return $template; @@ -1787,7 +1942,7 @@ sub select_level_form { =pod -=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$autosubmit) +=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange) Returns a string containing a form to allow a user to select the domain to preform an operation in. @@ -1798,16 +1953,15 @@ selected"); If the $showdomdesc flag is set, the domain name is followed by the domain description. -If the $autosubmit flag is set, the form containing the domain selector will be auto-submitted by an onchange action. +The optional $onchange argumnet specifies what should occur if the domain selector is changed, e.g., 'this.form.submit()' if the form is to be automatically submitted. =cut #------------------------------------------- sub select_dom_form { - my ($defdom,$name,$includeempty,$showdomdesc,$autosubmit) = @_; - my $onchange; - if ($autosubmit) { - $onchange = ' onchange="this.form.submit()"'; + my ($defdom,$name,$includeempty,$showdomdesc,$onchange) = @_; + if ($onchange) { + $onchange = ' onchange="'.$onchange.'"'; } my @domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains()); if ($includeempty) { @domains=('',@domains); } @@ -2862,7 +3016,7 @@ sub messagewrapper { sub noteswrapper { my ($link,$un,$do)=@_; return -"$link"; +"$link"; } # ------------------------------------------------------------- Aboutme Wrapper @@ -2872,7 +3026,7 @@ sub aboutmewrapper { if (!defined($username) && !defined($domain)) { return; } - return ''.$link.''; } @@ -2886,7 +3040,7 @@ sub syllabuswrapper { # ----------------------------------------------------------------------------- sub track_student_link { - my ($linktext,$sname,$sdom,$target,$start) = @_; + my ($linktext,$sname,$sdom,$target,$start,$only_body) = @_; my $link ="/adm/trackstudent?"; my $title = 'View recent activity'; if (defined($sname) && $sname !~ /^\s*$/ && @@ -2900,6 +3054,7 @@ sub track_student_link { $target = ''; } if ($start) { $link.='&start='.$start; } + if ($only_body) { $link .= '&only_body=1'; } $title = &mt($title); $linktext = &mt($linktext); return qq{$linktext}. @@ -3576,6 +3731,7 @@ sub findallcourses { if (!%roles) { %roles = ( cc => 1, + co => 1, in => 1, ep => 1, ta => 1, @@ -3766,7 +3922,7 @@ sub blockcheck { ($env{'request.role'} !~ m{^st\./\Q$cdom\E/\Q$cnum\E})); next if ($no_userblock); - # Retrieve blocking times and identity of blocker for course + # Retrieve blocking times and identity of locker for course # of specified user, unless user has 'evb' privilege. my ($start,$end)=&get_blocks($setters,$activity,$cdom,$cnum); @@ -3831,103 +3987,51 @@ sub parse_block_record { return ($setuname,$setudom,$title,$blocks); } -sub build_block_table { - my ($startblock,$endblock,$setters) = @_; - my %lt = &Apache::lonlocal::texthash( - 'cacb' => 'Currently active communication blocks', - 'cour' => 'Course', - 'dura' => 'Duration', - 'blse' => 'Block set by' - ); - my $output; - $output = ''.$lt{'cacb'}.':'; - $output .= &start_data_table(); - $output .= ' - - '.$lt{'cour'}.' - '.$lt{'dura'}.' - '.$lt{'blse'}.' - -'; - foreach my $course (keys(%{$setters})) { - my %courseinfo=&Apache::lonnet::coursedescription($course); - for (my $i=0; $i<@{$$setters{$course}{staff}}; $i++) { - my ($uname,$udom) = @{$$setters{$course}{staff}[$i]}; - my $fullname = &plainname($uname,$udom); - if (defined($env{'user.name'}) && defined($env{'user.domain'}) - && $env{'user.name'} ne 'public' - && $env{'user.domain'} ne 'public') { - $fullname = &aboutmewrapper($fullname,$uname,$udom); - } - my ($openblock,$closeblock) = @{$$setters{$course}{times}[$i]}; - $openblock = &Apache::lonlocal::locallocaltime($openblock); - $closeblock= &Apache::lonlocal::locallocaltime($closeblock); - $output .= &Apache::loncommon::start_data_table_row(). - ''.$courseinfo{'description'}.''. - ''.$openblock.' to '.$closeblock.''. - ''.$fullname.''. - &Apache::loncommon::end_data_table_row(); - } - } - $output .= &end_data_table(); -} - sub blocking_status { - my ($activity,$uname,$udom) = @_; - my %setters; - my ($blocked,$output,$ownitem,$is_course); - my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom); - if ($startblock && $endblock) { - $blocked = 1; - if (wantarray) { - my $category; - if ($activity eq 'boards') { - $category = 'Discussion posts in this course'; - } elsif ($activity eq 'blogs') { - $category = 'Blogs'; - } elsif ($activity eq 'port') { - if (defined($uname) && defined($udom)) { - if ($uname eq $env{'user.name'} && - $udom eq $env{'user.domain'}) { - $ownitem = 1; - } - } - $is_course = &Apache::lonnet::is_course($udom,$uname); - if ($ownitem) { - $category = 'Your portfolio files'; - } elsif ($is_course) { - my $coursedesc; - foreach my $course (keys(%setters)) { - my %courseinfo = - &Apache::lonnet::coursedescription($course); - $coursedesc = $courseinfo{'description'}; - } - $category = "Group portfolio in the course '$coursedesc'"; - } else { - $category = 'Portfolio files belonging to '; - if ($env{'user.name'} eq 'public' && - $env{'user.domain'} eq 'public') { - $category .= &plainname($uname,$udom); - } else { - $category .= &aboutmewrapper(&plainname($uname,$udom),$uname,$udom); - } - } - } elsif ($activity eq 'groups') { - $category = 'Groups in this course'; - } - my $showstart = &Apache::lonlocal::locallocaltime($startblock); - my $showend = &Apache::lonlocal::locallocaltime($endblock); - $output = ''.&mt('[_1] will be inaccessible between [_2] and [_3] because communication is being blocked.',$category,$showstart,$showend).''; - if (!($activity eq 'port' && !($ownitem) && !($is_course))) { - $output .= &build_block_table($startblock,$endblock,\%setters); - } - } - } - if (wantarray) { - return ($blocked,$output); - } else { - return $blocked; - } + my ($activity,$uname,$udom) = @_; + my %setters; + + # check for active blocking + my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom); + + my $blocked = $startblock && $endblock ? 1 : 0; + + # caller just wants to know whether a block is active + if (!wantarray) { return $blocked; } + + # build a link to a popup window containing the details + my $querystring = "?activity=$activity"; + # $uname and $udom decide whose portfolio the user is trying to look at + $querystring .= "&udom=$udom" if $udom; + $querystring .= "&uname=$uname" if $uname; + + my $output .= <<'END_MYBLOCK'; + function openWindow(url, wdwName, w, h, toolbar,scrollbar) { + var options = "width=" + w + ",height=" + h + ","; + options += "resizable=yes,scrollbars="+scrollbar+",status=no,"; + options += "menubar=no,toolbar="+toolbar+",location=no,directories=no"; + var newWin = window.open(url, wdwName, options); + newWin.focus(); + } +END_MYBLOCK + + $output = Apache::lonhtmlcommon::scripttag($output); + + my $popupUrl = "/adm/blockingstatus/$querystring"; + my $text = mt('Communication Blocked'); + + $output .= <<"END_BLOCK"; + + + + $text + + +END_BLOCK + + return ($blocked, $output); } ############################################### @@ -4005,7 +4109,7 @@ sub determinedomain { my $domain=shift; if (! $domain) { # Determine domain if we have not been given one - $domain = $Apache::lonnet::perlvar{'lonDefDomain'}; + $domain = &Apache::lonnet::default_login_domain(); if ($env{'user.domain'}) { $domain=$env{'user.domain'}; } if ($env{'request.role.domain'}) { $domain=$env{'request.role.domain'}; @@ -4183,6 +4287,34 @@ sub designparm { ############################################## =pod +=item * &authorspace() + +Inputs: ./. + +Returns: Path to the Construction Space of the current user's + accessed author space + The author space will be that of the current user + when accessing the own author space + and that of the co-author/assistent co-author + when accessing the co-author's/assistent co-author's + space + +=cut + +sub authorspace { + my $caname = ''; + if ($env{'request.role'} =~ /^ca|^aa/) { + (undef,$caname) = + ($env{'request.role'}=~/($match_domain)\/($match_username)$/); + } else { + $caname = $env{'user.name'}; + } + return '/priv/'.$caname.'/'; +} + +############################################## +=pod + =item * &head_subbox() Inputs: $content (contains HTML code with page functions, etc.) @@ -4195,7 +4327,7 @@ Returns: HTML div with $content sub head_subbox { my ($content)=@_; my $output = - '' #FIXME: solve conflicts with lonhtmlcommon:breadcrumbs LC_head_subbox + '' .$content .'' } @@ -4274,10 +4406,6 @@ Inputs: =item * $forcereg, if page should register as content page (relevant for text interface only) -=item * $customtitle, alternate text to use instead of $title - in the title box that appears, this text - is not auto translated like the $title is - =item * $no_nav_bar, if true, keep the 'what is this' info but remove the navigational links @@ -4302,7 +4430,7 @@ other decorations will be returned. =cut sub bodytag { - my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle, + my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_; if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } @@ -4331,6 +4459,9 @@ sub bodytag { if ($env{'request.role'} !~ /^cr/) { $role = &Apache::lonnet::plaintext($role,&course_type()); } + if ($env{'request.course.sec'}) { + $role .= (' 'x2).'- '.&mt('section:').' '.$env{'request.course.sec'}; + } $realm = $env{'course.'.$env{'request.course.id'}.'.description'}; } else { $role = &Apache::lonnet::plaintext($role); @@ -4357,25 +4488,7 @@ sub bodytag { $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}); } - my $roleinfo=(< - - $name - - - -$role - - -$realm - - -ENDROLE - my $titleinfo = ''.$title.''; - if ($customtitle) { - $titleinfo = $customtitle; - } # # Extra info if you are the DC my $dc_info = ''; @@ -4388,33 +4501,49 @@ ENDROLE $dc_info = '('.$dc_info.')'; } - if (($env{'environment.remote'} eq 'off') || ($args->{'suppress_header_logos'})) { + $role = '('.$role.')' if $role; + &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); + + if ($env{'environment.remote'} eq 'off') { # No Remote - if ($env{'request.state'} eq 'construct') { - $forcereg=1; - } + if ($no_nav_bar) { return $bodytag; } - if (!$customtitle && $env{'request.state'} eq 'construct') { - $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls - } + if ($env{'request.state'} eq 'construct') { $forcereg=1; } - my $titletable = '' - ." $titleinfo $dc_info".$roleinfo - .''; + # if ($env{'request.state'} eq 'construct') { + # $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls + # } - if ($no_nav_bar) { - $bodytag .= $titletable; - } else { - $bodytag .= qq|$name ($role) - $realm $dc_info|; - if ($env{'request.state'} eq 'construct') { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg, - $titletable); - } else { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg). - $titletable; - } + $bodytag .= qq|$name $role + $realm $dc_info| unless $env{'form.inhibitmenu'}; + + if ( $env{'form.inhibitmenu'} eq 'yes' + || $ENV{'REQUEST_URI'} eq '/adm/logout' + || $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { + + return $bodytag; + } + + $bodytag .= Apache::lonhtmlcommon::scripttag( + Apache::lonmenu::utilityfunctions(), 'start'); + + $bodytag .= Apache::lonmenu::primary_menu(); + + #don't show menus for public users + if($env{'user.name'} ne 'public' && $env{'user.domain'} ne 'public'){ + $bodytag .= Apache::lonmenu::secondary_menu(); + $bodytag .= Apache::lonmenu::serverform(); + $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); + $bodytag .= Apache::lonmenu::innerregister($forcereg) if $forcereg; + }else{ + # this is to seperate menu from content when there's no secondary + # menu. Especially needed for public accessible ressources. + $bodytag .= ''; + $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); } + + #SD testing + #$bodytag .= Apache::lonmenu::menubuttons($forcereg); return $bodytag; } @@ -4430,7 +4559,12 @@ ENDROLE # Explicit link to get inline menu my $menu= ($no_inline_link?'' - :''.&mt('Switch to Inline Menu Mode').''); + :''.&mt('Switch to Inline Menu Mode').''); + $bodytag .= qq|$name $role + $realm $dc_info + + $menu + | unless $env{'form.inhibitmenu'}; # return(<$messages $titleinfo $dc_info $menu -$roleinfo ENDBODY @@ -4561,9 +4694,9 @@ sub standard_css { my $sans = 'Verdana,Arial,Helvetica,sans-serif'; my $mono = 'monospace'; - my $data_table_head = $tabbg; - my $data_table_light = '#EEEEEE'; - my $data_table_dark = '#DDDDDD'; + my $data_table_head = $sidebg; + my $data_table_light = '#FAFAFA'; + my $data_table_dark = '#F0F0F0'; my $data_table_darker = '#CCCCCC'; my $data_table_highlight = '#FFFF00'; my $mail_new = '#FFBB77'; @@ -4680,7 +4813,6 @@ div.LC_confirm_box .LC_success img { .LC_disc_action_links_bar { background: $tabbg; - font-family: $sans; border: none; margin: 4px; } @@ -4723,10 +4855,10 @@ table#LC_nav_location { table#LC_title_bar a { color: $fontmenu; } - + table#LC_title_bar { clear: both; - /*display: none;*/ + display: none; } table#LC_title_bar, @@ -4738,45 +4870,15 @@ table#LC_title_bar.LC_with_remote { border-width: $border; background: $pgbg; color: $fontmenu; - font-family: $sans; border-collapse: collapse; padding: 0; margin: 0; } -table.LC_docs_path { - width: 100%; - border: 0; - background: $pgbg; - font-family: $sans; - border-collapse: collapse; - padding: 0; -} - table#LC_title_bar td { background: $tabbg; } -table#LC_title_bar .LC_title_bar_who { - background: $tabbg; - color: $fontmenu; - font: small $sans; - text-align: right; - margin: 0; -} - -table#LC_title_bar div.LC_title_bar_name { - margin: 0; -} - -table#LC_title_bar div.LC_title_bar_role { - margin: 0; -} - -table#LC_title_bar div.LC_title_bar_realm { - margin: 0; -} - table#LC_menubuttons img{ border: none; } @@ -4792,7 +4894,6 @@ table#LC_top_nav td { table#LC_top_nav td a, div#LC_top_nav a { color: $font; - font-family: $sans; } table#LC_top_nav td.LC_top_nav_logo { @@ -4817,21 +4918,12 @@ table#LC_top_nav td.LC_top_nav_login { text-align: center; } -table.LC_breadcrumbs td, -table.LC_docs_path td { - background: $tabbg; - color: $fontmenu; - font-family: $sans; - font-size: smaller; +.LC_breadcrumbs_component { + float: right; + margin: 0 1em; } - -table.LC_breadcrumbs td.LC_breadcrumbs_component, -table.LC_docs_path td.LC_docs_path_component { - background: $tabbg; - color: $fontmenu; - font-family: $sans; - font-size: larger; - text-align: right; +.LC_breadcrumbs_component img { + vertical-align: middle; } td.LC_table_cell_checkbox { @@ -4846,17 +4938,24 @@ table#LC_mainmenu td.LC_mainmenu_column font-size: 70%; } -#LC_head_subbox { +#LC_breadcrumbs { clear:both; background: $sidebg; border-bottom: 1px solid $lg_border_color; - height: 32px; - line-height: 32px; + line-height: 2.5em; + /* SD working here + height: 2.5em; + overflow: hidden; */ margin: 0; padding: 0; } -#LC_head_subbox2 { /* FIXME: replace by LC_head_subbox once lonhtmlcommon::breadcrumbs has been fixed */ +/* Preliminary fix to hide breadcrumbs inside remote control window */ +#LC_remote #LC_breadcrumbs { + display:none; +} + +#LC_head_subbox { clear:both; background: #F8F8F8; /* $sidebg; */ border-bottom: 1px solid $lg_border_color; @@ -4874,7 +4973,6 @@ table#LC_mainmenu td.LC_mainmenu_column .LC_menubuttons_inline_text { color: $font; - font-family: $sans; font-size: 90%; padding-left:3px; } @@ -4886,7 +4984,6 @@ table#LC_mainmenu td.LC_mainmenu_column .LC_menubuttons_category { color: $font; background: $pgbg; - font-family: $sans; font-size: larger; font-weight: bold; } @@ -4896,29 +4993,14 @@ td.LC_menubuttons_text { } .LC_current_location { - font-family: $sans; background: $tabbg; } .LC_new_mail { - font-family: $sans; background: $tabbg; font-weight: bold; } -.LC_preferences_labeltext { - font-family: $sans; - text-align: right; -} - -.LC_roleslog_note { - font-size: small; -} - -.LC_mail_functions { - font-weight: bold; -} - table.LC_data_table, table.LC_mail_list { border: 1px solid #000000; @@ -4938,6 +5020,7 @@ table.LC_nested_outer { width: 100%; } +table.LC_innerpickbox, table.LC_nested { border: none; border-collapse: collapse; @@ -4948,13 +5031,19 @@ table.LC_nested { table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th, -table.LC_prior_tries tr th { +table.LC_prior_tries tr th, +table.LC_innerpickbox tr th { font-weight: bold; background-color: $data_table_head; color:$fontmenu; font-size:90%; } +table.LC_innerpickbox tr th, +table.LC_innerpickbox tr td { + vertical-align: top; +} + table.LC_data_table tr.LC_info_row > td { background-color: #CCCCCC; font-weight: bold; @@ -4965,12 +5054,14 @@ table.LC_data_table tr.LC_odd_row > td, table.LC_pick_box tr > td.LC_odd_row { background-color: $data_table_light; padding: 2px; + vertical-align: top; } table.LC_data_table tr.LC_even_row > td, table.LC_pick_box tr > td.LC_even_row { background-color: $data_table_dark; padding: 2px; + vertical-align: top; } table.LC_data_table tr.LC_data_table_highlight td { @@ -4991,6 +5082,9 @@ table.LC_nested tr.LC_empty_row td { padding: 8px; } +table.LC_caption { +} + table.LC_nested tr.LC_empty_row td { padding: 4ex } @@ -5114,7 +5208,7 @@ table.LC_mail_list tr.LC_mail_other:hove table.LC_data_table tr > td.LC_browser_file, table.LC_data_table tr > td.LC_browser_file_published { - background: #CCFF88; + background: #AAEE77; } table.LC_data_table tr > td.LC_browser_file_locked, @@ -5123,16 +5217,16 @@ table.LC_data_table tr > td.LC_browser_f } table.LC_data_table tr > td.LC_browser_file_obsolete { - background: #AAAAAA; + background: #888888; } table.LC_data_table tr > td.LC_browser_file_modified, table.LC_data_table tr > td.LC_browser_file_metamodified { - background: #FFFF77; + background: #F8F866; } table.LC_data_table tr.LC_browser_folder > td { - background: #CCCCFF; + background: #E0E8FF; } table.LC_data_table tr > td.LC_roles_is { @@ -5166,7 +5260,6 @@ span.LC_current_location { span.LC_parm_menu_item { font-size: larger; - font-family: $sans; } span.LC_parm_scope_all { @@ -5221,7 +5314,6 @@ table#LC_helpmenu { table#LC_helpmenu fieldset legend { font-size: larger; - font-weight: bold; } table#LC_helpmenu_links { @@ -5274,22 +5366,14 @@ table.LC_pick_box { } table.LC_pick_box td.LC_pick_box_title { - background: $tabbg; + background: $sidebg; font-weight: bold; - text-align: right; + text-align: left; vertical-align: top; width: 184px; padding: 8px; } -table.LC_pick_box td.LC_selfenroll_pick_box_title { - background: $tabbg; - font-weight: bold; - text-align: right; - width: 350px; - padding: 8px; -} - table.LC_pick_box td.LC_pick_box_value { text-align: left; padding: 8px; @@ -5322,40 +5406,6 @@ table.LC_pick_box td.LC_oddrow_value { background-color: $data_table_light; } -table.LC_helpform_receipt { - width: 620px; - border-collapse: separate; - background: white; - border: 1px solid black; - border-spacing: 1px; -} - -table.LC_helpform_receipt td.LC_pick_box_title { - background: $tabbg; - font-weight: bold; - text-align: right; - width: 184px; - padding: 8px; -} - -table.LC_helpform_receipt td.LC_evenrow_value { - text-align: left; - padding: 8px; - background-color: $data_table_light; -} - -table.LC_helpform_receipt td.LC_oddrow_value { - text-align: left; - padding: 8px; - background-color: $data_table_light; -} - -table.LC_helpform_receipt td.LC_pick_box_separator { - padding: 0; - height: 1px; - background: black; -} - span.LC_helpform_receipt_cat { font-weight: bold; } @@ -5409,7 +5459,6 @@ table.LC_notify_front_page td { } .LC_topic_bar { - font-family: $sans; font-weight: bold; width: 100%; background: $tabbg; @@ -5438,17 +5487,45 @@ table.LC_status_selector td { div.LC_feedback_link { clear: both; - background: white; + background: $sidebg; width: 100%; + padding-bottom: 10px; + border: 1px $tabbg solid; + height: 22px; + line-height: 22px; + padding-top: 5px; +} + +div.LC_feedback_link img { + height: 22px; + vertical-align:middle; +} + +div.LC_feedback_link a{ + text-decoration: none; +} + +div.LC_comblock { + display:inline; + color:$font; + font-size:90%; +} + +div.LC_feedback_link div.LC_comblock { + padding-left:5px; +} + +div.LC_feedback_link div.LC_comblock a { + color:$font; } span.LC_feedback_link { - background: $feedback_link_bg; + /* background: $feedback_link_bg; */ font-size: larger; } span.LC_message_link { - background: $feedback_link_bg; + /* background: $feedback_link_bg; */ font-size: larger; position: absolute; right: 1em; @@ -5466,14 +5543,12 @@ table.LC_prior_tries td { .LC_answer_correct { background: lightgreen; - font-family: $sans; color: darkgreen; padding: 6px; } .LC_answer_charged_try { background: #FFAAAA; - font-family: $sans; color: darkred; padding: 6px; } @@ -5482,28 +5557,24 @@ table.LC_prior_tries td { .LC_answer_no_grade, .LC_answer_late { background: lightyellow; - font-family: $sans; color: black; padding: 6px; } .LC_answer_previous { background: lightblue; - font-family: $sans; color: darkblue; padding: 6px; } .LC_answer_no_message { background: #FFFFFF; - font-family: $sans; color: black; padding: 6px; } .LC_answer_unknown { background: orange; - font-family: $sans; color: black; padding: 6px; } @@ -5538,8 +5609,7 @@ table.LC_prior_match tr td { border: 1px solid #000000; } -td.LC_nobreak, -span.LC_nobreak { +.LC_nobreak { white-space: nowrap; } @@ -5563,21 +5633,24 @@ table.LC_docs_documents td.LC_docs_docum padding: 4px; } -.LC_docs_entry_move { - border: none; - border-collapse: collapse; -} - -.LC_docs_entry_move td { - border: 2px solid #BBBBBB; +div.LC_docs_entry_move { + border: 1px solid #BBBBBB; background: #DDDDDD; + width: 22px; + padding: 1px; + margin: 0; } -.LC_docs_editor td.LC_docs_entry_commands { +table.LC_data_table tr > td.LC_docs_entry_commands, +table.LC_data_table tr > td.LC_docs_entry_parameter { background: #DDDDDD; font-size: x-small; } +.LC_docs_entry_parameter { + white-space: nowrap; +} + .LC_docs_copy { color: #000099; } @@ -5599,17 +5672,6 @@ table.LC_docs_documents td.LC_docs_docum font-size: x-small; } -.LC_docs_editor td.LC_docs_entry_title, -.LC_docs_editor td.LC_docs_entry_icon { - background: #FFFFBB; -} - -.LC_docs_editor td.LC_docs_entry_parameter { - background: #BBBBFF; - font-size: x-small; - white-space: nowrap; -} - table.LC_docs_adddocs td, table.LC_docs_adddocs th { border: 1px solid #BBBBBB; @@ -5646,10 +5708,6 @@ table.LC_double_column tr td.LC_right_co vertical-align: top; } -span.LC_role_level { - font-weight: bold; -} - div.LC_left_float { float: left; padding-right: 5%; @@ -5741,12 +5799,6 @@ div.LC_edit_problem_editxml_header div { margin-top: 5px; } -div.LC_edit_problem_header_edit_row { - background: $tabbg; - padding: 3px; - margin-bottom: 5px; -} - div.LC_edit_problem_header_title { font-weight: bold; font-size: larger; @@ -5776,14 +5828,6 @@ div.LC_edit_problem_saves { padding-bottom: 5px; } -hr.LC_edit_problem_divide { - clear: both; - color: $tabbg; - background-color: $tabbg; - height: 3px; - border: none; -} - img.stift{ border-width: 0; vertical-align: middle; @@ -5802,7 +5846,6 @@ table#LC_mainmenu td.LC_mainmenu_col_fie .LC_mainmenu_fieldset_category { color: $font; background: $pgbg; - font-family: $sans; font-size: small; font-weight: bold; } @@ -5819,14 +5862,14 @@ div.LC_createcourse { # --------------------------*/ a:hover, -ol.LC_smallMenu a:hover, +ol.LC_primary_menu a:hover, ol#LC_MenuBreadcrumbs a:hover, ol#LC_PathBreadcrumbs a:hover, -ul#LC_TabMainMenuContent a:hover, +ul#LC_secondary_menu a:hover, .LC_FormSectionClearButton input:hover ul.LC_TabContent li:hover a { color:#BF2317; - text-decoration:none; + text-decoration:none; } h1 { @@ -5848,13 +5891,14 @@ h2,h3,h4,h5,h6 { border-bottom:solid 1px $lg_border_color; } +.LC_Box > .LC_hcell { + margin: 0 -10px 10px -10px; +} + .LC_noBorder { border: 0; } - -/* Main Header with discription of Person, Course, etc. */ - .LC_Right { float: right; margin: 0; @@ -5883,9 +5927,14 @@ dl,ul,div,fieldset { /* overflow: hidden; */ } +fieldset > legend { + font-weight: bold; + padding: 0 5px 0 5px; +} + #LC_nav_bar { float: left; - margin: 0; + margin: 0.2em 0 0 0; } #LC_nav_bar em{ @@ -5893,43 +5942,42 @@ dl,ul,div,fieldset { font-style: normal; } -ol.LC_smallMenu { +ol.LC_primary_menu { float: right; + margin: 0.2em 0 0 0; } -ol.LC_smallMenu, ol#LC_PathBreadcrumbs { +ol#LC_PathBreadcrumbs { margin: 0; } -ol.LC_smallMenu li { +ol.LC_primary_menu li { display: inline; padding: 5px 5px 0 10px; vertical-align: top; } -ol.LC_smallMenu li img { +ol.LC_primary_menu li img { vertical-align: bottom; } -ol.LC_smallMenu a { +ol.LC_primary_menu a { font-size: 90%; color: RGB(80, 80, 80); text-decoration: none; } -ul#LC_TabMainMenuContent { +ul#LC_secondary_menu { clear: both; color: $fontmenu; background: $tabbg; list-style: none; padding: 0; margin: 0; - float:left; width: 100%; } -ul#LC_TabMainMenuContent li { - float: left; +ul#LC_secondary_menu li { font-weight: bold; line-height: 1.8em; padding: 0 0.8em; @@ -5938,30 +5986,27 @@ ul#LC_TabMainMenuContent li { vertical-align: middle; } -ul.LC_TabContent , -ul.LC_TabContentBigger { +ul.LC_TabContent { display:block; + background: $sidebg; + border-bottom: solid 1px $lg_border_color; list-style:none; - margin: 0; + margin: 0 -10px; padding: 0; } ul.LC_TabContent li, ul.LC_TabContentBigger li { - display: inline; - border-right: solid 1px $lg_border_color; float:left; - line-height:140%; - white-space:nowrap; } -ul#LC_TabMainMenuContent li a { +ul#LC_secondary_menu li a { color: $fontmenu; text-decoration: none; } ul.LC_TabContent { - min-height:1.6em; + min-height:1.5em; } ul.LC_TabContent li { @@ -5971,6 +6016,10 @@ ul.LC_TabContent li { border-bottom:solid 1px $lg_border_color; } +ul.LC_TabContent .right { + float:right; +} + ul.LC_TabContent li a, ul.LC_TabContent li { color:rgb(47,47,47); text-decoration:none; @@ -5981,48 +6030,90 @@ ul.LC_TabContent li a, ul.LC_TabContent ul.LC_TabContent li:hover, ul.LC_TabContent li.active { background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center; - border-bottom:solid 1px #FFFFFF; + border-bottom:solid 2px #FFFFFF; padding-right: 16px; } -ul.LC_TabContentBigger li { - vertical-align:bottom; - border-top:solid 1px $lg_border_color; - border-left:solid 1px $lg_border_color; - padding:5px 10px 5px 10px; - margin-left:2px; - background:url(/adm/lonIcons/lightGreyBG.png) repeat-x left top; +#maincoursedoc { + clear:both; +} + +ul.LC_TabContentBigger { + display:block; + list-style:none; + padding: 0; } -ul.LC_TabContentBigger li:hover, -ul.LC_TabContentBigger li.active { - background:url(/adm/lonIcons/lightGreyBG.png) repeat-x right bottom; +ul.LC_TabContentBigger li { + vertical-align:bottom; + height: 30px; + font-size:110%; + font-weight:bold; + color: #737373; } -ul.LC_TabContentBigger li, + ul.LC_TabContentBigger li a { - font-size:110%; - font-weight:bold; + background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat; + height: 30px; + line-height: 30px; + text-align: center; + display: block; + text-decoration: none; +} + +ul.LC_TabContentBigger li:hover a, +ul.LC_TabContentBigger li.active a { + background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat; + color:$font; + text-decoration: underline; +} + + +ul.LC_TabContentBigger li b { + background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom; + display: block; + float: left; + padding: 0 30px; +} + +ul.LC_TabContentBigger li:hover b, +ul.LC_TabContentBigger li.active b { + background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat; + color:$font; + border-bottom: 1px solid #FFFFFF; +} + + +ul.LC_CourseBreadcrumbs { + background: $sidebg; + line-height: 32px; + padding-left: 10px; + margin: 0 0 10px 0; + list-style-position: inside; + } ol#LC_MenuBreadcrumbs, -ol#LC_PathBreadcrumbs, -ul#LC_CourseBreadcrumbs { +ol#LC_PathBreadcrumbs { padding-left: 10px; margin: 0; list-style-position: inside; + /* SD working here + white-space: nowrap; */ } ol#LC_MenuBreadcrumbs li, ol#LC_PathBreadcrumbs li, -ul#LC_CourseBreadcrumbs li { - display: inline; - padding: 0 0 0 10px; - overflow:hidden; +ul.LC_CourseBreadcrumbs li { + display: inline; + white-space: nowrap; + /* SD working here + white-space: normal; */ } ol#LC_MenuBreadcrumbs li a, -ul#LC_CourseBreadcrumbs li a { +ul.LC_CourseBreadcrumbs li a { text-decoration: none; font-size:90%; } @@ -6033,18 +6124,9 @@ ol#LC_PathBreadcrumbs li a { font-weight:bold; } -.LC_BoxPadding { - padding: 10px; -} - -.LC_ContentBoxSpecial { - border: solid 1px $lg_border_color; -} - -.LC_ContentBoxSpecialContactInfo { - border: solid 1px $lg_border_color; - max-width:25%; - min-width:25%; +.LC_Box { + border: solid 1px $lg_border_color; + padding: 0 10px 10px 10px; } .LC_AboutMe_Image { @@ -6133,26 +6215,6 @@ div.LC_columnSection>* { overflow:hidden; } -.ContentBoxSpecialTemplate { - border: solid 1px $lg_border_color; -} - -.ContentBoxTemplate { - padding:10px; -} - -div.LC_columnSection > .ContentBoxTemplate, -div.LC_columnSection > .ContentBoxSpecialTemplate { - width: 600px; -} - -.clear { - clear: both; - line-height: 0; - font-size: 0; - height: 0; -} - .LC_loginpage_container { text-align:left; margin : 0 auto; @@ -6207,7 +6269,7 @@ table em { table.LC_tableBrowseRes, table.LC_tableOfContent { border:none; - border-spacing: 1; + border-spacing: 1px; padding: 3px; background-color: #FFFFFF; font-size: 90%; @@ -6301,7 +6363,7 @@ a.LC_toolbarItem { background-color:transparent; } -ul.LC_functionslist li { +ul.LC_funclist li { float: left; white-space: nowrap; height: 35px; /* at least as high as heighest list item */ @@ -6436,7 +6498,8 @@ sub xml_begin { .''; } else { - $output=''; + $output='' + .''; } return $output; } @@ -6512,9 +6575,6 @@ $args - additional optional args support a html attribute force_register -> if is true will turn on the &bodytag() $forcereg arg - body_title -> alternate text to use instead of $title - in the title box that appears, this text - is not auto translated like the $title is frameset -> if true will start with a rather than skip_phases -> hash ref of @@ -6526,6 +6586,8 @@ $args - additional optional args support inherit_jsmath -> when creating popup window in a page, should it have jsmath forced on by the current page + bread_crumbs -> Array containing breadcrumbs + bread_crumbs_components -> if exists show it as headline else show only the breadcrumbs =back @@ -6558,16 +6620,15 @@ sub start_page { my $attr_string = &make_attr_string($args->{'force_register'}, $args->{'add_entries'}); $result .= "\n\n"; - } else { - $result .= - &bodytag($title, - $args->{'function'}, $args->{'add_entries'}, - $args->{'only_body'}, $args->{'domain'}, - $args->{'force_register'}, $args->{'body_title'}, - $args->{'no_nav_bar'}, $args->{'bgcolor'}, - $args->{'no_inline_link'}, - $args); - } + } else { + $result .= + &bodytag($title, + $args->{'function'}, $args->{'add_entries'}, + $args->{'only_body'}, $args->{'domain'}, + $args->{'force_register'}, $args->{'no_nav_bar'}, + $args->{'bgcolor'}, $args->{'no_inline_link'}, + $args); + } } if ($args->{'js_ready'}) { @@ -6732,14 +6793,14 @@ sub simple_error_page { my ($add_class) = @_; $row_count[0]++; my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row'; - $css_class = (join(' ',$css_class,$add_class)); + $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); return ''."\n";; } sub continue_data_table_row { my ($add_class) = @_; my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row'; - $css_class = (join(' ',$css_class,$add_class)); + $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');; return ''."\n";; } @@ -6763,6 +6824,11 @@ sub simple_error_page { sub end_data_table_header_row { return ''."\n";; } + + sub data_table_caption { + my $caption = shift; + return "$caption"; + } } =pod @@ -6833,7 +6899,7 @@ sub get_users_function { if ($env{'request.role'}=~/^(st)/) { $function='student'; } - if ($env{'request.role'}=~/^(cc|in|ta|ep)/) { + if ($env{'request.role'}=~/^(cc|co|in|ta|ep)/) { $function='coordinator'; } if ($env{'request.role'}=~/^(su|dc|ad|li)/) { @@ -6904,7 +6970,7 @@ sub check_user_status { my $active_chk = 'none'; my $now = time; if (@uroles > 0) { - if (($role eq 'cc') || ($sec eq '') || (!defined($sec))) { + if (($role eq 'cc') || ($role eq 'co') || ($sec eq '') || (!defined($sec))) { $srchstr = '/'.$cdom.'/'.$crs.'_'.$role; } else { $srchstr = '/'.$cdom.'/'.$crs.'/'.$sec.'_'.$role; @@ -7535,6 +7601,7 @@ sub user_picker { # loncreateuser::print_user_query_page() # has been completed. next if ($option eq 'alc'); + next if (($option eq 'crs') && ($env{'form.form'} eq 'requestcrs')); next if ($option eq 'crs' && !$env{'request.course.id'}); if ($curr_selected{'srchin'} eq $option) { $srchinsel .= ' @@ -7699,24 +7766,20 @@ $newuserscript $new_user_create - - - $lt{'doma'}: - $domform - - - - $lt{'usr'}: - $srchbysel - $srchtypesel - - $srchinsel - - - - END_BLOCK + $output .= &Apache::lonhtmlcommon::start_pick_box(). + &Apache::lonhtmlcommon::row_title($lt{'doma'}). + $domform. + &Apache::lonhtmlcommon::row_closure(). + &Apache::lonhtmlcommon::row_title($lt{'usr'}). + $srchbysel. + $srchtypesel. + ''. + $srchinsel. + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::end_pick_box(). + ''; return $output; } @@ -8589,7 +8652,7 @@ sub csv_print_samples { $r->print(&mt('Samples').''.&start_data_table(). &start_data_table_header_row()); foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { - $r->print(''.&mt('Column [_1]',($sample+1)).''); } + $r->print(''.&mt('Column [_1]',($sample+1)).''); } $r->print(&end_data_table_header_row()); foreach my $hash (@$samples) { $r->print(&start_data_table_row()); @@ -8633,7 +8696,7 @@ sub csv_print_select_table { my ($value,$display,$defaultcol)=@{ $array_ref }; $r->print(&start_data_table_row().''.$display.''); - $r->print('print(''); $r->print(''); foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { @@ -9287,10 +9350,11 @@ sub restore_settings { =item * &build_recipient_list() -Build recipient lists for four types of e-mail: +Build recipient lists for five types of e-mail: (a) Error Reports, (b) Package Updates, (c) lonstatus warnings/errors -(d) Help requests, generated by -lonerrorhandler.pm, CHECKRPMS, loncron, and lonsupportreq.pm respectively. +(d) Help requests, (e) Course requests needing approval, generated by +lonerrorhandler.pm, CHECKRPMS, loncron, lonsupportreq.pm and +loncoursequeueadmin.pm respectively. Inputs: defmail (scalar - email address of default recipient), @@ -9858,12 +9922,26 @@ sub check_clone { my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom); my $clonemsg; my $can_clone = 0; - + my $lctype = lc($args->{'type'}); + if ($lctype ne 'community') { + $lctype = 'course'; + } if ($clonehome eq 'no_host') { - $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); + if ($args->{'type'} eq 'Community') { + $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a non-existent community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); + } else { + $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); + } } else { my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1}); - if ($env{'request.role.domain'} eq $args->{'clonedomain'}) { + if ($args->{'type'} eq 'Community') { + if ($clonedesc{'type'} ne 'Community') { + $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); + return ($can_clone, $clonemsg, $cloneid, $clonehome); + } + } + if (($env{'request.role.domain'} eq $args->{'clonedomain'}) && + (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) { $can_clone = 1; } else { my %clonehash = &Apache::lonnet::get('environment',['cloners'], @@ -9874,15 +9952,23 @@ sub check_clone { } elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) { $can_clone = 1; } else { + my $ccrole = 'cc'; + if ($args->{'type'} eq 'Community') { + $ccrole = 'co'; + } my %roleshash = &Apache::lonnet::get_my_roles($args->{'ccuname'}, $args->{'ccdomain'}, - 'userroles',['active'],['cc'], + 'userroles',['active'],[$ccrole], [$args->{'clonedomain'}]); - if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':cc'}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { + if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { $can_clone = 1; } else { - $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); + if ($args->{'type'} eq 'Community') { + $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); + } else { + $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); + } } } } @@ -9891,7 +9977,7 @@ sub check_clone { } sub construct_course { - my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context) = @_; + my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context,$cnum,$category) = @_; my $outcome; my $linefeed = ''."\n"; if ($context eq 'auto') { @@ -9929,7 +10015,8 @@ sub construct_course { $args->{'crscode'}, $args->{'ccuname'}.':'. $args->{'ccdomain'}, - $args->{'crstype'}); + $args->{'crstype'}, + $cnum,$context,$category); # Note: The testing routines depend on this being output; see # Utils::Course. This needs to at least be output as a comment @@ -10238,11 +10325,21 @@ sub group_term { my $crstype = &course_type(); my %names = ( 'Course' => 'group', - 'Group' => 'team', + 'Community' => 'group', ); return $names{$crstype}; } +sub course_types { + my @types = ('official','unofficial','community'); + my %typename = ( + official => 'Official course', + unofficial => 'Unofficial course', + community => 'Community', + ); + return (\@types,\%typename); +} + sub icon { my ($file)=@_; my $curfext = lc((split(/\./,$file))[-1]); @@ -10431,7 +10528,7 @@ sub init_user_environment { &Apache::lonnet::usertools_access($username,$domain,$tool,'reload'); } - foreach my $crstype ('official','unofficial') { + foreach my $crstype ('official','unofficial','community') { $userenv{'canrequest.'.$crstype} = &Apache::lonnet::usertools_access($username,$domain,$crstype, 'reload','requestcourses');