diff options
author | Aleksander Machniak <alec@alec.pl> | 2012-11-20 09:56:43 +0100 |
---|---|---|
committer | Aleksander Machniak <alec@alec.pl> | 2012-11-23 09:31:44 +0100 |
commit | 4e10778caf04d05c90caa827212a141d3a4a619f (patch) | |
tree | d9774341e67ff5794d4a05adea7c44f1f4b75c89 /program/js/list.js | |
parent | a0682b56d174bc801916f60f85f31f0513b660c6 (diff) |
Fix selection of collapsed thread rows (#1488772)
Conflicts:
CHANGELOG
Diffstat (limited to 'program/js/list.js')
-rw-r--r-- | program/js/list.js | 87 |
1 files changed, 63 insertions, 24 deletions
diff --git a/program/js/list.js b/program/js/list.js index 76ccaa535..f101804bb 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -528,6 +528,7 @@ collapse_all: function(row) return false; }, + expand_all: function(row) { var depth, new_row, r; @@ -563,6 +564,7 @@ expand_all: function(row) return false; }, + update_expando: function(uid, expanded) { var expando = document.getElementById('rcmexpando' + uid); @@ -735,7 +737,7 @@ select_first: function(mod_key) /** - * Select last row + * Select last row */ select_last: function(mod_key) { @@ -756,25 +758,13 @@ select_last: function(mod_key) /** * Add all childs of the given row to selection */ -select_childs: function(uid) +select_children: function(uid) { - if (!this.rows[uid] || !this.rows[uid].has_children) - return; - - var depth = this.rows[uid].depth, - row = this.rows[uid].obj.nextSibling; + var i, children = this.row_children(uid), len = children.length; - while (row) { - if (row.nodeType == 1) { - if ((r = this.rows[row.uid])) { - if (!r.depth || r.depth <= depth) - break; - if (!this.in_selection(r.uid)) - this.select_row(r.uid, CONTROL_KEY); - } - } - row = row.nextSibling; - } + for (i=0; i<len; i++) + if (!this.in_selection(children[i])) + this.select_row(children[i], CONTROL_KEY); }, @@ -932,17 +922,22 @@ get_single_selection: function() */ highlight_row: function(id, multiple) { - if (this.rows[id] && !multiple) { + if (!this.rows[id]) + return; + + if (!multiple) { if (this.selection.length > 1 || !this.in_selection(id)) { this.clear_selection(); this.selection[0] = id; $(this.rows[id].obj).addClass('selected'); } } - else if (this.rows[id]) { + else { if (!this.in_selection(id)) { // select row - this.selection[this.selection.length] = id; + this.selection.push(id); $(this.rows[id].obj).addClass('selected'); + if (!this.rows[id].expanded) + this.highlight_children(id, true); } else { // unselect row var p = $.inArray(id, this.selection), @@ -951,12 +946,30 @@ highlight_row: function(id, multiple) this.selection = a_pre.concat(a_post); $(this.rows[id].obj).removeClass('selected').removeClass('unfocused'); + if (!this.rows[id].expanded) + this.highlight_children(id, false); } } }, /** + * Highlight/unhighlight all childs of the given row + */ +highlight_children: function(id, status) +{ + var i, selected, + children = this.row_children(id), len = children.length; + + for (i=0; i<len; i++) { + selected = this.in_selection(children[i]); + if ((status && !selected) || (!status && selected)) + this.highlight_row(children[i], true); + } +}, + + +/** * Handler for keyboard events */ key_press: function(e) @@ -1102,7 +1115,7 @@ drag_mouse_move: function(e) else return rcube_event.cancel(e); } - + if (this.drag_start) { // check mouse movement, of less than 3 pixels, don't start dragging var m = rcube_event.get_mouse_pos(e); @@ -1119,8 +1132,8 @@ drag_mouse_move: function(e) var n, uid, selection = $.merge([], this.selection); for (n in selection) { uid = selection[n]; - if (this.rows[uid].has_children && !this.rows[uid].expanded) - this.select_childs(uid); + if (!this.rows[uid].expanded) + this.select_children(uid); } // reset content @@ -1341,6 +1354,32 @@ column_drag_mouse_up: function(e) /** + * Returns IDs of all rows in a thread (except root) for specified root + */ +row_children: function(uid) +{ + if (!this.rows[uid] || !this.rows[uid].has_children) + return []; + + var res = [], depth = this.rows[uid].depth, + row = this.rows[uid].obj.nextSibling; + + while (row) { + if (row.nodeType == 1) { + if ((r = this.rows[row.uid])) { + if (!r.depth || r.depth <= depth) + break; + res.push(r.uid); + } + } + row = row.nextSibling; + } + + return res; +}, + + +/** * Creates a layer for drag&drop over iframes */ add_dragfix: function() |