--- rat/lonratedt.pm 2002/05/13 14:33:50 1.11 +++ rat/lonratedt.pm 2002/05/22 20:39:59 1.27 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Edit Handler for RAT Maps # -# $Id: lonratedt.pm,v 1.11 2002/05/13 14:33:50 www Exp $ +# $Id: lonratedt.pm,v 1.27 2002/05/22 20:39:59 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,8 +37,8 @@ use Apache::Constants qw(:common); use Apache::lonnet; use Apache::lonratsrv; -my @order=(); -my @resources=(); +my @order; +my @resources; # Mapread read maps into global arrays @links and @resources, determines status @@ -52,6 +52,8 @@ sub mapread { undef @links; undef @resources; undef @order; + @resources=(''); + @order=(); my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,''); if ($errtext) { return ($errtext,2); } @@ -88,7 +90,7 @@ sub mapread { } } - for (my $i=0; $i<=$#resources; $i++) { + for (my $i=1; $i<=$#resources; $i++) { if (defined($resources[$i])) { unless (($starters[$i]) || ($endings[$i])) { return @@ -126,6 +128,117 @@ sub mapread { return $errtext; } +# ---------------------------------------------- Read a map as well as possible + +sub attemptread { + my $fn=shift; + + my @links; + undef @links; + my @theseres; + undef @theseres; + + my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,''); + if ($errtext) { return @theseres } + +# -------------------------------------------------------------------- Read map + foreach (split(/\<\&\>/,$outtext)) { + my ($command,$number,$content)=split(/\<\:\>/,$_); + if ($command eq 'objcont') { + $theseres[$number]=$content; + } + if ($command eq 'objlinks') { + $links[$number]=$content; + } + } + +# --------------------------------------------------------------- Sort, sort of + + my @objsort=(); + undef @objsort; + + my @data1=(); + my @data2=(); + undef @data1; + undef @data2; + + my $k; + my $kj; + my $j; + my $ij; + + for ($k=1;$k<=$#theseres;$k++) { + if (defined($theseres[$k])) { + $objsort[$#objsort+1]=$k; + } + } + + for ($k=1;$k<=$#links;$k++) { + if (defined($links[$k])) { + @data1=split(/\:/,$links[$k]); + $kj=-1; + for (my $j=0;$j<=$#objsort;$j++) { + if ((split(/\:/,$objsort[$j]))[0]==$data1[0]) { + $kj=$j; + } + } + if ($kj!=-1) { $objsort[$kj].=':'.$data1[1]; } + } + } + for ($k=0;$k<=$#objsort;$k++) { + for ($j=0;$j<=$#objsort;$j++) { + if ($k!=$j) { + @data1=split(/\:/,$objsort[$k]); + @data2=split(/\:/,$objsort[$j]); + my $dol=$#data1+1; + my $dtl=$#data2+1; + if ($dol+$dtl<1000) { + for ($kj=1;$kj<$dol;$kj++) { + if ($data1[$kj]==$data2[0]) { + for ($ij=1;$ij<$dtl;$ij++) { + $data1[$#data1+1]=$data2[$ij]; + } + } + } + for ($kj=1;$kj<$dtl;$kj++) { + if ($data2[$kj]==$data1[0]) { + for ($ij=1;$ij<$dol;$ij++) { + $data2[$#data2+1]=$data1[$ij]; + } + } + } + $objsort[$k]=join(':',@data1); + $objsort[$j]=join(':',@data2); + } + } + } + } +# ---------------------------------------------------------------- Now sort out + + @objsort=sort { + my @data1=split(/\:/,$a); + my @data2=split(/\:/,$b); + my $rvalue=0; + my $k; + for ($k=1;$k<=$#data1;$k++) { + if ($data1[$k]==$data2[0]) { $rvalue--; } + } + for ($k=1;$k<=$#data2;$k++) { + if ($data2[$k]==$data1[0]) { $rvalue++; } + } + if ($rvalue==0) { $rvalue=$#data2-$#data1; } + $rvalue; + } @objsort; + + my @outres=(); + undef @outres; + + for ($k=0;$k<=$#objsort;$k++) { + $outres[$k]=$theseres[(split(/\:/,$objsort[$k]))[0]]; + } + return @outres; +} + # --------------------------------------------------------- Build up RAT screen sub ratedt { my ($r,$url)=@_; @@ -150,6 +263,7 @@ ENDDOCUMENT # ---------------------------------------------------------------- Make buttons sub buttons { + if ($ENV{'form.forceselect'}) { return ''; } my $adv=shift; my $output='
'; if ($adv==1) { @@ -163,13 +277,288 @@ sub buttons { return $output.'

'; } +# ----------------------------------------------------------- Paste into target +# modifies @order, @resources + +sub pastetarget { + my ($after,@which)=@_; + my @insertorder=(); + foreach (@which) { + if (defined($_)) { + my ($name,$url)=split(/\=/,$_); + $name=&Apache::lonnet::unescape($name); + $url=&Apache::lonnet::unescape($url); + if ($url) { + my $idx=$#resources+1; + $insertorder[$#insertorder+1]=$idx; + my $ext='false'; + if ($url=~/^http\:\/\//) { $ext='true'; } + $url=~s/\:/\:/g; + $resources[$idx]=$name.':'.$url.':'.$ext.':normal:res'; + } + } + } + my @oldorder=splice(@order,$after); + @order=(@order,@insertorder,@oldorder); +} + +# ------------------------------------------------ Get start and finish correct +# modifies @resources + +sub startfinish { + foreach (@order) { + my ($name,$url,$ext)=split(/\:/,$resources[$_]); + if ($url=~/http\&colon\:\/\//) { $ext='true'; } + $resources[$_]=$name.':'.$url.':'.$ext.':normal:res'; + } + my ($name,$url,$ext)=split(/\:/,$resources[$order[0]]); + $resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res'; + my ($name,$url,$ext)=split(/\:/,$resources[$order[$#order]]); + $resources[$order[$#order]]=$name.':'.$url.':'.$ext.':finish:res'; +} + +# ------------------------------------------------------------------- Store map + +sub storemap { + my $fn=shift; + &startfinish(); + my $output='graphdef<:>no'; + my $k=1; + for (my $i=0; $i<=$#order; $i++) { + if (defined($resources[$order[$i]])) { + $output.='<&>objcont<:>'.$order[$i].'<:>'.$resources[$order[$i]]; + } + if (defined($order[$i+1])) { + if (defined($resources[$order[$i+1]])) { + $output.='<&>objlinks<:>'.$k.'<:>'. + $order[$i].':'.$order[$i+1].':0'; + $k++; + } + } + } + $output=~s/http\&colon\;\/\///g; + $ENV{'form.output'}=$output; + return + &Apache::lonratsrv::loadmap($fn,&Apache::lonratsrv::savemap($fn,'')); +} + +# ------------------------------------------------------- Simple edit processor + sub smpedt { - my ($r,$errtext)=@_; + my ($r,$url,$errtext)=@_; my $buttons=&buttons(2); + +# ---------------------------------------------------------- Process form input + + my @importselect=(); + my @targetselect=(); + undef @importselect; + undef @targetselect; + if (defined($ENV{'form.importsel'})) { + if (ref($ENV{'form.importsel'})) { + @importselect=sort(@{$ENV{'form.importsel'}}); + } else { + @importselect=($ENV{'form.importsel'}); + } + } + if (defined($ENV{'form.target'})) { + if (ref($ENV{'form.target'})) { + @targetselect=sort(@{$ENV{'form.target'}}); + } else { + @targetselect=($ENV{'form.target'}); + } + } +# ============================================================ Process commands + + my $targetdetail=$ENV{'form.targetdetail'}; + my $importdetail=$ENV{'form.curimpdetail'}; + +# ---------------------------------------------------- Importing from groupsort + if (($ENV{'form.importdetail'}) && (!$ENV{'form.impfortarget'})) { + + $importdetail=''; + my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + + my $lastsel; + + if (defined($importselect[-1])) { + $lastsel=$importselect[-1]; + } else { + $lastsel=$#curimport; + } + + for (my $i=0;$i<=$lastsel;$i++) { + my ($name,$url)=split(/\=/,$curimport[$i]); + if ($url) { + $importdetail.='&'.$name.'='.$url; + } + } + + $importdetail.='&'.$ENV{'form.importdetail'}; + + for (my $i=$lastsel+1;$i<=$#curimport;$i++) { + my ($name,$url)=split(/\=/,$curimport[$i]); + if ($url) { + $importdetail.='&'.$name.'='.$url; + } + } + $importdetail=~s/\&+/\&/g; + $importdetail=~s/^\&//; + +# ------------------------------------------------------------------- Clear all + } elsif ($ENV{'form.clear'}) { + $importdetail=''; +# ------------------------------------------------------------ Discard selected + } elsif ($ENV{'form.discard'}) { + $importdetail=''; + my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + foreach (@importselect) { + $curimport[$_]=''; + } + for (my $i=0;$i<=$#curimport;$i++) { + my ($name,$url)=split(/\=/,$curimport[$i]); + if ($url) { + $importdetail.='&'.$name.'='.$url; + } + } +# --------------------------------------------------------- Loading another map + } elsif ($ENV{'form.loadmap'}) { + $importdetail=''; + my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + + my $lastsel; + + if (defined($importselect[-1])) { + $lastsel=$importselect[-1]; + } else { + $lastsel=$#curimport; + } + + for (my $i=0;$i<=$lastsel;$i++) { + my ($name,$url)=split(/\=/,$curimport[$i]); + if ($url) { + $importdetail.='&'.$name.'='.$url; + } + } + + foreach ( + &attemptread(&Apache::lonnet::filelocation('',$ENV{'form.importmap'}))) { + my ($name,$url)=split(/\:/,$_); + if ($url) { + $importdetail.='&'.&Apache::lonnet::escape($name).'='. + &Apache::lonnet::escape($url); + } + } + + for (my $i=$lastsel+1;$i<=$#curimport;$i++) { + my ($name,$url)=split(/\=/,$curimport[$i]); + if ($url) { + $importdetail.='&'.$name.'='.$url; + } + } + $importdetail=~s/\&+/\&/g; + $importdetail=~s/^\&//; + +# ------------------------------------------------ Groupimport/search to target + } elsif ($ENV{'form.importdetail'}) { + my $lastsel; + if (defined($targetselect[-1])) { + $lastsel=$targetselect[-1]; + } else { + $lastsel=$#order+1; + } + &pastetarget($lastsel,split(/\&/,$ENV{'form.importdetail'})); + &storemap(&Apache::lonnet::filelocation('',$url)); +# ------------------------------------------------------------------------- Cut + } elsif (($ENV{'form.cut'}) || ($ENV{'form.copy'})) { + $importdetail=''; + my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + + my $lastsel; + + if (defined($importselect[-1])) { + $lastsel=$importselect[-1]; + } else { + $lastsel=$#curimport; + } + + for (my $i=0;$i<=$lastsel;$i++) { + my ($name,$url)=split(/\=/,$curimport[$i]); + if ($url) { + $importdetail.='&'.$name.'='.$url; + } + } + + foreach (@targetselect) { + my ($name,$url)=split(/\:/,$resources[$order[$_-1]]); + if ($url) { + $importdetail.='&'.&Apache::lonnet::escape($name).'='. + &Apache::lonnet::escape($url); + } + } + + for (my $i=$lastsel+1;$i<=$#curimport;$i++) { + my ($name,$url)=split(/\=/,$curimport[$i]); + if ($url) { + $importdetail.='&'.$name.'='.$url; + } + } + $importdetail=~s/\&+/\&/g; + $importdetail=~s/^\&//; + + if ($ENV{'form.cut'}) { + my @neworder=(); + for (my $i=0;$i<=$#order;$i++) { + my $include=1; + foreach (@targetselect) { + if ($_-1==$i) { $include=0; } + } + if ($include) { $neworder[$#neworder+1]=$order[$i]; } + } + @order=@neworder; + &storemap(&Apache::lonnet::filelocation('',$url)); + } + +# ----------------------------------------------------------------------- Paste + } elsif ($ENV{'form.paste'}) { + my $lastsel; + if (defined($targetselect[-1])) { + $lastsel=$targetselect[-1]; + } else { + $lastsel=$#order+1; + } + my @newsequence; + my @curimport=split(/\&/,$ENV{'form.curimpdetail'}); + foreach (@importselect) { + $newsequence[$#newsequence+1]=$curimport[$_]; + } + &pastetarget($lastsel,@newsequence); + &storemap(&Apache::lonnet::filelocation('',$url)); +# ------------------------------------------------ + } +# ------------------------------------------------------------ Assemble windows + + my $idx=-1; + my $importwindow=join("\n",map { + $idx++; + if ($_) { + my ($name,$url)=split(/\=/,$_); + unless ($name) { $name=(split(/\//,$url))[-1]; } + unless ($name) { $name='EMPTY'; } + ''; + } + } split(/\&/,$importdetail)); + + $idx=0; my $targetwindow=join("\n",map { - my ($name)=split(/\:/,$resources[$_]); - unless ($name) { $name='UNKNOWN'; } - ''; + my ($name,$url)=split(/\:/,$resources[$_]); + unless ($name) { $name=(split(/\//,$url))[-1]; } + unless ($name) { $name='EMPTY'; } + $targetdetail.='&'.&Apache::lonnet::escape($name).'='. + &Apache::lonnet::escape($url); + $idx++; + ''; } @order); # ----------------------------------------------------- Start simple RAT screen @@ -255,31 +644,108 @@ function idxcheck(mode) { } idx.focus(); } + + + var editbrowser; + function openbrowser(formname,elementname,only,omit) { + var url = '/res/?'; + if (editbrowser == null) { + url += 'launch=1&'; + } + url += 'catalogmode=interactive&'; + url += 'mode=edit&'; + url += 'form=' + formname + '&'; + if (only != null) { + url += 'only=' + only + '&'; + } + if (omit != null) { + url += 'omit=' + omit + '&'; + } + url += 'element=' + elementname + ''; + var title = 'Browser'; + var options = 'scrollbars=1,resizable=1,menubar=0'; + options += ',width=700,height=600'; + editbrowser = open(url,title,options,'1'); + editbrowser.focus(); + } + + function openview(entry) { + var url=unescape((entry.split('='))[1]); + var parts=new Array; + parts=url.split(':'); + url=parts.join(':'); + if (url) { open(url,'cat'); } + } + + function viewtarget() { + openview((document.forms.simpleedit.targetdetail.value.split('&')) + [document.forms.simpleedit.target.selectedIndex+1]); + } + + function viewimport() { + openview((document.forms.simpleedit.curimpdetail.value.split('&')) + [document.forms.simpleedit.importsel.selectedIndex+1]); + } + $buttons $errtext -
+ - - - + + + + + - -
Import Target
-Group Search -Group Import -   
+
Import Target
+ + +after selected +
+ +
+ + + + +
  + + + +after selected +
+
+ +Cut selected

- +


+Copy selected
+

+


+Paste after selected
+
+
+ + + + +
+ ENDSMPHEAD - - $r->print(''); } # ----------------------------------------------------------------- No such dir @@ -298,23 +764,74 @@ ENDNODIR # ---------------------------------------------------------------- View Handler sub viewmap { - my ($r,$adv,$errtext)=@_; - $r->print(''.&buttons($adv)); + my ($r,$url,$adv,$errtext)=@_; + $r->print(''); + if ($ENV{'form.forceselect'}) { $r->print(< + +function select_group() { + window.location="/adm/groupsort?catalogmode=groupimport&mode=rat&acts="+document.forms.fileattr.acts.value; +} + +function queue(val) { + if (eval("document.forms."+val+".filelink.checked")) { + var l=val.length; + var v=val.substring(4,l); + document.forms.fileattr.acts.value+='1a'+v+'b'; + } + else { + var l=val.length; + var v=val.substring(4,l); + document.forms.fileattr.acts.value+='0a'+v+'b'; + } +} + + + + +ENDSCRIPT + } + $r->print(''.&buttons($adv)); + if ($ENV{'form.forceselect'}) { $r->print(< + + + +ENDSELECT + } if ($errtext) { $r->print($errtext.'
'); } - foreach (@resources) { + my $idx=0; + foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) { if (defined($_)) { + $idx++; + if ($ENV{'form.forceselect'}) { + $r->print('
'); + } my ($title,$url)=split(/\:/,$_); $title=~s/\&colon\;/\:/g; $url=~s/\&colon\;/\:/g; - unless ($title) { $title='Unknown'; } + unless ($title) { $title=(split(/\//,$url))[-1] }; + unless ($title) { $title='Empty'; } if ($url) { + if ($ENV{'form.forceselect'}) { + $r->print(< + +ENDCHECKBOX + } $r->print(''); } $r->print(&Apache::lonratsrv::qtescape($title)); if ($url) { $r->print(''); } - $r->print('
'); + if ($ENV{'form.forceselect'}) { + $r->print(''); + } else { + $r->print('
'); + } } } $r->print(''); @@ -328,6 +845,9 @@ sub handler { $r->send_http_header; return OK if $r->header_only; + + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['forceselect']); my $url=$r->uri; my $fn=&Apache::lonnet::filelocation('',$url); @@ -363,9 +883,9 @@ sub handler { if ($ENV{'form.forceadv'}) { &ratedt($r,$url); } elsif ($ENV{'form.forcesmp'}) { - &smpedt($r,$errtext); + &smpedt($r,$url,$errtext); } else { - &viewmap($r,$adv,$errtext); + &viewmap($r,$url,$adv,$errtext); } return OK; }