snappymail/dev/Model/Filter.js

282 lines
7.1 KiB
JavaScript
Raw Normal View History

2016-07-07 05:03:30 +08:00
import ko from 'ko';
2019-07-05 03:19:24 +08:00
import { FilterRulesType, FiltersAction } from 'Common/Enums';
import { pString } from 'Common/Utils';
import { delegateRunOnDestroy } from 'Common/UtilsUser';
2019-07-05 03:19:24 +08:00
import { i18n } from 'Common/Translator';
import { getFolderFromCacheList } from 'Common/Cache';
2016-07-07 05:03:30 +08:00
import AccountStore from 'Stores/User/Account';
2019-07-05 03:19:24 +08:00
import { FilterConditionModel } from 'Model/FilterCondition';
import { AbstractModel } from 'Knoin/AbstractModel';
2016-07-07 05:03:30 +08:00
2019-07-05 03:19:24 +08:00
class FilterModel extends AbstractModel {
2016-07-16 05:29:42 +08:00
constructor() {
2020-10-19 01:19:45 +08:00
super();
2016-07-07 05:03:30 +08:00
this.enabled = ko.observable(true);
this.id = '';
this.name = ko.observable('');
this.name.error = ko.observable(false);
this.name.focused = ko.observable(false);
this.conditions = ko.observableArray([]);
this.conditionsType = ko.observable(FilterRulesType.Any);
// Actions
this.actionValue = ko.observable('');
this.actionValue.error = ko.observable(false);
this.actionValueSecond = ko.observable('');
this.actionValueThird = ko.observable('');
this.actionValueFourth = ko.observable('');
this.actionValueFourth.error = ko.observable(false);
this.actionMarkAsRead = ko.observable(false);
this.actionKeep = ko.observable(true);
this.actionNoStop = ko.observable(false);
this.actionType = ko.observable(FiltersAction.MoveTo);
this.actionType.subscribe(() => {
this.actionValue('');
this.actionValue.error(false);
this.actionValueSecond('');
this.actionValueThird('');
this.actionValueFourth('');
this.actionValueFourth.error(false);
});
const fGetRealFolderName = (folderFullNameRaw) => {
const folder = getFolderFromCacheList(folderFullNameRaw);
2019-07-05 03:19:24 +08:00
return folder ? folder.fullName.replace('.' === folder.delimiter ? /\./ : /[\\/]+/, ' / ') : folderFullNameRaw;
2016-07-07 05:03:30 +08:00
};
this.nameSub = ko.computed(() => {
let result = '';
const actionValue = this.actionValue();
2019-07-05 03:19:24 +08:00
switch (this.actionType()) {
2016-07-07 05:03:30 +08:00
case FiltersAction.MoveTo:
result = i18n('SETTINGS_FILTERS/SUBNAME_MOVE_TO', {
FOLDER: fGetRealFolderName(actionValue)
});
break;
case FiltersAction.Forward:
result = i18n('SETTINGS_FILTERS/SUBNAME_FORWARD_TO', {
EMAIL: actionValue
});
break;
case FiltersAction.Vacation:
result = i18n('SETTINGS_FILTERS/SUBNAME_VACATION_MESSAGE');
break;
case FiltersAction.Reject:
result = i18n('SETTINGS_FILTERS/SUBNAME_REJECT');
break;
case FiltersAction.Discard:
result = i18n('SETTINGS_FILTERS/SUBNAME_DISCARD');
break;
// no default
}
return result ? '(' + result + ')' : '';
});
this.actionTemplate = ko.computed(() => {
let result = '';
2019-07-05 03:19:24 +08:00
switch (this.actionType()) {
2016-07-07 05:03:30 +08:00
case FiltersAction.Forward:
result = 'SettingsFiltersActionForward';
break;
case FiltersAction.Vacation:
result = 'SettingsFiltersActionVacation';
break;
case FiltersAction.Reject:
result = 'SettingsFiltersActionReject';
break;
case FiltersAction.None:
result = 'SettingsFiltersActionNone';
break;
case FiltersAction.Discard:
result = 'SettingsFiltersActionDiscard';
break;
case FiltersAction.MoveTo:
default:
result = 'SettingsFiltersActionMoveToFolder';
break;
}
return result;
});
this.regDisposables(this.name.subscribe(sValue => this.name.error(!sValue)));
this.regDisposables(this.actionValue.subscribe(sValue => this.actionValue.error(!sValue)));
2016-07-07 05:03:30 +08:00
this.regDisposables([this.actionNoStop, this.actionTemplate]);
this.deleteAccess = ko.observable(false);
this.canBeDeleted = ko.observable(true);
}
generateID() {
this.id = Jua.randomId();
2016-07-07 05:03:30 +08:00
}
verify() {
if (!this.name()) {
2016-07-07 05:03:30 +08:00
this.name.error(true);
return false;
}
if (this.conditions().length) {
if (this.conditions().find(cond => cond && !cond.verify())) {
2016-07-07 05:03:30 +08:00
return false;
}
}
if (!this.actionValue()) {
if ([
2019-07-05 03:19:24 +08:00
FiltersAction.MoveTo,
FiltersAction.Forward,
FiltersAction.Reject,
FiltersAction.Vacation
].includes(this.actionType())
2019-07-05 03:19:24 +08:00
) {
2016-07-07 05:03:30 +08:00
this.actionValue.error(true);
return false;
}
}
if (FiltersAction.Forward === this.actionType() && !this.actionValue().includes('@')) {
2016-07-07 05:03:30 +08:00
this.actionValue.error(true);
return false;
}
2019-07-05 03:19:24 +08:00
if (
FiltersAction.Vacation === this.actionType() &&
this.actionValueFourth() &&
!this.actionValueFourth().includes('@')
2019-07-05 03:19:24 +08:00
) {
2016-07-07 05:03:30 +08:00
this.actionValueFourth.error(true);
return false;
}
this.name.error(false);
this.actionValue.error(false);
return true;
}
toJson() {
return {
ID: this.id,
Enabled: this.enabled() ? '1' : '0',
Name: this.name(),
ConditionsType: this.conditionsType(),
Conditions: this.conditions().map(item => item.toJson()),
2016-07-07 05:03:30 +08:00
ActionValue: this.actionValue(),
ActionValueSecond: this.actionValueSecond(),
ActionValueThird: this.actionValueThird(),
ActionValueFourth: this.actionValueFourth(),
ActionType: this.actionType(),
Stop: this.actionNoStop() ? '0' : '1',
Keep: this.actionKeep() ? '1' : '0',
MarkAsRead: this.actionMarkAsRead() ? '1' : '0'
};
}
addCondition() {
this.conditions.push(new FilterConditionModel());
}
removeCondition(oConditionToDelete) {
this.conditions.remove(oConditionToDelete);
delegateRunOnDestroy(oConditionToDelete);
}
setRecipients() {
this.actionValueFourth(AccountStore.getEmailAddresses().join(', '));
2016-07-07 05:03:30 +08:00
}
/**
* @static
* @param {FetchJsonFilter} json
* @returns {?FilterModel}
*/
static reviveFromJson(json) {
const filter = super.reviveFromJson(json);
if (filter) {
filter.id = pString(json.ID);
filter.name(pString(json.Name));
filter.enabled(!!json.Enabled);
filter.conditionsType(pString(json.ConditionsType));
filter.conditions([]);
2016-07-07 05:03:30 +08:00
2020-09-04 23:07:35 +08:00
if (Array.isNotEmpty(json.Conditions)) {
filter.conditions(
json.Conditions.map(aData => {
const filterCondition = new FilterConditionModel();
return filterCondition && filterCondition.parse(aData) ? filterCondition : null;
}).filter(v => v)
2019-07-05 03:19:24 +08:00
);
2016-07-07 05:03:30 +08:00
}
filter.actionType(pString(json.ActionType));
2016-07-07 05:03:30 +08:00
filter.actionValue(pString(json.ActionValue));
filter.actionValueSecond(pString(json.ActionValueSecond));
filter.actionValueThird(pString(json.ActionValueThird));
filter.actionValueFourth(pString(json.ActionValueFourth));
2016-07-07 05:03:30 +08:00
filter.actionNoStop(!json.Stop);
filter.actionKeep(!!json.Keep);
filter.actionMarkAsRead(!!json.MarkAsRead);
2016-07-07 05:03:30 +08:00
}
return filter;
2016-07-07 05:03:30 +08:00
}
cloneSelf() {
const filter = new FilterModel();
2016-07-07 05:03:30 +08:00
filter.id = this.id;
filter.enabled(this.enabled());
filter.name(this.name());
filter.name.error(this.name.error());
filter.conditionsType(this.conditionsType());
filter.actionMarkAsRead(this.actionMarkAsRead());
filter.actionType(this.actionType());
filter.actionValue(this.actionValue());
filter.actionValue.error(this.actionValue.error());
filter.actionValueSecond(this.actionValueSecond());
filter.actionValueThird(this.actionValueThird());
filter.actionValueFourth(this.actionValueFourth());
filter.actionKeep(this.actionKeep());
filter.actionNoStop(this.actionNoStop());
filter.conditions(this.conditions().map(item => item.cloneSelf()));
2016-07-07 05:03:30 +08:00
return filter;
}
}
2019-07-05 03:19:24 +08:00
export { FilterModel, FilterModel as default };