mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-17 10:58:20 -07:00
131 lines
3.4 KiB
JavaScript
131 lines
3.4 KiB
JavaScript
define(['dom', 'focusManager'], function (dom, focusManager) {
|
|
'use strict';
|
|
|
|
var inputDisplayElement;
|
|
var currentDisplayText = '';
|
|
var currentDisplayTextContainer;
|
|
|
|
function onKeyDown(e) {
|
|
|
|
if (e.ctrlKey) {
|
|
return;
|
|
}
|
|
if (e.shiftKey) {
|
|
return;
|
|
}
|
|
if (e.altKey) {
|
|
return;
|
|
}
|
|
|
|
var key = e.key;
|
|
var chr = key ? alphanumeric(key) : null;
|
|
|
|
if (chr) {
|
|
|
|
chr = chr.toString().toUpperCase();
|
|
|
|
if (chr.length === 1) {
|
|
currentDisplayTextContainer = this.options.itemsContainer;
|
|
onAlphanumericKeyPress(e, chr);
|
|
}
|
|
}
|
|
}
|
|
|
|
function alphanumeric(value) {
|
|
var letterNumber = /^[0-9a-zA-Z]+$/;
|
|
return value.match(letterNumber);
|
|
}
|
|
|
|
function ensureInputDisplayElement() {
|
|
if (!inputDisplayElement) {
|
|
inputDisplayElement = document.createElement('div');
|
|
inputDisplayElement.classList.add('alphanumeric-shortcut');
|
|
inputDisplayElement.classList.add('hide');
|
|
|
|
document.body.appendChild(inputDisplayElement);
|
|
}
|
|
}
|
|
|
|
var alpanumericShortcutTimeout;
|
|
function clearAlphaNumericShortcutTimeout() {
|
|
if (alpanumericShortcutTimeout) {
|
|
clearTimeout(alpanumericShortcutTimeout);
|
|
alpanumericShortcutTimeout = null;
|
|
}
|
|
}
|
|
function resetAlphaNumericShortcutTimeout() {
|
|
clearAlphaNumericShortcutTimeout();
|
|
alpanumericShortcutTimeout = setTimeout(onAlphanumericShortcutTimeout, 2000);
|
|
}
|
|
|
|
function onAlphanumericKeyPress(e, chr) {
|
|
if (currentDisplayText.length >= 3) {
|
|
return;
|
|
}
|
|
ensureInputDisplayElement();
|
|
currentDisplayText += chr;
|
|
inputDisplayElement.innerHTML = currentDisplayText;
|
|
inputDisplayElement.classList.remove('hide');
|
|
resetAlphaNumericShortcutTimeout();
|
|
}
|
|
|
|
function onAlphanumericShortcutTimeout() {
|
|
var value = currentDisplayText;
|
|
var container = currentDisplayTextContainer;
|
|
|
|
currentDisplayText = '';
|
|
currentDisplayTextContainer = null;
|
|
inputDisplayElement.innerHTML = '';
|
|
inputDisplayElement.classList.add('hide');
|
|
clearAlphaNumericShortcutTimeout();
|
|
selectByShortcutValue(container, value);
|
|
}
|
|
|
|
function selectByShortcutValue(container, value) {
|
|
|
|
value = value.toUpperCase();
|
|
|
|
var focusElem;
|
|
if (value === '#') {
|
|
|
|
focusElem = container.querySelector('*[data-prefix]');
|
|
}
|
|
|
|
if (!focusElem) {
|
|
focusElem = container.querySelector('*[data-prefix^=\'' + value + '\']');
|
|
}
|
|
|
|
if (focusElem) {
|
|
focusManager.focus(focusElem);
|
|
}
|
|
}
|
|
|
|
function AlphaNumericShortcuts(options) {
|
|
|
|
this.options = options;
|
|
|
|
var keyDownHandler = onKeyDown.bind(this);
|
|
|
|
dom.addEventListener(window, 'keydown', keyDownHandler, {
|
|
passive: true
|
|
});
|
|
|
|
this.keyDownHandler = keyDownHandler;
|
|
}
|
|
|
|
AlphaNumericShortcuts.prototype.destroy = function () {
|
|
|
|
var keyDownHandler = this.keyDownHandler;
|
|
|
|
if (keyDownHandler) {
|
|
dom.removeEventListener(window, 'keydown', keyDownHandler, {
|
|
passive: true
|
|
});
|
|
this.keyDownHandler = null;
|
|
}
|
|
this.options = null;
|
|
};
|
|
|
|
return AlphaNumericShortcuts;
|
|
});
|