From fb7ec576ab3a353b6eb99614e9636a9096462807 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 25 Mar 2010 12:29:02 -0400
Subject: [PATCH] - Added possibility to select all messages in a folder (#1484756)

---
 program/js/app.js |   81 ++++++++++++++++++++++------------------
 1 files changed, 44 insertions(+), 37 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 1f72909..0fc5e76 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -489,8 +489,8 @@
 
       case 'menu-open':
       case 'menu-save':
-	this.triggerEvent(command, {props:props});
-	return false;
+	    this.triggerEvent(command, {props:props});
+	    return false;
         break;
 
       case 'open':
@@ -753,10 +753,11 @@
         break;
         
       case 'select-all':
+        this.select_all_mode = props ? false : true;
         if (props == 'invert')
           this.message_list.invert_selection();
         else
-          this.message_list.select_all(props);
+          this.message_list.select_all(props == 'page' ? '' : props);
         break;
 
       case 'select-none':
@@ -1833,9 +1834,10 @@
 
     // unselect selected messages
     this.last_selected = 0;
-    if (this.message_list)
+    if (this.message_list) {
       this.message_list.clear_selection();
-    
+      this.select_all_mode = false;
+    }
     this.select_folder(mbox, this.env.mailbox);
     this.env.mailbox = mbox;
 
@@ -2254,8 +2256,8 @@
   // @private
   this._with_selected_messages = function(action, lock, add_url)
   {
-    var a_uids = new Array();
-    var count = 0;
+    var a_uids = new Array(),
+      count = 0;
 
     if (this.env.uid)
       a_uids[0] = this.env.uid;
@@ -2287,8 +2289,10 @@
       // remove threads from the end of the list
       this.delete_excessive_thread_rows();
 
+    add_url += '&_uid='+this.uids_to_list(a_uids);
+
     // send request to server
-    this.http_post(action, '_uid='+a_uids.join(',')+'&_mbox='+urlencode(this.env.mailbox)+add_url, lock);
+    this.http_post(action, '_mbox='+urlencode(this.env.mailbox)+add_url, lock);
   };
 
   // set a specific flag to one or more messages
@@ -2355,7 +2359,7 @@
     for (var i=0; i<a_uids.length; i++)
       this.set_message(a_uids[i], 'unread', (flag=='unread' ? true : false));
 
-    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
+    this.http_post('mark', '_uid='+this.uids_to_list(a_uids)+'&_flag='+flag);
 
     for (var i=0; i<a_uids.length; i++)
       this.update_thread_root(a_uids[i], flag);
@@ -2368,7 +2372,7 @@
     for (var i=0; i<a_uids.length; i++)
       this.set_message(a_uids[i], 'flagged', (flag=='flagged' ? true : false));
 
-    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
+    this.http_post('mark', '_uid='+this.uids_to_list(a_uids)+'&_flag='+flag);
   };
   
   // mark all message rows as deleted/undeleted
@@ -2412,49 +2416,48 @@
     for (var i=0; i<a_uids.length; i++)
       this.set_message(a_uids[i], 'deleted', false);
 
-    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=undelete');
+    this.http_post('mark', '_uid='+this.uids_to_list(a_uids)+'&_flag=undelete');
     return true;
   };
 
   this.flag_as_deleted = function(a_uids)
   {
-    var add_url = '';
-    var r_uids = new Array();
-    var rows = this.message_list ? this.message_list.rows : new Array();
-    var count = 0;
+    var add_url = '',
+      r_uids = new Array(),
+      rows = this.message_list ? this.message_list.rows : new Array(),
+      count = 0;
 
-    for (var i=0; i<a_uids.length; i++)
-      {
+    for (var i=0; i<a_uids.length; i++) {
       uid = a_uids[i];
-      if (rows[uid])
-        {
+      if (rows[uid]) {
         if (rows[uid].unread)
           r_uids[r_uids.length] = uid;
 
-	if (this.env.skip_deleted) {
-	  count += this.update_thread(uid);
+	    if (this.env.skip_deleted) {
+	      count += this.update_thread(uid);
           this.message_list.remove_row(uid, (this.env.display_next && i == this.message_list.selection.length-1));
-	  }
-	else
-	  this.set_message(uid, 'deleted', true);
-        }
+	    }
+	    else
+	      this.set_message(uid, 'deleted', true);
       }
+    }
 
     // make sure there are no selected rows
     if (this.env.skip_deleted && this.message_list) {
       if(!this.env.display_next)
-      this.message_list.clear_selection();
+        this.message_list.clear_selection();
       if (count < 0)
         add_url += '&_count='+(count*-1);
       else if (count > 0) 
         // remove threads from the end of the list
         this.delete_excessive_thread_rows();
-      }
+    }
 
     add_url = '&_from='+(this.env.action ? this.env.action : '');
     
+    // ??
     if (r_uids.length)
-      add_url += '&_ruid='+r_uids.join(',');
+      add_url += '&_ruid='+this.uids_to_list(r_uids);
 
     if (this.env.skip_deleted) {
       // also send search request to get the right messages 
@@ -2464,7 +2467,7 @@
         add_url += '&_next_uid='+this.env.next_uid;
     }
     
-    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=delete'+add_url);
+    this.http_post('mark', '_uid='+this.uids_to_list(a_uids)+'&_flag=delete'+add_url);
     return true;  
   };
 
@@ -2472,21 +2475,25 @@
   // argument should be a coma-separated list of uids
   this.flag_deleted_as_read = function(uids)
   {
-    var icn_src;
-    var rows = this.message_list ? this.message_list.rows : new Array();
-    var str = String(uids);
-    var a_uids = new Array();
+    var icn_src, uid,
+      rows = this.message_list ? this.message_list.rows : new Array(),
+      str = String(uids),
+      a_uids = str.split(',');
 
-    a_uids = str.split(',');
-
-    for (var uid, i=0; i<a_uids.length; i++)
-      {
+    for (var i=0; i<a_uids.length; i++) {
       uid = a_uids[i];
       if (rows[uid])
         this.set_message(uid, 'unread', false);
       }
   };
 
+  // Converts array of message UIDs to comma-separated list for use in URL
+  // with select_all mode checking
+  this.uids_to_list = function(uids)
+  {
+    return this.select_all_mode ? '*' : uids.join(',');
+  };
+  
 
   /*********************************************************/
   /*********       mailbox folders methods         *********/

--
Gitblit v1.9.1