'."\n";
for (my $row=1; $row<=8; $row++) {
foreach my $cat (keys(%category_members)) {
if ($category_positions{$cat} ne "$col,$row") { next; }
#$output.='"
+ +"action='$annotateurl'>"
+""
+"<\\/form>"
+'$end_page_annotate');
@@ -2036,6 +2934,23 @@ function open_StoredLinks_Import(rat) {
newWin.focus();
}
+function open_source() {
+ sourcewin=window.open('/adm/source?inhibitmenu=yes&viewonly=1&filename='+currentURL,'LONsource',
+ 'height=500,width=600,resizable=yes,location=no,menubar=no,toolbar=no,scrollbars=yes');
+}
+
+function open_aboutLC() {
+ var isMobile = "$env{'browser.mobile'}";
+ var url = '/adm/about.html';
+ if (isMobile == 1) {
+ openMyModal(url,600,400,'yes');
+ } else {
+ window.open(url,"aboutLONCAPA","height=400,width=600,scrollbars=1,resizable=1,menubar=0,location=1");
+ }
+ return;
+}
+
+
(function (\$) {
\$(document).ready(function () {
\$.single=function(a){return function(b){a[0]=b;return a}}(\$([1]));
@@ -2052,34 +2967,62 @@ function open_StoredLinks_Import(rat) {
$countdown
+$viewuser
+
ENDUTILITY
}
sub serverform {
+ my $target;
+ unless (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) {
+ $target = ' target="_top"';
+ }
+ if (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self')) {
+ $target = ' target="_self"';
+ }
+ my $submit = &mt('Submit');
return(<
+
ENDSERVERFORM
}
sub constspaceform {
+ my ($frameset) = @_;
+ my ($target,$printtarget);
+ if ($frameset) {
+ $target = ' target="_parent"';
+ $printtarget = ' target="_parent"';
+ } else {
+ unless ((($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) ||
+ (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) {
+ $target = ' target="_top"';
+ $printtarget = ' target="_top"';
+ }
+ }
return(<
+
-
-
+
ENDCONSTSPACEFORM
}
@@ -2095,12 +3038,12 @@ sub hidden_button_check {
}
sub roles_selector {
- my ($cdom,$cnum,$httphost) = @_;
+ my ($cdom,$cnum,$httphost,$target,$menucoll,$menuref) = @_;
my $crstype = &Apache::loncommon::course_type();
my $now = time;
- my (%courseroles,%seccount,%courseprivs);
+ my (%courseroles,%seccount,%courseprivs,%roledesc);
my $is_cc;
- my ($js,$form,$switcher);
+ my ($js,$form,$switcher,$has_opa_priv);
my $ccrole;
if ($crstype eq 'Community') {
$ccrole = 'co';
@@ -2109,11 +3052,11 @@ sub roles_selector {
}
my ($privref,$gotsymb,$destsymb);
my $destinationurl = $ENV{'REQUEST_URI'};
- if ($destinationurl =~ /\?symb=/) {
+ if ($destinationurl =~ /(\?|\&)symb=/) {
$gotsymb = 1;
} elsif ($destinationurl =~ m{^/enc/}) {
my $plainurl = &Apache::lonenc::unencrypted($destinationurl);
- if ($plainurl =~ /\?symb=/) {
+ if ($plainurl =~ /(\?|\&)symb=/) {
$gotsymb = 1;
}
}
@@ -2148,7 +3091,7 @@ sub roles_selector {
if ($is_cc) {
&get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount,\%courseprivs);
} elsif ($env{'request.role'} =~ m{^\Qcr/$cdom/$cdom-domainconfig/\E(\w+)\.\Q/$cdom/$cnum\E}) {
- &get_customadhoc_roles($cdom,$cnum,\%courseroles,\%seccount,\%courseprivs,$privref);
+ &get_customadhoc_roles($cdom,$cnum,\%courseroles,\%seccount,\%courseprivs,\%roledesc,$privref);
} else {
my %gotnosection;
foreach my $item (keys(%env)) {
@@ -2201,10 +3144,15 @@ sub roles_selector {
}
}
if ((keys(%seccount) > 1) || ($numdiffsec > 1)) {
+ my $targetattr;
+ if ($target ne '') {
+ $targetattr = ' target="'.$target.'"';
+ }
my @submenu;
- $js = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,$privref);
+ $js = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,
+ \%roledesc,$privref,$menucoll,$menuref);
$form =
- ''."\n";
+ $form .= ''."\n".
+ ''."\n";
foreach my $role (@roles_order) {
my $include;
if (defined($courseroles{$role})) {
if ($env{'request.role'} =~ m{^\Q$role\E}) {
if ($seccount{$role} > 1) {
$include = 1;
+ } else {
+ if ($env{'user.priv.'.$env{'request.role'}."./$cdom/$cnum"} =~/opa\&([^\:]*)/) {
+ $has_opa_priv = 1;
+ }
}
} else {
$include = 1;
}
}
if ($include) {
+ if ($env{"user.priv.$role./$cdom/$cnum./$cdom/$cnum"} =~/opa\&([^\:]*)/) {
+ $has_opa_priv = 1;
+ }
push(@submenu,['javascript:adhocRole('."'$role'".')',
&Apache::lonnet::plaintext($role,$crstype)]);
}
@@ -2244,20 +3200,26 @@ sub roles_selector {
if ($include) {
my $rolename;
if ($role =~ m{^cr/$cdom/$cdom\-domainconfig/(\w+)(?:/\w+|$)}) {
- $rolename = &mt('Helpdesk [_1]',$1);
+ $rolename = $roledesc{$role};
+ if ($rolename eq '') {
+ $rolename = &mt('Helpdesk [_1]',$1);
+ }
} else {
$rolename = &Apache::lonnet::plaintext($role);
}
+ if ($env{"user.priv.$role./$cdom/$cnum./$cdom/$cnum"} =~/opa\&([^\:]*)/) {
+ $has_opa_priv = 1;
+ }
push(@submenu,['javascript:adhocRole('."'$role'".')',
$rolename]);
}
}
}
if (@submenu > 0) {
- $switcher = &create_submenu('','',&mt('Switch role'),\@submenu);
+ $switcher = &create_submenu('#',$target,&mt('Switch role'),\@submenu);
}
}
- return ($js,$form,$switcher);
+ return ($js,$form,$switcher,$has_opa_priv);
}
sub get_all_courseroles {
@@ -2331,73 +3293,91 @@ sub get_all_courseroles {
}
sub get_customadhoc_roles {
- my ($cdom,$cnum,$courseroles,$seccount,$courseprivs,$privref) = @_;
+ my ($cdom,$cnum,$courseroles,$seccount,$courseprivs,$roledesc,$privref) = @_;
unless ((ref($courseroles) eq 'HASH') && (ref($seccount) eq 'HASH') &&
- (ref($courseprivs) eq 'HASH')) {
+ (ref($courseprivs) eq 'HASH') && (ref($roledesc) eq 'HASH')) {
return;
}
- if ($env{'environment.adhocroles.'.$cdom} ne '') {
- my @customroles = split(/,/,$env{'environment.adhocroles.'.$cdom});
- if (@customroles > 1) {
- if ($env{"user.role.dh./$cdom/"}) {
- my ($start,$end)=split(/\./,$env{"user.role.dh./$cdom/"});
- my $now = time;
- if (!($start && ($now<$start)) & !($end && ($now>$end))) {
- my $numsec = 1;
- my @sections;
- my ($allseclist,$cached) =
- &Apache::lonnet::is_cached_new('courseseclist',$cdom.'_'.$cnum);
- if (defined($cached)) {
- if ($allseclist ne '') {
- @sections = split(/,/,$allseclist);
- $numsec += scalar(@sections);
- }
- } else {
- my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
- $numsec += scalar(keys(%sections_count));
- $allseclist = join(',',sort(keys(%sections_count)));
- &Apache::lonnet::do_cache_new('courseseclist',$cdom.'_'.$cnum,$allseclist);
- }
- my (%adhoc,$gotprivs);
- my $prefix = "cr/$cdom/$cdom".'-domainconfig';
- foreach my $role (@customroles) {
- next if (($role eq '') || ($role =~ /\W/));
- $seccount->{"$prefix/$role"} = $numsec;
- $courseroles->{"$prefix/$role"} = \@sections;
- if ((ref($privref) eq 'ARRAY') && (@{$privref} > 0)) {
- if (exists($env{"user.priv.$prefix/$role./$cdom/$cnum./"})) {
- $courseprivs->{"$prefix/$role./$cdom/$cnum./"} =
- $env{"user.priv.$prefix/$role./$cdom/$cnum./"};
- $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"} =
- $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/"};
- $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"} =
- $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/$cnum"};
- } else {
- unless ($gotprivs) {
- my ($adhocroles,$privscached) =
- &Apache::lonnet::is_cached_new('adhocroles',$cdom);
- if ((defined($privscached)) && (ref($adhocroles) eq 'HASH')) {
- %adhoc = %{$adhocroles};
- } else {
- my $confname = &Apache::lonnet::get_domainconfiguser($cdom);
- my %roledefs = &Apache::lonnet::dump('roles',$cdom,$confname,'rolesdef_');
- foreach my $key (keys(%roledefs)) {
- (undef,my $rolename) = split(/_/,$key);
- if ($rolename ne '') {
- $adhoc{$rolename} = $roledefs{$key};
- }
+ my $is_helpdesk = 0;
+ my $now = time;
+ foreach my $role ('dh','da') {
+ if ($env{"user.role.$role./$cdom/"}) {
+ my ($start,$end)=split(/\./,$env{"user.role.$role./$cdom/"});
+ if (!($start && ($now<$start)) && !($end && ($now>$end))) {
+ $is_helpdesk = 1;
+ last;
+ }
+ }
+ }
+ if ($is_helpdesk) {
+ my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($cdom.'_'.$cnum);
+ my %available;
+ if (ref($possroles) eq 'ARRAY') {
+ map { $available{$_} = 1; } @{$possroles};
+ }
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
+ if (ref($domdefaults{'adhocroles'}) eq 'HASH') {
+ if (keys(%{$domdefaults{'adhocroles'}})) {
+ my $numsec = 1;
+ my @sections;
+ my ($allseclist,$cached) =
+ &Apache::lonnet::is_cached_new('courseseclist',$cdom.'_'.$cnum);
+ if (defined($cached)) {
+ if ($allseclist ne '') {
+ @sections = split(/,/,$allseclist);
+ $numsec += scalar(@sections);
+ }
+ } else {
+ my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
+ @sections = sort(keys(%sections_count));
+ $numsec += scalar(@sections);
+ $allseclist = join(',',@sections);
+ &Apache::lonnet::do_cache_new('courseseclist',$cdom.'_'.$cnum,$allseclist);
+ }
+ my (%adhoc,$gotprivs);
+ my $prefix = "cr/$cdom/$cdom".'-domainconfig';
+ foreach my $role (keys(%{$domdefaults{'adhocroles'}})) {
+ next if (($role eq '') || ($role =~ /\W/));
+ $seccount->{"$prefix/$role"} = $numsec;
+ $roledesc->{"$prefix/$role"} = $description->{$role};
+ if ((ref($privref) eq 'ARRAY') && (@{$privref} > 0)) {
+ if (exists($env{"user.priv.$prefix/$role./$cdom/$cnum./"})) {
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./"} =
+ $env{"user.priv.$prefix/$role./$cdom/$cnum./"};
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"} =
+ $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/"};
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"} =
+ $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/$cnum"};
+ } else {
+ unless ($gotprivs) {
+ my ($adhocroles,$privscached) =
+ &Apache::lonnet::is_cached_new('adhocroles',$cdom);
+ if ((defined($privscached)) && (ref($adhocroles) eq 'HASH')) {
+ %adhoc = %{$adhocroles};
+ } else {
+ my $confname = &Apache::lonnet::get_domainconfiguser($cdom);
+ my %roledefs = &Apache::lonnet::dump('roles',$cdom,$confname,'rolesdef_');
+ foreach my $key (keys(%roledefs)) {
+ (undef,my $rolename) = split(/_/,$key);
+ if ($rolename ne '') {
+ my ($systempriv,$domainpriv,$coursepriv) = split(/\_/,$roledefs{$key});
+ $coursepriv = &Apache::lonnet::course_adhocrole_privs($rolename,$cdom,$cnum,$coursepriv);
+ $adhoc{$rolename} = join('_',($systempriv,$domainpriv,$coursepriv));
}
- &Apache::lonnet::do_cache_new('adhocroles',$cdom,\%adhoc);
}
- $gotprivs = 1;
+ &Apache::lonnet::do_cache_new('adhocroles',$cdom,\%adhoc);
}
- ($courseprivs->{"$prefix/$role./$cdom/$cnum./"},
- $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"},
- $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"}) =
- split(/\_/,$adhoc{$role});
+ $gotprivs = 1;
}
+ ($courseprivs->{"$prefix/$role./$cdom/$cnum./"},
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"},
+ $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"}) =
+ split(/\_/,$adhoc{$role});
}
}
+ if ($available{$role}) {
+ $courseroles->{"$prefix/$role"} = \@sections;
+ }
}
}
}
@@ -2406,7 +3386,8 @@ sub get_customadhoc_roles {
}
sub jump_to_role {
- my ($cdom,$cnum,$seccount,$courseroles,$courseprivs,$privref) = @_;
+ my ($cdom,$cnum,$seccount,$courseroles,$courseprivs,$roledesc,$privref,
+ $menucoll,$menuref) = @_;
my %lt = &Apache::lonlocal::texthash(
this => 'This role has section(s) associated with it.',
ente => 'Enter a specific section.',
@@ -2417,6 +3398,7 @@ sub jump_to_role {
role => 'The role you selected is not permitted to view the current page.',
swit => 'Switch role, but display Main Menu page instead?',
);
+ &js_escape(\%lt);
my $js;
if (ref($courseroles) eq 'HASH') {
$js = ' var secpick = new Array("'.$lt{'ente'}.'","'.$lt{'orlb'}.'");'."\n".
@@ -2439,6 +3421,8 @@ sub jump_to_role {
}
}
my $checkroles = 0;
+ my $fallback = '/adm/menu';
+ my $displaymsg = $lt{'swit'};
if ((ref($privref) eq 'ARRAY') && (@{$privref} > 0) && (ref($courseprivs) eq 'HASH')) {
my %disallowed;
foreach my $role (sort(keys(%{$courseprivs}))) {
@@ -2460,8 +3444,22 @@ sub jump_to_role {
$checkroles = 1;
$js .= " var disallow = new Array('".join("','",keys(%disallowed))."');\n".
" var rolecheck = 1;\n";
+ if ($menucoll) {
+ if (ref($menuref) eq 'HASH') {
+ if ($menuref->{'main'} eq 'n') {
+ $fallback = '/adm/navmaps';
+ if (&Apache::loncommon::course_type() eq 'Community') {
+ $displaymsg = &mt('Switch role, but display Community Contents page instead?');
+ } else {
+ $displaymsg = &mt('Switch role, but display Course Contents page instead?');
+ }
+ &js_escape(\$displaymsg);
+ }
+ }
+ }
}
}
+ &js_escape(\$fallback);
if (!$checkroles) {
$js .= " var disallow = new Array();\n".
" rolecheck = 0;\n";
@@ -2484,8 +3482,8 @@ function adhocRole(newrole) {
if (rolecheck > 0) {
for (var i=0; i{'starttime'} < $now) &&
@@ -2644,7 +3652,7 @@ $donebutton
$collapse
-
+
$expand
$title
@@ -2661,6 +3669,94 @@ sub placement_progress {
&mt('Test is [_1]% complete',$complete).'';
}
+sub linkprot_exit {
+ if (($env{'request.course.id'}) && ($env{'request.deeplink.login'})) {
+ my ($deeplink_symb,$deeplink);
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ if (($cnum ne '') && ($cdom ne '')) {
+ $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom);
+ if ($deeplink_symb) {
+ if ($deeplink_symb =~ /\.(page|sequence)$/) {
+ my $mapname = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[2]);
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if (ref($navmap)) {
+ $deeplink = $navmap->get_mapparam(undef,$mapname,'0.deeplink');
+ }
+ } else {
+ $deeplink = &Apache::lonnet::EXT('resource.0.deeplink',$deeplink_symb);
+ }
+ if ($deeplink ne '') {
+ my ($state,$others,$listed,$scope,$protect,$display,$target,$exit) = split(/,/,$deeplink);
+ my %lt = &Apache::lonlocal::texthash(
+ title => 'Exit Tool',
+ okdone => 'Click "OK" to exit embedded tool',
+ cancel => 'Click "Cancel" to continue working.',
+ ok => 'OK',
+ exit => 'Cancel',
+ );
+ if ($exit) {
+ my ($show,$text) = split(/:/,$exit);
+ unless ($show eq 'no') {
+ my $height = 250;
+ my $width = 300;
+ my $exitbuttontext;
+ if ($text eq '') {
+ $exitbuttontext = &mt('Exit Tool');
+ } else {
+ $exitbuttontext = $text;
+ }
+ return <
+
+
+
+
+
'.&mt($category_names{$cat}).' |

+
+
+
+
+END
+ }
+ }
+ }
+ }
+ }
+ }
+ return;
+}
+
# ================================================================ Main Program
BEGIN {
@@ -2677,14 +3773,17 @@ BEGIN {
$category_positions{$entries[2]}=$entries[1];
$category_names{$entries[2]}=$entries[3];
} elsif ($configline=~/^prim\:/) {
- my @entries = (split(/\:/, $configline))[1..6];
+ my @entries = (split(/\:/, $configline))[1..7];
push(@primary_menu,\@entries);
} elsif ($configline=~/^primsub\:/) {
- my ($parent,@entries) = (split(/\:/, $configline))[1..4];
+ my ($parent,@entries) = (split(/\:/, $configline))[1..5];
push(@{$primary_submenu{$parent}},\@entries);
} elsif ($configline=~/^scnd\:/) {
- my @entries = (split(/\:/, $configline))[1..5];
+ my @entries = (split(/\:/, $configline))[1..6];
push(@secondary_menu,\@entries);
+ } elsif ($configline=~/^scndsub\:/) {
+ my ($parent,@entries) = (split(/\:/, $configline))[1..4];
+ push(@{$secondary_submenu{$parent}},\@entries);
} elsif ($configline) {
push(@desklines,$configline);
}
$lt{'okdone'} $lt{'cancel'}
+