diff --git a/dev/App/Abstract.js b/dev/App/Abstract.js index ea60ac90d..e86ef4256 100644 --- a/dev/App/Abstract.js +++ b/dev/App/Abstract.js @@ -24,16 +24,16 @@ class AbstractApp { this.lastErrorTime = 0; const $doc = document; - $doc.addEventListener('keydown', (event) => { - if (event && event.ctrlKey) { - $htmlCL.add('rl-ctrl-key-pressed'); - } - }); - $doc.addEventListener('keyup', (event) => { - if (event && !event.ctrlKey) { - $htmlCL.remove('rl-ctrl-key-pressed'); - } - }); + $doc.addEventListener('keydown', event => + event.ctrlKey && $htmlCL.add('rl-ctrl-key-pressed') +// $htmlCL.toggle('rl-ctrl-key-pressed', event.ctrlKey) +// 'Control' === event.key && $htmlCL.add('rl-ctrl-key-pressed') + ); + $doc.addEventListener('keyup', event => +// !event.ctrlKey && $htmlCL.remove('rl-ctrl-key-pressed') + $htmlCL.toggle('rl-ctrl-key-pressed', event.ctrlKey) +// 'Control' === event.key && $htmlCL.remove('rl-ctrl-key-pressed') + ); const fn = (()=>dispatchEvent(new CustomEvent('rl.auto-logout-refresh'))).debounce(5000); diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js index 50041431d..0a5c925a2 100644 --- a/dev/Common/Selector.js +++ b/dev/Common/Selector.js @@ -94,7 +94,7 @@ class Selector { mSelected = null; this.list.subscribe( - (items) => { + items => { if (Array.isArray(items)) { items.forEach(item => { if (item) { @@ -290,7 +290,7 @@ class Selector { this.newSelectPosition(event.key, true); return false; }); - shortcuts.add('arrowup,arrowdown,home,end,pageup,pagedown,insert,space', '', keyScope, event => { + shortcuts.add('arrowup,arrowdown,home,end,pageup,pagedown,space', '', keyScope, event => { this.newSelectPosition(event.key, false); return false; }); @@ -325,9 +325,7 @@ class Selector { * @param {boolean=} bForceSelect = false */ newSelectPosition(sEventKey, bShiftKey, bForceSelect) { - let index = 0, - isNext = false, - isStop = false, + let isArrow = 'ArrowUp' === sEventKey || 'ArrowDown' === sEventKey, result = null; const pageStep = 10, @@ -336,81 +334,44 @@ class Selector { focused = this.focusedItem(); if (0 < listLen) { - if (!focused) { - if ( - 'ArrowDown' == sEventKey || - 'Insert' == sEventKey || - ' ' == sEventKey || - 'Home' == sEventKey || - 'PageUp' == sEventKey - ) { - result = list[0]; - } else if ( - 'ArrowUp' === sEventKey || - 'End' === sEventKey || - 'PageDown' === sEventKey - ) { - result = list[list.length - 1]; - } - } else if (focused) { - if ( - 'ArrowDown' === sEventKey || - 'ArrowUp' === sEventKey || - 'Insert' === sEventKey || - ' ' === sEventKey - ) { - list.forEach(item => { - if (!isStop) { - switch (sEventKey) { - case 'ArrowUp': - if (focused === item) { - isStop = true; - } else { - result = item; - } - break; - case 'ArrowDown': - case 'Insert': - if (isNext) { - result = item; - isStop = true; - } else if (focused === item) { - isNext = true; - } - break; - // no default - } - } - }); - - if (!result && ('ArrowDown' === sEventKey || 'ArrowUp' === sEventKey)) { + if (focused) { + if (isArrow) { + let i = list.indexOf(focused); + if ('ArrowUp' == sEventKey) { + i > 0 && (result = list[i-1]); + } else if (++i < listLen) { + result = list[i]; + } + if (!result && ' ' !== sEventKey) { (this.oCallbacks.onUpUpOrDownDown || (()=>true))('ArrowUp' === sEventKey); } - } else if ('Home' === sEventKey || 'End' === sEventKey) { - if ('Home' === sEventKey) { - result = list[0]; - } else if ('End' === sEventKey) { - result = list[list.length - 1]; - } + } else if ('Home' === sEventKey) { + result = list[0]; + } else if ('End' === sEventKey) { + result = list[list.length - 1]; } else if ('PageDown' === sEventKey) { - for (; index < listLen; index++) { - if (focused === list[index]) { - index += pageStep; - index = listLen - 1 < index ? listLen - 1 : index; - result = list[index]; - break; - } + let i = list.indexOf(focused); + if (i < listLen - 1) { + result = list[Math.min(i + pageStep, listLen - 1)]; } } else if ('PageUp' === sEventKey) { - for (index = listLen; 0 <= index; index--) { - if (focused === list[index]) { - index -= pageStep; - index = 0 > index ? 0 : index; - result = list[index]; - break; - } + let i = list.indexOf(focused); + if (i > 0) { + result = list[Math.max(0, i - pageStep)]; } } + } else if ( + 'ArrowUp' == sEventKey || + 'Home' == sEventKey || + 'PageUp' == sEventKey + ) { + result = list[0]; + } else if ( + 'ArrowDown' === sEventKey || + 'End' === sEventKey || + 'PageDown' === sEventKey + ) { + result = list[list.length - 1]; } } @@ -418,11 +379,9 @@ class Selector { this.focusedItem(result); if (focused) { - if (bShiftKey) { - if ('ArrowUp' === sEventKey || 'ArrowDown' === sEventKey) { - focused.checked(!focused.checked()); - } - } else if ('Insert' === sEventKey || ' ' === sEventKey) { + if (bShiftKey && isArrow) { + focused.checked(!focused.checked()); + } else if (' ' === sEventKey) { focused.checked(!focused.checked()); } } @@ -433,9 +392,9 @@ class Selector { this.scrollToFocused(); } else if (focused) { - if (bShiftKey && ('ArrowUp' === sEventKey || 'ArrowDown' === sEventKey)) { + if (bShiftKey && isArrow) { focused.checked(!focused.checked()); - } else if ('Insert' === sEventKey || ' ' === sEventKey) { + } else if (' ' === sEventKey) { focused.checked(!focused.checked()); } diff --git a/dev/External/ko.js b/dev/External/ko.js index 67e086e00..c98bff8f1 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -59,7 +59,7 @@ ko.bindingHandlers.openDropdownTrigger = { update: (element, fValueAccessor) => { if (ko.unwrap(fValueAccessor())) { const el = element.ddBtn; - el.open || el.Dropdown.toggle(); + el.open || el.toggle(); // el.focus(); rl.Dropdowns.detectVisibility(); @@ -70,7 +70,7 @@ ko.bindingHandlers.openDropdownTrigger = { ko.bindingHandlers.dropdownCloser = { init: element => element.closest('.dropdown').addEventListener('click', event => - event.target.closestWithin('.e-item', element) && element.ddBtn.Dropdown.toggle() + event.target.closestWithin('.e-item', element) && element.ddBtn.toggle() ) }; diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index e61fb2b83..a6faea15e 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -1151,25 +1151,23 @@ class ComposePopupView extends AbstractViewNext { } } + popupMenu(event) { + if (event.ctrlKey || event.metaKey || 'ContextMenu' == event.key + || (this.oEditor && !this.oEditor.hasFocus() && !inFocus())) { + this.identitiesDropdownTrigger(true); + return false; + } + return true; + } + onBuild(dom) { this.initUploader(); shortcuts.add('q', 'meta', KeyState.Compose, ()=>false); shortcuts.add('w', 'meta', KeyState.Compose, ()=>false); - shortcuts.add('`', '', KeyState.Compose, () => { - if (this.oEditor && !this.oEditor.hasFocus() && !inFocus()) { - this.identitiesDropdownTrigger(true); - return false; - } - - return true; - }); - - shortcuts.add('`', 'ctrl', KeyState.Compose, () => { - this.identitiesDropdownTrigger(true); - return false; - }); + shortcuts.add('m,contextmenu', '', KeyState.Compose, e => this.popupMenu(e)); + shortcuts.add('m', 'ctrl', KeyState.Compose, e => this.popupMenu(e)); shortcuts.add('escape,close', '', KeyState.Compose, () => { this.skipCommand(); diff --git a/dev/View/User/AbstractSystemDropDown.js b/dev/View/User/AbstractSystemDropDown.js index 1d99b6065..1d92a7eda 100644 --- a/dev/View/User/AbstractSystemDropDown.js +++ b/dev/View/User/AbstractSystemDropDown.js @@ -81,10 +81,11 @@ class AbstractSystemDropDownUserView extends AbstractViewNext { } onBuild() { - shortcuts.add('`', '', [KeyState.MessageList, KeyState.MessageView, KeyState.Settings], () => { + shortcuts.add('m,contextmenu', '', [KeyState.MessageList, KeyState.MessageView, KeyState.Settings], () => { if (this.viewModelVisible) { MessageStore.messageFullScreenMode(false); this.accountMenuDropdownTrigger(true); + return false; } }); diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 2ac85a7c3..01ecbac1f 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -801,7 +801,7 @@ class MessageListMailBoxUserView extends AbstractViewNext { if (Settings.capa(Capa.MessageListActions)) { // move - shortcuts.add('m', '', KeyState.MessageList, () => { + shortcuts.add('insert', '', KeyState.MessageList, () => { if (this.newMoveToFolder()) { this.moveNewCommand(); } else { diff --git a/dev/shortcuts.js b/dev/shortcuts.js index 29d5413da..98be273d9 100644 --- a/dev/shortcuts.js +++ b/dev/shortcuts.js @@ -9,7 +9,7 @@ const toArray = v => Array.isArray(v) ? v : v.split(/\s*,\s*/), keydown = event => { - let key = (event.key || event.code || '').toLowerCase(), + let key = (event.key || event.code || '').toLowerCase().replace(' ','space'), scopes = []; scope[key] && scopes.push(scope[key]); _scope !== 'all' && _scopes.all[key] && scopes.push(_scopes.all[key]); diff --git a/rainloop/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html b/rainloop/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html index 9c63e88ea..d74d039f8 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html +++ b/rainloop/v/0.0.0/app/templates/Views/Common/PopupsKeyboardShortcutsHelp.html @@ -24,7 +24,7 @@ - + @@ -42,7 +42,7 @@ - + @@ -74,9 +74,9 @@
` (tilde)
M, Menu
R, Reply
A, Shift + Reply
F, Fwd
Z
Delete, Shift + Delete, #
T
M
Insert
Q
U
I
- + - +
W, C, New
` (tilde), Ctrl + `, ⌘ + `
M, Menu, Ctrl + M, ⌘ + M
Ctrl + S, ⌘ + S, Save
Esc, Close
Shift + Esc, Shift + Close