Fix selection of collapsed thread rows (#1488772)

Conflicts:

	CHANGELOG
release-0.8
Aleksander Machniak 12 years ago
parent a0682b56d1
commit 4e10778caf

@ -3,6 +3,7 @@ CHANGELOG Roundcube Webmail
- Fix cache (in)validation after setting \Deleted flag
- Fix keybord events on messages list in opera browser (#1488823)
- Fix selection of collapsed thread rows (#1488772)
- Fix wrapping of quoted text with format=flowed (#1488177)
RELEASE 0.8.4

@ -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,11 +946,29 @@ 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
*/
@ -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
@ -1340,6 +1353,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
*/

Loading…
Cancel
Save