carbon-components-angular
Version:
Next generation components
140 lines • 15.8 kB
JavaScript
import { Component, HostListener, Input, HostBinding } from "@angular/core";
import * as i0 from "@angular/core";
/**
* Get started with importing the module:
*
* ```typescript
* import { ContextMenuModule } from 'carbon-components-angular';
* ```
*
* [See demo](../../?path=/story/components-context-menu--basic)
*/
export class ContextMenuComponent {
constructor(elementRef) {
this.elementRef = elementRef;
this.open = false;
this.position = {
left: 0,
top: 0
};
this.size = "lg";
this.role = "menu";
this.tabindex = "-1";
/**
* @todo - convert to getter in v6, should resolve expression has changed
* after switching to on OnPush Change Detection Strategy
*/
this.iconClass = false;
}
get hostClass() {
const open = this.open ? "cds--menu--open cds--menu--shown" : "";
return `cds--menu cds--autoalign cds--menu--${this.size} ${open}`;
}
get leftPosition() { return this.position.left; }
get topPosition() { return this.position.top; }
ngOnChanges(changes) {
if (changes.open && changes.open.currentValue) {
this.focusMenu();
}
}
ngAfterViewInit() {
setTimeout(() => {
const nativeElement = this.elementRef.nativeElement;
if (nativeElement) {
this.iconClass = !!nativeElement
.querySelector(".cds--menu-item .cds--menu-item__icon svg");
}
});
}
focusMenu() {
// wait until the next tick to let the DOM settle before changing the focus
setTimeout(() => {
const list = this.elementRef.nativeElement;
const firstOption = list.querySelector(".cds--menu-item");
firstOption.focus();
});
}
handleNavigation(event) {
const list = this.elementRef.nativeElement;
const subMenus = Array.from(list.querySelectorAll("cds-context-menu[role=menu]"));
const menuItems = Array.from(list.querySelectorAll(".cds--menu-item"))
.filter(menuItem => !subMenus.some(subMenu => subMenu.contains(menuItem)));
const currentIndex = menuItems.findIndex(menuItem => parseInt(menuItem.getAttribute("tabindex"), 10) === 0);
const currentMenuItem = menuItems[currentIndex];
switch (event.key) {
case "ArrowDown": {
if (document.activeElement === list) {
menuItems[0].focus();
}
else {
if (currentIndex !== -1 && currentIndex < menuItems.length - 1) {
menuItems[currentIndex + 1].focus();
}
}
break;
}
case "ArrowUp": {
if (document.activeElement === list) {
menuItems[menuItems.length - 1].focus();
}
else {
if (currentIndex !== -1 && currentIndex > 0) {
menuItems[currentIndex - 1].focus();
}
}
break;
}
case "ArrowRight": {
if (currentIndex !== -1 && subMenus.some(subMenu => currentMenuItem.contains(subMenu))) {
currentMenuItem.click();
}
break;
}
case "ArrowLeft": {
const parent = currentMenuItem.parentElement.closest(".cds--menu-item, .cds--menu-item");
if (parent) {
parent.focus();
}
break;
}
}
}
}
ContextMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContextMenuComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
ContextMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ContextMenuComponent, selector: "cds-menu, cds-context-menu, ibm-context-menu", inputs: { open: "open", position: "position", size: "size" }, host: { listeners: { "keydown": "handleNavigation($event)" }, properties: { "class": "this.hostClass", "attr.role": "this.role", "attr.tabindex": "this.tabindex", "style.left.px": "this.leftPosition", "style.top.px": "this.topPosition", "class.cds--menu--with-icons": "this.iconClass" } }, usesOnChanges: true, ngImport: i0, template: `
<ng-content></ng-content>
`, isInline: true, styles: [":host{display:block}\n"] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContextMenuComponent, decorators: [{
type: Component,
args: [{ selector: "cds-menu, cds-context-menu, ibm-context-menu", template: `
<ng-content></ng-content>
`, styles: [":host{display:block}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { open: [{
type: Input
}], position: [{
type: Input
}], size: [{
type: Input
}], hostClass: [{
type: HostBinding,
args: ["class"]
}], role: [{
type: HostBinding,
args: ["attr.role"]
}], tabindex: [{
type: HostBinding,
args: ["attr.tabindex"]
}], leftPosition: [{
type: HostBinding,
args: ["style.left.px"]
}], topPosition: [{
type: HostBinding,
args: ["style.top.px"]
}], iconClass: [{
type: HostBinding,
args: ["class.cds--menu--with-icons"]
}], handleNavigation: [{
type: HostListener,
args: ["keydown", ["$event"]]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250ZXh0LW1lbnUvY29udGV4dC1tZW51LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsV0FBVyxFQUdYLE1BQU0sZUFBZSxDQUFDOztBQUV2Qjs7Ozs7Ozs7R0FRRztBQVlILE1BQU0sT0FBTyxvQkFBb0I7SUF3QmhDLFlBQXNCLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF2Qm5DLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixhQUFRLEdBQUc7WUFDbkIsSUFBSSxFQUFFLENBQUM7WUFDUCxHQUFHLEVBQUUsQ0FBQztTQUNOLENBQUM7UUFDTyxTQUFJLEdBQXVCLElBQUksQ0FBQztRQU9mLFNBQUksR0FBRyxNQUFNLENBQUM7UUFDVixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBSTlDOzs7V0FHRztRQUN5QyxjQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWQsQ0FBQztJQWhCakQsSUFBMEIsU0FBUztRQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE9BQU8sdUNBQXVDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUlELElBQWtDLFlBQVksS0FBSyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvRSxJQUFpQyxXQUFXLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFVNUUsV0FBVyxDQUFDLE9BQXNCO1FBQ2pDLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFlB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LGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDeEI7Z0JBQ0QsTUFBTTthQUNOO1lBQ0QsS0FBSyxXQUFXLENBQUMsQ0FBQztnQkFDakIsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQWdCLENBQUM7Z0JBQ3hHLElBQUksTUFBTSxFQUFFO29CQUNYLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDZjtnQkFDRCxNQUFNO2FBQ047U0FDRDtJQUNGLENBQUM7O2lIQWpHVyxvQkFBb0I7cUdBQXBCLG9CQUFvQix5Y0FUdEI7O0VBRVQ7MkZBT1csb0JBQW9CO2tCQVhoQyxTQUFTOytCQUNDLDhDQUE4QyxZQUM5Qzs7RUFFVDtpR0FRUSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRW9CLFNBQVM7c0JBQWxDLFdBQVc7dUJBQUMsT0FBTztnQkFLTSxJQUFJO3NCQUE3QixXQUFXO3VCQUFDLFdBQVc7Z0JBQ00sUUFBUTtzQkFBckMsV0FBVzt1QkFBQyxlQUFlO2dCQUNNLFlBQVk7c0JBQTdDLFdBQVc7dUJBQUMsZUFBZTtnQkFDSyxXQUFXO3NCQUEzQyxXQUFXO3VCQUFDLGNBQWM7Z0JBTWlCLFNBQVM7c0JBQXBELFdBQVc7dUJBQUMsNkJBQTZCO2dCQThCMUMsZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRFbGVtZW50UmVmLFxuXHRIb3N0TGlzdGVuZXIsXG5cdElucHV0LFxuXHRTaW1wbGVDaGFuZ2VzLFxuXHRPbkNoYW5nZXMsXG5cdEhvc3RCaW5kaW5nLFxuXHRBZnRlclZpZXdJbml0LFxuXHRDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG4vKipcbiAqIEdldCBzdGFydGVkIHdpdGggaW1wb3J0aW5nIHRoZSBtb2R1bGU6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ29udGV4dE1lbnVNb2R1bGUgfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbiAqIGBgYFxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtY29udGV4dC1tZW51LS1iYXNpYylcbiAqL1xuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiBcImNkcy1tZW51LCBjZHMtY29udGV4dC1tZW51LCBpYm0tY29udGV4dC1tZW51XCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0XHQ8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cdGAsXG5cdHN0eWxlczogW2Bcblx0XHQ6aG9zdCB7XG5cdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHR9XG5cdGBdXG59KVxuZXhwb3J0IGNsYXNzIENvbnRleHRNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcblx0QElucHV0KCkgb3BlbiA9IGZhbHNlO1xuXHRASW5wdXQoKSBwb3NpdGlvbiA9IHtcblx0XHRsZWZ0OiAwLFxuXHRcdHRvcDogMFxuXHR9O1xuXHRASW5wdXQoKSBzaXplOiBcInNtXCIgfCBcIm1kXCIgfCBcImxnXCIgPSBcImxnXCI7XG5cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3NcIikgZ2V0IGhvc3RDbGFzcygpIHtcblx0XHRjb25zdCBvcGVuID0gdGhpcy5vcGVuID8gXCJjZHMtLW1lbnUtLW9wZW4gY2RzLS1tZW51LS1zaG93blwiIDogXCJcIjtcblx0XHRyZXR1cm4gYGNkcy0tbWVudSBjZHMtLWF1dG9hbGlnbiBjZHMtLW1lbnUtLSR7dGhpcy5zaXplfSAke29wZW59YDtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImF0dHIucm9sZVwiKSByb2xlID0gXCJtZW51XCI7XG5cdEBIb3N0QmluZGluZyhcImF0dHIudGFiaW5kZXhcIikgdGFiaW5kZXggPSBcIi0xXCI7XG5cdEBIb3N0QmluZGluZyhcInN0eWxlLmxlZnQucHhcIikgZ2V0IGxlZnRQb3NpdGlvbigpIHsgcmV0dXJuIHRoaXMucG9zaXRpb24ubGVmdDsgfVxuXHRASG9zdEJpbmRpbmcoXCJzdHlsZS50b3AucHhcIikgZ2V0IHRvcFBvc2l0aW9uKCkgeyByZXR1cm4gdGhpcy5wb3NpdGlvbi50b3A7IH1cblxuXHQvKipcblx0ICogQHRvZG8gLSBjb252ZXJ0IHRvIGdldHRlciBpbiB2Niwgc2hvdWxkIHJlc29sdmUgZXhwcmVzc2lvbiBoYXMgY2hhbmdlZFxuXHQgKiBhZnRlciBzd2l0Y2hpbmcgdG8gb24gT25QdXNoIENoYW5nZSBEZXRlY3Rpb24gU3RyYXRlZ3lcblx0ICovXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tbWVudS0td2l0aC1pY29uc1wiKSBpY29uQ2xhc3MgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XG5cblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXHRcdGlmIChjaGFuZ2VzLm9wZW4gJiYgY2hhbmdlcy5vcGVuLmN1cnJlbnRWYWx1ZSkge1xuXHRcdFx0dGhpcy5mb2N1c01lbnUoKTtcblx0XHR9XG5cdH1cblxuXHRuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRpZiAobmF0aXZlRWxlbWVudCkge1xuXHRcdFx0XHR0aGlzLmljb25DbGFzcyA9ICEhbmF0aXZlRWxlbWVudFxuXHRcdFx0XHRcdC5xdWVyeVNlbGVjdG9yKFwiLmNkcy0tbWVudS1pdGVtIC5jZHMtLW1lbnUtaXRlbV9faWNvbiBzdmdcIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRmb2N1c01lbnUoKSB7XG5cdFx0Ly8gd2FpdCB1bnRpbCB0aGUgbmV4dCB0aWNrIHRvIGxldCB0aGUgRE9NIHNldHRsZSBiZWZvcmUgY2hhbmdpbmcgdGhlIGZvY3VzXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRjb25zdCBsaXN0OiBIVE1MRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXHRcdFx0Y29uc3QgZmlyc3RPcHRpb24gPSBsaXN0LnF1ZXJ5U2VsZWN0b3IoXCIuY2RzLS1tZW51LWl0ZW1cIikgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0XHRmaXJzdE9wdGlvbi5mb2N1cygpO1xuXHRcdH0pO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcImtleWRvd25cIiwgW1wiJGV2ZW50XCJdKVxuXHRoYW5kbGVOYXZpZ2F0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG5cdFx0Y29uc3QgbGlzdDogSFRNTEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblx0XHRjb25zdCBzdWJNZW51czogSFRNTEVsZW1lbnRbXSA9IEFycmF5LmZyb20obGlzdC5xdWVyeVNlbGVjdG9yQWxsKFwiY2RzLWNvbnRleHQtbWVudVtyb2xlPW1lbnVdXCIpKTtcblx0XHRjb25zdCBtZW51SXRlbXM6IEhUTUxFbGVtZW50W10gPSAoXG5cdFx0XHRBcnJheS5mcm9tKGxpc3QucXVlcnlTZWxlY3RvckFsbChcIi5jZHMtLW1lbnUtaXRlbVwiKSkgYXMgSFRNTEVsZW1lbnRbXSlcblx0XHRcdFx0LmZpbHRlcihtZW51SXRlbSA9PiAhc3ViTWVudXMuc29tZShzdWJNZW51ID0+IHN1Yk1lbnUuY29udGFpbnMobWVudUl0ZW0pKVxuXHRcdCk7XG5cdFx0Y29uc3QgY3VycmVudEluZGV4ID0gbWVudUl0ZW1zLmZpbmRJbmRleChtZW51SXRlbSA9PiBwYXJzZUludChtZW51SXRlbS5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSwgMTApID09PSAwKTtcblx0XHRjb25zdCBjdXJyZW50TWVudUl0ZW0gPSBtZW51SXRlbXNbY3VycmVudEluZGV4XTtcblxuXHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XG5cdFx0XHRjYXNlIFwiQXJyb3dEb3duXCI6IHtcblx0XHRcdFx0aWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGxpc3QpIHtcblx0XHRcdFx0XHRtZW51SXRlbXNbMF0uZm9jdXMoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoY3VycmVudEluZGV4ICE9PSAtMSAmJiBjdXJyZW50SW5kZXggPCBtZW51SXRlbXMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0bWVudUl0ZW1zW2N1cnJlbnRJbmRleCArIDFdLmZvY3VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcIkFycm93VXBcIjoge1xuXHRcdFx0XHRpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gbGlzdCkge1xuXHRcdFx0XHRcdG1lbnVJdGVtc1ttZW51SXRlbXMubGVuZ3RoIC0gMV0uZm9jdXMoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoY3VycmVudEluZGV4ICE9PSAtMSAmJiBjdXJyZW50SW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0XHRtZW51SXRlbXNbY3VycmVudEluZGV4IC0gMV0uZm9jdXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiQXJyb3dSaWdodFwiOiB7XG5cdFx0XHRcdGlmIChjdXJyZW50SW5kZXggIT09IC0xICYmIHN1Yk1lbnVzLnNvbWUoc3ViTWVudSA9PiBjdXJyZW50TWVudUl0ZW0uY29udGFpbnMoc3ViTWVudSkpKSB7XG5cdFx0XHRcdFx0Y3VycmVudE1lbnVJdGVtLmNsaWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiQXJyb3dMZWZ0XCI6IHtcblx0XHRcdFx0Y29uc3QgcGFyZW50ID0gY3VycmVudE1lbnVJdGVtLnBhcmVudEVsZW1lbnQuY2xvc2VzdChcIi5jZHMtLW1lbnUtaXRlbSwgLmNkcy0tbWVudS1pdGVtXCIpIGFzIEhUTUxFbGVtZW50O1xuXHRcdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdFx0cGFyZW50LmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG4iXX0=