@rosoftlab/ionic 1.0.0-alpha-5 → 1.0.0-alpha-7
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/esm2022/lib/rsl-ionic-module.module.mjs +4 -1
- package/esm2022/lib/types/repeat-datatable/repeat-datatable.component.mjs +190 -0
- package/fesm2022/rosoftlab-ionic.mjs +183 -7
- package/fesm2022/rosoftlab-ionic.mjs.map +1 -1
- package/lib/types/repeat-datatable/repeat-datatable.component.d.ts +60 -0
- package/package.json +4 -4
@@ -9,6 +9,7 @@ import { NgxDatatableModule } from '@swimlane/ngx-datatable';
|
|
9
9
|
import { RslIonicSmButtonsComponent } from './components/rsl-ionic-sm-buttons/ionic-sm-buttons.component';
|
10
10
|
import { IonicDialogService } from './ionic-dialog.service';
|
11
11
|
import { registerTranslateExtension } from './translate.extension';
|
12
|
+
import { RepeatDatatableComponent } from './types/repeat-datatable/repeat-datatable.component';
|
12
13
|
import { RepeatTypeComponent } from './types/repeat/repeat-section.type';
|
13
14
|
import { fieldMatchValidator } from './validators/must-match';
|
14
15
|
import { AccordionWrapperComponent } from './wrappers/accordion-wrapper.component';
|
@@ -41,6 +42,7 @@ export class RslIonicModuleModule {
|
|
41
42
|
FormlyModule.forRoot({
|
42
43
|
types: [
|
43
44
|
{ name: 'repeat', component: RepeatTypeComponent },
|
45
|
+
{ name: 'repeat-data-table', component: RepeatDatatableComponent },
|
44
46
|
{ name: 'sm-buttons', component: RslIonicSmButtonsComponent }
|
45
47
|
],
|
46
48
|
validators: [{ name: 'fieldMatch', validation: fieldMatchValidator }],
|
@@ -67,6 +69,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.10", ngImpo
|
|
67
69
|
FormlyModule.forRoot({
|
68
70
|
types: [
|
69
71
|
{ name: 'repeat', component: RepeatTypeComponent },
|
72
|
+
{ name: 'repeat-data-table', component: RepeatDatatableComponent },
|
70
73
|
{ name: 'sm-buttons', component: RslIonicSmButtonsComponent }
|
71
74
|
],
|
72
75
|
validators: [{ name: 'fieldMatch', validation: fieldMatchValidator }],
|
@@ -90,4 +93,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.10", ngImpo
|
|
90
93
|
],
|
91
94
|
}]
|
92
95
|
}] });
|
93
|
-
//# sourceMappingURL=data:application/json;base64,
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNsLWlvbmljLW1vZHVsZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yb3NvZnRsYWIvaW9uaWMvc3JjL2xpYi9yc2wtaW9uaWMtbW9kdWxlLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDMUcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDL0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9D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O3dCQUNQLEdBQUcsY0FBYzt3QkFDakIsWUFBWTt3QkFDWixlQUFlO3FCQUNoQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbmljTW9kdWxlIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgRk9STUxZX0NPTkZJRywgRm9ybWx5TW9kdWxlIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBGb3JtbHlJb25pY01vZHVsZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2lvbmljJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTmd4RGF0YXRhYmxlTW9kdWxlIH0gZnJvbSAnQHN3aW1sYW5lL25neC1kYXRhdGFibGUnO1xuaW1wb3J0IHsgUnNsSW9uaWNTbUJ1dHRvbnNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcnNsLWlvbmljLXNtLWJ1dHRvbnMvaW9uaWMtc20tYnV0dG9ucy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW9uaWNEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9pb25pYy1kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlclRyYW5zbGF0ZUV4dGVuc2lvbiB9IGZyb20gJy4vdHJhbnNsYXRlLmV4dGVuc2lvbic7XG5pbXBvcnQgeyBSZXBlYXREYXRhdGFibGVDb21wb25lbnQgfSBmcm9tICcuL3R5cGVzL3JlcGVhdC1kYXRhdGFibGUvcmVwZWF0LWRhdGF0YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwZWF0VHlwZUNvbXBvbmVudCB9IGZyb20gJy4vdHlwZXMvcmVwZWF0L3JlcGVhdC1zZWN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgZmllbGRNYXRjaFZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycy9tdXN0LW1hdGNoJztcbmltcG9ydCB7IEFjY29yZGlvbldyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL3dyYXBwZXJzL2FjY29yZGlvbi13cmFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYW5lbFdyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL3dyYXBwZXJzL3BhbmVsLXdyYXBwZXIuY29tcG9uZW50JztcbmNvbnN0IENPTU1PTl9NT0RVTEVTID0gW1xuICBDb21tb25Nb2R1bGUsXG4gIElvbmljTW9kdWxlLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBGb3JtbHlJb25pY01vZHVsZSxcbiAgTmd4RGF0YXRhYmxlTW9kdWxlXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgLi4uQ09NTU9OX01PRFVMRVMsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIEZvcm1seU1vZHVsZS5mb3JSb290KHtcbiAgICAgIHR5cGVzOiBbXG4gICAgICAgIHsgbmFtZTogJ3JlcGVhdCcsIGNvbXBvbmVudDogUmVwZWF0VHlwZUNvbXBvbmVudCB9LFxuICAgICAgICB7IG5hbWU6ICdyZXBlYXQtZGF0YS10YWJsZScsIGNvbXBvbmVudDogUmVwZWF0RGF0YXRhYmxlQ29tcG9uZW50IH0sXG4gICAgICAgIHsgbmFtZTogJ3NtLWJ1dHRvbnMnLCBjb21wb25lbnQ6IFJzbElvbmljU21CdXR0b25zQ29tcG9uZW50IH1cbiAgICAgIF0sXG4gICAgICB2YWxpZGF0b3JzOiBbeyBuYW1lOiAnZmllbGRNYXRjaCcsIHZhbGlkYXRpb246IGZpZWxkTWF0Y2hWYWxpZGF0b3IgfV0sXG4gICAgICB3cmFwcGVyczogW1xuICAgICAgICB7IG5hbWU6ICdwYW5lbCcsIGNvbXBvbmVudDogUGFuZWxXcmFwcGVyQ29tcG9uZW50IH0sXG4gICAgICAgIHsgbmFtZTogJ2FjY29yZGlvbicsIGNvbXBvbmVudDogQWNjb3JkaW9uV3JhcHBlckNvbXBvbmVudCB9XSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlczogW1xuICAgICAgICB7IG5hbWU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgXSxcbiAgICB9KSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgSW9uaWNEaWFsb2dTZXJ2aWNlLFxuICAgIHsgcHJvdmlkZTogRk9STUxZX0NPTkZJRywgbXVsdGk6IHRydWUsIHVzZUZhY3Rvcnk6IHJlZ2lzdGVyVHJhbnNsYXRlRXh0ZW5zaW9uLCBkZXBzOiBbVHJhbnNsYXRlU2VydmljZV0gfSxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIC4uLkNPTU1PTl9NT0RVTEVTLFxuICAgIEZvcm1seU1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGVcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUnNsSW9uaWNNb2R1bGVNb2R1bGUgeyB9XG4iXX0=
|
@@ -0,0 +1,190 @@
|
|
1
|
+
import { Component, ElementRef, TemplateRef, ViewChild } from '@angular/core';
|
2
|
+
import { FieldArrayType } from '@ngx-formly/core';
|
3
|
+
import { TranslateService } from '@ngx-translate/core';
|
4
|
+
import { ColumnMode, SelectionType } from '@swimlane/ngx-datatable';
|
5
|
+
import { FileSaverService } from 'ngx-filesaver';
|
6
|
+
import * as XLSX from 'xlsx';
|
7
|
+
import { IonicDialogService } from '../../ionic-dialog.service';
|
8
|
+
import { WrappersModule } from '../../wrappers/wrappers.module';
|
9
|
+
import * as i0 from "@angular/core";
|
10
|
+
import * as i1 from "../../ionic-dialog.service";
|
11
|
+
import * as i2 from "@ngx-translate/core";
|
12
|
+
import * as i3 from "ngx-filesaver";
|
13
|
+
import * as i4 from "@angular/common";
|
14
|
+
import * as i5 from "@ionic/angular";
|
15
|
+
import * as i6 from "@swimlane/ngx-datatable";
|
16
|
+
import * as i7 from "@ngx-formly/core";
|
17
|
+
export class RepeatDatatableComponent extends FieldArrayType {
|
18
|
+
constructor(dialogService, translate, fileSaverService) {
|
19
|
+
super();
|
20
|
+
this.dialogService = dialogService;
|
21
|
+
this.translate = translate;
|
22
|
+
this.fileSaverService = fileSaverService;
|
23
|
+
this.data = null;
|
24
|
+
this.serach = null;
|
25
|
+
this.showSerach = false;
|
26
|
+
this.filterValue = null;
|
27
|
+
this.importDataProp = null;
|
28
|
+
this.exportDataProp = null;
|
29
|
+
this.ColumnMode = ColumnMode;
|
30
|
+
this.SelectionType = SelectionType;
|
31
|
+
this.deleteMessage = this.translate.instant("General.Delete.Question");
|
32
|
+
this.deleteButton = this.translate.instant("General.Delete.Button");
|
33
|
+
this.cancelButton = this.translate.instant("General.Cancel.Button");
|
34
|
+
}
|
35
|
+
add(i, initialModel) {
|
36
|
+
initialModel = {};
|
37
|
+
this.props['columns'].forEach(column => initialModel[column.prop] = null);
|
38
|
+
super.add(i, initialModel);
|
39
|
+
}
|
40
|
+
remove(i, { markAsDirty } = { markAsDirty: true }) {
|
41
|
+
this.dialogService.confirm(this.deleteMessage, null, this.deleteButton, this.cancelButton).then((value) => {
|
42
|
+
if (value.data) {
|
43
|
+
var onDelete = this.field.props['onDelete'];
|
44
|
+
if (onDelete) {
|
45
|
+
onDelete(this.field.fieldGroup[i].model).subscribe(() => {
|
46
|
+
super.remove(i);
|
47
|
+
});
|
48
|
+
}
|
49
|
+
super.remove(i);
|
50
|
+
}
|
51
|
+
});
|
52
|
+
}
|
53
|
+
ngOnInit() {
|
54
|
+
this.props['columns'].forEach(column => column.cellTemplate = this.defaultColumn);
|
55
|
+
this.props['columns'].push({
|
56
|
+
cellTemplate: this.actionsTmpl,
|
57
|
+
name: '',
|
58
|
+
cellClass: 'actions-cell',
|
59
|
+
draggable: false,
|
60
|
+
sortable: false,
|
61
|
+
visible: true,
|
62
|
+
width: 75,
|
63
|
+
maxWidth: 75,
|
64
|
+
minWidth: 75
|
65
|
+
});
|
66
|
+
this.typeKey = this.field.key;
|
67
|
+
this.serach = this.props['search'];
|
68
|
+
this.exportDataProp = this.props['export'] || null;
|
69
|
+
this.importDataProp = this.props['import'] || null;
|
70
|
+
if (this.serach) {
|
71
|
+
this.showSerach = this.serach.showSerach;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
getField(field, column, rowIndex) {
|
75
|
+
return field.fieldGroup[rowIndex].fieldGroup.find(f => f.key === column.prop);
|
76
|
+
}
|
77
|
+
postPopulate(field) {
|
78
|
+
if (this.showSerach) {
|
79
|
+
this.data = field.fieldGroup;
|
80
|
+
if (this.filterValue) {
|
81
|
+
this.field.fieldGroup = this.data.filter(f => f.formControl.value[this.serach.searchProp].toLowerCase().includes(this.filterValue));
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
handleChange(event) {
|
86
|
+
if (this.showSerach) {
|
87
|
+
if (this.data == null && this.field.fieldGroup !== null) {
|
88
|
+
this.data = this.field.fieldGroup;
|
89
|
+
}
|
90
|
+
this.filterValue = event.target.value.toLowerCase();
|
91
|
+
this.field.fieldGroup = this.data.filter(f => f.formControl.value[this.serach.searchProp].toLowerCase().includes(this.filterValue));
|
92
|
+
}
|
93
|
+
}
|
94
|
+
importData() {
|
95
|
+
this.fileInput.nativeElement.click();
|
96
|
+
}
|
97
|
+
async handleImportFile(event) {
|
98
|
+
const file = event.target.files[0];
|
99
|
+
if (file) {
|
100
|
+
try {
|
101
|
+
const fileContents = await this.readFileAsync(file);
|
102
|
+
// Handle the file contents here (e.g., display or process the data)
|
103
|
+
const wb = XLSX.read(fileContents); //, { type: 'binary' });
|
104
|
+
const wsname = wb.SheetNames[0];
|
105
|
+
const ws = wb.Sheets[wsname];
|
106
|
+
const excelData = XLSX.utils.sheet_to_json(ws); //, { header: 1 });
|
107
|
+
excelData.forEach(element => {
|
108
|
+
const jsonX = this.getValueFromJsonData(element, this.importDataProp.keyProp);
|
109
|
+
const idx = this.field.parent.model[this.typeKey].findIndex(f => f[this.importDataProp.keyProp] === jsonX);
|
110
|
+
if (idx >= 0) {
|
111
|
+
const existingdata = this.field.parent.model[this.typeKey][idx];
|
112
|
+
for (const prop of this.importDataProp.propertiesToImport) {
|
113
|
+
const jsonVal = this.getValueFromJsonData(element, prop);
|
114
|
+
if (existingdata[prop] !== jsonVal) {
|
115
|
+
var fieldControl = this.field.fieldGroup[idx].formControl;
|
116
|
+
fieldControl.controls[prop].setValue(jsonVal);
|
117
|
+
}
|
118
|
+
}
|
119
|
+
}
|
120
|
+
else {
|
121
|
+
super.add(null, element);
|
122
|
+
}
|
123
|
+
});
|
124
|
+
}
|
125
|
+
catch (error) {
|
126
|
+
console.error('Error reading the file:', error);
|
127
|
+
}
|
128
|
+
}
|
129
|
+
}
|
130
|
+
exportData() {
|
131
|
+
// Filter the data to include only the specified properties
|
132
|
+
const filteredData = this.field.parent.model[this.typeKey].map(item => {
|
133
|
+
const filteredItem = {};
|
134
|
+
for (const prop of this.exportDataProp.propertiesToExport) {
|
135
|
+
filteredItem[prop] = item[prop];
|
136
|
+
}
|
137
|
+
return filteredItem;
|
138
|
+
});
|
139
|
+
const ws = XLSX.utils.json_to_sheet(filteredData);
|
140
|
+
const wb = XLSX.utils.book_new();
|
141
|
+
XLSX.utils.book_append_sheet(wb, ws, this.exportDataProp.sheetName);
|
142
|
+
const excelBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
|
143
|
+
const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
|
144
|
+
this.fileSaverService.save(blob, this.exportDataProp.fileName);
|
145
|
+
}
|
146
|
+
getValueFromJsonData(jsonData, key) {
|
147
|
+
// Convert the key and all JSON keys to lowercase
|
148
|
+
const lowercaseKey = key.toLowerCase();
|
149
|
+
const lowercaseKeys = Object.keys(jsonData).map(k => k.toLowerCase());
|
150
|
+
// Find the lowercase key in the lowercase keys array
|
151
|
+
const index = lowercaseKeys.indexOf(lowercaseKey);
|
152
|
+
// If found, use the original (proper case) key to access the value
|
153
|
+
if (index !== -1) {
|
154
|
+
const originalKey = Object.keys(jsonData)[index];
|
155
|
+
return jsonData[originalKey];
|
156
|
+
}
|
157
|
+
// Key not found
|
158
|
+
return undefined;
|
159
|
+
}
|
160
|
+
readFileAsync(file) {
|
161
|
+
return new Promise((resolve, reject) => {
|
162
|
+
const reader = new FileReader();
|
163
|
+
reader.onload = (event) => {
|
164
|
+
resolve(event.target.result);
|
165
|
+
};
|
166
|
+
reader.onerror = (event) => {
|
167
|
+
reject(event.target.error);
|
168
|
+
};
|
169
|
+
reader.readAsArrayBuffer(file);
|
170
|
+
});
|
171
|
+
}
|
172
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.10", ngImport: i0, type: RepeatDatatableComponent, deps: [{ token: i1.IonicDialogService }, { token: i2.TranslateService }, { token: i3.FileSaverService }], target: i0.ɵɵFactoryTarget.Component }); }
|
173
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.10", type: RepeatDatatableComponent, isStandalone: true, selector: "app-repeat-datatable", viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "defaultColumn", first: true, predicate: ["defaultColumn"], descendants: true, static: true }, { propertyName: "actionsTmpl", first: true, predicate: ["actionsTmpl"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<ion-header [translucent]=\"true\">\n <ion-toolbar>\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\n </ion-toolbar>\n <ng-container [ngTemplateOutlet]=\"search\"></ng-container>\n</ion-header>\n\n<ng-template #header>\n <ion-title class=\"ion-text-left\">{{props.label}}</ion-title>\n\n <ion-button slot=\"end\" (click)=\"exportData()\" fill=\"clear\" [disabled]=\"props.disabled\" *ngIf=\"exportDataProp\">\n <ion-icon name=\"cloud-download-outline\"></ion-icon>\n </ion-button>\n\n <ion-button slot=\"end\" (click)=\"importData()\" fill=\"clear\" [disabled]=\"props.disabled\" *ngIf=\"importDataProp\">\n <ion-icon name=\"cloud-upload-outline\"></ion-icon>\n </ion-button>\n <input #fileInput type=\"file\" style=\"display: none\" accept=\".xlsx,.xls,.csv\" (change)=\"handleImportFile($event)\">\n\n <ion-button slot=\"end\" (click)=\"add()\" fill=\"clear\" [disabled]=\"props.disabled\">\n <ion-icon size=\"large\" name=\"add\"></ion-icon>\n </ion-button>\n</ng-template>\n\n<ngx-datatable #table class=\"material fullscreen rls-server-scrolling\" [rows]=\"model\" [columns]=\"props['columns']\" [columnMode]=\"props['columnMode']\"\n [rowHeight]=\"props['rowHeight']\" [headerHeight]=\"props['headerHeight']\" [footerHeight]=\"props['footerHeight']\" [limit]=\"props['limit']\"\n [scrollbarH]=\"props['scrollbarH']\" [reorderable]=\"props['reorderable']\" [externalSorting]=\"true\">\n <ng-template #defaultColumn ngx-datatable-cell-template let-rowIndex=\"rowIndex\" let-value=\"value\" let-row=\"row\"\n let-column=\"column\">\n <formly-field class=\"formly-ion-list-item\" [field]=\"getField(field, column, rowIndex)\"></formly-field>\n </ng-template>\n</ngx-datatable>\n\n<ng-template #actionsTmpl let-row=\"row\" let-value=\"value\" let-rowIndex=\"rowIndex\">\n <ion-button style=\"height: 100%;\" fill=\"clear\"[disabled]=\"props.disabled\" (click)='remove(rowIndex)'>\n <ion-icon color=\"danger\" slot=\"icon-only\" name=\"trash\" (click)='remove(rowIndex)'></ion-icon>\n </ion-button>\n</ng-template>\n\n<ng-template #search>\n <ion-toolbar *ngIf=\"showSerach\">\n <ion-searchbar [debounce]=\"1000\" (ionChange)=\"handleChange($event)\"></ion-searchbar>\n </ion-toolbar>\n</ng-template>", styles: [".rls-server-scrolling{height:calc(100vh - 110px);position:relative!important}::ng-deep .datatable-body-cell{padding:0!important}::ng-deep .datatable-body-cell-label{height:100%!important}::ng-deep .progress-linear{position:fixed!important;bottom:0}::ng-deep .actions-cell{padding:5px 0 0 .9rem!important}::ng-deep .align-right{text-align:right!important}\n"], dependencies: [{ kind: "ngmodule", type: WrappersModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "mode", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i5.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i5.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i5.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "component", type: i6.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }, { kind: "directive", type: i6.DataTableColumnCellDirective, selector: "[ngx-datatable-cell-template]" }, { kind: "component", type: i7.FormlyField, selector: "formly-field", inputs: ["field"] }] }); }
|
174
|
+
}
|
175
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.10", ngImport: i0, type: RepeatDatatableComponent, decorators: [{
|
176
|
+
type: Component,
|
177
|
+
args: [{ standalone: true, selector: 'app-repeat-datatable', imports: [
|
178
|
+
WrappersModule
|
179
|
+
], template: "<ion-header [translucent]=\"true\">\n <ion-toolbar>\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\n </ion-toolbar>\n <ng-container [ngTemplateOutlet]=\"search\"></ng-container>\n</ion-header>\n\n<ng-template #header>\n <ion-title class=\"ion-text-left\">{{props.label}}</ion-title>\n\n <ion-button slot=\"end\" (click)=\"exportData()\" fill=\"clear\" [disabled]=\"props.disabled\" *ngIf=\"exportDataProp\">\n <ion-icon name=\"cloud-download-outline\"></ion-icon>\n </ion-button>\n\n <ion-button slot=\"end\" (click)=\"importData()\" fill=\"clear\" [disabled]=\"props.disabled\" *ngIf=\"importDataProp\">\n <ion-icon name=\"cloud-upload-outline\"></ion-icon>\n </ion-button>\n <input #fileInput type=\"file\" style=\"display: none\" accept=\".xlsx,.xls,.csv\" (change)=\"handleImportFile($event)\">\n\n <ion-button slot=\"end\" (click)=\"add()\" fill=\"clear\" [disabled]=\"props.disabled\">\n <ion-icon size=\"large\" name=\"add\"></ion-icon>\n </ion-button>\n</ng-template>\n\n<ngx-datatable #table class=\"material fullscreen rls-server-scrolling\" [rows]=\"model\" [columns]=\"props['columns']\" [columnMode]=\"props['columnMode']\"\n [rowHeight]=\"props['rowHeight']\" [headerHeight]=\"props['headerHeight']\" [footerHeight]=\"props['footerHeight']\" [limit]=\"props['limit']\"\n [scrollbarH]=\"props['scrollbarH']\" [reorderable]=\"props['reorderable']\" [externalSorting]=\"true\">\n <ng-template #defaultColumn ngx-datatable-cell-template let-rowIndex=\"rowIndex\" let-value=\"value\" let-row=\"row\"\n let-column=\"column\">\n <formly-field class=\"formly-ion-list-item\" [field]=\"getField(field, column, rowIndex)\"></formly-field>\n </ng-template>\n</ngx-datatable>\n\n<ng-template #actionsTmpl let-row=\"row\" let-value=\"value\" let-rowIndex=\"rowIndex\">\n <ion-button style=\"height: 100%;\" fill=\"clear\"[disabled]=\"props.disabled\" (click)='remove(rowIndex)'>\n <ion-icon color=\"danger\" slot=\"icon-only\" name=\"trash\" (click)='remove(rowIndex)'></ion-icon>\n </ion-button>\n</ng-template>\n\n<ng-template #search>\n <ion-toolbar *ngIf=\"showSerach\">\n <ion-searchbar [debounce]=\"1000\" (ionChange)=\"handleChange($event)\"></ion-searchbar>\n </ion-toolbar>\n</ng-template>", styles: [".rls-server-scrolling{height:calc(100vh - 110px);position:relative!important}::ng-deep .datatable-body-cell{padding:0!important}::ng-deep .datatable-body-cell-label{height:100%!important}::ng-deep .progress-linear{position:fixed!important;bottom:0}::ng-deep .actions-cell{padding:5px 0 0 .9rem!important}::ng-deep .align-right{text-align:right!important}\n"] }]
|
180
|
+
}], ctorParameters: function () { return [{ type: i1.IonicDialogService }, { type: i2.TranslateService }, { type: i3.FileSaverService }]; }, propDecorators: { fileInput: [{
|
181
|
+
type: ViewChild,
|
182
|
+
args: ['fileInput']
|
183
|
+
}], defaultColumn: [{
|
184
|
+
type: ViewChild,
|
185
|
+
args: ['defaultColumn', { static: true }]
|
186
|
+
}], actionsTmpl: [{
|
187
|
+
type: ViewChild,
|
188
|
+
args: ['actionsTmpl', { static: true }]
|
189
|
+
}] } });
|
190
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0LWRhdGF0YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yb3NvZnRsYWIvaW9uaWMvc3JjL2xpYi90eXBlcy9yZXBlYXQtZGF0YXRhYmxlL3JlcGVhdC1kYXRhdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcm9zb2Z0bGFiL2lvbmljL3NyYy9saWIvdHlwZXMvcmVwZWF0LWRhdGF0YWJsZS9yZXBlYXQtZGF0YXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFVLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEYsT0FBTyxFQUFFLGNBQWMsRUFBcUIsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBZSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7OztBQXVCaEUsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGNBQWM7SUFxQjFELFlBQ1MsYUFBaUMsRUFDakMsU0FBMkIsRUFDMUIsZ0JBQWtDO1FBQzFDLEtBQUssRUFBRSxDQUFDO1FBSEQsa0JBQWEsR0FBYixhQUFhLENBQW9CO1FBQ2pDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzFCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFoQjVD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dEVBMkNjLDZaRGZWLGNBQWM7OzRGQUdMLHdCQUF3QjtrQkFUcEMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sc0JBQXNCLFdBR3ZCO3dCQUNQLGNBQWM7cUJBQ2Y7dUtBTXVCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDK0IsYUFBYTtzQkFBakUsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLFdBQVc7c0JBQXRELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZEFycmF5VHlwZSwgRm9ybWx5RmllbGRDb25maWcgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENvbHVtbk1vZGUsIFNlbGVjdGlvblR5cGUsIFRhYmxlQ29sdW1uIH0gZnJvbSAnQHN3aW1sYW5lL25neC1kYXRhdGFibGUnO1xuaW1wb3J0IHsgRmlsZVNhdmVyU2VydmljZSB9IGZyb20gJ25neC1maWxlc2F2ZXInO1xuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcbmltcG9ydCB7IElvbmljRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL2lvbmljLWRpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFdyYXBwZXJzTW9kdWxlIH0gZnJvbSAnLi4vLi4vd3JhcHBlcnMvd3JhcHBlcnMubW9kdWxlJztcbmludGVyZmFjZSBTZWFyY2hQcm9wIHtcbiAgc2hvd1NlcmFjaDogYm9vbGVhblxuICBzZWFyY2hQcm9wOiBzdHJpbmdcbn1cbmludGVyZmFjZSBFeHBvcnREYXRhUHJvcCB7XG4gIHByb3BlcnRpZXNUb0V4cG9ydDogc3RyaW5nW11cbiAgc2hlZXROYW1lOiBzdHJpbmc7XG4gIGZpbGVOYW1lOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgSW1wb3J0RGF0YVByb3Age1xuICBrZXlQcm9wOiBzdHJpbmdcbiAgcHJvcGVydGllc1RvSW1wb3J0OiBzdHJpbmdbXVxufVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYXBwLXJlcGVhdC1kYXRhdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVwZWF0LWRhdGF0YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlcGVhdC1kYXRhdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW1xuICAgIFdyYXBwZXJzTW9kdWxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgUmVwZWF0RGF0YXRhYmxlQ29tcG9uZW50IGV4dGVuZHMgRmllbGRBcnJheVR5cGUgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICpcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdENvbHVtbicsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBkZWZhdWx0Q29sdW1uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdhY3Rpb25zVG1wbCcsIHsgc3RhdGljOiB0cnVlIH0pIGFjdGlvbnNUbXBsOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIGRhdGE6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBudWxsO1xuICBzZXJhY2g6IFNlYXJjaFByb3AgPSBudWxsO1xuICBzaG93U2VyYWNoOiBib29sZWFuID0gZmFsc2U7XG4gIGRlbGV0ZU1lc3NhZ2U6IHN0cmluZ1xuICBkZWxldGVCdXR0b246IHN0cmluZ1xuICBjYW5jZWxCdXR0b246IHN0cmluZ1xuICBmaWx0ZXJWYWx1ZTogc3RyaW5nID0gbnVsbDtcbiAgdHlwZUtleTogc3RyaW5nO1xuICBpbXBvcnREYXRhUHJvcDogSW1wb3J0RGF0YVByb3AgPSBudWxsO1xuICBleHBvcnREYXRhUHJvcDogRXhwb3J0RGF0YVByb3AgPSBudWxsO1xuXG4gIENvbHVtbk1vZGUgPSBDb2x1bW5Nb2RlO1xuICBTZWxlY3Rpb25UeXBlID0gU2VsZWN0aW9uVHlwZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1NlcnZpY2U6IElvbmljRGlhbG9nU2VydmljZSxcbiAgICBwdWJsaWMgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsZVNhdmVyU2VydmljZTogRmlsZVNhdmVyU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kZWxldGVNZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcIkdlbmVyYWwuRGVsZXRlLlF1ZXN0aW9uXCIpXG4gICAgdGhpcy5kZWxldGVCdXR0b24gPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiR2VuZXJhbC5EZWxldGUuQnV0dG9uXCIpXG4gICAgdGhpcy5jYW5jZWxCdXR0b24gPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiR2VuZXJhbC5DYW5jZWwuQnV0dG9uXCIpXG5cbiAgfVxuICBvdmVycmlkZSBhZGQoaT86IG51bWJlciwgaW5pdGlhbE1vZGVsPzogYW55KSB7XG4gICAgaW5pdGlhbE1vZGVsID0ge31cbiAgICB0aGlzLnByb3BzWydjb2x1bW5zJ10uZm9yRWFjaChjb2x1bW4gPT4gaW5pdGlhbE1vZGVsW2NvbHVtbi5wcm9wXSA9IG51bGwpXG4gICAgc3VwZXIuYWRkKGksIGluaXRpYWxNb2RlbCk7XG4gIH1cbiAgb3ZlcnJpZGUgcmVtb3ZlKGk6IG51bWJlciwgeyBtYXJrQXNEaXJ0eSB9ID0geyBtYXJrQXNEaXJ0eTogdHJ1ZSB9KSB7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNvbmZpcm0odGhpcy5kZWxldGVNZXNzYWdlLCBudWxsLCB0aGlzLmRlbGV0ZUJ1dHRvbiwgdGhpcy5jYW5jZWxCdXR0b24pLnRoZW4oXG4gICAgICAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUuZGF0YSkge1xuICAgICAgICAgIHZhciBvbkRlbGV0ZSA9IHRoaXMuZmllbGQucHJvcHNbJ29uRGVsZXRlJ107XG4gICAgICAgICAgaWYgKG9uRGVsZXRlKSB7XG4gICAgICAgICAgICBvbkRlbGV0ZSh0aGlzLmZpZWxkLmZpZWxkR3JvdXBbaV0ubW9kZWwpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN1cGVyLnJlbW92ZShpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW1vdmUoaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG4gIH1cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5wcm9wc1snY29sdW1ucyddLmZvckVhY2goY29sdW1uID0+IGNvbHVtbi5jZWxsVGVtcGxhdGUgPSB0aGlzLmRlZmF1bHRDb2x1bW4pO1xuICAgIHRoaXMucHJvcHNbJ2NvbHVtbnMnXS5wdXNoKHtcbiAgICAgIGNlbGxUZW1wbGF0ZTogdGhpcy5hY3Rpb25zVG1wbCxcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgY2VsbENsYXNzOiAnYWN0aW9ucy1jZWxsJyxcbiAgICAgIGRyYWdnYWJsZTogZmFsc2UsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgd2lkdGg6IDc1LFxuICAgICAgbWF4V2lkdGg6IDc1LFxuICAgICAgbWluV2lkdGg6IDc1XG4gICAgfSlcbiAgICB0aGlzLnR5cGVLZXkgPSB0aGlzLmZpZWxkLmtleSBhcyBzdHJpbmdcbiAgICB0aGlzLnNlcmFjaCA9IHRoaXMucHJvcHNbJ3NlYXJjaCddXG4gICAgdGhpcy5leHBvcnREYXRhUHJvcCA9IHRoaXMucHJvcHNbJ2V4cG9ydCddIHx8IG51bGxcbiAgICB0aGlzLmltcG9ydERhdGFQcm9wID0gdGhpcy5wcm9wc1snaW1wb3J0J10gfHwgbnVsbFxuICAgIGlmICh0aGlzLnNlcmFjaCkge1xuICAgICAgdGhpcy5zaG93U2VyYWNoID0gdGhpcy5zZXJhY2guc2hvd1NlcmFjaFxuICAgIH1cblxuICB9XG4gIGdldEZpZWxkKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZywgY29sdW1uOiBUYWJsZUNvbHVtbiwgcm93SW5kZXg6IG51bWJlcik6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4gZmllbGQuZmllbGRHcm91cFtyb3dJbmRleF0uZmllbGRHcm91cC5maW5kKGYgPT4gZi5rZXkgPT09IGNvbHVtbi5wcm9wKTtcbiAgfVxuICBwb3N0UG9wdWxhdGUoZmllbGQ6IGFueSkge1xuICAgIGlmICh0aGlzLnNob3dTZXJhY2gpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGZpZWxkLmZpZWxkR3JvdXBcbiAgICAgIGlmICh0aGlzLmZpbHRlclZhbHVlKSB7XG4gICAgICAgIHRoaXMuZmllbGQuZmllbGRHcm91cCA9IHRoaXMuZGF0YS5maWx0ZXIoZiA9PiBmLmZvcm1Db250cm9sLnZhbHVlW3RoaXMuc2VyYWNoLnNlYXJjaFByb3BdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXJWYWx1ZSkpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGhhbmRsZUNoYW5nZShldmVudCkge1xuICAgIGlmICh0aGlzLnNob3dTZXJhY2gpIHtcbiAgICAgIGlmICh0aGlzLmRhdGEgPT0gbnVsbCAmJiB0aGlzLmZpZWxkLmZpZWxkR3JvdXAgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5maWVsZC5maWVsZEdyb3VwXG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlclZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLmZpZWxkLmZpZWxkR3JvdXAgPSB0aGlzLmRhdGEuZmlsdGVyKGYgPT4gZi5mb3JtQ29udHJvbC52YWx1ZVt0aGlzLnNlcmFjaC5zZWFyY2hQcm9wXS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyVmFsdWUpKVxuICAgIH1cbiAgfVxuICBpbXBvcnREYXRhKCkge1xuICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgfVxuICBhc3luYyBoYW5kbGVJbXBvcnRGaWxlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuXG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHRyeSB7XG5cblxuICAgICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXN5bmMoZmlsZSk7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgZmlsZSBjb250ZW50cyBoZXJlIChlLmcuLCBkaXNwbGF5IG9yIHByb2Nlc3MgdGhlIGRhdGEpXG4gICAgICAgIGNvbnN0IHdiOiBYTFNYLldvcmtCb29rID0gWExTWC5yZWFkKGZpbGVDb250ZW50cykvLywgeyB0eXBlOiAnYmluYXJ5JyB9KTtcbiAgICAgICAgY29uc3Qgd3NuYW1lOiBzdHJpbmcgPSB3Yi5TaGVldE5hbWVzWzBdO1xuICAgICAgICBjb25zdCB3czogWExTWC5Xb3JrU2hlZXQgPSB3Yi5TaGVldHNbd3NuYW1lXTtcbiAgICAgICAgY29uc3QgZXhjZWxEYXRhID0gWExTWC51dGlscy5zaGVldF90b19qc29uKHdzKS8vLCB7IGhlYWRlcjogMSB9KTtcbiAgICAgICAgZXhjZWxEYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgY29uc3QganNvblggPSB0aGlzLmdldFZhbHVlRnJvbUpzb25EYXRhKGVsZW1lbnQsIHRoaXMuaW1wb3J0RGF0YVByb3Aua2V5UHJvcClcbiAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLmZpZWxkLnBhcmVudC5tb2RlbFt0aGlzLnR5cGVLZXldLmZpbmRJbmRleChmID0+IGZbdGhpcy5pbXBvcnREYXRhUHJvcC5rZXlQcm9wXSA9PT0ganNvblgpXG4gICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ2RhdGEgPSB0aGlzLmZpZWxkLnBhcmVudC5tb2RlbFt0aGlzLnR5cGVLZXldW2lkeF1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiB0aGlzLmltcG9ydERhdGFQcm9wLnByb3BlcnRpZXNUb0ltcG9ydCkge1xuICAgICAgICAgICAgICBjb25zdCBqc29uVmFsID0gdGhpcy5nZXRWYWx1ZUZyb21Kc29uRGF0YShlbGVtZW50LCBwcm9wKVxuICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdkYXRhW3Byb3BdICE9PSBqc29uVmFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkQ29udHJvbCA9IHRoaXMuZmllbGQuZmllbGRHcm91cFtpZHhdLmZvcm1Db250cm9sIGFzIEZvcm1Hcm91cFxuICAgICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5jb250cm9sc1twcm9wXS5zZXRWYWx1ZShqc29uVmFsKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLmFkZChudWxsLCBlbGVtZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlYWRpbmcgdGhlIGZpbGU6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4cG9ydERhdGEoKSB7XG5cbiAgICAvLyBGaWx0ZXIgdGhlIGRhdGEgdG8gaW5jbHVkZSBvbmx5IHRoZSBzcGVjaWZpZWQgcHJvcGVydGllc1xuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuZmllbGQucGFyZW50Lm1vZGVsW3RoaXMudHlwZUtleV0ubWFwKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgZmlsdGVyZWRJdGVtOiBhbnkgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiB0aGlzLmV4cG9ydERhdGFQcm9wLnByb3BlcnRpZXNUb0V4cG9ydCkge1xuICAgICAgICBmaWx0ZXJlZEl0ZW1bcHJvcF0gPSBpdGVtW3Byb3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbHRlcmVkSXRlbTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHdzOiBYTFNYLldvcmtTaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldChmaWx0ZXJlZERhdGEpO1xuICAgIGNvbnN0IHdiOiBYTFNYLldvcmtCb29rID0gWExTWC51dGlscy5ib29rX25ldygpO1xuICAgIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod2IsIHdzLCB0aGlzLmV4cG9ydERhdGFQcm9wLnNoZWV0TmFtZSk7XG5cbiAgICBjb25zdCBleGNlbEJ1ZmZlcjogYW55ID0gWExTWC53cml0ZSh3YiwgeyBib29rVHlwZTogJ3hsc3gnLCB0eXBlOiAnYXJyYXknIH0pO1xuXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtleGNlbEJ1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JyB9KTtcbiAgICB0aGlzLmZpbGVTYXZlclNlcnZpY2Uuc2F2ZShibG9iLCB0aGlzLmV4cG9ydERhdGFQcm9wLmZpbGVOYW1lKTtcbiAgfVxuXG4gIGdldFZhbHVlRnJvbUpzb25EYXRhKGpzb25EYXRhOiBhbnksIGtleTogc3RyaW5nKTogYW55IHtcbiAgICAvLyBDb252ZXJ0IHRoZSBrZXkgYW5kIGFsbCBKU09OIGtleXMgdG8gbG93ZXJjYXNlXG4gICAgY29uc3QgbG93ZXJjYXNlS2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbG93ZXJjYXNlS2V5cyA9IE9iamVjdC5rZXlzKGpzb25EYXRhKS5tYXAoayA9PiBrLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgLy8gRmluZCB0aGUgbG93ZXJjYXNlIGtleSBpbiB0aGUgbG93ZXJjYXNlIGtleXMgYXJyYXlcbiAgICBjb25zdCBpbmRleCA9IGxvd2VyY2FzZUtleXMuaW5kZXhPZihsb3dlcmNhc2VLZXkpO1xuXG4gICAgLy8gSWYgZm91bmQsIHVzZSB0aGUgb3JpZ2luYWwgKHByb3BlciBjYXNlKSBrZXkgdG8gYWNjZXNzIHRoZSB2YWx1ZVxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsS2V5ID0gT2JqZWN0LmtleXMoanNvbkRhdGEpW2luZGV4XTtcbiAgICAgIHJldHVybiBqc29uRGF0YVtvcmlnaW5hbEtleV07XG4gICAgfVxuXG4gICAgLy8gS2V5IG5vdCBmb3VuZFxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcHJpdmF0ZSByZWFkRmlsZUFzeW5jKGZpbGU6IEZpbGUpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgICAgfTtcblxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICByZWplY3QoZXZlbnQudGFyZ2V0LmVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICB9KTtcbiAgfVxufSIsIjxpb24taGVhZGVyIFt0cmFuc2x1Y2VudF09XCJ0cnVlXCI+XG4gIDxpb24tdG9vbGJhcj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlclwiPjwvbmctY29udGFpbmVyPlxuICA8L2lvbi10b29sYmFyPlxuICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlYXJjaFwiPjwvbmctY29udGFpbmVyPlxuPC9pb24taGVhZGVyPlxuXG48bmctdGVtcGxhdGUgI2hlYWRlcj5cbiAgPGlvbi10aXRsZSBjbGFzcz1cImlvbi10ZXh0LWxlZnRcIj57e3Byb3BzLmxhYmVsfX08L2lvbi10aXRsZT5cblxuICA8aW9uLWJ1dHRvbiBzbG90PVwiZW5kXCIgKGNsaWNrKT1cImV4cG9ydERhdGEoKVwiIGZpbGw9XCJjbGVhclwiIFtkaXNhYmxlZF09XCJwcm9wcy5kaXNhYmxlZFwiICpuZ0lmPVwiZXhwb3J0RGF0YVByb3BcIj5cbiAgICA8aW9uLWljb24gbmFtZT1cImNsb3VkLWRvd25sb2FkLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICA8L2lvbi1idXR0b24+XG5cbiAgPGlvbi1idXR0b24gc2xvdD1cImVuZFwiIChjbGljayk9XCJpbXBvcnREYXRhKClcIiBmaWxsPVwiY2xlYXJcIiBbZGlzYWJsZWRdPVwicHJvcHMuZGlzYWJsZWRcIiAqbmdJZj1cImltcG9ydERhdGFQcm9wXCI+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJjbG91ZC11cGxvYWQtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gIDwvaW9uLWJ1dHRvbj5cbiAgPGlucHV0ICNmaWxlSW5wdXQgdHlwZT1cImZpbGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBhY2NlcHQ9XCIueGxzeCwueGxzLC5jc3ZcIiAoY2hhbmdlKT1cImhhbmRsZUltcG9ydEZpbGUoJGV2ZW50KVwiPlxuXG4gIDxpb24tYnV0dG9uIHNsb3Q9XCJlbmRcIiAoY2xpY2spPVwiYWRkKClcIiBmaWxsPVwiY2xlYXJcIiBbZGlzYWJsZWRdPVwicHJvcHMuZGlzYWJsZWRcIj5cbiAgICA8aW9uLWljb24gc2l6ZT1cImxhcmdlXCIgbmFtZT1cImFkZFwiPjwvaW9uLWljb24+XG4gIDwvaW9uLWJ1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZ3gtZGF0YXRhYmxlICN0YWJsZSBjbGFzcz1cIm1hdGVyaWFsIGZ1bGxzY3JlZW4gcmxzLXNlcnZlci1zY3JvbGxpbmdcIiBbcm93c109XCJtb2RlbFwiIFtjb2x1bW5zXT1cInByb3BzWydjb2x1bW5zJ11cIiBbY29sdW1uTW9kZV09XCJwcm9wc1snY29sdW1uTW9kZSddXCJcbiAgW3Jvd0hlaWdodF09XCJwcm9wc1sncm93SGVpZ2h0J11cIiBbaGVhZGVySGVpZ2h0XT1cInByb3BzWydoZWFkZXJIZWlnaHQnXVwiIFtmb290ZXJIZWlnaHRdPVwicHJvcHNbJ2Zvb3RlckhlaWdodCddXCIgW2xpbWl0XT1cInByb3BzWydsaW1pdCddXCJcbiAgW3Njcm9sbGJhckhdPVwicHJvcHNbJ3Njcm9sbGJhckgnXVwiIFtyZW9yZGVyYWJsZV09XCJwcm9wc1sncmVvcmRlcmFibGUnXVwiIFtleHRlcm5hbFNvcnRpbmddPVwidHJ1ZVwiPlxuICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDb2x1bW4gbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtcm93PVwicm93XCJcbiAgICBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gICAgPGZvcm1seS1maWVsZCAgIGNsYXNzPVwiZm9ybWx5LWlvbi1saXN0LWl0ZW1cIiAgW2ZpZWxkXT1cImdldEZpZWxkKGZpZWxkLCBjb2x1bW4sIHJvd0luZGV4KVwiPjwvZm9ybWx5LWZpZWxkPlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZ3gtZGF0YXRhYmxlPlxuXG48bmctdGVtcGxhdGUgI2FjdGlvbnNUbXBsIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiICBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiPlxuICA8aW9uLWJ1dHRvbiBzdHlsZT1cImhlaWdodDogMTAwJTtcIiBmaWxsPVwiY2xlYXJcIltkaXNhYmxlZF09XCJwcm9wcy5kaXNhYmxlZFwiIChjbGljayk9J3JlbW92ZShyb3dJbmRleCknPlxuICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwidHJhc2hcIiAoY2xpY2spPSdyZW1vdmUocm93SW5kZXgpJz48L2lvbi1pY29uPlxuICA8L2lvbi1idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NlYXJjaD5cbiAgPGlvbi10b29sYmFyICpuZ0lmPVwic2hvd1NlcmFjaFwiPlxuICAgIDxpb24tc2VhcmNoYmFyIFtkZWJvdW5jZV09XCIxMDAwXCIgKGlvbkNoYW5nZSk9XCJoYW5kbGVDaGFuZ2UoJGV2ZW50KVwiPjwvaW9uLXNlYXJjaGJhcj5cbiAgPC9pb24tdG9vbGJhcj5cbjwvbmctdGVtcGxhdGU+Il19
|