in client/src/cqlInput/editor/plugin.ts [395:498]
handleKeyDown(view, event) {
switch (event.key) {
case "+": {
const { doc, selection } = view.state;
const suffix = doc.textBetween(
selection.from,
Math.min(selection.to + 1, doc.nodeSize - 2)
);
const maybeTrailingWhitespace =
selection.from === selection.to &&
!["", " "].some((str) => suffix === str)
? " "
: "";
if (!maybeTrailingWhitespace) {
return false;
}
event.preventDefault();
const textToInsert = `+${maybeTrailingWhitespace}`;
const tr = view.state.tr.insertText(textToInsert);
view.dispatch(tr);
return true;
}
// What should the behaviour of tab be?
case "Tab": {
if (event.shiftKey) {
// Reverse tab
return true;
}
return true;
}
case "Escape": {
typeaheadPopover?.hide();
return true;
}
case "Delete": {
// Look forward for node
const { anchor } = view.state.selection;
const positionAfterSearchText = Math.max(anchor + 1, 0);
const $nextPos = view.state.doc.resolve(positionAfterSearchText);
const nextNode = $nextPos.nodeAfter;
if (!nextNode) {
return false;
}
return applyDeleteIntent(
view,
$nextPos.pos,
$nextPos.pos + nextNode.nodeSize,
nextNode
);
}
case "Backspace": {
// Look backward for node
const { anchor } = view.state.selection;
const positionBeforeSearchText = Math.max(anchor - 1, 0);
const $prevPos = view.state.doc.resolve(positionBeforeSearchText);
const prevNode = $prevPos.nodeBefore;
if (!prevNode) {
return false;
}
const prevNodePos = $prevPos.pos - prevNode.nodeSize;
return applyDeleteIntent(view, prevNodePos, $prevPos.pos, prevNode);
}
}
// Typeahead-specific behaviours
if (!typeaheadPopover?.isRenderingNavigableMenu()) {
switch (event.key) {
case "Enter": {
return skipSuggestion(view)();
}
default: {
return false;
}
}
} else {
switch (event.key) {
case "ArrowUp": {
return typeaheadPopover.handleAction("up");
}
case "ArrowDown": {
return typeaheadPopover.handleAction("down");
}
case "ArrowLeft": {
return typeaheadPopover.handleAction("left");
}
case "ArrowRight": {
return typeaheadPopover.handleAction("right");
}
case "Enter": {
return typeaheadPopover.handleAction("enter");
}
}
}
},