Indicate that a collapsed thread has flagged children (#5013)

pull/5241/head
Aleksander Machniak 8 years ago
parent 21e485ad50
commit 344b0af9c6

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Indicate that a collapsed thread has flagged children (#5013)
- Implemented message/rfc822 attachment preview
- Update to jsTimezoneDetect 1.0.6
- Managesieve: Support 'duplicate' extension [RFC 7352]

@ -2038,8 +2038,9 @@ 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?flags.unread_children:0,
parent_uid: flags.parent_uid?flags.parent_uid:0,
unread_children: flags.unread_children || 0,
flagged_children: flags.flagged_children || 0,
parent_uid: flags.parent_uid || 0,
selected: this.select_all_mode || this.message_list.in_selection(uid),
ml: flags.ml?1:0,
ctype: flags.ctype,
@ -2119,6 +2120,9 @@ function rcube_webmail()
if (flags.unread_children && flags.seen && !message.expanded)
row_class += ' unroot';
if (flags.flagged_children && !message.expanded)
row_class += ' flaggedroot';
}
tree += '<span id="msgicn'+row.id+'" class="'+css_class+status_class+'" title="'+status_label+'"></span>';
@ -2156,7 +2160,7 @@ function rcube_webmail()
html = '<span class="attachment" title="'+label+'"></span>';
else if (/multipart\/report/.test(flags.ctype))
html = '<span class="report"></span>';
else
else
html = '&nbsp;';
}
else if (c == 'status') {
@ -2577,9 +2581,10 @@ function rcube_webmail()
{
var row = this.message_list.rows[uid];
// handle unread_children mark
// handle unread_children/flagged_children mark
row.expanded = !row.expanded;
this.set_unread_children(uid);
this.set_flagged_children(uid);
row.expanded = !row.expanded;
this.message_list.expand_row(e, uid);
@ -2712,7 +2717,13 @@ function rcube_webmail()
}
else if (flag == 'unread' && p.has_children) {
// unread_children may be undefined
p.unread_children = p.unread_children ? p.unread_children + 1 : 1;
p.unread_children = (p.unread_children || 0) + 1;
}
else if (flag == 'unflagged' && p.flagged_children) {
p.flagged_children--;
}
else if (flag == 'flagged' && p.has_children) {
p.flagged_children = (p.flagged_children || 0) + 1;
}
else {
return;
@ -2720,6 +2731,7 @@ function rcube_webmail()
this.set_message_icon(root);
this.set_unread_children(root);
this.set_flagged_children(root);
};
// update thread indicators for all messages in a thread below the specified message
@ -2737,13 +2749,21 @@ function rcube_webmail()
if (!row.depth) // root message: decrease roots count
count--;
else if (row.unread) {
// update unread_children for thread root
// update unread_children for thread root
if (row.depth && row.unread) {
parent = this.message_list.find_root(uid);
rows[parent].unread_children--;
this.set_unread_children(parent);
}
// update unread_children for thread root
if (row.depth && row.flagged) {
parent = this.message_list.find_root(uid);
rows[parent].flagged_children--;
this.set_flagged_children(parent);
}
parent = row.parent_uid;
// childrens
@ -2785,9 +2805,11 @@ function rcube_webmail()
row = row.nextSibling;
}
// update unread_children for roots
for (r=0; r<roots.length; r++)
// update unread_children/flagged_children for roots
for (r=0; r<roots.length; r++) {
this.set_unread_children(roots[r].uid);
this.set_flagged_children(roots[r].uid);
}
return count;
};
@ -2886,6 +2908,9 @@ function rcube_webmail()
if (row.unread != status)
this.update_thread_root(uid, status ? 'unread' : 'read');
}
else if (flag == 'flagged') {
this.update_thread_root(uid, status ? 'flagged' : 'unflagged');
}
if ($.inArray(flag, ['unread', 'deleted', 'replied', 'forwarded', 'flagged']) > -1)
row[flag] = status;
@ -2917,10 +2942,20 @@ function rcube_webmail()
if (row.parent_uid)
return;
if (!row.unread && row.unread_children && !row.expanded)
$(row.obj).addClass('unroot');
else
$(row.obj).removeClass('unroot');
var enable = !row.unread && row.unread_children && !row.expanded;
$(row.obj)[enable ? 'addClass' : 'removeClass']('unroot');
};
// sets flaggedroot (flagged_children) class of parent row
this.set_flagged_children = function(uid)
{
var row = this.message_list.rows[uid];
if (row.parent_uid)
return;
var enable = row.flagged_children && !row.expanded;
$(row.obj)[enable ? 'addClass' : 'removeClass']('flaggedroot');
};
// copy selected messages to the specified mailbox

@ -936,7 +936,7 @@ class rcube_imap extends rcube_storage
/**
* protected method for setting threaded messages flags:
* depth, has_children and unread_children
* depth, has_children, unread_children, flagged_children
*
* @param array $headers Reference to headers array indexed by message UID
* @param rcube_result_thread $threads Threads data object
@ -955,8 +955,12 @@ class rcube_imap extends rcube_storage
if (!empty($parents)) {
$headers[$uid]->parent_uid = end($parents);
if (empty($header->flags['SEEN']))
if (empty($header->flags['SEEN'])) {
$headers[$parents[0]]->unread_children++;
}
if (!empty($header->flags['FLAGGED'])) {
$headers[$parents[0]]->flagged_children++;
}
}
array_push($parents, $uid);

@ -518,6 +518,8 @@ function rcmail_js_message_list($a_headers, $insert_top=false, $a_show_cols=null
$a_msg_flags['has_children'] = $header->has_children;
if ($header->unread_children)
$a_msg_flags['unread_children'] = $header->unread_children;
if ($header->flagged_children)
$a_msg_flags['flagged_children'] = $header->flagged_children;
if ($header->others['list-post'])
$a_msg_flags['ml'] = 1;
if ($header->priority)

@ -746,6 +746,11 @@ table.messagelist.fixedcopy
background-position: 0 -290px;
}
.messagelist tr.flaggedroot td.flag span
{
background-position: 0 -136px;
}
.messagelist tr > .flag span.flagged
{
background-position: 0 -153px;

@ -441,6 +441,11 @@ table.messagelist.fixedcopy {
background-position: 0 -1845px;
}
/* thread parent message with flagged children */
.messagelist tbody tr.flaggedroot td.flag span {
background-position: -23px -1076px;
}
.messagelist tbody tr td.flag span.flagged {
background-position: 0 -1036px;
}

Loading…
Cancel
Save