From 6f2f5bce8685d7f9efa68ca60632579ba35a8577 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Wed, 9 Mar 2022 15:08:22 +0100 Subject: [PATCH] Added Ctrl/Meta + F to open advanced search screen Cleanup search field onEnter --- dev/App/User.js | 5 ++- dev/Common/Globals.js | 4 +- dev/Common/Selector.js | 10 ++--- dev/Stores/User/Message.js | 4 ++ dev/View/Popup/Compose.js | 20 ++++----- dev/View/Popup/KeyboardShortcutsHelp.js | 5 ++- dev/View/Popup/OpenPgpKey.js | 4 +- dev/View/User/MailBox/FolderList.js | 12 +++--- dev/View/User/MailBox/MessageList.js | 36 ++++++++-------- dev/View/User/MailBox/MessageView.js | 42 ++++++++----------- .../templates/Views/User/MailMessageList.html | 2 +- 11 files changed, 73 insertions(+), 71 deletions(-) diff --git a/dev/App/User.js b/dev/App/User.js index 4e7fe0dea..ad1a48f4f 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -16,7 +16,8 @@ import { Settings, SettingsGet, leftPanelDisabled, - addEventsListener + addEventsListener, + addShortcut } from 'Common/Globals'; import { UNUSED_OPTION_VALUE } from 'Common/Consts'; @@ -88,7 +89,7 @@ class AppUser extends AbstractApp { const fn = (ev=>$htmlCL.toggle('rl-ctrl-key-pressed', ev.ctrlKey)).debounce(500); addEventsListener(doc, ['keydown','keyup'], fn); - shortcuts.add('escape,enter', '', dropdownsDetectVisibility); + addShortcut('escape,enter', '', dropdownsDetectVisibility); addEventListener('click', dropdownsDetectVisibility); } diff --git a/dev/Common/Globals.js b/dev/Common/Globals.js index 3504c9a6d..db6c82324 100644 --- a/dev/Common/Globals.js +++ b/dev/Common/Globals.js @@ -34,8 +34,10 @@ export const formFieldFocused = () => doc.activeElement && doc.activeElement.matches('input,textarea'), + addShortcut = (...args) => shortcuts.add(...args), + registerShortcut = (keys, modifiers, scopes, method) => - shortcuts.add(keys, modifiers, scopes, event => formFieldFocused() ? true : method(event)), + addShortcut(keys, modifiers, scopes, event => formFieldFocused() ? true : method(event)), addEventsListener = (element, events, fn, options) => events.forEach(event => element.addEventListener(event, fn, options)), diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js index 8153b2607..8d765b1d2 100644 --- a/dev/Common/Selector.js +++ b/dev/Common/Selector.js @@ -1,5 +1,5 @@ import ko from 'ko'; -import { addEventsListeners } from 'Common/Globals'; +import { addEventsListeners, addShortcut } from 'Common/Globals'; import { isArray } from 'Common/Utils'; import { koComputable } from 'External/ko'; @@ -266,7 +266,7 @@ export class Selector { } }); - shortcuts.add('enter,open', '', keyScope, () => { + addShortcut('enter,open', '', keyScope, () => { const focused = this.focusedItem(); if (focused && !focused.selected()) { this.actionClick(focused); @@ -274,13 +274,13 @@ export class Selector { } }); - shortcuts.add('arrowup,arrowdown', 'meta', keyScope, () => false); + addShortcut('arrowup,arrowdown', 'meta', keyScope, () => false); - shortcuts.add('arrowup,arrowdown', 'shift', keyScope, event => { + addShortcut('arrowup,arrowdown', 'shift', keyScope, event => { this.newSelectPosition(event.key, true); return false; }); - shortcuts.add('arrowup,arrowdown,home,end,pageup,pagedown,space', '', keyScope, event => { + addShortcut('arrowup,arrowdown,home,end,pageup,pagedown,space', '', keyScope, event => { this.newSelectPosition(event.key, false); return false; }); diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index 4bbbcd6df..9a491c2bd 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -41,6 +41,10 @@ export const MessageUserStore = new class { this.purgeMessageBodyCache = this.purgeMessageBodyCache.throttle(30000); } + toggleFullScreen() { + MessageUserStore.fullScreen(!MessageUserStore.fullScreen()); + } + purgeMessageBodyCache() { const messagesDom = this.bodiesDom(), children = messagesDom && messagesDom.children; diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 40deeb578..530b4df81 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -21,7 +21,7 @@ import { messagesDeleteHelper } from 'Common/Folders'; import { serverRequest } from 'Common/Links'; import { i18n, getNotification, getUploadErrorDescByCode, timestampToString } from 'Common/Translator'; import { MessageFlagsCache, setFolderHash } from 'Common/Cache'; -import { doc, Settings, SettingsGet, getFullscreenElement, exitFullscreen, elementById } from 'Common/Globals'; +import { doc, Settings, SettingsGet, getFullscreenElement, exitFullscreen, elementById, addShortcut } from 'Common/Globals'; import { AppUserStore } from 'Stores/User/App'; import { SettingsUserStore } from 'Stores/User/Settings'; @@ -1311,40 +1311,40 @@ export class ComposePopupView extends AbstractViewPopup { this.addAttachmentEnabled(true); - shortcuts.add('q', 'meta', ScopeCompose, ()=>false); - shortcuts.add('w', 'meta', ScopeCompose, ()=>false); + addShortcut('q', 'meta', ScopeCompose, ()=>false); + addShortcut('w', 'meta', ScopeCompose, ()=>false); - shortcuts.add('m', 'meta', ScopeCompose, () => { + addShortcut('m', 'meta', ScopeCompose, () => { this.identitiesDropdownTrigger(true); return false; }); - shortcuts.add('arrowdown', 'meta', ScopeCompose, () => { + addShortcut('arrowdown', 'meta', ScopeCompose, () => { this.skipCommand(); return false; }); - shortcuts.add('s', 'meta', ScopeCompose, () => { + addShortcut('s', 'meta', ScopeCompose, () => { this.saveCommand(); return false; }); - shortcuts.add('save', '', ScopeCompose, () => { + addShortcut('save', '', ScopeCompose, () => { this.saveCommand(); return false; }); if (Settings.app('allowCtrlEnterOnCompose')) { - shortcuts.add('enter', 'meta', ScopeCompose, () => { + addShortcut('enter', 'meta', ScopeCompose, () => { this.sendCommand(); return false; }); } - shortcuts.add('mailsend', '', ScopeCompose, () => { + addShortcut('mailsend', '', ScopeCompose, () => { this.sendCommand(); return false; }); - shortcuts.add('escape,close', 'shift', ScopeCompose, () => { + addShortcut('escape,close', 'shift', ScopeCompose, () => { this.tryToClosePopup(); return false; }); diff --git a/dev/View/Popup/KeyboardShortcutsHelp.js b/dev/View/Popup/KeyboardShortcutsHelp.js index 82d5b4231..b53d6f709 100644 --- a/dev/View/Popup/KeyboardShortcutsHelp.js +++ b/dev/View/Popup/KeyboardShortcutsHelp.js @@ -1,3 +1,4 @@ +import { addShortcut } from 'Common/Globals'; import { AbstractViewPopup } from 'Knoin/AbstractViews'; export class KeyboardShortcutsHelpPopupView extends AbstractViewPopup { @@ -10,8 +11,8 @@ export class KeyboardShortcutsHelpPopupView extends AbstractViewPopup { const tabs = dom.querySelectorAll('.tabs input'), last = tabs.length - 1; -// shortcuts.add('tab', 'shift', - shortcuts.add('tab,arrowleft,arrowright', '', +// addShortcut('tab', 'shift', + addShortcut('tab,arrowleft,arrowright', '', 'KeyboardShortcutsHelp', event => { let next = 0; diff --git a/dev/View/Popup/OpenPgpKey.js b/dev/View/Popup/OpenPgpKey.js index 74694e2c7..ba8ca84a3 100644 --- a/dev/View/Popup/OpenPgpKey.js +++ b/dev/View/Popup/OpenPgpKey.js @@ -1,4 +1,4 @@ -import { doc } from 'Common/Globals'; +import { doc, addShortcut } from 'Common/Globals'; import { AbstractViewPopup } from 'Knoin/AbstractViews'; export class OpenPgpKeyPopupView extends AbstractViewPopup { @@ -118,7 +118,7 @@ export class OpenPgpKeyPopupView extends AbstractViewPopup { } onBuild() { - shortcuts.add('a', 'meta', 'OpenPgpKey', () => { + addShortcut('a', 'meta', 'OpenPgpKey', () => { this.selectKey(); return false; }); diff --git a/dev/View/User/MailBox/FolderList.js b/dev/View/User/MailBox/FolderList.js index 42f26df8f..9f367cf0c 100644 --- a/dev/View/User/MailBox/FolderList.js +++ b/dev/View/User/MailBox/FolderList.js @@ -1,7 +1,7 @@ import ko from 'ko'; import { Scope } from 'Common/Enums'; -import { moveAction } from 'Common/Globals'; +import { moveAction, addShortcut } from 'Common/Globals'; import { mailBox, settings } from 'Common/Links'; import { setFolderHash } from 'Common/Cache'; import { addComputablesTo } from 'External/ko'; @@ -117,7 +117,7 @@ export class MailFolderList extends AbstractViewLeft { } }); - shortcuts.add('arrowup,arrowdown', '', Scope.FolderList, event => { + addShortcut('arrowup,arrowdown', '', Scope.FolderList, event => { let items = [], index = 0; dom.querySelectorAll('li a:not(.hidden)').forEach(node => { if (node.offsetHeight || node.getClientRects().length) { @@ -141,7 +141,7 @@ export class MailFolderList extends AbstractViewLeft { return false; }); - shortcuts.add('enter,open', '', Scope.FolderList, () => { + addShortcut('enter,open', '', Scope.FolderList, () => { const item = qs('li a:not(.hidden).focused'); if (item) { AppUserStore.focusedState(Scope.MessageList); @@ -151,7 +151,7 @@ export class MailFolderList extends AbstractViewLeft { return false; }); - shortcuts.add('space', '', Scope.FolderList, () => { + addShortcut('space', '', Scope.FolderList, () => { const item = qs('li a:not(.hidden).focused'), folder = item && ko.dataFor(item); if (folder) { @@ -163,8 +163,8 @@ export class MailFolderList extends AbstractViewLeft { return false; }); -// shortcuts.add('tab', 'shift', Scope.FolderList, () => { - shortcuts.add('escape,tab,arrowright', '', Scope.FolderList, () => { +// addShortcut('tab', 'shift', Scope.FolderList, () => { + addShortcut('escape,tab,arrowright', '', Scope.FolderList, () => { AppUserStore.focusedState(Scope.MessageList); moveAction(false); return false; diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 799ba7068..650731d5b 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -8,8 +8,8 @@ import { UNUSED_OPTION_VALUE } from 'Common/Consts'; import { doc, leftPanelDisabled, moveAction, Settings, SettingsCapa, SettingsGet, - fireEvent, addEventsListeners, - registerShortcut + addEventsListeners, + addShortcut, registerShortcut, formFieldFocused } from 'Common/Globals'; import { computedPaginatorHelper, showMessageComposer, populateMessageBody } from 'Common/UtilsUser'; @@ -412,10 +412,6 @@ export class MailMessageList extends AbstractViewRight { && SettingsUserStore.usePreviewPane(); } - searchEnterAction() { - MessagelistUserStore.mainSearch(this.sLastSearchValue); - } - cancelSearch() { MessagelistUserStore.mainSearch(''); this.inputMessageListSearchFocus(false); @@ -697,9 +693,13 @@ export class MailMessageList extends AbstractViewRight { // initShortcuts - registerShortcut('enter,open', '', Scope.MessageList, () => { + addShortcut('enter,open', '', Scope.MessageList, () => { + if (formFieldFocused()) { + MessagelistUserStore.mainSearch(this.sLastSearchValue); + return false; + } if (MessageUserStore.message() && this.useAutoSelect()) { - fireEvent('mailbox.message-view.toggle-full-screen'); + MessageUserStore.toggleFullScreen(); return false; } }); @@ -722,7 +722,7 @@ export class MailMessageList extends AbstractViewRight { }); // check mail - shortcuts.add('r', 'meta', [Scope.FolderList, Scope.MessageList, Scope.MessageView], () => { + addShortcut('r', 'meta', [Scope.FolderList, Scope.MessageList, Scope.MessageView], () => { this.reload(); return false; }); @@ -781,21 +781,21 @@ export class MailMessageList extends AbstractViewRight { return false; }); - shortcuts.add('f,mailforward', 'shift', [Scope.MessageList, Scope.MessageView], () => { + addShortcut('f,mailforward', 'shift', [Scope.MessageList, Scope.MessageView], () => { this.multyForwardCommand(); return false; }); if (SettingsCapa('Search')) { // search input focus - shortcuts.add('/', '', [Scope.MessageList, Scope.MessageView], () => { + addShortcut('/', '', [Scope.MessageList, Scope.MessageView], () => { this.inputMessageListSearchFocus(true); return false; }); } // cancel search - shortcuts.add('escape', '', Scope.MessageList, () => { + addShortcut('escape', '', Scope.MessageList, () => { if (this.messageListSearchDesc()) { this.cancelSearch(); return false; @@ -806,23 +806,25 @@ export class MailMessageList extends AbstractViewRight { }); // change focused state - shortcuts.add('tab', 'shift', Scope.MessageList, () => { + addShortcut('tab', 'shift', Scope.MessageList, () => { AppUserStore.focusedState(Scope.FolderList); return false; }); - shortcuts.add('arrowleft', '', Scope.MessageList, () => { + addShortcut('arrowleft', '', Scope.MessageList, () => { AppUserStore.focusedState(Scope.FolderList); return false; }); - shortcuts.add('tab,arrowright', '', Scope.MessageList, () => { + addShortcut('tab,arrowright', '', Scope.MessageList, () => { if (MessageUserStore.message()){ AppUserStore.focusedState(Scope.MessageView); return false; } }); - shortcuts.add('arrowleft', 'meta', Scope.MessageView, ()=>false); - shortcuts.add('arrowright', 'meta', Scope.MessageView, ()=>false); + addShortcut('arrowleft', 'meta', Scope.MessageView, ()=>false); + addShortcut('arrowright', 'meta', Scope.MessageView, ()=>false); + + addShortcut('f', 'meta', Scope.MessageList, ()=>this.advancedSearchClick()); if (!ThemeStore.isMobile() && SettingsCapa('Prefetch')) { ifvisible.idle(this.prefetchNextTick.bind(this)); diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index dbe50a702..1919ea839 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -23,6 +23,7 @@ import { getFullscreenElement, exitFullscreen, fireEvent, + addShortcut, registerShortcut } from 'Common/Globals'; @@ -118,6 +119,7 @@ export class MailMessageView extends AbstractViewRight { this.messageError = MessageUserStore.error; this.fullScreenMode = MessageUserStore.fullScreen; + this.toggleFullScreen = MessageUserStore.toggleFullScreen; this.messageListOfThreadsLoading = ko.observable(false).extend({ rateLimit: 1 }); this.highlightUnselectedAttachments = ko.observable(false).extend({ falseTimeout: 2000 }); @@ -225,8 +227,6 @@ export class MailMessageView extends AbstractViewRight { this.lastReplyAction(Local.get(ClientSideKeyName.LastReplyAction) || ComposeType.Reply); - addEventListener('mailbox.message-view.toggle-full-screen', () => this.toggleFullScreen()); - // commands this.replyCommand = createCommandReplyHelper(ComposeType.Reply); this.replyAllCommand = createCommandReplyHelper(ComposeType.ReplyAll); @@ -269,14 +269,6 @@ export class MailMessageView extends AbstractViewRight { ); } - toggleFullScreen() { - try { - getSelection().removeAllRanges(); - } catch (e) {} // eslint-disable-line no-empty - - this.fullScreenMode(!this.fullScreenMode()); - } - /** * @param {string} sType * @returns {void} @@ -288,7 +280,7 @@ export class MailMessageView extends AbstractViewRight { onBuild(dom) { const el = dom.querySelector('.b-content'); - this.oContent = initFullscreen(el, () => this.fullScreenMode(getFullscreenElement() === el)); + this.oContent = initFullscreen(el, () => MessageUserStore.fullScreen(getFullscreenElement() === el)); const eqs = (ev, s) => ev.target.closestWithin(s, dom); dom.addEventListener('click', event => { @@ -354,11 +346,11 @@ export class MailMessageView extends AbstractViewRight { // initShortcuts // exit fullscreen, back - shortcuts.add('escape', '', Scope.MessageView, () => { + addShortcut('escape', '', Scope.MessageView, () => { if (!this.viewModelDom.hidden && currentMessage()) { const preview = SettingsUserStore.usePreviewPane(); - if (this.fullScreenMode()) { - this.fullScreenMode(false); + if (MessageUserStore.fullScreen()) { + MessageUserStore.fullScreen(false); if (preview) { AppUserStore.focusedState(Scope.MessageList); @@ -374,8 +366,8 @@ export class MailMessageView extends AbstractViewRight { }); // fullscreen - shortcuts.add('enter,open', '', Scope.MessageView, () => { - this.toggleFullScreen(); + addShortcut('enter,open', '', Scope.MessageView, () => { + MessageUserStore.toggleFullScreen(); return false; }); @@ -427,42 +419,42 @@ export class MailMessageView extends AbstractViewRight { } }); - shortcuts.add('arrowup,arrowleft', 'meta', [Scope.MessageList, Scope.MessageView], () => { + addShortcut('arrowup,arrowleft', 'meta', [Scope.MessageList, Scope.MessageView], () => { this.goUpCommand(); return false; }); - shortcuts.add('arrowdown,arrowright', 'meta', [Scope.MessageList, Scope.MessageView], () => { + addShortcut('arrowdown,arrowright', 'meta', [Scope.MessageList, Scope.MessageView], () => { this.goDownCommand(); return false; }); // print - shortcuts.add('p,printscreen', 'meta', [Scope.MessageView, Scope.MessageList], () => { + addShortcut('p,printscreen', 'meta', [Scope.MessageView, Scope.MessageList], () => { currentMessage() && currentMessage().printMessage(); return false; }); // delete - shortcuts.add('delete', '', Scope.MessageView, () => { + addShortcut('delete', '', Scope.MessageView, () => { this.deleteCommand(); return false; }); - shortcuts.add('delete', 'shift', Scope.MessageView, () => { + addShortcut('delete', 'shift', Scope.MessageView, () => { this.deleteWithoutMoveCommand(); return false; }); // change focused state - shortcuts.add('arrowleft', '', Scope.MessageView, () => { - if (!this.fullScreenMode() && currentMessage() && SettingsUserStore.usePreviewPane() + addShortcut('arrowleft', '', Scope.MessageView, () => { + if (!MessageUserStore.fullScreen() && currentMessage() && SettingsUserStore.usePreviewPane() && !oMessageScrollerDom().scrollLeft) { AppUserStore.focusedState(Scope.MessageList); return false; } }); - shortcuts.add('tab', 'shift', Scope.MessageView, () => { - if (!this.fullScreenMode() && currentMessage() && SettingsUserStore.usePreviewPane()) { + addShortcut('tab', 'shift', Scope.MessageView, () => { + if (!MessageUserStore.fullScreen() && currentMessage() && SettingsUserStore.usePreviewPane()) { AppUserStore.focusedState(Scope.MessageList); } return false; diff --git a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html index 6603b9ebb..7d35eb900 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html @@ -103,7 +103,7 @@
- + ×