@fundamental-ngx/core 0.36.3-rc.16 → 0.36.3-rc.17
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/esm2020/menu/menu-mobile/menu-mobile.component.mjs +38 -9
- package/fesm2015/fundamental-ngx-core-menu.mjs +38 -8
- package/fesm2015/fundamental-ngx-core-menu.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-menu.mjs +36 -7
- package/fesm2020/fundamental-ngx-core-menu.mjs.map +1 -1
- package/fundamental-ngx-core-v0.36.3-rc.17.tgz +0 -0
- package/menu/menu-mobile/menu-mobile.component.d.ts +12 -4
- package/package.json +2 -2
- package/fundamental-ngx-core-v0.36.3-rc.16.tgz +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Optional, TemplateRef, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
2
|
-
import { DialogService } from '@fundamental-ngx/core/dialog';
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, NgZone, Optional, TemplateRef, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { DialogBodyComponent, DialogService } from '@fundamental-ngx/core/dialog';
|
|
3
3
|
import { of } from 'rxjs';
|
|
4
4
|
import { MenuService } from '../services/menu.service';
|
|
5
|
-
import { map, startWith, takeUntil } from 'rxjs/operators';
|
|
5
|
+
import { map, startWith, take, takeUntil } from 'rxjs/operators';
|
|
6
6
|
import { RtlService } from '@fundamental-ngx/core/utils';
|
|
7
7
|
import { MENU_COMPONENT } from '../menu.interface';
|
|
8
8
|
import { MOBILE_MODE_CONFIG, MobileModeBase, MobileModeControl } from '@fundamental-ngx/core/mobile-mode';
|
|
@@ -17,15 +17,22 @@ import * as i7 from "@fundamental-ngx/core/title";
|
|
|
17
17
|
import * as i8 from "@fundamental-ngx/core/button";
|
|
18
18
|
export class MenuMobileComponent extends MobileModeBase {
|
|
19
19
|
/** @hidden */
|
|
20
|
-
constructor(elementRef, dialogService, _menuService, _changeDetectorRef, _rtlService, menuComponent, mobileModes) {
|
|
20
|
+
constructor(elementRef, dialogService, _menuService, _changeDetectorRef, _ngZone, _rtlService, menuComponent, mobileModes) {
|
|
21
21
|
super(elementRef, dialogService, menuComponent, MobileModeControl.MENU, mobileModes);
|
|
22
22
|
this._menuService = _menuService;
|
|
23
23
|
this._changeDetectorRef = _changeDetectorRef;
|
|
24
|
+
this._ngZone = _ngZone;
|
|
24
25
|
this._rtlService = _rtlService;
|
|
25
26
|
/** @hidden External content */
|
|
26
27
|
this.childContent = undefined;
|
|
27
28
|
}
|
|
28
29
|
/** @hidden */
|
|
30
|
+
set _watch(_dialogBody) {
|
|
31
|
+
if (_dialogBody) {
|
|
32
|
+
this._menuService.addKeyboardSupport(_dialogBody.elementRef());
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** @hidden */
|
|
29
36
|
ngOnInit() {
|
|
30
37
|
this._listenOnActivePathChange();
|
|
31
38
|
this._listenOnMenuOpenChange();
|
|
@@ -42,7 +49,11 @@ export class MenuMobileComponent extends MobileModeBase {
|
|
|
42
49
|
}
|
|
43
50
|
/** Navigate back to parent level of submenu */
|
|
44
51
|
backToParentLevel() {
|
|
45
|
-
|
|
52
|
+
const menuItem = this._menuService.activeNodePath[this._menuService.activeNodePath.length - 1].item;
|
|
53
|
+
this._menuService.setActive(false, menuItem);
|
|
54
|
+
this._executeOnStable(() => {
|
|
55
|
+
menuItem?.focus();
|
|
56
|
+
});
|
|
46
57
|
}
|
|
47
58
|
/** @hidden Opens the Dialog */
|
|
48
59
|
_openDialog() {
|
|
@@ -64,6 +75,18 @@ export class MenuMobileComponent extends MobileModeBase {
|
|
|
64
75
|
.pipe(takeUntil(this._onDestroy$), startWith(initialItemPath))
|
|
65
76
|
.subscribe((items) => this._setMenuView(items));
|
|
66
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* @hidden
|
|
80
|
+
* Executes a function when the zone is stable.
|
|
81
|
+
*/
|
|
82
|
+
_executeOnStable(fn) {
|
|
83
|
+
if (this._ngZone.isStable) {
|
|
84
|
+
fn();
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this._ngZone.onStable.pipe(take(1)).subscribe(fn);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
67
90
|
/** @hidden Sets menu view, title and isSubmenu flag */
|
|
68
91
|
_setMenuView(items) {
|
|
69
92
|
const lastItem = items[items.length - 1];
|
|
@@ -71,6 +94,9 @@ export class MenuMobileComponent extends MobileModeBase {
|
|
|
71
94
|
this.title = this._getDialogTitle(lastItem);
|
|
72
95
|
this.view = this._getMenuView(lastItem);
|
|
73
96
|
this._changeDetectorRef.markForCheck();
|
|
97
|
+
this._executeOnStable(() => {
|
|
98
|
+
this._menuService.focusedNode?.item?.focus();
|
|
99
|
+
});
|
|
74
100
|
}
|
|
75
101
|
/** @hidden Opens/closes the Dialog based on Menu isOpenChange events */
|
|
76
102
|
_listenOnMenuOpenChange() {
|
|
@@ -99,12 +125,12 @@ export class MenuMobileComponent extends MobileModeBase {
|
|
|
99
125
|
return this.childContent;
|
|
100
126
|
}
|
|
101
127
|
}
|
|
102
|
-
MenuMobileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MenuMobileComponent, deps: [{ token: i0.ElementRef }, { token: i1.DialogService }, { token: i2.MenuService }, { token: i0.ChangeDetectorRef }, { token: i3.RtlService, optional: true }, { token: MENU_COMPONENT }, { token: MOBILE_MODE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
103
|
-
MenuMobileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: MenuMobileComponent, selector: "fd-menu-mobile", viewQueries: [{ propertyName: "dialogTemplate", first: true, predicate: ["dialogTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <ng-template fdTemplate=\"header\">\n <div fd-bar-left>\n <fd-bar-element *ngIf=\"isSubmenu\">\n <button\n fd-button\n fdType=\"transparent\"\n id=\"menu-mobile-navigate-back\"\n fdCozy\n [attr.aria-label]=\"'Go to previous menu level: ' + title\"\n [glyph]=\"navigationIcon$ | async\"\n (click)=\"backToParentLevel()\"\n ></button>\n </fd-bar-element>\n <fd-bar-element>\n <h1 fd-title>{{ title }}</h1>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <button\n *ngIf=\"this.mobileConfig.hasCloseButton\"\n fd-dialog-close-button\n [mobile]=\"true\"\n (click)=\"close()\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"(isSubmenu ? subMenuTemplate : view) || null\"> </ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer *ngIf=\"mobileConfig.approveButtonText || mobileConfig.cancelButtonText\">\n <fd-button-bar\n *ngIf=\"mobileConfig.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig.cancelButtonText\"\n fd-initial-focus\n [label]=\"mobileConfig.cancelButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n\n<ng-template #subMenuTemplate>\n <nav class=\"fd-menu fd-menu--mobile\">\n <ul class=\"fd-menu__sublist\">\n <ng-container *ngTemplateOutlet=\"view || null\"></ng-container>\n </ul>\n </nav>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i1.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i1.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i1.DialogHeaderComponent, selector: "fd-dialog-header" }, { kind: "component", type: i1.DialogCloseButtonComponent, selector: "[fd-dialog-close-button]", inputs: ["mobile", "title"] }, { kind: "directive", type: i5.BarLeftDirective, selector: "[fd-bar-left]" }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: i5.BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth", "isTitle"] }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabel", "ariaLabelledby", "id"] }, { kind: "directive", type: i6.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i7.TitleComponent, selector: "h1[fd-title], h2[fd-title], h3[fd-title], h4[fd-title], h5[fd-title], h6[fd-title]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "directive", type: i3.TemplateDirective, selector: "[fdTemplate]", inputs: ["fdTemplate"] }, { kind: "directive", type: i3.InitialFocusDirective, selector: "[fdInitialFocus], [fd-initial-focus]", inputs: ["fd-initial-focus", "enabled", "focusLastElement"] }, { kind: "component", type: i8.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
128
|
+
MenuMobileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MenuMobileComponent, deps: [{ token: i0.ElementRef }, { token: i1.DialogService }, { token: i2.MenuService }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.RtlService, optional: true }, { token: MENU_COMPONENT }, { token: MOBILE_MODE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
129
|
+
MenuMobileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: MenuMobileComponent, selector: "fd-menu-mobile", viewQueries: [{ propertyName: "dialogTemplate", first: true, predicate: ["dialogTemplate"], descendants: true }, { propertyName: "_watch", first: true, predicate: DialogBodyComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <ng-template fdTemplate=\"header\">\n <div fd-bar-left>\n <fd-bar-element *ngIf=\"isSubmenu\">\n <button\n fd-button\n fdType=\"transparent\"\n id=\"menu-mobile-navigate-back\"\n fdCozy\n [attr.aria-label]=\"'Go to previous menu level: ' + title\"\n [glyph]=\"navigationIcon$ | async\"\n (click)=\"backToParentLevel()\"\n ></button>\n </fd-bar-element>\n <fd-bar-element>\n <h1 fd-title>{{ title }}</h1>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <button\n *ngIf=\"this.mobileConfig.hasCloseButton\"\n fd-dialog-close-button\n [mobile]=\"true\"\n (click)=\"close()\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"(isSubmenu ? subMenuTemplate : view) || null\"> </ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer *ngIf=\"mobileConfig.approveButtonText || mobileConfig.cancelButtonText\">\n <fd-button-bar\n *ngIf=\"mobileConfig.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig.cancelButtonText\"\n fd-initial-focus\n [label]=\"mobileConfig.cancelButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n\n<ng-template #subMenuTemplate>\n <nav class=\"fd-menu fd-menu--mobile\">\n <ul class=\"fd-menu__sublist\">\n <ng-container *ngTemplateOutlet=\"view || null\"></ng-container>\n </ul>\n </nav>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i1.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i1.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i1.DialogHeaderComponent, selector: "fd-dialog-header" }, { kind: "component", type: i1.DialogCloseButtonComponent, selector: "[fd-dialog-close-button]", inputs: ["mobile", "title"] }, { kind: "directive", type: i5.BarLeftDirective, selector: "[fd-bar-left]" }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: i5.BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth", "isTitle"] }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabel", "ariaLabelledby", "id"] }, { kind: "directive", type: i6.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i7.TitleComponent, selector: "h1[fd-title], h2[fd-title], h3[fd-title], h4[fd-title], h5[fd-title], h6[fd-title]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "directive", type: i3.TemplateDirective, selector: "[fdTemplate]", inputs: ["fdTemplate"] }, { kind: "directive", type: i3.InitialFocusDirective, selector: "[fdInitialFocus], [fd-initial-focus]", inputs: ["fd-initial-focus", "enabled", "focusLastElement"] }, { kind: "component", type: i8.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
104
130
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MenuMobileComponent, decorators: [{
|
|
105
131
|
type: Component,
|
|
106
132
|
args: [{ selector: 'fd-menu-mobile', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <ng-template fdTemplate=\"header\">\n <div fd-bar-left>\n <fd-bar-element *ngIf=\"isSubmenu\">\n <button\n fd-button\n fdType=\"transparent\"\n id=\"menu-mobile-navigate-back\"\n fdCozy\n [attr.aria-label]=\"'Go to previous menu level: ' + title\"\n [glyph]=\"navigationIcon$ | async\"\n (click)=\"backToParentLevel()\"\n ></button>\n </fd-bar-element>\n <fd-bar-element>\n <h1 fd-title>{{ title }}</h1>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <button\n *ngIf=\"this.mobileConfig.hasCloseButton\"\n fd-dialog-close-button\n [mobile]=\"true\"\n (click)=\"close()\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"(isSubmenu ? subMenuTemplate : view) || null\"> </ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer *ngIf=\"mobileConfig.approveButtonText || mobileConfig.cancelButtonText\">\n <fd-button-bar\n *ngIf=\"mobileConfig.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig.cancelButtonText\"\n fd-initial-focus\n [label]=\"mobileConfig.cancelButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n\n<ng-template #subMenuTemplate>\n <nav class=\"fd-menu fd-menu--mobile\">\n <ul class=\"fd-menu__sublist\">\n <ng-container *ngTemplateOutlet=\"view || null\"></ng-container>\n </ul>\n </nav>\n</ng-template>\n" }]
|
|
107
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.DialogService }, { type: i2.MenuService }, { type: i0.ChangeDetectorRef }, { type: i3.RtlService, decorators: [{
|
|
133
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.DialogService }, { type: i2.MenuService }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.RtlService, decorators: [{
|
|
108
134
|
type: Optional
|
|
109
135
|
}] }, { type: undefined, decorators: [{
|
|
110
136
|
type: Inject,
|
|
@@ -117,5 +143,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
117
143
|
}] }]; }, propDecorators: { dialogTemplate: [{
|
|
118
144
|
type: ViewChild,
|
|
119
145
|
args: ['dialogTemplate']
|
|
146
|
+
}], _watch: [{
|
|
147
|
+
type: ViewChild,
|
|
148
|
+
args: [DialogBodyComponent]
|
|
120
149
|
}] } });
|
|
121
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1tb2JpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbWVudS9tZW51LW1vYmlsZS9tZW51LW1vYmlsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9tZW51L21lbnUtbW9iaWxlL21lbnUtbW9iaWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUdOLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQWlCLE1BQU0sbUJBQW1CLENBQUM7QUFDbEUsT0FBTyxFQUNILGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsaUJBQWlCLEVBRXBCLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7Ozs7QUFRM0MsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGNBQTZCO0lBbUJsRSxjQUFjO0lBQ2QsWUFDSSxVQUFzQixFQUN0QixhQUE0QixFQUNwQixZQUF5QixFQUN6QixrQkFBcUMsRUFDekIsV0FBdUIsRUFDbkIsYUFBNEIsRUFDWixXQUFvQztRQUU1RSxLQUFLLENBQUMsVUFBVSxF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QWMsYUFDRixrQkFBa0I7b0dBM0JqQyxtQkFBbUIsK0xDakNoQyw0Z0ZBK0RBOzJGRDlCYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0ksZ0JBQWdCLG1CQUVULHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7OzBCQTJCaEMsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxrQkFBa0I7NENBekJiLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBJbmplY3QsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2RpYWxvZyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWVudVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVudUl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9tZW51LWl0ZW0vbWVudS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUnRsU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS91dGlscyc7XG5pbXBvcnQgeyBNRU5VX0NPTVBPTkVOVCwgTWVudUludGVyZmFjZSB9IGZyb20gJy4uL21lbnUuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gICAgTU9CSUxFX01PREVfQ09ORklHLFxuICAgIE1vYmlsZU1vZGVCYXNlLFxuICAgIE1vYmlsZU1vZGVDb250cm9sLFxuICAgIE1vYmlsZU1vZGVDb25maWdUb2tlblxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbW9iaWxlLW1vZGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLW1lbnUtbW9iaWxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVudS1tb2JpbGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgTWVudU1vYmlsZUNvbXBvbmVudCBleHRlbmRzIE1vYmlsZU1vZGVCYXNlPE1lbnVJbnRlcmZhY2U+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnZGlhbG9nVGVtcGxhdGUnKSBkaWFsb2dUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBDdXJyZW50IG1lbnUgdGl0bGUgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgY3VycmVudCBtZW51IGxldmVsIGlzIHN1Ym1lbnUgKi9cbiAgICBpc1N1Ym1lbnU6IGJvb2xlYW47XG5cbiAgICAvKiogQGhpZGRlbiBFeHRlcm5hbCBjb250ZW50ICovXG4gICAgY2hpbGRDb250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqIEBoaWRkZW4gQ3VycmVudGx5IHJlbmRlcmVkIG1lbnUgdmlldyAqL1xuICAgIHZpZXc6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgICAvKiogQGhpZGRlbiBOYXZpZ2F0aW9uIGljb24gbmFtZSBiYXNlZCBvbiBSVEwgKi9cbiAgICBuYXZpZ2F0aW9uSWNvbiQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX21lbnVTZXJ2aWNlOiBNZW51U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9ydGxTZXJ2aWNlOiBSdGxTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KE1FTlVfQ09NUE9ORU5UKSBtZW51Q29tcG9uZW50OiBNZW51SW50ZXJmYWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1PQklMRV9NT0RFX0NPTkZJRykgbW9iaWxlTW9kZXM6IE1vYmlsZU1vZGVDb25maWdUb2tlbltdXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGRpYWxvZ1NlcnZpY2UsIG1lbnVDb21wb25lbnQsIE1vYmlsZU1vZGVDb250cm9sLk1FTlUsIG1vYmlsZU1vZGVzKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9saXN0ZW5PbkFjdGl2ZVBhdGhDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuT25NZW51T3BlbkNoYW5nZSgpO1xuICAgICAgICB0aGlzLl9saXN0ZW5PblRleHREaXJlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICAvKiogQ2xvc2VzIHRoZSBEaWFsb2cgYW5kIE1lbnUgY29tcG9uZW50ICovXG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudC5jbG9zZSgpO1xuICAgIH1cblxuICAgIC8qKiBOYXZpZ2F0ZSBiYWNrIHRvIHBhcmVudCBsZXZlbCBvZiBzdWJtZW51ICovXG4gICAgYmFja1RvUGFyZW50TGV2ZWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21lbnVTZXJ2aWNlLnNldEFjdGl2ZShcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgdGhpcy5fbWVudVNlcnZpY2UuYWN0aXZlTm9kZVBhdGhbdGhpcy5fbWVudVNlcnZpY2UuYWN0aXZlTm9kZVBhdGgubGVuZ3RoIC0gMV0uaXRlbVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIE9wZW5zIHRoZSBEaWFsb2cgKi9cbiAgICBwcml2YXRlIF9vcGVuRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3Blbih0aGlzLmRpYWxvZ1RlbXBsYXRlLCB7XG4gICAgICAgICAgICBtb2JpbGU6IHRydWUsXG4gICAgICAgICAgICB2ZXJ0aWNhbFBhZGRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgLi4udGhpcy5kaWFsb2dDb25maWcsXG4gICAgICAgICAgICBlc2NLZXlDbG9zZWFibGU6IGZhbHNlLFxuICAgICAgICAgICAgYmFja2Ryb3BDbGlja0Nsb3NlYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBMaXN0ZW5zIG9uIEFjdGl2ZSBQYXRoIGNoYW5nZXMgYW5kIHVwZGF0ZXMgbW9iaWxlIHZpZXcgKi9cbiAgICBwcml2YXRlIF9saXN0ZW5PbkFjdGl2ZVBhdGhDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxJdGVtUGF0aDogTWVudUl0ZW1Db21wb25lbnRbXSA9IHRoaXMuX21lbnVTZXJ2aWNlLmFjdGl2ZU5vZGVQYXRoXG4gICAgICAgICAgICAubWFwKChub2RlKSA9PiBub2RlLml0ZW0pXG4gICAgICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyBNZW51SXRlbUNvbXBvbmVudCA9PiAhIXYpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnQuYWN0aXZlUGF0aFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLCBzdGFydFdpdGgoaW5pdGlhbEl0ZW1QYXRoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGl0ZW1zKSA9PiB0aGlzLl9zZXRNZW51VmlldyhpdGVtcykpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFNldHMgbWVudSB2aWV3LCB0aXRsZSBhbmQgaXNTdWJtZW51IGZsYWcgKi9cbiAgICBwcml2YXRlIF9zZXRNZW51VmlldyhpdGVtczogTWVudUl0ZW1Db21wb25lbnRbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBsYXN0SXRlbTogTWVudUl0ZW1Db21wb25lbnQgPSBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5pc1N1Ym1lbnUgPSAhIWl0ZW1zLmxlbmd0aDtcbiAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuX2dldERpYWxvZ1RpdGxlKGxhc3RJdGVtKTtcbiAgICAgICAgdGhpcy52aWV3ID0gdGhpcy5fZ2V0TWVudVZpZXcobGFzdEl0ZW0pO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBPcGVucy9jbG9zZXMgdGhlIERpYWxvZyBiYXNlZCBvbiBNZW51IGlzT3BlbkNoYW5nZSBldmVudHMgKi9cbiAgICBwcml2YXRlIF9saXN0ZW5Pbk1lbnVPcGVuQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jb21wb25lbnQuaXNPcGVuQ2hhbmdlXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChpc09wZW4pID0+IChpc09wZW4gPyB0aGlzLl9vcGVuRGlhbG9nKCkgOiB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpKSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gU2V0cyBuYXZpZ2F0aW9uIGFycm93IGRlcGVuZGluZyBvbiB0ZXh0IGRpcmVjdGlvbiAqL1xuICAgIHByaXZhdGUgX2xpc3Rlbk9uVGV4dERpcmVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSWNvbiQgPSB0aGlzLl9ydGxTZXJ2aWNlXG4gICAgICAgICAgICA/IHRoaXMuX3J0bFNlcnZpY2UucnRsLnBpcGUobWFwKChpc1J0bCkgPT4gKGlzUnRsID8gJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnIDogJ25hdmlnYXRpb24tbGVmdC1hcnJvdycpKSlcbiAgICAgICAgICAgIDogb2YoJ25hdmlnYXRpb24tbGVmdC1hcnJvdycpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFJldHVybnMgZGlhbG9nIHRpdGxlICovXG4gICAgcHJpdmF0ZSBfZ2V0RGlhbG9nVGl0bGUobWVudUl0ZW06IE1lbnVJdGVtQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdWJtZW51KSB7XG4gICAgICAgICAgICByZXR1cm4gbWVudUl0ZW0ubWVudUl0ZW1UaXRsZSA/IG1lbnVJdGVtLm1lbnVJdGVtVGl0bGUudGl0bGUgOiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm1vYmlsZUNvbmZpZy50aXRsZSB8fCAnJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSZXR1cm5zIGRpYWxvZyBjb250ZW50IHZpZXcgKi9cbiAgICBwcml2YXRlIF9nZXRNZW51VmlldyhtZW51SXRlbTogTWVudUl0ZW1Db21wb25lbnQpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdWJtZW51KSB7XG4gICAgICAgICAgICByZXR1cm4gbWVudUl0ZW0uc3VibWVudSA/IG1lbnVJdGVtLnN1Ym1lbnUudGVtcGxhdGVSZWYgOiB0aGlzLnZpZXc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRDb250ZW50O1xuICAgIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSBsZXQtZGlhbG9nIGxldC1kaWFsb2dDb25maWc9XCJkaWFsb2dDb25maWdcIiAjZGlhbG9nVGVtcGxhdGU+XG4gICAgPGZkLWRpYWxvZyBbZGlhbG9nQ29uZmlnXT1cImRpYWxvZ0NvbmZpZ1wiIFtkaWFsb2dSZWZdPVwiZGlhbG9nXCI+XG4gICAgICAgIDxmZC1kaWFsb2ctaGVhZGVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGZkVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGZkLWJhci1sZWZ0PlxuICAgICAgICAgICAgICAgICAgICA8ZmQtYmFyLWVsZW1lbnQgKm5nSWY9XCJpc1N1Ym1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZFR5cGU9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtZW51LW1vYmlsZS1uYXZpZ2F0ZS1iYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZENvenlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidHbyB0byBwcmV2aW91cyBtZW51IGxldmVsOiAnICsgdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnbHlwaF09XCJuYXZpZ2F0aW9uSWNvbiQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2tUb1BhcmVudExldmVsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2ZkLWJhci1lbGVtZW50PlxuICAgICAgICAgICAgICAgICAgICA8ZmQtYmFyLWVsZW1lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDEgZmQtdGl0bGU+e3sgdGl0bGUgfX08L2gxPlxuICAgICAgICAgICAgICAgICAgICA8L2ZkLWJhci1lbGVtZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgZmQtYmFyLXJpZ2h0PlxuICAgICAgICAgICAgICAgICAgICA8ZmQtYmFyLWVsZW1lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLm1vYmlsZUNvbmZpZy5oYXNDbG9zZUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQtZGlhbG9nLWNsb3NlLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2JpbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2ZkLWJhci1lbGVtZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9mZC1kaWFsb2ctaGVhZGVyPlxuXG4gICAgICAgIDxmZC1kaWFsb2ctYm9keT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCIoaXNTdWJtZW51ID8gc3ViTWVudVRlbXBsYXRlIDogdmlldykgfHwgbnVsbFwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1kaWFsb2ctYm9keT5cblxuICAgICAgICA8ZmQtZGlhbG9nLWZvb3RlciAqbmdJZj1cIm1vYmlsZUNvbmZpZy5hcHByb3ZlQnV0dG9uVGV4dCB8fCBtb2JpbGVDb25maWcuY2FuY2VsQnV0dG9uVGV4dFwiPlxuICAgICAgICAgICAgPGZkLWJ1dHRvbi1iYXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm1vYmlsZUNvbmZpZy5hcHByb3ZlQnV0dG9uVGV4dFwiXG4gICAgICAgICAgICAgICAgZmRUeXBlPVwiZW1waGFzaXplZFwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIm1vYmlsZUNvbmZpZy5hcHByb3ZlQnV0dG9uVGV4dFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9mZC1idXR0b24tYmFyPlxuICAgICAgICAgICAgPGZkLWJ1dHRvbi1iYXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm1vYmlsZUNvbmZpZy5jYW5jZWxCdXR0b25UZXh0XCJcbiAgICAgICAgICAgICAgICBmZC1pbml0aWFsLWZvY3VzXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIm1vYmlsZUNvbmZpZy5jYW5jZWxCdXR0b25UZXh0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2ZkLWJ1dHRvbi1iYXI+XG4gICAgICAgIDwvZmQtZGlhbG9nLWZvb3Rlcj5cbiAgICA8L2ZkLWRpYWxvZz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3ViTWVudVRlbXBsYXRlPlxuICAgIDxuYXYgY2xhc3M9XCJmZC1tZW51IGZkLW1lbnUtLW1vYmlsZVwiPlxuICAgICAgICA8dWwgY2xhc3M9XCJmZC1tZW51X19zdWJsaXN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidmlldyB8fCBudWxsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdWw+XG4gICAgPC9uYXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1tb2JpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbWVudS9tZW51LW1vYmlsZS9tZW51LW1vYmlsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9tZW51L21lbnUtbW9iaWxlL21lbnUtbW9iaWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFHTixRQUFRLEVBQ1IsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xGLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBaUIsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxpQkFBaUIsRUFFcEIsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7OztBQVEzQyxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsY0FBNkI7SUEyQmxFLGNBQWM7SUFDZCxZQUNJLFVBQXNCLEVBQ3RCLGFBQTRCLEVBQ3BCLFlBQXlCLEVBQ3pCLGtCQUFxQyxFQUNyQyxPQUFlLEVBQ0gsV0FBdUIsRUFD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QUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFtQnZCLE1BQU07c0JBRFQsU0FBUzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaWFsb2dCb2R5Q29tcG9uZW50LCBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2RpYWxvZyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWVudVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVudUl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9tZW51LWl0ZW0vbWVudS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUnRsU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS91dGlscyc7XG5pbXBvcnQgeyBNRU5VX0NPTVBPTkVOVCwgTWVudUludGVyZmFjZSB9IGZyb20gJy4uL21lbnUuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gICAgTU9CSUxFX01PREVfQ09ORklHLFxuICAgIE1vYmlsZU1vZGVCYXNlLFxuICAgIE1vYmlsZU1vZGVDb250cm9sLFxuICAgIE1vYmlsZU1vZGVDb25maWdUb2tlblxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbW9iaWxlLW1vZGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLW1lbnUtbW9iaWxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVudS1tb2JpbGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgTWVudU1vYmlsZUNvbXBvbmVudCBleHRlbmRzIE1vYmlsZU1vZGVCYXNlPE1lbnVJbnRlcmZhY2U+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnZGlhbG9nVGVtcGxhdGUnKSBkaWFsb2dUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBDdXJyZW50IG1lbnUgdGl0bGUgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgY3VycmVudCBtZW51IGxldmVsIGlzIHN1Ym1lbnUgKi9cbiAgICBpc1N1Ym1lbnU6IGJvb2xlYW47XG5cbiAgICAvKiogQGhpZGRlbiBFeHRlcm5hbCBjb250ZW50ICovXG4gICAgY2hpbGRDb250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqIEBoaWRkZW4gQ3VycmVudGx5IHJlbmRlcmVkIG1lbnUgdmlldyAqL1xuICAgIHZpZXc6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgICAvKiogQGhpZGRlbiBOYXZpZ2F0aW9uIGljb24gbmFtZSBiYXNlZCBvbiBSVEwgKi9cbiAgICBuYXZpZ2F0aW9uSWNvbiQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZChEaWFsb2dCb2R5Q29tcG9uZW50KVxuICAgIHNldCBfd2F0Y2goX2RpYWxvZ0JvZHk6IERpYWxvZ0JvZHlDb21wb25lbnQpIHtcbiAgICAgICAgaWYgKF9kaWFsb2dCb2R5KSB7XG4gICAgICAgICAgICB0aGlzLl9tZW51U2VydmljZS5hZGRLZXlib2FyZFN1cHBvcnQoX2RpYWxvZ0JvZHkuZWxlbWVudFJlZigpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX21lbnVTZXJ2aWNlOiBNZW51U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfcnRsU2VydmljZTogUnRsU2VydmljZSxcbiAgICAgICAgQEluamVjdChNRU5VX0NPTVBPTkVOVCkgbWVudUNvbXBvbmVudDogTWVudUludGVyZmFjZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChNT0JJTEVfTU9ERV9DT05GSUcpIG1vYmlsZU1vZGVzOiBNb2JpbGVNb2RlQ29uZmlnVG9rZW5bXVxuICAgICkge1xuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBkaWFsb2dTZXJ2aWNlLCBtZW51Q29tcG9uZW50LCBNb2JpbGVNb2RlQ29udHJvbC5NRU5VLCBtb2JpbGVNb2Rlcyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuT25BY3RpdmVQYXRoQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMuX2xpc3Rlbk9uTWVudU9wZW5DaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuT25UZXh0RGlyZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIub25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqIENsb3NlcyB0aGUgRGlhbG9nIGFuZCBNZW51IGNvbXBvbmVudCAqL1xuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnQuY2xvc2UoKTtcbiAgICB9XG5cbiAgICAvKiogTmF2aWdhdGUgYmFjayB0byBwYXJlbnQgbGV2ZWwgb2Ygc3VibWVudSAqL1xuICAgIGJhY2tUb1BhcmVudExldmVsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuX21lbnVTZXJ2aWNlLmFjdGl2ZU5vZGVQYXRoW3RoaXMuX21lbnVTZXJ2aWNlLmFjdGl2ZU5vZGVQYXRoLmxlbmd0aCAtIDFdLml0ZW07XG4gICAgICAgIHRoaXMuX21lbnVTZXJ2aWNlLnNldEFjdGl2ZShmYWxzZSwgbWVudUl0ZW0pO1xuICAgICAgICB0aGlzLl9leGVjdXRlT25TdGFibGUoKCkgPT4ge1xuICAgICAgICAgICAgbWVudUl0ZW0/LmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIE9wZW5zIHRoZSBEaWFsb2cgKi9cbiAgICBwcml2YXRlIF9vcGVuRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3Blbih0aGlzLmRpYWxvZ1RlbXBsYXRlLCB7XG4gICAgICAgICAgICBtb2JpbGU6IHRydWUsXG4gICAgICAgICAgICB2ZXJ0aWNhbFBhZGRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgLi4udGhpcy5kaWFsb2dDb25maWcsXG4gICAgICAgICAgICBlc2NLZXlDbG9zZWFibGU6IGZhbHNlLFxuICAgICAgICAgICAgYmFja2Ryb3BDbGlja0Nsb3NlYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBMaXN0ZW5zIG9uIEFjdGl2ZSBQYXRoIGNoYW5nZXMgYW5kIHVwZGF0ZXMgbW9iaWxlIHZpZXcgKi9cbiAgICBwcml2YXRlIF9saXN0ZW5PbkFjdGl2ZVBhdGhDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxJdGVtUGF0aDogTWVudUl0ZW1Db21wb25lbnRbXSA9IHRoaXMuX21lbnVTZXJ2aWNlLmFjdGl2ZU5vZGVQYXRoXG4gICAgICAgICAgICAubWFwKChub2RlKSA9PiBub2RlLml0ZW0pXG4gICAgICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyBNZW51SXRlbUNvbXBvbmVudCA9PiAhIXYpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnQuYWN0aXZlUGF0aFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLCBzdGFydFdpdGgoaW5pdGlhbEl0ZW1QYXRoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGl0ZW1zKSA9PiB0aGlzLl9zZXRNZW51VmlldyhpdGVtcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBFeGVjdXRlcyBhIGZ1bmN0aW9uIHdoZW4gdGhlIHpvbmUgaXMgc3RhYmxlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2V4ZWN1dGVPblN0YWJsZShmbjogKCkgPT4gYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9uZ1pvbmUuaXNTdGFibGUpIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZm4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gU2V0cyBtZW51IHZpZXcsIHRpdGxlIGFuZCBpc1N1Ym1lbnUgZmxhZyAqL1xuICAgIHByaXZhdGUgX3NldE1lbnVWaWV3KGl0ZW1zOiBNZW51SXRlbUNvbXBvbmVudFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxhc3RJdGVtOiBNZW51SXRlbUNvbXBvbmVudCA9IGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICB0aGlzLmlzU3VibWVudSA9ICEhaXRlbXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy5fZ2V0RGlhbG9nVGl0bGUobGFzdEl0ZW0pO1xuICAgICAgICB0aGlzLnZpZXcgPSB0aGlzLl9nZXRNZW51VmlldyhsYXN0SXRlbSk7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLl9leGVjdXRlT25TdGFibGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbWVudVNlcnZpY2UuZm9jdXNlZE5vZGU/Lml0ZW0/LmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIE9wZW5zL2Nsb3NlcyB0aGUgRGlhbG9nIGJhc2VkIG9uIE1lbnUgaXNPcGVuQ2hhbmdlIGV2ZW50cyAqL1xuICAgIHByaXZhdGUgX2xpc3Rlbk9uTWVudU9wZW5DaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudC5pc09wZW5DaGFuZ2VcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGlzT3BlbikgPT4gKGlzT3BlbiA/IHRoaXMuX29wZW5EaWFsb2coKSA6IHRoaXMuZGlhbG9nUmVmLmNsb3NlKCkpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBTZXRzIG5hdmlnYXRpb24gYXJyb3cgZGVwZW5kaW5nIG9uIHRleHQgZGlyZWN0aW9uICovXG4gICAgcHJpdmF0ZSBfbGlzdGVuT25UZXh0RGlyZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25JY29uJCA9IHRoaXMuX3J0bFNlcnZpY2VcbiAgICAgICAgICAgID8gdGhpcy5fcnRsU2VydmljZS5ydGwucGlwZShtYXAoKGlzUnRsKSA9PiAoaXNSdGwgPyAnbmF2aWdhdGlvbi1yaWdodC1hcnJvdycgOiAnbmF2aWdhdGlvbi1sZWZ0LWFycm93JykpKVxuICAgICAgICAgICAgOiBvZignbmF2aWdhdGlvbi1sZWZ0LWFycm93Jyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gUmV0dXJucyBkaWFsb2cgdGl0bGUgKi9cbiAgICBwcml2YXRlIF9nZXREaWFsb2dUaXRsZShtZW51SXRlbTogTWVudUl0ZW1Db21wb25lbnQpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5pc1N1Ym1lbnUpIHtcbiAgICAgICAgICAgIHJldHVybiBtZW51SXRlbS5tZW51SXRlbVRpdGxlID8gbWVudUl0ZW0ubWVudUl0ZW1UaXRsZS50aXRsZSA6ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubW9iaWxlQ29uZmlnLnRpdGxlIHx8ICcnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFJldHVybnMgZGlhbG9nIGNvbnRlbnQgdmlldyAqL1xuICAgIHByaXZhdGUgX2dldE1lbnVWaWV3KG1lbnVJdGVtOiBNZW51SXRlbUNvbXBvbmVudCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy5pc1N1Ym1lbnUpIHtcbiAgICAgICAgICAgIHJldHVybiBtZW51SXRlbS5zdWJtZW51ID8gbWVudUl0ZW0uc3VibWVudS50ZW1wbGF0ZVJlZiA6IHRoaXMudmlldztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZENvbnRlbnQ7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlIGxldC1kaWFsb2cgbGV0LWRpYWxvZ0NvbmZpZz1cImRpYWxvZ0NvbmZpZ1wiICNkaWFsb2dUZW1wbGF0ZT5cbiAgICA8ZmQtZGlhbG9nIFtkaWFsb2dDb25maWddPVwiZGlhbG9nQ29uZmlnXCIgW2RpYWxvZ1JlZl09XCJkaWFsb2dcIj5cbiAgICAgICAgPGZkLWRpYWxvZy1oZWFkZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgZmRUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgZmQtYmFyLWxlZnQ+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1iYXItZWxlbWVudCAqbmdJZj1cImlzU3VibWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1lbnUtbW9iaWxlLW5hdmlnYXRlLWJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkQ296eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0dvIHRvIHByZXZpb3VzIG1lbnUgbGV2ZWw6ICcgKyB0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dseXBoXT1cIm5hdmlnYXRpb25JY29uJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFja1RvUGFyZW50TGV2ZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZmQtYmFyLWVsZW1lbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1iYXItZWxlbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMSBmZC10aXRsZT57eyB0aXRsZSB9fTwvaDE+XG4gICAgICAgICAgICAgICAgICAgIDwvZmQtYmFyLWVsZW1lbnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBmZC1iYXItcmlnaHQ+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1iYXItZWxlbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRoaXMubW9iaWxlQ29uZmlnLmhhc0Nsb3NlQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC1kaWFsb2ctY2xvc2UtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vYmlsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZmQtYmFyLWVsZW1lbnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2ZkLWRpYWxvZy1oZWFkZXI+XG5cbiAgICAgICAgPGZkLWRpYWxvZy1ib2R5PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIihpc1N1Ym1lbnUgPyBzdWJNZW51VGVtcGxhdGUgOiB2aWV3KSB8fCBudWxsXCI+IDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2ZkLWRpYWxvZy1ib2R5PlxuXG4gICAgICAgIDxmZC1kaWFsb2ctZm9vdGVyICpuZ0lmPVwibW9iaWxlQ29uZmlnLmFwcHJvdmVCdXR0b25UZXh0IHx8IG1vYmlsZUNvbmZpZy5jYW5jZWxCdXR0b25UZXh0XCI+XG4gICAgICAgICAgICA8ZmQtYnV0dG9uLWJhclxuICAgICAgICAgICAgICAgICpuZ0lmPVwibW9iaWxlQ29uZmlnLmFwcHJvdmVCdXR0b25UZXh0XCJcbiAgICAgICAgICAgICAgICBmZFR5cGU9XCJlbXBoYXNpemVkXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwibW9iaWxlQ29uZmlnLmFwcHJvdmVCdXR0b25UZXh0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2ZkLWJ1dHRvbi1iYXI+XG4gICAgICAgICAgICA8ZmQtYnV0dG9uLWJhclxuICAgICAgICAgICAgICAgICpuZ0lmPVwibW9iaWxlQ29uZmlnLmNhbmNlbEJ1dHRvblRleHRcIlxuICAgICAgICAgICAgICAgIGZkLWluaXRpYWwtZm9jdXNcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwibW9iaWxlQ29uZmlnLmNhbmNlbEJ1dHRvblRleHRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbG9zZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZmQtYnV0dG9uLWJhcj5cbiAgICAgICAgPC9mZC1kaWFsb2ctZm9vdGVyPlxuICAgIDwvZmQtZGlhbG9nPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdWJNZW51VGVtcGxhdGU+XG4gICAgPG5hdiBjbGFzcz1cImZkLW1lbnUgZmQtbWVudS0tbW9iaWxlXCI+XG4gICAgICAgIDx1bCBjbGFzcz1cImZkLW1lbnVfX3N1Ymxpc3RcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2aWV3IHx8IG51bGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC91bD5cbiAgICA8L25hdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Directive, HostBinding, Injectable, Optional, InjectionToken, EventEmitter, Component, ChangeDetectionStrategy, ViewEncapsulation, Inject, Input, Output, ContentChild, TemplateRef, ViewChild, ContentChildren, forwardRef, NgModule, Injector } from '@angular/core';
|
|
3
3
|
import { Subject, Subscription, fromEvent, defer, timer, of } from 'rxjs';
|
|
4
|
-
import { distinctUntilChanged, takeUntil, filter, switchMap, startWith, map } from 'rxjs/operators';
|
|
4
|
+
import { distinctUntilChanged, takeUntil, filter, switchMap, startWith, take, map } from 'rxjs/operators';
|
|
5
5
|
import * as i3 from '@fundamental-ngx/core/utils';
|
|
6
6
|
import { KeyUtil, InitialFocusModule, DynamicComponentService } from '@fundamental-ngx/core/utils';
|
|
7
7
|
import { RIGHT_ARROW, LEFT_ARROW, DOWN_ARROW, UP_ARROW, SPACE, ENTER, ESCAPE } from '@angular/cdk/keycodes';
|
|
@@ -14,9 +14,9 @@ import { DeprecatedCompactDirective, CONTENT_DENSITY_DIRECTIVE, contentDensityOb
|
|
|
14
14
|
import { __awaiter } from 'tslib';
|
|
15
15
|
import * as i3$1 from '@fundamental-ngx/core/popover';
|
|
16
16
|
import { BasePopoverClass, PopoverService, PopoverModule } from '@fundamental-ngx/core/popover';
|
|
17
|
-
import { MobileModeBase, MobileModeControl, MOBILE_MODE_CONFIG } from '@fundamental-ngx/core/mobile-mode';
|
|
18
17
|
import * as i1 from '@fundamental-ngx/core/dialog';
|
|
19
|
-
import { DialogModule } from '@fundamental-ngx/core/dialog';
|
|
18
|
+
import { DialogBodyComponent, DialogModule } from '@fundamental-ngx/core/dialog';
|
|
19
|
+
import { MobileModeBase, MobileModeControl, MOBILE_MODE_CONFIG } from '@fundamental-ngx/core/mobile-mode';
|
|
20
20
|
import * as i5 from '@fundamental-ngx/core/bar';
|
|
21
21
|
import * as i7 from '@fundamental-ngx/core/title';
|
|
22
22
|
import * as i8 from '@fundamental-ngx/core/button';
|
|
@@ -793,15 +793,22 @@ const MENU_COMPONENT = new InjectionToken('MenuInterface');
|
|
|
793
793
|
|
|
794
794
|
class MenuMobileComponent extends MobileModeBase {
|
|
795
795
|
/** @hidden */
|
|
796
|
-
constructor(elementRef, dialogService, _menuService, _changeDetectorRef, _rtlService, menuComponent, mobileModes) {
|
|
796
|
+
constructor(elementRef, dialogService, _menuService, _changeDetectorRef, _ngZone, _rtlService, menuComponent, mobileModes) {
|
|
797
797
|
super(elementRef, dialogService, menuComponent, MobileModeControl.MENU, mobileModes);
|
|
798
798
|
this._menuService = _menuService;
|
|
799
799
|
this._changeDetectorRef = _changeDetectorRef;
|
|
800
|
+
this._ngZone = _ngZone;
|
|
800
801
|
this._rtlService = _rtlService;
|
|
801
802
|
/** @hidden External content */
|
|
802
803
|
this.childContent = undefined;
|
|
803
804
|
}
|
|
804
805
|
/** @hidden */
|
|
806
|
+
set _watch(_dialogBody) {
|
|
807
|
+
if (_dialogBody) {
|
|
808
|
+
this._menuService.addKeyboardSupport(_dialogBody.elementRef());
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
/** @hidden */
|
|
805
812
|
ngOnInit() {
|
|
806
813
|
this._listenOnActivePathChange();
|
|
807
814
|
this._listenOnMenuOpenChange();
|
|
@@ -818,7 +825,11 @@ class MenuMobileComponent extends MobileModeBase {
|
|
|
818
825
|
}
|
|
819
826
|
/** Navigate back to parent level of submenu */
|
|
820
827
|
backToParentLevel() {
|
|
821
|
-
|
|
828
|
+
const menuItem = this._menuService.activeNodePath[this._menuService.activeNodePath.length - 1].item;
|
|
829
|
+
this._menuService.setActive(false, menuItem);
|
|
830
|
+
this._executeOnStable(() => {
|
|
831
|
+
menuItem === null || menuItem === void 0 ? void 0 : menuItem.focus();
|
|
832
|
+
});
|
|
822
833
|
}
|
|
823
834
|
/** @hidden Opens the Dialog */
|
|
824
835
|
_openDialog() {
|
|
@@ -833,6 +844,18 @@ class MenuMobileComponent extends MobileModeBase {
|
|
|
833
844
|
.pipe(takeUntil(this._onDestroy$), startWith(initialItemPath))
|
|
834
845
|
.subscribe((items) => this._setMenuView(items));
|
|
835
846
|
}
|
|
847
|
+
/**
|
|
848
|
+
* @hidden
|
|
849
|
+
* Executes a function when the zone is stable.
|
|
850
|
+
*/
|
|
851
|
+
_executeOnStable(fn) {
|
|
852
|
+
if (this._ngZone.isStable) {
|
|
853
|
+
fn();
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
this._ngZone.onStable.pipe(take(1)).subscribe(fn);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
836
859
|
/** @hidden Sets menu view, title and isSubmenu flag */
|
|
837
860
|
_setMenuView(items) {
|
|
838
861
|
const lastItem = items[items.length - 1];
|
|
@@ -840,6 +863,10 @@ class MenuMobileComponent extends MobileModeBase {
|
|
|
840
863
|
this.title = this._getDialogTitle(lastItem);
|
|
841
864
|
this.view = this._getMenuView(lastItem);
|
|
842
865
|
this._changeDetectorRef.markForCheck();
|
|
866
|
+
this._executeOnStable(() => {
|
|
867
|
+
var _a, _b;
|
|
868
|
+
(_b = (_a = this._menuService.focusedNode) === null || _a === void 0 ? void 0 : _a.item) === null || _b === void 0 ? void 0 : _b.focus();
|
|
869
|
+
});
|
|
843
870
|
}
|
|
844
871
|
/** @hidden Opens/closes the Dialog based on Menu isOpenChange events */
|
|
845
872
|
_listenOnMenuOpenChange() {
|
|
@@ -868,13 +895,13 @@ class MenuMobileComponent extends MobileModeBase {
|
|
|
868
895
|
return this.childContent;
|
|
869
896
|
}
|
|
870
897
|
}
|
|
871
|
-
MenuMobileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MenuMobileComponent, deps: [{ token: i0.ElementRef }, { token: i1.DialogService }, { token: MenuService }, { token: i0.ChangeDetectorRef }, { token: i3.RtlService, optional: true }, { token: MENU_COMPONENT }, { token: MOBILE_MODE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
872
|
-
MenuMobileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: MenuMobileComponent, selector: "fd-menu-mobile", viewQueries: [{ propertyName: "dialogTemplate", first: true, predicate: ["dialogTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <ng-template fdTemplate=\"header\">\n <div fd-bar-left>\n <fd-bar-element *ngIf=\"isSubmenu\">\n <button\n fd-button\n fdType=\"transparent\"\n id=\"menu-mobile-navigate-back\"\n fdCozy\n [attr.aria-label]=\"'Go to previous menu level: ' + title\"\n [glyph]=\"navigationIcon$ | async\"\n (click)=\"backToParentLevel()\"\n ></button>\n </fd-bar-element>\n <fd-bar-element>\n <h1 fd-title>{{ title }}</h1>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <button\n *ngIf=\"this.mobileConfig.hasCloseButton\"\n fd-dialog-close-button\n [mobile]=\"true\"\n (click)=\"close()\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"(isSubmenu ? subMenuTemplate : view) || null\"> </ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer *ngIf=\"mobileConfig.approveButtonText || mobileConfig.cancelButtonText\">\n <fd-button-bar\n *ngIf=\"mobileConfig.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig.cancelButtonText\"\n fd-initial-focus\n [label]=\"mobileConfig.cancelButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n\n<ng-template #subMenuTemplate>\n <nav class=\"fd-menu fd-menu--mobile\">\n <ul class=\"fd-menu__sublist\">\n <ng-container *ngTemplateOutlet=\"view || null\"></ng-container>\n </ul>\n </nav>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i1.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i1.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i1.DialogHeaderComponent, selector: "fd-dialog-header" }, { kind: "component", type: i1.DialogCloseButtonComponent, selector: "[fd-dialog-close-button]", inputs: ["mobile", "title"] }, { kind: "directive", type: i5.BarLeftDirective, selector: "[fd-bar-left]" }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: i5.BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth", "isTitle"] }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabel", "ariaLabelledby", "id"] }, { kind: "directive", type: i5$1.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i7.TitleComponent, selector: "h1[fd-title], h2[fd-title], h3[fd-title], h4[fd-title], h5[fd-title], h6[fd-title]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "directive", type: i3.TemplateDirective, selector: "[fdTemplate]", inputs: ["fdTemplate"] }, { kind: "directive", type: i3.InitialFocusDirective, selector: "[fdInitialFocus], [fd-initial-focus]", inputs: ["fd-initial-focus", "enabled", "focusLastElement"] }, { kind: "component", type: i8.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
898
|
+
MenuMobileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MenuMobileComponent, deps: [{ token: i0.ElementRef }, { token: i1.DialogService }, { token: MenuService }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.RtlService, optional: true }, { token: MENU_COMPONENT }, { token: MOBILE_MODE_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
899
|
+
MenuMobileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: MenuMobileComponent, selector: "fd-menu-mobile", viewQueries: [{ propertyName: "dialogTemplate", first: true, predicate: ["dialogTemplate"], descendants: true }, { propertyName: "_watch", first: true, predicate: DialogBodyComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <ng-template fdTemplate=\"header\">\n <div fd-bar-left>\n <fd-bar-element *ngIf=\"isSubmenu\">\n <button\n fd-button\n fdType=\"transparent\"\n id=\"menu-mobile-navigate-back\"\n fdCozy\n [attr.aria-label]=\"'Go to previous menu level: ' + title\"\n [glyph]=\"navigationIcon$ | async\"\n (click)=\"backToParentLevel()\"\n ></button>\n </fd-bar-element>\n <fd-bar-element>\n <h1 fd-title>{{ title }}</h1>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <button\n *ngIf=\"this.mobileConfig.hasCloseButton\"\n fd-dialog-close-button\n [mobile]=\"true\"\n (click)=\"close()\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"(isSubmenu ? subMenuTemplate : view) || null\"> </ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer *ngIf=\"mobileConfig.approveButtonText || mobileConfig.cancelButtonText\">\n <fd-button-bar\n *ngIf=\"mobileConfig.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig.cancelButtonText\"\n fd-initial-focus\n [label]=\"mobileConfig.cancelButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n\n<ng-template #subMenuTemplate>\n <nav class=\"fd-menu fd-menu--mobile\">\n <ul class=\"fd-menu__sublist\">\n <ng-container *ngTemplateOutlet=\"view || null\"></ng-container>\n </ul>\n </nav>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i1.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i1.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i1.DialogHeaderComponent, selector: "fd-dialog-header" }, { kind: "component", type: i1.DialogCloseButtonComponent, selector: "[fd-dialog-close-button]", inputs: ["mobile", "title"] }, { kind: "directive", type: i5.BarLeftDirective, selector: "[fd-bar-left]" }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "directive", type: i5.BarElementDirective, selector: "fd-bar-element", inputs: ["fullWidth", "isTitle"] }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabel", "ariaLabelledby", "id"] }, { kind: "directive", type: i5$1.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i7.TitleComponent, selector: "h1[fd-title], h2[fd-title], h3[fd-title], h4[fd-title], h5[fd-title], h6[fd-title]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "directive", type: i3.TemplateDirective, selector: "[fdTemplate]", inputs: ["fdTemplate"] }, { kind: "directive", type: i3.InitialFocusDirective, selector: "[fdInitialFocus], [fd-initial-focus]", inputs: ["fd-initial-focus", "enabled", "focusLastElement"] }, { kind: "component", type: i8.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
873
900
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MenuMobileComponent, decorators: [{
|
|
874
901
|
type: Component,
|
|
875
902
|
args: [{ selector: 'fd-menu-mobile', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-header>\n <ng-template fdTemplate=\"header\">\n <div fd-bar-left>\n <fd-bar-element *ngIf=\"isSubmenu\">\n <button\n fd-button\n fdType=\"transparent\"\n id=\"menu-mobile-navigate-back\"\n fdCozy\n [attr.aria-label]=\"'Go to previous menu level: ' + title\"\n [glyph]=\"navigationIcon$ | async\"\n (click)=\"backToParentLevel()\"\n ></button>\n </fd-bar-element>\n <fd-bar-element>\n <h1 fd-title>{{ title }}</h1>\n </fd-bar-element>\n </div>\n <div fd-bar-right>\n <fd-bar-element>\n <button\n *ngIf=\"this.mobileConfig.hasCloseButton\"\n fd-dialog-close-button\n [mobile]=\"true\"\n (click)=\"close()\"\n ></button>\n </fd-bar-element>\n </div>\n </ng-template>\n </fd-dialog-header>\n\n <fd-dialog-body>\n <ng-container *ngTemplateOutlet=\"(isSubmenu ? subMenuTemplate : view) || null\"> </ng-container>\n </fd-dialog-body>\n\n <fd-dialog-footer *ngIf=\"mobileConfig.approveButtonText || mobileConfig.cancelButtonText\">\n <fd-button-bar\n *ngIf=\"mobileConfig.approveButtonText\"\n fdType=\"emphasized\"\n [label]=\"mobileConfig.approveButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n <fd-button-bar\n *ngIf=\"mobileConfig.cancelButtonText\"\n fd-initial-focus\n [label]=\"mobileConfig.cancelButtonText\"\n (click)=\"close()\"\n >\n </fd-button-bar>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n\n<ng-template #subMenuTemplate>\n <nav class=\"fd-menu fd-menu--mobile\">\n <ul class=\"fd-menu__sublist\">\n <ng-container *ngTemplateOutlet=\"view || null\"></ng-container>\n </ul>\n </nav>\n</ng-template>\n" }]
|
|
876
903
|
}], ctorParameters: function () {
|
|
877
|
-
return [{ type: i0.ElementRef }, { type: i1.DialogService }, { type: MenuService }, { type: i0.ChangeDetectorRef }, { type: i3.RtlService, decorators: [{
|
|
904
|
+
return [{ type: i0.ElementRef }, { type: i1.DialogService }, { type: MenuService }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.RtlService, decorators: [{
|
|
878
905
|
type: Optional
|
|
879
906
|
}] }, { type: undefined, decorators: [{
|
|
880
907
|
type: Inject,
|
|
@@ -888,6 +915,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
888
915
|
}, propDecorators: { dialogTemplate: [{
|
|
889
916
|
type: ViewChild,
|
|
890
917
|
args: ['dialogTemplate']
|
|
918
|
+
}], _watch: [{
|
|
919
|
+
type: ViewChild,
|
|
920
|
+
args: [DialogBodyComponent]
|
|
891
921
|
}] } });
|
|
892
922
|
|
|
893
923
|
class MenuMobileModule {
|