diff --git a/resources/js/components/shortcuts.js b/resources/js/components/shortcuts.js index 799f0e629..7feb9bed0 100644 --- a/resources/js/components/shortcuts.js +++ b/resources/js/components/shortcuts.js @@ -3,8 +3,31 @@ * @type {Object} */ const defaultMap = { - "edit": "e", + // Header actions + "home": "1", + "shelves_view": "2", + "books_view": "3", + "settings_view": "4", + "favorites_view": "5", + "profile_view": "6", "global_search": "/", + "logout": "0", + + // Generic actions + "edit": "e", + "new": "n", + "copy": "c", + "delete": "d", + "favorite": "f", + "export": "x", + "sort": "s", + "permissions": "p", + "move": "m", + "revisions": "r", + + // Navigation + "next": "ArrowRight", + "prev": "ArrowLeft", }; function reverseMap(map) { @@ -26,10 +49,10 @@ class Shortcuts { this.mapByShortcut = reverseMap(this.mapById); this.hintsShowing = false; + + this.hideHints = this.hideHints.bind(this); // TODO - Allow custom key maps // TODO - Allow turning off shortcuts - // TODO - Roll out to interface elements - // TODO - Hide hints on focus, scroll, click this.setupListeners(); } @@ -53,7 +76,6 @@ class Shortcuts { window.addEventListener('keydown', event => { if (event.key === '?') { this.hintsShowing ? this.hideHints() : this.showHints(); - this.hintsShowing = !this.hintsShowing; } }); } @@ -81,6 +103,12 @@ class Shortcuts { return true; } + if (el.matches('div[tabindex]')) { + el.click(); + el.focus(); + return true; + } + console.error(`Shortcut attempted to be ran for element type that does not have handling setup`, el); return false; @@ -88,11 +116,24 @@ class Shortcuts { showHints() { const shortcutEls = this.container.querySelectorAll('[data-shortcut]'); + const displayedIds = new Set(); for (const shortcutEl of shortcutEls) { const id = shortcutEl.getAttribute('data-shortcut'); + if (displayedIds.has(id)) { + continue; + } + const key = this.mapById[id]; this.showHintLabel(shortcutEl, key); + displayedIds.add(id); } + + window.addEventListener('scroll', this.hideHints); + window.addEventListener('focus', this.hideHints); + window.addEventListener('blur', this.hideHints); + window.addEventListener('click', this.hideHints); + + this.hintsShowing = true; } showHintLabel(targetEl, key) { @@ -113,6 +154,13 @@ class Shortcuts { for (const hint of hints) { hint.remove(); } + + window.removeEventListener('scroll', this.hideHints); + window.removeEventListener('focus', this.hideHints); + window.removeEventListener('blur', this.hideHints); + window.removeEventListener('click', this.hideHints); + + this.hintsShowing = false; } } diff --git a/resources/views/books/index.blade.php b/resources/views/books/index.blade.php index 447d6fd44..dc51a3a80 100644 --- a/resources/views/books/index.blade.php +++ b/resources/views/books/index.blade.php @@ -37,7 +37,7 @@
{{ trans('common.actions') }}
@if(user()->can('book-create-all')) - + @icon('add') {{ trans('entities.books_create') }} diff --git a/resources/views/books/show.blade.php b/resources/views/books/show.blade.php index dbd2cbb35..884082456 100644 --- a/resources/views/books/show.blade.php +++ b/resources/views/books/show.blade.php @@ -94,13 +94,13 @@
@if(userCan('page-create', $book)) - + @icon('add') {{ trans('entities.pages_new') }} @endif @if(userCan('chapter-create', $book)) - + @icon('add') {{ trans('entities.chapters_new') }} @@ -113,25 +113,25 @@ @icon('edit') {{ trans('common.edit') }} - + @icon('sort') {{ trans('common.sort') }} @endif @if(userCan('book-create-all')) - + @icon('copy') {{ trans('common.copy') }} @endif @if(userCan('restrictions-manage', $book)) - + @icon('lock') {{ trans('entities.permissions') }} @endif @if(userCan('book-delete', $book)) - + @icon('delete') {{ trans('common.delete') }} diff --git a/resources/views/chapters/show.blade.php b/resources/views/chapters/show.blade.php index b3496eae2..d2f8cec97 100644 --- a/resources/views/chapters/show.blade.php +++ b/resources/views/chapters/show.blade.php @@ -108,7 +108,7 @@
@if(userCan('page-create', $chapter)) - + @icon('add') {{ trans('entities.pages_new') }} @@ -117,31 +117,31 @@
@if(userCan('chapter-update', $chapter)) - + @icon('edit') {{ trans('common.edit') }} @endif @if(userCanOnAny('create', \BookStack\Entities\Models\Book::class) || userCan('chapter-create-all') || userCan('chapter-create-own')) - + @icon('copy') {{ trans('common.copy') }} @endif @if(userCan('chapter-update', $chapter) && userCan('chapter-delete', $chapter)) - + @icon('folder') {{ trans('common.move') }} @endif @if(userCan('restrictions-manage', $chapter)) - + @icon('lock') {{ trans('entities.permissions') }} @endif @if(userCan('chapter-delete', $chapter)) - + @icon('delete') {{ trans('common.delete') }} @@ -149,7 +149,7 @@ @if($chapter->book && userCan('book-update', $chapter->book))
- + @icon('sort') {{ trans('entities.chapter_sort_book') }} diff --git a/resources/views/common/header.blade.php b/resources/views/common/header.blade.php index 1b0e64ac4..0481b3412 100644 --- a/resources/views/common/header.blade.php +++ b/resources/views/common/header.blade.php @@ -2,7 +2,7 @@
- @icon('search'){{ trans('common.search') }} @if(userCanOnAny('view', \BookStack\Entities\Models\Bookshelf::class) || userCan('bookshelf-view-all') || userCan('bookshelf-view-own')) - @icon('bookshelf'){{ trans('entities.shelves') }} + @icon('bookshelf'){{ trans('entities.shelves') }} @endif - @icon('books'){{ trans('entities.books') }} + @icon('books'){{ trans('entities.books') }} @if(signedInUser() && userCan('settings-manage')) - @icon('settings'){{ trans('settings.settings') }} + @icon('settings'){{ trans('settings.settings') }} @endif @if(signedInUser() && userCan('users-manage') && !userCan('settings-manage')) - @icon('users'){{ trans('settings.users') }} + @icon('users'){{ trans('settings.users') }} @endif @endif @@ -62,13 +62,13 @@