diff options
Diffstat (limited to 'program/steps/mail')
-rw-r--r-- | program/steps/mail/func.inc | 31 | ||||
-rw-r--r-- | program/steps/mail/list.inc | 13 | ||||
-rw-r--r-- | program/steps/mail/search.inc | 33 | ||||
-rw-r--r-- | program/steps/mail/show.inc | 17 |
4 files changed, 75 insertions, 19 deletions
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index ca7c4e727..d2bc6a9be 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -1292,6 +1292,36 @@ function rcmail_send_mdn($uid) } +function rcmail_search_filter($attrib) +{ + global $OUTPUT; + + if (!strlen($attrib['id'])) + $attrib['id'] = 'rcmlistfilter'; + + $attrib['onchange'] = JS_OBJECT_NAME.'.filter_mailbox(this.value)'; + + /* + RFC3501 (6.4.4): 'ALL', 'RECENT', + 'ANSWERED', 'DELETED', 'FLAGGED', 'SEEN', + 'UNANSWERED', 'UNDELETED', 'UNFLAGGED', 'UNSEEN', + 'NEW', // = (RECENT UNSEEN) + 'OLD' // = NOT RECENT + */ + + $select_filter = new html_select($attrib); + $select_filter->add(rcube_label('all'), 'ALL'); + $select_filter->add(rcube_label('unread'), 'UNSEEN'); + $select_filter->add(rcube_label('flagged'), 'FLAGGED'); + $select_filter->add(rcube_label('unanswered'), 'UNANSWERED'); + + $out = $select_filter->show($_SESSION['search_filter']); + + $OUTPUT->add_gui_object('search_filter', $attrib['id']); + + return $out; +} + // register UI objects $OUTPUT->add_handlers(array( 'mailboxlist' => 'rcmail_mailbox_list', @@ -1304,6 +1334,7 @@ $OUTPUT->add_handlers(array( 'messagecontentframe' => 'rcmail_messagecontent_frame', 'messagepartframe' => 'rcmail_message_part_frame', 'messagepartcontrols' => 'rcmail_message_part_controls', + 'searchfilter' => 'rcmail_search_filter', 'searchform' => array($OUTPUT, 'search_form'), )); diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc index a868f9cc6..2078262eb 100644 --- a/program/steps/mail/list.inc +++ b/program/steps/mail/list.inc @@ -41,6 +41,17 @@ else $mbox_name = $IMAP->get_mailbox_name(); +// initialize searching result if search_filter is used +if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL') +{ + $search_request = md5($mbox_name.$_SESSION['search_filter']); + + $IMAP->search($mbox_name, $_SESSION['search_filter'], RCMAIL_CHARSET, $sort_col); + $_SESSION['search'][$search_request] = $IMAP->get_search_set(); + $OUTPUT->set_env('search_request', $search_request); +} + + // fetch message headers if ($IMAP->messagecount($mbox_name, 'ALL', !empty($_REQUEST['_refresh']))) $a_headers = $IMAP->list_headers($mbox_name, NULL, $sort_col, $sort_order); @@ -55,8 +66,6 @@ $OUTPUT->set_env('pagecount', $pages); $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count)); $OUTPUT->command('set_mailboxname', rcmail_get_mailbox_name_text()); - - // add message rows if (isset($a_headers) && count($a_headers)) rcmail_js_message_list($a_headers); diff --git a/program/steps/mail/search.inc b/program/steps/mail/search.inc index 6f3676891..18335ba15 100644 --- a/program/steps/mail/search.inc +++ b/program/steps/mail/search.inc @@ -26,51 +26,66 @@ $imap_charset = 'UTF-8'; // get search string $str = get_input_value('_q', RCUBE_INPUT_GET); +$filter = get_input_value('_filter', RCUBE_INPUT_GET); $mbox = get_input_value('_mbox', RCUBE_INPUT_GET); -$search_request = md5($mbox.$str); +$search_request = md5($mbox.$filter.$str); +// add list filter string +$search_str = $filter && $filter != 'ALL' ? $filter : ''; + +$_SESSION['search_filter'] = $filter; // Check the search string for type of search -if (preg_match("/^from:/i", $str)) +if (preg_match("/^from:.*/i", $str)) { list(,$srch) = explode(":", $str); - $subject = "HEADER FROM"; + $subject = "HEADER FROM"; $search = trim($srch); } -else if (preg_match("/^to:/i", $str)) +else if (preg_match("/^to.*:/i", $str)) { list(,$srch) = explode(":", $str); $subject = "HEADER TO"; $search = trim($srch); } -else if (preg_match("/^cc:/i", $str)) +else if (preg_match("/^cc:.*/i", $str)) { list(,$srch) = explode(":", $str); $subject = "HEADER CC"; $search = trim($srch); } -else if (preg_match("/^subject:/i", $str)) +else if (preg_match("/^subject:.*/i", $str)) { list(,$srch) = explode(":", $str); $subject = "HEADER SUBJECT"; $search = trim($srch); } -else if (preg_match("/^body:/i", $str)) +else if (preg_match("/^body:.*/i", $str)) { list(,$srch) = explode(":", $str); $subject = "TEXT"; $search = trim($srch); } // search in subject and sender by default -else +else if(trim($str)) { $from = ($mbox == $CONFIG['sent_mbox'] || $mbox == $CONFIG['drafts_mbox']) ? "TO" : "FROM"; $subject = array("HEADER SUBJECT", "HEADER $from"); $search = trim($str); } +if ($subject && !is_array($subject)) + $search_str .= sprintf(" %s {%d}\r\n%s", $subject, strlen($search), $search); +else if ($subject) { + $search_str .= ' OR'; + foreach($subject as $sub) + $search_str .= sprintf(" (%s {%d}\r\n%s)", $sub, strlen($search), $search); +} + +$search_str = trim($search_str); + // execute IMAP search -$result = $IMAP->search($mbox, $subject, $search, $imap_charset, $_SESSION['sort_col']); +$result = $IMAP->search($mbox, $search_str, $imap_charset, $_SESSION['sort_col']); $count = 0; // Make sure our $result is legit.. diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc index 8b36c9acd..15c1c54a6 100644 --- a/program/steps/mail/show.inc +++ b/program/steps/mail/show.inc @@ -110,12 +110,13 @@ if ($_GET['_uid']) { { // Only if we use custom sorting $a_msg_index = $IMAP->message_index(NULL, $_SESSION['sort_col'], $_SESSION['sort_order']); - - $MESSAGE->index = array_search((string)$MESSAGE->uid, $a_msg_index, TRUE); - $prev = isset($a_msg_index[$MESSAGE->index-1]) ? $a_msg_index[$MESSAGE->index-1] : -1 ; - $first = count($a_msg_index)>0 ? $a_msg_index[0] : -1; - $next = isset($a_msg_index[$MESSAGE->index+1]) ? $a_msg_index[$MESSAGE->index+1] : -1 ; - $last = count($a_msg_index)>0 ? $a_msg_index[count($a_msg_index)-1] : -1; + + $MESSAGE->index = array_search($IMAP->get_id($MESSAGE->uid), $a_msg_index); + + $prev = isset($a_msg_index[$MESSAGE->index-1]) ? $IMAP->get_uid($a_msg_index[$MESSAGE->index-1]) : -1 ; + $first = count($a_msg_index)>0 ? $IMAP->get_uid($a_msg_index[0]) : -1; + $next = isset($a_msg_index[$MESSAGE->index+1]) ? $IMAP->get_uid($a_msg_index[$MESSAGE->index+1]) : -1 ; + $last = count($a_msg_index)>0 ? $IMAP->get_uid($a_msg_index[count($a_msg_index)-1]) : -1; } else { @@ -130,11 +131,11 @@ if ($_GET['_uid']) { if ($prev > 0) $OUTPUT->set_env('prev_uid', $prev); - if ($first >0) + if ($first > 0) $OUTPUT->set_env('first_uid', $first); if ($next > 0) $OUTPUT->set_env('next_uid', $next); - if ($last >0) + if ($last > 0) $OUTPUT->set_env('last_uid', $last); // mark message as read |