@angular-customised/ngx-table-custom-sort
Version:
Angular easy table
150 lines • 59 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewChildren, } from '@angular/core';
import { Event } from '../..';
import { StyleService } from '../../services/style.service';
import { moveItemInArray } from '@angular/cdk/drag-drop';
import * as i0 from "@angular/core";
import * as i1 from "../../services/style.service";
import * as i2 from "@angular/common";
import * as i3 from "@angular/cdk/drag-drop";
import * as i4 from "../header/header.component";
export class TableTHeadComponent {
onClick(targetElement) {
if (this.additionalActionMenu &&
!this.additionalActionMenu.nativeElement.contains(targetElement)) {
this.menuActive = false;
}
// if click outside the header then close opened Header Action Template
if (this.openedHeaderActionTemplate &&
// if no header have the clicked point
!this.headerDropdown.toArray().some((ref) => ref.nativeElement.contains(targetElement))) {
this.openedHeaderActionTemplate = null;
}
}
constructor(styleService) {
this.styleService = styleService;
this.menuActive = false;
this.openedHeaderActionTemplate = null;
this.onSelectAllBinded = this.onSelectAll.bind(this);
this.isAllSortEnabled = true;
this.filter = new EventEmitter();
this.order = new EventEmitter();
this.selectAll = new EventEmitter();
this.event = new EventEmitter();
}
getColumnDefinition(column) {
return column.searchEnabled || typeof column.searchEnabled === 'undefined';
}
orderBy(column) {
this.order.emit(column);
}
isOrderEnabled(column) {
const columnOrderEnabled = column.orderEnabled === undefined ? true : !!column.orderEnabled;
return this.config.orderEnabled && columnOrderEnabled;
}
columnDrop(event) {
moveItemInArray(this.columns, event.previousIndex, event.currentIndex);
}
onSearch($event) {
this.filter.emit($event);
}
getColumnWidth(column) {
if (column.width) {
return column.width;
}
return this.config.fixedColumnWidth ? 100 / this.columns.length + '%' : null;
}
onSelectAll() {
this.selectAll.emit();
}
onMouseDown(event, th) {
if (!this.config.resizeColumn) {
return;
}
this.th = th;
this.startOffset = th.offsetWidth - event.pageX;
this.event.emit({
event: Event.onColumnResizeMouseDown,
value: event,
});
}
onMouseMove(event) {
if (!this.config.resizeColumn) {
return;
}
if (this.th && this.th.style) {
this.th.style.width = this.startOffset + event.pageX + 'px';
this.th.style.cursor = 'col-resize';
this.th.style['user-select'] = 'none';
}
}
onMouseUp(event) {
if (!this.config.resizeColumn) {
return;
}
this.event.emit({
event: Event.onColumnResizeMouseUp,
value: event,
});
this.th.style.cursor = 'default';
this.th = undefined;
}
showHeaderActionTemplateMenu(column) {
if (!column.headerActionTemplate) {
console.error('Column [headerActionTemplate] property not defined');
}
if (this.openedHeaderActionTemplate === column.key) {
this.openedHeaderActionTemplate = null;
return;
}
this.openedHeaderActionTemplate = column.key;
}
showMenu() {
if (!this.additionalActionsTemplate) {
console.error('[additionalActionsTemplate] property not defined');
}
this.menuActive = !this.menuActive;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: TableTHeadComponent, deps: [{ token: i1.StyleService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: TableTHeadComponent, selector: "[table-thead]", inputs: { config: "config", columns: "columns", sortKey: "sortKey", sortState: "sortState", selectAllTemplate: "selectAllTemplate", filtersTemplate: "filtersTemplate", additionalActionsTemplate: "additionalActionsTemplate", isAllSortEnabled: "isAllSortEnabled" }, outputs: { filter: "filter", order: "order", selectAll: "selectAll", event: "event" }, host: { listeners: { "document:click": "onClick($event.target)" } }, providers: [StyleService], viewQueries: [{ propertyName: "th", first: true, predicate: ["th"], descendants: true }, { propertyName: "additionalActionMenu", first: true, predicate: ["additionalActionMenu"], descendants: true }, { propertyName: "headerDropdown", predicate: ["headerDropdown"], descendants: true }], ngImport: i0, template: "<tr class=\"ngx-table__header\" *ngIf=\"config.headerEnabled && !config.columnReorder\">\r\n <th *ngIf=\"config.checkboxes || config.radio\" [style.width]=\"'3%'\">\r\n <ng-container\r\n *ngIf=\"selectAllTemplate && config.checkboxes\"\r\n [ngTemplateOutlet]=\"selectAllTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\r\n >\r\n </ng-container>\r\n <label\r\n class=\"ngx-form-checkbox\"\r\n for=\"selectAllCheckboxes\"\r\n *ngIf=\"!selectAllTemplate && config.checkboxes\"\r\n >\r\n <input type=\"checkbox\" id=\"selectAllCheckboxes\" (change)=\"onSelectAll()\" />\r\n <em class=\"ngx-form-icon\" id=\"selectAllCheckbox\"></em>\r\n </label>\r\n </th>\r\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\r\n <th\r\n class=\"ngx-table__header-cell\"\r\n [class.pinned-left]=\"column.pinned\"\r\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\r\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\r\n #th\r\n [style.width]=\"getColumnWidth(column)\"\r\n (mousedown)=\"onMouseDown($event, th)\"\r\n (mouseup)=\"onMouseUp($event)\"\r\n (mousemove)=\"onMouseMove($event)\"\r\n >\r\n <div\r\n (click)=\"orderBy(column)\"\r\n style=\"display: inline\"\r\n [class.pointer]=\"isOrderEnabled(column)\"\r\n >\r\n <div class=\"ngx-table__header-title\">\r\n {{ column.title }}<span> </span>\r\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\r\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\r\n <svg\r\n *ngIf=\"(column.isAllSortEnabled ?? true) && sortKey !== column.key && column.key !== ''\" \r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n ><path d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\" fill=\"#8486B9\"/>\r\n </svg>\r\n \r\n <svg\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#FCFCFF\"\r\n />\r\n </svg>\r\n \r\n <svg\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path\r\n d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#FCFCFF\"\r\n />\r\n</svg>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"ngx-dropdown\" *ngIf=\"!!column.headerActionTemplate\" #headerDropdown>\r\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\r\n <span class=\"ngx-icon ngx-icon-more\"></span>\r\n </a>\r\n <div\r\n class=\"ngx-menu ngx-table__table-menu\"\r\n *ngIf=\"column.key === openedHeaderActionTemplate\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"> </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\r\n </th>\r\n </ng-container>\r\n <th\r\n *ngIf=\"\r\n config.additionalActions ||\r\n config.detailsTemplate ||\r\n config.collapseAllRows ||\r\n config.groupRows\r\n \"\r\n class=\"ngx-table__header-cell-additional-actions\"\r\n >\r\n <div class=\"ngx-dropdown\" #additionalActionMenu *ngIf=\"config.additionalActions\">\r\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\r\n <span class=\"ngx-icon ngx-icon-menu\"></span>\r\n </a>\r\n <ul class=\"ngx-menu ngx-table__table-menu\" *ngIf=\"menuActive\">\r\n <ng-container\r\n *ngIf=\"additionalActionsTemplate\"\r\n [ngTemplateOutlet]=\"additionalActionsTemplate\"\r\n >\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </th>\r\n</tr>\r\n<tr\r\n class=\"ngx-table__header ngx-table__header--draggable\"\r\n *ngIf=\"config.headerEnabled && config.columnReorder\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"columnDrop($event)\"\r\n>\r\n <th *ngIf=\"config.checkboxes || config.radio\" [style.width]=\"'3%'\">\r\n <ng-container\r\n *ngIf=\"selectAllTemplate && config.checkboxes\"\r\n [ngTemplateOutlet]=\"selectAllTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\r\n >\r\n </ng-container>\r\n <label\r\n class=\"ngx-form-checkbox\"\r\n for=\"selectAllCheckboxes\"\r\n *ngIf=\"!selectAllTemplate && config.checkboxes\"\r\n >\r\n <input type=\"checkbox\" id=\"selectAllCheckboxesDrag\" (change)=\"onSelectAll()\" />\r\n <em class=\"ngx-form-icon\" id=\"selectAllCheckboxDrag\"></em>\r\n </label>\r\n </th>\r\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\r\n <th\r\n class=\"ngx-table__header-cell ngx-table__header-cell--draggable\"\r\n cdkDragLockAxis=\"x\"\r\n cdkDrag\r\n [cdkDragStartDelay]=\"config.reorderDelay || 0\"\r\n [class.pinned-left]=\"column.pinned\"\r\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\r\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\r\n #th\r\n [style.width]=\"getColumnWidth(column)\"\r\n (mousedown)=\"onMouseDown($event, th)\"\r\n (mouseup)=\"onMouseUp($event)\"\r\n (mousemove)=\"onMouseMove($event)\"\r\n >\r\n <div\r\n (click)=\"orderBy(column)\"\r\n style=\"display: inline\"\r\n cdkDragHandle\r\n [class.pointer]=\"isOrderEnabled(column)\"\r\n >\r\n <div class=\"ngx-table__header-title\">\r\n {{ column.title }}<span> </span>\r\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\r\n <!-- <div [style.display]=\"isAllSortEnabled ||config.orderEnabled ? 'inline' : 'none'\">\r\n <em\r\n *ngIf=\"isAllSortEnabled\"\r\n class=\"ngx-icon ngx-icon-arrow-down\"\r\n >\r\n </em>\r\n <em\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\r\n class=\"ngx-icon ngx-icon-arrow-up\"\r\n >\r\n </em>\r\n <em\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\r\n class=\"ngx-icon ngx-icon-arrow-down\"\r\n >\r\n </em>\r\n </div> -->\r\n<div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\r\n <svg\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path\r\n d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#FCFCFF\"\r\n />\r\n</svg>\r\n\r\n\r\n <svg\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path\r\n d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#FCFCFF\"\r\n />\r\n</svg>\r\n\r\n\r\n <svg *ngIf=\"(column.isAllSortEnabled ?? true) && sortKey !== column.key && column.key !== ''\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n><path d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#8486B9\"/>\r\n</svg>\r\n\r\n</div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"ngx-dropdown\" *ngIf=\"!!column.headerActionTemplate\" #headerDropdown>\r\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\r\n <span class=\"ngx-icon ngx-icon-more\"></span>\r\n </a>\r\n <div\r\n class=\"ngx-menu ngx-table__table-menu\"\r\n *ngIf=\"column.key === openedHeaderActionTemplate\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"> </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\r\n </th>\r\n </ng-container>\r\n <th\r\n *ngIf=\"\r\n config.additionalActions ||\r\n config.detailsTemplate ||\r\n config.collapseAllRows ||\r\n config.groupRows\r\n \"\r\n class=\"ngx-table__header-cell-additional-actions\"\r\n >\r\n <div class=\"ngx-dropdown\" #additionalActionMenu *ngIf=\"config.additionalActions\">\r\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\r\n <span class=\"ngx-icon ngx-icon-menu\"></span>\r\n </a>\r\n <ul class=\"ngx-menu ngx-table__table-menu\" *ngIf=\"menuActive\">\r\n <ng-container\r\n *ngIf=\"additionalActionsTemplate\"\r\n [ngTemplateOutlet]=\"additionalActionsTemplate\"\r\n >\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </th>\r\n</tr>\r\n<tr\r\n [style.display]=\"config.searchEnabled && !filtersTemplate ? 'table-row' : 'none'\"\r\n class=\"ngx-table__search-header\"\r\n>\r\n <th *ngIf=\"config.checkboxes || config.radio\"></th>\r\n <ng-container *ngFor=\"let column of columns; let colIndex = index\">\r\n <th\r\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\r\n [class.pinned-left]=\"column.pinned\"\r\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\r\n >\r\n <table-header\r\n *ngIf=\"getColumnDefinition(column)\"\r\n (update)=\"onSearch($event)\"\r\n [column]=\"column\"\r\n >\r\n </table-header>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"config.additionalActions || config.detailsTemplate\"></th>\r\n</tr>\r\n<ng-container *ngIf=\"filtersTemplate\">\r\n <tr>\r\n <ng-container [ngTemplateOutlet]=\"filtersTemplate\"> </ng-container>\r\n </tr>\r\n</ng-container>\r\n", styles: [".cdk-drag-preview{text-align:left;padding-top:9px;padding-left:4px;color:#50596c;border:1px solid #e7e9ed}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i4.HeaderComponent, selector: "table-header", inputs: ["column"], outputs: ["update"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: TableTHeadComponent, decorators: [{
type: Component,
args: [{ selector: '[table-thead]', changeDetection: ChangeDetectionStrategy.OnPush, providers: [StyleService], template: "<tr class=\"ngx-table__header\" *ngIf=\"config.headerEnabled && !config.columnReorder\">\r\n <th *ngIf=\"config.checkboxes || config.radio\" [style.width]=\"'3%'\">\r\n <ng-container\r\n *ngIf=\"selectAllTemplate && config.checkboxes\"\r\n [ngTemplateOutlet]=\"selectAllTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\r\n >\r\n </ng-container>\r\n <label\r\n class=\"ngx-form-checkbox\"\r\n for=\"selectAllCheckboxes\"\r\n *ngIf=\"!selectAllTemplate && config.checkboxes\"\r\n >\r\n <input type=\"checkbox\" id=\"selectAllCheckboxes\" (change)=\"onSelectAll()\" />\r\n <em class=\"ngx-form-icon\" id=\"selectAllCheckbox\"></em>\r\n </label>\r\n </th>\r\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\r\n <th\r\n class=\"ngx-table__header-cell\"\r\n [class.pinned-left]=\"column.pinned\"\r\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\r\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\r\n #th\r\n [style.width]=\"getColumnWidth(column)\"\r\n (mousedown)=\"onMouseDown($event, th)\"\r\n (mouseup)=\"onMouseUp($event)\"\r\n (mousemove)=\"onMouseMove($event)\"\r\n >\r\n <div\r\n (click)=\"orderBy(column)\"\r\n style=\"display: inline\"\r\n [class.pointer]=\"isOrderEnabled(column)\"\r\n >\r\n <div class=\"ngx-table__header-title\">\r\n {{ column.title }}<span> </span>\r\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\r\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\r\n <svg\r\n *ngIf=\"(column.isAllSortEnabled ?? true) && sortKey !== column.key && column.key !== ''\" \r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n ><path d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\" fill=\"#8486B9\"/>\r\n </svg>\r\n \r\n <svg\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#FCFCFF\"\r\n />\r\n </svg>\r\n \r\n <svg\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path\r\n d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#FCFCFF\"\r\n />\r\n</svg>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"ngx-dropdown\" *ngIf=\"!!column.headerActionTemplate\" #headerDropdown>\r\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\r\n <span class=\"ngx-icon ngx-icon-more\"></span>\r\n </a>\r\n <div\r\n class=\"ngx-menu ngx-table__table-menu\"\r\n *ngIf=\"column.key === openedHeaderActionTemplate\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"> </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\r\n </th>\r\n </ng-container>\r\n <th\r\n *ngIf=\"\r\n config.additionalActions ||\r\n config.detailsTemplate ||\r\n config.collapseAllRows ||\r\n config.groupRows\r\n \"\r\n class=\"ngx-table__header-cell-additional-actions\"\r\n >\r\n <div class=\"ngx-dropdown\" #additionalActionMenu *ngIf=\"config.additionalActions\">\r\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\r\n <span class=\"ngx-icon ngx-icon-menu\"></span>\r\n </a>\r\n <ul class=\"ngx-menu ngx-table__table-menu\" *ngIf=\"menuActive\">\r\n <ng-container\r\n *ngIf=\"additionalActionsTemplate\"\r\n [ngTemplateOutlet]=\"additionalActionsTemplate\"\r\n >\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </th>\r\n</tr>\r\n<tr\r\n class=\"ngx-table__header ngx-table__header--draggable\"\r\n *ngIf=\"config.headerEnabled && config.columnReorder\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"columnDrop($event)\"\r\n>\r\n <th *ngIf=\"config.checkboxes || config.radio\" [style.width]=\"'3%'\">\r\n <ng-container\r\n *ngIf=\"selectAllTemplate && config.checkboxes\"\r\n [ngTemplateOutlet]=\"selectAllTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\r\n >\r\n </ng-container>\r\n <label\r\n class=\"ngx-form-checkbox\"\r\n for=\"selectAllCheckboxes\"\r\n *ngIf=\"!selectAllTemplate && config.checkboxes\"\r\n >\r\n <input type=\"checkbox\" id=\"selectAllCheckboxesDrag\" (change)=\"onSelectAll()\" />\r\n <em class=\"ngx-form-icon\" id=\"selectAllCheckboxDrag\"></em>\r\n </label>\r\n </th>\r\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\r\n <th\r\n class=\"ngx-table__header-cell ngx-table__header-cell--draggable\"\r\n cdkDragLockAxis=\"x\"\r\n cdkDrag\r\n [cdkDragStartDelay]=\"config.reorderDelay || 0\"\r\n [class.pinned-left]=\"column.pinned\"\r\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\r\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\r\n #th\r\n [style.width]=\"getColumnWidth(column)\"\r\n (mousedown)=\"onMouseDown($event, th)\"\r\n (mouseup)=\"onMouseUp($event)\"\r\n (mousemove)=\"onMouseMove($event)\"\r\n >\r\n <div\r\n (click)=\"orderBy(column)\"\r\n style=\"display: inline\"\r\n cdkDragHandle\r\n [class.pointer]=\"isOrderEnabled(column)\"\r\n >\r\n <div class=\"ngx-table__header-title\">\r\n {{ column.title }}<span> </span>\r\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\r\n <!-- <div [style.display]=\"isAllSortEnabled ||config.orderEnabled ? 'inline' : 'none'\">\r\n <em\r\n *ngIf=\"isAllSortEnabled\"\r\n class=\"ngx-icon ngx-icon-arrow-down\"\r\n >\r\n </em>\r\n <em\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\r\n class=\"ngx-icon ngx-icon-arrow-up\"\r\n >\r\n </em>\r\n <em\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\r\n class=\"ngx-icon ngx-icon-arrow-down\"\r\n >\r\n </em>\r\n </div> -->\r\n<div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\r\n <svg\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path\r\n d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#FCFCFF\"\r\n />\r\n</svg>\r\n\r\n\r\n <svg\r\n *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path\r\n d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#FCFCFF\"\r\n />\r\n</svg>\r\n\r\n\r\n <svg *ngIf=\"(column.isAllSortEnabled ?? true) && sortKey !== column.key && column.key !== ''\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n><path d=\"M10 17.4987L6.25 13.7487L7.45833 12.5404L10 15.082L12.5417 12.5404L13.75 13.7487L10 17.4987ZM7.45833 7.54036L6.25 6.33203L10 2.58203L13.75 6.33203L12.5417 7.54036L10 4.9987L7.45833 7.54036Z\"\r\n fill=\"#8486B9\"/>\r\n</svg>\r\n\r\n</div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"ngx-dropdown\" *ngIf=\"!!column.headerActionTemplate\" #headerDropdown>\r\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\r\n <span class=\"ngx-icon ngx-icon-more\"></span>\r\n </a>\r\n <div\r\n class=\"ngx-menu ngx-table__table-menu\"\r\n *ngIf=\"column.key === openedHeaderActionTemplate\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"> </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\r\n </th>\r\n </ng-container>\r\n <th\r\n *ngIf=\"\r\n config.additionalActions ||\r\n config.detailsTemplate ||\r\n config.collapseAllRows ||\r\n config.groupRows\r\n \"\r\n class=\"ngx-table__header-cell-additional-actions\"\r\n >\r\n <div class=\"ngx-dropdown\" #additionalActionMenu *ngIf=\"config.additionalActions\">\r\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\r\n <span class=\"ngx-icon ngx-icon-menu\"></span>\r\n </a>\r\n <ul class=\"ngx-menu ngx-table__table-menu\" *ngIf=\"menuActive\">\r\n <ng-container\r\n *ngIf=\"additionalActionsTemplate\"\r\n [ngTemplateOutlet]=\"additionalActionsTemplate\"\r\n >\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </th>\r\n</tr>\r\n<tr\r\n [style.display]=\"config.searchEnabled && !filtersTemplate ? 'table-row' : 'none'\"\r\n class=\"ngx-table__search-header\"\r\n>\r\n <th *ngIf=\"config.checkboxes || config.radio\"></th>\r\n <ng-container *ngFor=\"let column of columns; let colIndex = index\">\r\n <th\r\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\r\n [class.pinned-left]=\"column.pinned\"\r\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\r\n >\r\n <table-header\r\n *ngIf=\"getColumnDefinition(column)\"\r\n (update)=\"onSearch($event)\"\r\n [column]=\"column\"\r\n >\r\n </table-header>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"config.additionalActions || config.detailsTemplate\"></th>\r\n</tr>\r\n<ng-container *ngIf=\"filtersTemplate\">\r\n <tr>\r\n <ng-container [ngTemplateOutlet]=\"filtersTemplate\"> </ng-container>\r\n </tr>\r\n</ng-container>\r\n", styles: [".cdk-drag-preview{text-align:left;padding-top:9px;padding-left:4px;color:#50596c;border:1px solid #e7e9ed}\n"] }]
}], ctorParameters: () => [{ type: i1.StyleService }], propDecorators: { config: [{
type: Input
}], columns: [{
type: Input
}], sortKey: [{
type: Input
}], sortState: [{
type: Input
}], selectAllTemplate: [{
type: Input
}], filtersTemplate: [{
type: Input
}], additionalActionsTemplate: [{
type: Input
}], isAllSortEnabled: [{
type: Input
}], filter: [{
type: Output
}], order: [{
type: Output
}], selectAll: [{
type: Output
}], event: [{
type: Output
}], th: [{
type: ViewChild,
args: ['th']
}], headerDropdown: [{
type: ViewChildren,
args: ['headerDropdown']
}], additionalActionMenu: [{
type: ViewChild,
args: ['additionalActionMenu']
}], onClick: [{
type: HostListener,
args: ['document:click', ['$event.target']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVhc3ktdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL3RoZWFkL3RoZWFkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lYXN5LXRhYmxlL3NyYy9saWIvY29tcG9uZW50cy90aGVhZC90aGVhZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFtQnRFLE1BQU0sT0FBTyxtQkFBbUI7SUFzQnZCLE9BQU8sQ0FBQyxhQUFrQjtRQUMvQixJQUNFLElBQUksQ0FBQyxvQkFBb0I7WUFDekIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFDaEUsQ0FBQztZQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsSUFDRSxJQUFJLENBQUMsMEJBQTBCO1lBQy9CLHNDQUFzQztZQUN0QyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUN2RixDQUFD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LEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3JDLENBQUM7OEdBOUhVLG1CQUFtQjtrR0FBbkIsbUJBQW1CLDRjQUZuQixDQUFDLFlBQVksQ0FBQyx5VEM5QjNCLDhvV0E0UkE7OzJGRDVQYSxtQkFBbUI7a0JBakIvQixTQUFTOytCQUNFLGVBQWUsbUJBYVIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLFlBQVksQ0FBQztpRkFRaEIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNhLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksS0FBSztzQkFBdkIsTUFBTTtnQkFDWSxTQUFTO3NCQUEzQixNQUFNO2dCQUNZLEtBQUs7c0JBQXZCLE1BQU07Z0JBQ2tCLEVBQUU7c0JBQTFCLFNBQVM7dUJBQUMsSUFBSTtnQkFDaUIsY0FBYztzQkFBN0MsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBQ0ssb0JBQW9CO3NCQUF0RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFFMUIsT0FBTztzQkFEYixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29sdW1ucywgQ29uZmlnLCBFdmVudCB9IGZyb20gJy4uLy4uJztcclxuaW1wb3J0IHsgU3R5bGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3R5bGUuc2VydmljZSc7XHJcbmltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnW3RhYmxlLXRoZWFkXScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RoZWFkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgICAgLmNkay1kcmFnLXByZXZpZXcge1xyXG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICAgICAgcGFkZGluZy10b3A6IDlweDtcclxuICAgICAgICBwYWRkaW5nLWxlZnQ6IDRweDtcclxuICAgICAgICBjb2xvcjogIzUwNTk2YztcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTdlOWVkO1xyXG4gICAgICB9XHJcbiAgICBgLFxyXG4gIF0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgcHJvdmlkZXJzOiBbU3R5bGVTZXJ2aWNlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmxlVEhlYWRDb21wb25lbnQge1xyXG4gIHB1YmxpYyBtZW51QWN0aXZlID0gZmFsc2U7XHJcbiAgcHVibGljIG9wZW5lZEhlYWRlckFjdGlvblRlbXBsYXRlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgc3RhcnRPZmZzZXQ7XHJcbiAgcHVibGljIG9uU2VsZWN0QWxsQmluZGVkID0gdGhpcy5vblNlbGVjdEFsbC5iaW5kKHRoaXMpO1xyXG5cclxuICBASW5wdXQoKSBjb25maWc6IENvbmZpZztcclxuICBASW5wdXQoKSBjb2x1bW5zOiBDb2x1bW5zW107XHJcbiAgQElucHV0KCkgc29ydEtleTtcclxuICBASW5wdXQoKSBzb3J0U3RhdGU7XHJcbiAgQElucHV0KCkgc2VsZWN0QWxsVGVtcGxhdGU7XHJcbiAgQElucHV0KCkgZmlsdGVyc1RlbXBsYXRlO1xyXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xyXG4gIEBJbnB1dCgpIGlzQWxsU29ydEVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSBmaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4+KCk7XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG9yZGVyID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW5zPigpO1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RBbGwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4oKTtcclxuICBAVmlld0NoaWxkKCd0aCcpIHByaXZhdGUgdGg7XHJcbiAgQFZpZXdDaGlsZHJlbignaGVhZGVyRHJvcGRvd24nKSBoZWFkZXJEcm9wZG93bjtcclxuICBAVmlld0NoaWxkKCdhZGRpdGlvbmFsQWN0aW9uTWVudScpIGFkZGl0aW9uYWxBY3Rpb25NZW51O1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pXHJcbiAgcHVibGljIG9uQ2xpY2sodGFyZ2V0RWxlbWVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYWRkaXRpb25hbEFjdGlvbk1lbnUgJiZcclxuICAgICAgIXRoaXMuYWRkaXRpb25hbEFjdGlvbk1lbnUubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXRFbGVtZW50KVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMubWVudUFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIGNsaWNrIG91dHNpZGUgdGhlIGhlYWRlciB0aGVuIGNsb3NlIG9wZW5lZCBIZWFkZXIgQWN0aW9uIFRlbXBsYXRlXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGUgJiZcclxuICAgICAgLy8gaWYgbm8gaGVhZGVyIGhhdmUgdGhlIGNsaWNrZWQgcG9pbnRcclxuICAgICAgIXRoaXMuaGVhZGVyRHJvcGRvd24udG9BcnJheSgpLnNvbWUoKHJlZikgPT4gcmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0RWxlbWVudCkpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5vcGVuZWRIZWFkZXJBY3Rpb25UZW1wbGF0ZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgc3R5bGVTZXJ2aWNlOiBTdHlsZVNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIGdldENvbHVtbkRlZmluaXRpb24oY29sdW1uOiBDb2x1bW5zKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gY29sdW1uLnNlYXJjaEVuYWJsZWQgfHwgdHlwZW9mIGNvbHVtbi5zZWFyY2hFbmFibGVkID09PSAndW5kZWZpbmVkJztcclxuICB9XHJcblxyXG4gIG9yZGVyQnkoY29sdW1uOiBDb2x1bW5zKTogdm9pZCB7XHJcbiAgICB0aGlzLm9yZGVyLmVtaXQoY29sdW1uKTtcclxuICB9XHJcblxyXG4gIGlzT3JkZXJFbmFibGVkKGNvbHVtbjogQ29sdW1ucyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY29sdW1uT3JkZXJFbmFibGVkID0gY29sdW1uLm9yZGVyRW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICEhY29sdW1uLm9yZGVyRW5hYmxlZDtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5vcmRlckVuYWJsZWQgJiYgY29sdW1uT3JkZXJFbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgY29sdW1uRHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KTogdm9pZCB7XHJcbiAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5jb2x1bW5zLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2goJGV2ZW50OiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlci5lbWl0KCRldmVudCk7XHJcbiAgfVxyXG5cclxuICBnZXRDb2x1bW5XaWR0aChjb2x1bW46IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKGNvbHVtbi53aWR0aCkge1xyXG4gICAgICByZXR1cm4gY29sdW1uLndpZHRoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmZpeGVkQ29sdW1uV2lkdGggPyAxMDAgLyB0aGlzLmNvbHVtbnMubGVuZ3RoICsgJyUnIDogbnVsbDtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0QWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RBbGwuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHRoOiBIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5yZXNpemVDb2x1bW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50aCA9IHRoO1xyXG4gICAgdGhpcy5zdGFydE9mZnNldCA9IHRoLm9mZnNldFdpZHRoIC0gZXZlbnQucGFnZVg7XHJcbiAgICB0aGlzLmV2ZW50LmVtaXQoe1xyXG4gICAgICBldmVudDogRXZlbnQub25Db2x1bW5SZXNpemVNb3VzZURvd24sXHJcbiAgICAgIHZhbHVlOiBldmVudCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jb25maWcucmVzaXplQ29sdW1uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRoICYmIHRoaXMudGguc3R5bGUpIHtcclxuICAgICAgdGhpcy50aC5zdHlsZS53aWR0aCA9IHRoaXMuc3RhcnRPZmZzZXQgKyBldmVudC5wYWdlWCArICdweCc7XHJcbiAgICAgIHRoaXMudGguc3R5bGUuY3Vyc29yID0gJ2NvbC1yZXNpemUnO1xyXG4gICAgICB0aGlzLnRoLnN0eWxlWyd1c2VyLXNlbGVjdCddID0gJ25vbmUnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Nb3VzZVVwKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLnJlc2l6ZUNvbHVtbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmV2ZW50LmVtaXQoe1xyXG4gICAgICBldmVudDogRXZlbnQub25Db2x1bW5SZXNpemVNb3VzZVVwLFxyXG4gICAgICB2YWx1ZTogZXZlbnQsXHJcbiAgICB9KTtcclxuICAgIHRoaXMudGguc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgdGhpcy50aCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHNob3dIZWFkZXJBY3Rpb25UZW1wbGF0ZU1lbnUoY29sdW1uOiBDb2x1bW5zKTogdm9pZCB7XHJcbiAgICBpZiAoIWNvbHVtbi5oZWFkZXJBY3Rpb25UZW1wbGF0ZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdDb2x1bW4gW2hlYWRlckFjdGlvblRlbXBsYXRlXSBwcm9wZXJ0eSBub3QgZGVmaW5lZCcpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGUgPT09IGNvbHVtbi5rZXkpIHtcclxuICAgICAgdGhpcy5vcGVuZWRIZWFkZXJBY3Rpb25UZW1wbGF0ZSA9IG51bGw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMub3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGUgPSBjb2x1bW4ua2V5O1xyXG4gIH1cclxuXHJcbiAgc2hvd01lbnUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYWRkaXRpb25hbEFjdGlvbnNUZW1wbGF0ZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbYWRkaXRpb25hbEFjdGlvbnNUZW1wbGF0ZV0gcHJvcGVydHkgbm90IGRlZmluZWQnKTtcclxuICAgIH1cclxuICAgIHRoaXMubWVudUFjdGl2ZSA9ICF0aGlzLm1lbnVBY3RpdmU7XHJcbiAgfVxyXG59XHJcbiIsIjx0ciBjbGFzcz1cIm5neC10YWJsZV9faGVhZGVyXCIgKm5nSWY9XCJjb25maWcuaGVhZGVyRW5hYmxlZCAmJiAhY29uZmlnLmNvbHVtblJlb3JkZXJcIj5cclxuICA8dGggKm5nSWY9XCJjb25maWcuY2hlY2tib3hlcyB8fCBjb25maWcucmFkaW9cIiBbc3R5bGUud2lkdGhdPVwiJzMlJ1wiPlxyXG4gICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAqbmdJZj1cInNlbGVjdEFsbFRlbXBsYXRlICYmIGNvbmZpZy5jaGVja2JveGVzXCJcclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0QWxsVGVtcGxhdGVcIlxyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9uU2VsZWN0QWxsQmluZGVkIH1cIlxyXG4gICAgPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bGFiZWxcclxuICAgICAgY2xhc3M9XCJuZ3gtZm9ybS1jaGVja2JveFwiXHJcbiAgICAgIGZvcj1cInNlbGVjdEFsbENoZWNrYm94ZXNcIlxyXG4gICAgICAqbmdJZj1cIiFzZWxlY3RBbGxUZW1wbGF0ZSAmJiBjb25maWcuY2hlY2tib3hlc1wiXHJcbiAgICA+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNlbGVjdEFsbENoZWNrYm94ZXNcIiAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsKClcIiAvPlxyXG4gICAgICA8ZW0gY2xhc3M9XCJuZ3gtZm9ybS1pY29uXCIgaWQ9XCJzZWxlY3RBbGxDaGVja2JveFwiPjwvZW0+XHJcbiAgICA8L2xhYmVsPlxyXG4gIDwvdGg+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IGxldCBjb2xJbmRleCA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgIDx0aFxyXG4gICAgICBjbGFzcz1cIm5neC10YWJsZV9faGVhZGVyLWNlbGxcIlxyXG4gICAgICBbY2xhc3MucGlubmVkLWxlZnRdPVwiY29sdW1uLnBpbm5lZFwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5jc3NDbGFzcyAmJiBjb2x1bW4uY3NzQ2xhc3MuaW5jbHVkZUhlYWRlciA/IGNvbHVtbi5jc3NDbGFzcy5uYW1lIDogJydcIlxyXG4gICAgICBbc3R5bGUubGVmdF09XCJzdHlsZVNlcnZpY2UucGlubmVkV2lkdGgoY29sdW1uLnBpbm5lZCwgY29sSW5kZXgpXCJcclxuICAgICAgI3RoXHJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJnZXRDb2x1bW5XaWR0aChjb2x1bW4pXCJcclxuICAgICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQsIHRoKVwiXHJcbiAgICAgIChtb3VzZXVwKT1cIm9uTW91c2VVcCgkZXZlbnQpXCJcclxuICAgICAgKG1vdXNlbW92ZSk9XCJvbk1vdXNlTW92ZSgkZXZlbnQpXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIChjbGljayk9XCJvcmRlckJ5KGNvbHVtbilcIlxyXG4gICAgICAgIHN0eWxlPVwiZGlzcGxheTogaW5saW5lXCJcclxuICAgICAgICBbY2xhc3MucG9pbnRlcl09XCJpc09yZGVyRW5hYmxlZChjb2x1bW4pXCJcclxuICAgICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXRhYmxlX19oZWFkZXItdGl0bGVcIj5cclxuICAgICAgICB7eyBjb2x1bW4udGl0bGUgfX08c3Bhbj4mbmJzcDs8L3NwYW4+XHJcbiAgICAgICAgPGVtIGNsYXNzPVwibmd4LWljb24gbmd4LWljb24tcGluXCIgKm5nSWY9XCJjb2x1bW4ucGlubmVkXCI+PC9lbT5cclxuICAgICAgPGRpdiBbc3R5bGUuZGlzcGxheV09XCJjb25maWcub3JkZXJFbmFibGVkID8gJ2lubGluZScgOiAnbm9uZSdcIj5cclxuICAgICAgICA8c3ZnXHJcbiAgICAgICAgKm5nSWY9XCIoY29sdW1uLmlzQWxsU29ydEVuYWJsZWQgPz8gdHJ1ZSkgJiYgc29ydEtleSAhPT0gY29sdW1uLmtleSAmJiBjb2x1bW4ua2V5ICE9PSAnJ1wiIFxyXG4gICAgICAgIHdpZHRoPVwiMjBcIlxyXG4gICAgICAgIGhlaWdodD1cIjIwXCJcclxuICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgID48cGF0aCBkPVwiTTEwIDE3LjQ5ODdMNi4yNSAxMy43NDg3TDcuNDU4MzMgMTIuNTQwNEwxMCAxNS4wODJMMTIuNTQxNyAxMi41NDA0TDEzLjc1IDEzLjc0ODdMMTAgMTcuNDk4N1pNNy40NTgzMyA3LjU0MDM2TDYuMjUgNi4zMzIwM0wxMCAyLjU4MjAzTDEzLjc1IDYuMzMyMDNMMTIuNTQxNyA3LjU0MDM2TDEwIDQuOTk4N0w3LjQ1ODMzIDcuNTQwMzZaXCIgZmlsbD1cIiM4NDg2QjlcIi8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgICBcclxuICAgICAgICA8c3ZnXHJcbiAgICAgICAgKm5nSWY9XCJzb3J0S2V5ID09PSBjb2x1bW4ua2V5ICYmIHRoaXMuc29ydFN0YXRlLmdldChzb3J0S2V5KSA9PT0gJ2FzYydcIlxyXG4gICAgICAgIHdpZHRoPVwiMjBcIlxyXG4gICAgICAgIGhlaWdodD1cIjIwXCJcclxuICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgID5cclxuICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgZD1cIk0xMCAxNy40OTg3TDYuMjUgMTMuNzQ4N0w3LjQ1ODMzIDEyLjU0MDRMMTAgMTUuMDgyTDEyLjU0MTcgMTIuNTQwNEwxMy43NSAxMy43NDg3TDEwIDE3LjQ5ODdaTTcuNDU4MzMgNy41NDAzNkw2LjI1IDYuMzMyMDNMMTAgMi41ODIwM0wxMy43NSA2LjMzMjAzTDEyLjU0MTcgNy41NDAzNkwxMCA0Ljk5ODdMNy40NTgzMyA3LjU0MDM2WlwiXHJcbiAgICAgICAgICBmaWxsPVwiI0ZDRkNGRlwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIFxyXG4gICAgIDxzdmdcclxuICAqbmdJZj1cInNvcnRLZXkgPT09IGNvbHVtbi5rZXkgJiYgdGhpcy5zb3J0U3RhdGUuZ2V0KHNvcnRLZXkpID09PSAnZGVzYydcIlxyXG4gIHdpZHRoPVwiMjBcIlxyXG4gIGhlaWdodD1cIjIwXCJcclxuICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICBmaWxsPVwibm9uZVwiXHJcbiAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbj5cclxuICA8cGF0aFxyXG4gICAgZD1cIk0xMCAxNy40OTg3TDYuMjUgMTMuNzQ4N0w3LjQ1ODMzIDEyLjU0MDRMMTAgMTUuMDgyTDEyLjU0MTcgMTIuNTQwNEwxMy43NSAxMy43NDg3TDEwIDE3LjQ5ODdaTTcuNDU4MzMgNy41NDAzNkw2LjI1IDYuMzMyMDNMMTAgMi41ODIwM0wxMy43NSA2LjMzMjAzTDEyLjU0MTcgNy41NDAzNkwxMCA0Ljk5ODdMNy40NTgzMyA3LjU0MDM2WlwiXHJcbiAgICBmaWxsPVwiI0ZDRkNGRlwiXHJcbiAgLz5cclxuPC9zdmc+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LWRyb3Bkb3duXCIgKm5nSWY9XCIhIWNvbHVtbi5oZWFkZXJBY3Rpb25UZW1wbGF0ZVwiICNoZWFkZXJEcm9wZG93bj5cclxuICAgICAgICA8YSBjbGFzcz1cIm5neC1idG4gbmd4LWJ0bi1saW5rXCIgKGNsaWNrKT1cInNob3dIZWFkZXJBY3Rpb25UZW1wbGF0ZU1lbnUoY29sdW1uKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtaWNvbiBuZ3gtaWNvbi1tb3JlXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cIm5neC1tZW51IG5neC10YWJsZV9fdGFibGUtbWVudVwiXHJcbiAgICAgICAgICAqbmdJZj1cImNvbHVtbi5rZXkgPT09IG9wZW5lZEhlYWRlckFjdGlvblRlbXBsYXRlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5oZWFkZXJBY3Rpb25UZW1wbGF0ZVwiPiA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtdGFibGVfX2NvbHVtbi1yZXNpemVyXCIgKm5nSWY9XCJjb25maWcucmVzaXplQ29sdW1uICYmICFsYXN0XCI+PC9kaXY+XHJcbiAgICA8L3RoPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDx0aFxyXG4gICAgKm5nSWY9XCJcclxuICAgICAgY29uZmlnLmFkZGl0aW9uYWxBY3Rpb25zIHx8XHJcbiAgICAgIGNvbmZpZy5kZXRhaWxzVGVtcGxhdGUgfHxcclxuICAgICAgY29uZmlnLmNvbGxhcHNlQWxsUm93cyB8fFxyXG4gICAgICBjb25maWcuZ3JvdXBSb3dzXHJcbiAgICBcIlxyXG4gICAgY2xhc3M9XCJuZ3gtdGFibGVfX2hlYWRlci1jZWxsLWFkZGl0aW9uYWwtYWN0aW9uc1wiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cIm5neC1kcm9wZG93blwiICNhZGRpdGlvbmFsQWN0aW9uTWVudSAqbmdJZj1cImNvbmZpZy5hZGRpdGlvbmFsQWN0aW9uc1wiPlxyXG4gICAgICA8YSBjbGFzcz1cIm5neC1idG4gbmd4LWJ0bi1saW5rXCIgKGNsaWNrKT1cInNob3dNZW51KClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLW1lbnVcIj48L3NwYW4+XHJcbiAgICAgIDwvYT5cclxuICAgICAgPHVsIGNsYXNzPVwibmd4LW1lbnUgbmd4LXRhYmxlX190YWJsZS1tZW51XCIgKm5nSWY9XCJtZW51QWN0aXZlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgKm5nSWY9XCJhZGRpdGlvbmFsQWN0aW9uc1RlbXBsYXRlXCJcclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZGl0aW9uYWxBY3Rpb25zVGV