--- loncom/interface/londocs.pm 2022/10/19 00:03:10 1.682 +++ loncom/interface/londocs.pm 2022/12/31 14:08:59 1.690 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.682 2022/10/19 00:03:10 raeburn Exp $ +# $Id: londocs.pm,v 1.690 2022/12/31 14:08:59 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -183,43 +183,62 @@ sub default_folderpath { } } -sub validate_folderpath { - my ($supplementalflag) = @_; - if ($env{'form.folderpath'} ne '') { - my @items = split(/\&/,$env{'form.folderpath'}); - my $badpath; - for (my $i=0; $i<@items; $i++) { - my $odd = $i%2; - if (($odd) && (!$supplementalflag) && ($items[$i] !~ /^[^:]*:(|\d+):(|1):(|1):(|1):(|1)$/)) { - $badpath = 1; - } elsif ((!$odd) && ($items[$i] !~ /^(default|supplemental)(|_\d+)$/)) { - $badpath = 1; - } - last if ($badpath); - } - if ($badpath) { - delete($env{'form.folderpath'}); - } - } - return; -} - -sub validate_suppath { +sub validate_supppath { + my ($coursenum,$coursedom) = @_; + my $backto; if ($env{'form.supppath'} ne '') { my @items = split(/\&/,$env{'form.supppath'}); - my $badpath; + my ($badpath,$got_supp,$supppath,%supphidden,%suppids); for (my $i=0; $i<@items; $i++) { my $odd = $i%2; if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) { $badpath = 1; + last; + } elsif ($odd) { + my $suffix; + my $idx = $i-1; + if ($items[$i] =~ /^([^:]*)::(|1):::$/) { + $backto .= '&'.$1; + } elsif ($items[$idx] eq 'supplemental') { + $backto .= '&'.$items[$i]; + } else { + $backto .= '&'.$items[$i]; + my $is_hidden; + unless ($got_supp) { + my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom); + if (ref($supplemental) eq 'HASH') { + if (ref($supplemental->{'hidden'}) eq 'HASH') { + %supphidden = %{$supplemental->{'hidden'}}; + } + if (ref($supplemental->{'ids'}) eq 'HASH') { + %suppids = %{$supplemental->{'ids'}}; + } + } + $got_supp = 1; + } + if (ref($suppids{"/uploaded/$coursedom/$coursenum/$items[$idx].sequence"}) eq 'ARRAY') { + my $mapid = $suppids{"/uploaded/$coursedom/$coursenum/$items[$idx].sequence"}->[0]; + if ($supphidden{$mapid}) { + $is_hidden = 1; + } + } + $suffix = '::'.$is_hidden.':::'; + } + $supppath .= '&'.$items[$i].$suffix; + } else { + $supppath .= '&'.$items[$i]; + $backto .= '&'.$items[$i]; } - last if ($badpath); } if ($badpath) { delete($env{'form.supppath'}); + } else { + $supppath =~ s/^\&//; + $backto =~ s/^\&//; + $env{'form.supppath'} = $supppath; } } - return; + return $backto; } sub dumpcourse { @@ -3277,28 +3296,11 @@ sub editor { return $errtext if ($fatal); } - my (%supphidden,%suppids,$suppmapid); - if ($#LONCAPA::map::order<1) { my $idx=&LONCAPA::map::getresidx(); if ($idx<=0) { $idx=1; } $LONCAPA::map::order[0]=$idx; $LONCAPA::map::resources[$idx]=''; - } elsif ($supplementalflag && !$allowed) { - my ($supplemental) = &Apache::lonnet::get_supplemental($coursenum,$coursedom); - if (ref($supplemental) eq 'HASH') { - if (ref($supplemental->{'hidden'}) eq 'HASH') { - %supphidden = %{$supplemental->{'hidden'}}; - } - if (ref($supplemental->{'ids'}) eq 'HASH') { - %suppids = %{$supplemental->{'ids'}}; - } - } - if ($folder eq 'supplemental') { - $suppmapid = 0; - } elsif ($folder =~ /^supplemental_(\d+)$/) { - $suppmapid = $1; - } } # ------------------------------------------------------------ Process commands @@ -3559,6 +3561,21 @@ sub editor { $r->print(''); } + if ((!$allowed) && ($folder =~ /^supplemental_\d+$/)) { + my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom); + if (ref($supplemental) eq 'HASH') { + if ((ref($supplemental->{'hidden'}) eq 'HASH') && + (ref($supplemental->{'ids'}) eq 'HASH')) { + if (ref($supplemental->{'ids'}->{"/uploaded/$coursedom/$coursenum/$folder.$container"}) eq 'ARRAY') { + my $mapnum = $supplemental->{'ids'}->{"/uploaded/$coursedom/$coursenum/$folder.$container"}->[0]; + if ($supplemental->{'hidden'}->{$mapnum}) { + $ishidden = 1; + } + } + } + } + } + my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups); %filters = ( canremove => [], @@ -3583,14 +3600,16 @@ sub editor { } if (($supplementalflag) && (!$allowed) && (!$env{'request.role.adv'})) { - next if ($supphidden{$suppmapid.':'.$res}); + if (($ishidden) || ((&LONCAPA::map::getparameter($res,'parameter_hiddenresource'))[0]=~/^yes$/i)) { + $idx++; + next; + } } $output .= &entryline($idx,$name,$url,$folder,$allowed,$res, $coursenum,$coursedom,$crstype, $pathitem,$supplementalflag,$container, \%filters,\%curr_groups,$ltitoolsref,$canedit, - $isencrypted,$navmapref,$hostname, - \%supphidden,\%suppids,$suppmapid); + $isencrypted,$ishidden,$navmapref,$hostname); $idx++; $shown++; } @@ -3972,13 +3991,14 @@ sub is_supplemental_title { sub entryline { my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom, $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups, - $ltitoolsref,$canedit,$isencrypted,$navmapref,$hostname, - $supphidden,$suppids,$suppmapid)=@_; - my ($foldertitle,$renametitle,$oldtitle); + $ltitoolsref,$canedit,$isencrypted,$ishidden,$navmapref,$hostname)=@_; + my ($foldertitle,$renametitle,$oldtitle,$encodedtitle); if (&is_supplemental_title($title)) { ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title); + $encodedtitle=$title; } else { $title=&HTML::Entities::encode($title,'"<>&\''); + $encodedtitle=$title; $renametitle=$title; $foldertitle=$title; } @@ -4205,6 +4225,7 @@ END my $ispage; my $containerarg; my $folderurl; + my $plainurl; if ($uploaded) { if (($extension eq 'sequence') || ($extension eq 'page')) { $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/; @@ -4223,7 +4244,7 @@ END $url='/adm/supplemental?'; } } else { - &Apache::lonnet::allowuploaded('/adm/coursedoc',$url); + $plainurl = $url; } } @@ -4349,6 +4370,22 @@ END } $nomodal = 1; } + } elsif (($uploaded) && (!$allowed) && ($url ne '/adm/supplemental?')) { + my $embstyle=&Apache::loncommon::fileembstyle($extension); + unless ($embstyle eq 'ssi') { + if (($embstyle eq 'img') + || ($embstyle eq 'emb') + || ($embstyle eq 'wrp')) { + $url='/adm/wrapper'.$url; + } elsif ($url !~ /\.(sequence|page)$/) { + $url='/adm/coursedocs/showdoc'.$url; + } + } + } + unless ($allowed && $env{'request.role.adv'}) { + if ($ishidden || (&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) { + $hiddenres = 1; + } } } my ($rand_pick_text,$rand_order_text,$hiddenfolder); @@ -4360,10 +4397,8 @@ END if (!$allowed && $supplementalflag) { $folderpath.=$containerarg.'&'.$foldername; $url.='folderpath='.&escape($folderpath); - if (ref($supphidden) eq 'HASH') { - if ($supphidden->{$suppmapid.':'.$residx}) { - $hiddenfolder = 1; - } + if ($ishidden || (&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) { + $hiddenfolder = 1; } } else { my $rpicknum = (&LONCAPA::map::getparameter($orderidx, @@ -4450,7 +4485,7 @@ $form_end; $url .= ($url =~ /\?/) ? '&':'?'; $url .= 'folderpath='.&HTML::Entities::encode($esc_path,'<>&"'); if ($title) { - $url .= '&title='.&HTML::Entities::encode($renametitle,'<>&"'); + $url .= '&title='.$encodedtitle; } if ((($isexternal) || ($isexttool)) && $orderidx) { $url .= '&idx='.$orderidx; @@ -4458,11 +4493,6 @@ $form_end; if ($anchor ne '') { $url .= '&anchor='.&HTML::Entities::encode($anchor,'"<>&'); } - if (ref($supphidden) eq 'HASH') { - if ($supphidden->{$suppmapid.':'.$residx}) { - $hiddenres = 1; - } - } } my ($tdalign,$tdwidth); if ($allowed) { @@ -4521,9 +4551,18 @@ $form_end; } } $line.=''; - my $link; + my ($link,$nolink); if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { - $line.=''; + if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage) { + if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) { + $nolink = 1; + } + } + if ($nolink) { + $line .= ''; + } else { + $line.=''; + } } elsif ($url) { if ($anchor ne '') { if ($supplementalflag) { @@ -4538,7 +4577,14 @@ $form_end; $link = $url; } $link = &js_escape($link.(($url=~/\?/)?'&':'?').'inhibitmenu=yes'.$anchor); - if ($nomodal) { + if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage && !$uploaded) { + if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) { + $nolink = 1; + } + } + if ($nolink) { + $line.=''; + } elsif ($nomodal) { $line.=''. ''; } else { @@ -4550,7 +4596,11 @@ $form_end; } $line.=''; if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { - $line.=''.$title.''; + if ($nolink) { + $line.=$title; + } else { + $line.=''.$title.''; + } if (!$allowed && $supplementalflag && $canedit && $isfolder) { my $editicon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png'; my $editurl = $url; @@ -4563,7 +4613,9 @@ $form_end; $line.= ' ('.&mt('hidden').') '; } } elsif ($url) { - if ($nomodal) { + if ($nolink) { + $line.=$title; + } elsif ($nomodal) { $line.=''. $title.''; } else { @@ -4582,6 +4634,11 @@ $form_end; $line .= ''; $rand_pick_text = ' ' if ($rand_pick_text eq ''); $rand_order_text = ' ' if ($rand_order_text eq ''); + if ($uploaded && $url && !$isfolder && !$ispage) { + if (($plainurl ne '') && ($env{'request.role.adv'} || $allowed || !$hiddenres)) { + &Apache::lonnet::allowuploaded('/adm/coursedoc',$plainurl); + } + } if ($allowed) { my %lt=&Apache::lonlocal::texthash( 'hd' => 'Hidden', @@ -5644,11 +5701,14 @@ sub handler { if ($env{'form.tools'}) { $toolsflag=1; } if ($env{'form.folderpath'} ne '') { - &validate_folderpath($supplementalflag); + &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom); } + my $backto_supppath; if ($env{'form.supppath'} ne '') { - &validate_suppath(); + if ($supplementalflag && $allowed) { + $backto_supppath = &validate_supppath($coursenum,$coursedom); + } } my $script=''; @@ -5669,10 +5729,10 @@ sub handler { &Apache::loncommon::symb_to_docspath($env{'form.symb'},\$navmap); &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}.'_'.$env{'form.symb'}}); - } elsif ($env{'form.supppath'} ne '') { + } elsif (($env{'form.supppath'} ne '') && $supplementalflag && $allowed) { $env{'form.folderpath'}=$env{'form.supppath'}; &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => - $env{'form.command'}.'_'.$env{'form.supppath'}}); + $env{'form.command'}.'_'.$backto_supppath}); } } elsif ($env{'form.command'} eq 'editdocs') { $env{'form.folderpath'} = &default_folderpath($coursenum,$coursedom,\$navmap); @@ -5708,7 +5768,7 @@ sub handler { undef($env{'form.folderpath'}); } if ($env{'form.folderpath'} ne '') { - &validate_folderpath($supplementalflag); + &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom); } } @@ -5724,10 +5784,10 @@ sub handler { .'&'. $env{'form.folderpath'}; } -# If allowed and user's role is not advanced check folderpath is not hidden - if (($allowed) && (!$env{'request.role.adv'}) && - ($env{'form.folderpath'} ne '') && (!$supplementalflag)) { - my $folderurl; +# If allowed and user's role is not advanced check folderpath is not hidden + my $hidden_and_empty; + if (($allowed) && (!$env{'request.role.adv'}) && ($env{'form.folderpath'} ne '')) { + my ($folderurl,$foldername,$hiddenfolder); my @pathitems = split(/\&/,$env{'form.folderpath'}); my $folder = $pathitems[-2]; if ($folder eq '') { @@ -5739,21 +5799,74 @@ sub handler { } else { $folderurl .= '.sequence'; } - unless (ref($navmap)) { - $navmap = Apache::lonnavmaps::navmap->new(); - } - if (ref($navmap)) { - if (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') { - my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1); - unless (@resources) { - undef($env{'form.folderpath'}); + if ($supplementalflag) { + ($foldername,$hiddenfolder) = ($pathitems[-1] =~ /^([^:]*)::(|1):::$/); + $foldername = &HTML::Entities::decode(&unescape($foldername)); + my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom); + if (ref($supplemental) eq 'HASH') { + my ($suppmap,$suppmapnum); + if ($folder eq 'supplemental') { + $suppmap = 'default'; + $suppmapnum = 0; + } elsif ($folder =~ /^supplemental_(\d+)$/) { + $suppmap = $1; + $suppmapnum = $suppmap; + } + if ($hiddenfolder) { + my $hascontent; + foreach my $key (reverse(sort(keys(%{$supplemental->{'ids'}})))) { + if ($key =~ m{^\Q/uploaded/$coursedom/$coursenum/supplemental/$suppmap/\E}) { + $hascontent = 1; + } elsif (ref($supplemental->{'ids'}->{$key}) eq 'ARRAY') { + foreach my $id (@{$supplemental->{'ids'}->{$key}}) { + if ($id =~ /^$suppmapnum\:/) { + $hascontent = 1; + last; + } + } + } + last if ($hascontent); + } + unless ($hascontent) { + if ($foldername ne '') { + $hidden_and_empty = $foldername; + } else { + $hidden_and_empty = $folder; + } + } + } + } + } else { + unless (ref($navmap)) { + $navmap = Apache::lonnavmaps::navmap->new(); + } + ($foldername,$hiddenfolder) = ($pathitems[-1] =~ /^([^:]*):|\d+:|1:(|1):|1:|1$/); + $foldername = &HTML::Entities::decode(&unescape($foldername)); + if (ref($navmap)) { + if ($hiddenfolder || + (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes')) { + my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1); + unless (@resources) { + if ($foldername ne '') { + $hidden_and_empty = $foldername; + } else { + $hidden_and_empty = $folder; + } + } } } } + if ($hidden_and_empty ne '') { + splice(@pathitems,-2); + if (@pathitems) { + $env{'form.folderpath'} = join('&',@pathitems); + } else { + undef($env{'form.folderpath'}); + } + } } } - # If after all of this, we still don't have any paths, make them unless ($env{'form.folderpath'}) { if ($supplementalflag) { @@ -5847,8 +5960,14 @@ sub handler { &inject_data_js(). &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr,$tid). &Apache::lonextresedit::extedit_javascript(\%ltitools); + my $onload = "javascript:resize_scrollbox('contentscroll','1','1');"; + if ($hidden_and_empty ne '') { + my $alert = &mt("Additional privileges required to edit empty and hidden folder: '[_1]'", + $hidden_and_empty); + $onload .= "javascript:alert('".&js_escape($alert)."');"; + } $addentries = { - onload => "javascript:resize_scrollbox('contentscroll','1','1');", + onload => $onload, }; } $script .= &paste_popup_js(); @@ -5872,7 +5991,8 @@ sub handler { if ($showdoc) { my $args; if ($supplementalflag) { - my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$env{'form.title'},1); + my $title = &HTML::Entities::encode($env{'form.title'},'\'"<>&'); + my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); $args = {'bread_crumbs' => $brcrum}; } else { $args = {'force_register' => $showdoc}; @@ -5931,6 +6051,7 @@ sub handler { my %codebase = (); my ($upload_result,$upload_output,$uploadphase); if ($canedit) { + undef($suppchanges); if (($env{'form.uploaddoc.filename'}) && ($env{'form.cmd'}=~/^upload_(\w+)/)) { my $context = $1; @@ -5942,6 +6063,10 @@ sub handler { if ($hadchanges) { &mark_hash_old(); } + if ($suppchanges) { + &Apache::lonnet::update_supp_caches($coursedom,$coursenum); + undef($suppchanges); + } $r->print($upload_output); } elsif ($env{'form.phase'} eq 'upload_embedded') { # Process file upload - phase two - upload embedded objects @@ -6010,6 +6135,7 @@ sub handler { 'stpr' => 'Standard Problem', 'news' => 'New sub-directory', 'crpr' => 'Create Problem', + 'swit' => 'Switch Server', 'drbx' => 'Drop Box', 'scuf' => 'External Scores (handgrade, upload, clicker)', 'bull' => 'Discussion Board', @@ -6168,12 +6294,12 @@ FUFORM SEDFFORM my $importcrsresform; my ($numdirs,$pickfile) = - &Apache::loncommon::import_crsauthor_form('crsresimportform','coursepath','coursefile', + &Apache::loncommon::import_crsauthor_form('coursepath','coursefile', "resize_scrollbox('contentscroll','1','0');", undef,'res'); if ($pickfile) { $importcrsresform=(< + $lt{'imcr'}$help{'Course_Resources'}
CRSFORM @@ -6204,7 +6330,7 @@ CRSFORM { ''.$lt{impm}.'' => $importpubform }, ); if ($pickfile) { - push(@importpubforma,{ ''.$lt{imcr}.'' => $importcrsresform}); + push(@importpubforma,{ ''.$lt{imcr}.'' => $importcrsresform}); } $importpubform = &create_form_ul(&create_list_elements(@importpubforma)); my $extresourcesform = @@ -6406,35 +6532,39 @@ NROSTFORM NWEBFORM my @ids=&Apache::lonnet::current_machine_ids(); - my %select_menus; + my (%select_menus,$rolehomes); my $numauthor = 0; my $numcrsdirs = 0; + my ($showstdprob,$showswitch,$switchlink); my $toppath = "/priv/$env{'user.domain'}/$env{'user.name'}"; + my $exclude = &Apache::lonnet::priv_exclude(); if ($env{'user.author'}) { $numauthor ++; $select_menus{'author'}->{'text'} = &Apache::lonnet::plaintext('au'); if (grep(/^\Q$env{'user.home'}\E$/,@ids)) { my $is_home = 1; my %subdirs; - &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs); + &Apache::lonnet::recursedirs($is_home,1,'',$exclude,0,$toppath,'',\%subdirs); $select_menus{'author'}->{'default'} = '/'; - $select_menus{'author'}->{'select2'}->{'/'} = '/'; - my @ordered = ('/'); + my @ordered = (); foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) { $select_menus{'author'}->{'select2'}->{$relpath} = $relpath; push(@ordered,$relpath); } $select_menus{'author'}->{'order'} = \@ordered; + $showstdprob = 'block'; } else { + $rolehomes = ''."\n"; $select_menus{'author'}->{'select2'}->{'switch'} = &mt('Switch server required'); $select_menus{'author'}->{'default'} = 'switch'; $select_menus{'author'}->{'order'} = ['switch']; + $showstdprob = 'none'; } } my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles', ['active'],['ca','aa']); my $crshome = $env{'course.'.$env{'request.course.id'}.'.home'}; - my %by_roletype; + my (%by_roletype,%at_home); if (keys(%roleshash)) { foreach my $entry (keys(%roleshash)) { my ($auname,$audom,$roletype) = split(/:/,$entry); @@ -6444,19 +6574,19 @@ NWEBFORM $select_menus{$key}->{'text'} = &Apache::lonnet::plaintext($roletype)." ($audom/$auname)"; my $rolehome = &Apache::lonnet::homeserver($auname,$audom); if (grep(/^\Q$rolehome\E$/,@ids)) { + $at_home{$auname.'___'.$audom} = 1; my $is_home = 1; my (%subdirs,@ordered); my $toppath="/priv/$audom/$auname"; - &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs); + &Apache::lonnet::recursedirs($is_home,1,'',$exclude,0,$toppath,'',\%subdirs); $select_menus{$key}->{'default'} = '/'; - $select_menus{$key}->{'select2'}->{'/'} = '/'; - my @ordered = ('/'); foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) { $select_menus{$key}->{'select2'}->{$relpath} = $relpath; push(@ordered,$relpath); } $select_menus{$key}->{'order'} = \@ordered; } else { + $rolehomes .= ''."\n"; $select_menus{$key}->{'select2'}->{'switch'} = &mt('Switch server required'); $select_menus{$key}->{'default'} = 'switch'; $select_menus{$key}->{'order'} = ['switch']; @@ -6478,6 +6608,11 @@ NWEBFORM foreach my $author (sort { lc($a) cmp lc($b) } (keys(%{$by_roletype{$possrole}}))) { unless ($defrole) { $defrole = $author; + if ($at_home{$author}) { + $showstdprob = 'block'; + } else { + $showstdprob = 'none'; + } } push(@order,$author.'___'.$possrole); } @@ -6489,17 +6624,17 @@ NWEBFORM my $is_home = 1; my %subdirs; my $toppath="/priv/$coursedom/$coursenum"; - &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs); + &Apache::lonnet::recursedirs($is_home,1,'',$exclude,0,$toppath,'',\%subdirs); $numcrsdirs = keys(%subdirs); $select_menus{'course'}->{'default'} = '/'; - $select_menus{'course'}->{'select2'}->{'/'} = '/'; - my @ordered = ('/'); + my @ordered = (); foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) { $select_menus{'course'}->{'select2'}->{$relpath} = $relpath; push(@ordered,$relpath); } $select_menus{'course'}->{'order'} = \@ordered; } else { + $rolehomes .= ''."\n"; $select_menus{'course'}->{'select2'}->{'switch'} = &mt('Switch server required'); $select_menus{'course'}->{'default'} = 'switch'; $select_menus{'course'}->{'order'} = ['switch']; @@ -6516,13 +6651,14 @@ NWEBFORM $showtitle = 'inline'; if (grep(/^\Q$crshome\E$/,@ids)) { $is_home = 1; + $showstdprob = 'block'; $pickdir .= ''; my $toppath="/priv/$coursedom/$coursenum'}"; my %subdirs; - &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs); + &Apache::lonnet::recursedirs($is_home,1,'',$exclude,0,$toppath,'',\%subdirs); $numcrsdirs = keys(%subdirs); if ($numcrsdirs) { - $pickdir .= &mt('Directory: ').''."\n". ''."\n"; foreach my $key (sort { lc($a) cmp lc($b) } (keys(%subdirs))) { $pickdir .= ''."\n"; @@ -6531,8 +6667,30 @@ NWEBFORM } else { $pickdir .= ''."\n"; } + } else { + $showstdprob = 'none'; + $rolehomes .= ''."\n"; + my @order; + $select_menus{'course'}->{'text'} = &mt('Course Resource'); + $select_menus{'course'}->{'select2'}->{'switch'} = &mt('Switch server required'); + $select_menus{'course'}->{'default'} = 'switch'; + $select_menus{'course'}->{'order'} = ['switch']; + push(@order,'course'); + my $defrole = 'course'; + $pickdir = $lt{'loca'}. + &Apache::loncommon::linked_select_forms('courseresform','
'.$lt{'dire'}, + $defrole,'authorrole','authorpath', + \%select_menus,\@order,'toggleCrsResTitle();', + '','priv').'
'; + $showtitle = 'none'; + } } + if ($showstdprob eq 'none') { + $showswitch = 'block'; + } else { + $showswitch = 'none'; + } my %seltemplate_menus; my @files = &Apache::lonhomework::get_template_list('problem'); @@ -6583,6 +6741,7 @@ NWEBFORM

$pickdir +

$lt{'news'}?    @@ -6618,6 +6777,11 @@ NWEBFORM +
+
+ $rolehomes + +
@@ -6766,7 +6930,7 @@ unless ($container eq 'page') { unless ($supplementalflag) { $folder='supplemental'; } - if ($folder =~ /^supplemental$/ && + if (($folder eq 'supplemental') && (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) { $env{'form.folderpath'} = &supplemental_base(); } elsif ($allowed) { @@ -6903,26 +7067,7 @@ my %suporderhash = ( $r->print('

'.$error.'

'); } if ($suppchanges) { - my %servers = &Apache::lonnet::internet_dom_servers($coursedom); - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $server (keys(%servers)) { - next if (grep(/^\Q$server\E$/,@ids)); - my $hashid=$coursenum.':'.$coursedom; - my $cachekey = &escape('showsupp').':'.&escape($hashid); - &Apache::lonnet::remote_devalidate_cache($server,[$cachekey]); - } - &Apache::lonnet::has_unhidden_suppfiles($coursenum,$coursedom,1); - &Apache::lonnet::count_supptools($coursenum,$coursedom,1); - my $now = time; - if ($env{'request.course.id'} eq $coursedom.'_'.$coursenum) { - &Apache::lonnet::appenv({'request.course.suppupdated' => $now}); - } - &Apache::lonnet::put('environment',{'internal.supplementalchange' => $now}, - $coursedom,$coursenum); - &Apache::lonnet::appenv( - {'course.'.$coursedom.'_'.$coursenum.'.internal.supplementalchange' => $now}); - &Apache::lonnet::do_cache_new('suppchange',$coursedom.'_'.$coursenum,$now,600); - &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1); + &Apache::lonnet::update_supp_caches($coursedom,$coursenum); undef($suppchanges); } } @@ -7093,6 +7238,10 @@ sub remove_archive { if ($url eq $env{'form.archiveurl'}) { if (&handle_edit_cmd($docuname,$docudom)) { ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1); + if ($suppchanges) { + &Apache::lonnet::update_supp_caches($docudom,$docuname); + undef($suppchanges); + } if ($fatal) { if ($container eq 'page') { $delwarning = &mt('An error occurred updating the contents of the current page.'); @@ -7378,7 +7527,7 @@ sub editing_js { my $backtourl; my $toplevelmain = &escape(&default_folderpath($coursenum,$coursedom,$navmapref)); my $toplevelsupp = &supplemental_base(); - + my $showfile_js = &Apache::loncommon::show_crsfiles_js(); if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) { my $caller = $1; if ($caller =~ /^supplemental/) { @@ -7811,7 +7960,20 @@ function toggleCrsResTitle() { } else { document.getElementById('newresource').style.display = 'none'; } - } + } + if (document.getElementById('newstdproblem')) { + if (document.courseresform.authorpath.options[document.courseresform.authorpath.selectedIndex].value == 'switch') { + document.getElementById('newstdproblem').style.display = 'none'; + if (document.getElementById('stdprobswitch')) { + document.getElementById('stdprobswitch').style.display = 'block'; + } + } else { + document.getElementById('newstdproblem').style.display = 'block'; + if (document.getElementById('stdprobswitch')) { + document.getElementById('stdprobswitch').style.display = 'none'; + } + } + } } function toggleNewInCourse(form) { @@ -7891,17 +8053,14 @@ function getExample(width,height,scrolli } } -function toggleImportCrsres(caller,dircount) { +function toggleImportCrsres(caller) { var disp = 'none'; if (document.getElementById('importcrsresform')) { if (caller == 'res') { - var numdirs = parseInt(dircount); var curr = document.getElementById('importcrsresform').style.display; if (curr == 'none') { disp='block'; - if (numdirs > 1) { - select1res_changed(); - } + populateCrsSelects(document.crsresimportform,'coursepath','coursefile',1,'',1,0,1,1); } } document.getElementById('importcrsresform').style.display=disp; @@ -7909,6 +8068,58 @@ function toggleImportCrsres(caller,dirco } return; } + +$showfile_js + +function switchForProb() { + if (document.courseresform.authorpath.options[document.courseresform.authorpath.selectedIndex].value == 'switch') { + var url = '/adm/switchserver?otherserver='; + var newhostid = ''; + var role = ''; + var selloc = document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value; + if (selloc == 'author') { + newhostid = document.courseresform.rolehome_author.value; + role = "au./&js_escape($env{'user.domain'})/"; + } else if (selloc == 'course') { + newhostid = document.courseresform.rolehome_course.value; + role = "&js_escape($env{'request.role'})"; + } else { + var items = new Array(); + items = selloc.split('___'); + var len = document.courseresform.rolehome_coauthor.length; + if (null == len) { + var currval = document.courseresform.rolehome_coauthor.value; + if (null != currval) { + var info = new Array(); + info = currval.split('='); + newhostid = info[2]; + role = info[0]+'./'+info[1]; + } + } else { + for (var i=0; i