From 58fdb60fead98024fcbf661d54f481966329dc67 Mon Sep 17 00:00:00 2001 From: Jonas Date: Thu, 8 May 2025 09:42:05 +0200 Subject: [PATCH 01/12] fix(editor): bring back our custom keymap extension Signed-off-by: Jonas --- src/extensions/PlainText.js | 4 +++- src/extensions/RichText.js | 6 ++++-- src/extensions/index.js | 2 -- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/extensions/PlainText.js b/src/extensions/PlainText.js index aa8095b299b..a9fbfc8e87a 100644 --- a/src/extensions/PlainText.js +++ b/src/extensions/PlainText.js @@ -5,15 +5,17 @@ import { Extension } from '@tiptap/core' +import Keymap from './Keymap.js' +import PlainTextDocument from './../nodes/PlainTextDocument.js' /* eslint-disable import/no-named-as-default */ import Text from '@tiptap/extension-text' -import PlainTextDocument from './../nodes/PlainTextDocument.js' export default Extension.create({ name: 'PlainText', addExtensions() { return [ + Keymap, PlainTextDocument, Text, ] diff --git a/src/extensions/RichText.js b/src/extensions/RichText.js index 8486f6b3371..70a84ef65e6 100644 --- a/src/extensions/RichText.js +++ b/src/extensions/RichText.js @@ -27,15 +27,16 @@ import HorizontalRule from '@tiptap/extension-horizontal-rule' import Image from './../nodes/Image.js' import ImageInline from './../nodes/ImageInline.js' import KeepSyntax from './KeepSyntax.js' -import LinkPicker from './../extensions/LinkPicker.js' +import Keymap from './Keymap.js' import LinkBubble from './../extensions/LinkBubble.js' +import LinkPicker from './../extensions/LinkPicker.js' import ListItem from '@tiptap/extension-list-item' import Markdown from './../extensions/Markdown.js' import Mention from './../extensions/Mention.js' -import Search from './../extensions/Search.js' import OrderedList from './../nodes/OrderedList.js' import Paragraph from './../nodes/Paragraph.js' import Preview from './../nodes/Preview.js' +import Search from './../extensions/Search.js' import Table from './../nodes/Table.js' import TaskItem from './../nodes/TaskItem.js' import TaskList from './../nodes/TaskList.js' @@ -97,6 +98,7 @@ export default Extension.create({ Dropcursor, Gapcursor, KeepSyntax, + Keymap, FrontMatter, Mention, Search, diff --git a/src/extensions/index.js b/src/extensions/index.js index 40022775c10..86b6b811a04 100644 --- a/src/extensions/index.js +++ b/src/extensions/index.js @@ -6,7 +6,6 @@ import CollaborationCursor from './CollaborationCursor.js' import Emoji from './Emoji.js' import FocusTrap from './FocusTrap.js' -import Keymap from './Keymap.js' import UserColor from './UserColor.js' import Markdown from './Markdown.js' import PlainText from './PlainText.js' @@ -18,7 +17,6 @@ export { CollaborationCursor, Emoji, FocusTrap, - Keymap, UserColor, Markdown, PlainText, From 13d75db3ad1ede9d090aa1eb151860bf7a0df5b0 Mon Sep 17 00:00:00 2001 From: Jonas Date: Thu, 8 May 2025 09:48:33 +0200 Subject: [PATCH 02/12] chore(keymap): Remove obsolete - overwrite The keymap extension was not in use for quite some time and I'm now longer able to reproduce issues with - without the overwrite either. Signed-off-by: Jonas --- src/extensions/Keymap.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/extensions/Keymap.js b/src/extensions/Keymap.js index 81883699329..e17c96025c3 100644 --- a/src/extensions/Keymap.js +++ b/src/extensions/Keymap.js @@ -7,8 +7,7 @@ import { Extension } from '@tiptap/core' import { Plugin } from '@tiptap/pm/state' const Keymap = Extension.create({ - - name: 'customkeymap', + name: 'Keymap', addKeyboardShortcuts() { return this.options @@ -20,15 +19,16 @@ const Keymap = Extension.create({ props: { handleKeyDown(view, event) { const key = event.key || event.keyCode - if ((event.ctrlKey || event.metaKey) && !event.shiftKey && (key === 'f' || key === 70)) { - // We need to stop propagation and dispatch the event on the window - // in order to force triggering the browser native search in the text editor - event.stopPropagation() - window.dispatchEvent(event) - return true - } - if (event.key === 'Delete' && event.ctrlKey === true) { - // Prevent deleting the file, by core Viewer.vue + + /** + * - + * Overwrite Viewer keybinding to delete the file + */ + if ( + (event.ctrlKey || event.metaKey) + && !event.shiftKey + && event.key === 'Delete' + ) { event.stopPropagation() window.dispatchEvent(event) return true From 75262c49ea468e38a520be93e3004038f7a94710 Mon Sep 17 00:00:00 2001 From: Jonas Date: Thu, 8 May 2025 09:50:05 +0200 Subject: [PATCH 03/12] refactor(keymap): Move Esc key overwrite to Keymap.js Signed-off-by: Jonas --- src/components/Editor.vue | 13 +++++++------ src/extensions/Keymap.js | 10 ++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/components/Editor.vue b/src/components/Editor.vue index edf9b8bd671..4eadc28ab6a 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -845,12 +845,13 @@ export default { }, onKeyDown(event) { - if (event.key === 'Escape') { - event.preventDefault() - return - } - - if (event.key === 'Tab' && !event.shiftKey && !event.ctrlKey && !event.metaKey && this.$editor.isActive('codeBlock')) { + if ( + event.key === 'Tab' + && !event.shiftKey + && !event.ctrlKey + && !event.metaKey + && this.$editor.isActive('codeBlock') + ) { this.$editor.commands.insertContent('\t') this.$editor.commands.focus() event.preventDefault() diff --git a/src/extensions/Keymap.js b/src/extensions/Keymap.js index e17c96025c3..a740364588e 100644 --- a/src/extensions/Keymap.js +++ b/src/extensions/Keymap.js @@ -20,6 +20,16 @@ const Keymap = Extension.create({ handleKeyDown(view, event) { const key = event.key || event.keyCode + /** + * + * Overwrite Viewer keybinding to close viewer + */ + if (event.key === 'Escape') { + event.preventDefault() + event.stopPropagation() + return true + } + /** * - * Overwrite Viewer keybinding to delete the file From 2d6041719f76d51c4c184c1c66cece801578b8eb Mon Sep 17 00:00:00 2001 From: Jonas Date: Thu, 8 May 2025 10:05:24 +0200 Subject: [PATCH 04/12] refactor(keymap): Move Mod-S handling to Keymap.js Signed-off-by: Jonas --- src/components/Editor.vue | 11 ++++++----- src/extensions/Keymap.js | 22 ++++++++++++++++++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/components/Editor.vue b/src/components/Editor.vue index 4eadc28ab6a..dc961429684 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -374,6 +374,7 @@ export default { window.addEventListener('beforeprint', this.preparePrinting) window.addEventListener('afterprint', this.preparePrinting) } + subscribe('text:keyboard:save', this.onKeyboardSave) subscribe('text:image-node:add', this.onAddImageNode) subscribe('text:image-node:delete', this.onDeleteImageNode) this.emit('update:loaded', true) @@ -398,6 +399,7 @@ export default { window.removeEventListener('beforeprint', this.preparePrinting) window.removeEventListener('afterprint', this.preparePrinting) } + unsubscribe('text:keyboard:save', this.onKeyboardSave) unsubscribe('text:image-node:add', this.onAddImageNode) unsubscribe('text:image-node:delete', this.onDeleteImageNode) unsubscribe('text:translate-modal:show', this.showTranslateModal) @@ -728,6 +730,10 @@ export default { this.emit('blur') }, + onKeyboardSave() { + this.$syncService.save() + }, + onAddImageNode() { this.emit('add-image-node') }, @@ -858,11 +864,6 @@ export default { event.stopPropagation() return } - - if ((event.ctrlKey || event.metaKey) && event.key === 's') { - this.$syncService.save() - event.preventDefault() - } }, showTranslateModal(e) { diff --git a/src/extensions/Keymap.js b/src/extensions/Keymap.js index a740364588e..e7cff728eff 100644 --- a/src/extensions/Keymap.js +++ b/src/extensions/Keymap.js @@ -5,12 +5,14 @@ import { Extension } from '@tiptap/core' import { Plugin } from '@tiptap/pm/state' +import { emit } from '@nextcloud/event-bus' const Keymap = Extension.create({ - name: 'Keymap', + name: 'CustomKeymap', addKeyboardShortcuts() { - return this.options + return { + } }, addProseMirrorPlugins() { @@ -18,7 +20,20 @@ const Keymap = Extension.create({ new Plugin({ props: { handleKeyDown(view, event) { - const key = event.key || event.keyCode + /** + * - + * Save editor content + */ + if ( + (event.ctrlKey || event.metaKey) + && !event.shiftKey + && event.key === 's' + ) { + event.preventDefault() + event.stopPropagation() + emit('text:keyboard:save') + return true + } /** * @@ -40,7 +55,6 @@ const Keymap = Extension.create({ && event.key === 'Delete' ) { event.stopPropagation() - window.dispatchEvent(event) return true } }, From 73e95205b615436a205dded3dc478ed1d516d35c Mon Sep 17 00:00:00 2001 From: Jonas Date: Thu, 8 May 2025 10:20:48 +0200 Subject: [PATCH 05/12] refactor(outline): Move Mod-Alt-H handling to Keymap.js Signed-off-by: Jonas --- src/components/Editor/Wrapper.vue | 13 +++++-------- src/extensions/Keymap.js | 8 ++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/components/Editor/Wrapper.vue b/src/components/Editor/Wrapper.vue index 31b0c4dde73..a63b26e1eb5 100644 --- a/src/components/Editor/Wrapper.vue +++ b/src/components/Editor/Wrapper.vue @@ -15,6 +15,7 @@