diff --git a/app/assets/javascripts/app/controllers/editor.js b/app/assets/javascripts/app/controllers/editor.js index a02f33bba..f5eb8221a 100644 --- a/app/assets/javascripts/app/controllers/editor.js +++ b/app/assets/javascripts/app/controllers/editor.js @@ -827,8 +827,7 @@ angular.module('app') this.deleteKeyObserver = keyboardManager.addKeyObserver({ key: KeyboardManager.KeyBackspace, - notElementIds: ["note-text-editor", "note-title-editor"], - modifiers: [KeyboardManager.KeyModifierMeta, KeyboardManager.KeyModifierShift], + modifiers: [KeyboardManager.KeyModifierMeta, KeyboardManager.KeyModifierShift, KeyboardManager.KeyModifierAlt], onKeyDown: (event) => { event.preventDefault(); $timeout(() => { diff --git a/app/assets/javascripts/app/controllers/notes.js b/app/assets/javascripts/app/controllers/notes.js index 924bfe4a0..b0f8775e9 100644 --- a/app/assets/javascripts/app/controllers/notes.js +++ b/app/assets/javascripts/app/controllers/notes.js @@ -335,6 +335,25 @@ angular.module('app') } } + this.selectNextNote = function() { + var visibleNotes = this.visibleNotes(); + let currentIndex = visibleNotes.indexOf(this.selectedNote); + if(currentIndex + 1 < visibleNotes.length) { + this.selectNote(visibleNotes[currentIndex + 1]); + } + } + + this.selectPreviousNote = function() { + var visibleNotes = this.visibleNotes(); + let currentIndex = visibleNotes.indexOf(this.selectedNote); + if(currentIndex - 1 >= 0) { + this.selectNote(visibleNotes[currentIndex - 1]); + return true; + } else { + return false; + } + } + this.selectNote = async function(note, viaClick = false) { if(!note) { return; @@ -565,6 +584,11 @@ angular.module('app') return result; }; + + /* + Keyboard Shortcuts + */ + // In the browser we're not allowed to override cmd/ctrl + n, so we have to use Control modifier as well. // These rules don't apply to desktop, but probably better to be consistent. this.newNoteKeyObserver = keyboardManager.addKeyObserver({ @@ -578,4 +602,41 @@ angular.module('app') } }) + this.getSearchBar = function() { + return document.getElementById("search-bar"); + } + + this.nextNoteKeyObserver = keyboardManager.addKeyObserver({ + key: KeyboardManager.KeyDown, + elements: [document.body, this.getSearchBar()], + onKeyDown: (event) => { + let searchBar = this.getSearchBar(); + if(searchBar == document.activeElement) { + searchBar.blur() + } + $timeout(() => { + this.selectNextNote(); + }); + } + }) + + this.nextNoteKeyObserver = keyboardManager.addKeyObserver({ + key: KeyboardManager.KeyUp, + element: document.body, + onKeyDown: (event) => { + $timeout(() => { + this.selectPreviousNote(); + }); + } + }); + + this.searchKeyObserver = keyboardManager.addKeyObserver({ + key: "f", + modifiers: [KeyboardManager.KeyModifierMeta, KeyboardManager.KeyModifierShift], + onKeyDown: (event) => { + let searchBar = this.getSearchBar(); + if(searchBar) {searchBar.focus()}; + } + }) + }); diff --git a/app/assets/javascripts/app/services/keyboardManager.js b/app/assets/javascripts/app/services/keyboardManager.js index c6715cb94..708c6d982 100644 --- a/app/assets/javascripts/app/services/keyboardManager.js +++ b/app/assets/javascripts/app/services/keyboardManager.js @@ -5,6 +5,8 @@ class KeyboardManager { KeyboardManager.KeyTab = "Tab"; KeyboardManager.KeyBackspace = "Backspace"; + KeyboardManager.KeyUp = "ArrowUp"; + KeyboardManager.KeyDown = "ArrowDown"; KeyboardManager.KeyModifierShift = "Shift"; KeyboardManager.KeyModifierCtrl = "Control"; @@ -70,6 +72,10 @@ class KeyboardManager { continue; } + if(observer.elements && !observer.elements.includes(event.target)) { + continue; + } + if(observer.notElement && observer.notElement == event.target) { continue; } @@ -95,8 +101,8 @@ class KeyboardManager { this.notifyObserver(event, KeyboardManager.KeyEventUp); } - addKeyObserver({key, modifiers, onKeyDown, onKeyUp, element, notElement, notElementIds}) { - let observer = {key, modifiers, onKeyDown, onKeyUp, element, notElement, notElementIds}; + addKeyObserver({key, modifiers, onKeyDown, onKeyUp, element, elements, notElement, notElementIds}) { + let observer = {key, modifiers, onKeyDown, onKeyUp, element, elements, notElement, notElementIds}; this.observers.push(observer); return observer; } diff --git a/app/assets/templates/notes.html.haml b/app/assets/templates/notes.html.haml index 0fafdf70c..fb2ea96e7 100644 --- a/app/assets/templates/notes.html.haml +++ b/app/assets/templates/notes.html.haml @@ -8,7 +8,7 @@ .sk-label %i.icon.ion-plus.add-button .filter-section{"role" => "search"} - %input.filter-bar#search-bar.mousetrap{"select-on-click" => "true", "ng-model" => "ctrl.noteFilter.text", "placeholder" => "Search", + %input.filter-bar#search-bar{"select-on-click" => "true", "ng-model" => "ctrl.noteFilter.text", "placeholder" => "Search", "ng-change" => "ctrl.filterTextChanged()", "lowercase" => "true", "ng-blur" => "ctrl.onFilterEnter()", "ng-keyup" => "$event.keyCode == 13 && ctrl.onFilterEnter();", "title" => "Searches notes in the currently selected tag"} #search-clear-button{"ng-show" => "ctrl.noteFilter.text", "ng-click" => "ctrl.clearFilterText();"} ✕