[LON-CAPA-cvs] cvs: loncom /interface londocs.pm lonmenu.pm lonwishlist.pm

wenzelju wenzelju@source.lon-capa.org
Mon, 16 Aug 2010 08:58:39 -0000


This is a MIME encoded message

--wenzelju1281949119
Content-Type: text/plain

wenzelju		Mon Aug 16 08:58:39 2010 EDT

  Modified files:              
    /loncom/interface	londocs.pm lonmenu.pm lonwishlist.pm 
  Log:
  londocs, lonmenu, lonwishlist:
  - Added import-functionality for wishlist.
  
  lonwishlist:
  - Replaced getkeys() and get() by dump().
  - Preview of links in wishlist now in Popup.
  - Some little style changes (inserted <p> etc.). 
  
  
--wenzelju1281949119
Content-Type: text/plain
Content-Disposition: attachment; filename="wenzelju-20100816085839.txt"

Index: loncom/interface/londocs.pm
diff -u loncom/interface/londocs.pm:1.434 loncom/interface/londocs.pm:1.435
--- loncom/interface/londocs.pm:1.434	Mon Aug 16 03:49:33 2010
+++ loncom/interface/londocs.pm	Mon Aug 16 08:58:39 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.434 2010/08/16 03:49:33 raeburn Exp $
+# $Id: londocs.pm,v 1.435 2010/08/16 08:58:39 wenzelju Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2921,6 +2921,7 @@
                 'srch' => 'Search',
                 'impo' => 'Import',
 		'book' => 'Import Bookmarks',
+		'wish' => 'Import from Wishlist',
                 'selm' => 'Select Map',
                 'load' => 'Load Map',
                 'reco' => 'Recover Deleted Documents',
@@ -2994,6 +2995,7 @@
 	{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => "$uploadtag<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },
 	{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },
 	{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/vbkm.png" alt="'.$lt{book}.'" onclick="javascript:groupopen(0,1,1);" />' => "<a class='LC_menubuttons_link' href='javascript:groupopen(0,1,1);'>$lt{'book'}</a>" },
+	{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{wish}.'" onclick="javascript:open_Wishlist_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_Wishlist_Import();'>$lt{'wish'}</a>" },
 	);
 	$simpleeditdefaultform .= create_form_ul(create_list_elements(@simpleeditdefaultforma));
 	$simpleeditdefaultform .=(<<SEDFFORM);
Index: loncom/interface/lonmenu.pm
diff -u loncom/interface/lonmenu.pm:1.333 loncom/interface/lonmenu.pm:1.334
--- loncom/interface/lonmenu.pm:1.333	Fri Aug 13 13:46:18 2010
+++ loncom/interface/lonmenu.pm	Mon Aug 16 08:58:39 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines to control the menu
 #
-# $Id: lonmenu.pm,v 1.333 2010/08/13 13:46:18 wenzelju Exp $
+# $Id: lonmenu.pm,v 1.334 2010/08/16 08:58:39 wenzelju Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1328,6 +1328,12 @@
    wishlistlink.document.close();
 }
 
+function open_Wishlist_Import() {
+   var newWin = window.open('/adm/wishlist?inhibitmenu=yes&mode=import',
+                            'wishlistImport','scrollbars=1,resizable=1,menubar=0');
+   newWin.focus();
+}
+
 ENDUTILITY
 }
 
Index: loncom/interface/lonwishlist.pm
diff -u loncom/interface/lonwishlist.pm:1.1 loncom/interface/lonwishlist.pm:1.2
--- loncom/interface/lonwishlist.pm:1.1	Tue Aug 10 14:30:20 2010
+++ loncom/interface/lonwishlist.pm	Mon Aug 16 08:58:39 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines to control the wishlist
 #
-# $Id: lonwishlist.pm,v 1.1 2010/08/10 14:30:20 wenzelju Exp $
+# $Id: lonwishlist.pm,v 1.2 2010/08/16 08:58:39 wenzelju Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -36,6 +36,7 @@
 use Apache::loncommon();
 use Apache::lonhtmlcommon;
 use Apache::lonlocal;
+use LONCAPA;
 use Tree;
 
 
@@ -51,16 +52,14 @@
 
 # Read wishlist from user-data
 sub getWishlist {
-    my @wishlistkeys = &Apache::lonnet::getkeys('wishlist');
-    my %wishlist = &Apache::lonnet::get('wishlist',\@wishlistkeys);
-   foreach my $i (%wishlist) {
+    my %wishlist = &Apache::lonnet::dump('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/) {
            &Apache::lonnet::logthis($i.'! Create file by putting in the "root" of the directory tree.');
            &Apache::lonnet::put('wishlist', {'root' => ''});
-           @wishlistkeys = &Apache::lonnet::getkeys('wishlist');
-           %wishlist = &Apache::lonnet::get('wishlist',\@wishlistkeys);
+           %wishlist = &Apache::lonnet::dump('wishlist');
        }
        elsif ($i =~ /^(con_lost|error|no_such_host)/i) {
            &Apache::lonnet::logthis('ERROR while attempting to get wishlist: '.$i);
@@ -68,7 +67,8 @@
        }
     }
 
-    #If hash is empty, put 'root' into it, so we got a node to start the tree
+    # if we got no keys in hash returned by dump(), return error.
+    # wishlist will not be loaded, instead the user will be asked to try again later
     if ((keys %wishlist) == 0) {
         &Apache::lonnet::logthis('ERROR while attempting to get wishlist: no keys retrieved!');
         return 'error';
@@ -148,6 +148,7 @@
     my $indexParent = shift;
     my @nodesToMove = ();
 
+    # get all nodes that should be moved
     &getNodesToArray(\@childrenRt);
     foreach my $index (@$indexNodesToMove) {
         my $foundNode = &Tree::getNodeByIndex($index, \@allNodes);
@@ -241,7 +242,7 @@
        $root = &Tree::HashToTree();
        @childrenRt = $root->children();
        &getFoldersForOption(\@childrenRt);
-       my $options = '<option value="" selected="selected"></option>'.$foldersOption;
+       my $options = '<option value="" selected="selected">('.&mt('Top level').')</option>'.$foldersOption;
        $foldersOption = '';
        return $options;
    }
@@ -321,7 +322,7 @@
                         '<br/><br/>'.
                         '<input type="submit" value="'.$lt{'si'}.'" />'.
                         '<select name="folders">'.
-                        '<option value="" selected="selected"></option>'.
+                        '<option value="" selected="selected">('.&mt('Top level').')</option>'.
                         $foldersOption.
                         '</select>'.
                         '<input type="button" value="'.$lt{'cl'}.'" onclick="javascript:window.close();" />'.
@@ -341,7 +342,7 @@
                           '<br/><br/>'.
                           '<input type="submit" value="'.$lt{'si'}.'" />'.
                           '<select name="folders">'.
-                          '<option value="" selected="selected"></option>'.
+                          '<option value="" selected="selected">('.&mt('Top level').')</option>'.
                           $foldersOption.
                           '</select>'.
                           '<input type="button" value="'.$lt{'cl'}.'" onclick="javascript:window.close();" />'.
@@ -413,7 +414,7 @@
             r = true;
         }
         document.getElementsByName('list')[0].setAttribute("action", "/adm/wishlist?mode="+mode); 
-        if(r){
+        if (r) {
             document.getElementsByName('list')[0].submit(); 
         }
     }
@@ -799,6 +800,39 @@
         return false;
     }
 
+    function preview(url) {
+       var newWin = window.open(url+'?inhibitmenu=yes','preview','width=560,height=350,scrollbars=yes');
+       newWin.focus();
+    }
+
+    function finish_import() {
+        opener.document.forms.simpleedit.importdetail.value='';
+        for (var num = 0; num < document.forms.groupsort.fnum.value; num++) {
+            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")+'='+
+                eval("document.forms.groupsort.filelink"+num+".value")+'='+
+                eval("document.forms.groupsort.id"+num+".value");
+            }
+        }
+        opener.document.forms.simpleedit.submit();
+        self.close();
+    }
+
+    function checkAll() {
+        var checkboxes = document.getElementsByName('check');
+        for (var i = 0; i < checkboxes.length; i++) {
+            checkboxes[i].checked = "checked";
+        }
+    }
+
+    function uncheckAll() {
+        var checkboxes = document.getElementsByName('check');
+        for (var i = 0; i < checkboxes.length; i++) {
+            checkboxes[i].checked = "";
+        }
+    }
+
 JAVASCRIPT
    return $js;
 }
@@ -834,8 +868,9 @@
         # entry is a link
         else {
             $wishlistHTMLview .= '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<=0?$indentConst:$indent).'px; min-width: 220px;">'.
+                                 '<a href="javascript:preview('."'".$n->value()->path()."'".');">'.
                                  '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link" />'.
-                                 '<a href="'.$n->value()->path().'">'.$n->value()->title().'</a></td>';
+                                 $n->value()->title().'</a></td>';
         }
 
         # note-icon, different icons for an entries with note and those without
@@ -999,19 +1034,17 @@
         }
         # entry is a link
         else {
-            if (!$isIn) {
-                $wishlistHTMLmove .= '<td></td>'.
-                                     '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<=0?$indentConst:$indent).'px; min-width: 220px;">';
-            }
             # higlight the title, if the link was selected to be moved
-            else {
-                $wishlistHTMLmove .= '<td></td>'.
-                                     '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<=0?$indentConst:$indent).'px; min-width: 220px;'.
-                                     'color:red;">';
+            my $highlight = '';
+            if ($isIn) {
+               $highlight = 'style="color:red;"';
             }
             # link-image and title
-            $wishlistHTMLmove .= '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link"/>'.
-                                 $n->value()->title().'</td>';
+            $wishlistHTMLmove .= '<td></td>'.
+                                 '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<=0?$indentConst:$indent).'px; min-width: 220px;">'.
+                                 '<a href="javascript:preview('."'".$n->value()->path()."'".');" '.$highlight.'>'.
+                                 '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link"/>'.
+                                 $n->value()->title().'</a></td>';
         }
 
         # note-icon, different icons for an entries with note and those without
@@ -1045,6 +1078,81 @@
     }
 }
 
+
+
+# HTML-Markup for table if in import-mode
+my $wishlistHTMLimport;
+my $indent = $indentConst;
+my $form = 1;
+sub wishlistImport {
+    my $nodes = shift;
+
+    foreach my $n (@$nodes) {
+        my $index = $n->value()->nindex();
+
+        # start row, use data_table routines to set class to LC_even or LC_odd automatically. this row contains a checkbox, the title and the note-icon.
+        # only display the top level entries on load
+        $wishlistHTMLimport .= ($n->parent()->value() eq 'root')?&Apache::loncommon::start_data_table_row('','row'.$index)
+                                                                :&Apache::loncommon::continue_data_table_row('LC_hidden','row'.$index);
+
+ 
+        # checkboxes
+        $wishlistHTMLimport .= '<td>'.
+                               '<input type="checkbox" name="check" id="check'.$index.'" value="'.$index.'" '.
+                               'onclick="selectAction('."'row".$index."'".')"/>'.
+                               '<input type="hidden" name="title'.$index.'" value="'.&escape($n->value()->title()).'">'.
+                               '<input type="hidden" name="filelink'.$index.'" value="'.&escape($n->value()->path()).'">'.
+                               '<input type="hidden" name="id'.$index.'">'.
+                               '</td>';
+
+        # entry is a folder
+        if ($n->value()->path() eq '') {
+            $wishlistHTMLimport .= '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<0?0:($indent-$indentConst)).'px; min-width: 220px;">'.
+                                   '<a href="javascript:;" onclick="folderAction('."'row".$index."'".')" style="vertical-align:top">'.
+                                   '<img src="/adm/lonIcons/arrow.closed.gif" id="img'.$index.'" alt = "" class="LC_icon"/>'.
+                                   '<img src="/adm/lonIcons/navmap.folder.closed.gif" id="imgFolder'.$index.'" alt="folder"/>'.
+                                   $n->value()->title().'</a></td>';
+        }
+        # entry is a link
+        else {
+            $wishlistHTMLimport .= '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<=0?$indentConst:$indent).'px; min-width: 220px;">'.
+                                   '<a href="javascript:preview('."'".$n->value()->path()."'".');">'.
+                                   '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link" />'.
+                                   $n->value()->title().'</a></td>';
+                                   $form++;
+        }
+
+        # note-icon, different icons for an entries with note and those without
+        my $noteIMG = 'anot.png';
+
+        if ($n->value()->note() ne '') {
+            $noteIMG = 'anot2.png';
+        }
+
+        $wishlistHTMLimport .= '<td style="padding-left:10px;"><a href="javascript:;" onclick="setDisplayNote('."'note".$index."'".')">'.
+                             '<img id="noteImg'.$index.'" src="/res/adm/pages/'.$noteIMG.'" alt="'.&mt('Note').'" title="'.&mt('Note').'" '.
+                             ' class="LC_icon"/></a></td>';
+
+        $wishlistHTMLimport .= &Apache::loncommon::end_data_table_row();
+
+        # start row containing the textarea for the note, do not display note on default, readonly in import-mode
+        $wishlistHTMLimport .= &Apache::loncommon::continue_data_table_row('LC_hidden','note'.$index).
+                             '<td></td><td>'.
+                             '<textarea id="noteText'.$index.'" cols="25" rows="3" style="width:100%" '.
+                             'name="newnote" readonly="readonly">'.
+                             $n->value()->note().'</textarea></td><td></td>';
+        $wishlistHTMLimport .= &Apache::loncommon::end_data_table_row();
+
+        # 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;
+            &wishlistImport(\@children);
+            $indent -= 20;
+        }
+    }
+}
+
 # Returns the HTML-Markup for wishlist
 sub makePage {
     my $mode = shift;
@@ -1142,7 +1250,7 @@
                  '<input type="hidden" id="action" name="action" value=""/>';
  
     # only display subbox in view- or edit-mode
-    if ($mode ne 'move') {
+    if ($mode eq 'view' || $mode eq 'edit') {
         $inner .= $subbox;
     }
 
@@ -1155,7 +1263,7 @@
             $inner .= &Apache::loncommon::end_data_table();
         }
         else {
-            $inner .= '<span class="LC_info">'.&mt("Your wihlist ist currently empty.").'</span>';
+            $inner .= '<span class="LC_info">'.&mt("Your wishlist ist currently empty.").'</span>';
         }
         $wishlistHTMLedit = '';
     }
@@ -1165,7 +1273,7 @@
             $inner .= '<table class="LC_data_table LC_tableOfContent">'.$wishlistHTMLview.'</table>';
         }
         else {
-            $inner .= '<span class="LC_info">'.&mt("Your wihlist ist currently empty.").'</span>';
+            $inner .= '<span class="LC_info">'.&mt("Your wishlist ist currently empty.").'</span>';
         }
         $wishlistHTMLview = '';
     }
@@ -1177,8 +1285,8 @@
         if ($markStr) {
             $markStr = substr($markStr, 0, length($markStr)-1);
             $inner .= '<input type="hidden" value="'.$markStr.'" name="markedToMove"/>';
-            $inner .= '<span class="LC_info">'.&mt('You have selected the red marked entries to be moved to another folder. '.
-                                                   'Now choose the new destination folder.').'</span><br/><br/>';
+            $inner .= '<p><span class="LC_info">'.&mt('You have selected the red marked entries to be moved to another folder. '.
+                                                   'Now choose the new destination folder.').'</span></p>';
             &wishlistMove(\@childrenRt, $marked);
             $inner .= '<table class="LC_data_table LC_tableOfContent">'.$wishlistHTMLmove.'</table><br/><br/>';
             $inner .= '<input type="button" value="'.&mt('Move').'" onclick="setFormAction('."'','view'".'); selectDestinationFolder()"/>'.
@@ -1188,7 +1296,7 @@
                                '<td>'.&mt('Top level').'</td><td></td></tr>';
         }
         else {
-            $inner .= '<span class="LC_info">'.&mt("You haven't marked any entry to move.").'</span><br/>'.
+            $inner .= '<p><span class="LC_info">'.&mt("You haven't marked any entry to move.").'</span></p>'.
                       '<input type="button" value="'.&mt('Back').'" onclick="go('."'/adm/wishlist'".')"/>';
         }
     }
@@ -1199,7 +1307,7 @@
     # end_page 
     my $endPage =  &Apache::loncommon::end_page();
 
-    # put all page-elements togther
+    # put all page-elements together
     my $page = $startPage.$breadcrumbs.$js.$inner.$endPage;
 
     return $page;
@@ -1223,13 +1331,60 @@
     # end_page 
     my $endPage =  &Apache::loncommon::end_page();
 
-    # put all page-elements togther
+    # put all page-elements together
     my $page = $startPage.$inner.$endPage;
 
     return $page;
 }
 
 
+# Returns the HTML-Markup for the page, shown when links should be imported into a course
+sub makePageImport {
+    # start_page 
+    my $startPage = &Apache::loncommon::start_page('Wishlist',undef,
+                                                   {'only_body' => 1});
+    
+    # get javascript-code for wishlist-interactions
+    my $js = &JSforWishlist();
+
+    my $inner = '<h1>'.&mt('Import Resources from Wishlist').'</h1>';
+    $inner .= '<p><span class="LC_info">'.&mt("Please note that you  can use the checkboxes corresponding to a folder to ".
+                                              "easily check all links within this folder. The folder structure itself can't be imported. ".
+                                              "All checked links will be imported into the current folder of your course.").'</span></p>';
+
+    my %wishlist = &getWishlist();
+    my $fnum = (keys %wishlist)-1;
+
+    $inner .= '<form method="post" name="groupsort">'.
+              '<input type="hidden" value="'.$fnum.'" name="fnum">'.
+              '<input type="button" onclick="javascript:checkAll()" id="checkallbutton" value="'.&mt('Check All').'">'.
+              '<input type="button" onclick="javascript:uncheckAll()" id="uncheckallbutton" value="'.&mt('Uncheck All').'">'.
+              '<input type="button" value="'.&mt('Import Checked').'" onclick="finish_import();">'.    
+              '<input type="button" value="'.&mt('Cancel').'" onclick="window.close();"><br/><br/>'; 
+
+    
+    # wishlist-table
+    &wishlistImport(\@childrenRt);
+    if ($wishlistHTMLimport ne '') {
+        $inner .= '<table class="LC_data_table LC_tableOfContent">'.$wishlistHTMLimport.'</table>';
+    }
+    else {
+        $inner .= '<span class="LC_info">'.&mt("Your wishlist ist currently empty.").'</span>';
+    }
+    $wishlistHTMLimport = '';
+
+    $inner .= '</form>';
+
+    # end_page 
+    my $endPage =  &Apache::loncommon::end_page();
+
+    # put all page-elements together
+    my $page = $startPage.$js.$inner.$endPage;
+
+    return $page;
+}
+
+
 # Returns the HTML-Markup for error-page
 sub makeErrorPage {
     # breadcrumbs and start_page 
@@ -1250,7 +1405,7 @@
     # end_page 
     my $endPage =  &Apache::loncommon::end_page();
 
-    # put all page-elements togther
+    # put all page-elements together
     my $page = $startPage.$breadcrumbs.$inner.$endPage;
 
     return $page;
@@ -1349,6 +1504,9 @@
         elsif ($env{'form.mode'} eq 'move') {
             $page = &makePage("move", \@marked);
         }
+        elsif ($env{'form.mode'} eq 'import') {
+            $page = &makePageImport();
+        }
         elsif ($env{'form.mode'} eq 'set') {
             $page = &makePageSet();
         }
@@ -1518,7 +1676,7 @@
         }
     }
     # if there are nodes, build up the tree-structure
-    if (defined $TreeHash{'root'}) {
+    if (defined $TreeHash{'root'} && $TreeHash{'root'} ne '') {
         my @childrenRtIn = @{ $TreeHash{'root'} };
         &buildTree(\$root, \@childrenRtIn,\@TreeNodes,\%TreeHash);
     }

--wenzelju1281949119--