UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

106 lines (105 loc) 4.64 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; import { DOM } from 'angular2/src/platform/dom/dom_adapter'; import { isPresent, StringWrapper } from 'angular2/src/facade/lang'; import { StringMapWrapper, ListWrapper } from 'angular2/src/facade/collection'; import { EventManagerPlugin } from './event_manager'; import { Injectable } from 'angular2/src/core/di'; var modifierKeys = ['alt', 'control', 'meta', 'shift']; var modifierKeyGetters = { 'alt': (event) => event.altKey, 'control': (event) => event.ctrlKey, 'meta': (event) => event.metaKey, 'shift': (event) => event.shiftKey }; let KeyEventsPlugin_1; export let KeyEventsPlugin = KeyEventsPlugin_1 = class KeyEventsPlugin extends EventManagerPlugin { constructor() { super(); } supports(eventName) { return isPresent(KeyEventsPlugin_1.parseEventName(eventName)); } addEventListener(element, eventName, handler) { var parsedEvent = KeyEventsPlugin_1.parseEventName(eventName); var outsideHandler = KeyEventsPlugin_1.eventCallback(element, StringMapWrapper.get(parsedEvent, 'fullKey'), handler, this.manager.getZone()); return this.manager.getZone().runOutsideAngular(() => { return DOM.onAndCancel(element, StringMapWrapper.get(parsedEvent, 'domEventName'), outsideHandler); }); } static parseEventName(eventName) { var parts = eventName.toLowerCase().split('.'); var domEventName = parts.shift(); if ((parts.length === 0) || !(StringWrapper.equals(domEventName, 'keydown') || StringWrapper.equals(domEventName, 'keyup'))) { return null; } var key = KeyEventsPlugin_1._normalizeKey(parts.pop()); var fullKey = ''; modifierKeys.forEach(modifierName => { if (ListWrapper.contains(parts, modifierName)) { ListWrapper.remove(parts, modifierName); fullKey += modifierName + '.'; } }); fullKey += key; if (parts.length != 0 || key.length === 0) { // returning null instead of throwing to let another plugin process the event return null; } var result = StringMapWrapper.create(); StringMapWrapper.set(result, 'domEventName', domEventName); StringMapWrapper.set(result, 'fullKey', fullKey); return result; } static getEventFullKey(event) { var fullKey = ''; var key = DOM.getEventKey(event); key = key.toLowerCase(); if (StringWrapper.equals(key, ' ')) { key = 'space'; // for readability } else if (StringWrapper.equals(key, '.')) { key = 'dot'; // because '.' is used as a separator in event names } modifierKeys.forEach(modifierName => { if (modifierName != key) { var modifierGetter = StringMapWrapper.get(modifierKeyGetters, modifierName); if (modifierGetter(event)) { fullKey += modifierName + '.'; } } }); fullKey += key; return fullKey; } static eventCallback(element, fullKey, handler, zone) { return (event) => { if (StringWrapper.equals(KeyEventsPlugin_1.getEventFullKey(event), fullKey)) { zone.runGuarded(() => handler(event)); } }; } /** @internal */ static _normalizeKey(keyName) { // TODO: switch to a StringMap if the mapping grows too much switch (keyName) { case 'esc': return 'escape'; default: return keyName; } } }; KeyEventsPlugin = KeyEventsPlugin_1 = __decorate([ Injectable(), __metadata('design:paramtypes', []) ], KeyEventsPlugin);