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

930 lines
24 KiB
JavaScript
Raw Normal View History

import ko from 'ko';
import {
2019-07-05 03:19:24 +08:00
Capa,
Scope
2021-01-25 05:58:06 +08:00
} from 'Common/Enums';
import {
2019-07-05 03:19:24 +08:00
ComposeType,
FolderType,
2021-01-25 05:58:06 +08:00
MessageSetAction
} from 'Common/EnumsUser';
2019-07-05 03:19:24 +08:00
import { UNUSED_OPTION_VALUE } from 'Common/Consts';
2021-03-10 18:44:48 +08:00
import { doc, leftPanelDisabled, moveAction, Settings, SettingsGet } from 'Common/Globals';
2021-08-19 21:14:47 +08:00
import { computedPaginatorHelper, showMessageComposer, folderListOptionsBuilder } from 'Common/UtilsUser';
import { FileInfo } from 'Common/File';
2019-07-05 03:19:24 +08:00
2021-02-04 18:25:00 +08:00
import { mailBox, serverRequest } from 'Common/Links';
2019-07-05 03:19:24 +08:00
import { Selector } from 'Common/Selector';
2019-07-05 03:19:24 +08:00
import { i18n, initOnStartOrLangChange } from 'Common/Translator';
import {
2019-07-05 03:19:24 +08:00
getFolderFromCacheList,
MessageFlagsCache,
2019-07-05 03:19:24 +08:00
hasRequestedMessage,
addRequestedMessage
} from 'Common/Cache';
import { AppUserStore } from 'Stores/User/App';
import { QuotaUserStore } from 'Stores/User/Quota';
import { SettingsUserStore } from 'Stores/User/Settings';
import { FolderUserStore } from 'Stores/User/Folder';
import { MessageUserStore } from 'Stores/User/Message';
import { ThemeStore } from 'Stores/Theme';
import Remote from 'Remote/User/Fetch';
import { decorateKoCommands, showScreenPopup, popupVisibilityNames } from 'Knoin/Knoin';
import { AbstractViewRight } from 'Knoin/AbstractViews';
import { FolderClearPopupView } from 'View/Popup/FolderClear';
import { AdvancedSearchPopupView } from 'View/Popup/AdvancedSearch';
2020-08-07 22:28:30 +08:00
const
canBeMovedHelper = () => MessageUserStore.hasCheckedOrSelected();
export class MessageListMailBoxUserView extends AbstractViewRight {
constructor() {
super('User/MailBox/MessageList', 'MailMessageList');
this.bPrefetch = false;
this.emptySubjectValue = '';
2021-07-19 17:57:47 +08:00
this.iGoToUpOrDownTimeout = 0;
2021-03-10 18:44:48 +08:00
this.newMoveToFolder = !!SettingsGet('NewMoveToFolder');
this.allowReload = Settings.capa(Capa.Reload);
this.allowSearch = Settings.capa(Capa.Search);
this.allowSearchAdv = Settings.capa(Capa.SearchAdv);
this.allowMessageListActions = Settings.capa(Capa.MessageListActions);
this.allowDangerousActions = Settings.capa(Capa.DangerousActions);
2021-03-12 23:54:37 +08:00
this.messageList = MessageUserStore.list;
2021-03-27 07:57:04 +08:00
this.sortSupported = FolderUserStore.sortSupported;
this.composeInEdit = AppUserStore.composeInEdit;
this.leftPanelDisabled = leftPanelDisabled;
this.isMessageSelected = MessageUserStore.isMessageSelected;
2021-03-12 23:54:37 +08:00
this.messageListSearch = MessageUserStore.listSearch;
this.messageListError = MessageUserStore.listError;
this.addComputables({
popupVisibility: () => 0 < popupVisibilityNames().length,
folderMenuForMove: () =>
folderListOptionsBuilder(
[FolderUserStore.currentFolderFullNameRaw()],
[],
item => item ? item.localName() : ''
)
});
this.useCheckboxesInList = SettingsUserStore.useCheckboxesInList;
2021-03-12 23:54:37 +08:00
this.messageListEndThreadUid = MessageUserStore.listEndThreadUid;
2021-03-12 23:54:37 +08:00
this.messageListCompleteLoadingThrottle = MessageUserStore.listCompleteLoading;
initOnStartOrLangChange(() => this.emptySubjectValue = i18n('MESSAGE_LIST/EMPTY_SUBJECT_TEXT'));
2014-08-21 23:08:34 +08:00
this.userUsageProc = QuotaUserStore.percentage;
2014-08-21 23:08:34 +08:00
this.addObservables({
moveDropdownTrigger: false,
moreDropdownTrigger: false,
2021-03-27 07:57:04 +08:00
sortDropdownTrigger: false,
dragOverArea: null,
dragOverBodyArea: null,
inputMessageListSearchFocus: false
});
// append drag and drop
this.dragOver = ko.observable(false).extend({ throttle: 1 });
this.dragOverEnter = ko.observable(false).extend({ throttle: 1 });
this.sLastSearchValue = '';
2014-08-21 23:08:34 +08:00
this.addComputables({
messageListSearchDesc: () => {
2021-03-12 23:54:37 +08:00
const value = MessageUserStore.listEndSearch();
return value ? i18n('MESSAGE_LIST/SEARCH_RESULT_FOR', { SEARCH: value }) : ''
},
2014-08-21 23:08:34 +08:00
2021-03-12 23:54:37 +08:00
messageListPaginator: computedPaginatorHelper(MessageUserStore.listPage,
MessageUserStore.listPageCount),
2014-08-21 23:08:34 +08:00
checkAll: {
2021-03-12 23:54:37 +08:00
read: () => 0 < MessageUserStore.listChecked().length,
write: (value) => {
value = !!value;
2021-03-12 23:54:37 +08:00
MessageUserStore.list.forEach(message => message.checked(value));
}
},
inputProxyMessageListSearch: {
2021-03-30 17:48:22 +08:00
read: MessageUserStore.mainMessageListSearch,
write: value => this.sLastSearchValue = value
},
isIncompleteChecked: () => {
2021-03-12 23:54:37 +08:00
const c = MessageUserStore.listChecked().length;
return c && MessageUserStore.list.length > c;
},
2014-08-21 23:08:34 +08:00
2021-03-30 17:48:22 +08:00
hasMessages: () => 0 < MessageUserStore.list.length,
2014-08-21 23:08:34 +08:00
2021-03-30 17:48:22 +08:00
isSpamFolder: () => (FolderUserStore.spamFolder() || 0) === MessageUserStore.listEndFolder(),
2014-08-21 23:08:34 +08:00
isSpamDisabled: () => UNUSED_OPTION_VALUE === FolderUserStore.spamFolder(),
2014-08-21 23:08:34 +08:00
2021-03-30 17:48:22 +08:00
isTrashFolder: () => (FolderUserStore.trashFolder() || 0) === MessageUserStore.listEndFolder(),
2014-08-21 23:08:34 +08:00
2021-03-30 17:48:22 +08:00
isDraftFolder: () => (FolderUserStore.draftFolder() || 0) === MessageUserStore.listEndFolder(),
2021-03-30 17:48:22 +08:00
isSentFolder: () => (FolderUserStore.sentFolder() || 0) === MessageUserStore.listEndFolder(),
2021-03-30 17:48:22 +08:00
isArchiveFolder: () => (FolderUserStore.archiveFolder() || 0) === MessageUserStore.listEndFolder(),
isArchiveDisabled: () => UNUSED_OPTION_VALUE === FolderUserStore.archiveFolder(),
isArchiveVisible: () => !this.isArchiveFolder() && !this.isArchiveDisabled() && !this.isDraftFolder(),
isSpamVisible: () =>
!this.isSpamFolder() && !this.isSpamDisabled() && !this.isDraftFolder() && !this.isSentFolder(),
isUnSpamVisible: () =>
this.isSpamFolder() && !this.isSpamDisabled() && !this.isDraftFolder() && !this.isSentFolder(),
2021-03-12 23:54:37 +08:00
mobileCheckedStateShow: () => ThemeStore.isMobile() ? 0 < MessageUserStore.listChecked().length : true,
2016-06-16 07:36:44 +08:00
2021-03-12 23:54:37 +08:00
mobileCheckedStateHide: () => ThemeStore.isMobile() ? !MessageUserStore.listChecked().length : true,
2015-07-07 02:46:44 +08:00
2021-03-27 07:57:04 +08:00
messageListFocused: () => Scope.MessageList === AppUserStore.focusedState(),
sortText: () => {
2021-03-30 04:05:35 +08:00
let mode = FolderUserStore.sortMode(),
desc = '' === mode || mode.includes('REVERSE');
2021-03-27 23:02:48 +08:00
mode = mode.split(/\s+/);
2021-03-30 04:05:35 +08:00
if (mode.includes('FROM')) {
return '@' + (desc ? '⬆' : '⬇');
}
if (mode.includes('SUBJECT')) {
return '𝐒' + (desc ? '⬆' : '⬇');
}
return (mode.includes('SIZE') ? '✉' : '📅') + (desc ? '⬇' : '⬆');
2021-03-27 07:57:04 +08:00
}
});
this.hasCheckedOrSelectedLines = MessageUserStore.hasCheckedOrSelected,
this.selector = new Selector(
2021-03-30 17:48:22 +08:00
MessageUserStore.list,
MessageUserStore.selectorMessageSelected,
MessageUserStore.selectorMessageFocused,
2019-07-05 03:19:24 +08:00
'.messageListItem .actionHandle',
'.messageListItem .checkboxMessage',
'.messageListItem.focused'
);
2016-05-01 09:07:10 +08:00
2021-07-19 17:57:47 +08:00
this.selector.on('ItemSelect', message => MessageUserStore.selectMessage(message));
2016-05-01 09:07:10 +08:00
2021-07-19 17:57:47 +08:00
this.selector.on('MiddleClick', message => MessageUserStore.populateMessageBody(message, true));
2016-05-01 09:07:10 +08:00
2021-07-19 17:57:47 +08:00
this.selector.on('ItemGetUid', message => (message ? message.generateUid() : ''));
2021-07-19 17:57:47 +08:00
this.selector.on('AutoSelect', () => this.useAutoSelect());
this.selector.on('UpOrDown', v => this.goToUpOrDown(v));
2015-05-03 04:22:32 +08:00
addEventListener('mailbox.message-list.selector.go-down',
e => this.selector.newSelectPosition('ArrowDown', false, e.detail)
);
addEventListener('mailbox.message-list.selector.go-up',
e => this.selector.newSelectPosition('ArrowUp', false, e.detail)
);
addEventListener('mailbox.message.show', e => {
2021-09-10 22:28:29 +08:00
const sFolder = e.detail.Folder, iUid = e.detail.Uid;
2021-03-30 17:48:22 +08:00
const message = MessageUserStore.list.find(
2021-09-10 22:28:29 +08:00
item => item && sFolder === item.folder && iUid == item.uid
2019-07-05 03:19:24 +08:00
);
2019-07-05 03:19:24 +08:00
if ('INBOX' === sFolder) {
rl.route.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) {
rl.route.setHash(mailBox(sFolder, 1));
2016-06-30 08:02:45 +08:00
}
2021-09-10 22:28:29 +08:00
MessageUserStore.selectMessageByFolderAndUid(sFolder, iUid);
}
2016-06-30 08:02:45 +08:00
});
2021-03-12 23:54:37 +08:00
MessageUserStore.listEndHash.subscribe((() =>
2020-08-27 21:45:47 +08:00
this.selector.scrollToFocused()
).throttle(50));
decorateKoCommands(this, {
clearCommand: 1,
reloadCommand: 1,
multyForwardCommand: canBeMovedHelper,
deleteWithoutMoveCommand: canBeMovedHelper,
deleteCommand: canBeMovedHelper,
archiveCommand: canBeMovedHelper,
spamCommand: canBeMovedHelper,
notSpamCommand: canBeMovedHelper,
moveCommand: canBeMovedHelper,
moveNewCommand: canBeMovedHelper,
});
}
2021-03-27 07:57:04 +08:00
changeSort(self, event) {
FolderUserStore.sortMode(event.target.closest('li').dataset.sort);
this.reloadCommand();
}
clearCommand() {
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.DangerousActions)) {
showScreenPopup(FolderClearPopupView, [FolderUserStore.currentFolder()]);
}
}
reloadCommand() {
2021-03-12 23:54:37 +08:00
if (!MessageUserStore.listLoadingAnimation() && this.allowReload) {
2020-09-15 15:29:25 +08:00
rl.app.reloadMessageList(false, true);
}
}
multyForwardCommand() {
showMessageComposer([
ComposeType.ForwardAsAttachment,
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelected()
]);
}
deleteWithoutMoveCommand() {
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.DangerousActions)) {
2020-09-15 15:29:25 +08:00
rl.app.deleteMessagesFromFolder(
2019-07-05 03:19:24 +08:00
FolderType.Trash,
FolderUserStore.currentFolderFullNameRaw(),
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
2019-07-05 03:19:24 +08:00
false
);
}
}
deleteCommand() {
2020-09-15 15:29:25 +08:00
rl.app.deleteMessagesFromFolder(
2019-07-05 03:19:24 +08:00
FolderType.Trash,
FolderUserStore.currentFolderFullNameRaw(),
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
2019-07-05 03:19:24 +08:00
true
);
}
archiveCommand() {
2020-09-15 15:29:25 +08:00
rl.app.deleteMessagesFromFolder(
2019-07-05 03:19:24 +08:00
FolderType.Archive,
FolderUserStore.currentFolderFullNameRaw(),
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
2019-07-05 03:19:24 +08:00
true
);
}
spamCommand() {
2020-09-15 15:29:25 +08:00
rl.app.deleteMessagesFromFolder(
2019-07-05 03:19:24 +08:00
FolderType.Spam,
FolderUserStore.currentFolderFullNameRaw(),
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
2019-07-05 03:19:24 +08:00
true
);
}
notSpamCommand() {
2020-09-15 15:29:25 +08:00
rl.app.deleteMessagesFromFolder(
2019-07-05 03:19:24 +08:00
FolderType.NotSpam,
FolderUserStore.currentFolderFullNameRaw(),
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
2019-07-05 03:19:24 +08:00
true
);
}
moveCommand() {}
2017-02-09 01:48:53 +08:00
moveNewCommand(vm, event) {
if (this.newMoveToFolder && this.mobileCheckedStateShow()) {
2017-02-09 01:48:53 +08:00
if (vm && event && event.preventDefault) {
event.preventDefault();
2020-09-30 20:07:03 +08:00
event.stopPropagation();
2017-02-09 01:48:53 +08:00
}
2020-09-30 20:07:03 +08:00
let b = moveAction();
AppUserStore.focusedState(b ? Scope.MessageList : Scope.FolderList);
2020-09-30 20:07:03 +08:00
moveAction(!b);
2017-02-09 01:48:53 +08:00
}
}
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() {
showMessageComposer();
2016-06-30 08:02:45 +08:00
}
2014-08-21 23:08:34 +08:00
2021-07-19 17:57:47 +08:00
goToUpOrDown(up) {
2021-03-12 23:54:37 +08:00
if (MessageUserStore.listChecked().length) {
return false;
}
2016-06-30 08:02:45 +08:00
2021-07-19 17:57:47 +08:00
clearTimeout(this.iGoToUpOrDownTimeout);
this.iGoToUpOrDownTimeout = setTimeout(() => {
2020-09-30 20:07:03 +08:00
let prev, next, temp, current;
2020-10-12 21:11:25 +08:00
this.messageListPaginator().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
if (!SettingsUserStore.usePreviewPane() && !MessageUserStore.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);
}
2020-08-14 04:58:41 +08:00
}, 350);
2016-06-30 08:02:45 +08:00
return true;
}
useAutoSelect() {
2021-03-30 17:48:22 +08:00
return !MessageUserStore.listDisableAutoSelect()
&& !/is:unseen/.test(MessageUserStore.mainMessageListSearch())
&& SettingsUserStore.usePreviewPane();
}
2016-08-10 03:52:30 +08:00
searchEnterAction() {
2021-03-30 17:48:22 +08:00
MessageUserStore.mainMessageListSearch(this.sLastSearchValue);
this.inputMessageListSearchFocus(false);
2016-06-30 08:02:45 +08:00
}
cancelSearch() {
2021-03-30 17:48:22 +08:00
MessageUserStore.mainMessageListSearch('');
this.inputMessageListSearchFocus(false);
2016-06-30 08:02:45 +08:00
}
2015-04-21 06:39:14 +08:00
cancelThreadUid() {
rl.route.setHash(
2019-07-05 03:19:24 +08:00
mailBox(
FolderUserStore.currentFolderFullNameHash(),
2021-03-12 23:54:37 +08:00
MessageUserStore.listPageBeforeThread(),
MessageUserStore.listSearch()
2019-07-05 03:19:24 +08:00
)
);
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) {
if (MessageUserStore.hasCheckedOrSelected()) {
2020-09-15 15:29:25 +08:00
rl.app.moveMessagesToFolder(
FolderUserStore.currentFolderFullNameRaw(),
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
2019-07-05 03:19:24 +08:00
sToFolderFullNameRaw,
bCopy
);
}
return false;
2016-06-30 08:02:45 +08:00
}
getDragData(event) {
const item = ko.dataFor(doc.elementFromPoint(event.clientX, event.clientY));
item && item.checked && item.checked(true);
2021-03-12 23:54:37 +08:00
const uids = MessageUserStore.listCheckedOrSelectedUidsWithSubMails();
item && !uids.includes(item.uid) && uids.push(item.uid);
return uids.length ? {
copy: event.ctrlKey,
folder: FolderUserStore.currentFolderFullNameRaw(),
uids: uids
} : null;
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) {
2020-09-15 15:29:25 +08:00
rl.app.messageListAction(sFolderFullNameRaw, iSetAction, aMessages);
}
/**
* @param {string} sFolderFullNameRaw
* @param {number} iSetAction
2021-09-10 22:28:29 +08:00
* @param {number} iThreadUid = ''
* @returns {void}
*/
2021-09-10 22:28:29 +08:00
setActionForAll(sFolderFullNameRaw, iSetAction, iThreadUid = 0) {
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) {
2021-03-12 23:54:37 +08:00
MessageUserStore.list.forEach(message => {
2020-10-23 21:15:54 +08:00
if (message.isUnseen()) {
++cnt;
2016-12-15 05:56:17 +08:00
}
2020-10-23 21:15:54 +08:00
message.isUnseen(false);
2016-12-15 05:56:17 +08:00
uids.push(message.uid);
});
2021-09-10 22:28:29 +08:00
if (iThreadUid) {
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);
}
MessageFlagsCache.clearFolder(sFolderFullNameRaw);
}
2021-09-10 22:28:29 +08:00
Remote.messageSetSeenToAll(()=>0, sFolderFullNameRaw, true, iThreadUid ? uids : null);
break;
case MessageSetAction.UnsetSeen:
folder = getFolderFromCacheList(sFolderFullNameRaw);
2019-07-05 03:19:24 +08:00
if (folder) {
2021-03-12 23:54:37 +08:00
MessageUserStore.list.forEach(message => {
2020-10-23 21:15:54 +08:00
if (!message.isUnseen()) {
++cnt;
2016-12-15 05:56:17 +08:00
}
2020-10-23 21:15:54 +08:00
message.isUnseen(true);
2016-12-15 05:56:17 +08:00
uids.push(message.uid);
});
2021-09-10 22:28:29 +08:00
if (iThreadUid) {
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());
}
MessageFlagsCache.clearFolder(sFolderFullNameRaw);
}
2016-12-15 05:56:17 +08:00
2021-09-10 22:28:29 +08:00
Remote.messageSetSeenToAll(()=>0, sFolderFullNameRaw, false, iThreadUid ? uids : null);
break;
// no default
}
2020-09-15 15:29:25 +08:00
rl.app.reloadFlagsCurrentMessageListAndMessageFromCache();
}
}
}
listSetSeen() {
2019-07-05 03:19:24 +08:00
this.setAction(
FolderUserStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageSetAction.SetSeen,
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelected()
2019-07-05 03:19:24 +08:00
);
}
listSetAllSeen() {
2019-07-05 03:19:24 +08:00
this.setActionForAll(
FolderUserStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageSetAction.SetSeen,
2021-08-10 18:22:55 +08:00
MessageUserStore.listEndThreadUid()
2019-07-05 03:19:24 +08:00
);
}
listUnsetSeen() {
2019-07-05 03:19:24 +08:00
this.setAction(
FolderUserStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageSetAction.UnsetSeen,
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelected()
2019-07-05 03:19:24 +08:00
);
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(
FolderUserStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageSetAction.SetFlag,
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelected()
2019-07-05 03:19:24 +08:00
);
}
2016-06-30 08:02:45 +08:00
listUnsetFlags() {
2019-07-05 03:19:24 +08:00
this.setAction(
FolderUserStore.currentFolderFullNameRaw(),
2019-07-05 03:19:24 +08:00
MessageSetAction.UnsetFlag,
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelected()
2019-07-05 03:19:24 +08:00
);
}
flagMessages(currentMessage) {
const checked = MessageUserStore.listCheckedOrSelected();
2019-07-05 03:19:24 +08:00
if (currentMessage) {
const checkedUids = checked.map(message => message.uid);
if (checkedUids.includes(currentMessage.uid)) {
2019-07-05 03:19:24 +08:00
this.setAction(
2020-10-23 21:15:54 +08:00
currentMessage.folder,
currentMessage.isFlagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
2019-07-05 03:19:24 +08:00
checked
);
} else {
this.setAction(
2020-10-23 21:15:54 +08:00
currentMessage.folder,
currentMessage.isFlagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
2019-07-05 03:19:24 +08:00
[currentMessage]
);
}
}
}
2016-07-01 06:50:11 +08:00
flagMessagesFast(bFlag) {
const checked = MessageUserStore.listCheckedOrSelected();
if (checked.length) {
if (undefined === bFlag) {
2020-10-23 21:15:54 +08:00
const flagged = checked.filter(message => message.isFlagged());
2019-07-05 03:19:24 +08:00
this.setAction(
2020-10-23 21:15:54 +08:00
checked[0].folder,
2019-07-05 03:19:24 +08:00
checked.length === flagged.length ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
checked
);
} else {
this.setAction(
2020-10-23 21:15:54 +08:00
checked[0].folder,
2019-07-05 03:19:24 +08:00
!bFlag ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
checked
);
}
}
2016-06-30 08:02:45 +08:00
}
seenMessagesFast(seen) {
const checked = MessageUserStore.listCheckedOrSelected();
if (checked.length) {
if (undefined === seen) {
2020-10-23 21:15:54 +08:00
const unseen = checked.filter(message => message.isUnseen());
2019-07-05 03:19:24 +08:00
this.setAction(
2020-10-23 21:15:54 +08:00
checked[0].folder,
unseen.length ? MessageSetAction.SetSeen : MessageSetAction.UnsetSeen,
2019-07-05 03:19:24 +08:00
checked
);
} else {
this.setAction(
2020-10-23 21:15:54 +08:00
checked[0].folder,
2019-07-05 03:19:24 +08:00
seen ? MessageSetAction.SetSeen : MessageSetAction.UnsetSeen,
checked
);
}
}
2016-06-30 08:02:45 +08:00
}
2015-04-21 06:39:14 +08:00
gotoPage(page) {
page && rl.route.setHash(
mailBox(
FolderUserStore.currentFolderFullNameHash(),
page.value,
2021-03-12 23:54:37 +08:00
MessageUserStore.listSearch(),
MessageUserStore.listThreadUid()
)
);
}
2015-04-21 06:39:14 +08:00
gotoThread(message) {
2019-07-05 03:19:24 +08:00
if (message && 0 < message.threadsLen()) {
2021-03-12 23:54:37 +08:00
MessageUserStore.listPageBeforeThread(MessageUserStore.listPage());
rl.route.setHash(
2021-03-12 23:54:37 +08:00
mailBox(FolderUserStore.currentFolderFullNameHash(), 1, MessageUserStore.listSearch(), message.uid)
);
}
2016-06-30 08:02:45 +08:00
}
2015-04-21 06:39:14 +08:00
2021-08-10 18:22:55 +08:00
listEmptyMessage() {
if (!this.dragOver()
&& !MessageUserStore.list().length
&& !MessageUserStore.listCompleteLoading()
&& !MessageUserStore.listError()) {
return i18n('MESSAGE_LIST/EMPTY_' + (MessageUserStore.listSearch() ? 'SEARCH_' : '') + 'LIST');
}
return '';
}
clearListIsVisible() {
2019-07-05 03:19:24 +08:00
return (
!this.messageListSearchDesc() &&
2021-08-10 18:22:55 +08:00
!MessageUserStore.listError() &&
!MessageUserStore.listEndThreadUid() &&
MessageUserStore.list().length &&
2019-07-05 03:19:24 +08:00
(this.isSpamFolder() || this.isTrashFolder())
);
2016-06-30 08:02:45 +08:00
}
2015-04-21 06:39:14 +08:00
onBuild(dom) {
const eqs = (ev, s) => ev.target.closestWithin('.messageList '+s, dom);
this.selector.init(dom.querySelector('.b-content'), Scope.MessageList);
dom.addEventListener('click', event => {
ThemeStore.isMobile() && leftPanelDisabled(true);
if (eqs(event, '.b-message-list-wrapper') && Scope.MessageView === AppUserStore.focusedState()) {
AppUserStore.focusedState(Scope.MessageList);
}
2020-10-12 21:11:25 +08:00
let el = eqs(event, '.e-paginator .e-page');
el && this.gotoPage(ko.dataFor(el));
eqs(event, '.checkboxCheckAll') && this.checkAll(!this.checkAll());
2021-09-10 22:28:29 +08:00
el = eqs(event, '.flagParent');
el && this.flagMessages(ko.dataFor(el));
2021-09-10 22:28:29 +08:00
el = eqs(event, '.threads-len');
el && this.gotoThread(ko.dataFor(el));
});
dom.addEventListener('dblclick', event => {
2021-09-10 22:28:29 +08:00
let el = eqs(event, '.actionHandle');
el && this.gotoThread(ko.dataFor(el));
});
2021-08-13 02:17:37 +08:00
// initUploaderForAppend
if (Settings.app('allowAppendMessage') && this.dragOverArea()) {
const oJua = new Jua({
action: serverRequest('Append'),
name: 'AppendFile',
2021-09-14 18:50:56 +08:00
limit: 1,
2021-08-13 02:17:37 +08:00
hidden: {
Folder: () => FolderUserStore.currentFolderFullNameRaw()
},
dragAndDropElement: this.dragOverArea(),
dragAndDropBodyElement: this.dragOverBodyArea()
});
2021-08-13 02:17:37 +08:00
this.dragOver.subscribe(value => value && this.selector.scrollToTop());
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) => {
if (sUid && oData && 'message/rfc822' === oData.Type) {
MessageUserStore.listLoading(true);
return true;
}
return false;
})
.on('onComplete', () => rl.app.reloadMessageList(true, true));
}
2014-08-21 23:08:34 +08:00
2021-08-13 02:17:37 +08:00
// initShortcuts
shortcuts.add('enter,open', '', Scope.MessageList, () => {
if (MessageUserStore.message() && this.useAutoSelect()) {
dispatchEvent(new CustomEvent('mailbox.message-view.toggle-full-screen'));
return false;
}
2016-06-30 08:02:45 +08:00
});
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.MessageListActions)) {
// archive (zip)
shortcuts.add('z', '', [Scope.MessageList, Scope.MessageView], () => {
this.archiveCommand();
return false;
});
// delete
shortcuts.add('delete', 'shift', Scope.MessageList, () => {
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelected().length && this.deleteWithoutMoveCommand();
return false;
});
// shortcuts.add('3', 'shift', Scope.MessageList, () => {
shortcuts.add('delete', '', Scope.MessageList, () => {
2021-03-12 23:54:37 +08:00
MessageUserStore.listCheckedOrSelected().length && this.deleteCommand();
return false;
});
2016-06-30 08:02:45 +08:00
}
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.Reload)) {
// check mail
shortcuts.add('r', 'meta', [Scope.FolderList, Scope.MessageList, Scope.MessageView], () => {
this.reloadCommand();
return false;
});
2016-06-30 08:02:45 +08:00
}
2016-07-01 06:50:11 +08:00
// check all
shortcuts.add('a', 'meta', Scope.MessageList, () => {
this.checkAll(!(this.checkAll() && !this.isIncompleteChecked()));
return false;
});
// write/compose (open compose popup)
shortcuts.add('w,c,new', '', [Scope.MessageList, Scope.MessageView], () => {
showMessageComposer();
return false;
});
2019-07-05 03:19:24 +08:00
if (Settings.capa(Capa.MessageListActions)) {
// important - star/flag messages
shortcuts.add('i', '', [Scope.MessageList, Scope.MessageView], () => {
this.flagMessagesFast();
return false;
});
2016-06-30 08:02:45 +08:00
}
shortcuts.add('t', '', [Scope.MessageList], () => {
2021-03-30 17:48:22 +08:00
let message = MessageUserStore.selectorMessageSelected();
2019-07-05 03:19:24 +08:00
if (!message) {
2021-03-30 17:48:22 +08:00
message = MessageUserStore.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
shortcuts.add('insert', '', Scope.MessageList, () => {
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
shortcuts.add('q', '', [Scope.MessageList, Scope.MessageView], () => {
this.seenMessagesFast(true);
return false;
});
2016-06-30 08:02:45 +08:00
// unread
shortcuts.add('u', '', [Scope.MessageList, Scope.MessageView], () => {
this.seenMessagesFast(false);
return false;
});
}
2016-06-30 08:02:45 +08:00
shortcuts.add('f,mailforward', 'shift', [Scope.MessageList, Scope.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
shortcuts.add('/', '', [Scope.MessageList, Scope.MessageView], () => {
this.inputMessageListSearchFocus(true);
return false;
});
}
2016-06-30 08:02:45 +08:00
// cancel search
shortcuts.add('escape', '', Scope.MessageList, () => {
if (this.messageListSearchDesc()) {
this.cancelSearch();
return false;
2021-08-10 18:22:55 +08:00
} else if (MessageUserStore.listEndThreadUid()) {
this.cancelThreadUid();
return false;
}
});
// change focused state
shortcuts.add('tab', 'shift', Scope.MessageList, () => {
AppUserStore.focusedState(Scope.FolderList);
return false;
});
shortcuts.add('arrowleft', '', Scope.MessageList, () => {
AppUserStore.focusedState(Scope.FolderList);
return false;
});
shortcuts.add('tab,arrowright', '', Scope.MessageList, () => {
2021-07-22 03:54:07 +08:00
if (MessageUserStore.message()){
AppUserStore.focusedState(Scope.MessageView);
return false;
}
});
shortcuts.add('arrowleft', 'meta', Scope.MessageView, ()=>false);
shortcuts.add('arrowright', 'meta', Scope.MessageView, ()=>false);
2021-08-13 02:17:37 +08:00
if (!ThemeStore.isMobile() && Settings.capa(Capa.Prefetch)) {
ifvisible.idle(this.prefetchNextTick.bind(this));
}
2016-06-30 08:02:45 +08:00
}
2014-08-21 23:08:34 +08:00
prefetchNextTick() {
if (!this.bPrefetch && !ifvisible.now() && this.viewModelVisible) {
2021-03-30 17:48:22 +08:00
const message = MessageUserStore.list.find(
2020-10-23 21:15:54 +08:00
item => item && !hasRequestedMessage(item.folder, item.uid)
2019-07-05 03:19:24 +08:00
);
if (message) {
this.bPrefetch = true;
2020-10-23 21:15:54 +08:00
addRequestedMessage(message.folder, message.uid);
2019-07-05 03:19:24 +08:00
Remote.message(
2021-03-18 21:48:21 +08:00
iError => {
const next = !iError;
2020-07-23 02:29:48 +08:00
setTimeout(() => {
2019-07-05 03:19:24 +08:00
this.bPrefetch = false;
next && this.prefetchNextTick();
2020-08-14 04:58:41 +08:00
}, 1000);
2019-07-05 03:19:24 +08:00
},
2020-10-23 21:15:54 +08:00
message.folder,
2019-07-05 03:19:24 +08:00
message.uid
);
}
}
2016-06-30 08:02:45 +08:00
}
advancedSearchClick() {
Settings.capa(Capa.SearchAdv)
2021-03-30 17:48:22 +08:00
&& showScreenPopup(AdvancedSearchPopupView, [MessageUserStore.mainMessageListSearch()]);
2016-06-30 08:02:45 +08:00
}
quotaTooltip() {
return i18n('MESSAGE_LIST/QUOTA_SIZE', {
SIZE: FileInfo.friendlySize(QuotaUserStore.usage()),
PROC: QuotaUserStore.percentage(),
LIMIT: FileInfo.friendlySize(QuotaUserStore.quota())
2021-04-07 05:03:20 +08:00
}).replace(/<[^>]+>/g, '');
}
}