--- loncom/interface/loncommon.pm 2016/06/20 15:35:42 1.1247
+++ loncom/interface/loncommon.pm 2016/07/01 19:59:35 1.1248
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.1247 2016/06/20 15:35:42 raeburn Exp $
+# $Id: loncommon.pm,v 1.1248 2016/07/01 19:59:35 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -1775,6 +1775,162 @@ RESIZE
}
sub colorfuleditor_js {
+ my $browse_or_search;
+ my $respath;
+ my ($cnum,$cdom) = &crsauthor_url();
+ if ($cnum) {
+ $respath = "/res/$cdom/$cnum/";
+ my %js_lt = &Apache::lonlocal::texthash(
+ sunm => 'Sub-directory name',
+ save => 'Save page to make this permanent',
+ );
+ &js_escape(\%js_lt);
+ $browse_or_search = <<"END";
+
+ function toggleChooser(form,element,titleid,only,search) {
+ var disp = 'none';
+ if (document.getElementById('chooser_'+element)) {
+ var curr = document.getElementById('chooser_'+element).style.display;
+ if (curr == 'none') {
+ disp='inline';
+ if (form.elements['chooser_'+element].length) {
+ for (var i=0; i
1) {
+ window['select1'+element+'_changed']();
+ }
+ }
+ }
+ document.getElementById('chooser_'+element+'_crsres').style.display = 'block';
+
+ }
+ if (document.getElementById('chooser_'+element+'_upload')) {
+ document.getElementById('chooser_'+element+'_upload').style.display = 'none';
+ if (document.getElementById('uploadcrsres_'+element)) {
+ document.getElementById('uploadcrsres_'+element).value = '';
+ }
+ }
+ return;
+ }
+
+ function toggleCrsUpload(form,element,numcrsdirs) {
+ if (document.getElementById('chooser_'+element+'_crsres')) {
+ document.getElementById('chooser_'+element+'_crsres').style.display = 'none';
+ }
+ if (document.getElementById('chooser_'+element+'_upload')) {
+ var curr = document.getElementById('chooser_'+element+'_upload').style.display;
+ if (curr == 'none') {
+ if (numcrsdirs) {
+ form.elements['crsauthorpath_'+element].selectedIndex = 0;
+ form.elements['newsubdir_'+element][0].checked = true;
+ toggleNewsubdir(form,element);
+ }
+ }
+ document.getElementById('chooser_'+element+'_upload').style.display = 'block';
+ }
+ return;
+ }
+
+ function toggleResImport(form,element) {
+ var choices = new Array('crsres','upload');
+ for (var i=0; i$js_lt{sunm}';
+ }
+ } else {
+ document.getElementById('newsubdirname_'+element).type = "hidden";
+ document.getElementById('newsubdirname_'+element).value = "";
+ document.getElementById('newsubdir_'+element).innerHTML = "";
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ function updateCrsFile(form,element) {
+ var directory = form.elements['coursepath_'+element];
+ var filename = form.elements['coursefile_'+element];
+ var path = directory.options[directory.selectedIndex].value;
+ var file = filename.options[filename.selectedIndex].value;
+ form.elements[element].value = '$respath';
+ if (path == '/') {
+ form.elements[element].value += file;
+ } else {
+ form.elements[element].value += path+'/'+file;
+ }
+ unClean();
+ if (document.getElementById('previewimg_'+element)) {
+ document.getElementById('previewimg_'+element).src = form.elements[element].value;
+ var newsrc = document.getElementById('previewimg_'+element).src;
+ }
+ if (document.getElementById('showimg_'+element)) {
+ document.getElementById('showimg_'+element).innerHTML = '($js_lt{save})';
+ }
+ toggleChooser(form,element);
+ return;
+ }
+
+ function uploadDone(suffix,name) {
+ if (name) {
+ document.forms["lonhomework"].elements[suffix].value = name;
+ unClean();
+ toggleChooser(document.forms["lonhomework"],suffix);
+ }
+ }
+
+\$(document).ready(function(){
+
+ \$(document).delegate('form :submit', 'click', function( event ) {
+ if ( \$( this ).hasClass( "LC_uploadcrsres" ) ) {
+ var buttonId = this.id;
+ var suffix = buttonId.toString();
+ suffix = suffix.replace(/^crsupload_/,'');
+ event.preventDefault();
+ document.lonhomework.target = 'crsupload_target_'+suffix;
+ document.lonhomework.action = '/adm/coursepub?LC_uploadcrsres='+suffix;
+ \$(this.form).submit();
+ document.lonhomework.target = '';
+ if (document.getElementById('crsuploadto_'+suffix)) {
+ document.lonhomework.action = document.getElementById('crsuploadto_'+suffix).value;
+ }
+ return false;
+ }
+ });
+});
+END
+ }
return <<"COLORFULEDIT"
@@ -2009,6 +2165,130 @@ sub insert_folding_button {
value=\"".&mt('Hide')."\" onclick=\"fold_box('$curDepth','$lastresource')\">";
}
+sub crsauthor_url {
+ my ($url) = @_;
+ if ($url eq '') {
+ $url = $ENV{'REQUEST_URI'};
+ }
+ my ($cnum,$cdom);
+ if ($env{'request.course.id'}) {
+ my ($audom,$auname) = ($url =~ m{^/priv/($match_domain)/($match_name)/});
+ if ($audom ne '' && $auname ne '') {
+ if (($env{'course.'.$env{'request.course.id'}.'.num'} eq $auname) &&
+ ($env{'course.'.$env{'request.course.id'}.'.domain'} eq $audom)) {
+ $cnum = $auname;
+ $cdom = $audom;
+ }
+ }
+ }
+ return ($cnum,$cdom);
+}
+
+sub import_crsauthor_form {
+ my ($form,$firstselectname,$secondselectname,$onchangefirst,$only,$suffix) = @_;
+ return (0) unless ($env{'request.course.id'});
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crshome = $env{'course.'.$env{'request.course.id'}.'.home'};
+ return (0) unless (($cnum ne '') && ($cdom ne ''));
+ my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
+ my @ids=&Apache::lonnet::current_machine_ids();
+ my ($output,$is_home,$relpath,%subdirs,%files,%selimport_menus);
+
+ if (grep(/^\Q$crshome\E$/,@ids)) {
+ $is_home = 1;
+ }
+ $relpath = "/priv/$cdom/$cnum";
+ &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$relpath,'',\%subdirs,\%files);
+ my %lt = &Apache::lonlocal::texthash (
+ fnam => 'Filename',
+ dire => 'Directory',
+ );
+ my $numdirs = scalar(keys(%files));
+ my (%possexts,$singledir,@singledirfiles);
+ if ($only) {
+ map { $possexts{$_} = 1; } split(/\s*,\s*/,$only);
+ }
+ my (%nonemptydirs,$possdirs);
+ if ($numdirs > 1) {
+ my @order;
+ foreach my $key (sort { lc($a) cmp lc($b) } (keys(%files))) {
+ if (ref($files{$key}) eq 'HASH') {
+ my $shown = $key;
+ if ($key eq '') {
+ $shown = '/';
+ }
+ my @ordered = ();
+ foreach my $file (sort { lc($a) cmp lc($b) } (keys(%{$files{$key}}))) {
+ if ($only) {
+ my ($ext) = ($file =~ /\.([^.]+)$/);
+ unless ($possexts{lc($ext)}) {
+ next;
+ }
+ }
+ $selimport_menus{$key}->{'select2'}->{$file} = $file;
+ push(@ordered,$file);
+ }
+ if (@ordered) {
+ push(@order,$key);
+ $nonemptydirs{$key} = 1;
+ $selimport_menus{$key}->{'text'} = $shown;
+ $selimport_menus{$key}->{'default'} = '';
+ $selimport_menus{$key}->{'select2'}->{''} = '';
+ $selimport_menus{$key}->{'order'} = \@ordered;
+ }
+ }
+ }
+ $possdirs = scalar(keys(%nonemptydirs));
+ if ($possdirs > 1) {
+ my @order = sort { lc($a) cmp lc($b) } (keys(%nonemptydirs));
+ $output = $lt{'dire'}.
+ &linked_select_forms($form,'
'.
+ $lt{'fnam'},'',
+ $firstselectname,$secondselectname,
+ \%selimport_menus,\@order,
+ $onchangefirst,'',$suffix).'
';
+ } elsif ($possdirs == 1) {
+ $singledir = (keys(%nonemptydirs))[0];
+ if (ref($selimport_menus{$singledir}->{'order'}) eq 'ARRAY') {
+ @singledirfiles = @{$selimport_menus{$singledir}->{'order'}};
+ }
+ delete($selimport_menus{$singledir});
+ }
+ } elsif ($numdirs == 1) {
+ $singledir = (keys(%files))[0];
+ foreach my $file (sort { lc($a) cmp lc($b) } (keys(%{$files{$singledir}}))) {
+ if ($only) {
+ my ($ext) = ($file =~ /\.([^.]+)$/);
+ unless ($possexts{lc($ext)}) {
+ next;
+ }
+ }
+ push(@singledirfiles,$file);
+ }
+ if (@singledirfiles) {
+ $possdirs == 1;
+ }
+ }
+ if (($possdirs == 1) && (@singledirfiles)) {
+ my $showdir = $singledir;
+ if ($singledir eq '') {
+ $showdir = '/';
+ }
+ $output = $lt{'dire'}.
+ '
'.
+ $lt{'fnam'}.'
'."\n";
+ }
+ return ($possdirs,$output);
+}
+
=pod
=head1 Excel and CSV file utility routines
@@ -3874,7 +4154,11 @@ category
sub filecategorytypes {
my ($cat) = @_;
- return @{$category_extensions{lc($cat)}};
+ if (ref($category_extensions{lc($cat)}) eq 'ARRAY') {
+ return @{$category_extensions{lc($cat)}};
+ } else {
+ return ();
+ }
}
=pod