ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
327 lines • 66 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, Component, forwardRef, Inject, Injector, ViewChild } from '@angular/core';
import { BehaviorSubject, Subscription } from 'rxjs';
import { BooleanInputConverter } from '../../../../decorators/input-converter';
import { OTranslateService } from '../../../../services/translate/o-translate.service';
import { ColumnValueFilterOperator } from '../../../../types/table/o-column-value-filter.type';
import { Util } from '../../../../util/util';
import { OContextMenuComponent } from '../../../contextmenu/o-context-menu.component';
import { OTableGroupedRow } from '../row/o-table-row-group.class';
import { OTableBase } from '../../o-table-base.class';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../../../contextmenu/o-context-menu.component";
import * as i3 from "../../../contextmenu/context-menu-item/o-context-menu-item.component";
import * as i4 from "../../../contextmenu/context-menu-group/o-context-menu-group.component";
import * as i5 from "../../../contextmenu/context-menu-separator/o-context-menu-separator.component";
import * as i6 from "../../o-table-base.class";
export const DEFAULT_TABLE_CONTEXT_MENU_INPUTS = [
'contextMenu: context-menu',
'showInsert: insert',
'showEdit: edit',
'showViewDetail: view-detail',
'showCopy: copy',
'showSelectAll: select-all',
'showRefresh: refresh',
'showDelete: delete',
'showFilter: filter',
'showGroupByRow: group-by-row'
];
export class OTableContextMenuComponent {
set showInsert(value) {
if (typeof value !== 'boolean') {
value = Util.parseBoolean(value);
}
this.isVisibleInsert.next(value);
}
get showInsert() {
return this.isVisibleInsert.getValue();
}
set showEdit(value) {
if (typeof value !== 'boolean') {
value = Util.parseBoolean(value);
}
this.isVisibleEdit.next(value);
}
get showEdit() {
return this.isVisibleEdit.getValue();
}
set showViewDetail(value) {
if (typeof value !== 'boolean') {
value = Util.parseBoolean(value);
}
this.isVisibleDetail.next(value);
}
get showViewDetail() {
return this.isVisibleDetail.getValue();
}
set showCopy(value) {
if (typeof value !== 'boolean') {
value = Util.parseBoolean(value);
}
this.isVisibleCopy.next(value);
}
get showCopy() {
return this.isVisibleCopy.getValue();
}
set showSelectAll(value) {
if (typeof value !== 'boolean') {
value = Util.parseBoolean(value);
}
this.table.isSelectionModeNone() ? this.isVisibleSelectAll.next(false) : this.isVisibleSelectAll.next(value);
}
get showSelectAll() {
return this.isVisibleSelectAll.getValue();
}
set showRefresh(value) {
if (typeof value !== 'boolean') {
value = Util.parseBoolean(value);
}
this.isVisibleRefresh.next(value);
}
get showRefresh() {
return this.isVisibleRefresh.getValue();
}
set showDelete(value) {
if (typeof value !== 'boolean') {
value = Util.parseBoolean(value);
}
this.isVisibleDelete.next(value);
}
get showDelete() {
return this.isVisibleDelete.getValue();
}
set showFilter(value) {
if (typeof value !== 'boolean') {
value = Util.parseBoolean(value);
}
this.isVisibleFilter.next(value);
}
get showFilter() {
return this.isVisibleFilter.getValue();
}
set showGroupByRow(value) {
if (typeof value !== 'boolean') {
value = Util.parseBoolean(value);
}
this.isVisibleGroupByRow.next(value);
}
get showGroupByRow() {
return this.isVisibleGroupByRow.getValue();
}
constructor(injector, table) {
this.injector = injector;
this.table = table;
this.isVisibleInsert = new BehaviorSubject(true);
this.isVisibleEdit = new BehaviorSubject(true);
this.isVisibleDetail = new BehaviorSubject(true);
this.isVisibleCopy = new BehaviorSubject(true);
this.isVisibleSelectAll = new BehaviorSubject(true);
this.isVisibleRefresh = new BehaviorSubject(true);
this.isVisibleDelete = new BehaviorSubject(true);
this.isVisibleFilter = new BehaviorSubject(true);
this.isVisibleGroupByRow = new BehaviorSubject(true);
this.isEnabledGroupByColumn = new BehaviorSubject(true);
this.isEnabledUnGroupByColumn = new BehaviorSubject(false);
this.isEnabledUnGroupAllColumn = new BehaviorSubject(false);
this.isDataCell = new BehaviorSubject(true);
this.isTableGroupedRow = new BehaviorSubject(true);
this.isGroupableCell = new BehaviorSubject(true);
this.contextMenuSubscription = new Subscription();
this.isDateColumn = new BehaviorSubject(false);
this.translateService = this.injector.get(OTranslateService);
}
ngAfterViewInit() {
if (!Util.isDefined(this.showSelectAll)) {
this.isVisibleSelectAll.next(this.table.selectAllCheckbox);
}
if (!this.table.groupable) {
this.isVisibleGroupByRow.next(this.table.groupable);
}
if (this.contextMenu) {
this.defaultContextMenu.externalContextMenuItems = this.contextMenu.oContextMenuItems;
}
this.table.registerContextMenu(this.defaultContextMenu);
this.registerContextMenuListeners();
}
registerContextMenuListeners() {
this.contextMenuSubscription.add(this.defaultContextMenu.onClose.subscribe((param) => {
if (!this.table.isSelectionModeMultiple()) {
this.table.clearSelection();
}
}));
this.contextMenuSubscription.add(this.defaultContextMenu.onShow.subscribe((param) => {
this.initProperties(param);
}));
}
gotoDetails(event) {
const data = event.data.rowValue;
this.table.viewDetail(data);
}
edit(event) {
this.table.doHandleClick(event.data.rowValue, event.data.cellName, event.data.rowIndex, event);
}
add() {
this.table.add();
}
selectAll() {
this.table.showAndSelectAllCheckbox();
}
unSelectAll() {
this.table.selection.clear();
}
copyAll() {
this.table.copyAll();
}
copyCell(event) {
const cell_data = this.defaultContextMenu.origin.innerText;
Util.copyToClipboard(cell_data);
}
copySelection() {
this.table.copySelection();
}
copyRow(event) {
const data = JSON.stringify(this.table.dataSource.getRenderedData([event.data.rowValue]));
Util.copyToClipboard(data);
}
delete(event) {
this.table.remove();
}
refresh() {
this.table.refresh();
}
filterByValue() {
const columValueFilter = {
attr: this.column.attr,
operator: ColumnValueFilterOperator.IN,
values: [this.row[this.column.attr]],
availableValues: undefined
};
this.table.filterByColumn(columValueFilter);
}
groupByColumn(dateType) {
this.table.groupByColumn(this.column, dateType);
this.isEnabledGroupByColumn.next(false);
}
unGroupByColumn() {
this.table.unGroupByColumn(this.column);
}
unGroupAll() {
this.table.unGroupByAllColumns();
}
get labelFilterByColumn() {
return (this.column && this.column.title) ? this.translateService.get('TABLE_CONTEXT_MENU.FILTER_BY') + ' ' + this.translateService.get(this.column.title) : '';
}
get labelGroupByColumn() {
return (this.column && this.column.title) ? this.translateService.get('TABLE_CONTEXT_MENU.GROUP_BY_COLUMN') + ' ' + this.translateService.get(this.column.title) : '';
}
get labelUnGroupByColumn() {
return (this.column && this.column.title) ? this.translateService.get('TABLE_CONTEXT_MENU.UNGROUP_BY_COLUMN') + ' ' + this.translateService.get(this.column.title) : '';
}
get row() {
return this._row;
}
set row(value) {
this._row = value.rowValue;
const isTableGroupedRow = this._row instanceof OTableGroupedRow;
let columnName = value.cellName;
if (isTableGroupedRow) {
columnName = columnName.substring('groupHeader-'.length);
}
this.column = this.table.getOColumn(columnName);
this.isColumnDate();
this.isDataCell.next(!isTableGroupedRow);
this.isTableGroupedRow.next(isTableGroupedRow);
this.isGroupableCell.next(isTableGroupedRow && this._row.hasColumnData(this.column.attr));
}
get availableColumnAggregates() {
let result = Util.columnAggregates;
if (this.row instanceof OTableGroupedRow) {
const groupingComp = this.row.getColumnGroupingComponent(this.column.attr);
if (Util.isDefined(groupingComp.aggregateName)) {
result = result.slice();
if (result.includes(groupingComp.aggregate)) {
result.splice(result.indexOf(groupingComp.aggregate), 1, groupingComp.aggregateName);
}
else {
result.push(groupingComp.aggregateName);
}
}
}
return result;
}
filterByColumn(event) {
if (this.table.oTableMenu) {
this.table.isColumnFiltersActive = true;
this.table.openColumnFilterDialog(this.column, event.event);
}
}
checkVisibleFilter() {
let isVisible = false;
if (this.column) {
isVisible = this.showFilter && this.table.isColumnFilterable(this.column);
}
this.isVisibleFilter.next(isVisible);
}
checkGroupByRowOptions() {
this.isEnabledUnGroupByColumn.next(false);
this.isEnabledUnGroupAllColumn.next(false);
let grouped = false;
if (this.column.groupable && !Util.isArrayEmpty(this.table.groupedColumnsArray) && this.foundColumnInGroupedColumns(this.column)) {
this.isEnabledUnGroupByColumn.next(true);
grouped = true;
}
this.isEnabledGroupByColumn.next(this.column.groupable && !grouped);
if (!Util.isArrayEmpty(this.table.groupedColumnsArray)) {
this.isEnabledUnGroupAllColumn.next(true);
}
}
foundColumnInGroupedColumns(column) {
let found = false;
this.table.groupedColumnsArray.forEach(groupedColumn => { if (groupedColumn == column.attr) {
found = true;
} });
return found;
}
changeAggregateFunction(arg, aggregateFnName) {
if (arg.data.rowValue instanceof OTableGroupedRow) {
arg.data.rowValue.setColumnActiveAggregateFunction(this.column.attr, aggregateFnName);
}
}
initProperties(param) {
const data = param.data;
if (!Util.isDefined(data)) {
return;
}
this.row = { rowValue: data.rowValue, cellName: data.cellName };
this.checkVisibleFilter();
this.checkGroupByRowOptions();
}
expandRowGroupsSameLevel() {
this.table.dataSource.setRowGroupLevelExpansion(this._row, true);
}
collapseRowGroupsSameLevel() {
this.table.dataSource.setRowGroupLevelExpansion(this._row, false);
}
isColumnDate() {
this.isDateColumn.next(this.column.type == 'date');
}
}
OTableContextMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableContextMenuComponent, deps: [{ token: i0.Injector }, { token: forwardRef(() => OTableBase) }], target: i0.ɵɵFactoryTarget.Component });
OTableContextMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableContextMenuComponent, selector: "o-table-context-menu", inputs: { contextMenu: ["context-menu", "contextMenu"], showInsert: ["insert", "showInsert"], showEdit: ["edit", "showEdit"], showViewDetail: ["view-detail", "showViewDetail"], showCopy: ["copy", "showCopy"], showSelectAll: ["select-all", "showSelectAll"], showRefresh: ["refresh", "showRefresh"], showDelete: ["delete", "showDelete"], showFilter: ["filter", "showFilter"], showGroupByRow: ["group-by-row", "showGroupByRow"] }, viewQueries: [{ propertyName: "defaultContextMenu", first: true, predicate: ["defaultContextMenu"], descendants: true }], ngImport: i0, template: "<o-context-menu #defaultContextMenu>\n\n <ng-container *ngIf=\"isDataCell | async\">\n <o-context-menu-item attr=\"refresh\" label=\"TABLE_CONTEXT_MENU.REFRESH\" svg-icon=\"ontimize:autorenew\" (execute)=\"refresh()\"\n [visible]=\"isVisibleRefresh | async\"></o-context-menu-item>\n <o-context-menu-item attr=\"detail\" icon=\"chevron_right\" label=\"TABLE_CONTEXT_MENU.VIEW_DETAIL\" (execute)=\"gotoDetails($event)\"\n [visible]=\"isVisibleDetail | async\"></o-context-menu-item>\n <o-context-menu-item attr=\"edit\" icon=\"edit\" label=\"TABLE_CONTEXT_MENU.EDIT\" (execute)=\"edit($event)\" [visible]=\"isVisibleEdit | async\">\n </o-context-menu-item>\n <o-context-menu-item attr=\"insert\" label=\"TABLE_CONTEXT_MENU.INSERT\" icon=\"add\" (execute)=\"add()\" [visible]=\"isVisibleInsert | async\">\n </o-context-menu-item>\n <o-context-menu-item attr=\"delete\" label=\"TABLE_CONTEXT_MENU.DELETE\" icon=\"delete\" (execute)=\"delete($event)\" [visible]=\"isVisibleDelete | async\">\n </o-context-menu-item>\n <!-- FILTER GROUP -->\n <o-context-menu-group label=\"TABLE_CONTEXT_MENU.FILTER\" icon=\"filter_alt\" type=\"group\" [visible]=\"isVisibleFilter | async\">\n <o-context-menu-item icon=\"filter_alt\" [label]=\"labelFilterByColumn\" (execute)=\"filterByColumn($event)\"></o-context-menu-item>\n <o-context-menu-item icon=\"filter_alt\" label=\"TABLE_CONTEXT_MENU.FILTER_BY_VALUE\" (execute)=\"filterByValue()\"></o-context-menu-item>\n </o-context-menu-group>\n <!-- COPY GROUP -->\n <o-context-menu-separator [visible]=\"isVisibleCopy | async\"></o-context-menu-separator>\n <o-context-menu-group label=\"TABLE_CONTEXT_MENU.COPY\" icon=\"file_copy\" type=\"group\" [visible]=\"isVisibleCopy | async\">\n <o-context-menu-item icon=\"file_copy\" label=\"TABLE_CONTEXT_MENU.COPY_CELL\" (execute)=\"copyCell($event)\"></o-context-menu-item>\n <o-context-menu-item icon=\"file_copy\" label=\"TABLE_CONTEXT_MENU.COPY_ROW\" (execute)=\"copyRow($event)\"></o-context-menu-item>\n <o-context-menu-item label=\"TABLE_CONTEXT_MENU.COPY_ALL\" icon=\"file_copy\" (execute)=\"copyAll()\"></o-context-menu-item>\n <o-context-menu-item label=\"TABLE_CONTEXT_MENU.COPY_SELECTION\" icon=\"file_copy\" (execute)=\"copySelection()\"></o-context-menu-item>\n </o-context-menu-group>\n <o-context-menu-separator [visible]=\"isVisibleSelectAll | async\"></o-context-menu-separator>\n <o-context-menu-item attr=\"select-all\" [label]=\"table.isAllSelected() ? 'TABLE_CONTEXT_MENU.DESELECT_ALL': 'TABLE_CONTEXT_MENU.SELECT_ALL'\"\n icon=\"select_all\" (execute)=\"table.isAllSelected() ? unSelectAll() : selectAll()\" [visible]=\"isVisibleSelectAll | async\"></o-context-menu-item>\n\n <!-- GROUP BY -->\n <o-context-menu-separator [visible]=\"isVisibleGroupByRow | async\"></o-context-menu-separator>\n <o-context-menu-group label=\"TABLE_CONTEXT_MENU.GROUP_BY\" icon=\"format_indent_increase\" type=\"group\" [visible]=\"isVisibleGroupByRow | async\">\n <o-context-menu-item *ngIf=\"isDateColumn | async\" label=\"TABLE_CONTEXT_MENU.GROUP_BY_YEAR\" (execute)=\"groupByColumn('YEAR')\"\n icon=\"format_indent_increase\" type=\"group\" [visible]=\"isVisibleGroupByRow | async\" [enabled]=\"isEnabledGroupByColumn | async\">\n </o-context-menu-item>\n <o-context-menu-item *ngIf=\"isDateColumn | async\" label=\"TABLE_CONTEXT_MENU.GROUP_BY_MONTH\" (execute)=\"groupByColumn('MONTH')\"\n icon=\"format_indent_increase\" type=\"group\" [visible]=\"isVisibleGroupByRow | async\" [enabled]=\"isEnabledGroupByColumn | async\">\n </o-context-menu-item>\n <o-context-menu-item *ngIf=\"isDateColumn | async\" label=\"TABLE_CONTEXT_MENU.GROUP_BY_YEAR_MONTH\" icon=\"format_indent_increase\" type=\"group\"\n (execute)=\"groupByColumn('YEAR_MONTH')\" [visible]=\"isVisibleGroupByRow | async\" [enabled]=\"isEnabledGroupByColumn | async\">\n </o-context-menu-item>\n <o-context-menu-item *ngIf=\"isDateColumn | async\" label=\"TABLE_CONTEXT_MENU.GROUP_BY_YEAR_MONTH_DAY\" icon=\"format_indent_increase\" type=\"group\"\n (execute)=\"groupByColumn('YEAR_MONTH_DAY')\" [visible]=\"isVisibleGroupByRow | async\" [enabled]=\"isEnabledGroupByColumn | async\">\n </o-context-menu-item>\n <o-context-menu-item *ngIf=\"!(isDateColumn | async)\" icon=\"format_indent_increase\" [label]=\"labelGroupByColumn\" (execute)=\"groupByColumn()\"\n [enabled]=\"isEnabledGroupByColumn | async\"></o-context-menu-item>\n <o-context-menu-item *ngIf=\"isEnabledUnGroupByColumn | async\" icon=\"format_indent_decrease\" [label]=\"labelUnGroupByColumn\"\n (execute)=\"unGroupByColumn()\" [enabled]=\"isEnabledUnGroupByColumn | async\"></o-context-menu-item>\n <o-context-menu-item icon=\"format_line_spacing\" label=\"TABLE_CONTEXT_MENU.UNGROUP_ALLCOLUMNS\" (execute)=\"unGroupAll()\"\n [enabled]=\"isEnabledUnGroupAllColumn | async\">\n </o-context-menu-item>\n </o-context-menu-group>\n </ng-container>\n\n <!-- GROUP BY HEADER CELL AGGREGATE FUNCTION -->\n <ng-container *ngIf=\"isGroupableCell | async\">\n <o-context-menu-group label=\"TABLE_CONTEXT_MENU.GROUP_BY.AGGREGATE_FUNCTION\" icon=\"format_indent_increase\" type=\"group\">\n <o-context-menu-item *ngFor=\"let aggregateFn of availableColumnAggregates\" label=\"{{ 'AGGREGATE_NAME.' + aggregateFn }}\"\n (execute)=\"changeAggregateFunction($event, aggregateFn)\"></o-context-menu-item>\n </o-context-menu-group>\n </ng-container>\n\n <ng-container *ngIf=\"isTableGroupedRow | async\">\n <o-context-menu-item icon=\"unfold_more\" label=\"TABLE_CONTEXT_MENU.EXPAND_ALL_GROUPS\" (execute)=\"expandRowGroupsSameLevel()\"></o-context-menu-item>\n <o-context-menu-item icon=\"unfold_less\" label=\"TABLE_CONTEXT_MENU.COLLAPSE_ALL_GROUPS\" (execute)=\"collapseRowGroupsSameLevel()\">\n </o-context-menu-item>\n </ng-container>\n\n</o-context-menu>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.OContextMenuComponent, selector: "o-context-menu", outputs: ["onShow", "onClose"] }, { kind: "component", type: i3.OContextMenuItemComponent, selector: "o-context-menu-item", outputs: ["execute"] }, { kind: "component", type: i4.OContextMenuGroupComponent, selector: "o-context-menu-group" }, { kind: "component", type: i5.OContextMenuSeparatorComponent, selector: "o-context-menu-separator", inputs: ["attr", "visible"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], OTableContextMenuComponent.prototype, "showSelectAll", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableContextMenuComponent, decorators: [{
type: Component,
args: [{ selector: 'o-table-context-menu', changeDetection: ChangeDetectionStrategy.OnPush, inputs: DEFAULT_TABLE_CONTEXT_MENU_INPUTS, template: "<o-context-menu #defaultContextMenu>\n\n <ng-container *ngIf=\"isDataCell | async\">\n <o-context-menu-item attr=\"refresh\" label=\"TABLE_CONTEXT_MENU.REFRESH\" svg-icon=\"ontimize:autorenew\" (execute)=\"refresh()\"\n [visible]=\"isVisibleRefresh | async\"></o-context-menu-item>\n <o-context-menu-item attr=\"detail\" icon=\"chevron_right\" label=\"TABLE_CONTEXT_MENU.VIEW_DETAIL\" (execute)=\"gotoDetails($event)\"\n [visible]=\"isVisibleDetail | async\"></o-context-menu-item>\n <o-context-menu-item attr=\"edit\" icon=\"edit\" label=\"TABLE_CONTEXT_MENU.EDIT\" (execute)=\"edit($event)\" [visible]=\"isVisibleEdit | async\">\n </o-context-menu-item>\n <o-context-menu-item attr=\"insert\" label=\"TABLE_CONTEXT_MENU.INSERT\" icon=\"add\" (execute)=\"add()\" [visible]=\"isVisibleInsert | async\">\n </o-context-menu-item>\n <o-context-menu-item attr=\"delete\" label=\"TABLE_CONTEXT_MENU.DELETE\" icon=\"delete\" (execute)=\"delete($event)\" [visible]=\"isVisibleDelete | async\">\n </o-context-menu-item>\n <!-- FILTER GROUP -->\n <o-context-menu-group label=\"TABLE_CONTEXT_MENU.FILTER\" icon=\"filter_alt\" type=\"group\" [visible]=\"isVisibleFilter | async\">\n <o-context-menu-item icon=\"filter_alt\" [label]=\"labelFilterByColumn\" (execute)=\"filterByColumn($event)\"></o-context-menu-item>\n <o-context-menu-item icon=\"filter_alt\" label=\"TABLE_CONTEXT_MENU.FILTER_BY_VALUE\" (execute)=\"filterByValue()\"></o-context-menu-item>\n </o-context-menu-group>\n <!-- COPY GROUP -->\n <o-context-menu-separator [visible]=\"isVisibleCopy | async\"></o-context-menu-separator>\n <o-context-menu-group label=\"TABLE_CONTEXT_MENU.COPY\" icon=\"file_copy\" type=\"group\" [visible]=\"isVisibleCopy | async\">\n <o-context-menu-item icon=\"file_copy\" label=\"TABLE_CONTEXT_MENU.COPY_CELL\" (execute)=\"copyCell($event)\"></o-context-menu-item>\n <o-context-menu-item icon=\"file_copy\" label=\"TABLE_CONTEXT_MENU.COPY_ROW\" (execute)=\"copyRow($event)\"></o-context-menu-item>\n <o-context-menu-item label=\"TABLE_CONTEXT_MENU.COPY_ALL\" icon=\"file_copy\" (execute)=\"copyAll()\"></o-context-menu-item>\n <o-context-menu-item label=\"TABLE_CONTEXT_MENU.COPY_SELECTION\" icon=\"file_copy\" (execute)=\"copySelection()\"></o-context-menu-item>\n </o-context-menu-group>\n <o-context-menu-separator [visible]=\"isVisibleSelectAll | async\"></o-context-menu-separator>\n <o-context-menu-item attr=\"select-all\" [label]=\"table.isAllSelected() ? 'TABLE_CONTEXT_MENU.DESELECT_ALL': 'TABLE_CONTEXT_MENU.SELECT_ALL'\"\n icon=\"select_all\" (execute)=\"table.isAllSelected() ? unSelectAll() : selectAll()\" [visible]=\"isVisibleSelectAll | async\"></o-context-menu-item>\n\n <!-- GROUP BY -->\n <o-context-menu-separator [visible]=\"isVisibleGroupByRow | async\"></o-context-menu-separator>\n <o-context-menu-group label=\"TABLE_CONTEXT_MENU.GROUP_BY\" icon=\"format_indent_increase\" type=\"group\" [visible]=\"isVisibleGroupByRow | async\">\n <o-context-menu-item *ngIf=\"isDateColumn | async\" label=\"TABLE_CONTEXT_MENU.GROUP_BY_YEAR\" (execute)=\"groupByColumn('YEAR')\"\n icon=\"format_indent_increase\" type=\"group\" [visible]=\"isVisibleGroupByRow | async\" [enabled]=\"isEnabledGroupByColumn | async\">\n </o-context-menu-item>\n <o-context-menu-item *ngIf=\"isDateColumn | async\" label=\"TABLE_CONTEXT_MENU.GROUP_BY_MONTH\" (execute)=\"groupByColumn('MONTH')\"\n icon=\"format_indent_increase\" type=\"group\" [visible]=\"isVisibleGroupByRow | async\" [enabled]=\"isEnabledGroupByColumn | async\">\n </o-context-menu-item>\n <o-context-menu-item *ngIf=\"isDateColumn | async\" label=\"TABLE_CONTEXT_MENU.GROUP_BY_YEAR_MONTH\" icon=\"format_indent_increase\" type=\"group\"\n (execute)=\"groupByColumn('YEAR_MONTH')\" [visible]=\"isVisibleGroupByRow | async\" [enabled]=\"isEnabledGroupByColumn | async\">\n </o-context-menu-item>\n <o-context-menu-item *ngIf=\"isDateColumn | async\" label=\"TABLE_CONTEXT_MENU.GROUP_BY_YEAR_MONTH_DAY\" icon=\"format_indent_increase\" type=\"group\"\n (execute)=\"groupByColumn('YEAR_MONTH_DAY')\" [visible]=\"isVisibleGroupByRow | async\" [enabled]=\"isEnabledGroupByColumn | async\">\n </o-context-menu-item>\n <o-context-menu-item *ngIf=\"!(isDateColumn | async)\" icon=\"format_indent_increase\" [label]=\"labelGroupByColumn\" (execute)=\"groupByColumn()\"\n [enabled]=\"isEnabledGroupByColumn | async\"></o-context-menu-item>\n <o-context-menu-item *ngIf=\"isEnabledUnGroupByColumn | async\" icon=\"format_indent_decrease\" [label]=\"labelUnGroupByColumn\"\n (execute)=\"unGroupByColumn()\" [enabled]=\"isEnabledUnGroupByColumn | async\"></o-context-menu-item>\n <o-context-menu-item icon=\"format_line_spacing\" label=\"TABLE_CONTEXT_MENU.UNGROUP_ALLCOLUMNS\" (execute)=\"unGroupAll()\"\n [enabled]=\"isEnabledUnGroupAllColumn | async\">\n </o-context-menu-item>\n </o-context-menu-group>\n </ng-container>\n\n <!-- GROUP BY HEADER CELL AGGREGATE FUNCTION -->\n <ng-container *ngIf=\"isGroupableCell | async\">\n <o-context-menu-group label=\"TABLE_CONTEXT_MENU.GROUP_BY.AGGREGATE_FUNCTION\" icon=\"format_indent_increase\" type=\"group\">\n <o-context-menu-item *ngFor=\"let aggregateFn of availableColumnAggregates\" label=\"{{ 'AGGREGATE_NAME.' + aggregateFn }}\"\n (execute)=\"changeAggregateFunction($event, aggregateFn)\"></o-context-menu-item>\n </o-context-menu-group>\n </ng-container>\n\n <ng-container *ngIf=\"isTableGroupedRow | async\">\n <o-context-menu-item icon=\"unfold_more\" label=\"TABLE_CONTEXT_MENU.EXPAND_ALL_GROUPS\" (execute)=\"expandRowGroupsSameLevel()\"></o-context-menu-item>\n <o-context-menu-item icon=\"unfold_less\" label=\"TABLE_CONTEXT_MENU.COLLAPSE_ALL_GROUPS\" (execute)=\"collapseRowGroupsSameLevel()\">\n </o-context-menu-item>\n </ng-container>\n\n</o-context-menu>\n" }]
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i6.OTableBase, decorators: [{
type: Inject,
args: [forwardRef(() => OTableBase)]
}] }]; }, propDecorators: { showSelectAll: [], defaultContextMenu: [{
type: ViewChild,
args: ['defaultContextMenu']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1jb250ZXh0LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvZXh0ZW5zaW9ucy9jb250ZXh0bWVudS9vLXRhYmxlLWNvbnRleHQtbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9leHRlbnNpb25zL2NvbnRleHRtZW51L28tdGFibGUtY29udGV4dC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFckQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFzQixNQUFNLG9EQUFvRCxDQUFDO0FBQ25ILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUV0RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7O0FBRXRELE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHO0lBQy9DLDJCQUEyQjtJQUMzQixvQkFBb0I7SUFDcEIs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LENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVwRSxDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUM7O3dIQXRWVSwwQkFBMEIsMENBaUkzQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDOzRHQWpJM0IsMEJBQTBCLGttQkMvQnZDLDIzTEFzRUE7QUR3QkU7SUFBQyxxQkFBcUIsRUFBRTs7OytEQU12Qjs0RkFyRVUsMEJBQTBCO2tCQU50QyxTQUFTOytCQUNFLHNCQUFzQixtQkFFZix1QkFBdUIsQ0FBQyxNQUFNLFVBQ3ZDLGlDQUFpQzs7MEJBbUl0QyxNQUFNOzJCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUM7NENBakVsQyxhQUFhLE1BeURQLGtCQUFrQjtzQkFEM0IsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbmplY3QsIEluamVjdG9yLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEJvb2xlYW5JbnB1dENvbnZlcnRlciB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcbmltcG9ydCB7IE9UcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlL28tdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvciwgT0NvbHVtblZhbHVlRmlsdGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vdHlwZXMvdGFibGUvby1jb2x1bW4tdmFsdWUtZmlsdGVyLnR5cGUnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0bWVudS9vLWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBPQ29sdW1uIH0gZnJvbSAnLi4vLi4vY29sdW1uL28tY29sdW1uLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUdyb3VwZWRSb3cgfSBmcm9tICcuLi9yb3cvby10YWJsZS1yb3ctZ3JvdXAuY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQmFzZSB9IGZyb20gJy4uLy4uL28tdGFibGUtYmFzZS5jbGFzcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RBQkxFX0NPTlRFWFRfTUVOVV9JTlBVVFMgPSBbXG4gICdjb250ZXh0TWVudTogY29udGV4dC1tZW51JyxcbiAgJ3Nob3dJbnNlcnQ6IGluc2VydCcsXG4gICdzaG93RWRpdDogZWRpdCcsXG4gICdzaG93Vmlld0RldGFpbDogdmlldy1kZXRhaWwnLFxuICAnc2hvd0NvcHk6IGNvcHknLFxuICAnc2hvd1NlbGVjdEFsbDogc2VsZWN0LWFsbCcsXG4gICdzaG93UmVmcmVzaDogcmVmcmVzaCcsXG4gICdzaG93RGVsZXRlOiBkZWxldGUnLFxuICAnc2hvd0ZpbHRlcjogZmlsdGVyJyxcbiAgJ3Nob3dHcm91cEJ5Um93OiBncm91cC1ieS1yb3cnXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLXRhYmxlLWNvbnRleHQtbWVudScsXG4gIHRlbXBsYXRlVXJsOiAnLi9vLXRhYmxlLWNvbnRleHQtbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbnB1dHM6IERFRkFVTFRfVEFCTEVfQ09OVEVYVF9NRU5VX0lOUFVUU1xufSlcbmV4cG9ydCBjbGFzcyBPVGFibGVDb250ZXh0TWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwdWJsaWMgY29udGV4dE1lbnU6IE9Db250ZXh0TWVudUNvbXBvbmVudDtcbiAgcHVibGljIGlzVmlzaWJsZUluc2VydDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgcHVibGljIGlzVmlzaWJsZUVkaXQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIHB1YmxpYyBpc1Zpc2libGVEZXRhaWw6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIHB1YmxpYyBpc1Zpc2libGVDb3B5OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwdWJsaWMgaXNWaXNpYmxlU2VsZWN0QWxsOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwdWJsaWMgaXNWaXNpYmxlUmVmcmVzaDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgcHVibGljIGlzVmlzaWJsZURlbGV0ZTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgcHVibGljIGlzVmlzaWJsZUZpbHRlcjogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgcHVibGljIGlzVmlzaWJsZUdyb3VwQnlSb3c6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIHB1YmxpYyBpc0VuYWJsZWRHcm91cEJ5Q29sdW1uOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwdWJsaWMgaXNFbmFibGVkVW5Hcm91cEJ5Q29sdW1uOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHVibGljIGlzRW5hYmxlZFVuR3JvdXBBbGxDb2x1bW46IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHB1YmxpYyBpc0RhdGFDZWxsOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwdWJsaWMgaXNUYWJsZUdyb3VwZWRSb3c6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIHB1YmxpYyBpc0dyb3VwYWJsZUNlbGw6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG5cbiAgc2V0IHNob3dJbnNlcnQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHZhbHVlID0gVXRpbC5wYXJzZUJvb2xlYW4odmFsdWUgYXMgYW55KTtcbiAgICB9XG4gICAgdGhpcy5pc1Zpc2libGVJbnNlcnQubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd0luc2VydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1Zpc2libGVJbnNlcnQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHNldCBzaG93RWRpdCh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xuICAgICAgdmFsdWUgPSBVdGlsLnBhcnNlQm9vbGVhbih2YWx1ZSBhcyBhbnkpO1xuICAgIH1cbiAgICB0aGlzLmlzVmlzaWJsZUVkaXQubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd0VkaXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWaXNpYmxlRWRpdC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgc2V0IHNob3dWaWV3RGV0YWlsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB2YWx1ZSA9IFV0aWwucGFyc2VCb29sZWFuKHZhbHVlIGFzIGFueSk7XG4gICAgfVxuICAgIHRoaXMuaXNWaXNpYmxlRGV0YWlsLm5leHQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNob3dWaWV3RGV0YWlsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmlzaWJsZURldGFpbC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgc2V0IHNob3dDb3B5KHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB2YWx1ZSA9IFV0aWwucGFyc2VCb29sZWFuKHZhbHVlIGFzIGFueSk7XG4gICAgfVxuICAgIHRoaXMuaXNWaXNpYmxlQ29weS5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG93Q29weSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1Zpc2libGVDb3B5LmdldFZhbHVlKCk7XG4gIH1cblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2V0IHNob3dTZWxlY3RBbGwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHZhbHVlID0gVXRpbC5wYXJzZUJvb2xlYW4odmFsdWUgYXMgYW55KTtcbiAgICB9XG4gICAgdGhpcy50YWJsZS5pc1NlbGVjdGlvbk1vZGVOb25lKCkgPyB0aGlzLmlzVmlzaWJsZVNlbGVjdEFsbC5uZXh0KGZhbHNlKSA6IHRoaXMuaXNWaXNpYmxlU2VsZWN0QWxsLm5leHQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNob3dTZWxlY3RBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWaXNpYmxlU2VsZWN0QWxsLmdldFZhbHVlKCk7XG4gIH1cblxuICBzZXQgc2hvd1JlZnJlc2godmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHZhbHVlID0gVXRpbC5wYXJzZUJvb2xlYW4odmFsdWUgYXMgYW55KTtcbiAgICB9XG4gICAgdGhpcy5pc1Zpc2libGVSZWZyZXNoLm5leHQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNob3dSZWZyZXNoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmlzaWJsZVJlZnJlc2guZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHNldCBzaG93RGVsZXRlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB2YWx1ZSA9IFV0aWwucGFyc2VCb29sZWFuKHZhbHVlIGFzIGFueSk7XG4gICAgfVxuICAgIHRoaXMuaXNWaXNpYmxlRGVsZXRlLm5leHQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNob3dEZWxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWaXNpYmxlRGVsZXRlLmdldFZhbHVlKCk7XG4gIH1cblxuICBzZXQgc2hvd0ZpbHRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xuICAgICAgdmFsdWUgPSBVdGlsLnBhcnNlQm9vbGVhbih2YWx1ZSBhcyBhbnkpO1xuICAgIH1cbiAgICB0aGlzLmlzVmlzaWJsZUZpbHRlci5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG93RmlsdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmlzaWJsZUZpbHRlci5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgc2V0IHNob3dHcm91cEJ5Um93KHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB2YWx1ZSA9IFV0aWwucGFyc2VCb29sZWFuKHZhbHVlIGFzIGFueSk7XG4gICAgfVxuICAgIHRoaXMuaXNWaXNpYmxlR3JvdXBCeVJvdy5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG93R3JvdXBCeVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1Zpc2libGVHcm91cEJ5Um93LmdldFZhbHVlKCk7XG4gIH1cblxuXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHRDb250ZXh0TWVudScpXG4gIHByb3RlY3RlZCBkZWZhdWx0Q29udGV4dE1lbnU6IE9Db250ZXh0TWVudUNvbXBvbmVudDtcbiAgcHJvdGVjdGVkIF9yb3c6IGFueTtcbiAgcHJvdGVjdGVkIGNvbHVtbjogT0NvbHVtbjtcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IE9UcmFuc2xhdGVTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgY29udGV4dE1lbnVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHVibGljIGlzRGF0ZUNvbHVtbjogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IE9UYWJsZUJhc2UpKSBwdWJsaWMgdGFibGU6IE9UYWJsZUJhc2VcbiAgKSB7XG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoT1RyYW5zbGF0ZVNlcnZpY2UpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMuc2hvd1NlbGVjdEFsbCkpIHtcbiAgICAgIHRoaXMuaXNWaXNpYmxlU2VsZWN0QWxsLm5leHQodGhpcy50YWJsZS5zZWxlY3RBbGxDaGVja2JveCk7XG4gICAgfVxuICAgIGlmICghdGhpcy50YWJsZS5ncm91cGFibGUpIHtcbiAgICAgIHRoaXMuaXNWaXNpYmxlR3JvdXBCeVJvdy5uZXh0KHRoaXMudGFibGUuZ3JvdXBhYmxlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUpIHtcbiAgICAgIHRoaXMuZGVmYXVsdENvbnRleHRNZW51LmV4dGVybmFsQ29udGV4dE1lbnVJdGVtcyA9IHRoaXMuY29udGV4dE1lbnUub0NvbnRleHRNZW51SXRlbXM7XG4gICAgfVxuICAgIHRoaXMudGFibGUucmVnaXN0ZXJDb250ZXh0TWVudSh0aGlzLmRlZmF1bHRDb250ZXh0TWVudSk7XG4gICAgdGhpcy5yZWdpc3RlckNvbnRleHRNZW51TGlzdGVuZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJDb250ZXh0TWVudUxpc3RlbmVycygpIHtcbiAgICB0aGlzLmNvbnRleHRNZW51U3Vic2NyaXB0aW9uLmFkZCh0aGlzLmRlZmF1bHR