snappymail/dev/View/User/MailBox/MessageList.js

1036 lines
27 KiB
JavaScript
Raw Normal View History

import window from 'window';
import _ from '_';
import $ from '$';
import ko from 'ko';
import key from 'key';
import Jua from 'Jua';
import ifvisible from 'ifvisible';
import {
2019-07-05 03:19:24 +08:00
Capa,
Layout,
Focused,
ComposeType,
FolderType,
Magics,
MessageSetAction,
KeyState,
StorageResultType
} from 'Common/Enums';
2019-07-05 03:19:24 +08:00
import { UNUSED_OPTION_VALUE } from 'Common/Consts';
2019-07-05 03:19:24 +08:00
import { bMobileDevice, popupVisibility, leftPanelDisabled, moveAction } from 'Common/Globals';
import { noop, noopFalse, computedPagenatorHelper, draggablePlace, friendlySize, isUnd } from 'Common/Utils';
2019-07-05 03:19:24 +08:00
import { mailBox, append } from 'Common/Links';
import { Selector } from 'Common/Selector';
import * as Events from 'Common/Events';
2019-07-05 03:19:24 +08:00
import { i18n, initOnStartOrLangChange } from 'Common/Translator';
import {
2019-07-05 03:19:24 +08:00
getFolderFromCacheList,
clearMessageFlagsFromCacheByFolder,
hasRequestedMessage,
addRequestedMessage
} from 'Common/Cache';
import AppStore from 'Stores/User/App';
import QuotaStore from 'Stores/User/Quota';
import SettingsStore from 'Stores/User/Settings';
import FolderStore from 'Stores/User/Folder';
import MessageStore from 'Stores/User/Message';
import * as Settings from 'Storage/Settings';
import Remote from 'Remote/User/Ajax';
2019-07-05 03:19:24 +08:00
import { getApp } from 'Helper/Apps/User';
2019-07-05 03:19:24 +08:00
import { view, command, ViewType, showScreenPopup, setHash } from 'Knoin/Knoin';
import { AbstractViewNext } from 'Knoin/AbstractViewNext';
const canBeMovedHelper = (self) => self.canBeMoved();
@view({
name: 'View/User/MailBox/MessageList',
type: ViewType.Right,
templateID: 'MailMessageList'
})
2019-07-05 03:19:24 +08:00
class MessageListMailBoxUserView extends AbstractViewNext {
constructor() {
super();
this.sLastUid = null;
this.bPrefetch = false;
this.emptySubjectValue = '';
this.iGoToUpUpOrDownDownTimeout = 0;
this.mobile = !!Settings.appSettingsGet('mobile');
2017-02-09 01:48:53 +08:00
this.newMoveToFolder = AppStore.newMoveToFolder;
this.allowReload = !!Settings.capa(Capa.Reload);
this.allowSearch = !!Settings.capa(Capa.Search);
this.allowSearchAdv = !!Settings.capa(Capa.SearchAdv);
this.allowComposer = !!Settings.capa(Capa.Composer);
this.allowMessageListActions = !!Settings.capa(Capa.MessageListActions);
this.allowDangerousActions = !!Settings.capa(Capa.DangerousActions);
this.allowFolders = !!Settings.capa(Capa.Folders);
this.popupVisibility = popupVisibility;
this.message = MessageStore.message;
this.messageList = MessageStore.messageList;
this.messageListDisableAutoSelect = MessageStore.messageListDisableAutoSelect;
this.folderList = FolderStore.folderList;
this.composeInEdit = AppStore.composeInEdit;
this.leftPanelDisabled = leftPanelDisabled;
this.selectorMessageSelected = MessageStore.selectorMessageSelected;
this.selectorMessageFocused = MessageStore.selectorMessageFocused;
this.isMessageSelected = MessageStore.isMessageSelected;
this.messageListSearch = MessageStore.messageListSearch;
this.messageListThreadUid = MessageStore.messageListThreadUid;
this.messageListError = MessageStore.messageListError;
this.folderMenuForMove = FolderStore.folderMenuForMove;
this.useCheckboxesInList = SettingsStore.useCheckboxesInList;
this.mainMessageListSearch = MessageStore.mainMessageListSearch;
this.messageListEndFolder = MessageStore.messageListEndFolder;
this.messageListEndThreadUid = MessageStore.messageListEndThreadUid;
this.messageListChecked = MessageStore.messageListChecked;
this.messageListCheckedOrSelected = MessageStore.messageListCheckedOrSelected;
this.messageListCheckedOrSelectedUidsWithSubMails = MessageStore.messageListCheckedOrSelectedUidsWithSubMails;
this.messageListCompleteLoadingThrottle = MessageStore.messageListCompleteLoadingThrottle;
this.messageListCompleteLoadingThrottleForAnimation = MessageStore.messageListCompleteLoadingThrottleForAnimation;
initOnStartOrLangChange(() => {
this.emptySubjectValue = i18n('MESSAGE_LIST/EMPTY_SUBJECT_TEXT');
});
2014-08-21 23:08:34 +08:00
this.userQuota = QuotaStore.quota;
this.userUsageSize = QuotaStore.usage;
this.userUsageProc = QuotaStore.percentage;
2014-08-21 23:08:34 +08:00
this.moveDropdownTrigger = ko.observable(false);
this.moreDropdownTrigger = ko.observable(false);
// append drag and drop
2019-07-05 03:19:24 +08:00
this.dragOver = ko.observable(false).extend({ 'throttle': 1 });
this.dragOverEnter = ko.observable(false).extend({ 'throttle': 1 });
this.dragOverArea = ko.observable(null);
this.dragOverBodyArea = ko.observable(null);
2019-07-05 03:19:24 +08:00
this.messageListItemTemplate = ko.computed(() =>
this.mobile || Layout.SidePreview === SettingsStore.layout()
? 'MailMessageListItem'
: 'MailMessageListItemNoPreviewPane'
);
2014-08-21 23:08:34 +08:00
this.messageListSearchDesc = ko.computed(() => {
const value = MessageStore.messageListEndSearch();
2019-07-05 03:19:24 +08:00
return '' === value ? '' : i18n('MESSAGE_LIST/SEARCH_RESULT_FOR', { 'SEARCH': value });
});
2014-08-21 23:08:34 +08:00
this.messageListPagenator = ko.computed(
2019-07-05 03:19:24 +08:00
computedPagenatorHelper(MessageStore.messageListPage, MessageStore.messageListPageCount)
);
2014-08-21 23:08:34 +08:00
this.checkAll = ko.computed({
read: () => 0 < MessageStore.messageListChecked().length,
write: (value) => {
value = !!value;
MessageStore.messageList().forEach(message => {
message.checked(value);
});
}
});
2014-08-21 23:08:34 +08:00
this.inputMessageListSearchFocus = ko.observable(false);
this.sLastSearchValue = '';
this.inputProxyMessageListSearch = ko.computed({
read: this.mainMessageListSearch,
write: (value) => {
this.sLastSearchValue = value;
}
});
this.isIncompleteChecked = ko.computed(() => {
2019-07-05 03:19:24 +08:00
const m = MessageStore.messageList().length,
c = MessageStore.messageListChecked().length;
return 0 < m && 0 < c && m > c;
});
2014-08-21 23:08:34 +08:00
this.hasMessages = ko.computed(() => 0 < this.messageList().length);
2014-08-21 23:08:34 +08:00
this.hasCheckedOrSelectedLines = ko.computed(() => 0 < this.messageListCheckedOrSelected().length);
2014-08-21 23:08:34 +08:00
this.isSpamFolder = ko.computed(
() => FolderStore.spamFolder() === this.messageListEndFolder() && '' !== FolderStore.spamFolder()
);
2014-08-21 23:08:34 +08:00
this.isSpamDisabled = ko.computed(() => UNUSED_OPTION_VALUE === FolderStore.spamFolder());
2014-08-21 23:08:34 +08:00
this.isTrashFolder = ko.computed(
() => FolderStore.trashFolder() === this.messageListEndFolder() && '' !== FolderStore.trashFolder()
);
2014-08-21 23:08:34 +08:00
this.isDraftFolder = ko.computed(
() => FolderStore.draftFolder() === this.messageListEndFolder() && '' !== FolderStore.draftFolder()
);
this.isSentFolder = ko.computed(
() => FolderStore.sentFolder() === this.messageListEndFolder() && '' !== FolderStore.sentFolder()
);
this.isArchiveFolder = ko.computed(
() => FolderStore.archiveFolder() === this.messageListEndFolder() && '' !== FolderStore.archiveFolder()
);
this.isArchiveDisabled = ko.computed(() => UNUSED_OPTION_VALUE === FolderStore.archiveFolder());
this.isArchiveVisible = ko.computed(
() => !this.isArchiveFolder() && !this.isArchiveDisabled() && !this.isDraftFolder()
);
this.isSpamVisible = ko.computed(
() => !this.isSpamFolder() && !this.isSpamDisabled() && !this.isDraftFolder() && !this.isSentFolder()
);
this.isUnSpamVisible = ko.computed(
() => this.isSpamFolder() && !this.isSpamDisabled() && !this.isDraftFolder() && !this.isSentFolder()
);
this.mobileCheckedStateShow = ko.computed(() => {
const checked = 0 < this.messageListChecked().length;
return this.mobile ? checked : true;
2016-06-30 08:02:45 +08:00
});
2016-06-16 07:36:44 +08:00
this.mobileCheckedStateHide = ko.computed(() => {
const checked = 0 < this.messageListChecked().length;
return this.mobile ? !checked : true;
});
2015-07-07 02:46:44 +08:00
this.messageListFocused = ko.computed(() => Focused.MessageList === AppStore.focusedState());
this.canBeMoved = this.hasCheckedOrSelectedLines;
this.quotaTooltip = this.quotaTooltip.bind(this);
2016-05-01 09:07:10 +08:00
this.selector = new Selector(
2019-07-05 03:19:24 +08:00
this.messageList,
this.selectorMessageSelected,
this.selectorMessageFocused,
'.messageListItem .actionHandle',
'.messageListItem.selected',
'.messageListItem .checkboxMessage',
'.messageListItem.focused'
);
2016-05-01 09:07:10 +08:00
this.selector.on('onItemSelect', (message) => {
MessageStore.selectMessage(message);
});
2016-05-01 09:07:10 +08:00
this.selector.on('onItemGetUid', (message) => (message ? message.generateUid() : ''));
2016-05-01 09:07:10 +08:00
this.selector.on('onAutoSelect', () => this.useAutoSelect());
this.selector.on('onUpUpOrDownDown', (v) => {
this.goToUpUpOrDownDown(v);
});
2015-05-03 04:22:32 +08:00
Events.sub('mailbox.message-list.selector.go-down', (select) => {
this.selector.goDown(select);
});
Events.sub('mailbox.message-list.selector.go-up', (select) => {
this.selector.goUp(select);
});
Events.sub('mailbox.message.show', (sFolder, sUid) => {
const message = this.messageList().find(
item => item && sFolder === item.folderFullNameRaw && sUid === item.uid
2019-07-05 03:19:24 +08:00
);
2019-07-05 03:19:24 +08:00
if ('INBOX' === sFolder) {
setHash(mailBox(sFolder, 1));
}
2019-07-05 03:19:24 +08:00
if (message) {
this.selector.selectMessageItem(message);
2019-07-05 03:19:24 +08:00
} else {
if ('INBOX' !== sFolder) {
setHash(mailBox(sFolder, 1));
2016-06-30 08:02:45 +08:00
}
MessageStore.selectMessageByFolderAndUid(sFolder, sUid);
}
2016-06-30 08:02:45 +08:00
});
MessageStore.messageListEndHash.subscribe(() => {
this.selector.scrollToTop();
});
}
@command()
clearCommand() {
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.DangerousActions)) {
showScreenPopup(require('View/Popup/FolderClear'), [FolderStore.currentFolder()]);
}
}
@command()
reloadCommand() {
2019-07-05 03:19:24 +08:00
if (!MessageStore.messageListCompleteLoadingThrottleForAnimation() && this.allowReload) {
getApp().reloadMessageList(false, true);
}
}
@command(canBeMovedHelper)
multyForwardCommand() {
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.Composer)) {
showScreenPopup(require('View/Popup/Compose'), [
2019-07-05 03:19:24 +08:00
ComposeType.ForwardAsAttachment,
MessageStore.messageListCheckedOrSelected()
]);
}
}
@command(canBeMovedHelper)
deleteWithoutMoveCommand() {
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.DangerousActions)) {
getApp().deleteMessagesFromFolder(
FolderType.Trash,
FolderStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(),
false
);
}
}
@command(canBeMovedHelper)
deleteCommand() {
2019-07-05 03:19:24 +08:00
getApp().deleteMessagesFromFolder(
FolderType.Trash,
FolderStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(),
true
);
}
@command(canBeMovedHelper)
archiveCommand() {
2019-07-05 03:19:24 +08:00
getApp().deleteMessagesFromFolder(
FolderType.Archive,
FolderStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(),
true
);
}
@command(canBeMovedHelper)
spamCommand() {
2019-07-05 03:19:24 +08:00
getApp().deleteMessagesFromFolder(
FolderType.Spam,
FolderStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(),
true
);
}
@command(canBeMovedHelper)
notSpamCommand() {
2019-07-05 03:19:24 +08:00
getApp().deleteMessagesFromFolder(
FolderType.NotSpam,
FolderStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(),
true
);
}
@command(canBeMovedHelper)
moveCommand() {} // eslint-disable-line no-empty-function
2017-02-09 01:48:53 +08:00
@command(canBeMovedHelper)
moveNewCommand(vm, event) {
2019-07-05 03:19:24 +08:00
if (this.newMoveToFolder() && this.mobileCheckedStateShow()) {
2017-02-09 01:48:53 +08:00
if (vm && event && event.preventDefault) {
event.preventDefault();
if (event.stopPropagation) {
event.stopPropagation();
}
}
2019-07-05 03:19:24 +08:00
if (moveAction()) {
2017-02-09 01:48:53 +08:00
AppStore.focusedState(Focused.MessageList);
moveAction(false);
2019-07-05 03:19:24 +08:00
} else {
2017-02-09 01:48:53 +08:00
AppStore.focusedState(Focused.FolderList);
moveAction(true);
}
}
}
hideLeft(item, event) {
event.preventDefault();
event.stopPropagation();
leftPanelDisabled(true);
}
2016-07-01 06:50:11 +08:00
showLeft(item, event) {
event.preventDefault();
event.stopPropagation();
leftPanelDisabled(false);
2016-06-30 08:02:45 +08:00
}
2014-08-21 23:08:34 +08:00
composeClick() {
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.Composer)) {
showScreenPopup(require('View/Popup/Compose'));
}
2016-06-30 08:02:45 +08:00
}
2014-08-21 23:08:34 +08:00
goToUpUpOrDownDown(up) {
2019-07-05 03:19:24 +08:00
if (0 < this.messageListChecked().length) {
return false;
}
2016-06-30 08:02:45 +08:00
window.clearTimeout(this.iGoToUpUpOrDownDownTimeout);
this.iGoToUpUpOrDownDownTimeout = window.setTimeout(() => {
2019-07-05 03:19:24 +08:00
let prev = null,
next = null,
temp = null,
current = null;
this.messageListPagenator().find(item => {
2019-07-05 03:19:24 +08:00
if (item) {
if (current) {
next = item;
2014-08-21 23:08:34 +08:00
}
2014-04-09 04:59:22 +08:00
2019-07-05 03:19:24 +08:00
if (item.current) {
current = item;
prev = temp;
2014-08-21 23:08:34 +08:00
}
2014-04-09 04:59:22 +08:00
2019-07-05 03:19:24 +08:00
if (next) {
return true;
}
2016-06-30 08:02:45 +08:00
temp = item;
}
2016-06-30 08:02:45 +08:00
return false;
});
2016-06-30 08:02:45 +08:00
2019-07-05 03:19:24 +08:00
if (Layout.NoPreview === SettingsStore.layout() && !this.message()) {
this.selector.iFocusedNextHelper = up ? -1 : 1;
2019-07-05 03:19:24 +08:00
} else {
this.selector.iSelectNextHelper = up ? -1 : 1;
}
2016-06-30 08:02:45 +08:00
2019-07-05 03:19:24 +08:00
if (up ? prev : next) {
this.selector.unselect();
this.gotoPage(up ? prev : next);
}
}, Magics.Time350ms);
2016-06-30 08:02:45 +08:00
return true;
}
useAutoSelect() {
2019-07-05 03:19:24 +08:00
if (this.messageListDisableAutoSelect()) {
return false;
2016-06-30 08:02:45 +08:00
}
2019-07-05 03:19:24 +08:00
if (/is:unseen/.test(this.mainMessageListSearch())) {
return false;
}
return Layout.NoPreview !== SettingsStore.layout();
}
2016-08-10 03:52:30 +08:00
searchEnterAction() {
this.mainMessageListSearch(this.sLastSearchValue);
this.inputMessageListSearchFocus(false);
2016-06-30 08:02:45 +08:00
}
/**
* @returns {string}
*/
printableMessageCountForDeletion() {
const cnt = this.messageListCheckedOrSelectedUidsWithSubMails().length;
return 1 < cnt ? ' (' + (100 > cnt ? cnt : '99+') + ')' : ''; // eslint-disable-line no-magic-numbers
}
2016-08-10 03:52:30 +08:00
cancelSearch() {
this.mainMessageListSearch('');
this.inputMessageListSearchFocus(false);
2016-06-30 08:02:45 +08:00
}
2015-04-21 06:39:14 +08:00
cancelThreadUid() {
2019-07-05 03:19:24 +08:00
setHash(
mailBox(
FolderStore.currentFolderFullNameHash(),
MessageStore.messageListPageBeforeThread(),
MessageStore.messageListSearch()
)
);
2016-06-30 08:02:45 +08:00
}
2015-04-23 05:33:02 +08:00
/**
* @param {string} sToFolderFullNameRaw
* @param {boolean} bCopy
* @returns {boolean}
*/
moveSelectedMessagesToFolder(sToFolderFullNameRaw, bCopy) {
2019-07-05 03:19:24 +08:00
if (this.canBeMoved()) {
getApp().moveMessagesToFolder(
FolderStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(),
sToFolderFullNameRaw,
bCopy
);
}
return false;
2016-06-30 08:02:45 +08:00
}
dragAndDronHelper(oMessageListItem) {
2019-07-05 03:19:24 +08:00
if (oMessageListItem) {
oMessageListItem.checked(true);
}
2014-08-21 23:08:34 +08:00
2019-07-05 03:19:24 +08:00
const el = draggablePlace(),
updateUidsInfo = () => {
const uids = MessageStore.messageListCheckedOrSelectedUidsWithSubMails();
el.data('rl-uids', uids);
el.find('.text').text('' + uids.length);
};
2016-05-01 09:07:10 +08:00
el.data('rl-folder', FolderStore.currentFolderFullNameRaw());
2014-08-21 23:08:34 +08:00
updateUidsInfo();
_.defer(updateUidsInfo);
return el;
2016-06-30 08:02:45 +08:00
}
2014-05-27 20:54:41 +08:00
/**
* @param {string} sFolderFullNameRaw
* @param {number} iSetAction
* @param {Array=} aMessages = null
* @returns {void}
*/
2016-12-15 05:56:17 +08:00
setAction(sFolderFullNameRaw, iSetAction, aMessages) {
getApp().messageListAction(sFolderFullNameRaw, iSetAction, aMessages);
}
/**
* @param {string} sFolderFullNameRaw
* @param {number} iSetAction
2016-12-15 05:56:17 +08:00
* @param {string} sThreadUid = ''
* @returns {void}
*/
2016-12-15 05:56:17 +08:00
setActionForAll(sFolderFullNameRaw, iSetAction, sThreadUid = '') {
2019-07-05 03:19:24 +08:00
if ('' !== sFolderFullNameRaw) {
2016-12-15 05:56:17 +08:00
let cnt = 0;
const uids = [];
let folder = getFolderFromCacheList(sFolderFullNameRaw);
2019-07-05 03:19:24 +08:00
if (folder) {
switch (iSetAction) {
case MessageSetAction.SetSeen:
folder = getFolderFromCacheList(sFolderFullNameRaw);
2019-07-05 03:19:24 +08:00
if (folder) {
MessageStore.messageList().forEach(message => {
2019-07-05 03:19:24 +08:00
if (message.unseen()) {
2016-12-15 07:06:40 +08:00
cnt += 1;
2016-12-15 05:56:17 +08:00
}
message.unseen(false);
2016-12-15 05:56:17 +08:00
uids.push(message.uid);
});
2019-07-05 03:19:24 +08:00
if (sThreadUid) {
2016-12-15 05:56:17 +08:00
folder.messageCountUnread(folder.messageCountUnread() - cnt);
2019-07-05 03:19:24 +08:00
if (0 > folder.messageCountUnread()) {
2016-12-15 05:56:17 +08:00
folder.messageCountUnread(0);
}
2019-07-05 03:19:24 +08:00
} else {
2016-12-15 05:56:17 +08:00
folder.messageCountUnread(0);
}
clearMessageFlagsFromCacheByFolder(sFolderFullNameRaw);
}
2016-12-15 05:56:17 +08:00
Remote.messageSetSeenToAll(noop, sFolderFullNameRaw, true, sThreadUid ? uids : null);
break;
case MessageSetAction.UnsetSeen:
folder = getFolderFromCacheList(sFolderFullNameRaw);
2019-07-05 03:19:24 +08:00
if (folder) {
MessageStore.messageList().forEach(message => {
2019-07-05 03:19:24 +08:00
if (!message.unseen()) {
2016-12-15 07:06:40 +08:00
cnt += 1;
2016-12-15 05:56:17 +08:00
}
message.unseen(true);
2016-12-15 05:56:17 +08:00
uids.push(message.uid);
});
2019-07-05 03:19:24 +08:00
if (sThreadUid) {
2016-12-15 05:56:17 +08:00
folder.messageCountUnread(folder.messageCountUnread() + cnt);
2019-07-05 03:19:24 +08:00
if (folder.messageCountAll() < folder.messageCountUnread()) {
2016-12-15 05:56:17 +08:00
folder.messageCountUnread(folder.messageCountAll());
}
2019-07-05 03:19:24 +08:00
} else {
2016-12-15 05:56:17 +08:00
folder.messageCountUnread(folder.messageCountAll());
}
clearMessageFlagsFromCacheByFolder(sFolderFullNameRaw);
}
2016-12-15 05:56:17 +08:00
Remote.messageSetSeenToAll(noop, sFolderFullNameRaw, false, sThreadUid ? uids : null);
break;
// no default
}
getApp().reloadFlagsCurrentMessageListAndMessageFromCache();
}
}
}
listSetSeen() {
2019-07-05 03:19:24 +08:00
this.setAction(
FolderStore.currentFolderFullNameRaw(),
MessageSetAction.SetSeen,
MessageStore.messageListCheckedOrSelected()
);
}
listSetAllSeen() {
2019-07-05 03:19:24 +08:00
this.setActionForAll(
FolderStore.currentFolderFullNameRaw(),
MessageSetAction.SetSeen,
this.messageListEndThreadUid()
);
}
listUnsetSeen() {
2019-07-05 03:19:24 +08:00
this.setAction(
FolderStore.currentFolderFullNameRaw(),
MessageSetAction.UnsetSeen,
MessageStore.messageListCheckedOrSelected()
);
2016-06-30 08:02:45 +08:00
}
2014-04-09 04:59:22 +08:00
listSetFlags() {
2019-07-05 03:19:24 +08:00
this.setAction(
FolderStore.currentFolderFullNameRaw(),
MessageSetAction.SetFlag,
MessageStore.messageListCheckedOrSelected()
);
}
2016-06-30 08:02:45 +08:00
listUnsetFlags() {
2019-07-05 03:19:24 +08:00
this.setAction(
FolderStore.currentFolderFullNameRaw(),
MessageSetAction.UnsetFlag,
MessageStore.messageListCheckedOrSelected()
);
}
flagMessages(currentMessage) {
const checked = this.messageListCheckedOrSelected();
2019-07-05 03:19:24 +08:00
if (currentMessage) {
const checkedUids = checked.map(message => message.uid);
if (0 < checkedUids.length && checkedUids.includes(currentMessage.uid)) {
2019-07-05 03:19:24 +08:00
this.setAction(
currentMessage.folderFullNameRaw,
currentMessage.flagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
checked
);
} else {
this.setAction(
currentMessage.folderFullNameRaw,
currentMessage.flagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
[currentMessage]
);
}
}
}
2016-07-01 06:50:11 +08:00
flagMessagesFast(bFlag) {
const checked = this.messageListCheckedOrSelected();
2019-07-05 03:19:24 +08:00
if (0 < checked.length) {
if (isUnd(bFlag)) {
const flagged = checked.filter(message => message.flagged());
2019-07-05 03:19:24 +08:00
this.setAction(
checked[0].folderFullNameRaw,
checked.length === flagged.length ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
checked
);
} else {
this.setAction(
checked[0].folderFullNameRaw,
!bFlag ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
checked
);
}
}
2016-06-30 08:02:45 +08:00
}
seenMessagesFast(seen) {
const checked = this.messageListCheckedOrSelected();
2019-07-05 03:19:24 +08:00
if (0 < checked.length) {
if (isUnd(seen)) {
const unseen = checked.filter(message => message.unseen());
2019-07-05 03:19:24 +08:00
this.setAction(
checked[0].folderFullNameRaw,
0 < unseen.length ? MessageSetAction.SetSeen : MessageSetAction.UnsetSeen,
checked
);
} else {
this.setAction(
checked[0].folderFullNameRaw,
seen ? MessageSetAction.SetSeen : MessageSetAction.UnsetSeen,
checked
);
}
}
2016-06-30 08:02:45 +08:00
}
2015-04-21 06:39:14 +08:00
gotoPage(page) {
2019-07-05 03:19:24 +08:00
if (page) {
setHash(
mailBox(
FolderStore.currentFolderFullNameHash(),
page.value,
MessageStore.messageListSearch(),
MessageStore.messageListThreadUid()
)
);
}
}
2015-04-21 06:39:14 +08:00
gotoThread(message) {
2019-07-05 03:19:24 +08:00
if (message && 0 < message.threadsLen()) {
MessageStore.messageListPageBeforeThread(MessageStore.messageListPage());
2019-07-05 03:19:24 +08:00
setHash(mailBox(FolderStore.currentFolderFullNameHash(), 1, MessageStore.messageListSearch(), message.uid));
}
2016-06-30 08:02:45 +08:00
}
2015-04-21 06:39:14 +08:00
clearListIsVisible() {
2019-07-05 03:19:24 +08:00
return (
'' === this.messageListSearchDesc() &&
'' === this.messageListError() &&
2016-12-15 05:56:17 +08:00
'' === this.messageListEndThreadUid() &&
2019-07-05 03:19:24 +08:00
0 < this.messageList().length &&
(this.isSpamFolder() || this.isTrashFolder())
);
2016-06-30 08:02:45 +08:00
}
2015-04-21 06:39:14 +08:00
onBuild(dom) {
const self = this;
this.oContentVisible = $('.b-content', dom);
this.oContentScrollable = $('.content', this.oContentVisible);
this.selector.init(this.oContentVisible, this.oContentScrollable, KeyState.MessageList);
2019-07-05 03:19:24 +08:00
if (this.mobile) {
dom.on('click', () => {
leftPanelDisabled(true);
});
}
dom
.on('click', '.messageList .b-message-list-wrapper', () => {
2019-07-05 03:19:24 +08:00
if (Focused.MessageView === AppStore.focusedState()) {
AppStore.focusedState(Focused.MessageList);
}
})
2019-07-05 03:19:24 +08:00
.on('click', '.e-pagenator .e-page', function() {
// eslint-disable-line prefer-arrow-callback
self.gotoPage(ko.dataFor(this)); // eslint-disable-line no-invalid-this
})
.on('click', '.messageList .checkboxCkeckAll', () => {
this.checkAll(!this.checkAll());
})
2019-07-05 03:19:24 +08:00
.on('click', '.messageList .messageListItem .flagParent', function() {
// eslint-disable-line prefer-arrow-callback
self.flagMessages(ko.dataFor(this)); // eslint-disable-line no-invalid-this
})
2019-07-05 03:19:24 +08:00
.on('click', '.messageList .messageListItem .threads-len', function() {
// eslint-disable-line prefer-arrow-callback
self.gotoThread(ko.dataFor(this)); // eslint-disable-line no-invalid-this
})
2019-07-05 03:19:24 +08:00
.on('dblclick', '.messageList .messageListItem .actionHandle', function() {
// eslint-disable-line prefer-arrow-callback
self.gotoThread(ko.dataFor(this)); // eslint-disable-line no-invalid-this
});
this.initUploaderForAppend();
this.initShortcuts();
2019-07-05 03:19:24 +08:00
if (!bMobileDevice && ifvisible && Settings.capa(Capa.Prefetch)) {
ifvisible.setIdleDuration(Magics.ifvisibleIdle10s);
2014-08-21 23:08:34 +08:00
ifvisible.idle(() => {
this.prefetchNextTick();
});
}
2016-06-30 08:02:45 +08:00
}
2014-08-21 23:08:34 +08:00
initShortcuts() {
key('enter', KeyState.MessageList, () => {
2019-07-05 03:19:24 +08:00
if (this.message() && this.useAutoSelect()) {
Events.pub('mailbox.message-view.toggle-full-screen');
return false;
}
return true;
2016-06-30 08:02:45 +08:00
});
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.MessageListActions)) {
// archive (zip)
key('z', [KeyState.MessageList, KeyState.MessageView], () => {
this.archiveCommand();
return false;
});
// delete
key('delete, shift+delete, shift+3', KeyState.MessageList, (event, handler) => {
2019-07-05 03:19:24 +08:00
if (event) {
if (0 < MessageStore.messageListCheckedOrSelected().length) {
if (handler && 'shift+delete' === handler.shortcut) {
this.deleteWithoutMoveCommand();
2019-07-05 03:19:24 +08:00
} else {
this.deleteCommand();
}
}
return false;
}
return true;
});
2016-06-30 08:02:45 +08:00
}
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.Reload)) {
// check mail
key('ctrl+r, command+r', [KeyState.FolderList, KeyState.MessageList, KeyState.MessageView], () => {
this.reloadCommand();
return false;
});
2016-06-30 08:02:45 +08:00
}
2016-07-01 06:50:11 +08:00
// check all
key('ctrl+a, command+a', KeyState.MessageList, () => {
this.checkAll(!(this.checkAll() && !this.isIncompleteChecked()));
return false;
});
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.Composer)) {
// write/compose (open compose popup)
key('w,c', [KeyState.MessageList, KeyState.MessageView], () => {
showScreenPopup(require('View/Popup/Compose'));
return false;
});
2016-06-30 08:02:45 +08:00
}
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.MessageListActions)) {
// important - star/flag messages
key('i', [KeyState.MessageList, KeyState.MessageView], () => {
this.flagMessagesFast();
return false;
});
2016-06-30 08:02:45 +08:00
}
key('t', [KeyState.MessageList], () => {
let message = this.selectorMessageSelected();
2019-07-05 03:19:24 +08:00
if (!message) {
message = this.selectorMessageFocused();
}
2019-07-05 03:19:24 +08:00
if (message && 0 < message.threadsLen()) {
this.gotoThread(message);
}
2014-08-21 23:08:34 +08:00
return false;
});
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.MessageListActions)) {
// move
key('m', KeyState.MessageList, () => {
2019-07-05 03:19:24 +08:00
if (this.newMoveToFolder()) {
2017-02-09 01:48:53 +08:00
this.moveNewCommand();
2019-07-05 03:19:24 +08:00
} else {
2017-02-09 01:48:53 +08:00
this.moveDropdownTrigger(true);
}
return false;
2016-06-30 08:02:45 +08:00
});
}
2016-06-30 08:02:45 +08:00
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.MessageListActions)) {
// read
key('q', [KeyState.MessageList, KeyState.MessageView], () => {
this.seenMessagesFast(true);
return false;
});
2016-06-30 08:02:45 +08:00
// unread
key('u', [KeyState.MessageList, KeyState.MessageView], () => {
this.seenMessagesFast(false);
return false;
});
}
2016-06-30 08:02:45 +08:00
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.Composer)) {
key('shift+f', [KeyState.MessageList, KeyState.MessageView], () => {
this.multyForwardCommand();
return false;
});
}
2016-06-30 08:02:45 +08:00
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.Search)) {
// search input focus
key('/', [KeyState.MessageList, KeyState.MessageView], () => {
this.inputMessageListSearchFocus(true);
return false;
});
}
2016-06-30 08:02:45 +08:00
// cancel search
key('esc', KeyState.MessageList, () => {
2019-07-05 03:19:24 +08:00
if ('' !== this.messageListSearchDesc()) {
this.cancelSearch();
return false;
2019-07-05 03:19:24 +08:00
} else if ('' !== this.messageListEndThreadUid()) {
this.cancelThreadUid();
return false;
}
2016-06-30 08:02:45 +08:00
return true;
});
// change focused state
key('tab, shift+tab, left, right', KeyState.MessageList, (event, handler) => {
2019-07-05 03:19:24 +08:00
if (event && handler && ('shift+tab' === handler.shortcut || 'left' === handler.shortcut)) {
AppStore.focusedState(Focused.FolderList);
2019-07-05 03:19:24 +08:00
} else if (this.message()) {
AppStore.focusedState(Focused.MessageView);
}
return false;
});
key('ctrl+left, command+left', KeyState.MessageView, noopFalse);
key('ctrl+right, command+right', KeyState.MessageView, noopFalse);
2016-06-30 08:02:45 +08:00
}
2014-08-21 23:08:34 +08:00
prefetchNextTick() {
2019-07-05 03:19:24 +08:00
if (ifvisible && !this.bPrefetch && !ifvisible.now() && this.viewModelVisibility()) {
const message = this.messageList().find(
item => item && !hasRequestedMessage(item.folderFullNameRaw, item.uid)
2019-07-05 03:19:24 +08:00
);
if (message) {
this.bPrefetch = true;
addRequestedMessage(message.folderFullNameRaw, message.uid);
2019-07-05 03:19:24 +08:00
Remote.message(
(result, data) => {
const next = !!(StorageResultType.Success === result && data && data.Result);
_.delay(() => {
this.bPrefetch = false;
if (next) {
this.prefetchNextTick();
}
}, Magics.Time1s);
},
message.folderFullNameRaw,
message.uid
);
}
}
2016-06-30 08:02:45 +08:00
}
advancedSearchClick() {
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.SearchAdv)) {
showScreenPopup(require('View/Popup/AdvancedSearch'), [this.mainMessageListSearch()]);
}
2016-06-30 08:02:45 +08:00
}
quotaTooltip() {
return i18n('MESSAGE_LIST/QUOTA_SIZE', {
'SIZE': friendlySize(this.userUsageSize()),
'PROC': this.userUsageProc(),
'LIMIT': friendlySize(this.userQuota())
2014-08-21 23:08:34 +08:00
});
}
2013-12-09 06:14:55 +08:00
initUploaderForAppend() {
2019-07-05 03:19:24 +08:00
if (!Settings.appSettingsGet('allowAppendMessage') || !this.dragOverArea()) {
return false;
2014-08-21 23:08:34 +08:00
}
2019-07-05 03:19:24 +08:00
const oJua = new Jua({
action: append(),
name: 'AppendFile',
queueSize: 1,
multipleSizeLimit: 1,
hidden: {
Folder: () => FolderStore.currentFolderFullNameRaw()
},
dragAndDropElement: this.dragOverArea(),
dragAndDropBodyElement: this.dragOverBodyArea()
});
this.dragOver.subscribe((value) => {
2019-07-05 03:19:24 +08:00
if (value) {
this.selector.scrollToTop();
}
});
2015-02-22 06:00:51 +08:00
oJua
.on('onDragEnter', () => {
this.dragOverEnter(true);
})
.on('onDragLeave', () => {
this.dragOverEnter(false);
})
.on('onBodyDragEnter', () => {
this.dragOver(true);
})
.on('onBodyDragLeave', () => {
this.dragOver(false);
})
.on('onSelect', (sUid, oData) => {
2019-07-05 03:19:24 +08:00
if (sUid && oData && 'message/rfc822' === oData.Type) {
MessageStore.messageListLoading(true);
return true;
}
2014-08-21 23:08:34 +08:00
return false;
})
.on('onComplete', () => {
getApp().reloadMessageList(true, true);
});
2014-08-21 23:08:34 +08:00
return !!oJua;
}
}
2019-07-05 03:19:24 +08:00
export { MessageListMailBoxUserView, MessageListMailBoxUserView as default };