snappymail/dev/Model/Folder.js

304 lines
7.5 KiB
JavaScript

import ko from 'ko';
import { FolderType } from 'Common/Enums';
import { isPosNumeric } from 'Common/Utils';
import { i18n, trigger as translatorTrigger } from 'Common/Translator';
import { getFolderInboxName } from 'Common/Cache';
import * as Events from 'Common/Events';
import { AbstractModel } from 'Knoin/AbstractModel';
class FolderModel extends AbstractModel {
constructor() {
super('FolderModel');
this.name = ko.observable('');
this.fullName = '';
this.fullNameRaw = '';
this.fullNameHash = '';
this.delimiter = '';
this.namespace = '';
this.deep = 0;
this.interval = 0;
this.selectable = false;
this.existen = true;
this.type = ko.observable(FolderType.User);
this.focused = ko.observable(false);
this.selected = ko.observable(false);
this.edited = ko.observable(false);
this.subScribed = ko.observable(true);
this.checkable = ko.observable(false);
this.subFolders = ko.observableArray([]);
this.deleteAccess = ko.observable(false);
this.actionBlink = ko.observable(false).extend({ falseTimeout: 1000 });
this.nameForEdit = ko.observable('');
this.privateMessageCountAll = ko.observable(0);
this.privateMessageCountUnread = ko.observable(0);
this.collapsedPrivate = ko.observable(true);
}
/**
* @static
* @param {AjaxJsonFolder} json
* @returns {?FolderModel}
*/
static newInstanceFromJson(json) {
const folder = new FolderModel();
return folder.initByJson(json) ? folder.initComputed() : null;
}
/**
* @returns {FolderModel}
*/
initComputed() {
const inboxFolderName = getFolderInboxName();
this.isInbox = ko.computed(() => FolderType.Inbox === this.type());
this.hasSubScribedSubfolders = ko.computed(
() =>
!!this.subFolders().find(
oFolder => (oFolder.subScribed() || oFolder.hasSubScribedSubfolders()) && !oFolder.isSystemFolder()
)
);
this.canBeEdited = ko.computed(() => FolderType.User === this.type() && this.existen && this.selectable);
this.visible = ko.computed(() => {
const isSubScribed = this.subScribed(),
isSubFolders = this.hasSubScribedSubfolders();
return isSubScribed || (isSubFolders && (!this.existen || !this.selectable));
});
this.isSystemFolder = ko.computed(() => FolderType.User !== this.type());
this.hidden = ko.computed(() => {
const isSystem = this.isSystemFolder(),
isSubFolders = this.hasSubScribedSubfolders();
return (isSystem && !isSubFolders) || (!this.selectable && !isSubFolders);
});
this.selectableForFolderList = ko.computed(() => !this.isSystemFolder() && this.selectable);
this.messageCountAll = ko
.computed({
read: this.privateMessageCountAll,
write: (iValue) => {
if (isPosNumeric(iValue, true)) {
this.privateMessageCountAll(iValue);
} else {
this.privateMessageCountAll.valueHasMutated();
}
}
})
.extend({ notify: 'always' });
this.messageCountUnread = ko
.computed({
read: this.privateMessageCountUnread,
write: (value) => {
if (isPosNumeric(value, true)) {
this.privateMessageCountUnread(value);
} else {
this.privateMessageCountUnread.valueHasMutated();
}
}
})
.extend({ notify: 'always' });
this.printableUnreadCount = ko.computed(() => {
const count = this.messageCountAll(),
unread = this.messageCountUnread(),
type = this.type();
if (0 < count) {
if (FolderType.Draft === type) {
return '' + count;
} else if (
0 < unread &&
FolderType.Trash !== type &&
FolderType.Archive !== type &&
FolderType.SentItems !== type
) {
return '' + unread;
}
}
return '';
});
this.canBeDeleted = ko.computed(() => {
const bSystem = this.isSystemFolder();
return !bSystem && !this.subFolders().length && inboxFolderName !== this.fullNameRaw;
});
this.canBeSubScribed = ko.computed(
() => !this.isSystemFolder() && this.selectable && inboxFolderName !== this.fullNameRaw
);
this.canBeChecked = this.canBeSubScribed;
this.localName = ko.computed(() => {
translatorTrigger();
let name = this.name();
const type = this.type();
if (this.isSystemFolder()) {
switch (type) {
case FolderType.Inbox:
name = i18n('FOLDER_LIST/INBOX_NAME');
break;
case FolderType.SentItems:
name = i18n('FOLDER_LIST/SENT_NAME');
break;
case FolderType.Draft:
name = i18n('FOLDER_LIST/DRAFTS_NAME');
break;
case FolderType.Spam:
name = i18n('FOLDER_LIST/SPAM_NAME');
break;
case FolderType.Trash:
name = i18n('FOLDER_LIST/TRASH_NAME');
break;
case FolderType.Archive:
name = i18n('FOLDER_LIST/ARCHIVE_NAME');
break;
// no default
}
}
return name;
});
this.manageFolderSystemName = ko.computed(() => {
translatorTrigger();
let suffix = '';
const type = this.type(),
name = this.name();
if (this.isSystemFolder()) {
switch (type) {
case FolderType.Inbox:
suffix = '(' + i18n('FOLDER_LIST/INBOX_NAME') + ')';
break;
case FolderType.SentItems:
suffix = '(' + i18n('FOLDER_LIST/SENT_NAME') + ')';
break;
case FolderType.Draft:
suffix = '(' + i18n('FOLDER_LIST/DRAFTS_NAME') + ')';
break;
case FolderType.Spam:
suffix = '(' + i18n('FOLDER_LIST/SPAM_NAME') + ')';
break;
case FolderType.Trash:
suffix = '(' + i18n('FOLDER_LIST/TRASH_NAME') + ')';
break;
case FolderType.Archive:
suffix = '(' + i18n('FOLDER_LIST/ARCHIVE_NAME') + ')';
break;
// no default
}
}
if ((suffix && '(' + name + ')' === suffix) || '(inbox)' === suffix.toLowerCase()) {
suffix = '';
}
return suffix;
});
this.collapsed = ko.computed({
read: () => !this.hidden() && this.collapsedPrivate(),
write: (value) => {
this.collapsedPrivate(value);
}
});
this.hasUnreadMessages = ko.computed(() => 0 < this.messageCountUnread() && this.printableUnreadCount());
this.hasSubScribedUnreadMessagesSubfolders = ko.computed(
() =>
!!this.subFolders().find(
folder => folder.hasUnreadMessages() || folder.hasSubScribedUnreadMessagesSubfolders()
)
);
// subscribe
this.name.subscribe((value) => {
this.nameForEdit(value);
});
this.edited.subscribe((value) => {
if (value) {
this.nameForEdit(this.name());
}
});
this.messageCountUnread.subscribe((unread) => {
if (FolderType.Inbox === this.type()) {
Events.pub('mailbox.inbox-unread-count', [unread]);
}
});
return this;
}
/**
* @returns {string}
*/
collapsedCss() {
return this.hasSubScribedSubfolders()
? this.collapsed()
? 'icon-right-mini e-collapsed-sign'
: 'icon-down-mini e-collapsed-sign'
: 'icon-none e-collapsed-sign';
}
/**
* @param {AjaxJsonFolder} json
* @returns {boolean}
*/
initByJson(json) {
let bResult = false;
const sInboxFolderName = getFolderInboxName();
if (json && 'Object/Folder' === json['@Object']) {
this.name(json.Name);
this.delimiter = json.Delimiter;
this.fullName = json.FullName;
this.fullNameRaw = json.FullNameRaw;
this.fullNameHash = json.FullNameHash;
this.deep = json.FullNameRaw.split(this.delimiter).length - 1;
this.selectable = !!json.IsSelectable;
this.existen = !!json.IsExists;
this.subScribed(!!json.IsSubscribed);
this.checkable(!!json.Checkable);
this.type(sInboxFolderName === this.fullNameRaw ? FolderType.Inbox : FolderType.User);
bResult = true;
}
return bResult;
}
/**
* @returns {string}
*/
printableFullName() {
return this.fullName.split(this.delimiter).join(' / ');
}
}
export { FolderModel, FolderModel as default };