@tilde-nlp/ngx-common 2.0.9 → 2.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/filter-bar/filter-bar.component.mjs +58 -8
- package/esm2020/lib/filter-bar/filter-bar.module.mjs +16 -5
- package/esm2020/lib/helpers/html-element-parse.helper.mjs +2 -2
- package/esm2020/lib/multi-functional-table/models/batch-config.model.mjs +2 -0
- package/esm2020/lib/multi-functional-table/models/column-select-config.model.mjs +1 -1
- package/esm2020/lib/multi-functional-table/models/export-config.model.mjs +1 -1
- package/esm2020/lib/multi-functional-table/models/index.mjs +2 -1
- package/esm2020/lib/multi-functional-table/models/multi-functional-table-config.model.mjs +1 -1
- package/esm2020/lib/multi-functional-table/multi-functional-table.component.mjs +7 -5
- package/fesm2015/tilde-nlp-ngx-common.mjs +78 -17
- package/fesm2015/tilde-nlp-ngx-common.mjs.map +1 -1
- package/fesm2020/tilde-nlp-ngx-common.mjs +76 -16
- package/fesm2020/tilde-nlp-ngx-common.mjs.map +1 -1
- package/lib/filter-bar/filter-bar.component.d.ts +23 -7
- package/lib/filter-bar/filter-bar.module.d.ts +3 -1
- package/lib/multi-functional-table/models/batch-config.model.d.ts +4 -0
- package/lib/multi-functional-table/models/column-select-config.model.d.ts +0 -4
- package/lib/multi-functional-table/models/export-config.model.d.ts +0 -4
- package/lib/multi-functional-table/models/index.d.ts +1 -0
- package/lib/multi-functional-table/models/multi-functional-table-config.model.d.ts +2 -0
- package/lib/multi-functional-table/multi-functional-table.component.d.ts +2 -0
- package/package.json +1 -1
|
@@ -34,6 +34,7 @@ export class MultiFunctionalTableComponent {
|
|
|
34
34
|
set selection(value) {
|
|
35
35
|
this.matSelection.setSelection(...(value ?? []));
|
|
36
36
|
}
|
|
37
|
+
get ignoreAttributeName() { return DISABLE_EXPORT_ATTRIBUTE_NAME; }
|
|
37
38
|
get filterActive() { return this.config.filter?.enabled; }
|
|
38
39
|
//#region Angular lifecycle hooks
|
|
39
40
|
ngOnInit() {
|
|
@@ -55,7 +56,7 @@ export class MultiFunctionalTableComponent {
|
|
|
55
56
|
}
|
|
56
57
|
//#endregion
|
|
57
58
|
updateDisplayColumns(initial = false) {
|
|
58
|
-
this.batchSelectedEnabled = this.config.
|
|
59
|
+
this.batchSelectedEnabled = this.config.batchConfig?.enabled ? true : false;
|
|
59
60
|
const allColumns = this.config.columnSelect?.columns ?? [];
|
|
60
61
|
this.displayColumns = [];
|
|
61
62
|
this.configurableColumns = allColumns.filter(column => !column.notConfigurable);
|
|
@@ -135,7 +136,7 @@ export class MultiFunctionalTableComponent {
|
|
|
135
136
|
case ExportFormat.CSV:
|
|
136
137
|
default:
|
|
137
138
|
extension = ExportFormat.CSV;
|
|
138
|
-
fileString = HtmlElementParseHelper.tableAsCsv(this.tableElementRef.nativeElement, this.
|
|
139
|
+
fileString = HtmlElementParseHelper.tableAsCsv(this.tableElementRef.nativeElement, this.ignoreAttributeName);
|
|
139
140
|
break;
|
|
140
141
|
}
|
|
141
142
|
const translatedFileName = this.translateService.instant(this.config.export.fileOptions.fileName);
|
|
@@ -166,6 +167,7 @@ export class MultiFunctionalTableComponent {
|
|
|
166
167
|
}
|
|
167
168
|
setFilterProperties() {
|
|
168
169
|
if (this.config.filter?.enabled) {
|
|
170
|
+
this.filterEnabled = true;
|
|
169
171
|
this.filterBarVisible = this.localStorageValue?.filter?.visible ?? this.config.filter.visible ?? false;
|
|
170
172
|
this.filterSettings = this.config.filter.settings;
|
|
171
173
|
}
|
|
@@ -186,10 +188,10 @@ export class MultiFunctionalTableComponent {
|
|
|
186
188
|
}
|
|
187
189
|
}
|
|
188
190
|
MultiFunctionalTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiFunctionalTableComponent, deps: [{ token: i1.DOMService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
189
|
-
MultiFunctionalTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MultiFunctionalTableComponent, selector: "tld-multi-functional-table", inputs: { config: "config", highlightedElements: "highlightedElements", selection: "selection" }, outputs: { filterBarChange: "filterBarChange", exported: "exported", selectionChange: "selectionChange" }, queries: [{ propertyName: "noDataRow", first: true, predicate: MatNoDataRow, descendants: true }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "rowDefs", predicate: MatRowDef, descendants: true }, { propertyName: "columnDefs", predicate: MatColumnDef }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableElementRef", first: true, predicate: MatTable, descendants: true, read: ElementRef }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar
|
|
191
|
+
MultiFunctionalTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MultiFunctionalTableComponent, selector: "tld-multi-functional-table", inputs: { config: "config", highlightedElements: "highlightedElements", selection: "selection" }, outputs: { filterBarChange: "filterBarChange", exported: "exported", selectionChange: "selectionChange" }, queries: [{ propertyName: "noDataRow", first: true, predicate: MatNoDataRow, descendants: true }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "rowDefs", predicate: MatRowDef, descendants: true }, { propertyName: "columnDefs", predicate: MatColumnDef }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableElementRef", first: true, predicate: MatTable, descendants: true, read: ElementRef }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar [filterRowVisible]=\"!filterBarVisible\" [settings]=\"filterSettings\" *ngIf=\"filterEnabled\"\r\n (filterBarChange)=\"filtersChanged($event)\">\r\n </tld-filter-bar>\r\n <table #table mat-table [dataSource]=\"config.dataSource\">\r\n <ng-content></ng-content>\r\n <ng-container [matColumnDef]=\"batchColumnName\">\r\n <th mat-header-cell *matHeaderCellDef disable-export>\r\n <mat-checkbox [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (change)=\"toggleAllRowSelection()\"\r\n [checked]=\"matSelection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"matSelection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let element\" disable-export>\r\n <mat-checkbox [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleElementSelection(element)\" [checked]=\"matSelection.isSelected(element)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"displayColumns\" sticky></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayColumns\" [class.highlight]=\"highlightElement(row)\"></tr>\r\n\r\n <ng-container *ngIf=\"noDataRowActive\">\r\n <tr *matNoDataRow>\r\n <!-- add random number to make sure it takes full width -->\r\n <td colspan=\"99\">\r\n <div class=\"no-engines-wrapper\">\r\n <ng-container *ngIf=\"!noDataRowConfig.loading; else loading\">\r\n <div>\r\n <span class=\"material-icons-outlined\">\r\n {{noDataRowIcon}}\r\n </span>\r\n </div>\r\n <div class=\"text-xl-semi-bold\" *ngIf=\"noDataRowConfig.title\"\r\n [innerHtml]=\"noDataRowConfig.title | translate: noDataRowConfig.titleParams\">\r\n </div>\r\n <div class=\"text-l\" *ngIf=\"noDataRowConfig.description\"\r\n [innerHtml]=\"noDataRowConfig.description | translate: noDataRowConfig.descriptionParams\"></div>\r\n </ng-container>\r\n <ng-template #loading>\r\n <mat-spinner color=\"accent\"></mat-spinner>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n\r\n </table>\r\n</div>\r\n", styles: [":host ::ng-deep tr.mat-row:hover,:host ::ng-deep tr.mat-row.highlight{background-color:var(--base-95)}table{width:100%}.column-select-icon{rotate:90deg}.column-select-wrapper{padding:1rem}.material-icons,.material-icons-outlined{margin-right:.5rem}.table-action-button{margin-bottom:1rem}.mat-no-data-row{text-align:center}.mat-no-data-row .no-engines-wrapper{margin-top:4rem}.mat-no-data-row .material-icons-outlined{font-size:4rem;color:var(--base-70)}mat-spinner{margin:auto}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i4.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.FilterBarComponent, selector: "tld-filter-bar", inputs: ["settings", "filterRowVisible"], outputs: ["filterBarChange"] }, { kind: "directive", type: i10.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i10.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i10.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
|
|
190
192
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiFunctionalTableComponent, decorators: [{
|
|
191
193
|
type: Component,
|
|
192
|
-
args: [{ selector: 'tld-multi-functional-table', template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar
|
|
194
|
+
args: [{ selector: 'tld-multi-functional-table', template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar [filterRowVisible]=\"!filterBarVisible\" [settings]=\"filterSettings\" *ngIf=\"filterEnabled\"\r\n (filterBarChange)=\"filtersChanged($event)\">\r\n </tld-filter-bar>\r\n <table #table mat-table [dataSource]=\"config.dataSource\">\r\n <ng-content></ng-content>\r\n <ng-container [matColumnDef]=\"batchColumnName\">\r\n <th mat-header-cell *matHeaderCellDef disable-export>\r\n <mat-checkbox [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (change)=\"toggleAllRowSelection()\"\r\n [checked]=\"matSelection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"matSelection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let element\" disable-export>\r\n <mat-checkbox [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleElementSelection(element)\" [checked]=\"matSelection.isSelected(element)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"displayColumns\" sticky></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayColumns\" [class.highlight]=\"highlightElement(row)\"></tr>\r\n\r\n <ng-container *ngIf=\"noDataRowActive\">\r\n <tr *matNoDataRow>\r\n <!-- add random number to make sure it takes full width -->\r\n <td colspan=\"99\">\r\n <div class=\"no-engines-wrapper\">\r\n <ng-container *ngIf=\"!noDataRowConfig.loading; else loading\">\r\n <div>\r\n <span class=\"material-icons-outlined\">\r\n {{noDataRowIcon}}\r\n </span>\r\n </div>\r\n <div class=\"text-xl-semi-bold\" *ngIf=\"noDataRowConfig.title\"\r\n [innerHtml]=\"noDataRowConfig.title | translate: noDataRowConfig.titleParams\">\r\n </div>\r\n <div class=\"text-l\" *ngIf=\"noDataRowConfig.description\"\r\n [innerHtml]=\"noDataRowConfig.description | translate: noDataRowConfig.descriptionParams\"></div>\r\n </ng-container>\r\n <ng-template #loading>\r\n <mat-spinner color=\"accent\"></mat-spinner>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n\r\n </table>\r\n</div>\r\n", styles: [":host ::ng-deep tr.mat-row:hover,:host ::ng-deep tr.mat-row.highlight{background-color:var(--base-95)}table{width:100%}.column-select-icon{rotate:90deg}.column-select-wrapper{padding:1rem}.material-icons,.material-icons-outlined{margin-right:.5rem}.table-action-button{margin-bottom:1rem}.mat-no-data-row{text-align:center}.mat-no-data-row .no-engines-wrapper{margin-top:4rem}.mat-no-data-row .material-icons-outlined{font-size:4rem;color:var(--base-70)}mat-spinner{margin:auto}\n"] }]
|
|
193
195
|
}], ctorParameters: function () { return [{ type: i1.DOMService }, { type: i2.TranslateService }]; }, propDecorators: { config: [{
|
|
194
196
|
type: Input
|
|
195
197
|
}], highlightedElements: [{
|
|
@@ -224,4 +226,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
224
226
|
type: ViewChild,
|
|
225
227
|
args: [MatTable, { read: ElementRef }]
|
|
226
228
|
}] } });
|
|
227
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZnVuY3Rpb25hbC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvbXVsdGktZnVuY3Rpb25hbC10YWJsZS9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBbUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRyxPQUFPLEVBQUUsR0FBRyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUc3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0sVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBV3pELE1BQU0sT0FBTyw2QkFBNkI7SUE4Q3hDLFlBQTZCLFVBQXNCLEVBQ2hDLGdCQUFrQztRQUR4QixlQUFV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RUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2pCLElBQUk7c0JBQXZCLFNBQVM7dUJBQUMsT0FBTztnQkFHeUIsZUFBZTtzQkFBekQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0U29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBNYXRDb2x1bW5EZWYsIE1hdEhlYWRlclJvd0RlZiwgTWF0Tm9EYXRhUm93LCBNYXRSb3dEZWYsIE1hdFRhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSwgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJCYXJTZXR0aW5ncyB9IGZyb20gJy4uL2ZpbHRlci1iYXInO1xyXG5pbXBvcnQgeyBGaWx0ZXJCYXJDaGFuZ2VFdmVudCB9IGZyb20gJy4uL2ZpbHRlci1iYXIvbW9kZWxzL2ZpbHRlci1iYXItY2hhbmdlLWV2ZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgSHRtbEVsZW1lbnRQYXJzZUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBTYXZlRmlsZUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvc2F2ZS1maWxlLmhlbHBlcic7XHJcbmltcG9ydCB7IERPTVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IERJU0FCTEVfRVhQT1JUX0FUVFJJQlVURV9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMvZGlzYWJsZS1leHBvcnQtYXR0cmlidXRlLW5hbWUuY29uc3QnO1xyXG5pbXBvcnQgeyBFeHBvcnRGb3JtYXQsIE5vRGF0YVJvd0NvbmZpZyB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29sdW1uLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IE11bHRpRnVuY3Rpb25hbFRhYmxlQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvbXVsdGktZnVuY3Rpb25hbC10YWJsZS1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBTZWxlY3RlZENvbHVtbkxvY2FsU3RvcmFnZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL3NlbGVjdGVkLWNvbHVtbi1sb2NhbC1zdG9yYWdlLWNvbmZpZy5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAndGxkLW11bHRpLWZ1bmN0aW9uYWwtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpRnVuY3Rpb25hbFRhYmxlQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0IHtcclxuICByZWFkb25seSBtYXRTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8VD4odHJ1ZSwgW10pO1xyXG5cclxuICBASW5wdXQoKSBjb25maWchOiBNdWx0aUZ1bmN0aW9uYWxUYWJsZUNvbmZpZzxUPjtcclxuICBASW5wdXQoKSBoaWdobGlnaHRlZEVsZW1lbnRzITogVFtdO1xyXG4gIEBJbnB1dCgpIHNldCBzZWxlY3Rpb24odmFsdWU6IFRbXSkge1xyXG4gICAgdGhpcy5tYXRTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKC4uLih2YWx1ZSA/PyBbXSkpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIE91dHB1dCBwcm9wZXJ0aWVzXHJcbiAgQE91dHB1dCgpIGZpbHRlckJhckNoYW5nZTogRXZlbnRFbWl0dGVyPEZpbHRlckJhckNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsdGVyQmFyQ2hhbmdlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIGV4cG9ydGVkOiBFdmVudEVtaXR0ZXI8VFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2U6IE9ic2VydmFibGU8VFtdPiA9IHRoaXMubWF0U2VsZWN0aW9uLmNoYW5nZWQuYXNPYnNlcnZhYmxlKCkucGlwZShtYXAoKCkgPT4geyByZXR1cm4gdGhpcy5tYXRTZWxlY3Rpb24uc2VsZWN0ZWQ7IH0pKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8gI3JlZ2lvbiBQcm9wZXJ0aWVzIGZvciBtYXQgdGFibGUgd3JhcHBlclxyXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0SGVhZGVyUm93RGVmKSBoZWFkZXJSb3dEZWZzITogUXVlcnlMaXN0PE1hdEhlYWRlclJvd0RlZj47XHJcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRSb3dEZWYsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgcm93RGVmcyE6IFF1ZXJ5TGlzdDxNYXRSb3dEZWY8VD4+O1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0Q29sdW1uRGVmKSBjb2x1bW5EZWZzITogUXVlcnlMaXN0PE1hdENvbHVtbkRlZj47XHJcbiAgQENvbnRlbnRDaGlsZChNYXROb0RhdGFSb3cpIG5vRGF0YVJvdyE6IE1hdE5vRGF0YVJvdztcclxuXHJcbiAgQFZpZXdDaGlsZChNYXRUYWJsZSwgeyBzdGF0aWM6IHRydWUgfSkgdGFibGUhOiBNYXRUYWJsZTxUPjtcclxuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQhOiBNYXRTb3J0O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBAVmlld0NoaWxkKE1hdFRhYmxlLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdGFibGVFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIGRpc3BsYXlDb2x1bW5zITogc3RyaW5nW107XHJcblxyXG4gIGNvbHVtblNlbGVjdEFjdGl2ZSE6IGJvb2xlYW47XHJcbiAgZ2V0IGZpbHRlckFjdGl2ZSgpIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbHRlcj8uZW5hYmxlZDsgfVxyXG4gIGV4cG9ydEFjdGl2ZSE6IGJvb2xlYW47XHJcbiAgbm9EYXRhUm93QWN0aXZlITogYm9vbGVhbjtcclxuXHJcbiAgZmlsdGVyQmFyVmlzaWJsZSE6IGJvb2xlYW47XHJcbiAgZmlsdGVyU2V0dGluZ3MhOiBGaWx0ZXJCYXJTZXR0aW5ncztcclxuXHJcbiAgbm9EYXRhUm93Q29uZmlnITogTm9EYXRhUm93Q29uZmlnO1xyXG4gIG5vRGF0YVJvd0ljb24gPSBcIm1hbmFnZV9zZWFyY2hcIjtcclxuXHJcbiAgY29uZmlndXJhYmxlQ29sdW1ucyE6IENvbHVtbkNvbmZpZ1tdO1xyXG4gIGJhdGNoU2VsZWN0ZWRFbmFibGVkITogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VWYWx1ZSE6IFNlbGVjdGVkQ29sdW1uTG9jYWxTdG9yYWdlQ29uZmlnO1xyXG4gIHJlYWRvbmx5IGJhdGNoQ29sdW1uTmFtZSA9IFwiYmF0Y2hcIjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkb21TZXJ2aWNlOiBET01TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgLy8jcmVnaW9uIEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2tzXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlYWRGcm9tTG9jYWxTdG9yYWdlKCk7XHJcbiAgICB0aGlzLnNldEZpbHRlclByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMuc2V0Q29sdW1uU2VsZWN0UHJvcGVydGllcygpO1xyXG4gICAgdGhpcy5zZXRFeHBvcnRQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLnNldE5vRGF0YVJvd1Byb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuXHJcbiAgICB0aGlzLmNvbHVtbkRlZnMuZm9yRWFjaChjb2x1bW5EZWYgPT4gdGhpcy50YWJsZS5hZGRDb2x1bW5EZWYoY29sdW1uRGVmKSk7XHJcbiAgICB0aGlzLnJvd0RlZnMuZm9yRWFjaChyb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRSb3dEZWYocm93RGVmKSk7XHJcbiAgICB0aGlzLmhlYWRlclJvd0RlZnMuZm9yRWFjaChoZWFkZXJSb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRIZWFkZXJSb3dEZWYoaGVhZGVyUm93RGVmKSk7XHJcbiAgICB0aGlzLmhlYWRlclJvd0RlZnMuZm9yRWFjaChoZWFkZXJSb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRIZWFkZXJSb3dEZWYoaGVhZGVyUm93RGVmKSk7XHJcbiAgICB0aGlzLnRhYmxlLnNldE5vRGF0YVJvdyh0aGlzLm5vRGF0YVJvdyk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpZy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICB1cGRhdGVEaXNwbGF5Q29sdW1ucyhpbml0aWFsID0gZmFsc2UpIHtcclxuICAgIHRoaXMuYmF0Y2hTZWxlY3RlZEVuYWJsZWQgPSB0aGlzLmNvbmZpZy5jb2x1bW5TZWxlY3Q/LmJhdGNoU2VsZWN0ID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IHRoaXMuY29uZmlnLmNvbHVtblNlbGVjdD8uY29sdW1ucyA/PyBbXTtcclxuICAgIHRoaXMuZGlzcGxheUNvbHVtbnMgPSBbXTtcclxuICAgIHRoaXMuY29uZmlndXJhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLm5vdENvbmZpZ3VyYWJsZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYmF0Y2hTZWxlY3RlZEVuYWJsZWQpIHtcclxuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1ucy5wdXNoKHRoaXMuYmF0Y2hDb2x1bW5OYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWFsbENvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2VWYWx1ZSA9IHRoaXMubG9jYWxTdG9yYWdlVmFsdWUgPz8ge307XHJcbiAgICBpZiAoIWxvY2FsU3RvcmFnZVZhbHVlLmNvbHVtbnMpIHtcclxuICAgICAgbG9jYWxTdG9yYWdlVmFsdWUuY29sdW1ucyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGFsbENvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChpbml0aWFsKSB7XHJcbiAgICAgICAgY29sdW1uLnNlbGVjdGVkID0gbG9jYWxTdG9yYWdlVmFsdWUuY29sdW1ucz8uW2NvbHVtbi5uYW1lXSA/PyBjb2x1bW4uc2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICBsb2NhbFN0b3JhZ2VWYWx1ZS5jb2x1bW5zIVtjb2x1bW4ubmFtZV0gPSBjb2x1bW4uc2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbHVtbi5zZWxlY3RlZCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUNvbHVtbnMucHVzaChjb2x1bW4ubmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAoIWluaXRpYWwpIHtcclxuICAgICAgdGhpcy51cGRhdGVMb2NhbFN0b3JhZ2UobG9jYWxTdG9yYWdlVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICB0b2dnbGVGaWx0ZXJCYXIoKSB7XHJcbiAgICBjb25zdCBsb2NhbHN0b3JhZ2VPYmplY3QgPSB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlID8/IHt9O1xyXG4gICAgaWYgKCFsb2NhbHN0b3JhZ2VPYmplY3QuZmlsdGVyKSB7XHJcbiAgICAgIGxvY2Fsc3RvcmFnZU9iamVjdC5maWx0ZXIgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlckJhclZpc2libGUgPSAhdGhpcy5maWx0ZXJCYXJWaXNpYmxlO1xyXG4gICAgbG9jYWxzdG9yYWdlT2JqZWN0LmZpbHRlci52aXNpYmxlID0gdGhpcy5maWx0ZXJCYXJWaXNpYmxlO1xyXG4gICAgdGhpcy51cGRhdGVMb2NhbFN0b3JhZ2UobG9jYWxzdG9yYWdlT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIGZpbHRlcnNDaGFuZ2VkKGZpbHRlcnM6IEZpbHRlckJhckNoYW5nZUV2ZW50KSB7XHJcbiAgICB0aGlzLmZpbHRlckJhckNoYW5nZS5lbWl0KGZpbHRlcnMpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0KCkge1xyXG4gICAgdGhpcy5jb25maWcuZGF0YVNvdXJjZS5jb25uZWN0KCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5leHBvcnRlZC5lbWl0KGRhdGEpO1xyXG4gICAgfSlcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcuZXhwb3J0Py5maWxlT3B0aW9ucykge1xyXG4gICAgICB0aGlzLmV4cG9ydFRvRmlsZSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoaWdobGlnaHRFbGVtZW50KGVsZW1lbnQ6IFQpIHtcclxuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodGVkRWxlbWVudHM/LmluY2x1ZGVzKGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIE1ldGhvZHMgZm9yIGJhdGNoIHNlbGVjdGlvblxyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMubWF0U2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmNvbmZpZy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xyXG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQWxsUm93U2VsZWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XHJcbiAgICAgIHRoaXMubWF0U2VsZWN0aW9uLmNsZWFyKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1hdFNlbGVjdGlvbi5zZWxlY3QoLi4udGhpcy5jb25maWcuZGF0YVNvdXJjZS5kYXRhKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUVsZW1lbnRTZWxlY3Rpb24oZWxlbWVudDogVCkge1xyXG4gICAgdGhpcy5tYXRTZWxlY3Rpb24udG9nZ2xlKGVsZW1lbnQpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSBleHBvcnRUb0ZpbGUoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmV4cG9ydD8uZmlsZU9wdGlvbnM/LnNhdmVUb0ZpbGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBmaWxlU3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBleHRlbnNpb24hOiBFeHBvcnRGb3JtYXQ7XHJcbiAgICBzd2l0Y2ggKHRoaXMuY29uZmlnLmV4cG9ydC5maWxlT3B0aW9ucy5mb3JtYXQpIHtcclxuICAgICAgY2FzZSBFeHBvcnRGb3JtYXQuQ1NWOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGV4dGVuc2lvbiA9IEV4cG9ydEZvcm1hdC5DU1Y7XHJcbiAgICAgICAgZmlsZVN0cmluZyA9IEh0bWxFbGVtZW50UGFyc2VIZWxwZXIudGFibGVBc0Nzdih0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbmZpZy5leHBvcnQuaWdub3JlQXR0cmlidXRlTmFtZSA/PyBESVNBQkxFX0VYUE9SVF9BVFRSSUJVVEVfTkFNRSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0cmFuc2xhdGVkRmlsZU5hbWUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZy5leHBvcnQuZmlsZU9wdGlvbnMuZmlsZU5hbWUpO1xyXG4gICAgU2F2ZUZpbGVIZWxwZXIuc2F2ZUZpbGUoZmlsZVN0cmluZywgYCR7dHJhbnNsYXRlZEZpbGVOYW1lfS4ke2V4dGVuc2lvbn1gKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTG9jYWxTdG9yYWdlKG5ld1ZhbHVlOiBTZWxlY3RlZENvbHVtbkxvY2FsU3RvcmFnZUNvbmZpZykge1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSAmJiBuZXdWYWx1ZSkge1xyXG4gICAgICB0aGlzLmRvbVNlcnZpY2UubG9jYWxTdG9yYWdlPy5zZXRJdGVtKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSByZWFkRnJvbUxvY2FsU3RvcmFnZSgpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2NhbFN0b3JhZ2VLZXkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBsb2NhbFN0b3JhZ2VTdHJpbmcgPSB0aGlzLmRvbVNlcnZpY2UubG9jYWxTdG9yYWdlPy5nZXRJdGVtKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSk7XHJcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlU3RyaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XHJcbiAgICAgIGNhdGNoIHtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDb2x1bW5TZWxlY3RQcm9wZXJ0aWVzKCkge1xyXG4gICAgdGhpcy5jb2x1bW5TZWxlY3RBY3RpdmUgPSB0aGlzLmNvbmZpZy5jb2x1bW5TZWxlY3Q/LmVuYWJsZWQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlDb2x1bW5zKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJQcm9wZXJ0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmZpbHRlcj8uZW5hYmxlZCkge1xyXG4gICAgICB0aGlzLmZpbHRlckJhclZpc2libGUgPSB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlPy5maWx0ZXI/LnZpc2libGUgPz8gdGhpcy5jb25maWcuZmlsdGVyLnZpc2libGUgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuZmlsdGVyU2V0dGluZ3MgPSB0aGlzLmNvbmZpZy5maWx0ZXIuc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldE5vRGF0YVJvd1Byb3BlcnRpZXMoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWcubm9EYXRhUm93KSB7XHJcbiAgICAgIHRoaXMubm9EYXRhUm93QWN0aXZlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5ub0RhdGFSb3dDb25maWcgPSB0aGlzLmNvbmZpZy5ub0RhdGFSb3c7XHJcbiAgICAgIGlmICh0aGlzLm5vRGF0YVJvd0NvbmZpZy5pY29uKSB7XHJcbiAgICAgICAgdGhpcy5ub0RhdGFSb3dJY29uID0gdGhpcy5ub0RhdGFSb3dDb25maWcuaWNvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRFeHBvcnRQcm9wZXJ0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmV4cG9ydD8uZW5hYmxlZCkge1xyXG4gICAgICB0aGlzLmV4cG9ydEFjdGl2ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEdhcD1cIjFyZW1cIj5cclxuXHJcbiAgPGRpdiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgPGRpdiBmeEZsZXggZnhMYXlvdXRHYXA9XCIxcmVtXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29sdW1uTWVudVwiICpuZ0lmPVwiY29sdW1uU2VsZWN0QWN0aXZlXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjb2x1bW4tc2VsZWN0LWljb25cIj5tZW51PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPnt7J01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuQ09MVU1OX1NFTEVDVCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gKm5nSWY9XCJmaWx0ZXJBY3RpdmVcIiAoY2xpY2spPVwidG9nZ2xlRmlsdGVyQmFyKClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+ZmlsdGVyX2xpc3Q8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+e3snTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5GSUxURVJfVE9HR0xFJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uICpuZ0lmPVwiZXhwb3J0QWN0aXZlXCIgKGNsaWNrKT1cImV4cG9ydCgpXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPmNsb3VkX2Rvd25sb2FkPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPnt7J01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuRVhQT1JUJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthZGRpdGlvbmFsQWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtbWVudSAjY29sdW1uTWVudT1cIm1hdE1lbnVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tc2VsZWN0LXdyYXBwZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb25maWd1cmFibGVDb2x1bW5zXCI+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cImNvbHVtbi5zZWxlY3RlZFwiIChjaGFuZ2UpPVwidXBkYXRlRGlzcGxheUNvbHVtbnMoKVwiPlxyXG4gICAgICAgICAge3tjb2x1bW4uZGlzcGxheU5hbWUgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbWF0LW1lbnU+XHJcblxyXG4gIDx0bGQtZmlsdGVyLWJhciAqbmdJZj1cImZpbHRlckJhclZpc2libGVcIiBbc2V0dGluZ3NdPVwiZmlsdGVyU2V0dGluZ3NcIiAoZmlsdGVyQmFyQ2hhbmdlKT1cImZpbHRlcnNDaGFuZ2VkKCRldmVudClcIj5cclxuICA8L3RsZC1maWx0ZXItYmFyPlxyXG4gIDx0YWJsZSAjdGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImNvbmZpZy5kYXRhU291cmNlXCI+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiYmF0Y2hDb2x1bW5OYW1lXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cInRvZ2dsZUFsbFJvd1NlbGVjdGlvbigpXCIgW2NoZWNrZWRdPVwibWF0U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIm1hdFNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFpc0FsbFNlbGVjdGVkKClcIj5cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgPC90aD5cclxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cInRvZ2dsZUVsZW1lbnRTZWxlY3Rpb24oZWxlbWVudClcIlxyXG4gICAgICAgICAgW2NoZWNrZWRdPVwibWF0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoZWxlbWVudClcIj5cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5Q29sdW1uc1wiIHN0aWNreT48L3RyPlxyXG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXlDb2x1bW5zXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJoaWdobGlnaHRFbGVtZW50KHJvdylcIj48L3RyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub0RhdGFSb3dBY3RpdmVcIj5cclxuICAgICAgPHRyICptYXROb0RhdGFSb3c+XHJcbiAgICAgICAgPCEtLSBhZGQgcmFuZG9tIG51bWJlciB0byBtYWtlIHN1cmUgaXQgdGFrZXMgZnVsbCB3aWR0aCAtLT5cclxuICAgICAgICA8dGQgY29sc3Bhbj1cIjk5XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tZW5naW5lcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbm9EYXRhUm93Q29uZmlnLmxvYWRpbmc7IGVsc2UgbG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7bm9EYXRhUm93SWNvbn19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteGwtc2VtaS1ib2xkXCIgKm5nSWY9XCJub0RhdGFSb3dDb25maWcudGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJub0RhdGFSb3dDb25maWcudGl0bGUgfCB0cmFuc2xhdGU6IG5vRGF0YVJvd0NvbmZpZy50aXRsZVBhcmFtc1wiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxcIiAqbmdJZj1cIm5vRGF0YVJvd0NvbmZpZy5kZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cIm5vRGF0YVJvd0NvbmZpZy5kZXNjcmlwdGlvbiB8IHRyYW5zbGF0ZTogbm9EYXRhUm93Q29uZmlnLmRlc2NyaXB0aW9uUGFyYW1zXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvYWRpbmc+XHJcbiAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIGNvbG9yPVwiYWNjZW50XCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPC90YWJsZT5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZnVuY3Rpb25hbC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvbXVsdGktZnVuY3Rpb25hbC10YWJsZS9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBbUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRyxPQUFPLEVBQUUsR0FBRyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUc3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0sVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBV3pELE1BQU0sT0FBTyw2QkFBNkI7SUFpRHhDLFlBQTZCLFVBQXNCLEVBQ2hDLGdCQUFrQztRQUR4QixlQUFV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QXBDLFlBQVk7dUJBQUMsWUFBWTtnQkFFYSxLQUFLO3NCQUEzQyxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2pCLElBQUk7c0JBQXZCLFNBQVM7dUJBQUMsT0FBTztnQkFHeUIsZUFBZTtzQkFBekQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0U29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBNYXRDb2x1bW5EZWYsIE1hdEhlYWRlclJvd0RlZiwgTWF0Tm9EYXRhUm93LCBNYXRSb3dEZWYsIE1hdFRhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSwgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJCYXJTZXR0aW5ncyB9IGZyb20gJy4uL2ZpbHRlci1iYXInO1xyXG5pbXBvcnQgeyBGaWx0ZXJCYXJDaGFuZ2VFdmVudCB9IGZyb20gJy4uL2ZpbHRlci1iYXIvbW9kZWxzL2ZpbHRlci1iYXItY2hhbmdlLWV2ZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgSHRtbEVsZW1lbnRQYXJzZUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBTYXZlRmlsZUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvc2F2ZS1maWxlLmhlbHBlcic7XHJcbmltcG9ydCB7IERPTVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IERJU0FCTEVfRVhQT1JUX0FUVFJJQlVURV9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMvZGlzYWJsZS1leHBvcnQtYXR0cmlidXRlLW5hbWUuY29uc3QnO1xyXG5pbXBvcnQgeyBFeHBvcnRGb3JtYXQsIE5vRGF0YVJvd0NvbmZpZyB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29sdW1uLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IE11bHRpRnVuY3Rpb25hbFRhYmxlQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvbXVsdGktZnVuY3Rpb25hbC10YWJsZS1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBTZWxlY3RlZENvbHVtbkxvY2FsU3RvcmFnZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL3NlbGVjdGVkLWNvbHVtbi1sb2NhbC1zdG9yYWdlLWNvbmZpZy5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAndGxkLW11bHRpLWZ1bmN0aW9uYWwtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpRnVuY3Rpb25hbFRhYmxlQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0IHtcclxuICByZWFkb25seSBtYXRTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8VD4odHJ1ZSwgW10pO1xyXG5cclxuICBASW5wdXQoKSBjb25maWchOiBNdWx0aUZ1bmN0aW9uYWxUYWJsZUNvbmZpZzxUPjtcclxuICBASW5wdXQoKSBoaWdobGlnaHRlZEVsZW1lbnRzITogVFtdO1xyXG4gIEBJbnB1dCgpIHNldCBzZWxlY3Rpb24odmFsdWU6IFRbXSkge1xyXG4gICAgdGhpcy5tYXRTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKC4uLih2YWx1ZSA/PyBbXSkpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIE91dHB1dCBwcm9wZXJ0aWVzXHJcbiAgQE91dHB1dCgpIGZpbHRlckJhckNoYW5nZTogRXZlbnRFbWl0dGVyPEZpbHRlckJhckNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsdGVyQmFyQ2hhbmdlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIGV4cG9ydGVkOiBFdmVudEVtaXR0ZXI8VFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2U6IE9ic2VydmFibGU8VFtdPiA9IHRoaXMubWF0U2VsZWN0aW9uLmNoYW5nZWQuYXNPYnNlcnZhYmxlKCkucGlwZShtYXAoKCkgPT4geyByZXR1cm4gdGhpcy5tYXRTZWxlY3Rpb24uc2VsZWN0ZWQ7IH0pKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8gI3JlZ2lvbiBQcm9wZXJ0aWVzIGZvciBtYXQgdGFibGUgd3JhcHBlclxyXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0SGVhZGVyUm93RGVmKSBoZWFkZXJSb3dEZWZzITogUXVlcnlMaXN0PE1hdEhlYWRlclJvd0RlZj47XHJcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRSb3dEZWYsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgcm93RGVmcyE6IFF1ZXJ5TGlzdDxNYXRSb3dEZWY8VD4+O1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0Q29sdW1uRGVmKSBjb2x1bW5EZWZzITogUXVlcnlMaXN0PE1hdENvbHVtbkRlZj47XHJcbiAgQENvbnRlbnRDaGlsZChNYXROb0RhdGFSb3cpIG5vRGF0YVJvdyE6IE1hdE5vRGF0YVJvdztcclxuXHJcbiAgQFZpZXdDaGlsZChNYXRUYWJsZSwgeyBzdGF0aWM6IHRydWUgfSkgdGFibGUhOiBNYXRUYWJsZTxUPjtcclxuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQhOiBNYXRTb3J0O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBAVmlld0NoaWxkKE1hdFRhYmxlLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdGFibGVFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG5cclxuICBnZXQgaWdub3JlQXR0cmlidXRlTmFtZSgpIHsgcmV0dXJuIERJU0FCTEVfRVhQT1JUX0FUVFJJQlVURV9OQU1FIH1cclxuICBkaXNwbGF5Q29sdW1ucyE6IHN0cmluZ1tdO1xyXG5cclxuICBjb2x1bW5TZWxlY3RBY3RpdmUhOiBib29sZWFuO1xyXG4gIGdldCBmaWx0ZXJBY3RpdmUoKSB7IHJldHVybiB0aGlzLmNvbmZpZy5maWx0ZXI/LmVuYWJsZWQ7IH1cclxuICBleHBvcnRBY3RpdmUhOiBib29sZWFuO1xyXG4gIG5vRGF0YVJvd0FjdGl2ZSE6IGJvb2xlYW47XHJcblxyXG4gIGZpbHRlckVuYWJsZWQhOiBib29sZWFuO1xyXG4gIGZpbHRlckJhclZpc2libGUhOiBib29sZWFuO1xyXG4gIGZpbHRlclNldHRpbmdzITogRmlsdGVyQmFyU2V0dGluZ3M7XHJcblxyXG4gIG5vRGF0YVJvd0NvbmZpZyE6IE5vRGF0YVJvd0NvbmZpZztcclxuICBub0RhdGFSb3dJY29uID0gXCJtYW5hZ2Vfc2VhcmNoXCI7XHJcblxyXG4gIGNvbmZpZ3VyYWJsZUNvbHVtbnMhOiBDb2x1bW5Db25maWdbXTtcclxuICBiYXRjaFNlbGVjdGVkRW5hYmxlZCE6IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlVmFsdWUhOiBTZWxlY3RlZENvbHVtbkxvY2FsU3RvcmFnZUNvbmZpZztcclxuICByZWFkb25seSBiYXRjaENvbHVtbk5hbWUgPSBcImJhdGNoXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZG9tU2VydmljZTogRE9NU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkgeyB9XHJcblxyXG4gIC8vI3JlZ2lvbiBBbmd1bGFyIGxpZmVjeWNsZSBob29rc1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWFkRnJvbUxvY2FsU3RvcmFnZSgpO1xyXG4gICAgdGhpcy5zZXRGaWx0ZXJQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLnNldENvbHVtblNlbGVjdFByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMuc2V0RXhwb3J0UHJvcGVydGllcygpO1xyXG4gICAgdGhpcy5zZXROb0RhdGFSb3dQcm9wZXJ0aWVzKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcblxyXG4gICAgdGhpcy5jb2x1bW5EZWZzLmZvckVhY2goY29sdW1uRGVmID0+IHRoaXMudGFibGUuYWRkQ29sdW1uRGVmKGNvbHVtbkRlZikpO1xyXG4gICAgdGhpcy5yb3dEZWZzLmZvckVhY2gocm93RGVmID0+IHRoaXMudGFibGUuYWRkUm93RGVmKHJvd0RlZikpO1xyXG4gICAgdGhpcy5oZWFkZXJSb3dEZWZzLmZvckVhY2goaGVhZGVyUm93RGVmID0+IHRoaXMudGFibGUuYWRkSGVhZGVyUm93RGVmKGhlYWRlclJvd0RlZikpO1xyXG4gICAgdGhpcy5oZWFkZXJSb3dEZWZzLmZvckVhY2goaGVhZGVyUm93RGVmID0+IHRoaXMudGFibGUuYWRkSGVhZGVyUm93RGVmKGhlYWRlclJvd0RlZikpO1xyXG4gICAgdGhpcy50YWJsZS5zZXROb0RhdGFSb3codGhpcy5ub0RhdGFSb3cpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgdXBkYXRlRGlzcGxheUNvbHVtbnMoaW5pdGlhbCA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLmJhdGNoU2VsZWN0ZWRFbmFibGVkID0gdGhpcy5jb25maWcuYmF0Y2hDb25maWc/LmVuYWJsZWQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1uU2VsZWN0Py5jb2x1bW5zID8/IFtdO1xyXG4gICAgdGhpcy5kaXNwbGF5Q29sdW1ucyA9IFtdO1xyXG4gICAgdGhpcy5jb25maWd1cmFibGVDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoY29sdW1uID0+ICFjb2x1bW4ubm90Q29uZmlndXJhYmxlKTtcclxuXHJcbiAgICBpZiAodGhpcy5iYXRjaFNlbGVjdGVkRW5hYmxlZCkge1xyXG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5zLnB1c2godGhpcy5iYXRjaENvbHVtbk5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghYWxsQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxvY2FsU3RvcmFnZVZhbHVlID0gdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA/PyB7fTtcclxuICAgIGlmICghbG9jYWxTdG9yYWdlVmFsdWUuY29sdW1ucykge1xyXG4gICAgICBsb2NhbFN0b3JhZ2VWYWx1ZS5jb2x1bW5zID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgaWYgKGluaXRpYWwpIHtcclxuICAgICAgICBjb2x1bW4uc2VsZWN0ZWQgPSBsb2NhbFN0b3JhZ2VWYWx1ZS5jb2x1bW5zPy5bY29sdW1uLm5hbWVdID8/IGNvbHVtbi5zZWxlY3RlZDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZVZhbHVlLmNvbHVtbnMhW2NvbHVtbi5uYW1lXSA9IGNvbHVtbi5zZWxlY3RlZDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sdW1uLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5Q29sdW1ucy5wdXNoKGNvbHVtbi5uYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGlmICghaW5pdGlhbCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUxvY2FsU3RvcmFnZShsb2NhbFN0b3JhZ2VWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcblxyXG4gIHRvZ2dsZUZpbHRlckJhcigpIHtcclxuICAgIGNvbnN0IGxvY2Fsc3RvcmFnZU9iamVjdCA9IHRoaXMubG9jYWxTdG9yYWdlVmFsdWUgPz8ge307XHJcbiAgICBpZiAoIWxvY2Fsc3RvcmFnZU9iamVjdC5maWx0ZXIpIHtcclxuICAgICAgbG9jYWxzdG9yYWdlT2JqZWN0LmZpbHRlciA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyQmFyVmlzaWJsZSA9ICF0aGlzLmZpbHRlckJhclZpc2libGU7XHJcbiAgICBsb2NhbHN0b3JhZ2VPYmplY3QuZmlsdGVyLnZpc2libGUgPSB0aGlzLmZpbHRlckJhclZpc2libGU7XHJcbiAgICB0aGlzLnVwZGF0ZUxvY2FsU3RvcmFnZShsb2NhbHN0b3JhZ2VPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyc0NoYW5nZWQoZmlsdGVyczogRmlsdGVyQmFyQ2hhbmdlRXZlbnQpIHtcclxuICAgIHRoaXMuZmlsdGVyQmFyQ2hhbmdlLmVtaXQoZmlsdGVycyk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQoKSB7XHJcbiAgICB0aGlzLmNvbmZpZy5kYXRhU291cmNlLmNvbm5lY3QoKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmV4cG9ydGVkLmVtaXQoZGF0YSk7XHJcbiAgICB9KVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5leHBvcnQ/LmZpbGVPcHRpb25zKSB7XHJcbiAgICAgIHRoaXMuZXhwb3J0VG9GaWxlKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudDogVCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRFbGVtZW50cz8uaW5jbHVkZXMoZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gTWV0aG9kcyBmb3IgYmF0Y2ggc2VsZWN0aW9uXHJcbiAgaXNBbGxTZWxlY3RlZCgpIHtcclxuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5tYXRTZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xyXG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuY29uZmlnLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGxSb3dTZWxlY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5tYXRTZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWF0U2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLmNvbmZpZy5kYXRhU291cmNlLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRWxlbWVudFNlbGVjdGlvbihlbGVtZW50OiBUKSB7XHJcbiAgICB0aGlzLm1hdFNlbGVjdGlvbi50b2dnbGUoZWxlbWVudCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIGV4cG9ydFRvRmlsZSgpIHtcclxuICAgIGlmICghdGhpcy5jb25maWcuZXhwb3J0Py5maWxlT3B0aW9ucz8uc2F2ZVRvRmlsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpbGVTdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IGV4dGVuc2lvbiE6IEV4cG9ydEZvcm1hdDtcclxuICAgIHN3aXRjaCAodGhpcy5jb25maWcuZXhwb3J0LmZpbGVPcHRpb25zLmZvcm1hdCkge1xyXG4gICAgICBjYXNlIEV4cG9ydEZvcm1hdC5DU1Y6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZXh0ZW5zaW9uID0gRXhwb3J0Rm9ybWF0LkNTVjtcclxuICAgICAgICBmaWxlU3RyaW5nID0gSHRtbEVsZW1lbnRQYXJzZUhlbHBlci50YWJsZUFzQ3N2KHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuaWdub3JlQXR0cmlidXRlTmFtZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0cmFuc2xhdGVkRmlsZU5hbWUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZy5leHBvcnQuZmlsZU9wdGlvbnMuZmlsZU5hbWUpO1xyXG4gICAgU2F2ZUZpbGVIZWxwZXIuc2F2ZUZpbGUoZmlsZVN0cmluZywgYCR7dHJhbnNsYXRlZEZpbGVOYW1lfS4ke2V4dGVuc2lvbn1gKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTG9jYWxTdG9yYWdlKG5ld1ZhbHVlOiBTZWxlY3RlZENvbHVtbkxvY2FsU3RvcmFnZUNvbmZpZykge1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSAmJiBuZXdWYWx1ZSkge1xyXG4gICAgICB0aGlzLmRvbVNlcnZpY2UubG9jYWxTdG9yYWdlPy5zZXRJdGVtKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSByZWFkRnJvbUxvY2FsU3RvcmFnZSgpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2NhbFN0b3JhZ2VLZXkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBsb2NhbFN0b3JhZ2VTdHJpbmcgPSB0aGlzLmRvbVNlcnZpY2UubG9jYWxTdG9yYWdlPy5nZXRJdGVtKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSk7XHJcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlU3RyaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XHJcbiAgICAgIGNhdGNoIHtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDb2x1bW5TZWxlY3RQcm9wZXJ0aWVzKCkge1xyXG4gICAgdGhpcy5jb2x1bW5TZWxlY3RBY3RpdmUgPSB0aGlzLmNvbmZpZy5jb2x1bW5TZWxlY3Q/LmVuYWJsZWQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlDb2x1bW5zKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJQcm9wZXJ0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmZpbHRlcj8uZW5hYmxlZCkge1xyXG4gICAgICB0aGlzLmZpbHRlckVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmZpbHRlckJhclZpc2libGUgPSB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlPy5maWx0ZXI/LnZpc2libGUgPz8gdGhpcy5jb25maWcuZmlsdGVyLnZpc2libGUgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuZmlsdGVyU2V0dGluZ3MgPSB0aGlzLmNvbmZpZy5maWx0ZXIuc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldE5vRGF0YVJvd1Byb3BlcnRpZXMoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWcubm9EYXRhUm93KSB7XHJcbiAgICAgIHRoaXMubm9EYXRhUm93QWN0aXZlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5ub0RhdGFSb3dDb25maWcgPSB0aGlzLmNvbmZpZy5ub0RhdGFSb3c7XHJcbiAgICAgIGlmICh0aGlzLm5vRGF0YVJvd0NvbmZpZy5pY29uKSB7XHJcbiAgICAgICAgdGhpcy5ub0RhdGFSb3dJY29uID0gdGhpcy5ub0RhdGFSb3dDb25maWcuaWNvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRFeHBvcnRQcm9wZXJ0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmV4cG9ydD8uZW5hYmxlZCkge1xyXG4gICAgICB0aGlzLmV4cG9ydEFjdGl2ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEdhcD1cIjFyZW1cIj5cclxuXHJcbiAgPGRpdiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgPGRpdiBmeEZsZXggZnhMYXlvdXRHYXA9XCIxcmVtXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29sdW1uTWVudVwiICpuZ0lmPVwiY29sdW1uU2VsZWN0QWN0aXZlXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjb2x1bW4tc2VsZWN0LWljb25cIj5tZW51PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPnt7J01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuQ09MVU1OX1NFTEVDVCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gKm5nSWY9XCJmaWx0ZXJBY3RpdmVcIiAoY2xpY2spPVwidG9nZ2xlRmlsdGVyQmFyKClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+ZmlsdGVyX2xpc3Q8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+e3snTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5GSUxURVJfVE9HR0xFJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uICpuZ0lmPVwiZXhwb3J0QWN0aXZlXCIgKGNsaWNrKT1cImV4cG9ydCgpXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPmNsb3VkX2Rvd25sb2FkPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPnt7J01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuRVhQT1JUJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthZGRpdGlvbmFsQWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtbWVudSAjY29sdW1uTWVudT1cIm1hdE1lbnVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tc2VsZWN0LXdyYXBwZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb25maWd1cmFibGVDb2x1bW5zXCI+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cImNvbHVtbi5zZWxlY3RlZFwiIChjaGFuZ2UpPVwidXBkYXRlRGlzcGxheUNvbHVtbnMoKVwiPlxyXG4gICAgICAgICAge3tjb2x1bW4uZGlzcGxheU5hbWUgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbWF0LW1lbnU+XHJcblxyXG4gIDx0bGQtZmlsdGVyLWJhciBbZmlsdGVyUm93VmlzaWJsZV09XCIhZmlsdGVyQmFyVmlzaWJsZVwiIFtzZXR0aW5nc109XCJmaWx0ZXJTZXR0aW5nc1wiICpuZ0lmPVwiZmlsdGVyRW5hYmxlZFwiXHJcbiAgICAoZmlsdGVyQmFyQ2hhbmdlKT1cImZpbHRlcnNDaGFuZ2VkKCRldmVudClcIj5cclxuICA8L3RsZC1maWx0ZXItYmFyPlxyXG4gIDx0YWJsZSAjdGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImNvbmZpZy5kYXRhU291cmNlXCI+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiYmF0Y2hDb2x1bW5OYW1lXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgZGlzYWJsZS1leHBvcnQ+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBbZGlzYWJsZWRdPVwiY29uZmlnLmJhdGNoQ29uZmlnIS5jaGVja0JveGVzRGlzYWJsZWRcIiAoY2hhbmdlKT1cInRvZ2dsZUFsbFJvd1NlbGVjdGlvbigpXCJcclxuICAgICAgICAgIFtjaGVja2VkXT1cIm1hdFNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIGlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJtYXRTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCI+XHJcbiAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgIDwvdGg+XHJcbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgZGlzYWJsZS1leHBvcnQ+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBbZGlzYWJsZWRdPVwiY29uZmlnLmJhdGNoQ29uZmlnIS5jaGVja0JveGVzRGlzYWJsZWRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlRWxlbWVudFNlbGVjdGlvbihlbGVtZW50KVwiIFtjaGVja2VkXT1cIm1hdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGVsZW1lbnQpXCI+XHJcbiAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheUNvbHVtbnNcIiBzdGlja3k+PC90cj5cclxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5Q29sdW1uc1wiIFtjbGFzcy5oaWdobGlnaHRdPVwiaGlnaGxpZ2h0RWxlbWVudChyb3cpXCI+PC90cj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9EYXRhUm93QWN0aXZlXCI+XHJcbiAgICAgIDx0ciAqbWF0Tm9EYXRhUm93PlxyXG4gICAgICAgIDwhLS0gYWRkIHJhbmRvbSBudW1iZXIgdG8gbWFrZSBzdXJlIGl0IHRha2VzIGZ1bGwgd2lkdGggLS0+XHJcbiAgICAgICAgPHRkIGNvbHNwYW49XCI5OVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWVuZ2luZXMtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW5vRGF0YVJvd0NvbmZpZy5sb2FkaW5nOyBlbHNlIGxvYWRpbmdcIj5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7e25vRGF0YVJvd0ljb259fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhsLXNlbWktYm9sZFwiICpuZ0lmPVwibm9EYXRhUm93Q29uZmlnLnRpdGxlXCJcclxuICAgICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwibm9EYXRhUm93Q29uZmlnLnRpdGxlIHwgdHJhbnNsYXRlOiBub0RhdGFSb3dDb25maWcudGl0bGVQYXJhbXNcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1sXCIgKm5nSWY9XCJub0RhdGFSb3dDb25maWcuZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJub0RhdGFSb3dDb25maWcuZGVzY3JpcHRpb24gfCB0cmFuc2xhdGU6IG5vRGF0YVJvd0NvbmZpZy5kZXNjcmlwdGlvblBhcmFtc1wiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxyXG4gICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBjb2xvcj1cImFjY2VudFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDwvdGFibGU+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
@@ -21,6 +21,8 @@ import * as i2$2 from '@angular/flex-layout/flex';
|
|
|
21
21
|
import * as i3 from '@angular/flex-layout/extended';
|
|
22
22
|
import * as i2$3 from '@angular/material/progress-bar';
|
|
23
23
|
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
24
|
+
import * as i7 from '@angular/forms';
|
|
25
|
+
import { FormGroup, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
24
26
|
import * as i2$4 from '@angular/material/form-field';
|
|
25
27
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
26
28
|
import * as i3$1 from '@angular/material/input';
|
|
@@ -28,8 +30,8 @@ import { MatInputModule } from '@angular/material/input';
|
|
|
28
30
|
import * as i5 from '@angular/material/select';
|
|
29
31
|
import { MatSelectModule } from '@angular/material/select';
|
|
30
32
|
import * as i6$1 from '@angular/material/core';
|
|
31
|
-
import * as
|
|
32
|
-
import {
|
|
33
|
+
import * as i10 from '@angular/material/chips';
|
|
34
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
33
35
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
34
36
|
import { MatSort, MatSortModule } from '@angular/material/sort';
|
|
35
37
|
import * as i4 from '@angular/material/table';
|
|
@@ -904,7 +906,7 @@ class HtmlElementParseHelper {
|
|
|
904
906
|
for (let i = 0; i < rows.length; i++) {
|
|
905
907
|
const cols = rows[i].querySelectorAll(columnSelector);
|
|
906
908
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
907
|
-
const csvrow = Array.from(cols).map((element) => element.innerText);
|
|
909
|
+
const csvrow = Array.from(cols).map((element) => `"${element.innerText}"`);
|
|
908
910
|
csv_data.push(csvrow.join(","));
|
|
909
911
|
}
|
|
910
912
|
return csv_data.join('\n');
|
|
@@ -1154,6 +1156,12 @@ class FilterBarComponent {
|
|
|
1154
1156
|
};
|
|
1155
1157
|
this.filterOverflow = false;
|
|
1156
1158
|
this.filterBarChange = new EventEmitter();
|
|
1159
|
+
this.inputFormControlName = "input";
|
|
1160
|
+
this.filterFormGroup = new FormGroup({});
|
|
1161
|
+
this.form = new FormGroup({
|
|
1162
|
+
[this.inputFormControlName]: new FormControl(""),
|
|
1163
|
+
filters: this.filterFormGroup
|
|
1164
|
+
});
|
|
1157
1165
|
this.defaultScrollWidth = 180;
|
|
1158
1166
|
}
|
|
1159
1167
|
get inputText() {
|
|
@@ -1172,11 +1180,25 @@ class FilterBarComponent {
|
|
|
1172
1180
|
var _a, _b;
|
|
1173
1181
|
return (_b = (_a = this.settings) === null || _a === void 0 ? void 0 : _a.filters) !== null && _b !== void 0 ? _b : [];
|
|
1174
1182
|
}
|
|
1183
|
+
set filterRowVisible(value) {
|
|
1184
|
+
this._filterRowVisible = value;
|
|
1185
|
+
this.cdref.detectChanges();
|
|
1186
|
+
this.checkOverflow();
|
|
1187
|
+
}
|
|
1188
|
+
get filterRowVisible() { return this._filterRowVisible; }
|
|
1175
1189
|
onResize() {
|
|
1176
1190
|
this.checkOverflow();
|
|
1177
1191
|
}
|
|
1192
|
+
// getter for cleaner template html
|
|
1193
|
+
get filterFormGroupValue() {
|
|
1194
|
+
return this.filterFormGroup.value;
|
|
1195
|
+
}
|
|
1178
1196
|
ngOnInit() {
|
|
1179
1197
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
1198
|
+
this.fields.forEach((field) => {
|
|
1199
|
+
this.filterFormGroup.addControl(field.fieldName, new FormControl([]));
|
|
1200
|
+
});
|
|
1201
|
+
this.subscribeToFormValueChanges();
|
|
1180
1202
|
this.searchTooltip = (_b = (_a = this.settings) === null || _a === void 0 ? void 0 : _a.searchTooltip) !== null && _b !== void 0 ? _b : 'FILTER_BAR.SEARCH_TOOLTIP';
|
|
1181
1203
|
this.searchTitle = (_d = (_c = this.settings) === null || _c === void 0 ? void 0 : _c.searchTitle) !== null && _d !== void 0 ? _d : 'FILTER_BAR.SEARCH';
|
|
1182
1204
|
this.prefixIcon = (_f = (_e = this.settings) === null || _e === void 0 ? void 0 : _e.prefixIcon) !== null && _f !== void 0 ? _f : "filter_alt";
|
|
@@ -1187,9 +1209,8 @@ class FilterBarComponent {
|
|
|
1187
1209
|
this.checkOverflow();
|
|
1188
1210
|
this.cdref.detectChanges();
|
|
1189
1211
|
}
|
|
1190
|
-
|
|
1191
|
-
this.
|
|
1192
|
-
this.emitFilters();
|
|
1212
|
+
ngOnDestroy() {
|
|
1213
|
+
this.formChangesSubscription.unsubscribe();
|
|
1193
1214
|
}
|
|
1194
1215
|
emitFilters() {
|
|
1195
1216
|
this.filterBarChange.next(this.filters);
|
|
@@ -1200,19 +1221,48 @@ class FilterBarComponent {
|
|
|
1200
1221
|
scrollLeft() {
|
|
1201
1222
|
this.filterWrapper.nativeElement.scrollTo({ left: (this.filterWrapper.nativeElement.scrollLeft - this.defaultScrollWidth), behavior: 'smooth' });
|
|
1202
1223
|
}
|
|
1224
|
+
removeFilter(key, ix) {
|
|
1225
|
+
const control = this.filterFormGroup.get(key);
|
|
1226
|
+
if (!control) {
|
|
1227
|
+
return;
|
|
1228
|
+
}
|
|
1229
|
+
const newArray = control.value;
|
|
1230
|
+
newArray.splice(ix, 1);
|
|
1231
|
+
control.setValue(newArray);
|
|
1232
|
+
// this.form.setValue(this.filters.filters);
|
|
1233
|
+
}
|
|
1203
1234
|
checkOverflow() {
|
|
1204
|
-
|
|
1235
|
+
if (this.filterWrapper) {
|
|
1236
|
+
this.filterOverflow = this.filterWrapper.nativeElement.clientWidth < this.filterWrapper.nativeElement.scrollWidth;
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
subscribeToFormValueChanges() {
|
|
1240
|
+
this.formChangesSubscription = this.form.valueChanges.subscribe(() => {
|
|
1241
|
+
var _a;
|
|
1242
|
+
this.filters = {
|
|
1243
|
+
input: (_a = this.form.value.input) !== null && _a !== void 0 ? _a : "",
|
|
1244
|
+
filters: {}
|
|
1245
|
+
};
|
|
1246
|
+
for (const filterKey in this.form.value.filters) {
|
|
1247
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1248
|
+
const filter = this.form.value.filters[filterKey];
|
|
1249
|
+
this.filters.filters[filterKey] = filter.map((item) => item.value);
|
|
1250
|
+
}
|
|
1251
|
+
this.emitFilters();
|
|
1252
|
+
});
|
|
1205
1253
|
}
|
|
1206
1254
|
}
|
|
1207
1255
|
FilterBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FilterBarComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1208
|
-
FilterBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FilterBarComponent, selector: "tld-filter-bar", inputs: { settings: "settings" }, outputs: { filterBarChange: "filterBarChange" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "filterWrapper", first: true, predicate: ["filterWrapper"], descendants: true }], ngImport: i0, template: "<button mat-icon-button (click)=\"scrollLeft()\" *ngIf=\"filterOverflow\">\r\n
|
|
1256
|
+
FilterBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FilterBarComponent, selector: "tld-filter-bar", inputs: { settings: "settings", filterRowVisible: "filterRowVisible" }, outputs: { filterBarChange: "filterBarChange" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "filterWrapper", first: true, predicate: ["filterWrapper"], descendants: true }], ngImport: i0, template: "<div class=\"filter-row\" *ngIf=\"filterRowVisible\">\r\n <button mat-icon-button (click)=\"scrollLeft()\" *ngIf=\"filterOverflow\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_back_ios\r\n </span>\r\n </button>\r\n <div fxLayout=\"row\" class=\"filter-wrapper\" #filterWrapper [formGroup]=\"form\">\r\n <mat-form-field fxFlex *ngIf=\"showSearch\" class=\"filter-bar-search-input\">\r\n <span matPrefix class=\"material-icons-outlined\">\r\n {{prefixIcon}}\r\n </span>\r\n <span matSuffix class=\"material-icons-outlined\" *ngIf=\"showSuffixIcon\" [matTooltip]=\"searchTooltip | translate\">\r\n {{suffixIcon}}\r\n </span>\r\n <input class=\"search-input\" matInput [placeholder]=\"searchTitle | translate\"\r\n [formControlName]=\"inputFormControlName\">\r\n </mat-form-field>\r\n <ng-container [formGroup]=\"filterFormGroup\">\r\n\r\n <mat-form-field *ngFor=\"let filter of fields\">\r\n <mat-label>{{filter.title | translate}}</mat-label>\r\n <mat-select multiple [formControlName]=\"filter.fieldName\">\r\n <mat-option *ngFor=\"let value of filter.values\" [value]=\"value\">\r\n {{value.key | translate : {default: value.value | titlecase } }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <button mat-icon-button *ngIf=\"filterOverflow\" (click)=\"scrollRight()\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_forward_ios\r\n </span>\r\n </button>\r\n</div>\r\n<mat-chip-list>\r\n <div *ngFor=\"let filter of fields\">\r\n <mat-chip *ngFor=\"let filterValue of filterFormGroupValue[filter.fieldName]; let ix=index\"\r\n (removed)=\"removeFilter(filter.fieldName, ix)\" class=\"text-s\">\r\n <button matChipRemove>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <span class=\"chip-filter-title\">{{filter.title | translate}}:</span>\r\n <span class=\"chip-value semi-bold\"> {{filterValue.key | translate : {default: filterValue.value | titlecase }\r\n }}</span>\r\n </mat-chip>\r\n </div>\r\n</mat-chip-list>\r\n", styles: [":host{display:inline-block}.filter-row{display:flex;background-color:var(--base-95);min-height:40px;min-width:100%;border-radius:.5rem;padding:.5rem 1.25rem 1rem;max-width:100%;align-items:baseline;margin-bottom:.5rem}.filter-row ::ng-deep .mat-form-field-wrapper{padding-bottom:0!important}.filter-row ::ng-deep .mat-form-field-underline{bottom:0!important}.search-input{background-color:unset;border:none}mat-form-field+mat-form-field{margin-left:1rem}.filter-bar-search-input{width:100%}.filter-bar-search-input::ng-deep .material-icons-outlined{vertical-align:bottom}.material-icons-outlined{color:var(--base-40)}.filter-wrapper{max-width:100%;overflow-x:hidden;overflow-y:hidden;display:flex;flex:1}.mat-chip.mat-standard-chip{background-color:var(--base-95);padding-left:.5em;padding-right:.75em;border:.5px solid var(--base-70)}.mat-chip.mat-standard-chip span{display:inline-block}.mat-chip.mat-standard-chip .chip-filter-title+.chip-value{margin-left:.25rem}.mat-chip .mat-chip-remove{margin-left:0;margin-right:.5em;color:var(--base-40);opacity:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2$4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$4.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i2$4.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i3$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i2$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i2$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i6$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i1$3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i10.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i10.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i1$1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }] });
|
|
1209
1257
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FilterBarComponent, decorators: [{
|
|
1210
1258
|
type: Component,
|
|
1211
|
-
args: [{ selector: 'tld-filter-bar', template: "<button mat-icon-button (click)=\"scrollLeft()\" *ngIf=\"filterOverflow\">\r\n
|
|
1259
|
+
args: [{ selector: 'tld-filter-bar', template: "<div class=\"filter-row\" *ngIf=\"filterRowVisible\">\r\n <button mat-icon-button (click)=\"scrollLeft()\" *ngIf=\"filterOverflow\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_back_ios\r\n </span>\r\n </button>\r\n <div fxLayout=\"row\" class=\"filter-wrapper\" #filterWrapper [formGroup]=\"form\">\r\n <mat-form-field fxFlex *ngIf=\"showSearch\" class=\"filter-bar-search-input\">\r\n <span matPrefix class=\"material-icons-outlined\">\r\n {{prefixIcon}}\r\n </span>\r\n <span matSuffix class=\"material-icons-outlined\" *ngIf=\"showSuffixIcon\" [matTooltip]=\"searchTooltip | translate\">\r\n {{suffixIcon}}\r\n </span>\r\n <input class=\"search-input\" matInput [placeholder]=\"searchTitle | translate\"\r\n [formControlName]=\"inputFormControlName\">\r\n </mat-form-field>\r\n <ng-container [formGroup]=\"filterFormGroup\">\r\n\r\n <mat-form-field *ngFor=\"let filter of fields\">\r\n <mat-label>{{filter.title | translate}}</mat-label>\r\n <mat-select multiple [formControlName]=\"filter.fieldName\">\r\n <mat-option *ngFor=\"let value of filter.values\" [value]=\"value\">\r\n {{value.key | translate : {default: value.value | titlecase } }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <button mat-icon-button *ngIf=\"filterOverflow\" (click)=\"scrollRight()\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_forward_ios\r\n </span>\r\n </button>\r\n</div>\r\n<mat-chip-list>\r\n <div *ngFor=\"let filter of fields\">\r\n <mat-chip *ngFor=\"let filterValue of filterFormGroupValue[filter.fieldName]; let ix=index\"\r\n (removed)=\"removeFilter(filter.fieldName, ix)\" class=\"text-s\">\r\n <button matChipRemove>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <span class=\"chip-filter-title\">{{filter.title | translate}}:</span>\r\n <span class=\"chip-value semi-bold\"> {{filterValue.key | translate : {default: filterValue.value | titlecase }\r\n }}</span>\r\n </mat-chip>\r\n </div>\r\n</mat-chip-list>\r\n", styles: [":host{display:inline-block}.filter-row{display:flex;background-color:var(--base-95);min-height:40px;min-width:100%;border-radius:.5rem;padding:.5rem 1.25rem 1rem;max-width:100%;align-items:baseline;margin-bottom:.5rem}.filter-row ::ng-deep .mat-form-field-wrapper{padding-bottom:0!important}.filter-row ::ng-deep .mat-form-field-underline{bottom:0!important}.search-input{background-color:unset;border:none}mat-form-field+mat-form-field{margin-left:1rem}.filter-bar-search-input{width:100%}.filter-bar-search-input::ng-deep .material-icons-outlined{vertical-align:bottom}.material-icons-outlined{color:var(--base-40)}.filter-wrapper{max-width:100%;overflow-x:hidden;overflow-y:hidden;display:flex;flex:1}.mat-chip.mat-standard-chip{background-color:var(--base-95);padding-left:.5em;padding-right:.75em;border:.5px solid var(--base-70)}.mat-chip.mat-standard-chip span{display:inline-block}.mat-chip.mat-standard-chip .chip-filter-title+.chip-value{margin-left:.25rem}.mat-chip .mat-chip-remove{margin-left:0;margin-right:.5em;color:var(--base-40);opacity:1}\n"] }]
|
|
1212
1260
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { filterBarChange: [{
|
|
1213
1261
|
type: Output
|
|
1214
1262
|
}], settings: [{
|
|
1215
1263
|
type: Input
|
|
1264
|
+
}], filterRowVisible: [{
|
|
1265
|
+
type: Input
|
|
1216
1266
|
}], filterWrapper: [{
|
|
1217
1267
|
type: ViewChild,
|
|
1218
1268
|
args: ["filterWrapper"]
|
|
@@ -1232,7 +1282,10 @@ FilterBarModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
|
|
|
1232
1282
|
MatSelectModule,
|
|
1233
1283
|
FormsModule,
|
|
1234
1284
|
MatTooltipModule,
|
|
1235
|
-
MatButtonModule
|
|
1285
|
+
MatButtonModule,
|
|
1286
|
+
MatChipsModule,
|
|
1287
|
+
MatIconModule,
|
|
1288
|
+
ReactiveFormsModule], exports: [FilterBarComponent] });
|
|
1236
1289
|
FilterBarModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FilterBarModule, imports: [CommonModule,
|
|
1237
1290
|
TranslateModule,
|
|
1238
1291
|
MatInputModule,
|
|
@@ -1241,7 +1294,10 @@ FilterBarModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version
|
|
|
1241
1294
|
MatSelectModule,
|
|
1242
1295
|
FormsModule,
|
|
1243
1296
|
MatTooltipModule,
|
|
1244
|
-
MatButtonModule
|
|
1297
|
+
MatButtonModule,
|
|
1298
|
+
MatChipsModule,
|
|
1299
|
+
MatIconModule,
|
|
1300
|
+
ReactiveFormsModule] });
|
|
1245
1301
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FilterBarModule, decorators: [{
|
|
1246
1302
|
type: NgModule,
|
|
1247
1303
|
args: [{
|
|
@@ -1257,7 +1313,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
1257
1313
|
MatSelectModule,
|
|
1258
1314
|
FormsModule,
|
|
1259
1315
|
MatTooltipModule,
|
|
1260
|
-
MatButtonModule
|
|
1316
|
+
MatButtonModule,
|
|
1317
|
+
MatChipsModule,
|
|
1318
|
+
MatIconModule,
|
|
1319
|
+
ReactiveFormsModule
|
|
1261
1320
|
],
|
|
1262
1321
|
exports: [
|
|
1263
1322
|
FilterBarComponent
|
|
@@ -1287,6 +1346,7 @@ class MultiFunctionalTableComponent {
|
|
|
1287
1346
|
set selection(value) {
|
|
1288
1347
|
this.matSelection.setSelection(...(value !== null && value !== void 0 ? value : []));
|
|
1289
1348
|
}
|
|
1349
|
+
get ignoreAttributeName() { return DISABLE_EXPORT_ATTRIBUTE_NAME; }
|
|
1290
1350
|
get filterActive() { var _a; return (_a = this.config.filter) === null || _a === void 0 ? void 0 : _a.enabled; }
|
|
1291
1351
|
//#region Angular lifecycle hooks
|
|
1292
1352
|
ngOnInit() {
|
|
@@ -1309,7 +1369,7 @@ class MultiFunctionalTableComponent {
|
|
|
1309
1369
|
//#endregion
|
|
1310
1370
|
updateDisplayColumns(initial = false) {
|
|
1311
1371
|
var _a, _b, _c, _d;
|
|
1312
|
-
this.batchSelectedEnabled = ((_a = this.config.
|
|
1372
|
+
this.batchSelectedEnabled = ((_a = this.config.batchConfig) === null || _a === void 0 ? void 0 : _a.enabled) ? true : false;
|
|
1313
1373
|
const allColumns = (_c = (_b = this.config.columnSelect) === null || _b === void 0 ? void 0 : _b.columns) !== null && _c !== void 0 ? _c : [];
|
|
1314
1374
|
this.displayColumns = [];
|
|
1315
1375
|
this.configurableColumns = allColumns.filter(column => !column.notConfigurable);
|
|
@@ -1384,7 +1444,7 @@ class MultiFunctionalTableComponent {
|
|
|
1384
1444
|
}
|
|
1385
1445
|
//#endregion
|
|
1386
1446
|
exportToFile() {
|
|
1387
|
-
var _a, _b
|
|
1447
|
+
var _a, _b;
|
|
1388
1448
|
if (!((_b = (_a = this.config.export) === null || _a === void 0 ? void 0 : _a.fileOptions) === null || _b === void 0 ? void 0 : _b.saveToFile)) {
|
|
1389
1449
|
return;
|
|
1390
1450
|
}
|
|
@@ -1394,7 +1454,7 @@ class MultiFunctionalTableComponent {
|
|
|
1394
1454
|
case ExportFormat.CSV:
|
|
1395
1455
|
default:
|
|
1396
1456
|
extension = ExportFormat.CSV;
|
|
1397
|
-
fileString = HtmlElementParseHelper.tableAsCsv(this.tableElementRef.nativeElement,
|
|
1457
|
+
fileString = HtmlElementParseHelper.tableAsCsv(this.tableElementRef.nativeElement, this.ignoreAttributeName);
|
|
1398
1458
|
break;
|
|
1399
1459
|
}
|
|
1400
1460
|
const translatedFileName = this.translateService.instant(this.config.export.fileOptions.fileName);
|
|
@@ -1429,6 +1489,7 @@ class MultiFunctionalTableComponent {
|
|
|
1429
1489
|
setFilterProperties() {
|
|
1430
1490
|
var _a, _b, _c, _d, _e;
|
|
1431
1491
|
if ((_a = this.config.filter) === null || _a === void 0 ? void 0 : _a.enabled) {
|
|
1492
|
+
this.filterEnabled = true;
|
|
1432
1493
|
this.filterBarVisible = (_e = (_d = (_c = (_b = this.localStorageValue) === null || _b === void 0 ? void 0 : _b.filter) === null || _c === void 0 ? void 0 : _c.visible) !== null && _d !== void 0 ? _d : this.config.filter.visible) !== null && _e !== void 0 ? _e : false;
|
|
1433
1494
|
this.filterSettings = this.config.filter.settings;
|
|
1434
1495
|
}
|
|
@@ -1450,10 +1511,10 @@ class MultiFunctionalTableComponent {
|
|
|
1450
1511
|
}
|
|
1451
1512
|
}
|
|
1452
1513
|
MultiFunctionalTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiFunctionalTableComponent, deps: [{ token: DOMService }, { token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1453
|
-
MultiFunctionalTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MultiFunctionalTableComponent, selector: "tld-multi-functional-table", inputs: { config: "config", highlightedElements: "highlightedElements", selection: "selection" }, outputs: { filterBarChange: "filterBarChange", exported: "exported", selectionChange: "selectionChange" }, queries: [{ propertyName: "noDataRow", first: true, predicate: MatNoDataRow, descendants: true }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "rowDefs", predicate: MatRowDef, descendants: true }, { propertyName: "columnDefs", predicate: MatColumnDef }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableElementRef", first: true, predicate: MatTable, descendants: true, read: ElementRef }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar
|
|
1514
|
+
MultiFunctionalTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MultiFunctionalTableComponent, selector: "tld-multi-functional-table", inputs: { config: "config", highlightedElements: "highlightedElements", selection: "selection" }, outputs: { filterBarChange: "filterBarChange", exported: "exported", selectionChange: "selectionChange" }, queries: [{ propertyName: "noDataRow", first: true, predicate: MatNoDataRow, descendants: true }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "rowDefs", predicate: MatRowDef, descendants: true }, { propertyName: "columnDefs", predicate: MatColumnDef }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableElementRef", first: true, predicate: MatTable, descendants: true, read: ElementRef }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar [filterRowVisible]=\"!filterBarVisible\" [settings]=\"filterSettings\" *ngIf=\"filterEnabled\"\r\n (filterBarChange)=\"filtersChanged($event)\">\r\n </tld-filter-bar>\r\n <table #table mat-table [dataSource]=\"config.dataSource\">\r\n <ng-content></ng-content>\r\n <ng-container [matColumnDef]=\"batchColumnName\">\r\n <th mat-header-cell *matHeaderCellDef disable-export>\r\n <mat-checkbox [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (change)=\"toggleAllRowSelection()\"\r\n [checked]=\"matSelection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"matSelection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let element\" disable-export>\r\n <mat-checkbox [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleElementSelection(element)\" [checked]=\"matSelection.isSelected(element)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"displayColumns\" sticky></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayColumns\" [class.highlight]=\"highlightElement(row)\"></tr>\r\n\r\n <ng-container *ngIf=\"noDataRowActive\">\r\n <tr *matNoDataRow>\r\n <!-- add random number to make sure it takes full width -->\r\n <td colspan=\"99\">\r\n <div class=\"no-engines-wrapper\">\r\n <ng-container *ngIf=\"!noDataRowConfig.loading; else loading\">\r\n <div>\r\n <span class=\"material-icons-outlined\">\r\n {{noDataRowIcon}}\r\n </span>\r\n </div>\r\n <div class=\"text-xl-semi-bold\" *ngIf=\"noDataRowConfig.title\"\r\n [innerHtml]=\"noDataRowConfig.title | translate: noDataRowConfig.titleParams\">\r\n </div>\r\n <div class=\"text-l\" *ngIf=\"noDataRowConfig.description\"\r\n [innerHtml]=\"noDataRowConfig.description | translate: noDataRowConfig.descriptionParams\"></div>\r\n </ng-container>\r\n <ng-template #loading>\r\n <mat-spinner color=\"accent\"></mat-spinner>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n\r\n </table>\r\n</div>\r\n", styles: [":host ::ng-deep tr.mat-row:hover,:host ::ng-deep tr.mat-row.highlight{background-color:var(--base-95)}table{width:100%}.column-select-icon{rotate:90deg}.column-select-wrapper{padding:1rem}.material-icons,.material-icons-outlined{margin-right:.5rem}.table-action-button{margin-bottom:1rem}.mat-no-data-row{text-align:center}.mat-no-data-row .no-engines-wrapper{margin-top:4rem}.mat-no-data-row .material-icons-outlined{font-size:4rem;color:var(--base-70)}mat-spinner{margin:auto}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i4.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "component", type: i1$3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6$2.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i6$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i7$1.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FilterBarComponent, selector: "tld-filter-bar", inputs: ["settings", "filterRowVisible"], outputs: ["filterBarChange"] }, { kind: "directive", type: i2$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i2$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i2$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }] });
|
|
1454
1515
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiFunctionalTableComponent, decorators: [{
|
|
1455
1516
|
type: Component,
|
|
1456
|
-
args: [{ selector: 'tld-multi-functional-table', template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar
|
|
1517
|
+
args: [{ selector: 'tld-multi-functional-table', template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar [filterRowVisible]=\"!filterBarVisible\" [settings]=\"filterSettings\" *ngIf=\"filterEnabled\"\r\n (filterBarChange)=\"filtersChanged($event)\">\r\n </tld-filter-bar>\r\n <table #table mat-table [dataSource]=\"config.dataSource\">\r\n <ng-content></ng-content>\r\n <ng-container [matColumnDef]=\"batchColumnName\">\r\n <th mat-header-cell *matHeaderCellDef disable-export>\r\n <mat-checkbox [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (change)=\"toggleAllRowSelection()\"\r\n [checked]=\"matSelection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"matSelection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let element\" disable-export>\r\n <mat-checkbox [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleElementSelection(element)\" [checked]=\"matSelection.isSelected(element)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"displayColumns\" sticky></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayColumns\" [class.highlight]=\"highlightElement(row)\"></tr>\r\n\r\n <ng-container *ngIf=\"noDataRowActive\">\r\n <tr *matNoDataRow>\r\n <!-- add random number to make sure it takes full width -->\r\n <td colspan=\"99\">\r\n <div class=\"no-engines-wrapper\">\r\n <ng-container *ngIf=\"!noDataRowConfig.loading; else loading\">\r\n <div>\r\n <span class=\"material-icons-outlined\">\r\n {{noDataRowIcon}}\r\n </span>\r\n </div>\r\n <div class=\"text-xl-semi-bold\" *ngIf=\"noDataRowConfig.title\"\r\n [innerHtml]=\"noDataRowConfig.title | translate: noDataRowConfig.titleParams\">\r\n </div>\r\n <div class=\"text-l\" *ngIf=\"noDataRowConfig.description\"\r\n [innerHtml]=\"noDataRowConfig.description | translate: noDataRowConfig.descriptionParams\"></div>\r\n </ng-container>\r\n <ng-template #loading>\r\n <mat-spinner color=\"accent\"></mat-spinner>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n\r\n </table>\r\n</div>\r\n", styles: [":host ::ng-deep tr.mat-row:hover,:host ::ng-deep tr.mat-row.highlight{background-color:var(--base-95)}table{width:100%}.column-select-icon{rotate:90deg}.column-select-wrapper{padding:1rem}.material-icons,.material-icons-outlined{margin-right:.5rem}.table-action-button{margin-bottom:1rem}.mat-no-data-row{text-align:center}.mat-no-data-row .no-engines-wrapper{margin-top:4rem}.mat-no-data-row .material-icons-outlined{font-size:4rem;color:var(--base-70)}mat-spinner{margin:auto}\n"] }]
|
|
1457
1518
|
}], ctorParameters: function () { return [{ type: DOMService }, { type: i1$2.TranslateService }]; }, propDecorators: { config: [{
|
|
1458
1519
|
type: Input
|
|
1459
1520
|
}], highlightedElements: [{
|