@ngrdt/menu 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/esm2022/index.mjs +5 -0
- package/esm2022/lib/menu/rdt-menu.component.mjs +60 -0
- package/esm2022/lib/menu-bar/rdt-menu-bar.component.mjs +51 -0
- package/esm2022/lib/menu-base/rdt-menu-base.component.mjs +369 -0
- package/esm2022/lib/menu-overlay/rdt-menu-overlay.component.mjs +569 -0
- package/esm2022/lib/models.mjs +15 -0
- package/esm2022/lib/private-models.mjs +66 -0
- package/esm2022/lib/rdt-menu.module.mjs +38 -0
- package/esm2022/lib/utils.mjs +79 -0
- package/esm2022/ngrdt-menu.mjs +5 -0
- package/fesm2022/ngrdt-menu.mjs +1214 -0
- package/fesm2022/ngrdt-menu.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/lib/menu/rdt-menu.component.d.ts +16 -0
- package/lib/menu-bar/rdt-menu-bar.component.d.ts +15 -0
- package/lib/menu-base/rdt-menu-base.component.d.ts +81 -0
- package/lib/menu-overlay/rdt-menu-overlay.component.d.ts +80 -0
- package/lib/models.d.ts +35 -0
- package/lib/private-models.d.ts +43 -0
- package/lib/rdt-menu.module.d.ts +13 -0
- package/lib/utils.d.ts +36 -0
- package/package.json +30 -0
package/README.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './lib/menu/rdt-menu.component';
|
|
2
|
+
export * from './lib/menu-bar/rdt-menu-bar.component';
|
|
3
|
+
export * from './lib/models';
|
|
4
|
+
export * from './lib/rdt-menu.module';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9AbmdyZHQvbWVudS9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9tZW51L3JkdC1tZW51LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21lbnUtYmFyL3JkdC1tZW51LWJhci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZHQtbWVudS5tb2R1bGUnO1xyXG4iXX0=
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, inject, Input, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { parseMenuItems } from '../private-models';
|
|
3
|
+
import { RdtMenuBaseComponent } from '../menu-base/rdt-menu-base.component';
|
|
4
|
+
import { RDT_BUTTON_BASE_PROVIDER, RdtButtonBase, } from '@ngrdt/button';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "../menu-overlay/rdt-menu-overlay.component";
|
|
8
|
+
export class RdtMenuComponent extends RdtMenuBaseComponent {
|
|
9
|
+
buttonClass = inject(RDT_BUTTON_BASE_PROVIDER);
|
|
10
|
+
dataTestId = '';
|
|
11
|
+
get item() {
|
|
12
|
+
return this._item;
|
|
13
|
+
}
|
|
14
|
+
set item(value) {
|
|
15
|
+
this._item = value;
|
|
16
|
+
this.allParsedItems = parseMenuItems([value], this.injector);
|
|
17
|
+
this.filterItems();
|
|
18
|
+
}
|
|
19
|
+
_item;
|
|
20
|
+
button;
|
|
21
|
+
get parsedItem() {
|
|
22
|
+
return this.parsedItems[0];
|
|
23
|
+
}
|
|
24
|
+
get buttonInputs() {
|
|
25
|
+
return {
|
|
26
|
+
'attr.role': 'menuitem',
|
|
27
|
+
'attr.aria-haspopup': 'menu',
|
|
28
|
+
'attr.aria-expanded': this.expanded === this.parsedItem,
|
|
29
|
+
tabIndex: 0,
|
|
30
|
+
dataTestId: this.dataTestId,
|
|
31
|
+
text: this.parsedItem.label,
|
|
32
|
+
icon: this.parsedItem.icon,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
36
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: RdtMenuComponent, selector: "rdt-menu", inputs: { dataTestId: "dataTestId", item: "item" }, providers: [
|
|
37
|
+
{
|
|
38
|
+
provide: RdtMenuBaseComponent,
|
|
39
|
+
useExisting: RdtMenuComponent,
|
|
40
|
+
},
|
|
41
|
+
], viewQueries: [{ propertyName: "button", first: true, predicate: RdtButtonBase, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-container\r\n #focusableItem\r\n *ngComponentOutlet=\"buttonClass; inputs: buttonInputs\"\r\n/>\r\n\r\n<rdt-menu-overlay\r\n *ngIf=\"parsedItem\"\r\n [item]=\"$any(parsedItem)\"\r\n [expanded]=\"expanded === parsedItem\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"preferredHorizontalDir\"\r\n [preferredVerticalDir]=\"preferredVerticalDir\"\r\n [level]=\"0\"\r\n/>\r\n<!-- TODO: Fix\r\n<rdt-menu-overlay\r\n *ngIf=\"parsedItem\"\r\n [anchorElement]=\"focusableItem.elRef.nativeElement\"\r\n [item]=\"$any(parsedItem)\"\r\n [expanded]=\"expanded === parsedItem\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"preferredHorizontalDir\"\r\n [preferredVerticalDir]=\"preferredVerticalDir\"\r\n [level]=\"0\"\r\n/>\r\n-->\r\n", styles: ["rdt-menu{display:block;position:relative}\n"], dependencies: [{ kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.RdtMenuOverlayComponent, selector: "rdt-menu-overlay", inputs: ["item", "level", "preferredHorizontalDir", "preferredVerticalDir", "expanded", "autofocusItem", "anchorElement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
42
|
+
}
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuComponent, decorators: [{
|
|
44
|
+
type: Component,
|
|
45
|
+
args: [{ selector: 'rdt-menu', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
|
|
46
|
+
{
|
|
47
|
+
provide: RdtMenuBaseComponent,
|
|
48
|
+
useExisting: RdtMenuComponent,
|
|
49
|
+
},
|
|
50
|
+
], template: "<ng-container\r\n #focusableItem\r\n *ngComponentOutlet=\"buttonClass; inputs: buttonInputs\"\r\n/>\r\n\r\n<rdt-menu-overlay\r\n *ngIf=\"parsedItem\"\r\n [item]=\"$any(parsedItem)\"\r\n [expanded]=\"expanded === parsedItem\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"preferredHorizontalDir\"\r\n [preferredVerticalDir]=\"preferredVerticalDir\"\r\n [level]=\"0\"\r\n/>\r\n<!-- TODO: Fix\r\n<rdt-menu-overlay\r\n *ngIf=\"parsedItem\"\r\n [anchorElement]=\"focusableItem.elRef.nativeElement\"\r\n [item]=\"$any(parsedItem)\"\r\n [expanded]=\"expanded === parsedItem\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"preferredHorizontalDir\"\r\n [preferredVerticalDir]=\"preferredVerticalDir\"\r\n [level]=\"0\"\r\n/>\r\n-->\r\n", styles: ["rdt-menu{display:block;position:relative}\n"] }]
|
|
51
|
+
}], propDecorators: { dataTestId: [{
|
|
52
|
+
type: Input
|
|
53
|
+
}], item: [{
|
|
54
|
+
type: Input,
|
|
55
|
+
args: [{ required: true }]
|
|
56
|
+
}], button: [{
|
|
57
|
+
type: ViewChild,
|
|
58
|
+
args: [RdtButtonBase, { static: true }]
|
|
59
|
+
}] } });
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L21lbnUvc3JjL2xpYi9tZW51L3JkdC1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL0BuZ3JkdC9tZW51L3NyYy9saWIvbWVudS9yZHQtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzVFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsYUFBYSxHQUVkLE1BQU0sZUFBZSxDQUFDOzs7O0FBZXZCLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxvQkFBb0I7SUFDckMsV0FBVyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBR2xFLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFFaEIsSUFDSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxLQUFrQjtRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNPLEtBQUssQ0FBZTtJQUc1QixNQUFNLENBQW9CO0lBRTFCLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTztZQUNMLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLG9CQUFvQixFQUFFLE1BQU07WUFDNUIsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsVUFBVTtZQUN2RCxRQUFRLEVBQUUsQ0FBQztZQUNYLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO1lBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7U0FDM0IsQ0FBQztJQUNKLENBQUM7dUdBbENVLGdCQUFnQjsyRkFBaEIsZ0JBQWdCLHVGQVBoQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxvQkFBb0I7Z0JBQzdCLFdBQVcsRUFBRSxnQkFBZ0I7YUFDOUI7U0FDRixrRUFtQlUsYUFBYSxxRkMvQzFCLHF5QkEwQkE7OzJGRElhLGdCQUFnQjtrQkFiNUIsU0FBUzsrQkFDRSxVQUFVLG1CQUdILHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksYUFDMUI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLG9CQUFvQjs0QkFDN0IsV0FBVyxrQkFBa0I7eUJBQzlCO3FCQUNGOzhCQU1ELFVBQVU7c0JBRFQsS0FBSztnQkFJRixJQUFJO3NCQURQLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQVl6QixNQUFNO3NCQURMLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJkdE1lbnVJdGVtIH0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgcGFyc2VNZW51SXRlbXMgfSBmcm9tICcuLi9wcml2YXRlLW1vZGVscyc7XHJcbmltcG9ydCB7IFJkdE1lbnVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vbWVudS1iYXNlL3JkdC1tZW51LWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBSRFRfQlVUVE9OX0JBU0VfUFJPVklERVIsXHJcbiAgUmR0QnV0dG9uQmFzZSxcclxuICBSZHRCdXR0b25CYXNlSW50LFxyXG59IGZyb20gJ0BuZ3JkdC9idXR0b24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyZHQtbWVudScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JkdC1tZW51LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcmR0LW1lbnUuY29tcG9uZW50LnNjc3MnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IFJkdE1lbnVCYXNlQ29tcG9uZW50LFxyXG4gICAgICB1c2VFeGlzdGluZzogUmR0TWVudUNvbXBvbmVudCxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJkdE1lbnVDb21wb25lbnQgZXh0ZW5kcyBSZHRNZW51QmFzZUNvbXBvbmVudCB7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJ1dHRvbkNsYXNzID0gaW5qZWN0KFJEVF9CVVRUT05fQkFTRV9QUk9WSURFUik7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZGF0YVRlc3RJZCA9ICcnO1xyXG5cclxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG4gIGdldCBpdGVtKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW07XHJcbiAgfVxyXG4gIHNldCBpdGVtKHZhbHVlOiBSZHRNZW51SXRlbSkge1xyXG4gICAgdGhpcy5faXRlbSA9IHZhbHVlO1xyXG4gICAgdGhpcy5hbGxQYXJzZWRJdGVtcyA9IHBhcnNlTWVudUl0ZW1zKFt2YWx1ZV0sIHRoaXMuaW5qZWN0b3IpO1xyXG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xyXG4gIH1cclxuICBwcml2YXRlIF9pdGVtITogUmR0TWVudUl0ZW07XHJcblxyXG4gIEBWaWV3Q2hpbGQoUmR0QnV0dG9uQmFzZSwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBidXR0b24hOiBSZHRCdXR0b25CYXNlSW50O1xyXG5cclxuICBnZXQgcGFyc2VkSXRlbSgpIHtcclxuICAgIHJldHVybiB0aGlzLnBhcnNlZEl0ZW1zWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJ1dHRvbklucHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICdhdHRyLnJvbGUnOiAnbWVudWl0ZW0nLFxyXG4gICAgICAnYXR0ci5hcmlhLWhhc3BvcHVwJzogJ21lbnUnLFxyXG4gICAgICAnYXR0ci5hcmlhLWV4cGFuZGVkJzogdGhpcy5leHBhbmRlZCA9PT0gdGhpcy5wYXJzZWRJdGVtLFxyXG4gICAgICB0YWJJbmRleDogMCxcclxuICAgICAgZGF0YVRlc3RJZDogdGhpcy5kYXRhVGVzdElkLFxyXG4gICAgICB0ZXh0OiB0aGlzLnBhcnNlZEl0ZW0ubGFiZWwsXHJcbiAgICAgIGljb246IHRoaXMucGFyc2VkSXRlbS5pY29uLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lclxyXG4gICNmb2N1c2FibGVJdGVtXHJcbiAgKm5nQ29tcG9uZW50T3V0bGV0PVwiYnV0dG9uQ2xhc3M7IGlucHV0czogYnV0dG9uSW5wdXRzXCJcclxuLz5cclxuXHJcbjxyZHQtbWVudS1vdmVybGF5XHJcbiAgKm5nSWY9XCJwYXJzZWRJdGVtXCJcclxuICBbaXRlbV09XCIkYW55KHBhcnNlZEl0ZW0pXCJcclxuICBbZXhwYW5kZWRdPVwiZXhwYW5kZWQgPT09IHBhcnNlZEl0ZW1cIlxyXG4gIFthdXRvZm9jdXNJdGVtXT1cImF1dG9mb2N1c1N1Ym1lbnVJdGVtXCJcclxuICBbcHJlZmVycmVkSG9yaXpvbnRhbERpcl09XCJwcmVmZXJyZWRIb3Jpem9udGFsRGlyXCJcclxuICBbcHJlZmVycmVkVmVydGljYWxEaXJdPVwicHJlZmVycmVkVmVydGljYWxEaXJcIlxyXG4gIFtsZXZlbF09XCIwXCJcclxuLz5cclxuPCEtLSBUT0RPOiBGaXhcclxuPHJkdC1tZW51LW92ZXJsYXlcclxuICAqbmdJZj1cInBhcnNlZEl0ZW1cIlxyXG4gIFthbmNob3JFbGVtZW50XT1cImZvY3VzYWJsZUl0ZW0uZWxSZWYubmF0aXZlRWxlbWVudFwiXHJcbiAgW2l0ZW1dPVwiJGFueShwYXJzZWRJdGVtKVwiXHJcbiAgW2V4cGFuZGVkXT1cImV4cGFuZGVkID09PSBwYXJzZWRJdGVtXCJcclxuICBbYXV0b2ZvY3VzSXRlbV09XCJhdXRvZm9jdXNTdWJtZW51SXRlbVwiXHJcbiAgW3ByZWZlcnJlZEhvcml6b250YWxEaXJdPVwicHJlZmVycmVkSG9yaXpvbnRhbERpclwiXHJcbiAgW3ByZWZlcnJlZFZlcnRpY2FsRGlyXT1cInByZWZlcnJlZFZlcnRpY2FsRGlyXCJcclxuICBbbGV2ZWxdPVwiMFwiXHJcbi8+XHJcbi0tPlxyXG4iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, HostBinding, Input, numberAttribute, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { RdtMenuBaseComponent } from '../menu-base/rdt-menu-base.component';
|
|
3
|
+
import { parseMenuItems } from '../private-models';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
import * as i2 from "@angular/router";
|
|
7
|
+
import * as i3 from "@ngrdt/router";
|
|
8
|
+
import * as i4 from "@ngrdt/shortcuts";
|
|
9
|
+
import * as i5 from "../menu-overlay/rdt-menu-overlay.component";
|
|
10
|
+
export class RdtMenuBarComponent extends RdtMenuBaseComponent {
|
|
11
|
+
get items() {
|
|
12
|
+
return this._items;
|
|
13
|
+
}
|
|
14
|
+
set items(value) {
|
|
15
|
+
this._items = value;
|
|
16
|
+
this.allParsedItems = parseMenuItems(value, this.injector);
|
|
17
|
+
this.filterItems();
|
|
18
|
+
}
|
|
19
|
+
_items;
|
|
20
|
+
headerHeight = 0;
|
|
21
|
+
footerHeight = 0;
|
|
22
|
+
roleAttr = 'menubar';
|
|
23
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBarComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
24
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.7", type: RdtMenuBarComponent, selector: "rdt-menu-bar", inputs: { items: "items", headerHeight: ["headerHeight", "headerHeight", numberAttribute], footerHeight: ["footerHeight", "footerHeight", numberAttribute] }, host: { properties: { "attr.role": "this.roleAttr" } }, providers: [
|
|
25
|
+
{
|
|
26
|
+
provide: RdtMenuBaseComponent,
|
|
27
|
+
useExisting: RdtMenuBarComponent,
|
|
28
|
+
},
|
|
29
|
+
], usesInheritance: true, ngImport: i0, template: "<ul class=\"menu-bar-item-container\" role=\"presentation\">\r\n <li\r\n *ngFor=\"let item of parsedItems; let i = index\"\r\n class=\"menu-bar-item\"\r\n role=\"presentation\"\r\n rdtAnyRouteActive=\"menu-bar-item-route-active\"\r\n [watchedRoutes]=\"getChildRoutes(item)\"\r\n (rdtKeyListener)=\"onKeyDown(i, $event)\"\r\n #anchorEl\r\n >\r\n <ng-container *ngIf=\"!item.routerLink && !item.externalLink\">\r\n <button\r\n #focusableItem\r\n class=\"menu-bar-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [attr.aria-haspopup]=\"item.items ? 'menu' : null\"\r\n [attr.aria-expanded]=\"item === expanded\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n {{ item.label }}\r\n\r\n <div class=\"menu-bar-item-right-content\">\r\n <span *ngIf=\"item.shortcut\" class=\"menu-item-shortcut\">\r\n {{ item.shortcut.label }}\r\n </span>\r\n <!-- TODO\r\n <vnsh-icon\r\n *ngIf=\"item.items\"\r\n name=\"expand_more\"\r\n class=\"menu-bar-item-icon\"\r\n inverted\r\n />\r\n <vnsh-icon\r\n *ngIf=\"item.icon\"\r\n [name]=\"item.icon\"\r\n class=\"menu-bar-item-icon\"\r\n inverted\r\n />\r\n -->\r\n <span class=\"menu-bar-item-icon\" *ngIf=\"item.items\">v</span>\r\n </div>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-template #linkBody let-item>\r\n {{ item.label }}\r\n\r\n <div class=\"menu-bar-item-right-content\">\r\n <span *ngIf=\"item.shortcut\" class=\"menu-item-shortcut\">\r\n {{ item.shortcut.label }}\r\n </span>\r\n <!--\r\n <vnsh-icon\r\n *ngIf=\"item.icon\"\r\n [name]=\"item.icon\"\r\n class=\"menu-bar-item-icon\"\r\n inverted\r\n />\r\n --></div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"item.routerLink\">\r\n <a\r\n #focusableItem\r\n class=\"menu-bar-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [routerLink]=\"item.routerLink\"\r\n [target]=\"item.target!\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"linkBody; context: { $implicit: item }\"\r\n />\r\n </a>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.externalLink\">\r\n <a\r\n #focusableItem\r\n class=\"menu-bar-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [href]=\"item.externalLink\"\r\n [target]=\"item.target\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"linkBody; context: { $implicit: item }\"\r\n />\r\n </a>\r\n </ng-container>\r\n\r\n <rdt-menu-overlay\r\n *ngIf=\"item.items\"\r\n [item]=\"$any(item)\"\r\n [expanded]=\"item === expanded\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"preferredHorizontalDir\"\r\n [preferredVerticalDir]=\"preferredVerticalDir\"\r\n [level]=\"0\"\r\n [anchorElement]=\"anchorEl\"\r\n />\r\n </li>\r\n</ul>\r\n", styles: [":root{--rdt-menu-min-width: 12rem;--rdt-menu-border-radius: 5px;--rdt-menu-padding-horizontal-padding: .75rem;--rdt-menu-box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, .2), 0px 9px 12px 1px rgba(0, 0, 0, .14), 0px 3px 16px 2px rgba(0, 0, 0, .12);--rdt-menu-bar-item-background: transparent;--rdt-menu-bar-item-background-expanded: rgb(64, 116, 188);--rdt-menu-bar-item-background-route-active: var( --rdt-menu-bar-item-background-expanded );--rdt-menu-bar-item-background-hover: rgb(64, 116, 188);--rdt-menu-bar-item-background-focus: rgb(64, 116, 188);--rdt-menu-bar-item-background-disabled: black;--rdt-menu-bar-item-padding: .5rem;--rdt-menu-bar-item-border-radius: 5px;--rdt-menu-item-background: var(--white);--rdt-menu-item-background-hover: rgba(var(--primary-blue-rgb), .08);--rdt-menu-item-background-expanded: rgba(var(--primary-blue-rgb), .16);--rdt-menu-item-background-route-active: var( --rdt-menu-item-background-expanded );--rdt-menu-item-background-focus: var(--rdt-menu-item-background-expanded);--rdt-menu-item-background-disabled: black;--rdt-menu-item-text-color: var(--black);--rdt-menu-item-padding: .5rem 1rem;--rdt-menu-margin-top: var(--dp3-header-height);--rdt-menu-margin-bottom: var(--dp3-footer-height)}a.menu-bar-item-content,a.menu-item-content,button.menu-bar-item-content,button.menu-item-content{white-space:nowrap;appearance:none;border:none;text-decoration:none}.menu-item-right-content,.menu-bar-item-right-content{margin-left:auto;display:flex;align-items:center}.menu-item-shortcut,.menu-bar-item-shortcut{margin-left:2rem}.menu-item-icon,.menu-bar-item-icon{margin-left:.5rem;font-size:1.2rem}.dp3-menu-base ul{margin-bottom:0}rdt-menu-bar{-webkit-user-select:none;user-select:none;pointer-events:none;padding:var(--sub-menu-padding)}.menu-bar-item-container{display:flex;list-style-type:none;margin-bottom:0;padding-left:0}.menu-bar-item{cursor:pointer;pointer-events:all;color:var(--white);margin:0 .5rem;position:relative;display:flex;align-items:center;justify-content:center}.menu-bar-item.menu-bar-item-route-active .menu-bar-item-content{background-color:var(--rdt-menu-bar-item-background-route-active)}.menu-bar-item[aria-expanded=true] .menu-bar-item-content{background-color:var(--rdt-menu-bar-item-background-expanded)}.menu-bar-item-content{display:flex;align-items:center;padding:var(--rdt-menu-bar-item-padding);color:inherit!important;border-radius:var(--rdt-menu-bar-item-border-radius);overflow:hidden;background-color:var(--rdt-menu-bar-item-background)}.menu-bar-item-content:hover{background-color:var(--rdt-menu-bar-item-background-hover)}.menu-bar-item-content.focus-visible:focus,.menu-bar-item-content:focus-visible{outline:none;background-color:var(--rdt-menu-bar-item-background-focus)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i3.RdtAnyRouteActiveDirective, selector: "[rdtAnyRouteActive]", inputs: ["anyRouteActive", "watchedRoutes", "anyRouteActiveOptions", "ariaCurrentWhenActive"] }, { kind: "directive", type: i4.RdtKeyListenerDirective, selector: "[rdtKeyListener]", outputs: ["rdtKeyListener"] }, { kind: "component", type: i5.RdtMenuOverlayComponent, selector: "rdt-menu-overlay", inputs: ["item", "level", "preferredHorizontalDir", "preferredVerticalDir", "expanded", "autofocusItem", "anchorElement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
30
|
+
}
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBarComponent, decorators: [{
|
|
32
|
+
type: Component,
|
|
33
|
+
args: [{ selector: 'rdt-menu-bar', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
|
|
34
|
+
{
|
|
35
|
+
provide: RdtMenuBaseComponent,
|
|
36
|
+
useExisting: RdtMenuBarComponent,
|
|
37
|
+
},
|
|
38
|
+
], template: "<ul class=\"menu-bar-item-container\" role=\"presentation\">\r\n <li\r\n *ngFor=\"let item of parsedItems; let i = index\"\r\n class=\"menu-bar-item\"\r\n role=\"presentation\"\r\n rdtAnyRouteActive=\"menu-bar-item-route-active\"\r\n [watchedRoutes]=\"getChildRoutes(item)\"\r\n (rdtKeyListener)=\"onKeyDown(i, $event)\"\r\n #anchorEl\r\n >\r\n <ng-container *ngIf=\"!item.routerLink && !item.externalLink\">\r\n <button\r\n #focusableItem\r\n class=\"menu-bar-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [attr.aria-haspopup]=\"item.items ? 'menu' : null\"\r\n [attr.aria-expanded]=\"item === expanded\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n {{ item.label }}\r\n\r\n <div class=\"menu-bar-item-right-content\">\r\n <span *ngIf=\"item.shortcut\" class=\"menu-item-shortcut\">\r\n {{ item.shortcut.label }}\r\n </span>\r\n <!-- TODO\r\n <vnsh-icon\r\n *ngIf=\"item.items\"\r\n name=\"expand_more\"\r\n class=\"menu-bar-item-icon\"\r\n inverted\r\n />\r\n <vnsh-icon\r\n *ngIf=\"item.icon\"\r\n [name]=\"item.icon\"\r\n class=\"menu-bar-item-icon\"\r\n inverted\r\n />\r\n -->\r\n <span class=\"menu-bar-item-icon\" *ngIf=\"item.items\">v</span>\r\n </div>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-template #linkBody let-item>\r\n {{ item.label }}\r\n\r\n <div class=\"menu-bar-item-right-content\">\r\n <span *ngIf=\"item.shortcut\" class=\"menu-item-shortcut\">\r\n {{ item.shortcut.label }}\r\n </span>\r\n <!--\r\n <vnsh-icon\r\n *ngIf=\"item.icon\"\r\n [name]=\"item.icon\"\r\n class=\"menu-bar-item-icon\"\r\n inverted\r\n />\r\n --></div>\r\n </ng-template>\r\n\r\n <ng-container *ngIf=\"item.routerLink\">\r\n <a\r\n #focusableItem\r\n class=\"menu-bar-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [routerLink]=\"item.routerLink\"\r\n [target]=\"item.target!\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"linkBody; context: { $implicit: item }\"\r\n />\r\n </a>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.externalLink\">\r\n <a\r\n #focusableItem\r\n class=\"menu-bar-item-content\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item)\"\r\n [href]=\"item.externalLink\"\r\n [target]=\"item.target\"\r\n [attr.tabindex]=\"0\"\r\n [attr.data-testid]=\"item.dataTestId\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"linkBody; context: { $implicit: item }\"\r\n />\r\n </a>\r\n </ng-container>\r\n\r\n <rdt-menu-overlay\r\n *ngIf=\"item.items\"\r\n [item]=\"$any(item)\"\r\n [expanded]=\"item === expanded\"\r\n [autofocusItem]=\"autofocusSubmenuItem\"\r\n [preferredHorizontalDir]=\"preferredHorizontalDir\"\r\n [preferredVerticalDir]=\"preferredVerticalDir\"\r\n [level]=\"0\"\r\n [anchorElement]=\"anchorEl\"\r\n />\r\n </li>\r\n</ul>\r\n", styles: [":root{--rdt-menu-min-width: 12rem;--rdt-menu-border-radius: 5px;--rdt-menu-padding-horizontal-padding: .75rem;--rdt-menu-box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, .2), 0px 9px 12px 1px rgba(0, 0, 0, .14), 0px 3px 16px 2px rgba(0, 0, 0, .12);--rdt-menu-bar-item-background: transparent;--rdt-menu-bar-item-background-expanded: rgb(64, 116, 188);--rdt-menu-bar-item-background-route-active: var( --rdt-menu-bar-item-background-expanded );--rdt-menu-bar-item-background-hover: rgb(64, 116, 188);--rdt-menu-bar-item-background-focus: rgb(64, 116, 188);--rdt-menu-bar-item-background-disabled: black;--rdt-menu-bar-item-padding: .5rem;--rdt-menu-bar-item-border-radius: 5px;--rdt-menu-item-background: var(--white);--rdt-menu-item-background-hover: rgba(var(--primary-blue-rgb), .08);--rdt-menu-item-background-expanded: rgba(var(--primary-blue-rgb), .16);--rdt-menu-item-background-route-active: var( --rdt-menu-item-background-expanded );--rdt-menu-item-background-focus: var(--rdt-menu-item-background-expanded);--rdt-menu-item-background-disabled: black;--rdt-menu-item-text-color: var(--black);--rdt-menu-item-padding: .5rem 1rem;--rdt-menu-margin-top: var(--dp3-header-height);--rdt-menu-margin-bottom: var(--dp3-footer-height)}a.menu-bar-item-content,a.menu-item-content,button.menu-bar-item-content,button.menu-item-content{white-space:nowrap;appearance:none;border:none;text-decoration:none}.menu-item-right-content,.menu-bar-item-right-content{margin-left:auto;display:flex;align-items:center}.menu-item-shortcut,.menu-bar-item-shortcut{margin-left:2rem}.menu-item-icon,.menu-bar-item-icon{margin-left:.5rem;font-size:1.2rem}.dp3-menu-base ul{margin-bottom:0}rdt-menu-bar{-webkit-user-select:none;user-select:none;pointer-events:none;padding:var(--sub-menu-padding)}.menu-bar-item-container{display:flex;list-style-type:none;margin-bottom:0;padding-left:0}.menu-bar-item{cursor:pointer;pointer-events:all;color:var(--white);margin:0 .5rem;position:relative;display:flex;align-items:center;justify-content:center}.menu-bar-item.menu-bar-item-route-active .menu-bar-item-content{background-color:var(--rdt-menu-bar-item-background-route-active)}.menu-bar-item[aria-expanded=true] .menu-bar-item-content{background-color:var(--rdt-menu-bar-item-background-expanded)}.menu-bar-item-content{display:flex;align-items:center;padding:var(--rdt-menu-bar-item-padding);color:inherit!important;border-radius:var(--rdt-menu-bar-item-border-radius);overflow:hidden;background-color:var(--rdt-menu-bar-item-background)}.menu-bar-item-content:hover{background-color:var(--rdt-menu-bar-item-background-hover)}.menu-bar-item-content.focus-visible:focus,.menu-bar-item-content:focus-visible{outline:none;background-color:var(--rdt-menu-bar-item-background-focus)}\n"] }]
|
|
39
|
+
}], propDecorators: { items: [{
|
|
40
|
+
type: Input
|
|
41
|
+
}], headerHeight: [{
|
|
42
|
+
type: Input,
|
|
43
|
+
args: [{ transform: numberAttribute }]
|
|
44
|
+
}], footerHeight: [{
|
|
45
|
+
type: Input,
|
|
46
|
+
args: [{ transform: numberAttribute }]
|
|
47
|
+
}], roleAttr: [{
|
|
48
|
+
type: HostBinding,
|
|
49
|
+
args: ['attr.role']
|
|
50
|
+
}] } });
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LW1lbnUtYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL0BuZ3JkdC9tZW51L3NyYy9saWIvbWVudS1iYXIvcmR0LW1lbnUtYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL0BuZ3JkdC9tZW51L3NyYy9saWIvbWVudS1iYXIvcmR0LW1lbnUtYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFdBQVcsRUFDWCxLQUFLLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUU1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7QUFlbkQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG9CQUFvQjtJQUMzRCxJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQW9CO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFDTyxNQUFNLENBQWlCO0lBRy9CLFlBQVksR0FBRyxDQUFDLENBQUM7SUFHakIsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUdULFFBQVEsR0FBRyxTQUFTLENBQUM7dUdBbkJsQixtQkFBbUI7MkZBQW5CLG1CQUFtQixxR0FZVixlQUFlLGtEQUdmLGVBQWUsd0VBdEJ4QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxvQkFBb0I7Z0JBQzdCLFdBQVcsRUFBRSxtQkFBbUI7YUFDakM7U0FDRixpREN2QkgsZzZHQTZHQTs7MkZEcEZhLG1CQUFtQjtrQkFiL0IsU0FBUzsrQkFDRSxjQUFjLG1CQUdQLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksYUFDMUI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLG9CQUFvQjs0QkFDN0IsV0FBVyxxQkFBcUI7eUJBQ2pDO3FCQUNGOzhCQUlHLEtBQUs7c0JBRFIsS0FBSztnQkFZTixZQUFZO3NCQURYLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUlyQyxZQUFZO3NCQURYLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUk3QixRQUFRO3NCQURmLFdBQVc7dUJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIElucHV0LFxyXG4gIG51bWJlckF0dHJpYnV0ZSxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmR0TWVudUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9tZW51LWJhc2UvcmR0LW1lbnUtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSZHRNZW51SXRlbSB9IGZyb20gJy4uL21vZGVscyc7XHJcbmltcG9ydCB7IHBhcnNlTWVudUl0ZW1zIH0gZnJvbSAnLi4vcHJpdmF0ZS1tb2RlbHMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyZHQtbWVudS1iYXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yZHQtbWVudS1iYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9yZHQtbWVudS1iYXIuY29tcG9uZW50LnNjc3MnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IFJkdE1lbnVCYXNlQ29tcG9uZW50LFxyXG4gICAgICB1c2VFeGlzdGluZzogUmR0TWVudUJhckNvbXBvbmVudCxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJkdE1lbnVCYXJDb21wb25lbnQgZXh0ZW5kcyBSZHRNZW51QmFzZUNvbXBvbmVudCB7XHJcbiAgQElucHV0KClcclxuICBnZXQgaXRlbXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XHJcbiAgfVxyXG4gIHNldCBpdGVtcyh2YWx1ZTogUmR0TWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5faXRlbXMgPSB2YWx1ZTtcclxuICAgIHRoaXMuYWxsUGFyc2VkSXRlbXMgPSBwYXJzZU1lbnVJdGVtcyh2YWx1ZSwgdGhpcy5pbmplY3Rvcik7XHJcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2l0ZW1zITogUmR0TWVudUl0ZW1bXTtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcclxuICBoZWFkZXJIZWlnaHQgPSAwO1xyXG5cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxyXG4gIGZvb3RlckhlaWdodCA9IDA7XHJcblxyXG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcclxuICBwcml2YXRlIHJvbGVBdHRyID0gJ21lbnViYXInO1xyXG59XHJcbiIsIjx1bCBjbGFzcz1cIm1lbnUtYmFyLWl0ZW0tY29udGFpbmVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gIDxsaVxyXG4gICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFyc2VkSXRlbXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgY2xhc3M9XCJtZW51LWJhci1pdGVtXCJcclxuICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxyXG4gICAgcmR0QW55Um91dGVBY3RpdmU9XCJtZW51LWJhci1pdGVtLXJvdXRlLWFjdGl2ZVwiXHJcbiAgICBbd2F0Y2hlZFJvdXRlc109XCJnZXRDaGlsZFJvdXRlcyhpdGVtKVwiXHJcbiAgICAocmR0S2V5TGlzdGVuZXIpPVwib25LZXlEb3duKGksICRldmVudClcIlxyXG4gICAgI2FuY2hvckVsXHJcbiAgPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtLnJvdXRlckxpbmsgJiYgIWl0ZW0uZXh0ZXJuYWxMaW5rXCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAjZm9jdXNhYmxlSXRlbVxyXG4gICAgICAgIGNsYXNzPVwibWVudS1iYXItaXRlbS1jb250ZW50XCJcclxuICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxyXG4gICAgICAgIChjbGljayk9XCJvbkl0ZW1DbGljayhpdGVtKVwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJpdGVtLml0ZW1zID8gJ21lbnUnIDogbnVsbFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpdGVtID09PSBleHBhbmRlZFwiXHJcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiMFwiXHJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiaXRlbS5kYXRhVGVzdElkXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtYmFyLWl0ZW0tcmlnaHQtY29udGVudFwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLnNob3J0Y3V0XCIgY2xhc3M9XCJtZW51LWl0ZW0tc2hvcnRjdXRcIj5cclxuICAgICAgICAgICAge3sgaXRlbS5zaG9ydGN1dC5sYWJlbCB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPCEtLSBUT0RPXHJcbiAgICAgICAgICA8dm5zaC1pY29uXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5pdGVtc1wiXHJcbiAgICAgICAgICAgIG5hbWU9XCJleHBhbmRfbW9yZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibWVudS1iYXItaXRlbS1pY29uXCJcclxuICAgICAgICAgICAgaW52ZXJ0ZWRcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8dm5zaC1pY29uXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCJcclxuICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5pY29uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJtZW51LWJhci1pdGVtLWljb25cIlxyXG4gICAgICAgICAgICBpbnZlcnRlZFxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAtLT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1iYXItaXRlbS1pY29uXCIgKm5nSWY9XCJpdGVtLml0ZW1zXCI+djwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2xpbmtCb2R5IGxldC1pdGVtPlxyXG4gICAgICB7eyBpdGVtLmxhYmVsIH19XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVudS1iYXItaXRlbS1yaWdodC1jb250ZW50XCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLnNob3J0Y3V0XCIgY2xhc3M9XCJtZW51LWl0ZW0tc2hvcnRjdXRcIj5cclxuICAgICAgICAgIHt7IGl0ZW0uc2hvcnRjdXQubGFiZWwgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPCEtLVxyXG4gICAgICAgIDx2bnNoLWljb25cclxuICAgICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCJcclxuICAgICAgICAgIFtuYW1lXT1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1lbnUtYmFyLWl0ZW0taWNvblwiXHJcbiAgICAgICAgICBpbnZlcnRlZFxyXG4gICAgICAgIC8+XHJcbiAgICAgIC0tPjwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5yb3V0ZXJMaW5rXCI+XHJcbiAgICAgIDxhXHJcbiAgICAgICAgI2ZvY3VzYWJsZUl0ZW1cclxuICAgICAgICBjbGFzcz1cIm1lbnUtYmFyLWl0ZW0tY29udGVudFwiXHJcbiAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcclxuICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIlxyXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiXHJcbiAgICAgICAgW3RhcmdldF09XCJpdGVtLnRhcmdldCFcIlxyXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIjBcIlxyXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIml0ZW0uZGF0YVRlc3RJZFwiXHJcbiAgICAgID5cclxuICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImxpbmtCb2R5OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2E+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5leHRlcm5hbExpbmtcIj5cclxuICAgICAgPGFcclxuICAgICAgICAjZm9jdXNhYmxlSXRlbVxyXG4gICAgICAgIGNsYXNzPVwibWVudS1iYXItaXRlbS1jb250ZW50XCJcclxuICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxyXG4gICAgICAgIChjbGljayk9XCJvbkl0ZW1DbGljayhpdGVtKVwiXHJcbiAgICAgICAgW2hyZWZdPVwiaXRlbS5leHRlcm5hbExpbmtcIlxyXG4gICAgICAgIFt0YXJnZXRdPVwiaXRlbS50YXJnZXRcIlxyXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIjBcIlxyXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIml0ZW0uZGF0YVRlc3RJZFwiXHJcbiAgICAgID5cclxuICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImxpbmtCb2R5OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2E+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8cmR0LW1lbnUtb3ZlcmxheVxyXG4gICAgICAqbmdJZj1cIml0ZW0uaXRlbXNcIlxyXG4gICAgICBbaXRlbV09XCIkYW55KGl0ZW0pXCJcclxuICAgICAgW2V4cGFuZGVkXT1cIml0ZW0gPT09IGV4cGFuZGVkXCJcclxuICAgICAgW2F1dG9mb2N1c0l0ZW1dPVwiYXV0b2ZvY3VzU3VibWVudUl0ZW1cIlxyXG4gICAgICBbcHJlZmVycmVkSG9yaXpvbnRhbERpcl09XCJwcmVmZXJyZWRIb3Jpem9udGFsRGlyXCJcclxuICAgICAgW3ByZWZlcnJlZFZlcnRpY2FsRGlyXT1cInByZWZlcnJlZFZlcnRpY2FsRGlyXCJcclxuICAgICAgW2xldmVsXT1cIjBcIlxyXG4gICAgICBbYW5jaG9yRWxlbWVudF09XCJhbmNob3JFbFwiXHJcbiAgICAvPlxyXG4gIDwvbGk+XHJcbjwvdWw+XHJcbiJdfQ==
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { booleanAttribute, ChangeDetectorRef, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, inject, Input, QueryList, Renderer2, ViewChildren, } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { Router } from '@angular/router';
|
|
5
|
+
import { animationFrameScheduler, fromEvent, Subscription, throttleTime, } from 'rxjs';
|
|
6
|
+
import { DEFAULT_MENU_HORIZONTAL_DIR, DEFAULT_MENU_VERTICAL_DIR, RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME, RDT_MENU_MARGIN_LEFT_PROPERTY_NAME, RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME, RDT_MENU_MARGIN_TOP_PROPERTY_NAME, RdtMenuShortcutMode, } from '../models';
|
|
7
|
+
import { findNextItemWithPrefix, FOCUS_VISIBLE, getChildRoutesMap, getMenuItemsShortcuts, menuItemHasChildren, menuItemHasRoute, } from '../utils';
|
|
8
|
+
import { RdtRouterService } from '@ngrdt/router';
|
|
9
|
+
import { RdtShortcutService } from '@ngrdt/shortcuts';
|
|
10
|
+
import { RdtMenuOverlayComponent } from '../menu-overlay/rdt-menu-overlay.component';
|
|
11
|
+
import { KB_CODE, RdtStringUtils, } from '@ngrdt/utils';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
export class RdtMenuBaseComponent {
|
|
14
|
+
preferredVerticalDir = DEFAULT_MENU_VERTICAL_DIR;
|
|
15
|
+
preferredHorizontalDir = DEFAULT_MENU_HORIZONTAL_DIR;
|
|
16
|
+
// Mode only matters if item has shortcut and only children, no command nor routerLink
|
|
17
|
+
// FOCUS_ITEM will put focus on item with shortcut
|
|
18
|
+
// OPEN_SUBMENU will open its submenu and put focus on the first item in it
|
|
19
|
+
// If item has command or routerLink, it will always be activated and everything closed
|
|
20
|
+
shortcutMode = RdtMenuShortcutMode.OPEN_SUBMENU;
|
|
21
|
+
closeOnFocusOut = true;
|
|
22
|
+
cd = inject(ChangeDetectorRef);
|
|
23
|
+
destroyRef = inject(DestroyRef);
|
|
24
|
+
rdtRouter = inject(RdtRouterService);
|
|
25
|
+
elRef = inject(ElementRef);
|
|
26
|
+
document = inject(DOCUMENT);
|
|
27
|
+
renderer = inject(Renderer2);
|
|
28
|
+
router = inject(Router);
|
|
29
|
+
shortcutService = inject(RdtShortcutService);
|
|
30
|
+
injector = inject(EnvironmentInjector);
|
|
31
|
+
children;
|
|
32
|
+
focusableElements;
|
|
33
|
+
classes = 'rdt-menu-base';
|
|
34
|
+
expanded = null;
|
|
35
|
+
autofocusSubmenuItem = null;
|
|
36
|
+
parsedItems;
|
|
37
|
+
get clientSize() {
|
|
38
|
+
return this._clientSize;
|
|
39
|
+
}
|
|
40
|
+
_clientSize;
|
|
41
|
+
get bodyMargin() {
|
|
42
|
+
return this._bodyMargin;
|
|
43
|
+
}
|
|
44
|
+
_bodyMargin;
|
|
45
|
+
allParsedItems;
|
|
46
|
+
childRoutesMap = new Map();
|
|
47
|
+
shortcutSub = new Subscription();
|
|
48
|
+
shortcutMap = {};
|
|
49
|
+
keyActions = {
|
|
50
|
+
[KB_CODE.ARROW.LEFT]: (index) => this.focusPrevItem(index),
|
|
51
|
+
[KB_CODE.ARROW.RIGHT]: (index) => this.focusNextItem(index),
|
|
52
|
+
[KB_CODE.ARROW.DOWN]: (index) => this.openSubmenu(index, 'first'),
|
|
53
|
+
[KB_CODE.ARROW.UP]: (index) => this.openSubmenu(index, 'last'),
|
|
54
|
+
[KB_CODE.HOME]: () => this.focusItem(0),
|
|
55
|
+
[KB_CODE.END]: () => this.focusItem(this.parsedItems.length - 1),
|
|
56
|
+
[KB_CODE.ENTER]: (index) => this.invokeItemClickByIndex(index),
|
|
57
|
+
[KB_CODE.SPACEBAR]: (index) => this.invokeItemClickByIndex(index),
|
|
58
|
+
};
|
|
59
|
+
// Returns all routes asociated with item or its subitems.
|
|
60
|
+
getChildRoutes(item) {
|
|
61
|
+
return this.childRoutesMap.get(item) ?? [];
|
|
62
|
+
}
|
|
63
|
+
ngOnInit() {
|
|
64
|
+
this.childRoutesMap = getChildRoutesMap(this.parsedItems);
|
|
65
|
+
this.rdtRouter.navigationEnd$
|
|
66
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
67
|
+
.subscribe((ev) => this.filterItems());
|
|
68
|
+
this.measure();
|
|
69
|
+
}
|
|
70
|
+
ngOnChanges(changes) {
|
|
71
|
+
if (this.children) {
|
|
72
|
+
this.recalculateChildren();
|
|
73
|
+
}
|
|
74
|
+
if ('items' in changes) {
|
|
75
|
+
this.childRoutesMap = getChildRoutesMap(this.parsedItems);
|
|
76
|
+
this.listenShortcuts();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
ngAfterViewInit() {
|
|
80
|
+
this.listenWindowResize();
|
|
81
|
+
// Not using timeout results in horizontal overflow on html element
|
|
82
|
+
setTimeout(() => {
|
|
83
|
+
this.measure();
|
|
84
|
+
this.recalculateChildren();
|
|
85
|
+
}, 50);
|
|
86
|
+
}
|
|
87
|
+
recalculateChildren() {
|
|
88
|
+
this.children.forEach((child) => {
|
|
89
|
+
child.recalculatePosition(this.preferredHorizontalDir, this.preferredVerticalDir);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
closeSubmenus(focusExpanded = false) {
|
|
93
|
+
if (focusExpanded && this.expanded) {
|
|
94
|
+
this.focusItem(this.expanded);
|
|
95
|
+
}
|
|
96
|
+
this.expanded = null;
|
|
97
|
+
this.cd.markForCheck();
|
|
98
|
+
}
|
|
99
|
+
onItemClick(item) {
|
|
100
|
+
if (menuItemHasChildren(item) && this.expanded !== item) {
|
|
101
|
+
this.autofocusSubmenuItem = null;
|
|
102
|
+
this.expanded = item;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.expanded = null;
|
|
106
|
+
}
|
|
107
|
+
if (typeof item.command === 'function') {
|
|
108
|
+
item.command();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
onKeyDown(itemIndex, event) {
|
|
112
|
+
const hasAction = event.code in this.keyActions;
|
|
113
|
+
const isLetter = RdtStringUtils.isAlphabetCharacter(event.key) ||
|
|
114
|
+
RdtStringUtils.isNumericCharacter(event.key);
|
|
115
|
+
if (hasAction || isLetter) {
|
|
116
|
+
event.preventDefault();
|
|
117
|
+
}
|
|
118
|
+
if (hasAction) {
|
|
119
|
+
event.stopPropagation();
|
|
120
|
+
}
|
|
121
|
+
if (hasAction) {
|
|
122
|
+
this.keyActions[event.code](itemIndex);
|
|
123
|
+
}
|
|
124
|
+
else if (isLetter) {
|
|
125
|
+
const next = findNextItemWithPrefix(this.parsedItems, itemIndex, event.key);
|
|
126
|
+
if (next !== null) {
|
|
127
|
+
this.focusItem(next);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
invokeItemClick(item) {
|
|
132
|
+
if (menuItemHasRoute(item) && item.routerLink) {
|
|
133
|
+
this.router.navigate(item.routerLink);
|
|
134
|
+
}
|
|
135
|
+
this.onItemClick(item);
|
|
136
|
+
this.autofocusSubmenuItem = 'first';
|
|
137
|
+
}
|
|
138
|
+
filterItems() {
|
|
139
|
+
const current = this.rdtRouter.parseAbsoluteUrl();
|
|
140
|
+
if (!current) {
|
|
141
|
+
this.parsedItems = this.allParsedItems;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
this.parsedItems = this.filterRec(this.allParsedItems, current);
|
|
145
|
+
}
|
|
146
|
+
this.cd.markForCheck();
|
|
147
|
+
}
|
|
148
|
+
filterRec(items, current) {
|
|
149
|
+
let currentParent = current.route;
|
|
150
|
+
const currentParams = current.params;
|
|
151
|
+
const filtered = items.filter((item) => {
|
|
152
|
+
if (!item.requiredParent) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
const required = item.requiredParent;
|
|
156
|
+
while (currentParent.absolutePath !== required.absolutePath) {
|
|
157
|
+
currentParent = currentParent.parent;
|
|
158
|
+
if (!currentParent) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
let requiredParent = required;
|
|
163
|
+
do {
|
|
164
|
+
const path = requiredParent.absolutePath;
|
|
165
|
+
if (path in currentParams) {
|
|
166
|
+
for (const key in requiredParent.staticParams) {
|
|
167
|
+
if (currentParams[path][key] !== requiredParent.staticParams[key]) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
requiredParent = requiredParent.parent;
|
|
173
|
+
} while (requiredParent);
|
|
174
|
+
return true;
|
|
175
|
+
});
|
|
176
|
+
return filtered.map((item) => {
|
|
177
|
+
if (item.items) {
|
|
178
|
+
return {
|
|
179
|
+
...item,
|
|
180
|
+
items: this.filterRec(item.items, current),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
return item;
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
invokeItemClickByIndex(itemIndex) {
|
|
189
|
+
const item = this.parsedItems[itemIndex];
|
|
190
|
+
if (!item) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
this.invokeItemClick(item);
|
|
194
|
+
}
|
|
195
|
+
openSubmenu(itemIndex, visibleFocus) {
|
|
196
|
+
if (itemIndex < this.parsedItems.length &&
|
|
197
|
+
menuItemHasChildren(this.parsedItems[itemIndex])) {
|
|
198
|
+
const item = this.parsedItems[itemIndex];
|
|
199
|
+
this.autofocusSubmenuItem = visibleFocus;
|
|
200
|
+
this.expanded = item;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
focusItem(item) {
|
|
204
|
+
let itemIndex;
|
|
205
|
+
if (typeof item === 'number') {
|
|
206
|
+
itemIndex = item;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
itemIndex = this.parsedItems.indexOf(item);
|
|
210
|
+
}
|
|
211
|
+
if (itemIndex >= 0 && itemIndex < this.focusableElements.length) {
|
|
212
|
+
this.blurAllFocusable();
|
|
213
|
+
this.focusFocusable(itemIndex);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
focusNextItem(itemIndex) {
|
|
217
|
+
const next = (itemIndex + 1) % this.parsedItems.length;
|
|
218
|
+
this.focusItem(next);
|
|
219
|
+
}
|
|
220
|
+
focusPrevItem(itemIndex) {
|
|
221
|
+
const prev = (itemIndex - 1 + this.parsedItems.length) % this.parsedItems.length;
|
|
222
|
+
this.focusItem(prev);
|
|
223
|
+
}
|
|
224
|
+
blurAllFocusable() {
|
|
225
|
+
this.focusableElements.forEach((el) => this.renderer.removeClass(el.nativeElement, FOCUS_VISIBLE));
|
|
226
|
+
}
|
|
227
|
+
focusFocusable(itemIndex) {
|
|
228
|
+
const elRef = this.focusableElements.get(itemIndex);
|
|
229
|
+
if (elRef) {
|
|
230
|
+
this.renderer.addClass(elRef.nativeElement, FOCUS_VISIBLE);
|
|
231
|
+
elRef.nativeElement.focus();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Closes menu if user navigates outside it using Tab.
|
|
235
|
+
checkActiveElement(event) {
|
|
236
|
+
if (this.closeOnFocusOut) {
|
|
237
|
+
const thisEl = this.elRef.nativeElement;
|
|
238
|
+
const target = event.relatedTarget;
|
|
239
|
+
if (!(target instanceof HTMLElement) || !thisEl.contains(target)) {
|
|
240
|
+
this.expanded = null;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
onDocumentClick(event) {
|
|
245
|
+
const target = event.target;
|
|
246
|
+
const elRef = this.elRef.nativeElement;
|
|
247
|
+
if (!elRef.contains(target)) {
|
|
248
|
+
this.closeSubmenus();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
measure() {
|
|
252
|
+
this.measureClientSize();
|
|
253
|
+
this.readMargin();
|
|
254
|
+
}
|
|
255
|
+
readMargin() {
|
|
256
|
+
const computedStyle = getComputedStyle(this.elRef.nativeElement);
|
|
257
|
+
const topVal = computedStyle.getPropertyValue(RDT_MENU_MARGIN_TOP_PROPERTY_NAME);
|
|
258
|
+
const bottomVal = computedStyle.getPropertyValue(RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME);
|
|
259
|
+
const leftVal = computedStyle.getPropertyValue(RDT_MENU_MARGIN_LEFT_PROPERTY_NAME);
|
|
260
|
+
const rightVal = computedStyle.getPropertyValue(RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME);
|
|
261
|
+
this._bodyMargin = {
|
|
262
|
+
top: parseInt(topVal) || 0,
|
|
263
|
+
bottom: parseInt(bottomVal) || 0,
|
|
264
|
+
left: parseInt(leftVal) || 0,
|
|
265
|
+
right: parseInt(rightVal) || 0,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
measureClientSize() {
|
|
269
|
+
this._clientSize = {
|
|
270
|
+
width: this.document.body.clientWidth,
|
|
271
|
+
height: this.document.body.clientHeight,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
listenWindowResize() {
|
|
275
|
+
fromEvent(window, 'resize')
|
|
276
|
+
.pipe(throttleTime(0, animationFrameScheduler, { trailing: true }), takeUntilDestroyed(this.destroyRef))
|
|
277
|
+
.subscribe(() => {
|
|
278
|
+
this.measure();
|
|
279
|
+
this.recalculateChildren();
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
listenShortcuts() {
|
|
283
|
+
const itemsWithShortcuts = getMenuItemsShortcuts(this.parsedItems);
|
|
284
|
+
const shortcuts = itemsWithShortcuts.map((it) => it.shortcut);
|
|
285
|
+
this.shortcutMap = this.getShortcutMap(itemsWithShortcuts);
|
|
286
|
+
this.shortcutSub.unsubscribe();
|
|
287
|
+
this.shortcutSub = this.shortcutService
|
|
288
|
+
.listen(shortcuts)
|
|
289
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
290
|
+
.subscribe((evt) => this.onShortcut(evt.shortcut));
|
|
291
|
+
}
|
|
292
|
+
getShortcutMap(itemsWithShortcuts) {
|
|
293
|
+
const shortcutMap = {};
|
|
294
|
+
itemsWithShortcuts.forEach((item) => {
|
|
295
|
+
shortcutMap[item.shortcut.hotkeysValue] = item.path;
|
|
296
|
+
});
|
|
297
|
+
return shortcutMap;
|
|
298
|
+
}
|
|
299
|
+
onShortcut(shortcut) {
|
|
300
|
+
const path = this.shortcutMap[shortcut.hotkeysValue];
|
|
301
|
+
if (!path) {
|
|
302
|
+
console.warn(`Menu shortcut ${shortcut.hotkeysValue} was detected, but there is no path associated with it.`, this.shortcutMap);
|
|
303
|
+
}
|
|
304
|
+
const last = path[path.length - 1];
|
|
305
|
+
const hasRoute = menuItemHasRoute(last);
|
|
306
|
+
const hasCommand = typeof last.command === 'function';
|
|
307
|
+
if (hasRoute || hasCommand) {
|
|
308
|
+
this.closeSubmenus(false);
|
|
309
|
+
if (hasCommand) {
|
|
310
|
+
last.command();
|
|
311
|
+
}
|
|
312
|
+
if (hasRoute) {
|
|
313
|
+
this.router.navigate(last.routerLink);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
this.activateItemRecursively(path);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
activateItemRecursively(path) {
|
|
321
|
+
const children = [...path];
|
|
322
|
+
if (this.shortcutMode === RdtMenuShortcutMode.OPEN_SUBMENU) {
|
|
323
|
+
const last = children[children.length - 1];
|
|
324
|
+
if (menuItemHasChildren(last) && last.items[0]) {
|
|
325
|
+
children.push(last.items[0]);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const thisItem = children.shift();
|
|
329
|
+
if (children.length > 0) {
|
|
330
|
+
this.expanded = thisItem;
|
|
331
|
+
const overlay = this.children.find((child) => child.item === thisItem);
|
|
332
|
+
overlay.focusItemRecursively(children);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
this.expanded = null;
|
|
336
|
+
this.focusItem(thisItem);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
340
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.7", type: RdtMenuBaseComponent, inputs: { preferredVerticalDir: "preferredVerticalDir", preferredHorizontalDir: "preferredHorizontalDir", shortcutMode: "shortcutMode", closeOnFocusOut: ["closeOnFocusOut", "closeOnFocusOut", booleanAttribute] }, host: { listeners: { "window:focusout": "checkActiveElement($event)", "document:click": "onDocumentClick($event)" }, properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "children", predicate: RdtMenuOverlayComponent, descendants: true }, { propertyName: "focusableElements", predicate: ["focusableItem"], descendants: true }], usesOnChanges: true, ngImport: i0 });
|
|
341
|
+
}
|
|
342
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBaseComponent, decorators: [{
|
|
343
|
+
type: Directive
|
|
344
|
+
}], propDecorators: { preferredVerticalDir: [{
|
|
345
|
+
type: Input
|
|
346
|
+
}], preferredHorizontalDir: [{
|
|
347
|
+
type: Input
|
|
348
|
+
}], shortcutMode: [{
|
|
349
|
+
type: Input
|
|
350
|
+
}], closeOnFocusOut: [{
|
|
351
|
+
type: Input,
|
|
352
|
+
args: [{ transform: booleanAttribute }]
|
|
353
|
+
}], children: [{
|
|
354
|
+
type: ViewChildren,
|
|
355
|
+
args: [RdtMenuOverlayComponent]
|
|
356
|
+
}], focusableElements: [{
|
|
357
|
+
type: ViewChildren,
|
|
358
|
+
args: ['focusableItem']
|
|
359
|
+
}], classes: [{
|
|
360
|
+
type: HostBinding,
|
|
361
|
+
args: ['class']
|
|
362
|
+
}], checkActiveElement: [{
|
|
363
|
+
type: HostListener,
|
|
364
|
+
args: ['window:focusout', ['$event']]
|
|
365
|
+
}], onDocumentClick: [{
|
|
366
|
+
type: HostListener,
|
|
367
|
+
args: ['document:click', ['$event']]
|
|
368
|
+
}] } });
|
|
369
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LW1lbnUtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvbWVudS9zcmMvbGliL21lbnUtYmFzZS9yZHQtbWVudS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxTQUFTLEVBQ1QsU0FBUyxFQUVULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksR0FDYixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLG9DQUFvQyxFQUNwQyxrQ0FBa0MsRUFDbEMsbUNBQW1DLEVBQ25DLGlDQUFpQyxFQUNqQyxtQkFBbUIsR0FDcEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsZ0JBQWdCLEdBR2pCLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBWSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0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bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBib29sZWFuQXR0cmlidXRlLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIERlc3Ryb3lSZWYsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRW52aXJvbm1lbnRJbmplY3RvcixcclxuICBIb3N0QmluZGluZyxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZHJlbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQge1xyXG4gIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLFxyXG4gIGZyb21FdmVudCxcclxuICBTdWJzY3JpcHRpb24sXHJcbiAgdGhyb3R0bGVUaW1lLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIERFRkFVTFRfTUVOVV9IT1JJWk9OVEFMX0RJUixcclxuICBERUZBVUxUX01FTlVfVkVSVElDQUxfRElSLFxyXG4gIFJEVF9NRU5VX01BUkdJTl9CT1RUT01fUFJPUEVSVFlfTkFNRSxcclxuICBSRFRfTUVOVV9NQVJHSU5fTEVGVF9QUk9QRVJUWV9OQU1FLFxyXG4gIFJEVF9NRU5VX01BUkdJTl9SSUdIVF9QUk9QRVJUWV9OQU1FLFxyXG4gIFJEVF9NRU5VX01BUkdJTl9UT1BfUFJPUEVSVFlfTkFNRSxcclxuICBSZHRNZW51U2hvcnRjdXRNb2RlLFxyXG59IGZyb20gJy4uL21vZGVscyc7XHJcbmltcG9ydCB7XHJcbiAgZmluZE5leHRJdGVtV2l0aFByZWZpeCxcclxuICBGT0NVU19WSVNJQkxFLFxyXG4gIGdldENoaWxkUm91dGVzTWFwLFxyXG4gIGdldE1lbnVJdGVtc1Nob3J0Y3V0cyxcclxuICBtZW51SXRlbUhhc0NoaWxkcmVuLFxyXG4gIG1lbnVJdGVtSGFzUm91dGUsXHJcbiAgUGFyc2VkUmR0TWVudUl0ZW1XaXRoU2hvcnRjdXQsXHJcbiAgU2l6ZSxcclxufSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCB7IFJkdFJvdXRlLCBSZHRSb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnQG5ncmR0L3JvdXRlcic7XHJcbmltcG9ydCB7IFJkdFNob3J0Y3V0LCBSZHRTaG9ydGN1dFNlcnZpY2UgfSBmcm9tICdAbmdyZHQvc2hvcnRjdXRzJztcclxuaW1wb3J0IHsgUmR0TWVudU92ZXJsYXlDb21wb25lbnQgfSBmcm9tICcuLi9tZW51LW92ZXJsYXkvcmR0LW1lbnUtb3ZlcmxheS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYXJzZWRSZHRNZW51SXRlbSB9IGZyb20gJy4uL3ByaXZhdGUtbW9kZWxzJztcclxuaW1wb3J0IHtcclxuICBLQl9DT0RFLFxyXG4gIFJkdEhvcml6b250YWxEaXJlY3Rpb24sXHJcbiAgUmR0U3RyaW5nVXRpbHMsXHJcbiAgUmR0VmVydGljYWxEaXJlY3Rpb24sXHJcbn0gZnJvbSAnQG5ncmR0L3V0aWxzJztcclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmR0TWVudUJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0XHJcbntcclxuICBASW5wdXQoKVxyXG4gIHByZWZlcnJlZFZlcnRpY2FsRGlyOiBSZHRWZXJ0aWNhbERpcmVjdGlvbiA9IERFRkFVTFRfTUVOVV9WRVJUSUNBTF9ESVI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHJlZmVycmVkSG9yaXpvbnRhbERpcjogUmR0SG9yaXpvbnRhbERpcmVjdGlvbiA9IERFRkFVTFRfTUVOVV9IT1JJWk9OVEFMX0RJUjtcclxuXHJcbiAgLy8gTW9kZSBvbmx5IG1hdHRlcnMgaWYgaXRlbSBoYXMgc2hvcnRjdXQgYW5kIG9ubHkgY2hpbGRyZW4sIG5vIGNvbW1hbmQgbm9yIHJvdXRlckxpbmtcclxuICAvLyBGT0NVU19JVEVNIHdpbGwgcHV0IGZvY3VzIG9uIGl0ZW0gd2l0aCBzaG9ydGN1dFxyXG4gIC8vIE9QRU5fU1VCTUVOVSB3aWxsIG9wZW4gaXRzIHN1Ym1lbnUgYW5kIHB1dCBmb2N1cyBvbiB0aGUgZmlyc3QgaXRlbSBpbiBpdFxyXG4gIC8vIElmIGl0ZW0gaGFzIGNvbW1hbmQgb3Igcm91dGVyTGluaywgaXQgd2lsbCBhbHdheXMgYmUgYWN0aXZhdGVkIGFuZCBldmVyeXRoaW5nIGNsb3NlZFxyXG4gIEBJbnB1dCgpXHJcbiAgc2hvcnRjdXRNb2RlOiAnZm9jdXMtaXRlbScgfCAnb3Blbi1zdWJtZW51JyA9XHJcbiAgICBSZHRNZW51U2hvcnRjdXRNb2RlLk9QRU5fU1VCTUVOVTtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXHJcbiAgY2xvc2VPbkZvY3VzT3V0ID0gdHJ1ZTtcclxuXHJcbiAgcmVhZG9ubHkgY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJkdFJvdXRlciA9IGluamVjdChSZHRSb3V0ZXJTZXJ2aWNlKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWxSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG9ydGN1dFNlcnZpY2UgPSBpbmplY3QoUmR0U2hvcnRjdXRTZXJ2aWNlKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoRW52aXJvbm1lbnRJbmplY3Rvcik7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oUmR0TWVudU92ZXJsYXlDb21wb25lbnQpXHJcbiAgcHJvdGVjdGVkIGNoaWxkcmVuITogUXVlcnlMaXN0PFJkdE1lbnVPdmVybGF5Q29tcG9uZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignZm9jdXNhYmxlSXRlbScpXHJcbiAgcHJvdGVjdGVkIGZvY3VzYWJsZUVsZW1lbnRzITogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXHJcbiAgY2xhc3NlcyA9ICdyZHQtbWVudS1iYXNlJztcclxuXHJcbiAgcHJvdGVjdGVkIGV4cGFuZGVkOiBQYXJzZWRSZHRNZW51SXRlbSB8IG51bGwgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBhdXRvZm9jdXNTdWJtZW51SXRlbTogJ2ZpcnN0JyB8ICdsYXN0JyB8IG51bGwgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBwYXJzZWRJdGVtcyE6IFBhcnNlZFJkdE1lbnVJdGVtW107XHJcblxyXG4gIGdldCBjbGllbnRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudFNpemU7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NsaWVudFNpemUhOiBTaXplO1xyXG5cclxuICBnZXQgYm9keU1hcmdpbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9ib2R5TWFyZ2luO1xyXG4gIH1cclxuICBwcml2YXRlIF9ib2R5TWFyZ2luIToge1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbiAgICBib3R0b206IG51bWJlcjtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxuICAgIHJpZ2h0OiBudW1iZXI7XHJcbiAgfTtcclxuXHJcbiAgcHJvdGVjdGVkIGFsbFBhcnNlZEl0ZW1zITogUGFyc2VkUmR0TWVudUl0ZW1bXTtcclxuICBwcm90ZWN0ZWQgY2hpbGRSb3V0ZXNNYXA6IE1hcDxQYXJzZWRSZHRNZW51SXRlbSwgc3RyaW5nW11bXT4gPSBuZXcgTWFwKCk7XHJcbiAgcHJvdGVjdGVkIHNob3J0Y3V0U3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHByb3RlY3RlZCBzaG9ydGN1dE1hcDogUmVjb3JkPHN0cmluZywgUGFyc2VkUmR0TWVudUl0ZW1bXT4gPSB7fTtcclxuXHJcbiAgcmVhZG9ubHkga2V5QWN0aW9ucyA9IHtcclxuICAgIFtLQl9DT0RFLkFSUk9XLkxFRlRdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5mb2N1c1ByZXZJdGVtKGluZGV4KSxcclxuICAgIFtLQl9DT0RFLkFSUk9XLlJJR0hUXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMuZm9jdXNOZXh0SXRlbShpbmRleCksXHJcbiAgICBbS0JfQ09ERS5BUlJPVy5ET1dOXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMub3BlblN1Ym1lbnUoaW5kZXgsICdmaXJzdCcpLFxyXG4gICAgW0tCX0NPREUuQVJST1cuVVBdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5vcGVuU3VibWVudShpbmRleCwgJ2xhc3QnKSxcclxuICAgIFtLQl9DT0RFLkhPTUVdOiAoKSA9PiB0aGlzLmZvY3VzSXRlbSgwKSxcclxuICAgIFtLQl9DT0RFLkVORF06ICgpID0+IHRoaXMuZm9jdXNJdGVtKHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoIC0gMSksXHJcbiAgICBbS0JfQ09ERS5FTlRFUl06IChpbmRleDogbnVtYmVyKSA9PiB0aGlzLmludm9rZUl0ZW1DbGlja0J5SW5kZXgoaW5kZXgpLFxyXG4gICAgW0tCX0NPREUuU1BBQ0VCQVJdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5pbnZva2VJdGVtQ2xpY2tCeUluZGV4KGluZGV4KSxcclxuICB9O1xyXG5cclxuICAvLyBSZXR1cm5zIGFsbCByb3V0ZXMgYXNvY2lhdGVkIHdpdGggaXRlbSBvciBpdHMgc3ViaXRlbXMuXHJcbiAgZ2V0Q2hpbGRSb3V0ZXMoaXRlbTogUGFyc2VkUmR0TWVudUl0ZW0pIHtcclxuICAgIHJldHVybiB0aGlzLmNoaWxkUm91dGVzTWFwLmdldChpdGVtKSA/PyBbXTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jaGlsZFJvdXRlc01hcCA9IGdldENoaWxkUm91dGVzTWFwKHRoaXMucGFyc2VkSXRlbXMpO1xyXG4gICAgdGhpcy5yZHRSb3V0ZXIubmF2aWdhdGlvbkVuZCRcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2KSA9PiB0aGlzLmZpbHRlckl0ZW1zKCkpO1xyXG4gICAgdGhpcy5tZWFzdXJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAodGhpcy5jaGlsZHJlbikge1xyXG4gICAgICB0aGlzLnJlY2FsY3VsYXRlQ2hpbGRyZW4oKTtcclxuICAgIH1cclxuICAgIGlmICgnaXRlbXMnIGluIGNoYW5nZXMpIHtcclxuICAgICAgdGhpcy5jaGlsZFJvdXRlc01hcCA9IGdldENoaWxkUm91dGVzTWFwKHRoaXMucGFyc2VkSXRlbXMpO1xyXG4gICAgICB0aGlzLmxpc3RlblNob3J0Y3V0cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5saXN0ZW5XaW5kb3dSZXNpemUoKTtcclxuXHJcbiAgICAvLyBOb3QgdXNpbmcgdGltZW91dCByZXN1bHRzIGluIGhvcml6b250YWwgb3ZlcmZsb3cgb24gaHRtbCBlbGVtZW50XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5tZWFzdXJlKCk7XHJcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVDaGlsZHJlbigpO1xyXG4gICAgfSwgNTApO1xyXG4gIH1cclxuXHJcbiAgcmVjYWxjdWxhdGVDaGlsZHJlbigpIHtcclxuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgY2hpbGQucmVjYWxjdWxhdGVQb3NpdGlvbihcclxuICAgICAgICB0aGlzLnByZWZlcnJlZEhvcml6b250YWxEaXIsXHJcbiAgICAgICAgdGhpcy5wcmVmZXJyZWRWZXJ0aWNhbERpclxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZVN1Ym1lbnVzKGZvY3VzRXhwYW5kZWQgPSBmYWxzZSkge1xyXG4gICAgaWYgKGZvY3VzRXhwYW5kZWQgJiYgdGhpcy5leHBhbmRlZCkge1xyXG4gICAgICB0aGlzLmZvY3VzSXRlbSh0aGlzLmV4cGFuZGVkKTtcclxuICAgIH1cclxuICAgIHRoaXMuZXhwYW5kZWQgPSBudWxsO1xyXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbkl0ZW1DbGljayhpdGVtOiBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgaWYgKG1lbnVJdGVtSGFzQ2hpbGRyZW4oaXRlbSkgJiYgdGhpcy5leHBhbmRlZCAhPT0gaXRlbSkge1xyXG4gICAgICB0aGlzLmF1dG9mb2N1c1N1Ym1lbnVJdGVtID0gbnVsbDtcclxuICAgICAgdGhpcy5leHBhbmRlZCA9IGl0ZW07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4cGFuZGVkID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgaXRlbS5jb21tYW5kID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGl0ZW0uY29tbWFuZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uS2V5RG93bihpdGVtSW5kZXg6IG51bWJlciwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGNvbnN0IGhhc0FjdGlvbiA9IGV2ZW50LmNvZGUgaW4gdGhpcy5rZXlBY3Rpb25zO1xyXG4gICAgY29uc3QgaXNMZXR0ZXIgPVxyXG4gICAgICBSZHRTdHJpbmdVdGlscy5pc0FscGhhYmV0Q2hhcmFjdGVyKGV2ZW50LmtleSkgfHxcclxuICAgICAgUmR0U3RyaW5nVXRpbHMuaXNOdW1lcmljQ2hhcmFjdGVyKGV2ZW50LmtleSk7XHJcblxyXG4gICAgaWYgKGhhc0FjdGlvbiB8fCBpc0xldHRlcikge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYXNBY3Rpb24pIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0FjdGlvbikge1xyXG4gICAgICB0aGlzLmtleUFjdGlvbnNbZXZlbnQuY29kZV0oaXRlbUluZGV4KTtcclxuICAgIH0gZWxzZSBpZiAoaXNMZXR0ZXIpIHtcclxuICAgICAgY29uc3QgbmV4dCA9IGZpbmROZXh0SXRlbVdpdGhQcmVmaXgoXHJcbiAgICAgICAgdGhpcy5wYXJzZWRJdGVtcyxcclxuICAgICAgICBpdGVtSW5kZXgsXHJcbiAgICAgICAgZXZlbnQua2V5XHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0obmV4dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbnZva2VJdGVtQ2xpY2soaXRlbTogUGFyc2VkUmR0TWVudUl0ZW0pIHtcclxuICAgIGlmIChtZW51SXRlbUhhc1JvdXRlKGl0ZW0pICYmIGl0ZW0ucm91dGVyTGluaykge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShpdGVtLnJvdXRlckxpbmspO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkl0ZW1DbGljayhpdGVtKTtcclxuICAgIHRoaXMuYXV0b2ZvY3VzU3VibWVudUl0ZW0gPSAnZmlyc3QnO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZpbHRlckl0ZW1zKCkge1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucmR0Um91dGVyLnBhcnNlQWJzb2x1dGVVcmwoKTtcclxuICAgIGlmICghY3VycmVudCkge1xyXG4gICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gdGhpcy5hbGxQYXJzZWRJdGVtcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGFyc2VkSXRlbXMgPSB0aGlzLmZpbHRlclJlYyh0aGlzLmFsbFBhcnNlZEl0ZW1zLCBjdXJyZW50KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZmlsdGVyUmVjKFxyXG4gICAgaXRlbXM6IFBhcnNlZFJkdE1lbnVJdGVtW10sXHJcbiAgICBjdXJyZW50OiB7IHJvdXRlOiBSZHRSb3V0ZTsgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH1cclxuICApOiBQYXJzZWRSZHRNZW51SXRlbVtdIHtcclxuICAgIGxldCBjdXJyZW50UGFyZW50ID0gY3VycmVudC5yb3V0ZTtcclxuICAgIGNvbnN0IGN1cnJlbnRQYXJhbXMgPSBjdXJyZW50LnBhcmFtcztcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoIWl0ZW0ucmVxdWlyZWRQYXJlbnQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCByZXF1aXJlZCA9IGl0ZW0ucmVxdWlyZWRQYXJlbnQ7XHJcbiAgICAgIHdoaWxlIChjdXJyZW50UGFyZW50LmFic29sdXRlUGF0aCAhPT0gcmVxdWlyZWQuYWJzb2x1dGVQYXRoKSB7XHJcbiAgICAgICAgY3VycmVudFBhcmVudCA9IGN1cnJlbnRQYXJlbnQucGFyZW50ITtcclxuICAgICAgICBpZiAoIWN1cnJlbnRQYXJlbnQpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHJlcXVpcmVkUGFyZW50OiBSZHRSb3V0ZSB8IG51bGwgPSByZXF1aXJlZDtcclxuICAgICAgZG8ge1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXF1aXJlZFBhcmVudC5hYnNvbHV0ZVBhdGg7XHJcbiAgICAgICAgaWYgKHBhdGggaW4gY3VycmVudFBhcmFtcykge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVxdWlyZWRQYXJlbnQuc3RhdGljUGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UGFyYW1zW3BhdGhdW2tleV0gIT09IHJlcXVpcmVkUGFyZW50LnN0YXRpY1BhcmFtc1trZXldKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcXVpcmVkUGFyZW50ID0gcmVxdWlyZWRQYXJlbnQucGFyZW50O1xyXG4gICAgICB9IHdoaWxlIChyZXF1aXJlZFBhcmVudCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5pdGVtcykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgaXRlbXM6IHRoaXMuZmlsdGVyUmVjKGl0ZW0uaXRlbXMsIGN1cnJlbnQpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGludm9rZUl0ZW1DbGlja0J5SW5kZXgoaXRlbUluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2l0ZW1JbmRleF07XHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbnZva2VJdGVtQ2xpY2soaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb3BlblN1Ym1lbnUoaXRlbUluZGV4OiBudW1iZXIsIHZpc2libGVGb2N1czogJ2ZpcnN0JyB8ICdsYXN0Jykge1xyXG4gICAgaWYgKFxyXG4gICAgICBpdGVtSW5kZXggPCB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aCAmJlxyXG4gICAgICBtZW51SXRlbUhhc0NoaWxkcmVuKHRoaXMucGFyc2VkSXRlbXNbaXRlbUluZGV4XSlcclxuICAgICkge1xyXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpdGVtSW5kZXhdO1xyXG4gICAgICB0aGlzLmF1dG9mb2N1c1N1Ym1lbnVJdGVtID0gdmlzaWJsZUZvY3VzO1xyXG4gICAgICB0aGlzLmV4cGFuZGVkID0gaXRlbTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c0l0ZW0oaXRlbTogbnVtYmVyIHwgUGFyc2VkUmR0TWVudUl0ZW0pIHtcclxuICAgIGxldCBpdGVtSW5kZXg6IG51bWJlcjtcclxuXHJcbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdudW1iZXInKSB7XHJcbiAgICAgIGl0ZW1JbmRleCA9IGl0ZW07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtSW5kZXggPSB0aGlzLnBhcnNlZEl0ZW1zLmluZGV4T2YoaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGl0ZW1JbmRleCA+PSAwICYmIGl0ZW1JbmRleCA8IHRoaXMuZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYmx1ckFsbEZvY3VzYWJsZSgpO1xyXG4gICAgICB0aGlzLmZvY3VzRm9jdXNhYmxlKGl0ZW1JbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZm9jdXNOZXh0SXRlbShpdGVtSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgbmV4dCA9IChpdGVtSW5kZXggKyAxKSAlIHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoO1xyXG4gICAgdGhpcy5mb2N1c0l0ZW0obmV4dCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZm9jdXNQcmV2SXRlbShpdGVtSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgcHJldiA9XHJcbiAgICAgIChpdGVtSW5kZXggLSAxICsgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGgpICUgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XHJcbiAgICB0aGlzLmZvY3VzSXRlbShwcmV2KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBibHVyQWxsRm9jdXNhYmxlKCkge1xyXG4gICAgdGhpcy5mb2N1c2FibGVFbGVtZW50cy5mb3JFYWNoKChlbCkgPT5cclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbC5uYXRpdmVFbGVtZW50LCBGT0NVU19WSVNJQkxFKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c0ZvY3VzYWJsZShpdGVtSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgZWxSZWYgPSB0aGlzLmZvY3VzYWJsZUVsZW1lbnRzLmdldChpdGVtSW5kZXgpO1xyXG4gICAgaWYgKGVsUmVmKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxSZWYubmF0aXZlRWxlbWVudCwgRk9DVVNfVklTSUJMRSk7XHJcbiAgICAgIGVsUmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENsb3NlcyBtZW51IGlmIHVzZXIgbmF2aWdhdGVzIG91dHNpZGUgaXQgdXNpbmcgVGFiLlxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpmb2N1c291dCcsIFsnJGV2ZW50J10pXHJcbiAgcHJvdGVjdGVkIGNoZWNrQWN0aXZlRWxlbWVudChldmVudDogRm9jdXNFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuY2xvc2VPbkZvY3VzT3V0KSB7XHJcbiAgICAgIGNvbnN0IHRoaXNFbCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcclxuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHx8ICF0aGlzRWwuY29udGFpbnModGFyZ2V0KSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgcHJvdGVjdGVkIG9uRG9jdW1lbnRDbGljayhldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBlbFJlZiA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICghZWxSZWYuY29udGFpbnModGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLmNsb3NlU3VibWVudXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtZWFzdXJlKCkge1xyXG4gICAgdGhpcy5tZWFzdXJlQ2xpZW50U2l6ZSgpO1xyXG4gICAgdGhpcy5yZWFkTWFyZ2luKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVhZE1hcmdpbigpIHtcclxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCB0b3BWYWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXHJcbiAgICAgIFJEVF9NRU5VX01BUkdJTl9UT1BfUFJPUEVSVFlfTkFNRVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGJvdHRvbVZhbCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgICAgUkRUX01FTlVfTUFSR0lOX0JPVFRPTV9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgY29uc3QgbGVmdFZhbCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgICAgUkRUX01FTlVfTUFSR0lOX0xFRlRfUFJPUEVSVFlfTkFNRVxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJpZ2h0VmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgICBSRFRfTUVOVV9NQVJHSU5fUklHSFRfUFJPUEVSVFlfTkFNRVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2JvZHlNYXJnaW4gPSB7XHJcbiAgICAgIHRvcDogcGFyc2VJbnQodG9wVmFsKSB8fCAwLFxyXG4gICAgICBib3R0b206IHBhcnNlSW50KGJvdHRvbVZhbCkgfHwgMCxcclxuICAgICAgbGVmdDogcGFyc2VJbnQobGVmdFZhbCkgfHwgMCxcclxuICAgICAgcmlnaHQ6IHBhcnNlSW50KHJpZ2h0VmFsKSB8fCAwLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtZWFzdXJlQ2xpZW50U2l6ZSgpIHtcclxuICAgIHRoaXMuX2NsaWVudFNpemUgPSB7XHJcbiAgICAgIHdpZHRoOiB0aGlzLmRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsXHJcbiAgICAgIGhlaWdodDogdGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbGlzdGVuV2luZG93UmVzaXplKCkge1xyXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRocm90dGxlVGltZSgwLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciwgeyB0cmFpbGluZzogdHJ1ZSB9KSxcclxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWVhc3VyZSgpO1xyXG4gICAgICAgIHRoaXMucmVjYWxjdWxhdGVDaGlsZHJlbigpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsaXN0ZW5TaG9ydGN1dHMoKSB7XHJcbiAgICBjb25zdCBpdGVtc1dpdGhTaG9ydGN1dHMgPSBnZXRNZW51SXRlbXNTaG9ydGN1dHModGhpcy5wYXJzZWRJdGVtcyk7XHJcbiAgICBjb25zdCBzaG9ydGN1dHM6IFJkdFNob3J0Y3V0W10gPSBpdGVtc1dpdGhTaG9ydGN1dHMubWFwKFxyXG4gICAgICAoaXQpID0+IGl0LnNob3J0Y3V0XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc2hvcnRjdXRNYXAgPSB0aGlzLmdldFNob3J0Y3V0TWFwKGl0ZW1zV2l0aFNob3J0Y3V0cyk7XHJcbiAgICB0aGlzLnNob3J0Y3V0U3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnNob3J0Y3V0U3ViID0gdGhpcy5zaG9ydGN1dFNlcnZpY2VcclxuICAgICAgLmxpc3RlbihzaG9ydGN1dHMpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKChldnQpID0+IHRoaXMub25TaG9ydGN1dChldnQuc2hvcnRjdXQpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRTaG9ydGN1dE1hcChcclxuICAgIGl0ZW1zV2l0aFNob3J0Y3V0czogUGFyc2VkUmR0TWVudUl0ZW1XaXRoU2hvcnRjdXRbXVxyXG4gICkge1xyXG4gICAgY29uc3Qgc2hvcnRjdXRNYXA6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFJkdE1lbnVJdGVtW10+ID0ge307XHJcbiAgICBpdGVtc1dpdGhTaG9ydGN1dHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBzaG9ydGN1dE1hcFtpdGVtLnNob3J0Y3V0LmhvdGtleXNWYWx1ZV0gPSBpdGVtLnBhdGg7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBzaG9ydGN1dE1hcDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblNob3J0Y3V0KHNob3J0Y3V0OiBSZHRTaG9ydGN1dCkge1xyXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuc2hvcnRjdXRNYXBbc2hvcnRjdXQuaG90a2V5c1ZhbHVlXTtcclxuICAgIGlmICghcGF0aCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYE1lbnUgc2hvcnRjdXQgJHtzaG9ydGN1dC5ob3RrZXlzVmFsdWV9IHdhcyBkZXRlY3RlZCwgYnV0IHRoZXJlIGlzIG5vIHBhdGggYXNzb2NpYXRlZCB3aXRoIGl0LmAsXHJcbiAgICAgICAgdGhpcy5zaG9ydGN1dE1hcFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGFzdCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcclxuICAgIGNvbnN0IGhhc1JvdXRlID0gbWVudUl0ZW1IYXNSb3V0ZShsYXN0KTtcclxuICAgIGNvbnN0IGhhc0NvbW1hbmQgPSB0eXBlb2YgbGFzdC5jb21tYW5kID09PSAnZnVuY3Rpb24nO1xyXG4gICAgaWYgKGhhc1JvdXRlIHx8IGhhc0NvbW1hbmQpIHtcclxuICAgICAgdGhpcy5jbG9zZVN1Ym1lbnVzKGZhbHNlKTtcclxuICAgICAgaWYgKGhhc0NvbW1hbmQpIHtcclxuICAgICAgICBsYXN0LmNvbW1hbmQhKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGhhc1JvdXRlKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUobGFzdC5yb3V0ZXJMaW5rISk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aXZhdGVJdGVtUmVjdXJzaXZlbHkocGF0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWN0aXZhdGVJdGVtUmVjdXJzaXZlbHkocGF0aDogUGFyc2VkUmR0TWVudUl0ZW1bXSkge1xyXG4gICAgY29uc3QgY2hpbGRyZW4gPSBbLi4ucGF0aF07XHJcblxyXG4gICAgaWYgKHRoaXMuc2hvcnRjdXRNb2RlID09PSBSZHRNZW51U2hvcnRjdXRNb2RlLk9QRU5fU1VCTUVOVSkge1xyXG4gICAgICBjb25zdCBsYXN0ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07XHJcbiAgICAgIGlmIChtZW51SXRlbUhhc0NoaWxkcmVuKGxhc3QpICYmIGxhc3QuaXRlbXNbMF0pIHtcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKGxhc3QuaXRlbXNbMF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGhpc0l0ZW0gPSBjaGlsZHJlbi5zaGlmdCgpITtcclxuXHJcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmV4cGFuZGVkID0gdGhpc0l0ZW07XHJcbiAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLmNoaWxkcmVuLmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5pdGVtID09PSB0aGlzSXRlbSk7XHJcbiAgICAgIG92ZXJsYXkhLmZvY3VzSXRlbVJlY3Vyc2l2ZWx5KGNoaWxkcmVuKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSBudWxsO1xyXG4gICAgICB0aGlzLmZvY3VzSXRlbSh0aGlzSXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|