diff options
author | metiftikci <metiftikci@hotmail.com> | 2024-12-25 08:03:43 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-25 13:03:43 +0800 |
commit | 1a7591d7f9feada9556627344ed2189315c23033 (patch) | |
tree | ffdd3f7450a0b4d7f18ef2eb030c8b5594802c76 | |
parent | abaeae0b9c144509f6648b21794937274e047865 (diff) | |
download | gitea-1a7591d7f9feada9556627344ed2189315c23033.tar.gz gitea-1a7591d7f9feada9556627344ed2189315c23033.zip |
fix textarea newline handle (#32966)
- Fix cursor position if input newline on middle of lines
- ~Increment number if numbered list~
![image](https://github.com/user-attachments/assets/bcfe2625-11a8-4ea4-9a71-b7ecfe81b2e0)
---------
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
-rw-r--r-- | web_src/js/features/comp/EditorMarkdown.test.ts | 24 | ||||
-rw-r--r-- | web_src/js/features/comp/EditorMarkdown.ts | 1 |
2 files changed, 20 insertions, 5 deletions
diff --git a/web_src/js/features/comp/EditorMarkdown.test.ts b/web_src/js/features/comp/EditorMarkdown.test.ts index acd496bed6..7b4b44e83c 100644 --- a/web_src/js/features/comp/EditorMarkdown.test.ts +++ b/web_src/js/features/comp/EditorMarkdown.test.ts @@ -4,13 +4,24 @@ test('EditorMarkdown', () => { const textarea = document.createElement('textarea'); initTextareaMarkdown(textarea); - const testInput = (value, expected) => { - textarea.value = value; - textarea.setSelectionRange(value.length, value.length); + type ValueWithCursor = string | { + value: string; + pos: number; + } + const testInput = (input: ValueWithCursor, result: ValueWithCursor) => { + const intputValue = typeof input === 'string' ? input : input.value; + const inputPos = typeof input === 'string' ? intputValue.length : input.pos; + textarea.value = intputValue; + textarea.setSelectionRange(inputPos, inputPos); + const e = new KeyboardEvent('keydown', {key: 'Enter', cancelable: true}); textarea.dispatchEvent(e); - if (!e.defaultPrevented) textarea.value += '\n'; - expect(textarea.value).toEqual(expected); + if (!e.defaultPrevented) textarea.value += '\n'; // simulate default behavior + + const expectedValue = typeof result === 'string' ? result : result.value; + const expectedPos = typeof result === 'string' ? expectedValue.length : result.pos; + expect(textarea.value).toEqual(expectedValue); + expect(textarea.selectionStart).toEqual(expectedPos); }; testInput('-', '-\n'); @@ -18,8 +29,11 @@ test('EditorMarkdown', () => { testInput('- ', ''); testInput('1. ', ''); + testInput({value: '1. \n2. ', pos: 3}, {value: '\n2. ', pos: 0}); testInput('- x', '- x\n- '); + testInput('1. foo', '1. foo\n1. '); + testInput({value: '1. a\n2. b\n3. c', pos: 4}, {value: '1. a\n1. \n2. b\n3. c', pos: 8}); testInput('- [ ]', '- [ ]\n- '); testInput('- [ ] foo', '- [ ] foo\n- [ ] '); testInput('* [x] foo', '* [x] foo\n* [ ] '); diff --git a/web_src/js/features/comp/EditorMarkdown.ts b/web_src/js/features/comp/EditorMarkdown.ts index 2af003ccb0..5e2ef121f5 100644 --- a/web_src/js/features/comp/EditorMarkdown.ts +++ b/web_src/js/features/comp/EditorMarkdown.ts @@ -92,6 +92,7 @@ function handleNewline(textarea: HTMLTextAreaElement, e: Event) { if (!line) { // clear current line if we only have i.e. '1. ' and the user presses enter again to finish creating a list textarea.value = value.slice(0, lineStart) + value.slice(lineEnd); + textarea.setSelectionRange(selStart - prefix.length, selStart - prefix.length); } else { // start a new line with the same indention and prefix let newPrefix = prefix; |