in packages/roosterjs-editor-plugins/lib/plugins/Picker/PickerPlugin.ts [394:455]
private onKeyDownEvent(event: PluginKeyboardEvent) {
let keyboardEvent = event.rawEvent;
if (this.isSuggesting) {
if (keyboardEvent.key == ESC_CHAR_CODE) {
this.setIsSuggesting(false);
this.blockSuggestions = true;
this.cancelDefaultKeyDownEvent(event);
} else if (keyboardEvent.key == BACKSPACE_CHAR_CODE) {
// #483: If we are backspacing over the trigger character that triggered this Picker
// then we need to hide the Picker
const wordBeforeCursor = this.getWord(event);
if (wordBeforeCursor == this.pickerOptions.triggerCharacter) {
this.setIsSuggesting(false);
}
} else if (
this.dataProvider.shiftHighlight &&
(this.pickerOptions.isHorizontal
? keyboardEvent.key == LEFT_ARROW_CHAR_CODE ||
keyboardEvent.key == RIGHT_ARROW_CHAR_CODE
: keyboardEvent.key == UP_ARROW_CHAR_CODE ||
keyboardEvent.key == DOWN_ARROW_CHAR_CODE)
) {
this.dataProvider.shiftHighlight(
this.pickerOptions.isHorizontal
? keyboardEvent.key == RIGHT_ARROW_CHAR_CODE
: keyboardEvent.key == DOWN_ARROW_CHAR_CODE
);
if (this.dataProvider.getSelectedIndex) {
this.setAriaActiveDescendant(this.dataProvider.getSelectedIndex());
}
this.cancelDefaultKeyDownEvent(event);
} else if (
this.dataProvider.selectOption &&
(keyboardEvent.key == ENTER_CHAR_CODE || keyboardEvent.key == TAB_CHAR_CODE)
) {
this.dataProvider.selectOption();
this.cancelDefaultKeyDownEvent(event);
} else {
// Currently no op.
}
} else {
if (keyboardEvent.key == BACKSPACE_CHAR_CODE) {
const nodeRemoved = this.tryRemoveNode(event);
if (nodeRemoved) {
this.cancelDefaultKeyDownEvent(event);
}
} else if (keyboardEvent.key == DELETE_CHAR_CODE) {
let searcher = this.editor.getContentSearcherOfCursor(event);
let nodeAfterCursor = searcher.getInlineElementAfter()
? searcher.getInlineElementAfter().getContainerNode()
: null;
let nodeId = nodeAfterCursor ? this.getIdValue(nodeAfterCursor) : null;
if (nodeId && nodeId.indexOf(this.pickerOptions.elementIdPrefix) == 0) {
let replacementNode = this.dataProvider.onRemove(nodeAfterCursor, false);
this.replaceNode(nodeAfterCursor, replacementNode);
this.cancelDefaultKeyDownEvent(event);
}
}
}
}