--- loncom/interface/loncommon.pm 2009/06/17 15:27:14 1.845 +++ loncom/interface/loncommon.pm 2009/07/31 03:14:20 1.873 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.845 2009/06/17 15:27:14 bisitz Exp $ +# $Id: loncommon.pm,v 1.873 2009/07/31 03:14:20 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -483,7 +483,7 @@ 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 $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Community - for which you wish to add/modify a user role'); my $output = ' <script type="text/javascript" language="JavaScript"> // <![CDATA[ @@ -529,10 +529,15 @@ sub coursebrowser_javascript { } } } + if (formname == 'ccrs') { + var ownername = document.forms[formid].ccuname.value; + var ownerdom = document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value; + url += '&cloner='+ownername+':'+ownerdom; + } if (multflag !=null && multflag != '') { url += '&multiple='+multflag; } - if (crstype == 'Course/Group') { + if (crstype == 'Course/Community') { if (formname == 'cu') { crstype = document.cu.crstype.options[document.cu.crstype.selectedIndex].value; if (crstype == "") { @@ -620,12 +625,16 @@ function setSect(sectionlist) { sub selectcourse_link { my ($form,$unameele,$udomele,$desc,$extra_element,$multflag,$selecttype)=@_; + my $linktext = &mt('Select Course'); + if ($selecttype eq 'Community') { + $linktext = &mt('Select Community'); + } return '<span class="LC_nobreak">' ."<a href='" .'javascript:opencrsbrowser("'.$form.'","'.$unameele .'","'.$udomele.'","'.$desc.'","'.$extra_element .'","'.$multflag.'","'.$selecttype.'");' - ."'>".&mt('Select Course').'</a>' + ."'>".$linktext.'</a>' .'</span>'; } @@ -1787,7 +1796,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 <select name='$name' size='1'> form to allow a user to select the domain to preform an operation in. @@ -1798,16 +1807,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.'"'; } my @domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains()); if ($includeempty) { @domains=('',@domains); } @@ -3766,7 +3774,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 +3839,48 @@ 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 = '<br />'.$lt{'cacb'}.':<br />'; - $output .= &start_data_table(); - $output .= ' -<tr> - <th>'.$lt{'cour'}.'</th> - <th>'.$lt{'dura'}.'</th> - <th>'.$lt{'blse'}.'</th> -</tr> -'; - 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(). - '<td>'.$courseinfo{'description'}.'</td>'. - '<td>'.$openblock.' to '.$closeblock.'</td>'. - '<td>'.$fullname.'</td>'. - &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 = '<br />'.&mt('[_1] will be inaccessible between [_2] and [_3] because communication is being blocked.',$category,$showstart,$showend).'<br />'; - if (!($activity eq 'port' && !($ownitem) && !($is_course))) { - $output .= &build_block_table($startblock,$endblock,\%setters); - } - } - } - if (wantarray) { - return ($blocked,$output); - } else { - return $blocked; + my $blocked; + my ($activity,$uname,$udom) = @_; + my %setters; + my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom); + if ($startblock && $endblock) { + $blocked = 1; + } + if(!wantarray) { + return $blocked; + } + my $output; + my $querystring; + $querystring = "?activity=$activity"; + + $output .= <<"END_MYBLOCK"; +<script type="text/javascript"> +// <![CDATA[ + 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(); } + +// ]]> +</script> +END_MYBLOCK + my $popupUrl = "/adm/blockingstatus/$querystring"; + $output .= <<"END_BLOCK"; +<div class='LC_comblock'> + <a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring' + title='Communication Blocked'> + <img class='LC_noBorder LC_middle' title='Communication Blocked' src='/res/adm/pages/comblock.png' alt='Communication Blocked'/></a> + <a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring' + title='Communication Blocked'>Communication Blocked</a> +</div> + +END_BLOCK + + return ($blocked, $output); } ############################################### @@ -4394,6 +4347,9 @@ sub bodytag { $dc_info = '('.$dc_info.')'; } + $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') { @@ -4411,14 +4367,13 @@ sub bodytag { if ($no_nav_bar) { $bodytag .= $titletable; } else { - $bodytag .= qq|<div id="LC_nav_bar">$name ($role)<br /> - <em>$realm</em> $dc_info</div>|; + $bodytag .= qq|<div id="LC_nav_bar">$name $role<br /> + <em>$realm</em> $dc_info</div>| unless $env{'form.inhibitmenu'}; + if ($env{'request.state'} eq 'construct') { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg, - $titletable); + $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$titletable); } else { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg). - $titletable; + $bodytag .= &Apache::lonmenu::menubuttons($forcereg).$titletable; } } return $bodytag; @@ -4436,7 +4391,12 @@ sub bodytag { # Explicit link to get inline menu my $menu= ($no_inline_link?'' - :'<br /><a href="/adm/remote?action=collapse">'.&mt('Switch to Inline Menu Mode').'</a>'); + :'<a href="/adm/remote?action=collapse">'.&mt('Switch to Inline Menu Mode').'</a>'); + $bodytag .= qq|<div id="LC_nav_bar">$name $role + <em>$realm</em> $dc_info </div> + <ol class="LC_smallMenu LC_right"> + <li>$menu</li> + </ol>| unless $env{'form.inhibitmenu'}; # return(<<ENDBODY); $bodytag @@ -4566,9 +4526,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'; @@ -4605,6 +4565,14 @@ a:focus { background: yellow } +hr { + clear: both; + color: $tabbg; + background-color: $tabbg; + height: 3px; + border: none; +} + form, .inline { display: inline; } @@ -4818,6 +4786,7 @@ table#LC_mainmenu td.LC_mainmenu_column margin: 0; padding: 0; } + /* Preliminary fix to hide breadcrumbs inside remote control window */ #LC_remote #LC_breadcrumbs { display:none; @@ -5226,7 +5195,7 @@ table.LC_pick_box { } table.LC_pick_box td.LC_pick_box_title { - background: $tabbg; + background: $sidebg; font-weight: bold; text-align: right; vertical-align: top; @@ -5234,14 +5203,6 @@ table.LC_pick_box td.LC_pick_box_title { 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; @@ -5400,19 +5361,34 @@ div.LC_feedback_link { 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; @@ -5496,8 +5472,7 @@ table.LC_prior_match tr td { border: 1px solid #000000; } -td.LC_nobreak, -span.LC_nobreak { +.LC_nobreak { white-space: nowrap; } @@ -5521,21 +5496,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; } @@ -5557,17 +5535,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; @@ -5728,14 +5695,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; @@ -5800,7 +5759,7 @@ h2,h3,h4,h5,h6 { } .LC_Box > .LC_hcell { - margin: 0 -10px; + margin: 0 -10px 10px -10px; } .LC_noBorder { @@ -5842,7 +5801,7 @@ fieldset > legend { #LC_nav_bar { float: left; - margin: 0; + margin: 0.2em 0 0 0; } #LC_nav_bar em{ @@ -5852,9 +5811,10 @@ fieldset > legend { ol.LC_smallMenu { float: right; + margin: 0.2em 0 0 0; } -ol.LC_smallMenu, ol#LC_PathBreadcrumbs { +ol#LC_PathBreadcrumbs { margin: 0; } @@ -5881,12 +5841,10 @@ ul#LC_TabMainMenuContent { list-style: none; padding: 0; margin: 0; - float:left; width: 100%; } ul#LC_TabMainMenuContent li { - float: left; font-weight: bold; line-height: 1.8em; padding: 0 0.8em; @@ -5895,21 +5853,18 @@ 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 { @@ -5918,7 +5873,7 @@ ul#LC_TabMainMenuContent li a { } ul.LC_TabContent { - min-height:1.6em; + min-height:1.5em; } ul.LC_TabContent li { @@ -5928,6 +5883,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; @@ -5942,33 +5901,68 @@ ul.LC_TabContent li:hover, ul.LC_TabCont 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: #d9d9d9; -} - #maincoursedoc { clear:both; } -ul.LC_TabContentBigger li:hover, -ul.LC_TabContentBigger li.active { - background:url(/adm/lonIcons/lightGreyBG.png) repeat-x right bottom; +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, + 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; @@ -5976,13 +5970,13 @@ ul#LC_CourseBreadcrumbs { ol#LC_MenuBreadcrumbs li, ol#LC_PathBreadcrumbs li, -ul#LC_CourseBreadcrumbs li { +ul.LC_CourseBreadcrumbs li { display: inline; white-space: nowrap; } ol#LC_MenuBreadcrumbs li a, -ul#LC_CourseBreadcrumbs li a { +ul.LC_CourseBreadcrumbs li a { text-decoration: none; font-size:90%; } @@ -6084,13 +6078,6 @@ div.LC_columnSection>* { overflow:hidden; } -.clear { - clear: both; - line-height: 0; - font-size: 0; - height: 0; -} - .LC_loginpage_container { text-align:left; margin : 0 auto; @@ -6145,7 +6132,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%; @@ -6374,7 +6361,8 @@ sub xml_begin { .'<html xmlns:math="http://www.w3.org/1998/Math/MathML" ' .'xmlns="http://www.w3.org/1999/xhtml">'; } else { - $output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>'; + $output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' + .'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">'; } return $output; } @@ -6461,6 +6449,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 @@ -10172,7 +10162,7 @@ sub group_term { my $crstype = &course_type(); my %names = ( 'Course' => 'group', - 'Group' => 'team', + 'Community' => 'group', ); return $names{$crstype}; } @@ -10365,7 +10355,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');