From 7eecf873da8d2f28e20dc8fd0e949e6abc5762b4 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Mon, 09 Dec 2013 13:16:14 -0500
Subject: [PATCH] Fix issue where children of selected and collapsed thread were skipped on various actions (#1489457)

---
 program/js/list.js |   40 +++++++++++++++++++++++++++++-----------
 CHANGELOG          |    1 +
 program/js/app.js  |   17 ++---------------
 3 files changed, 32 insertions(+), 26 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 3f1bcf3..cb3221d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fix issue where children of selected and collapsed thread were skipped on various actions (#1489457)
 - Fix issue where groups were not deleted when "Replace entire addressbook" option on contacts import was used (#1489420)
 - Fix unreliable mimetype tests in Installer (#1489453)
 - Fix performance of listing writeable folders (#1489451)
diff --git a/program/js/app.js b/program/js/app.js
index 398417a..bad8a2f 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -2662,20 +2662,7 @@
   // delete selected messages from the current mailbox
   this.delete_messages = function(event)
   {
-    var uid, i, len, trash = this.env.trash_mailbox,
-      list = this.message_list,
-      selection = list ? list.get_selection() : [];
-
-    // exit if no mailbox specified or if selection is empty
-    if (!this.env.uid && !selection.length)
-      return;
-
-    // also select childs of collapsed rows
-    for (i=0, len=selection.length; i<len; i++) {
-      uid = selection[i];
-      if (list.rows[uid].has_children && !list.rows[uid].expanded)
-        list.select_children(uid);
-    }
+    var list = this.message_list, trash = this.env.trash_mailbox;
 
     // if config is set to flag for deletion
     if (this.env.flag_for_deletion) {
@@ -2715,7 +2702,7 @@
     this._with_selected_messages('delete', post_data);
   };
 
-  // Send a specifc move/delete request with UIDs of all selected messages
+  // Send a specific move/delete request with UIDs of all selected messages
   // @private
   this._with_selected_messages = function(action, post_data, lock)
   {
diff --git a/program/js/list.js b/program/js/list.js
index f33be87..8677f02 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -542,17 +542,18 @@
 
 collapse: function(row)
 {
+  var r, depth = row.depth,
+    new_row = row ? row.obj.nextSibling : null;
+
   row.expanded = false;
   this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded, obj:row.obj });
-  var depth = row.depth;
-  var new_row = row ? row.obj.nextSibling : null;
-  var r;
 
   while (new_row) {
     if (new_row.nodeType == 1) {
-      var r = this.rows[new_row.uid];
+      r = this.rows[new_row.uid];
       if (r && r.depth <= depth)
         break;
+
       $(new_row).css('display', 'none');
       if (r.expanded) {
         r.expanded = false;
@@ -564,6 +565,7 @@
 
   this.resize();
   this.triggerEvent('listupdate');
+
   return false;
 },
 
@@ -961,7 +963,7 @@
 in_selection: function(id)
 {
   for (var n in this.selection)
-    if (this.selection[n]==id)
+    if (this.selection[n] == id)
       return true;
 
   return false;
@@ -1057,9 +1059,26 @@
 /**
  * Getter for the selection array
  */
-get_selection: function()
+get_selection: function(deep)
 {
-  return this.selection;
+  var res = $.merge([], this.selection);
+
+  // return children of selected threads even if only root is selected
+  if (deep !== false && res.length) {
+    for (var uid, uids, i=0, len=res.length; i<len; i++) {
+      uid = res[i];
+      if (this.rows[uid].has_children && !this.rows[uid].expanded) {
+        uids = this.row_children(uid);
+        for (var j=0, uids_len=uids.length; j<uids_len; j++) {
+          uid = uids[j];
+          if (!this.in_selection(uid))
+            res.push(uid);
+        }
+      }
+    }
+  }
+
+  return res;
 },
 
 
@@ -1325,7 +1344,7 @@
     this.draglayer.html('');
 
     // get subjects of selected messages
-    var i, n, obj, me;
+    var n, obj, me = this;
     for (n=0; n<this.selection.length; n++) {
       // only show 12 lines
       if (n>12) {
@@ -1333,9 +1352,8 @@
         break;
       }
 
-      me = this;
       if (obj = this.rows[this.selection[n]].obj) {
-        $('> '+this.col_tagname(), obj).each(function(i,elem){
+        $('> '+this.col_tagname(), obj).each(function(i, elem) {
           if (n == 0)
             me.drag_start_pos = $(elem).offset();
 
@@ -1541,7 +1559,7 @@
 
   while (row) {
     if (row.nodeType == 1) {
-      if ((r = this.rows[row.uid])) {
+      if (r = this.rows[row.uid]) {
         if (!r.depth || r.depth <= depth)
           break;
         res.push(r.uid);

--
Gitblit v1.9.1