[LON-CAPA-cvs] cvs: loncom /interface loncommon.pm londocs.pm
raeburn
raeburn at source.lon-capa.org
Mon Feb 27 21:02:16 EST 2012
raeburn Tue Feb 28 02:02:16 2012 EDT
Modified files:
/loncom/interface londocs.pm loncommon.pm
Log:
- Work in progress.
- Upload archive files (.zip, .tar, .tar.gz etc.) into a course, and offer the
option to extract contents, and decide how extracted items should be deployed.
- additional javascript functions in &loncommon::archive_javascript():
dependencyCheck(), and propagateSelect()
- allow user to display/populate dropdown list used to specify which file/folder
displayed in course (i.e., to be added to a .sequence file) is the reason why
other items extracted from archive need to be preserved as dependencies.
-------------- next part --------------
Index: loncom/interface/londocs.pm
diff -u loncom/interface/londocs.pm:1.476 loncom/interface/londocs.pm:1.477
--- loncom/interface/londocs.pm:1.476 Tue Jan 31 23:47:15 2012
+++ loncom/interface/londocs.pm Tue Feb 28 02:02:16 2012
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Documents
#
-# $Id: londocs.pm,v 1.476 2012/01/31 23:47:15 raeburn Exp $
+# $Id: londocs.pm,v 1.477 2012/02/28 02:02:16 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -26,8 +26,6 @@
# http://www.lon-capa.org/
#
-
-
package Apache::londocs;
use strict;
@@ -1121,6 +1119,7 @@
newidx => $newidx,
position => $position,
phase => $nextphase,
+ comment => $comment,
);
$$upload_output = $showupload.
&Apache::loncommon::decompress_form($mimetype,
@@ -2974,6 +2973,9 @@
if ($env{'form.newidx'}) {
$hiddenelem .= '<input type="hidden" name="newidx" value="'.$env{'form.newidx'}.'" />'."\n";
}
+ if ($env{'form.comment'}) {
+ $hiddenelem .= '<input type="hidden" name="comment" value="'.$env{'form.comment'}.'" />'."\n";
+ }
return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,
$hiddenelem);
}
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.1055 loncom/interface/loncommon.pm:1.1056
--- loncom/interface/loncommon.pm:1.1055 Tue Jan 31 23:47:15 2012
+++ loncom/interface/loncommon.pm Tue Feb 28 02:02:16 2012
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.1055 2012/01/31 23:47:15 raeburn Exp $
+# $Id: loncommon.pm,v 1.1056 2012/02/28 02:02:16 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -9735,9 +9735,6 @@
}
$output .= '</p>';
$output .= <<"START";
-<p>
-$lt{'this'} $lt{'youm'}
-</p>
<div id="uploadfileresult">
<form name="uploaded_decompress" action="$action" method="post">
<input type="hidden" name="archiveurl" value="$archiveurl" />
@@ -9857,18 +9854,19 @@
}
}
if (@contents > 0) {
- my (%children,%parent);
+ my (%children,%parent,%dirorder,%titles);
my $wantform = 1;
my ($count,$datatable) = &get_extracted($docudom,$docuname,
$currdir,\%is_dir,
\%children,\%parent,
- \@contents,$wantform);
+ \@contents,\%dirorder,
+ \%titles,$wantform);
if ($datatable ne '') {
$output .= &archive_options_form('decompressed',$datatable,
$count,$hiddenelem);
- my $startcount = 3;
+ my $startcount = 4;
$output .= &archive_javascript($startcount,$count,
- %children);
+ \%titles,\%children);
}
} else {
$warning = &mt('No new items extracted from archive file.');
@@ -9891,15 +9889,19 @@
}
sub get_extracted {
- my ($docudom,$docuname,$currdir,$is_dir,$children,$parent,$contents,$wantform) = @_;
+ my ($docudom,$docuname,$currdir,$is_dir,$children,$parent,$contents,$dirorder,
+ $titles,$wantform) = @_;
my $count = 0;
- my $lastcontainer = 0;
my $depth = 0;
my $datatable;
+ my @hierarchy;
return unless ((ref($is_dir) eq 'HASH') && (ref($children) eq 'HASH') &&
- (ref($parent) eq 'HASH') && (ref($contents) eq 'ARRAY'));
+ (ref($parent) eq 'HASH') && (ref($contents) eq 'ARRAY') &&
+ (ref($dirorder) eq 'HASH') && (ref($titles) eq 'HASH'));
foreach my $item (@{$contents}) {
$count ++;
+ @{$dirorder->{$count}} = @hierarchy;
+ $titles->{$count} = $item;
&archive_hierarchy($depth,$count,$parent,$children);
if ($wantform) {
$datatable .= &archive_row($is_dir->{$item},$item,
@@ -9907,25 +9909,26 @@
}
if ($is_dir->{$item}) {
$depth ++;
- $lastcontainer = $count;
- $parent->{$depth} = $lastcontainer;
+ push(@hierarchy,$count);
+ $parent->{$depth} = $count;
$datatable .=
&recurse_extracted_archive("$currdir/$item",$docudom,$docuname,
- \$depth,\$count,\$lastcontainer,
- $children,$parent,$wantform);
+ \$depth,\$count,\@hierarchy,$dirorder,
+ $children,$parent,$titles,$wantform);
$depth --;
- $lastcontainer = $parent->{$depth};
+ pop(@hierarchy);
}
}
return ($count,$datatable);
}
sub recurse_extracted_archive {
- my ($currdir,$docudom,$docuname,$depth,$count,$lastcontainer,
- $children,$parent,$wantform) = @_;
+ my ($currdir,$docudom,$docuname,$depth,$count,$hierarchy,$dirorder,
+ $children,$parent,$titles,$wantform) = @_;
my $result='';
- unless ((ref($depth)) && (ref($count)) && (ref($lastcontainer)) &&
- (ref($children) eq 'HASH') && (ref($parent) eq 'HASH')) {
+ unless ((ref($depth)) && (ref($count)) && (ref($hierarchy) eq 'ARRAY') &&
+ (ref($children) eq 'HASH') && (ref($parent) eq 'HASH') &&
+ (ref($dirorder) eq 'HASH')) {
return $result;
}
my $dirptr = 16384;
@@ -9936,7 +9939,10 @@
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,5);
unless ($item =~ /^\.+$/) {
$$count ++;
+ @{$dirorder->{$$count}} = @{$hierarchy};
+ $titles->{$$count} = $item;
&archive_hierarchy($$depth,$$count,$parent,$children);
+
my $is_dir;
if ($dirptr&$testdir) {
$is_dir = 1;
@@ -9946,15 +9952,15 @@
}
if ($is_dir) {
$$depth ++;
- $$lastcontainer = $$count;
- $parent->{$$depth} = $$lastcontainer;
+ push(@{$hierarchy},$$count);
+ $parent->{$$depth} = $$count;
$result .=
&recurse_extracted_archive("$currdir/$item",$docudom,
$docuname,$depth,$count,
- $lastcontainer,$children,
- $parent,$wantform);
+ $hierarchy,$dirorder,$children,
+ $parent,$titles,$wantform);
$$depth --;
- $$lastcontainer = $parent->{$$depth};
+ pop(@{$hierarchy});
}
}
}
@@ -9983,8 +9989,10 @@
if ($is_dir) {
$choices{'display'} = &mt('Add as Folder');
}
- my $output = &start_data_table_row()."\n";
+ my $output = &start_data_table_row().'<td align="right">'.$count.'</td>'."\n";
+ my $offset = 0;
foreach my $action ('display','dependency','discard') {
+ $offset ++;
$output .= '<td><span class="LC_nobreak">'.
'<label><input type="radio" name="archive_'.$count.
'" id="archive_'.$action.'_'.$count.'" value="'.$action.'"';
@@ -9994,8 +10002,20 @@
if ($action eq 'display') {
$text = &mt('Add as Folder');
}
+ } else {
+ $output .= ' onclick="javascript:dependencyCheck(this.form,'."$count,$offset".');"';
+
+ }
+ $output .= ' /> '.$choices{$action}.'</label></span>';
+ if ($action eq 'dependency') {
+ $output .= '<div id="arc_depon_'.$count.'" style="display:none;">'."\n".
+ &mt('Used by:').' <select name="archive_dependent_on_'.$count.'" '.
+ 'onchange="propagateSelect(this.form,'."$count,$offset".')">'."\n".
+ '<option value=""></option>'."\n".
+ '</select>'."\n".
+ '</div>';
}
- $output .= ' /> '.$choices{$action}.'</label></span></td>';
+ $output .= '</td>';
}
$output .= '<td><input type="hidden" name="archive_content_'.$count.'" value="'.
&HTML::Entities::encode("$currdir/$item",'"<>&').'" />'.(' ' x 2);
@@ -10039,7 +10059,8 @@
}
sub archive_javascript {
- my ($startcount,$numitems,%children) = @_;
+ my ($startcount,$numitems,$titles,$children) = @_;
+ return unless ((ref($titles) eq 'HASH') && (ref($children) eq 'HASH'));
my $scripttag = <<START;
<script type="text/javascript">
// <![CDATA[
@@ -10052,6 +10073,10 @@
if (idstr.test(id)) {
if (form.elements[i].type == 'radio') {
form.elements[i].checked = true;
+ var nostart = i-$startcount;
+ var offset = nostart%6;
+ var count = (nostart-offset)/6;
+ dependencyCheck(form,count,offset);
}
}
}
@@ -10060,13 +10085,15 @@
function propagateCheck(form,count) {
if (count > 0) {
- var startelement = $startcount + (count-1) * 5;
- for (var j=1; j<4; j++) {
- var item = startelement + j;
- if (form.elements[item].type == 'radio') {
- if (form.elements[item].checked) {
- containerCheck(form,count,j);
- break;
+ var startelement = $startcount + ((count-1) * 6);
+ for (var j=1; j<5; j++) {
+ if (j != 3) {
+ var item = startelement + j;
+ if (form.elements[item].type == 'radio') {
+ if (form.elements[item].checked) {
+ containerCheck(form,count,j);
+ break;
+ }
}
}
}
@@ -10074,35 +10101,114 @@
}
numitems = $numitems
-var parents = new Array(numitems)
+var titles = new Array(numitems);
+var parents = new Array(numitems);
for (var i=0; i<numitems; i++) {
- parents[i] = new Array
+ parents[i] = new Array;
}
START
- foreach my $container (sort { $a <=> $b } (keys(%children))) {
- my @contents = split(/:/,$children{$container});
+ foreach my $container (sort { $a <=> $b } (keys(%{$children}))) {
+ my @contents = split(/:/,$children->{$container});
for (my $i=0; $i<@contents; $i ++) {
$scripttag .= 'parents['.$container.']['.$i.'] = '.$contents[$i]."\n";
}
}
+ foreach my $key (sort { $a <=> $b } (keys(%{$titles}))) {
+ $scripttag .= "titles[$key] = '".$titles->{$key}."';\n";
+ }
+
$scripttag .= <<END;
function containerCheck(form,count,offset) {
if (count > 0) {
- var item = $startcount + ((count-1) * 5) + offset;
+ dependencyCheck(form,count,offset);
+ var item = (offset+$startcount)+6*(count-1);
form.elements[item].checked = true;
if(Object.prototype.toString.call(parents[count]) === '[object Array]') {
if (parents[count].length > 0) {
for (var j=0; j<parents[count].length; j++) {
- containerCheck(form,parents[count][j],offset)
+ containerCheck(form,parents[count][j],offset);
+ }
+ }
+ }
+ }
+}
+
+function dependencyCheck(form,count,offset) {
+ if (count > 0) {
+ var chosen = (offset+$startcount)+6*(count-1);
+ var depitem = $startcount + ((count-1) * 6) + 3;
+ var currtype = form.elements[depitem].type;
+ if (form.elements[chosen].value == 'dependency') {
+ document.getElementById('arc_depon_'+count).style.display='block';
+ form.elements[depitem].options.length = 0;
+ form.elements[depitem].options[0] = new Option('Select','',true,true);
+ for (var i=1; i<count; i++) {
+ var startelement = $startcount + (i-1) * 6;
+ for (var j=1; j<5; j++) {
+ if (j != 3) {
+ var item = startelement + j;
+ if (form.elements[item].type == 'radio') {
+ if (form.elements[item].checked) {
+ if (form.elements[item].value == 'display') {
+ var n = form.elements[depitem].options.length;
+ form.elements[depitem].options[n] = new Option(titles[i],i,false,false);
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ document.getElementById('arc_depon_'+count).style.display='none';
+ form.elements[depitem].options.length = 0;
+ form.elements[depitem].options[0] = new Option('Select','',true,true);
+ }
+ }
+}
+
+function propagateSelect(form,count,offset) {
+ if (count > 0) {
+ var item = (1+offset+$startcount)+6*(count-1);
+ var picked = form.elements[item].options[form.elements[item].selectedIndex].value;
+ if (Object.prototype.toString.call(parents[count]) === '[object Array]') {
+ if (parents[count].length > 0) {
+ for (var j=0; j<parents[count].length; j++) {
+ containerSelect(form,parents[count][j],offset,picked);
}
}
}
}
}
+
+function containerSelect(form,count,offset,picked) {
+ if (count > 0) {
+ var item = (offset+$startcount)+6*(count-1);
+ if (form.elements[item].type == 'radio') {
+ if (form.elements[item].value == 'dependency') {
+ if (form.elements[item+1].type == 'select-one') {
+ for (var i=0; i<form.elements[item+1].options.length; i++) {
+ if (form.elements[item+1].options[i].value == picked) {
+ form.elements[item+1].selectedIndex = i;
+ break;
+ }
+ }
+ }
+ if (Object.prototype.toString.call(parents[count]) === '[object Array]') {
+ if (parents[count].length > 0) {
+ for (var j=0; j<parents[count].length; j++) {
+ containerSelect(form,parents[count][j],offset,picked);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
// ]]>
</script>
END
@@ -10151,19 +10257,13 @@
}
}
}
- my ($output,%children,%parent);
+ my ($output,%children,%parent,%titles,%dirorder);
if (keys(%toplevelitems) > 0) {
my @contents = sort(keys(%toplevelitems));
- my ($count,undef) = &get_extracted($docudom,$docuname,$currdir,\%is_dir,
- \%children,\%parent,\@contents);
- }
- my (@above,%hierarchy,%referrer,%orphaned,%todelete);
- foreach my $depth (sort { $a <=> $b } keys(%parent)) {
- push(@above,$parent{$depth});
- foreach my $item (split(/:/,$children{$parent{$depth}})) {
- $hierarchy{$item} = \@above;
- }
+ (my $count,undef) = &get_extracted($docudom,$docuname,$currdir,\%is_dir,\%children,
+ \%parent,\@contents,\%dirorder,\%titles);
}
+ my (%referrer,%orphaned,%todelete,%newdest,%newseqid);
if ($numitems) {
for (my $i=1; $i<=$numitems; $i++) {
my $path = $env{'form.archive_content_'.$i};
@@ -10178,9 +10278,9 @@
my ($title,$url,$outer);
($title) = ($path =~ m{/([^/]+)$});
$outer = 0;
- if (ref($hierarchy{$i}) eq 'ARRAY') {
- if (@{$hierarchy{$i}} > 0) {
- foreach my $item (reverse(@{$hierarchy{$i}})) {
+ if (ref($dirorder{$i}) eq 'ARRAY') {
+ if (@{$dirorder{$i}} > 0) {
+ foreach my $item (reverse(@{$dirorder{$i}})) {
if ($env{'form.archive_'.$item} eq 'display') {
$outer = $item;
last;
@@ -10195,7 +10295,7 @@
next if ($fatal);
if ((@archdirs > 0) && (grep(/^\Q$i\E$/, at archdirs))) {
if ($context eq 'coursedocs') {
- $mapinner{$i} = time;
+ $mapinner{$i} = time;
$folders{$i} = 'default_'.$mapinner{$i};
$containers{$i} = 'sequence';
my $url = '/uploaded/'.$docudom.'/'.$docuname.'/'.
@@ -10208,6 +10308,7 @@
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'.
$docuname.'/'.$folders{$outer}.
'.'.$containers{$outer},1);
+ $newseqid{$i} = $newidx;
}
} else {
if ($context eq 'coursedocs') {
@@ -10223,6 +10324,7 @@
}
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") {
system("mv $prefix$path $prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title");
+ $newdest{$i} = "$prefix$dir/$docstype/$mapinner{$outer}/$newidx";
}
$LONCAPA::map::resources[$newidx]=
$title.':'.$url.':false:normal:res';
@@ -10234,19 +10336,64 @@
}
}
} elsif ($env{'form.archive_'.$i} eq 'dependency') {
- if (ref($hierarchy{$i}) eq 'ARRAY') {
- foreach my $item (reverse(@{$hierarchy{$i}})) {
- if ($env{'form.archive_'.$item} eq 'display') {
- $referrer{$i} = $item;
- last;
- #FIXME identify as dependency in db file
- #FIXME need to move item to referrer location
- #FIXME need to setup httprefs so access allowed
- } elsif ($env{'form.archive_'.$item} eq 'discard') {
- $orphaned{$i} = $item;
- last;
+ my ($title) = ($path =~ m{/([^/]+)$});
+ $referrer{$i} = $env{'form.archive_dependent_on_'.$i};
+ if ($env{'form.archive_'.$referrer{$i}} eq 'display') {
+ if (ref($dirorder{$i}) eq 'ARRAY') {
+ my ($itemidx,$fullpath);
+ for (my $j=0; $j<@{$dirorder{$i}}; $j++) {
+ if (ref($dirorder{$referrer{$i}}) eq 'ARRAY') {
+ my $container = $dirorder{$referrer{$i}}->[-1];
+ for (my $j=0; $j<@{$dirorder{$i}}; $j++) {
+ if ($dirorder{$i}->[$j] eq $container) {
+ $itemidx = $j;
+ }
+ }
+ }
+ }
+ if ($itemidx ne '') {
+ if (grep(/^\Q$referrer{$i}\E$/, at archdirs)) {
+ if ($mapinner{$referrer{$i}}) {
+ $fullpath = "$prefix$dir/$docstype/$mapinner{$referrer{$i}}";
+ for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) {
+ if (grep(/^\Q$dirorder{$i}->[$j]\E$/, at archdirs)) {
+ unless (defined($newseqid{$dirorder{$i}->[$j]})) {
+ $fullpath .= '/'.$titles{$dirorder{$i}->[$j]};
+ if (!-e $fullpath) {
+ mkdir($fullpath,0755);
+ }
+ }
+ } else {
+ last;
+ }
+ }
+ }
+ } elsif ($newdest{$referrer{$i}}) {
+ $fullpath = $newdest{$referrer{$i}};
+ for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) {
+ if ($env{'form.archive_'.$dirorder{$i}->[$j]} eq 'discard') {
+ $orphaned{$i} = $env{'form.archive_'.$dirorder{$i}->[$j]};
+ last;
+ } elsif (grep(/^\Q$dirorder{$i}->[$j]\E$/, at archdirs)) {
+ unless (defined($newseqid{$dirorder{$i}->[$j]})) {
+ $fullpath .= '/'.$titles{$dirorder{$i}->[$j]};
+ if (!-e $fullpath) {
+ mkdir($fullpath,0755);
+ }
+ }
+ } else {
+ last;
+ }
+ }
+ }
+ if ($fullpath ne '') {
+ system("mv $prefix$path $fullpath/$title");
+ }
}
}
+ } elsif ($env{'form.archive_'.$referrer{$i}} eq 'discard') {
+ $warning .= &mt('[_1] is a dependency of [_2], which was discarded.',
+ $path,$env{'form.archive_content_'.$referrer{$i}}).'<br />';
}
}
} else {
More information about the LON-CAPA-cvs
mailing list