@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
484 lines • 55.4 kB
JavaScript
import { Component, ContentChildren, EventEmitter, forwardRef, Inject, Injector, Input, Optional, Output, QueryList, SkipSelf, TemplateRef, ViewChild } from '@angular/core';
import { CoreBaseComponent } from '../common/base.component';
import { SME_LAYOUT_PROVIDER } from '../common/layout';
import { PropertyGridItemComponent } from './property-grid-item.component';
import { PropertyGridResponsiveWindowManager } from './property-grid-responsive-window-manager';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
import * as i3 from "../layout/layout.component";
import * as i4 from "../layout/layout-item.component";
import * as i5 from "../layout/layout-definition.component";
import * as i6 from "../loading-wheel/loading-wheel.component";
import * as i7 from "../icon/layered-icon/status/status-icon.component";
import * as i8 from "../tooltip/tooltip.directive";
import * as i9 from "../tooltip/tooltip-zone.directive";
const _c0 = ["readonlyTemplate"];
const _c1 = ["actionLinkTemplate"];
const _c2 = ["internalLinkTemplate"];
const _c3 = ["externalLinkTemplate"];
function PropertyGridComponent_sme_layout_definition_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-layout-definition", 11);
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("until", ctx_r1.layoutItemWidth * 2)("columns", 2);
} }
function PropertyGridComponent_sme_layout_definition_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-layout-definition", 12);
} if (rf & 2) {
i0.ɵɵproperty("columns", 3);
} }
function PropertyGridComponent_sme_layout_item_5_span_6_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span", 20);
} if (rf & 2) {
const item_r14 = i0.ɵɵnextContext().$implicit;
const _r16 = i0.ɵɵreference(2);
i0.ɵɵproperty("title", item_r14.tooltip)("tooltipZone", _r16);
} }
function PropertyGridComponent_sme_layout_item_5_ng_container_9_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
const _c4 = function (a0, a1) { return { $implicit: a0, index: a1 }; };
function PropertyGridComponent_sme_layout_item_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "sme-layout-item", 13)(1, "div", 14, 15)(3, "label", 16)(4, "span");
i0.ɵɵtext(5);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(6, PropertyGridComponent_sme_layout_item_5_span_6_Template, 1, 2, "span", 17);
i0.ɵɵelementStart(7, "span", 18);
i0.ɵɵtext(8);
i0.ɵɵelementEnd()();
i0.ɵɵtemplate(9, PropertyGridComponent_sme_layout_item_5_ng_container_9_Template, 1, 0, "ng-container", 19);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const item_r14 = ctx.$implicit;
const i_r15 = ctx.index;
const ctx_r3 = i0.ɵɵnextContext();
i0.ɵɵproperty("columnSpan", item_r14.columnSpan)("maxWidth", ctx_r3.orientation === "vertical" ? null : item_r14.columnSpan * ctx_r3.layoutItemWidth);
i0.ɵɵadvance(5);
i0.ɵɵtextInterpolate(item_r14.label);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r14.tooltip);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(item_r14.tooltip);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", ctx_r3.getTemplate(item_r14))("ngTemplateOutletContext", i0.ɵɵpureFunction2(7, _c4, item_r14, i_r15));
} }
function PropertyGridComponent_ng_template_6_sme_loading_wheel_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-loading-wheel", 23);
} if (rf & 2) {
i0.ɵɵproperty("inline", true)("isBackgroundTransparent", true);
} }
function PropertyGridComponent_ng_template_6_ng_container_1_ng_container_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function PropertyGridComponent_ng_template_6_ng_container_1_span_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r20 = i0.ɵɵnextContext(2).$implicit;
const ctx_r25 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r25.stringifyValue(item_r20.value));
} }
function PropertyGridComponent_ng_template_6_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "p", 24);
i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_6_ng_container_1_ng_container_2_Template, 1, 0, "ng-container", 19);
i0.ɵɵtemplate(3, PropertyGridComponent_ng_template_6_ng_container_1_span_3_Template, 2, 1, "span", 22);
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r27 = i0.ɵɵnextContext();
const i_r21 = ctx_r27.index;
const item_r20 = ctx_r27.$implicit;
const ctx_r23 = i0.ɵɵnextContext();
const _r12 = i0.ɵɵreference(15);
i0.ɵɵadvance(1);
i0.ɵɵattribute("aria-labelledby", ctx_r23.idBag.labelSpan + i_r21)("aria-describedby", ctx_r23.idBag.detailsSpan + i_r21);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(5, _c4, item_r20, i_r21));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !item_r20.link && !item_r20.action);
} }
function PropertyGridComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, PropertyGridComponent_ng_template_6_sme_loading_wheel_0_Template, 1, 2, "sme-loading-wheel", 21);
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_6_ng_container_1_Template, 4, 8, "ng-container", 22);
} if (rf & 2) {
const item_r20 = ctx.$implicit;
i0.ɵɵproperty("ngIf", item_r20.loading && item_r20.isAsync);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !item_r20.loading || !item_r20.isAsync);
} }
function PropertyGridComponent_ng_template_8_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function PropertyGridComponent_ng_template_8_span_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 27);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r28 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r28.prefixString);
} }
function PropertyGridComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {
const _r34 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "p");
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_8_ng_container_1_Template, 1, 0, "ng-container", 19);
i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_8_span_2_Template, 2, 1, "span", 25);
i0.ɵɵelementStart(3, "a", 26);
i0.ɵɵlistener("click", function PropertyGridComponent_ng_template_8_Template_a_click_3_listener() { const restoredCtx = i0.ɵɵrestoreView(_r34); const item_r28 = restoredCtx.$implicit; return i0.ɵɵresetView(item_r28.action(item_r28)); });
i0.ɵɵtext(4);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const item_r28 = ctx.$implicit;
const i_r29 = ctx.index;
const ctx_r7 = i0.ɵɵnextContext();
const _r12 = i0.ɵɵreference(15);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(6, _c4, item_r28, i_r29));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r28.prefixString);
i0.ɵɵadvance(1);
i0.ɵɵattribute("aria-labelledby", ctx_r7.idBag.labelSpan + i_r29 + " " + (ctx_r7.idBag.valueSpan + i_r29))("aria-describedby", ctx_r7.idBag.detailsSpan + i_r29);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r28.value);
} }
function PropertyGridComponent_ng_template_10_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function PropertyGridComponent_ng_template_10_span_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 27);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r35 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r35.prefixString);
} }
function PropertyGridComponent_ng_template_10_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "p");
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_10_ng_container_1_Template, 1, 0, "ng-container", 19);
i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_10_span_2_Template, 2, 1, "span", 25);
i0.ɵɵelementStart(3, "a", 28);
i0.ɵɵtext(4);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "span", 29);
i0.ɵɵtext(6);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const item_r35 = ctx.$implicit;
const i_r36 = ctx.index;
const ctx_r9 = i0.ɵɵnextContext();
const _r12 = i0.ɵɵreference(15);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(8, _c4, item_r35, i_r36));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r35.prefixString);
i0.ɵɵadvance(1);
i0.ɵɵproperty("routerLink", item_r35.link);
i0.ɵɵattribute("aria-describedby", ctx_r9.idBag.detailsSpan + i_r36);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r35.value);
i0.ɵɵadvance(1);
i0.ɵɵproperty("id", ctx_r9.idBag.detailsSpan + i_r36);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r9.getInternalLinkDescription(item_r35));
} }
function PropertyGridComponent_ng_template_12_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function PropertyGridComponent_ng_template_12_span_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 27);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r40 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r40.prefixString);
} }
function PropertyGridComponent_ng_template_12_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "p");
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_12_ng_container_1_Template, 1, 0, "ng-container", 19);
i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_12_span_2_Template, 2, 1, "span", 25);
i0.ɵɵelementStart(3, "a", 30);
i0.ɵɵtext(4);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "span", 29);
i0.ɵɵtext(6);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const item_r40 = ctx.$implicit;
const i_r41 = ctx.index;
const ctx_r11 = i0.ɵɵnextContext();
const _r12 = i0.ɵɵreference(15);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(8, _c4, item_r40, i_r41));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r40.prefixString);
i0.ɵɵadvance(1);
i0.ɵɵproperty("href", item_r40.link, i0.ɵɵsanitizeUrl);
i0.ɵɵattribute("aria-describedby", ctx_r11.idBag.detailsSpan + i_r41);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r40.value);
i0.ɵɵadvance(1);
i0.ɵɵproperty("id", ctx_r11.idBag.detailsSpan + i_r41);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r11.getExternalLinkDescription(item_r40));
} }
function PropertyGridComponent_ng_template_14_span_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span");
} if (rf & 2) {
const item_r45 = i0.ɵɵnextContext().$implicit;
i0.ɵɵclassMapInterpolate1("sme-margin-right-xs sme-icon ", item_r45.iconClass, "");
} }
function PropertyGridComponent_ng_template_14_sme_status_icon_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-status-icon", 33);
} if (rf & 2) {
const item_r45 = i0.ɵɵnextContext().$implicit;
i0.ɵɵproperty("status", item_r45.status);
} }
function PropertyGridComponent_ng_template_14_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, PropertyGridComponent_ng_template_14_span_0_Template, 1, 3, "span", 31);
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_14_sme_status_icon_1_Template, 1, 1, "sme-status-icon", 32);
} if (rf & 2) {
const item_r45 = ctx.$implicit;
i0.ɵɵproperty("ngIf", !!item_r45.iconClass);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r45.status !== undefined && item_r45.status !== null && !item_r45.iconClass);
} }
/**
*
* @smeDoc {@label Property Grid @id sme-property-grid-component}
*
* @overview
* @file {@filepath ./examples/overview.md}
*
* @example {@label Basic Usage @id basic-usage}
* @file {@filename component.html @filepath ./examples/basic-usage.component.html}
*
* @example {@label Vertical Orientation @id vertical-orientation}
* @file {@filename component.html @filepath ./examples/vertical-orientation.component.html}
*
* @example {@label Item with a Link @id link-item}
* @file {@filename component.html @filepath ./examples/link-item.component.html}
*
* @example {@label Item with a Tooltip @id tooltip-item}
* @file {@filename component.html @filepath ./examples/tooltip-item.component.html}
*
* @example {@label Item with a Action @id action-item}
* @file {@filename component.ts @filepath ./examples/action-item.component.ts}
* @file {@filename component.html @filepath ./examples/action-item.component.html}
*
* @example {@label Item Spanning Multiple Columns @id multi-column}
* @file {@filename component.html @filepath ./examples/multi-column-item.component.html}
*
* @example {@label Items with Status and Icons @id status-and-icons}
* @file {@filename component.html @filepath ./examples/status-item.component.html}
*
* @example {@label Items with complex value types @id complex-value}
* @file {@filename component.html @filepath ./examples/complex-values.component.html}
*
*/
export class PropertyGridComponent extends CoreBaseComponent {
constructor(injector, layout) {
super(injector);
/**
* The basic column width for the property grid items.
*/
this.layoutItemWidth = 300;
/**
* The orientation for the property grid
*/
this.orientation = 'horizontal';
/**
* Implementation of the Layout interface
*/
this.layoutChanged = new EventEmitter();
/**
* Implementation of the Layout interface
*/
this.windowBreakpointChanged = new EventEmitter();
this.propertyGridResponsiveWindowManager = new PropertyGridResponsiveWindowManager();
// old style supported sme-property-grid-arrange-vertical class. default to vertical orientation if this class is applied.
const hasVerticalClass = this.hostElement.nativeElement.classList.contains('sme-property-grid-arrange-vertical');
this.orientation = hasVerticalClass ? 'vertical' : 'horizontal';
// on parent layout changes, re-emit the layout change to our event
if (layout) {
this.subscriptions.push(layout.layoutChanged.subscribe(() => {
this.layoutChanged.emit();
setTimeout(() => {
this.propertyGridResponsiveWindowManager.onWindowSizeChanged(this.hostElement.nativeElement);
});
}));
}
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'PropertyGridComponent';
}
stringifyValue(value) {
if (MsftSme.isNullOrWhiteSpace(value)) {
return '-';
}
if (Array.isArray(value)) {
return value.map(v => this.stringifyValue(v)).join(',\n');
}
if (MsftSme.isObject(value)) {
try {
return JSON.stringify(value, null, 2);
}
catch (error) {
return value;
}
}
return `${value}`;
}
getTemplate(item) {
if (item.action) {
return this.actionLinkTemplate;
}
if (item.link) {
if (item.isExternalLink) {
return this.externalLinkTemplate;
}
else {
return this.internalLinkTemplate;
}
}
return this.readonlyTemplate;
}
ngOnChanges(changes) {
super.ngOnChanges(changes);
if (changes.orientation) {
this.layoutChanged.emit();
}
}
/**
* It handles the undefined value won't be updated situation for async property item.
* Angular issue that the property item value initialized with undefined, if after async time, the value being set is still undefined,
* Angular will not be able to trigger the value on changed event. Thus we have to manually call to refresh it.
*
* @param index The index that needs to hard refresh.
*/
hardRefreshItem(index) {
if (!this.items) {
return;
}
const items = this.items.toArray();
if (!items[index]) {
return;
}
const item = items[index];
if (item.isAsync && item.value === undefined) {
item.loading = false;
}
}
getInternalLinkDescription(item) {
return this.strings.MsftSmeShell.Angular.PropertyGrid.InternalLink.label.format(item.link);
}
getExternalLinkDescription(item) {
return this.strings.MsftSmeShell.Angular.PropertyGrid.ExternalLink.label.format(item.link);
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
detailsSpan: '',
labelSpan: '',
valueSpan: ''
};
}
/**
* Gets the initial host classes to be applied to this element
*/
getInitialHostClasses() {
return super.getInitialHostClasses().concat([
'sme-property-grid',
'sme-layout-relative',
'sme-focus-zone'
]);
}
}
/** @nocollapse */ PropertyGridComponent.ɵfac = function PropertyGridComponent_Factory(t) { return new (t || PropertyGridComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(SME_LAYOUT_PROVIDER, 12)); };
/** @nocollapse */ PropertyGridComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: PropertyGridComponent, selectors: [["sme-property-grid"]], contentQueries: function PropertyGridComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
i0.ɵɵcontentQuery(dirIndex, PropertyGridItemComponent, 4);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.items = _t);
} }, viewQuery: function PropertyGridComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 7);
i0.ɵɵviewQuery(_c1, 7);
i0.ɵɵviewQuery(_c2, 7);
i0.ɵɵviewQuery(_c3, 7);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.readonlyTemplate = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.actionLinkTemplate = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.internalLinkTemplate = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.externalLinkTemplate = _t.first);
} }, inputs: { orientation: "orientation" }, outputs: { layoutChanged: "layoutChanged", windowBreakpointChanged: "windowBreakpointChanged" }, features: [i0.ɵɵProvidersFeature([
{ provide: SME_LAYOUT_PROVIDER, useExisting: forwardRef((() => PropertyGridComponent)) }
]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 16, vars: 7, consts: [[1, "sme-position-inset-none", "sme-position-stretch-h", 3, "padLastItem", "oneColumn"], ["layout", ""], ["name", "narrow", 3, "until", "columns"], ["name", "medium", 3, "until", "columns", 4, "ngIf"], ["name", "wide", 3, "columns", 4, "ngIf"], [3, "columnSpan", "maxWidth", 4, "ngFor", "ngForOf"], ["readonlyTemplate", ""], ["actionLinkTemplate", ""], ["internalLinkTemplate", ""], ["externalLinkTemplate", ""], ["iconTemplate", ""], ["name", "medium", 3, "until", "columns"], ["name", "wide", 3, "columns"], [3, "columnSpan", "maxWidth"], ["tabindex", "0", "aria-live", "polite", "aria-atomic", "true", "smeTooltipZone", "", 1, "sme-property-grid-item"], ["zone", "smeTooltipZone"], [1, "sme-arrange-stack-h"], ["class", "sme-position-flex-none sme-icon sme-icon-info sme-info-bubble sme-margin-left-xs", "aria-hidden", "true", "tabindex", "0", 3, "title", "tooltipZone", 4, "ngIf"], [1, "sme-screen-reader"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], ["aria-hidden", "true", "tabindex", "0", 1, "sme-position-flex-none", "sme-icon", "sme-icon-info", "sme-info-bubble", "sme-margin-left-xs", 3, "title", "tooltipZone"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent", 4, "ngIf"], [4, "ngIf"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent"], [1, "sme-read-only-template"], ["class", "sme-padding-right-xs", 4, "ngIf"], ["tabindex", "0", "role", "link", 1, "sme-link", "sme-focus-zone", "sme-action-link-template", 3, "click"], [1, "sme-padding-right-xs"], ["role", "link", 1, "sme-link", "sme-focus-zone", 3, "routerLink"], [1, "sme-screen-reader", 3, "id"], ["role", "link", "target", "_blank", 1, "sme-link", "sme-focus-zone", "sme-icon", "sme-icon-after", "sme-icon-openInNewWindow", 3, "href"], [3, "class", 4, "ngIf"], ["class", "sme-layout-inline-block sme-margin-right-xs ", "size", "16px", 3, "status", 4, "ngIf"], ["size", "16px", 1, "sme-layout-inline-block", "sme-margin-right-xs", 3, "status"]], template: function PropertyGridComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "sme-layout", 0, 1);
i0.ɵɵelement(2, "sme-layout-definition", 2);
i0.ɵɵtemplate(3, PropertyGridComponent_sme_layout_definition_3_Template, 1, 2, "sme-layout-definition", 3);
i0.ɵɵtemplate(4, PropertyGridComponent_sme_layout_definition_4_Template, 1, 1, "sme-layout-definition", 4);
i0.ɵɵtemplate(5, PropertyGridComponent_sme_layout_item_5_Template, 10, 10, "sme-layout-item", 5);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(6, PropertyGridComponent_ng_template_6_Template, 2, 2, "ng-template", null, 6, i0.ɵɵtemplateRefExtractor);
i0.ɵɵtemplate(8, PropertyGridComponent_ng_template_8_Template, 5, 9, "ng-template", null, 7, i0.ɵɵtemplateRefExtractor);
i0.ɵɵtemplate(10, PropertyGridComponent_ng_template_10_Template, 7, 11, "ng-template", null, 8, i0.ɵɵtemplateRefExtractor);
i0.ɵɵtemplate(12, PropertyGridComponent_ng_template_12_Template, 7, 11, "ng-template", null, 9, i0.ɵɵtemplateRefExtractor);
i0.ɵɵtemplate(14, PropertyGridComponent_ng_template_14_Template, 2, 2, "ng-template", null, 10, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
i0.ɵɵproperty("padLastItem", true)("oneColumn", ctx.orientation === "vertical");
i0.ɵɵadvance(2);
i0.ɵɵproperty("until", ctx.layoutItemWidth)("columns", 1);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.orientation !== "vertical");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.orientation !== "vertical");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", ctx.items);
} }, dependencies: [i1.RouterLink, i2.NgForOf, i2.NgIf, i2.NgTemplateOutlet, i3.LayoutComponent, i4.LayoutItemComponent, i5.LayoutDefinitionComponent, i6.LoadingWheelComponent, i7.StatusIconComponent, i8.TooltipDirective, i9.TooltipZoneDirective], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PropertyGridComponent, [{
type: Component,
args: [{ selector: 'sme-property-grid', providers: [
{ provide: SME_LAYOUT_PROVIDER, useExisting: forwardRef((() => PropertyGridComponent)) }
], template: "<sme-layout #layout [padLastItem]=\"true\" class=\"sme-position-inset-none sme-position-stretch-h\" [oneColumn]=\"orientation === 'vertical'\">\r\n <sme-layout-definition name=\"narrow\" [until]=\"layoutItemWidth\" [columns]=\"1\"></sme-layout-definition>\r\n <sme-layout-definition *ngIf=\"orientation !== 'vertical'\" name=\"medium\" [until]=\"layoutItemWidth*2\" [columns]=\"2\"></sme-layout-definition>\r\n <sme-layout-definition *ngIf=\"orientation !== 'vertical'\" name=\"wide\" [columns]=\"3\"></sme-layout-definition>\r\n <sme-layout-item *ngFor=\"let item of items; index as i\" [columnSpan]=\"item.columnSpan\"\r\n [maxWidth]=\"orientation === 'vertical' ? null : item.columnSpan * layoutItemWidth\">\r\n <div class=\"sme-property-grid-item\" tabindex=\"0\" aria-live=\"polite\" aria-atomic=\"true\" #zone=\"smeTooltipZone\" smeTooltipZone>\r\n <label class=\"sme-arrange-stack-h\">\r\n <span>{{ item.label }}</span>\r\n <span *ngIf=\"item.tooltip\" class=\"sme-position-flex-none sme-icon sme-icon-info sme-info-bubble sme-margin-left-xs\"\r\n [title]=\"item.tooltip\" [tooltipZone]=\"zone\" aria-hidden=\"true\" tabindex=\"0\"></span>\r\n <!-- in scan mode screen reader does not focus on the info icon properly to read the title -->\r\n <span class=\"sme-screen-reader\">{{ item.tooltip }}</span>\r\n </label>\r\n <ng-container *ngTemplateOutlet=\"getTemplate(item);context:{$implicit:item, index: i}\"></ng-container>\r\n </div>\r\n </sme-layout-item>\r\n</sme-layout>\r\n\r\n<!-- Read only -->\r\n<ng-template #readonlyTemplate let-item let-i=\"index\">\r\n <sme-loading-wheel *ngIf=\"item.loading && item.isAsync\" size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\"></sme-loading-wheel>\r\n <ng-container *ngIf=\"!item.loading || !item.isAsync\">\r\n <p class=\"sme-read-only-template\" [attr.aria-labelledby]=\"idBag.labelSpan + i\" [attr.aria-describedby]=\"idBag.detailsSpan + i\">\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"!item.link && !item.action\">{{ stringifyValue(item.value) }}</span>\r\n </p>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Action link (role button) -->\r\n<ng-template #actionLinkTemplate let-item let-i=\"index\">\r\n <p>\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"item.prefixString\" class=\"sme-padding-right-xs\">{{ item.prefixString }}</span>\r\n <a tabindex=\"0\" class=\"sme-link sme-focus-zone sme-action-link-template\" role=\"link\" (click)=\"item.action(item)\"\r\n [attr.aria-labelledby]=\"(idBag.labelSpan + i) + ' ' + (idBag.valueSpan + i)\"\r\n [attr.aria-describedby]=\"idBag.detailsSpan + i\">{{ item.value }}</a>\r\n </p>\r\n</ng-template>\r\n\r\n<!-- Internal link -->\r\n<ng-template #internalLinkTemplate let-item let-i=\"index\">\r\n <p>\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"item.prefixString\" class=\"sme-padding-right-xs\">{{ item.prefixString }}</span>\r\n <a class=\"sme-link sme-focus-zone\" role=\"link\" [routerLink]=\"item.link\"\r\n [attr.aria-describedby]=\"idBag.detailsSpan + i\">{{ item.value }}</a>\r\n <span class=\"sme-screen-reader\" [id]=\"idBag.detailsSpan + i\">{{ getInternalLinkDescription(item) }}</span>\r\n </p>\r\n</ng-template>\r\n\r\n<!-- External link -->\r\n<ng-template #externalLinkTemplate let-item let-i=\"index\">\r\n <p>\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"item.prefixString\" class=\"sme-padding-right-xs\">{{ item.prefixString }}</span>\r\n <a class=\"sme-link sme-focus-zone sme-icon sme-icon-after sme-icon-openInNewWindow\" role=\"link\" [href]=\"item.link\" target=\"_blank\"\r\n [attr.aria-describedby]=\"idBag.detailsSpan + i\">{{ item.value }}</a>\r\n <span class=\"sme-screen-reader\" [id]=\"idBag.detailsSpan + i\">{{ getExternalLinkDescription(item) }}</span>\r\n </p>\r\n</ng-template>\r\n\r\n<!-- Icon Template -->\r\n<ng-template #iconTemplate let-item let-i=\"index\">\r\n <span *ngIf=\"!!item.iconClass\" class=\"sme-margin-right-xs sme-icon {{item.iconClass}}\"></span>\r\n <sme-status-icon *ngIf=\"item.status !== undefined && item.status !== null && !item.iconClass\" class=\"sme-layout-inline-block sme-margin-right-xs \"\r\n [status]=\"item.status\" size=\"16px\"></sme-status-icon>\r\n</ng-template>\r\n" }]
}], function () { return [{ type: i0.Injector }, { type: undefined, decorators: [{
type: SkipSelf
}, {
type: Optional
}, {
type: Inject,
args: [SME_LAYOUT_PROVIDER]
}] }]; }, { items: [{
type: ContentChildren,
args: [PropertyGridItemComponent]
}], readonlyTemplate: [{
type: ViewChild,
args: ['readonlyTemplate', { static: true }]
}], actionLinkTemplate: [{
type: ViewChild,
args: ['actionLinkTemplate', { static: true }]
}], internalLinkTemplate: [{
type: ViewChild,
args: ['internalLinkTemplate', { static: true }]
}], externalLinkTemplate: [{
type: ViewChild,
args: ['externalLinkTemplate', { static: true }]
}], orientation: [{
type: Input
}], layoutChanged: [{
type: Output
}], windowBreakpointChanged: [{
type: Output
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvcHJvcGVydHktZ3JpZC9wcm9wZXJ0eS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBRVQsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7SUNsQjlGLDRDQUEwSTs7O0lBQWxFLGtEQUEyQixjQUFBOzs7SUFDbkcsNENBQTRHOztJQUF0QywyQkFBYTs7O0lBTTdFLDJCQUNxRjs7OztJQUFuRix3Q0FBc0IscUJBQUE7OztJQUkxQix3QkFBc0c7Ozs7SUFWMUcsMkNBQ3FGLGtCQUFBLGdCQUFBLFdBQUE7SUFHekUsWUFBZ0I7SUFBQSxpQkFBTztJQUM3QiwyRkFDcUY7SUFFckYsZ0NBQWdDO0lBQUEsWUFBa0I7SUFBQSxpQkFBTyxFQUFBO0lBRTNELDJHQUFzRztJQUN4RyxpQkFBTSxFQUFBOzs7OztJQVhnRCxnREFB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XG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgZm9yd2FyZFJlZixcclxuICAgIEluamVjdCxcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPcHRpb25hbCxcclxuICAgIE91dHB1dCxcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBTa2lwU2VsZixcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvcmVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2Jhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTGF5b3V0LCBTTUVfTEFZT1VUX1BST1ZJREVSIH0gZnJvbSAnLi4vY29tbW9uL2xheW91dCc7XHJcbmltcG9ydCB7IFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWdyaWQtaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eUdyaWRSZXNwb25zaXZlV2luZG93TWFuYWdlciB9IGZyb20gJy4vcHJvcGVydHktZ3JpZC1yZXNwb25zaXZlLXdpbmRvdy1tYW5hZ2VyJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgcGFuZSBvcmllbnRhdGlvbiBvZiB0aGUgc3BsaXQgdmlldy5cclxuICovXHJcbmV4cG9ydCB0eXBlIFByb3BlcnR5R3JpZE9yaWVudGF0aW9uID0gJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJztcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAc21lRG9jIHtAbGFiZWwgUHJvcGVydHkgR3JpZCBAaWQgc21lLXByb3BlcnR5LWdyaWQtY29tcG9uZW50fVxyXG4gKlxyXG4gKiBAb3ZlcnZpZXdcclxuICogQGZpbGUge0BmaWxlcGF0aCAuL2V4YW1wbGVzL292ZXJ2aWV3Lm1kfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIEJhc2ljIFVzYWdlIEBpZCBiYXNpYy11c2FnZX1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9iYXNpYy11c2FnZS5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBWZXJ0aWNhbCBPcmllbnRhdGlvbiBAaWQgdmVydGljYWwtb3JpZW50YXRpb259XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvdmVydGljYWwtb3JpZW50YXRpb24uY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgSXRlbSB3aXRoIGEgTGluayBAaWQgbGluay1pdGVtfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2xpbmstaXRlbS5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBJdGVtIHdpdGggYSBUb29sdGlwIEBpZCB0b29sdGlwLWl0ZW19XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvdG9vbHRpcC1pdGVtLmNvbXBvbmVudC5odG1sfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIEl0ZW0gd2l0aCBhIEFjdGlvbiBAaWQgYWN0aW9uLWl0ZW19XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50LnRzIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2FjdGlvbi1pdGVtLmNvbXBvbmVudC50c31cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9hY3Rpb24taXRlbS5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBJdGVtIFNwYW5uaW5nIE11bHRpcGxlIENvbHVtbnMgQGlkIG11bHRpLWNvbHVtbn1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9tdWx0aS1jb2x1bW4taXRlbS5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBJdGVtcyB3aXRoIFN0YXR1cyBhbmQgSWNvbnMgQGlkIHN0YXR1cy1hbmQtaWNvbnN9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvc3RhdHVzLWl0ZW0uY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgSXRlbXMgd2l0aCBjb21wbGV4IHZhbHVlIHR5cGVzIEBpZCBjb21wbGV4LXZhbHVlfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2NvbXBsZXgtdmFsdWVzLmNvbXBvbmVudC5odG1sfVxyXG4gKlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1wcm9wZXJ0eS1ncmlkJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9wcm9wZXJ0eS1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIHsgcHJvdmlkZTogU01FX0xBWU9VVF9QUk9WSURFUiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUHJvcGVydHlHcmlkQ29tcG9uZW50KSB9XHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUdyaWRDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIExheW91dCwgT25DaGFuZ2VzIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJhc2ljIGNvbHVtbiB3aWR0aCBmb3IgdGhlIHByb3BlcnR5IGdyaWQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsYXlvdXRJdGVtV2lkdGggPSAzMDA7XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihQcm9wZXJ0eUdyaWRJdGVtQ29tcG9uZW50KVxyXG4gICAgcHVibGljIGl0ZW1zOiBRdWVyeUxpc3Q8UHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgncmVhZG9ubHlUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICBwdWJsaWMgcmVhZG9ubHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8UHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnYWN0aW9uTGlua1RlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHB1YmxpYyBhY3Rpb25MaW5rVGVtcGxhdGU6IFRlbXBsYXRlUmVmPFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2ludGVybmFsTGlua1RlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHB1YmxpYyBpbnRlcm5hbExpbmtUZW1wbGF0ZTogVGVtcGxhdGVSZWY8UHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnZXh0ZXJuYWxMaW5rVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHVibGljIGV4dGVybmFsTGlua1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxQcm9wZXJ0eUdyaWRJdGVtQ29tcG9uZW50PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnUHJvcGVydHlHcmlkQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvcmllbnRhdGlvbiBmb3IgdGhlIHByb3BlcnR5IGdyaWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBvcmllbnRhdGlvbjogUHJvcGVydHlHcmlkT3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTGF5b3V0IGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBsYXlvdXRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTGF5b3V0IGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyB3aW5kb3dCcmVha3BvaW50Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIHByaXZhdGUgcHJvcGVydHlHcmlkUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIgPSBuZXcgUHJvcGVydHlHcmlkUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIEBJbmplY3QoU01FX0xBWU9VVF9QUk9WSURFUikgbGF5b3V0OiBMYXlvdXQpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICAgICAgLy8gb2xkIHN0eWxlIHN1cHBvcnRlZCBzbWUtcHJvcGVydHktZ3JpZC1hcnJhbmdlLXZlcnRpY2FsIGNsYXNzLiBkZWZhdWx0IHRvIHZlcnRpY2FsIG9yaWVudGF0aW9uIGlmIHRoaXMgY2xhc3MgaXMgYXBwbGllZC5cclxuICAgICAgICBjb25zdCBoYXNWZXJ0aWNhbENsYXNzID0gKDxIVE1MRWxlbWVudD50aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnc21lLXByb3BlcnR5LWdyaWQtYXJyYW5nZS12ZXJ0aWNhbCcpO1xyXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBoYXNWZXJ0aWNhbENsYXNzID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcclxuXHJcbiAgICAgICAgLy8gb24gcGFyZW50IGxheW91dCBjaGFuZ2VzLCByZS1lbWl0IHRoZSBsYXlvdXQgY2hhbmdlIHRvIG91ciBldmVudFxyXG4gICAgICAgIGlmIChsYXlvdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgICAgICBsYXlvdXQubGF5b3V0Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Q2hhbmdlZC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydHlHcmlkUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIub25XaW5kb3dTaXplQ2hhbmdlZCh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAoTXNmdFNtZS5pc051bGxPcldoaXRlU3BhY2UodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKHYgPT4gdGhpcy5zdHJpbmdpZnlWYWx1ZSh2KSkuam9pbignLFxcbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTXNmdFNtZS5pc09iamVjdCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMik7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRlbXBsYXRlKGl0ZW06IFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQpIHtcclxuICAgICAgICBpZiAoaXRlbS5hY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9uTGlua1RlbXBsYXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5saW5rKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmlzRXh0ZXJuYWxMaW5rKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlcm5hbExpbmtUZW1wbGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsTGlua1RlbXBsYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRvbmx5VGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuICAgICAgICBpZiAoY2hhbmdlcy5vcmllbnRhdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dENoYW5nZWQuZW1pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIHVuZGVmaW5lZCB2YWx1ZSB3b24ndCBiZSB1cGRhdGVkIHNpdHVhdGlvbiBmb3IgYXN5bmMgcHJvcGVydHkgaXRlbS5cclxuICAgICAqIEFuZ3VsYXIgaXNzdWUgdGhhdCB0aGUgcHJvcGVydHkgaXRlbSB2YWx1ZSBpbml0aWFsaXplZCB3aXRoIHVuZGVmaW5lZCwgaWYgYWZ0ZXIgYXN5bmMgdGltZSwgdGhlIHZhbHVlIGJlaW5nIHNldCBpcyBzdGlsbCB1bmRlZmluZWQsXHJcbiAgICAgKiBBbmd1bGFyIHdpbGwgbm90IGJlIGFibGUgdG8gdHJpZ2dlciB0aGUgdmFsdWUgb24gY2hhbmdlZCBldmVudC4gVGh1cyB3ZSBoYXZlIHRvIG1hbnVhbGx5IGNhbGwgdG8gcmVmcmVzaCBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRoYXQgbmVlZHMgdG8gaGFyZCByZWZyZXNoLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFyZFJlZnJlc2hJdGVtKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zLnRvQXJyYXkoKTtcclxuICAgICAgICBpZiAoIWl0ZW1zW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChpdGVtLmlzQXN5bmMgJiYgaXRlbS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW50ZXJuYWxMaW5rRGVzY3JpcHRpb24oaXRlbTogUHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuUHJvcGVydHlHcmlkLkludGVybmFsTGluay5sYWJlbC5mb3JtYXQoaXRlbS5saW5rKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RXh0ZXJuYWxMaW5rRGVzY3JpcHRpb24oaXRlbTogUHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuUHJvcGVydHlHcmlkLkV4dGVybmFsTGluay5sYWJlbC5mb3JtYXQoaXRlbS5saW5rKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGlkQmFnIHVzZWQgYnkgdGhpcyBjb21wb25lbnQgdG8gc3RvcmUgdW5pcXVlIGVsZW1lbnQgaWRzLlxyXG4gICAgICogaWQgdmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgYmUgdGhlIEBzZWUgQmFzZUNvbXBvbmVudCBzdXBlciBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRldGFpbHNTcGFuOiAnJyxcclxuICAgICAgICAgICAgbGFiZWxTcGFuOiAnJyxcclxuICAgICAgICAgICAgdmFsdWVTcGFuOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBpbml0aWFsIGhvc3QgY2xhc3NlcyB0byBiZSBhcHBsaWVkIHRvIHRoaXMgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXRJbml0aWFsSG9zdENsYXNzZXMoKS5jb25jYXQoW1xyXG4gICAgICAgICAgICAnc21lLXByb3BlcnR5LWdyaWQnLFxyXG4gICAgICAgICAgICAnc21lLWxheW91dC1yZWxhdGl2ZScsXHJcbiAgICAgICAgICAgICdzbWUtZm9jdXMtem9uZSdcclxuICAgICAgICBdKTtcclxuICAgIH1cclxufVxyXG4iLCI8c21lLWxheW91dCAjbGF5b3V0IFtwYWRMYXN0SXRlbV09XCJ0cnVlXCIgY2xhc3M9XCJzbWUtcG9zaXRpb24taW5zZXQtbm9uZSBzbWUtcG9zaXRpb24tc3RyZXRjaC1oXCIgW29uZUNvbHVtbl09XCJvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiPlxyXG4gIDxzbWUtbGF5b3V0LWRlZmluaXRpb24gbmFtZT1cIm5hcnJvd1wiIFt1bnRpbF09XCJsYXlvdXRJdGVtV2lkdGhcIiBbY29sdW1uc109XCIxXCI+PC9zbWUtbGF5b3V0LWRlZmluaXRpb24+XHJcbiAgPHNtZS1sYXlvdXQtZGVmaW5pdGlvbiAqbmdJZj1cIm9yaWVudGF0aW9uICE9PSAndmVydGljYWwnXCIgbmFtZT1cIm1lZGl1bVwiIFt1bnRpbF09XCJsYXlvdXRJdGVtV2lkdGgqMlwiIFtjb2x1bW5zXT1cIjJcIj48L3NtZS1sYXlvdXQtZGVmaW5pdGlvbj5cclxuICA8c21lLWxheW91dC1kZWZpbml0aW9uICpuZ0lmPVwib3JpZW50YXRpb24gIT09ICd2ZXJ0aWNhbCdcIiBuYW1lPVwid2lkZVwiIFtjb2x1bW5zXT1cIjNcIj48L3NtZS1sYXlvdXQtZGVmaW5pdGlvbj5cclxuICA8c21lLWxheW91dC1pdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpXCIgW2NvbHVtblNwYW5dPVwiaXRlbS5jb2x1bW5TcGFuXCJcclxuICAgIFttYXhXaWR0aF09XCJvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IG51bGwgOiBpdGVtLmNvbHVtblNwYW4gKiBsYXlvdXRJdGVtV2lkdGhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtcHJvcGVydHktZ3JpZC1pdGVtXCIgdGFiaW5kZXg9XCIwXCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCIgI3pvbmU9XCJzbWVUb29sdGlwWm9uZVwiIHNtZVRvb2x0aXBab25lPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oXCI+XHJcbiAgICAgICAgPHNwYW4+e