From cbaa0e7fab8367e68aba11773e9c22f30daa1ffe Mon Sep 17 00:00:00 2001 From: ccheng-dev Date: Tue, 21 Mar 2023 07:09:27 +0100 Subject: [PATCH] feature(Felamimail/MessageFilter): search recipient in message query filter --- tests/tine20/Felamimail/Frontend/JsonTest.php | 23 +++++++ tine20/Felamimail/Model/MessageFilter.php | 42 ++++++------- tine20/Felamimail/Model/RecipientFilter.php | 63 +++++++++++++++++++ tine20/Felamimail/js/Model.js | 4 +- tine20/Felamimail/translations/de.po | 4 +- 5 files changed, 108 insertions(+), 28 deletions(-) create mode 100644 tine20/Felamimail/Model/RecipientFilter.php diff --git a/tests/tine20/Felamimail/Frontend/JsonTest.php b/tests/tine20/Felamimail/Frontend/JsonTest.php index 7132e83caf7..d7bbb3b83cb 100644 --- a/tests/tine20/Felamimail/Frontend/JsonTest.php +++ b/tests/tine20/Felamimail/Frontend/JsonTest.php @@ -760,6 +760,29 @@ public function testSearchMessageEmptyQueryFilter() $this->assertEquals($filterTest['allinboxes'], $allinboxesFilterFound, print_r($result['filter'], true)); } } + + public function testSearchMessageMixedQueryFilter() + { + $fromEmail = 'unittestalias@' . $this->_mailDomain; + $messageToSend = $this->_getMessageData($fromEmail); + $sclever = Tinebase_User::getInstance()->getFullUserByLoginName('sclever'); + $messageToSend['to'] = [$sclever->accountEmailAddress]; + $messageToSend['subject'] = 'subjectfilter'; + $this->_json->saveMessage($messageToSend); + $this->_foldersToClear = array('INBOX', $this->_account->sent_folder); + + // check if message is in sent folder + $message = $this->_searchForMessageBySubject($messageToSend['subject'], $this->_account->sent_folder); + //search subject + $result = $this->_json->searchMessages([['field' => 'query', 'operator' => 'contains', 'value' => 'subjectfilter']], ''); + $this->assertEquals('subjectfilter', $result['results'][0]['subject'], print_r($result['filter'], true)); + //search to email + $result = $this->_json->searchMessages([['field' => 'query', 'operator' => 'contains', 'value' => $sclever->accountEmailAddress]], ''); + $this->assertEquals($sclever->accountEmailAddress, $result['results'][0]['to'][0], print_r($result['filter'], true)); + //search from email + $result = $this->_json->searchMessages([['field' => 'query', 'operator' => 'contains', 'value' => $fromEmail]], ''); + $this->assertEquals($fromEmail, $result['results'][0]['from_email'], print_r($result['filter'], true)); + } /** * test flags (add + clear + deleted) diff --git a/tine20/Felamimail/Model/MessageFilter.php b/tine20/Felamimail/Model/MessageFilter.php index 70ddfc91022..2a6e9b6f065 100644 --- a/tine20/Felamimail/Model/MessageFilter.php +++ b/tine20/Felamimail/Model/MessageFilter.php @@ -40,7 +40,7 @@ class Felamimail_Model_MessageFilter extends Tinebase_Model_Filter_FilterGroup 'id' => array('filter' => 'Tinebase_Model_Filter_Id', 'options' => array('modelName' => 'Felamimail_Model_Message')), 'query' => array( 'filter' => 'Tinebase_Model_Filter_Query', - 'options' => array('fields' => array('subject', 'from_email', 'from_name')) + 'options' => array('fields' => array('subject', 'from_email', 'from_name', 'to')) ), 'folder_id' => array('filter' => 'Tinebase_Model_Filter_Id'), 'subject' => array('filter' => 'Tinebase_Model_Filter_Text'), @@ -52,9 +52,9 @@ class Felamimail_Model_MessageFilter extends Tinebase_Model_Filter_FilterGroup 'has_attachment'=> ['filter' => Tinebase_Model_Filter_Bool::class], // custom filters 'path' => array('custom' => true), - 'to' => array('custom' => true, 'requiredCols' => array('to' => 'felamimail_cache_message_to.*')), - 'cc' => array('custom' => true, 'requiredCols' => array('cc' => 'felamimail_cache_message_cc.*')), - 'bcc' => array('custom' => true, 'requiredCols' => array('bcc' => 'felamimail_cache_message_bcc.*')), + 'to' => array('filter' => Felamimail_Model_RecipientFilter::class), + 'cc' => array('filter' => Felamimail_Model_RecipientFilter::class), + 'bcc' => array('filter' => Felamimail_Model_RecipientFilter::class), 'flags' => array('custom' => true, 'requiredCols' => array('flags' => 'felamimail_cache_msg_flag.flag')), 'account_id' => array('custom' => true), 'tag' => array('filter' => 'Tinebase_Model_Filter_Tag', 'options' => array( @@ -85,7 +85,12 @@ public function appendFilterSql($_select, $_backend) } else if ($customData['field'] == 'path') { $this->_addPathSql($_select, $_backend, $customData); } else { - $this->_addRecipientAndFlagsSql($_select, $_backend, $customData); + $this->_addFlagsSql($_select, $_backend, $customData); + } + } + foreach ($this->_filterObjects as $filterObject) { + if ($filterObject instanceof Felamimail_Model_RecipientFilter) { + $filterObject->appendFilterSql($_select, $_backend); } } @@ -190,36 +195,29 @@ protected function _getFolderIdsOfAllInboxes() } /** - * add to/cc/bcc and flags custom filters + * add flags custom filters * * @param Zend_Db_Select $_select * @param Felamimail_Backend_Cache_Sql_Message $_backend * @param array $_filterData * @return void */ - protected function _addRecipientAndFlagsSql($_select, $_backend, $_filterData) + protected function _addFlagsSql($_select, $_backend, $_filterData) { $db = $_backend->getAdapter(); $foreignTables = $_backend->getForeignTables(); // add conditions $tablename = $foreignTables[$_filterData['field']]['table']; - if ($_filterData['field'] !== 'flags') { - $fieldName = $tablename . '.name'; - $fieldEmail = $tablename . '.email'; - } - + // add filter value if (! isset($_filterData['value'])) { $_filterData['value'] = ''; } - if (! is_array($_filterData['value'])) { - $value = '%' . $_filterData['value'] . '%'; - } else { - $value = array(); - foreach ((array)$_filterData['value'] as $customValue) { - $value[] = '%' . $customValue . '%'; - } + + $value = array(); + foreach ((array)$_filterData['value'] as $customValue) { + $value[] = '%' . $customValue . '%'; } if ($_filterData['field'] == 'flags') { @@ -242,11 +240,7 @@ protected function _addRecipientAndFlagsSql($_select, $_backend, $_filterData) if ($orConditions) { $_select->where('(' . $orConditions . ')'); } - } elseif (!empty($_filterData['value'])) { - $_select->where( - $db->quoteInto($fieldName . ' LIKE ?', $value) . ' OR ' . - $db->quoteInto($fieldEmail . ' LIKE ?', $value) - ); } } + } diff --git a/tine20/Felamimail/Model/RecipientFilter.php b/tine20/Felamimail/Model/RecipientFilter.php new file mode 100644 index 00000000000..bac027c891b --- /dev/null +++ b/tine20/Felamimail/Model/RecipientFilter.php @@ -0,0 +1,63 @@ + + */ + +/** + * Felamimail_Model_RecipientFilter + * + * filters for recipients + * + * + * @package Felamimail + * @subpackage Filter + */ +class Felamimail_Model_RecipientFilter extends Tinebase_Model_Filter_Text +{ + /** + * add to/cc/bcc custom filters + * + * @param Zend_Db_Select $_select + * @param Felamimail_Backend_Cache_Sql_Message $_backend + * @return void + * @throws Tinebase_Exception_Backend_Database + * @throws Zend_Db_Select_Exception + */ + public function appendFilterSql($_select, $_backend) + { + $db = $_backend->getAdapter(); + $prefix = $_backend->getTablePrefix(); + $foreignTables = $_backend->getForeignTables(); + // add conditions + $tablename = $foreignTables[$this->_field]['table']; + $fieldName = $tablename . '.name'; + $fieldEmail = $tablename . '.email'; + $from = $_select->getPart(Zend_Db_Select::FROM); + $selectArray = [$this->_field => $this->_dbCommand->getAggregate($tablename . '.' . 'email')]; + + if (!isset($from[$tablename])) { + $_select->joinLeft( + /* table */ array($tablename => $prefix . $tablename), + /* on */ $this->_db->quoteIdentifier('felamimail_cache_message' . '.' . 'id') . ' = ' . $this->_db->quoteIdentifier($tablename . '.' . 'message_id'), + /* select */ $selectArray + ); + } else { + // join is defined already => just add the column + $_select->columns($selectArray, $tablename); + } + + if (!empty($this->_value)) { + $value = '%' . $this->_value . '%'; + $_select->where( + $db->quoteInto($fieldName . ' LIKE ?', $value) . ' OR ' . + $db->quoteInto($fieldEmail . ' LIKE ?', $value) + ); + } + } +} diff --git a/tine20/Felamimail/js/Model.js b/tine20/Felamimail/js/Model.js index c7728a2dd82..58bccea765b 100644 --- a/tine20/Felamimail/js/Model.js +++ b/tine20/Felamimail/js/Model.js @@ -189,12 +189,12 @@ Tine.Felamimail.Model.Message.getDefaultData = function() { * @return {Object} filterModel definition */ Tine.Felamimail.Model.Message.getFilterModel = function() { - var app = Tine.Tinebase.appMgr.get('Felamimail'); + const app = Tine.Tinebase.appMgr.get('Felamimail'); return [ {filtertype: 'tine.felamimail.folder.filtermodel', app: app}, - {label: app.i18n._('Subject/From'),field: 'query', operators: ['contains']}, {label: app.i18n._('Subject'), field: 'subject', operators: ['contains']}, + {label: app.i18n._('Subject/From/To'), field: 'query', operators: ['contains']}, {label: app.i18n._('From (Email)'),field: 'from_email', operators: ['contains']}, {label: app.i18n._('From (Name)'), field: 'from_name', operators: ['contains']}, {label: app.i18n._('To'), field: 'to', operators: ['contains']}, diff --git a/tine20/Felamimail/translations/de.po b/tine20/Felamimail/translations/de.po index 203278c6621..1715f3f81f4 100644 --- a/tine20/Felamimail/translations/de.po +++ b/tine20/Felamimail/translations/de.po @@ -1531,8 +1531,8 @@ msgstr[0] "Nachricht" msgstr[1] "Nachrichten" #: js/Model.js:218 -msgid "Subject/From" -msgstr "Betreff/Von" +msgid "Subject/From/To" +msgstr "Betreff/Von/An" #: js/Model.js:221 js/GridPanel.js:522 msgid "From (Name)"