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

272 lines
7.4 KiB
JavaScript
Raw Normal View History

import ko from 'ko';
2020-08-14 04:58:41 +08:00
import { Capa, Focused, Layout, KeyState, EventKeyCode } from 'Common/Enums';
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';
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';
2019-07-05 03:19:24 +08:00
import { view, ViewType, showScreenPopup, setHash } from 'Knoin/Knoin';
import { AbstractViewNext } from 'Knoin/AbstractViewNext';
const $ = jQuery;
@view({
name: 'View/User/MailBox/FolderList',
type: ViewType.Left,
templateID: 'MailFolderList'
})
2019-07-05 03:19:24 +08:00
class FolderListMailBoxUserView extends AbstractViewNext {
constructor() {
super();
this.oContentVisible = null;
this.oContentScrollable = null;
this.composeInEdit = AppStore.composeInEdit;
this.messageList = MessageStore.messageList;
this.folderList = FolderStore.folderList;
this.folderListSystem = FolderStore.folderListSystem;
this.foldersChanging = FolderStore.foldersChanging;
2017-02-09 01:48:53 +08:00
this.moveAction = moveAction;
this.foldersListWithSingleInboxRootFolder = FolderStore.foldersListWithSingleInboxRootFolder;
this.leftPanelDisabled = leftPanelDisabled;
2016-04-29 04:32:54 +08:00
this.iDropOverTimer = 0;
this.allowComposer = !!Settings.capa(Capa.Composer);
this.allowContacts = !!AppStore.contactsIsAllowed();
this.allowFolders = !!Settings.capa(Capa.Folders);
this.folderListFocused = ko.computed(() => Focused.FolderList === AppStore.focusedState());
this.isInboxStarred = ko.computed(
2019-07-05 03:19:24 +08:00
() =>
FolderStore.currentFolder() &&
FolderStore.currentFolder().isInbox() &&
MessageStore.messageListSearch().trim().includes('is:flagged')
);
}
2014-08-21 23:08:34 +08:00
onBuild(dom) {
this.oContentVisible = $('.b-content', dom);
this.oContentScrollable = this.oContentVisible ? this.oContentVisible[0] : null;
2014-08-21 23:08:34 +08:00
2019-07-05 03:19:24 +08:00
const self = this,
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) {
leftPanelDisabled(true);
}
2016-04-29 04:32:54 +08:00
event.preventDefault();
2016-04-29 04:32:54 +08:00
2019-07-05 03:19:24 +08:00
if (starred) {
event.stopPropagation();
}
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));
}
}
2017-02-09 01:48:53 +08:00
AppStore.focusedState(Focused.MessageList);
}
};
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
const folder = ko.dataFor(this); // eslint-disable-line no-invalid-this
2019-07-05 03:19:24 +08:00
if (folder && event) {
const collapsed = folder.collapsed();
getApp().setExpandedFolder(folder.fullNameHash, collapsed);
folder.collapsed(!collapsed);
event.preventDefault();
event.stopPropagation();
}
})
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
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
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,
$items = $('.b-folders .e-item .e-link:not(.hidden):visible', dom);
2019-07-05 03:19:24 +08:00
if (event && $items.length) {
let index = $items.index($items.filter('.focused'));
2019-07-05 03:19:24 +08:00
if (-1 < index) {
$items.eq(index).removeClass('focused');
2014-08-21 23:08:34 +08:00
}
2016-06-30 08:02:45 +08:00
2019-07-05 03:19:24 +08:00
if (EventKeyCode.Up === keyCode && 0 < index) {
index -= 1;
2019-07-05 03:19:24 +08:00
} else if (EventKeyCode.Down === keyCode && index < $items.length - 1) {
index += 1;
2014-08-21 23:08:34 +08:00
}
$items.eq(index).addClass('focused');
self.scrollToFocused();
}
2014-08-21 23:08:34 +08:00
return false;
});
2014-08-21 23:08:34 +08:00
key('enter', KeyState.FolderList, () => {
const $items = $('.b-folders .e-item .e-link:not(.hidden).focused', dom);
2019-07-05 03:19:24 +08:00
if ($items.length && $items[0]) {
AppStore.focusedState(Focused.MessageList);
$items.click();
}
return false;
});
key('space', KeyState.FolderList, () => {
const $items = $('.b-folders .e-item .e-link:not(.hidden).focused', dom);
2019-07-05 03:19:24 +08:00
if ($items.length && $items[0]) {
const folder = ko.dataFor($items[0]);
2019-07-05 03:19:24 +08:00
if (folder) {
const collapsed = folder.collapsed();
getApp().setExpandedFolder(folder.fullNameHash, collapsed);
folder.collapsed(!collapsed);
}
2016-06-30 08:02:45 +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);
return false;
});
AppStore.focusedState.subscribe((value) => {
$('.b-folders .e-item .e-link.focused', dom).removeClass('focused');
2019-07-05 03:19:24 +08:00
if (Focused.FolderList === value) {
$('.b-folders .e-item .e-link.selected', dom).addClass('focused');
}
});
}
messagesDropOver(folder) {
clearTimeout(this.iDropOverTimer);
2019-07-05 03:19:24 +08:00
if (folder && folder.collapsed()) {
this.iDropOverTimer = setTimeout(() => {
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
}
}
messagesDropOut() {
clearTimeout(this.iDropOverTimer);
}
2014-08-21 23:08:34 +08:00
scrollToFocused() {
2019-07-05 03:19:24 +08:00
if (!this.oContentVisible || !this.oContentScrollable) {
return false;
2016-06-30 08:02:45 +08:00
}
2019-07-05 03:19:24 +08:00
const offset = 20,
focused = $('.e-item .e-link.focused', this.oContentScrollable),
pos = focused.position(),
visibleHeight = this.oContentVisible.height(),
focusedHeight = focused.outerHeight();
2014-08-21 23:08:34 +08:00
2019-07-05 03:19:24 +08:00
if (pos && (0 > pos.top || pos.top + focusedHeight > visibleHeight)) {
let top = this.oContentScrollable.scrollTop + pos.top;
2019-07-05 03:19:24 +08:00
if (0 > pos.top) {
this.oContentScrollable.scrollTop = top - offset;
2019-07-05 03:19:24 +08:00
} else {
this.oContentScrollable.scrollTop = top - visibleHeight + focusedHeight + offset;
2014-08-21 23:08:34 +08:00
}
2016-06-30 08:02:45 +08:00
return true;
}
2016-06-30 08:02:45 +08:00
return false;
}
/**
* @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) {
const fromFolderFullNameRaw = ui.helper.data('rl-folder'),
copy = $htmlCL.contains('rl-ctrl-key-pressed'),
uids = ui.helper.data('rl-uids');
2016-06-30 08:02:45 +08:00
if (fromFolderFullNameRaw && Array.isArray(uids)) {
getApp().moveMessagesToFolder(fromFolderFullNameRaw, uids, toFolder.fullNameRaw, copy);
}
}
2016-06-30 08:02:45 +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
}
createFolder() {
showScreenPopup(require('View/Popup/FolderCreate'));
2016-06-30 08:02:45 +08:00
}
configureFolders() {
setHash(settings('folders'));
}
2016-06-30 08:02:45 +08:00
contactsClick() {
2019-07-05 03:19:24 +08:00
if (this.allowContacts) {
showScreenPopup(require('View/Popup/Contacts'));
}
2016-06-30 08:02:45 +08:00
}
}
2019-07-05 03:19:24 +08:00
export { FolderListMailBoxUserView, FolderListMailBoxUserView as default };