mirror of
https://github.com/zulip/zulip.git
synced 2025-11-02 13:03:29 +00:00
typeahead: Migrate to use key instead of keyCode.
`keyCode` is deprecated and those values are not readable.
This commit is contained in:
@@ -173,15 +173,15 @@ import * as tippy from "tippy.js";
|
||||
import * as scroll_util from "./scroll_util";
|
||||
import {get_string_diff, the} from "./util";
|
||||
|
||||
function get_pseudo_keycode(
|
||||
function get_pseudo_key(
|
||||
event: JQuery.KeyDownEvent | JQuery.KeyUpEvent | JQuery.KeyPressEvent,
|
||||
): number {
|
||||
): string {
|
||||
const isComposing = event.originalEvent?.isComposing ?? false;
|
||||
/* We treat IME compose enter keypresses as a separate -13 key. */
|
||||
if (event.keyCode === 13 && isComposing) {
|
||||
return -13;
|
||||
/* Ignore IME compose enter keypresses. (See 7 above) */
|
||||
if (event.code === "Enter" && isComposing) {
|
||||
return "IgnoreEnter";
|
||||
}
|
||||
return event.keyCode;
|
||||
return event.key;
|
||||
}
|
||||
|
||||
export function defaultSorter(items: string[], query: string): string[] {
|
||||
@@ -262,7 +262,7 @@ export class Typeahead<ItemType extends string | object> {
|
||||
helpOnEmptyStrings: boolean;
|
||||
tabIsEnter: boolean;
|
||||
stopAdvance: boolean;
|
||||
advanceKeyCodes: number[];
|
||||
advanceKeys: string[];
|
||||
non_tippy_parent_element: string | undefined;
|
||||
values: WeakMap<HTMLElement, ItemType>;
|
||||
instance: tippy.Instance | undefined;
|
||||
@@ -305,7 +305,7 @@ export class Typeahead<ItemType extends string | object> {
|
||||
// return a string to show in typeahead items or false.
|
||||
this.option_label = options.option_label ?? (() => false);
|
||||
this.stopAdvance = options.stopAdvance ?? false;
|
||||
this.advanceKeyCodes = options.advanceKeyCodes ?? [];
|
||||
this.advanceKeys = options.advanceKeys ?? [];
|
||||
this.openInputFieldOnKeyUp = options.openInputFieldOnKeyUp;
|
||||
this.closeInputFieldOnHide = options.closeInputFieldOnHide;
|
||||
this.tabIsEnter = options.tabIsEnter ?? true;
|
||||
@@ -650,10 +650,10 @@ export class Typeahead<ItemType extends string | object> {
|
||||
}
|
||||
|
||||
maybeStopAdvance(e: JQuery.KeyPressEvent | JQuery.KeyUpEvent | JQuery.KeyDownEvent): void {
|
||||
const pseudo_keycode = get_pseudo_keycode(e);
|
||||
const pseudo_key = get_pseudo_key(e);
|
||||
if (
|
||||
(this.stopAdvance || (pseudo_keycode !== 9 && pseudo_keycode !== 13)) &&
|
||||
!this.advanceKeyCodes.includes(e.keyCode)
|
||||
(this.stopAdvance || (pseudo_key !== "Tab" && pseudo_key !== "Enter")) &&
|
||||
!this.advanceKeys.includes(e.key)
|
||||
) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
@@ -663,27 +663,27 @@ export class Typeahead<ItemType extends string | object> {
|
||||
if (!this.shown) {
|
||||
return;
|
||||
}
|
||||
const pseudo_keycode = get_pseudo_keycode(e);
|
||||
const pseudo_key = get_pseudo_key(e);
|
||||
|
||||
switch (pseudo_keycode) {
|
||||
case 9: // tab
|
||||
switch (pseudo_key) {
|
||||
case "Tab":
|
||||
if (!this.tabIsEnter) {
|
||||
return;
|
||||
}
|
||||
e.preventDefault();
|
||||
break;
|
||||
|
||||
case 13: // enter
|
||||
case 27: // escape
|
||||
case "Enter":
|
||||
case "Escape":
|
||||
e.preventDefault();
|
||||
break;
|
||||
|
||||
case 38: // up arrow
|
||||
case "ArrowUp":
|
||||
e.preventDefault();
|
||||
this.prev();
|
||||
break;
|
||||
|
||||
case 40: // down arrow
|
||||
case "ArrowDown":
|
||||
e.preventDefault();
|
||||
this.next();
|
||||
break;
|
||||
@@ -702,7 +702,7 @@ export class Typeahead<ItemType extends string | object> {
|
||||
}
|
||||
|
||||
keydown(e: JQuery.KeyDownEvent): void {
|
||||
const pseudo_keycode = get_pseudo_keycode(e);
|
||||
const pseudo_key = get_pseudo_key(e);
|
||||
if (this.trigger_selection(e)) {
|
||||
if (!this.shown) {
|
||||
return;
|
||||
@@ -710,7 +710,9 @@ export class Typeahead<ItemType extends string | object> {
|
||||
e.preventDefault();
|
||||
this.select(e);
|
||||
}
|
||||
this.suppressKeyPressRepeat = ![40, 38, 9, 13, 27].includes(pseudo_keycode);
|
||||
this.suppressKeyPressRepeat = !["ArrowDown", "ArrowUp", "Tab", "Enter", "Escape"].includes(
|
||||
pseudo_key,
|
||||
);
|
||||
this.move(e);
|
||||
}
|
||||
|
||||
@@ -729,14 +731,14 @@ export class Typeahead<ItemType extends string | object> {
|
||||
// it did modify the query. For example, `Command + delete` on Mac
|
||||
// doesn't trigger a keyup event but when `Command` is released, it
|
||||
// triggers a keyup event which correctly updates the list.
|
||||
const pseudo_keycode = get_pseudo_keycode(e);
|
||||
const pseudo_key = get_pseudo_key(e);
|
||||
|
||||
switch (pseudo_keycode) {
|
||||
case 40: // down arrow
|
||||
case 38: // up arrow
|
||||
switch (pseudo_key) {
|
||||
case "ArrowDown":
|
||||
case "ArrowUp":
|
||||
break;
|
||||
|
||||
case 9: // tab
|
||||
case "Tab":
|
||||
// If the typeahead is not shown or tabIsEnter option is not set, do nothing and return
|
||||
if (!this.tabIsEnter || !this.shown) {
|
||||
return;
|
||||
@@ -754,14 +756,14 @@ export class Typeahead<ItemType extends string | object> {
|
||||
|
||||
break;
|
||||
|
||||
case 13: // enter
|
||||
case "Enter":
|
||||
if (!this.shown) {
|
||||
return;
|
||||
}
|
||||
this.select(e);
|
||||
break;
|
||||
|
||||
case 27: // escape
|
||||
case "Escape":
|
||||
if (!this.shown) {
|
||||
return;
|
||||
}
|
||||
@@ -773,9 +775,9 @@ export class Typeahead<ItemType extends string | object> {
|
||||
|
||||
default:
|
||||
// to stop typeahead from showing up momentarily
|
||||
// when shift (keycode 16) + tabbing to the topic field
|
||||
// when shift + tabbing to the topic field
|
||||
if (
|
||||
pseudo_keycode === 16 &&
|
||||
pseudo_key === "Shift" &&
|
||||
the(this.input_element.$element).id === "stream_message_recipient_topic"
|
||||
) {
|
||||
return;
|
||||
@@ -787,7 +789,7 @@ export class Typeahead<ItemType extends string | object> {
|
||||
// the search bar).
|
||||
this.openInputFieldOnKeyUp();
|
||||
}
|
||||
if (pseudo_keycode === 8) {
|
||||
if (pseudo_key === "Backspace") {
|
||||
this.lookup(this.hideOnEmptyAfterBackspace);
|
||||
return;
|
||||
}
|
||||
@@ -878,7 +880,7 @@ type TypeaheadOptions<ItemType> = {
|
||||
items?: number;
|
||||
source: (query: string, input_element: TypeaheadInputElement) => ItemType[];
|
||||
// optional options
|
||||
advanceKeyCodes?: number[];
|
||||
advanceKeys?: string[];
|
||||
automated?: () => boolean;
|
||||
closeInputFieldOnHide?: () => void;
|
||||
dropup?: boolean;
|
||||
|
||||
@@ -153,8 +153,8 @@ $(() => {
|
||||
$<HTMLInputElement>(".register-page input#email, .login-page-container input#id_username").on(
|
||||
"focusout keydown",
|
||||
function (e) {
|
||||
// check if it is the "focusout" or if it is a keydown, then check if
|
||||
// the keycode was the one for "Enter".
|
||||
// check if it is the "focusout" or if it is a keydown, then check
|
||||
// if the key was "Enter"
|
||||
if (e.type === "focusout" || e.key === "Enter") {
|
||||
$(this).val($(this).val()!.trim());
|
||||
}
|
||||
|
||||
@@ -222,10 +222,9 @@ export function initialize(opts: {on_narrow_search: OnNarrowSearch}): void {
|
||||
sorter(items: string[]): string[] {
|
||||
return items;
|
||||
},
|
||||
// Turns off `stopPropagation` in the typeahead code for
|
||||
// backspace, arrow left, arrow right, and enter so that
|
||||
// Turns off `stopPropagation` in the typeahead code so that
|
||||
// we can manage those events for search pills.
|
||||
advanceKeyCodes: [8, 13, 37, 39],
|
||||
advanceKeys: ["Backspace", "Enter", "ArrowLeft", "ArrowRight"],
|
||||
|
||||
// Use our custom typeahead `on_escape` hook to exit
|
||||
// the search bar as soon as the user hits Esc.
|
||||
|
||||
Reference in New Issue
Block a user