--- loncom/interface/lonwishlist.pm 2012/06/07 02:28:04 1.15 +++ loncom/interface/lonwishlist.pm 2014/12/20 15:35:40 1.24 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility-routines for wishlist # -# $Id: lonwishlist.pm,v 1.15 2012/06/07 02:28:04 raeburn Exp $ +# $Id: lonwishlist.pm,v 1.24 2014/12/20 15:35:40 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'}; @@ -1042,6 +1042,12 @@ sub JSforImport{ function finish_import() { opener.document.forms.simpleedit.importdetail.value=''; for (var num = 0; num < document.forms.groupsort.fnum.value; num++) { + try { + eval("document.forms.groupsort.filelink"+num+".value"); + } + catch(err) { + continue; + } if (eval("document.forms.groupsort.check"+num+".checked") && eval("document.forms.groupsort.filelink"+num+".value") != '') { opener.document.forms.simpleedit.importdetail.value+='&'+ eval("document.forms.groupsort.title"+num+".value")+'='+ @@ -1098,7 +1104,7 @@ JAVASCRIPT # HTML-Markup for table if in view-mode my $wishlistHTMLview; -my $indent = $indentConst; +my $indent_view = $indentConst; sub wishlistView { my $nodes = shift; @@ -1117,7 +1123,7 @@ sub wishlistView { # entry is a folder if ($n->value()->path() eq '') { - $wishlistHTMLview .= ''. + $wishlistHTMLview .= ''. ''. ''. 'folder'. @@ -1125,8 +1131,9 @@ sub wishlistView { } # entry is a link else { - $wishlistHTMLview .= ''. - 'value()->path()."'".');">'. + my $quotable_link = &Apache::loncommon::escape_single($n->value()->path()); + $wishlistHTMLview .= ''. + ''. 'link'. $n->value()->title().''; } @@ -1155,9 +1162,9 @@ sub wishlistView { # if the entry is a folder, it could have other entries as content. if it has, call wishlistView for those entries my @children = $n->children(); if ($#children >=0) { - $indent += 20; + $indent_view += 20; &wishlistView(\@children); - $indent -= 20; + $indent_view -= 20; } } } @@ -1165,7 +1172,7 @@ sub wishlistView { # HTML-Markup for table if in edit-mode my $wishlistHTMLedit; -my $indent = $indentConst; +my $indent_edit = $indentConst; sub wishlistEdit { my $nodes = shift; my $curNode = 1; @@ -1200,7 +1207,7 @@ sub wishlistEdit { if ($n->value()->path() eq '') { $wishlistHTMLedit .= ''. - ''. + ''. ''. ''. 'folder'. @@ -1212,7 +1219,7 @@ sub wishlistEdit { else { $wishlistHTMLedit .= ''. - ''. + ''. 'link'. ''. ''; @@ -1242,9 +1249,9 @@ sub wishlistEdit { # if the entry is a folder, it could have other entries as content. if it has, call wishlistEdit for those entries my @children = $n->children(); if ($#children >=0) { - $indent += 20; + $indent_edit += 20; &wishlistEdit(\@children); - $indent -= 20; + $indent_edit -= 20; } } } @@ -1254,7 +1261,7 @@ sub wishlistEdit { # HTML-Markup for table if in move-mode my $wishlistHTMLmove =''. ''.&mt('Top level').''; -my $indent = $indentConst; +my $indent_move = $indentConst; sub wishlistMove { my $nodes = shift; my $marked = shift; @@ -1278,12 +1285,12 @@ sub wishlistMove { # display a radio-button, if the folder was not selected to be moved if (!$isIn) { $wishlistHTMLmove .= ''. - ''; + ''; } # highlight the title, if the folder was selected to be moved else { $wishlistHTMLmove .= ''. - ''; } #arrow- and folder-image, all folders are open, and title @@ -1299,9 +1306,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().''; } @@ -1330,9 +1338,9 @@ sub wishlistMove { # if the entry is a folder, it could have other entries as content. if it has, call wishlistMove for those entries my @children = $n->children(); if ($#children >=0) { - $indent += 20; + $indent_move += 20; &wishlistMove(\@children, $marked); - $indent -= 20; + $indent_move -= 20; } } } @@ -1341,7 +1349,7 @@ sub wishlistMove { # HTML-Markup for table if in import-mode my $wishlistHTMLimport; -my $indent = $indentConst; +my $indent_imp = $indentConst; my $form = 1; sub wishlistImport { my ($nodes,$numskipped) = @_; @@ -1355,16 +1363,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 ++; + } } } } @@ -1395,7 +1417,7 @@ sub wishlistImport { # entry is a folder if ($n->value()->path() eq '') { - $wishlistHTMLimport .= ''. + $wishlistHTMLimport .= ''. ''. ''. 'folder'. @@ -1403,9 +1425,10 @@ sub wishlistImport { } # entry is a link else { - $wishlistHTMLimport .= ''; + $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().''; @@ -1436,9 +1459,9 @@ sub wishlistImport { # if the entry is a folder, it could have other entries as content. if it has, call wishlistImport for those entries my @children = $n->children(); if ($#children >=0) { - $indent += 20; + $indent_imp += 20; &wishlistImport(\@children,$numskipped); - $indent -= 20; + $indent_imp -= 20; } } return; @@ -1463,7 +1486,7 @@ sub makePage { 'onload' => 'javascript:onLoadAction('."'".$mode."'".');', 'onunload' => 'javascript:window.name = '."'loncapaclient'"}}); - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(&mt('Stored Links').&Apache::loncommon::help_open_topic('Wishlist')); + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(&mt('Stored Links'),'Wishlist'); # get javascript-code for wishlist-interactions my $js = &JSforWishlist(); @@ -1786,25 +1809,28 @@ SCRIPT # Returns the HTML-Markup for the page, shown when a link was set sub makePageSet { - # start_page - my $startPage = &Apache::loncommon::start_page('Stored Links',undef, - {'only_body' => 1}); + my $title = 'Stored Links'; + + # start_page + my $output = + &Apache::loncommon::start_page($title,undef, + {'only_body' => 1}) + .'

'.&mt($title).'

'; # confirm success and offer link to wishlist - my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Link successfully saved!')); - $message = &Apache::loncommon::confirmwrapper($message); - - my $inner .= '
'.$message.'

'. - ''.&mt('Go to Stored Links').''.(' ' x 3). - ''.&mt('Close this window').''; + $output .= + &Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success( + &mt('Link successfully saved!'))) + .&Apache::lonhtmlcommon::actionbox( + [''.&mt('Go to Stored Links').'', + ''.&mt('Close this window').'' + ]); # end_page - my $endPage = &Apache::loncommon::end_page(); + $output .= &Apache::loncommon::end_page(); - # put all page-elements together - my $page = $startPage.$inner.$endPage; - - return $page; + return $output; } @@ -1846,13 +1872,13 @@ sub makePageImport { #FIXME Saved string containing all folders in wishlist.db-file (key 'folders') in first version of lonwishlist #After splitting lonwishlist into two modules, this is not necessary anymore. So, dependent from when the wishlist #was first called (i.e. when wishlist.db was created), there might be an entry 'folders' or not. Number of links in - #wishlist.db depends on wether this entry exists or not...JW + #wishlist.db depends on whether this entry exists or not...JW my $fnum; if (defined $wishlist{'folders'}) { - $fnum = (keys %wishlist)-2; + $fnum = (keys(%wishlist))-2; } else { - $fnum = (keys %wishlist)-1; + $fnum = (keys(%wishlist))-1; } $inner .= '
'. @@ -1894,14 +1920,14 @@ sub makeErrorPage { # breadcrumbs and start_page &Apache::lonhtmlcommon::add_breadcrumb( { href => '/adm/wishlist', - text => 'Wishlist'}); + text => 'Stored Links'}); my $startPage = &Apache::loncommon::start_page('Stored Links'); - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(&mt('Stored Links').&Apache::loncommon::help_open_topic('Wishlist')); + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(&mt('Stored Links'),'Wishlist'); &Apache::lonhtmlcommon::clear_breadcrumbs(); # error-message - my $inner .= ''.&mt('An error occurred! Please try again later.').''; + my $inner .= '

'.&mt('An error occurred! Please try again later.').'

'; # end_page my $endPage = &Apache::loncommon::end_page(); @@ -2102,7 +2128,7 @@ sub HashToTree { my @TreeNodes = (); my $root; - foreach my $key (keys %$TreeHash) { + foreach my $key (keys(%$TreeHash)) { if ($key eq 'root') { $root = Tree->new("root"); }