diff --git a/dev/Common/Enums.js b/dev/Common/Enums.js index 1ccd8ea4c..dd7a78fa3 100644 --- a/dev/Common/Enums.js +++ b/dev/Common/Enums.js @@ -262,6 +262,7 @@ export const FilterConditionField = { Recipient: 'Recipient', Subject: 'Subject', Header: 'Header', + Body: 'Body', Size: 'Size' }; @@ -275,7 +276,9 @@ export const FilterConditionType = { NotEqualTo: 'NotEqualTo', Regex: 'Regex', Over: 'Over', - Under: 'Under' + Under: 'Under', + Text: 'Text', + Raw: 'Raw' }; /** diff --git a/dev/Model/FilterCondition.js b/dev/Model/FilterCondition.js index a097c6028..b39c7df89 100644 --- a/dev/Model/FilterCondition.js +++ b/dev/Model/FilterCondition.js @@ -21,6 +21,9 @@ class FilterConditionModel extends AbstractModel { this.template = ko.computed(() => { let template = ''; switch (this.field()) { + case FilterConditionField.Body: + template = 'SettingsFiltersConditionBody'; + break; case FilterConditionField.Size: template = 'SettingsFiltersConditionSize'; break; diff --git a/dev/View/Popup/Filter.js b/dev/View/Popup/Filter.js index eac9655b6..1b8806807 100644 --- a/dev/View/Popup/Filter.js +++ b/dev/View/Popup/Filter.js @@ -38,6 +38,7 @@ class FilterPopupView extends AbstractViewNext { this.fieldOptions = ko.observableArray([]); this.typeOptions = ko.observableArray([]); this.typeOptionsSize = ko.observableArray([]); + this.typeOptionsBody = ko.observableArray([]); initOnStartOrLangChange(this.populateOptions.bind(this)); @@ -108,7 +109,8 @@ class FilterPopupView extends AbstractViewNext { { 'id': FilterConditionField.Recipient, 'name': i18n('POPUPS_FILTER/SELECT_FIELD_RECIPIENTS') }, { 'id': FilterConditionField.Subject, 'name': i18n('POPUPS_FILTER/SELECT_FIELD_SUBJECT') }, { 'id': FilterConditionField.Size, 'name': i18n('POPUPS_FILTER/SELECT_FIELD_SIZE') }, - { 'id': FilterConditionField.Header, 'name': i18n('POPUPS_FILTER/SELECT_FIELD_HEADER') } + { 'id': FilterConditionField.Header, 'name': i18n('POPUPS_FILTER/SELECT_FIELD_HEADER') }, + { 'id': FilterConditionField.Body, 'name': i18n('POPUPS_FILTER/SELECT_FIELD_BODY') } ]); this.typeOptions([ @@ -126,6 +128,11 @@ class FilterPopupView extends AbstractViewNext { { 'id': FilterConditionType.Over, 'name': i18n('POPUPS_FILTER/SELECT_TYPE_OVER') }, { 'id': FilterConditionType.Under, 'name': i18n('POPUPS_FILTER/SELECT_TYPE_UNDER') } ]); + + this.typeOptionsBody([ + { 'id': FilterConditionType.Text, 'name': i18n('POPUPS_FILTER/SELECT_TYPE_TEXT') }, + { 'id': FilterConditionType.Raw, 'name': i18n('POPUPS_FILTER/SELECT_TYPE_RAW') } + ]); } removeCondition(oConditionToDelete) { diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionField.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionField.php index e78f95402..8020b98a1 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionField.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionField.php @@ -4,9 +4,11 @@ namespace RainLoop\Providers\Filters\Enumerations; class ConditionField { - const FROM = 'From'; - const RECIPIENT = 'Recipient'; - const SUBJECT = 'Subject'; - const HEADER = 'Header'; - const SIZE = 'Size'; + const + FROM = 'From', + RECIPIENT = 'Recipient', + SUBJECT = 'Subject', + HEADER = 'Header', + BODY = 'Body', + SIZE = 'Size'; } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionType.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionType.php index e9b6dc1f6..87d0f91a4 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionType.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionType.php @@ -4,11 +4,14 @@ namespace RainLoop\Providers\Filters\Enumerations; class ConditionType { - const EQUAL_TO = 'EqualTo'; - const NOT_EQUAL_TO = 'NotEqualTo'; - const CONTAINS = 'Contains'; - const NOT_CONTAINS = 'NotContains'; - const REGEX = 'Regex'; - const OVER = 'Over'; - const UNDER = 'Under'; + const + EQUAL_TO = 'EqualTo', + NOT_EQUAL_TO = 'NotEqualTo', + CONTAINS = 'Contains', + NOT_CONTAINS = 'NotContains', + REGEX = 'Regex', + OVER = 'Over', + UNDER = 'Under', + TEXT = 'Text', + RAW = 'Raw'; } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php index 45877fdd5..80a26acb3 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php @@ -159,11 +159,11 @@ class SieveStorage implements \RainLoop\Providers\Filters\FiltersInterface { switch ($oCondition->Type()) { + case \RainLoop\Providers\Filters\Enumerations\ConditionType::TEXT: + case \RainLoop\Providers\Filters\Enumerations\ConditionType::RAW: case \RainLoop\Providers\Filters\Enumerations\ConditionType::OVER: - $sTypeWord = ':over'; - break; case \RainLoop\Providers\Filters\Enumerations\ConditionType::UNDER: - $sTypeWord = ':under'; + $sTypeWord = ':' . \strtolower($oCondition->Type()); break; case \RainLoop\Providers\Filters\Enumerations\ConditionType::NOT_EQUAL_TO: $sResult .= 'not '; @@ -199,6 +199,10 @@ class SieveStorage implements \RainLoop\Providers\Filters\FiltersInterface case \RainLoop\Providers\Filters\Enumerations\ConditionField::HEADER: $sResult .= 'header '.$sTypeWord.' ["'.$this->quote($sValueSecond).'"]'; break; + case \RainLoop\Providers\Filters\Enumerations\ConditionField::BODY: + // :text :raw :content + $sResult .= 'body '.$sTypeWord.' :contains'; + break; case \RainLoop\Providers\Filters\Enumerations\ConditionField::SIZE: $sResult .= 'size '.$sTypeWord; break; diff --git a/snappymail/v/0.0.0/app/localization/webmail/_source.en.yml b/snappymail/v/0.0.0/app/localization/webmail/_source.en.yml index e542cd767..438d9d69a 100644 --- a/snappymail/v/0.0.0/app/localization/webmail/_source.en.yml +++ b/snappymail/v/0.0.0/app/localization/webmail/_source.en.yml @@ -323,6 +323,7 @@ en: SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_BODY: "Body" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" @@ -334,6 +335,8 @@ en: SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" + SELECT_TYPE_TEXT: "Text" + SELECT_TYPE_RAW: "Raw" SELECT_MATCH_ANY: "Matching ANY of the following rules" SELECT_MATCH_ALL: "Matching ALL of the following rules" MARK_AS_READ_LABEL: "Mark as read" diff --git a/snappymail/v/0.0.0/app/localization/webmail/de_DE.yml b/snappymail/v/0.0.0/app/localization/webmail/de_DE.yml index 0ce045549..93ae11212 100644 --- a/snappymail/v/0.0.0/app/localization/webmail/de_DE.yml +++ b/snappymail/v/0.0.0/app/localization/webmail/de_DE.yml @@ -322,6 +322,7 @@ de_DE: SELECT_FIELD_RECIPIENTS: "Empfänger (An oder CC)" SELECT_FIELD_SUBJECT: "Betreff" SELECT_FIELD_HEADER: "Nachrichtenkopf" + SELECT_FIELD_BODY: "Nachrichteninhalt" SELECT_FIELD_SIZE: "Größe" SELECT_TYPE_CONTAINS: "Enthält" SELECT_TYPE_NOT_CONTAINS: "Enthält nicht" @@ -333,6 +334,8 @@ de_DE: SELECT_TYPE_NOT_EQUAL_TO: "Ungleich" SELECT_TYPE_OVER: "Über" SELECT_TYPE_UNDER: "Unter" + SELECT_TYPE_TEXT: "Text" + SELECT_TYPE_RAW: "Roh" SELECT_MATCH_ANY: "Eine der folgenden Regeln trifft zu" SELECT_MATCH_ALL: "Alle folgenden Regeln treffen zu" MARK_AS_READ_LABEL: "Als Gelesen markieren" diff --git a/snappymail/v/0.0.0/app/localization/webmail/en_GB.yml b/snappymail/v/0.0.0/app/localization/webmail/en_GB.yml index 744e86315..ea17732c2 100644 --- a/snappymail/v/0.0.0/app/localization/webmail/en_GB.yml +++ b/snappymail/v/0.0.0/app/localization/webmail/en_GB.yml @@ -323,6 +323,7 @@ en_GB: SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_BODY: "Body" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" @@ -334,6 +335,8 @@ en_GB: SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" + SELECT_TYPE_TEXT: "Text" + SELECT_TYPE_RAW: "Raw" SELECT_MATCH_ANY: "Matching ANY of the following rules" SELECT_MATCH_ALL: "Matching ALL of the following rules" MARK_AS_READ_LABEL: "Mark as read" diff --git a/snappymail/v/0.0.0/app/localization/webmail/en_US.yml b/snappymail/v/0.0.0/app/localization/webmail/en_US.yml index 164bede98..7840c1af8 100644 --- a/snappymail/v/0.0.0/app/localization/webmail/en_US.yml +++ b/snappymail/v/0.0.0/app/localization/webmail/en_US.yml @@ -323,6 +323,7 @@ en_US: SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" + SELECT_FIELD_BODY: "Body" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" @@ -334,6 +335,8 @@ en_US: SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" + SELECT_TYPE_TEXT: "Text" + SELECT_TYPE_RAW: "Raw" SELECT_MATCH_ANY: "Matching ANY of the following rules" SELECT_MATCH_ALL: "Matching ALL of the following rules" MARK_AS_READ_LABEL: "Mark as read" diff --git a/snappymail/v/0.0.0/app/localization/webmail/es_ES.yml b/snappymail/v/0.0.0/app/localization/webmail/es_ES.yml index 3d28fbacc..eb412ab72 100644 --- a/snappymail/v/0.0.0/app/localization/webmail/es_ES.yml +++ b/snappymail/v/0.0.0/app/localization/webmail/es_ES.yml @@ -322,6 +322,7 @@ es_ES: SELECT_FIELD_RECIPIENTS: "Destinatarios (A o CC)" SELECT_FIELD_SUBJECT: "Asunto" SELECT_FIELD_HEADER: "Encabezado" + SELECT_FIELD_BODY: "Body" SELECT_FIELD_SIZE: "Tamaño" SELECT_TYPE_CONTAINS: "Contiene" SELECT_TYPE_NOT_CONTAINS: "No Contiene" @@ -333,6 +334,8 @@ es_ES: SELECT_TYPE_NOT_EQUAL_TO: "Distinto De" SELECT_TYPE_OVER: "Por Encima" SELECT_TYPE_UNDER: "Por Debajo" + SELECT_TYPE_TEXT: "Texto" + SELECT_TYPE_RAW: "Crudo" SELECT_MATCH_ANY: "Si coincide alguna de estas reglas" SELECT_MATCH_ALL: "Si coinciden todas las reglas" MARK_AS_READ_LABEL: "Marcar como leído" diff --git a/snappymail/v/0.0.0/app/localization/webmail/fr_FR.yml b/snappymail/v/0.0.0/app/localization/webmail/fr_FR.yml index 953e33d42..16ecffd88 100644 --- a/snappymail/v/0.0.0/app/localization/webmail/fr_FR.yml +++ b/snappymail/v/0.0.0/app/localization/webmail/fr_FR.yml @@ -323,6 +323,7 @@ fr_FR: SELECT_FIELD_RECIPIENTS: "Destinataires (A ou CC)" SELECT_FIELD_SUBJECT: "Sujet" SELECT_FIELD_HEADER: "En-tête" + SELECT_FIELD_BODY: "Contenu" SELECT_FIELD_SIZE: "Taille" SELECT_TYPE_CONTAINS: "Contient" SELECT_TYPE_NOT_CONTAINS: "Ne contient pas" @@ -334,6 +335,8 @@ fr_FR: SELECT_TYPE_NOT_EQUAL_TO: "Différent de" SELECT_TYPE_OVER: "Au-dessus de" SELECT_TYPE_UNDER: "Au-dessous de" + SELECT_TYPE_TEXT: "Texte" + SELECT_TYPE_RAW: "Brut" SELECT_MATCH_ANY: "Correspondant à l'une des règles suivantes" SELECT_MATCH_ALL: "Correspondant à toutes les règles suivantes" MARK_AS_READ_LABEL: "Marquer comme lu" diff --git a/snappymail/v/0.0.0/app/localization/webmail/nl_NL.yml b/snappymail/v/0.0.0/app/localization/webmail/nl_NL.yml index b444b757e..91317d13b 100644 --- a/snappymail/v/0.0.0/app/localization/webmail/nl_NL.yml +++ b/snappymail/v/0.0.0/app/localization/webmail/nl_NL.yml @@ -322,6 +322,7 @@ nl_NL: SELECT_FIELD_RECIPIENTS: "Ontvanger(s) (Aan of CC)" SELECT_FIELD_SUBJECT: "Onderwerp" SELECT_FIELD_HEADER: "Berichtkop" + SELECT_FIELD_BODY: "Berichtinhoud" SELECT_FIELD_SIZE: "Grootte" SELECT_TYPE_CONTAINS: "Bevat" SELECT_TYPE_NOT_CONTAINS: "Bevat niet" @@ -333,6 +334,8 @@ nl_NL: SELECT_TYPE_NOT_EQUAL_TO: "Niet gelijk aan" SELECT_TYPE_OVER: "Meer dan" SELECT_TYPE_UNDER: "Minder dan" + SELECT_TYPE_TEXT: "Tekst" + SELECT_TYPE_RAW: "Raw" SELECT_MATCH_ANY: "Komt overeen met een van de volgende voorwaarden" SELECT_MATCH_ALL: "Komt overeen met alle voorwaarden" MARK_AS_READ_LABEL: "Markeer als gelezen" diff --git a/snappymail/v/0.0.0/app/templates/Views/User/SettingsFiltersConditionBody.html b/snappymail/v/0.0.0/app/templates/Views/User/SettingsFiltersConditionBody.html new file mode 100644 index 000000000..3c4f5ada3 --- /dev/null +++ b/snappymail/v/0.0.0/app/templates/Views/User/SettingsFiltersConditionBody.html @@ -0,0 +1,12 @@ +
+ +   + +   + +   + + + +