mirror of
https://github.com/the-djmaze/snappymail.git
synced 2025-01-09 08:17:53 +08:00
17669b7be0
Signature plugin fixes Add view decorator A large number of fixes
311 lines
7.5 KiB
JavaScript
311 lines
7.5 KiB
JavaScript
|
|
import _ from '_';
|
|
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(
|
|
() => !!_.find(this.subFolders(), (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 && 0 === 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(
|
|
() => !!_.find(this.subFolders(), (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};
|