diff --git a/frontend/src/components/input/editor/TipTap.vue b/frontend/src/components/input/editor/TipTap.vue index 473d3a2af..7aefd14fd 100644 --- a/frontend/src/components/input/editor/TipTap.vue +++ b/frontend/src/components/input/editor/TipTap.vue @@ -145,7 +145,7 @@ import {eventToHotkeyString} from '@github/hotkey' import EditorToolbar from './EditorToolbar.vue' import StarterKit from '@tiptap/starter-kit' -import {Extension, mergeAttributes} from '@tiptap/core' +import {Extension, mergeAttributes, type SetContentOptions} from '@tiptap/core' import {EditorContent, type Extensions, useEditor, VueNodeViewRenderer} from '@tiptap/vue-3' import {Plugin, PluginKey} from '@tiptap/pm/state' import {marked} from 'marked' @@ -213,6 +213,12 @@ const tiptapInstanceRef = ref(null) const {t} = useI18n() +const defaultSetContentOptions: SetContentOptions = { + parseOptions: { + preserveWhitespace: 'full', + }, +} + const CustomTableCell = TableCell.extend({ addAttributes() { return { @@ -539,6 +545,9 @@ const editor = useEditor({ onUpdate: () => { bubbleNow() }, + parseOptions: { + preserveWhitespace: 'full', + }, }) watch( @@ -583,7 +592,7 @@ function bubbleSave() { } function exitEditMode() { - editor.value?.commands.setContent(lastSavedState, false) + editor.value?.commands.setContent(lastSavedState, defaultSetContentOptions) if (isEditing.value) { internalMode.value = 'preview' } @@ -630,7 +639,7 @@ function uploadAndInsertFiles(files: File[] | FileList) { const html = editor.value?.getHTML().replace(UPLOAD_PLACEHOLDER_ELEMENT, '') ?? '' - editor.value?.commands.setContent(html, false) + editor.value?.commands.setContent(html, defaultSetContentOptions) bubbleSave() }) @@ -689,7 +698,7 @@ onBeforeUnmount(() => { function setModeAndValue(value: string) { internalMode.value = isEditorContentEmpty(value) ? 'edit' : 'preview' - editor.value?.commands.setContent(value, false) + editor.value?.commands.setContent(value, defaultSetContentOptions) }