2016-08-17 06:01:20 +08:00
|
|
|
import ko from 'ko';
|
|
|
|
|
2020-08-14 04:58:41 +08:00
|
|
|
import { Capa, Focused, Layout, KeyState, EventKeyCode } from 'Common/Enums';
|
2020-07-15 20:25:51 +08:00
|
|
|
import { $htmlCL, leftPanelDisabled, moveAction } from 'Common/Globals';
|
2019-07-05 03:19:24 +08:00
|
|
|
import { mailBox, settings } from 'Common/Links';
|
|
|
|
import { setFolderHash } from 'Common/Cache';
|
2016-08-17 06:01:20 +08:00
|
|
|
|
|
|
|
import AppStore from 'Stores/User/App';
|
|
|
|
import SettingsStore from 'Stores/User/Settings';
|
|
|
|
import FolderStore from 'Stores/User/Folder';
|
|
|
|
import MessageStore from 'Stores/User/Message';
|
|
|
|
|
|
|
|
import * as Settings from 'Storage/Settings';
|
|
|
|
|
2019-07-05 03:19:24 +08:00
|
|
|
import { getApp } from 'Helper/Apps/User';
|
2016-08-17 06:01:20 +08:00
|
|
|
|
2019-07-05 03:19:24 +08:00
|
|
|
import { view, ViewType, showScreenPopup, setHash } from 'Knoin/Knoin';
|
|
|
|
import { AbstractViewNext } from 'Knoin/AbstractViewNext';
|
2016-08-17 06:01:20 +08:00
|
|
|
|
|
|
|
@view({
|
|
|
|
name: 'View/User/MailBox/FolderList',
|
|
|
|
type: ViewType.Left,
|
|
|
|
templateID: 'MailFolderList'
|
|
|
|
})
|
2019-07-05 03:19:24 +08:00
|
|
|
class FolderListMailBoxUserView extends AbstractViewNext {
|
2016-08-17 06:01:20 +08:00
|
|
|
constructor() {
|
|
|
|
super();
|
2015-02-17 20:04:03 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
this.oContentScrollable = null;
|
2013-11-16 06:21:12 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
this.composeInEdit = AppStore.composeInEdit;
|
2013-11-16 06:21:12 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
this.messageList = MessageStore.messageList;
|
|
|
|
this.folderList = FolderStore.folderList;
|
|
|
|
this.folderListSystem = FolderStore.folderListSystem;
|
|
|
|
this.foldersChanging = FolderStore.foldersChanging;
|
2014-06-03 07:22:36 +08:00
|
|
|
|
2017-02-09 01:48:53 +08:00
|
|
|
this.moveAction = moveAction;
|
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
this.foldersListWithSingleInboxRootFolder = FolderStore.foldersListWithSingleInboxRootFolder;
|
2015-04-02 02:18:15 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
this.leftPanelDisabled = leftPanelDisabled;
|
2016-04-29 04:32:54 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
this.iDropOverTimer = 0;
|
2014-04-13 08:32:07 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
this.allowComposer = !!Settings.capa(Capa.Composer);
|
|
|
|
this.allowContacts = !!AppStore.contactsIsAllowed();
|
|
|
|
this.allowFolders = !!Settings.capa(Capa.Folders);
|
2014-04-08 05:03:58 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
this.folderListFocused = ko.computed(() => Focused.FolderList === AppStore.focusedState());
|
2014-04-08 05:03:58 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
this.isInboxStarred = ko.computed(
|
2019-07-05 03:19:24 +08:00
|
|
|
() =>
|
|
|
|
FolderStore.currentFolder() &&
|
2016-08-17 06:01:20 +08:00
|
|
|
FolderStore.currentFolder().isInbox() &&
|
2020-08-07 00:24:46 +08:00
|
|
|
MessageStore.messageListSearch().trim().includes('is:flagged')
|
2016-08-17 06:01:20 +08:00
|
|
|
);
|
|
|
|
}
|
2014-08-21 23:08:34 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
onBuild(dom) {
|
2019-07-05 03:19:24 +08:00
|
|
|
const self = this,
|
2020-08-27 21:45:47 +08:00
|
|
|
qs = s => dom[0].querySelector(s),
|
2016-08-17 06:01:20 +08:00
|
|
|
isMobile = Settings.appSettingsGet('mobile'),
|
|
|
|
fSelectFolder = (el, event, starred) => {
|
2017-02-09 01:48:53 +08:00
|
|
|
const isMove = moveAction();
|
2019-07-05 03:19:24 +08:00
|
|
|
if (isMobile) {
|
2016-08-17 06:01:20 +08:00
|
|
|
leftPanelDisabled(true);
|
|
|
|
}
|
2016-04-29 04:32:54 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
event.preventDefault();
|
2016-04-29 04:32:54 +08:00
|
|
|
|
2019-07-05 03:19:24 +08:00
|
|
|
if (starred) {
|
2016-08-17 06:01:20 +08:00
|
|
|
event.stopPropagation();
|
|
|
|
}
|
2013-11-16 06:21:12 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
const folder = ko.dataFor(el);
|
2019-07-05 03:19:24 +08:00
|
|
|
if (folder) {
|
|
|
|
if (isMove) {
|
2017-02-09 01:48:53 +08:00
|
|
|
moveAction(false);
|
|
|
|
getApp().moveMessagesToFolder(
|
|
|
|
FolderStore.currentFolderFullNameRaw(),
|
|
|
|
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(),
|
|
|
|
folder.fullNameRaw,
|
|
|
|
false
|
|
|
|
);
|
2019-07-05 03:19:24 +08:00
|
|
|
} else {
|
|
|
|
if (Layout.NoPreview === SettingsStore.layout()) {
|
2017-02-09 01:48:53 +08:00
|
|
|
MessageStore.message(null);
|
|
|
|
}
|
|
|
|
|
2019-07-05 03:19:24 +08:00
|
|
|
if (folder.fullNameRaw === FolderStore.currentFolderFullNameRaw()) {
|
2017-02-09 01:48:53 +08:00
|
|
|
setFolderHash(folder.fullNameRaw, '');
|
|
|
|
}
|
|
|
|
|
2019-07-05 03:19:24 +08:00
|
|
|
if (starred) {
|
2017-02-09 01:48:53 +08:00
|
|
|
setHash(mailBox(folder.fullNameHash, 1, 'is:flagged'));
|
2019-07-05 03:19:24 +08:00
|
|
|
} else {
|
2017-02-09 01:48:53 +08:00
|
|
|
setHash(mailBox(folder.fullNameHash));
|
|
|
|
}
|
2016-08-17 06:01:20 +08:00
|
|
|
}
|
2017-02-09 01:48:53 +08:00
|
|
|
|
|
|
|
AppStore.focusedState(Focused.MessageList);
|
2016-08-17 06:01:20 +08:00
|
|
|
}
|
|
|
|
};
|
2014-02-04 04:06:35 +08:00
|
|
|
|
2020-08-27 21:45:47 +08:00
|
|
|
this.oContentScrollable = qs('.b-content');
|
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
dom
|
2019-07-05 03:19:24 +08:00
|
|
|
.on('click', '.b-folders .e-item .e-link .e-collapsed-sign', function(event) {
|
|
|
|
// eslint-disable-line prefer-arrow-callback
|
2016-08-17 06:01:20 +08:00
|
|
|
const folder = ko.dataFor(this); // eslint-disable-line no-invalid-this
|
2019-07-05 03:19:24 +08:00
|
|
|
if (folder && event) {
|
2016-08-17 06:01:20 +08:00
|
|
|
const collapsed = folder.collapsed();
|
|
|
|
getApp().setExpandedFolder(folder.fullNameHash, collapsed);
|
|
|
|
|
|
|
|
folder.collapsed(!collapsed);
|
|
|
|
event.preventDefault();
|
|
|
|
event.stopPropagation();
|
2013-11-16 06:21:12 +08:00
|
|
|
}
|
2016-08-17 06:01:20 +08:00
|
|
|
})
|
2019-07-05 03:19:24 +08:00
|
|
|
.on('click', '.b-folders .e-item .e-link.selectable .inbox-star-icon', function(event) {
|
|
|
|
// eslint-disable-line prefer-arrow-callback
|
2016-08-17 06:01:20 +08:00
|
|
|
fSelectFolder(this, event, !self.isInboxStarred()); // eslint-disable-line no-invalid-this
|
|
|
|
})
|
2019-07-05 03:19:24 +08:00
|
|
|
.on('click', '.b-folders .e-item .e-link.selectable', function(event) {
|
|
|
|
// eslint-disable-line prefer-arrow-callback
|
2016-08-17 06:01:20 +08:00
|
|
|
fSelectFolder(this, event, false); // eslint-disable-line no-invalid-this
|
|
|
|
});
|
|
|
|
|
|
|
|
key('up, down', KeyState.FolderList, (event, handler) => {
|
2019-07-05 03:19:24 +08:00
|
|
|
const keyCode = handler && 'up' === handler.shortcut ? EventKeyCode.Up : EventKeyCode.Down,
|
2020-08-27 21:45:47 +08:00
|
|
|
$items = jQuery('.b-folders .e-item .e-link:not(.hidden):visible', dom);
|
|
|
|
let index = $items.length;
|
|
|
|
if (event && index) {
|
|
|
|
while (index--) {
|
|
|
|
if ($items[index].matches('.focused')) {
|
|
|
|
$items[index].classList.remove('focused');
|
|
|
|
break;
|
|
|
|
}
|
2014-08-21 23:08:34 +08:00
|
|
|
}
|
2019-07-05 03:19:24 +08:00
|
|
|
if (EventKeyCode.Up === keyCode && 0 < index) {
|
2020-08-27 21:45:47 +08:00
|
|
|
--index;
|
2019-07-05 03:19:24 +08:00
|
|
|
} else if (EventKeyCode.Down === keyCode && index < $items.length - 1) {
|
2020-08-27 21:45:47 +08:00
|
|
|
++index;
|
2014-08-21 23:08:34 +08:00
|
|
|
}
|
2016-08-17 06:01:20 +08:00
|
|
|
|
2020-08-27 21:45:47 +08:00
|
|
|
$items[index].classList.add('focused');
|
2016-08-17 06:01:20 +08:00
|
|
|
self.scrollToFocused();
|
2014-04-13 08:32:07 +08:00
|
|
|
}
|
2014-08-21 23:08:34 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
return false;
|
|
|
|
});
|
2014-08-21 23:08:34 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
key('enter', KeyState.FolderList, () => {
|
2020-08-27 21:45:47 +08:00
|
|
|
const item = qs('.b-folders .e-item .e-link:not(.hidden).focused');
|
|
|
|
if (item) {
|
2016-08-17 06:01:20 +08:00
|
|
|
AppStore.focusedState(Focused.MessageList);
|
2020-08-27 21:45:47 +08:00
|
|
|
item.click();
|
2014-04-13 08:32:07 +08:00
|
|
|
}
|
2014-06-03 07:22:36 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
return false;
|
|
|
|
});
|
2014-04-13 08:32:07 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
key('space', KeyState.FolderList, () => {
|
2020-08-27 21:45:47 +08:00
|
|
|
const item = qs('.b-folders .e-item .e-link:not(.hidden).focused'),
|
|
|
|
folder = item && ko.dataFor(item);
|
|
|
|
if (folder) {
|
|
|
|
const collapsed = folder.collapsed();
|
|
|
|
getApp().setExpandedFolder(folder.fullNameHash, collapsed);
|
|
|
|
folder.collapsed(!collapsed);
|
2016-06-30 08:02:45 +08:00
|
|
|
}
|
2014-04-13 08:32:07 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
key('esc, tab, shift+tab, right', KeyState.FolderList, () => {
|
|
|
|
AppStore.focusedState(Focused.MessageList);
|
2017-02-09 01:48:53 +08:00
|
|
|
moveAction(false);
|
2016-08-17 06:01:20 +08:00
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
2020-08-27 21:45:47 +08:00
|
|
|
AppStore.focusedState.subscribe(value => {
|
|
|
|
let el = qs('.b-folders .e-item .e-link.focused');
|
|
|
|
el && qs('.b-folders .e-item .e-link.focused').classList.remove('focused');
|
2019-07-05 03:19:24 +08:00
|
|
|
if (Focused.FolderList === value) {
|
2020-08-27 21:45:47 +08:00
|
|
|
el = qs('.b-folders .e-item .e-link.selected');
|
|
|
|
el && qs('.b-folders .e-item .e-link.selected').classList.add('focused');
|
2014-05-08 00:04:32 +08:00
|
|
|
}
|
2016-08-17 06:01:20 +08:00
|
|
|
});
|
|
|
|
}
|
2014-05-08 00:04:32 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
messagesDropOver(folder) {
|
2020-08-12 06:25:36 +08:00
|
|
|
clearTimeout(this.iDropOverTimer);
|
2019-07-05 03:19:24 +08:00
|
|
|
if (folder && folder.collapsed()) {
|
2020-08-12 06:25:36 +08:00
|
|
|
this.iDropOverTimer = setTimeout(() => {
|
2016-08-17 06:01:20 +08:00
|
|
|
folder.collapsed(false);
|
|
|
|
getApp().setExpandedFolder(folder.fullNameHash, true);
|
2020-08-14 04:58:41 +08:00
|
|
|
}, 500);
|
2014-08-21 23:08:34 +08:00
|
|
|
}
|
2016-08-17 06:01:20 +08:00
|
|
|
}
|
2014-05-08 00:04:32 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
messagesDropOut() {
|
2020-08-12 06:25:36 +08:00
|
|
|
clearTimeout(this.iDropOverTimer);
|
2016-08-17 06:01:20 +08:00
|
|
|
}
|
2014-08-21 23:08:34 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
scrollToFocused() {
|
2020-08-27 21:45:47 +08:00
|
|
|
const scrollable = this.oContentScrollable;
|
|
|
|
if (scrollable) {
|
|
|
|
let block, focused = scrollable.querySelector('.e-item .e-link.focused');
|
|
|
|
if (focused) {
|
|
|
|
const fRect = focused.getBoundingClientRect(),
|
|
|
|
sRect = scrollable.getBoundingClientRect();
|
|
|
|
if (fRect.top < sRect.top) {
|
|
|
|
block = 'start';
|
|
|
|
} else if (fRect.bottom > sRect.bottom) {
|
|
|
|
block = 'end';
|
|
|
|
}
|
|
|
|
block && focused.scrollIntoView(block === 'start');
|
2014-08-21 23:08:34 +08:00
|
|
|
}
|
2015-05-20 06:05:54 +08:00
|
|
|
}
|
2016-06-30 08:02:45 +08:00
|
|
|
}
|
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
/**
|
|
|
|
* @param {FolderModel} toFolder
|
|
|
|
* @param {{helper:jQuery}} ui
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
messagesDrop(toFolder, ui) {
|
2019-07-05 03:19:24 +08:00
|
|
|
if (toFolder && ui && ui.helper) {
|
2020-08-27 21:45:47 +08:00
|
|
|
const fromFolderFullNameRaw = ui.helper.rlFolder,
|
2020-07-15 20:25:51 +08:00
|
|
|
copy = $htmlCL.contains('rl-ctrl-key-pressed'),
|
2020-08-27 21:45:47 +08:00
|
|
|
uids = ui.helper.rlUids;
|
2016-06-30 08:02:45 +08:00
|
|
|
|
2020-08-18 03:57:56 +08:00
|
|
|
if (fromFolderFullNameRaw && Array.isArray(uids)) {
|
2016-08-17 06:01:20 +08:00
|
|
|
getApp().moveMessagesToFolder(fromFolderFullNameRaw, uids, toFolder.fullNameRaw, copy);
|
|
|
|
}
|
|
|
|
}
|
2016-06-30 08:02:45 +08:00
|
|
|
}
|
2014-06-03 07:22:36 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
composeClick() {
|
2019-07-05 03:19:24 +08:00
|
|
|
if (Settings.capa(Capa.Composer)) {
|
2016-08-17 06:01:20 +08:00
|
|
|
showScreenPopup(require('View/Popup/Compose'));
|
2014-06-03 07:22:36 +08:00
|
|
|
}
|
2016-06-30 08:02:45 +08:00
|
|
|
}
|
2014-06-03 07:22:36 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
createFolder() {
|
|
|
|
showScreenPopup(require('View/Popup/FolderCreate'));
|
2016-06-30 08:02:45 +08:00
|
|
|
}
|
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
configureFolders() {
|
|
|
|
setHash(settings('folders'));
|
|
|
|
}
|
2016-06-30 08:02:45 +08:00
|
|
|
|
2016-08-17 06:01:20 +08:00
|
|
|
contactsClick() {
|
2019-07-05 03:19:24 +08:00
|
|
|
if (this.allowContacts) {
|
2016-08-17 06:01:20 +08:00
|
|
|
showScreenPopup(require('View/Popup/Contacts'));
|
|
|
|
}
|
2016-06-30 08:02:45 +08:00
|
|
|
}
|
2016-08-17 06:01:20 +08:00
|
|
|
}
|
2014-06-03 07:22:36 +08:00
|
|
|
|
2019-07-05 03:19:24 +08:00
|
|
|
export { FolderListMailBoxUserView, FolderListMailBoxUserView as default };
|