Fix slash newline (#10305)

* Fix slash menu Shift+Enter newline

* fix: enable Shift+Enter newline in rich editor with slash commands

Fixed an issue where users couldn't create new lines using Shift+Enter when
slash command menu (/foo) was active. The problem was caused by globa
keyboard event handlers intercepting all Enter key variants.

Changes:
 - Allow Shift+Enter to pass through QuickPanel event handling
 - Add Shift+Enter detection in CommandListPopover to return false
 - Implement fallback Shift+Enter handling in command suggestion render
 - Remove unused import in AppUpdater.ts
 - Convert Chinese comments to English in QuickPanel
- Add test coverage for command suggestion functionality

---------

Co-authored-by: Zhaokun Zhang <zhaokunzhang@Zhaokuns-Air.lan>
This commit is contained in:
Zhaokun 2025-09-26 05:07:10 +08:00 committed by Vaayne
parent fa394576bb
commit c6dc1810e9
4 changed files with 49 additions and 2 deletions

View File

@ -457,7 +457,13 @@ export const QuickPanelView: React.FC<Props> = ({ setInputText }) => {
// 面板可见且未折叠时:拦截所有 Enter 变体;
// 纯 Enter 选择项,带修饰键仅拦截不处理
if (e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) {
if (e.shiftKey && !e.ctrlKey && !e.metaKey && !e.altKey) {
// Don't prevent default or stop propagation - let it create a newline
setIsMouseOver(false)
break
}
if (e.ctrlKey || e.metaKey || e.altKey) {
e.preventDefault()
e.stopPropagation()
setIsMouseOver(false)

View File

@ -87,6 +87,9 @@ const CommandListPopover = ({
return true
case 'Enter':
if (event.shiftKey) {
return false
}
event.preventDefault()
if (items[internalSelectedIndex]) {
selectItem(internalSelectedIndex)

View File

@ -0,0 +1,17 @@
import { describe, expect, it } from 'vitest'
import { commandSuggestion } from '../command'
describe('commandSuggestion render', () => {
it('has render function', () => {
expect(commandSuggestion.render).toBeDefined()
expect(typeof commandSuggestion.render).toBe('function')
})
it('render function returns object with onKeyDown', () => {
const renderResult = commandSuggestion.render?.()
expect(renderResult).toBeDefined()
expect(renderResult?.onKeyDown).toBeDefined()
expect(typeof renderResult?.onKeyDown).toBe('function')
})
})

View File

@ -628,13 +628,34 @@ export const commandSuggestion: Omit<SuggestionOptions<Command, MentionNodeAttrs
},
onKeyDown: (props) => {
// Let CommandListPopover handle events first
const popoverHandled = component.ref?.onKeyDown?.(props.event)
if (popoverHandled) {
return true
}
// Handle Shift+Enter for newline when popover doesn't handle it
if (props.event.key === 'Enter' && props.event.shiftKey) {
props.event.preventDefault()
// Close the suggestion menu
if (cleanup) cleanup()
component.destroy()
// Use the view from SuggestionKeyDownProps to insert newline
const { view } = props
const { state, dispatch } = view
const { tr } = state
tr.insertText('\n')
dispatch(tr)
return true
}
if (props.event.key === 'Escape') {
if (cleanup) cleanup()
component.destroy()
return true
}
return component.ref?.onKeyDown(props.event)
return false
},
onExit: () => {