CHANGELOG
@@ -1,6 +1,7 @@ CHANGELOG RoundCube Webmail =========================== - Added quick search box menu (#1484304) - Fix wrong column sort order icons (#1485823) - Updated TinyMCE to 3.2.3 version - Fix attachment names encoding when charset isn't specified in attachment part (#1484969) program/js/app.js
@@ -2392,19 +2392,26 @@ }; // send remote request to search mail or contacts this.qsearch = function(value, addurl) this.qsearch = function(value) { if (value != '') { if (this.message_list) var addurl = ''; if (this.message_list) { this.message_list.clear(); else if (this.contact_list) { if (this.env.search_mods) { var head_arr = new Array(); for (var n in this.env.search_mods) head_arr.push(n); addurl += '&_headers='+head_arr.join(','); } } else if (this.contact_list) { this.contact_list.clear(true); this.show_contentframe(false); } if (this.gui_objects.search_filter) addurl = '&_filter=' + this.gui_objects.search_filter.value; addurl += '&_filter=' + this.gui_objects.search_filter.value; // reset vars this.env.current_page = 1; program/localization/en_GB/labels.inc
@@ -131,6 +131,8 @@ $labels['unlimited'] = 'unlimited'; $labels['quicksearch'] = 'Quick search'; $labels['resetsearch'] = 'Reset search'; $labels['searchmod'] = 'Search modifiers'; $labels['msgtext'] = 'Entire message'; $labels['openinextwin'] = 'Open in new window'; $labels['compose'] = 'Compose a message'; $labels['savemessage'] = 'Save this draft'; program/localization/en_US/labels.inc
@@ -161,6 +161,8 @@ $labels['quicksearch'] = 'Quick search'; $labels['resetsearch'] = 'Reset search'; $labels['searchmod'] = 'Search modifiers'; $labels['msgtext'] = 'Entire message'; $labels['openinextwin'] = 'Open in new window'; program/localization/pl_PL/labels.inc
@@ -142,6 +142,8 @@ $labels['unlimited'] = 'bez limitu'; $labels['quicksearch'] = 'Szybkie wyszukiwanie'; $labels['resetsearch'] = 'Wyczyść filtr'; $labels['searchmod'] = 'Parametry wyszukiwania'; $labels['msgtext'] = 'Cała wiadomość'; $labels['openinextwin'] = 'Otwórz w nowym oknie'; $labels['compose'] = 'Utwórz wiadomość'; $labels['savemessage'] = 'Zapisz kopię roboczą'; program/steps/mail/func.inc
@@ -79,6 +79,7 @@ $OUTPUT->set_env('search_request', $search_request); } $OUTPUT->set_env('search_mods', $_SESSION['search_mods'] ? $_SESSION['search_mods'] : array('subject'=>'subject')); // make sure the message count is refreshed (for default view) $IMAP->messagecount($mbox_name, 'ALL', true); } program/steps/mail/search.inc
@@ -28,6 +28,7 @@ $str = get_input_value('_q', RCUBE_INPUT_GET); $filter = get_input_value('_filter', RCUBE_INPUT_GET); $mbox = get_input_value('_mbox', RCUBE_INPUT_GET); $headers = get_input_value('_headers', RCUBE_INPUT_GET); $search_request = md5($mbox.$filter.$str); // add list filter string @@ -39,47 +40,55 @@ if (preg_match("/^from:.*/i", $str)) { list(,$srch) = explode(":", $str); $subject = "HEADER FROM"; $search = trim($srch); $subject['from'] = "HEADER FROM"; } else if (preg_match("/^to:.*/i", $str)) { list(,$srch) = explode(":", $str); $subject = "HEADER TO"; $search = trim($srch); $subject['to'] = "HEADER TO"; } else if (preg_match("/^cc:.*/i", $str)) { list(,$srch) = explode(":", $str); $subject = "HEADER CC"; $search = trim($srch); $subject['cc'] = "HEADER CC"; } else if (preg_match("/^bcc:.*/i", $str)) { list(,$srch) = explode(":", $str); $subject['bcc'] = "HEADER BCC"; } else if (preg_match("/^subject:.*/i", $str)) { list(,$srch) = explode(":", $str); $subject = "HEADER SUBJECT"; $search = trim($srch); $subject['subject'] = "HEADER SUBJECT"; } else if (preg_match("/^body:.*/i", $str)) { list(,$srch) = explode(":", $str); $subject = "TEXT"; $search = trim($srch); $subject['text'] = "TEXT"; } // search in subject and sender by default 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 ($headers) { $headers = explode(',', $headers); foreach($headers as $header) switch ($header) { case 'text': $subject['text'] = 'TEXT'; break; default: $subject[$header] = 'HEADER '.$header; } } else { $subject['subject'] = 'HEADER SUBJECT'; } } if ($subject && !is_array($subject)) $search_str .= sprintf(" %s {%d}\r\n%s", $subject, strlen($search), $search); else if ($subject) { $search_str .= ' OR'; $search = $srch ? trim($srch) : trim($str); if ($subject) { $search_str .= str_repeat(' OR', count($subject)-1); foreach($subject as $sub) $search_str .= sprintf(" %s {%d}\r\n%s", $sub, strlen($search), $search); $_SESSION['search_mods'] = $subject; } $search_str = trim($search_str); skins/default/common.css
@@ -347,7 +347,7 @@ background: url('images/searchfield.gif') top left no-repeat; } #quicksearchbar a #searchreset { position: absolute; top: 3px; @@ -355,6 +355,13 @@ text-decoration: none; } #searchmod { position: absolute; top: 3px; right: 162px; } #quicksearchbar img { vertical-align: middle; skins/default/functions.js
@@ -121,6 +121,7 @@ function rcube_mail_ui() { this.markmenu = $('#markmessagemenu'); this.searchmenu = $('#searchmenu'); } rcube_mail_ui.prototype = { @@ -137,16 +138,61 @@ this.markmenu[show?'show':'hide'](); }, show_searchmenu: function(show) { if (typeof show == 'undefined') show = this.searchmenu.is(':visible') ? false : true; var ref = rcube_find_object('searchmod'); if (show && ref) { var pos = $(ref).offset(); this.searchmenu.css({ left:pos.left, top:(pos.top + ref.offsetHeight + 2)}); if (rcmail.env.search_mods) { for (var n in rcmail.env.search_mods) { box = rcube_find_object('s_mod_' + n); box.checked = 'checked'; } } } this.searchmenu[show?'show':'hide'](); }, set_searchmod: function(elem) { if (!rcmail.env.search_mods) rcmail.env.search_mods = new Object(); if (!elem.checked) delete(rcmail.env.search_mods[elem.value]); else rcmail.env.search_mods[elem.value] = elem.value; }, body_mouseup: function(evt, p) { if (this.markmenu && this.markmenu.is(':visible') && rcube_event.get_target(evt) != rcube_find_object('markreadbutton')) this.show_markmenu(false); else if (this.searchmenu && this.searchmenu.is(':visible') && rcube_event.get_target(evt) != rcube_find_object('searchmod')) { var menu = rcube_find_object('searchmenu'); var target = rcube_event.get_target(evt); while (target.parentNode) { if (target.parentNode == menu) return; target = target.parentNode; } this.show_searchmenu(false); } }, body_keypress: function(evt, p) { if (rcube_event.get_keycode(evt) == 27 && this.markmenu && this.markmenu.is(':visible')) if (rcube_event.get_keycode(evt) == 27) { if (this.markmenu && this.markmenu.is(':visible')) this.show_markmenu(false); if (this.searchmenu && this.searchmenu.is(':visible')) this.show_searchmenu(false); } } }; skins/default/images/icons/glass.gif
skins/default/images/searchfield.gifskins/default/mail.css
@@ -45,7 +45,8 @@ padding-left: 2px; } #markmessagemenu #markmessagemenu, #searchmenu { position: absolute; top: 32px; @@ -58,6 +59,11 @@ opacity: 0.9; filter:alpha(opacity=90); z-index: 240; } #searchmenu { width: 172px; } ul.toolbarmenu @@ -89,6 +95,11 @@ background-color: #ddd; } ul.toolbarmenu li input { vertical-align: middle; } #searchfilter { position: absolute; skins/default/templates/addressbook.html
@@ -41,7 +41,9 @@ </div> <div id="quicksearchbar"> <roundcube:object name="searchform" id="quicksearchbox" /><roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" /> <roundcube:button name="searchmod" id="searchmod" image="/images/icons/glass.gif" /> <roundcube:object name="searchform" id="quicksearchbox" /> <roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" /> </div> <roundcube:if condition="count(env:address_sources) > 1" /> skins/default/templates/mail.html
@@ -136,8 +136,21 @@ </div> </div> <div id="searchmenu"> <ul class="toolbarmenu"> <li><input type="checkbox" name="s_mods[]" value="subject" id="s_mod_subject" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_subject"><roundcube:label name="subject" /></label></li> <li><input type="checkbox" name="s_mods[]" value="from" id="s_mod_from" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_from"><roundcube:label name="from" /></label></li> <li><input type="checkbox" name="s_mods[]" value="to" id="s_mod_to" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_to"><roundcube:label name="to" /></label></li> <li><input type="checkbox" name="s_mods[]" value="cc" id="s_mod_cc" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_cc"><roundcube:label name="cc" /></label></li> <li><input type="checkbox" name="s_mods[]" value="bcc" id="s_mod_bcc" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_bcc"><roundcube:label name="bcc" /></label></li> <li><input type="checkbox" name="s_mods[]" value="text" id="s_mod_text" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_text"><roundcube:label name="msgtext" /></label></li> </ul> </div> <div id="quicksearchbar"> <roundcube:object name="searchform" id="quicksearchbox" /><roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" /> <roundcube:button name="searchmod" id="searchmod" image="/images/icons/glass.gif" onclick="rcmail_ui.show_searchmenu();return false" title="searchmod" /> <roundcube:object name="searchform" id="quicksearchbox" /> <roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" /> </div> </body>