ng-devui
Version:
DevUI components based on Angular
305 lines • 66.8 kB
JavaScript
import { ChangeDetectorRef, Component, ComponentFactoryResolver, ElementRef, HostBinding, Inject, Input, NgZone, ViewChild, } from '@angular/core';
import { I18nFormat, I18nService } from 'ng-devui/i18n';
import { InputNumberComponent } from 'ng-devui/input-number';
import { SelectComponent } from 'ng-devui/select';
import { TreeSelectComponent } from 'ng-devui/tree-select';
import { stopPropagationIfExist } from 'ng-devui/utils';
import { Subject, fromEvent } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { DATA_TABLE_ROW } from './data-table-row.token';
import { DATA_TABLE } from './data-table.token';
import { EditorDirective } from './editor-host.directive';
import { DataTableColumnTmplComponent } from './tmpl/data-table-column-tmpl.component';
import * as i0 from "@angular/core";
import * as i1 from "ng-devui/i18n";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "ng-devui/common";
import * as i5 from "ng-devui/datepicker";
import * as i6 from "./editor-host.directive";
import * as i7 from "ng-devui/utils";
import * as i8 from "./display-cell-value.pipe";
export class DataTableCellComponent {
get isEditable() {
return this.column.editable && !this.isCellEdit && this.column.extraOptions?.editableTip !== 'btn' && !this.fieldEditDenied;
}
constructor(dt, rowComponent, i18n, changeDetectorRef, componentFactoryResolver, cellRef, ngZone) {
this.dt = dt;
this.rowComponent = rowComponent;
this.i18n = i18n;
this.changeDetectorRef = changeDetectorRef;
this.componentFactoryResolver = componentFactoryResolver;
this.cellRef = cellRef;
this.ngZone = ngZone;
this.clickCount = 0; // 记录点击次数
this.unsubscribe$ = new Subject();
}
ngOnInit() {
this.forceUpdateSubscription = this.rowComponent.forceUpdateEvent.subscribe(() => this.forceUpdate());
if (this.column.editable) {
this.tdMousedownSubscription = fromEvent(this.cellRef.nativeElement, 'mousedown').subscribe(() => {
this.clickInTd = true;
});
this.tdMouseupSubscription = fromEvent(this.cellRef.nativeElement, 'mouseup').subscribe(() => {
this.clickInTd = false;
});
}
this.ngZone.runOutsideAngular(() => {
this.cellRef.nativeElement.addEventListener('mouseup', this.onCellClick.bind(this));
this.cellRef.nativeElement.addEventListener('dblclick', this.onCellDBClick.bind(this));
});
this.lang = I18nFormat.getLocaleAndLang().currentLanguage;
this.i18n
.langChange()
.pipe(takeUntil(this.unsubscribe$))
.subscribe(() => {
this.lang = I18nFormat.getLocaleAndLang().currentLanguage;
});
}
ngOnChanges(changes) {
const rowItem = changes.rowItem;
if (rowItem) {
this.updateEditable(rowItem);
}
}
updateEditable(rowItem) {
const currentConfig = rowItem.currentValue.$editDeniedConfig;
if (!currentConfig) {
if (this.fieldEditDenied) {
this.fieldEditDenied = false;
}
}
else {
const index = currentConfig.findIndex((config) => {
return config === this.column.field;
});
if (index === -1) {
if (this.fieldEditDenied) {
this.fieldEditDenied = false;
}
}
else {
if (!this.fieldEditDenied) {
this.fieldEditDenied = true;
}
}
}
}
onCellClick($event) {
const cellSelectedEventArg = {
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent,
event: $event,
};
this.clickCount++;
if (this.clickCount === 1) {
this.timeoutId = setTimeout(() => {
if (this.clickCount === 1) {
this.dt.onCellClick(cellSelectedEventArg);
}
this.clickCount = 0;
clearTimeout(this.timeoutId);
}, this.timeout);
}
}
onCellDBClick($event) {
const cellSelectedEventArg = {
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent,
};
this.dt.onCellDBClick(cellSelectedEventArg);
}
forceUpdate() {
this.changeDetectorRef.markForCheck();
}
finishCellEdit($event) {
if (this.editModel !== 'cell') {
return;
}
this.isCellEdit = false;
this.editorHost.viewContainerRef.clear();
this.dynamicEditorActive = false;
this.templateEditorActive = false;
if (this.documentClickSubscription) {
this.unSubscription(this.documentClickSubscription);
}
if (this.cellEditorClickSubscription) {
this.unSubscription(this.cellEditorClickSubscription);
}
stopPropagationIfExist($event);
this.dt.onCellEditEnd({
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent,
});
}
isCellEditEnable(column, rowItem) {
if (this.editModel === 'cell') {
return this.isCellEdit;
}
return this.isEditRow;
}
ngOnDestroy() {
if (this.forceUpdateSubscription) {
this.unSubscription(this.forceUpdateSubscription);
}
if (this.documentClickSubscription) {
this.unSubscription(this.documentClickSubscription);
}
if (this.cellEditorClickSubscription) {
this.unSubscription(this.cellEditorClickSubscription);
}
if (this.cellActionSubscription) {
this.unSubscription(this.cellActionSubscription);
}
if (this.tdMousedownSubscription) {
this.unSubscription(this.tdMousedownSubscription);
}
if (this.tdMouseupSubscription) {
this.unSubscription(this.tdMouseupSubscription);
}
if (this.unsubscribe$) {
this.unsubscribe$.unsubscribe();
}
}
unSubscription(sbscription) {
if (sbscription) {
sbscription.unsubscribe();
/* eslint-disable-next-line no-param-reassign */
sbscription = null;
}
}
creatCellEditor() {
let componentFactory;
let editorComponent;
switch (this.column.fieldType) {
case 'number':
editorComponent = InputNumberComponent;
break;
case 'select':
editorComponent = SelectComponent;
break;
case 'treeSelect':
editorComponent = TreeSelectComponent;
break;
default:
this.templateEditorActive = true;
}
if (editorComponent) {
componentFactory = this.componentFactoryResolver.resolveComponentFactory(editorComponent);
const viewContainerRef = this.editorHost.viewContainerRef;
viewContainerRef.clear();
const componentRef = viewContainerRef.createComponent(componentFactory);
const componentInstance = componentRef.instance;
if (this.column.extraOptions) {
componentFactory.inputs.forEach((input) => {
if (this.column.extraOptions[input.templateName]) {
componentInstance[input.propName] = this.column.extraOptions[input.templateName];
}
});
}
componentInstance.writeValue(this.rowItem[this.column.field]);
componentInstance.registerOnChange((value) => {
this.rowItem[this.column.field] = value;
if (this.column.extraOptions && this.column.extraOptions.finishEditingAfterValueChange) {
this.finishCellEdit();
}
});
this.dynamicEditorActive = true;
}
}
cellEditing($event) {
$event.stopPropagation();
$event.preventDefault();
let beforeEdit = Promise.resolve(undefined);
if (this.dt.beforeCellEdit) {
beforeEdit = this.dt.beforeCellEdit(this.rowItem, this.column);
}
beforeEdit.then((extraOptions) => {
if (extraOptions) {
this.column.extraOptions = extraOptions;
}
this.dt.cellEditorClickEvent.emit($event);
const cellSelectedEventArg = {
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent,
};
if (this.column.editable && this.editModel === 'cell') {
this.isCellEdit = true;
this.creatCellEditor();
this.documentClickSubscription = this.dt.documentClickEvent.subscribe((event) => {
const containTarget = !this.cellRef.nativeElement.contains(event.target) && !this.clickInTd;
const flag = this.dt.beforeCellEditEnd && containTarget ? this.dt.beforeCellEditEnd(this.rowItem, this.column) : true;
if ((event === 'cancel' || containTarget) && flag) {
this.ngZone.run(() => {
this.finishCellEdit();
});
}
this.clickInTd = false;
});
this.cellEditorClickSubscription = this.dt.cellEditorClickEvent.subscribe((event) => {
const containTarget = this.cellRef.nativeElement.contains(event.target);
const flag = this.dt.beforeCellEditEnd && !containTarget ? this.dt.beforeCellEditEnd(this.rowItem, this.column) : true;
if (!containTarget && flag) {
this.finishCellEdit();
}
});
this.dt.onCellEditStart(cellSelectedEventArg);
}
});
}
toggleChildTable(rowItem) {
rowItem.$isChildTableOpen = !rowItem.$isChildTableOpen;
this.dt.setRowChildToggleStatus(rowItem, rowItem.$isChildTableOpen);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableCellComponent, deps: [{ token: DATA_TABLE }, { token: DATA_TABLE_ROW }, { token: i1.I18nService }, { token: i0.ChangeDetectorRef }, { token: i0.ComponentFactoryResolver }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataTableCellComponent, selector: "d-data-table-cell,[dDataTableCell]", inputs: { rowIndex: "rowIndex", colIndex: "colIndex", column: "column", rowItem: "rowItem", editModel: "editModel", isEditRow: "isEditRow", timeout: "timeout", tableLevel: "tableLevel" }, host: { properties: { "class.editable-cell": "this.isEditable" } }, viewQueries: [{ propertyName: "editorHost", first: true, predicate: EditorDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template *ngIf=\"!column.editable || fieldEditDenied\" [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\n\n<ng-container *ngIf=\"column.editable && !fieldEditDenied\">\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip === 'btn'\" class=\"cell-container\">\n <div class=\"cell-container-inner not-break modify-holder\">\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\n <span class=\"cell-modify\" (click)=\"cellEditing($event)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" version=\"1.1\">\n <g fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <path\n d=\"M 9.48528 3.41421 L 10.8995 2 L 13.7279 4.82843 L 12.3137 6.24264 L 9.48528 3.41421 Z M 5.24264 13.3137 L 2.41421 13.3137 L 2.41421 10.4853 L 8.77817 4.12132 L 11.6066 6.94975 L 5.24264 13.3137 Z\"\n />\n </g>\n </svg>\n </span>\n </div>\n </div>\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip !== 'btn'\" class=\"cell-editable\" (click)=\"cellEditing($event)\">\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\n </div>\n <div [ngClass]=\"{ 'edit-padding-fix': dynamicEditorActive }\">\n <ng-template dEditorHost></ng-template>\n </div>\n <ng-template\n *ngIf=\"templateEditorActive\"\n [ngTemplateOutlet]=\"column.cellEditCmp ? column.cellEditCmp.template : column.fieldType === 'date' ? dateEditTempate : textEditTempate\"\n [ngTemplateOutletContext]=\"{\n rowIndex: rowIndex,\n colIndex: colIndex,\n column: column,\n rowItem: rowItem,\n $implicit: this,\n row: rowComponent\n }\"\n >\n </ng-template>\n</ng-container>\n\n<ng-template #cellViewTemp>\n <ng-container *ngIf=\"column.nestedColumn\">\n <span *ngIf=\"tableLevel > 0\" class=\"cell-placeholder\" [ngStyle]=\"{ width: tableLevel * column.nestedColumnIndent + 'px' }\"></span>\n <span [style.visibility]=\"rowItem.children ? 'visible' : 'hidden'\" class=\"childtable-toggler\" (click)=\"toggleChildTable(rowItem)\">\n <ng-container *ngIf=\"rowItem['$isChildTableOpen']\">\n <svg\n *ngIf=\"!column.extraOptions?.iconFoldTable\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-close\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <rect x=\"4\" y=\"7\" width=\"8\" height=\"2\"></rect>\n </g>\n </svg>\n\n <span *ngIf=\"column.extraOptions?.iconFoldTable\" [innerHTML]=\"column.extraOptions?.iconFoldTable | safe : 'html'\"></span>\n </ng-container>\n <ng-container *ngIf=\"!rowItem['$isChildTableOpen']\">\n <svg\n *ngIf=\"!column.extraOptions?.iconUnFoldTable\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-open-folder\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <path\n d=\"M8.75,4 L8.75,7.25 L12,7.25 L12,8.75 L8.749,8.75 L8.75,12 L7.25,12 L7.249,8.75 L4,8.75 L4,7.25 L7.25,7.25 L7.25,4 L8.75,4 Z\"\n ></path>\n </g>\n </svg>\n <span *ngIf=\"column.extraOptions?.iconUnFoldTable\" [innerHTML]=\"column.extraOptions?.iconUnFoldTable | safe : 'html'\"></span>\n </ng-container>\n </span>\n </ng-container>\n <ng-template\n [ngTemplateOutlet]=\"column.cellCmp ? column.cellCmp.template : textViewTemplate\"\n [ngTemplateOutletContext]=\"{\n rowIndex: rowIndex,\n colIndex: colIndex,\n column: column,\n rowItem: rowItem,\n cellItem: rowItem[column.field],\n cellValue: rowItem | disPlayCellValuePipe : rowIndex : column : lang,\n $implicit: this,\n row: rowComponent,\n tableLevel: tableLevel\n }\"\n >\n </ng-template>\n</ng-template>\n\n<ng-template let-cellValue=\"cellValue\" #textViewTemplate>\n <span [attr.title]=\"cellValue\">{{ cellValue }}</span>\n</ng-template>\n\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #textEditTempate>\n <form class=\"form-inline edit-padding-fix\">\n <div class=\"form-group full-width\">\n <div class=\"input-group full-width\">\n <input\n [dAutoFocus]=\"cell && cell.isCellEdit\"\n [type]=\"column.fieldType\"\n class=\"devui-form-control\"\n [name]=\"column.field\"\n [(ngModel)]=\"rowItem[column.field]\"\n [attr.maxlength]=\"column.extraOptions?.maxlength\"\n [attr.minlength]=\"column.extraOptions?.minlength\"\n [attr.pattern]=\"column.extraOptions?.pattern\"\n (keydown.enter)=\"cell && cell.finishCellEdit($event)\"\n [placeholder]=\"column.placeholder || ''\"\n />\n </div>\n </div>\n </form>\n</ng-template>\n\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #dateEditTempate>\n <form class=\"form-inline edit-padding-fix\">\n <div class=\"devui-form-group\">\n <div class=\"devui-input-group devui-dropdown-origin\">\n <input\n class=\"devui-form-control search\"\n [name]=\"column.field\"\n [(ngModel)]=\"rowItem[column.field]\"\n dDatepicker\n appendToBody\n [dateFormat]=\"column.extraOptions?.dateFormat\"\n #datePicker=\"datepicker\"\n (ngModelChange)=\"!column.extraOptions?.showTime && cell && cell.finishCellEdit()\"\n [maxDate]=\"column.extraOptions?.maxDate\"\n [minDate]=\"column.extraOptions?.minDate\"\n [cssClass]=\"column.extraOptions?.cssClass\"\n [dateConfig]=\"column.extraOptions?.dateConfig\"\n [locale]=\"column.extraOptions?.locale\"\n [customViewTemplate]=\"column.extraOptions?.customViewTemplate\"\n [disabled]=\"column.extraOptions?.disabled\"\n [placeholder]=\"column.placeholder || ''\"\n [autoOpen]=\"true\"\n [showTime]=\"column.extraOptions?.showTime\"\n />\n <div class=\"devui-input-group-addon\" (click)=\"datePicker.toggle()\">\n <i class=\"icon icon-calendar\"></i>\n </div>\n </div>\n </div>\n </form>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.AutoFocusDirective, selector: "[dAutoFocus]", inputs: ["dAutoFocus"] }, { kind: "component", type: i5.DatePickerAppendToBodyComponent, selector: "[dDatepicker][appendToBody]", inputs: ["appendToBodyDirections", "locale", "cssClass", "disabled", "dateConverter", "customViewTemplate", "autoOpen", "showAnimation", "showTime", "dateConfig", "dateFormat", "maxDate", "minDate"], outputs: ["selectedDateChange"], exportAs: ["datepicker"] }, { kind: "directive", type: i6.EditorDirective, selector: "[dEditorHost]" }, { kind: "pipe", type: i7.SafePipe, name: "safe" }, { kind: "pipe", type: i8.DisPlayCellValuePipe, name: "disPlayCellValuePipe" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableCellComponent, decorators: [{
type: Component,
args: [{ selector: 'd-data-table-cell,[dDataTableCell]', preserveWhitespaces: false, template: "<ng-template *ngIf=\"!column.editable || fieldEditDenied\" [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\n\n<ng-container *ngIf=\"column.editable && !fieldEditDenied\">\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip === 'btn'\" class=\"cell-container\">\n <div class=\"cell-container-inner not-break modify-holder\">\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\n <span class=\"cell-modify\" (click)=\"cellEditing($event)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" version=\"1.1\">\n <g fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <path\n d=\"M 9.48528 3.41421 L 10.8995 2 L 13.7279 4.82843 L 12.3137 6.24264 L 9.48528 3.41421 Z M 5.24264 13.3137 L 2.41421 13.3137 L 2.41421 10.4853 L 8.77817 4.12132 L 11.6066 6.94975 L 5.24264 13.3137 Z\"\n />\n </g>\n </svg>\n </span>\n </div>\n </div>\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip !== 'btn'\" class=\"cell-editable\" (click)=\"cellEditing($event)\">\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\n </div>\n <div [ngClass]=\"{ 'edit-padding-fix': dynamicEditorActive }\">\n <ng-template dEditorHost></ng-template>\n </div>\n <ng-template\n *ngIf=\"templateEditorActive\"\n [ngTemplateOutlet]=\"column.cellEditCmp ? column.cellEditCmp.template : column.fieldType === 'date' ? dateEditTempate : textEditTempate\"\n [ngTemplateOutletContext]=\"{\n rowIndex: rowIndex,\n colIndex: colIndex,\n column: column,\n rowItem: rowItem,\n $implicit: this,\n row: rowComponent\n }\"\n >\n </ng-template>\n</ng-container>\n\n<ng-template #cellViewTemp>\n <ng-container *ngIf=\"column.nestedColumn\">\n <span *ngIf=\"tableLevel > 0\" class=\"cell-placeholder\" [ngStyle]=\"{ width: tableLevel * column.nestedColumnIndent + 'px' }\"></span>\n <span [style.visibility]=\"rowItem.children ? 'visible' : 'hidden'\" class=\"childtable-toggler\" (click)=\"toggleChildTable(rowItem)\">\n <ng-container *ngIf=\"rowItem['$isChildTableOpen']\">\n <svg\n *ngIf=\"!column.extraOptions?.iconFoldTable\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-close\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <rect x=\"4\" y=\"7\" width=\"8\" height=\"2\"></rect>\n </g>\n </svg>\n\n <span *ngIf=\"column.extraOptions?.iconFoldTable\" [innerHTML]=\"column.extraOptions?.iconFoldTable | safe : 'html'\"></span>\n </ng-container>\n <ng-container *ngIf=\"!rowItem['$isChildTableOpen']\">\n <svg\n *ngIf=\"!column.extraOptions?.iconUnFoldTable\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-open-folder\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <path\n d=\"M8.75,4 L8.75,7.25 L12,7.25 L12,8.75 L8.749,8.75 L8.75,12 L7.25,12 L7.249,8.75 L4,8.75 L4,7.25 L7.25,7.25 L7.25,4 L8.75,4 Z\"\n ></path>\n </g>\n </svg>\n <span *ngIf=\"column.extraOptions?.iconUnFoldTable\" [innerHTML]=\"column.extraOptions?.iconUnFoldTable | safe : 'html'\"></span>\n </ng-container>\n </span>\n </ng-container>\n <ng-template\n [ngTemplateOutlet]=\"column.cellCmp ? column.cellCmp.template : textViewTemplate\"\n [ngTemplateOutletContext]=\"{\n rowIndex: rowIndex,\n colIndex: colIndex,\n column: column,\n rowItem: rowItem,\n cellItem: rowItem[column.field],\n cellValue: rowItem | disPlayCellValuePipe : rowIndex : column : lang,\n $implicit: this,\n row: rowComponent,\n tableLevel: tableLevel\n }\"\n >\n </ng-template>\n</ng-template>\n\n<ng-template let-cellValue=\"cellValue\" #textViewTemplate>\n <span [attr.title]=\"cellValue\">{{ cellValue }}</span>\n</ng-template>\n\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #textEditTempate>\n <form class=\"form-inline edit-padding-fix\">\n <div class=\"form-group full-width\">\n <div class=\"input-group full-width\">\n <input\n [dAutoFocus]=\"cell && cell.isCellEdit\"\n [type]=\"column.fieldType\"\n class=\"devui-form-control\"\n [name]=\"column.field\"\n [(ngModel)]=\"rowItem[column.field]\"\n [attr.maxlength]=\"column.extraOptions?.maxlength\"\n [attr.minlength]=\"column.extraOptions?.minlength\"\n [attr.pattern]=\"column.extraOptions?.pattern\"\n (keydown.enter)=\"cell && cell.finishCellEdit($event)\"\n [placeholder]=\"column.placeholder || ''\"\n />\n </div>\n </div>\n </form>\n</ng-template>\n\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #dateEditTempate>\n <form class=\"form-inline edit-padding-fix\">\n <div class=\"devui-form-group\">\n <div class=\"devui-input-group devui-dropdown-origin\">\n <input\n class=\"devui-form-control search\"\n [name]=\"column.field\"\n [(ngModel)]=\"rowItem[column.field]\"\n dDatepicker\n appendToBody\n [dateFormat]=\"column.extraOptions?.dateFormat\"\n #datePicker=\"datepicker\"\n (ngModelChange)=\"!column.extraOptions?.showTime && cell && cell.finishCellEdit()\"\n [maxDate]=\"column.extraOptions?.maxDate\"\n [minDate]=\"column.extraOptions?.minDate\"\n [cssClass]=\"column.extraOptions?.cssClass\"\n [dateConfig]=\"column.extraOptions?.dateConfig\"\n [locale]=\"column.extraOptions?.locale\"\n [customViewTemplate]=\"column.extraOptions?.customViewTemplate\"\n [disabled]=\"column.extraOptions?.disabled\"\n [placeholder]=\"column.placeholder || ''\"\n [autoOpen]=\"true\"\n [showTime]=\"column.extraOptions?.showTime\"\n />\n <div class=\"devui-input-group-addon\" (click)=\"datePicker.toggle()\">\n <i class=\"icon icon-calendar\"></i>\n </div>\n </div>\n </div>\n </form>\n</ng-template>\n" }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [DATA_TABLE]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [DATA_TABLE_ROW]
}] }, { type: i1.I18nService }, { type: i0.ChangeDetectorRef }, { type: i0.ComponentFactoryResolver }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { editorHost: [{
type: ViewChild,
args: [EditorDirective]
}], rowIndex: [{
type: Input
}], colIndex: [{
type: Input
}], column: [{
type: Input
}], rowItem: [{
type: Input
}], editModel: [{
type: Input
}], isEditRow: [{
type: Input
}], timeout: [{
type: Input
}], tableLevel: [{
type: Input
}], isEditable: [{
type: HostBinding,
args: ['class.editable-cell']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1jZWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL2RhdGEtdGFibGUvZGF0YS10YWJsZS1jZWxsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL2RldnVpL2RhdGEtdGFibGUvZGF0YS10YWJsZS1jZWxsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULHdCQUF3QixFQUN4QixVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUtOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7Ozs7Ozs7OztBQU92RixNQUFNLE9BQU8sc0JBQXNCO0lBV2pDLElBQXdDLFVBQVU7UUFDaEQsT0FB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aW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE5nWm9uZSxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBTaW1wbGVDaGFuZ2UsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJMThuRm9ybWF0LCBJMThuU2VydmljZSB9IGZyb20gJ25nLWRldnVpL2kxOG4nO1xyXG5pbXBvcnQgeyBJbnB1dE51bWJlckNvbXBvbmVudCB9IGZyb20gJ25nLWRldnVpL2lucHV0LW51bWJlcic7XHJcbmltcG9ydCB7IFNlbGVjdENvbXBvbmVudCB9IGZyb20gJ25nLWRldnVpL3NlbGVjdCc7XHJcbmltcG9ydCB7IFRyZWVTZWxlY3RDb21wb25lbnQgfSBmcm9tICduZy1kZXZ1aS90cmVlLXNlbGVjdCc7XHJcbmltcG9ydCB7IHN0b3BQcm9wYWdhdGlvbklmRXhpc3QgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgREFUQV9UQUJMRV9ST1cgfSBmcm9tICcuL2RhdGEtdGFibGUtcm93LnRva2VuJztcclxuaW1wb3J0IHsgREFUQV9UQUJMRSB9IGZyb20gJy4vZGF0YS10YWJsZS50b2tlbic7XHJcbmltcG9ydCB7IEVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4vZWRpdG9yLWhvc3QuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uVG1wbENvbXBvbmVudCB9IGZyb20gJy4vdG1wbC9kYXRhLXRhYmxlLWNvbHVtbi10bXBsLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2QtZGF0YS10YWJsZS1jZWxsLFtkRGF0YVRhYmxlQ2VsbF0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLWNlbGwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ2VsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoRWRpdG9yRGlyZWN0aXZlKSBlZGl0b3JIb3N0OiBFZGl0b3JEaXJlY3RpdmU7XHJcbiAgQElucHV0KCkgcm93SW5kZXg6IG51bWJlcjtcclxuICBASW5wdXQoKSBjb2xJbmRleDogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uVG1wbENvbXBvbmVudDtcclxuICBASW5wdXQoKSByb3dJdGVtOiBhbnk7XHJcbiAgQElucHV0KCkgZWRpdE1vZGVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaXNFZGl0Um93OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHRpbWVvdXQ6IG51bWJlcjtcclxuICBASW5wdXQoKSB0YWJsZUxldmVsOiBudW1iZXI7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZWRpdGFibGUtY2VsbCcpIGdldCBpc0VkaXRhYmxlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uLmVkaXRhYmxlICYmICF0aGlzLmlzQ2VsbEVkaXQgJiYgdGhpcy5jb2x1bW4uZXh0cmFPcHRpb25zPy5lZGl0YWJsZVRpcCAhPT0gJ2J0bicgJiYgIXRoaXMuZmllbGRFZGl0RGVuaWVkO1xyXG4gIH1cclxuICBpc0NlbGxFZGl0OiBib29sZWFuO1xyXG4gIGZvcmNlVXBkYXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgZG9jdW1lbnRDbGlja1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHRkTW91c2Vkb3duU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgdGRNb3VzZXVwU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgY2xpY2tJblRkOiBib29sZWFuO1xyXG4gIGNlbGxFZGl0b3JDbGlja1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGNlbGxBY3Rpb25TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBjbGlja0NvdW50ID0gMDsgLy8g6K6w5b2V54K55Ye75qyh5pWwXHJcbiAgdGltZW91dElkOyAvLyDlu7bml7ZpZFxyXG4gIGZpZWxkRWRpdERlbmllZDogYm9vbGVhbjtcclxuICB0ZW1wbGF0ZUVkaXRvckFjdGl2ZTogYm9vbGVhbjsgLy8g6YCa6L+H5qih5p2/55Sf5oiQ55qE57yW6L6R5o6n5Lu25r+A5rS7XHJcbiAgZHluYW1pY0VkaXRvckFjdGl2ZTogYm9vbGVhbjsgLy8g5Yqo5oCB55Sf5oiQ55qE57yW6L6R5o6n5Lu25r+A5rS7XHJcbiAgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBsYW5nOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChEQVRBX1RBQkxFKSBwdWJsaWMgZHQ6IGFueSxcclxuICAgIEBJbmplY3QoREFUQV9UQUJMRV9ST1cpIHB1YmxpYyByb3dDb21wb25lbnQ6IGFueSxcclxuICAgIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIGNlbGxSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9yY2VVcGRhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnJvd0NvbXBvbmVudC5mb3JjZVVwZGF0ZUV2ZW50LnN1YnNjcmliZSgoKSA9PiB0aGlzLmZvcmNlVXBkYXRlKCkpO1xyXG4gICAgaWYgKHRoaXMuY29sdW1uLmVkaXRhYmxlKSB7XHJcbiAgICAgIHRoaXMudGRNb3VzZWRvd25TdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQodGhpcy5jZWxsUmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xpY2tJblRkID0gdHJ1ZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnRkTW91c2V1cFN1YnNjcmlwdGlvbiA9IGZyb21FdmVudCh0aGlzLmNlbGxSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNldXAnKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xpY2tJblRkID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNlbGxSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbkNlbGxDbGljay5iaW5kKHRoaXMpKTtcclxuICAgICAgdGhpcy5jZWxsUmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uQ2VsbERCQ2xpY2suYmluZCh0aGlzKSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubGFuZyA9IEkxOG5Gb3JtYXQuZ2V0TG9jYWxlQW5kTGFuZygpLmN1cnJlbnRMYW5ndWFnZTtcclxuICAgIHRoaXMuaTE4blxyXG4gICAgICAubGFuZ0NoYW5nZSgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubGFuZyA9IEkxOG5Gb3JtYXQuZ2V0TG9jYWxlQW5kTGFuZygpLmN1cnJlbnRMYW5ndWFnZTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtwcm9wS2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfSkge1xyXG4gICAgY29uc3Qgcm93SXRlbSA9IGNoYW5nZXMucm93SXRlbTtcclxuICAgIGlmIChyb3dJdGVtKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlRWRpdGFibGUocm93SXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFZGl0YWJsZShyb3dJdGVtKSB7XHJcbiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gcm93SXRlbS5jdXJyZW50VmFsdWUuJGVkaXREZW5pZWRDb25maWc7XHJcbiAgICBpZiAoIWN1cnJlbnRDb25maWcpIHtcclxuICAgICAgaWYgKHRoaXMuZmllbGRFZGl0RGVuaWVkKSB7XHJcbiAgICAgICAgdGhpcy5maWVsZEVkaXREZW5pZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q29uZmlnLmZpbmRJbmRleCgoY29uZmlnOiBzdHJpbmcpID0+IHtcclxuICAgICAgICByZXR1cm4gY29uZmlnID09PSB0aGlzLmNvbHVtbi5maWVsZDtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBpZiAodGhpcy5maWVsZEVkaXREZW5pZWQpIHtcclxuICAgICAgICAgIHRoaXMuZmllbGRFZGl0RGVuaWVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghdGhpcy5maWVsZEVkaXREZW5pZWQpIHtcclxuICAgICAgICAgIHRoaXMuZmllbGRFZGl0RGVuaWVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2VsbENsaWNrKCRldmVudCkge1xyXG4gICAgY29uc3QgY2VsbFNlbGVjdGVkRXZlbnRBcmcgPSB7XHJcbiAgICAgIHJvd0luZGV4OiB0aGlzLnJvd0luZGV4LFxyXG4gICAgICBjb2xJbmRleDogdGhpcy5jb2xJbmRleCxcclxuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcclxuICAgICAgcm93SXRlbTogdGhpcy5yb3dJdGVtLFxyXG4gICAgICBjZWxsQ29tcG9uZW50OiB0aGlzLFxyXG4gICAgICByb3dDb21wb25lbnQ6IHRoaXMucm93Q29tcG9uZW50LFxyXG4gICAgICBldmVudDogJGV2ZW50LFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmNsaWNrQ291bnQrKztcclxuICAgIGlmICh0aGlzLmNsaWNrQ291bnQgPT09IDEpIHtcclxuICAgICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jbGlja0NvdW50ID09PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLmR0Lm9uQ2VsbENsaWNrKGNlbGxTZWxlY3RlZEV2ZW50QXJnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jbGlja0NvdW50ID0gMDtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xyXG4gICAgICB9LCB0aGlzLnRpbWVvdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DZWxsREJDbGljaygkZXZlbnQpIHtcclxuICAgIGNvbnN0IGNlbGxTZWxlY3RlZEV2ZW50QXJnID0ge1xyXG4gICAgICByb3dJbmRleDogdGhpcy5yb3dJbmRleCxcclxuICAgICAgY29sSW5kZXg6IHRoaXMuY29sSW5kZXgsXHJcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXHJcbiAgICAgIHJvd0l0ZW06IHRoaXMucm93SXRlbSxcclxuICAgICAgY2VsbENvbXBvbmVudDogdGhpcyxcclxuICAgICAgcm93Q29tcG9uZW50OiB0aGlzLnJvd0NvbXBvbmVudCxcclxuICAgIH07XHJcbiAgICB0aGlzLmR0Lm9uQ2VsbERCQ2xpY2soY2VsbFNlbGVjdGVkRXZlbnRBcmcpO1xyXG4gIH1cclxuXHJcbiAgZm9yY2VVcGRhdGUoKSB7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgZmluaXNoQ2VsbEVkaXQoJGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmICh0aGl