snappymail/dev/View/User/MailBox/FolderList.js
2023-08-21 16:02:57 +02:00

215 lines
5.5 KiB
JavaScript

import ko from 'ko';
import { ScopeFolderList, ScopeMessageList } from 'Common/Enums';
import { addShortcut, stopEvent } from 'Common/Globals';
import { mailBox, settings } from 'Common/Links';
//import { setFolderETag } from 'Common/Cache';
import { addComputablesTo } from 'External/ko';
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 { showScreenPopup } from 'Knoin/Knoin';
import { AbstractViewLeft } from 'Knoin/AbstractViews';
import { showMessageComposer, moveAction } from 'Common/UtilsUser';
import { FolderCreatePopupView } from 'View/Popup/FolderCreate';
import { ContactsPopupView } from 'View/Popup/Contacts';
import { ComposePopupView } from 'View/Popup/Compose';
import { setExpandedFolder, foldersFilter } from 'Model/FolderCollection';
export class MailFolderList extends AbstractViewLeft {
constructor() {
super();
// this.oContentScrollable = null;
this.composeInEdit = ComposePopupView.inEdit;
this.systemFolders = FolderUserStore.systemFolders;
this.moveAction = moveAction;
this.foldersListWithSingleInboxRootFolder = ko.observable(false);
this.allowContacts = AppUserStore.allowContacts();
this.foldersFilter = foldersFilter;
addComputablesTo(this, {
foldersFilterVisible: () => 20 < FolderUserStore.folderList().CountRec,
folderListVisible: () => {
let multiple = false,
inbox, visible,
result = FolderUserStore.folderList().filter(folder => {
if (folder.isInbox()) {
inbox = folder;
}
visible = folder.visible();
multiple |= visible && !folder.isInbox();
return visible;
});
if (inbox && !multiple) {
inbox.collapsed(false);
}
this.foldersListWithSingleInboxRootFolder(!multiple);
return result;
}
});
}
onBuild(dom) {
const qs = s => dom.querySelector(s),
eqs = (ev, s) => ev.target.closestWithin(s, dom);
this.oContentScrollable = qs('.b-content');
dom.addEventListener('click', event => {
let el = eqs(event, '.e-collapsed-sign');
if (el) {
const folder = ko.dataFor(el);
if (folder) {
const collapsed = folder.collapsed();
setExpandedFolder(folder.fullName, collapsed);
folder.collapsed(!collapsed);
stopEvent(event);
return;
}
}
el = eqs(event, 'a');
if (el?.matches('.selectable')) {
event.preventDefault();
const folder = ko.dataFor(el);
if (folder) {
if (moveAction()) {
moveAction(false);
MessagelistUserStore.moveMessages(
FolderUserStore.currentFolderFullName(),
MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(),
folder.fullName,
event.ctrlKey
);
} else {
if (!SettingsUserStore.usePreviewPane()) {
MessageUserStore.message(null);
}
/*
if (folder.fullName === FolderUserStore.currentFolderFullName()) {
setFolderETag(folder.fullName, '');
}
*/
let search = '';
if (event.target.matches('.flag-icon') && !folder.isFlagged()) {
search = 'flagged';
} else if (folder.unreadCount() && event.clientX > el.getBoundingClientRect().right - 25) {
search = 'unseen';
}
hasher.setHash(mailBox(folder.fullNameHash, 1, search));
}
AppUserStore.focusedState(ScopeMessageList);
}
}
});
addShortcut('arrowup,arrowdown', '', ScopeFolderList, event => {
let items = [], index = 0;
dom.querySelectorAll('li a').forEach(node => {
if (node.offsetHeight || node.getClientRects().length) {
items.push(node);
if (node.matches('.focused')) {
node.classList.remove('focused');
index = items.length - 1;
}
}
});
if (items.length) {
if ('ArrowUp' === event.key) {
index && --index;
} else if (index < items.length - 1) {
++index;
}
items[index].classList.add('focused');
this.scrollToFocused();
}
return false;
});
addShortcut('enter,open', '', ScopeFolderList, () => {
const item = qs('li a.focused');
if (item) {
AppUserStore.focusedState(ScopeMessageList);
item.click();
}
return false;
});
addShortcut('space', '', ScopeFolderList, () => {
const item = qs('li a.focused'),
folder = item && ko.dataFor(item);
if (folder) {
const collapsed = folder.collapsed();
setExpandedFolder(folder.fullName, collapsed);
folder.collapsed(!collapsed);
}
return false;
});
// addShortcut('tab', 'shift', ScopeFolderList, () => {
addShortcut('escape,tab,arrowright', '', ScopeFolderList, () => {
AppUserStore.focusedState(ScopeMessageList);
moveAction(false);
return false;
});
}
scrollToFocused() {
const scrollable = this.oContentScrollable;
if (scrollable) {
let block, focused = scrollable.querySelector('li a.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');
}
}
}
composeClick() {
showMessageComposer();
}
clearFolderSearch() {
foldersFilter('');
}
createFolder() {
showScreenPopup(FolderCreatePopupView);
}
configureFolders() {
hasher.setHash(settings('folders'));
}
contactsClick() {
if (this.allowContacts) {
showScreenPopup(ContactsPopupView);
}
}
}