alecpl
2009-05-02 30b152b1947e773a618bc29bfa3b5b505ceeb1d7
- Added quick search box menu (#1484304)


1 files added
13 files modified
159 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/js/app.js 15 ●●●● patch | view | raw | blame | history
program/localization/en_GB/labels.inc 2 ●●●●● patch | view | raw | blame | history
program/localization/en_US/labels.inc 2 ●●●●● patch | view | raw | blame | history
program/localization/pl_PL/labels.inc 2 ●●●●● patch | view | raw | blame | history
program/steps/mail/func.inc 1 ●●●● patch | view | raw | blame | history
program/steps/mail/search.inc 45 ●●●●● patch | view | raw | blame | history
skins/default/common.css 9 ●●●● patch | view | raw | blame | history
skins/default/functions.js 50 ●●●●● patch | view | raw | blame | history
skins/default/images/icons/glass.gif patch | view | raw | blame | history
skins/default/images/searchfield.gif patch | view | raw | blame | history
skins/default/mail.css 13 ●●●●● patch | view | raw | blame | history
skins/default/templates/addressbook.html 4 ●●● patch | view | raw | blame | history
skins/default/templates/mail.html 15 ●●●●● patch | view | raw | blame | history
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';
  foreach($subject as $sub)
$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'))
    this.show_markmenu(false);
  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.gif

skins/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) &gt; 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>