From 344b0af9c6c2f6531504dbc8363faa54ce9c6440 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Wed, 04 May 2016 07:33:01 -0400 Subject: [PATCH] Indicate that a collapsed thread has flagged children (#5013) --- CHANGELOG | 1 skins/classic/mail.css | 5 ++ program/lib/Roundcube/rcube_imap.php | 8 +++- program/steps/mail/func.inc | 2 + program/js/app.js | 61 ++++++++++++++++++++++++------ skins/larry/mail.css | 5 ++ 6 files changed, 67 insertions(+), 15 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 9635bcd..32a402c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -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] diff --git a/program/js/app.js b/program/js/app.js index 63b25a7..1ec2dd4 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -2038,8 +2038,9 @@ 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 @@ 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 @@ html = '<span class="attachment" title="'+label+'"></span>'; else if (/multipart\/report/.test(flags.ctype)) html = '<span class="report"></span>'; - else + else html = ' '; } else if (c == 'status') { @@ -2577,9 +2581,10 @@ { 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 @@ } 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 @@ 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,11 +2749,19 @@ 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; @@ -2785,9 +2805,11 @@ 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 @@ 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 @@ 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 diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 52ca22c..0d92273 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -936,7 +936,7 @@ /** * 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 @@ 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); diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 9cb645e..a7b19c9 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -518,6 +518,8 @@ $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) diff --git a/skins/classic/mail.css b/skins/classic/mail.css index d4e19a3..7ecccc5 100644 --- a/skins/classic/mail.css +++ b/skins/classic/mail.css @@ -746,6 +746,11 @@ background-position: 0 -290px; } +.messagelist tr.flaggedroot td.flag span +{ + background-position: 0 -136px; +} + .messagelist tr > .flag span.flagged { background-position: 0 -153px; diff --git a/skins/larry/mail.css b/skins/larry/mail.css index 969cb1f..83f039a 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -441,6 +441,11 @@ 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; } -- Gitblit v1.9.1