![]() ![]() | ![]() |
Can now transfer files to the import window
# The LearningOnline Network with CAPA # Edit Handler for RAT Maps # # $Id: lonratedt.pm,v 1.13 2002/05/13 19:23:52 www Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # # (TeX Content Handler # # 05/29/00,05/30 Gerd Kortemeyer) # 7/1,6/30 Gerd Kortemeyer package Apache::lonratedt; use strict; use Apache::Constants qw(:common); use Apache::lonnet; use Apache::lonratsrv; my @order=(); my @resources=(); # Mapread read maps into global arrays @links and @resources, determines status # sets @order - pointer to resources in right order # sets @resources - array with the resources with correct idx # sub mapread { my $fn=shift; my @links; undef @links; undef @resources; undef @order; my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,''); if ($errtext) { return ($errtext,2); } # -------------------------------------------------------------------- Read map foreach (split(/\<\&\>/,$outtext)) { my ($command,$number,$content)=split(/\<\:\>/,$_); if ($command eq 'objcont') { $resources[$number]=$content; } if ($command eq 'objlinks') { $links[$number]=$content; } } # ------------------------------------------------------- Is this a linear map? my @starters=(); my @endings=(); undef @starters; undef @endings; foreach (@links) { if (defined($_)) { my ($start,$end,$cond)=split(/\:/,$_); if ((defined($starters[$start])) || (defined($endings[$end]))) { return ('Map has branchings. Use advanced editor.',1); } $starters[$start]=1; $endings[$end]=1; if ($cond) { return ('Map has conditions. Use advanced editor.',1); } } } for (my $i=0; $i<=$#resources; $i++) { if (defined($resources[$i])) { unless (($starters[$i]) || ($endings[$i])) { return ('Map has unconnected resources. Use advanced editor.',1); } } } # -------------------------------------------------- This is a linear map, sort my $startidx=0; my $endidx=0; for (my $i=0; $i<=$#resources; $i++) { if (defined($resources[$i])) { my ($title,$url,$ext,$type)=split(/\:/,$resources[$i]); if ($type eq 'start') { $startidx=$i; } if ($type eq 'finish') { $endidx=$i; } } } my $k=0; my $currentidx=$startidx; $order[$k]=$currentidx; for (my $i=0; $i<=$#resources; $i++) { foreach (@links) { my ($start,$end)=split(/\:/,$_); if ($start==$currentidx) { $currentidx=$end; $k++; $order[$k]=$currentidx; last; } } if ($currentidx==$endidx) { last; } } return $errtext; } # --------------------------------------------------------- Build up RAT screen sub ratedt { my ($r,$url)=@_; $r->print(<<ENDDOCUMENT); <html> <head> <script language="JavaScript"> var flag=0; </script> </head> <frameset rows="1,50,*" border=0> <frame name=server src="$url/loadonly/ratserver" noresize noscroll> <frame name=code src="/adm/rat/code.html"> <frame name=mapout src="/adm/rat/map.html"> </frameset> </html> ENDDOCUMENT } # ---------------------------------------------------------------- Make buttons sub buttons { my $adv=shift; my $output='<form method=post>'; if ($adv==1) { $output.='<input type=submit name=forceadv value="Edit">'; } else { unless ($adv==2) { $output.='<input type=submit name=forcesmp value="Simple Edit">'; } $output.='<input type=submit name=forceadv value="Advanced Edit">'; } return $output.'</form><hr>'; } sub smpedt { my ($r,$errtext)=@_; my $buttons=&buttons(2); # ---------------------------------------------------------- Process form input my @importselect=(); my @targetselect=(); undef @importselect; undef @targetselect; if (defined($ENV{'form.import'})) { if (ref($ENV{'form.import'})) { @importselect=sort($ENV->{'form.import'}); } else { @importselect=($ENV{'form.import'}); } } if (defined($ENV{'form.target'})) { if (ref($ENV{'form.target'})) { @targetselect=sort($ENV->{'form.target'}); } else { @targetselect=($ENV{'form.target'}); } } # ============================================================ Process commands my $targetdetail=''; my $importdetail=''; # ---------------------------------------------------- Importing from groupsort if ($ENV{'form.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.='&'.&Apache::lonnet::escape($name).'='. &Apache::lonnet::escape($url); } } $importdetail.='&'.$ENV{'form.importdetail'}; for (my $i=$lastsel+1;$i<=$#curimport;$i++) { my ($name,$url)=split(/\=/,$curimport[$i]); if ($url) { $importdetail.='&'.&Apache::lonnet::escape($name).'='. &Apache::lonnet::escape($url); } } $importdetail=~s/\&+/\&/g; $importdetail=~s/^\&//; # -------------------------------------------------------- } # ------------------------------------------------------------ Assemble windows my $idx=-1; my $importwindow=join("\n",map { $idx++; if ($_) { my ($name)=split(/\=/,$_); unless ($name) { $name='UNKNOWN'; } '<option value="'.$idx.'">'.&Apache::lonnet::unescape($name). '</option>'; } } split(/\&/,$importdetail)); $idx=0; my $targetwindow=join("\n",map { my ($name,$url)=split(/\:/,$resources[$_]); unless ($name) { $name='UNKNOWN'; } $targetdetail.='&'.&Apache::lonnet::escape($name).'='. &Apache::lonnet::escape($url); $idx++; '<option value="'.$idx.'_'.$_.'">'.$name.'</option>'; } @order); # ----------------------------------------------------- Start simple RAT screen $r->print(<<ENDSMPHEAD); <html> <head> <script> var srch; var srchflag=-1; // 1 means currently open // 0 means closed (but has been open) // -1 means never yet opened/defined var srchmode=''; var idx; var idxflag=-1; // 1 means currently open // 0 means closed (but has been open) // -1 means never yet opened/defined var idxmode=''; // ------------------------------------------------------ Clears indexer window function idxclear() { idx.document.clear(); } // ------------------------------------------------------- Clears search window function srchclear() { srch.document.clear(); } // ------------------------------------------------------ Closes indexer window function idxclose() { if (idx && !idx.closed) { idxflag=0; idx.close(); } } // ------------------------------------------------------- Closes search window function srchclose() { if (srch && !srch.closed) { srchflag=0; srch.close(); } } // -------------------------------------------------------- Open indexer window function idxopen(mode) { var options="scrollbars=1,resizable=1,menubar=0"; idxmode=mode; idxflag=1; idx=open("/res/?launch=1&mode=simple&catalogmode="+mode,"idxout",options); idx.focus(); } // --------------------------------------------------------- Open search window function srchopen(mode) { var options="scrollbars=1,resizable=1,menubar=0"; srchmode=mode; srchflag=1; srch=open("/adm/searchcat?launch=1&mode=simple&catalogmode="+mode,"srchout",options); srch.focus(); } // ----------------------------------------------------- launch indexer browser function groupsearch() { srchcheck('groupsearch'); } function groupimport() { idxcheck('groupimport'); } // ------------------------------------------------------- Do srch status check function srchcheck(mode) { if (!srch || srch.closed || srchmode!=mode) { srchopen(mode); } srch.focus(); } // -------------------------------------------------------- Do idx status check function idxcheck(mode) { if (!idx || idx.closed || idxmode!=mode) { idxopen(mode); } idx.focus(); } </script> </head> <body bgcolor='#FFFFFF'> $buttons <font color=red>$errtext</font> <form name=simpleedit method=post> <input type=hidden name=forcesmp value=1> <table> <tr><th width="40%">Import</th> <th> </th> <th width="40%">Target</th></tr> <tr><td bgcolor="#FFFFCC"> <input type=button onClick="javascript:groupsearch()" value="Group Search"> <input type=button onClick="javascript:groupimport();" value="Group Import"> <input type=button onClick="javascript:viewimport()" value="View"> </td><td> </td><td bgcolor="#FFFFCC"> <input type=button onClick="javascript:viewtarget()" value="View"> </td></tr> <tr><td bgcolor="#FFFFCC"><select name="import" multiple> $importwindow </select> </td> <td bgcolor="#FFFFAA" align="center"> Cut selected<br> <input type=submit name=cut value='<<<'><p> <hr> Paste after selected<br> <input type=submit name=paste value='>>>'> </td> <td bgcolor="#FFFFCC"><select name="target" multiple> $targetwindow </select> </table> <input type=hidden name=importdetail value=""> <input type=hidden name=curimpdetail value="$importdetail"> <input type=hidden name=targetdetail value="$targetdetail"> </form> </body></html> ENDSMPHEAD } # ----------------------------------------------------------------- No such dir sub nodir { my ($r,$dir)=@_; $dir=~s/^\/home\/\w+\/public\_html//; $r->print(<<ENDNODIR); <html> <body bgcolor='#FFFFFF'> <h1>No such directory: $dir</h1> </body> </html> ENDNODIR } # ---------------------------------------------------------------- View Handler sub viewmap { my ($r,$adv,$errtext)=@_; $r->print('<html><body bgcolor="#FFFFFF">'.&buttons($adv)); if ($errtext) { $r->print($errtext.'<hr>'); } foreach (@resources) { if (defined($_)) { my ($title,$url)=split(/\:/,$_); $title=~s/\&colon\;/\:/g; $url=~s/\&colon\;/\:/g; unless ($title) { $title='<i>Unknown</i>'; } if ($url) { $r->print('<a href="'.&Apache::lonratsrv::qtescape($url).'">'); } $r->print(&Apache::lonratsrv::qtescape($title)); if ($url) { $r->print('</a>'); } $r->print('<br>'); } } $r->print('</body></html>'); } # ================================================================ Main Handler sub handler { my $r=shift; $r->content_type('text/html'); $r->send_http_header; return OK if $r->header_only; my $url=$r->uri; my $fn=&Apache::lonnet::filelocation('',$url); my ($dir)=($fn=~/^(.+)\/[^\/]+$/); unless (-e $dir) { &nodir($r,$dir); return OK; } # ------------------------------------------- Determine which tools can be used my $adv=0; unless ($ENV{'form.forcesmp'}) { if ($ENV{'form.forceadv'}) { $adv=1; } elsif (my $fh=Apache::File->new($fn)) { my $allmap=join('',<$fh>); $adv=($allmap=~/\<map[^\>]+mode\s*\=\s*(\'|\")rat/is); } } my $errtext=''; my $fatal=0; # -------------------------------------------------------------------- Load map ($errtext,$fatal)=&mapread($fn,$errtext); if ($fatal==1) { $adv=1; } # ----------------------------------- adv==1 now means "graphical MUST be used" if ($ENV{'form.forceadv'}) { &ratedt($r,$url); } elsif ($ENV{'form.forcesmp'}) { &smpedt($r,$errtext); } else { &viewmap($r,$adv,$errtext); } return OK; } 1; __END__