@universis/ngx-tables 0.8.5 → 15.0.2
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/actions/table.actions.mjs +27 -0
- package/esm2020/lib/advanced-aggregator.mjs +2 -0
- package/esm2020/lib/components/add-items/add-items.component.mjs +138 -0
- package/esm2020/lib/components/advanced-aggregator/advanced-aggregator.component.mjs +126 -0
- package/esm2020/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.mjs +53 -0
- package/esm2020/lib/components/advanced-list/advanced-list.component.mjs +184 -0
- package/esm2020/lib/components/advanced-row-action/advanced-row-action.component.mjs +178 -0
- package/esm2020/lib/components/advanced-search-form/advanced-search-form.component.mjs +154 -0
- package/esm2020/lib/components/advanced-select/advanced-select.component.mjs +42 -0
- package/esm2020/lib/components/advanced-select/advanced-select.service.mjs +38 -0
- package/esm2020/lib/components/advanced-table/advanced-filter-value-provider.service.mjs +31 -0
- package/esm2020/lib/components/advanced-table/advanced-table-resolvers.mjs +40 -0
- package/esm2020/lib/components/advanced-table/advanced-table-search-base.mjs +31 -0
- package/esm2020/lib/components/advanced-table/advanced-table-search.component.mjs +525 -0
- package/esm2020/lib/components/advanced-table/advanced-table-settings.component.mjs +108 -0
- package/esm2020/lib/components/advanced-table/advanced-table.component.mjs +1599 -0
- package/esm2020/lib/components/advanced-table/advanced-table.formatters.interface.mjs +17 -0
- package/esm2020/lib/components/advanced-table/advanced-table.formatters.mjs +429 -0
- package/esm2020/lib/components/advanced-table/advanced-table.interfaces.mjs +2 -0
- package/esm2020/lib/components/advanced-table-modal/advanced-table-modal-base.component.mjs +420 -0
- package/esm2020/lib/components/column-selector/column-selector.component.mjs +205 -0
- package/esm2020/lib/components/column-selector/column-selector.service.mjs +45 -0
- package/esm2020/lib/components/table-simple-header/table-simple-header.component.mjs +52 -0
- package/esm2020/lib/directives/advance-search-state.directive.mjs +111 -0
- package/esm2020/lib/directives/advance-table-state.directive.mjs +63 -0
- package/esm2020/lib/directives/advanced-search-router-state.directive.mjs +64 -0
- package/esm2020/lib/directives/advanced-table-editor.directive.mjs +154 -0
- package/esm2020/lib/directives/btnexp.directive.mjs +222 -0
- package/esm2020/lib/i18n/tables.el.mjs +129 -0
- package/esm2020/lib/i18n/tables.en.mjs +128 -0
- package/esm2020/lib/pipes/advanced-aggregator.pipe.mjs +38 -0
- package/esm2020/lib/pipes/advansed-aggregator-list-title-parse.pipe.mjs +45 -0
- package/esm2020/lib/reducers/index.mjs +37 -0
- package/esm2020/lib/services/advanced-aggregator/advanced-aggregator.service.mjs +119 -0
- package/esm2020/lib/tables.activated-table.service.mjs +46 -0
- package/esm2020/lib/tables.module.mjs +218 -0
- package/esm2020/public_api.mjs +37 -0
- package/esm2020/universis-ngx-tables.mjs +5 -0
- package/fesm2015/{universis-ngx-tables.js → universis-ngx-tables.mjs} +2927 -2729
- package/fesm2015/universis-ngx-tables.mjs.map +1 -0
- package/fesm2020/universis-ngx-tables.mjs +5609 -0
- package/fesm2020/universis-ngx-tables.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/actions/table.actions.d.ts +4 -4
- package/lib/components/add-items/add-items.component.d.ts +14 -21
- package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +15 -9
- package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +4 -1
- package/lib/components/advanced-list/advanced-list.component.d.ts +17 -14
- package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +20 -23
- package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +7 -4
- package/lib/components/advanced-select/advanced-select.component.d.ts +3 -1
- package/lib/components/advanced-select/advanced-select.service.d.ts +3 -0
- package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +3 -0
- package/lib/components/advanced-table/advanced-table-resolvers.d.ts +5 -0
- package/lib/components/advanced-table/advanced-table-search-base.d.ts +6 -2
- package/lib/components/advanced-table/advanced-table-search.component.d.ts +11 -7
- package/lib/components/advanced-table/advanced-table-settings.component.d.ts +8 -6
- package/lib/components/advanced-table/advanced-table.component.d.ts +33 -25
- package/lib/components/advanced-table/advanced-table.formatters.d.ts +11 -11
- package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +15 -12
- package/lib/components/column-selector/column-selector.component.d.ts +9 -6
- package/lib/components/column-selector/column-selector.service.d.ts +3 -0
- package/lib/components/table-simple-header/table-simple-header.component.d.ts +8 -3
- package/lib/directives/advance-search-state.directive.d.ts +6 -3
- package/lib/directives/advance-table-state.directive.d.ts +4 -1
- package/lib/directives/advanced-search-router-state.directive.d.ts +9 -6
- package/lib/directives/advanced-table-editor.directive.d.ts +4 -1
- package/lib/directives/btnexp.directive.d.ts +12 -9
- package/lib/i18n/tables.el.d.ts +107 -107
- package/lib/i18n/tables.en.d.ts +106 -106
- package/lib/pipes/advanced-aggregator.pipe.d.ts +7 -4
- package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +9 -6
- package/lib/reducers/index.d.ts +5 -3
- package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +11 -8
- package/lib/tables.activated-table.service.d.ts +10 -6
- package/lib/tables.module.d.ts +36 -0
- package/package.json +44 -36
- package/public_api.d.ts +3 -0
- package/bundles/universis-ngx-tables.umd.js +0 -6101
- package/bundles/universis-ngx-tables.umd.js.map +0 -1
- package/bundles/universis-ngx-tables.umd.min.js +0 -2
- package/bundles/universis-ngx-tables.umd.min.js.map +0 -1
- package/esm2015/lib/actions/table.actions.js +0 -28
- package/esm2015/lib/advanced-aggregator.js +0 -2
- package/esm2015/lib/components/add-items/add-items.component.js +0 -142
- package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -120
- package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -53
- package/esm2015/lib/components/advanced-list/advanced-list.component.js +0 -173
- package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +0 -184
- package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +0 -142
- package/esm2015/lib/components/advanced-select/advanced-select.component.js +0 -65
- package/esm2015/lib/components/advanced-select/advanced-select.service.js +0 -40
- package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -37
- package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +0 -44
- package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +0 -28
- package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +0 -526
- package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +0 -109
- package/esm2015/lib/components/advanced-table/advanced-table.component.js +0 -1523
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -18
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +0 -429
- package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +0 -2
- package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -397
- package/esm2015/lib/components/column-selector/column-selector.component.js +0 -202
- package/esm2015/lib/components/column-selector/column-selector.service.js +0 -47
- package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +0 -52
- package/esm2015/lib/directives/advance-search-state.directive.js +0 -108
- package/esm2015/lib/directives/advance-table-state.directive.js +0 -63
- package/esm2015/lib/directives/advanced-search-router-state.directive.js +0 -63
- package/esm2015/lib/directives/advanced-table-editor.directive.js +0 -156
- package/esm2015/lib/directives/btnexp.directive.js +0 -229
- package/esm2015/lib/i18n/tables.el.js +0 -130
- package/esm2015/lib/i18n/tables.en.js +0 -129
- package/esm2015/lib/pipes/advanced-aggregator.pipe.js +0 -35
- package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -46
- package/esm2015/lib/reducers/index.js +0 -32
- package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -120
- package/esm2015/lib/tables.activated-table.service.js +0 -50
- package/esm2015/lib/tables.module.js +0 -149
- package/esm2015/public_api.js +0 -33
- package/esm2015/universis-ngx-tables.js +0 -9
- package/esm5/lib/actions/table.actions.js +0 -34
- package/esm5/lib/advanced-aggregator.js +0 -2
- package/esm5/lib/components/add-items/add-items.component.js +0 -153
- package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -169
- package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -56
- package/esm5/lib/components/advanced-list/advanced-list.component.js +0 -185
- package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +0 -188
- package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +0 -145
- package/esm5/lib/components/advanced-select/advanced-select.component.js +0 -71
- package/esm5/lib/components/advanced-select/advanced-select.service.js +0 -43
- package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -50
- package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +0 -48
- package/esm5/lib/components/advanced-table/advanced-table-search-base.js +0 -34
- package/esm5/lib/components/advanced-table/advanced-table-search.component.js +0 -563
- package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +0 -115
- package/esm5/lib/components/advanced-table/advanced-table.component.js +0 -1548
- package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -18
- package/esm5/lib/components/advanced-table/advanced-table.formatters.js +0 -480
- package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +0 -2
- package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -314
- package/esm5/lib/components/column-selector/column-selector.component.js +0 -270
- package/esm5/lib/components/column-selector/column-selector.service.js +0 -50
- package/esm5/lib/components/table-simple-header/table-simple-header.component.js +0 -58
- package/esm5/lib/directives/advance-search-state.directive.js +0 -116
- package/esm5/lib/directives/advance-table-state.directive.js +0 -65
- package/esm5/lib/directives/advanced-search-router-state.directive.js +0 -71
- package/esm5/lib/directives/advanced-table-editor.directive.js +0 -196
- package/esm5/lib/directives/btnexp.directive.js +0 -257
- package/esm5/lib/i18n/tables.el.js +0 -130
- package/esm5/lib/i18n/tables.en.js +0 -129
- package/esm5/lib/pipes/advanced-aggregator.pipe.js +0 -39
- package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -49
- package/esm5/lib/reducers/index.js +0 -34
- package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -134
- package/esm5/lib/tables.activated-table.service.js +0 -57
- package/esm5/lib/tables.module.js +0 -154
- package/esm5/public_api.js +0 -33
- package/esm5/universis-ngx-tables.js +0 -9
- package/fesm2015/universis-ngx-tables.js.map +0 -1
- package/fesm5/universis-ngx-tables.js +0 -5737
- package/fesm5/universis-ngx-tables.js.map +0 -1
- package/universis-ngx-tables.d.ts +0 -8
- package/universis-ngx-tables.metadata.json +0 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { Component, ViewChild, Input } from '@angular/core';
|
|
2
|
+
// tslint:disable-next-line: max-line-length
|
|
3
|
+
import { AdvancedTableConfiguration } from '../advanced-table/advanced-table.component';
|
|
4
|
+
import { DIALOG_BUTTONS } from '@universis/common';
|
|
5
|
+
import { ResponseError } from '@themost/client';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@themost/angular";
|
|
8
|
+
import * as i2 from "@ngx-translate/core";
|
|
9
|
+
import * as i3 from "@angular/router";
|
|
10
|
+
import * as i4 from "@universis/common";
|
|
11
|
+
import * as i5 from "@angular/common";
|
|
12
|
+
import * as i6 from "@universis/common/routing";
|
|
13
|
+
import * as i7 from "../advanced-table/advanced-table.component";
|
|
14
|
+
import * as i8 from "../advanced-table/advanced-table-search.component";
|
|
15
|
+
import * as i9 from "../advanced-search-form/advanced-search-form.component";
|
|
16
|
+
export class AdvancedListComponent {
|
|
17
|
+
constructor(_context, _translateService, _activatedRoute, _errorService, _toastService, _modalService, _userActivityService) {
|
|
18
|
+
this._context = _context;
|
|
19
|
+
this._translateService = _translateService;
|
|
20
|
+
this._activatedRoute = _activatedRoute;
|
|
21
|
+
this._errorService = _errorService;
|
|
22
|
+
this._toastService = _toastService;
|
|
23
|
+
this._modalService = _modalService;
|
|
24
|
+
this._userActivityService = _userActivityService;
|
|
25
|
+
this.allowSaveOption = true;
|
|
26
|
+
}
|
|
27
|
+
ngOnDestroy() {
|
|
28
|
+
if (this.dataSubscription) {
|
|
29
|
+
this.dataSubscription.unsubscribe();
|
|
30
|
+
}
|
|
31
|
+
if (this.reloadSubscription) {
|
|
32
|
+
this.reloadSubscription.unsubscribe();
|
|
33
|
+
}
|
|
34
|
+
if (this.subscription) {
|
|
35
|
+
this.subscription.unsubscribe();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async ngAfterViewInit() {
|
|
39
|
+
try {
|
|
40
|
+
if (this.table == null) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const table = this.table;
|
|
44
|
+
// get metadata
|
|
45
|
+
const metadata = await this._context.getMetadata();
|
|
46
|
+
// get route data
|
|
47
|
+
this.dataSubscription = this._activatedRoute.data.subscribe(routeData => {
|
|
48
|
+
// get entityType
|
|
49
|
+
const re = new RegExp(`^${routeData.model}$`, 'ig');
|
|
50
|
+
const entitySet = metadata.EntityContainer.EntitySet.find(x => {
|
|
51
|
+
return re.test(x.Name);
|
|
52
|
+
});
|
|
53
|
+
// if entity type is null
|
|
54
|
+
if (entitySet == null) {
|
|
55
|
+
// navigate to error
|
|
56
|
+
return this._errorService.navigateToError(new ResponseError('EntitySet Not Found', 404));
|
|
57
|
+
}
|
|
58
|
+
// get entity type
|
|
59
|
+
const entityType = metadata.EntityType.find(x => {
|
|
60
|
+
return x.Name === entitySet.EntityType;
|
|
61
|
+
});
|
|
62
|
+
if (entityType == null) {
|
|
63
|
+
return this._errorService.navigateToError(new ResponseError('EntityType Not Found', 404));
|
|
64
|
+
}
|
|
65
|
+
if (routeData.searchConfiguration) {
|
|
66
|
+
if (Object.prototype.hasOwnProperty.call(routeData.searchConfiguration, 'allowSave')) {
|
|
67
|
+
this.allowSaveOption = routeData.searchConfiguration.allowSave;
|
|
68
|
+
}
|
|
69
|
+
this.searchConfiguration = routeData.searchConfiguration;
|
|
70
|
+
}
|
|
71
|
+
if (routeData.tableConfiguration) {
|
|
72
|
+
this.tableConfiguration = routeData.tableConfiguration;
|
|
73
|
+
}
|
|
74
|
+
if (routeData.description) {
|
|
75
|
+
this.description = this._translateService.instant(routeData.description);
|
|
76
|
+
}
|
|
77
|
+
if (routeData.longDescription) {
|
|
78
|
+
this.longDescription = this._translateService.instant(routeData.longDescription);
|
|
79
|
+
}
|
|
80
|
+
if (routeData.category) {
|
|
81
|
+
this.category = this._translateService.instant(routeData.category);
|
|
82
|
+
}
|
|
83
|
+
// clone default configuration
|
|
84
|
+
const defaultConfiguration = AdvancedTableConfiguration.cast(this.tableConfiguration, true);
|
|
85
|
+
// correct edit button link
|
|
86
|
+
const column = defaultConfiguration.columns.find(col => {
|
|
87
|
+
return col.formatter === 'ButtonFormatter' && col.formatString === '(modal:edit)';
|
|
88
|
+
});
|
|
89
|
+
if (column) {
|
|
90
|
+
const url = [];
|
|
91
|
+
this._activatedRoute.snapshot.pathFromRoot.forEach(route => {
|
|
92
|
+
url.push.apply(url, route.url);
|
|
93
|
+
});
|
|
94
|
+
column.formatString = `#/${url.join('/')}/(modal:\$\{id\}/edit)`;
|
|
95
|
+
}
|
|
96
|
+
// create list configuration by assigning list entity set
|
|
97
|
+
table.config = Object.assign({
|
|
98
|
+
model: entitySet.Name
|
|
99
|
+
}, defaultConfiguration);
|
|
100
|
+
// fetch data
|
|
101
|
+
table.fetch(true);
|
|
102
|
+
// do reload by using hidden fragment e.g. /classes#reload
|
|
103
|
+
this.reloadSubscription = this._activatedRoute.fragment.subscribe(fragment => {
|
|
104
|
+
if (fragment && fragment === 'reload') {
|
|
105
|
+
this._toastService.show(this.description, this._translateService.instant('Settings.OperationCompleted'));
|
|
106
|
+
table.fetch(true);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
// finally add user activity
|
|
110
|
+
this._userActivityService.setItem({
|
|
111
|
+
category: this.category,
|
|
112
|
+
description: this.description,
|
|
113
|
+
url: window.location.hash.substring(1),
|
|
114
|
+
dateCreated: new Date
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
console.error(err);
|
|
120
|
+
return this._errorService.showError(err);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Data load event handler of advanced table component
|
|
125
|
+
* @param data
|
|
126
|
+
*/
|
|
127
|
+
onDataLoad(data) {
|
|
128
|
+
this.recordsTotal = data.recordsTotal;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Remove selected items
|
|
132
|
+
*/
|
|
133
|
+
remove() {
|
|
134
|
+
const table = this.table;
|
|
135
|
+
if (table && table.selected && table.selected.length) {
|
|
136
|
+
// get items to remove
|
|
137
|
+
const items = table.selected;
|
|
138
|
+
return this._modalService.showWarningDialog(this._translateService.instant('Tables.RemoveItemsTitle'), this._translateService.instant('Tables.RemoveItemsMessage'), DIALOG_BUTTONS.OkCancel).then(result => {
|
|
139
|
+
if (result === 'ok') {
|
|
140
|
+
this._context.model(table.config.model).remove(items).then(() => {
|
|
141
|
+
this._toastService.show(this.description + ':' + this._translateService.instant('Tables.RemoveItemMessage.title'), this._translateService.instant((items.length === 1 ?
|
|
142
|
+
'Tables.RemoveItemMessage.one' : 'Tables.RemoveItemMessage.many'), { value: items.length }));
|
|
143
|
+
table.fetch(true);
|
|
144
|
+
}).catch(err => {
|
|
145
|
+
this._errorService.showError(err, {
|
|
146
|
+
continueLink: '.'
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
AdvancedListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AdvancedListComponent, deps: [{ token: i1.AngularDataContext }, { token: i2.TranslateService }, { token: i3.ActivatedRoute }, { token: i4.ErrorService }, { token: i4.ToastService }, { token: i4.ModalService }, { token: i4.UserActivityService }], target: i0.ɵɵFactoryTarget.Component });
|
|
155
|
+
AdvancedListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AdvancedListComponent, selector: "app-advanced-list", inputs: { entitySet: "entitySet", category: "category", description: "description", longDescription: "longDescription", tableConfiguration: "tableConfiguration", searchConfiguration: "searchConfiguration", allowSaveOption: "allowSaveOption" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true }], ngImport: i0, template: "<div>\n <div class=\"row\" *ngIf=\"description\">\n <div class=\"col-auto\">\n <h2>{{description}}</h2>\n <p *ngIf=\"longDescription\">{{longDescription}}</p>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"searchConfiguration\">\n <div class=\"col-12\" [ngVar]=\"{}\" #filter=\"ngVar\">\n <app-advanced-table-search #advancedSearch [(filter)]=\"filter.value\" [collapsed]=\"true\" [table]=\"table\" [allowSave]=\"allowSaveOption\">\n <advanced-search>\n <app-advanced-search-form [form]=\"searchConfiguration\" (filterChange)=\"advancedSearch.asyncAdvancedSearch()\" #search [(filter)]=\"filter.value\"></app-advanced-search-form>\n </advanced-search>\n </app-advanced-table-search>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-auto mt-4\">\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal && recordsTotal > 1\">\n <span>{{recordsTotal}}</span><span> </span><span [translate]=\"'Tables.Items'\"></span>\n </div>\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal === 1\">\n <span>{{recordsTotal}}</span><span> </span><span [translate]=\"'Tables.Item'\"></span>\n </div>\n </div>\n <div class=\"pull-right ml-auto mr-3 mt-3\">\n <div class=\"font-lg btn-toolbar mt-3\">\n <a *ngIf=\"table && table.selected && table.selected.length\"\n class=\"text-danger text-decoration-none mr-2\" href=\"javascript:void(0)\" (click)=\"remove()\">\n <span>-</span><span> </span><span [translate]=\"'Tables.RemoveItem'\"></span>\n </a>\n <a class=\"text-indigo text-decoration-none\" [routerLink]=\"['.', { outlets:{ modal:'add'} }]\">\n <span>+</span><span> </span><span [translate]=\"'Tables.AddItem'\"></span>\n </a>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-12 mb-4\">\n <app-advanced-table [selectable]=\"true\" #table\n [showFooter]=\"false\"\n (load)=\"onDataLoad($event)\" [height]=\"600\"></app-advanced-table>\n </div>\n </div>\n <router-modal></router-modal>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgVarDirective, selector: "[ngVar]", inputs: ["ngVar"], exportAs: ["ngVar"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.RouterModalComponent, selector: "router-modal", inputs: ["modalTitle", "modalClass", "okButtonText", "okButtonClass", "cancelButtonText", "cancelButtonClass", "yesButtonText", "yesButtonClass", "noButtonText", "noButtonClass", "abortButtonText", "abortButtonClass", "retryButtonText", "retryButtonClass", "ignoreButtonText", "ignoreButtonClass", "previousButtonText", "previousButtonClass", "nextButtonText", "nextButtonClass"] }, { kind: "component", type: i7.AdvancedTableComponent, selector: "app-advanced-table", inputs: ["height", "showActions", "autoLoad", "reload", "scrollable", "serverSide", "lengthMenu", "paging", "pageLength", "columnOrdering", "stateSave", "stateLoadCallback", "stateSaveCallback", "scrollY", "scrollX", "selectable", "multipleSelect", "customSelect", "selected", "configSrc", "config", "showFooter", "showHeader", "showPaging", "query"], outputs: ["load", "init", "select", "draw", "page", "order", "scroll", "selectedItems", "loading"] }, { kind: "component", type: i8.AdvancedTableSearchComponent, selector: "app-advanced-table-search", inputs: ["table", "collapsed", "allowSave", "showMore", "mergeQueryParams"], outputs: ["viewChange", "listChange"] }, { kind: "component", type: i9.AdvancedSearchFormComponent, selector: "app-advanced-search-form", inputs: ["form", "formSrc"], outputs: ["refreshForm", "loading"] }] });
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AdvancedListComponent, decorators: [{
|
|
157
|
+
type: Component,
|
|
158
|
+
args: [{ selector: 'app-advanced-list', template: "<div>\n <div class=\"row\" *ngIf=\"description\">\n <div class=\"col-auto\">\n <h2>{{description}}</h2>\n <p *ngIf=\"longDescription\">{{longDescription}}</p>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"searchConfiguration\">\n <div class=\"col-12\" [ngVar]=\"{}\" #filter=\"ngVar\">\n <app-advanced-table-search #advancedSearch [(filter)]=\"filter.value\" [collapsed]=\"true\" [table]=\"table\" [allowSave]=\"allowSaveOption\">\n <advanced-search>\n <app-advanced-search-form [form]=\"searchConfiguration\" (filterChange)=\"advancedSearch.asyncAdvancedSearch()\" #search [(filter)]=\"filter.value\"></app-advanced-search-form>\n </advanced-search>\n </app-advanced-table-search>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-auto mt-4\">\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal && recordsTotal > 1\">\n <span>{{recordsTotal}}</span><span> </span><span [translate]=\"'Tables.Items'\"></span>\n </div>\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal === 1\">\n <span>{{recordsTotal}}</span><span> </span><span [translate]=\"'Tables.Item'\"></span>\n </div>\n </div>\n <div class=\"pull-right ml-auto mr-3 mt-3\">\n <div class=\"font-lg btn-toolbar mt-3\">\n <a *ngIf=\"table && table.selected && table.selected.length\"\n class=\"text-danger text-decoration-none mr-2\" href=\"javascript:void(0)\" (click)=\"remove()\">\n <span>-</span><span> </span><span [translate]=\"'Tables.RemoveItem'\"></span>\n </a>\n <a class=\"text-indigo text-decoration-none\" [routerLink]=\"['.', { outlets:{ modal:'add'} }]\">\n <span>+</span><span> </span><span [translate]=\"'Tables.AddItem'\"></span>\n </a>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-12 mb-4\">\n <app-advanced-table [selectable]=\"true\" #table\n [showFooter]=\"false\"\n (load)=\"onDataLoad($event)\" [height]=\"600\"></app-advanced-table>\n </div>\n </div>\n <router-modal></router-modal>\n</div>\n" }]
|
|
159
|
+
}], ctorParameters: function () { return [{ type: i1.AngularDataContext }, { type: i2.TranslateService }, { type: i3.ActivatedRoute }, { type: i4.ErrorService }, { type: i4.ToastService }, { type: i4.ModalService }, { type: i4.UserActivityService }]; }, propDecorators: { entitySet: [{
|
|
160
|
+
type: Input,
|
|
161
|
+
args: ['entitySet']
|
|
162
|
+
}], category: [{
|
|
163
|
+
type: Input,
|
|
164
|
+
args: ['category']
|
|
165
|
+
}], description: [{
|
|
166
|
+
type: Input,
|
|
167
|
+
args: ['description']
|
|
168
|
+
}], longDescription: [{
|
|
169
|
+
type: Input,
|
|
170
|
+
args: ['longDescription']
|
|
171
|
+
}], tableConfiguration: [{
|
|
172
|
+
type: Input,
|
|
173
|
+
args: ['tableConfiguration']
|
|
174
|
+
}], searchConfiguration: [{
|
|
175
|
+
type: Input,
|
|
176
|
+
args: ['searchConfiguration']
|
|
177
|
+
}], table: [{
|
|
178
|
+
type: ViewChild,
|
|
179
|
+
args: ['table']
|
|
180
|
+
}], allowSaveOption: [{
|
|
181
|
+
type: Input,
|
|
182
|
+
args: ['allowSaveOption']
|
|
183
|
+
}] } });
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvYWR2YW5jZWQtbGlzdC9hZHZhbmNlZC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hZHZhbmNlZC1saXN0L2FkdmFuY2VkLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWEsS0FBSyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUs5Riw0Q0FBNEM7QUFDNUMsT0FBTyxFQUFtRCwwQkFBMEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pJLE9BQU8sRUFBZ0IsY0FBYyxFQUFxQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7QUFTaEQsTUFBTSxPQUFPLHFCQUFxQjtJQWdCaEMsWUFBb0IsUUFBNEIsRUFDdEMsaUJBQW1DLEVBQ25DLGVBQStCLEVBQy9CLGFBQTJCLEVBQzNCLGFBQTJCLEVBQzNCLGFBQTJCLEVBQzNCLG9CQUF5QztRQU4vQixhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUN0QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUMvQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBUnpCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO0lBUzNDLENBQUM7SUFDUCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdB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LDZZQ2pCbEMsK2xFQThDQTsyRkQ3QmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUVFLG1CQUFtQjt3UkFVVCxTQUFTO3NCQUE1QixLQUFLO3VCQUFDLFdBQVc7Z0JBQ0MsUUFBUTtzQkFBMUIsS0FBSzt1QkFBQyxVQUFVO2dCQUNLLFdBQVc7c0JBQWhDLEtBQUs7dUJBQUMsYUFBYTtnQkFDTSxlQUFlO3NCQUF4QyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFDSyxrQkFBa0I7c0JBQTlDLEtBQUs7dUJBQUMsb0JBQW9CO2dCQUNHLG1CQUFtQjtzQkFBaEQsS0FBSzt1QkFBQyxxQkFBcUI7Z0JBQ1IsS0FBSztzQkFBeEIsU0FBUzt1QkFBQyxPQUFPO2dCQUNRLGVBQWU7c0JBQXhDLEtBQUs7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5ndWxhckRhdGFDb250ZXh0IH0gZnJvbSAnQHRoZW1vc3QvYW5ndWxhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG5pbXBvcnQgeyBBZHZhbmNlZFRhYmxlQ29tcG9uZW50LCBBZHZhbmNlZFRhYmxlRGF0YVJlc3VsdCwgQWR2YW5jZWRUYWJsZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9hZHZhbmNlZC10YWJsZS9hZHZhbmNlZC10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRXJyb3JTZXJ2aWNlLCBESUFMT0dfQlVUVE9OUywgTW9kYWxTZXJ2aWNlLCBVc2VyQWN0aXZpdHlTZXJ2aWNlIH0gZnJvbSAnQHVuaXZlcnNpcy9jb21tb24nO1xuaW1wb3J0IHsgUmVzcG9uc2VFcnJvciB9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5pbXBvcnQgeyBUYWJsZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9hZHZhbmNlZC10YWJsZS9hZHZhbmNlZC10YWJsZS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdhcHAtYWR2YW5jZWQtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZHZhbmNlZC1saXN0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyByZWNvcmRzVG90YWw/OiBudW1iZXI7XG4gIHB1YmxpYyBjb25maWc/OiBUYWJsZUNvbmZpZ3VyYXRpb247XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGRhdGFTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcmVsb2FkU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBASW5wdXQoJ2VudGl0eVNldCcpIGVudGl0eVNldD86IHN0cmluZztcbiAgQElucHV0KCdjYXRlZ29yeScpIGNhdGVnb3J5Pzogc3RyaW5nO1xuICBASW5wdXQoJ2Rlc2NyaXB0aW9uJykgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgnbG9uZ0Rlc2NyaXB0aW9uJykgbG9uZ0Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBASW5wdXQoJ3RhYmxlQ29uZmlndXJhdGlvbicpIHRhYmxlQ29uZmlndXJhdGlvbjogYW55O1xuICBASW5wdXQoJ3NlYXJjaENvbmZpZ3VyYXRpb24nKSBzZWFyY2hDb25maWd1cmF0aW9uOiBhbnk7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJykgdGFibGU/OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50O1xuICBASW5wdXQoJ2FsbG93U2F2ZU9wdGlvbicpIGFsbG93U2F2ZU9wdGlvbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY29udGV4dDogQW5ndWxhckRhdGFDb250ZXh0LFxuICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgX2Vycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3RvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgX21vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3VzZXJBY3Rpdml0eVNlcnZpY2U6IFVzZXJBY3Rpdml0eVNlcnZpY2VcbiAgICApIHsgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlbG9hZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy50YWJsZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZTtcbiAgICAgIC8vIGdldCBtZXRhZGF0YVxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLl9jb250ZXh0LmdldE1ldGFkYXRhKCk7XG4gICAgICAvLyBnZXQgcm91dGUgZGF0YVxuICAgICAgdGhpcy5kYXRhU3Vic2NyaXB0aW9uID0gdGhpcy5fYWN0aXZhdGVkUm91dGUuZGF0YS5zdWJzY3JpYmUoIHJvdXRlRGF0YSA9PiB7XG4gICAgICAgIC8vIGdldCBlbnRpdHlUeXBlXG4gICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXiR7cm91dGVEYXRhLm1vZGVsfSRgLCAnaWcnKTtcbiAgICAgICAgY29uc3QgZW50aXR5U2V0ID0gbWV0YWRhdGEuRW50aXR5Q29udGFpbmVyLkVudGl0eVNldC5maW5kKCB4ID0+IHtcbiAgICAgICAgICByZXR1cm4gcmUudGVzdCh4Lk5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgZW50aXR5IHR5cGUgaXMgbnVsbFxuICAgICAgICBpZiAoZW50aXR5U2V0ID09IG51bGwpIHtcbiAgICAgICAgICAvLyBuYXZpZ2F0ZSB0byBlcnJvclxuICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvclNlcnZpY2UubmF2aWdhdGVUb0Vycm9yKG5ldyBSZXNwb25zZUVycm9yKCdFbnRpdHlTZXQgTm90IEZvdW5kJywgNDA0KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2V0IGVudGl0eSB0eXBlXG4gICAgICAgIGNvbnN0IGVudGl0eVR5cGUgPSBtZXRhZGF0YS5FbnRpdHlUeXBlLmZpbmQoIHggPT4ge1xuICAgICAgICAgIHJldHVybiB4Lk5hbWUgPT09IGVudGl0eVNldC5FbnRpdHlUeXBlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVudGl0eVR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvclNlcnZpY2UubmF2aWdhdGVUb0Vycm9yKG5ldyBSZXNwb25zZUVycm9yKCdFbnRpdHlUeXBlIE5vdCBGb3VuZCcsIDQwNCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZURhdGEuc2VhcmNoQ29uZmlndXJhdGlvbikge1xuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocm91dGVEYXRhLnNlYXJjaENvbmZpZ3VyYXRpb24sICdhbGxvd1NhdmUnKSkge1xuICAgICAgICAgICAgdGhpcy5hbGxvd1NhdmVPcHRpb24gPSByb3V0ZURhdGEuc2VhcmNoQ29uZmlndXJhdGlvbi5hbGxvd1NhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VhcmNoQ29uZmlndXJhdGlvbiA9IHJvdXRlRGF0YS5zZWFyY2hDb25maWd1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZURhdGEudGFibGVDb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNvbmZpZ3VyYXRpb24gPSByb3V0ZURhdGEudGFibGVDb25maWd1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZURhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHJvdXRlRGF0YS5kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlRGF0YS5sb25nRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICB0aGlzLmxvbmdEZXNjcmlwdGlvbiA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChyb3V0ZURhdGEubG9uZ0Rlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGVEYXRhLmNhdGVnb3J5KSB7XG4gICAgICAgICAgdGhpcy5jYXRlZ29yeSA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChyb3V0ZURhdGEuY2F0ZWdvcnkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsb25lIGRlZmF1bHQgY29uZmlndXJhdGlvblxuICAgICAgICBjb25zdCBkZWZhdWx0Q29uZmlndXJhdGlvbiA9IEFkdmFuY2VkVGFibGVDb25maWd1cmF0aW9uLmNhc3QodGhpcy50YWJsZUNvbmZpZ3VyYXRpb24sIHRydWUpO1xuICAgICAgICAvLyBjb3JyZWN0IGVkaXQgYnV0dG9uIGxpbmtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZGVmYXVsdENvbmZpZ3VyYXRpb24uY29sdW1ucy5maW5kKCBjb2wgPT4ge1xuICAgICAgICAgIHJldHVybiBjb2wuZm9ybWF0dGVyID09PSAnQnV0dG9uRm9ybWF0dGVyJyAmJiBjb2wuZm9ybWF0U3RyaW5nID09PSAnKG1vZGFsOmVkaXQpJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICBjb25zdCB1cmw6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXRoRnJvbVJvb3QuZm9yRWFjaCggcm91dGUgPT4ge1xuICAgICAgICAgICAgdXJsLnB1c2guYXBwbHkodXJsLCByb3V0ZS51cmwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbHVtbi5mb3JtYXRTdHJpbmcgPSBgIy8ke3VybC5qb2luKCcvJyl9Lyhtb2RhbDpcXCRcXHtpZFxcfS9lZGl0KWA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY3JlYXRlIGxpc3QgY29uZmlndXJhdGlvbiBieSBhc3NpZ25pbmcgbGlzdCBlbnRpdHkgc2V0XG4gICAgICAgIHRhYmxlLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIG1vZGVsOiBlbnRpdHlTZXQuTmFtZVxuICAgICAgICB9LCBkZWZhdWx0Q29uZmlndXJhdGlvbik7XG4gICAgICAgIC8vIGZldGNoIGRhdGFcbiAgICAgICAgdGFibGUuZmV0Y2godHJ1ZSk7XG4gICAgICAgIC8vIGRvIHJlbG9hZCBieSB1c2luZyBoaWRkZW4gZnJhZ21lbnQgZS5nLiAvY2xhc3NlcyNyZWxvYWRcbiAgICAgICAgdGhpcy5yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5mcmFnbWVudC5zdWJzY3JpYmUoZnJhZ21lbnQgPT4ge1xuICAgICAgICAgIGlmIChmcmFnbWVudCAmJiBmcmFnbWVudCA9PT0gJ3JlbG9hZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3RvYXN0U2VydmljZS5zaG93KFxuICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdTZXR0aW5ncy5PcGVyYXRpb25Db21wbGV0ZWQnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRhYmxlLmZldGNoKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGZpbmFsbHkgYWRkIHVzZXIgYWN0aXZpdHlcbiAgICAgICAgdGhpcy5fdXNlckFjdGl2aXR5U2VydmljZS5zZXRJdGVtKHtcbiAgICAgICAgICBjYXRlZ29yeTogdGhpcy5jYXRlZ29yeSBhcyBzdHJpbmcsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGRhdGVDcmVhdGVkOiBuZXcgRGF0ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yU2VydmljZS5zaG93RXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBEYXRhIGxvYWQgZXZlbnQgaGFuZGxlciBvZiBhZHZhbmNlZCB0YWJsZSBjb21wb25lbnRcbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIG9uRGF0YUxvYWQoZGF0YTogQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQpIHtcbiAgICB0aGlzLnJlY29yZHNUb3RhbCA9IGRhdGEucmVjb3Jkc1RvdGFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBzZWxlY3RlZCBpdGVtc1xuICAgKi9cbiAgcmVtb3ZlKCkge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZTtcbiAgICBpZiAodGFibGUgJiYgdGFibGUuc2VsZWN0ZWQgJiYgdGFibGUuc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgaXRlbXMgdG8gcmVtb3ZlXG4gICAgICBjb25zdCBpdGVtcyA9IHRhYmxlLnNlbGVjdGVkO1xuICAgICAgcmV0dXJuIHRoaXMuX21vZGFsU2VydmljZS5zaG93V2FybmluZ0RpYWxvZyhcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuUmVtb3ZlSXRlbXNUaXRsZScpLFxuICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5SZW1vdmVJdGVtc01lc3NhZ2UnKSxcbiAgICAgICAgRElBTE9HX0JVVFRPTlMuT2tDYW5jZWwpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAnb2snKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0Lm1vZGVsKHRhYmxlLmNvbmZpZy5tb2RlbCkucmVtb3ZlKGl0ZW1zKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiArICc6JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLlJlbW92ZUl0ZW1NZXNzYWdlLnRpdGxlJyksXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KChpdGVtcy5sZW5ndGggPT09IDEgP1xuICAgICAgICAgICAgICAgICAgJ1RhYmxlcy5SZW1vdmVJdGVtTWVzc2FnZS5vbmUnIDogJ1RhYmxlcy5SZW1vdmVJdGVtTWVzc2FnZS5tYW55JylcbiAgICAgICAgICAgICAgICAgICwgeyB2YWx1ZTogaXRlbXMubGVuZ3RoIH0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRhYmxlLmZldGNoKHRydWUpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLnNob3dFcnJvcihlcnIsIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZUxpbms6ICcuJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2PlxuICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJkZXNjcmlwdGlvblwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxuICAgICAgPGgyPnt7ZGVzY3JpcHRpb259fTwvaDI+XG4gICAgICA8cCAqbmdJZj1cImxvbmdEZXNjcmlwdGlvblwiPnt7bG9uZ0Rlc2NyaXB0aW9ufX08L3A+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJzZWFyY2hDb25maWd1cmF0aW9uXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiIFtuZ1Zhcl09XCJ7fVwiICNmaWx0ZXI9XCJuZ1ZhclwiPlxuICAgICAgPGFwcC1hZHZhbmNlZC10YWJsZS1zZWFyY2ggI2FkdmFuY2VkU2VhcmNoIFsoZmlsdGVyKV09XCJmaWx0ZXIudmFsdWVcIiBbY29sbGFwc2VkXT1cInRydWVcIiBbdGFibGVdPVwidGFibGVcIiBbYWxsb3dTYXZlXT1cImFsbG93U2F2ZU9wdGlvblwiPlxuICAgICAgICA8YWR2YW5jZWQtc2VhcmNoPlxuICAgICAgICAgIDxhcHAtYWR2YW5jZWQtc2VhcmNoLWZvcm0gW2Zvcm1dPVwic2VhcmNoQ29uZmlndXJhdGlvblwiIChmaWx0ZXJDaGFuZ2UpPVwiYWR2YW5jZWRTZWFyY2guYXN5bmNBZHZhbmNlZFNlYXJjaCgpXCIgI3NlYXJjaCBbKGZpbHRlcildPVwiZmlsdGVyLnZhbHVlXCI+PC9hcHAtYWR2YW5jZWQtc2VhcmNoLWZvcm0+XG4gICAgICAgIDwvYWR2YW5jZWQtc2VhcmNoPlxuICAgICAgPC9hcHAtYWR2YW5jZWQtdGFibGUtc2VhcmNoPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBtdC00XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9udC14bCB0ZXh0LXNlY29uZGFyeVwiICpuZ0lmPVwicmVjb3Jkc1RvdGFsICYmIHJlY29yZHNUb3RhbCA+IDFcIj5cbiAgICAgICAgPHNwYW4+e3tyZWNvcmRzVG90YWx9fTwvc3Bhbj48c3Bhbj4mbmJzcDs8L3NwYW4+PHNwYW4gW3RyYW5zbGF0ZV09XCInVGFibGVzLkl0ZW1zJ1wiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZvbnQteGwgdGV4dC1zZWNvbmRhcnlcIiAqbmdJZj1cInJlY29yZHNUb3RhbCA9PT0gMVwiPlxuICAgICAgICA8c3Bhbj57e3JlY29yZHNUb3RhbH19PC9zcGFuPjxzcGFuPiZuYnNwOzwvc3Bhbj48c3BhbiBbdHJhbnNsYXRlXT1cIidUYWJsZXMuSXRlbSdcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodCBtbC1hdXRvIG1yLTMgbXQtM1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvbnQtbGcgYnRuLXRvb2xiYXIgbXQtM1wiPlxuICAgICAgICA8YSAqbmdJZj1cInRhYmxlICYmIHRhYmxlLnNlbGVjdGVkICYmIHRhYmxlLnNlbGVjdGVkLmxlbmd0aFwiXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlciB0ZXh0LWRlY29yYXRpb24tbm9uZSBtci0yXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIChjbGljayk9XCJyZW1vdmUoKVwiPlxuICAgICAgICAgIDxzcGFuPi08L3NwYW4+PHNwYW4+Jm5ic3A7PC9zcGFuPjxzcGFuIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5SZW1vdmVJdGVtJ1wiPjwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgICAgICA8YSBjbGFzcz1cInRleHQtaW5kaWdvIHRleHQtZGVjb3JhdGlvbi1ub25lXCIgW3JvdXRlckxpbmtdPVwiWycuJywgeyBvdXRsZXRzOnsgbW9kYWw6J2FkZCd9IH1dXCI+XG4gICAgICAgICAgPHNwYW4+Kzwvc3Bhbj48c3Bhbj4mbmJzcDs8L3NwYW4+PHNwYW4gW3RyYW5zbGF0ZV09XCInVGFibGVzLkFkZEl0ZW0nXCI+PC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTRcIj5cbiAgICAgIDxhcHAtYWR2YW5jZWQtdGFibGUgW3NlbGVjdGFibGVdPVwidHJ1ZVwiICN0YWJsZVxuICAgICAgW3Nob3dGb290ZXJdPVwiZmFsc2VcIlxuICAgICAgKGxvYWQpPVwib25EYXRhTG9hZCgkZXZlbnQpXCIgW2hlaWdodF09XCI2MDBcIj48L2FwcC1hZHZhbmNlZC10YWJsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxyb3V0ZXItbW9kYWw+PC9yb3V0ZXItbW9kYWw+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { Component, Input, EventEmitter, ViewChild, ViewEncapsulation, Output } from '@angular/core';
|
|
2
|
+
import { RouterModalOkCancel } from '@universis/common/routing';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/router";
|
|
5
|
+
import * as i2 from "@ngx-translate/core";
|
|
6
|
+
import * as i3 from "@universis/common";
|
|
7
|
+
import * as i4 from "@angular/common";
|
|
8
|
+
import * as i5 from "@universis/forms";
|
|
9
|
+
import * as i6 from "ngx-bootstrap/progressbar";
|
|
10
|
+
;
|
|
11
|
+
export class AdvancedRowActionComponent extends RouterModalOkCancel {
|
|
12
|
+
constructor(router, activatedRoute, _translateService, _modalService) {
|
|
13
|
+
super(router, activatedRoute);
|
|
14
|
+
this._translateService = _translateService;
|
|
15
|
+
this._modalService = _modalService;
|
|
16
|
+
this.modalIcon = 'fas fa-project-diagram';
|
|
17
|
+
this.progressType = 'indigo';
|
|
18
|
+
this.errorMessage = 'Tables.Actions.CompletedWithErrors';
|
|
19
|
+
this.loading = false;
|
|
20
|
+
this.refresh = new EventEmitter();
|
|
21
|
+
this.progressValue = 0;
|
|
22
|
+
// set modal size
|
|
23
|
+
this.modalClass = 'modal-lg';
|
|
24
|
+
// set modal title
|
|
25
|
+
this.modalTitle = 'Tables.Actions.Label';
|
|
26
|
+
// disable ok button
|
|
27
|
+
this.okButtonDisabled = false;
|
|
28
|
+
// set button text
|
|
29
|
+
this.okButtonText = 'Tables.Actions.Start';
|
|
30
|
+
}
|
|
31
|
+
get form() {
|
|
32
|
+
return this.formComponent;
|
|
33
|
+
}
|
|
34
|
+
ngAfterViewInit() {
|
|
35
|
+
this.refreshSubscription = this.refresh.subscribe((value) => {
|
|
36
|
+
if (this.progressComponent == null) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (value && value.progress) {
|
|
40
|
+
let progress = 0;
|
|
41
|
+
if (value.progress < 0) {
|
|
42
|
+
progress = 0;
|
|
43
|
+
}
|
|
44
|
+
else if (value.progress > 100) {
|
|
45
|
+
progress = 100;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
progress = value.progress;
|
|
49
|
+
}
|
|
50
|
+
this.progressValue = progress;
|
|
51
|
+
this.showProgress();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
if (this.formComponent && this.formComponent.form) {
|
|
55
|
+
this.okButtonDisabled = true;
|
|
56
|
+
this.invalidSubscription = this.formComponent.form.change.subscribe((event) => {
|
|
57
|
+
if (Object.prototype.hasOwnProperty.call(event, 'isValid') && (event.changed != null)) {
|
|
58
|
+
this.okButtonDisabled = !event.isValid;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
ngOnDestroy() {
|
|
64
|
+
if (this.refreshSubscription) {
|
|
65
|
+
this.refreshSubscription.unsubscribe();
|
|
66
|
+
}
|
|
67
|
+
if (this.executeSubscription) {
|
|
68
|
+
this.executeSubscription.unsubscribe();
|
|
69
|
+
}
|
|
70
|
+
if (this.invalidSubscription) {
|
|
71
|
+
this.invalidSubscription.unsubscribe();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
cancel() {
|
|
75
|
+
if (this.loading) {
|
|
76
|
+
return Promise.resolve();
|
|
77
|
+
}
|
|
78
|
+
// close
|
|
79
|
+
if (this._modalService.modalRef) {
|
|
80
|
+
return this._modalService.modalRef.hide();
|
|
81
|
+
}
|
|
82
|
+
return Promise.resolve();
|
|
83
|
+
}
|
|
84
|
+
async ok() {
|
|
85
|
+
try {
|
|
86
|
+
if (this.execute == null) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
this.loading = true;
|
|
90
|
+
this.lastError = null;
|
|
91
|
+
if (this.formComponent && this.formComponent.form &&
|
|
92
|
+
this.formComponent.form.formio && this.formComponent.form.formio.data) {
|
|
93
|
+
// set data
|
|
94
|
+
this.data = this.formComponent.form.formio.data;
|
|
95
|
+
}
|
|
96
|
+
// do action
|
|
97
|
+
this.execute.subscribe((result) => {
|
|
98
|
+
this.loading = false;
|
|
99
|
+
this.refresh.emit({
|
|
100
|
+
progress: 100
|
|
101
|
+
});
|
|
102
|
+
if (result && result.errors && result.errors > 0) {
|
|
103
|
+
// show message for partial success
|
|
104
|
+
if (result.errors === 1) {
|
|
105
|
+
this.lastError = new Error(this._translateService.instant(`${this.errorMessage}.Description.One`));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.lastError = new Error(this._translateService.instant(`${this.errorMessage}.Description.Many`, result));
|
|
109
|
+
}
|
|
110
|
+
this.refresh.emit({
|
|
111
|
+
progress: 1
|
|
112
|
+
});
|
|
113
|
+
this.hideProgress();
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (this._modalService.modalRef) {
|
|
117
|
+
this._modalService.modalRef.hide();
|
|
118
|
+
}
|
|
119
|
+
}, (err) => {
|
|
120
|
+
this.loading = false;
|
|
121
|
+
this.lastError = err;
|
|
122
|
+
this.refresh.emit({
|
|
123
|
+
progress: 0
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
this.loading = false;
|
|
129
|
+
this.lastError = err;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
showProgress() {
|
|
133
|
+
if (this.progressContainer) {
|
|
134
|
+
this.progressContainer.nativeElement.classList.replace('invisible', 'visible');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
hideProgress() {
|
|
138
|
+
if (this.progressContainer) {
|
|
139
|
+
this.progressContainer.nativeElement.classList.replace('visible', 'invisible');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
AdvancedRowActionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AdvancedRowActionComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.TranslateService }, { token: i3.ModalService }], target: i0.ɵɵFactoryTarget.Component });
|
|
144
|
+
AdvancedRowActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AdvancedRowActionComponent, selector: "app-advanced-row-action", inputs: { items: "items", modalIcon: "modalIcon", description: "description", formTemplate: "formTemplate", progressType: "progressType", additionalMessage: "additionalMessage", errorMessage: "errorMessage", refresh: "refresh", execute: "execute" }, outputs: { data: "data" }, viewQueries: [{ propertyName: "progressComponent", first: true, predicate: ["progress"], descendants: true }, { propertyName: "progressContainer", first: true, predicate: ["progressContainer"], descendants: true }, { propertyName: "formComponent", first: true, predicate: ["formComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div>\n <div class=\"modal-header\" *ngIf=\"modalTitle\">\n <h5 class=\"modal-title\">{{modalTitle | translate}}</h5>\n <button (click)=\"cancel()\" [disabled]=\"loading\"\n type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Cancel\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body pt-0 mt-2 pb-0\">\n <div class=\"row\" *ngIf=\"lastError\">\n <div class=\"col-12\">\n <div class=\"alert alert-warning\" role=\"alert\">\n <span>{{ 'Tables.Actions.CompletedWithErrors.Title' | translate }}</span><br>\n <small *ngIf=\"lastError.status >= 0\" [translate]=\"'E' + lastError.status + '.message'\"></small>\n <small *ngIf=\"lastError.status == null\">{{lastError.message}}</small>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"description\">\n <div class=\"col-12 mb-3\">\n <div class=\"text-justify\">\n {{description | translate}}\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-12\">\n <div *ngIf=\"items && items.length > 1\" [translate]=\"'Tables.Actions.ActionMessage.Many'\" [translateParams]=\"items\"></div>\n <div *ngIf=\"items && items.length === 1\" [translate]=\"'Tables.Actions.ActionMessage.One'\"></div>\n <div class=\"font-weight-bold text-danger\" *ngIf=\"items && items.length <= 0\" [translate]=\"'Tables.Actions.ActionMessage.None'\"></div>\n <div class=\"pt-2 font-weight-bold text-danger\" *ngIf=\"additionalMessage && items && items.length <= 0\">{{additionalMessage}}</div>\n </div>\n </div>\n <div class=\"row pt-3\" *ngIf=\"formTemplate\">\n <div class=\"col-12 mb-3\">\n <div>\n <advanced-form-edit #formComponent [formName]=\"formTemplate\" [(data)]=\"data\"></advanced-form-edit>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-3\">\n <div class=\"col-12 invisible\" #progressContainer>\n <progressbar #progress [value]=\"progressValue\" [type]=\"progressType\" [max]=\"100\">\n </progressbar>\n </div>\n </div>\n </div>\n\n <div class=\"modal-footer justify-content-end\">\n <button [disabled]=\"okButtonDisabled || loading || (items && items.length === 0)\" (click)=\"ok()\"\n type=\"button\" [ngClass]=\"okButtonClass\">\n {{okButtonText | translate}}\n </button>\n <button [disabled]=\"cancelButtonDisabled || loading\"\n (click)=\"cancel()\" type=\"button\" [ngClass]=\"cancelButtonClass\" data-dismiss=\"modal\">\n {{cancelButtonText | translate}}\n </button>\n </div>\n</div>\n", styles: [".fa-1_5x{font-size:1.5rem}.form-control:disabled,.form-control[readonly]{background-color:inherit}.form-check.checkbox{position:relative}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i5.AdvancedFormComponent, selector: "advanced-form-edit", inputs: ["data", "formName", "formConfig"], outputs: ["dataChange", "refreshForm", "customEvent", "formSubmitted"] }, { kind: "component", type: i6.ProgressbarComponent, selector: "progressbar", inputs: ["max", "animate", "striped", "type", "value"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
|
|
145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AdvancedRowActionComponent, decorators: [{
|
|
146
|
+
type: Component,
|
|
147
|
+
args: [{ selector: 'app-advanced-row-action', encapsulation: ViewEncapsulation.None, template: "<div>\n <div class=\"modal-header\" *ngIf=\"modalTitle\">\n <h5 class=\"modal-title\">{{modalTitle | translate}}</h5>\n <button (click)=\"cancel()\" [disabled]=\"loading\"\n type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Cancel\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body pt-0 mt-2 pb-0\">\n <div class=\"row\" *ngIf=\"lastError\">\n <div class=\"col-12\">\n <div class=\"alert alert-warning\" role=\"alert\">\n <span>{{ 'Tables.Actions.CompletedWithErrors.Title' | translate }}</span><br>\n <small *ngIf=\"lastError.status >= 0\" [translate]=\"'E' + lastError.status + '.message'\"></small>\n <small *ngIf=\"lastError.status == null\">{{lastError.message}}</small>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"description\">\n <div class=\"col-12 mb-3\">\n <div class=\"text-justify\">\n {{description | translate}}\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-12\">\n <div *ngIf=\"items && items.length > 1\" [translate]=\"'Tables.Actions.ActionMessage.Many'\" [translateParams]=\"items\"></div>\n <div *ngIf=\"items && items.length === 1\" [translate]=\"'Tables.Actions.ActionMessage.One'\"></div>\n <div class=\"font-weight-bold text-danger\" *ngIf=\"items && items.length <= 0\" [translate]=\"'Tables.Actions.ActionMessage.None'\"></div>\n <div class=\"pt-2 font-weight-bold text-danger\" *ngIf=\"additionalMessage && items && items.length <= 0\">{{additionalMessage}}</div>\n </div>\n </div>\n <div class=\"row pt-3\" *ngIf=\"formTemplate\">\n <div class=\"col-12 mb-3\">\n <div>\n <advanced-form-edit #formComponent [formName]=\"formTemplate\" [(data)]=\"data\"></advanced-form-edit>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-3\">\n <div class=\"col-12 invisible\" #progressContainer>\n <progressbar #progress [value]=\"progressValue\" [type]=\"progressType\" [max]=\"100\">\n </progressbar>\n </div>\n </div>\n </div>\n\n <div class=\"modal-footer justify-content-end\">\n <button [disabled]=\"okButtonDisabled || loading || (items && items.length === 0)\" (click)=\"ok()\"\n type=\"button\" [ngClass]=\"okButtonClass\">\n {{okButtonText | translate}}\n </button>\n <button [disabled]=\"cancelButtonDisabled || loading\"\n (click)=\"cancel()\" type=\"button\" [ngClass]=\"cancelButtonClass\" data-dismiss=\"modal\">\n {{cancelButtonText | translate}}\n </button>\n </div>\n</div>\n", styles: [".fa-1_5x{font-size:1.5rem}.form-control:disabled,.form-control[readonly]{background-color:inherit}.form-check.checkbox{position:relative}\n"] }]
|
|
148
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.TranslateService }, { type: i3.ModalService }]; }, propDecorators: { items: [{
|
|
149
|
+
type: Input
|
|
150
|
+
}], modalIcon: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], description: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], formTemplate: [{
|
|
155
|
+
type: Input
|
|
156
|
+
}], progressType: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], data: [{
|
|
159
|
+
type: Output
|
|
160
|
+
}], additionalMessage: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], errorMessage: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], progressComponent: [{
|
|
165
|
+
type: ViewChild,
|
|
166
|
+
args: ['progress']
|
|
167
|
+
}], progressContainer: [{
|
|
168
|
+
type: ViewChild,
|
|
169
|
+
args: ['progressContainer']
|
|
170
|
+
}], formComponent: [{
|
|
171
|
+
type: ViewChild,
|
|
172
|
+
args: ['formComponent']
|
|
173
|
+
}], refresh: [{
|
|
174
|
+
type: Input
|
|
175
|
+
}], execute: [{
|
|
176
|
+
type: Input
|
|
177
|
+
}] } });
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtcm93LWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvYWR2YW5jZWQtcm93LWFjdGlvbi9hZHZhbmNlZC1yb3ctYWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hZHZhbmNlZC1yb3ctYWN0aW9uL2FkdmFuY2VkLXJvdy1hY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBcUIsS0FBSyxFQUFFLFlBQVksRUFDckQsU0FBUyxFQUFjLGlCQUFpQixFQUFpQixNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFJMUYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7O0FBRlAsQ0FBQztBQTBCeEQsTUFBTSxPQUFPLDBCQUEyQixTQUFRLG1CQUFtQjtJQXdCL0QsWUFBWSxNQUFjLEVBQ2QsY0FBOEIsRUFDdEIsaUJBQW1DLEVBQ25DLGFBQTJCO1FBQzNDLEtBQUssQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFGZCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBckJ0QyxjQUFTLEdBQUcsd0JBQXdCLENBQUM7UUFHckMsaUJBQVksR0FBMkIsUUFBUSxDQUFDO1FBR2hELGlCQUFZLEdBQUcsb0NBQW9DLENBQUM7UUFFdEQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUlkLFlBQU8sR0FBUSxJQUFJLFlBQVksRUFBTyxDQUFDO1FBSWhELGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBT3RCLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxzQkFBc0Is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WTtzQkFBcEIsS0FBSztnQkFDSSxJQUFJO3NCQUFiLE1BQU07Z0JBQ0UsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR2lCLGlCQUFpQjtzQkFBdkMsU0FBUzt1QkFBQyxVQUFVO2dCQUNXLGlCQUFpQjtzQkFBaEQsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ0YsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNqQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgRXZlbnRFbWl0dGVyLFxuICAgIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgVmlld0VuY2Fwc3VsYXRpb24sIEFmdGVyVmlld0luaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInOztcbmltcG9ydCB7TW9kYWxTZXJ2aWNlfSBmcm9tICdAdW5pdmVyc2lzL2NvbW1vbic7XG5pbXBvcnQge1JvdXRlck1vZGFsT2tDYW5jZWx9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uL3JvdXRpbmcnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtBZHZhbmNlZEZvcm1Db21wb25lbnR9IGZyb20gJ0B1bml2ZXJzaXMvZm9ybXMnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NiYXJDb21wb25lbnQsIFByb2dyZXNzYmFyVHlwZSB9IGZyb20gJ25neC1ib290c3RyYXAvcHJvZ3Jlc3NiYXInO1xuXG5AQ29tcG9uZW50KHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdhcHAtYWR2YW5jZWQtcm93LWFjdGlvbicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLXJvdy1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgIC5mYS0xXzV4IHtcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgICAgICB9XG4gICAgICAgIC5mb3JtLWNvbnRyb2w6ZGlzYWJsZWQsIC5mb3JtLWNvbnRyb2xbcmVhZG9ubHldIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIH1cbiAgICAgICAgLmZvcm0tY2hlY2suY2hlY2tib3gge1xuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZVxuICAgICAgICB9XG4gICAgICAgIGBcbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRSb3dBY3Rpb25Db21wb25lbnQgZXh0ZW5kcyBSb3V0ZXJNb2RhbE9rQ2FuY2VsIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBpbnZhbGlkU3Vic2NyaXB0aW9uOiBhbnk7XG5cblxuICAgIEBJbnB1dCgpIGl0ZW1zOiBhbnk7XG4gICAgQElucHV0KCkgbW9kYWxJY29uID0gJ2ZhcyBmYS1wcm9qZWN0LWRpYWdyYW0nO1xuICAgIEBJbnB1dCgpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGZvcm1UZW1wbGF0ZT86IHN0cmluZztcbiAgICBASW5wdXQoKSBwcm9ncmVzc1R5cGUgOiBQcm9ncmVzc2JhclR5cGUgfCBhbnkgPSAnaW5kaWdvJztcbiAgICBAT3V0cHV0KCkgZGF0YTogYW55O1xuICAgIEBJbnB1dCgpIGFkZGl0aW9uYWxNZXNzYWdlPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVycm9yTWVzc2FnZSA9ICdUYWJsZXMuQWN0aW9ucy5Db21wbGV0ZWRXaXRoRXJyb3JzJztcbiAgICBwdWJsaWMgbGFzdEVycm9yOiBhbnk7XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBAVmlld0NoaWxkKCdwcm9ncmVzcycpIHByb2dyZXNzQ29tcG9uZW50PzogUHJvZ3Jlc3NiYXJDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgncHJvZ3Jlc3NDb250YWluZXInKSBwcm9ncmVzc0NvbnRhaW5lcj86IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnZm9ybUNvbXBvbmVudCcpIGZvcm1Db21wb25lbnQ/OiBBZHZhbmNlZEZvcm1Db21wb25lbnQ7XG4gICAgQElucHV0KCkgcmVmcmVzaDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQElucHV0KCkgZXhlY3V0ZT86IE9ic2VydmFibGU8YW55PjtcbiAgICBwcml2YXRlIHJlZnJlc2hTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBleGVjdXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByb2dyZXNzVmFsdWU6IG51bWJlciA9IDA7XG5cbiAgICBjb25zdHJ1Y3Rvcihyb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgICAgICAgICBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9tb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSkge1xuICAgICAgICBzdXBlcihyb3V0ZXIsIGFjdGl2YXRlZFJvdXRlKTtcbiAgICAgICAgLy8gc2V0IG1vZGFsIHNpemVcbiAgICAgICAgdGhpcy5tb2RhbENsYXNzID0gJ21vZGFsLWxnJztcbiAgICAgICAgLy8gc2V0IG1vZGFsIHRpdGxlXG4gICAgICAgIHRoaXMubW9kYWxUaXRsZSA9ICdUYWJsZXMuQWN0aW9ucy5MYWJlbCc7XG4gICAgICAgIC8vIGRpc2FibGUgb2sgYnV0dG9uXG4gICAgICAgIHRoaXMub2tCdXR0b25EaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAvLyBzZXQgYnV0dG9uIHRleHRcbiAgICAgICAgdGhpcy5va0J1dHRvblRleHQgPSAnVGFibGVzLkFjdGlvbnMuU3RhcnQnO1xuICAgIH1cblxuICAgIGdldCBmb3JtKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudDtcbiAgICB9XG4gICAgXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMucmVmcmVzaFN1YnNjcmlwdGlvbiA9IHRoaXMucmVmcmVzaC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9ncmVzc0NvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gMDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUucHJvZ3Jlc3MgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnByb2dyZXNzID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gMTAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gdmFsdWUucHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NWYWx1ZSA9IHByb2dyZXNzO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1Byb2dyZXNzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5mb3JtQ29tcG9uZW50ICYmIHRoaXMuZm9ybUNvbXBvbmVudC5mb3JtKSB7XG4gICAgICAgIHRoaXMub2tCdXR0b25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW52YWxpZFN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybUNvbXBvbmVudC5mb3JtLmNoYW5nZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChldmVudCwgJ2lzVmFsaWQnKSAmJiAoZXZlbnQuY2hhbmdlZCAhPSBudWxsKSkge1xuICAgICAgICAgICAgICB0aGlzLm9rQnV0dG9uRGlzYWJsZWQgPSAhZXZlbnQuaXNWYWxpZDtcbiAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVmcmVzaFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW52YWxpZFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYW5jZWwoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsb3NlXG4gICAgICAgIGlmICh0aGlzLl9tb2RhbFNlcnZpY2UubW9kYWxSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiAgdGhpcy5fbW9kYWxTZXJ2aWNlLm1vZGFsUmVmLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb2soKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5leGVjdXRlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUNvbXBvbmVudCAmJiB0aGlzLmZvcm1Db21wb25lbnQuZm9ybSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbXBvbmVudC5mb3JtLmZvcm1pbyAmJiB0aGlzLmZvcm1Db21wb25lbnQuZm9ybS5mb3JtaW8uZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5mb3JtQ29tcG9uZW50LmZvcm0uZm9ybWlvLmRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkbyBhY3Rpb25cbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IDEwMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmVycm9ycyAmJiByZXN1bHQuZXJyb3JzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzaG93IG1lc3NhZ2UgZm9yIHBhcnRpYWwgc3VjY2Vzc1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9ycyA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3IgPSBuZXcgRXJyb3IodGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuZXJyb3JNZXNzYWdlfS5EZXNjcmlwdGlvbi5PbmVgKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFcnJvciA9IG5ldyBFcnJvcih0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuZXJyb3JNZXNzYWdlfS5EZXNjcmlwdGlvbi5NYW55YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2guZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzczogMVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlUHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbW9kYWxTZXJ2aWNlLm1vZGFsUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGFsU2VydmljZS5tb2RhbFJlZi5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IDBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3IgPSBlcnI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93UHJvZ3Jlc3MoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2dyZXNzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlcGxhY2UoJ2ludmlzaWJsZScsICd2aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoaWRlUHJvZ3Jlc3MoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2dyZXNzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlcGxhY2UoJ3Zpc2libGUnLCAnaW52aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIiAqbmdJZj1cIm1vZGFsVGl0bGVcIj5cbiAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj57e21vZGFsVGl0bGUgfCB0cmFuc2xhdGV9fTwvaDU+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cImxvYWRpbmdcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2FuY2VsXCI+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBwdC0wIG10LTIgcGItMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJsYXN0RXJyb3JcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAnVGFibGVzLkFjdGlvbnMuQ29tcGxldGVkV2l0aEVycm9ycy5UaXRsZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+PGJyPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJsYXN0RXJyb3Iuc3RhdHVzID49IDBcIiBbdHJhbnNsYXRlXT1cIidFJyArIGxhc3RFcnJvci5zdGF0dXMgKyAnLm1lc3NhZ2UnXCI+PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwibGFzdEVycm9yLnN0YXR1cyA9PSBudWxsXCI+e3tsYXN0RXJyb3IubWVzc2FnZX19PC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtanVzdGlmeVwiPlxuICAgICAgICAgICAgICAgICAge3tkZXNjcmlwdGlvbiB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAxXCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkFjdGlvbnMuQWN0aW9uTWVzc2FnZS5NYW55J1wiICBbdHJhbnNsYXRlUGFyYW1zXT1cIml0ZW1zXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW1zICYmIGl0ZW1zLmxlbmd0aCA9PT0gMVwiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5BY3Rpb25zLkFjdGlvbk1lc3NhZ2UuT25lJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXdlaWdodC1ib2xkIHRleHQtZGFuZ2VyXCIgKm5nSWY9XCJpdGVtcyAmJiBpdGVtcy5sZW5ndGggPD0gMFwiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5BY3Rpb25zLkFjdGlvbk1lc3NhZ2UuTm9uZSdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTIgZm9udC13ZWlnaHQtYm9sZCB0ZXh0LWRhbmdlclwiICpuZ0lmPVwiYWRkaXRpb25hbE1lc3NhZ2UgJiYgaXRlbXMgJiYgaXRlbXMubGVuZ3RoIDw9IDBcIj57e2FkZGl0aW9uYWxNZXNzYWdlfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHQtM1wiICpuZ0lmPVwiZm9ybVRlbXBsYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItM1wiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8YWR2YW5jZWQtZm9ybS1lZGl0ICNmb3JtQ29tcG9uZW50IFtmb3JtTmFtZV09XCJmb3JtVGVtcGxhdGVcIiBbKGRhdGEpXT1cImRhdGFcIj48L2FkdmFuY2VkLWZvcm0tZWRpdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGludmlzaWJsZVwiICNwcm9ncmVzc0NvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHByb2dyZXNzYmFyICNwcm9ncmVzcyBbdmFsdWVdPVwicHJvZ3Jlc3NWYWx1ZVwiIFt0eXBlXT1cInByb2dyZXNzVHlwZVwiIFttYXhdPVwiMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvcHJvZ3Jlc3NiYXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyIGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwib2tCdXR0b25EaXNhYmxlZCB8fCBsb2FkaW5nIHx8IChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPT09IDApXCIgKGNsaWNrKT1cIm9rKClcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBbbmdDbGFzc109XCJva0J1dHRvbkNsYXNzXCI+XG4gICAgICAgICAgICB7e29rQnV0dG9uVGV4dCB8IHRyYW5zbGF0ZX19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJjYW5jZWxCdXR0b25EaXNhYmxlZCB8fCBsb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsKClcIiAgdHlwZT1cImJ1dHRvblwiIFtuZ0NsYXNzXT1cImNhbmNlbEJ1dHRvbkNsYXNzXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cbiAgICAgICAgICAgIHt7Y2FuY2VsQnV0dG9uVGV4dCB8IHRyYW5zbGF0ZX19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|