[LON-CAPA-cvs] cvs: loncom /interface londocs.pm

raeburn raeburn at source.lon-capa.org
Thu Jan 5 16:33:31 EST 2023


raeburn		Thu Jan  5 21:33:31 2023 EDT

  Modified files:              
    /loncom/interface	londocs.pm 
  Log:
  - Use ajax to dynamically update drop-down lists of directories available 
    for creation of new problems via Grading > Standard problem.
  
  
-------------- next part --------------
Index: loncom/interface/londocs.pm
diff -u loncom/interface/londocs.pm:1.690 loncom/interface/londocs.pm:1.691
--- loncom/interface/londocs.pm:1.690	Sat Dec 31 14:08:59 2022
+++ loncom/interface/londocs.pm	Thu Jan  5 21:33:31 2023
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.690 2022/12/31 14:08:59 raeburn Exp $
+# $Id: londocs.pm,v 1.691 2023/01/05 21:33:31 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -6532,165 +6532,62 @@
 NWEBFORM
 
         my @ids=&Apache::lonnet::current_machine_ids();
-        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();
+        my $machines_str = "'".join("','", at 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$/, at ids)) {
-                my $is_home = 1;
-                my %subdirs;
-                &Apache::lonnet::recursedirs($is_home,1,'',$exclude,0,$toppath,'',\%subdirs);
-                $select_menus{'author'}->{'default'} = '/'; 
-                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 = '<input type="hidden" name="rolehome_author" value="'.$env{'user.home'}.'" />'."\n";
-                $select_menus{'author'}->{'select2'}->{'switch'} = &mt('Switch server required');
-                $select_menus{'author'}->{'default'} = 'switch';
-                $select_menus{'author'}->{'order'} = ['switch'];
-                $showstdprob = 'none';
+                $is_home{'author'} = 1;
             }
+            $rolehomes = '<input type="hidden" id="rolehome_author" name="rolehome_author" value="'.$env{'user.home'}.'" />'."\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,%at_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$/, at ids)) {    
-                    $at_home{$auname.'___'.$audom} = 1;
-                    my $is_home = 1;
-                    my (%subdirs, at ordered);
-                    my $toppath="/priv/$audom/$auname";
-                    &Apache::lonnet::recursedirs($is_home,1,'',$exclude,0,$toppath,'',\%subdirs);
-                    $select_menus{$key}->{'default'} = '/';
-                    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 .= '<input type="hidden" name="rolehome_coauthor" value="'.$roletype.'='.$audom.'/'.$auname.'='.$rolehome.'" />'."\n";
-                    $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;
-                                if ($at_home{$author}) {
-                                    $showstdprob = 'block'; 
-                                } else {
-                                    $showstdprob = 'none';
-                                }
-                            }
-                            push(@order,$author.'___'.$possrole);
-                        }
-                    }
+                $toppath{$author} = "/priv/$audom/$auname";
+                if (grep(/^\Q$rolehome\E$/, at ids)) {
+                    $is_home{$author} = 1;
                 }
+                $rolehomes .= '<input type="hidden" id="rolehome_coauthor_'.$roletype.'_'.$audom.'/'.$auname.'" '.
+                              'name="rolehome_coauthor" value="'.$roletype.'='.$audom.'/'.$auname.'='.$rolehome.'" />'."\n";
             }
-            $select_menus{'course'}->{'text'} = &mt('Course Resource');
-            if (grep(/^\Q$crshome\E$/, at ids)) {
-                my $is_home = 1;
-                my %subdirs;
-                my $toppath="/priv/$coursedom/$coursenum";
-                &Apache::lonnet::recursedirs($is_home,1,'',$exclude,0,$toppath,'',\%subdirs);
-                $numcrsdirs = keys(%subdirs);
-                $select_menus{'course'}->{'default'} = '/';
-                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 .= '<input type="hidden" name="rolehome_course" value="'.$crshome.'" />'."\n";
-                $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','<br />'.$lt{'dire'},
-                                                               $defrole,'authorrole','authorpath',
-                                                               \%select_menus,\@order,'toggleCrsResTitle();',
-                                                               '','priv').'<br />';
-            $showtitle = 'none';
-        } else {
-            my $is_home;
-            $showtitle = 'inline';
-            if (grep(/^\Q$crshome\E$/, at ids)) {
-                $is_home = 1;
-                $showstdprob = 'block';
-                $pickdir .= '<input type="hidden" name="authorrole" value="course" />'; 
-                my $toppath="/priv/$coursedom/$coursenum'}";
-                my %subdirs;
-                &Apache::lonnet::recursedirs($is_home,1,'',$exclude,0,$toppath,'',\%subdirs);
-                $numcrsdirs = keys(%subdirs); 
-                if ($numcrsdirs) {
-                    $pickdir .= $lt{'dire'}.' <select name="authorpath">'."\n".
-                                 '<option value="/">/</option>'."\n";
-                    foreach my $key (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {
-                        $pickdir .= '<option value="'.$key.'">'.$key.'</option>'."\n";
+        }
+        my $crshome = $env{'course.'.$env{'request.course.id'}.'.home'};
+        if (grep(/^\Q$crshome\E$/, at ids)) {
+            $is_home{'course'} = 1;
+        }
+        $rolehomes .= '<input type="hidden" id="rolehome_course" name="rolehome_course" value="'.$crshome.'" />'."\n";
+        my $pickdir = $lt{'loca'}.
+                   '<select name="authorrole" onchange="populateDirSelects(this.form,'."'authorrole','authorpath'".',1,1,0);">'."\n".
+                   '<option value="" selected="selected">'.&mt('Select').'</option>'."\n";
+        if ($env{'user.author'}) {
+            $pickdir .= '<option value="author">'.&Apache::lonnet::plaintext('au').'</option>'."\n";
+        }
+        if (keys(%by_roletype)) {
+            foreach my $possrole ('ca','aa') {
+                if (ref($by_roletype{$possrole}) eq 'HASH') {
+                    my $roletitle = &Apache::lonnet::plaintext($possrole);
+                    foreach my $author (sort { lc($a) cmp lc($b) } (keys(%{$by_roletype{$possrole}}))) {
+                        my ($none,$where,$auname,$audom) = split(/\//,$toppath{$author});
+                        $pickdir .= '<option value="'.$author.'___'.$possrole.'">'.
+                                     $roletitle." ($audom/$auname)</option>\n";
                     }
-                    $pickdir .= '</select>';
-                } else {
-                    $pickdir .= '<input type="hidden" name="authorpath" value="/" />'."\n";   
                 }
-            } else {
-                $showstdprob = 'none';
-                $rolehomes .= '<input type="hidden" name="rolehome_course" value="'.$crshome.'" />'."\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','<br />'.$lt{'dire'},
-                                                                   $defrole,'authorrole','authorpath',
-                                                                   \%select_menus,\@order,'toggleCrsResTitle();',
-                                                                   '','priv').'<br />';
-                $showtitle = 'none';
-
             }
         }
-        if ($showstdprob eq 'none') {
-            $showswitch = 'block';
-        } else {
-            $showswitch = 'none';
-        }
+        $pickdir .= '<option value="course">'.&mt('Course Resource').'</option>'."\n".
+                    '</select><br />'."\n".
+                    $lt{'dire'}.
+                    '<select name="authorpath" onchange="toggleCrsResTitle();">'.
+                    '<option value=""></option>'.
+                    '</select><br />'."\n";
 
         my %seltemplate_menus;
         my @files = &Apache::lonhomework::get_template_list('problem');
@@ -6733,7 +6630,7 @@
         my $templatepreview =  '<a href="#" target="sample" onclick="javascript:getExample(600,420,\'yes\',true);  return false;">'.
                                '<span id="newresexample">'.&mt('Example').'<span></a>';
         my $crsresform=(<<RESFORM);
-        <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res','$numauthor','$numcrsdirs');">
+        <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res');">
         $lt{'stpr'}</a>$help{'Course_Resource'}
         <form action="/adm/coursedocs" method="post" name="courseresform">
         <fieldset id="crsresform" style="display:none;">
@@ -6741,7 +6638,7 @@
         <input type="hidden" name="active" value="bb" />
         <p>
         $pickdir
-        <div id="newstdproblem" style="display:$showstdprob;">
+        <div id="newstdproblem" style="display:none;">
         <span class="LC_nobreak">$lt{'news'}? 
         <label><input type="radio" name="newsubdir" value="0" onclick="toggleNewsubdir(this.form);" checked="checked" $disabled />No</label>
          
@@ -6752,7 +6649,7 @@
         $lt{'fnam'}
         <input type="text" size="20" name="newresourcename" autocomplete="off" $disabled />
         <p>
-        <div id="newresource" style="display:$showtitle">
+        <div id="newresource" style="display:none">
         $lt{'addp'}
         <label><input type="radio" name="newresourceadd" value="0" checked="checked" onclick="toggleNewInCourse(this.form);" $disabled />
         $lt{'no'}</label>  
@@ -6778,7 +6675,7 @@
         <input type="submit" name="newcrs" value="$lt{'crpr'}" $disabled />
         </span>
         </div>
-        <div id="stdprobswitch" style="display:$showswitch;">
+        <div id="stdprobswitch" style="display:none;">
         $rolehomes
         <input type="button" name="switchfornewprob" value="$lt{'swit'}" onclick="switchForProb();" />
         </div>
@@ -6880,7 +6777,7 @@
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform},
-        {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{stpr}.'" onclick="javascript:toggleCrsRes(\'res\','."'$numauthor','$numcrsdirs'".');" />'=>$crsresform},
+        {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{stpr}.'" onclick="javascript:toggleCrsRes(\'res\');" />'=>$crsresform},
         );
         $gradingform = &create_form_ul(&create_list_elements(@gradingforma));
 
@@ -7516,6 +7413,8 @@
                                           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();
@@ -7528,6 +7427,8 @@
     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("','", at ids)."'";
     if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {
         my $caller = $1;
         if ($caller =~ /^supplemental/) {
@@ -7879,27 +7780,21 @@
     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;
@@ -7953,7 +7848,8 @@
 
 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);
@@ -8071,6 +7967,97 @@
 
 $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=';


More information about the LON-CAPA-cvs mailing list