Aleksander Machniak
2016-05-04 344b0af9c6c2f6531504dbc8363faa54ce9c6440
Indicate that a collapsed thread has flagged children (#5013)
6 files modified
82 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/js/app.js 61 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_imap.php 8 ●●●● patch | view | raw | blame | history
program/steps/mail/func.inc 2 ●●●●● patch | view | raw | blame | history
skins/classic/mail.css 5 ●●●●● patch | view | raw | blame | history
skins/larry/mail.css 5 ●●●●● patch | view | raw | blame | history
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]
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 = '&nbsp;';
      }
      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
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);
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)
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;
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;
}