--- loncom/interface/loncommon.pm 2009/05/15 18:06:13 1.817 +++ loncom/interface/loncommon.pm 2009/05/30 22:03:32 1.835 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.817 2009/05/15 18:06:13 bisitz Exp $ +# $Id: loncommon.pm,v 1.835 2009/05/30 22:03:32 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -407,6 +407,7 @@ sub studentbrowser_javascript { ) { return ''; } return (<<'ENDSTDBRW'); ENDSTDBRW } @@ -461,6 +463,7 @@ sub selectstudent_link { sub authorbrowser_javascript { return <<"ENDAUTHORBRW"; ENDAUTHORBRW } @@ -482,6 +486,7 @@ sub coursebrowser_javascript { 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 = ' '; return $output; } @@ -829,6 +835,7 @@ sub linked_select_forms { # output the javascript to do the changing my $result = ''; $result.=' END # output the initial values for the selection lists @@ -1027,7 +1035,9 @@ sub update_help_link { my $banner_link = "/adm/helpmenu?page=banner&topic=$topic&component_help=$component_help&faq=$faq&bug=$bug&origurl=$origurl&stamp=$timestamp&stayonpage=$stayOnPage"; my $output .= <<"ENDOUTPUT"; ENDOUTPUT return $output; @@ -1394,6 +1404,7 @@ sub resize_textarea_js { my $geometry = &viewport_geometry_js(); return <<"RESIZE"; RESIZE @@ -2299,7 +2311,7 @@ sub authform_internal{ $result = &mt ('[_1] Internally authenticated (with initial password [_2])', ''.$autharg); - $result.="'; + $result.="'; return $result; } @@ -4168,6 +4180,96 @@ sub designparm { return $output; } +############################################## +=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.) + +Returns: HTML div with $content + To be included in page header + +=cut + +sub head_subbox { + my ($content)=@_; + my $output = + '
' #FIXME: solve conflicts with lonhtmlcommon:breadcrumbs LC_head_subbox + .$content + .'
' +} + +############################################## +=pod + +=item * &CSTR_pageheader() + +Inputs: ./. + +Returns: HTML div with CSTR path and recent box + To be included on Construction Space pages + +=cut + +sub CSTR_pageheader { + # this is for resources; directories have customtitle, and crumbs + # and select recent are created in lonpubdir.pm + my ($uname,$thisdisfn)= + ($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|); + my $formaction='/priv/'.$uname.'/'.$thisdisfn; + $formaction=~s/\/+/\//g; + + my $parentpath = ''; + my $lastitem = ''; + if ($thisdisfn =~ m-(.+/)([^/]*)$-) { + $parentpath = $1; + $lastitem = $2; + } else { + $lastitem = $thisdisfn; + } + return + '
' + .&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
" + #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() + .'
'; +} + ############################################### ############################################### @@ -4200,10 +4302,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 @@ -4228,7 +4326,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); } @@ -4299,9 +4397,6 @@ $realm  ENDROLE my $titleinfo = '

'.$title.'

'; - if ($customtitle) { - $titleinfo = $customtitle; - } # # Extra info if you are the DC my $dc_info = ''; @@ -4320,32 +4415,9 @@ ENDROLE $forcereg=1; } - if (!$customtitle && $env{'request.state'} eq 'construct') { - # this is for resources; directories have customtitle, and crumbs - # and select recent are created in lonpubdir.pm - my ($uname,$thisdisfn)= - ($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|); - my $formaction='/priv/'.$uname.'/'.$thisdisfn; - $formaction=~s/\/+/\//g; - - my $parentpath = ''; - my $lastitem = ''; - if ($thisdisfn =~ m-(.+/)([^/]*)$-) { - $parentpath = $1; - $lastitem = $2; - } else { - $lastitem = $thisdisfn; - } - $titleinfo = - &Apache::loncommon::help_open_menu('','',3,'Authoring') - .''.&mt('Construction Space').': ' - .'
' - .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."$lastitem
" - .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()') - .'
' - .&Apache::lonmenu::constspaceform(); - } + if ($env{'request.state'} eq 'construct') { + $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls + } my $titletable = '' ."".$roleinfo @@ -4629,7 +4701,6 @@ div.LC_confirm_box .LC_success img { .LC_disc_action_links_bar { background: $tabbg; - font-family: $sans; border: none; margin: 4px; } @@ -4674,6 +4745,7 @@ table#LC_title_bar a { } table#LC_title_bar { + clear: both; /*display: none;*/ } @@ -4686,16 +4758,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; } @@ -4707,27 +4778,23 @@ table#LC_title_bar td { table#LC_title_bar .LC_title_bar_who { background: $tabbg; color: $fontmenu; - font: small $sans; + font: small; text-align: right; margin: 0; } -table#LC_title_bar .LC_title_bar_name { +table#LC_title_bar div.LC_title_bar_name { margin: 0; } -table#LC_title_bar .LC_title_bar_role { +table#LC_title_bar div.LC_title_bar_role { margin: 0; } -table#LC_title_bar .LC_title_bar_realm { +table#LC_title_bar div.LC_title_bar_realm { margin: 0; } -span.LC_metadata { - font-family: $sans; -} - table#LC_menubuttons img{ border: none; } @@ -4743,7 +4810,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 { @@ -4772,7 +4838,6 @@ table.LC_breadcrumbs td, table.LC_docs_path td { background: $tabbg; color: $fontmenu; - font-family: $sans; font-size: smaller; } @@ -4780,7 +4845,6 @@ table.LC_breadcrumbs td.LC_breadcrumbs_c table.LC_docs_path td.LC_docs_path_component { background: $tabbg; color: $fontmenu; - font-family: $sans; font-size: larger; text-align: right; } @@ -4797,6 +4861,24 @@ table#LC_mainmenu td.LC_mainmenu_column font-size: 70%; } +#LC_head_subbox { + clear:both; + background: $sidebg; + border-bottom: 1px solid $lg_border_color; + height: 32px; + line-height: 32px; + margin: 0; + padding: 0; +} + +#LC_head_subbox2 { /* FIXME: replace by LC_head_subbox once lonhtmlcommon::breadcrumbs has been fixed */ + clear:both; + background: #F8F8F8; /* $sidebg; */ + border-bottom: 1px solid $lg_border_color; + margin: 0 0 10px 0; + padding: 5px; +} + .LC_fontsize_medium { font-size: 85%; } @@ -4807,7 +4889,6 @@ table#LC_mainmenu td.LC_mainmenu_column .LC_menubuttons_inline_text { color: $font; - font-family: $sans; font-size: 90%; padding-left:3px; } @@ -4819,7 +4900,6 @@ table#LC_mainmenu td.LC_mainmenu_column .LC_menubuttons_category { color: $font; background: $pgbg; - font-family: $sans; font-size: larger; font-weight: bold; } @@ -4829,21 +4909,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; } @@ -5099,7 +5172,6 @@ span.LC_current_location { span.LC_parm_menu_item { font-size: larger; - font-family: $sans; } span.LC_parm_scope_all { @@ -5342,7 +5414,6 @@ table.LC_notify_front_page td { } .LC_topic_bar { - font-family: $sans; font-weight: bold; width: 100%; background: $tabbg; @@ -5371,17 +5442,30 @@ 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; +} + +div.LC_feedback_link a{ + text-decoration: none; } 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; @@ -5399,14 +5483,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; } @@ -5415,28 +5497,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; } @@ -5674,12 +5752,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; @@ -5735,7 +5807,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; } @@ -5781,6 +5852,10 @@ h2,h3,h4,h5,h6 { border-bottom:solid 1px $lg_border_color; } +.LC_ContentBoxSpecial > .LC_hcell { + margin: 0 -10px 10px -10px; +} + .LC_noBorder { border: 0; } @@ -5940,30 +6015,22 @@ ul.LC_TabContentBigger li a { ol#LC_MenuBreadcrumbs, ol#LC_PathBreadcrumbs, -ul.LC_CourseBreadcrumbs { - border-top: solid 1px RGB(255, 255, 255); - height: 20px; - line-height: 20px; - vertical-align: bottom; - margin: 0 0 30px 0; +ul#LC_CourseBreadcrumbs { padding-left: 10px; + margin: 0; list-style-position: inside; - background: url(/adm/lonIcons/lightGreyBG.png) repeat-x left top; } ol#LC_MenuBreadcrumbs li, ol#LC_PathBreadcrumbs li, -ul.LC_CourseBreadcrumbs li { -/* - background: url(/adm/lonIcons/arrow_white.png) no-repeat left center; -*/ +ul#LC_CourseBreadcrumbs li { display: inline; padding: 0 0 0 10px; -/* vertical-align: bottom; */ overflow:hidden; } -ol#LC_MenuBreadcrumbs li a, ul.LC_CourseBreadcrumbs li a { +ol#LC_MenuBreadcrumbs li a, +ul#LC_CourseBreadcrumbs li a { text-decoration: none; font-size:90%; } @@ -5974,18 +6041,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%; + border: solid 1px $lg_border_color; + padding: 0 10px 10px 10px; } .LC_AboutMe_Image { @@ -6074,19 +6132,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; @@ -6453,9 +6498,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 @@ -6499,16 +6541,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'}) { @@ -6771,13 +6812,16 @@ Returns either 'student','coordinator',' ############################################### sub get_users_function { my $function = 'norole'; + if ($env{'request.role'}=~/^(st)/) { + $function='student'; + } if ($env{'request.role'}=~/^(cc|in|ta|ep)/) { $function='coordinator'; } if ($env{'request.role'}=~/^(su|dc|ad|li)/) { $function='admin'; } - if (($env{'request.role'}=~/^(au|ca)/) || + if (($env{'request.role'}=~/^(au|ca|aa)/) || ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { $function='author'; } @@ -6788,6 +6832,38 @@ sub get_users_function { =pod +=item * &show_course() + +Used by lonmenu.pm and lonroles.pm to determine whether to use the word +'Courses' or 'Roles' in inline navigation and on screen displaying user's roles. + +Inputs: +None + +Outputs: +Scalar: 1 if 'Course' to be used, 0 otherwise. + +=cut + +############################################### +sub show_course { + my $course = !$env{'user.adv'}; + if (!$env{'user.adv'}) { + foreach my $env (keys(%env)) { + next if ($env !~ m/^user\.priv\./); + if ($env !~ m/^user\.priv\.(?:st|cm)/) { + $course = 0; + last; + } + } + } + return $course; +} + +############################################### + +=pod + =item * &check_user_status() Determines current status of supplied role for a @@ -7531,6 +7607,7 @@ ENDSCRIPT my $output = <<"END_BLOCK"; $new_user_create @@ -10206,6 +10284,22 @@ sub escape_url { return join('/',@urlslices).'/'.$lastitem; } +sub compare_arrays { + my ($arrayref1,$arrayref2) = @_; + my (@difference,%count); + @difference = (); + %count = (); + if ((ref($arrayref1) eq 'ARRAY') && (ref($arrayref2) eq 'ARRAY')) { + foreach my $element (@{$arrayref1}, @{$arrayref2}) { $count{$element}++; } + foreach my $element (keys(%count)) { + if ($count{$element} == 1) { + push(@difference,$element); + } + } + } + return @difference; +} + # -------------------------------------------------------- Initialize user login sub init_user_environment { my ($r, $username, $domain, $authhost, $form, $args) = @_;
$titleinfo $dc_info