diff --git a/src/public/app/components/app_context.js b/src/public/app/components/app_context.js index cf068c333..8b3cbf2aa 100644 --- a/src/public/app/components/app_context.js +++ b/src/public/app/components/app_context.js @@ -12,6 +12,7 @@ import keyboardActionsService from "../services/keyboard_actions.js"; import MobileScreenSwitcherExecutor from "./mobile_screen_switcher.js"; import MainTreeExecutors from "./main_tree_executors.js"; import toast from "../services/toast.js"; +import ShortcutComponent from "./shortcut_component.js"; class AppContext extends Component { constructor(isMainWindow) { @@ -46,7 +47,8 @@ class AppContext extends Component { this.tabManager, new RootCommandExecutor(), new Entrypoints(), - new MainTreeExecutors() + new MainTreeExecutors(), + new ShortcutComponent() ]; if (utils.isMobile()) { diff --git a/src/public/app/components/shortcut_component.js b/src/public/app/components/shortcut_component.js index 59ba34ff4..21b718ac1 100644 --- a/src/public/app/components/shortcut_component.js +++ b/src/public/app/components/shortcut_component.js @@ -2,18 +2,39 @@ import appContext from "./app_context.js"; import shortcutService from "../services/shortcuts.js"; import server from "../services/server.js"; import Component from "./component.js"; +import froca from "../services/froca.js"; export default class ShortcutComponent extends Component { constructor() { + super(); + server.get('keyboard-shortcuts-for-notes').then(shortcutAttributes => { - for (const attr in shortcutAttributes) { - bindNoteShortcutHandler(attr); + for (const attr of shortcutAttributes) { + this.bindNoteShortcutHandler(attr); } + }); } bindNoteShortcutHandler(attr) { - const handler = async () => appContext.tabManager.getActiveContext().setNote(attr.noteId); + const handler = () => appContext.tabManager.getActiveContext().setNote(attr.noteId); + const namespace = attr.attributeId; - shortcutService.bindGlobalShortcut(attr.value, handler, attr.attributeId); + if (attr.isDeleted) { + shortcutService.removeGlobalShortcut(namespace); + } else { + shortcutService.bindGlobalShortcut(attr.value, handler, namespace); + } + } + + async entitiesReloadedEvent({loadResults}) { + for (const attr of loadResults.getAttributes()) { + if (attr.type === 'label' && attr.name === 'keyboardShortcut') { + const note = await froca.getNote(attr.noteId); + // launcher shortcuts are handled specifically + if (note && note.type !== 'launcher') { + this.bindNoteShortcutHandler(attr); + } + } + } } } diff --git a/src/public/app/services/keyboard_actions.js b/src/public/app/services/keyboard_actions.js index 3048a6524..585cd934a 100644 --- a/src/public/app/services/keyboard_actions.js +++ b/src/public/app/services/keyboard_actions.js @@ -44,24 +44,6 @@ getActionsForScope("window").then(actions => { } }); -function setElementActionHandler($el, actionName, handler) { - keyboardActionsLoaded.then(() => { - const action = keyboardActionRepo[actionName]; - - if (!action) { - throw new Error(`Cannot find keyboard action '${actionName}'`); - } - - // not setting action.handler since this is not global - - for (const shortcut of action.effectiveShortcuts) { - if (shortcut) { - shortcutService.bindElShortcut($el, shortcut, handler); - } - } - }); -} - async function getAction(actionName, silent = false) { await keyboardActionsLoaded; @@ -108,10 +90,8 @@ function updateDisplayedShortcuts($container) { } export default { - setElementActionHandler, updateDisplayedShortcuts, setupActionsForElement, getActions, - getActionsForScope, - getAction + getActionsForScope }; diff --git a/src/public/app/services/shortcuts.js b/src/public/app/services/shortcuts.js index 55d7a9c90..7e6ea56a8 100644 --- a/src/public/app/services/shortcuts.js +++ b/src/public/app/services/shortcuts.js @@ -1,5 +1,9 @@ import utils from "./utils.js"; +function removeGlobalShortcut(namespace) { + bindGlobalShortcut('', null, namespace); +} + function bindGlobalShortcut(keyboardShortcut, handler, namespace = null) { bindElShortcut($(document), keyboardShortcut, handler, namespace); } @@ -48,5 +52,6 @@ function normalizeShortcut(shortcut) { export default { bindGlobalShortcut, bindElShortcut, + removeGlobalShortcut, normalizeShortcut }