Skip to content

Commit

Permalink
Mail messages searching with predefined date interval (T103)
Browse files Browse the repository at this point in the history
  • Loading branch information
alecpl committed Oct 8, 2015
1 parent c852426 commit 5802e08
Show file tree
Hide file tree
Showing 9 changed files with 112 additions and 23 deletions.
1 change: 1 addition & 0 deletions CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================

- Implemented mail messages searching with predefined date interval
- PGP encryption support via Mailvelope integration
- PGP encryption support via Enigma plugin
- PHP7 compatibility fixes (#1490416)
Expand Down
20 changes: 20 additions & 0 deletions program/js/app.js
Expand Up @@ -4896,6 +4896,9 @@ function rcube_webmail()
if (filter)
url._filter = filter;

if (this.gui_objects.search_interval)
url._interval = $(this.gui_objects.search_interval).val();

if (search) {
url._q = search;

Expand Down Expand Up @@ -4932,6 +4935,9 @@ function rcube_webmail()
if (this.gui_objects.qsearchbox)
this.gui_objects.qsearchbox.value = '';

if (this.gui_objects.search_interval)
$(this.gui_objects.search_interval).val('');

if (this.env.qsearch)
this.abort_request(this.env.qsearch);

Expand Down Expand Up @@ -4961,6 +4967,20 @@ function rcube_webmail()
}
};

this.set_searchinterval = function(interval)
{
var old = this.env.search_interval;
this.env.search_interval = interval;

// re-send search query with new interval
if (interval != old && this.env.search_request) {
if (!this.qsearch(this.gui_objects.qsearchbox.value) && this.env.search_filter && this.env.search_filter != 'ALL')
this.filter_mailbox(this.env.search_filter);
if (interval)
this.select_folder(this.env.mailbox, '', true);
}
};

this.set_searchmods = function(mods)
{
var mbox = this.env.mailbox,
Expand Down
6 changes: 6 additions & 0 deletions program/localization/en_US/labels.inc
Expand Up @@ -225,6 +225,12 @@ $labels['searchscope'] = 'Scope';
$labels['currentfolder'] = 'Current folder';
$labels['subfolders'] = 'This and subfolders';
$labels['allfolders'] = 'All folders';
$labels['searchinterval-1W'] = 'older than a week';
$labels['searchinterval-1M'] = 'older than a month';
$labels['searchinterval-1Y'] = 'older than a year';
$labels['searchinterval1W'] = 'younger than a week';
$labels['searchinterval1M'] = 'younger than a month';
$labels['searchinterval1Y'] = 'younger than a year';

$labels['openinextwin'] = 'Open in new window';
$labels['emlsave'] = 'Download (.eml)';
Expand Down
54 changes: 37 additions & 17 deletions program/steps/mail/func.inc
Expand Up @@ -125,6 +125,7 @@ $OUTPUT->add_handlers(array(
'messagecontentframe' => 'rcmail_messagecontent_frame',
'messageimportform' => 'rcmail_message_import_form',
'searchfilter' => 'rcmail_search_filter',
'searchinterval' => 'rcmail_search_interval',
'searchform' => array($OUTPUT, 'search_form'),
));

Expand Down Expand Up @@ -2028,8 +2029,9 @@ function rcmail_search_filter($attrib)
{
global $RCMAIL;

if (!strlen($attrib['id']))
if (!strlen($attrib['id'])) {
$attrib['id'] = 'rcmlistfilter';
}

$attrib['onchange'] = rcmail_output::JS_OBJECT_NAME.'.filter_mailbox(this.value)';

Expand All @@ -2043,27 +2045,45 @@ function rcmail_search_filter($attrib)
$attachment .= ' HEADER Content-Type ' . rcube_imap_generic::escape($type);
}

$select_filter = new html_select($attrib);
$select_filter->add($RCMAIL->gettext('all'), 'ALL');
$select_filter->add($RCMAIL->gettext('unread'), 'UNSEEN');
$select_filter->add($RCMAIL->gettext('flagged'), 'FLAGGED');
$select_filter->add($RCMAIL->gettext('unanswered'), 'UNANSWERED');
$select = new html_select($attrib);
$select->add($RCMAIL->gettext('all'), 'ALL');
$select->add($RCMAIL->gettext('unread'), 'UNSEEN');
$select->add($RCMAIL->gettext('flagged'), 'FLAGGED');
$select->add($RCMAIL->gettext('unanswered'), 'UNANSWERED');
if (!$RCMAIL->config->get('skip_deleted')) {
$select_filter->add($RCMAIL->gettext('deleted'), 'DELETED');
$select_filter->add($RCMAIL->gettext('undeleted'), 'UNDELETED');
$select->add($RCMAIL->gettext('deleted'), 'DELETED');
$select->add($RCMAIL->gettext('undeleted'), 'UNDELETED');
}
$select_filter->add($RCMAIL->gettext('withattachment'), $attachment);
$select_filter->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('highest'), 'HEADER X-PRIORITY 1');
$select_filter->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('high'), 'HEADER X-PRIORITY 2');
$select_filter->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('normal'), 'NOT HEADER X-PRIORITY 1 NOT HEADER X-PRIORITY 2 NOT HEADER X-PRIORITY 4 NOT HEADER X-PRIORITY 5');
$select_filter->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('low'), 'HEADER X-PRIORITY 4');
$select_filter->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('lowest'), 'HEADER X-PRIORITY 5');

$out = $select_filter->show($_REQUEST['_search'] ? $_SESSION['search_filter'] : 'ALL');
$select->add($RCMAIL->gettext('withattachment'), $attachment);
$select->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('highest'), 'HEADER X-PRIORITY 1');
$select->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('high'), 'HEADER X-PRIORITY 2');
$select->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('normal'), 'NOT HEADER X-PRIORITY 1 NOT HEADER X-PRIORITY 2 NOT HEADER X-PRIORITY 4 NOT HEADER X-PRIORITY 5');
$select->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('low'), 'HEADER X-PRIORITY 4');
$select->add($RCMAIL->gettext('priority').': '.$RCMAIL->gettext('lowest'), 'HEADER X-PRIORITY 5');

$RCMAIL->output->add_gui_object('search_filter', $attrib['id']);

return $out;
return $select->show($_REQUEST['_search'] ? $_SESSION['search_filter'] : 'ALL');
}

function rcmail_search_interval($attrib)
{
global $RCMAIL;

if (!strlen($attrib['id'])) {
$attrib['id'] = 'rcmsearchinterval';
}

$select = new html_select($attrib);
$select->add('', '');

foreach (array('1W', '1M', '1Y', '-1W', '-1M', '-1Y') as $value) {
$select->add($RCMAIL->gettext('searchinterval' . $value), $value);
}

$RCMAIL->output->add_gui_object('search_interval', $attrib['id']);

return $select->show($_REQUEST['_search'] ? $_SESSION['search_interval'] : '');
}

function rcmail_message_error()
Expand Down
41 changes: 35 additions & 6 deletions program/steps/mail/search.inc
Expand Up @@ -38,17 +38,16 @@ $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GET, true);
$filter = rcube_utils::get_input_value('_filter', rcube_utils::INPUT_GET);
$headers = rcube_utils::get_input_value('_headers', rcube_utils::INPUT_GET);
$scope = rcube_utils::get_input_value('_scope', rcube_utils::INPUT_GET);
$interval = rcube_utils::get_input_value('_interval', rcube_utils::INPUT_GET);
$continue = rcube_utils::get_input_value('_continue', rcube_utils::INPUT_GET);
$subject = array();

$filter = trim($filter);
$search_request = md5($mbox.$scope.$filter.$str);
$search_request = md5($mbox.$scope.$interval.$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)) {
list(,$srch) = explode(":", $str);
Expand Down Expand Up @@ -102,6 +101,10 @@ else if (strlen(trim($str))) {

$search = isset($srch) ? trim($srch) : trim($str);

if ($search_interval = rcmail_search_interval_criteria($interval)) {
$search_str .= ' ' . $search_interval;
}

if (!empty($subject)) {
$search_str .= str_repeat(' OR', count($subject)-1);
foreach ($subject as $sub) {
Expand Down Expand Up @@ -144,9 +147,10 @@ if ($search_str) {
$_SESSION['search'] = $RCMAIL->storage->get_search_set();
$_SESSION['last_text_search'] = $str;
}
$_SESSION['search_request'] = $search_request;
$_SESSION['search_scope'] = $scope;

$_SESSION['search_request'] = $search_request;
$_SESSION['search_scope'] = $scope;
$_SESSION['search_interval'] = $interval;
$_SESSION['search_filter'] = $filter;

// Get the headers
if (!$result->incomplete) {
Expand Down Expand Up @@ -212,3 +216,28 @@ if (!$result->incomplete) {
}

$OUTPUT->send();


// Creates BEFORE/SINCE search criteria from the specified interval
// Interval can be: 1W, 1M, 1Y, -1W, -1M, -1Y
function rcmail_search_interval_criteria($interval)
{
if (empty($interval)) {
return;
}

if ($interval[0] == '-') {
$search = 'BEFORE';
$interval = substr($interval, 1);
}
else {
$search = 'SINCE';
}

$date = new DateTime('now');
$interval = new DateInterval('P' . $interval);

$date->sub($interval);

return $search . ' ' . $date->format('j-M-Y');
}
2 changes: 2 additions & 0 deletions skins/classic/templates/mail.html
Expand Up @@ -115,6 +115,8 @@
<li><label><input type="checkbox" name="s_mods[]" value="bcc" id="s_mod_bcc" onclick="rcmail_ui.set_searchmod(this)" /> <span><roundcube:label name="bcc" /></span></label></li>
<li><label><input type="checkbox" name="s_mods[]" value="body" id="s_mod_body" onclick="rcmail_ui.set_searchmod(this)" /> <span><roundcube:label name="body" /></span></label></li>
<li><label><input type="checkbox" name="s_mods[]" value="text" id="s_mod_text" onclick="rcmail_ui.set_searchmod(this)" /> <span><roundcube:label name="msgtext" /></span></label></li>
<li><label class="comment"><roundcube:label name="date" /></label></li>
<li><roundcube:object name="searchinterval" id="s_interval" onchange="rcmail.set_searchinterval($(this).val())" /></li>
<li><label class="comment"><roundcube:label name="searchscope" /></label></li>
<li><label><input type="radio" name="s_scope" value="base" id="s_scope_base" onclick="rcmail.set_searchscope(this.value)" /> <span><roundcube:label name="currentfolder" /></span></label></li>
<li><label><input type="radio" name="s_scope" value="sub" id="s_scope_sub" onclick="rcmail.set_searchscope(this.value)" /> <span><roundcube:label name="subfolders" /></span></label></li>
Expand Down
3 changes: 3 additions & 0 deletions skins/larry/mail.css
Expand Up @@ -251,6 +251,9 @@ html.mozilla #mailboxlist > li:first-child {
background-position: -28px -458px;
}

#s_interval {
margin: 3px 8px;
}

/*** message list ***/

Expand Down
6 changes: 6 additions & 0 deletions skins/larry/styles.css
Expand Up @@ -2408,6 +2408,12 @@ ul.toolbarmenu li label {
ul.toolbarmenu li.separator label {
color: #bbb;
font-style: italic;
padding: 0 8px;
line-height: 17px;
}

ul.toolbarmenu li input {
margin: 0;
}

ul.toolbarmenu li a.icon {
Expand Down
2 changes: 2 additions & 0 deletions skins/larry/templates/mail.html
Expand Up @@ -52,6 +52,8 @@ <h3 id="aria-label-searchmenu" class="voice"><roundcube:label name="searchmod" /
<li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="bcc" id="s_mod_bcc" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="bcc" /></span></label></li>
<li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="body" id="s_mod_body" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="body" /></span></label></li>
<li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="text" id="s_mod_text" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="msgtext" /></span></label></li>
<li role="separator" class="separator"><label><roundcube:label name="date" /></label></li>
<li role="menuitem"><roundcube:object name="searchinterval" id="s_interval" onchange="rcmail.set_searchinterval($(this).val())" /></li>
<li role="separator" class="separator"><label><roundcube:label name="searchscope" /></label></li>
<li role="menuitem"><label><input type="radio" name="s_scope" value="base" id="s_scope_base" onclick="UI.set_searchscope(this)" /> <span><roundcube:label name="currentfolder" /></span></label></li>
<li role="menuitem"><label><input type="radio" name="s_scope" value="sub" id="s_scope_sub" onclick="UI.set_searchscope(this)" /> <span><roundcube:label name="subfolders" /></span></label></li>
Expand Down

0 comments on commit 5802e08

Please sign in to comment.