UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

745 lines (744 loc) 80.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Injectable } from '@angular/core'; const /** @type {?} */ KEY_MODIFIER = ["ctrl", "shift", "option", "alt", "command", "control"]; const /** @type {?} */ KEY_MODIFIER_CODE = [17, 16, 18, 91, 93, 224]; export class KeyboardShortcutService { constructor() { this.DEFAULT_KEYDOWN_MS = 1000; this.DEFAULT_BADGE_SPACE = 3; this.DEFAULT_FADEOUT_MS = 300; this.nameMapping = {}; this.nameHandler = {}; this.keyHandler = {}; this.keyHintAnchor = {}; this.bindedKeys = []; // check key up & down $(document).on('keydown', (keyEvent) => { if (this.keydownTimer === undefined) { this.keydownTimer = setTimeout(() => { for (let /** @type {?} */ keyHint in this.keyHintAnchor) { let /** @type {?} */ shortcutArray = this.keyHintAnchor[keyHint]; let /** @type {?} */ pass = (keyHint === KEY_MODIFIER[0] && key.control) || (keyHint === KEY_MODIFIER[1] && key.shift) || (keyHint === KEY_MODIFIER[2] && key.option) || (keyHint === KEY_MODIFIER[3] && key.alt) || (keyHint === KEY_MODIFIER[4] && key.command); let /** @type {?} */ outOfModify = true; let /** @type {?} */ passedArray = key.getPressedKeyCodes(); for (let /** @type {?} */ passed of passedArray) { if (KEY_MODIFIER_CODE.indexOf(passed) < 0) { outOfModify = false; } } if (pass && outOfModify) { for (let /** @type {?} */ shortcut of shortcutArray) { let /** @type {?} */ keysArray = this.getNameKeyControls(shortcut.shortcut); // shortcut as name if (keysArray !== null && keysArray !== undefined) { for (let /** @type {?} */ keyCtrl of keysArray) { if (this.isModifierKeyEqual(keyCtrl, keyEvent)) { this.addHintKey(shortcut.hintAnchorElements, keyCtrl, shortcut.hintLabel); } /* open here if u want to show all */ // this.addHintKey(shortcut.hintAnchorElements, keyCtrl, shortcut.hintLabel); } } else { // keyCtrl as shortcut let /** @type {?} */ keyCtrl = shortcut.shortcut; this.addHintKey(shortcut.hintAnchorElements, keyCtrl, shortcut.hintLabel); } } } } }, this.DEFAULT_KEYDOWN_MS); } }); $(document).on('keyup', () => { if (this.keydownTimer !== null && typeof this.keydownTimer !== 'undefined') { clearTimeout(this.keydownTimer); } // remove all hint key for (let /** @type {?} */ keyHint in this.keyHintAnchor) { let /** @type {?} */ shortcutArray = this.keyHintAnchor[keyHint]; for (let /** @type {?} */ shortcut of shortcutArray) { this.removeHintKey(shortcut.hintAnchorElements); } } this.keydownTimer = undefined; }); } /** * @param {?} modKey * @return {?} */ isModifierKey(modKey) { if (modKey === null || modKey === undefined) { return; } return KEY_MODIFIER.indexOf(modKey) >= 0; } /** * @param {?} keyCtrl * @param {?} keyEvent * @return {?} */ isModifierKeyEqual(keyCtrl, keyEvent) { if (keyEvent === undefined || keyCtrl === undefined) { return false; } let /** @type {?} */ index = keyCtrl.indexOf('+'); if (index >= 0) { // has + let /** @type {?} */ split = keyCtrl.split("+"); let /** @type {?} */ singleKey = split[0].toLowerCase(); let /** @type {?} */ currentKey = (keyEvent.key !== undefined) ? keyEvent.key.toLowerCase() : undefined; if (singleKey === 'ctrl') { singleKey = "control"; } else if (singleKey === 'cmd') { singleKey = "command"; } // check cmd btn if (currentKey === 'meta' && (keyEvent.keyCode === 91 || keyEvent.keyCode === 93)) { // for chrome currentKey = "command"; } else if (currentKey === 'meta' && (keyEvent.keyCode === 224)) { // for firefox currentKey = "command"; } if (singleKey === currentKey) { return true; } } return false; } /** * @param {?} value * @return {?} */ capitalizeFirstLetter(value) { if (value === null || value === undefined) { return value; } return value.charAt(0).toUpperCase() + value.slice(1); } /** * @param {?} shortcut * @return {?} */ addNameHintAnchorMap(shortcut) { if (shortcut === null || shortcut === undefined) { return; } let /** @type {?} */ name = shortcut.shortcut; if (name === null || name === undefined) { return; } name = name.toLowerCase(); let /** @type {?} */ keysArray = this.getNameKeyControls(name); if (keysArray !== null && keysArray !== undefined) { for (let /** @type {?} */ keyCtrl of keysArray) { this.addKeyHintAnchorMap(keyCtrl, shortcut); } } } /** * @param {?} shortcut * @return {?} */ removeNameHintAnchorMap(shortcut) { if (shortcut === null || shortcut === undefined) { return; } let /** @type {?} */ name = shortcut.shortcut; if (name === null || name === undefined) { return; } name = name.toLowerCase(); let /** @type {?} */ keysArray = this.getNameKeyControls(name); if (keysArray !== null && keysArray !== undefined) { for (let /** @type {?} */ keyCtrl of keysArray) { this.removeKeyHintAnchorMap(keyCtrl, shortcut); } } } /** * @param {?} keyCtrl * @param {?} shortcut * @return {?} */ addKeyHintAnchorMap(keyCtrl, shortcut) { if (keyCtrl === null || keyCtrl === undefined) { return; } keyCtrl = keyCtrl.toLowerCase(); if (shortcut === null || shortcut === undefined) { return; } let /** @type {?} */ index = keyCtrl.indexOf('+'); if (index >= 0) { // has + let /** @type {?} */ split = keyCtrl.split("+"); for (let /** @type {?} */ sKey of split) { if (this.isModifierKey(sKey)) { // add hintAnchor let /** @type {?} */ anchors = this.keyHintAnchor[sKey]; if (anchors === null || anchors === undefined) { this.keyHintAnchor[sKey] = []; } this.keyHintAnchor[sKey].push(shortcut); } } } } /** * @param {?} keyCtrl * @param {?} shortcut * @return {?} */ removeKeyHintAnchorMap(keyCtrl, shortcut) { if (keyCtrl === null || keyCtrl === undefined) { return; } keyCtrl = keyCtrl.toLowerCase(); let /** @type {?} */ index = keyCtrl.indexOf('+'); if (index >= 0) { // has + let /** @type {?} */ split = keyCtrl.split("+"); let /** @type {?} */ handler = shortcut.handler; for (let /** @type {?} */ sKey of split) { if (this.isModifierKey(sKey)) { // add hintAnchor let /** @type {?} */ anchors = this.keyHintAnchor[sKey]; if (anchors === null || anchors === undefined) { continue; } let /** @type {?} */ toDeleteObjs = []; for (let /** @type {?} */ check of this.keyHintAnchor[sKey]) { if ((check.shortcut === shortcut.shortcut) && (check.handler.toString() === handler.toString())) { toDeleteObjs.push(check); } } // remove for (let /** @type {?} */ delObj of toDeleteObjs) { let /** @type {?} */ index = this.keyHintAnchor[sKey].indexOf(delObj); this.keyHintAnchor[sKey].splice(index, 1); } if (this.keyHintAnchor[sKey].length <= 0) { delete this.keyHintAnchor[sKey]; } } } } } /** * @param {?} name * @return {?} */ bindName(name) { if (name === null || name === undefined) { return; } name = name.toLowerCase(); let /** @type {?} */ keysArray = this.getNameKeyControls(name); if (keysArray === null || keysArray === undefined || keysArray.length <= 0) { return; } for (let /** @type {?} */ keyCtrl of keysArray) { // no bind if key already bind overide nameHandler with key if (this.keyHandler[keyCtrl] !== undefined) { continue; } if (this.nameHandler[name] !== undefined) { this.bind(keyCtrl, this.nameHandler[name]); } } } /** * @param {?} keyCtrl * @return {?} */ bindKey(keyCtrl) { if (this.keyHandler[keyCtrl] !== undefined) { this.bind(keyCtrl, this.keyHandler[keyCtrl]); } } /** * @param {?} keyCtrl * @param {?} handlers * @return {?} */ bind(keyCtrl, handlers) { if (keyCtrl === null || keyCtrl === undefined) { return; } keyCtrl = keyCtrl.toLowerCase(); key(keyCtrl, () => { if (handlers !== null && handlers !== undefined) { for (let /** @type {?} */ func of handlers) { if (typeof func === 'function') { func.call(this, this); // inject keyboard service } } } }); } /** * @param {?} name * @return {?} */ unbindName(name) { if (name === null || name === undefined) { return; } let /** @type {?} */ keysArray = this.getNameKeyControls(name); if (keysArray !== null && keysArray !== undefined) { for (let /** @type {?} */ keyCtrl of keysArray) { this.unbindKey(keyCtrl); } } } /** * @param {?} keyCtrl * @return {?} */ unbindKey(keyCtrl) { if (keyCtrl === null || keyCtrl === undefined) { return; } keyCtrl = keyCtrl.toLowerCase(); key.unbind(keyCtrl); } /** * @param {?} hintAnchorElements * @param {?} name * @param {?} hintLabel * @return {?} */ addHintName(hintAnchorElements, name, hintLabel) { if (hintAnchorElements === null || hintAnchorElements === undefined) { return; } if (name === null || name === undefined) { return; } let /** @type {?} */ keysArray = this.getNameKeyControls(name); if (keysArray !== null && keysArray !== undefined) { for (let /** @type {?} */ keyCtrl of keysArray) { this.addHintKey(hintAnchorElements, keyCtrl, hintLabel); } } } /** * @param {?} hintAnchorElements * @param {?} keyCtrl * @param {?} hintLabel * @return {?} */ addHintKey(hintAnchorElements, keyCtrl, hintLabel) { if (hintAnchorElements === null || hintAnchorElements === undefined) { return; } if (keyCtrl === null || keyCtrl === undefined) { return; } keyCtrl = keyCtrl.toLowerCase(); let /** @type {?} */ elements = []; if (Array.isArray(hintAnchorElements)) { elements = hintAnchorElements; } else { elements.push(hintAnchorElements); } let /** @type {?} */ title = hintLabel; // default if no hintLabel if (title === null || title === undefined) { title = this.capitalizeFirstLetter(keyCtrl); let /** @type {?} */ name = this.getKeyMappingName(keyCtrl); if (name !== null && name !== undefined) { title = this.capitalizeFirstLetter(name) + "</br>(" + title + ")"; } } for (let /** @type {?} */ anyElement of elements) { let /** @type {?} */ badgeHTML = '<span class="badge scService">' + title + '</span>'; if (typeof anyElement === 'string') { // jqSelector: String let /** @type {?} */ width = $(anyElement).width() - this.DEFAULT_BADGE_SPACE; let /** @type {?} */ badgeElement = $(badgeHTML); badgeElement.css({ "max-width": width }); $(anyElement).append(badgeElement); } else if (anyElement !== undefined && typeof anyElement.innerHTML === 'function') { // DOM/Native Element let /** @type {?} */ width = $(anyElement).width() - this.DEFAULT_BADGE_SPACE; let /** @type {?} */ badgeElement = $(badgeHTML); badgeElement.css({ "max-width": width }); $(anyElement).append(badgeElement); } else if (anyElement !== undefined) { // NgComp if (typeof anyElement["getElementRef"] === 'function') { let /** @type {?} */ eleRef = anyElement.getElementRef(); if (eleRef !== null && eleRef !== undefined) { let /** @type {?} */ width = $(eleRef.nativeElement).width() - this.DEFAULT_BADGE_SPACE; let /** @type {?} */ badgeElement = $(badgeHTML); badgeElement.css({ "max-width": width }); $(eleRef.nativeElement).append(badgeElement); } } } } } /** * @param {?} hintAnchorElements * @return {?} */ removeHintKey(hintAnchorElements) { if (hintAnchorElements === null || hintAnchorElements === undefined) { return; } let /** @type {?} */ elements = []; if (Array.isArray(hintAnchorElements)) { elements = hintAnchorElements; } else { elements.push(hintAnchorElements); } for (let /** @type {?} */ anyElement of elements) { if (typeof anyElement === 'string') { // jqSelector: String $(anyElement).find(".scService").addClass("fadeout"); setTimeout(() => { $(anyElement).find(".scService.fadeout").remove(); }, this.DEFAULT_FADEOUT_MS); } else if (anyElement !== undefined && typeof anyElement.innerHTML === 'function') { // DOM/Native Element $(anyElement).find(".scService").addClass("fadeout"); setTimeout(() => { $(anyElement).find(".scService.fadeout").remove(); }, this.DEFAULT_FADEOUT_MS); } else if (anyElement !== undefined) { // NgComp if (typeof anyElement["getElementRef"] === 'function') { let /** @type {?} */ eleRef = anyElement.getElementRef(); if (eleRef !== null && eleRef !== undefined) { $(eleRef.nativeElement).find(".scService").addClass("fadeout"); setTimeout(() => { $(eleRef.nativeElement).find(".scService.fadeout").remove(); }, this.DEFAULT_FADEOUT_MS); } } } } } /** * @param {?} key * @param {?} handler * @return {?} */ _addKeyHandler(key, handler) { if (key === null || key === undefined) { return; } let /** @type {?} */ handlers = this.keyHandler[key]; if (handlers === null || handlers === undefined) { handlers = []; this.keyHandler[key] = handlers; } this.keyHandler[key].push(handler); if (this.bindedKeys.indexOf(key) >= 0) { // unbind then bind this.unbindKey(key); this.bindKey(key); } else { // bind and add bindedKeys this.bindKey(key); this.bindedKeys.push(key); } } /** * @param {?} key * @return {?} */ getKeyMappingName(key) { for (let /** @type {?} */ name in this.nameMapping) { let /** @type {?} */ keyArray = this.nameMapping[name]; if (keyArray.indexOf(key) >= 0) { return name; } } return null; } /** * @param {?} name * @param {?} key * @return {?} */ setNameMapping(name, key) { let /** @type {?} */ keysArray = this.nameMapping[name]; if (keysArray === null || keysArray === undefined) { this.nameMapping[name] = []; this.nameMapping[name].push(key); } else { // if no key just push it if (this.nameMapping[name].indexOf(key) < 0) { this.nameMapping[name].push(key); } } } /** * @param {?} name * @return {?} */ getNameKeyControls(name) { return this.nameMapping[name]; } /** * @param {?} mappings * @return {?} */ mergeNameMappings(mappings) { if (mappings === null || mappings === undefined) { return; } for (let /** @type {?} */ name in mappings) { let /** @type {?} */ val = mappings[name]; if (typeof val === 'string') { this.setNameMapping(name, val); } else if (Array.isArray(val)) { for (let /** @type {?} */ innerVal of val) { this.setNameMapping(name, innerVal); } } } } /** * @return {?} */ getNameMapping() { return this.nameMapping; } /** * @return {?} */ getNames() { let /** @type {?} */ result = []; for (let /** @type {?} */ key in this.nameMapping) { result.push(key); } return result; } /** * @return {?} */ clearNameMappings() { this.nameMapping = {}; } /** * @param {?} shortcut * @return {?} */ addNameHandler(shortcut) { if (shortcut === null || shortcut === undefined) { return; } let /** @type {?} */ name = shortcut.shortcut; if (name === null || name === undefined) { return; } name = name.toLowerCase(); if (name === null || name === undefined) { return; } let /** @type {?} */ handlers = this.nameHandler[name]; if (handlers === null || handlers === undefined) { handlers = []; this.nameHandler[name] = handlers; } this.nameHandler[name].push(shortcut.handler); // add hint this.addNameHintAnchorMap(shortcut); this.bindName(name); } /** * @param {?} shortcut * @return {?} */ removeNameHandler(shortcut) { if (shortcut === null || shortcut === undefined) { return; } let /** @type {?} */ name = shortcut.shortcut; let /** @type {?} */ handler = shortcut.handler; if (name === null || name === undefined) { return; } name = name.toLowerCase(); let /** @type {?} */ handlers = this.nameHandler[name]; if (handlers === null || handlers === undefined) { return; } let /** @type {?} */ index = -1; for (let /** @type {?} */ h of handlers) { index += 1; if (h.toString() === handler.toString()) { break; } } if (index >= 0) { handlers.splice(index, 1); } // remove name hint this.removeNameHintAnchorMap(shortcut); this.unbindName(name); if (handlers.length > 0) { this.bindName(name); } } /** * @param {?} name * @return {?} */ removeAllNameHandler(name) { if (name === null || name === undefined) { return; } delete this.nameHandler[name]; this.unbindName(name); // remove binded Key let /** @type {?} */ keysArray = this.getNameKeyControls(name); if (keysArray !== null && keysArray !== undefined) { for (let /** @type {?} */ keyCtrl of keysArray) { if (keyCtrl !== null && keyCtrl !== undefined) { if (this.bindedKeys.indexOf(keyCtrl) >= 0) { this.bindedKeys.splice(this.bindedKeys.indexOf(keyCtrl), 1); } } } } } /** * @param {?} name * @return {?} */ getNameHandlers(name) { if (name === null || name === undefined) { return null; } return this.nameHandler[name]; } /** * @param {?} shortcut * @return {?} */ addKeyHandler(shortcut) { let /** @type {?} */ key = shortcut.shortcut; let /** @type {?} */ handler = shortcut.handler; let /** @type {?} */ hintAnchorElements = shortcut.hintAnchorElements; this._addKeyHandler(key, handler); // add hint this.addKeyHintAnchorMap(key, shortcut); } /** * @param {?} shortcut * @return {?} */ removeKeyHandler(shortcut) { if (shortcut === null || shortcut === undefined) { return; } let /** @type {?} */ key = shortcut.shortcut; let /** @type {?} */ handler = shortcut.handler; let /** @type {?} */ hintAnchorElements = shortcut.hintAnchorElements; if (key === null || key === undefined) { return; } let /** @type {?} */ handlers = this.keyHandler[key]; if (handlers === null || handlers === undefined) { return; } let /** @type {?} */ index = -1; for (let /** @type {?} */ h of handlers) { index += 1; if (h.toString() === handler.toString()) { break; } } if (index >= 0) { handlers.splice(index, 1); } // remove hint this.removeKeyHintAnchorMap(key, shortcut); this.unbindKey(key); if (handlers.length > 0) { this.bindKey(key); } } /** * @param {?} key * @return {?} */ removeAllKeyHandler(key) { if (key === null || key === undefined) { return; } delete this.keyHandler[key]; delete this.keyHintAnchor[key]; this.unbindKey(key); // remove binded Key if (this.bindedKeys.indexOf(key) >= 0) { this.bindedKeys.splice(this.bindedKeys.indexOf(key), 1); } } /** * @param {?} key * @return {?} */ getKeyHandlers(key) { if (key === null || key === undefined) { return null; } return this.keyHandler[key]; } } KeyboardShortcutService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ KeyboardShortcutService.ctorParameters = () => []; function KeyboardShortcutService_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ KeyboardShortcutService.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ KeyboardShortcutService.ctorParameters; /** @type {?} */ KeyboardShortcutService.prototype.DEFAULT_KEYDOWN_MS; /** @type {?} */ KeyboardShortcutService.prototype.DEFAULT_BADGE_SPACE; /** @type {?} */ KeyboardShortcutService.prototype.DEFAULT_FADEOUT_MS; /** @type {?} */ KeyboardShortcutService.prototype.nameMapping; /** @type {?} */ KeyboardShortcutService.prototype.nameHandler; /** @type {?} */ KeyboardShortcutService.prototype.keyHandler; /** @type {?} */ KeyboardShortcutService.prototype.keyHintAnchor; /** @type {?} */ KeyboardShortcutService.prototype.bindedKeys; /** @type {?} */ KeyboardShortcutService.prototype.keydownTimer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2V5Ym9hcmRTaG9ydGN1dFNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2UvS2V5Ym9hcmRTaG9ydGN1dFNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFVLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUs3RCx1QkFBTSxZQUFZLEdBQWEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3hGLHVCQUFNLGlCQUFpQixHQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUc5RCxNQUFNO0lBWUo7a0NBVnFDLElBQUk7bUNBQ0gsQ0FBQztrQ0FDRixHQUFHO1FBU3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDOztRQUdyQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQzFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNsQyxHQUFHLENBQUMsQ0FBQyxxQkFBSSxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLHFCQUFJLGFBQWEs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