diff --git a/src/store.js b/src/store.js index b2679a57..59ac938a 100644 --- a/src/store.js +++ b/src/store.js @@ -33,6 +33,7 @@ export default new Vuex.Store({ editor: { sessionId: null, historyEnabled: false, + listenersRegistered: false, }, verbose: { status: 0, @@ -69,6 +70,8 @@ export default new Vuex.Store({ editorSessionId: state => state.editor.sessionId, + listenersRegistered: state => state.editor.listenersRegistered, + verbose: state => state.verbose, tree: state => state.tree, @@ -157,6 +160,7 @@ export default new Vuex.Store({ knownPermissions: [], potentialContexts: [], currentSession: null, + listenersRegistered: false, selectedNodes: [], modal: { type: null, @@ -398,6 +402,10 @@ export default new Vuex.Store({ state.editor.errors.load = true; }, + setListenersRegistered(state) { + state.editor.listenersRegistered = true; + }, + setSaveStatus(state, status) { state.editor.save.status = status; }, @@ -478,6 +486,10 @@ export default new Vuex.Store({ } }, + setListenersRegistered({ commit }) { + commit('setListenersRegistered'); + }, + setEditorData({ commit, dispatch }, data) { commit('setMetaData', data.metadata); diff --git a/src/views/Editor.vue b/src/views/Editor.vue index 704cee41..e14303be 100644 --- a/src/views/Editor.vue +++ b/src/views/Editor.vue @@ -252,6 +252,10 @@ export default { updateSession($route, 'getEditorData'); }, + mounted() { + this.registerListeners(); + }, + watch: { $route(route) { updateSession(route, 'getEditorData'); @@ -271,6 +275,41 @@ export default { redo() { if (this.canRedo) this.history.redo(); }, + registerListeners() { + if (this.$store.getters.listenersRegistered) return; + + const keyCodes = { + // S/s + 83: this.saveData, + // Y/y + 89: this.redo, + // Z/z + 90: this.undo, + }; + window.addEventListener('keydown', (event) => { + if ( + !( + window.navigator.platform.match('Mac') ? event.metaKey : event.ctrlKey + && + event.keyCode in keyCodes + && + ( + this.$route.name === 'editor' + || + ( + this.$route.name === 'editor-home' + && + this.sessionId + ) + ) + ) + ) return; + + event.preventDefault(); + keyCodes[event.keyCode](); + }); + this.$store.dispatch('setListenersRegistered'); + }, }, };