--- loncom/interface/loncommon.pm 2024/03/23 22:05:16 1.1428
+++ loncom/interface/loncommon.pm 2025/01/06 00:22:57 1.1445
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.1428 2024/03/23 22:05:16 raeburn Exp $
+# $Id: loncommon.pm,v 1.1445 2025/01/06 00:22:57 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -2476,7 +2476,7 @@ END
$cdom0
-notset
+notset$now0rights
@@ -3950,6 +3950,21 @@ sub passwd_validation_js {
} else {
$alertmsg = &mt('A secret did not satisfy requirement(s):').'\n\n';
}
+ } elsif ($context eq 'ltitools') {
+ my %domconfig = &Apache::lonnet::get_dom('configuration',['toolsec'],$domain);
+ if (ref($domconfig{'toolsec'}) eq 'HASH') {
+ if (ref($domconfig{'toolsec'}{'rules'}) eq 'HASH') {
+ %passwdconf = %{$domconfig{'toolsec'}{'rules'}};
+ }
+ }
+ if ($id eq 'add') {
+ $alertmsg = &mt('Secret for added external tool did not satisfy requirement(s):').'\n\n';
+ } elsif ($id =~ /^\d+$/) {
+ my $pos = $id+1;
+ $alertmsg = &mt('Secret for external tool [_1] did not satisfy requirement(s):','#'.$pos).'\n\n';
+ } else {
+ $alertmsg = &mt('A secret did not satisfy requirement(s):').'\n\n';
+ }
} else {
%passwdconf = &Apache::lonnet::get_passwdconf($domain);
$alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n';
@@ -5676,7 +5691,8 @@ sub blockcheck {
}
unless ($has_evb) {
if (($activity eq 'printout') || ($activity eq 'grades') || ($activity eq 'search') ||
- ($activity eq 'boards') || ($activity eq 'groups') || ($activity eq 'chat')) {
+ ($activity eq 'index') || ($activity eq 'boards') || ($activity eq 'groups') ||
+ ($activity eq 'chat')) {
if ($udom eq $cdom) {
$check_ipaccess = 1;
}
@@ -5767,8 +5783,8 @@ sub blockcheck {
if (($activity eq 'boards' || $activity eq 'chat' ||
$activity eq 'groups' || $activity eq 'printout' ||
- $activity eq 'search' || $activity eq 'reinit' ||
- $activity eq 'alert') &&
+ $activity eq 'search' || $activity eq 'index' ||
+ $activity eq 'reinit' || $activity eq 'alert') &&
($env{'request.course.id'})) {
foreach my $key (keys(%live_courses)) {
if ($key ne $env{'request.course.id'}) {
@@ -6103,6 +6119,8 @@ END_MYBLOCK
$text = &mt('Gradebook Blocked');
} elsif ($activity eq 'search') {
$text = &mt('Search Blocked');
+ } elsif ($activity eq 'index') {
+ $text = &mt('Content Index Blocked');
} elsif ($activity eq 'alert') {
$text = &mt('Checking Critical Messages Blocked');
} elsif ($activity eq 'reinit') {
@@ -6536,7 +6554,7 @@ Input: (optional) filename from which br
If page header is being requested for use in a frameset, then
the second (option) argument -- frameset will be true, and
the target attribute set for links should be target="_parent".
- If $title is supplied as the thitd arg, that will be used to
+ If $title is supplied as the third arg, that will be used to
the left of the breadcrumbs tail for the current path.
Returns: HTML div with CSTR path and recent box
@@ -6656,20 +6674,32 @@ sub nocodemirror {
Input: $uri (optional)
Returns: %editors hash in which keys are editors
- permitted in current Authoring Space.
+ permitted in current Authoring Space,
+ or in current course for web pages
+ created in a course.
+
Value for each key is 1. Possible keys
- are: edit, xml, and daxe. If no specific
+ are: edit, xml, and daxe.
+
+ For a regular Authoring Space, if no specific
set of editors has been set for the Author
who owns the Authoring Space, then the
domain default will be used. If no domain
default has been set, then the keys will be
edit and xml.
+ For a course author, or for web pages created
+ in a course, if no specific set of editors has
+ been set for the course, then the domain
+ course default will be used. If no domain
+ course default has been set, then the keys
+ will be edit and xml.
+
=cut
sub permitted_editors {
my ($uri) = @_;
- my ($is_author,$is_coauthor,$auname,$audom,%editors);
+ my ($is_author,$is_coauthor,$is_course,$auname,$audom,%editors);
if ($env{'request.role'} =~ m{^au\./}) {
$is_author = 1;
} elsif ($env{'request.role'} =~ m{^(?:ca|aa)\./($match_domain)/($match_username)}) {
@@ -6683,20 +6713,33 @@ sub permitted_editors {
}
}
} elsif ($env{'request.course.id'}) {
- if ($env{'request.editurl'} =~ m{^/priv/($match_domain)/($match_username)/}) {
+ my ($cdom,$cnum);
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ if (($env{'request.editurl'} =~ m{^/priv/\Q$cdom/$cnum\E/}) ||
+ ($env{'request.editurl'} =~ m{^/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/}) ||
+ ($uri =~ m{^/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/})) {
+ $is_course = 1;
+ } elsif ($env{'request.editurl'} =~ m{^/priv/($match_domain)/($match_username)/}) {
($audom,$auname) = ($1,$2);
} elsif ($env{'request.uri'} =~ m{^/priv/($match_domain)/($match_username)/}) {
($audom,$auname) = ($1,$2);
} elsif (($uri eq '/daxesave') &&
+ (($env{'form.path'} =~ m{^/daxeopen/priv/\Q$cdom/$cnum\E/}) ||
+ ($env{'form.path'} =~ m{^/daxeopen/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/}))) {
+ $is_course = 1;
+ } elsif (($uri eq '/daxesave') &&
($env{'form.path'} =~ m{^/daxeopen/priv/($match_domain)/($match_username)/})) {
($audom,$auname) = ($1,$2);
}
- if (($audom ne '') && ($auname ne '')) {
- if (($env{'user.domain'} eq $audom) &&
- ($env{'user.name'} eq $auname)) {
- $is_author = 1;
- } else {
- $is_coauthor = 1;
+ unless ($is_course) {
+ if (($audom ne '') && ($auname ne '')) {
+ if (($env{'user.domain'} eq $audom) &&
+ ($env{'user.name'} eq $auname)) {
+ $is_author = 1;
+ } else {
+ $is_coauthor = 1;
+ }
}
}
}
@@ -6716,6 +6759,19 @@ sub permitted_editors {
xml => 1,
);
}
+ } elsif ($is_course) {
+ if (exists($env{'course.'.$env{'request.course.id'}.'.internal.crseditors'})) {
+ map { $editors{$_} = 1; } split(/,/,$env{'course.'.$env{'request.course.id'}.'.internal.crseditors'});
+ } else {
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
+ if (exists($domdefaults{'crseditors'})) {
+ map { $editors{$_} = 1; } split(/,/,$domdefaults{'crseditors'});
+ } else {
+ %editors = ( edit => 1,
+ xml => 1,
+ );
+ }
+ }
} else {
%editors = ( edit => 1,
xml => 1,
@@ -6824,7 +6880,6 @@ sub bodytag {
my $hostname = $args->{'hostname'};
$function = &get_users_function() if (!$function);
- my $img = &designparm($function.'.img',$domain);
my $font = &designparm($function.'.font',$domain);
my $pgbg = $bgcolor || &designparm($function.'.pgbg',$domain);
@@ -6947,8 +7002,12 @@ sub bodytag {
# $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls
# }
- $bodytag .= Apache::lonhtmlcommon::scripttag(
- Apache::lonmenu::utilityfunctions($httphost), 'start');
+ my $need_endlcint;
+ unless ($args->{'switchserver'}) {
+ $bodytag .= Apache::lonhtmlcommon::scripttag(
+ Apache::lonmenu::utilityfunctions($httphost), 'start');
+ $need_endlcint = 1;
+ }
my $collapsible;
if ($args->{'collapsible_header'} ne '') {
@@ -6984,6 +7043,9 @@ END
}
$bodytag .= qq|
$left $role $realm $dc_info
|;
+ if ($need_endlcint) {
+ $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
+ }
return $bodytag;
}
@@ -7001,6 +7063,9 @@ END
#if directed to not display the secondary menu, don't.
if ($args->{'no_secondary_menu'}) {
+ if ($need_endlcint) {
+ $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
+ }
return $bodytag;
}
#don't show menus for public users
@@ -7013,7 +7078,9 @@ END
$args->{'links_target'});
}
$bodytag .= Apache::lonmenu::serverform();
- $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
+ if ($need_endlcint) {
+ $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
+ }
if ($env{'request.state'} eq 'construct') {
$bodytag .= &Apache::lonmenu::innerregister($forcereg,
$args->{'bread_crumbs'},'','',$hostname,
@@ -7029,11 +7096,13 @@ END
$args->{'bread_crumbs'},
$advtoolsref,'',$hostname);
}
- }else{
- # this is to seperate menu from content when there's no secondary
- # menu. Especially needed for public accessible ressources.
+ } else {
+ # this is to separate menu from content when there's no secondary
+ # menu. Especially needed for publicly accessible resources.
$bodytag .= '';
- $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
+ if ($need_endlcint) {
+ $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
+ }
}
if ($args->{'collapsible_header'} ne '') {
$bodytag .= $args->{'collapsible_header'}.
@@ -7168,7 +7237,6 @@ Inputs: (all optional)
sub standard_css {
my ($function,$domain,$bgcolor) = @_;
$function = &get_users_function() if (!$function);
- my $img = &designparm($function.'.img', $domain);
my $tabbg = &designparm($function.'.tabbg', $domain);
my $font = &designparm($function.'.font', $domain);
my $fontmenu = &designparm($function.'.fontmenu', $domain);
@@ -7221,6 +7289,7 @@ body {
line-height:130%;
font-size:0.83em;
color:$font;
+ background-color: $pgbg_or_bgcolor;
}
a:focus,
@@ -7232,6 +7301,16 @@ form, .inline {
display: inline;
}
+.LC_visually_hidden:not(:focus):not(:active) {
+ clip-path: inset(50%);
+ height: 1px;
+ overflow: hidden;
+ position: absolute;
+ white-space: nowrap;
+ width: 1px;
+ display: inline;
+}
+
.LC_menus_content.shown{
display: block;
}
@@ -9372,7 +9451,7 @@ sub headtag {
$inhibitprint = &print_suppression();
}
- if (!$args->{'frameset'}) {
+ if (!$args->{'frameset'} && !$args->{'switchserver'}) {
$result .= &Apache::lonhtmlcommon::htmlareaheaders();
}
if ($args->{'force_register'} && $env{'request.noversionuri'} !~ m{^/res/adm/pages/}) {
@@ -9380,7 +9459,8 @@ sub headtag {
}
if (!$args->{'no_nav_bar'}
&& !$args->{'only_body'}
- && !$args->{'frameset'}) {
+ && !$args->{'frameset'}
+ && !$args->{'switchserver'}) {
$result .= &help_menu_js($httphost);
$result.=&modal_window();
$result.=&togglebox_script();
@@ -9576,8 +9656,12 @@ OFFLOAD
$title = 'The LearningOnline Network with CAPA';
}
if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }
- $result .= ' LON-CAPA '.$title.''
- .'';
+ } else {
+ $result .= ' LON-CAPA '.$title.'';
+ }
+ $result .= "\n".'{'frameset'}) {
$result .= ' /';
}
@@ -9592,7 +9676,7 @@ OFFLOAD
}
if ($clientmobile) {
$result .= '
-
+
';
}
$result .= ''."\n";
@@ -9776,6 +9860,11 @@ $args - additional optional args support
no_auto_mt_title -> prevent &mt()ing the title arg
bread_crumbs -> Array containing breadcrumbs
bread_crumbs_component -> if exists show it as headline else show only the breadcrumbs
+ bread_crumbs_style -> breadcrumbs are contained within
,
+ and &standard_css() contains CSS for #LC_breadcrumbs, if you want
+ to override those values, or add to them, specify the value to
+ include in the style attribute to include in the div tag by using
+ bread_crumbs_style (e.g., overflow: visible)
bread_crumbs_nomenu -> if true will pass false as the value of $menulink
to lonhtmlcommon::breadcrumbs
group -> includes the current group, if page is for a
@@ -9944,9 +10033,12 @@ sub start_page {
}
#if bread_crumbs_component exists show it as headline else show only the breadcrumbs
if(exists($args->{'bread_crumbs_component'})){
- $result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'},'',$menulink);
+ $result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'},
+ '',$menulink,'',
+ $args->{'bread_crumbs_style'});
} else {
- $result .= &Apache::lonhtmlcommon::breadcrumbs('','',$menulink);
+ $result .= &Apache::lonhtmlcommon::breadcrumbs('','',$menulink,'',
+ $args->{'bread_crumbs_style'});
}
}
}
@@ -18034,6 +18126,12 @@ sub init_user_environment {
} else {
$userenv{'editors'} = 'edit,xml';
}
+ if ($userenv{'authorarchive'}) {
+ $userenv{'canarchive'} = 1;
+ } elsif (($userenv{'authorarchive'} eq '') &&
+ ($domdef{'archive'})) {
+ $userenv{'canarchive'} = 1;
+ }
}
$userenv{'canrequest.author'} =