--- loncom/interface/lonwishlist.pm 2010/08/16 08:58:39 1.2 +++ loncom/interface/lonwishlist.pm 2010/08/16 13:37:41 1.3 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the wishlist # -# $Id: lonwishlist.pm,v 1.2 2010/08/16 08:58:39 wenzelju Exp $ +# $Id: lonwishlist.pm,v 1.3 2010/08/16 13:37:41 wenzelju Exp $ # # Copyright Michigan State University Board of Trustees # @@ -189,6 +189,20 @@ sub setNewTitle { } +# Set a new path for an entry +sub setNewPath { + my ($nodeindex, $newPath) = @_; + &getNodesToArray(\@childrenRt); + my $found = &Tree::getNodeByIndex($nodeindex, \@allNodes); + if ($found->value()->path()) { + $found->value()->path($newPath); + return 1; + } + @allNodes = (); + return 0; +} + + # Set a new note for an entry sub setNewNote { my ($nodeindex, $newNote) = @_; @@ -352,6 +366,17 @@ sub JSforWishlist { $inPageNewLink =~ s/\n//g; $inPageNewFolder =~ s/\n//g; + # it is checked, wether a path links to a LON-CAPA-resource or an external website. links to course-contents are not allowed + # because they probably will return a kind of 'no access' (unless the user is already in the course, the path links to). + # also importing these kind of links into a course does not make much sense. + # to find out if a path (not starting with /res/...) links to course-contents, the same filter as in lonwrapper is used, + # that means that it is checked wether a path contains .problem, .quiz, .exam etc. + # this is good for most cases but crashes as soon as a real external website contains one of this pattern in its URL. + # so maybe there's a better way to find out wether a given URL belongs to a LON-CAPA-server or not ...? + my $warningLinkNotAllowed1 = &mt('You can only insert links to LON-CAPA resources from the resource-pool '. + 'or to external websites. Paths to LON-CAPA resources must be of the form /res/dom/usr... . '. + 'Paths to external websites must contain the network protocol (e.g. http://...).'); + my $warningLinkNotAllowed2 = &mt('The following link is not allowed: '); my $warningLink = &mt('You must insert a title and a path!'); my $warningFolder = &mt('You must insert a title!'); my $warningDelete = &mt('Are you sure you want to delete the selected entries? Deleting a folder also deletes all entries within this folder!'); @@ -370,6 +395,15 @@ sub JSforWishlist { +'if (!path || !title) {' +'alert("$warningLink");' +'return false;}' + +'var linkOK = (path.match(/^http:(\\\\/\\\\/)/) || path.match(/^https:(\\\\/\\\\/)/))' + +'&& !(path.match(/\\.problem/) || path.match(/\\.exam/)' + +'|| path.match(/\\.quiz/) || path.match(/\\.assess/)' + +'|| path.match(/\\.survey/) || path.match(/\\.form/)' + +'|| path.match(/\\.library/) || path.match(/\\.page/)' + +'|| path.match(/\\.sequence/));' + +'if (!path.match(/^(\\\\/res\\\\/)/) && !linkOK) {' + +'alert("$warningLinkNotAllowed1");' + +'return false;}' +'else {' +'window.close();' +'return true;}}' @@ -409,9 +443,15 @@ sub JSforWishlist { if (d) { if (!confirm('$warningSave')) { setAction('noSave'); + r = true; + } + else { + r = linksOK(); } } - r = true; + } + else if (action == 'saveOK') { + r = linksOK(); } document.getElementsByName('list')[0].setAttribute("action", "/adm/wishlist?mode="+mode); if (r) { @@ -433,6 +473,15 @@ sub JSforWishlist { return true; } } + var newpath = document.getElementsByName('newpath'); + var i = 0; + for (i=0;i'. ''. ''. - 'folder'; + 'folder'. + ''. + ''; } # entry is a link @@ -953,12 +1029,11 @@ sub wishlistEdit { $wishlistHTMLedit .= ''. ''. - 'link'; + 'link'. + ''. + ''; } - - # input-field for title - $wishlistHTMLedit .= ''; - + # note-icon, different icons for an entries with note and those without my $noteIMG = 'anot.png'; @@ -974,7 +1049,7 @@ sub wishlistEdit { # start row containing the textarea for the note $wishlistHTMLedit .= &Apache::loncommon::continue_data_table_row('LC_hidden','note'.$index). - ''. + ''. ''; @@ -1192,7 +1267,7 @@ sub makePage { # icon for edit-mode, display when in view-mode if ($mode eq 'view') { $functions .= &Apache::lonhtmlcommon::add_item_funclist(''. + 'onclick="setFormAction('."'save','edit'".');" class="LC_menubuttons_link">'. ''.$lt{'ed'}.' '. ''.$lt{'ed'}.''); @@ -1200,7 +1275,7 @@ sub makePage { # icon for view-mode, display when in edit-mode else { $functions .= &Apache::lonhtmlcommon::add_item_funclist(''. + 'onclick="setFormAction('."'save','view'".');" class="LC_menubuttons_link">'. ''.$lt{'vw'}.' '. ''.$lt{'vw'}.''); @@ -1236,7 +1311,7 @@ sub makePage { # icon for saving changes $functions .= &Apache::lonhtmlcommon::add_item_funclist(''. + 'onclick="setFormAction('."'saveOK','".$mode."'".'); " class="LC_menubuttons_link">'. ''.$lt{'sv'}.''. ''.$lt{'sv'}.''); @@ -1479,9 +1554,12 @@ sub handler { # only save, if user wants to save changes # do not save, when current action is 'delete' or 'sort' or 'move' my @newTitles = (); + my @newPaths = (); my @newNotes = (); - if ((defined $env{'form.newtitle'} || defined $env{'form.newnote'}) && ($env{'form.action'} ne 'noSave') && ($env{'form.action'} ne 'delete') && !$changeOrder) { + if ((defined $env{'form.newtitle'} || defined $env{'form.newpath'} || defined $env{'form.newnote'}) + && ($env{'form.action'} ne 'noSave') && ($env{'form.action'} ne 'delete') && !$changeOrder) { @newTitles = &Apache::loncommon::get_env_multiple('form.newtitle'); + @newPaths = &Apache::loncommon::get_env_multiple('form.newpath'); @newNotes = &Apache::loncommon::get_env_multiple('form.newnote'); my $node = 0; foreach my $t (@newTitles) { @@ -1489,6 +1567,14 @@ sub handler { $node++; } $node = 0; + my $path = 0; + for (my $i = 0; $i < ($#newTitles+1); $i++ ) { + if (&setNewPath($node, $newPaths[$path])) { + $path++; + } + $node++; + } + $node = 0; foreach my $n (@newNotes) { &setNewNote($node, $n); $node++;