2018-10-22 15:05:09 -07:00
|
|
|
define(["dom", "focusManager"], function(dom, focusManager) {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
function onKeyDown(e) {
|
|
|
|
if (!e.ctrlKey && !e.shiftKey && !e.altKey) {
|
|
|
|
var key = e.key,
|
|
|
|
chr = key ? alphanumeric(key) : null;
|
|
|
|
chr && (chr = chr.toString().toUpperCase(), 1 === chr.length && (currentDisplayTextContainer = this.options.itemsContainer, onAlphanumericKeyPress(e, chr)))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function alphanumeric(value) {
|
|
|
|
var letterNumber = /^[0-9a-zA-Z]+$/;
|
|
|
|
return value.match(letterNumber)
|
|
|
|
}
|
|
|
|
|
|
|
|
function ensureInputDisplayElement() {
|
|
|
|
inputDisplayElement || (inputDisplayElement = document.createElement("div"), inputDisplayElement.classList.add("alphanumeric-shortcut"), inputDisplayElement.classList.add("hide"), document.body.appendChild(inputDisplayElement))
|
|
|
|
}
|
|
|
|
|
|
|
|
function clearAlphaNumericShortcutTimeout() {
|
|
|
|
alpanumericShortcutTimeout && (clearTimeout(alpanumericShortcutTimeout), alpanumericShortcutTimeout = null)
|
|
|
|
}
|
|
|
|
|
|
|
|
function resetAlphaNumericShortcutTimeout() {
|
|
|
|
clearAlphaNumericShortcutTimeout(), alpanumericShortcutTimeout = setTimeout(onAlphanumericShortcutTimeout, 2e3)
|
|
|
|
}
|
|
|
|
|
|
|
|
function onAlphanumericKeyPress(e, chr) {
|
|
|
|
currentDisplayText.length >= 3 || (ensureInputDisplayElement(), currentDisplayText += chr, inputDisplayElement.innerHTML = currentDisplayText, inputDisplayElement.classList.remove("hide"), resetAlphaNumericShortcutTimeout())
|
|
|
|
}
|
|
|
|
|
|
|
|
function onAlphanumericShortcutTimeout() {
|
|
|
|
var value = currentDisplayText,
|
|
|
|
container = currentDisplayTextContainer;
|
|
|
|
currentDisplayText = "", currentDisplayTextContainer = null, inputDisplayElement.innerHTML = "", inputDisplayElement.classList.add("hide"), clearAlphaNumericShortcutTimeout(), selectByShortcutValue(container, value)
|
|
|
|
}
|
|
|
|
|
|
|
|
function selectByShortcutValue(container, value) {
|
|
|
|
value = value.toUpperCase();
|
|
|
|
var focusElem;
|
|
|
|
"#" === value && (focusElem = container.querySelector("*[data-prefix]")), focusElem || (focusElem = container.querySelector("*[data-prefix^='" + value + "']")), focusElem && focusManager.focus(focusElem)
|
|
|
|
}
|
|
|
|
|
|
|
|
function AlphaNumericShortcuts(options) {
|
|
|
|
this.options = options;
|
|
|
|
var keyDownHandler = onKeyDown.bind(this);
|
|
|
|
dom.addEventListener(window, "keydown", keyDownHandler, {
|
|
|
|
passive: !0
|
|
|
|
}), this.keyDownHandler = keyDownHandler
|
|
|
|
}
|
|
|
|
var inputDisplayElement, currentDisplayTextContainer, alpanumericShortcutTimeout, currentDisplayText = "";
|
|
|
|
return AlphaNumericShortcuts.prototype.destroy = function() {
|
|
|
|
var keyDownHandler = this.keyDownHandler;
|
|
|
|
keyDownHandler && (dom.removeEventListener(window, "keydown", keyDownHandler, {
|
|
|
|
passive: !0
|
|
|
|
}), this.keyDownHandler = null), this.options = null
|
|
|
|
}, AlphaNumericShortcuts
|
|
|
|
});
|