@rosoftlab/ionic 1.0.0-alpha-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/esm2022/lib/components/index.mjs +4 -0
- package/esm2022/lib/components/rsl-ionic-crud.component/rsl-ionic-crud.component.mjs +266 -0
- package/esm2022/lib/components/rsl-ionic-data-table/rsl-ionic-data-table.component.mjs +292 -0
- package/esm2022/lib/components/rsl-ionic-grid/rsl-ionic-grid.component.mjs +269 -0
- package/esm2022/lib/decorators/index.mjs +3 -0
- package/esm2022/lib/decorators/ionic-datatable-layout.mjs +10 -0
- package/esm2022/lib/decorators/ionic-list.decorator.mjs +9 -0
- package/esm2022/lib/interfaces/index.mjs +2 -0
- package/esm2022/lib/interfaces/ionic-list-layout-config.mjs +2 -0
- package/esm2022/lib/ionic-dialog.service.mjs +51 -0
- package/esm2022/lib/rsl-ionic-module.module.mjs +86 -0
- package/esm2022/lib/translate.extension.mjs +48 -0
- package/esm2022/lib/types/index.mjs +2 -0
- package/esm2022/lib/types/repeat/repeat-section.type.mjs +135 -0
- package/esm2022/lib/validators/index.mjs +2 -0
- package/esm2022/lib/validators/must-match.mjs +12 -0
- package/esm2022/lib/wrappers/accordion-wrapper.component.mjs +50 -0
- package/esm2022/lib/wrappers/index.mjs +3 -0
- package/esm2022/lib/wrappers/panel-wrapper.component.mjs +37 -0
- package/esm2022/lib/wrappers/wrappers.module.mjs +56 -0
- package/esm2022/public-api.mjs +12 -0
- package/esm2022/rosoftlab-ionic.mjs +5 -0
- package/fesm2022/rosoftlab-ionic.mjs +1251 -0
- package/fesm2022/rosoftlab-ionic.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/index.d.ts +3 -0
- package/lib/components/rsl-ionic-crud.component/rsl-ionic-crud.component.d.ts +69 -0
- package/lib/components/rsl-ionic-data-table/rsl-ionic-data-table.component.d.ts +66 -0
- package/lib/components/rsl-ionic-grid/rsl-ionic-grid.component.d.ts +58 -0
- package/lib/decorators/index.d.ts +2 -0
- package/lib/decorators/ionic-datatable-layout.d.ts +7 -0
- package/lib/decorators/ionic-list.decorator.d.ts +2 -0
- package/lib/interfaces/index.d.ts +1 -0
- package/lib/interfaces/ionic-list-layout-config.d.ts +8 -0
- package/lib/ionic-dialog.service.d.ts +10 -0
- package/lib/rsl-ionic-module.module.d.ts +13 -0
- package/lib/translate.extension.d.ts +17 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/repeat/repeat-section.type.d.ts +51 -0
- package/lib/validators/index.d.ts +1 -0
- package/lib/validators/must-match.d.ts +6 -0
- package/lib/wrappers/accordion-wrapper.component.d.ts +6 -0
- package/lib/wrappers/index.d.ts +2 -0
- package/lib/wrappers/panel-wrapper.component.d.ts +6 -0
- package/lib/wrappers/wrappers.module.d.ts +13 -0
- package/package.json +31 -0
- package/public-api.d.ts +8 -0
@@ -0,0 +1,292 @@
|
|
1
|
+
import { Location } from '@angular/common';
|
2
|
+
import { Component, ElementRef, Injector, Input, TemplateRef, ViewChild } from '@angular/core';
|
3
|
+
import { ActivatedRoute, NavigationStart, Router, UrlSegment } from '@angular/router';
|
4
|
+
import { NavController } from '@ionic/angular';
|
5
|
+
import { TranslateService } from '@ngx-translate/core';
|
6
|
+
import { ColumnMode, SelectionType } from '@swimlane/ngx-datatable';
|
7
|
+
import * as jsonLogic from 'json-logic-js/logic.js';
|
8
|
+
import { IonicDialogService } from '../../ionic-dialog.service';
|
9
|
+
import { RslIonicModuleModule } from '../../rsl-ionic-module.module';
|
10
|
+
import * as i0 from "@angular/core";
|
11
|
+
import * as i1 from "@angular/router";
|
12
|
+
import * as i2 from "@ngx-translate/core";
|
13
|
+
import * as i3 from "@angular/common";
|
14
|
+
import * as i4 from "@ionic/angular";
|
15
|
+
import * as i5 from "../../ionic-dialog.service";
|
16
|
+
import * as i6 from "@swimlane/ngx-datatable";
|
17
|
+
export class RslIonicDataTableComponent {
|
18
|
+
constructor(router, route, translate, location, injector, navCtrl, dialogService, el) {
|
19
|
+
this.router = router;
|
20
|
+
this.route = route;
|
21
|
+
this.translate = translate;
|
22
|
+
this.location = location;
|
23
|
+
this.injector = injector;
|
24
|
+
this.navCtrl = navCtrl;
|
25
|
+
this.dialogService = dialogService;
|
26
|
+
this.el = el;
|
27
|
+
this.data = [];
|
28
|
+
this.pageIndex = 1;
|
29
|
+
this.pageSize = 30;
|
30
|
+
this.columns = [];
|
31
|
+
this.allColumns = [];
|
32
|
+
this.ColumnMode = ColumnMode;
|
33
|
+
this.SelectionType = SelectionType;
|
34
|
+
this.headerHeight = 50;
|
35
|
+
this.rowHeight = 50;
|
36
|
+
}
|
37
|
+
ngOnInit() {
|
38
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'showSerach', false);
|
39
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'searchFields', null);
|
40
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'customInclude', null);
|
41
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'defaultSort', null);
|
42
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'defaultSortDirection', '');
|
43
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'deletePropertyName', 'name');
|
44
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'defaultFilter', null);
|
45
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'showHeader', true);
|
46
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'deleteDisableRule', null);
|
47
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'hasAdd', true);
|
48
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'canDelete', true);
|
49
|
+
this.setValueFromSnapshot(this, this.route.snapshot, 'canEdit', true);
|
50
|
+
if (!this.modelService) {
|
51
|
+
const SERVICE_TOKEN = this.route.snapshot.data['requiredService'];
|
52
|
+
this.modelService = this.injector.get(SERVICE_TOKEN);
|
53
|
+
}
|
54
|
+
this.model = this.modelService.newModel();
|
55
|
+
this.title = this.model.modelConfig.formTitle;
|
56
|
+
this.getListLayout();
|
57
|
+
const currentUrlSegments = this.router.url.split('/').map(segment => new UrlSegment(segment, {}));
|
58
|
+
this.basePath = currentUrlSegments.map(segment => segment.path).join('/');
|
59
|
+
this.router.events.subscribe(event => {
|
60
|
+
if (event instanceof NavigationStart) {
|
61
|
+
// Navigation to another page is about to occur
|
62
|
+
this.data = [];
|
63
|
+
this.pageIndex = 1;
|
64
|
+
// Perform actions or update component as needed
|
65
|
+
}
|
66
|
+
});
|
67
|
+
// this.isLoading = true;
|
68
|
+
// this.onScroll(0);
|
69
|
+
}
|
70
|
+
setValueFromSnapshot(component, snapshot, key, defaultValue) {
|
71
|
+
if (component[key] === undefined) {
|
72
|
+
let dataFromSnapshot = snapshot.data[key];
|
73
|
+
if (dataFromSnapshot === null || dataFromSnapshot === undefined) {
|
74
|
+
dataFromSnapshot = snapshot.params[key];
|
75
|
+
}
|
76
|
+
component[key] = dataFromSnapshot !== undefined ? dataFromSnapshot : defaultValue;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
onScroll(offsetY) {
|
80
|
+
if (offsetY) {
|
81
|
+
if (this.oldOffsetY !== offsetY) {
|
82
|
+
this.oldOffsetY = offsetY;
|
83
|
+
const viewHeight = this.el.nativeElement.getBoundingClientRect().height - this.headerHeight;
|
84
|
+
if (!this.isLoading && offsetY + viewHeight >= this.data.length * this.rowHeight) {
|
85
|
+
// total number of results to load
|
86
|
+
let limit = this.pageSize;
|
87
|
+
// check if we haven't fetched any results yet
|
88
|
+
if (this.data.length === 0) {
|
89
|
+
// calculate the number of rows that fit within viewport
|
90
|
+
const pageSize = Math.ceil(viewHeight / this.rowHeight);
|
91
|
+
// change the limit to pageSize such that we fill the first page entirely
|
92
|
+
// (otherwise, we won't be able to scroll past it)
|
93
|
+
limit = Math.max(pageSize, this.pageSize);
|
94
|
+
}
|
95
|
+
// this.pageIndex
|
96
|
+
this.pageSize = limit;
|
97
|
+
this.loadData();
|
98
|
+
// this.loadPage(limit);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
}
|
103
|
+
async ionViewWillEnter() {
|
104
|
+
this.data = [];
|
105
|
+
this.loadData();
|
106
|
+
}
|
107
|
+
async handleChange(event) {
|
108
|
+
this.filterValue = event.target.value.toLowerCase();
|
109
|
+
this.data = [];
|
110
|
+
this.pageIndex = 1;
|
111
|
+
this.loadData();
|
112
|
+
}
|
113
|
+
loadData(event = null) {
|
114
|
+
const filters = [];
|
115
|
+
let sorts = '';
|
116
|
+
this.isLoading = true;
|
117
|
+
if (this.defaultSort) {
|
118
|
+
if (this.defaultSortDirection === 'desc') {
|
119
|
+
sorts = '-' + this.defaultSort;
|
120
|
+
}
|
121
|
+
else {
|
122
|
+
sorts = this.defaultSort;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
if (this.showSerach) {
|
126
|
+
if (this.filterValue) {
|
127
|
+
const y = '(' + this.searchFields.replace(',', '|') + ')';
|
128
|
+
filters.push(y + '@=*' + this.filterValue);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
if (this.defaultFilter) {
|
132
|
+
filters.push(this.defaultFilter);
|
133
|
+
}
|
134
|
+
setTimeout(() => {
|
135
|
+
const filtersValue = filters.join(', ');
|
136
|
+
this.modelService.getAll(this.pageIndex, this.pageSize, sorts, filtersValue, this.customInclude).subscribe((response) => {
|
137
|
+
if (this.pageIndex !== response.getMeta().meta.count) {
|
138
|
+
this.pageIndex++;
|
139
|
+
}
|
140
|
+
else {
|
141
|
+
if (event)
|
142
|
+
event.target.disabled = true;
|
143
|
+
}
|
144
|
+
// if (this.filterValue)
|
145
|
+
// this.data = response.getModels();
|
146
|
+
// else
|
147
|
+
const rows = [...this.data, ...response.getModels()];
|
148
|
+
this.data = rows;
|
149
|
+
// this.data = this.data.concat();
|
150
|
+
if (event)
|
151
|
+
event.target.complete();
|
152
|
+
this.isLoading = false;
|
153
|
+
});
|
154
|
+
}, 700);
|
155
|
+
}
|
156
|
+
async handleRefresh(event) {
|
157
|
+
this.pageIndex = 1;
|
158
|
+
this.data = [];
|
159
|
+
this.loadData();
|
160
|
+
event.target.complete();
|
161
|
+
}
|
162
|
+
onAdd() {
|
163
|
+
console.log(this.basePath);
|
164
|
+
this.router.navigate([this.basePath + '/add']);
|
165
|
+
// this.navCtrl.navigateForward(this.basePath + '/add');
|
166
|
+
}
|
167
|
+
editModel(model) {
|
168
|
+
if (this.canEdit)
|
169
|
+
this.router.navigate([this.basePath + '/edit/', model.id]);
|
170
|
+
// this.navCtrl.navigateForward(this.basePath + '/edit/' + model.id);
|
171
|
+
}
|
172
|
+
getListLayout() {
|
173
|
+
if (!this.model) {
|
174
|
+
this.model = this.modelService.newModel();
|
175
|
+
}
|
176
|
+
this.allColumns = [];
|
177
|
+
this.columns = [];
|
178
|
+
this.allColumns = Reflect.getMetadata('IonicDataTableLayout', this.model).map((item) => {
|
179
|
+
if (!item.isTranslated) {
|
180
|
+
item.name = this.translate.instant(item.name);
|
181
|
+
item.isTranslated = true;
|
182
|
+
}
|
183
|
+
return item;
|
184
|
+
});
|
185
|
+
this.allColumns.sort((a, b) => a.order - b.order);
|
186
|
+
if (this.canDelete || this.canEdit) {
|
187
|
+
this.allColumns.push({
|
188
|
+
cellTemplate: this.actionsTmpl,
|
189
|
+
name: '',
|
190
|
+
cellClass: 'actions-cell',
|
191
|
+
draggable: false,
|
192
|
+
sortable: false,
|
193
|
+
visible: true
|
194
|
+
// width: 100,
|
195
|
+
// maxWidth: 100,
|
196
|
+
// minWidth: 100
|
197
|
+
});
|
198
|
+
}
|
199
|
+
this.columns = this.allColumns.filter((item) => item.visible);
|
200
|
+
// Sort the columns array by the order property
|
201
|
+
}
|
202
|
+
deleteModel(model) {
|
203
|
+
const msg = 'Do you want to delete ' + model[this.deletePropertyName] + '?';
|
204
|
+
this.dialogService.confirm(msg).then((value) => {
|
205
|
+
if (value.data) {
|
206
|
+
this.modelService.delete(model.id).subscribe(() => {
|
207
|
+
const tempData = [];
|
208
|
+
// this.selectedObject.emit(null);
|
209
|
+
this.data.map((item) => {
|
210
|
+
if (item.id !== model.id) {
|
211
|
+
tempData.push(item);
|
212
|
+
}
|
213
|
+
});
|
214
|
+
this.data = tempData;
|
215
|
+
});
|
216
|
+
}
|
217
|
+
});
|
218
|
+
}
|
219
|
+
deleteEnabled(model) {
|
220
|
+
if (this.canDelete) {
|
221
|
+
if (this.deleteDisableRule) {
|
222
|
+
return this.evaluateRule(this.deleteDisableRule, model);
|
223
|
+
}
|
224
|
+
else {
|
225
|
+
return true;
|
226
|
+
}
|
227
|
+
}
|
228
|
+
else {
|
229
|
+
return false;
|
230
|
+
}
|
231
|
+
}
|
232
|
+
evaluateRule(rules, model) {
|
233
|
+
let result = true;
|
234
|
+
rules.forEach(rule => {
|
235
|
+
let jsonRule;
|
236
|
+
if (typeof rule.rule === 'string') {
|
237
|
+
jsonRule = JSON.parse(rule.rule);
|
238
|
+
}
|
239
|
+
else {
|
240
|
+
jsonRule = rule.rule;
|
241
|
+
}
|
242
|
+
if (rule.parameters) {
|
243
|
+
const data = '{' + rule.parameters.map((item) => {
|
244
|
+
return '"' + item + '":"' + model[item] + '"';
|
245
|
+
}).join(',') + '}';
|
246
|
+
result = jsonLogic.apply(jsonRule, JSON.parse(data));
|
247
|
+
}
|
248
|
+
else {
|
249
|
+
result = jsonLogic.apply(jsonRule);
|
250
|
+
}
|
251
|
+
});
|
252
|
+
return result;
|
253
|
+
}
|
254
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: RslIonicDataTableComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.TranslateService }, { token: i3.Location }, { token: i0.Injector }, { token: i4.NavController }, { token: i5.IonicDialogService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
255
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: RslIonicDataTableComponent, isStandalone: true, selector: "app-rsl-ionic-data-table", inputs: { showSerach: "showSerach", searchFields: "searchFields", customInclude: "customInclude", defaultSort: "defaultSort", defaultSortDirection: "defaultSortDirection", deletePropertyName: "deletePropertyName", defaultFilter: "defaultFilter", showHeader: "showHeader", deleteDisableRule: "deleteDisableRule", hasAdd: "hasAdd", canDelete: "canDelete", canEdit: "canEdit", model: "model", modelService: "modelService" }, viewQueries: [{ propertyName: "actionsTmpl", first: true, predicate: ["actionsTmpl"], descendants: true, static: true }], ngImport: i0, template: "<ion-header *ngIf=\"showHeader\">\n <ion-toolbar>\n <ion-buttons slot=\"start\">\n <ion-menu-button></ion-menu-button>\n <ion-back-button></ion-back-button>\n </ion-buttons>\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\n </ion-toolbar>\n <ng-container [ngTemplateOutlet]=\"search\"></ng-container>\n</ion-header>\n\n<ion-content [fullscreen]=\"true\">\n\n <ion-refresher slot=\"fixed\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <ngx-datatable class=\"material fullscreen rls-server-scrolling\" style=\"top: 115px\" [rows]=\"data\" [columns]=\"columns\"\n [columnMode]=\"ColumnMode.standard\" [headerHeight]=\"headerHeight\" [rowHeight]=\"rowHeight\" [scrollbarV]=\"true\"\n [loadingIndicator]=\"isLoading\" [scrollbarH]=\"true\" (scroll)=\"onScroll($event.offsetY)\"\n >\n </ngx-datatable>\n \n <ng-template #actionsTmpl let-row=\"row\" let-value=\"value\">\n <ion-button fill=\"clear\" *ngIf=\"canEdit\" (click)='editModel(row)'>\n <ion-icon slot=\"icon-only\" name=\"create\" (click)='editModel(row)'></ion-icon>\n </ion-button>\n <ion-button fill=\"clear\" *ngIf=\"deleteEnabled(row)\" (click)='deleteModel(row)'>\n <ion-icon color=\"danger\" slot=\"icon-only\" name=\"trash\" (click)='deleteModel(row)'></ion-icon>\n </ion-button>\n </ng-template>\n\n</ion-content>\n\n<ng-template #header>\n <ion-title class=\"ion-text-center\">{{title}}</ion-title>\n <ion-button slot=\"end\" (click)=\"onAdd()\" fill=\"clear\" *ngIf=\"hasAdd\">\n <ion-icon size=\"large\" name=\"add\"></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)}::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: RslIonicModuleModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.IonBackButton, selector: "ion-back-button", inputs: ["color", "defaultHref", "disabled", "icon", "mode", "routerAnimation", "text", "type"] }, { kind: "component", type: i4.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: i4.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonMenuButton, selector: "ion-menu-button", inputs: ["autoHide", "color", "disabled", "menu", "mode", "type"] }, { kind: "component", type: i4.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i4.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i4.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: i4.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i4.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i4.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i4.IonBackButtonDelegate, selector: "ion-back-button", inputs: ["defaultHref", "routerAnimation"] }, { 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"] }] }); }
|
256
|
+
}
|
257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: RslIonicDataTableComponent, decorators: [{
|
258
|
+
type: Component,
|
259
|
+
args: [{ standalone: true, selector: 'app-rsl-ionic-data-table', imports: [RslIonicModuleModule], template: "<ion-header *ngIf=\"showHeader\">\n <ion-toolbar>\n <ion-buttons slot=\"start\">\n <ion-menu-button></ion-menu-button>\n <ion-back-button></ion-back-button>\n </ion-buttons>\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\n </ion-toolbar>\n <ng-container [ngTemplateOutlet]=\"search\"></ng-container>\n</ion-header>\n\n<ion-content [fullscreen]=\"true\">\n\n <ion-refresher slot=\"fixed\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <ngx-datatable class=\"material fullscreen rls-server-scrolling\" style=\"top: 115px\" [rows]=\"data\" [columns]=\"columns\"\n [columnMode]=\"ColumnMode.standard\" [headerHeight]=\"headerHeight\" [rowHeight]=\"rowHeight\" [scrollbarV]=\"true\"\n [loadingIndicator]=\"isLoading\" [scrollbarH]=\"true\" (scroll)=\"onScroll($event.offsetY)\"\n >\n </ngx-datatable>\n \n <ng-template #actionsTmpl let-row=\"row\" let-value=\"value\">\n <ion-button fill=\"clear\" *ngIf=\"canEdit\" (click)='editModel(row)'>\n <ion-icon slot=\"icon-only\" name=\"create\" (click)='editModel(row)'></ion-icon>\n </ion-button>\n <ion-button fill=\"clear\" *ngIf=\"deleteEnabled(row)\" (click)='deleteModel(row)'>\n <ion-icon color=\"danger\" slot=\"icon-only\" name=\"trash\" (click)='deleteModel(row)'></ion-icon>\n </ion-button>\n </ng-template>\n\n</ion-content>\n\n<ng-template #header>\n <ion-title class=\"ion-text-center\">{{title}}</ion-title>\n <ion-button slot=\"end\" (click)=\"onAdd()\" fill=\"clear\" *ngIf=\"hasAdd\">\n <ion-icon size=\"large\" name=\"add\"></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)}::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"] }]
|
260
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.TranslateService }, { type: i3.Location }, { type: i0.Injector }, { type: i4.NavController }, { type: i5.IonicDialogService }, { type: i0.ElementRef }]; }, propDecorators: { actionsTmpl: [{
|
261
|
+
type: ViewChild,
|
262
|
+
args: ['actionsTmpl', { static: true }]
|
263
|
+
}], showSerach: [{
|
264
|
+
type: Input
|
265
|
+
}], searchFields: [{
|
266
|
+
type: Input
|
267
|
+
}], customInclude: [{
|
268
|
+
type: Input
|
269
|
+
}], defaultSort: [{
|
270
|
+
type: Input
|
271
|
+
}], defaultSortDirection: [{
|
272
|
+
type: Input
|
273
|
+
}], deletePropertyName: [{
|
274
|
+
type: Input
|
275
|
+
}], defaultFilter: [{
|
276
|
+
type: Input
|
277
|
+
}], showHeader: [{
|
278
|
+
type: Input
|
279
|
+
}], deleteDisableRule: [{
|
280
|
+
type: Input
|
281
|
+
}], hasAdd: [{
|
282
|
+
type: Input
|
283
|
+
}], canDelete: [{
|
284
|
+
type: Input
|
285
|
+
}], canEdit: [{
|
286
|
+
type: Input
|
287
|
+
}], model: [{
|
288
|
+
type: Input
|
289
|
+
}], modelService: [{
|
290
|
+
type: Input
|
291
|
+
}] } });
|
292
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNsLWlvbmljLWRhdGEtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcm9zb2Z0bGFiL2lvbmljL3NyYy9saWIvY29tcG9uZW50cy9yc2wtaW9uaWMtZGF0YS10YWJsZS9yc2wtaW9uaWMtZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yb3NvZnRsYWIvaW9uaWMvc3JjL2xpYi9jb21wb25lbnRzL3JzbC1pb25pYy1kYXRhLXRhYmxlL3JzbC1pb25pYy1kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLGNBQWMsRUFBMEIsZUFBZSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRSxPQUFPLEtBQUssU0FBUyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7OztBQVNyRSxNQUFNLE9BQU8sMEJBQTBCO0lBbUNyQyxZQUNTLE1BQWMsRUFDZCxLQUFxQixFQUNyQixTQUEyQixF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S0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIE5hdmlnYXRpb25TdGFydCwgUm91dGVyLCBVcmxTZWdtZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE5hdkNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCYXNlUXVlcnlEYXRhLCBCYXNlU2VydmljZSwgUnVsZSB9IGZyb20gJ0Byb3NvZnRsYWIvY29yZSc7XG5pbXBvcnQgeyBCYXNlTW9kZWxGb3JtbHkgfSBmcm9tICdAcm9zb2Z0bGFiL2Zvcm1seSc7XG5pbXBvcnQgeyBDb2x1bW5Nb2RlLCBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnQHN3aW1sYW5lL25neC1kYXRhdGFibGUnO1xuaW1wb3J0ICogYXMganNvbkxvZ2ljIGZyb20gJ2pzb24tbG9naWMtanMvbG9naWMuanMnO1xuaW1wb3J0IHsgSW9uaWNEYXRhVGFibGVMYXlvdXRDb25maWcgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lvbmljLWRhdGF0YWJsZS1sYXlvdXQnO1xuaW1wb3J0IHsgSW9uaWNEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW9uaWMtZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnNsSW9uaWNNb2R1bGVNb2R1bGUgfSBmcm9tICcuLi8uLi9yc2wtaW9uaWMtbW9kdWxlLm1vZHVsZSc7XG5leHBvcnQgZGVjbGFyZSB0eXBlIFNvcnREaXJlY3Rpb24gPSAnYXNjJyB8ICdkZXNjJyB8ICcnO1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYXBwLXJzbC1pb25pYy1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JzbC1pb25pYy1kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcnNsLWlvbmljLWRhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW1JzbElvbmljTW9kdWxlTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgUnNsSW9uaWNEYXRhVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIEJhc2VNb2RlbEZvcm1seSwgVSBleHRlbmRzIEJhc2VTZXJ2aWNlPFQ+PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2FjdGlvbnNUbXBsJywgeyBzdGF0aWM6IHRydWUgfSkgYWN0aW9uc1RtcGw6IFRlbXBsYXRlUmVmPGFueT47XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93U2VyYWNoOiBib29sZWFuO1xuICBASW5wdXQoKSBzZWFyY2hGaWVsZHM6IHN0cmluZztcbiAgQElucHV0KCkgY3VzdG9tSW5jbHVkZTogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0U29ydDogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0U29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbjtcbiAgQElucHV0KCkgZGVsZXRlUHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlZmF1bHRGaWx0ZXI6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVsZXRlRGlzYWJsZVJ1bGU6IFJ1bGVbXTtcbiAgQElucHV0KCkgaGFzQWRkOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5EZWxldGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkVkaXQ6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgbW9kZWw6IFQ7XG4gIEBJbnB1dCgpIG1vZGVsU2VydmljZTogVVxuXG4gIGRhdGE6IGFueVtdID0gW107XG4gIHBhZ2VJbmRleDogbnVtYmVyID0gMTtcbiAgcGFnZVNpemU6IG51bWJlciA9IDMwXG5cbiAgYmFzZVBhdGg6IHN0cmluZztcblxuICBjb2x1bW5zID0gW107XG4gIGFsbENvbHVtbnMgPSBbXTtcbiAgQ29sdW1uTW9kZSA9IENvbHVtbk1vZGU7XG4gIFNlbGVjdGlvblR5cGUgPSBTZWxlY3Rpb25UeXBlO1xuXG4gIHJlYWRvbmx5IGhlYWRlckhlaWdodCA9IDUwO1xuICByZWFkb25seSByb3dIZWlnaHQgPSA1MDtcbiAgaXNMb2FkaW5nOiBib29sZWFuO1xuICBmaWx0ZXJWYWx1ZTogc3RyaW5nO1xuICBvbGRPZmZzZXRZOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIG5hdkN0cmw6IE5hdkNvbnRyb2xsZXIsXG4gICAgcHVibGljIGRpYWxvZ1NlcnZpY2U6IElvbmljRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7XG5cbiAgfVxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldFZhbHVlRnJvbVNuYXBzaG90KHRoaXMsIHRoaXMucm91dGUuc25hcHNob3QsICdzaG93U2VyYWNoJywgZmFsc2UpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ3NlYXJjaEZpZWxkcycsIG51bGwpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2N1c3RvbUluY2x1ZGUnLCBudWxsKTtcbiAgICB0aGlzLnNldFZhbHVlRnJvbVNuYXBzaG90KHRoaXMsIHRoaXMucm91dGUuc25hcHNob3QsICdkZWZhdWx0U29ydCcsIG51bGwpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2RlZmF1bHRTb3J0RGlyZWN0aW9uJywgJycpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2RlbGV0ZVByb3BlcnR5TmFtZScsICduYW1lJyk7XG4gICAgdGhpcy5zZXRWYWx1ZUZyb21TbmFwc2hvdCh0aGlzLCB0aGlzLnJvdXRlLnNuYXBzaG90LCAnZGVmYXVsdEZpbHRlcicsIG51bGwpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ3Nob3dIZWFkZXInLCB0cnVlKTtcbiAgICB0aGlzLnNldFZhbHVlRnJvbVNuYXBzaG90KHRoaXMsIHRoaXMucm91dGUuc25hcHNob3QsICdkZWxldGVEaXNhYmxlUnVsZScsIG51bGwpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2hhc0FkZCcsIHRydWUpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2NhbkRlbGV0ZScsIHRydWUpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2NhbkVkaXQnLCB0cnVlKTtcbiAgICBpZiAoIXRoaXMubW9kZWxTZXJ2aWNlKSB7XG4gICAgICBjb25zdCBTRVJWSUNFX1RPS0VOID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhWydyZXF1aXJlZFNlcnZpY2UnXTtcbiAgICAgIHRoaXMubW9kZWxTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQ8VT4oPGFueT5TRVJWSUNFX1RPS0VOKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbCA9IHRoaXMubW9kZWxTZXJ2aWNlLm5ld01vZGVsKClcbiAgICB0aGlzLnRpdGxlID0gdGhpcy5tb2RlbC5tb2RlbENvbmZpZy5mb3JtVGl0bGVcbiAgICB0aGlzLmdldExpc3RMYXlvdXQoKVxuXG4gICAgY29uc3QgY3VycmVudFVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10gPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJy8nKS5tYXAoc2VnbWVudCA9PiBuZXcgVXJsU2VnbWVudChzZWdtZW50LCB7fSkpO1xuICAgIHRoaXMuYmFzZVBhdGggPSBjdXJyZW50VXJsU2VnbWVudHMubWFwKHNlZ21lbnQgPT4gc2VnbWVudC5wYXRoKS5qb2luKCcvJyk7XG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpIHtcbiAgICAgICAgLy8gTmF2aWdhdGlvbiB0byBhbm90aGVyIHBhZ2UgaXMgYWJvdXQgdG8gb2NjdXJcbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICAgIHRoaXMucGFnZUluZGV4ID0gMVxuICAgICAgICAvLyBQZXJmb3JtIGFjdGlvbnMgb3IgdXBkYXRlIGNvbXBvbmVudCBhcyBuZWVkZWRcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgLy8gdGhpcy5vblNjcm9sbCgwKTtcbiAgfVxuICBzZXRWYWx1ZUZyb21TbmFwc2hvdDxUPihjb21wb25lbnQ6IGFueSwgc25hcHNob3Q6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAoY29tcG9uZW50W2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGRhdGFGcm9tU25hcHNob3QgPSBzbmFwc2hvdC5kYXRhW2tleV07XG4gICAgICBpZiAoZGF0YUZyb21TbmFwc2hvdCA9PT0gbnVsbCB8fCBkYXRhRnJvbVNuYXBzaG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGF0YUZyb21TbmFwc2hvdCA9IHNuYXBzaG90LnBhcmFtc1trZXldO1xuICAgICAgfVxuICAgICAgY29tcG9uZW50W2tleV0gPSBkYXRhRnJvbVNuYXBzaG90ICE9PSB1bmRlZmluZWQgPyBkYXRhRnJvbVNuYXBzaG90IDogZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuICBvblNjcm9sbChvZmZzZXRZOiBudW1iZXIpIHtcbiAgICBpZiAob2Zmc2V0WSkge1xuICAgICAgaWYgKHRoaXMub2xkT2Zmc2V0WSAhPT0gb2Zmc2V0WSkge1xuICAgICAgICB0aGlzLm9sZE9mZnNldFkgPSBvZmZzZXRZO1xuICAgICAgICBjb25zdCB2aWV3SGVpZ2h0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAtIHRoaXMuaGVhZGVySGVpZ2h0O1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2FkaW5nICYmIG9mZnNldFkgKyB2aWV3SGVpZ2h0ID49IHRoaXMuZGF0YS5sZW5ndGggKiB0aGlzLnJvd0hlaWdodCkge1xuICAgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiByZXN1bHRzIHRvIGxvYWRcbiAgICAgICAgICBsZXQgbGltaXQgPSB0aGlzLnBhZ2VTaXplO1xuXG4gICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZW4ndCBmZXRjaGVkIGFueSByZXN1bHRzIHlldFxuICAgICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiByb3dzIHRoYXQgZml0IHdpdGhpbiB2aWV3cG9ydFxuICAgICAgICAgICAgY29uc3QgcGFnZVNpemUgPSBNYXRoLmNlaWwodmlld0hlaWdodCAvIHRoaXMucm93SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBsaW1pdCB0byBwYWdlU2l6ZSBzdWNoIHRoYXQgd2UgZmlsbCB0aGUgZmlyc3QgcGFnZSBlbnRpcmVseVxuICAgICAgICAgICAgLy8gKG90aGVyd2lzZSwgd2Ugd29uJ3QgYmUgYWJsZSB0byBzY3JvbGwgcGFzdCBpdClcbiAgICAgICAgICAgIGxpbWl0ID0gTWF0aC5tYXgocGFnZVNpemUsIHRoaXMucGFnZVNpemUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0aGlzLnBhZ2VJbmRleFxuICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBsaW1pdFxuICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICAgICAgICAvLyB0aGlzLmxvYWRQYWdlKGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBhc3luYyBpb25WaWV3V2lsbEVudGVyKCkge1xuICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgfVxuICBhc3luYyBoYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlclZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5kYXRhID0gW107XG4gICAgdGhpcy5wYWdlSW5kZXggPSAxXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG4gIGxvYWREYXRhKGV2ZW50ID0gbnVsbCkge1xuICAgIGNvbnN0IGZpbHRlcnMgPSBbXTtcbiAgICBsZXQgc29ydHMgPSAnJztcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFNvcnQpIHtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRTb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHtcbiAgICAgICAgc29ydHMgPSAnLScgKyB0aGlzLmRlZmF1bHRTb3J0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc29ydHMgPSB0aGlzLmRlZmF1bHRTb3J0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zaG93U2VyYWNoKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJWYWx1ZSkge1xuICAgICAgICBjb25zdCB5ID0gJygnICsgdGhpcy5zZWFyY2hGaWVsZHMucmVwbGFjZSgnLCcsICd8JykgKyAnKSc7XG4gICAgICAgIGZpbHRlcnMucHVzaCh5ICsgJ0A9KicgKyB0aGlzLmZpbHRlclZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGVmYXVsdEZpbHRlcikge1xuICAgICAgZmlsdGVycy5wdXNoKHRoaXMuZGVmYXVsdEZpbHRlcilcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzVmFsdWUgPSBmaWx0ZXJzLmpvaW4oJywgJyk7XG4gICAgICB0aGlzLm1vZGVsU2VydmljZS5nZXRBbGwodGhpcy5wYWdlSW5kZXgsIHRoaXMucGFnZVNpemUsIHNvcnRzLCBmaWx0ZXJzVmFsdWUsIHRoaXMuY3VzdG9tSW5jbHVkZSkuc3Vic2NyaWJlKFxuICAgICAgICAocmVzcG9uc2U6IEJhc2VRdWVyeURhdGE8VD4pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5wYWdlSW5kZXggIT09IHJlc3BvbnNlLmdldE1ldGEoKS5tZXRhLmNvdW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VJbmRleCsrXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChldmVudCkgZXZlbnQudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaWYgKHRoaXMuZmlsdGVyVmFsdWUpXG4gICAgICAgICAgLy8gICB0aGlzLmRhdGEgPSByZXNwb25zZS5nZXRNb2RlbHMoKTtcbiAgICAgICAgICAvLyBlbHNlXG4gICAgICAgICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLmRhdGEsIC4uLnJlc3BvbnNlLmdldE1vZGVscygpXTtcbiAgICAgICAgICB0aGlzLmRhdGEgPSByb3dzO1xuICAgICAgICAgIC8vIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoKTtcblxuICAgICAgICAgIGlmIChldmVudCkgZXZlbnQudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICB9LCA3MDApO1xuICB9XG4gIGFzeW5jIGhhbmRsZVJlZnJlc2goZXZlbnQpIHtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDFcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgZXZlbnQudGFyZ2V0LmNvbXBsZXRlKCk7XG4gIH1cbiAgb25BZGQoKSB7XG4gICAgY29uc29sZS5sb2codGhpcy5iYXNlUGF0aClcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5iYXNlUGF0aCArICcvYWRkJ10pXG4gICAgLy8gdGhpcy5uYXZDdHJsLm5hdmlnYXRlRm9yd2FyZCh0aGlzLmJhc2VQYXRoICsgJy9hZGQnKTtcbiAgfVxuICBlZGl0TW9kZWwobW9kZWw6IEJhc2VNb2RlbEZvcm1seSkge1xuICAgIGlmICh0aGlzLmNhbkVkaXQpXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5iYXNlUGF0aCArICcvZWRpdC8nLCBtb2RlbC5pZF0pO1xuICAgIC8vIHRoaXMubmF2Q3RybC5uYXZpZ2F0ZUZvcndhcmQodGhpcy5iYXNlUGF0aCArICcvZWRpdC8nICsgbW9kZWwuaWQpO1xuICB9XG4gIGdldExpc3RMYXlvdXQoKSB7XG4gICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICB0aGlzLm1vZGVsID0gdGhpcy5tb2RlbFNlcnZpY2UubmV3TW9kZWwoKTsgICAgXG4gICAgfVxuICAgIHRoaXMuYWxsQ29sdW1ucz1bXTtcbiAgICB0aGlzLmNvbHVtbnM9W107XG4gICAgdGhpcy5hbGxDb2x1bW5zID0gUmVmbGVjdC5nZXRNZXRhZGF0YSgnSW9uaWNEYXRhVGFibGVMYXlvdXQnLCB0aGlzLm1vZGVsKS5tYXAoKGl0ZW06IElvbmljRGF0YVRhYmxlTGF5b3V0Q29uZmlnKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0uaXNUcmFuc2xhdGVkKSB7XG4gICAgICAgIGl0ZW0ubmFtZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoaXRlbS5uYW1lKTtcbiAgICAgICAgaXRlbS5pc1RyYW5zbGF0ZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWxsQ29sdW1ucy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG5cbiAgICBpZiAodGhpcy5jYW5EZWxldGUgfHwgdGhpcy5jYW5FZGl0KSB7XG4gICAgICB0aGlzLmFsbENvbHVtbnMucHVzaCh7XG4gICAgICAgIGNlbGxUZW1wbGF0ZTogdGhpcy5hY3Rpb25zVG1wbCxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIGNlbGxDbGFzczogJ2FjdGlvbnMtY2VsbCcsXG4gICAgICAgIGRyYWdnYWJsZTogZmFsc2UsXG4gICAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgICAvLyB3aWR0aDogMTAwLFxuICAgICAgICAvLyBtYXhXaWR0aDogMTAwLFxuICAgICAgICAvLyBtaW5XaWR0aDogMTAwXG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmFsbENvbHVtbnMuZmlsdGVyKChpdGVtOiBJb25pY0RhdGFUYWJsZUxheW91dENvbmZpZykgPT4gaXRlbS52aXNpYmxlKTtcbiAgICAvLyBTb3J0IHRoZSBjb2x1bW5zIGFycmF5IGJ5IHRoZSBvcmRlciBwcm9wZXJ0eVxuXG4gIH1cbiAgZGVsZXRlTW9kZWwobW9kZWwpIHtcbiAgICBjb25zdCBtc2cgPSAnRG8geW91IHdhbnQgdG8gZGVsZXRlICcgKyBtb2RlbFt0aGlzLmRlbGV0ZVByb3BlcnR5TmFtZV0gKyAnPyc7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNvbmZpcm0obXNnKS50aGVuKFxuICAgICAgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmRhdGEpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsU2VydmljZS5kZWxldGUobW9kZWwuaWQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wRGF0YSA9IFtdO1xuICAgICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZE9iamVjdC5lbWl0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5kYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXRlbS5pZCAhPT0gbW9kZWwuaWQpIHtcbiAgICAgICAgICAgICAgICB0ZW1wRGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRlbXBEYXRhO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgZGVsZXRlRW5hYmxlZChtb2RlbDogVCkge1xuICAgIGlmICh0aGlzLmNhbkRlbGV0ZSkge1xuICAgICAgaWYgKHRoaXMuZGVsZXRlRGlzYWJsZVJ1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVSdWxlKHRoaXMuZGVsZXRlRGlzYWJsZVJ1bGUsIG1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZXZhbHVhdGVSdWxlKHJ1bGVzOiBSdWxlW10sIG1vZGVsOiBUKTogYm9vbGVhbiB7XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgIGxldCBqc29uUnVsZTogYW55O1xuICAgICAgaWYgKHR5cGVvZiBydWxlLnJ1bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGpzb25SdWxlID0gSlNPTi5wYXJzZShydWxlLnJ1bGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvblJ1bGUgPSBydWxlLnJ1bGU7XG4gICAgICB9XG4gICAgICBpZiAocnVsZS5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAneycgKyBydWxlLnBhcmFtZXRlcnMubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gJ1wiJyArIGl0ZW0gKyAnXCI6XCInICsgbW9kZWxbaXRlbV0gKyAnXCInO1xuICAgICAgICB9KS5qb2luKCcsJykgKyAnfSc7XG4gICAgICAgIHJlc3VsdCA9IGpzb25Mb2dpYy5hcHBseShqc29uUnVsZSwgSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBqc29uTG9naWMuYXBwbHkoanNvblJ1bGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuXG59XG4iLCI8aW9uLWhlYWRlciAqbmdJZj1cInNob3dIZWFkZXJcIj5cbiAgPGlvbi10b29sYmFyPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tbWVudS1idXR0b24+PC9pb24tbWVudS1idXR0b24+XG4gICAgICA8aW9uLWJhY2stYnV0dG9uPjwvaW9uLWJhY2stYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9pb24tdG9vbGJhcj5cbiAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWFyY2hcIj48L25nLWNvbnRhaW5lcj5cbjwvaW9uLWhlYWRlcj5cblxuPGlvbi1jb250ZW50IFtmdWxsc2NyZWVuXT1cInRydWVcIj5cblxuICA8aW9uLXJlZnJlc2hlciBzbG90PVwiZml4ZWRcIiAoaW9uUmVmcmVzaCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAgICA8aW9uLXJlZnJlc2hlci1jb250ZW50PjwvaW9uLXJlZnJlc2hlci1jb250ZW50PlxuICA8L2lvbi1yZWZyZXNoZXI+XG5cbiAgPG5neC1kYXRhdGFibGUgY2xhc3M9XCJtYXRlcmlhbCBmdWxsc2NyZWVuIHJscy1zZXJ2ZXItc2Nyb2xsaW5nXCIgc3R5bGU9XCJ0b3A6IDExNXB4XCIgW3Jvd3NdPVwiZGF0YVwiIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgIFtjb2x1bW5Nb2RlXT1cIkNvbHVtbk1vZGUuc3RhbmRhcmRcIiBbaGVhZGVySGVpZ2h0XT1cImhlYWRlckhlaWdodFwiIFtyb3dIZWlnaHRdPVwicm93SGVpZ2h0XCIgW3Njcm9sbGJhclZdPVwidHJ1ZVwiXG4gICAgW2xvYWRpbmdJbmRpY2F0b3JdPVwiaXNMb2FkaW5nXCIgW3Njcm9sbGJhckhdPVwidHJ1ZVwiIChzY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50Lm9mZnNldFkpXCJcbiAgID5cbiAgPC9uZ3gtZGF0YXRhYmxlPlxuICBcbiAgPG5nLXRlbXBsYXRlICNhY3Rpb25zVG1wbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAgICA8aW9uLWJ1dHRvbiAgZmlsbD1cImNsZWFyXCIgKm5nSWY9XCJjYW5FZGl0XCIgKGNsaWNrKT0nZWRpdE1vZGVsKHJvdyknPlxuICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY3JlYXRlXCIgKGNsaWNrKT0nZWRpdE1vZGVsKHJvdyknPjwvaW9uLWljb24+XG4gICAgPC9pb24tYnV0dG9uPlxuICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiICpuZ0lmPVwiZGVsZXRlRW5hYmxlZChyb3cpXCIgKGNsaWNrKT0nZGVsZXRlTW9kZWwocm93KSc+XG4gICAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cInRyYXNoXCIgKGNsaWNrKT0nZGVsZXRlTW9kZWwocm93KSc+PC9pb24taWNvbj5cbiAgICA8L2lvbi1idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyPlxuICA8aW9uLXRpdGxlIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+e3t0aXRsZX19PC9pb24tdGl0bGU+XG4gIDxpb24tYnV0dG9uIHNsb3Q9XCJlbmRcIiAoY2xpY2spPVwib25BZGQoKVwiIGZpbGw9XCJjbGVhclwiICpuZ0lmPVwiaGFzQWRkXCI+XG4gICAgPGlvbi1pY29uIHNpemU9XCJsYXJnZVwiIG5hbWU9XCJhZGRcIj48L2lvbi1pY29uPlxuICA8L2lvbi1idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NlYXJjaD5cbiAgPGlvbi10b29sYmFyICpuZ0lmPVwic2hvd1NlcmFjaFwiPlxuICAgIDxpb24tc2VhcmNoYmFyIFtkZWJvdW5jZV09XCIxMDAwXCIgKGlvbkNoYW5nZSk9XCJoYW5kbGVDaGFuZ2UoJGV2ZW50KVwiPjwvaW9uLXNlYXJjaGJhcj5cbiAgPC9pb24tdG9vbGJhcj5cbjwvbmctdGVtcGxhdGU+Il19
|