--- loncom/interface/loncommon.pm 2009/11/18 11:18:23 1.915
+++ loncom/interface/loncommon.pm 2010/01/18 15:44:35 1.925.2.10
@@ -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.925.2.10 2010/01/18 15:44:35 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -1877,7 +1877,7 @@ sub select_form {
$selectform.=
'\n";
+ ">".$hash{$key}."\n";
}
$selectform.="";
return $selectform;
@@ -4367,18 +4367,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:').' '
.''
.&Apache::lonmenu::constspaceform()
.'
';
+
+ return $output;
}
###############################################
@@ -4455,6 +4467,10 @@ sub bodytag {
'link' => &designparm($function.'.link',$domain),);
@design{keys(%$addentries)} = @$addentries{keys(%$addentries)};
+ my $custommenu;
+ if ($env{'environment.remote'} eq 'off') {
+ $custommenu = &needs_gci_custom();
+ }
# role and realm
my ($role,$realm) = split(/\./,$env{'request.role'},2);
if ($role eq 'ca') {
@@ -4464,14 +4480,22 @@ sub bodytag {
# realm
if ($env{'request.course.id'}) {
if ($env{'request.role'} !~ /^cr/) {
- $role = &Apache::lonnet::plaintext($role,&course_type());
+ if (($custommenu) && ($role eq 'cm')) {
+ undef($role);
+ } else {
+ $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 (($custommenu) && ($role eq 'cm')) {
+ undef($role);
+ } else {
+ $role = &Apache::lonnet::plaintext($role);
+ }
}
if (!$realm) { $realm=' '; }
@@ -4503,9 +4527,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 +4536,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 +4546,55 @@ 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/}) {
+ my $role_selector;
+ if (($custommenu) && ($env{'request.course.id'}) &&
+ ($env{'course.'.$env{'request.course.id'}.'.domain'} eq 'gcitest') &&
+ ($env{'request.role'} !~ m{^st\./gcitest/$match_courseid})) {
+ $role_selector = &Apache::lonmenu::roles_selector(
+ $env{'course.' . $env{'request.course.id'} . '.domain'},
+ $env{'course.' . $env{'request.course.id'} . '.num'} );
+ if ($role_selector) {
+ $role_selector = '
'.$role_selector;
+ }
+ }
+ 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;
}
+ $bodytag .= qq|$name $role $role_selector
|;
+
$bodytag .= Apache::lonhtmlcommon::scripttag(
- Apache::lonmenu::utilityfunctions(), 'start');
+ Apache::lonmenu::utilityfunctions('',$custommenu), '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();
+ if (($custommenu) &&
+ ($env{'request.role'} !~ m{^st\./gcitest/$match_courseid})) {
+ $bodytag .= &Apache::lonmenu::gci_secondary_menu();
+ } else {
+ $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.
@@ -4567,12 +4620,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
| unless $env{'form.inhibitmenu'};
- #
+ $realm $dc_info
| unless $env{'form.inhibitmenu'};
return(<
@@ -4585,6 +4641,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 +4795,6 @@ body {
color:$font;
}
-a:link,
-a:visited {
- font-size:100%;
-}
-
a:focus {
color: red;
background: yellow;
@@ -4762,6 +4821,7 @@ form, .inline {
.LC_filename {
font-family: $mono;
white-space:pre;
+ font-size: 120%;
}
.LC_fileicon {
@@ -4852,9 +4912,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;
@@ -4934,41 +4992,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 +5004,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%;
}
@@ -5046,11 +5065,6 @@ td.LC_menubuttons_text {
background: $tabbg;
}
-.LC_new_mail {
- background: $tabbg;
- font-weight: bold;
-}
-
table.LC_data_table,
table.LC_mail_list {
border: 1px solid #000000;
@@ -5207,6 +5221,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 +5231,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 {
@@ -5234,12 +5250,6 @@ table.LC_mail_list 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 {
background-color: $mail_read;
}
@@ -5519,15 +5529,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;
+ font-size: 1.2em;
}
.LC_topic_bar img {
@@ -5643,12 +5655,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 +5693,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;
@@ -5892,27 +5893,21 @@ 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;
}
+.LC_dccid {
+ margin: 0.2em 0 0 0;
+ padding: 0;
+ font-size: 90%;
+ display:none;
+}
+
/* ---- Remove when done ----
# The following styles is part of the redesign of LON-CAPA and are
# subject to change during this project.
@@ -5962,12 +5957,6 @@ h6 {
border: 0;
}
-.LC_Right {
- float: right;
- margin: 0;
- padding: 0;
-}
-
.LC_FormSectionClearButton input {
background-color:transparent;
border: none;
@@ -6003,6 +5992,13 @@ fieldset > legend {
margin: 0.2em 0 0 0;
}
+#LC_realm {
+ margin: 0.2em 0 0 0;
+ padding: 0;
+ font-weight: bold;
+ text-align: center;
+}
+
#LC_nav_bar em {
font-weight: bold;
font-style: normal;
@@ -6218,7 +6214,6 @@ dl.LC_ListStyleClean dd {
.LC_ListStyleClean,
.LC_ListStyleSimple,
.LC_ListStyleNormal,
-.LC_ListStyle_Border,
.LC_ListStyleSpecial {
/* display:block; */
list-style-position: inside;
@@ -6353,11 +6348,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;
@@ -6456,6 +6446,36 @@ ul.LC_funclist li {
line-height: 150%;
}
+#gciheader {
+ float:left;
+ width:100%;
+ background:#DAE0D2 url("/gcimenu_bg.gif") repeat-x bottom;
+ font-size:93%;
+ line-height:normal;
+}
+#gciheader ul {
+ margin:0;
+ padding:10px 10px 0;
+ list-style:none;
+}
+#gciheader li {
+ float:left;
+ background:url("/gcimenu_left.gif") no-repeat left top;
+ margin:0;
+ padding:0 0 0 9px;
+}
+#gciheader a {
+ display:block;
+ background:url("/gcimenu_right.gif") no-repeat right top;
+ padding:5px 15px 4px 6px;
+}
+#gciheader #current {
+ background-image:url("/gcimenu_left_on.gif");
+}
+#gciheader #current a {
+ background-image:url("/gcimenu_right_on.gif");
+ padding-bottom:5px;
+}
END
}
@@ -6732,6 +6752,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 +9635,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 +9749,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 +9765,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 +9786,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();
+ }
}
}
}
@@ -10655,6 +10697,60 @@ sub _add_to_env {
}
}
+sub new_roles_update {
+ my $rolecount = 0;
+ foreach my $envkey (keys(%env)) {
+ next unless ($envkey =~ /^user\.role\./);
+ $rolecount ++;
+ }
+ my $newrolecount = 0;
+ if (!$rolecount) {
+ my %userenv;
+ foreach my $crstype ('official','unofficial','community') {
+ $userenv{'canrequest.'.$crstype} =
+ &Apache::lonnet::usertools_access($env{'user.name'},
+ $env{'user.domain'},$crstype,'reload','requestcourses');
+ }
+ my $then=$env{'user.login.time'};
+ my $refresh=time;
+ my (%userroles,%allroles,%allgroups,@newroles);
+ my %roleshash =
+ &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',['active','future','previous'],undef,undef,1);
+ foreach my $item (keys(%roleshash)) {
+ my ($uname,$udom,$role,$section) = split(':',$item);
+ my $where = '/'.$udom.'/'.$uname;
+ my ($tstart,$tend) = split(':',$roleshash{$item});
+ if ($section ne '') {
+ $where .= '/'.$section;
+ }
+ my $spec = $role.'.'.$where;
+ &Apache::lonnet::set_arearole($role,$where,$tstart,$tend,
+ $env{'user.domain'},$env{'user.name'});
+ $userroles{'user.role.'.$spec} = $tstart.'.'.$tend;
+ $newrolecount ++;
+ unless (grep(/^\Q$role\E$/,@newroles)) {
+ push(@newroles,$role);
+ }
+ my $status =
+ &Apache::lonnet::curr_role_status($tstart,$tend,$refresh,$then);
+ if ($status eq 'active') {
+ &Apache::lonnet::gather_roleprivs(\%allroles,\%allgroups,\%userroles,
+ $where,$role,$tstart,$tend);
+ }
+ }
+ if (@newroles) {
+ my ($author,$adv) = &Apache::lonnet::set_userprivs(\%userroles,\%allroles,
+ \%allgroups);
+ &Apache::lonnet::appenv(\%userroles,[@newroles,'cm']);
+ $userenv{'user.adv'} = $adv;
+ $userenv{'user.author'} = $author;
+ $userenv{'user.refresh.time'} = $refresh;
+ }
+ &Apache::lonnet::appenv(\%userenv);
+ }
+ return $newrolecount;
+}
+
# --- Get the symbolic name of a problem and the url
sub get_symb {
my ($request,$silent) = @_;
@@ -10696,6 +10792,76 @@ sub clean_symb {
return ($symb,$enc);
}
+sub needs_gci_custom {
+ my $custommenu;
+ my $numdc = &check_for_gci_dc();
+ unless ($numdc) {
+ my $then=$env{'user.login.time'};
+ my $now = time;
+ my %cnums = (
+ review => '9615072b469884921gcil1',
+ submit => '1H96711d710194bfegcil1',
+ );
+ if ($env{'user.role.st./gci/'.$cnums{'review'}}) {
+ my ($start,$end) =
+ split('.',$env{'user.role.st./gci/'.$cnums{'review'}});
+ if (((!$start) || ($start && $start <= $now)) &&
+ ((!$end) || ($end > $now))) {
+ $custommenu = 1;
+ if ($env{'user.role.cc./gci/'.$cnums{'review'}}) {
+ my ($ccstart,$ccend) =
+ split('.',$env{'user.role.cc./gci/'.$cnums{'review'}});
+ if (((!$start) || ($start && $start <= $now)) &&
+ ((!$end) || ($end > $now))) {
+ $custommenu = '';
+ }
+ }
+ }
+ }
+ }
+ return $custommenu;
+}
+
+sub check_for_gci_dc {
+ my $then=$env{'user.login.time'};
+ my $numdc = 0;
+ foreach my $dom ('gci','gcitest') {
+ if ($env{'user.role.dc./'.$dom.'/'}) {
+ my $livedc = 1;
+ my ($tstart,$tend)=split(/\./,$env{'user.role.dc./'.$dom.'/'});
+ if ($tstart && $tstart>$then) { $livedc = 0; }
+ if ($tend && $tend <$then) { $livedc = 0; }
+ if ($livedc) {
+ $numdc++;
+ }
+ }
+ }
+ return $numdc;
+}
+
+sub existing_gcitest_courses {
+ my ($role) = @_;
+ my %courses;
+ my $cdom = 'gcitest';
+ my $now = time;
+ foreach my $envkey (keys(%env)) {
+ my $cnum;
+ if ($envkey =~ m{^user\.role\.\Q$role\E\./\Q$cdom\E/($match_courseid)$}) {
+ $cnum = $1;
+ } else {
+ next;
+ }
+ my ($tstart,$tend) = split('.',$env{$envkey});
+ if (((!$tstart) || ($tstart < $now)) && ((!$tend) || ($tend > $now))) {
+ my $descr = $env{'course.'.$cdom.'_'.$cnum.'.description'};
+ if ($descr ne '') {
+ $courses{$cdom.'_'.$cnum}{'description'} = $descr;
+ }
+ }
+ }
+ return %courses;
+}
+
=pod
=back