/*! * @license * Copyright 2019 Alfresco Software, Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Component, ViewEncapsulation, HostListener, AfterViewInit, Optional, Inject, QueryList, ViewChildren } from '@angular/core'; import { trigger } from '@angular/animations'; import { DOWN_ARROW, UP_ARROW } from '@angular/cdk/keycodes'; import { FocusKeyManager } from '@angular/cdk/a11y'; import { MatMenuItem } from '@angular/material/menu'; import { ContextMenuOverlayRef } from './context-menu-overlay'; import { contextMenuAnimation } from './animations'; import { CONTEXT_MENU_DATA } from './context-menu.tokens'; @Component({ selector: 'adf-context-menu', template: `
`, host: { role: 'menu', class: 'adf-context-menu' }, encapsulation: ViewEncapsulation.None, animations: [ trigger('panelAnimation', contextMenuAnimation) ] }) export class ContextMenuListComponent implements AfterViewInit { private keyManager: FocusKeyManager; @ViewChildren(MatMenuItem) items: QueryList; links: any[]; @HostListener('document:keydown.Escape', ['$event']) handleKeydownEscape(event: KeyboardEvent) { if (event) { this.contextMenuOverlayRef.close(); } } @HostListener('document:keydown', ['$event']) handleKeydownEvent(event: KeyboardEvent) { if (event) { const keyCode = event.keyCode; if (keyCode === UP_ARROW || keyCode === DOWN_ARROW) { this.keyManager.onKeydown(event); } } } constructor( @Inject(ContextMenuOverlayRef) private contextMenuOverlayRef: ContextMenuOverlayRef, @Optional() @Inject(CONTEXT_MENU_DATA) private data: any ) { this.links = this.data; } onMenuItemClick(event: Event, menuItem: any) { if (menuItem && menuItem.model && menuItem.model.disabled) { event.preventDefault(); event.stopImmediatePropagation(); return; } menuItem.subject.next(menuItem); this.contextMenuOverlayRef.close(); } ngAfterViewInit() { this.keyManager = new FocusKeyManager(this.items); this.keyManager.setFirstItemActive(); } }