ngx-st-tables 15.1.23 → 17.0.0
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 → esm2022}/lib/components/local-table/configurations/configurations.component.mjs +69 -69
- package/esm2022/lib/components/local-table/local-table.component.mjs +259 -0
- package/esm2022/lib/components/select-table/select-table.component.mjs +101 -0
- package/{esm2020 → esm2022}/lib/models/st-configurations-settings.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/st-global-search-settings.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/st-local-storage-configuration.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/st-local-table-column.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/st-local-table-columns.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/st-table-settings.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/ngx-st-tables.module.mjs +89 -89
- package/esm2022/lib/services/local-table.service.mjs +36 -0
- package/{esm2020 → esm2022}/ngx-st-tables.mjs +4 -4
- package/{esm2020 → esm2022}/public-api.mjs +14 -14
- package/{fesm2020 → fesm2022}/ngx-st-tables.mjs +485 -485
- package/{fesm2020 → fesm2022}/ngx-st-tables.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/components/local-table/configurations/configurations.component.d.ts +27 -27
- package/lib/components/local-table/local-table.component.d.ts +63 -63
- package/lib/components/select-table/select-table.component.d.ts +37 -37
- package/lib/models/st-configurations-settings.model.d.ts +6 -6
- package/lib/models/st-global-search-settings.model.d.ts +4 -4
- package/lib/models/st-local-storage-configuration.model.d.ts +8 -8
- package/lib/models/st-local-table-column.model.d.ts +22 -22
- package/lib/models/st-local-table-columns.model.d.ts +4 -4
- package/lib/models/st-table-settings.model.d.ts +3 -3
- package/lib/ngx-st-tables.module.d.ts +24 -24
- package/lib/services/local-table.service.d.ts +11 -11
- package/package.json +8 -14
- package/public-api.d.ts +11 -11
- package/esm2020/lib/components/local-table/local-table.component.mjs +0 -259
- package/esm2020/lib/components/select-table/select-table.component.mjs +0 -101
- package/esm2020/lib/services/local-table.service.mjs +0 -36
- package/fesm2015/ngx-st-tables.mjs +0 -532
- package/fesm2015/ngx-st-tables.mjs.map +0 -1
package/{esm2020 → esm2022}/lib/components/local-table/configurations/configurations.component.mjs
RENAMED
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@angular/common";
|
|
4
|
-
import * as i2 from "@angular/material/button";
|
|
5
|
-
import * as i3 from "@angular/material/form-field";
|
|
6
|
-
import * as i4 from "@angular/material/input";
|
|
7
|
-
import * as i5 from "@angular/forms";
|
|
8
|
-
import * as i6 from "@angular/material/select";
|
|
9
|
-
import * as i7 from "@angular/material/core";
|
|
10
|
-
export class ConfigurationsComponent {
|
|
11
|
-
set initSelectedConfig(config) {
|
|
12
|
-
this.selectedConfig = config;
|
|
13
|
-
}
|
|
14
|
-
constructor() {
|
|
15
|
-
this.createNewConfig = new EventEmitter();
|
|
16
|
-
this.removeConfig = new EventEmitter();
|
|
17
|
-
this.changeConfig = new EventEmitter();
|
|
18
|
-
this.creatingConfiguration = false;
|
|
19
|
-
this.createConfigurationName = '';
|
|
20
|
-
this.removingConfiguration = false;
|
|
21
|
-
}
|
|
22
|
-
ngOnInit() { }
|
|
23
|
-
showCreateConfiguration() {
|
|
24
|
-
this.creatingConfiguration = true;
|
|
25
|
-
this.createConfigurationName = '';
|
|
26
|
-
}
|
|
27
|
-
hideCreateConfiguration() {
|
|
28
|
-
this.creatingConfiguration = false;
|
|
29
|
-
this.createConfigurationName = '';
|
|
30
|
-
}
|
|
31
|
-
saveCreateConfiguration() {
|
|
32
|
-
this.creatingConfiguration = false;
|
|
33
|
-
this.selectedConfig = null;
|
|
34
|
-
this.createNewConfig.emit(this.createConfigurationName);
|
|
35
|
-
}
|
|
36
|
-
deleteConfiguration() {
|
|
37
|
-
this.removingConfiguration = true;
|
|
38
|
-
}
|
|
39
|
-
acceptDeleteConfiguration() {
|
|
40
|
-
this.removingConfiguration = false;
|
|
41
|
-
this.selectedConfig = null;
|
|
42
|
-
this.removeConfig.emit(this.selectedConfig.configId);
|
|
43
|
-
}
|
|
44
|
-
declineDeleteConfiguration() {
|
|
45
|
-
this.removingConfiguration = false;
|
|
46
|
-
}
|
|
47
|
-
selectedConfigChanged() {
|
|
48
|
-
this.changeConfig.emit(this.selectedConfig?.configId || null);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
54
|
-
type: Component,
|
|
55
|
-
args: [{ selector: 'st-configurations[configurationsSettings]', template: "<div class=\"col-auto row align-items-center\" style=\"padding: 0\">\r\n <ng-container *ngIf=\"!creatingConfiguration && !removingConfiguration\">\r\n <mat-form-field class=\"col-auto\" style=\"padding-right: 0\">\r\n <mat-label>{{ configurationsSettings.selectLabel }}</mat-label>\r\n <mat-select\r\n [(ngModel)]=\"selectedConfig\"\r\n (ngModelChange)=\"selectedConfigChanged()\"\r\n >\r\n <mat-option [value]=\"null\"></mat-option>\r\n <mat-option *ngFor=\"let config of configurations\" [value]=\"config\">{{\r\n config.configName\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto green-icon\"\r\n (click)=\"showCreateConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> add </span>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto red-icon\"\r\n [disabled]=\"!selectedConfig\"\r\n (click)=\"deleteConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> delete </span>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"creatingConfiguration\">\r\n <mat-form-field class=\"col-auto\">\r\n <mat-label>{{ configurationsSettings.createLabel }}</mat-label>\r\n <input matInput [(ngModel)]=\"createConfigurationName\" />\r\n </mat-form-field>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto green-icon\"\r\n (click)=\"saveCreateConfiguration()\"\r\n [disabled]=\"!createConfigurationName\"\r\n >\r\n <span class=\"material-icons-outlined\"> done </span>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto red-icon\"\r\n (click)=\"hideCreateConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> close </span>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"removingConfiguration\">\r\n <p class=\"col-auto\" style=\"margin: 0; font-weight: bold; font-size: 16px\">\r\n {{ configurationsSettings.deleteWarningTitle }}\r\n </p>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto green-icon\"\r\n (click)=\"acceptDeleteConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> done </span>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto red-icon\"\r\n (click)=\"declineDeleteConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> close </span>\r\n </button>\r\n </ng-container>\r\n</div>\r\n", styles: [".green-icon span{color:#2e7d32}.red-icon span{color:#c62828}\n"] }]
|
|
56
|
-
}], ctorParameters:
|
|
57
|
-
type: Input
|
|
58
|
-
}], configurations: [{
|
|
59
|
-
type: Input
|
|
60
|
-
}], initSelectedConfig: [{
|
|
61
|
-
type: Input
|
|
62
|
-
}], createNewConfig: [{
|
|
63
|
-
type: Output
|
|
64
|
-
}], removeConfig: [{
|
|
65
|
-
type: Output
|
|
66
|
-
}], changeConfig: [{
|
|
67
|
-
type: Output
|
|
68
|
-
}] } });
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "@angular/material/button";
|
|
5
|
+
import * as i3 from "@angular/material/form-field";
|
|
6
|
+
import * as i4 from "@angular/material/input";
|
|
7
|
+
import * as i5 from "@angular/forms";
|
|
8
|
+
import * as i6 from "@angular/material/select";
|
|
9
|
+
import * as i7 from "@angular/material/core";
|
|
10
|
+
export class ConfigurationsComponent {
|
|
11
|
+
set initSelectedConfig(config) {
|
|
12
|
+
this.selectedConfig = config;
|
|
13
|
+
}
|
|
14
|
+
constructor() {
|
|
15
|
+
this.createNewConfig = new EventEmitter();
|
|
16
|
+
this.removeConfig = new EventEmitter();
|
|
17
|
+
this.changeConfig = new EventEmitter();
|
|
18
|
+
this.creatingConfiguration = false;
|
|
19
|
+
this.createConfigurationName = '';
|
|
20
|
+
this.removingConfiguration = false;
|
|
21
|
+
}
|
|
22
|
+
ngOnInit() { }
|
|
23
|
+
showCreateConfiguration() {
|
|
24
|
+
this.creatingConfiguration = true;
|
|
25
|
+
this.createConfigurationName = '';
|
|
26
|
+
}
|
|
27
|
+
hideCreateConfiguration() {
|
|
28
|
+
this.creatingConfiguration = false;
|
|
29
|
+
this.createConfigurationName = '';
|
|
30
|
+
}
|
|
31
|
+
saveCreateConfiguration() {
|
|
32
|
+
this.creatingConfiguration = false;
|
|
33
|
+
this.selectedConfig = null;
|
|
34
|
+
this.createNewConfig.emit(this.createConfigurationName);
|
|
35
|
+
}
|
|
36
|
+
deleteConfiguration() {
|
|
37
|
+
this.removingConfiguration = true;
|
|
38
|
+
}
|
|
39
|
+
acceptDeleteConfiguration() {
|
|
40
|
+
this.removingConfiguration = false;
|
|
41
|
+
this.selectedConfig = null;
|
|
42
|
+
this.removeConfig.emit(this.selectedConfig.configId);
|
|
43
|
+
}
|
|
44
|
+
declineDeleteConfiguration() {
|
|
45
|
+
this.removingConfiguration = false;
|
|
46
|
+
}
|
|
47
|
+
selectedConfigChanged() {
|
|
48
|
+
this.changeConfig.emit(this.selectedConfig?.configId || null);
|
|
49
|
+
}
|
|
50
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConfigurationsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
51
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ConfigurationsComponent, selector: "st-configurations[configurationsSettings]", inputs: { configurationsSettings: "configurationsSettings", configurations: "configurations", initSelectedConfig: "initSelectedConfig" }, outputs: { createNewConfig: "createNewConfig", removeConfig: "removeConfig", changeConfig: "changeConfig" }, ngImport: i0, template: "<div class=\"col-auto row align-items-center\" style=\"padding: 0\">\r\n <ng-container *ngIf=\"!creatingConfiguration && !removingConfiguration\">\r\n <mat-form-field class=\"col-auto\" style=\"padding-right: 0\">\r\n <mat-label>{{ configurationsSettings.selectLabel }}</mat-label>\r\n <mat-select\r\n [(ngModel)]=\"selectedConfig\"\r\n (ngModelChange)=\"selectedConfigChanged()\"\r\n >\r\n <mat-option [value]=\"null\"></mat-option>\r\n <mat-option *ngFor=\"let config of configurations\" [value]=\"config\">{{\r\n config.configName\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto green-icon\"\r\n (click)=\"showCreateConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> add </span>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto red-icon\"\r\n [disabled]=\"!selectedConfig\"\r\n (click)=\"deleteConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> delete </span>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"creatingConfiguration\">\r\n <mat-form-field class=\"col-auto\">\r\n <mat-label>{{ configurationsSettings.createLabel }}</mat-label>\r\n <input matInput [(ngModel)]=\"createConfigurationName\" />\r\n </mat-form-field>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto green-icon\"\r\n (click)=\"saveCreateConfiguration()\"\r\n [disabled]=\"!createConfigurationName\"\r\n >\r\n <span class=\"material-icons-outlined\"> done </span>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto red-icon\"\r\n (click)=\"hideCreateConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> close </span>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"removingConfiguration\">\r\n <p class=\"col-auto\" style=\"margin: 0; font-weight: bold; font-size: 16px\">\r\n {{ configurationsSettings.deleteWarningTitle }}\r\n </p>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto green-icon\"\r\n (click)=\"acceptDeleteConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> done </span>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto red-icon\"\r\n (click)=\"declineDeleteConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> close </span>\r\n </button>\r\n </ng-container>\r\n</div>\r\n", styles: [".green-icon span{color:#2e7d32}.red-icon span{color:#c62828}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.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: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }] }); }
|
|
52
|
+
}
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConfigurationsComponent, decorators: [{
|
|
54
|
+
type: Component,
|
|
55
|
+
args: [{ selector: 'st-configurations[configurationsSettings]', template: "<div class=\"col-auto row align-items-center\" style=\"padding: 0\">\r\n <ng-container *ngIf=\"!creatingConfiguration && !removingConfiguration\">\r\n <mat-form-field class=\"col-auto\" style=\"padding-right: 0\">\r\n <mat-label>{{ configurationsSettings.selectLabel }}</mat-label>\r\n <mat-select\r\n [(ngModel)]=\"selectedConfig\"\r\n (ngModelChange)=\"selectedConfigChanged()\"\r\n >\r\n <mat-option [value]=\"null\"></mat-option>\r\n <mat-option *ngFor=\"let config of configurations\" [value]=\"config\">{{\r\n config.configName\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto green-icon\"\r\n (click)=\"showCreateConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> add </span>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto red-icon\"\r\n [disabled]=\"!selectedConfig\"\r\n (click)=\"deleteConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> delete </span>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"creatingConfiguration\">\r\n <mat-form-field class=\"col-auto\">\r\n <mat-label>{{ configurationsSettings.createLabel }}</mat-label>\r\n <input matInput [(ngModel)]=\"createConfigurationName\" />\r\n </mat-form-field>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto green-icon\"\r\n (click)=\"saveCreateConfiguration()\"\r\n [disabled]=\"!createConfigurationName\"\r\n >\r\n <span class=\"material-icons-outlined\"> done </span>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto red-icon\"\r\n (click)=\"hideCreateConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> close </span>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"removingConfiguration\">\r\n <p class=\"col-auto\" style=\"margin: 0; font-weight: bold; font-size: 16px\">\r\n {{ configurationsSettings.deleteWarningTitle }}\r\n </p>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto green-icon\"\r\n (click)=\"acceptDeleteConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> done </span>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"col-auto red-icon\"\r\n (click)=\"declineDeleteConfiguration()\"\r\n >\r\n <span class=\"material-icons-outlined\"> close </span>\r\n </button>\r\n </ng-container>\r\n</div>\r\n", styles: [".green-icon span{color:#2e7d32}.red-icon span{color:#c62828}\n"] }]
|
|
56
|
+
}], ctorParameters: () => [], propDecorators: { configurationsSettings: [{
|
|
57
|
+
type: Input
|
|
58
|
+
}], configurations: [{
|
|
59
|
+
type: Input
|
|
60
|
+
}], initSelectedConfig: [{
|
|
61
|
+
type: Input
|
|
62
|
+
}], createNewConfig: [{
|
|
63
|
+
type: Output
|
|
64
|
+
}], removeConfig: [{
|
|
65
|
+
type: Output
|
|
66
|
+
}], changeConfig: [{
|
|
67
|
+
type: Output
|
|
68
|
+
}] } });
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0LXRhYmxlcy9zcmMvbGliL2NvbXBvbmVudHMvbG9jYWwtdGFibGUvY29uZmlndXJhdGlvbnMvY29uZmlndXJhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0LXRhYmxlcy9zcmMvbGliL2NvbXBvbmVudHMvbG9jYWwtdGFibGUvY29uZmlndXJhdGlvbnMvY29uZmlndXJhdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBUy9FLE1BQU0sT0FBTyx1QkFBdUI7SUFPbEMsSUFDSSxrQkFBa0IsQ0FBQyxNQUErQztRQUNwRSxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQztJQUMvQixDQUFDO0lBaUJEO1FBZEEsb0JBQWUsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUczRCxpQkFBWSxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBR3hELGlCQUFZLEdBQWdDLElBQUksWUFBWSxFQUFFLENBQUM7UUFFL0QsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBQ3ZDLDRCQUF1QixHQUFXLEVBQUUsQ0FBQztRQUNyQywwQkFBcUIsR0FBWSxLQUFLLENBQUM7SUFJeEIsQ0FBQztJQUVoQixRQUFRLEtBQVUsQ0FBQztJQUVuQix1QkFBdUI7UUFDckIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELDBCQUEwQjtRQUN4QixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLENBQUM7SUFDaEUsQ0FBQzsrR0EvRFUsdUJBQXVCO21HQUF2Qix1QkFBdUIsd1VDVHBDLG9pRkF5RUE7OzRGRGhFYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UsMkNBQTJDO3dEQU1yRCxzQkFBc0I7c0JBRHJCLEtBQUs7Z0JBSU4sY0FBYztzQkFEYixLQUFLO2dCQUlGLGtCQUFrQjtzQkFEckIsS0FBSztnQkFNTixlQUFlO3NCQURkLE1BQU07Z0JBSVAsWUFBWTtzQkFEWCxNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3RDb25maWd1cmF0aW9uc1NldHRpbmdzTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvc3QtY29uZmlndXJhdGlvbnMtc2V0dGluZ3MubW9kZWwnO1xyXG5pbXBvcnQgeyBTdExvY2FsU3RvcmFnZUNvbmZpZ3VyYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9zdC1sb2NhbC1zdG9yYWdlLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzdC1jb25maWd1cmF0aW9uc1tjb25maWd1cmF0aW9uc1NldHRpbmdzXScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpZ3VyYXRpb25zLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb25maWd1cmF0aW9ucy5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpXHJcbiAgY29uZmlndXJhdGlvbnNTZXR0aW5nczogU3RDb25maWd1cmF0aW9uc1NldHRpbmdzTW9kZWw7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29uZmlndXJhdGlvbnM6IFN0TG9jYWxTdG9yYWdlQ29uZmlndXJhdGlvbk1vZGVsW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGluaXRTZWxlY3RlZENvbmZpZyhjb25maWc6IFN0TG9jYWxTdG9yYWdlQ29uZmlndXJhdGlvbk1vZGVsIHwgbnVsbCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmZpZyA9IGNvbmZpZztcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNyZWF0ZU5ld0NvbmZpZzogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHJlbW92ZUNvbmZpZzogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNoYW5nZUNvbmZpZzogRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBjcmVhdGluZ0NvbmZpZ3VyYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjcmVhdGVDb25maWd1cmF0aW9uTmFtZTogc3RyaW5nID0gJyc7XHJcbiAgcmVtb3ZpbmdDb25maWd1cmF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNlbGVjdGVkQ29uZmlnOiBTdExvY2FsU3RvcmFnZUNvbmZpZ3VyYXRpb25Nb2RlbCB8IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7fVxyXG5cclxuICBzaG93Q3JlYXRlQ29uZmlndXJhdGlvbigpIHtcclxuICAgIHRoaXMuY3JlYXRpbmdDb25maWd1cmF0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMuY3JlYXRlQ29uZmlndXJhdGlvbk5hbWUgPSAnJztcclxuICB9XHJcblxyXG4gIGhpZGVDcmVhdGVDb25maWd1cmF0aW9uKCkge1xyXG4gICAgdGhpcy5jcmVhdGluZ0NvbmZpZ3VyYXRpb24gPSBmYWxzZTtcclxuICAgIHRoaXMuY3JlYXRlQ29uZmlndXJhdGlvbk5hbWUgPSAnJztcclxuICB9XHJcblxyXG4gIHNhdmVDcmVhdGVDb25maWd1cmF0aW9uKCkge1xyXG4gICAgdGhpcy5jcmVhdGluZ0NvbmZpZ3VyYXRpb24gPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25maWcgPSBudWxsO1xyXG4gICAgdGhpcy5jcmVhdGVOZXdDb25maWcuZW1pdCh0aGlzLmNyZWF0ZUNvbmZpZ3VyYXRpb25OYW1lKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZUNvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICB0aGlzLnJlbW92aW5nQ29uZmlndXJhdGlvbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBhY2NlcHREZWxldGVDb25maWd1cmF0aW9uKCkge1xyXG4gICAgdGhpcy5yZW1vdmluZ0NvbmZpZ3VyYXRpb24gPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25maWcgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVDb25maWcuZW1pdCh0aGlzLnNlbGVjdGVkQ29uZmlnIS5jb25maWdJZCk7XHJcbiAgfVxyXG5cclxuICBkZWNsaW5lRGVsZXRlQ29uZmlndXJhdGlvbigpIHtcclxuICAgIHRoaXMucmVtb3ZpbmdDb25maWd1cmF0aW9uID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZENvbmZpZ0NoYW5nZWQoKSB7XHJcbiAgICB0aGlzLmNoYW5nZUNvbmZpZy5lbWl0KHRoaXMuc2VsZWN0ZWRDb25maWc/LmNvbmZpZ0lkIHx8IG51bGwpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcm93IGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwicGFkZGluZzogMFwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3JlYXRpbmdDb25maWd1cmF0aW9uICYmICFyZW1vdmluZ0NvbmZpZ3VyYXRpb25cIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImNvbC1hdXRvXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAwXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3sgY29uZmlndXJhdGlvbnNTZXR0aW5ncy5zZWxlY3RMYWJlbCB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb25maWdcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlbGVjdGVkQ29uZmlnQ2hhbmdlZCgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJudWxsXCI+PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjb25maWcgb2YgY29uZmlndXJhdGlvbnNcIiBbdmFsdWVdPVwiY29uZmlnXCI+e3tcclxuICAgICAgICAgIGNvbmZpZy5jb25maWdOYW1lXHJcbiAgICAgICAgfX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBjbGFzcz1cImNvbC1hdXRvIGdyZWVuLWljb25cIlxyXG4gICAgICAoY2xpY2spPVwic2hvd0NyZWF0ZUNvbmZpZ3VyYXRpb24oKVwiXHJcbiAgICA+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj4gYWRkIDwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgY2xhc3M9XCJjb2wtYXV0byByZWQtaWNvblwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRDb25maWdcIlxyXG4gICAgICAoY2xpY2spPVwiZGVsZXRlQ29uZmlndXJhdGlvbigpXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPiBkZWxldGUgPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGluZ0NvbmZpZ3VyYXRpb25cIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3sgY29uZmlndXJhdGlvbnNTZXR0aW5ncy5jcmVhdGVMYWJlbCB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJjcmVhdGVDb25maWd1cmF0aW9uTmFtZVwiIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgY2xhc3M9XCJjb2wtYXV0byBncmVlbi1pY29uXCJcclxuICAgICAgKGNsaWNrKT1cInNhdmVDcmVhdGVDb25maWd1cmF0aW9uKClcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiIWNyZWF0ZUNvbmZpZ3VyYXRpb25OYW1lXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPiBkb25lIDwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgY2xhc3M9XCJjb2wtYXV0byByZWQtaWNvblwiXHJcbiAgICAgIChjbGljayk9XCJoaWRlQ3JlYXRlQ29uZmlndXJhdGlvbigpXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPiBjbG9zZSA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlbW92aW5nQ29uZmlndXJhdGlvblwiPlxyXG4gICAgPHAgY2xhc3M9XCJjb2wtYXV0b1wiIHN0eWxlPVwibWFyZ2luOiAwOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxNnB4XCI+XHJcbiAgICAgIHt7IGNvbmZpZ3VyYXRpb25zU2V0dGluZ3MuZGVsZXRlV2FybmluZ1RpdGxlIH19XHJcbiAgICA8L3A+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBjbGFzcz1cImNvbC1hdXRvIGdyZWVuLWljb25cIlxyXG4gICAgICAoY2xpY2spPVwiYWNjZXB0RGVsZXRlQ29uZmlndXJhdGlvbigpXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPiBkb25lIDwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgY2xhc3M9XCJjb2wtYXV0byByZWQtaWNvblwiXHJcbiAgICAgIChjbGljayk9XCJkZWNsaW5lRGVsZXRlQ29uZmlndXJhdGlvbigpXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPiBjbG9zZSA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input, ViewChild, } from '@angular/core';
|
|
2
|
+
import { MatPaginator } from '@angular/material/paginator';
|
|
3
|
+
import { MatSort } from '@angular/material/sort';
|
|
4
|
+
import { MatTableDataSource } from '@angular/material/table';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../services/local-table.service";
|
|
7
|
+
import * as i2 from "@angular/router";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
import * as i4 from "@angular/material/button";
|
|
10
|
+
import * as i5 from "@angular/material/icon";
|
|
11
|
+
import * as i6 from "@angular/material/table";
|
|
12
|
+
import * as i7 from "@angular/material/paginator";
|
|
13
|
+
import * as i8 from "@angular/material/form-field";
|
|
14
|
+
import * as i9 from "@angular/material/input";
|
|
15
|
+
import * as i10 from "@angular/material/tooltip";
|
|
16
|
+
import * as i11 from "@angular/forms";
|
|
17
|
+
import * as i12 from "@angular/material/sort";
|
|
18
|
+
import * as i13 from "@angular/material/menu";
|
|
19
|
+
import * as i14 from "@angular/material/checkbox";
|
|
20
|
+
import * as i15 from "./configurations/configurations.component";
|
|
21
|
+
import * as i16 from "ngx-st-date-format";
|
|
22
|
+
export class LocalTableComponent {
|
|
23
|
+
set columns(columns) {
|
|
24
|
+
this._columns = columns;
|
|
25
|
+
this.columnsArray = this.getColumnsArray();
|
|
26
|
+
this.setDisplayedColumns();
|
|
27
|
+
}
|
|
28
|
+
get columns() {
|
|
29
|
+
return this._columns;
|
|
30
|
+
}
|
|
31
|
+
set data(data) {
|
|
32
|
+
this._data = data || [];
|
|
33
|
+
this.setTableSource();
|
|
34
|
+
}
|
|
35
|
+
get data() {
|
|
36
|
+
return this._data;
|
|
37
|
+
}
|
|
38
|
+
constructor(localTableService, changeDetectorRef, router, activatedRoute) {
|
|
39
|
+
this.localTableService = localTableService;
|
|
40
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
41
|
+
this.router = router;
|
|
42
|
+
this.activatedRoute = activatedRoute;
|
|
43
|
+
this.pageSize = 10;
|
|
44
|
+
this.allowPickColumns = false;
|
|
45
|
+
this.localStorageName = '';
|
|
46
|
+
this.bindSearchToUrl = false;
|
|
47
|
+
this._columns = {};
|
|
48
|
+
this._data = [];
|
|
49
|
+
this.searchModel = '';
|
|
50
|
+
this.displayedColumns = [];
|
|
51
|
+
this.configurations = [];
|
|
52
|
+
this.initConfig = null;
|
|
53
|
+
this.activeConfig = null;
|
|
54
|
+
this.pageIndex = 0;
|
|
55
|
+
}
|
|
56
|
+
ngOnInit() {
|
|
57
|
+
if (this.localStorageName) {
|
|
58
|
+
const pageSize = localStorage.getItem(this.localStorageName);
|
|
59
|
+
if (pageSize) {
|
|
60
|
+
this.pageSize = parseInt(pageSize);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (this.configurationsSettings) {
|
|
64
|
+
this.localTableService.localStorageName =
|
|
65
|
+
this.configurationsSettings?.localStorageName || '';
|
|
66
|
+
this.loadConfigs();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
ngAfterViewInit() {
|
|
70
|
+
if (this.configurationsSettings) {
|
|
71
|
+
this.paginator.page.subscribe(res => {
|
|
72
|
+
if (this.activeConfig) {
|
|
73
|
+
this.activeConfig.pageSize = res.pageSize;
|
|
74
|
+
this.updateConfigsToLocalStorage();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
this.sort.sortChange.subscribe(res => {
|
|
78
|
+
if (this.activeConfig) {
|
|
79
|
+
this.activeConfig.sortFieldName = res.active;
|
|
80
|
+
this.activeConfig.sortDirection = res.direction;
|
|
81
|
+
this.updateConfigsToLocalStorage();
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (this.bindSearchToUrl) {
|
|
86
|
+
const params = new URLSearchParams(location.search);
|
|
87
|
+
this.sort.sortChange.subscribe(res => {
|
|
88
|
+
this.updateSearchToUrl();
|
|
89
|
+
});
|
|
90
|
+
if (params.get('stLocalTablePageIndex')) {
|
|
91
|
+
this.pageIndex = parseInt(params.get('stLocalTablePageIndex') || '');
|
|
92
|
+
}
|
|
93
|
+
if (params.get('stLocalTablePageSize')) {
|
|
94
|
+
this.pageSize = parseInt(params.get('stLocalTablePageSize') || '');
|
|
95
|
+
}
|
|
96
|
+
if (params.get('stLocalTableSortFieldName') &&
|
|
97
|
+
params.get('stLocalTableSortDirection')) {
|
|
98
|
+
this.sort.sort({
|
|
99
|
+
id: params.get('stLocalTableSortFieldName') || '',
|
|
100
|
+
start: params.get('stLocalTableSortDirection') || 'asc',
|
|
101
|
+
disableClear: false,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
this.searchModel = params.get('stLocalTableSearch') || '';
|
|
105
|
+
if (this.searchModel) {
|
|
106
|
+
this.tableSource.filter = this.searchModel.trim().toLowerCase();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
this.paginator.pageSize = this.pageSize;
|
|
110
|
+
}
|
|
111
|
+
applySearch() {
|
|
112
|
+
this.tableSource.filter = this.searchModel.trim().toLowerCase();
|
|
113
|
+
this.pageIndex = 0;
|
|
114
|
+
this.updateSearchToUrl();
|
|
115
|
+
}
|
|
116
|
+
clearSearch() {
|
|
117
|
+
this.searchModel = '';
|
|
118
|
+
this.tableSource.filter = this.searchModel;
|
|
119
|
+
this.pageIndex = 0;
|
|
120
|
+
this.updateSearchToUrl();
|
|
121
|
+
}
|
|
122
|
+
checkIfActionVisible(row, action) {
|
|
123
|
+
if (action.show) {
|
|
124
|
+
return action.show(row);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
columnVisibleChanged(column) {
|
|
131
|
+
this.setDisplayedColumns();
|
|
132
|
+
this.updateConfigsToLocalStorage();
|
|
133
|
+
}
|
|
134
|
+
newConfigCreated(name) {
|
|
135
|
+
const newConfig = this.generateNewConfig(name);
|
|
136
|
+
this.configurations.push(newConfig);
|
|
137
|
+
this.updateConfigsToLocalStorage();
|
|
138
|
+
this.initConfig = newConfig;
|
|
139
|
+
}
|
|
140
|
+
configRemoved(configId) {
|
|
141
|
+
this.configurations = this.configurations.filter(config => config.configId !== configId);
|
|
142
|
+
this.updateConfigsToLocalStorage();
|
|
143
|
+
}
|
|
144
|
+
configChanged(configId) {
|
|
145
|
+
this.activeConfig = configId
|
|
146
|
+
? this.configurations.find(config => config.configId === configId)
|
|
147
|
+
: null;
|
|
148
|
+
if (this.activeConfig) {
|
|
149
|
+
this.setTableConfig(this.activeConfig.pageSize, this.activeConfig.columnsDisabled, this.activeConfig.sortFieldName, this.activeConfig.sortDirection);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.setTableConfig(this.pageSize, [], null, null);
|
|
153
|
+
this.clearSearch();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
pageChanged(event) {
|
|
157
|
+
this.pageIndex = event.pageIndex;
|
|
158
|
+
this.updateSearchToUrl();
|
|
159
|
+
}
|
|
160
|
+
updateSearchToUrl() {
|
|
161
|
+
if (this.bindSearchToUrl) {
|
|
162
|
+
let queryParams = {
|
|
163
|
+
stLocalTableSearch: this.searchModel,
|
|
164
|
+
stLocalTablePageIndex: this.pageIndex,
|
|
165
|
+
stLocalTablePageSize: this.paginator.pageSize,
|
|
166
|
+
stLocalTableSortFieldName: '',
|
|
167
|
+
stLocalTableSortDirection: '',
|
|
168
|
+
};
|
|
169
|
+
if (this.sort.direction && this.sort.active) {
|
|
170
|
+
queryParams = {
|
|
171
|
+
...queryParams,
|
|
172
|
+
stLocalTableSortFieldName: this.sort.active,
|
|
173
|
+
stLocalTableSortDirection: this.sort.direction,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
this.router.navigate(['./'], {
|
|
177
|
+
queryParams: queryParams,
|
|
178
|
+
relativeTo: this.activatedRoute,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
updateConfigsToLocalStorage() {
|
|
183
|
+
this.localTableService.saveConfigs(this.configurations);
|
|
184
|
+
}
|
|
185
|
+
setTableSource() {
|
|
186
|
+
this.tableSource = new MatTableDataSource(this._data);
|
|
187
|
+
this.tableSource.paginator = this.paginator;
|
|
188
|
+
this.tableSource.sort = this.sort;
|
|
189
|
+
this.tableSource.filter = this.searchModel;
|
|
190
|
+
this.changeDetectorRef.markForCheck();
|
|
191
|
+
}
|
|
192
|
+
setDisplayedColumns() {
|
|
193
|
+
this.displayedColumns = Object.keys(this.columns).filter(column => {
|
|
194
|
+
return this._columns[column].visible;
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
getColumnsArray() {
|
|
198
|
+
return Object.keys(this._columns).map(column => this._columns[column]);
|
|
199
|
+
}
|
|
200
|
+
loadConfigs() {
|
|
201
|
+
this.configurations = this.localTableService.getConfigs();
|
|
202
|
+
}
|
|
203
|
+
generateNewConfig(configName) {
|
|
204
|
+
return {
|
|
205
|
+
configId: Date.now().toString(),
|
|
206
|
+
configName: configName,
|
|
207
|
+
columnsDisabled: this.columnsArray
|
|
208
|
+
.filter(column => !column.visible)
|
|
209
|
+
.map(column => column.translateColumnName),
|
|
210
|
+
pageSize: this.paginator.pageSize,
|
|
211
|
+
sortFieldName: this.sort.direction && this.sort.active ? this.sort.active : null,
|
|
212
|
+
sortDirection: this.sort.direction || null,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
setTableConfig(pageSize, disabledColumns, sortFieldName, sortDirection) {
|
|
216
|
+
this.paginator.pageSize = pageSize;
|
|
217
|
+
this.sort.sort({
|
|
218
|
+
id: sortFieldName || '',
|
|
219
|
+
start: sortDirection || 'asc',
|
|
220
|
+
disableClear: false,
|
|
221
|
+
});
|
|
222
|
+
this.columnsArray.forEach(column => {
|
|
223
|
+
column.visible =
|
|
224
|
+
disabledColumns.indexOf(column.translateColumnName) === -1;
|
|
225
|
+
});
|
|
226
|
+
this.setDisplayedColumns();
|
|
227
|
+
}
|
|
228
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LocalTableComponent, deps: [{ token: i1.LocalTableService }, { token: i0.ChangeDetectorRef }, { token: i2.Router }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
229
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LocalTableComponent, selector: "ngx-st-local-table", inputs: { tableSettings: "tableSettings", globalSearchSettings: "globalSearchSettings", pageSize: "pageSize", allowPickColumns: "allowPickColumns", configurationsSettings: "configurationsSettings", localStorageName: "localStorageName", bindSearchToUrl: "bindSearchToUrl", columns: "columns", data: "data" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<div class=\"local-table\">\r\n <div class=\"row align-items-center\">\r\n <div\r\n class=\"col row align-items-center\"\r\n style=\"padding: 0\"\r\n *ngIf=\"configurationsSettings || allowPickColumns\"\r\n >\r\n <div class=\"col-auto\" style=\"padding: 0\" *ngIf=\"allowPickColumns\">\r\n <button\r\n mat-icon-button\r\n class=\"col-auto\"\r\n [matMenuTriggerFor]=\"columnsMenu\"\r\n >\r\n <span class=\"material-icons-outlined\"> view_week </span>\r\n </button>\r\n <mat-menu #columnsMenu=\"matMenu\" xPosition=\"after\">\r\n <ng-container *ngFor=\"let column of columnsArray\">\r\n <div mat-menu-item *ngIf=\"!column.notShowInColumnPick\">\r\n <mat-checkbox\r\n [(ngModel)]=\"column.visible\"\r\n (ngModelChange)=\"columnVisibleChanged(column)\"\r\n style=\"margin-top: 5px\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n {{ column.translateColumnName }}\r\n </mat-checkbox>\r\n </div>\r\n </ng-container>\r\n </mat-menu>\r\n </div>\r\n\r\n <st-configurations\r\n *ngIf=\"configurationsSettings\"\r\n [configurationsSettings]=\"configurationsSettings\"\r\n [configurations]=\"configurations\"\r\n [initSelectedConfig]=\"initConfig\"\r\n (createNewConfig)=\"newConfigCreated($event)\"\r\n (removeConfig)=\"configRemoved($event)\"\r\n (changeConfig)=\"configChanged($event)\"\r\n ></st-configurations>\r\n </div>\r\n\r\n <div\r\n class=\"col\"\r\n style=\"padding: 0; margin-bottom: -15px\"\r\n *ngIf=\"globalSearchSettings?.show\"\r\n >\r\n <mat-form-field>\r\n <mat-label>{{ globalSearchSettings?.label || 'Search' }}</mat-label>\r\n <input matInput (keyup)=\"applySearch()\" [(ngModel)]=\"searchModel\" />\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Clear\"\r\n (click)=\"clearSearch()\"\r\n >\r\n <mat-icon style=\"font-size: 22px\">close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <table\r\n [ngClass]=\"{ 'no-hover': !tableSettings?.rowClickAction }\"\r\n mat-table\r\n [dataSource]=\"tableSource\"\r\n matSort\r\n >\r\n <ng-container\r\n [matColumnDef]=\"column\"\r\n *ngFor=\"let column of displayedColumns\"\r\n >\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"{{\r\n columns[column].width ? 'width:' + columns[column].width : ''\r\n }}\"\r\n mat-sort-header\r\n [disabled]=\"!columns[column].sort\"\r\n >\r\n {{ columns[column].translateColumnName }}\r\n <span\r\n class=\"material-icons search-icon\"\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"$event.stopPropagation()\"\r\n *ngIf=\"columns[column].search\"\r\n >\r\n search\r\n </span>\r\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\r\n <mat-form-field class=\"col\">\r\n <mat-label>{{ columns[column].searchLabel || 'Search' }}</mat-label>\r\n <input\r\n matInput\r\n (keyup)=\"applySearch()\"\r\n [(ngModel)]=\"searchModel\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Clear\"\r\n (click)=\"searchModel = ''\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </mat-menu>\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let element\"\r\n style=\"{{\r\n columns[column].width ? 'width:' + columns[column].width : ''\r\n }}\"\r\n >\r\n <div\r\n class=\"actions-container\"\r\n style=\"overflow-y: hidden\"\r\n [ngClass]=\"{ 'justify-content-end': columns[column].flexRight }\"\r\n *ngIf=\"columns[column].actions && columns[column].actions!.length > 0\"\r\n >\r\n <ng-container *ngFor=\"let action of columns[column].actions\">\r\n <ng-container *ngIf=\"checkIfActionVisible(element, action)\">\r\n <button\r\n style=\"padding: 7px 7px; width: 40px; height: 40px\"\r\n class=\"col-auto\"\r\n mat-icon-button\r\n type=\"button\"\r\n *ngIf=\"!action.url && action.action\"\r\n matTooltip=\"{{ action.tooltipName || '' }}\"\r\n [matTooltipDisabled]=\"!!!action.tooltipName\"\r\n (click)=\"action.action(element)\"\r\n >\r\n <span class=\"material-icons\">{{ action.iconName }}</span>\r\n </button>\r\n\r\n <a *ngIf=\"action.url\" [routerLink]=\"action.url\">\r\n <button\r\n class=\"col-auto\"\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"{{ action.tooltipName || '' }}\"\r\n [matTooltipDisabled]=\"!!!action.tooltipName\"\r\n >\r\n <span class=\"material-icons\">{{ action.iconName }}</span>\r\n </button>\r\n </a>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!columns[column].actions\">\r\n <ng-container *ngIf=\"columns[column].translateValue\">\r\n <p style=\"margin: 0; padding: 0\">\r\n {{ columns[column].translateValue![element[column]] || '' }}\r\n </p>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!columns[column].translateValue\">\r\n <ng-container\r\n *ngIf=\"!columns[column].type || columns[column].type === 'string'\"\r\n >\r\n <p style=\"margin: 0; padding: 0\">{{ element[column] }}</p>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"columns[column].type === 'date'\">\r\n <p style=\"margin: 0; padding: 0\">\r\n {{ element[column] | stDateTimeFormatPipe }}\r\n </p>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr\r\n mat-row\r\n *matRowDef=\"let row; columns: displayedColumns\"\r\n (click)=\"\r\n tableSettings?.rowClickAction ? tableSettings.rowClickAction(row) : null\r\n \"\r\n ></tr>\r\n </table>\r\n <mat-paginator\r\n [pageIndex]=\"pageIndex\"\r\n [pageSizeOptions]=\"[5, 10, 15, 20, 25]\"\r\n (page)=\"pageChanged($event)\"\r\n [showFirstLastButtons]=\"true\"\r\n ></mat-paginator>\r\n</div>\r\n", styles: ["", ".search-form button{height:40px}.search-form mat-form-field:first-child{padding-left:0}.search-form mat-form-field:last-child{padding-right:0}.search-form .clear{padding:0}.search-form .clear i{height:20px;width:20px;font-size:20px;cursor:pointer}table{width:100%;box-shadow:none}table th.mat-mdc-header-cell,table td.mat-mdc-cell,table td.mat-mdc-footer-cell{padding:0}table th.mat-mdc-header-cell:first-of-type,table td.mat-mdc-cell:first-of-type,table td.mat-mdc-footer-cell:first-of-type{padding-left:12px}table th.mat-mdc-header-cell:last-of-type,table td.mat-mdc-cell:last-of-type,table td.mat-mdc-footer-cell:last-of-type{padding-right:12px}table::ng-deep thead tr{background-color:#fff9c4;height:40px!important}table::ng-deep thead tr th{border-color:#fdd835;color:#0000008a;font-size:12px}table::ng-deep tbody>tr{cursor:pointer}table::ng-deep tbody>tr.active{background-color:#a5d6a7}table::ng-deep tbody>tr.active td{border-bottom-color:#81c784!important}table::ng-deep tbody>tr:hover{background-color:#a5d6a7!important}table::ng-deep tbody>tr:hover td{border-bottom-color:#81c784!important}table::ng-deep tbody>tr.disabled{cursor:not-allowed}table::ng-deep tbody>tr.disabled:hover{background-color:inherit!important}table::ng-deep tbody>tr.detail-row{height:0;cursor:default}table::ng-deep tbody>tr.detail-row:hover{background-color:transparent}table::ng-deep tbody>tr.detail-row .element-detail{overflow:hidden;display:flex}table::ng-deep tbody>tr.detail-row .element-detail p{padding:20px 0;margin-bottom:0;white-space:pre-wrap}table::ng-deep tbody>tr td i.active-row{color:#1b5e20;font-weight:700;font-size:25px;height:25px;width:25px;margin-top:2px}table::ng-deep tbody>tr td>div{max-height:200px;overflow:hidden;overflow-y:auto}table::ng-deep tbody>tr td a button{color:#000}table::ng-deep tbody>tr td a i{color:#333}table::ng-deep .mat-column-active{width:48px}table.no-hover::ng-deep tbody tr{cursor:default}table.no-hover::ng-deep tbody tr.active{background-color:transparent!important}table.no-hover::ng-deep tbody tr.active td{border-bottom-color:#0000001f!important}table.no-hover::ng-deep tbody tr:hover{background-color:transparent!important}table.no-hover::ng-deep tbody tr:hover td{border-bottom-color:#0000001f!important}table.admin-table::ng-deep .actions-cell{width:100px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.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: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i11.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: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i12.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i13.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i13.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i13.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i14.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i15.ConfigurationsComponent, selector: "st-configurations[configurationsSettings]", inputs: ["configurationsSettings", "configurations", "initSelectedConfig"], outputs: ["createNewConfig", "removeConfig", "changeConfig"] }, { kind: "pipe", type: i16.DateTimeFormatPipe, name: "stDateTimeFormatPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
230
|
+
}
|
|
231
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LocalTableComponent, decorators: [{
|
|
232
|
+
type: Component,
|
|
233
|
+
args: [{ selector: 'ngx-st-local-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"local-table\">\r\n <div class=\"row align-items-center\">\r\n <div\r\n class=\"col row align-items-center\"\r\n style=\"padding: 0\"\r\n *ngIf=\"configurationsSettings || allowPickColumns\"\r\n >\r\n <div class=\"col-auto\" style=\"padding: 0\" *ngIf=\"allowPickColumns\">\r\n <button\r\n mat-icon-button\r\n class=\"col-auto\"\r\n [matMenuTriggerFor]=\"columnsMenu\"\r\n >\r\n <span class=\"material-icons-outlined\"> view_week </span>\r\n </button>\r\n <mat-menu #columnsMenu=\"matMenu\" xPosition=\"after\">\r\n <ng-container *ngFor=\"let column of columnsArray\">\r\n <div mat-menu-item *ngIf=\"!column.notShowInColumnPick\">\r\n <mat-checkbox\r\n [(ngModel)]=\"column.visible\"\r\n (ngModelChange)=\"columnVisibleChanged(column)\"\r\n style=\"margin-top: 5px\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n {{ column.translateColumnName }}\r\n </mat-checkbox>\r\n </div>\r\n </ng-container>\r\n </mat-menu>\r\n </div>\r\n\r\n <st-configurations\r\n *ngIf=\"configurationsSettings\"\r\n [configurationsSettings]=\"configurationsSettings\"\r\n [configurations]=\"configurations\"\r\n [initSelectedConfig]=\"initConfig\"\r\n (createNewConfig)=\"newConfigCreated($event)\"\r\n (removeConfig)=\"configRemoved($event)\"\r\n (changeConfig)=\"configChanged($event)\"\r\n ></st-configurations>\r\n </div>\r\n\r\n <div\r\n class=\"col\"\r\n style=\"padding: 0; margin-bottom: -15px\"\r\n *ngIf=\"globalSearchSettings?.show\"\r\n >\r\n <mat-form-field>\r\n <mat-label>{{ globalSearchSettings?.label || 'Search' }}</mat-label>\r\n <input matInput (keyup)=\"applySearch()\" [(ngModel)]=\"searchModel\" />\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Clear\"\r\n (click)=\"clearSearch()\"\r\n >\r\n <mat-icon style=\"font-size: 22px\">close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <table\r\n [ngClass]=\"{ 'no-hover': !tableSettings?.rowClickAction }\"\r\n mat-table\r\n [dataSource]=\"tableSource\"\r\n matSort\r\n >\r\n <ng-container\r\n [matColumnDef]=\"column\"\r\n *ngFor=\"let column of displayedColumns\"\r\n >\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n style=\"{{\r\n columns[column].width ? 'width:' + columns[column].width : ''\r\n }}\"\r\n mat-sort-header\r\n [disabled]=\"!columns[column].sort\"\r\n >\r\n {{ columns[column].translateColumnName }}\r\n <span\r\n class=\"material-icons search-icon\"\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"$event.stopPropagation()\"\r\n *ngIf=\"columns[column].search\"\r\n >\r\n search\r\n </span>\r\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\r\n <mat-form-field class=\"col\">\r\n <mat-label>{{ columns[column].searchLabel || 'Search' }}</mat-label>\r\n <input\r\n matInput\r\n (keyup)=\"applySearch()\"\r\n [(ngModel)]=\"searchModel\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n <button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Clear\"\r\n (click)=\"searchModel = ''\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </mat-menu>\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let element\"\r\n style=\"{{\r\n columns[column].width ? 'width:' + columns[column].width : ''\r\n }}\"\r\n >\r\n <div\r\n class=\"actions-container\"\r\n style=\"overflow-y: hidden\"\r\n [ngClass]=\"{ 'justify-content-end': columns[column].flexRight }\"\r\n *ngIf=\"columns[column].actions && columns[column].actions!.length > 0\"\r\n >\r\n <ng-container *ngFor=\"let action of columns[column].actions\">\r\n <ng-container *ngIf=\"checkIfActionVisible(element, action)\">\r\n <button\r\n style=\"padding: 7px 7px; width: 40px; height: 40px\"\r\n class=\"col-auto\"\r\n mat-icon-button\r\n type=\"button\"\r\n *ngIf=\"!action.url && action.action\"\r\n matTooltip=\"{{ action.tooltipName || '' }}\"\r\n [matTooltipDisabled]=\"!!!action.tooltipName\"\r\n (click)=\"action.action(element)\"\r\n >\r\n <span class=\"material-icons\">{{ action.iconName }}</span>\r\n </button>\r\n\r\n <a *ngIf=\"action.url\" [routerLink]=\"action.url\">\r\n <button\r\n class=\"col-auto\"\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"{{ action.tooltipName || '' }}\"\r\n [matTooltipDisabled]=\"!!!action.tooltipName\"\r\n >\r\n <span class=\"material-icons\">{{ action.iconName }}</span>\r\n </button>\r\n </a>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!columns[column].actions\">\r\n <ng-container *ngIf=\"columns[column].translateValue\">\r\n <p style=\"margin: 0; padding: 0\">\r\n {{ columns[column].translateValue![element[column]] || '' }}\r\n </p>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!columns[column].translateValue\">\r\n <ng-container\r\n *ngIf=\"!columns[column].type || columns[column].type === 'string'\"\r\n >\r\n <p style=\"margin: 0; padding: 0\">{{ element[column] }}</p>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"columns[column].type === 'date'\">\r\n <p style=\"margin: 0; padding: 0\">\r\n {{ element[column] | stDateTimeFormatPipe }}\r\n </p>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr\r\n mat-row\r\n *matRowDef=\"let row; columns: displayedColumns\"\r\n (click)=\"\r\n tableSettings?.rowClickAction ? tableSettings.rowClickAction(row) : null\r\n \"\r\n ></tr>\r\n </table>\r\n <mat-paginator\r\n [pageIndex]=\"pageIndex\"\r\n [pageSizeOptions]=\"[5, 10, 15, 20, 25]\"\r\n (page)=\"pageChanged($event)\"\r\n [showFirstLastButtons]=\"true\"\r\n ></mat-paginator>\r\n</div>\r\n", styles: [".search-form button{height:40px}.search-form mat-form-field:first-child{padding-left:0}.search-form mat-form-field:last-child{padding-right:0}.search-form .clear{padding:0}.search-form .clear i{height:20px;width:20px;font-size:20px;cursor:pointer}table{width:100%;box-shadow:none}table th.mat-mdc-header-cell,table td.mat-mdc-cell,table td.mat-mdc-footer-cell{padding:0}table th.mat-mdc-header-cell:first-of-type,table td.mat-mdc-cell:first-of-type,table td.mat-mdc-footer-cell:first-of-type{padding-left:12px}table th.mat-mdc-header-cell:last-of-type,table td.mat-mdc-cell:last-of-type,table td.mat-mdc-footer-cell:last-of-type{padding-right:12px}table::ng-deep thead tr{background-color:#fff9c4;height:40px!important}table::ng-deep thead tr th{border-color:#fdd835;color:#0000008a;font-size:12px}table::ng-deep tbody>tr{cursor:pointer}table::ng-deep tbody>tr.active{background-color:#a5d6a7}table::ng-deep tbody>tr.active td{border-bottom-color:#81c784!important}table::ng-deep tbody>tr:hover{background-color:#a5d6a7!important}table::ng-deep tbody>tr:hover td{border-bottom-color:#81c784!important}table::ng-deep tbody>tr.disabled{cursor:not-allowed}table::ng-deep tbody>tr.disabled:hover{background-color:inherit!important}table::ng-deep tbody>tr.detail-row{height:0;cursor:default}table::ng-deep tbody>tr.detail-row:hover{background-color:transparent}table::ng-deep tbody>tr.detail-row .element-detail{overflow:hidden;display:flex}table::ng-deep tbody>tr.detail-row .element-detail p{padding:20px 0;margin-bottom:0;white-space:pre-wrap}table::ng-deep tbody>tr td i.active-row{color:#1b5e20;font-weight:700;font-size:25px;height:25px;width:25px;margin-top:2px}table::ng-deep tbody>tr td>div{max-height:200px;overflow:hidden;overflow-y:auto}table::ng-deep tbody>tr td a button{color:#000}table::ng-deep tbody>tr td a i{color:#333}table::ng-deep .mat-column-active{width:48px}table.no-hover::ng-deep tbody tr{cursor:default}table.no-hover::ng-deep tbody tr.active{background-color:transparent!important}table.no-hover::ng-deep tbody tr.active td{border-bottom-color:#0000001f!important}table.no-hover::ng-deep tbody tr:hover{background-color:transparent!important}table.no-hover::ng-deep tbody tr:hover td{border-bottom-color:#0000001f!important}table.admin-table::ng-deep .actions-cell{width:100px}\n"] }]
|
|
234
|
+
}], ctorParameters: () => [{ type: i1.LocalTableService }, { type: i0.ChangeDetectorRef }, { type: i2.Router }, { type: i2.ActivatedRoute }], propDecorators: { paginator: [{
|
|
235
|
+
type: ViewChild,
|
|
236
|
+
args: [MatPaginator]
|
|
237
|
+
}], sort: [{
|
|
238
|
+
type: ViewChild,
|
|
239
|
+
args: [MatSort]
|
|
240
|
+
}], tableSettings: [{
|
|
241
|
+
type: Input
|
|
242
|
+
}], globalSearchSettings: [{
|
|
243
|
+
type: Input
|
|
244
|
+
}], pageSize: [{
|
|
245
|
+
type: Input
|
|
246
|
+
}], allowPickColumns: [{
|
|
247
|
+
type: Input
|
|
248
|
+
}], configurationsSettings: [{
|
|
249
|
+
type: Input
|
|
250
|
+
}], localStorageName: [{
|
|
251
|
+
type: Input
|
|
252
|
+
}], bindSearchToUrl: [{
|
|
253
|
+
type: Input
|
|
254
|
+
}], columns: [{
|
|
255
|
+
type: Input
|
|
256
|
+
}], data: [{
|
|
257
|
+
type: Input
|
|
258
|
+
}] } });
|
|
259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0LXRhYmxlcy9zcmMvbGliL2NvbXBvbmVudHMvbG9jYWwtdGFibGUvbG9jYWwtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0LXRhYmxlcy9zcmMvbGliL2NvbXBvbmVudHMvbG9jYWwtdGFibGUvbG9jYWwtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsS0FBSyxFQUVMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBaUIsTUFBTSx3QkFBd0IsQ0FBQztBQUtoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0I3RCxNQUFNLE9BQU8sbUJBQW1CO0lBeUI5QixJQUNJLE9BQU8sQ0FBQyxPQUFpQztRQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFJRCxJQUNJLElBQUksQ0FBQyxJQUFXO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFB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QUFFO1lBQ3ZCLEtBQUssRUFBRSxhQUFhLElBQUksS0FBSztZQUM3QixZQUFZLEVBQUUsS0FBSztTQUNwQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNqQyxNQUFNLENBQUMsT0FBTztnQkFDWixlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQzsrR0E3UVUsbUJBQW1CO21HQUFuQixtQkFBbUIseVpBQ25CLFlBQVksdUVBQ1osT0FBTyxnRENuQ3BCLDQ4TkFpTUE7OzRGRGhLYSxtQkFBbUI7a0JBVC9CLFNBQVM7K0JBQ0Usb0JBQW9CLG1CQU1iLHVCQUF1QixDQUFDLE1BQU07d0tBR3RCLFNBQVM7c0JBQWpDLFNBQVM7dUJBQUMsWUFBWTtnQkFDSCxJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU87Z0JBR2xCLGFBQWE7c0JBRFosS0FBSztnQkFJTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLHNCQUFzQjtzQkFEckIsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSUYsT0FBTztzQkFEVixLQUFLO2dCQWNGLElBQUk7c0JBRFAsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTG9jYWxUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2NhbC10YWJsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNvcnQsIFNvcnREaXJlY3Rpb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgU3RUYWJsZVNldHRpbmdzTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvc3QtdGFibGUtc2V0dGluZ3MubW9kZWwnO1xyXG5pbXBvcnQgeyBTdEdsb2JhbFNlYXJjaFNldHRpbmdzTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvc3QtZ2xvYmFsLXNlYXJjaC1zZXR0aW5ncy5tb2RlbCc7XHJcbmltcG9ydCB7IFN0Q29uZmlndXJhdGlvbnNTZXR0aW5nc01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3N0LWNvbmZpZ3VyYXRpb25zLXNldHRpbmdzLm1vZGVsJztcclxuaW1wb3J0IHsgU3RMb2NhbFRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3N0LWxvY2FsLXRhYmxlLWNvbHVtbnMubW9kZWwnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7XHJcbiAgTG9jYWxUYWJsZUFjdGlvbkNvbHVtbk1vZGVsLFxyXG4gIFN0TG9jYWxUYWJsZUNvbHVtbk1vZGVsLFxyXG59IGZyb20gJy4uLy4uL21vZGVscy9zdC1sb2NhbC10YWJsZS1jb2x1bW4ubW9kZWwnO1xyXG5pbXBvcnQgeyBTdExvY2FsU3RvcmFnZUNvbmZpZ3VyYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zdC1sb2NhbC1zdG9yYWdlLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtc3QtbG9jYWwtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9sb2NhbC10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbXHJcbiAgICAnLi9sb2NhbC10YWJsZS5jb21wb25lbnQuc2NzcycsXHJcbiAgICAnLi4vLi4vLi4vLi4vYXNzZXRzL2Jhc2UtdGFibGUuc2NzcycsXHJcbiAgXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIExvY2FsVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQ6IE1hdFNvcnQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdGFibGVTZXR0aW5nczogU3RUYWJsZVNldHRpbmdzTW9kZWw7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2xvYmFsU2VhcmNoU2V0dGluZ3M6IFN0R2xvYmFsU2VhcmNoU2V0dGluZ3NNb2RlbDtcclxuXHJcbiAgQElucHV0KClcclxuICBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgYWxsb3dQaWNrQ29sdW1uczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbmZpZ3VyYXRpb25zU2V0dGluZ3M6IFN0Q29uZmlndXJhdGlvbnNTZXR0aW5nc01vZGVsO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGxvY2FsU3RvcmFnZU5hbWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGJpbmRTZWFyY2hUb1VybDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb2x1bW5zKGNvbHVtbnM6IFN0TG9jYWxUYWJsZUNvbHVtbnNNb2RlbCkge1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnM7XHJcbiAgICB0aGlzLmNvbHVtbnNBcnJheSA9IHRoaXMuZ2V0Q29sdW1uc0FycmF5KCk7XHJcbiAgICB0aGlzLnNldERpc3BsYXllZENvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIGdldCBjb2x1bW5zKCk6IFN0TG9jYWxUYWJsZUNvbHVtbnNNb2RlbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbHVtbnM6IFN0TG9jYWxUYWJsZUNvbHVtbnNNb2RlbCA9IHt9O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBkYXRhKGRhdGE6IGFueVtdKSB7XHJcbiAgICB0aGlzLl9kYXRhID0gZGF0YSB8fCBbXTtcclxuICAgIHRoaXMuc2V0VGFibGVTb3VyY2UoKTtcclxuICB9XHJcblxyXG4gIGdldCBkYXRhKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGF0YTogYW55W10gPSBbXTtcclxuXHJcbiAgc2VhcmNoTW9kZWw6IHN0cmluZyA9ICcnO1xyXG5cclxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHRhYmxlU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBjb2x1bW5zQXJyYXk6IFN0TG9jYWxUYWJsZUNvbHVtbk1vZGVsW107XHJcbiAgY29uZmlndXJhdGlvbnM6IFN0TG9jYWxTdG9yYWdlQ29uZmlndXJhdGlvbk1vZGVsW10gPSBbXTtcclxuICBpbml0Q29uZmlnOiBTdExvY2FsU3RvcmFnZUNvbmZpZ3VyYXRpb25Nb2RlbCB8IG51bGwgPSBudWxsO1xyXG4gIGFjdGl2ZUNvbmZpZzogU3RMb2NhbFN0b3JhZ2VDb25maWd1cmF0aW9uTW9kZWwgfCBudWxsID0gbnVsbDtcclxuICBwYWdlSW5kZXg6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBsb2NhbFRhYmxlU2VydmljZTogTG9jYWxUYWJsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5sb2NhbFN0b3JhZ2VOYW1lKSB7XHJcbiAgICAgIGNvbnN0IHBhZ2VTaXplID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VOYW1lKTtcclxuICAgICAgaWYgKHBhZ2VTaXplKSB7XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhcnNlSW50KHBhZ2VTaXplKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbnNTZXR0aW5ncykge1xyXG4gICAgICB0aGlzLmxvY2FsVGFibGVTZXJ2aWNlLmxvY2FsU3RvcmFnZU5hbWUgPVxyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbnNTZXR0aW5ncz8ubG9jYWxTdG9yYWdlTmFtZSB8fCAnJztcclxuICAgICAgdGhpcy5sb2FkQ29uZmlncygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbnNTZXR0aW5ncykge1xyXG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUNvbmZpZykge1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVDb25maWcucGFnZVNpemUgPSByZXMucGFnZVNpemU7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3NUb0xvY2FsU3RvcmFnZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuc29ydC5zb3J0Q2hhbmdlLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUNvbmZpZykge1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVDb25maWcuc29ydEZpZWxkTmFtZSA9IHJlcy5hY3RpdmU7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNvbmZpZy5zb3J0RGlyZWN0aW9uID0gcmVzLmRpcmVjdGlvbjtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ29uZmlnc1RvTG9jYWxTdG9yYWdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmJpbmRTZWFyY2hUb1VybCkge1xyXG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgICAgIHRoaXMuc29ydC5zb3J0Q2hhbmdlLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2VhcmNoVG9VcmwoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChwYXJhbXMuZ2V0KCdzdExvY2FsVGFibGVQYWdlSW5kZXgnKSkge1xyXG4gICAgICAgIHRoaXMucGFnZUluZGV4ID0gcGFyc2VJbnQocGFyYW1zLmdldCgnc3RMb2NhbFRhYmxlUGFnZUluZGV4JykgfHwgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwYXJhbXMuZ2V0KCdzdExvY2FsVGFibGVQYWdlU2l6ZScpKSB7XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhcnNlSW50KHBhcmFtcy5nZXQoJ3N0TG9jYWxUYWJsZVBhZ2VTaXplJykgfHwgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwYXJhbXMuZ2V0KCdzdExvY2FsVGFibGVTb3J0RmllbGROYW1lJykgJiZcclxuICAgICAgICBwYXJhbXMuZ2V0KCdzdExvY2FsVGFibGVTb3J0RGlyZWN0aW9uJylcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5zb3J0LnNvcnQoe1xyXG4gICAgICAgICAgaWQ6IHBhcmFtcy5nZXQoJ3N0TG9jYWxUYWJsZVNvcnRGaWVsZE5hbWUnKSB8fCAnJyxcclxuICAgICAgICAgIHN0YXJ0OlxyXG4gICAgICAgICAgICA8U29ydERpcmVjdGlvbj5wYXJhbXMuZ2V0KCdzdExvY2FsVGFibGVTb3J0RGlyZWN0aW9uJykgfHwgJ2FzYycsXHJcbiAgICAgICAgICBkaXNhYmxlQ2xlYXI6IGZhbHNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VhcmNoTW9kZWwgPSBwYXJhbXMuZ2V0KCdzdExvY2FsVGFibGVTZWFyY2gnKSB8fCAnJztcclxuICAgICAgaWYgKHRoaXMuc2VhcmNoTW9kZWwpIHtcclxuICAgICAgICB0aGlzLnRhYmxlU291cmNlLmZpbHRlciA9IHRoaXMuc2VhcmNoTW9kZWwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcclxuICB9XHJcblxyXG4gIGFwcGx5U2VhcmNoKCkge1xyXG4gICAgdGhpcy50YWJsZVNvdXJjZS5maWx0ZXIgPSB0aGlzLnNlYXJjaE1vZGVsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy51cGRhdGVTZWFyY2hUb1VybCgpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJTZWFyY2goKSB7XHJcbiAgICB0aGlzLnNlYXJjaE1vZGVsID0gJyc7XHJcbiAgICB0aGlzLnRhYmxlU291cmNlLmZpbHRlciA9IHRoaXMuc2VhcmNoTW9kZWw7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XHJcbiAgICB0aGlzLnVwZGF0ZVNlYXJjaFRvVXJsKCk7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmQWN0aW9uVmlzaWJsZShyb3c6IGFueSwgYWN0aW9uOiBMb2NhbFRhYmxlQWN0aW9uQ29sdW1uTW9kZWwpIHtcclxuICAgIGlmIChhY3Rpb24uc2hvdykge1xyXG4gICAgICByZXR1cm4gYWN0aW9uLnNob3cocm93KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29sdW1uVmlzaWJsZUNoYW5nZWQoY29sdW1uOiBTdExvY2FsVGFibGVDb2x1bW5Nb2RlbCkge1xyXG4gICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUNvbmZpZ3NUb0xvY2FsU3RvcmFnZSgpO1xyXG4gIH1cclxuXHJcbiAgbmV3Q29uZmlnQ3JlYXRlZChuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG5ld0NvbmZpZyA9IHRoaXMuZ2VuZXJhdGVOZXdDb25maWcobmFtZSk7XHJcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25zLnB1c2gobmV3Q29uZmlnKTtcclxuICAgIHRoaXMudXBkYXRlQ29uZmlnc1RvTG9jYWxTdG9yYWdlKCk7XHJcbiAgICB0aGlzLmluaXRDb25maWcgPSBuZXdDb25maWc7XHJcbiAgfVxyXG5cclxuICBjb25maWdSZW1vdmVkKGNvbmZpZ0lkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY29uZmlndXJhdGlvbnMgPSB0aGlzLmNvbmZpZ3VyYXRpb25zLmZpbHRlcihcclxuICAgICAgY29uZmlnID0+IGNvbmZpZy5jb25maWdJZCAhPT0gY29uZmlnSWRcclxuICAgICk7XHJcbiAgICB0aGlzLnVwZGF0ZUNvbmZpZ3NUb0xvY2FsU3RvcmFnZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uZmlnQ2hhbmdlZChjb25maWdJZDogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgdGhpcy5hY3RpdmVDb25maWcgPSBjb25maWdJZFxyXG4gICAgICA/IHRoaXMuY29uZmlndXJhdGlvbnMuZmluZChjb25maWcgPT4gY29uZmlnLmNvbmZpZ0lkID09PSBjb25maWdJZCkhXHJcbiAgICAgIDogbnVsbDtcclxuICAgIGlmICh0aGlzLmFjdGl2ZUNvbmZpZykge1xyXG4gICAgICB0aGlzLnNldFRhYmxlQ29uZmlnKFxyXG4gICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnLnBhZ2VTaXplLFxyXG4gICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnLmNvbHVtbnNEaXNhYmxlZCxcclxuICAgICAgICB0aGlzLmFjdGl2ZUNvbmZpZy5zb3J0RmllbGROYW1lLFxyXG4gICAgICAgIHRoaXMuYWN0aXZlQ29uZmlnLnNvcnREaXJlY3Rpb25cclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0VGFibGVDb25maWcodGhpcy5wYWdlU2l6ZSwgW10sIG51bGwsIG51bGwpO1xyXG4gICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwYWdlQ2hhbmdlZChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGV2ZW50LnBhZ2VJbmRleDtcclxuICAgIHRoaXMudXBkYXRlU2VhcmNoVG9VcmwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2VhcmNoVG9VcmwoKSB7XHJcbiAgICBpZiAodGhpcy5iaW5kU2VhcmNoVG9VcmwpIHtcclxuICAgICAgbGV0IHF1ZXJ5UGFyYW1zID0ge1xyXG4gICAgICAgIHN0TG9jYWxUYWJsZVNlYXJjaDogdGhpcy5zZWFyY2hNb2RlbCxcclxuICAgICAgICBzdExvY2FsVGFibGVQYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxyXG4gICAgICAgIHN0TG9jYWxUYWJsZVBhZ2VTaXplOiB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSxcclxuICAgICAgICBzdExvY2FsVGFibGVTb3J0RmllbGROYW1lOiAnJyxcclxuICAgICAgICBzdExvY2FsVGFibGVTb3J0RGlyZWN0aW9uOiAnJyxcclxuICAgICAgfTtcclxuICAgICAgaWYgKHRoaXMuc29ydC5kaXJlY3Rpb24gJiYgdGhpcy5zb3J0LmFjdGl2ZSkge1xyXG4gICAgICAgIHF1ZXJ5UGFyYW1zID0ge1xyXG4gICAgICAgICAgLi4ucXVlcnlQYXJhbXMsXHJcbiAgICAgICAgICBzdExvY2FsVGFibGVTb3J0RmllbGROYW1lOiB0aGlzLnNvcnQuYWN0aXZlLFxyXG4gICAgICAgICAgc3RMb2NhbFRhYmxlU29ydERpcmVjdGlvbjogdGhpcy5zb3J0LmRpcmVjdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi8nXSwge1xyXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyxcclxuICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29uZmlnc1RvTG9jYWxTdG9yYWdlKCkge1xyXG4gICAgdGhpcy5sb2NhbFRhYmxlU2VydmljZS5zYXZlQ29uZmlncyh0aGlzLmNvbmZpZ3VyYXRpb25zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGFibGVTb3VyY2UoKSB7XHJcbiAgICB0aGlzLnRhYmxlU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLl9kYXRhKTtcclxuICAgIHRoaXMudGFibGVTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XHJcbiAgICB0aGlzLnRhYmxlU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XHJcbiAgICB0aGlzLnRhYmxlU291cmNlLmZpbHRlciA9IHRoaXMuc2VhcmNoTW9kZWw7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXREaXNwbGF5ZWRDb2x1bW5zKCkge1xyXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gT2JqZWN0LmtleXModGhpcy5jb2x1bW5zKS5maWx0ZXIoY29sdW1uID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnNbY29sdW1uXS52aXNpYmxlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbHVtbnNBcnJheSgpIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9jb2x1bW5zKS5tYXAoY29sdW1uID0+IHRoaXMuX2NvbHVtbnNbY29sdW1uXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRDb25maWdzKCkge1xyXG4gICAgdGhpcy5jb25maWd1cmF0aW9ucyA9IHRoaXMubG9jYWxUYWJsZVNlcnZpY2UuZ2V0Q29uZmlncygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZU5ld0NvbmZpZyhjb25maWdOYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNvbmZpZ0lkOiBEYXRlLm5vdygpLnRvU3RyaW5nKCksXHJcbiAgICAgIGNvbmZpZ05hbWU6IGNvbmZpZ05hbWUsXHJcbiAgICAgIGNvbHVtbnNEaXNhYmxlZDogdGhpcy5jb2x1bW5zQXJyYXlcclxuICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLnZpc2libGUpXHJcbiAgICAgICAgLm1hcChjb2x1bW4gPT4gY29sdW1uLnRyYW5zbGF0ZUNvbHVtbk5hbWUpLFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5wYWdpbmF0b3IucGFnZVNpemUsXHJcbiAgICAgIHNvcnRGaWVsZE5hbWU6XHJcbiAgICAgICAgdGhpcy5zb3J0LmRpcmVjdGlvbiAmJiB0aGlzLnNvcnQuYWN0aXZlID8gdGhpcy5zb3J0LmFjdGl2ZSA6IG51bGwsXHJcbiAgICAgIHNvcnREaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24gfHwgbnVsbCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFRhYmxlQ29uZmlnKFxyXG4gICAgcGFnZVNpemU6IG51bWJlcixcclxuICAgIGRpc2FibGVkQ29sdW1uczogc3RyaW5nW10sXHJcbiAgICBzb3J0RmllbGROYW1lOiBudWxsIHwgc3RyaW5nLFxyXG4gICAgc29ydERpcmVjdGlvbjogbnVsbCB8IFNvcnREaXJlY3Rpb25cclxuICApIHtcclxuICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gcGFnZVNpemU7XHJcbiAgICB0aGlzLnNvcnQuc29ydCh7XHJcbiAgICAgIGlkOiBzb3J0RmllbGROYW1lIHx8ICcnLFxyXG4gICAgICBzdGFydDogc29ydERpcmVjdGlvbiB8fCAnYXNjJyxcclxuICAgICAgZGlzYWJsZUNsZWFyOiBmYWxzZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jb2x1bW5zQXJyYXkuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICBjb2x1bW4udmlzaWJsZSA9XHJcbiAgICAgICAgZGlzYWJsZWRDb2x1bW5zLmluZGV4T2YoY29sdW1uLnRyYW5zbGF0ZUNvbHVtbk5hbWUpID09PSAtMTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJsb2NhbC10YWJsZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiY29sIHJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICBzdHlsZT1cInBhZGRpbmc6IDBcIlxyXG4gICAgICAqbmdJZj1cImNvbmZpZ3VyYXRpb25zU2V0dGluZ3MgfHwgYWxsb3dQaWNrQ29sdW1uc1wiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiIHN0eWxlPVwicGFkZGluZzogMFwiICpuZ0lmPVwiYWxsb3dQaWNrQ29sdW1uc1wiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgY2xhc3M9XCJjb2wtYXV0b1wiXHJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29sdW1uc01lbnVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj4gdmlld193ZWVrIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bWF0LW1lbnUgI2NvbHVtbnNNZW51PVwibWF0TWVudVwiIHhQb3NpdGlvbj1cImFmdGVyXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc0FycmF5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgbWF0LW1lbnUtaXRlbSAqbmdJZj1cIiFjb2x1bW4ubm90U2hvd0luQ29sdW1uUGlja1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uLnZpc2libGVcIlxyXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY29sdW1uVmlzaWJsZUNoYW5nZWQoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDVweFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBjb2x1bW4udHJhbnNsYXRlQ29sdW1uTmFtZSB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHN0LWNvbmZpZ3VyYXRpb25zXHJcbiAgICAgICAgKm5nSWY9XCJjb25maWd1cmF0aW9uc1NldHRpbmdzXCJcclxuICAgICAgICBbY29uZmlndXJhdGlvbnNTZXR0aW5nc109XCJjb25maWd1cmF0aW9uc1NldHRpbmdzXCJcclxuICAgICAgICBbY29uZmlndXJhdGlvbnNdPVwiY29uZmlndXJhdGlvbnNcIlxyXG4gICAgICAgIFtpbml0U2VsZWN0ZWRDb25maWddPVwiaW5pdENvbmZpZ1wiXHJcbiAgICAgICAgKGNyZWF0ZU5ld0NvbmZpZyk9XCJuZXdDb25maWdDcmVhdGVkKCRldmVudClcIlxyXG4gICAgICAgIChyZW1vdmVDb25maWcpPVwiY29uZmlnUmVtb3ZlZCgkZXZlbnQpXCJcclxuICAgICAgICAoY2hhbmdlQ29uZmlnKT1cImNvbmZpZ0NoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgID48L3N0LWNvbmZpZ3VyYXRpb25zPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImNvbFwiXHJcbiAgICAgIHN0eWxlPVwicGFkZGluZzogMDsgbWFyZ2luLWJvdHRvbTogLTE1cHhcIlxyXG4gICAgICAqbmdJZj1cImdsb2JhbFNlYXJjaFNldHRpbmdzPy5zaG93XCJcclxuICAgID5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+e3sgZ2xvYmFsU2VhcmNoU2V0dGluZ3M/LmxhYmVsIHx8ICdTZWFyY2gnIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IChrZXl1cCk9XCJhcHBseVNlYXJjaCgpXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hNb2RlbFwiIC8+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhclwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOiAyMnB4XCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDx0YWJsZVxyXG4gICAgW25nQ2xhc3NdPVwieyAnbm8taG92ZXInOiAhdGFibGVTZXR0aW5ncz8ucm93Q2xpY2tBY3Rpb24gfVwiXHJcbiAgICBtYXQtdGFibGVcclxuICAgIFtkYXRhU291cmNlXT1cInRhYmxlU291cmNlXCJcclxuICAgIG1hdFNvcnRcclxuICA+XHJcbiAgICA8bmctY29udGFpbmVyXHJcbiAgICAgIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uXCJcclxuICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBkaXNwbGF5ZWRDb2x1bW5zXCJcclxuICAgID5cclxuICAgICAgPHRoXHJcbiAgICAgICAgbWF0LWhlYWRlci1jZWxsXHJcbiAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcclxuICAgICAgICBzdHlsZT1cInt7XHJcbiAgICAgICAgICBjb2x1bW5zW2NvbHVtbl0ud2lkdGggPyAnd2lkdGg6JyArIGNvbHVtbnNbY29sdW1uXS53aWR0aCA6ICcnXHJcbiAgICAgICAgfX1cIlxyXG4gICAgICAgIG1hdC1zb3J0LWhlYWRlclxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhY29sdW1uc1tjb2x1bW5dLnNvcnRcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgY29sdW1uc1tjb2x1bW5dLnRyYW5zbGF0ZUNvbHVtbk5hbWUgfX1cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBzZWFyY2gtaWNvblwiXHJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICpuZ0lmPVwiY29sdW1uc1tjb2x1bW5dLnNlYXJjaFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgc2VhcmNoXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIiB4UG9zaXRpb249XCJiZWZvcmVcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7IGNvbHVtbnNbY29sdW1uXS5zZWFyY2hMYWJlbCB8fCAnU2VhcmNoJyB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgIChrZXl1cCk9XCJhcHBseVNlYXJjaCgpXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaE1vZGVsXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhclwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaE1vZGVsID0gJydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgIDwvdGg+XHJcbiAgICAgIDx0ZFxyXG4gICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiXHJcbiAgICAgICAgc3R5bGU9XCJ7e1xyXG4gICAgICAgICAgY29sdW1uc1tjb2x1bW5dLndpZHRoID8gJ3dpZHRoOicgKyBjb2x1bW5zW2NvbHVtbl0ud2lkdGggOiAnJ1xyXG4gICAgICAgIH19XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiYWN0aW9ucy1jb250YWluZXJcIlxyXG4gICAgICAgICAgc3R5bGU9XCJvdmVyZmxvdy15OiBoaWRkZW5cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnanVzdGlmeS1jb250ZW50LWVuZCc6IGNvbHVtbnNbY29sdW1uXS5mbGV4UmlnaHQgfVwiXHJcbiAgICAgICAgICAqbmdJZj1cImNvbHVtbnNbY29sdW1uXS5hY3Rpb25zICYmIGNvbHVtbnNbY29sdW1uXS5hY3Rpb25zIS5sZW5ndGggPiAwXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgY29sdW1uc1tjb2x1bW5dLmFjdGlvbnNcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNoZWNrSWZBY3Rpb25WaXNpYmxlKGVsZW1lbnQsIGFjdGlvbilcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDdweCA3cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHhcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtYXV0b1wiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhYWN0aW9uLnVybCAmJiBhY3Rpb24uYWN0aW9uXCJcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyBhY3Rpb24udG9vbHRpcE5hbWUgfHwgJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhISFhY3Rpb24udG9vbHRpcE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbi5hY3Rpb24oZWxlbWVudClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj57eyBhY3Rpb24uaWNvbk5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgIDxhICpuZ0lmPVwiYWN0aW9uLnVybFwiIFtyb3V0ZXJMaW5rXT1cImFjdGlvbi51cmxcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IGFjdGlvbi50b29sdGlwTmFtZSB8fCAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwRGlzYWJsZWRdPVwiISEhYWN0aW9uLnRvb2x0aXBOYW1lXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPnt7IGFjdGlvbi5pY29uTmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW5zW2NvbHVtbl0uYWN0aW9uc1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbnNbY29sdW1uXS50cmFuc2xhdGVWYWx1ZVwiPlxyXG4gICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjogMDsgcGFkZGluZzogMFwiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbHVtbnNbY29sdW1uXS50cmFuc2xhdGVWYWx1ZSFbZWxlbWVudFtjb2x1bW5dXSB8fCAnJyB9fVxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbnNbY29sdW1uXS50cmFuc2xhdGVWYWx1ZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhY29sdW1uc1tjb2x1bW5dLnR5cGUgfHwgY29sdW1uc1tjb2x1bW5dLnR5cGUgPT09ICdzdHJpbmcnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiAwOyBwYWRkaW5nOiAwXCI+e3sgZWxlbWVudFtjb2x1bW5dIH19PC9wPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5zW2NvbHVtbl0udHlwZSA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDA7IHBhZGRpbmc6IDBcIj5cclxuICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbY29sdW1uXSB8IHN0RGF0ZVRpbWVGb3JtYXRQaXBlIH19XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cclxuICAgIDx0clxyXG4gICAgICBtYXQtcm93XHJcbiAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCJcclxuICAgICAgKGNsaWNrKT1cIlxyXG4gICAgICAgIHRhYmxlU2V0dGluZ3M/LnJvd0NsaWNrQWN0aW9uID8gdGFibGVTZXR0aW5ncy5yb3dDbGlja0FjdGlvbihyb3cpIDogbnVsbFxyXG4gICAgICBcIlxyXG4gICAgPjwvdHI+XHJcbiAgPC90YWJsZT5cclxuICA8bWF0LXBhZ2luYXRvclxyXG4gICAgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIlxyXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJbNSwgMTAsIDE1LCAyMCwgMjVdXCJcclxuICAgIChwYWdlKT1cInBhZ2VDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInRydWVcIlxyXG4gID48L21hdC1wYWdpbmF0b3I+XHJcbjwvZGl2PlxyXG4iXX0=
|