UNPKG

@busy-web/ember-date-time

Version:

Date time & and range picker for ember addon

154 lines (137 loc) 4.76 kB
/** * @module Utils * */ import $ from 'jquery'; import { get } from '@ember/object'; import { isNone } from '@ember/utils'; import { assert } from '@ember/debug'; /** * Key map referece * */ const KEY_MAP = { '8': 'Backspace', '9': 'Tab', '12': 'Clear', '13': 'Enter', '16': 'Shift', '17': 'Control', '18': 'Alt', '19': 'Break', '20': 'CapsLock', '27': 'Escape', '32': 'Space', '33': 'PageUp', '34': 'PageDown', '35': 'End', '36': 'Home', '37': 'ArrowLeft', '38': 'ArrowUp', '39': 'ArrowRight', '40': 'ArrowDown', '45': 'Insert', '46': 'Delete', '48': 0, '49': 1, '50': 2, '51': 3, '52': 4, '53': 5, '54': 6, '55': 7, '56': 8, '57': 9, '96': 0, '97': 1, '98': 2, '99': 3, '100': 4, '101': 5, '102': 6, '103': 7, '104': 8, '105': 9, '65': 'a', '66': 'b', '67': 'c', '68': 'd', '69': 'e', '70': 'f', '71': 'g', '72': 'h', '73': 'i', '74': 'j', '75': 'k', '76': 'l', '77': 'm', '78': 'n', '79': 'o', '80': 'p', '81': 'q', '82': 'r', '83': 's', '84': 't', '85': 'u', '86': 'v', '87': 'w', '88': 'x', '89': 'y', '90': 'z', '91': 'Meta', '92': 'Meta', '93': 'Meta', '106': '*', '107': '+', '109': '-', '110': '.', '111': '/', '112': 'f1', '113': 'f2', '114': 'f3', '115': 'f4', '116': 'f5', '117': 'f6', '118': 'f7', '119': 'f8', '120': 'f9', '121': 'f10', '122': 'f11', '123': 'f12', '144': 'NumLock', '145': 'ScrollLock', '186': ';', '187': '=', '188': ',', '189': '-', '190': '.', '191': '/', '192': '`', '219': '[', '220': '\\', '221': ']', '222': "'", '229': 'Composition', }; const SHIFT_KEY_MAP = { '19': 'Pause', '48': ')', '49': '!', '50': '@', '51': '#', '52': '$', '53': '%', '54': '^', '55': '&', '56': '*', '57': '(', '96': 0, '97': 1, '98': 2, '99': 3, '100': 4, '101': 5, '102': 6, '103': 7, '104': 8, '105': 9, '65': 'A', '66': 'B', '67': 'C', '68': 'D', '69': 'E', '70': 'F', '71': 'G', '72': 'H', '73': 'I', '74': 'J', '75': 'K', '76': 'L', '77': 'M', '78': 'N', '79': 'O', '80': 'P', '81': 'Q', '82': 'R', '83': 'S', '84': 'T', '85': 'U', '86': 'V', '87': 'W', '88': 'X', '89': 'Y', '90': 'Z', '186': ':', '187': '+', '188': '<', '189': '_', '190': '>', '191': '?', '192': '~', '219': '{', '220': '|', '221': '}', '222': '"', }; const TYPE_MAP = { modifier: /^(Control|Shift|Alt|Meta)$/, action: /^(Enter|Escape|Backspace|Tab)$/, arrow: /^(ArrowLeft|ArrowRight|ArrowUp|ArrowDown)$/, letter: /^[A-Za-z]$/, number: /^[0-9]$/, qoute: /^['"`]$/, puctuation: /^[.,;:?!]/, symbol: /^[@&#$%(){}[\]\\|~_]$/, math: /^[+\-*/^><=]$/, composition: /^Composition$/ }; function getKeyCode(event) { return event.keyCode; } /** * Takse a event and returns a readable key event for main key events like enter, tab arrow keys * * @public * @method keyCodeTranslator * @param event {object} * @return {string} */ function translate(event) { let key = getKeyCode(event); let name = get(KEY_MAP, `${key}`) if (event.shiftKey && !isNone(get(SHIFT_KEY_MAP, `${key}`))) { name = get(SHIFT_KEY_MAP, `${key}`); } if (isNone(name)) { name = -1; window.console.log('Key not defined', key, event); } return name; } function shouldThrottleKey(event, time=50) { let timeout = $.data(event.target, 'timeout'); if (!timeout) { $.data(event.target, 'timeout', true); window.setTimeout(() => { $.data(event.target, 'timeout', false); }, time); return false; } else { return true; } } function isAllowed(key, disable=[]) { for (let i=0; i<disable.length; i++) { if (disable[i] && disable[i].test(`${key}`)) { return false; } } return true; } function _preventDefault(event) { return function() { event.returnValue = false; event.stopPropagation(); if(event.preventDefault) { event.preventDefault(); } return false; } } function getTypeForKey(key) { for (let i in TYPE_MAP) { if (TYPE_MAP[i].test(`${key}`)) { return i; } } return null; } export default function keyEvent(options={}) { assert('options.event is required', typeof options.event === 'object' && options.event.target !== undefined); let keyCode = getKeyCode(options.event); let keyName = translate(options.event); let type = getTypeForKey(keyName); let disable = []; if (options.disable && options.disable.length) { options.disable.forEach(item => { if (TYPE_MAP[item]) { disable.push(TYPE_MAP[item]); } }); } let allowed = isAllowed(keyName, disable); let preventDefault = _preventDefault(options.event); let throttle = false; if (allowed) { if (shouldThrottleKey(options.event, options.throttle || 50)) { throttle = true; } } return { keyName, keyCode, type, allowed, preventDefault, throttle }; }