systelab-components
Version:
systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.
450 lines • 66.8 kB
JavaScript
import { Directive, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { GridContextMenuActionData } from './contextmenu/grid-context-menu-action-data';
import { StylesUtilService } from '../utilities/styles.util.service';
import { timer } from 'rxjs';
import { GridColumnsOptions } from './options/grid-column-options';
import { GridColumnOptionsDialog } from './options/grid-column-options-dialog.component';
import { GridContextMenuCellRendererComponent } from './contextmenu/grid-context-menu-cell-renderer.component';
import { TwoListItem } from '../twolist/two-list-utilities';
import { AutosizeGridHelper, initializeCalculatedGridState } from '../helper/autosize-grid-helper';
import * as i0 from "@angular/core";
import * as i1 from "systelab-preferences";
import * as i2 from "systelab-translate";
import * as i3 from "../modal/dialog/dialog.service";
export class AbstractGrid {
static { this.contextMenuColId = 'contextMenu'; }
static { this.selectionColId = 'selectCol'; }
constructor(preferencesService, i18nService, dialogService) {
this.preferencesService = preferencesService;
this.i18nService = i18nService;
this.dialogService = dialogService;
this.startCellEditorWithTab = false;
this.multipleSelection = false;
this.showChecks = false;
this.headerCheckboxSelection = false;
this.rowData = [];
this.removeSelectionOnOpenContextMenu = false;
this.autoSizeColumnsToContent = false;
this.action = new EventEmitter();
this.clickRow = new EventEmitter();
this.rowDragEnd = new EventEmitter();
this.viewportChanged = new EventEmitter();
this.rowSelected = new EventEmitter();
this.firstSizeToFitExecuted = false;
}
ngOnInit() {
this.gridOptions = this.getInitialGridOptions();
if (this.noRowsText) {
this.overlayNoRowsTemplate = this.noRowsText;
this.overlayLoadingTemplate = this.loadingText;
}
this.calculatedGridState = initializeCalculatedGridState(this.autoSizeColumnsToContent);
}
getInitialGridOptions() {
const rowHeight = StylesUtilService.getStyleValue(this.hiddenElement, 'line-height');
const headerHeight = StylesUtilService.getStyleValue(this.hiddenElement, 'height');
const options = {};
options.columnDefs = this.getColumnDefsWithOptions();
options.rowHeight = Number(rowHeight);
options.headerHeight = Number(headerHeight);
options.suppressDragLeaveHidesColumns = true;
options.suppressCellFocus = true;
options.enableRangeSelection = true;
options.stopEditingWhenCellsLoseFocus = true;
options.singleClickEdit = true;
options.defaultColDef = {
resizable: this.isColResizeEnabled()
};
options.rowSelection = this.getRowSelectionType();
options.localeText = {
noRowsToShow: this.i18nService.instant('COMMON_NO_ROWS_TO_SHOW'),
loadingOoo: this.i18nService.instant('COMMON_LOADING')
};
if (this.hideHeader()) {
options.headerHeight = 0;
}
if (this.showChecks) {
if (this.multipleSelection) {
options.suppressRowClickSelection = true;
}
}
options.isFullWidthRow = (isFullWidthRowParams) => this.getIsFullWidthRow(isFullWidthRowParams);
options.fullWidthCellRenderer = this.getFullWidthCellRenderer();
options.context = { componentParent: this };
options.onCellEditingStarted = (event) => this.onCellEditingStarted(event);
return options;
}
onCellEditingStarted(event) {
this.startCellEditorWithTab = event.event?.key === 'Tab';
}
onModelUpdated(event) {
this.doAutoSizeManagement();
return event;
}
doGridReady(event) {
this.loadColumnsStateFromPreferences();
if (this.autoSizeColumnsToContent) {
this.gridOptions.api.addEventListener('bodyScroll', this.onBodyScroll.bind(this));
}
else {
this.doAutoSizeManagement();
}
this.gridOptions.api.addEventListener('columnMoved', this.saveColumnsStateInPreferences.bind(this));
}
saveColumnsStateInPreferences() {
if (this.firstSizeToFitExecuted) {
this.preferencesService.put(this.getGridOptionsPreferencesPrefix(), this.gridOptions.columnApi.getColumnState());
}
}
loadColumnsStateFromPreferences() {
this.loadColumnsState(this.getGridOptionsPreferencesPrefix(), this.gridOptions.columnApi);
}
loadColumnsState(prefix, columnApi) {
if (this.preferencesService.get(prefix)) {
const gridOptionsPreferences = this.preferencesService.get(prefix);
// Filtered preferences columns that are not in the current columnDef.
const filteredGridOptionsPreferences = gridOptionsPreferences
.filter(colPref => columnApi.getColumns()
.some(column => colPref.colId === column.getColId()));
// Show new added columns
columnApi.getColumns()
.filter(column => !filteredGridOptionsPreferences.some(colPref => colPref.colId === column.getColId()))
.forEach(column => {
const newColumn = {
'colId': column.getColId(),
'hide': !column.isVisible(),
'aggFunc': null,
'width': column.getActualWidth(),
'pivotIndex': null,
'pinned': null,
'rowGroupIndex': null
};
if (column.getColId() === AbstractGrid.contextMenuColId || column.getColId() === AbstractGrid.selectionColId) {
filteredGridOptionsPreferences.unshift(newColumn);
}
else {
filteredGridOptionsPreferences.push(newColumn);
}
});
this.setColumnWidthToFitContent(columnApi, filteredGridOptionsPreferences);
// Override pinned property saved in preferences
const pinnedCol = filteredGridOptionsPreferences.find(column => column.colId === AbstractGrid.contextMenuColId || column.colId === AbstractGrid.selectionColId);
if (pinnedCol) {
pinnedCol['pinned'] = 'left';
}
columnApi.applyColumnState({ state: filteredGridOptionsPreferences, applyOrder: true });
}
}
setColumnWidthToFitContent(columnApi, filteredGridOptionsPreferences) {
// Set to null width of preferences of columns without supressSizeToFit
// If not set to null these columns are not sizedtofit
columnApi.getColumns()
.filter(column => !column.getColDef().suppressSizeToFit)
.forEach(column => {
const columnPref = filteredGridOptionsPreferences.find(colPref => colPref.colId === column.getColId());
columnPref.width = null;
});
}
getContextMenuColumnDef(width) {
return {
colId: AbstractGrid.contextMenuColId,
headerName: '',
pinned: 'left',
width: width,
suppressSizeToFit: true,
resizable: false,
suppressMovable: true,
cellRenderer: GridContextMenuCellRendererComponent
};
}
getCheckColumnDef(width) {
return {
colId: AbstractGrid.selectionColId,
headerName: '',
headerCheckboxSelection: this.headerCheckboxSelection,
checkboxSelection: true,
pinned: 'left',
width: width,
suppressSizeToFit: true,
resizable: false,
suppressMovable: true
};
}
getColumnDefsWithOptions() {
const colDefs = this.getColumnDefs();
if (this.menu && this.menu.length > 0) {
colDefs.unshift(this.getContextMenuColumnDef(this.getContextMenuColumnWidth()));
}
if (this.showChecks) {
colDefs.unshift(this.getCheckColumnDef(this.getCheckColumnWidth()));
}
colDefs.forEach((colDef) => this.suppressColumnSizeToFit(colDef));
return colDefs;
}
hideHeader() {
return false;
}
getIsFullWidthRow(isFullWidthRowParams) {
return false;
}
getFullWidthCellRenderer() {
return undefined;
}
getGridOptionsPreferencesPrefix() {
return this.preferenceName || this.constructor.name;
}
executeContextMenuAction(elementId, actionId) {
const option = this.menu.find(opt => opt.actionId === actionId);
const rowId = Number(elementId.substr(elementId.indexOf('row'))
.replace('row', ''));
const data = this.gridOptions.api.getModel()
.getRow(rowId).data;
const rowsSelected = this.gridOptions.api.getSelectedRows();
const actionData = new GridContextMenuActionData(rowId.toString(), actionId, data, this.gridOptions, rowsSelected);
if (option && option.action && data !== undefined) {
option.action(actionData);
}
else {
this.action.emit(actionData);
}
this.popupmenu.closeDropDown();
}
isContextMenuOptionEnabled(elementId, actionId) {
const option = this.menu.find(opt => opt.actionId === actionId);
const rowId = Number(elementId.substr(elementId.indexOf('row'))
.replace('row', ''));
const data = this.gridOptions.api.getModel()
.getRow(rowId).data;
if (option && option.isActionEnabled && data !== undefined) {
return option.isActionEnabled(data);
}
return true;
}
executeHeaderContextMenuAction(elementId, actionId, headerData) {
const option = this.headerMenu.find(opt => opt.actionId === actionId);
if (option && option.action) {
const actionData = new GridContextMenuActionData(elementId, actionId, headerData, this.gridOptions);
return option.action(actionData);
}
else {
const actionData = new GridContextMenuActionData(elementId, actionId, headerData, this.gridOptions);
this.action.emit(actionData);
}
this.headerPopupMenu.closeDropDown();
}
isHeaderContextMenuOptionEnabled(elementId, actionId, headerData) {
const option = this.headerMenu.find(opt => opt.actionId === actionId);
if (option && option.isActionEnabled) {
return option.isActionEnabled(headerData);
}
return true;
}
isColResizeEnabled() {
return true;
}
suppressColumnSizeToFit(colDef) {
if (colDef.width) {
colDef.suppressSizeToFit = true;
}
}
onRowSelected(event) {
this.rowSelected.emit(event.data);
}
getRowSelectionType() {
return this.multipleSelection ? 'multiple' : 'single';
}
getSelectedRows() {
return this.gridOptions.api.getSelectedRows();
}
getSelectedRow() {
const selected = this.getSelectedRows();
return selected.length > 0 ? selected[0] : null;
}
selectRow(index) {
this.gridOptions.api.ensureIndexVisible(index);
timer(200)
.subscribe(() => this.gridOptions.api.selectIndex(index, false, false));
}
doClick(event) {
if (event.column.colId === 'contextMenu' && !(event.event.ctrlKey && this.showChecks)) {
event.node.setSelected(true);
}
else {
if (event.column.colId === 'selectCol') {
event.node.setSelected(!event.node.isSelected());
}
else {
if (!event.column.isCellEditable(event.node)) {
const value = (event.event.ctrlKey && this.multipleSelection && !this.showChecks) ? event.event : event.data;
this.clickRow.emit(value);
}
}
}
}
doColumnResized(event) {
this.saveColumnsStateInPreferences();
}
doViewportChanged() {
this.viewportChanged.emit();
}
doGridSizeChanged(event) {
if (this.gridOptions.api) {
this.doAutoSizeManagement();
}
}
showOptions(canHideAllColumns) {
const parameters = GridColumnOptionsDialog.getParameters();
parameters.columnOptions = this.getGridColumnOptions(this.gridOptions.columnApi, this.getColumnDefs());
parameters.canHideAllColumns = canHideAllColumns;
this.dialogService.showDialog(GridColumnOptionsDialog, parameters)
.subscribe((columnsOptions) => {
if (columnsOptions) {
this.applyGridColumnOptions(this.gridOptions.columnApi, columnsOptions);
this.doAutoSizeManagement();
this.saveColumnsStateInPreferences();
}
});
}
getGridColumnOptions(columnApi, columnDefs) {
const options = new GridColumnsOptions();
options.available = columnApi.getColumns()
.filter(column => !columnApi.getColumn(column.getColDef().colId)
.isVisible())
.map(column => new TwoListItem(column.getColDef().headerName, column.getColDef().colId, false, false));
options.initialAvailableColumns = columnApi.getColumns()
.map(column => new TwoListItem(column.getColDef().headerName, column.getColDef().colId, false, false));
options.visible = columnApi.getAllDisplayedColumns()
.filter(column => column.getColId() !== 'contextMenu' && column.getColId() !== 'selectCol')
.map(column => new TwoListItem(column.getColDef().headerName, column.getColDef().colId, false, true));
options.defaultVisibleColumns = columnDefs.filter(column => !column.hide)
.map(column => new TwoListItem(column.headerName, column.colId, false, true));
options.defaultHiddenColumns = columnDefs.filter(column => column.hide)
.map(column => new TwoListItem(column.headerName, column.colId, false, false));
return options;
}
applyGridColumnOptions(columnApi, columnOptions) {
let numberOfFixedInitialColumns = (columnApi.getColumn('contextMenu') !== null) ? 1 : 0;
numberOfFixedInitialColumns += (columnApi.getColumn('selectCol') !== null) ? 1 : 0;
columnOptions.visible.forEach((tlp, index) => {
const col = columnApi.getColumns()
.find((column) => column.getColDef().colId === tlp.colId);
col.setVisible(true);
columnApi.moveColumn(col.getColId(), index + numberOfFixedInitialColumns);
});
columnApi.getColumns()
.forEach((column) => {
if (column.getColId() !== 'contextMenu' && column.getColId() !== 'selectCol') {
if (!columnOptions.visible.some(tlp => tlp.colId === column.getColDef().colId)) {
columnApi.setColumnVisible(column.getColId(), false);
}
}
});
}
dotsClicked(rowIndex, data, event) {
this.popupmenu.setActionManager(this);
this.popupmenu.setRowIndex(rowIndex);
if (this.existsAtLeastOneActionEnabled(data)) {
timer(200)
.subscribe(() => this.popupmenu.openWithOptions(event, this.menu));
}
else {
event.stopPropagation();
}
}
headerDotsClicked(headerData, event) {
this.headerPopupMenu.setActionManager(this);
this.headerPopupMenu.setHeaderData(headerData);
if (this.existsAtLeastOneHeaderActionEnabled(headerData)) {
timer(200)
.subscribe(() => this.headerPopupMenu.openWithOptions(event, this.headerMenu));
}
else {
event.stopPropagation();
}
}
existsAtLeastOneHeaderActionEnabled(data) {
return this.headerMenu ? this.headerMenu.some(menuOption => this.isMenuOptionEnabled(menuOption, data)) : false;
}
existsAtLeastOneActionEnabled(data) {
if (this.menu) {
return this.menu.some(menuOption => this.isMenuOptionEnabled(menuOption, data));
}
else {
return false;
}
}
isMenuOptionEnabled(menuOption, data) {
if (menuOption.isActionEnabled) {
return menuOption.isActionEnabled.apply(null, [data]);
}
else {
return true;
}
}
onRowDragEnd(event) {
this.rowDragEnd.emit(event);
}
getContextMenuColumnWidth() {
return 40;
}
getCheckColumnWidth() {
return 35;
}
onBodyScroll(event) {
clearTimeout(this.scrollTimeout);
this.scrollTimeout = setTimeout(() => {
this.doAutoSizeManagement(event);
}, 150);
}
doAutoSizeManagement(event) {
this.firstSizeToFitExecuted = true;
AutosizeGridHelper.doAutoSizeManagement(this.calculatedGridState, this.gridOptions, event);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractGrid, deps: [{ token: i1.PreferencesService }, { token: i2.I18nService }, { token: i3.DialogService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.9", type: AbstractGrid, inputs: { headerMenu: "headerMenu", menu: "menu", preferenceName: "preferenceName", multipleSelection: "multipleSelection", showChecks: "showChecks", headerCheckboxSelection: "headerCheckboxSelection", rowData: "rowData", noRowsText: "noRowsText", loadingText: "loadingText", removeSelectionOnOpenContextMenu: "removeSelectionOnOpenContextMenu", autoSizeColumnsToContent: "autoSizeColumnsToContent" }, outputs: { action: "action", clickRow: "clickRow", rowDragEnd: "rowDragEnd", viewportChanged: "viewportChanged", rowSelected: "rowSelected" }, viewQueries: [{ propertyName: "hiddenElement", first: true, predicate: ["hidden"], descendants: true, static: true }, { propertyName: "popupmenu", first: true, predicate: ["popupmenu"], descendants: true }, { propertyName: "headerPopupMenu", first: true, predicate: ["headerpopupmenu"], descendants: true }], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractGrid, decorators: [{
type: Directive
}], ctorParameters: () => [{ type: i1.PreferencesService }, { type: i2.I18nService }, { type: i3.DialogService }], propDecorators: { headerMenu: [{
type: Input
}], menu: [{
type: Input
}], preferenceName: [{
type: Input
}], multipleSelection: [{
type: Input
}], showChecks: [{
type: Input
}], headerCheckboxSelection: [{
type: Input
}], rowData: [{
type: Input
}], noRowsText: [{
type: Input
}], loadingText: [{
type: Input
}], removeSelectionOnOpenContextMenu: [{
type: Input
}], autoSizeColumnsToContent: [{
type: Input
}], action: [{
type: Output
}], clickRow: [{
type: Output
}], rowDragEnd: [{
type: Output
}], viewportChanged: [{
type: Output
}], rowSelected: [{
type: Output
}], hiddenElement: [{
type: ViewChild,
args: ['hidden', { static: true }]
}], popupmenu: [{
type: ViewChild,
args: ['popupmenu', { static: false }]
}], headerPopupMenu: [{
type: ViewChild,
args: ['headerpopupmenu', { static: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi1jb21wb25lbnRzL3NyYy9saWIvZ3JpZC9hYnN0cmFjdC1ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd0RyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUl4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUMsTUFBTSxnREFBZ0QsQ0FBQztBQUM1SCxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUMvRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGtCQUFrQixFQUF1Qiw2QkFBNkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7OztBQUt4SCxNQUFNLE9BQWdCLFlBQVk7YUFFVixxQkFBZ0IsR0FBRyxhQUFhLEFBQWhCLENBQWlCO2FBQ2pDLG1CQUFjLEdBQUcsV0FBVyxBQUFkLENBQWU7SUFrQ3BELFlBQWdDLGtCQUFzQyxFQUFZLFdBQXdCLEVBQ3pGLGFBQTRCO1FBRGIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3pGLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBOUJ0QywyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFNdEIsc0JBQWlCLEdBQUcs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QUF6QixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBRVUsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSx1QkFBdUI7c0JBQXRDLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsZ0NBQWdDO3NCQUEvQyxLQUFLO2dCQUNVLHdCQUF3QjtzQkFBdkMsS0FBSztnQkFFVyxNQUFNO3NCQUF0QixNQUFNO2dCQUNVLFFBQVE7c0JBQXhCLE1BQU07Z0JBQ1UsVUFBVTtzQkFBMUIsTUFBTTtnQkFDVSxlQUFlO3NCQUEvQixNQUFNO2dCQUNVLFdBQVc7c0JBQTNCLE1BQU07Z0JBRXFDLGFBQWE7c0JBQXhELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDYSxTQUFTO3NCQUF4RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ2UsZUFBZTtzQkFBcEUsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbERlZiwgQ29sdW1uLCBDb2x1bW5BcGksIEdyaWRPcHRpb25zLCBJc0Z1bGxXaWR0aFJvd1BhcmFtcyB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcbmltcG9ydCB7IEdyaWRDb250ZXh0TWVudU9wdGlvbiB9IGZyb20gJy4vY29udGV4dG1lbnUvZ3JpZC1jb250ZXh0LW1lbnUtb3B0aW9uJztcbmltcG9ydCB7IEdyaWRDb250ZXh0TWVudUFjdGlvbkRhdGEgfSBmcm9tICcuL2NvbnRleHRtZW51L2dyaWQtY29udGV4dC1tZW51LWFjdGlvbi1kYXRhJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi9tb2RhbC9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnc3lzdGVsYWItcHJlZmVyZW5jZXMnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdzeXN0ZWxhYi10cmFuc2xhdGUnO1xuaW1wb3J0IHsgU3R5bGVzVXRpbFNlcnZpY2UgfSBmcm9tICcuLi91dGlsaXRpZXMvc3R5bGVzLnV0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkQ29udGV4dE1lbnVDb21wb25lbnQsIEdyaWRSb3dNZW51QWN0aW9uSGFuZGxlciB9IGZyb20gJy4vY29udGV4dG1lbnUvZ3JpZC1jb250ZXh0LW1lbnUtY29tcG9uZW50JztcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uc09wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMvZ3JpZC1jb2x1bW4tb3B0aW9ucyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uT3B0aW9uc0RpYWxvZywgR3JpZENvbHVtbk9wdGlvbnNEaWFsb2dQYXJhbWV0ZXJzIH0gZnJvbSAnLi9vcHRpb25zL2dyaWQtY29sdW1uLW9wdGlvbnMtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcmlkQ29udGV4dE1lbnVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbnRleHRtZW51L2dyaWQtY29udGV4dC1tZW51LWNlbGwtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFR3b0xpc3RJdGVtIH0gZnJvbSAnLi4vdHdvbGlzdC90d28tbGlzdC11dGlsaXRpZXMnO1xuaW1wb3J0IHsgR3JpZEhlYWRlckNvbnRleHRNZW51LCBHcmlkSGVhZGVyTWVudUFjdGlvbkhhbmRsZXIgfSBmcm9tICcuL2NvbnRleHRtZW51L2dyaWQtaGVhZGVyLWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXV0b3NpemVHcmlkSGVscGVyLCBDYWxjdWxhdGVkR3JpZFN0YXRlLCBpbml0aWFsaXplQ2FsY3VsYXRlZEdyaWRTdGF0ZSB9IGZyb20gJy4uL2hlbHBlci9hdXRvc2l6ZS1ncmlkLWhlbHBlcic7XG5cbmV4cG9ydCB0eXBlIHJvd1NlbGVjdGlvblR5cGUgPSAnc2luZ2xlJyB8ICdtdWx0aXBsZSc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R3JpZDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgR3JpZFJvd01lbnVBY3Rpb25IYW5kbGVyLCBHcmlkSGVhZGVyTWVudUFjdGlvbkhhbmRsZXIge1xuXG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29udGV4dE1lbnVDb2xJZCA9ICdjb250ZXh0TWVudSc7XG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc2VsZWN0aW9uQ29sSWQgPSAnc2VsZWN0Q29sJztcblxuXHRwdWJsaWMgZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zO1xuXHRwdWJsaWMgb3ZlcmxheU5vUm93c1RlbXBsYXRlO1xuXHRwdWJsaWMgb3ZlcmxheUxvYWRpbmdUZW1wbGF0ZTtcblx0cHVibGljIHN0YXJ0Q2VsbEVkaXRvcldpdGhUYWIgPSBmYWxzZTtcblxuXHRASW5wdXQoKSBwdWJsaWMgaGVhZGVyTWVudTogQXJyYXk8R3JpZENvbnRleHRNZW51T3B0aW9uPE9iamVjdD4+O1xuXHRASW5wdXQoKSBwdWJsaWMgbWVudTogQXJyYXk8R3JpZENvbnRleHRNZW51T3B0aW9uPFQ+PjtcblxuXHRASW5wdXQoKSBwdWJsaWMgcHJlZmVyZW5jZU5hbWU6IHN0cmluZztcblx0QElucHV0KCkgcHVibGljIG11bHRpcGxlU2VsZWN0aW9uID0gZmFsc2U7XG5cdEBJbnB1dCgpIHB1YmxpYyBzaG93Q2hlY2tzID0gZmFsc2U7XG5cdEBJbnB1dCgpIHB1YmxpYyBoZWFkZXJDaGVja2JveFNlbGVjdGlvbiA9IGZhbHNlO1xuXHRASW5wdXQoKSBwdWJsaWMgcm93RGF0YTogQXJyYXk8VD4gPSBbXTtcblx0QElucHV0KCkgcHVibGljIG5vUm93c1RleHQ7XG5cdEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nVGV4dDtcblx0QElucHV0KCkgcHVibGljIHJlbW92ZVNlbGVjdGlvbk9uT3BlbkNvbnRleHRNZW51ID0gZmFsc2U7XG5cdEBJbnB1dCgpIHB1YmxpYyBhdXRvU2l6ZUNvbHVtbnNUb0NvbnRlbnQgPSBmYWxzZTtcblxuXHRAT3V0cHV0KCkgcHVibGljIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHB1YmxpYyBjbGlja1JvdyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHB1YmxpYyByb3dEcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgcHVibGljIHZpZXdwb3J0Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHB1YmxpYyByb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHRAVmlld0NoaWxkKCdoaWRkZW4nLCB7c3RhdGljOiB0cnVlfSkgcHVibGljIGhpZGRlbkVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cdEBWaWV3Q2hpbGQoJ3BvcHVwbWVudScsIHtzdGF0aWM6IGZhbHNlfSkgcHVibGljIHBvcHVwbWVudTogR3JpZENvbnRleHRNZW51Q29tcG9uZW50PFQ+O1xuXHRAVmlld0NoaWxkKCdoZWFkZXJwb3B1cG1lbnUnLCB7c3RhdGljOiBmYWxzZX0pIHB1YmxpYyBoZWFkZXJQb3B1cE1lbnU6IEdyaWRIZWFkZXJDb250ZXh0TWVudTxPYmplY3Q+O1xuXG5cdHByb3RlY3RlZCBmaXJzdFNpemVUb0ZpdEV4ZWN1dGVkID0gZmFsc2U7XG5cdHByaXZhdGUgY2FsY3VsYXRlZEdyaWRTdGF0ZTogQ2FsY3VsYXRlZEdyaWRTdGF0ZTtcblx0cHJpdmF0ZSBzY3JvbGxUaW1lb3V0O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcHJlZmVyZW5jZXNTZXJ2aWNlOiBQcmVmZXJlbmNlc1NlcnZpY2UsIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG5cdFx0XHRcdFx0XHQgIHByb3RlY3RlZCBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlKSB7XG5cdH1cblxuXHRwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG5cblx0XHR0aGlzLmdyaWRPcHRpb25zID0gdGhpcy5nZXRJbml0aWFsR3JpZE9wdGlvbnMoKTtcblxuXHRcdGlmICh0aGlzLm5vUm93c1RleHQpIHtcblx0XHRcdHRoaXMub3ZlcmxheU5vUm93c1RlbXBsYXRlID0gdGhpcy5ub1Jvd3NUZXh0O1xuXHRcdFx0dGhpcy5vdmVybGF5TG9hZGluZ1RlbXBsYXRlID0gdGhpcy5sb2FkaW5nVGV4dDtcblx0XHR9XG5cdFx0dGhpcy5jYWxjdWxhdGVkR3JpZFN0YXRlID0gaW5pdGlhbGl6ZUNhbGN1bGF0ZWRHcmlkU3RhdGUodGhpcy5hdXRvU2l6ZUNvbHVtbnNUb0NvbnRlbnQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGdldEluaXRpYWxHcmlkT3B0aW9ucygpOiBHcmlkT3B0aW9ucyB7XG5cdFx0Y29uc3Qgcm93SGVpZ2h0ID0gU3R5bGVzVXRpbFNlcnZpY2UuZ2V0U3R5bGVWYWx1ZSh0aGlzLmhpZGRlbkVsZW1lbnQsICdsaW5lLWhlaWdodCcpO1xuXHRcdGNvbnN0IGhlYWRlckhlaWdodCA9IFN0eWxlc1V0aWxTZXJ2aWNlLmdldFN0eWxlVmFsdWUodGhpcy5oaWRkZW5FbGVtZW50LCAnaGVpZ2h0Jyk7XG5cblx0XHRjb25zdCBvcHRpb25zOiBHcmlkT3B0aW9ucyA9IHt9O1xuXG5cdFx0b3B0aW9ucy5jb2x1bW5EZWZzID0gdGhpcy5nZXRDb2x1bW5EZWZzV2l0aE9wdGlvbnMoKTtcblx0XHRvcHRpb25zLnJvd0hlaWdodCA9IE51bWJlcihyb3dIZWlnaHQpO1xuXHRcdG9wdGlvbnMuaGVhZGVySGVpZ2h0ID0gTnVtYmVyKGhlYWRlckhlaWdodCk7XG5cdFx0b3B0aW9ucy5zdXBwcmVzc0RyYWdMZWF2ZUhpZGVzQ29sdW1ucyA9IHRydWU7XG5cdFx0b3B0aW9ucy5zdXBwcmVzc0NlbGxGb2N1cyA9IHRydWU7XG5cdFx0b3B0aW9ucy5lbmFibGVSYW5nZVNlbGVjdGlvbiA9IHRydWU7XG5cdFx0b3B0aW9ucy5zdG9wRWRpdGluZ1doZW5DZWxsc0xvc2VGb2N1cyA9IHRydWU7XG5cdFx0b3B0aW9ucy5zaW5nbGVDbGlja0VkaXQgPSB0cnVlO1xuXHRcdG9wdGlvbnMuZGVmYXVsdENvbERlZiA9IHtcblx0XHRcdHJlc2l6YWJsZTogdGhpcy5pc0NvbFJlc2l6ZUVuYWJsZWQoKVxuXHRcdH07XG5cdFx0b3B0aW9ucy5yb3dTZWxlY3Rpb24gPSB0aGlzLmdldFJvd1NlbGVjdGlvblR5cGUoKTtcblx0XHRvcHRpb25zLmxvY2FsZVRleHQgPSB7XG5cdFx0XHRub1Jvd3NUb1Nob3c6IHRoaXMuaTE4blNlcnZpY2UuaW5zdGFudCgnQ09NTU9OX05PX1JPV1NfVE9fU0hPVycpLFxuXHRcdFx0bG9hZGluZ09vbzogICB0aGlzLmkxOG5TZXJ2aWNlLmluc3RhbnQoJ0NPTU1PTl9MT0FESU5HJylcblx0XHR9O1xuXG5cdFx0aWYgKHRoaXMuaGlkZUhlYWRlcigpKSB7XG5cdFx0XHRvcHRpb25zLmhlYWRlckhlaWdodCA9IDA7XG5cdFx0fVxuXHRcdGlmICh0aGlzLnNob3dDaGVja3MpIHtcblx0XHRcdGlmICh0aGlzLm11bHRpcGxlU2VsZWN0aW9uKSB7XG5cdFx0XHRcdG9wdGlvbnMuc3VwcHJlc3NSb3dDbGlja1NlbGVjdGlvbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG9wdGlvbnMuaXNGdWxsV2lkdGhSb3cgPSAoaXNGdWxsV2lkdGhSb3dQYXJhbXM6IElzRnVsbFdpZHRoUm93UGFyYW1zKSA9PiB0aGlzLmdldElzRnVsbFdpZHRoUm93KGlzRnVsbFdpZHRoUm93UGFyYW1zKTtcblx0XHRvcHRpb25zLmZ1bGxXaWR0aENlbGxSZW5kZXJlciA9IHRoaXMuZ2V0RnVsbFdpZHRoQ2VsbFJlbmRlcmVyKCk7XG5cdFx0b3B0aW9ucy5jb250ZXh0ID0ge2NvbXBvbmVudFBhcmVudDogdGhpc307XG5cdFx0b3B0aW9ucy5vbkNlbGxFZGl0aW5nU3RhcnRlZCA9IChldmVudCkgPT4gdGhpcy5vbkNlbGxFZGl0aW5nU3RhcnRlZChldmVudCk7XG5cblx0XHRyZXR1cm4gb3B0aW9ucztcblx0fVxuXG5cdHByb3RlY3RlZCBvbkNlbGxFZGl0aW5nU3RhcnRlZChldmVudDogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5zdGFydENlbGxFZGl0b3JXaXRoVGFiID0gZXZlbnQuZXZlbnQ/LmtleSA9PT0gJ1RhYic7XG5cdH1cblxuXHRwdWJsaWMgb25Nb2RlbFVwZGF0ZWQoZXZlbnQ6IGFueSkge1xuXHRcdHRoaXMuZG9BdXRvU2l6ZU1hbmFnZW1lbnQoKTtcblx0XHRyZXR1cm4gZXZlbnQ7XG5cdH1cblxuXHRwdWJsaWMgZG9HcmlkUmVhZHkoZXZlbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMubG9hZENvbHVtbnNTdGF0ZUZyb21QcmVmZXJlbmNlcygpO1xuXG5cdFx0aWYodGhpcy5hdXRvU2l6ZUNvbHVtbnNUb0NvbnRlbnQpIHtcblx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmFkZEV2ZW50TGlzdGVuZXIoJ2JvZHlTY3JvbGwnLCB0aGlzLm9uQm9keVNjcm9sbC5iaW5kKHRoaXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5kb0F1dG9TaXplTWFuYWdlbWVudCgpO1xuXHRcdH1cblx0XHR0aGlzLmdyaWRPcHRpb25zLmFwaS5hZGRFdmVudExpc3RlbmVyKCdjb2x1bW5Nb3ZlZCcsIHRoaXMuc2F2ZUNvbHVtbnNTdGF0ZUluUHJlZmVyZW5jZXMuYmluZCh0aGlzKSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgc2F2ZUNvbHVtbnNTdGF0ZUluUHJlZmVyZW5jZXMoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuZmlyc3RTaXplVG9GaXRFeGVjdXRlZCkge1xuXHRcdFx0dGhpcy5wcmVmZXJlbmNlc1NlcnZpY2UucHV0KHRoaXMuZ2V0R3JpZE9wdGlvbnNQcmVmZXJlbmNlc1ByZWZpeCgpLCB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbkFwaS5nZXRDb2x1bW5TdGF0ZSgpKTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgbG9hZENvbHVtbnNTdGF0ZUZyb21QcmVmZXJlbmNlcygpOiB2b2lkIHtcblx0XHR0aGlzLmxvYWRDb2x1bW5zU3RhdGUodGhpcy5nZXRHcmlkT3B0aW9uc1ByZWZlcmVuY2VzUHJlZml4KCksIHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1uQXBpKTtcblx0fVxuXG5cdHByaXZhdGUgbG9hZENvbHVtbnNTdGF0ZShwcmVmaXg6IHN0cmluZywgY29sdW1uQXBpOiBDb2x1bW5BcGkpOiB2b2lkIHtcblxuXHRcdGlmICh0aGlzLnByZWZlcmVuY2VzU2VydmljZS5nZXQocHJlZml4KSkge1xuXG5cdFx0XHRjb25zdCBncmlkT3B0aW9uc1ByZWZlcmVuY2VzOiBBcnJheTxhbnk+ID0gdGhpcy5wcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KHByZWZpeCk7XG5cblx0XHRcdC8vIEZpbHRlcmVkIHByZWZlcmVuY2VzIGNvbHVtbnMgdGhhdCBhcmUgbm90IGluIHRoZSBjdXJyZW50IGNvbHVtbkRlZi5cblx0XHRcdGNvbnN0IGZpbHRlcmVkR3JpZE9wdGlvbnNQcmVmZXJlbmNlczogQXJyYXk8YW55PiA9IGdyaWRPcHRpb25zUHJlZmVyZW5jZXNcblx0XHRcdFx0LmZpbHRlcihjb2xQcmVmID0+IGNvbHVtbkFwaS5nZXRDb2x1bW5zKClcblx0XHRcdFx0XHQuc29tZShjb2x1bW4gPT4gY29sUHJlZi5jb2xJZCA9PT0gY29sdW1uLmdldENvbElkKCkpKTtcblxuXHRcdFx0Ly8gU2hvdyB