mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-11-10 17:13:38 +08:00
276 lines
6.1 KiB
JavaScript
276 lines
6.1 KiB
JavaScript
import ko from 'ko';
|
|
|
|
import { arrayLength, pString } from 'Common/Utils';
|
|
import { delegateRunOnDestroy } from 'Common/UtilsUser';
|
|
import { i18n } from 'Common/Translator';
|
|
import { getFolderFromCacheList } from 'Common/Cache';
|
|
|
|
import { AccountUserStore } from 'Stores/User/Account';
|
|
|
|
import { FilterConditionModel } from 'Model/FilterCondition';
|
|
import { AbstractModel } from 'Knoin/AbstractModel';
|
|
|
|
/**
|
|
* @enum {string}
|
|
*/
|
|
export const FilterAction = {
|
|
None: 'None',
|
|
MoveTo: 'MoveTo',
|
|
Discard: 'Discard',
|
|
Vacation: 'Vacation',
|
|
Reject: 'Reject',
|
|
Forward: 'Forward'
|
|
};
|
|
|
|
/**
|
|
* @enum {string}
|
|
*/
|
|
const FilterRulesType = {
|
|
All: 'All',
|
|
Any: 'Any'
|
|
};
|
|
|
|
export class FilterModel extends AbstractModel {
|
|
constructor() {
|
|
super();
|
|
|
|
this.id = '';
|
|
|
|
this.addObservables({
|
|
enabled: true,
|
|
deleteAccess: false,
|
|
canBeDeleted: true,
|
|
|
|
name: '',
|
|
nameError: false,
|
|
nameFocused: false,
|
|
|
|
conditionsType: FilterRulesType.Any,
|
|
|
|
// Actions
|
|
actionValue: '',
|
|
actionValueError: false,
|
|
|
|
actionValueSecond: '',
|
|
actionValueThird: '',
|
|
|
|
actionValueFourth: '',
|
|
actionValueFourthError: false,
|
|
|
|
actionMarkAsRead: false,
|
|
|
|
actionKeep: true,
|
|
actionNoStop: false,
|
|
|
|
actionType: FilterAction.MoveTo
|
|
});
|
|
|
|
this.conditions = ko.observableArray();
|
|
|
|
const fGetRealFolderName = (folderFullNameRaw) => {
|
|
const folder = getFolderFromCacheList(folderFullNameRaw);
|
|
return folder ? folder.fullName.replace('.' === folder.delimiter ? /\./ : /[\\/]+/, ' / ') : folderFullNameRaw;
|
|
};
|
|
|
|
this.addComputables({
|
|
nameSub: () => {
|
|
let result = '';
|
|
const actionValue = this.actionValue(), root = 'SETTINGS_FILTERS/SUBNAME_';
|
|
|
|
switch (this.actionType()) {
|
|
case FilterAction.MoveTo:
|
|
result = i18n(root + 'MOVE_TO', {
|
|
FOLDER: fGetRealFolderName(actionValue)
|
|
});
|
|
break;
|
|
case FilterAction.Forward:
|
|
result = i18n(root + 'FORWARD_TO', {
|
|
EMAIL: actionValue
|
|
});
|
|
break;
|
|
case FilterAction.Vacation:
|
|
result = i18n(root + 'VACATION_MESSAGE');
|
|
break;
|
|
case FilterAction.Reject:
|
|
result = i18n(root + 'REJECT');
|
|
break;
|
|
case FilterAction.Discard:
|
|
result = i18n(root + 'DISCARD');
|
|
break;
|
|
// no default
|
|
}
|
|
|
|
return result ? '(' + result + ')' : '';
|
|
},
|
|
|
|
actionTemplate: () => {
|
|
const result = 'SettingsFiltersAction';
|
|
switch (this.actionType()) {
|
|
case FilterAction.Forward:
|
|
return result + 'Forward';
|
|
case FilterAction.Vacation:
|
|
return result + 'Vacation';
|
|
case FilterAction.Reject:
|
|
return result + 'Reject';
|
|
case FilterAction.None:
|
|
return result + 'None';
|
|
case FilterAction.Discard:
|
|
return result + 'Discard';
|
|
case FilterAction.MoveTo:
|
|
default:
|
|
return result + 'MoveToFolder';
|
|
}
|
|
}
|
|
});
|
|
|
|
this.addSubscribables({
|
|
name: sValue => this.nameError(!sValue),
|
|
actionValue: sValue => this.actionValueError(!sValue),
|
|
actionType: () => {
|
|
this.actionValue('');
|
|
this.actionValueError(false);
|
|
this.actionValueSecond('');
|
|
this.actionValueThird('');
|
|
this.actionValueFourth('');
|
|
this.actionValueFourthError(false);
|
|
}
|
|
});
|
|
}
|
|
|
|
generateID() {
|
|
this.id = Jua.randomId();
|
|
}
|
|
|
|
verify() {
|
|
if (!this.name()) {
|
|
this.nameError(true);
|
|
return false;
|
|
}
|
|
|
|
if (this.conditions.length && this.conditions.find(cond => cond && !cond.verify())) {
|
|
return false;
|
|
}
|
|
|
|
if (!this.actionValue()) {
|
|
if ([
|
|
FilterAction.MoveTo,
|
|
FilterAction.Forward,
|
|
FilterAction.Reject,
|
|
FilterAction.Vacation
|
|
].includes(this.actionType())
|
|
) {
|
|
this.actionValueError(true);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (FilterAction.Forward === this.actionType() && !this.actionValue().includes('@')) {
|
|
this.actionValueError(true);
|
|
return false;
|
|
}
|
|
|
|
if (
|
|
FilterAction.Vacation === this.actionType() &&
|
|
this.actionValueFourth() &&
|
|
!this.actionValueFourth().includes('@')
|
|
) {
|
|
this.actionValueFourthError(true);
|
|
return false;
|
|
}
|
|
|
|
this.nameError(false);
|
|
this.actionValueError(false);
|
|
|
|
return true;
|
|
}
|
|
|
|
toJson() {
|
|
return {
|
|
// '@Object': 'Object/Filter',
|
|
ID: this.id,
|
|
Enabled: this.enabled() ? 1 : 0,
|
|
Name: this.name(),
|
|
Conditions: this.conditions.map(item => item.toJson()),
|
|
ConditionsType: this.conditionsType(),
|
|
|
|
ActionType: this.actionType(),
|
|
ActionValue: this.actionValue(),
|
|
ActionValueSecond: this.actionValueSecond(),
|
|
ActionValueThird: this.actionValueThird(),
|
|
ActionValueFourth: this.actionValueFourth(),
|
|
|
|
Keep: this.actionKeep() ? 1 : 0,
|
|
Stop: this.actionNoStop() ? 0 : 1,
|
|
MarkAsRead: this.actionMarkAsRead() ? 1 : 0
|
|
};
|
|
}
|
|
|
|
addCondition() {
|
|
this.conditions.push(new FilterConditionModel());
|
|
}
|
|
|
|
removeCondition(oConditionToDelete) {
|
|
this.conditions.remove(oConditionToDelete);
|
|
delegateRunOnDestroy(oConditionToDelete);
|
|
}
|
|
|
|
setRecipients() {
|
|
this.actionValueFourth(AccountUserStore.getEmailAddresses().join(', '));
|
|
}
|
|
|
|
/**
|
|
* @static
|
|
* @param {FetchJsonFilter} json
|
|
* @returns {?FilterModel}
|
|
*/
|
|
static reviveFromJson(json) {
|
|
const filter = super.reviveFromJson(json);
|
|
if (filter) {
|
|
filter.id = pString(json.ID);
|
|
|
|
filter.conditions([]);
|
|
|
|
if (arrayLength(json.Conditions)) {
|
|
filter.conditions(
|
|
json.Conditions.map(aData => FilterConditionModel.reviveFromJson(aData)).filter(v => v)
|
|
);
|
|
}
|
|
|
|
filter.actionKeep(0 != json.Keep);
|
|
filter.actionNoStop(0 == json.Stop);
|
|
filter.actionMarkAsRead(1 == json.MarkAsRead);
|
|
}
|
|
return filter;
|
|
}
|
|
|
|
cloneSelf() {
|
|
const filter = new FilterModel();
|
|
|
|
filter.id = this.id;
|
|
|
|
filter.enabled(this.enabled());
|
|
|
|
filter.name(this.name());
|
|
filter.nameError(this.nameError());
|
|
|
|
filter.conditionsType(this.conditionsType());
|
|
|
|
filter.actionMarkAsRead(this.actionMarkAsRead());
|
|
|
|
filter.actionType(this.actionType());
|
|
|
|
filter.actionValue(this.actionValue());
|
|
filter.actionValueError(this.actionValueError());
|
|
|
|
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()));
|
|
|
|
return filter;
|
|
}
|
|
}
|