mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-31 04:59:21 +03:00
Based on https://tools.ietf.org/html/rfc5173
This commit is contained in:
parent
4adc672ccd
commit
0ba7374468
14 changed files with 72 additions and 17 deletions
|
|
@ -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'
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
<div class="control-group" data-bind="css: {'error': valueError}" style="margin-bottom: 0">
|
||||
<select class="span3" data-bind="options: $root.fieldOptions, value: field, optionsText: 'name', optionsValue: 'id'"></select>
|
||||
|
||||
<select class="span2" data-bind="options: $root.typeOptionsBody, value: type, optionsText: 'name', optionsValue: 'id'"></select>
|
||||
|
||||
<input class="span3" type="text" data-bind="value: value" />
|
||||
|
||||
<span class="delete-action button-delete pull-right" style="margin-top: 5px;"
|
||||
data-bind="click: function (oCondition) { $root.removeCondition(oCondition); }">
|
||||
<i class="icon-trash"></i>
|
||||
</span>
|
||||
</div>
|
||||
Loading…
Add table
Add a link
Reference in a new issue