--- loncom/interface/londocs.pm 2022/10/27 21:35:30 1.686 +++ loncom/interface/londocs.pm 2023/01/18 18:10:26 1.692 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.686 2022/10/27 21:35:30 raeburn Exp $ +# $Id: londocs.pm,v 1.692 2023/01/18 18:10:26 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -205,7 +205,7 @@ sub validate_supppath { $backto .= '&'.$items[$i]; my $is_hidden; unless ($got_supp) { - my ($supplemental) = &Apache::lonnet::get_supplemental($coursenum,$coursedom); + my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom); if (ref($supplemental) eq 'HASH') { if (ref($supplemental->{'hidden'}) eq 'HASH') { %supphidden = %{$supplemental->{'hidden'}}; @@ -3109,7 +3109,7 @@ sub update_parameter { my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); $name=&LONCAPA::map::qtescape($name); $url=&LONCAPA::map::qtescape($url); - next unless ($name && $url); + next unless $url; my $is_map; if ($url =~ m{/uploaded/.+\.(page|sequence)$}) { $is_map = 1; @@ -3562,7 +3562,7 @@ sub editor { } if ((!$allowed) && ($folder =~ /^supplemental_\d+$/)) { - my ($supplemental) = &Apache::lonnet::get_supplemental($coursenum,$coursedom); + my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom); if (ref($supplemental) eq 'HASH') { if ((ref($supplemental->{'hidden'}) eq 'HASH') && (ref($supplemental->{'ids'}) eq 'HASH')) { @@ -3992,11 +3992,13 @@ sub entryline { my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom, $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups, $ltitoolsref,$canedit,$isencrypted,$ishidden,$navmapref,$hostname)=@_; - my ($foldertitle,$renametitle,$oldtitle); + 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; } @@ -4483,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; @@ -5784,7 +5786,7 @@ sub handler { } # 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 '')) { + if (($allowed) && (!$env{'request.role.adv'}) && ($env{'form.folderpath'} ne '')) { my ($folderurl,$foldername,$hiddenfolder); my @pathitems = split(/\&/,$env{'form.folderpath'}); my $folder = $pathitems[-2]; @@ -5800,7 +5802,7 @@ sub handler { if ($supplementalflag) { ($foldername,$hiddenfolder) = ($pathitems[-1] =~ /^([^:]*)::(|1):::$/); $foldername = &HTML::Entities::decode(&unescape($foldername)); - my ($supplemental) = &Apache::lonnet::get_supplemental($coursenum,$coursedom); + my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom); if (ref($supplemental) eq 'HASH') { my ($suppmap,$suppmapnum); if ($folder eq 'supplemental') { @@ -5989,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}; @@ -6132,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', @@ -6290,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 @@ -6326,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 = @@ -6528,133 +6532,62 @@ NROSTFORM NWEBFORM my @ids=&Apache::lonnet::current_machine_ids(); - my %select_menus; - my $numauthor = 0; - my $numcrsdirs = 0; - my $toppath = "/priv/$env{'user.domain'}/$env{'user.name'}"; + my $machines_str = "'".join("','",@ids)."'"; + my (%is_home,%toppath,$rolehomes); 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); - $select_menus{'author'}->{'default'} = '/'; - $select_menus{'author'}->{'select2'}->{'/'} = '/'; - 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; - } else { - $select_menus{'author'}->{'select2'}->{'switch'} = &mt('Switch server required'); - $select_menus{'author'}->{'default'} = 'switch'; - $select_menus{'author'}->{'order'} = ['switch']; + $is_home{'author'} = 1; } + $rolehomes = ''."\n"; } 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; if (keys(%roleshash)) { foreach my $entry (keys(%roleshash)) { my ($auname,$audom,$roletype) = split(/:/,$entry); my $key = $entry; $key =~ s/:/___/g; - $by_roletype{$roletype}{$auname.'___'.$audom} = 1; - $select_menus{$key}->{'text'} = &Apache::lonnet::plaintext($roletype)." ($audom/$auname)"; + my $author = $auname.'___'.$audom; + $by_roletype{$roletype}{$author} = 1; my $rolehome = &Apache::lonnet::homeserver($auname,$audom); - if (grep(/^\Q$rolehome\E$/,@ids)) { - my $is_home = 1; - my (%subdirs,@ordered); - my $toppath="/priv/$audom/$auname"; - &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$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 { - $select_menus{$key}->{'select2'}->{'switch'} = &mt('Switch server required'); - $select_menus{$key}->{'default'} = 'switch'; - $select_menus{$key}->{'order'} = ['switch']; - } - $numauthor ++; - } - } - my ($pickdir,$showtitle); - if ($numauthor) { - my @order; - my $defrole; - if ($env{'user.author'}) { - push(@order,'author'); - $defrole = 'author'; - } - if (keys(%by_roletype)) { - foreach my $possrole ('ca','aa') { - if (ref($by_roletype{$possrole}) eq 'HASH') { - foreach my $author (sort { lc($a) cmp lc($b) } (keys(%{$by_roletype{$possrole}}))) { - unless ($defrole) { - $defrole = $author; - } - push(@order,$author.'___'.$possrole); - } - } + $toppath{$author} = "/priv/$audom/$auname"; + if (grep(/^\Q$rolehome\E$/,@ids)) { + $is_home{$author} = 1; } + $rolehomes .= ''."\n"; } - $select_menus{'course'}->{'text'} = &mt('Course Resource'); - if (grep(/^\Q$crshome\E$/,@ids)) { - my $is_home = 1; - my %subdirs; - my $toppath="/priv/$coursedom/$coursenum"; - &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs); - $numcrsdirs = keys(%subdirs); - $select_menus{'course'}->{'default'} = '/'; - $select_menus{'course'}->{'select2'}->{'/'} = '/'; - 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 { - $select_menus{'course'}->{'select2'}->{'switch'} = &mt('Switch server required'); - $select_menus{'course'}->{'default'} = 'switch'; - $select_menus{'course'}->{'order'} = ['switch']; - } - push(@order,'course'); - $pickdir = $lt{'loca'}. - &Apache::loncommon::linked_select_forms('courseresform','
'.$lt{'dire'}, - $defrole,'authorrole','authorpath', - \%select_menus,\@order,'toggleCrsResTitle();', - '','priv').'
'; - $showtitle = 'none'; - } else { - my $is_home; - $showtitle = 'inline'; - if (grep(/^\Q$crshome\E$/,@ids)) { - $is_home = 1; - $pickdir .= ''; - my $toppath="/priv/$coursedom/$coursenum'}"; - my %subdirs; - &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs); - $numcrsdirs = keys(%subdirs); - if ($numcrsdirs) { - $pickdir .= &mt('Directory: ').''."\n"; + my $pickdir = $lt{'loca'}. + ''; - } else { - $pickdir .= ''."\n"; } } } + $pickdir .= ''."\n". + '
'."\n". + $lt{'dire'}. + '
'."\n"; my %seltemplate_menus; my @files = &Apache::lonhomework::get_template_list('problem'); @@ -6697,7 +6630,7 @@ NWEBFORM my $templatepreview = ''. ''.&mt('Example').''; my $crsresform=(< + $lt{'stpr'}$help{'Course_Resource'}
@@ -6838,7 +6777,7 @@ NGFFORM {''.$lt{sipr}.''=>$newsmpproblemform}, {''.$lt{drbx}.''=>$newdropboxform}, {''.$lt{scuf}.''=>$newexuploadform}, - {''.$lt{stpr}.''=>$crsresform}, + {''.$lt{stpr}.''=>$crsresform}, ); $gradingform = &create_form_ul(&create_list_elements(@gradingforma)); @@ -7474,6 +7413,8 @@ sub editing_js { tinc => 'Title in course', sunm => 'Sub-directory name', edri => 'Editing rights unavailable for your current role.', + sele => 'Select', + swit => 'Switch server required', ); &js_escape(\%js_lt); my $crstype = &Apache::loncommon::course_type(); @@ -7485,7 +7426,9 @@ 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(); + my @ids=&Apache::lonnet::current_machine_ids(); + my $machines_str = "'".join("','",@ids)."'"; if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) { my $caller = $1; if ($caller =~ /^supplemental/) { @@ -7837,27 +7780,21 @@ function toggleMap(caller) { return; } -function toggleCrsRes(caller,numauthorrole,numcrsdirs) { +function toggleCrsRes(caller) { var disp = 'none'; if (document.getElementById('crsresform')) { if (caller == 'res') { - var curr = document.getElementById('crsresform').style.display; + var form = document.getElementById('crsresform'); + var curr = form.style.display; if (curr == 'none') { disp='block'; - numauthor = parseInt(numauthorrole); - if (numauthor > 0) { - document.courseresform.authorrole.selectedIndex = 0; - select1priv_changed(); - document.courseresform.authorpath.selectedIndex = 0; - document.courseresform.newresourceadd.selectedIndex = 0; - toggleNewInCourse(document.courseresform); - if (document.getElementById('newresource')) { - document.getElementById('newresource').style.display = 'none'; - } - } else { - if (numcrsdirs) { - document.courseresform.authorpath.selectedIndex = 0; - } + document.courseresform.authorrole.selectedIndex = 0; + document.courseresform.authorpath.selectedIndex = 0; + document.courseresform.newresourceadd.selectedIndex = 0; + populateDirSelects(form,'authorrole','authorpath',1,0,0); + toggleNewInCourse(document.courseresform); + if (document.getElementById('newresource')) { + document.getElementById('newresource').style.display = 'none'; } if (document.courseresform.newresusetemp.length) { document.courseresform.newresusetemp[0].checked = true; @@ -7911,14 +7848,28 @@ function toggleNewsubdir(form) { function toggleCrsResTitle() { if (document.getElementById('newresource')) { - if (document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value == 'course') { + var selloc = document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value; + if (selloc == 'course') { document.getElementById('newresource').style.display = 'inline'; document.courseresform.newresourceadd[0].checked = true; toggleNewInCourse(document.courseresform); } 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) { @@ -7998,17 +7949,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; @@ -8016,6 +7964,149 @@ function toggleImportCrsres(caller,dirco } return; } + +$showfile_js + +function populateDirSelects(form,locsel,dirsel,setdir,recurse,nonemptydir) { + var location = form.elements[locsel].options[form.elements[locsel].selectedIndex].value; + if ((setdir) && (dirsel != null) && (dirsel != 'undefined') && (dirsel != '')) { + var selelem = form.elements[dirsel]; + var i, numfiles = selelem.options.length -1; + if (numfiles >=0) { + for (i = numfiles; i >= 0; i--) { + selelem.remove(i); + } + } + if ((location == '') || (location == null) || (location == 'undefined')) { + if (selelem.options.length == 0) { + selelem.options[selelem.options.length] = new Option('',''); + selelem.selectedIndex = 0; + } + if (document.getElementById('newstdproblem')) { + document.getElementById('newstdproblem').style.display = 'none'; + } + return; + } + var machineIds = new Array($machines_str); + var athome = 0; + var role = location; + if ((location == 'author') || (location == 'course')) { + if (document.getElementById('rolehome_'+location)) { + var currhome = document.getElementById('rolehome_'+location).value; + if ((currhome != '') && (currhome != null) && (currhome != 'undefined')) { + if (machineIds.includes(currhome)) { + athome = 1; + } + } + } + } else { + const roleinfo = location.split('___'); + role = encodeURIComponent(roleinfo[0]+'./'+roleinfo[1]); + if (document.getElementById('rolehome_coauthor_'+roleinfo[1]+'_'+roleinfo[0])) { + var currhome = document.getElementById('rolehome_coauthor_'+roleinfo[1]+'_'+roleinfo[0]).value; + if ((currhome != '') && (currhome != null) && (currhome != 'undefined')) { + if (machineIds.includes(currhome)) { + athome = 1; + } + } + } + } + if (athome) { + if (document.getElementById('stdprobswitch')) { + document.getElementById('stdprobswitch').style.display = 'none'; + } + if (document.getElementById('newstdproblem')) { + document.getElementById('newstdproblem').style.display = 'none'; + } + var http = new XMLHttpRequest(); + var url = "/adm/courseauthor"; + var params = "role="+role+"&rec="+recurse+"&nonempty="+nonemptydir; + http.open("POST", url, true); + http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + http.onreadystatechange = function() { + if (http.readyState == 4 && http.status == 200) { + var data = JSON.parse(http.responseText); + if (Array.isArray(data.dirs)) { + var len = data.dirs.length; + if (len) { + if (len > 1) { + selelem.options[selelem.options.length] = new Option('$js_lt{sele}',''); + } + } + if (len) { + var j; + for (j = 0; j < len; j++) { + selelem.options[selelem.options.length] = new Option(data.dirs[j],data.dirs[j]); + } + selelem.selectedIndex = 0; + } + } + } + } + http.send(params); + } else { + selelem.options[selelem.options.length] = new Option('$js_lt{swit}','switch'); + selelem.selectedIndex = 0; + if (document.getElementById('stdprobswitch')) { + document.getElementById('stdprobswitch').style.display = 'block'; + } + if (document.getElementById('newstdproblem')) { + document.getElementById('newstdproblem').style.display = 'none'; + } + } + } + return; +} + +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