fix(desktop): ignore IME Enter in Kanban task title

This commit is contained in:
Hukla
2026-08-25 12:21:17 +03:00
committed by Teknium
parent e550dce932
commit 19729c6ea7
3 changed files with 39 additions and 1 deletions
+2 -1
View File
@@ -79,6 +79,7 @@ import {
} from './api'
import { BoardSwitcher } from './board-switcher'
import { TaskDrawer } from './drawer'
import { shouldSubmitOnEnter } from './ime-enter'
import { EMPTY_OVERRIDE, ModelOverrideField, overrideCreateFields, type TaskModelOverride } from './model-override'
import { OrchestrationPanel } from './orchestration'
import { columnMeta, type KanbanBoard, type KanbanTask, type TaskEstimate } from './types'
@@ -683,7 +684,7 @@ function NewTaskDialog({
autoFocus
onChange={event => setTitle(event.target.value)}
onKeyDown={event => {
if (event.key === 'Enter') {
if (shouldSubmitOnEnter(event)) {
event.preventDefault()
void submit()
}
@@ -0,0 +1,21 @@
import { describe, expect, it } from 'vitest'
import { shouldSubmitOnEnter } from './ime-enter'
describe('shouldSubmitOnEnter', () => {
it('submits a normal Enter keypress', () => {
expect(shouldSubmitOnEnter({ key: 'Enter', nativeEvent: {} })).toBe(true)
})
it('does not submit while IME composition is active', () => {
expect(shouldSubmitOnEnter({ key: 'Enter', nativeEvent: { isComposing: true } })).toBe(false)
})
it('does not submit Chromium composition-boundary keyCode 229', () => {
expect(shouldSubmitOnEnter({ key: 'Enter', nativeEvent: { keyCode: 229 } })).toBe(false)
})
it('does not submit non-Enter keys', () => {
expect(shouldSubmitOnEnter({ key: 'Escape', nativeEvent: {} })).toBe(false)
})
})
@@ -0,0 +1,16 @@
export interface ImeKeyEvent {
key: string
nativeEvent: {
isComposing?: boolean
keyCode?: number
}
}
/**
* Enter confirms an IME conversion before it should act as a submit shortcut.
* Chromium can report the legacy 229 keyCode around composition boundaries,
* so keep that fallback in addition to the standard isComposing signal.
*/
export function shouldSubmitOnEnter(event: ImeKeyEvent): boolean {
return event.key === 'Enter' && !event.nativeEvent.isComposing && event.nativeEvent.keyCode !== 229
}