From cd8973a990d6613a6851de1146a729f42aae26b1 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 | 5 +++-- src/extensions/RichText.js | 8 +++++--- src/extensions/index.js | 2 -- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/extensions/PlainText.js b/src/extensions/PlainText.js index 24daf18cb45..562e7d30b77 100644 --- a/src/extensions/PlainText.js +++ b/src/extensions/PlainText.js @@ -5,14 +5,15 @@ 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 [PlainTextDocument, Text] + return [Keymap, PlainTextDocument, Text] }, }) diff --git a/src/extensions/RichText.js b/src/extensions/RichText.js index af81b452e79..65d98391432 100644 --- a/src/extensions/RichText.js +++ b/src/extensions/RichText.js @@ -27,21 +27,22 @@ 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' import Text from '@tiptap/extension-text' -import TrailingNode from './../nodes/TrailingNode.js' import TextDirection from 'tiptap-text-direction' +import TrailingNode from './../nodes/TrailingNode.js' /* eslint-enable import/no-named-as-default */ import { Strong, Italic, Strike, Link, Underline } from './../marks/index.js' @@ -98,6 +99,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 1ccb176971e64ba254e1156773d4cd0900653764 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 | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/extensions/Keymap.js b/src/extensions/Keymap.js index aac4ea90641..0369e9ccde1 100644 --- a/src/extensions/Keymap.js +++ b/src/extensions/Keymap.js @@ -7,7 +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 @@ -19,19 +19,16 @@ const Keymap = Extension.create({ props: { handleKeyDown(view, event) { const key = event.key || event.keyCode + + /** + * - + * Overwrite Viewer keybinding to delete the file + */ if ( (event.ctrlKey || event.metaKey) && !event.shiftKey - && (key === 'f' || key === 70) + && event.key === 'Delete' ) { - // 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 event.stopPropagation() window.dispatchEvent(event) return true From b9d62ff4c3ed29a6b3018d172eebc574a6bda7f1 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 | 5 ----- src/extensions/Keymap.js | 10 ++++++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/Editor.vue b/src/components/Editor.vue index f526181da38..8709b50f6a6 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -894,11 +894,6 @@ export default { }, onKeyDown(event) { - if (event.key === 'Escape') { - event.preventDefault() - return - } - if ( event.key === 'Tab' && !event.shiftKey diff --git a/src/extensions/Keymap.js b/src/extensions/Keymap.js index 0369e9ccde1..9ddebc1ad44 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 02b129f1b4407a39e6f8a80653157ed503c531b5 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 8709b50f6a6..ad5a78464aa 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -390,6 +390,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) @@ -413,6 +414,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) @@ -771,6 +773,10 @@ export default { this.emit('blur') }, + onKeyboardSave() { + this.$syncService.save() + }, + onAddImageNode() { this.emit('add-image-node') }, @@ -907,11 +913,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 9ddebc1ad44..6b7902bd661 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 4b1187f11efbaf106fcab295bc8bac840a304fa1 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 0d98398b4e3..0a5f36a3408 100644 --- a/src/components/Editor/Wrapper.vue +++ b/src/components/Editor/Wrapper.vue @@ -15,6 +15,7 @@