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 @@
- | ` (tilde) |
+ | M, Menu |
| R, Reply |
| A, Shift + Reply |
| F, Fwd |
@@ -42,7 +42,7 @@
| Z |
| Delete, Shift + Delete, # |
| T |
- | M |
+ | Insert |
| Q |
| U |
| I |
@@ -74,9 +74,9 @@
| W, C, New |
- | ` (tilde), Ctrl + `, ⌘ + ` |
+ | M, Menu, Ctrl + M, ⌘ + M |
| Ctrl + S, ⌘ + S, Save |
-
+
| Esc, Close |
| Shift + Esc, Shift + Close |