[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