--- loncom/interface/loncommon.pm 2009/11/18 11:18:23 1.915 +++ loncom/interface/loncommon.pm 2010/02/25 15:41:14 1.944 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.915 2009/11/18 11:18:23 droeschl Exp $ +# $Id: loncommon.pm,v 1.944 2010/02/25 15:41:14 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -483,9 +483,9 @@ ENDAUTHORBRW sub coursebrowser_javascript { my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_; - my $wintitle = &mt('Course Browser'); - if ($crstype ne '') { - $wintitle = &mt($crstype); + my $wintitle = 'Course_Browser'; + if ($crstype eq 'Community') { + $wintitle = 'Community_Browser'; } my $id_functions = &javascript_index_functions(); my $output = ' @@ -1127,7 +1127,7 @@ sub help_open_topic { $template.=' ' .''.&mt('Help: [_1]',$topic).''; if ($text ne "") { $template.=''; @@ -1719,10 +1719,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); } # @@ -1762,9 +1765,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) } @@ -1877,7 +1884,7 @@ sub select_form { $selectform.= '\n"; + ">".$hash{$key}."\n"; } $selectform.=""; return $selectform; @@ -4367,18 +4374,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; } ############################################### @@ -4503,9 +4522,8 @@ 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; @@ -4513,7 +4531,9 @@ sub bodytag { if ($env{'environment.remote'} eq 'off') { # No Remote - if ($no_nav_bar) { return $bodytag; } + if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { + return $bodytag; + } if ($env{'request.state'} eq 'construct') { $forcereg=1; } @@ -4521,27 +4541,42 @@ sub bodytag { # $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls # } - $bodytag .= qq|
$name $role
- $realm $dc_info
| unless $env{'form.inhibitmenu'}; - if ( $env{'form.inhibitmenu'} eq 'yes' - || $ENV{'REQUEST_URI'} eq '/adm/logout' - || $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { + 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($env{'user.name'} ne 'public' && $env{'user.domain'} ne 'public'){ $bodytag .= Apache::lonmenu::secondary_menu(); $bodytag .= Apache::lonmenu::serverform(); - $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); - $bodytag .= Apache::lonmenu::innerregister($forcereg) if $forcereg; + $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. @@ -4549,8 +4584,6 @@ sub bodytag { $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); } - #SD testing - #$bodytag .= Apache::lonmenu::menubuttons($forcereg); return $bodytag; } @@ -4567,12 +4600,15 @@ sub bodytag { # Explicit link to get inline menu my $menu= ($no_inline_link?'' :''.&mt('Switch to Inline Menu Mode').''); - $bodytag .= qq|
$name $role - $realm $dc_info
+ + if ($dc_info) { + $dc_info = qq|($dc_info)|; + } + + $bodytag .= qq|
$name $role
  1. $menu
  2. -
| unless $env{'form.inhibitmenu'}; - # +
$realm $dc_info
| unless $env{'form.inhibitmenu'}; return(< @@ -4585,6 +4621,14 @@ $bodytag ENDBODY } +sub dc_courseid_toggle { + my ($dc_info) = @_; + return ' '. + ''. + &mt('(More ...)').''. + '
'.$dc_info.'
'; +} + sub make_attr_string { my ($register,$attr_ref) = @_; @@ -4731,11 +4775,6 @@ body { color:$font; } -a:link, -a:visited { - font-size:100%; -} - a:focus { color: red; background: yellow; @@ -4753,15 +4792,14 @@ form, .inline { vertical-align:middle; } -/* just for tests */ .LC_400Box { width:400px; } -/* end */ .LC_filename { font-family: $mono; white-space:pre; + font-size: 120%; } .LC_fileicon { @@ -4852,9 +4890,7 @@ table.LC_pastsubmission { margin: 2px; } -table#LC_top_nav, -table#LC_menubuttons, -table#LC_nav_location { +table#LC_menubuttons { width: 100%; background: $pgbg; border: 2px; @@ -4872,7 +4908,7 @@ table#LC_title_bar { } table#LC_title_bar, -table.LC_breadcrumbs, +table.LC_breadcrumbs, /* obsolete? */ table#LC_title_bar.LC_with_remote { width: 100%; border-color: $pgbg; @@ -4885,46 +4921,26 @@ table#LC_title_bar.LC_with_remote { margin: 0; } -/* #SD START (work in progress)*/ - -ul.LC_bct { +ul.LC_breadcrumb_tools_outerlist { margin: 0; padding: 0; + position: relative; + list-style: none; } -ul.LC_bct ol { - display: inline; -} -ul.LC_bct ul { - display: inline; - padding: 0; -} -ul.LC_bct li { - list-style-type: none; +ul.LC_breadcrumb_tools_outerlist li { display: inline; } - -ul.LC_breadcrumb_tools { -} - -li.LC_breadcrumb_tools { -} -li.LC_breadcrumb_tools img{ - vertical-align: middle; -} - -.LC_breadcrumb_tools_A { - margin: 0 0 0 1em; -} -.LC_breadcrumb_tools_B { - float: right; - margin-top: 0.4em; +.LC_breadcrumb_tools_navigation { + padding: 0; + margin: 0; + float: left; } -.LC_breadcrumb_tools_C { - margin: 0 1em 0 0; +.LC_breadcrumb_tools_tools { + padding: 0; + margin: 0; float: right; } -/* #SD END */ table#LC_title_bar td { background: $tabbg; @@ -4934,41 +4950,6 @@ table#LC_menubuttons img { border: none; } -table#LC_top_nav td { - background: $tabbg; - border: none; - font-size: small; - vertical-align:top; - padding:2px 5px 2px 5px; -} - -table#LC_top_nav td a, -div#LC_top_nav a { - color: $font; -} - -table#LC_top_nav td.LC_top_nav_logo { - background: $tabbg; - text-align: left; - white-space: nowrap; - width: 31px; -} - -table#LC_top_nav td.LC_top_nav_logo img { - border: none; - vertical-align: bottom; -} - -table#LC_top_nav td.LC_top_nav_exit, -table#LC_top_nav td.LC_top_nav_help { - width: 2.0em; -} - -table#LC_top_nav td.LC_top_nav_login { - width: 4.0em; - text-align: center; -} - .LC_breadcrumbs_component { float: right; margin: 0 1em; @@ -4981,10 +4962,6 @@ td.LC_table_cell_checkbox { text-align: center; } -table#LC_mainmenu td.LC_mainmenu_column { - vertical-align: top; -} - .LC_fontsize_small { font-size: 70%; } @@ -4994,9 +4971,7 @@ table#LC_mainmenu td.LC_mainmenu_column background: $sidebg; border-bottom: 1px solid $lg_border_color; line-height: 2.5em; - /* SD working here - height: 2.5em; - overflow: hidden; */ + overflow: hidden; margin: 0; padding: 0; } @@ -5027,6 +5002,10 @@ table#LC_mainmenu td.LC_mainmenu_column padding-left:3px; } +.LC_menubuttons_inline_text img{ + vertical-align: middle; +} + .LC_menubuttons_link { text-decoration: none; } @@ -5046,13 +5025,7 @@ td.LC_menubuttons_text { background: $tabbg; } -.LC_new_mail { - background: $tabbg; - font-weight: bold; -} - -table.LC_data_table, -table.LC_mail_list { +table.LC_data_table { border: 1px solid #000000; border-collapse: separate; border-spacing: 1px; @@ -5078,9 +5051,16 @@ table.LC_nested { width: 100%; } +.ui-accordion, +.ui-accordion table.LC_data_table, +.ui-accordion table.LC_nested_outer{ + border: 0px; + border-spacing: 0px; + margin: 3px; +} + table.LC_data_table tr th, table.LC_calendar tr th, -table.LC_mail_list tr th, table.LC_prior_tries tr th, table.LC_innerpickbox tr th { font-weight: bold; @@ -5133,13 +5113,20 @@ 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 { } @@ -5187,6 +5174,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; } @@ -5207,6 +5210,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 { @@ -5216,6 +5220,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 { @@ -5226,43 +5231,43 @@ 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 { @@ -5292,23 +5297,23 @@ table.LC_data_table tr > td.LC_roles_is } 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 { @@ -5519,19 +5524,17 @@ table.LC_notify_front_page td { .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 { @@ -5643,12 +5646,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; } @@ -5681,17 +5684,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; @@ -5783,56 +5775,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%; } @@ -5866,15 +5843,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 { @@ -5892,33 +5862,20 @@ img.stift { 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; } -/* ---- 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_primary_menu a:hover, @@ -5962,12 +5919,6 @@ h6 { border: 0; } -.LC_Right { - float: right; - margin: 0; - padding: 0; -} - .LC_FormSectionClearButton input { background-color:transparent; border: none; @@ -6000,7 +5951,14 @@ fieldset > legend { #LC_nav_bar { float: left; + margin: 0; +} + +#LC_realm { margin: 0.2em 0 0 0; + padding: 0; + font-weight: bold; + text-align: center; } #LC_nav_bar em { @@ -6010,7 +5968,12 @@ fieldset > legend { ol.LC_primary_menu { float: right; - margin: 0.2em 0 0 0; + margin: 0; +} + +span.LC_new_message{ + font-weight:bold; + color: darkred; } ol#LC_PathBreadcrumbs { @@ -6025,10 +5988,10 @@ ol.LC_primary_menu li { ol.LC_primary_menu li img { vertical-align: bottom; + height: 1.1em; } ol.LC_primary_menu a { - font-size: 90%; color: RGB(80, 80, 80); text-decoration: none; } @@ -6166,18 +6129,14 @@ ol#LC_MenuBreadcrumbs, ol#LC_PathBreadcrumbs { padding-left: 10px; margin: 0; - list-style-position: inside; - /* SD working here - white-space: nowrap; */ + height: 2.5em; /* equal to #LC_breadcrumbs line-height */ } ol#LC_MenuBreadcrumbs li, ol#LC_PathBreadcrumbs li, ul.LC_CourseBreadcrumbs li { display: inline; - white-space: nowrap; - /* SD working here - white-space: normal; */ + white-space: normal; } ol#LC_MenuBreadcrumbs li a, @@ -6218,7 +6177,6 @@ dl.LC_ListStyleClean dd { .LC_ListStyleClean, .LC_ListStyleSimple, .LC_ListStyleNormal, -.LC_ListStyle_Border, .LC_ListStyleSpecial { /* display:block; */ list-style-position: inside; @@ -6353,11 +6311,6 @@ table.LC_tableOfContent a { text-decoration: none; } -table.LC_tableBrowseRes tr.LC_trOdd, -table.LC_tableOfContent tr.LC_trOdd { - background-color: #EEEEEE; -} - table.LC_tableOfContent img { border: none; height: 1.3em; @@ -6436,6 +6389,11 @@ ul.LC_funclist { 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 @@ -6456,6 +6414,11 @@ ul.LC_funclist li { line-height: 150%; } +.ui-accordion .LC_advanced_toggle { + float: right; + font-size: 90%; + padding: 0px 4px +} END } @@ -6732,6 +6695,11 @@ sub start_page { # Don't add anything more if only_body wanted return $result if $args->{'only_body'}; + #Breadcrumbs for Construction Space provided by &bodytag. + if (($env{'environment.remote'} eq 'off') && ($env{'request.state'} eq 'construct')) { + return $result; + } + #Breadcrumbs if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) { &Apache::lonhtmlcommon::clear_breadcrumbs(); @@ -9610,6 +9578,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; } @@ -9722,12 +9692,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); @@ -9736,15 +9708,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) { @@ -9752,18 +9729,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(); + } } } } @@ -10008,19 +9993,19 @@ sub check_clone { my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom); my $clonemsg; my $can_clone = 0; - my $lctype = lc($args->{'type'}); + my $lctype = lc($args->{'crstype'}); if ($lctype ne 'community') { $lctype = 'course'; } if ($clonehome eq 'no_host') { - if ($args->{'type'} eq 'Community') { + 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 ($args->{'type'} eq 'Community') { + 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); @@ -10039,7 +10024,7 @@ sub check_clone { $can_clone = 1; } else { my $ccrole = 'cc'; - if ($args->{'type'} eq 'Community') { + if ($args->{'crstype'} eq 'Community') { $ccrole = 'co'; } my %roleshash = @@ -10048,9 +10033,11 @@ sub check_clone { 'userroles',['active'],[$ccrole], [$args->{'clonedomain'}]); if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { - $can_clone = 1; - } else { - if ($args->{'type'} eq 'Community') { + $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'}); @@ -10109,11 +10096,19 @@ sub construct_course { # 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; #