Restructure JavaScript

Split list code from MessageUserStore into MessagelistUserStore
Move functions out of AppUser
This commit is contained in:
the-djmaze 2022-02-23 19:26:52 +01:00
parent 60b7f61e42
commit 661cd2aaf9
26 changed files with 1144 additions and 1186 deletions

View file

@ -15,8 +15,9 @@ import { UNUSED_OPTION_VALUE } from 'Common/Consts';
import { doc, leftPanelDisabled, moveAction, Settings, SettingsCapa, SettingsGet, fireEvent } from 'Common/Globals';
import { computedPaginatorHelper, showMessageComposer, folderListOptionsBuilder } from 'Common/UtilsUser';
import { computedPaginatorHelper, showMessageComposer, populateMessageBody } from 'Common/UtilsUser';
import { FileInfo } from 'Common/File';
import { folderListOptionsBuilder, moveMessagesToFolder } from 'Common/Folders';
import { mailBox, serverRequest } from 'Common/Links';
import { Selector } from 'Common/Selector';
@ -34,6 +35,7 @@ import { AppUserStore } from 'Stores/User/App';
import { SettingsUserStore } from 'Stores/User/Settings';
import { FolderUserStore } from 'Stores/User/Folder';
import { MessageUserStore } from 'Stores/User/Message';
import { MessagelistUserStore } from 'Stores/User/Messagelist';
import { ThemeStore } from 'Stores/Theme';
import Remote from 'Remote/User/Fetch';
@ -44,8 +46,18 @@ import { AbstractViewRight } from 'Knoin/AbstractViews';
import { FolderClearPopupView } from 'View/Popup/FolderClear';
import { AdvancedSearchPopupView } from 'View/Popup/AdvancedSearch';
import { MessageModel } from 'Model/Message';
const
canBeMovedHelper = () => MessageUserStore.hasCheckedOrSelected();
canBeMovedHelper = () => MessagelistUserStore.hasCheckedOrSelected(),
/**
* @param {string} sFolderFullName
* @param {number} iSetAction
* @param {Array=} aMessages = null
* @returns {void}
*/
listAction = (...args) => MessagelistUserStore.setAction(...args);
export class MailMessageList extends AbstractViewRight {
constructor() {
@ -62,23 +74,23 @@ export class MailMessageList extends AbstractViewRight {
this.allowSearchAdv = SettingsCapa(Capa.SearchAdv);
this.allowDangerousActions = SettingsCapa(Capa.DangerousActions);
this.messageList = MessageUserStore.list;
this.messageList = MessagelistUserStore;
this.composeInEdit = AppUserStore.composeInEdit;
this.isMobile = ThemeStore.isMobile;
this.leftPanelDisabled = leftPanelDisabled;
this.messageListSearch = MessageUserStore.listSearch;
this.messageListError = MessageUserStore.listError;
this.messageListSearch = MessagelistUserStore.listSearch;
this.messageListError = MessagelistUserStore.error;
this.popupVisibility = arePopupsVisible;
this.useCheckboxesInList = SettingsUserStore.useCheckboxesInList;
this.messageListThreadUid = MessageUserStore.listEndThreadUid;
this.messageListThreadUid = MessagelistUserStore.endThreadUid;
this.messageListIsLoading = MessageUserStore.listIsLoading;
this.messageListIsLoading = MessagelistUserStore.isLoading;
initOnStartOrLangChange(() => this.emptySubjectValue = i18n('MESSAGE_LIST/EMPTY_SUBJECT_TEXT'));
@ -114,44 +126,44 @@ export class MailMessageList extends AbstractViewRight {
),
messageListSearchDesc: () => {
const value = MessageUserStore.list().Search;
const value = MessagelistUserStore().Search;
return value ? i18n('MESSAGE_LIST/SEARCH_RESULT_FOR', { SEARCH: value }) : ''
},
messageListPaginator: computedPaginatorHelper(MessageUserStore.listPage,
MessageUserStore.listPageCount),
messageListPaginator: computedPaginatorHelper(MessagelistUserStore.page,
MessagelistUserStore.pageCount),
checkAll: {
read: () => 0 < MessageUserStore.listChecked().length,
read: () => 0 < MessagelistUserStore.listChecked().length,
write: (value) => {
value = !!value;
MessageUserStore.list.forEach(message => message.checked(value));
MessagelistUserStore.forEach(message => message.checked(value));
}
},
inputProxyMessageListSearch: {
read: MessageUserStore.mainMessageListSearch,
read: MessagelistUserStore.mainSearch,
write: value => this.sLastSearchValue = value
},
isIncompleteChecked: () => {
const c = MessageUserStore.listChecked().length;
return c && MessageUserStore.list.length > c;
const c = MessagelistUserStore.listChecked().length;
return c && MessagelistUserStore().length > c;
},
hasMessages: () => 0 < MessageUserStore.list().length,
hasMessages: () => 0 < MessagelistUserStore().length,
isSpamFolder: () => (FolderUserStore.spamFolder() || 0) === MessageUserStore.list().Folder,
isSpamFolder: () => (FolderUserStore.spamFolder() || 0) === MessagelistUserStore().Folder,
isSpamDisabled: () => UNUSED_OPTION_VALUE === FolderUserStore.spamFolder(),
isTrashFolder: () => (FolderUserStore.trashFolder() || 0) === MessageUserStore.list().Folder,
isTrashFolder: () => (FolderUserStore.trashFolder() || 0) === MessagelistUserStore().Folder,
isDraftFolder: () => (FolderUserStore.draftsFolder() || 0) === MessageUserStore.list().Folder,
isDraftFolder: () => (FolderUserStore.draftsFolder() || 0) === MessagelistUserStore().Folder,
isSentFolder: () => (FolderUserStore.sentFolder() || 0) === MessageUserStore.list().Folder,
isSentFolder: () => (FolderUserStore.sentFolder() || 0) === MessagelistUserStore().Folder,
isArchiveFolder: () => (FolderUserStore.archiveFolder() || 0) === MessageUserStore.list().Folder,
isArchiveFolder: () => (FolderUserStore.archiveFolder() || 0) === MessagelistUserStore().Folder,
isArchiveDisabled: () => UNUSED_OPTION_VALUE === FolderUserStore.archiveFolder(),
@ -163,9 +175,9 @@ export class MailMessageList extends AbstractViewRight {
isUnSpamVisible: () =>
this.isSpamFolder() && !this.isSpamDisabled() && !this.isDraftFolder() && !this.isSentFolder(),
mobileCheckedStateShow: () => ThemeStore.isMobile() ? 0 < MessageUserStore.listChecked().length : true,
mobileCheckedStateShow: () => ThemeStore.isMobile() ? 0 < MessagelistUserStore.listChecked().length : true,
mobileCheckedStateHide: () => ThemeStore.isMobile() ? !MessageUserStore.listChecked().length : true,
mobileCheckedStateHide: () => ThemeStore.isMobile() ? !MessagelistUserStore.listChecked().length : true,
sortText: () => {
let mode = FolderUserStore.sortMode(),
@ -181,20 +193,27 @@ export class MailMessageList extends AbstractViewRight {
}
});
this.hasCheckedOrSelectedLines = MessageUserStore.hasCheckedOrSelected,
this.hasCheckedOrSelectedLines = MessagelistUserStore.hasCheckedOrSelected,
this.selector = new Selector(
MessageUserStore.list,
MessageUserStore.selectorMessageSelected,
MessageUserStore.selectorMessageFocused,
MessagelistUserStore,
MessagelistUserStore.selectedMessage,
MessagelistUserStore.focusedMessage,
'.messageListItem .actionHandle',
'.messageListItem .checkboxMessage',
'.messageListItem.focused'
);
this.selector.on('ItemSelect', message => MessageUserStore.selectMessage(message));
this.selector.on('ItemSelect', message => {
if (message) {
MessageUserStore.message(MessageModel.fromMessageListItem(message));
populateMessageBody(MessageUserStore.message());
} else {
MessageUserStore.message(null);
}
});
this.selector.on('MiddleClick', message => MessageUserStore.populateMessageBody(message, true));
this.selector.on('MiddleClick', message => populateMessageBody(message, true));
this.selector.on('ItemGetUid', message => (message ? message.generateUid() : ''));
@ -213,7 +232,7 @@ export class MailMessageList extends AbstractViewRight {
addEventListener('mailbox.message.show', e => {
const sFolder = e.detail.Folder, iUid = e.detail.Uid;
const message = MessageUserStore.list.find(
const message = MessagelistUserStore.find(
item => item && sFolder === item.folder && iUid == item.uid
);
@ -227,12 +246,19 @@ export class MailMessageList extends AbstractViewRight {
if ('INBOX' !== sFolder) {
rl.route.setHash(mailBox(sFolder));
}
if (sFolder && iUid) {
MessageUserStore.message(MessageModel.fromMessageListItem(null));
MessageUserStore.message().folder = sFolder;
MessageUserStore.message().uid = iUid;
MessageUserStore.selectMessageByFolderAndUid(sFolder, iUid);
populateMessageBody(MessageUserStore.message());
} else {
MessageUserStore.message(null);
}
}
});
MessageUserStore.listEndHash.subscribe((() =>
MessagelistUserStore.endHash.subscribe((() =>
this.selector.scrollToFocused()
).throttle(50));
@ -260,15 +286,15 @@ export class MailMessageList extends AbstractViewRight {
}
reload() {
if (!MessageUserStore.listIsLoading()) {
rl.app.reloadMessageList(false, true);
if (!MessagelistUserStore.isLoading()) {
MessagelistUserStore.reload(false, true);
}
}
multyForwardCommand() {
showMessageComposer([
ComposeType.ForwardAsAttachment,
MessageUserStore.listCheckedOrSelected()
MessagelistUserStore.listCheckedOrSelected()
]);
}
@ -277,7 +303,7 @@ export class MailMessageList extends AbstractViewRight {
rl.app.deleteMessagesFromFolder(
FolderType.Trash,
FolderUserStore.currentFolderFullName(),
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(),
false
);
}
@ -287,7 +313,7 @@ export class MailMessageList extends AbstractViewRight {
rl.app.deleteMessagesFromFolder(
FolderType.Trash,
FolderUserStore.currentFolderFullName(),
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(),
true
);
}
@ -296,7 +322,7 @@ export class MailMessageList extends AbstractViewRight {
rl.app.deleteMessagesFromFolder(
FolderType.Archive,
FolderUserStore.currentFolderFullName(),
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(),
true
);
}
@ -305,7 +331,7 @@ export class MailMessageList extends AbstractViewRight {
rl.app.deleteMessagesFromFolder(
FolderType.Spam,
FolderUserStore.currentFolderFullName(),
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(),
true
);
}
@ -314,7 +340,7 @@ export class MailMessageList extends AbstractViewRight {
rl.app.deleteMessagesFromFolder(
FolderType.NotSpam,
FolderUserStore.currentFolderFullName(),
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(),
true
);
}
@ -339,7 +365,7 @@ export class MailMessageList extends AbstractViewRight {
}
goToUpOrDown(up) {
if (MessageUserStore.listChecked().length) {
if (MessagelistUserStore.listChecked().length) {
return false;
}
@ -384,27 +410,28 @@ export class MailMessageList extends AbstractViewRight {
}
useAutoSelect() {
return !MessageUserStore.listDisableAutoSelect()
&& !/is:unseen/.test(MessageUserStore.mainMessageListSearch())
return !MessagelistUserStore.disableAutoSelect()
&& !/is:unseen/.test(MessagelistUserStore.mainSearch())
&& SettingsUserStore.usePreviewPane();
}
searchEnterAction() {
MessageUserStore.mainMessageListSearch(this.sLastSearchValue);
MessagelistUserStore.mainSearch(this.sLastSearchValue);
this.inputMessageListSearchFocus(false);
}
cancelSearch() {
MessageUserStore.mainMessageListSearch('');
MessagelistUserStore.mainSearch('');
this.inputMessageListSearchFocus(false);
}
cancelThreadUid() {
// history.go(-1) better?
rl.route.setHash(
mailBox(
FolderUserStore.currentFolderFullNameHash(),
MessageUserStore.listPageBeforeThread(),
MessageUserStore.listSearch()
MessagelistUserStore.pageBeforeThread(),
MessagelistUserStore.listSearch()
)
);
}
@ -415,10 +442,10 @@ export class MailMessageList extends AbstractViewRight {
* @returns {boolean}
*/
moveSelectedMessagesToFolder(sToFolderFullName, bCopy) {
if (MessageUserStore.hasCheckedOrSelected()) {
rl.app.moveMessagesToFolder(
if (MessagelistUserStore.hasCheckedOrSelected()) {
moveMessagesToFolder(
FolderUserStore.currentFolderFullName(),
MessageUserStore.listCheckedOrSelectedUidsWithSubMails(),
MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(),
sToFolderFullName,
bCopy
);
@ -430,7 +457,7 @@ export class MailMessageList extends AbstractViewRight {
getDragData(event) {
const item = ko.dataFor(doc.elementFromPoint(event.clientX, event.clientY));
item && item.checked && item.checked(true);
const uids = MessageUserStore.listCheckedOrSelectedUidsWithSubMails();
const uids = MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails();
item && !uids.includes(item.uid) && uids.push(item.uid);
return uids.length ? {
copy: event.ctrlKey,
@ -439,34 +466,24 @@ export class MailMessageList extends AbstractViewRight {
} : null;
}
/**
* @param {string} sFolderFullName
* @param {number} iSetAction
* @param {Array=} aMessages = null
* @returns {void}
*/
setAction(sFolderFullName, iSetAction, aMessages) {
rl.app.messageListAction(sFolderFullName, iSetAction, aMessages);
}
listSetSeen() {
this.setAction(
listAction(
FolderUserStore.currentFolderFullName(),
MessageSetAction.SetSeen,
MessageUserStore.listCheckedOrSelected()
MessagelistUserStore.listCheckedOrSelected()
);
}
listSetAllSeen() {
let sFolderFullName = FolderUserStore.currentFolderFullName(),
iThreadUid = MessageUserStore.listEndThreadUid();
iThreadUid = MessagelistUserStore.endThreadUid();
if (sFolderFullName) {
let cnt = 0;
const uids = [];
let folder = getFolderFromCacheList(sFolderFullName);
if (folder) {
MessageUserStore.list.forEach(message => {
MessagelistUserStore.forEach(message => {
if (message.isUnseen()) {
++cnt;
}
@ -486,47 +503,47 @@ export class MailMessageList extends AbstractViewRight {
Remote.messageSetSeenToAll(sFolderFullName, true, iThreadUid ? uids : null);
MessageUserStore.reloadFlagsAndCachedMessage();
MessagelistUserStore.reloadFlagsAndCachedMessage();
}
}
}
listUnsetSeen() {
this.setAction(
listAction(
FolderUserStore.currentFolderFullName(),
MessageSetAction.UnsetSeen,
MessageUserStore.listCheckedOrSelected()
MessagelistUserStore.listCheckedOrSelected()
);
}
listSetFlags() {
this.setAction(
listAction(
FolderUserStore.currentFolderFullName(),
MessageSetAction.SetFlag,
MessageUserStore.listCheckedOrSelected()
MessagelistUserStore.listCheckedOrSelected()
);
}
listUnsetFlags() {
this.setAction(
listAction(
FolderUserStore.currentFolderFullName(),
MessageSetAction.UnsetFlag,
MessageUserStore.listCheckedOrSelected()
MessagelistUserStore.listCheckedOrSelected()
);
}
flagMessages(currentMessage) {
const checked = MessageUserStore.listCheckedOrSelected();
const checked = MessagelistUserStore.listCheckedOrSelected();
if (currentMessage) {
const checkedUids = checked.map(message => message.uid);
if (checkedUids.includes(currentMessage.uid)) {
this.setAction(
listAction(
currentMessage.folder,
currentMessage.isFlagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
checked
);
} else {
this.setAction(
listAction(
currentMessage.folder,
currentMessage.isFlagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
[currentMessage]
@ -536,17 +553,17 @@ export class MailMessageList extends AbstractViewRight {
}
flagMessagesFast(bFlag) {
const checked = MessageUserStore.listCheckedOrSelected();
const checked = MessagelistUserStore.listCheckedOrSelected();
if (checked.length) {
if (undefined === bFlag) {
const flagged = checked.filter(message => message.isFlagged());
this.setAction(
listAction(
checked[0].folder,
checked.length === flagged.length ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
checked
);
} else {
this.setAction(
listAction(
checked[0].folder,
!bFlag ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag,
checked
@ -556,17 +573,17 @@ export class MailMessageList extends AbstractViewRight {
}
seenMessagesFast(seen) {
const checked = MessageUserStore.listCheckedOrSelected();
const checked = MessagelistUserStore.listCheckedOrSelected();
if (checked.length) {
if (undefined === seen) {
const unseen = checked.filter(message => message.isUnseen());
this.setAction(
listAction(
checked[0].folder,
unseen.length ? MessageSetAction.SetSeen : MessageSetAction.UnsetSeen,
checked
);
} else {
this.setAction(
listAction(
checked[0].folder,
seen ? MessageSetAction.SetSeen : MessageSetAction.UnsetSeen,
checked
@ -580,28 +597,28 @@ export class MailMessageList extends AbstractViewRight {
mailBox(
FolderUserStore.currentFolderFullNameHash(),
page.value,
MessageUserStore.listSearch(),
MessageUserStore.listThreadUid()
MessagelistUserStore.listSearch(),
MessagelistUserStore.threadUid()
)
);
}
gotoThread(message) {
if (message && 0 < message.threadsLen()) {
MessageUserStore.listPageBeforeThread(MessageUserStore.listPage());
MessagelistUserStore.pageBeforeThread(MessagelistUserStore.page());
rl.route.setHash(
mailBox(FolderUserStore.currentFolderFullNameHash(), 1, MessageUserStore.listSearch(), message.uid)
mailBox(FolderUserStore.currentFolderFullNameHash(), 1, MessagelistUserStore.listSearch(), message.uid)
);
}
}
listEmptyMessage() {
if (!this.dragOver()
&& !MessageUserStore.list().length
&& !MessageUserStore.listIsLoading()
&& !MessageUserStore.listError()) {
return i18n('MESSAGE_LIST/EMPTY_' + (MessageUserStore.listSearch() ? 'SEARCH_' : '') + 'LIST');
&& !MessagelistUserStore().length
&& !MessagelistUserStore.isLoading()
&& !MessagelistUserStore.error()) {
return i18n('MESSAGE_LIST/EMPTY_' + (MessagelistUserStore.listSearch() ? 'SEARCH_' : '') + 'LIST');
}
return '';
}
@ -609,9 +626,9 @@ export class MailMessageList extends AbstractViewRight {
clearListIsVisible() {
return (
!this.messageListSearchDesc() &&
!MessageUserStore.listError() &&
!MessageUserStore.listEndThreadUid() &&
MessageUserStore.list().length &&
!MessagelistUserStore.error() &&
!MessagelistUserStore.endThreadUid() &&
MessagelistUserStore().length &&
(this.isSpamFolder() || this.isTrashFolder())
);
}
@ -668,13 +685,13 @@ export class MailMessageList extends AbstractViewRight {
.on('onBodyDragLeave', () => this.dragOver(false))
.on('onSelect', (sUid, oData) => {
if (sUid && oData && 'message/rfc822' === oData.Type) {
MessageUserStore.listLoading(true);
MessagelistUserStore.loading(true);
return true;
}
return false;
})
.on('onComplete', () => rl.app.reloadMessageList(true, true));
.on('onComplete', () => MessagelistUserStore.reload(true, true));
}
// initShortcuts
@ -694,12 +711,12 @@ export class MailMessageList extends AbstractViewRight {
// delete
shortcuts.add('delete', 'shift', Scope.MessageList, () => {
MessageUserStore.listCheckedOrSelected().length && this.deleteWithoutMoveCommand();
MessagelistUserStore.listCheckedOrSelected().length && this.deleteWithoutMoveCommand();
return false;
});
// shortcuts.add('3', 'shift', Scope.MessageList, () => {
shortcuts.add('delete', '', Scope.MessageList, () => {
MessageUserStore.listCheckedOrSelected().length && this.deleteCommand();
MessagelistUserStore.listCheckedOrSelected().length && this.deleteCommand();
return false;
});
@ -728,9 +745,9 @@ export class MailMessageList extends AbstractViewRight {
});
shortcuts.add('t', '', [Scope.MessageList], () => {
let message = MessageUserStore.selectorMessageSelected();
let message = MessagelistUserStore.selectedMessage();
if (!message) {
message = MessageUserStore.selectorMessageFocused();
message = MessagelistUserStore.focusedMessage();
}
if (message && 0 < message.threadsLen()) {
@ -781,7 +798,7 @@ export class MailMessageList extends AbstractViewRight {
if (this.messageListSearchDesc()) {
this.cancelSearch();
return false;
} else if (MessageUserStore.listEndThreadUid()) {
} else if (MessagelistUserStore.endThreadUid()) {
this.cancelThreadUid();
return false;
}
@ -813,7 +830,7 @@ export class MailMessageList extends AbstractViewRight {
prefetchNextTick() {
if (!this.bPrefetch && !ifvisible.now() && !this.viewModelDom.hidden) {
const message = MessageUserStore.list.find(
const message = MessagelistUserStore.find(
item => item && !hasRequestedMessage(item.folder, item.uid)
);
if (message) {
@ -838,7 +855,7 @@ export class MailMessageList extends AbstractViewRight {
advancedSearchClick() {
SettingsCapa(Capa.SearchAdv)
&& showScreenPopup(AdvancedSearchPopupView, [MessageUserStore.mainMessageListSearch()]);
&& showScreenPopup(AdvancedSearchPopupView, [MessagelistUserStore.mainSearch()]);
}
quotaTooltip() {