--- loncom/interface/lonwishlist.pm 2014/01/29 16:25:44 1.19 +++ loncom/interface/lonwishlist.pm 2018/04/14 02:29:44 1.27 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility-routines for wishlist # -# $Id: lonwishlist.pm,v 1.19 2014/01/29 16:25:44 bisitz Exp $ +# $Id: lonwishlist.pm,v 1.27 2018/04/14 02:29:44 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -94,10 +94,10 @@ my $foldersOption; sub getWishlist { my @keys = &Apache::lonnet::getkeys('wishlist'); my %wishlist = &Apache::lonnet::get('wishlist',\@keys); - foreach my $i ( keys %wishlist) { + foreach my $i (keys(%wishlist)) { #File not found. This appears at the first time using the wishlist #Create file and put 'root' into it - if ($i =~m/^error:No such file/) { + if ($i =~m/^\Qerror:No such file\E/) { &Apache::lonnet::logthis($i.'! Create file by putting in the "root" of the directory tree.'); &Apache::lonnet::put('wishlist', {'root' => ''}); my $options = ''; @@ -113,7 +113,7 @@ sub getWishlist { # if we got no keys in hash returned by get(), return error. # wishlist will not be loaded, instead the user will be asked to try again later - if ((keys %wishlist) == 0) { + if ((keys(%wishlist)) == 0) { &Apache::lonnet::logthis('ERROR while attempting to get wishlist: no keys retrieved!'); return 'error'; } @@ -197,7 +197,7 @@ sub newEntry() { my $date = gmtime(); # Create Entry-Object my $entry = Entry->new(title => $title, path => $path, note => $note, date => $date); - # Create Tree-Object, this correspones a node in the wishlist-tree + # Create Tree-Object, this corresponds a node in the wishlist-tree my $tree = Tree->new($entry); # Add this node to wishlist-tree my $folderIndex = $env{'form.folders'}; @@ -536,12 +536,16 @@ sub JSforWishlist { ' Paths to LON-CAPA resources must be of the form /res/domain/user/...'. ' 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!'); my $warningSave = &mt('You have unsaved changes. You can either save these changes now by clicking "OK" or click "Cancel" if you do not want to save your changes.'); my $warningMoveS = &mt('You must select at minimum one entry to move!'); my $warningMoveD = &mt('You must select a destination folder!'); + &js_escape(\$warningLinkNotAllowed1); + &js_escape(\$warningLinkNotAllowed2); + &js_escape(\$warningDelete); + &js_escape(\$warningSave); + &js_escape(\$warningMoveS); + &js_escape(\$warningMoveD); $foldersOption = ''; my $js = &Apache::lonhtmlcommon::scripttag(<'. - 'value()->path()."'".');">'. + ''. 'link'. $n->value()->title().''; } @@ -1299,9 +1310,10 @@ sub wishlistMove { $highlight = 'style="color:red;"'; } # link-image and title + my $quotable_link = &Apache::loncommon::escape_single($n->value()->path()); $wishlistHTMLmove .= ''. ''. - 'value()->path()."'".');" '.$highlight.'>'. + ''. 'link'. $n->value()->title().''; } @@ -1355,16 +1367,30 @@ sub wishlistImport { foreach my $n (@$nodes) { my $index = $n->value()->nindex(); + + # + # Determine which resources in stored links may be imported into a course/community. + # (a) Import of directories in /res space is not supported. + # (b) Import of a resource into a community requires user has 'bro' privilege for resource + # (i.e., user has author or co-author role for corresponcding Authoring Space). + # (c) Import of a resource into a course requires user has 'be' privilege for resource. + # + if ($n->value()->path() =~ m{^(/res/$match_domain/$match_username/)}) { - if ($is_community) { - unless (&Apache::lonnet::allowed('bro',$n->value()->path())) { - $nopick{$n->value()->path()} = $n->value()->title(); - $$numskipped ++; - } + if ($n->value()->path() =~ m{/$}) { + $nopick{$n->value()->path()} = $n->value()->title(); + $$numskipped ++; } else { - unless (&Apache::lonnet::allowed('bre',$n->value()->path())) { - $nopick{$n->value()->path()} = $n->value()->title(); - $$numskipped ++; + if ($is_community) { + unless (&Apache::lonnet::allowed('bro',$n->value()->path())) { + $nopick{$n->value()->path()} = $n->value()->title(); + $$numskipped ++; + } + } else { + unless (&Apache::lonnet::allowed('bre',$n->value()->path())) { + $nopick{$n->value()->path()} = $n->value()->title(); + $$numskipped ++; + } } } } @@ -1405,7 +1431,8 @@ sub wishlistImport { else { $wishlistHTMLimport .= ''; unless ($nopick{$n->value()->path()}) { - $wishlistHTMLimport .= 'value()->path()."'".');">'; + my $quotable_link = &Apache::loncommon::escape_single($n->value()->path()); + $wishlistHTMLimport .= ''; } $wishlistHTMLimport .= 'link'. ''.$n->value()->title().''; @@ -1453,6 +1480,11 @@ sub makePage { $root = $rootgiven; @childrenRt = $root->children(); + my $windowname = 'loncapaclient'; + if ($env{'request.lti.login'}) { + $windowname .= 'lti'; + } + # breadcrumbs and start_page &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb( @@ -1461,9 +1493,9 @@ sub makePage { my $startPage = &Apache::loncommon::start_page('Stored Links',undef, {'add_entries' => { 'onload' => 'javascript:onLoadAction('."'".$mode."'".');', - 'onunload' => 'javascript:window.name = '."'loncapaclient'"}}); + 'onunload' => 'javascript:window.name = '."'$windowname'"}}); - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(&mt('Stored Links'),'Wishlist'); + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Stored Links','Wishlist'); # get javascript-code for wishlist-interactions my $js = &JSforWishlist(); @@ -1638,6 +1670,8 @@ sub makePopUpNewLink { ' or to external websites.'. ' Paths to LON-CAPA resources must be of the form /res/domain/user/...'. ' Paths to external websites must contain the network protocol, e.g. http://...'); + &js_escape(\$warningLink); + &js_escape(\$warningLinkNotAllowed1); my $inPageWishlistlink1 = '

'.&mt('Save to Stored Links').'

'; # If no title is delivered, 'New Link' is called up from the wishlist-interface, so after @@ -1741,7 +1775,7 @@ sub makePopUpNewFolder { 'bgcolor' => '#FFFFFF',}); my $warningFolder = &mt('You must insert a title!'); - + &js_escape(\$warningFolder); my $inPageNewFolder = '

'.&mt('New Folder').'

'. '
new("root"); }