diff --git a/web/menu.js b/web/menu.js index 9861c7377..501325ef5 100644 --- a/web/menu.js +++ b/web/menu.js @@ -146,19 +146,11 @@ class Menu { stopEvent(e); break; case "Home": - this.#menuItems - .find( - item => !item.disabled && !item.classList.contains("hidden") - ) - ?.focus(); + this.#goToFirstLast(false); stopEvent(e); break; case "End": - this.#menuItems - .findLast( - item => !item.disabled && !item.classList.contains("hidden") - ) - ?.focus(); + this.#goToFirstLast(true); stopEvent(e); break; default: @@ -194,11 +186,7 @@ class Menu { if (!this.#openMenuAC) { this.#openMenu(); } - this.#menuItems - .find( - item => !item.disabled && !item.classList.contains("hidden") - ) - ?.focus(); + this.#goToFirstLast(false); break; case "ArrowUp": case "End": @@ -206,11 +194,7 @@ class Menu { if (!this.#openMenuAC) { this.#openMenu(); } - this.#menuItems - .findLast( - item => !item.disabled && !item.classList.contains("hidden") - ) - ?.focus(); + this.#goToFirstLast(true); break; case "Escape": this.#closeMenu(); @@ -252,6 +236,20 @@ class Menu { } } + /** + * Go to the first/last menu item. + * @param {boolean} [last] + */ + #goToFirstLast(last = false) { + const i = this.#menuItems[last ? "findLastIndex" : "findIndex"]( + item => !item.disabled && !item.classList.contains("hidden") + ); + if (i >= 0) { + this.#menuItems[i].focus(); + this.#lastIndex = i; + } + } + destroy() { this.#closeMenu(); this.#menuAC?.abort();