handleKeyDown()

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");
            }
          }
        }
      },