![]() ![]() | ![]() |
Added contextual help - pretty blue now :-)
1: # The LearningOnline Network 2: # Documents 3: # 4: # $Id: londocs.pm,v 1.47 2003/02/04 18:23:21 www Exp $ 5: # 6: # Copyright Michigan State University Board of Trustees 7: # 8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA). 9: # 10: # LON-CAPA is free software; you can redistribute it and/or modify 11: # it under the terms of the GNU General Public License as published by 12: # the Free Software Foundation; either version 2 of the License, or 13: # (at your option) any later version. 14: # 15: # LON-CAPA is distributed in the hope that it will be useful, 16: # but WITHOUT ANY WARRANTY; without even the implied warranty of 17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18: # GNU General Public License for more details. 19: # 20: # You should have received a copy of the GNU General Public License 21: # along with LON-CAPA; if not, write to the Free Software 22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23: # 24: # /home/httpd/html/adm/gpl.txt 25: # 26: # http://www.lon-capa.org/ 27: # 28: 29: package Apache::londocs; 30: 31: use strict; 32: use Apache::Constants qw(:common :http); 33: use Apache::lonnet; 34: use Apache::loncommon; 35: use Apache::lonratedt; 36: use Apache::lonratsrv; 37: use Apache::lonxml; 38: use HTML::Entities; 39: use GDBM_File; 40: 41: my $iconpath; 42: 43: my %hash; 44: 45: my $hashtied; 46: my %alreadyseen=(); 47: 48: my $hadchanges; 49: 50: # Available help topics 51: 52: my %help=(); 53: 54: # Mapread read maps into lonratedt::global arrays 55: # @order and @resources, determines status 56: # sets @order - pointer to resources in right order 57: # sets @resources - array with the resources with correct idx 58: # 59: 60: sub mapread { 61: my ($coursenum,$coursedom,$map)=@_; 62: return 63: &Apache::lonratedt::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'. 64: $map); 65: } 66: 67: sub storemap { 68: my ($coursenum,$coursedom,$map)=@_; 69: $hadchanges=1; 70: return 71: &Apache::lonratedt::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'. 72: $map,1); 73: } 74: 75: sub editor { 76: my ($r,$coursenum,$coursedom,$folder,$allowed)=@_; 77: if ($ENV{'form.foldername'}) { 78: $r->print('<h3>Folder: '.$ENV{'form.foldername'}.'</h3>'); 79: } 80: my $errtext=''; 81: my $fatal=0; 82: ($errtext,$fatal)= 83: &mapread($coursenum,$coursedom,$folder.'.sequence'); 84: if ($#Apache::lonratedt::order<1) { 85: $Apache::lonratedt::order[0]=1; 86: $Apache::lonratedt::resources[1]=''; 87: } 88: if ($fatal) { 89: $r->print('<p><font color="red">'.$errtext.'</font></p>'); 90: } else { 91: # ------------------------------------------------------------ Process commands 92: # ---------------- if they are for this folder and user allowed to make changes 93: if (($allowed) && ($ENV{'form.folder'} eq $folder)) { 94: # upload a file, if present 95: if (($ENV{'form.uploaddoc.filename'}) && 96: ($ENV{'form.cmd'}=~/^upload_(\w+)/)) { 97: if ($folder=~/^$1/) { 98: # this is for a course, not a user, so set coursedoc flag 99: # probably the only place in the system where this should be "1" 100: my $url=&Apache::lonnet::userfileupload('uploaddoc',1); 101: my $ext='false'; 102: if ($url=~/^http\:\/\//) { $ext='true'; } 103: $url=~s/\:/\:/g; 104: my $comment=$ENV{'form.comment'}; 105: $comment=~s/\</\<\;/g; 106: $comment=~s/\>/\>\;/g; 107: $comment=~s/\:/\:/g; 108: if ($folder=~/^supplemental/) { 109: $comment=time.'___&&&___'.$ENV{'user.name'}.'___&&&___'. 110: $ENV{'user.domain'}.'___&&&___'.$comment; 111: } 112: my $newidx=$#Apache::lonratedt::resources+1; 113: $Apache::lonratedt::resources[$newidx]= 114: $comment.':'.$url.':'.$ext.':normal:res'; 115: $Apache::lonratedt::order[$#Apache::lonratedt::order+1]= 116: $newidx; 117: &storemap($coursenum,$coursedom,$folder.'.sequence'); 118: } 119: } 120: if ($ENV{'form.cmd'}) { 121: my ($cmd,$idx)=split(/\_/,$ENV{'form.cmd'}); 122: if ($cmd eq 'del') { 123: for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) { 124: $Apache::lonratedt::order[$i]= 125: $Apache::lonratedt::order[$i+1]; 126: } 127: $#Apache::lonratedt::order--; 128: } elsif ($cmd eq 'up') { 129: if (($idx) && (defined($Apache::lonratedt::order[$idx-1]))) { 130: my $i=$Apache::lonratedt::order[$idx-1]; 131: $Apache::lonratedt::order[$idx-1]= 132: $Apache::lonratedt::order[$idx]; 133: $Apache::lonratedt::order[$idx]=$i; 134: } 135: } elsif ($cmd eq 'down') { 136: if (defined($Apache::lonratedt::order[$idx+1])) { 137: my $i=$Apache::lonratedt::order[$idx+1]; 138: $Apache::lonratedt::order[$idx+1]= 139: $Apache::lonratedt::order[$idx]; 140: $Apache::lonratedt::order[$idx]=$i; 141: } 142: } elsif ($cmd eq 'rename') { 143: my ($rtitle,@rrest)=split(/\:/, 144: $Apache::lonratedt::resources[ 145: $Apache::lonratedt::order[$idx]]); 146: my $comment= 147: &HTML::Entities::decode($ENV{'form.title'}); 148: $comment=~s/\</\<\;/g; 149: $comment=~s/\>/\>\;/g; 150: $comment=~s/\:/\:/g; 151: $Apache::lonratedt::resources[ 152: $Apache::lonratedt::order[$idx]]= 153: $comment.':'.join(':',@rrest); 154: 155: } 156: # Store the changed version 157: &storemap($coursenum,$coursedom,$folder.'.sequence'); 158: } 159: # Group import/search 160: if ($ENV{'form.importdetail'}) { 161: foreach (split(/\&/,$ENV{'form.importdetail'})) { 162: if (defined($_)) { 163: my ($name,$url)=split(/\=/,$_); 164: $name=&Apache::lonnet::unescape($name); 165: $url=&Apache::lonnet::unescape($url); 166: if ($url) { 167: my $idx=$#Apache::lonratedt::resources+1; 168: $Apache::lonratedt::order 169: [$#Apache::lonratedt::order+1]=$idx; 170: my $ext='false'; 171: if ($url=~/^http\:\/\//) { $ext='true'; } 172: $url=~s/\:/\:/g; 173: $name=~s/\:/\:/g; 174: $Apache::lonratedt::resources[$idx]= 175: $name.':'.$url.':'.$ext.':normal:res'; 176: } 177: } 178: } 179: # Store the changed version 180: &storemap($coursenum,$coursedom,$folder.'.sequence'); 181: } 182: } 183: # ---------------------------------------------------------------- End commands 184: # ---------------------------------------------------------------- Print screen 185: my $idx=0; 186: $r->print('<table>'); 187: foreach (@Apache::lonratedt::order) { 188: my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]); 189: unless ($name) { $name=(split(/\//,$url))[-1]; } 190: unless ($name) { $name='NO RESOURCE'; $url='/adm/notfound.html'; } 191: $r->print(&entryline($idx,$name,$url,$folder,$allowed)); 192: $idx++; 193: } 194: $r->print('</table>'); 195: } 196: } 197: 198: # --------------------------------------------------------------- An entry line 199: 200: sub entryline { 201: my ($index,$title,$url,$folder,$allowed)=@_; 202: $title=~s/\&colon\;/\:/g; 203: $title=&HTML::Entities::encode(&HTML::Entities::decode( 204: &Apache::lonnet::unescape($title)),'\"\<\>\&\''); 205: my $renametitle=$title; 206: my $foldertitle=$title; 207: if ($title=~ 208: /^(\d+)\_\_\_\&\;\&\;\&\;\_\_\_(\w+)\_\_\_\&\;\&\;\&\;\_\_\_(\w+)\_\_\_\&\;\&\;\&\;\_\_\_(.*)$/ 209: ) { 210: $foldertitle=&Apache::lontexconvert::msgtexconverted($4); 211: $renametitle=$4; 212: $title='<i>'.localtime($1).'</i> '. 213: &Apache::loncommon::plainname($2,$3).': <br>'. 214: $foldertitle; 215: } 216: $renametitle=~s/\"\;/\\\"/g; 217: my $line='<tr>'; 218: # Edit commands 219: if ($allowed) { 220: $line.=(<<END); 221: <td><table border='0' cellspacing='0' cellpadding='0'> 222: <tr><td><a href='/adm/coursedocs?folder=$folder&cmd=up_$index'> 223: <img src="${iconpath}move_up.gif" alt='UP' border='0' /></a></td></tr> 224: <tr><td><a href='/adm/coursedocs?folder=$folder&cmd=down_$index'> 225: <img src="${iconpath}move_down.gif" alt='DOWN' border='0' /></a></td></tr> 226: </table></td><td> 227: <a href='/adm/coursedocs?folder=$folder&cmd=del_$index'> 228: <font size="-2">Remove</font></a> 229: <a href='javascript:changename("$folder","$index","$renametitle");'> 230: <font size="-2">Rename</font></a></td> 231: END 232: } 233: # Figure out what kind of a resource this is 234: my ($extension)=($url=~/\.(\w+)$/); 235: my $uploaded=($url=~/^\/*uploaded\//); 236: my $icon='unknown'; 237: if (-e "/home/httpd/html/adm/lonIcons/$extension.gif") { 238: $icon=$extension; 239: } 240: my $isfolder=0; 241: if ($uploaded) { 242: if ($extension eq 'sequence') { 243: $icon='folder_closed'; 244: $url=~/\/(\w+)\.sequence/; 245: $url='/adm/coursedocs?folder='.$1; 246: $isfolder=1; 247: } else { 248: $url=&Apache::lonnet::tokenwrapper($url); 249: } 250: } 251: $url=~s/^http\&colon\;\/\//\/adm\/wrapper\/ext\//; 252: if ($isfolder) { $url.='&foldername='.$foldertitle; } 253: $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'" target="cat_'.$folder. 254: '"><img src="/adm/lonIcons/'. 255: $icon.'.gif" border="0"></a></td>'. 256: "<td bgcolor='#FFFFBB'><a href='$url' target='cat_$folder'>$title</a></td></tr>"; 257: return $line; 258: } 259: 260: # ---------------------------------------------------------------- tie the hash 261: 262: sub tiehash { 263: $hashtied=0; 264: if ($ENV{'request.course.fn'}) { 265: if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.".db", 266: &GDBM_READER(),0640)) { 267: $hashtied=1; 268: } 269: } 270: } 271: 272: sub untiehash { 273: if ($hashtied) { untie %hash; } 274: $hashtied=0; 275: } 276: 277: # --------------------------------------------------------------- check on this 278: 279: sub checkonthis { 280: my ($r,$url,$level,$title)=@_; 281: $alreadyseen{$url}=1; 282: $r->rflush(); 283: if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) { 284: $r->print('<br />'); 285: for (my $i=0;$i<=$level*5;$i++) { 286: $r->print(' '); 287: } 288: $r->print('<a href="'.$url.'" target="cat">'. 289: ($title?$title:$url).'</a> '); 290: if ($url=~/^\/res\//) { 291: my $result=&Apache::lonnet::repcopy( 292: &Apache::lonnet::filelocation('',$url)); 293: if ($result==OK) { 294: $r->print('<font color="green">ok</font>'); 295: $r->rflush(); 296: &Apache::lonnet::countacc($url); 297: $url=~/\.(\w+)$/; 298: if (&Apache::loncommon::fileembstyle($1) eq 'ssi') { 299: $r->print('<br />'); 300: $r->rflush(); 301: for (my $i=0;$i<=$level*5;$i++) { 302: $r->print(' '); 303: } 304: $r->print('- Rendering: '); 305: &Apache::lonxml::xmlparse($r,'web', 306: &Apache::lonnet::getfile( 307: &Apache::lonnet::filelocation('',$url))); 308: if (($Apache::lonxml::errorcount) || 309: ($Apache::lonxml::warningcount)) { 310: if ($Apache::lonxml::errorcount) { 311: $r->print('<font color="red"><b>'. 312: $Apache::lonxml::errorcount.' error(s)</b></font> '); 313: } 314: if ($Apache::lonxml::warningcount) { 315: $r->print('<font color="blue">'. 316: $Apache::lonxml::warningcount.' warning(s)</font>'); 317: } 318: } else { 319: $r->print('<font color="green">ok</font>'); 320: } 321: $r->rflush(); 322: } 323: my $dependencies= 324: &Apache::lonnet::metadata($url,'dependencies'); 325: foreach (split(/\,/,$dependencies)) { 326: if (($_=~/^\/res\//) && (!$alreadyseen{$_})) { 327: &checkonthis($r,$_,$level+1); 328: } 329: } 330: } elsif ($result==HTTP_SERVICE_UNAVAILABLE) { 331: $r->print('<font color="red"><b>connection down</b></font>'); 332: } elsif ($result==HTTP_NOT_FOUND) { 333: $r->print('<font color="red"><b>not found</b></font>'); 334: } else { 335: $r->print('<font color="red"><b>access denied</b></font>'); 336: } 337: } 338: } 339: } 340: 341: # ================================================================ Main Handler 342: sub handler { 343: my $r = shift; 344: $r->content_type('text/html'); 345: $r->send_http_header; 346: return OK if $r->header_only; 347: 348: # --------------------------------------------- Initialize help topics for this 349: foreach ('Adding_Course_Doc','Main_Course_Documents', 350: 'Adding_External_Resource','Navigate_Content', 351: 'Adding_Folders','Docs_Overview', 352: 'Creating_From_Template','Supplemental', 353: 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive') { 354: $help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_); 355: } 356: 357: if ($ENV{'form.verify'}) { 358: 359: my $loaderror=&Apache::lonnet::overloaderror($r); 360: if ($loaderror) { return $loaderror; } 361: 362: $r->print('<html><head><title>Verify Content</title></head>'. 363: &Apache::loncommon::bodytag('Verify Course Documents')); 364: $hashtied=0; 365: undef %alreadyseen; 366: %alreadyseen=(); 367: &tiehash(); 368: foreach (keys %hash) { 369: if (($_=~/^src\_(.+)$/) && (!$alreadyseen{$hash{$_}})) { 370: &checkonthis($r,$hash{$_},0,$hash{'title_'.$1}); 371: } 372: } 373: &untiehash(); 374: } elsif ($ENV{'form.versions'}) { 375: $r->print('<html><head><title>Check Versions</title></head>'. 376: &Apache::loncommon::bodytag('Check Course Document Versions')); 377: $hashtied=0; 378: &tiehash(); 379: my %changes=&Apache::lonnet::dump 380: ('versionupdate',$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, 381: $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); 382: my $firstkey=(keys %changes)[0]; 383: unless ($firstkey=~/^error\:/) { 384: unless ($ENV{'form.timerange'}) { 385: $ENV{'form.timerange'}=604800; 386: } 387: my $seltext='during the last '.$ENV{'form.timerange'}.' seconds'; 388: my $startsel=''; 389: my $monthsel=''; 390: my $weeksel=''; 391: my $daysel=''; 392: if ($ENV{'form.timerange'}==-1) { 393: $seltext='since start of course'; 394: $startsel='selected'; 395: $ENV{'form.timerange'}=time; 396: } 397: my $starttime=time-$ENV{'form.timerange'}; 398: if ($ENV{'form.timerange'}==2592000) { 399: $seltext='during the last month ('.localtime($starttime).')'; 400: $monthsel='selected'; 401: } elsif ($ENV{'form.timerange'}==604800) { 402: $seltext='during the last week ('.localtime($starttime).')'; 403: $weeksel='selected'; 404: } elsif ($ENV{'form.timerange'}==86400) { 405: $seltext='since yesterday ('.localtime($starttime).')'; 406: $daysel='selected'; 407: } 408: 409: $r->print(<<ENDHEADERS); 410: <form action="/adm/coursedocs" method="post"> 411: <select name="timerange"> 412: <option value="-1" $startsel>Since Start of Course</option> 413: <option value="2592000" $monthsel>Last Month</option> 414: <option value="604800" $weeksel>Last Week</option> 415: <option value="86400" $daysel>Since Yesterday</option> 416: </select> 417: <input type="submit" name="versions" value="Display" /> 418: </form> 419: <h3>Content changed $seltext</h3> 420: <table border="2"> 421: <tr> 422: <th>File</th><th>Modification Date</th> 423: <th>Version</th><th>Differences</th></tr> 424: ENDHEADERS 425: foreach (keys %changes) { 426: if ($changes{$_}>$starttime) { 427: my ($root,$extension)=($_=~/^(.*)\.(\w+)$/); 428: my $currentversion=&Apache::lonnet::getversion($_); 429: my $linkurl=&Apache::lonnet::clutter($_); 430: $r->print( 431: '<tr><td><a href="'.$linkurl.'" target="cat">'.$linkurl. 432: '</a></td><td>'. 433: localtime($changes{$_}).'</td><td>'.$currentversion.'</td>'. 434: '<td>'); 435: my $lastold=1; 436: for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) { 437: my $url=$root.'.'.$prevvers.'.'.$extension; 438: if (&Apache::lonnet::metadata($url,'lastrevisiondate')< 439: $starttime) { 440: $lastold=$prevvers; 441: } 442: } 443: for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) { 444: my $url=$root.'.'.$prevvers.'.'.$extension; 445: $r->print('<a href="'.&Apache::lonnet::clutter($url). 446: '">Version '.$prevvers.' ('. 447: localtime(&Apache::lonnet::metadata($url,'lastrevisiondate')). 448: ')</a>'); 449: if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') { 450: $r->print(' <a href="/adm/diff?filename='. 451: &Apache::lonnet::clutter($root.'.'.$extension). 452: '&versionone='.$prevvers. 453: '">Diffs</a>'); 454: } 455: $r->print('<br />'); 456: } 457: $r->print('</td></tr>'); 458: } 459: } 460: $r->print('</table>'); 461: } else { 462: $r->print('<p>No content modifications yet.</p>'); 463: } 464: &untiehash(); 465: } else { 466: # is this a standard course? 467: 468: my $standard=($ENV{'request.course.uri'}=~/^\/uploaded\//); 469: my $forcestandard; 470: my $forcesupplement; 471: my $script=''; 472: my $allowed; 473: my $events=''; 474: my $showdoc=0; 475: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, 476: ['folder','foldername']); 477: if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { 478: $showdoc=$1; 479: } 480: unless ($showdoc) { # got called from remote 481: $forcestandard=($ENV{'form.folder'}=~/^default_/); 482: $forcesupplement=($ENV{'form.folder'}=~/^supplemental_/); 483: 484: # does this user have privileges to post, etc? 485: $allowed=&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}); 486: if ($allowed) { 487: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']); 488: $script=&Apache::lonratedt::editscript('simple'); 489: } 490: } else { # got called in sequence from course 491: $allowed=0; 492: $script='</script>'.&Apache::lonxml::registerurl(1,undef).'<script>'; 493: $events='onLoad="'.&Apache::lonxml::loadevents. 494: '" onUnload="'.&Apache::lonxml::unloadevents.'"'; 495: } 496: 497: # get course data 498: my $coursenum=$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; 499: my $coursedom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; 500: 501: # get personal data 502: 503: my $uname=$ENV{'user.name'}; 504: my $udom=$ENV{'user.domain'}; 505: my $plainname=&Apache::lonnet::escape( 506: &Apache::loncommon::plainname($uname,$udom)); 507: 508: # graphics settings 509: 510: $iconpath = $r->dir_config('lonIconsURL') . "/"; 511: 512: my $now=time; 513: 514: # print screen 515: $r->print(<<ENDDOCUMENT); 516: <html> 517: <head> 518: <title>The LearningOnline Network with CAPA</title> 519: <script> 520: $script 521: </script> 522: ENDDOCUMENT 523: if ($allowed) { 524: $r->print(<<ENDNEWSCRIPT); 525: <script> 526: function makenewfolder(targetform,folderseq) { 527: var foldername=prompt('Name of New Folder','New Folder'); 528: if (foldername) { 529: targetform.importdetail.value=foldername+"="+folderseq; 530: targetform.submit(); 531: } 532: } 533: 534: function makenewext(targetname) { 535: this.document.forms.extimport.useform.value=targetname; 536: window.open('/adm/rat/extpickframe.html'); 537: } 538: 539: function makesmppage() { 540: var title=prompt('Listed Title for the Page'); 541: if (title) { 542: this.document.forms.newsmppg.importdetail.value= 543: title+'=/adm/$udom/$uname/$now/smppg'; 544: this.document.forms.newsmppg.submit(); 545: } 546: } 547: 548: function makebulboard() { 549: var title=prompt('Listed Title for the Bulletin Board'); 550: if (title) { 551: this.document.forms.newbul.importdetail.value= 552: title+'=/adm/$udom/$uname/$now/bulletinboard'; 553: this.document.forms.newbul.submit(); 554: } 555: } 556: 557: function finishpick() { 558: var title=this.document.forms.extimport.title.value; 559: var url=this.document.forms.extimport.url.value; 560: var form=this.document.forms.extimport.useform.value; 561: eval 562: ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+ 563: '";this.document.forms.'+form+'.submit();'); 564: } 565: 566: function changename(folder,index,oldtitle) { 567: var title=prompt('New Title',oldtitle); 568: if (title) { 569: this.document.forms.renameform.title.value=title; 570: this.document.forms.renameform.cmd.value='rename_'+index; 571: this.document.forms.renameform.folder.value=folder; 572: this.document.forms.renameform.submit(); 573: } 574: } 575: </script> 576: 577: ENDNEWSCRIPT 578: } 579: # -------------------------------------------------------------------- Body tag 580: $r->print('</head>'. 581: &Apache::loncommon::bodytag('Course Documents','',$events)); 582: unless ($showdoc) { 583: if ($allowed) { 584: $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc', 585: 'Editing the Table of Contents for your Course')); 586: $r->print(<<ENDCOURSEVERIFY); 587: <form name="renameform" method="post" action="/adm/coursedocs"> 588: <input type="hidden" name="title" /> 589: <input type="hidden" name="cmd" /> 590: <input type="hidden" name="folder" /> 591: </form> 592: <form name="simpleedit" method="post" action="/adm/coursedocs"> 593: <input type=hidden name="importdetail" value=""> 594: <input type="hidden" name="folder" /> 595: </form> 596: <form action="/adm/coursedocs" method="post" name="courseverify"> 597: <input type="submit" name="verify" value="Verify Content" /> 598: <input type="submit" name="versions" value="Check Resource Versions" /> 599: </form> 600: ENDCOURSEVERIFY 601: } 602: # --------------------------------------------------------- Standard documents 603: $r->print('<table border=2 cellspacing=4 cellpadding=4>'); 604: if (($standard) && ($allowed) && (!$forcesupplement)) { 605: $r->print('<tr><td bgcolor="#BBBBBB"><h2>Main Course Documents'. 606: ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>'); 607: my $folder=$ENV{'form.folder'}; 608: unless ($folder=~/^default/) { $folder='default'; } 609: $hadchanges=0; 610: &editor($r,$coursenum,$coursedom,$folder,$allowed); 611: if ($hadchanges) { 612: $r->print('<form method="post" action="/adm/roles">'. 613: '<input type=hidden name=orgurl value="/adm/coursedocs" /><input type=hidden name=selectrole value=1 /><h3><font color="red">Changes will become active for your current session after <input type="submit" name="'. 614: $ENV{'request.role'}.'" value="re-initializing course" />, or the next time you log in.</font></h3></form>'); 615: } 616: my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time. 617: '.sequence'; 618: 619: $r->print(<<ENDFORM); 620: <table cellspacing=4 cellpadding=4><tr> 621: <th bgcolor="#DDDDDD">Upload a new main course document</th> 622: <th bgcolor="#DDDDDD">Import a published document</th> 623: <th bgcolor="#DDDDDD">Special documents</th> 624: </tr> 625: <tr><td bgcolor="#DDDDDD"> 626: File:<br /> 627: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data"> 628: <input type="file" name="uploaddoc" size="50"> 629: <br /> 630: Title:<br /> 631: <input type="text" size="50" name="comment"> 632: <input type="hidden" name="folder" value="$folder"> 633: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 634: <input type="hidden" name="cmd" value="upload_default"> 635: <input type="submit" value="Upload Document"> 636: $help{'Uploading_From_Harddrive'}</form> 637: </td> 638: <td bgcolor="#DDDDDD"> 639: <form action="/adm/coursedocs" method="post" name="simpleeditdefault"> 640: <input type=button onClick= 641: "javascript:document.forms.simpleedit.folder.value='$folder';groupsearch()" value="Search"> 642: <input type=button onClick= 643: "javascript:document.forms.simpleedit.folder.value='$folder';groupimport();" value="Import"> 644: $help{'Importing_LON-CAPA_Resource'}</form> 645: </td><td bgcolor="#DDDDDD"> 646: <form action="/adm/coursedocs" method="post" name="newfolder"> 647: <input type="hidden" name="folder" value="$folder"> 648: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 649: <input type=hidden name="importdetail" value=""> 650: <input name="newfolder" type="button" 651: onClick="javascript:makenewfolder(this.form,'$folderseq');" 652: value="New Folder" /> $help{'Adding_Folders'} 653: </form> 654: <form action="/adm/coursedocs" method="post" name="newext"> 655: <input type="hidden" name="folder" value="$folder"> 656: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 657: <input type=hidden name="importdetail" value=""> 658: <input name="newext" type="button" onClick="javascript:makenewext('newext');" 659: value="External Resource" /> $help{'Adding_External_Resource'} 660: </form> 661: <form action="/adm/coursedocs" method="post" name="newsyl"> 662: <input type="hidden" name="folder" value="$folder"> 663: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 664: <input type=hidden name="importdetail" 665: value="Syllabus=/public/$coursedom/$coursenum/syllabus"> 666: <input name="newsyl" type="submit" value="Syllabus" /> 667: $help{'Creating_From_Template'}</form> 668: <form action="/adm/coursedocs" method="post" name="newnav"> 669: <input type="hidden" name="folder" value="$folder"> 670: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 671: <input type=hidden name="importdetail" 672: value="Navigate Content=/adm/navmaps"> 673: <input name="newnav" type="submit" value="Navigate Content" /> 674: $help{'Navigate_Content'} 675: </form> 676: <form action="/adm/coursedocs" method="post" name="newsmppg"> 677: <input type="hidden" name="folder" value="$folder"> 678: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 679: <input type=hidden name="importdetail" value=""> 680: <input name="newsmppg" type="button" value="Simple Page" 681: onClick="javascript:makesmppage();" /> $help{'Creating_From_Template'} 682: </form> 683: <form action="/adm/coursedocs" method="post" name="newbul"> 684: <input type="hidden" name="folder" value="$folder"> 685: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 686: <input type=hidden name="importdetail" value=""> 687: <input name="newbulletin" type="button" value="Bulletin Board" 688: onClick="javascript:makebulboard();" /> 689: $help{'Creating_From_Template'}</form> 690: <form action="/adm/coursedocs" method="post" name="newaboutme"> 691: <input type="hidden" name="folder" value="$folder"> 692: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 693: <input type=hidden name="importdetail" 694: value="$plainname=/adm/$udom/$uname/aboutme"> 695: <input name="newaboutme" type="submit" value="My Personal Info" /> 696: $help{'Creating_From_Template'}</form> 697: </td></tr> 698: </table> 699: ENDFORM 700: $r->print('</td></tr>'); 701: } 702: # ----------------------------------------------------- Supplemental documents 703: if (!$forcestandard) { 704: $r->print( 705: '<tr><td bgcolor="#BBBBBB"><h2>Supplemental Course Documents'. 706: ($allowed?' '.$help{'Supplemental'}:'').'</h2>'); 707: my $folder=$ENV{'form.folder'}; 708: unless ($folder=~/supplemental/) { $folder='supplemental'; } 709: &editor($r,$coursenum,$coursedom,$folder,$allowed); 710: if ($allowed) { 711: my $folderseq= 712: '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time. 713: '.sequence'; 714: 715: $r->print(<<ENDSUPFORM); 716: <table cellspacing=4 cellpadding=4><tr> 717: <th bgcolor="#DDDDDD">Upload a new supplemental course document</th> 718: <th bgcolor="#DDDDDD">Import a published document</th> 719: <th bgcolor="#DDDDDD">Special documents</th> 720: </tr> 721: <tr><td bgcolor="#DDDDDD"> 722: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data"> 723: <input type="file" name="uploaddoc" size="50"> 724: <br />Comment:<br /> 725: <textarea cols=50 rows=4 name='comment'> 726: </textarea> 727: <input type="hidden" name="folder" value="$folder"> 728: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 729: <input type="hidden" name="cmd" value="upload_supplemental"> 730: <input type="submit" value="Upload Document"> 731: $help{'Uploading_From_Harddrive'}</form> 732: </td> 733: <td bgcolor="#DDDDDD"> 734: <form action="/adm/coursedocs" method="post" name="simpleeditsupplement"> 735: <input type=hidden name="importdetail" value=""> 736: <input type=button onClick= 737: "javascript:document.forms.simpleedit.folder.value='$folder';groupsearch()" value="Search"> 738: <input type=button onClick= 739: "javascript:document.forms.simpleedit.folder.value='$folder';groupimport();" value="Import">$help{'Importing_LON-CAPA_Resource'} 740: </form> 741: </td><td bgcolor="#DDDDDD"> 742: <form action="/adm/coursedocs" method="post" name="supnewfolder"> 743: <input type="hidden" name="folder" value="$folder"> 744: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 745: <input type=hidden name="importdetail" value=""> 746: <input name="newfolder" type="button" 747: onClick="javascript:makenewfolder(this.form,'$folderseq');" 748: value="New Folder" /> $help{'Adding_Folders'} 749: </form> 750: <form action="/adm/coursedocs" method="post" name="supnewext"> 751: <input type="hidden" name="folder" value="$folder"> 752: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 753: <input type=hidden name="importdetail" value=""> 754: <input name="newext" type="button" 755: onClick="javascript:makenewext('supnewext');" 756: value="External Resource" /> $help{'Adding_External_Resource'} 757: </form> 758: <form action="/adm/coursedocs" method="post" name="supnewsyl"> 759: <input type="hidden" name="folder" value="$folder"> 760: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 761: <input type=hidden name="importdetail" 762: value="Syllabus=/public/$coursedom/$coursenum/syllabus"> 763: <input name="newsyl" type="submit" value="Syllabus" /> 764: $help{'Creating_From_Template'}</form> 765: <form action="/adm/coursedocs" method="post" name="subnewaboutme"> 766: <input type="hidden" name="folder" value="$folder"> 767: <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> 768: <input type=hidden name="importdetail" 769: value="$plainname=/adm/$udom/$uname/aboutme"> 770: <input name="newaboutme" type="submit" value="My Personal Info" /> 771: $help{'Creating_From_Template'}</form> 772: </td></tr> 773: </table></td></tr> 774: ENDSUPFORM 775: } 776: } 777: if ($allowed) { 778: $r->print('<form name="extimport"><input type="hidden" name="title"><input type="hidden" name="url"><input type="hidden" name="useform"></form>'); 779: } 780: $r->print('</table>'); 781: } else { 782: # -------------------------------------------------------- This is showdoc mode 783: $r->print("<h1>Uploaded Document</h1><p>It is recommended that you use an up-to-date virus scanner before handling this file.</p><p><table>". 784: &entryline(0,"Click to download or use your browser's Save Link function",$showdoc).'</table></p>'); 785: } 786: } 787: $r->print('</body></html>'); 788: return OK; 789: } 790: 791: 1; 792: __END__