From ac4cbfc4269da0c94198fd908cbc8b6df543d423 Mon Sep 17 00:00:00 2001 From: alec Date: Tue, 18 May 2010 07:39:31 +0000 Subject: - Added threads tree icons - css/js fixes and improvements in (messages) list code git-svn-id: https://svn.roundcube.net/trunk@3625 208e9e7b-5314-0410-a742-e7e81cd9613c --- roundcubemail/program/js/app.js | 208 ++++++++++++++++++++++++++++++---------- 1 file changed, 159 insertions(+), 49 deletions(-) (limited to 'roundcubemail/program/js/app.js') diff --git a/roundcubemail/program/js/app.js b/roundcubemail/program/js/app.js index 9c5867975..71c0fcde8 100644 --- a/roundcubemail/program/js/app.js +++ b/roundcubemail/program/js/app.js @@ -87,7 +87,7 @@ function rcube_webmail() if (sel) button_prop.sel = sel; if (over) button_prop.over = over; - this.buttons[command][this.buttons[command].length] = button_prop; + this.buttons[command].push(button_prop); }; // register a specific gui object @@ -121,7 +121,7 @@ function rcube_webmail() // execute the given script on load this.add_onload = function(f) { - this.onloads[this.onloads.length] = f; + this.onloads.push(f); }; // initialize webmail client @@ -389,7 +389,7 @@ function rcube_webmail() // execute all foreign onload scripts // @deprecated - for (var i=0; i= 0) @@ -1537,6 +1537,7 @@ function rcube_webmail() } if (!row.depth && row.has_children && (expando = document.getElementById('rcmexpando'+row.uid))) { + row.expando = expando; expando.onmousedown = function(e) { return self.expand_message_row(e, uid); }; } @@ -1549,11 +1550,6 @@ function rcube_webmail() if (!this.gui_objects.messagelist || !this.message_list) return false; - if (this.message_list.background) - var tbody = this.message_list.background; - else - var tbody = this.gui_objects.messagelist.tBodies[0]; - if (!this.env.messages[uid]) this.env.messages[uid] = {}; @@ -1566,14 +1562,15 @@ function rcube_webmail() flagged: flags.flagged?1:0, has_children: flags.has_children?1:0, depth: flags.depth?flags.depth:0, - unread_children: flags.unread_children, - parent_uid: flags.parent_uid, + unread_children: flags.unread_children?flags.unread_children:0, + parent_uid: flags.parent_uid?flags.parent_uid:0, selected: this.select_all_mode || this.message_list.in_selection(uid) }); var c, tree = expando = '', list = this.message_list, rows = list.rows, + tbody = this.gui_objects.messagelist.tBodies[0], rowcount = tbody.rows.length, even = rowcount%2, message = this.env.messages[uid], @@ -1656,7 +1653,7 @@ function rcube_webmail() } // add each submitted col - for (var n = 0; n < this.env.coltypes.length; n++) { + for (var n in this.env.coltypes) { c = this.env.coltypes[n]; col = document.createElement('td'); col.className = String(c).toLowerCase(); @@ -1969,6 +1966,99 @@ function rcube_webmail() } }; + // Initializes threads indicators/expanders after list update + this.init_threads = function(roots) + { + for (var n=0, len=roots.length; n=0; i--) { + len = tmp[i].length; + if (len > r.depth) { + pos = len - r.depth; + if (!(tmp[i][pos] & 2)) + tmp[i][pos] = tmp[i][pos] ? tmp[i][pos]+2 : 2; + } + else if (len == r.depth) { + if (!(tmp[i][0] & 2)) + tmp[i][0] += 2; + } + if (r.depth > len) + break; + } + + tmp.push(new Array(r.depth)); + tmp[tmp.length-1][0] = 1; + uid.push(r.uid); + } + else { + if (tmp.length) { + for (i in tmp) { + this.set_tree_icons(uid[i], tmp[i]); + } + tmp = []; + uid = []; + } + if (root && row != rows[root].obj) + break; + } + } + row = row.nextSibling; + } + + if (tmp.length) { + for (i in tmp) { + this.set_tree_icons(uid[i], tmp[i]); + } + } + }; + + // adds tree icons to specified message row + this.set_tree_icons = function(uid, tree) + { + var i, divs = [], html = '', len = tree.length; + + for (i=0; i 2) + divs.push({'class': 'l3', width: 15}); + else if (tree[i] > 1) + divs.push({'class': 'l2', width: 15}); + else if (tree[i] > 0) + divs.push({'class': 'l1', width: 15}); + // separator div + else if (divs.length && !divs[divs.length-1]['class']) + divs[divs.length-1].width += 15; + else + divs.push({'class': null, width: 15}); + } + + for (i=divs.length-1; i>=0; i--) { + if (divs[i]['class']) + html += '
'; + else + html += '
'; + } + + if (html) + $('#rcmtab'+uid).html(html); + }; + // update parent in a thread this.update_thread_root = function(uid, flag) { @@ -2029,7 +2119,8 @@ function rcube_webmail() break; r.depth--; // move left - $('#rcmtab'+r.uid).width(r.depth * 15); + // reset width and clear the content of a tab, icons will be added later + $('#rcmtab'+r.uid).width(r.depth * 15).html(''); if (!r.depth) { // a new root count++; // increase roots count r.parent_uid = 0; @@ -2042,7 +2133,7 @@ function rcube_webmail() function(e) { return e.data.p.expand_message_row(e, e.data.uid); }); r.unread_children = 0; - roots[roots.length] = r; + roots.push(r); } // show if it was hidden if (r.obj.style.display == 'none') @@ -2180,7 +2271,7 @@ function rcube_webmail() { var row = this.message_list.rows[uid]; - if (row.parent_uid || !row.has_children) + if (row.parent_uid) return; if (!row.unread && row.unread_children && !row.expanded) @@ -2199,17 +2290,15 @@ function rcube_webmail() if (!mbox || mbox == this.env.mailbox || (!this.env.uid && (!this.message_list || !this.message_list.get_selection().length))) return; - var add_url = '&_target_mbox='+urlencode(mbox)+'&_from='+(this.env.action ? this.env.action : ''); - var a_uids = []; + var a_uids = [], + add_url = '&_target_mbox='+urlencode(mbox)+'&_from='+(this.env.action ? this.env.action : ''); if (this.env.uid) a_uids[0] = this.env.uid; else { var selection = this.message_list.get_selection(); - var id; - for (var n=0; n