diff --git a/CHANGELOG b/CHANGELOG index 146aa0710..7a64d1830 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Display different icons when Trash folder is empty or full (#1485775) - Remember last position of more headers switch (#1488323) - Fix so message flags modified by another client are applied on the list on refresh (#1485186) - Fix broken text/* attachments when forwarding/editing a message (#1489426) diff --git a/program/js/app.js b/program/js/app.js index 2438ff959..e6cc28110 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -6459,6 +6459,12 @@ function rcube_webmail() this.env.quota_content = content; }; + // update trash folder state + this.set_trash_count = function(count) + { + this[(count ? 'un' : '') + 'mark_folder'](this.env.trash_mailbox, 'empty', '', true); + }; + // update the mailboxlist this.set_unread_count = function(mbox, count, set_title, mark) { diff --git a/program/steps/mail/check_recent.inc b/program/steps/mail/check_recent.inc index 60da68a96..d2d27a2ca 100644 --- a/program/steps/mail/check_recent.inc +++ b/program/steps/mail/check_recent.inc @@ -25,6 +25,7 @@ if (empty($_REQUEST['_folderlist']) && empty($_REQUEST['_list'])) { return; } +$trash = $RCMAIL->config->get('trash_mbox'); $current = $RCMAIL->storage->get_folder(); $check_all = $RCMAIL->action != 'refresh' || (bool)$RCMAIL->config->get('check_all_folders'); @@ -132,6 +133,11 @@ foreach ($a_mailboxes as $mbox_name) { $RCMAIL->output->set_env('recent_flags', $flags); } } + + // set trash folder state + if ($mbox_name === $trash) { + $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($mbox_name, 'EXISTS')); + } } // trigger refresh hook diff --git a/program/steps/mail/folders.inc b/program/steps/mail/folders.inc index d7cfd93f3..1c9ed0dae 100644 --- a/program/steps/mail/folders.inc +++ b/program/steps/mail/folders.inc @@ -27,7 +27,6 @@ $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST, true); // send EXPUNGE command if ($RCMAIL->action == 'expunge') { - $success = $RCMAIL->storage->expunge_folder($mbox); // reload message list if current mailbox @@ -45,16 +44,16 @@ if ($RCMAIL->action == 'expunge') { $RCMAIL->display_server_error(); } } - // clear mailbox -else if ($RCMAIL->action == 'purge') -{ - $delimiter = $RCMAIL->storage->get_hierarchy_delimiter(); - $trash_regexp = '/^' . preg_quote($CONFIG['trash_mbox'] . $delimiter, '/') . '/'; - $junk_regexp = '/^' . preg_quote($CONFIG['junk_mbox'] . $delimiter, '/') . '/'; +else if ($RCMAIL->action == 'purge') { + $delimiter = $RCMAIL->storage->get_hierarchy_delimiter(); + $trash_mbox = $RCMAIL->config->get('trash_mbox'); + $junk_mbox = $RCMAIL->config->get('junk_mbox'); + $trash_regexp = '/^' . preg_quote($trash_mbox . $delimiter, '/') . '/'; + $junk_regexp = '/^' . preg_quote($junk_mbox . $delimiter, '/') . '/'; // we should only be purging trash and junk (or their subfolders) - if ($mbox == $CONFIG['trash_mbox'] || $mbox == $CONFIG['junk_mbox'] + if ($mbox == $trash_mbox || $mbox == $junk_mbox || preg_match($trash_regexp, $mbox) || preg_match($junk_regexp, $mbox) ) { $success = $RCMAIL->storage->clear_folder($mbox); @@ -71,6 +70,11 @@ else if ($RCMAIL->action == 'purge') $OUTPUT->command('set_unread_count', $mbox, 0); $OUTPUT->command('set_quota', $RCMAIL->quota_content()); rcmail_set_unseen_count($mbox, 0); + + // set trash folder state + if ($mbox === $trash_mbox) { + $OUTPUT->command('set_trash_count', 0); + } } } else { diff --git a/program/steps/mail/getunread.inc b/program/steps/mail/getunread.inc index fda6448d4..3b93e8ef6 100644 --- a/program/steps/mail/getunread.inc +++ b/program/steps/mail/getunread.inc @@ -23,27 +23,35 @@ $a_folders = $RCMAIL->storage->list_folders_subscribed('', '*', 'mail'); if (!empty($a_folders)) { - $current = $RCMAIL->storage->get_folder(); - $inbox = ($current == 'INBOX'); - $check_all = (bool)$RCMAIL->config->get('check_all_folders'); - - foreach ($a_folders as $mbox_row) { - $unseen_old = rcmail_get_unseen_count($mbox_row); - - if (!$check_all && $unseen_old !== null && $mbox_row != $current) - $unseen = $unseen_old; - else - $unseen = $RCMAIL->storage->count($mbox_row, 'UNSEEN', $unseen_old === null); - - // call it always for current folder, so it can update counter - // after possible message status change when opening a message - // not in preview frame - if ($unseen || $unseen_old === null || $mbox_row == $current) { - $OUTPUT->command('set_unread_count', $mbox_row, $unseen, $inbox && $mbox_row == 'INBOX'); + $current = $RCMAIL->storage->get_folder(); + $inbox = ($current == 'INBOX'); + $trash = $RCMAIL->config->get('trash_mbox'); + $check_all = (bool)$RCMAIL->config->get('check_all_folders'); + + foreach ($a_folders as $mbox) { + $unseen_old = rcmail_get_unseen_count($mbox); + + if (!$check_all && $unseen_old !== null && $mbox != $current) { + $unseen = $unseen_old; + } + else { + $unseen = $RCMAIL->storage->count($mbox, 'UNSEEN', $unseen_old === null); + } + + // call it always for current folder, so it can update counter + // after possible message status change when opening a message + // not in preview frame + if ($unseen || $unseen_old === null || $mbox == $current) { + $OUTPUT->command('set_unread_count', $mbox, $unseen, $inbox && $mbox_row == 'INBOX'); + } + + rcmail_set_unseen_count($mbox, $unseen); + + // set trash folder state + if ($mbox === $trash) { + $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($mbox, 'EXISTS')); + } } - - rcmail_set_unseen_count($mbox_row, $unseen); - } } $OUTPUT->send(); diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc index 91c53e852..277564c38 100644 --- a/program/steps/mail/list.inc +++ b/program/steps/mail/list.inc @@ -90,12 +90,14 @@ if (empty($search_request) && empty($a_headers)) { rcmail_send_unread_count($mbox_name, !empty($_REQUEST['_refresh']), $unseen); // update message count display -$pages = ceil($count/$RCMAIL->storage->get_pagesize()); +$pages = ceil($count/$RCMAIL->storage->get_pagesize()); +$exists = $RCMAIL->storage->count($mbox_name, 'EXISTS'); + $OUTPUT->set_env('messagecount', $count); $OUTPUT->set_env('pagecount', $pages); $OUTPUT->set_env('threading', $threading); $OUTPUT->set_env('current_page', $count ? $RCMAIL->storage->get_page() : 1); -$OUTPUT->set_env('exists', $RCMAIL->storage->count($mbox_name, 'EXISTS')); +$OUTPUT->set_env('exists', $exists); $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count), $mbox_name); // add message rows @@ -123,5 +125,10 @@ else { $OUTPUT->show_message('nomessagesfound', 'notice'); } +// set trash folder state +if ($mbox_name === $RCMAIL->config->get('trash_mbox')) { + $OUTPUT->command('set_trash_count', $exists); +} + // send response $OUTPUT->send(); diff --git a/program/steps/mail/move_del.inc b/program/steps/mail/move_del.inc index 587373997..7564bb89d 100644 --- a/program/steps/mail/move_del.inc +++ b/program/steps/mail/move_del.inc @@ -28,12 +28,13 @@ $threading = (bool) $RCMAIL->storage->get_threading(); $old_count = $RCMAIL->storage->count(NULL, $threading ? 'THREADS' : 'ALL'); $old_pages = ceil($old_count / $RCMAIL->storage->get_pagesize()); +$trash = $RCMAIL->config->get('trash_mbox'); + // move messages if ($RCMAIL->action == 'move' && !empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) { $count = sizeof(explode(',', ($uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)))); $target = rcube_utils::get_input_value('_target_mbox', rcube_utils::INPUT_POST, true); $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST, true); - $trash = $RCMAIL->config->get('trash_mbox'); $moved = $RCMAIL->storage->move_message($uids, $target, $mbox); @@ -86,16 +87,15 @@ if ($search_request && $RCMAIL->storage->get_search_set()) { $_SESSION['search'] = $RCMAIL->storage->refresh_search(); } -if ($_POST['_from'] == 'show') -{ +if ($_POST['_from'] == 'show') { if ($next = rcube_utils::get_input_value('_next_uid', rcube_utils::INPUT_GPC)) $OUTPUT->command('show_message', $next); else $OUTPUT->command('command', 'list'); } -else -{ +else { $msg_count = $RCMAIL->storage->count(NULL, $threading ? 'THREADS' : 'ALL'); + $exists = $RCMAIL->storage->count($mbox, 'EXISTS', true); $page_size = $RCMAIL->storage->get_pagesize(); $page = $RCMAIL->storage->get_page(); $pages = ceil($msg_count / $page_size); @@ -114,7 +114,7 @@ else $OUTPUT->set_env('messagecount', $msg_count); $OUTPUT->set_env('current_page', $page); $OUTPUT->set_env('pagecount', $pages); - $OUTPUT->set_env('exists', $RCMAIL->storage->count($mbox, 'EXISTS', true)); + $OUTPUT->set_env('exists', $exists); // update mailboxlist $mbox = $RCMAIL->storage->get_folder(); @@ -144,6 +144,14 @@ else rcmail_js_message_list($a_headers, false); } + + // set trash folder state + if ($mbox === $trash) { + $OUTPUT->command('set_trash_count', $exists); + } + else if ($target !== null && $target === $trash) { + $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($trash, 'EXISTS')); + } } // send response diff --git a/skins/classic/images/icons/folders.gif b/skins/classic/images/icons/folders.gif index eb06bd8c1..279519496 100644 Binary files a/skins/classic/images/icons/folders.gif and b/skins/classic/images/icons/folders.gif differ diff --git a/skins/classic/images/icons/folders.png b/skins/classic/images/icons/folders.png index 4c27052a5..92432521c 100644 Binary files a/skins/classic/images/icons/folders.png and b/skins/classic/images/icons/folders.png differ diff --git a/skins/classic/mail.css b/skins/classic/mail.css index bf07383c9..f5406b591 100644 --- a/skins/classic/mail.css +++ b/skins/classic/mail.css @@ -425,7 +425,12 @@ #mailboxlist li.trash a { - background-position: 5px -91px; + background-position: 5px -180px; +} + +#mailboxlist li.trash.empty a +{ + background-position: 5px -90px; } #mailboxlist li a