--- loncom/interface/londocs.pm 2016/11/26 19:40:44 1.616 +++ loncom/interface/londocs.pm 2017/01/24 15:52:58 1.619 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.616 2016/11/26 19:40:44 raeburn Exp $ +# $Id: londocs.pm,v 1.619 2017/01/24 15:52:58 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -142,7 +142,43 @@ sub clean { return $title; } - +sub default_folderpath { + my ($coursenum,$coursedom,$navmapref) = @_; + return unless ($coursenum && $coursedom && ref($navmapref)); +# Check if entire course is hidden and/or encrypted + my ($hiddenmap,$encryptmap,$folderpath,$hiddentop); + my $toplevel = "uploaded/$coursedom/$coursenum/default.sequence"; + unless (ref($$navmapref)) { + $$navmapref = Apache::lonnavmaps::navmap->new(); + } + if (ref($$navmapref)) { + if (lc($$navmapref->get_mapparam(undef,$toplevel,"0.hiddenresource")) eq 'yes') { + my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) }; + my @resources = $$navmapref->retrieveResources($toplevel,$filterFunc,1,1); + unless (@resources) { + $hiddenmap = 1; + unless ($env{'request.role.adv'}) { + $hiddentop = 1; + if ($env{'form.folder'}) { + undef($env{'form.folder'}); + } + } + } + } + if (lc($$navmapref->get_mapparam(undef,$toplevel,"0.encrypturl")) eq 'yes') { + $encryptmap = 1; + } + } + unless ($hiddentop) { + $folderpath='default&'.&escape(&mt('Main Content')). + '::'.$hiddenmap.':'.$encryptmap.'::'; + } + if (wantarray) { + return ($folderpath,$hiddentop); + } else { + return $folderpath; + } +} sub dumpcourse { my ($r) = @_; @@ -879,11 +915,12 @@ sub log_docs { sub docs_change_log { my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath,$canedit)=@_; my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); + my $navmap; my $js = '<script type="text/javascript">'."\n". '// <![CDATA['."\n". &Apache::loncommon::display_filter_js('docslog')."\n". &editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag, - $coursedom,$coursenum,'','',$canedit)."\n". + $coursedom,$coursenum,'','',$canedit,\$navmap)."\n". &history_tab_js()."\n". &Apache::lonratedt::editscript('simple')."\n". '// ]]>'."\n". @@ -899,8 +936,9 @@ sub docs_change_log { } my $folderpath=$env{'form.folderpath'}; if ($folderpath eq '') { - $folderpath = 'default&'.&escape(&mt('Main Content').':::::'); + $folderpath = &default_folderpath($coursenum,$coursedom,\$navmap); } + undef($navmap); $pathitem = '<input type="hidden" name="folderpath" value="'. &HTML::Entities::encode($folderpath,'<>&"').'" />'; my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; @@ -3297,6 +3335,7 @@ sub editor { if ($url =~ m{/uploaded/.+\.(page|sequence)$}) { push(@allmapidx,$res); } + $output .= &entryline($idx,$name,$url,$folder,$allowed,$res, $coursenum,$coursedom,$crstype, $pathitem,$supplementalflag,$container, @@ -3784,7 +3823,7 @@ END 'sv' => 'Save', 'ul' => 'URL', 'ti' => 'Title', - 'er' => 'Editing rights unavailable for your current role', + 'er' => 'Editing rights unavailable for your current role.', ); my %denied = &action_restrictions($coursenum,$coursedom,$url, $env{'form.folderpath'}, @@ -3930,7 +3969,7 @@ END } } - my ($editlink,$extresform,$anchor); + my ($editlink,$extresform,$anchor,$hiddenres); my $orig_url = $url; $orig_url=~s{http(:|:)//https(:|:)//}{https$2//}; $url=~s{^http(|s)(:|:)//}{/adm/wrapper/ext/}; @@ -3964,7 +4003,18 @@ END } } } - $url.=(($url=~/\?/)?'&':'?').'symb='.&HTML::Entities::encode($shownsymb,'"<>&'); + unless ($env{'request.role.adv'}) { + if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) { + $url = ''; + } + if (&Apache::lonnet::EXT('resource.0.hiddenresource',$symb) =~ /^yes$/i) { + $url = ''; + $hiddenres = 1; + } + } + if ($url ne '') { + $url.=(($url=~/\?/)?'&':'?').'symb='.&HTML::Entities::encode($shownsymb,'"<>&'); + } } elsif (!$env{'request.role.adv'}) { my $checkencrypt; if (((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) || @@ -4007,6 +4057,7 @@ END } } my ($rand_pick_text,$rand_order_text,$hiddenfolder); + my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) }; if ($isfolder || $ispage || $extension eq 'sequence' || $extension eq 'page') { my $foldername=&escape($foldertitle); my $folderpath=$env{'form.folderpath'}; @@ -4015,39 +4066,44 @@ END $folderpath.=$containerarg.'&'.$foldername; $url.='folderpath='.&escape($folderpath); } else { -# Append randompick number, hidden, and encrypted with ":" to foldername, -# so it gets transferred between levels - $folderpath.=$containerarg.'&'.$foldername. - ':'.(&LONCAPA::map::getparameter($orderidx, - 'parameter_randompick'))[0] - .':'.((&LONCAPA::map::getparameter($orderidx, - 'parameter_hiddenresource'))[0]=~/^yes$/i) - .':'.((&LONCAPA::map::getparameter($orderidx, - 'parameter_encrypturl'))[0]=~/^yes$/i) - .':'.((&LONCAPA::map::getparameter($orderidx, - 'parameter_randomorder'))[0]=~/^yes$/i) - .':'.$ispage; - if (!$env{'request.role.adv'}) { - if (lc((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]) eq 'yes') { - $url = ''; - $hiddenfolder = 1; - } else { - unless (ref($$navmapref)) { - $$navmapref = Apache::lonnavmaps::navmap->new(); - } - if (ref($$navmapref)) { - if (lc($$navmapref->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') { - $url = ''; - $hiddenfolder = 1; + my $rpicknum = (&LONCAPA::map::getparameter($orderidx, + 'parameter_randompick'))[0]; + my $randorder = ((&LONCAPA::map::getparameter($orderidx, + 'parameter_randomorder'))[0]=~/^yes$/i); + my $hiddenmap = ((&LONCAPA::map::getparameter($orderidx, + 'parameter_hiddenresource'))[0]=~/^yes$/i); + my $encryptmap = ((&LONCAPA::map::getparameter($orderidx, + 'parameter_encrypturl'))[0]=~/^yes$/i); + unless ($hiddenmap) { + unless (ref($$navmapref)) { + $$navmapref = Apache::lonnavmaps::navmap->new(); + } + if (ref($$navmapref)) { + if (lc($$navmapref->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') { + my @resources = $$navmapref->retrieveResources($folderurl,$filterFunc,1,1); + unless (@resources) { + $hiddenmap = 1; + unless ($env{'request.role.adv'}) { + $url = ''; + $hiddenfolder = 1; + } } } } } + unless ($encryptmap) { + if (lc($$navmapref->get_mapparam(undef,$folderurl,"0.encrypturl")) eq 'yes') { + $encryptmap = 1; + } + } + +# Append randompick number, hidden, and encrypted with ":" to foldername, +# so it gets transferred between levels + $folderpath.=$containerarg.'&'.$foldername. + ':'.$rpicknum.':'.$hiddenmap.':'.$encryptmap.':'.$randorder.':'.$ispage; unless ($url eq '') { $url.='folderpath='.&escape($folderpath); } - my $rpicknum = (&LONCAPA::map::getparameter($orderidx, - 'parameter_randompick'))[0]; my $rpckchk; if ($rpicknum) { $rpckchk = ' checked="checked"'; @@ -4067,7 +4123,7 @@ $form_common."\n". $rand_pick_text .= '</span></span>'. $form_end; my $ro_set; - if ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i) { + if ($randorder) { $ro_set = 'checked="checked"'; if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) { push(@{$filtersref->{'randomorder'}},$orderidx); @@ -4167,7 +4223,7 @@ $form_end; $line.=&Apache::loncommon::modal_link(&js_escape($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes'. (($anchor ne '')?$anchor:'')), $title,600,500); - } elsif ($hiddenfolder) { + } elsif (($hiddenfolder) || ($hiddenres)) { $line.=$title.' <span class="LC_warning LC_docs_reinit_warn">'.&mt('(Hidden)').'</span>'; } else { $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>'; @@ -5108,15 +5164,15 @@ sub handler { my $containertag; my $pathitem; my %ltitools; + my $hiddentop; my $navmap; - my $hiddentop; + my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) }; # Do we directly jump somewhere? - if (($env{'form.command'} eq 'direct') || ($env{'form.command'} eq 'directnav')) { if ($env{'form.symb'} ne '') { $env{'form.folderpath'}= - &Apache::loncommon::symb_to_docspath($env{'form.symb'}); + &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 '') { @@ -5125,12 +5181,10 @@ sub handler { $env{'form.command'}.'_'.$env{'form.supppath'}}); } } elsif ($env{'form.command'} eq 'editdocs') { - $env{'form.folderpath'} = 'default&'. - &escape(&mt('Main Content').':::::'); + $env{'form.folderpath'} = &default_folderpath($coursenum,$coursedom,\$navmap); &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}}); } elsif ($env{'form.command'} eq 'editsupp') { - $env{'form.folderpath'} = 'supplemental&'. - &escape('Supplemental Content'); + $env{'form.folderpath'} = &supplemental_base(); &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/supplemental'}); } elsif ($env{'form.command'} eq 'contents') { &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/navmaps'}); @@ -5178,22 +5232,27 @@ sub handler { ($env{'form.folderpath'} ne '') && (!$supplementalflag)) { my $folderurl; my @pathitems = split(/\&/,$env{'form.folderpath'}); - my $container = $pathitems[-2]; - if ($container ne '') { - $folderurl = "uploaded/$coursedom/$coursenum/$container"; + my $folder = $pathitems[-2]; + if ($folder eq '') { + undef($env{'form.folderpath'}); + } else { + $folderurl = "uploaded/$coursedom/$coursenum/$folder"; if ((split(/\:/,$pathitems[-1]))[4]) { $folderurl .= '.page'; } else { $folderurl .= '.sequence'; } - $navmap = Apache::lonnavmaps::navmap->new(); + unless (ref($navmap)) { + $navmap = Apache::lonnavmaps::navmap->new(); + } if (ref($navmap)) { if (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') { - undef($env{'form.folderpath'}); + my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1); + unless (@resources) { + undef($env{'form.folderpath'}); + } } } - } else { - undef($env{'form.folderpath'}); } } @@ -5202,29 +5261,11 @@ sub handler { unless ($env{'form.folderpath'}) { if ($supplementalflag) { $env{'form.folderpath'}=&supplemental_base(); - } else { - $env{'form.folderpath'}='default&'.&escape(&mt('Main Content'). - ':::::'); - if (($allowed) && (!$env{'request.role.adv'})) { -# If allowed and user's role is not advanced check entire course is not hidden - unless (ref($navmap)) { - $navmap = Apache::lonnavmaps::navmap->new(); - } - if (ref($navmap)) { - if (lc($navmap->get_mapparam(undef,"uploaded/$coursedom/$coursenum/default.sequence", - "0.hiddenresource")) eq 'yes') { - undef($env{'form.folderpath'}); - $hiddentop = 1; - if ($env{'form.folder'}) { - undef($env{'form.folder'}); - } - } - } - } + } elsif ($allowed) { + ($env{'form.folderpath'},$hiddentop) = &default_folderpath($coursenum,$coursedom,\$navmap); } } - # Store this unless ($toolsflag) { if (($allowed) && ($env{'form.folderpath'} ne '')) { @@ -5245,8 +5286,12 @@ sub handler { } else { if ($env{'form.folder'} eq '' || $env{'form.folder'} eq 'supplemental') { - $folderpath='default&'. - &escape(&mt('Main Content').':::::'); + if ($env{'form.folder'} eq 'supplemental') { + $folderpath=&supplemental_base(); + } elsif (!$hiddentop) { + $folderpath='default&'. + &escape(&mt('Main Content').':::::'); + } } } $containertag = '<input type="hidden" name="folderpath" value="" />'; @@ -5299,7 +5344,7 @@ sub handler { %ltitools = &Apache::lonnet::get_domain_ltitools($coursedom); my $posslti = keys(%ltitools); $script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti, - $londocroot,$canedit). + $londocroot,$canedit,\$navmap). &history_tab_js(). &inject_data_js(). &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr,$tid). @@ -5331,7 +5376,7 @@ sub handler { {'force_register' => $showdoc,})); } elsif ($toolsflag) { my ($breadtext,$breadtitle); - $breadtext = "$crstype Contents"; + $breadtext = "$crstype Editor"; if ($canedit) { $breadtitle = 'Editing '.$crstype.' Contents'; } else { @@ -5351,7 +5396,7 @@ sub handler { {'bread_crumbs' => $brcrum,})); } else { my ($breadtext,$breadtitle,$helpitem); - $breadtext = "$crstype Contents"; + $breadtext = "$crstype Editor"; if ($canedit) { $breadtitle = 'Editing '.$crstype.' Contents'; $helpitem = 'Docs_Adding_Course_Doc'; @@ -5482,7 +5527,7 @@ sub handler { 'webctce4' => 'WebCT 4 Campus Edition', 'yes' => 'Yes', 'no' => 'No', - 'er' => 'Editing rights unavailable for your current role', + 'er' => 'Editing rights unavailable for your current role.', ); # ----------------------------------------------------------------------------- @@ -5512,7 +5557,7 @@ sub handler { if ($disk_quota == 0) { $percent = 100.0; } else { - $percent = 100*($current_disk_usage/$disk_quota); + $percent = 100*($usage/$disk_quota); } $usage = sprintf("%.2f",$usage); $quota = sprintf("%.2f",$quota); @@ -6113,7 +6158,7 @@ NSYLFORM NGFFORM @specialdocumentsforma=( {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'" onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="makenew(document.newsyl);" />'=>$newsylform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.newsyl);" />'=>$newsylform}, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="javascript:makenew(document.newnav);" />'=>$newnavform}, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform}, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform}, @@ -6172,6 +6217,7 @@ unless ($container eq 'page') { my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, $supplementalflag,\%orderhash,$iconpath,$pathitem, \%ltitools,$canedit,\$navmap,$hiddentop); + undef($navmap); if ($error) { $r->print('<p><span class="LC_error">'.$error.'</span></p>'); } @@ -6290,7 +6336,7 @@ SWEBFORM my @specialdocs = ( - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="makenew(document.supnewsyl);" />' + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.supnewsyl);" />' =>$supnewsylform}, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makenew(document.supnewaboutme);" />' =>$supnewaboutmeform}, @@ -6319,7 +6365,7 @@ my %suporderhash = ( if ($supplementalflag) { my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, $supplementalflag,\%suporderhash,$iconpath,$pathitem, - \%ltitools,$canedit,\$navmap); + \%ltitools,$canedit); if ($error) { $r->print('<p><span class="LC_error">'.$error.'</span></p>'); } else { @@ -6713,7 +6759,7 @@ END } sub editing_js { - my ($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti,$londocroot,$canedit) = @_; + my ($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti,$londocroot,$canedit,$navmapref) = @_; my %js_lt = &Apache::lonlocal::texthash( p_mnf => 'Name of New Folder', t_mnf => 'New Folder', @@ -6757,7 +6803,7 @@ sub editing_js { nofi => 'No file selected', tinc => 'Title in course', sunm => 'Sub-directory name', - edri => 'Editing rights unavailable for your current role', + edri => 'Editing rights unavailable for your current role.', ); &js_escape(\%js_lt); my $crstype = &Apache::loncommon::course_type(); @@ -6766,11 +6812,10 @@ sub editing_js { if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) { $main_container_page = 1; } - my $toplevelmain = - &escape(&mt('Main Content').':::::'); + my $backtourl; + my $toplevelmain = &escape(&default_folderpath($coursenum,$coursedom,$navmapref)); my $toplevelsupp = &supplemental_base(); - my $backtourl; if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) { my $caller = $1; if ($caller =~ /^supplemental/) {