--- loncom/interface/loncommon.pm 2009/07/21 14:36:07 1.863 +++ loncom/interface/loncommon.pm 2010/08/18 17:59:28 1.978 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.863 2009/07/21 14:36:07 droeschl Exp $ +# $Id: loncommon.pm,v 1.978 2010/08/18 17:59:28 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 = 'Course_Browser'; + if ($crstype eq 'Community') { + $wintitle = 'Community_Browser'; + } + 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) { @@ -745,7 +900,7 @@ sub select_language { $langchoices{$code} = &plainlanguagedescription($id); } } - return &select_form($selected,$name,%langchoices); + return &select_form($selected,$name,\%langchoices); } =pod @@ -917,7 +1072,7 @@ END =pod -=item * &help_open_topic($topic,$text,$stayOnPage,$width,$height) +=item * &help_open_topic($topic,$text,$stayOnPage,$width,$height,$imgid) Returns a string corresponding to an HTML link to the given help $topic, where $topic corresponds to the name of a .tex file in @@ -935,12 +1090,16 @@ a new window using Javascript. (Default $width and $height are optional numerical parameters that will override the width and height of the popped up window, which may -be useful for certain help topics with big pictures included. +be useful for certain help topics with big pictures included. + +$imgid is the id of the img tag used for the help icon. This may be +used in a javascript call to switch the image src. See +lonhtmlcommon::htmlareaselectactive() for an example. =cut sub help_open_topic { - my ($topic, $text, $stayOnPage, $width, $height) = @_; + my ($topic, $text, $stayOnPage, $width, $height, $imgid) = @_; $text = "" if (not defined $text); $stayOnPage = 0 if (not defined $stayOnPage); $width = 350 if (not defined $width); @@ -969,10 +1128,13 @@ sub help_open_topic { # (Always) Add the graphic my $title = &mt('Online Help'); my $helpicon=&lonhttpdurl("/adm/help/help.png"); + if ($imgid ne '') { + $imgid = ' id="'.$imgid.'"'; + } $template.=' ' .''.&mt('Help: [_1]',$topic).''; if ($text ne "") { $template.=''; @@ -1015,7 +1177,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'; @@ -1047,12 +1209,7 @@ ENDOUTPUT sub help_open_menu { my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) = @_; - $stayOnPage = 0 if (not defined $stayOnPage); - # only use pop-up help (stayOnPage == 0) - # if environment.remote is on (using remote control UI) - if ($env{'environment.remote'} eq 'off' ) { - $stayOnPage=1; - } + $stayOnPage = 1; my $output; if ($component_help) { if (!$text) { @@ -1073,8 +1230,8 @@ sub help_open_menu { sub top_nav_help { my ($text) = @_; $text = &mt($text); - my $stay_on_page = - ($env{'environment.remote'} eq 'off' ); + my $stay_on_page = 1; + my $link = ($stay_on_page) ? "javascript:helpMenu('display')" : "javascript:helpMenu('open')"; my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page); @@ -1089,10 +1246,7 @@ END sub help_menu_js { my ($text) = @_; - - my $stayOnPage = - ($env{'environment.remote'} eq 'off' ); - + my $stayOnPage = 1; my $width = 620; my $height = 600; my $helptopic=&general_help(); @@ -1111,8 +1265,8 @@ sub help_menu_js { my $template .= <<"ENDTEMPLATE"; ENDTEMPLATE return $template; @@ -1149,10 +1303,7 @@ sub help_open_bug { unless ($env{'user.adv'}) { return ''; } unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; } $text = "" if (not defined $text); - $stayOnPage = 0 if (not defined $stayOnPage); - if ($env{'environment.remote'} eq 'off' ) { $stayOnPage=1; - } $width = 600 if (not defined $width); $height = 600 if (not defined $height); @@ -1193,10 +1344,7 @@ sub help_open_faq { unless ($env{'user.adv'}) { return ''; } unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; } $text = "" if (not defined $text); - $stayOnPage = 0 if (not defined $stayOnPage); - if ($env{'environment.remote'} eq 'off' ) { $stayOnPage=1; - } $width = 350 if (not defined $width); $height = 400 if (not defined $height); @@ -1564,10 +1712,13 @@ sub create_workbook { my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename); if (! defined($workbook)) { $r->log_error("Error creating excel spreadsheet $filename: $!"); - $r->print('

'.&mt("Unable to create new Excel file. ". - "This error has been logged. ". - "Please alert your LON-CAPA administrator"). - '

'); + $r->print( + '

' + .&mt('Problems occurred in creating the new Excel file.') + .' '.&mt('This error has been logged.') + .' '.&mt('Please alert your LON-CAPA administrator.') + .'

' + ); return (undef); } # @@ -1607,9 +1758,13 @@ sub create_text_file { $fh = Apache::File->new('>/home/httpd'.$filename); if (! defined($fh)) { $r->log_error("Couldn't open $filename for output $!"); - $r->print(&mt('Problems occurred in creating the output file. ' - .'This error has been logged. ' - .'Please alert your LON-CAPA administrator.')); + $r->print( + '

' + .&mt('Problems occurred in creating the output file.') + .' '.&mt('This error has been logged.') + .' '.&mt('Please alert your LON-CAPA administrator.') + .'

' + ); } return ($fh,$filename) } @@ -1638,7 +1793,7 @@ sub domain_select { return &multiple_select_form($name,$value,4,\%domains); } else { $domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))]; - return &select_form($name,$value,%domains); + return &select_form($name,$value,\%domains); } } @@ -1700,29 +1855,36 @@ sub multiple_select_form { =pod -=item * &select_form($defdom,$name,%hash) +=item * &select_form($defdom,$name,$hashref,$onchange) Returns a string containing a \n"; + my ($def,$name,$hashref,$onchange) = @_; + return unless (ref($hashref) eq 'HASH'); + if ($onchange) { + $onchange = ' onchange="'.$onchange.'"'; + } + my $selectform = ""; return $selectform; @@ -1740,9 +1902,9 @@ sub display_filter { &mt('Filter [_1]', &select_form($env{'form.displayfilter'}, 'displayfilter', - ('currentfolder' => 'Current folder/page', + {'currentfolder' => 'Current folder/page', 'containing' => 'Containing phrase', - 'none' => 'None'))). + 'none' => 'None'})). ''; } @@ -1787,7 +1949,7 @@ sub select_level_form { =pod -=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$autosubmit) +=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms) Returns a string containing a \n"; foreach my $dom (@domains) { @@ -2862,7 +3030,7 @@ sub messagewrapper { sub noteswrapper { my ($link,$un,$do)=@_; return -"$link"; +"$link"; } # ------------------------------------------------------------- Aboutme Wrapper @@ -2872,7 +3040,7 @@ sub aboutmewrapper { if (!defined($username) && !defined($domain)) { return; } - return ''.$link.''; } @@ -2886,7 +3054,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 +3068,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}. @@ -3077,8 +3246,7 @@ sub filemimetype { sub filecategoryselect { my ($name,$value)=@_; return &select_form($value,$name, - '' => &mt('Any category'), - map { $_,$_ } sort(keys(%category_extensions))); + {'' => &mt('Any category'), map { $_,$_ } sort(keys(%category_extensions))}); } =pod @@ -3243,12 +3411,25 @@ sub get_previous_attempt { } $prevattempts=&start_data_table().&start_data_table_header_row(); $prevattempts.=''.&mt('History').''; + my (%typeparts,%lasthidden); + my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'}); foreach my $key (sort(keys(%lasthash))) { my ($ign,@parts) = split(/\./,$key); if ($#parts > 0) { my $data=$parts[-1]; pop(@parts); - $prevattempts.=''.&mt('Part ').join('.',@parts).'
'.$data.' '; + if ($data eq 'type') { + unless ($showsurv) { + my $id = join(',',@parts); + $typeparts{$ign.'.'.$id} = $lasthash{$key}; + if (($lasthash{$key} eq 'anonsurvey') || ($lasthash{$key} eq 'anonsurveycred')) { + $lasthidden{$ign.'.'.$id} = 1; + } + } + delete($lasthash{$key}); + } else { + $prevattempts.=''.&mt('Part ').join('.',@parts).'
'.$data.' '; + } } else { if ($#parts == 0) { $prevattempts.=''.$parts[0].''; @@ -3260,21 +3441,90 @@ sub get_previous_attempt { $prevattempts.=&end_data_table_header_row(); if ($getattempt eq '') { for ($version=1;$version<=$returnhash{'version'};$version++) { - $prevattempts.=&start_data_table_row(). - ''.&mt('Transaction [_1]',$version).''; - foreach my $key (sort(keys(%lasthash))) { - my $value = &format_previous_attempt_value($key, - $returnhash{$version.':'.$key}); - $prevattempts.=''.$value.' '; - } - $prevattempts.=&end_data_table_row(); + my @hidden; + if (%typeparts) { + foreach my $id (keys(%typeparts)) { + if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || ($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) { + push(@hidden,$id); + } + } + } + $prevattempts.=&start_data_table_row(). + ''.&mt('Transaction [_1]',$version).''; + if (@hidden) { + foreach my $key (sort(keys(%lasthash))) { + my $hide; + foreach my $id (@hidden) { + if ($key =~ /^\Q$id\E/) { + $hide = 1; + last; + } + } + if ($hide) { + my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/); + if (($data eq 'award') || ($data eq 'awarddetail')) { + my $value = &format_previous_attempt_value($key, + $returnhash{$version.':'.$key}); + $prevattempts.=''.$value.' '; + } else { + $prevattempts.=' '; + } + } else { + if ($key =~ /\./) { + my $value = &format_previous_attempt_value($key, + $returnhash{$version.':'.$key}); + $prevattempts.=''.$value.' '; + } else { + $prevattempts.=' '; + } + } + } + } else { + foreach my $key (sort(keys(%lasthash))) { + my $value = &format_previous_attempt_value($key, + $returnhash{$version.':'.$key}); + $prevattempts.=''.$value.' '; + } + } + $prevattempts.=&end_data_table_row(); } } + my @currhidden = keys(%lasthidden); $prevattempts.=&start_data_table_row().''.&mt('Current').''; foreach my $key (sort(keys(%lasthash))) { - my $value = &format_previous_attempt_value($key,$lasthash{$key}); - if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)} - $prevattempts.=''.$value.' '; + if (%typeparts) { + my $hidden; + foreach my $id (@currhidden) { + if ($key =~ /^\Q$id\E/) { + $hidden = 1; + last; + } + } + if ($hidden) { + my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/); + if (($data eq 'award') || ($data eq 'awarddetail')) { + my $value = &format_previous_attempt_value($key,$lasthash{$key}); + if ($key =~/$regexp$/ && (defined &$gradesub)) { + $value = &$gradesub($value); + } + $prevattempts.=''.$value.' '; + } else { + $prevattempts.=' '; + } + } else { + my $value = &format_previous_attempt_value($key,$lasthash{$key}); + if ($key =~/$regexp$/ && (defined &$gradesub)) { + $value = &$gradesub($value); + } + $prevattempts.=''.$value.' '; + } + } else { + my $value = &format_previous_attempt_value($key,$lasthash{$key}); + if ($key =~/$regexp$/ && (defined &$gradesub)) { + $value = &$gradesub($value); + } + $prevattempts.=''.$value.' '; + } } $prevattempts.= &end_data_table_row().&end_data_table(); } else { @@ -3447,10 +3697,13 @@ sub submlink { } if (!$symb) { $symb=&Apache::lonnet::symbread(); } $symb=&escape($symb); - if ($target) { $target="target=\"$target\""; } - return ''.$text.''; + if ($target) { $target=" target=\"$target\""; } + return + ''.$text.''; } ############################################## @@ -3576,6 +3829,7 @@ sub findallcourses { if (!%roles) { %roles = ( cc => 1, + co => 1, in => 1, ep => 1, ta => 1, @@ -3766,7 +4020,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,64 +4085,25 @@ 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 $blocked = blocking_status_print(@_); my ($activity,$uname,$udom) = @_; - if(!wantarray) { - return $blocked; - } - my $output; - my $querystring; - $querystring = "?activity=$activity"; - if(defined($uname)) { - $querystring .= "&uname=$uname"; - }if(defined($udom)) { - $querystring .= "&udom=$udom"; - } + my %setters; - $output .= <<"END_MYBLOCK"; - END_MYBLOCK + + $output = Apache::lonhtmlcommon::scripttag($output); + my $popupUrl = "/adm/blockingstatus/$querystring"; - $output.="\nBlocking Table"; + my $text = mt('Communication Blocked'); + + $output .= <<"END_BLOCK"; +
+ + $text + $text +
+ +END_BLOCK return ($blocked, $output); } -sub blocking_status_print { - 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; - } -} ############################################### @@ -4038,7 +4207,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'}; @@ -4061,16 +4230,39 @@ sub get_domainconf { if (defined($cached)) { return %{$result}; } my %domconfig = &Apache::lonnet::get_dom('configuration', - ['login','rolecolors'],$udom); + ['login','rolecolors','autoenroll'],$udom); my (%designhash,%legacy); if (keys(%domconfig) > 0) { if (ref($domconfig{'login'}) eq 'HASH') { if (keys(%{$domconfig{'login'}})) { foreach my $key (keys(%{$domconfig{'login'}})) { if (ref($domconfig{'login'}{$key}) eq 'HASH') { - foreach my $img (keys(%{$domconfig{'login'}{$key}})) { - $designhash{$udom.'.login.'.$key.'_'.$img} = - $domconfig{'login'}{$key}{$img}; + if ($key eq 'loginvia') { + if (ref($domconfig{'login'}{'loginvia'}) eq 'HASH') { + my @ids = &Apache::lonnet::current_machine_ids(); + foreach my $hostname (@ids) { + if (ref($domconfig{'login'}{'loginvia'}{$hostname}) eq 'HASH') { + if ($domconfig{'login'}{'loginvia'}{$hostname}{'server'}) { + my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'}; + $designhash{$udom.'.login.loginvia'} = $server; + if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') { + + $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'}; + } else { + $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'}; + } + if ($domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}) { + $designhash{$udom.'.login.loginvia_exempt_'.$hostname} = $domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}; + } + } + } + } + } + } else { + foreach my $img (keys(%{$domconfig{'login'}{$key}})) { + $designhash{$udom.'.login.'.$key.'_'.$img} = + $domconfig{'login'}{$key}{$img}; + } } } else { $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key}; @@ -4097,6 +4289,11 @@ sub get_domainconf { } else { $legacy{'rolecolors'} = 1; } + if (ref($domconfig{'autoenroll'}) eq 'HASH') { + if ($domconfig{'autoenroll'}{'co-owners'}) { + $designhash{$udom.'.autoassign.co-owners'}=$domconfig{'autoenroll'}{'co-owners'}; + } + } if (keys(%legacy) > 0) { my %legacyhash = &get_legacy_domconf($udom); foreach my $item (keys(%legacyhash)) { @@ -4289,18 +4486,30 @@ sub CSTR_pageheader { } else { $lastitem = $thisdisfn; } - return + + my $output = '
' .&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it? .''.&mt('Construction Space:').' ' .'
' #FIXME lonpubdir: target="_parent" - .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."$lastitem
" + .'" target="_top">' #FIXME lonpubdir: target="_parent" + .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv',undef,undef); + + if ($lastitem) { + $output .= + '' + .$lastitem + .''; + } + $output .= + '
' #FIXME lonpubdir: &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."
" .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()') .'
' .&Apache::lonmenu::constspaceform() .'
'; + + return $output; } ############################################### @@ -4340,9 +4549,6 @@ Inputs: =item * $bgcolor, used to override the bgcolor on a webpage to a specific value -=item * $no_inline_link, if true and in remote mode, don't show the - 'Switch To Inline Menu' link - =item * $args, optional argument valid values are no_auto_mt_title -> prevents &mt()ing the title arg inherit_jsmath -> when creating popup window in a page, @@ -4360,8 +4566,13 @@ other decorations will be returned. sub bodytag { my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, - $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_; + $no_nav_bar,$bgcolor,$args)=@_; + my $public; + if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) + || ($env{'user.name'} eq '') && ($env{'user.domain'} eq '')) { + $public = 1; + } if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } $function = &get_users_function() if (!$function); @@ -4388,14 +4599,15 @@ 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); } if (!$realm) { $realm=' '; } -# Set messages - my $messages=&domainlogo($domain); my $extra_body_attr = &make_attr_string($forcereg,\%design); @@ -4408,7 +4620,7 @@ sub bodytag { } my $name = &plainname($env{'user.name'},$env{'user.domain'}); - if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { + if ($public) { undef($role); } else { $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}); @@ -4422,72 +4634,75 @@ sub bodytag { $env{'course.'.$env{'request.course.id'}. '.domain'}.'/'})) { my $cid = $env{'request.course.id'}; - $dc_info.= $cid.' '.$env{'course.'.$cid.'.internal.coursecode'}; + $dc_info = $cid.' '.$env{'course.'.$cid.'.internal.coursecode'}; $dc_info =~ s/\s+$//; - $dc_info = '('.$dc_info.')'; } - $role = "($role)" if $role; + $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 || $env{'form.inhibitmenu'} eq 'yes') { + return $bodytag; + } -# if ($env{'request.state'} eq 'construct') { -# $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls -# } - - my $titletable = '' - ."" - .'
$titleinfo $dc_info
'; + if ($env{'request.state'} eq 'construct') { $forcereg=1; } - if ($no_nav_bar) { - $bodytag .= $titletable; - } else { - $bodytag .= qq|
$name $role
- $realm $dc_info
| unless $env{'form.inhibitmenu'}; + # if ($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') { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$titletable); - } else { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg).$titletable; + + + if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { + if ($dc_info) { + $dc_info = qq|$dc_info|; + } + $bodytag .= qq|
$name $role
+ $realm $dc_info
|; + return $bodytag; + } + + unless ($env{'request.symb'} =~ m/\.page___\d+___/) { + $bodytag .= qq|
$name $role
|; + } + + $bodytag .= Apache::lonhtmlcommon::scripttag( + Apache::lonmenu::utilityfunctions(), 'start'); + + $bodytag .= Apache::lonmenu::primary_menu(); + + if ($dc_info) { + $dc_info = &dc_courseid_toggle($dc_info); + } + $bodytag .= qq|
$realm $dc_info
|; + + #don't show menus for public users + if (!$public){ + $bodytag .= Apache::lonmenu::secondary_menu(); + $bodytag .= Apache::lonmenu::serverform(); + $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); + if ($env{'request.state'} eq 'construct') { + $bodytag .= &Apache::lonmenu::innerregister($forcereg, + $args->{'bread_crumbs'}); + } elsif ($forcereg) { + $bodytag .= &Apache::lonmenu::innerregister($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'); } - return $bodytag; - } -# -# Top frame rendering, Remote is up -# + return $bodytag; +} - my $imgsrc = $img; - if ($img =~ /^\/adm/) { - $imgsrc = &lonhttpdurl($img); - } - my $upperleft=''.$function.''; - - # Explicit link to get inline menu - my $menu= ($no_inline_link?'' - :''.&mt('Switch to Inline Menu Mode').''); - $bodytag .= qq|
$name $role - $realm $dc_info
-
    -
  1. $menu
  2. -
| unless $env{'form.inhibitmenu'}; - # - return(< -$upperleft - $messages  - -$titleinfo $dc_info $menu - - -ENDBODY +sub dc_courseid_toggle { + my ($dc_info) = @_; + return ' '. + ''. + &mt('(More ...)').''. + '
'.$dc_info.'
'; } sub make_attr_string { @@ -4511,22 +4726,8 @@ sub make_attr_string { delete($attr_ref->{$key}); } } - $attr_ref->{'onload'} = - &Apache::lonmenu::loadevents(). $on_load; - $attr_ref->{'onunload'}= - &Apache::lonmenu::unloadevents().$on_unload; - } - -# Accessibility font enhance - if ($env{'browser.fontenhance'} eq 'on') { - my $style; - foreach my $key (keys(%{$attr_ref})) { - if (lc($key) eq 'style') { - $style.=$attr_ref->{$key}.';'; - delete($attr_ref->{$key}); - } - } - $attr_ref->{'style'}=$style.'; font-size: x-large;'; + $attr_ref->{'onload'} = $on_load; + $attr_ref->{'onunload'}= $on_unload; } my $attr_string; @@ -4600,10 +4801,6 @@ sub standard_css { my $vlink = &designparm($function.'.vlink', $domain); my $link = &designparm($function.'.link', $domain); - my $loginbg = &designparm('login.sidebg',$domain); - my $bgcol = &designparm('login.bgcol',$domain); - my $textcol = &designparm('login.textcol',$domain); - my $sans = 'Verdana,Arial,Helvetica,sans-serif'; my $mono = 'monospace'; my $data_table_head = $sidebg; @@ -4621,57 +4818,70 @@ sub standard_css { my $mail_other_hover = '#669999'; my $table_header = '#DDDDDD'; my $feedback_link_bg = '#BBBBBB'; - my $lg_border_color = '#C8C8C8'; + my $lg_border_color = '#C8C8C8'; + my $button_hover = '#BF2317'; my $border = ($env{'browser.type'} eq 'explorer' || - $env{'browser.type'} eq 'safari' ) ? '0 2px 0 2px' - : '0 3px 0 4px'; + $env{'browser.type'} eq 'safari' ) ? '0 2px 0 2px' + : '0 3px 0 4px'; return < td { background-color: #CCCCCC; font-weight: bold; text-align: left; } -table.LC_data_table tr.LC_odd_row > td, +table.LC_data_table tr.LC_odd_row > td { + background-color: $data_table_light; + padding: 2px; + vertical-align: top; +} + table.LC_pick_box tr > td.LC_odd_row { background-color: $data_table_light; + vertical-align: top; +} + +table.LC_data_table tr.LC_even_row > td { + background-color: $data_table_dark; 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 { @@ -4987,13 +5195,23 @@ table.LC_data_table tr td.LC_leftcol_hea table.LC_data_table tr.LC_empty_row td, table.LC_nested tr.LC_empty_row td { - background-color: #FFFFFF; font-weight: bold; font-style: italic; text-align: center; padding: 8px; } +table.LC_data_table tr.LC_empty_row td { + background-color: $sidebg; +} + +table.LC_nested tr.LC_empty_row td { + background-color: #FFFFFF; +} + +table.LC_caption { +} + table.LC_nested tr.LC_empty_row td { padding: 4ex } @@ -5038,6 +5256,22 @@ table.LC_nested tr td.LC_right_item { text-align: right; } +.ui-accordion table.LC_nested tr.LC_odd_row td.LC_left_item, +.ui-accordion table.LC_nested tr.LC_even_row td.LC_left_item { + text-align: right; + width: 40%; + padding-right:10px; + vertical-align: top; + padding: 5px; +} + +.ui-accordion table.LC_nested tr.LC_odd_row td.LC_right_item, +.ui-accordion table.LC_nested tr.LC_even_row td.LC_right_item { + text-align: left; + width: 60%; + padding: 2px 4px; +} + table.LC_nested tr.LC_odd_row td { background-color: #EEEEEE; } @@ -5058,6 +5292,7 @@ table.LC_createuser tr.LC_info_row td { table.LC_calendar { border: 1px solid #000000; border-collapse: collapse; + width: 98%; } table.LC_calendar_pickdate { @@ -5067,6 +5302,7 @@ table.LC_calendar_pickdate { table.LC_calendar tr td { border: 1px solid #000000; vertical-align: top; + width: 14%; } table.LC_calendar tr td.LC_calendar_day_empty { @@ -5077,47 +5313,47 @@ table.LC_calendar tr td.LC_calendar_day_ background-color: $data_table_highlight; } -table.LC_mail_list tr.LC_mail_new { +table.LC_data_table tr td.LC_mail_new { background-color: $mail_new; } -table.LC_mail_list tr.LC_mail_new:hover { +table.LC_data_table tr.LC_mail_new:hover { background-color: $mail_new_hover; } -table.LC_mail_list tr.LC_mail_even { -} - -table.LC_mail_list tr.LC_mail_odd { -} - -table.LC_mail_list tr.LC_mail_read { +table.LC_data_table tr td.LC_mail_read { background-color: $mail_read; } -table.LC_mail_list tr.LC_mail_read:hover { +/* +table.LC_data_table tr.LC_mail_read:hover { background-color: $mail_read_hover; } +*/ -table.LC_mail_list tr.LC_mail_replied { +table.LC_data_table tr td.LC_mail_replied { background-color: $mail_replied; } -table.LC_mail_list tr.LC_mail_replied:hover { +/* +table.LC_data_table tr.LC_mail_replied:hover { background-color: $mail_replied_hover; } +*/ -table.LC_mail_list tr.LC_mail_other { +table.LC_data_table tr td.LC_mail_other { background-color: $mail_other; } -table.LC_mail_list tr.LC_mail_other:hover { +/* +table.LC_data_table tr.LC_mail_other:hover { background-color: $mail_other_hover; } +*/ 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, @@ -5126,40 +5362,40 @@ 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 { -/* background: #77FF77; */ + /* background: #77FF77; */ } table.LC_data_table tr > td.LC_roles_future { - background: #FFFF77; + border-right: 8px solid #FFFF77; } table.LC_data_table tr > td.LC_roles_will { - background: #FFAA77; + border-right: 8px solid #FFAA77; } table.LC_data_table tr > td.LC_roles_expired { - background: #FF7777; + border-right: 8px solid #FF7777; } table.LC_data_table tr > td.LC_roles_will_not { - background: #AAFF77; + border-right: 8px solid #AAFF77; } table.LC_data_table tr > td.LC_roles_selected { - background: #11CC55; + border-right: 8px solid #11CC55; } span.LC_current_location { @@ -5187,12 +5423,21 @@ span.LC_parm_part { color: blue; } -span.LC_parm_folder, span.LC_parm_symb { +span.LC_parm_folder, +span.LC_parm_symb { font-size: x-small; font-family: $mono; color: #AAAAAA; } +ul.LC_parm_parmlist li { + display: inline-block; + padding: 0.3em 0.8em; + vertical-align: top; + width: 150px; + border-top:1px solid $lg_border_color; +} + td.LC_parm_overview_level_menu, td.LC_parm_overview_map_menu, td.LC_parm_overview_parm_selectors, @@ -5277,7 +5522,7 @@ table.LC_pick_box { table.LC_pick_box td.LC_pick_box_title { background: $sidebg; font-weight: bold; - text-align: right; + text-align: left; vertical-align: top; width: 184px; padding: 8px; @@ -5315,40 +5560,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; } @@ -5387,35 +5598,23 @@ table.LC_group_priv td { padding: 0; } -table.LC_notify_front_page { - background: white; - border: 1px solid black; - padding: 8px; -} - -table.LC_notify_front_page td { - padding: 8px; -} - .LC_navbuttons { margin: 2ex 0ex 2ex 0ex; } .LC_topic_bar { font-weight: bold; - width: 100%; background: $tabbg; - vertical-align: middle; - margin: 2ex 0ex 2ex 0ex; + margin: 1em 0em 1em 2em; padding: 3px; + font-size: 1.2em; } .LC_topic_bar span { + left: 0.5em; + position: absolute; vertical-align: middle; -} - -.LC_topic_bar img { - vertical-align: bottom; + font-size: 1.2em; } table.LC_course_group_status { @@ -5441,12 +5640,27 @@ div.LC_feedback_link { div.LC_feedback_link img { height: 22px; + vertical-align:middle; } -div.LC_feedback_link a{ +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; */ font-size: larger; @@ -5512,12 +5726,12 @@ span.LC_prior_string, span.LC_prior_custom, span.LC_prior_reaction, span.LC_prior_math { - font-family: monospace; + font-family: $mono; white-space: pre; } span.LC_prior_string { - font-family: monospace; + font-family: $mono; white-space: pre; } @@ -5526,7 +5740,7 @@ table.LC_prior_option { border-collapse: collapse; } -table.LC_prior_rank, +table.LC_prior_rank, table.LC_prior_match { border-collapse: collapse; } @@ -5550,17 +5764,6 @@ span.LC_cusr_subheading { font-size: 85%; } -table.LC_docs_documents { - background: #BBBBBB; - border-width: 0; - border-collapse: collapse; -} - -table.LC_docs_documents td.LC_docs_document { - border: 2px solid black; - padding: 4px; -} - div.LC_docs_entry_move { border: 1px solid #BBBBBB; background: #DDDDDD; @@ -5636,10 +5839,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%; @@ -5656,56 +5855,41 @@ div.LC_clear_float_footer { } div.LC_grade_show_user { - margin-top: 20px; - border: 1px solid black; +/* border-left: 5px solid $sidebg; */ + border-top: 5px solid #000000; + margin: 50px 0 0 0; + padding: 15px 0 5px 10px; } -div.LC_grade_user_name { - background: #DDDDEE; - border-bottom: 1px solid black; - font-weight: bold; - font-size: large; +div.LC_grade_show_user_odd_row { +/* border-left: 5px solid #000000; */ } -div.LC_grade_show_user_odd_row div.LC_grade_user_name { - background: #DDEEDD; +div.LC_grade_show_user div.LC_Box { + margin-right: 50px; } -div.LC_grade_show_problem, div.LC_grade_submissions, div.LC_grade_message_center, -div.LC_grade_info_links, -div.LC_grade_assign { +div.LC_grade_info_links { margin: 5px; width: 99%; background: #FFFFFF; } -div.LC_grade_show_problem_header, div.LC_grade_submissions_header, -div.LC_grade_message_center_header, -div.LC_grade_assign_header { +div.LC_grade_message_center_header { font-weight: bold; font-size: large; } -div.LC_grade_show_problem_problem, div.LC_grade_submissions_body, -div.LC_grade_message_center_body, -div.LC_grade_assign_body { +div.LC_grade_message_center_body { border: 1px solid black; width: 99%; background: #FFFFFF; } -span.LC_grade_check_note { - font-weight: normal; - font-size: medium; - display: inline; - position: absolute; - right: 1em; -} - table.LC_scantron_action { width: 100%; } @@ -5739,15 +5923,8 @@ div.LC_edit_problem_header_title { } table.LC_edit_problem_header_title { - font-size: larger; - font-weight: bold; width: 100%; - border-color: $pgbg; - border-style: solid; - border-width: $border; background: $tabbg; - border-collapse: collapse; - padding: 0; } div.LC_edit_problem_discards { @@ -5760,249 +5937,319 @@ div.LC_edit_problem_saves { padding-bottom: 5px; } -img.stift{ +img.stift { border-width: 0; vertical-align: middle; } -table#LC_mainmenu{ - margin-top:10px; - width:80%; -} - -table#LC_mainmenu td.LC_mainmenu_col_fieldset{ +table td.LC_mainmenu_col_fieldset { vertical-align: top; - width: 45%; -} - -.LC_mainmenu_fieldset_category { - color: $font; - background: $pgbg; - font-size: small; - font-weight: bold; } div.LC_createcourse { - margin: 10px 10px 10px 10px; + margin: 10px 10px 10px 10px; } -/* ---- Remove when done ---- -# The following styles is part of the redesign of LON-CAPA and are -# subject to change during this project. -# Don't rely on their current functionality as they might be -# changed or removed. -# --------------------------*/ +.LC_dccid { + margin: 0.2em 0 0 0; + padding: 0; + font-size: 90%; + display:none; +} 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; + color:$button_hover; + text-decoration:none; } h1 { - padding: 0; - line-height:130%; + padding: 0; + line-height:130%; } -h2,h3,h4,h5,h6 { - margin: 5px 0 5px 0; - padding: 0; - line-height:130%; +h2, +h3, +h4, +h5, +h6 { + margin: 5px 0 5px 0; + padding: 0; + line-height:130%; } .LC_hcell { - padding:3px 15px 3px 15px; - margin: 0; - background-color:$tabbg; - color:$fontmenu; - border-bottom:solid 1px $lg_border_color; + padding:3px 15px 3px 15px; + margin: 0; + background-color:$tabbg; + color:$fontmenu; + border-bottom:solid 1px $lg_border_color; } .LC_Box > .LC_hcell { - margin: 0 -10px 10px -10px; + margin: 0 -10px 10px -10px; } .LC_noBorder { - border: 0; -} - -.LC_Right { - float: right; - margin: 0; - padding: 0; + border: 0; } .LC_FormSectionClearButton input { - background-color:transparent; - border: none; - cursor:pointer; - text-decoration:underline; + background-color:transparent; + border: none; + cursor:pointer; + text-decoration:underline; } .LC_help_open_topic { - color: #FFFFFF; - background-color: #EEEEFF; - margin: 1px; - padding: 4px; - border: 1px solid #000033; - white-space: nowrap; -/* vertical-align: middle; */ + color: #FFFFFF; + background-color: #EEEEFF; + margin: 1px; + padding: 4px; + border: 1px solid #000033; + white-space: nowrap; + /* vertical-align: middle; */ } -dl,ul,div,fieldset { - margin: 10px 10px 10px 0; -/* overflow: hidden; */ +dl, +ul, +div, +fieldset { + margin: 10px 10px 10px 0; + /* overflow: hidden; */ } fieldset > legend { - font-weight: bold; - padding: 0 5px 0 5px; + font-weight: bold; + padding: 0 5px 0 5px; } #LC_nav_bar { - float: left; - margin: 0.2em 0 0 0; + float: left; + margin: 0 0 2px 0; } -#LC_nav_bar em{ - font-weight: bold; - font-style: normal; +#LC_realm { + margin: 0.2em 0 0 0; + padding: 0; + font-weight: bold; + text-align: center; } -ol.LC_smallMenu { - float: right; - margin: 0.2em 0 0 0; +#LC_nav_bar em { + font-weight: bold; + font-style: normal; +} + +/* Preliminary fix to hide nav_bar inside bookmarks window */ +#LC_bookmarks #LC_nav_bar { + display:none; +} + +ol.LC_primary_menu { + float: right; + margin: 0; } ol#LC_PathBreadcrumbs { - margin: 0; + margin: 0; } -ol.LC_smallMenu li { - display: inline; - padding: 5px 5px 0 10px; - vertical-align: top; +ol.LC_primary_menu li { + display: inline; + padding: 5px 5px 0 10px; + vertical-align: top; } -ol.LC_smallMenu li img { - vertical-align: bottom; +ol.LC_primary_menu li img { + vertical-align: bottom; + height: 1.1em; } -ol.LC_smallMenu a { - font-size: 90%; - color: RGB(80, 80, 80); - text-decoration: none; +ol.LC_primary_menu a { + color: RGB(80, 80, 80); + text-decoration: none; } -ul#LC_TabMainMenuContent { - clear: both; - color: $fontmenu; - background: $tabbg; - list-style: none; - padding: 0; - margin: 0; - width: 100%; +ol.LC_primary_menu a.LC_new_message { + font-weight:bold; + color: darkred; } -ul#LC_TabMainMenuContent li { - font-weight: bold; - line-height: 1.8em; - padding: 0 0.8em; - border-right: 1px solid black; - display: inline; - vertical-align: middle; +ol.LC_docs_parameters { + margin-left: 0; + padding: 0; + list-style: none; } -ul.LC_TabContent { - display:block; - background: $sidebg; - border-bottom: solid 1px $lg_border_color; - list-style:none; - margin: -10px -10px 0 -10px; - padding: 0; +ol.LC_docs_parameters li { + margin: 0; + padding-right: 20px; + display: inline; } -ul.LC_TabContentBigger { - display:block; - list-style:none; - padding: 0; +ol.LC_docs_parameters li:before { + content: "\\002022 \\0020"; } +li.LC_docs_parameters_title { + font-weight: bold; +} + +ol.LC_docs_parameters li.LC_docs_parameters_title:before { + content: ""; +} + +ul#LC_secondary_menu { + clear: both; + color: $fontmenu; + background: $tabbg; + list-style: none; + padding: 0; + margin: 0; + width: 100%; +} + +ul#LC_secondary_menu li { + font-weight: bold; + line-height: 1.8em; + padding: 0 0.8em; + border-right: 1px solid black; + display: inline; + vertical-align: middle; +} + +ul.LC_TabContent { + display:block; + background: $sidebg; + border-bottom: solid 1px $lg_border_color; + list-style:none; + 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; + float:left; } -ul#LC_TabMainMenuContent li a { - color: $fontmenu; - text-decoration: none; +ul#LC_secondary_menu li a { + color: $fontmenu; + text-decoration: none; } ul.LC_TabContent { - min-height:1.5em; + min-height:20px; } ul.LC_TabContent li { - vertical-align:middle; - padding: 0 10px 0 10px; - background-color:$tabbg; - border-bottom:solid 1px $lg_border_color; + vertical-align:middle; + padding: 0 16px 0 10px; + background-color:$tabbg; + border-bottom:solid 1px $lg_border_color; + border-right: solid 1px $font; } ul.LC_TabContent .right { - float:right; + float:right; } -ul.LC_TabContent li a, ul.LC_TabContent li { - color:rgb(47,47,47); - text-decoration:none; - font-size:95%; - font-weight:bold; - padding-right: 16px; +ul.LC_TabContent li a, +ul.LC_TabContent li { + color:rgb(47,47,47); + text-decoration:none; + font-size:95%; + font-weight:bold; + min-height:20px; } -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 2px #FFFFFF; - padding-right: 16px; +ul.LC_TabContent li a:hover, +ul.LC_TabContent li a:focus { + color: $button_hover; + background:none; + outline:none; } -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: #d9d9d9; +ul.LC_TabContent li:hover { + color: $button_hover; + cursor:pointer; } +ul.LC_TabContent li.active { + color: $font; + background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center; + border-bottom:solid 1px #FFFFFF; + cursor: default; +} + +ul.LC_TabContent li.active a { + color:$font; + background:#FFFFFF; + outline: none; +} #maincoursedoc { - clear:both; + clear:both; +} + +ul.LC_TabContentBigger { + display:block; + list-style:none; + padding: 0; +} + +ul.LC_TabContentBigger li { + vertical-align:bottom; + height: 30px; + font-size:110%; + font-weight:bold; + color: #737373; } -ul.LC_TabContentBigger li:hover, ul.LC_TabContentBigger li.active { - background: #ffffff; - color:$font; + position: relative; + top: 1px; } -ul.LC_TabContentBigger li, ul.LC_TabContentBigger li a { - font-size:110%; - font-weight:bold; - color: #737373; + background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat; + height: 30px; + line-height: 30px; + text-align: center; + display: block; + text-decoration: none; + outline: none; +} + +ul.LC_TabContentBigger li.active a { + background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat; + color:$font; +} + +ul.LC_TabContentBigger li b { + background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom; + display: block; + float: left; + padding: 0 30px; + border-bottom: 1px solid $lg_border_color; +} + +ul.LC_TabContentBigger li:hover b { + color:$button_hover; } +ul.LC_TabContentBigger li.active b { + background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat; + color:$font; + border: 0; + cursor:default; +} + + ul.LC_CourseBreadcrumbs { background: $sidebg; line-height: 32px; @@ -6012,65 +6259,72 @@ ul.LC_CourseBreadcrumbs { } -ol#LC_MenuBreadcrumbs, +ol#LC_MenuBreadcrumbs, ol#LC_PathBreadcrumbs { - padding-left: 10px; - margin: 0; - list-style-position: inside; + padding-left: 10px; + margin: 0; + height: 2.5em; /* equal to #LC_breadcrumbs line-height */ } -ol#LC_MenuBreadcrumbs li, -ol#LC_PathBreadcrumbs li, +ol#LC_MenuBreadcrumbs li, +ol#LC_PathBreadcrumbs li, ul.LC_CourseBreadcrumbs li { - display: inline; - white-space: nowrap; + display: inline; + white-space: normal; } ol#LC_MenuBreadcrumbs li a, ul.LC_CourseBreadcrumbs li a { - text-decoration: none; - font-size:90%; + text-decoration: none; + font-size:90%; +} + +ol#LC_MenuBreadcrumbs h1 { + display: inline; + font-size: 90%; + line-height: 2.5em; + margin: 0; + padding: 0; } ol#LC_PathBreadcrumbs li a { - text-decoration:none; - font-size:100%; - font-weight:bold; + text-decoration:none; + font-size:100%; + font-weight:bold; } .LC_Box { - border: solid 1px $lg_border_color; - padding: 0 10px 10px 10px; + border: solid 1px $lg_border_color; + padding: 0 10px 10px 10px; } .LC_AboutMe_Image { - float:left; - margin-right:10px; + float:left; + margin-right:10px; } .LC_Clear_AboutMe_Image { - clear:left; + clear:left; } dl.LC_ListStyleClean dt { - padding-right: 5px; - display: table-header-group; + padding-right: 5px; + display: table-header-group; } dl.LC_ListStyleClean dd { - display: table-row; + display: table-row; } .LC_ListStyleClean, .LC_ListStyleSimple, .LC_ListStyleNormal, -.LC_ListStyle_Border, .LC_ListStyleSpecial { - /*display:block; */ - list-style-position: inside; - list-style-type: none; - overflow: hidden; - padding: 0; + /* display:block; */ + list-style-position: inside; + list-style-type: none; + overflow: hidden; + padding: 0; } .LC_ListStyleSimple li, @@ -6079,211 +6333,184 @@ dl.LC_ListStyleClean dd { .LC_ListStyleNormal dd, .LC_ListStyleSpecial li, .LC_ListStyleSpecial dd { - margin: 0; - padding: 5px 5px 5px 10px; - clear: both; + margin: 0; + padding: 5px 5px 5px 10px; + clear: both; } .LC_ListStyleClean li, .LC_ListStyleClean dd { - padding-top: 0; - padding-bottom: 0; + padding-top: 0; + padding-bottom: 0; } .LC_ListStyleSimple dd, .LC_ListStyleSimple li { - border-bottom: solid 1px $lg_border_color; + border-bottom: solid 1px $lg_border_color; } .LC_ListStyleSpecial li, .LC_ListStyleSpecial dd { - list-style-type: none; - background-color: RGB(220, 220, 220); - margin-bottom: 4px; + list-style-type: none; + background-color: RGB(220, 220, 220); + margin-bottom: 4px; } table.LC_SimpleTable { - margin:5px; - border:solid 1px $lg_border_color; + margin:5px; + border:solid 1px $lg_border_color; } table.LC_SimpleTable tr { - padding: 0; - border:solid 1px $lg_border_color; + padding: 0; + border:solid 1px $lg_border_color; } table.LC_SimpleTable thead { - background:rgb(220,220,220); + background:rgb(220,220,220); } div.LC_columnSection { - display: block; - clear: both; - overflow: hidden; - margin: 0; + display: block; + clear: both; + overflow: hidden; + margin: 0; } div.LC_columnSection>* { - float: left; - margin: 10px 20px 10px 0; - overflow:hidden; -} - -.LC_loginpage_container { - text-align:left; - margin : 0 auto; - width:90%; - padding: 10px; - height: auto; - background-color:#FFFFFF; - border:1px solid #CCCCCC; -} - - -.LC_loginpage_loginContainer { - float:left; - width: 182px; - padding: 2px; - border:1px solid #CCCCCC; - background-color:$loginbg; -} - -.LC_loginpage_loginContainer h2 { - margin-top: 0; - display:block; - background:$bgcol; - color:$textcol; - padding-left:5px; -} - -.LC_loginpage_loginInfo { - float:left; - width:182px; - border:1px solid #CCCCCC; - padding:2px; -} - -.LC_loginpage_space { - clear: both; - margin-bottom: 20px; - border-bottom: 1px solid #CCCCCC; -} - -.LC_loginpage_floatLeft { - float: left; - width: 200px; - margin: 0; + float: left; + margin: 10px 20px 10px 0; + overflow:hidden; } table em { - font-weight: bold; - font-style: normal; + font-weight: bold; + font-style: normal; } table.LC_tableBrowseRes, table.LC_tableOfContent { - border:none; - border-spacing: 1px; - padding: 3px; - background-color: #FFFFFF; - font-size: 90%; + border:none; + border-spacing: 1px; + padding: 3px; + background-color: #FFFFFF; + font-size: 90%; } -table.LC_tableOfContent{ - border-collapse: collapse; +table.LC_tableOfContent { + border-collapse: collapse; } table.LC_tableBrowseRes a, table.LC_tableOfContent a { - background-color: transparent; - text-decoration: none; -} - -table.LC_tableBrowseRes tr.LC_trOdd, -table.LC_tableOfContent tr.LC_trOdd{ - background-color: #EEEEEE; + background-color: transparent; + text-decoration: none; } table.LC_tableOfContent img { - border: none; - height: 1.3em; - vertical-align: text-bottom; - margin-right: 0.3em; + border: none; + height: 1.3em; + vertical-align: text-bottom; + margin-right: 0.3em; } a#LC_content_toolbar_firsthomework { - background-image:url(/res/adm/pages/open-first-problem.gif); -} - -a#LC_content_toolbar_launchnav { - background-image:url(/res/adm/pages/start-navigation.gif); -} - -a#LC_content_toolbar_closenav { - background-image:url(/res/adm/pages/close-navigation.gif); + background-image:url(/res/adm/pages/open-first-problem.gif); } a#LC_content_toolbar_everything { - background-image:url(/res/adm/pages/show-all.gif); + background-image:url(/res/adm/pages/show-all.gif); } a#LC_content_toolbar_uncompleted { - background-image:url(/res/adm/pages/show-incomplete-problems.gif); + background-image:url(/res/adm/pages/show-incomplete-problems.gif); } #LC_content_toolbar_clearbubbles { - background-image:url(/res/adm/pages/mark-discussionentries-read.gif); + background-image:url(/res/adm/pages/mark-discussionentries-read.gif); } a#LC_content_toolbar_changefolder { - background : url(/res/adm/pages/close-all-folders.gif) top center ; + background : url(/res/adm/pages/close-all-folders.gif) top center ; } a#LC_content_toolbar_changefolder_toggled { - background-image:url(/res/adm/pages/open-all-folders.gif); + background-image:url(/res/adm/pages/open-all-folders.gif); } ul#LC_toolbar li a:hover { - background-position: bottom center; + background-position: bottom center; } ul#LC_toolbar { - padding: 0; - margin: 2px; - list-style:none; - position:relative; - background-color:white; + padding: 0; + margin: 2px; + list-style:none; + position:relative; + background-color:white; } ul#LC_toolbar li { - border:1px solid white; - padding: 0; - margin: 0; - float: left; - display:inline; - vertical-align:middle; -} + border:1px solid white; + padding: 0; + margin: 0; + float: left; + display:inline; + vertical-align:middle; +} a.LC_toolbarItem { - display:block; - padding: 0; - margin: 0; - height: 32px; - width: 32px; - color:white; - border: none; - background-repeat:no-repeat; - background-color:transparent; + display:block; + padding: 0; + margin: 0; + height: 32px; + width: 32px; + color:white; + border: none; + background-repeat:no-repeat; + background-color:transparent; +} + +ul.LC_funclist { + margin: 0; + padding: 0.5em 1em 0.5em 0; +} + +ul.LC_funclist > li:first-child { + font-weight:bold; + margin-left:0.8em; +} + +ul.LC_funclist + ul.LC_funclist { + /* + left border as a seperator if we have more than + one list + */ + border-left: 1px solid $sidebg; + /* + this hides the left border behind the border of the + outer box if element is wrapped to the next 'line' + */ + margin-left: -1px; } ul.LC_funclist li { - float: left; + display: inline; white-space: nowrap; - height: 35px; /* at least as high as heighest list item */ - margin: 0 15px 15px 10px; + margin: 0 0 0 25px; + line-height: 150%; } +.ui-accordion .LC_advanced_toggle { + float: right; + font-size: 90%; + padding: 0px 4px +} + +.LC_hidden { + display: none; +} END } @@ -6336,8 +6563,8 @@ sub headtag { if (!$args->{'frameset'}) { $result .= &Apache::lonhtmlcommon::htmlareaheaders(); } - if ($args->{'force_register'}) { - $result .= &Apache::lonmenu::registerurl(1); + if ($args->{'force_register'} && $env{'request.noversionuri'} !~ m{^/res/adm/pages/}) { + $result .= Apache::lonxml::display_title(); } if (!$args->{'no_nav_bar'} && !$args->{'only_body'} @@ -6363,7 +6590,7 @@ ADDMETA $result .= ' LON-CAPA '.$title.'' .'' .$head_extra; - return $result; + return $result.''; } =pod @@ -6398,10 +6625,6 @@ Inputs: none sub xml_begin { my $output=''; - if ($env{'internal.start_page'}==1) { - &Apache::lonhtmlcommon::init_htmlareafields(); - } - if ($env{'browser.mathml'}) { $output='' #.''."\n" @@ -6420,43 +6643,6 @@ sub xml_begin { =pod -=item * &endheadtag() - -Returns a uniform for LON-CAPA web pages. - -Inputs: none - -=cut - -sub endheadtag { - return ''; -} - -=pod - -=item * &head() - -Returns a uniform complete .. section for LON-CAPA web pages. - -Inputs: - -=over 4 - -$title - optional title for the page - -$head_extra - optional extra HTML to put inside the - -=back - -=cut - -sub head { - my ($title,$head_extra,$args) = @_; - return &headtag($title,$head_extra,$args).&endheadtag(); -} - -=pod - =item * &start_page() Returns a complete .. section for LON-CAPA web pages. @@ -6494,12 +6680,12 @@ $args - additional optional args support skip_phases -> hash ref of head -> skip the generation body -> skip all generation - no_inline_link -> if true and in remote mode, don't show the - 'Switch To Inline Menu' link no_auto_mt_title -> prevent &mt()ing the title arg 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 @@ -6510,6 +6696,14 @@ $args - additional optional args support sub start_page { my ($title,$head_extra,$args) = @_; #&Apache::lonnet::logthis("start_page ".join(':',caller(0))); +#SD +#I don't see why we copy certain elements of %$args to %head_args +#head args is passed to headtag() and this routine only reads those +#keys that are needed. There doesn't happen any writes or any processing +#of other keys. +#proposal: just pass $args to headtag instead of \%head_args and delete +#marked lines +#<- MARK my %head_args; foreach my $arg ('redirect','force_register','domain','function', 'bgcolor','frameset','no_nav_bar','only_body', @@ -6518,13 +6712,16 @@ sub start_page { $head_args{$arg} = $args->{$arg}; } } +#MARK -> $env{'internal.start_page'}++; my $result; + if (! exists($args->{'skip_phases'}{'head'}) ) { - $result.= - &xml_begin(). - &headtag($title,$head_extra,\%head_args).&endheadtag(); + $result .= + &xml_begin() . &headtag($title,$head_extra,\%head_args); +#replace prev line by +# &xml_begin() . &headtag($title, $head_extra, $args); } if (! exists($args->{'skip_phases'}{'body'}) ) { @@ -6538,8 +6735,7 @@ sub start_page { $args->{'function'}, $args->{'add_entries'}, $args->{'only_body'}, $args->{'domain'}, $args->{'force_register'}, $args->{'no_nav_bar'}, - $args->{'bgcolor'}, $args->{'no_inline_link'}, - $args); + $args->{'bgcolor'}, $args); } } @@ -6555,8 +6751,9 @@ sub start_page { # $result .= &build_functionlist(); #} - # Don't add anything more if only_body wanted - return $result if $args->{'only_body'}; + # Don't add anything more if only_body wanted or in const space + return $result if $args->{'only_body'} + || $env{'request.state'} eq 'construct'; #Breadcrumbs if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) { @@ -6578,28 +6775,6 @@ sub start_page { return $result; } - -=pod - -=item * &head() - -Returns a complete section for LON-CAPA web pages. - -Inputs: $args - additional optional args supported are: - js_ready -> return a string ready for being used in - a javascript writeln - html_encode -> return a string ready for being used in - a html attribute - frameset -> if true will start with a - rather than - dicsussion -> if true will get discussion from - lonxml::xmlend - (you can pass the target and parser arguments - through optional 'target' and 'parser' args - to this routine) - -=cut - sub end_page { my ($args) = @_; $env{'internal.end_page'}++; @@ -6689,31 +6864,44 @@ sub simple_error_page { { my @row_count; + + sub start_data_table_count { + unshift(@row_count, 0); + return; + } + + sub end_data_table_count { + shift(@row_count); + return; + } + sub start_data_table { my ($add_class) = @_; my $css_class = (join(' ','LC_data_table',$add_class)); - unshift(@row_count,0); + &start_data_table_count(); return ''."\n"; } sub end_data_table { - shift(@row_count); + &end_data_table_count(); return '
'."\n";; } sub start_data_table_row { - my ($add_class) = @_; + my ($add_class, $id) = @_; $row_count[0]++; my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row'; - $css_class = (join(' ',$css_class,$add_class)); - return ''."\n";; + $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); + $id = (' id="'.$id.'"') unless ($id eq ''); + return ''."\n"; } sub continue_data_table_row { - my ($add_class) = @_; + my ($add_class, $id) = @_; my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row'; - $css_class = (join(' ',$css_class,$add_class)); - return ''."\n";; + $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); + $id = (' id="'.$id.'"') unless ($id eq ''); + return ''."\n"; } sub end_data_table_row { @@ -6736,6 +6924,11 @@ sub simple_error_page { sub end_data_table_header_row { return ''."\n";; } + + sub data_table_caption { + my $caption = shift; + return "$caption"; + } } =pod @@ -6806,7 +6999,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)/) { @@ -6877,7 +7070,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; @@ -7508,6 +7701,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 .= ' @@ -7672,24 +7866,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; } @@ -7913,6 +8103,10 @@ sub get_institutional_codes { return; } +sub get_standard_codeitems { + return ('Year','Semester','Department','Number','Section'); +} + =pod =head1 Slot Helpers @@ -8606,7 +8800,7 @@ sub csv_print_select_table { my ($value,$display,$defaultcol)=@{ $array_ref }; $r->print(&start_data_table_row().''.$display.''); - $r->print(''); $r->print(''); foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { @@ -9260,10 +9454,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), @@ -9433,6 +9628,8 @@ sub extract_categories { my $trailstr; if ($name eq 'instcode') { $trailstr = &mt('Official courses (with institutional codes)'); + } elsif ($name eq 'communities') { + $trailstr = &mt('Communities'); } else { $trailstr = $name; } @@ -9545,12 +9742,14 @@ cathash - reference to hash of categorie currcat - scalar with an & separated list of categories assigned to a course. +type - scalar contains course type (Course or Community). + Returns: $output (markup to be displayed) =cut sub assign_categories_table { - my ($cathash,$currcat) = @_; + my ($cathash,$currcat,$type) = @_; my $output; if (ref($cathash) eq 'HASH') { my (@cats,@trails,%allitems,%idx,@jsarray,@path,$maxdepth); @@ -9559,15 +9758,20 @@ sub assign_categories_table { if (@cats > 0) { my $itemcount = 0; if (ref($cats[0]) eq 'ARRAY') { - $output = &Apache::loncommon::start_data_table(); my @currcategories; if ($currcat ne '') { @currcategories = split('&',$currcat); } + my $table; for (my $i=0; $i<@{$cats[0]}; $i++) { my $parent = $cats[0][$i]; - my $css_class = $itemcount%2?' class="LC_odd_row"':''; next if ($parent eq 'instcode'); + if ($type eq 'Community') { + next unless ($parent eq 'communities'); + } else { + next if ($parent eq 'communities'); + } + my $css_class = $itemcount%2?' class="LC_odd_row"':''; my $item = &escape($parent).'::0'; my $checked = ''; if (@currcategories > 0) { @@ -9575,18 +9779,26 @@ sub assign_categories_table { $checked = ' checked="checked"'; } } - $output .= ''. - ''.$parent.''. - ''; + my $parent_title = $parent; + if ($parent eq 'communities') { + $parent_title = &mt('Communities'); + } + $table .= ''. + ''.$parent_title.''. + ''; my $depth = 1; push(@path,$parent); - $output .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories); + $table .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories); pop(@path); - $output .= ''; + $table .= ''; $itemcount ++; } - $output .= &Apache::loncommon::end_data_table(); + if ($itemcount) { + $output = &Apache::loncommon::start_data_table(). + $table. + &Apache::loncommon::end_data_table(); + } } } } @@ -9831,12 +10043,26 @@ sub check_clone { my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom); my $clonemsg; my $can_clone = 0; - + my $lctype = lc($args->{'crstype'}); + 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->{'crstype'} 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->{'crstype'} 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'], @@ -9847,15 +10073,25 @@ sub check_clone { } elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) { $can_clone = 1; } else { + my $ccrole = 'cc'; + if ($args->{'crstype'} 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))) { - $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 (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { + $can_clone = 1; + } elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},$args->{'ccuname'},$args->{'ccdomain'})) { + $can_clone = 1; + } else { + if ($args->{'crstype'} 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'}); + } } } } @@ -9864,7 +10100,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') { @@ -9902,18 +10138,27 @@ 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 # if anyone ever decides to not show this, and Utils::Course::new # will need to be suitably modified. $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed; + if ($$courseid =~ /^error:/) { + return (0,$outcome); + } + # # Check if created correctly # ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid); my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom); + if ($crsuhome eq 'no_host') { + $outcome .= &mt('Course creation failed, unrecognized course home server.').$linefeed; + return (0,$outcome); + } $outcome .= &mt('Created on').': '.$crsuhome.$linefeed; # @@ -9932,6 +10177,10 @@ sub construct_course { $cenv{'url'}=$oldcenv{'url'}; # Restore title $cenv{'description'}=$oldcenv{'description'}; +# Restore creation date, creator and creation context. + $cenv{'internal.created'}=$oldcenv{'internal.created'}; + $cenv{'internal.creator'}=$oldcenv{'internal.creator'}; + $cenv{'internal.creationcontext'}=$oldcenv{'internal.creationcontext'}; # Mark as cloned $cenv{'clonedfrom'}=$cloneid; # Need to clone grading mode @@ -10178,7 +10427,7 @@ sub construct_course { $title=&mt('Syllabus'); $url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus'; } else { - $title=&mt('Navigate Contents'); + $title=&mt('Table of Contents'); $url='/adm/navmaps'; } @@ -10195,6 +10444,8 @@ sub construct_course { ############################################################ ############################################################ +#SD +# only Community and Course, or anything else? sub course_type { my ($cid) = @_; if (!defined($cid)) { @@ -10211,11 +10462,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]); @@ -10350,15 +10611,12 @@ sub init_user_environment { my %userenv = &Apache::lonnet::dump('environment',$domain,$username); my ($tmp) = keys(%userenv); if ($tmp !~ /^(con_lost|error|no_such_host)/i) { - # default remote control to off - if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; } } else { undef(%userenv); } if (($userenv{'interface'}) && (!$form->{'interface'})) { $form->{'interface'}=$userenv{'interface'}; } - $env{'environment.remote'}=$userenv{'remote'}; if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; } # --------------- Do not trust query string to be put directly into environment @@ -10390,9 +10648,6 @@ sub init_user_environment { $initial_env{"browser.localres"} = $form->{'localres'}; } - if ($public) { - $initial_env{"environment.remote"} = "off"; - } if ($form->{'interface'}) { $form->{'interface'}=~s/\W//gs; $initial_env{"browser.interface"} = $form->{'interface'}; @@ -10404,7 +10659,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');