@rosoftlab/core 0.0.100

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.
Files changed (90) hide show
  1. package/README.md +6 -0
  2. package/esm2020/lib/base-components/base-form-edit.component.mjs +242 -0
  3. package/esm2020/lib/base-components/field-error-display/field-error-display.component.mjs +15 -0
  4. package/esm2020/lib/base-components/generic-table/generic-table.component.mjs +431 -0
  5. package/esm2020/lib/base-components/index.mjs +5 -0
  6. package/esm2020/lib/base-components/page-not-found/page-not-found.component.mjs +15 -0
  7. package/esm2020/lib/base-components/searchable-dropdown/searchable-dropdown.component.mjs +231 -0
  8. package/esm2020/lib/base-components/under-construction/under-construction.component.mjs +12 -0
  9. package/esm2020/lib/constants/symbols.mjs +3 -0
  10. package/esm2020/lib/converters/date/date.converter.mjs +12 -0
  11. package/esm2020/lib/decorators/attribute.decorator.mjs +85 -0
  12. package/esm2020/lib/decorators/base-datastore-config.decorator.mjs +7 -0
  13. package/esm2020/lib/decorators/base-model-config.decorator.mjs +10 -0
  14. package/esm2020/lib/decorators/custom.type.decorator.mjs +11 -0
  15. package/esm2020/lib/decorators/grid-layout.decorator.mjs +23 -0
  16. package/esm2020/lib/directives/translated-content.directive.mjs +96 -0
  17. package/esm2020/lib/directives/translated-element.directive.mjs +20 -0
  18. package/esm2020/lib/index.mjs +29 -0
  19. package/esm2020/lib/interfaces/attribute-decorator-options.interface.mjs +2 -0
  20. package/esm2020/lib/interfaces/datastore-config.interface.mjs +2 -0
  21. package/esm2020/lib/interfaces/model-config.interface.mjs +2 -0
  22. package/esm2020/lib/interfaces/overrides.interface.mjs +2 -0
  23. package/esm2020/lib/interfaces/property-converter.interface.mjs +2 -0
  24. package/esm2020/lib/material.mjs +94 -0
  25. package/esm2020/lib/models/base-meta.model.mjs +7 -0
  26. package/esm2020/lib/models/base-query-data.mjs +13 -0
  27. package/esm2020/lib/models/base.model.mjs +171 -0
  28. package/esm2020/lib/models/error-response.model.mjs +9 -0
  29. package/esm2020/lib/models/grid-layout-format.enum.mjs +15 -0
  30. package/esm2020/lib/models/grid-layout.mjs +18 -0
  31. package/esm2020/lib/models/rule.mjs +6 -0
  32. package/esm2020/lib/module.mjs +55 -0
  33. package/esm2020/lib/pipes/Nl2brPipe.pipe.mjs +21 -0
  34. package/esm2020/lib/pipes/input-error.pipe.mjs +37 -0
  35. package/esm2020/lib/providers.mjs +10 -0
  36. package/esm2020/lib/services/base-datastore.service.mjs +333 -0
  37. package/esm2020/lib/services/base.service.mjs +95 -0
  38. package/esm2020/lib/services/dialog.service.mjs +150 -0
  39. package/esm2020/lib/services/grid-layout.service.mjs +21 -0
  40. package/esm2020/lib/services/index.mjs +5 -0
  41. package/esm2020/lib/validators/pattern-validator.mjs +15 -0
  42. package/esm2020/public-api.mjs +12 -0
  43. package/esm2020/rosoftlab-core.mjs +5 -0
  44. package/fesm2015/rosoftlab-core.mjs +2217 -0
  45. package/fesm2015/rosoftlab-core.mjs.map +1 -0
  46. package/fesm2020/rosoftlab-core.mjs +2210 -0
  47. package/fesm2020/rosoftlab-core.mjs.map +1 -0
  48. package/lib/base-components/base-form-edit.component.d.ts +58 -0
  49. package/lib/base-components/field-error-display/field-error-display.component.d.ts +7 -0
  50. package/lib/base-components/generic-table/generic-table.component.d.ts +93 -0
  51. package/lib/base-components/index.d.ts +4 -0
  52. package/lib/base-components/page-not-found/page-not-found.component.d.ts +8 -0
  53. package/lib/base-components/searchable-dropdown/searchable-dropdown.component.d.ts +62 -0
  54. package/lib/base-components/under-construction/under-construction.component.d.ts +6 -0
  55. package/lib/constants/symbols.d.ts +1 -0
  56. package/lib/converters/date/date.converter.d.ts +5 -0
  57. package/lib/decorators/attribute.decorator.d.ts +2 -0
  58. package/lib/decorators/base-datastore-config.decorator.d.ts +1 -0
  59. package/lib/decorators/base-model-config.decorator.d.ts +1 -0
  60. package/lib/decorators/custom.type.decorator.d.ts +1 -0
  61. package/lib/decorators/grid-layout.decorator.d.ts +2 -0
  62. package/lib/directives/translated-content.directive.d.ts +21 -0
  63. package/lib/directives/translated-element.directive.d.ts +10 -0
  64. package/lib/index.d.ts +27 -0
  65. package/lib/interfaces/attribute-decorator-options.interface.d.ts +8 -0
  66. package/lib/interfaces/datastore-config.interface.d.ts +8 -0
  67. package/lib/interfaces/model-config.interface.d.ts +8 -0
  68. package/lib/interfaces/overrides.interface.d.ts +5 -0
  69. package/lib/interfaces/property-converter.interface.d.ts +4 -0
  70. package/lib/material.d.ts +42 -0
  71. package/lib/models/base-meta.model.d.ts +5 -0
  72. package/lib/models/base-query-data.d.ts +7 -0
  73. package/lib/models/base.model.d.ts +33 -0
  74. package/lib/models/error-response.model.d.ts +17 -0
  75. package/lib/models/grid-layout-format.enum.d.ts +12 -0
  76. package/lib/models/grid-layout.d.ts +13 -0
  77. package/lib/models/rule.d.ts +5 -0
  78. package/lib/module.d.ts +14 -0
  79. package/lib/pipes/Nl2brPipe.pipe.d.ts +7 -0
  80. package/lib/pipes/input-error.pipe.d.ts +10 -0
  81. package/lib/providers.d.ts +2 -0
  82. package/lib/services/base-datastore.service.d.ts +45 -0
  83. package/lib/services/base.service.d.ts +26 -0
  84. package/lib/services/dialog.service.d.ts +21 -0
  85. package/lib/services/grid-layout.service.d.ts +9 -0
  86. package/lib/services/index.d.ts +4 -0
  87. package/lib/validators/pattern-validator.d.ts +4 -0
  88. package/package.json +53 -0
  89. package/public-api.d.ts +7 -0
  90. package/rosoftlab-core.d.ts +5 -0
@@ -0,0 +1,2210 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, Input, EventEmitter, Optional, Self, Output, Injectable, ElementRef, ViewEncapsulation, ViewChild, Directive, ContentChildren, NgModule, Pipe } from '@angular/core';
3
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
4
+ import * as i2 from '@angular/forms';
5
+ import { FormControl, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';
6
+ import { Subject, Observable, throwError, from, merge, of, fromEvent, BehaviorSubject, combineLatest } from 'rxjs';
7
+ import { filter, debounceTime, tap, switchMap, finalize, takeUntil, map, catchError, distinctUntilChanged, startWith } from 'rxjs/operators';
8
+ import * as i1 from '@angular/cdk/a11y';
9
+ import * as i3 from '@angular/material/form-field';
10
+ import * as i4 from '@angular/material/button';
11
+ import { MatButtonModule } from '@angular/material/button';
12
+ import * as i5 from '@angular/material/icon';
13
+ import { MatIconModule } from '@angular/material/icon';
14
+ import * as i6 from '@angular/material/autocomplete';
15
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
16
+ import * as i7 from '@angular/material/core';
17
+ import { MatNativeDateModule, MatRippleModule, MatOptionModule } from '@angular/material/core';
18
+ import * as i8 from '@angular/material/input';
19
+ import { MatInputModule } from '@angular/material/input';
20
+ import * as i3$1 from '@angular/common';
21
+ import { DatePipe, DecimalPipe, PercentPipe, CommonModule } from '@angular/common';
22
+ import * as i1$1 from '@ngx-translate/core';
23
+ import { TranslateModule } from '@ngx-translate/core';
24
+ import { __decorate } from 'tslib';
25
+ import * as i2$2 from 'ng-block-ui';
26
+ import { BlockUI, BlockUIModule } from 'ng-block-ui';
27
+ import * as i2$1 from '@angular/router';
28
+ import * as i1$2 from '@angular/common/http';
29
+ import { HttpHeaders, HttpParams, HttpErrorResponse, HttpClientModule } from '@angular/common/http';
30
+ import { compare } from 'fast-json-patch';
31
+ import * as qs from 'qs';
32
+ import Swal from 'sweetalert2';
33
+ import * as i12 from '@angular/cdk/drag-drop';
34
+ import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
35
+ import * as i9 from '@angular/material/paginator';
36
+ import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
37
+ import * as i8$1 from '@angular/material/sort';
38
+ import { MatSort, MatSortModule } from '@angular/material/sort';
39
+ import * as i6$1 from '@angular/material/table';
40
+ import { MatTableDataSource, MatTableModule } from '@angular/material/table';
41
+ import * as jsonLogic from 'json-logic-js/logic.js';
42
+ import * as i5$1 from '@angular/material/progress-spinner';
43
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
44
+ import * as i13 from '@angular/material/tooltip';
45
+ import { MatTooltipModule } from '@angular/material/tooltip';
46
+ import { parseISO } from 'date-fns';
47
+ import { MatButtonToggleModule } from '@angular/material/button-toggle';
48
+ import { MatCheckboxModule } from '@angular/material/checkbox';
49
+ import { MatChipsModule } from '@angular/material/chips';
50
+ import { MatGridListModule } from '@angular/material/grid-list';
51
+ import { MatMenuModule } from '@angular/material/menu';
52
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
53
+ import { MatSelectModule } from '@angular/material/select';
54
+ import { MatSidenavModule } from '@angular/material/sidenav';
55
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
56
+ import { MatSliderModule } from '@angular/material/slider';
57
+ import { MatSnackBarModule } from '@angular/material/snack-bar';
58
+ import { MatToolbarModule } from '@angular/material/toolbar';
59
+ import { MatCardModule } from '@angular/material/card';
60
+ import { MatTabsModule } from '@angular/material/tabs';
61
+ import { MatExpansionModule } from '@angular/material/expansion';
62
+ import { MatRadioModule } from '@angular/material/radio';
63
+ import { MatDatepickerModule } from '@angular/material/datepicker';
64
+ import { MatDividerModule } from '@angular/material/divider';
65
+ import { MatListModule } from '@angular/material/list';
66
+ import { MatDialogModule } from '@angular/material/dialog';
67
+ import { PortalModule } from '@angular/cdk/portal';
68
+ import { MatTreeModule } from '@angular/material/tree';
69
+ import { MatBadgeModule } from '@angular/material/badge';
70
+ import { MatStepperModule } from '@angular/material/stepper';
71
+ import { CdkStepperModule } from '@angular/cdk/stepper';
72
+
73
+ class FieldErrorDisplayComponent {
74
+ }
75
+ FieldErrorDisplayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: FieldErrorDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
76
+ FieldErrorDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: FieldErrorDisplayComponent, selector: "rsl-field-error-display", inputs: { errorMsg: "errorMsg", displayError: "displayError" }, ngImport: i0, template: "<div *ngIf=\"displayError\" >\n <!-- <span class=\"glyphicon glyphicon-remove form-control-feedback fix-error-icon\"></span> -->\n <span class=\"sr-only\">(error)</span>\n <div class=\"error-msg\">\n {{ errorMsg }}\n </div>\n</div>\n", styles: [".error-msg{color:red}.fix-error-icon{top:27px}\n"] });
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: FieldErrorDisplayComponent, decorators: [{
78
+ type: Component,
79
+ args: [{ selector: 'rsl-field-error-display', template: "<div *ngIf=\"displayError\" >\n <!-- <span class=\"glyphicon glyphicon-remove form-control-feedback fix-error-icon\"></span> -->\n <span class=\"sr-only\">(error)</span>\n <div class=\"error-msg\">\n {{ errorMsg }}\n </div>\n</div>\n", styles: [".error-msg{color:red}.fix-error-icon{top:27px}\n"] }]
80
+ }], propDecorators: { errorMsg: [{
81
+ type: Input
82
+ }], displayError: [{
83
+ type: Input
84
+ }] } });
85
+
86
+ class PageNotFoundComponent {
87
+ constructor() {
88
+ }
89
+ ngOnInit() {
90
+ }
91
+ }
92
+ PageNotFoundComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: PageNotFoundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
93
+ PageNotFoundComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: PageNotFoundComponent, selector: "rsl-page-not-found", ngImport: i0, template: "<div class=\"forms-view-container\">\n <div class=\"under-construction-view-container\">\n Page not found\n </div>\n</div>", styles: [".under-construction-view-container{height:calc(100vh - 250px);margin:60px 0 0;padding:0;display:flex;justify-content:center;align-items:center;box-sizing:border-box;font-size:1.8em;line-height:1.3em;font-weight:300;color:#58585b;text-align:center}\n"] });
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: PageNotFoundComponent, decorators: [{
95
+ type: Component,
96
+ args: [{ selector: 'rsl-page-not-found', template: "<div class=\"forms-view-container\">\n <div class=\"under-construction-view-container\">\n Page not found\n </div>\n</div>", styles: [".under-construction-view-container{height:calc(100vh - 250px);margin:60px 0 0;padding:0;display:flex;justify-content:center;align-items:center;box-sizing:border-box;font-size:1.8em;line-height:1.3em;font-weight:300;color:#58585b;text-align:center}\n"] }]
97
+ }], ctorParameters: function () { return []; } });
98
+
99
+ class SearchableDropdownComponent {
100
+ constructor(_focusMonitor, _elementRef, ngControl) {
101
+ this._focusMonitor = _focusMonitor;
102
+ this._elementRef = _elementRef;
103
+ this.ngControl = ngControl;
104
+ this.onChange = (_) => { };
105
+ this.onTouched = () => { };
106
+ this.stateChanges = new Subject();
107
+ this.focused = false;
108
+ this.errorState = false;
109
+ this.id = `rsl-searchable-dropdown-${SearchableDropdownComponent.nextId++}`;
110
+ // label for the search dropdown
111
+ this.label = '';
112
+ //Fields for sorting the API data
113
+ this.sortFields = '';
114
+ // The value used to populate the control value
115
+ this.valueField = 'id';
116
+ // The minumum char for search
117
+ this.minLengthTerm = 3;
118
+ this.modelSelected = new EventEmitter();
119
+ this._required = false;
120
+ this._disabled = false;
121
+ this.showSerach = true;
122
+ this.isLoading = false;
123
+ this.options = [];
124
+ this.filteredOptions = [];
125
+ /** Subject that emits when the component has been destroyed. */
126
+ this._onDestroy = new Subject();
127
+ this.searchControl = new FormControl('');
128
+ _focusMonitor.monitor(_elementRef, true).subscribe(origin => {
129
+ if (this.focused && !origin) {
130
+ this.onTouched();
131
+ }
132
+ this.focused = !!origin;
133
+ this.stateChanges.next();
134
+ });
135
+ if (this.ngControl) {
136
+ this.ngControl.valueAccessor = this;
137
+ }
138
+ }
139
+ get empty() {
140
+ return !this.value;
141
+ }
142
+ get required() { return this._required; }
143
+ set required(value) {
144
+ this._required = coerceBooleanProperty(value);
145
+ this.stateChanges.next();
146
+ }
147
+ get disabled() { return this._disabled; }
148
+ set disabled(value) {
149
+ this._disabled = coerceBooleanProperty(value);
150
+ this.stateChanges.next();
151
+ }
152
+ get value() {
153
+ return this._value;
154
+ }
155
+ set value(value) {
156
+ if (value)
157
+ if (this._value !== value) {
158
+ this.loadModel(value);
159
+ }
160
+ this._value = value;
161
+ this.stateChanges.next();
162
+ }
163
+ ngOnInit() {
164
+ if (!this.displayFields)
165
+ this.displayFields = this.searchFields;
166
+ this.loadModel(this.ngControl.value);
167
+ if (this.preloadElementsCount) {
168
+ this.serviceRef.getAll(1, this.preloadElementsCount).subscribe({
169
+ next: (data) => {
170
+ this.showSerach = false;
171
+ this.options = data.getModels();
172
+ this.filteredOptions = this.options;
173
+ }
174
+ });
175
+ }
176
+ this.searchControl.valueChanges
177
+ .pipe(filter((res) => {
178
+ const result = res !== null && res.length >= this.minLengthTerm;
179
+ if (!result) {
180
+ this.options = [];
181
+ this.filteredOptions = [];
182
+ }
183
+ this.showSerach = !result;
184
+ return result;
185
+ }), debounceTime(300), tap(() => {
186
+ this.filteredOptions = [];
187
+ this.isLoading = true;
188
+ }), switchMap((value) => this.serviceRef
189
+ .getAll(1, 10, this.sortFields, `${this.searchFields.replace(',', '|')}@=*${value}`)
190
+ .pipe(finalize(() => {
191
+ this.isLoading = false;
192
+ }))), takeUntil(this._onDestroy))
193
+ .subscribe((options) => {
194
+ this.filteredOptions = options.getModels();
195
+ });
196
+ }
197
+ onSelected($event) {
198
+ const value = $event.option.value;
199
+ this.searchControl.setValue(value);
200
+ this.modelSelected.emit(value);
201
+ if (this.valueField in value) {
202
+ this.setControlValue(value[this.valueField]);
203
+ }
204
+ }
205
+ setControlValue(value) {
206
+ this.value = value;
207
+ this.ngControl.control.setValue(value);
208
+ }
209
+ displayWith(value) {
210
+ return this.getConcatedFields(value);
211
+ }
212
+ clearSelection() {
213
+ this.modelSelected.emit(null);
214
+ this.setControlValue(null);
215
+ this.searchControl.setValue(null);
216
+ this.filteredOptions = this.options;
217
+ }
218
+ getConcatedFields(option) {
219
+ if (!option)
220
+ return null;
221
+ const filtersArr = this.displayFields.split(',');
222
+ return filtersArr.reduce((acc, cv) => {
223
+ return acc.concat(option[cv] + ' ');
224
+ }, '');
225
+ }
226
+ ngOnDestroy() {
227
+ this.searchControl = null;
228
+ this.stateChanges.complete();
229
+ this._focusMonitor.stopMonitoring(this._elementRef);
230
+ this._onDestroy.next();
231
+ this._onDestroy.complete();
232
+ }
233
+ getSearchText() {
234
+ return `Enter ${this.minLengthTerm} characters to start search`;
235
+ }
236
+ writeValue(model) {
237
+ console.log(model);
238
+ this.value = model;
239
+ }
240
+ registerOnChange(fn) {
241
+ this.onChange = fn;
242
+ }
243
+ registerOnTouched(fn) {
244
+ this.onTouched = fn;
245
+ }
246
+ setDisabledState(isDisabled) {
247
+ this.disabled = isDisabled;
248
+ }
249
+ loadModel(id) {
250
+ //Load the model from API to display the value
251
+ let needLoad = false;
252
+ if (id) {
253
+ if (!this.searchControl.value)
254
+ needLoad = true;
255
+ else {
256
+ if (this.searchControl.value[this.valueField] !== id) {
257
+ needLoad = true;
258
+ }
259
+ }
260
+ }
261
+ if (needLoad) {
262
+ this.serviceRef.get(id).subscribe({
263
+ next: (model) => {
264
+ this.options.push(model);
265
+ this.filteredOptions = this.options;
266
+ this.searchControl.setValue(model);
267
+ }
268
+ });
269
+ }
270
+ }
271
+ }
272
+ SearchableDropdownComponent.nextId = 0;
273
+ SearchableDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: SearchableDropdownComponent, deps: [{ token: i1.FocusMonitor }, { token: i0.ElementRef }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
274
+ SearchableDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: SearchableDropdownComponent, selector: "rsl-searchable-dropdown", inputs: { label: "label", fControlName: "fControlName", serviceRef: "serviceRef", searchFields: "searchFields", displayFields: "displayFields", sortFields: "sortFields", valueField: "valueField", minLengthTerm: "minLengthTerm", preloadElementsCount: "preloadElementsCount", required: "required", disabled: "disabled", value: "value" }, outputs: { modelSelected: "modelSelected" }, host: { properties: { "class.example-floating": "shouldLabelFloat", "id": "id", "attr.aria-describedby": "describedBy" } }, ngImport: i0, template: "<div class=\"form-group\">\r\n <label>{{label | translate}}</label>\r\n <mat-form-field appearance=\"outline\" fxFlex>\r\n <input matInput [matAutocomplete]=\"auto\" [formControl]=\"searchControl\">\r\n <button *ngIf=\"searchControl.value\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"clearSelection()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelected($event)\"\r\n [displayWith]=\"displayWith.bind(this)\">\r\n <mat-option *ngIf=\"isLoading\">Loading...</mat-option>\r\n <mat-option *ngIf=\"!isLoading && filteredOptions.length == 0 && !showSerach\" disabled>Not found</mat-option>\r\n <mat-option *ngIf=\"showSerach\" disabled>{{getSearchText()}}</mat-option>\r\n <ng-container *ngIf=\"!isLoading && filteredOptions.length > 0\">\r\n <mat-option *ngFor=\"let option of filteredOptions\" [value]=\"option\">\r\n <span><b>{{getConcatedFields(option)}}</b></span>\r\n </mat-option>\r\n </ng-container>\r\n\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n</div>", components: [{ type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.MatSuffix, selector: "[matSuffix]" }, { type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i1$1.TranslatePipe } });
275
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: SearchableDropdownComponent, decorators: [{
276
+ type: Component,
277
+ args: [{ selector: 'rsl-searchable-dropdown', host: {
278
+ '[class.example-floating]': 'shouldLabelFloat',
279
+ '[id]': 'id',
280
+ '[attr.aria-describedby]': 'describedBy',
281
+ }, template: "<div class=\"form-group\">\r\n <label>{{label | translate}}</label>\r\n <mat-form-field appearance=\"outline\" fxFlex>\r\n <input matInput [matAutocomplete]=\"auto\" [formControl]=\"searchControl\">\r\n <button *ngIf=\"searchControl.value\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"clearSelection()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelected($event)\"\r\n [displayWith]=\"displayWith.bind(this)\">\r\n <mat-option *ngIf=\"isLoading\">Loading...</mat-option>\r\n <mat-option *ngIf=\"!isLoading && filteredOptions.length == 0 && !showSerach\" disabled>Not found</mat-option>\r\n <mat-option *ngIf=\"showSerach\" disabled>{{getSearchText()}}</mat-option>\r\n <ng-container *ngIf=\"!isLoading && filteredOptions.length > 0\">\r\n <mat-option *ngFor=\"let option of filteredOptions\" [value]=\"option\">\r\n <span><b>{{getConcatedFields(option)}}</b></span>\r\n </mat-option>\r\n </ng-container>\r\n\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n</div>" }]
282
+ }], ctorParameters: function () { return [{ type: i1.FocusMonitor }, { type: i0.ElementRef }, { type: i2.NgControl, decorators: [{
283
+ type: Optional
284
+ }, {
285
+ type: Self
286
+ }] }]; }, propDecorators: { label: [{
287
+ type: Input
288
+ }], fControlName: [{
289
+ type: Input
290
+ }], serviceRef: [{
291
+ type: Input
292
+ }], searchFields: [{
293
+ type: Input
294
+ }], displayFields: [{
295
+ type: Input
296
+ }], sortFields: [{
297
+ type: Input
298
+ }], valueField: [{
299
+ type: Input
300
+ }], minLengthTerm: [{
301
+ type: Input
302
+ }], preloadElementsCount: [{
303
+ type: Input
304
+ }], modelSelected: [{
305
+ type: Output
306
+ }], required: [{
307
+ type: Input
308
+ }], disabled: [{
309
+ type: Input
310
+ }], value: [{
311
+ type: Input
312
+ }] } });
313
+
314
+ class UnderConstructionComponent {
315
+ constructor() { }
316
+ }
317
+ UnderConstructionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: UnderConstructionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
318
+ UnderConstructionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: UnderConstructionComponent, selector: "rsl-under-construction", ngImport: i0, template: "<div class=\"forms-view-container\">\n <div class=\"under-construction-view-container\">\n Page under construction\n </div>\n</div>", styles: [".under-construction-view-container{height:calc(100vh - 250px);margin:60px 0 0;padding:0;display:flex;justify-content:center;align-items:center;box-sizing:border-box;font-size:1.8em;line-height:1.3em;font-weight:300;color:#58585b;text-align:center}\n"] });
319
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: UnderConstructionComponent, decorators: [{
320
+ type: Component,
321
+ args: [{ selector: 'rsl-under-construction', template: "<div class=\"forms-view-container\">\n <div class=\"under-construction-view-container\">\n Page under construction\n </div>\n</div>", styles: [".under-construction-view-container{height:calc(100vh - 250px);margin:60px 0 0;padding:0;display:flex;justify-content:center;align-items:center;box-sizing:border-box;font-size:1.8em;line-height:1.3em;font-weight:300;color:#58585b;text-align:center}\n"] }]
322
+ }], ctorParameters: function () { return []; } });
323
+
324
+ class BaseQueryData {
325
+ constructor(jsonApiModels, metaData) {
326
+ this.jsonApiModels = jsonApiModels;
327
+ this.metaData = metaData;
328
+ }
329
+ getModels() {
330
+ return this.jsonApiModels;
331
+ }
332
+ getMeta() {
333
+ return this.metaData;
334
+ }
335
+ }
336
+
337
+ class BaseDatastore {
338
+ constructor(httpClient) {
339
+ this.httpClient = httpClient;
340
+ // tslint:disable-next-line:variable-name
341
+ this._store = {};
342
+ // tslint:enable:max-line-length
343
+ // tslint:disable-next-line:ban-types
344
+ this.toQueryString = this.datastoreConfig.overrides
345
+ && this.datastoreConfig.overrides.toQueryString ?
346
+ this.datastoreConfig.overrides.toQueryString : this._toQueryString;
347
+ }
348
+ // tslint:enable:max-line-length
349
+ get getDirtyAttributes() {
350
+ if (this.datastoreConfig.overrides
351
+ && this.datastoreConfig.overrides.getDirtyAttributes) {
352
+ return this.datastoreConfig.overrides.getDirtyAttributes;
353
+ }
354
+ else {
355
+ return BaseDatastore.getDirtyAttributes;
356
+ }
357
+ }
358
+ get getAllAttributes() {
359
+ if (this.datastoreConfig.overrides
360
+ && this.datastoreConfig.overrides.getAllAttributes) {
361
+ return this.datastoreConfig.overrides.getAllAttributes;
362
+ }
363
+ else {
364
+ return BaseDatastore.getAllAttributes;
365
+ }
366
+ }
367
+ // protected config: DatastoreConfig;
368
+ static getDirtyAttributes(attributesMetadata) {
369
+ const dirtyData = {};
370
+ for (const propertyName in attributesMetadata) {
371
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
372
+ const metadata = attributesMetadata[propertyName];
373
+ if (metadata.hasDirtyAttributes) {
374
+ const attributeName = metadata.serializedName != null ? metadata.serializedName : propertyName;
375
+ dirtyData[attributeName] = metadata.serialisationValue ? metadata.serialisationValue : metadata.newValue;
376
+ }
377
+ }
378
+ }
379
+ return dirtyData;
380
+ }
381
+ static getAllAttributes(attributesMetadata) {
382
+ const dirtyData = {};
383
+ for (const propertyName in attributesMetadata) {
384
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
385
+ const metadata = attributesMetadata[propertyName];
386
+ const attributeName = metadata.serializedName != null ? metadata.serializedName : propertyName;
387
+ dirtyData[attributeName] = metadata.serialisationValue ? metadata.serialisationValue : metadata.newValue;
388
+ }
389
+ }
390
+ return dirtyData;
391
+ }
392
+ findAll(modelType, params, headers, customUrl) {
393
+ const customHeadhers = this.buildHeaders(headers);
394
+ const htmlParams = this.buildParams(params);
395
+ const url = this.buildUrl(modelType, customUrl);
396
+ const response = this.httpClient.get(url, { headers: customHeadhers, params: htmlParams, withCredentials: true })
397
+ .pipe(map(res => this.extractQueryData(res, modelType)), catchError(this.handleError));
398
+ return response;
399
+ }
400
+ findRecord(modelType, id, params, headers, customUrl) {
401
+ const customHeadhers = this.buildHeaders(headers);
402
+ let url = this.buildUrl(modelType, customUrl);
403
+ if (id) {
404
+ url += '/' + id;
405
+ }
406
+ const htmlParams = this.buildParams(params, undefined);
407
+ return this.httpClient.get(url, { headers: customHeadhers, params: htmlParams, withCredentials: true })
408
+ .pipe(map(res => this.entityToModel(res, modelType, undefined)), catchError(this.handleError));
409
+ }
410
+ getCustom(modelType, params, headers, customUrl, customResponseType) {
411
+ const customHeadhers = this.buildHeaders(headers);
412
+ const url = this.buildUrl(modelType, customUrl);
413
+ const htmlParams = this.buildParams(params, undefined);
414
+ if (!customResponseType)
415
+ customResponseType = 'json';
416
+ return this.httpClient.get(url, { headers: customHeadhers, params: htmlParams, withCredentials: true, responseType: customResponseType });
417
+ }
418
+ postCustom(modelType, body, params, headers, customUrl) {
419
+ const customHeadhers = this.buildHeaders(headers);
420
+ const url = this.buildUrl(modelType, customUrl);
421
+ const htmlParams = this.buildParams(params, undefined);
422
+ return this.httpClient.post(url, body, { headers: customHeadhers, params: htmlParams, reportProgress: true, withCredentials: true });
423
+ }
424
+ patchCustom(modelType, body, params, headers, customUrl) {
425
+ const customHeadhers = this.buildHeaders(headers);
426
+ const url = this.buildUrl(modelType, customUrl);
427
+ const htmlParams = this.buildParams(params, undefined);
428
+ return this.httpClient.patch(url, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
429
+ }
430
+ createRecord(modelType, data) {
431
+ return new modelType(this, data);
432
+ }
433
+ saveRecord(attributesMetadata, model, params, headers, customUrl, customBody) {
434
+ const modelType = model.constructor;
435
+ const modelConfig = model.modelConfig;
436
+ const customHeadhers = this.buildHeaders(headers);
437
+ const url = this.buildUrl(modelType, customUrl);
438
+ const htmlParams = this.buildParams(params);
439
+ let httpCall;
440
+ const body = customBody || this.modelToEntity(model, attributesMetadata);
441
+ if (model.id) {
442
+ // tslint:disable-next-line:max-line-length
443
+ httpCall = this.httpClient.patch(url + '/' + model.id, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
444
+ }
445
+ else {
446
+ httpCall = this.httpClient.post(url, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
447
+ }
448
+ return httpCall
449
+ .pipe(map(res => {
450
+ const data = this.resetMetadataAttributes(res, attributesMetadata, modelType);
451
+ return this.entityToModel(data, modelType);
452
+ }), catchError(this.handleError));
453
+ }
454
+ patchRecord(attributesMetadata, model, origModel, params, headers, customUrl) {
455
+ const modelType = model.constructor;
456
+ const modelConfig = model.modelConfig;
457
+ const customHeadhers = this.buildHeaders(headers);
458
+ const url = this.buildUrl(modelType, customUrl);
459
+ const htmlParams = this.buildParams(params);
460
+ let httpCall;
461
+ let origData = { id: '' };
462
+ if (origModel)
463
+ origData = this.modelToEntity(origModel, origModel.attributeMetadata, true);
464
+ const newData = this.modelToEntity(model, attributesMetadata, true);
465
+ newData.id = origData.id;
466
+ const patch = compare(origData, newData);
467
+ if (patch.length > 0) {
468
+ httpCall = this.httpClient.patch(url + '/' + model.id, patch, { headers: customHeadhers, params: htmlParams, withCredentials: true });
469
+ return httpCall
470
+ .pipe(map(res => {
471
+ const data = this.resetMetadataAttributes(res, attributesMetadata, modelType);
472
+ return this.entityToModel(data, modelType);
473
+ }), catchError(this.handleError));
474
+ }
475
+ else {
476
+ return new Observable((observer) => {
477
+ observer.next(model);
478
+ observer.complete();
479
+ });
480
+ }
481
+ }
482
+ // getPatch<T extends BaseModel>(
483
+ // model: T,
484
+ // origModel: T): any {
485
+ // }
486
+ replaceRecord(attributesMetadata, model, params, headers, customUrl, customBody) {
487
+ const modelType = model.constructor;
488
+ const modelConfig = model.modelConfig;
489
+ const customHeadhers = this.buildHeaders(headers);
490
+ const url = this.buildUrl(modelType, customUrl);
491
+ const htmlParams = this.buildParams(params);
492
+ let httpCall;
493
+ const body = customBody || this.modelToEntity(model, attributesMetadata, true);
494
+ if (model.id) {
495
+ httpCall = this.httpClient.put(url + '/' + model.id, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
496
+ }
497
+ else {
498
+ httpCall = this.httpClient.post(url, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
499
+ }
500
+ return httpCall
501
+ .pipe(map(res => {
502
+ const data = this.resetMetadataAttributes(res, attributesMetadata, modelType);
503
+ return this.entityToModel(data, modelType);
504
+ }), catchError(this.handleError));
505
+ }
506
+ deleteRecord(modelType, id, headers, customUrl) {
507
+ const customHeadhers = this.buildHeaders(headers);
508
+ let url = this.buildUrl(modelType, customUrl);
509
+ if (!url.includes('share')) {
510
+ url = url + '/' + id;
511
+ }
512
+ // const idParam = new HttpParams().set('id', id);
513
+ return this.httpClient.delete(url, { headers: customHeadhers, withCredentials: true })
514
+ .pipe(catchError(this.handleError));
515
+ }
516
+ buildUrl(modelType, customUrl) {
517
+ if (customUrl) {
518
+ return customUrl;
519
+ }
520
+ const modelConfig = Reflect.getMetadata('BaseModelConfig', modelType);
521
+ const baseUrl = modelConfig.baseUrl || this.datastoreConfig.baseUrl;
522
+ const apiVersion = modelConfig.apiVersion || this.datastoreConfig.apiVersion;
523
+ const modelEndpointUrl = modelConfig.modelEndpointUrl || modelConfig.type;
524
+ const url = [baseUrl, apiVersion, modelEndpointUrl].filter((x) => x).join('/');
525
+ return url;
526
+ }
527
+ extractQueryData(res, modelType) {
528
+ let result;
529
+ const body = res;
530
+ const models = [];
531
+ for (const data of body.data) {
532
+ const model = this.entityToModel(data, modelType, undefined);
533
+ models.push(model);
534
+ }
535
+ result = new BaseQueryData(models, this.parseMeta(body, modelType));
536
+ return result;
537
+ }
538
+ deserializeModel(modelType, data) {
539
+ data = this.transformSerializedNamesToPropertyNames(modelType, data);
540
+ return new modelType(this, data);
541
+ }
542
+ handleError(error) {
543
+ if (error.error instanceof ErrorEvent) {
544
+ // A client-side or network error occurred. Handle it accordingly.
545
+ // console.error('An error occurred:', error.error.message);
546
+ }
547
+ else {
548
+ // The backend returned an unsuccessful response code.
549
+ // The response body may contain clues as to what went wrong,
550
+ // console.error(
551
+ // 'Backend returned code ${error.status}, ' +
552
+ // 'body was: ${error.error}');
553
+ }
554
+ // return an observable with a user-facing error message
555
+ return throwError(error);
556
+ }
557
+ parseMeta(body, modelType) {
558
+ const metaModel = Reflect.getMetadata('BaseModelConfig', modelType).meta;
559
+ return new metaModel(body);
560
+ }
561
+ resetMetadataAttributes(res, attributesMetadata, modelType) {
562
+ // TODO check why is attributesMetadata from the arguments never used
563
+ for (const propertyName in attributesMetadata) {
564
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
565
+ const metadata = attributesMetadata[propertyName];
566
+ if (metadata.hasDirtyAttributes) {
567
+ metadata.hasDirtyAttributes = false;
568
+ }
569
+ }
570
+ }
571
+ if (res) {
572
+ res.attributeMetadata = attributesMetadata;
573
+ }
574
+ return res;
575
+ }
576
+ get datastoreConfig() {
577
+ const configFromDecorator = Reflect.getMetadata('BaseDatastoreConfig', this.constructor);
578
+ return Object.assign(configFromDecorator, this.config);
579
+ }
580
+ transformSerializedNamesToPropertyNames(modelType, attributes) {
581
+ const serializedNameToPropertyName = this.getModelPropertyNames(modelType.prototype);
582
+ const properties = {};
583
+ Object.keys(serializedNameToPropertyName).forEach((serializedName) => {
584
+ if (attributes[serializedName] !== null && attributes[serializedName] !== undefined) {
585
+ properties[serializedNameToPropertyName[serializedName]] = attributes[serializedName];
586
+ }
587
+ });
588
+ return properties;
589
+ }
590
+ getModelPropertyNames(model) {
591
+ return Reflect.getMetadata('AttributeMapping', model);
592
+ }
593
+ buildHeaders(customHeaders) {
594
+ const headers = {
595
+ Accept: 'application/json-patch+json',
596
+ // 'Content-Type': 'application/vnd.api+json',
597
+ 'Content-Type': 'application/json-patch+json'
598
+ };
599
+ if (customHeaders && customHeaders.keys().length) {
600
+ // tslint:disable-next-line:variable-name
601
+ Object.assign({}, headers, customHeaders.keys().map(header_name => {
602
+ headers['' + header_name] = customHeaders.get(header_name);
603
+ }));
604
+ }
605
+ return new HttpHeaders(headers);
606
+ }
607
+ buildParams(params, id) {
608
+ let httpParams = new HttpParams();
609
+ if (id) {
610
+ httpParams = httpParams.set('id', id);
611
+ }
612
+ if (params) {
613
+ Object.keys(params)
614
+ .filter(key => {
615
+ const v = params[key];
616
+ return (Array.isArray(v) || typeof v === 'string') ?
617
+ (v.length > 0) :
618
+ (v !== null && v !== undefined);
619
+ })
620
+ .forEach(key => {
621
+ httpParams = httpParams.set(key, params[key]);
622
+ });
623
+ }
624
+ return httpParams;
625
+ }
626
+ entityToModel(res, modelType, model) {
627
+ return this.extractRecordDataJson(res, modelType, model);
628
+ }
629
+ extractRecordDataJson(res, modelType, model) {
630
+ const body = res;
631
+ if (!body) {
632
+ throw new Error('no body in response');
633
+ }
634
+ if (model) {
635
+ Object.assign(model, body);
636
+ }
637
+ const deserializedModel = model || this.deserializeModel(modelType, body.data || body);
638
+ return deserializedModel;
639
+ }
640
+ modelToEntity(model, attributesMetadata, allAttributes = false) {
641
+ let attributes;
642
+ if (allAttributes) {
643
+ attributes = this.getAllAttributes(attributesMetadata, model);
644
+ }
645
+ else {
646
+ attributes = this.getDirtyAttributes(attributesMetadata, model);
647
+ }
648
+ // this.getRelationships(model, attributes);
649
+ return attributes;
650
+ }
651
+ _toQueryString(params) {
652
+ return qs.stringify(params, { arrayFormat: 'brackets' });
653
+ }
654
+ }
655
+ BaseDatastore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseDatastore, deps: [{ token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
656
+ BaseDatastore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseDatastore });
657
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseDatastore, decorators: [{
658
+ type: Injectable
659
+ }], ctorParameters: function () { return [{ type: i1$2.HttpClient }]; } });
660
+
661
+ class BaseService {
662
+ constructor(datastore) {
663
+ this.datastore = datastore;
664
+ }
665
+ setModelType(modelType) {
666
+ this.modelType = modelType;
667
+ }
668
+ get(id, customInclude = '') {
669
+ const response = this.datastore.findRecord(this.modelType, id, { customInclude });
670
+ return response;
671
+ }
672
+ getAll(page, pageSize, sort = '', filters = '', customInclude = '') {
673
+ const response = this.datastore.findAll(this.modelType, {
674
+ Page: page,
675
+ PageSize: pageSize,
676
+ Sorts: sort,
677
+ Filters: filters,
678
+ customInclude
679
+ });
680
+ return response;
681
+ }
682
+ delete(id) {
683
+ const response = this.datastore.deleteRecord(this.modelType, id);
684
+ return response;
685
+ }
686
+ getCustom(params, headers, customUrl, customResponseType) {
687
+ return this.datastore.getCustom(this.modelType, params, headers, customUrl, customResponseType);
688
+ }
689
+ postCustom(body, params, headers, customUrl) {
690
+ return this.datastore.postCustom(this.modelType, body, params, headers, customUrl);
691
+ }
692
+ patchCustom(body, params, headers, customUrl) {
693
+ return this.datastore.patchCustom(this.modelType, body, params, headers, customUrl);
694
+ }
695
+ // checkIfPropertyUnique(property: string, value: any): Observable<boolean> {
696
+ // }
697
+ save(docTypeOrFormGroup, id, origModel) {
698
+ if (id == null) {
699
+ let fromModel;
700
+ if (docTypeOrFormGroup instanceof FormGroup) {
701
+ fromModel = this.fromFormGroup(docTypeOrFormGroup, id);
702
+ }
703
+ else {
704
+ fromModel = docTypeOrFormGroup;
705
+ }
706
+ const data = this.datastore.createRecord(this.modelType, fromModel);
707
+ return data.save();
708
+ }
709
+ else {
710
+ return this.patch(docTypeOrFormGroup, origModel, id);
711
+ }
712
+ }
713
+ patch(docTypeOrFormGroup, origModel, id) {
714
+ let fromModel;
715
+ if (docTypeOrFormGroup instanceof FormGroup) {
716
+ fromModel = this.fromFormGroup(docTypeOrFormGroup, id);
717
+ }
718
+ else {
719
+ fromModel = docTypeOrFormGroup;
720
+ }
721
+ const data = this.datastore.createRecord(this.modelType, fromModel);
722
+ return data.patch(origModel);
723
+ }
724
+ newModel(data) {
725
+ return new this.modelType(this.datastore, data);
726
+ }
727
+ toFormGroup(fb, fromModel) {
728
+ if (fromModel === undefined) {
729
+ fromModel = this.newModel();
730
+ }
731
+ return fromModel.getFromGroup(fb);
732
+ }
733
+ fromFormGroup(formGroup, id) {
734
+ // const saveModel = this.newModel(formGroup.getRawValue());
735
+ // saveModel.id = id ? id : null;
736
+ // return saveModel;
737
+ const saveModel = this.newModel();
738
+ saveModel.getModelFromFormGroup(formGroup);
739
+ saveModel.id = id ? id : null;
740
+ return saveModel;
741
+ }
742
+ }
743
+ BaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseService, deps: [{ token: BaseDatastore }], target: i0.ɵɵFactoryTarget.Injectable });
744
+ BaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseService, providedIn: 'root' });
745
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseService, decorators: [{
746
+ type: Injectable,
747
+ args: [{
748
+ providedIn: 'root'
749
+ }]
750
+ }], ctorParameters: function () { return [{ type: BaseDatastore }]; } });
751
+
752
+ /**
753
+ * Async modal dialog service
754
+ * DialogService makes this app easier to test by faking this service.
755
+ * TODO: better modal implementation that doesn't use window.confirm
756
+ */
757
+ class DialogService {
758
+ /**
759
+ * Ask user to confirm an action. `message` explains the action and choices.
760
+ * Returns observable resolving to `true`=confirm or `false`=cancel
761
+ */
762
+ constructor() { }
763
+ confirm(message, text, confirmButtonText = 'Delete', cancelButtonText = 'Cancel') {
764
+ const confirmation = Swal.fire({
765
+ title: message || 'Are you sure?',
766
+ icon: 'warning',
767
+ text: text || '',
768
+ showCancelButton: true,
769
+ confirmButtonText: confirmButtonText,
770
+ cancelButtonText: cancelButtonText,
771
+ customClass: {
772
+ confirmButton: 'btn btn-red btn-fill btn-wd',
773
+ cancelButton: 'btn btn-grey btn-fill btn-wd',
774
+ },
775
+ buttonsStyling: false,
776
+ reverseButtons: true
777
+ })
778
+ .then((result) => {
779
+ if (result.value) {
780
+ return true;
781
+ }
782
+ else {
783
+ return false;
784
+ }
785
+ }).catch();
786
+ return from(confirmation);
787
+ }
788
+ showSaveMessage(message, title) {
789
+ const confirmation = Swal.fire({
790
+ icon: 'success',
791
+ title: message,
792
+ timer: 2000,
793
+ showConfirmButton: false,
794
+ // customClass: 'overflow-hidden',
795
+ buttonsStyling: false
796
+ }).then(() => {
797
+ return true;
798
+ }, () => {
799
+ return false;
800
+ }).catch();
801
+ return from(confirmation);
802
+ }
803
+ showRegisteredMessage(message, title) {
804
+ const confirmation = Swal.fire({
805
+ icon: 'success',
806
+ title: message,
807
+ showConfirmButton: true,
808
+ customClass: {
809
+ confirmButton: 'btn btn-success',
810
+ },
811
+ buttonsStyling: false
812
+ }).then(() => {
813
+ return true;
814
+ }, () => {
815
+ return false;
816
+ }).catch();
817
+ return from(confirmation);
818
+ }
819
+ // notification(message?: string, type?: NotificationType, fromPosition?: NotificationFrom, align?: NotificationAlign, timer?: number) {
820
+ // if (!type) {
821
+ // type = NotificationType.success;
822
+ // }
823
+ // if (!fromPosition) {
824
+ // fromPosition = NotificationFrom.bottom;
825
+ // }
826
+ // if (!align) {
827
+ // align = NotificationAlign.center;
828
+ // }
829
+ // if (!timer) {
830
+ // timer = 3000;
831
+ // }
832
+ // $.notify({
833
+ // icon: 'notifications',
834
+ // message: message
835
+ // }, {
836
+ // type: type,
837
+ // timer: 3000,
838
+ // placement: {
839
+ // from: from,
840
+ // align: align
841
+ // }
842
+ // });
843
+ // }
844
+ showErrorMessage(e, message) {
845
+ if (!message) {
846
+ message = 'Validation errors';
847
+ }
848
+ if (e instanceof HttpErrorResponse) {
849
+ // Validation errors
850
+ if (e.status === 400) {
851
+ const errors = e.error.errors;
852
+ if (errors) {
853
+ errors.forEach(error => {
854
+ message += error.field + ' ' + error.detail + '\n';
855
+ });
856
+ // message = errors.detail;
857
+ // if (detail.relationships) {
858
+ // detail.relationships.forEach(relation => {
859
+ // console.log(relation);
860
+ // });
861
+ // }
862
+ }
863
+ }
864
+ }
865
+ const confirmation = Swal.fire({
866
+ icon: 'error',
867
+ title: message,
868
+ // timer: 2000,
869
+ showConfirmButton: true,
870
+ customClass: {
871
+ confirmButton: 'btn btn-success',
872
+ },
873
+ buttonsStyling: false
874
+ }).then(() => {
875
+ return true;
876
+ }, () => {
877
+ return false;
878
+ }).catch();
879
+ return from(confirmation);
880
+ }
881
+ getTextTranslation(translationKey) {
882
+ // // const result = await promise;
883
+ // // return result;
884
+ // const result = this.translate.instant(translationKey);
885
+ // if (result === translationKey) {
886
+ return translationKey;
887
+ // }
888
+ // return result;
889
+ }
890
+ }
891
+ DialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: DialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
892
+ DialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: DialogService });
893
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: DialogService, decorators: [{
894
+ type: Injectable
895
+ }], ctorParameters: function () { return []; } });
896
+
897
+ class BaseFormEditComponent {
898
+ constructor(fb, router, route, modelService, dialogService, translate, location) {
899
+ this.fb = fb;
900
+ this.router = router;
901
+ this.route = route;
902
+ this.modelService = modelService;
903
+ this.dialogService = dialogService;
904
+ this.translate = translate;
905
+ this.location = location;
906
+ this.isLoading = true;
907
+ this.changeUrlRoute = true;
908
+ this.generateForm(this.modelService.newModel());
909
+ }
910
+ afterSave(model) {
911
+ return new Observable((observer) => {
912
+ observer.next(model);
913
+ observer.complete();
914
+ });
915
+ }
916
+ beforeSave(model) {
917
+ return new Observable((observer) => {
918
+ observer.next(model);
919
+ observer.complete();
920
+ });
921
+ }
922
+ ngOnInit() {
923
+ this.initForm();
924
+ }
925
+ initForm(customInclude = '', newModelId = null, model = null) {
926
+ if (model === null) {
927
+ this.modelId = this.route.snapshot.paramMap.get('id') ?? newModelId;
928
+ this.isEdit = false;
929
+ if (this.modelId) {
930
+ this.modelService.get(this.modelId, customInclude).subscribe((value) => {
931
+ this.isEdit = true;
932
+ this.generateForm(value);
933
+ });
934
+ }
935
+ else {
936
+ if (this.changeUrlRoute) {
937
+ const addUrl = this.router.createUrlTree([]).toString();
938
+ this.editRoute = this.router.createUrlTree([addUrl.replace('add', 'edit')]).toString();
939
+ }
940
+ // }
941
+ this.generateForm(this.modelService.newModel());
942
+ }
943
+ }
944
+ else {
945
+ this.modelId = model.id;
946
+ this.isEdit = true;
947
+ this.generateForm(model);
948
+ }
949
+ }
950
+ generateForm(model) {
951
+ this.isLoading = false;
952
+ this.modelId = model.id;
953
+ this.model = model;
954
+ this.baseForm = this.modelService.toFormGroup(this.fb, model);
955
+ this.afterFormGenerated();
956
+ }
957
+ afterFormGenerated() {
958
+ }
959
+ getFromGroup(formGroup = null) {
960
+ if (!formGroup)
961
+ return this.baseForm;
962
+ if (formGroup instanceof FormGroup)
963
+ return formGroup;
964
+ return this.baseForm.controls[formGroup];
965
+ }
966
+ validateAllFormFields(formGroup = null) {
967
+ const fg = this.getFromGroup(formGroup);
968
+ Object.keys(fg.controls).forEach(field => {
969
+ // console.log(field);
970
+ const control = fg.get(field);
971
+ if (control instanceof FormControl) {
972
+ control.markAsTouched({ onlySelf: true });
973
+ }
974
+ else if (control instanceof FormGroup) {
975
+ this.validateAllFormFields(control);
976
+ }
977
+ });
978
+ }
979
+ isFieldValid(field, formGroup = null) {
980
+ const fg = this.getFromGroup(formGroup);
981
+ const filedControl = fg.get(field);
982
+ return !filedControl.valid && filedControl.touched;
983
+ }
984
+ isFieldValidFromArray(arrayIndex, field, arrayName = 'formArray') {
985
+ const fieldControl = this.baseForm.get(arrayName).get([arrayIndex]).get(field);
986
+ return !fieldControl.valid && fieldControl.touched;
987
+ }
988
+ displayFieldCss(field) {
989
+ return {
990
+ 'has-error': this.isFieldValid(field),
991
+ 'has-feedback': this.isFieldValid(field)
992
+ };
993
+ }
994
+ onCancel() {
995
+ this.router.navigate([this.cancelRoute]);
996
+ }
997
+ onSave() {
998
+ this.saveModel(this.baseForm);
999
+ }
1000
+ saveModel(formGroup = null) {
1001
+ const fg = this.getFromGroup(formGroup);
1002
+ const that = this;
1003
+ if (fg) {
1004
+ if (fg.valid) {
1005
+ that.blockUI.start('Saving ...');
1006
+ this.beforeSave(this.model).subscribe(_ => {
1007
+ this.modelService.save(this.baseForm, this.modelId, this.model).subscribe((newModel) => {
1008
+ this.model = newModel;
1009
+ this.modelId = newModel.id;
1010
+ if (this.editRoute) {
1011
+ this.isEdit = true;
1012
+ if (this.changeUrlRoute) {
1013
+ const url = this.router.createUrlTree([this.editRoute, this.modelId]).toString();
1014
+ this.location.replaceState(url);
1015
+ }
1016
+ }
1017
+ this.afterSave(newModel).subscribe((val) => {
1018
+ this.blockUI.stop();
1019
+ this.dialogService.showSaveMessage('Your changes were saved successfully.').subscribe(d => {
1020
+ fg.markAsPristine();
1021
+ });
1022
+ });
1023
+ }, err => {
1024
+ this.serverErrors(err);
1025
+ this.blockUI.stop();
1026
+ });
1027
+ });
1028
+ }
1029
+ else {
1030
+ this.validateAllFormFields(formGroup);
1031
+ }
1032
+ }
1033
+ }
1034
+ serverErrors(err) {
1035
+ if (err.error) {
1036
+ if (err.error.errors) {
1037
+ const validationErrors = err.error.errors;
1038
+ if (Array.isArray(validationErrors)) {
1039
+ validationErrors.forEach(prop => {
1040
+ const formControl = this.baseForm.get(prop);
1041
+ if (formControl) {
1042
+ // activate the error message
1043
+ formControl.setErrors({
1044
+ serverError: validationErrors[prop].join('\n')
1045
+ });
1046
+ }
1047
+ });
1048
+ }
1049
+ else {
1050
+ const keys = Object.keys(validationErrors);
1051
+ keys.forEach(prop => {
1052
+ const formControl = this.baseForm.get(prop);
1053
+ if (formControl) {
1054
+ // activate the error message
1055
+ formControl.setErrors({
1056
+ serverError: validationErrors[prop].join('\n')
1057
+ });
1058
+ }
1059
+ });
1060
+ }
1061
+ }
1062
+ }
1063
+ }
1064
+ canDeactivate() {
1065
+ // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged
1066
+ if (!this.baseForm.dirty) {
1067
+ return true;
1068
+ }
1069
+ // Otherwise ask the user with the dialog service and return its
1070
+ // observable which resolves to true or false when the user decides
1071
+ return this.dialogService.confirm('Discard changes ?', null, 'Discard');
1072
+ }
1073
+ getFiledName(filedTranslationKey) {
1074
+ return { field: this.translate.instant(filedTranslationKey) };
1075
+ }
1076
+ getCustomErrorMessage(error, fieldLabel) {
1077
+ return '';
1078
+ }
1079
+ getErrorMessageFromArray(arrayIndex, field, filedTranslationKey, arrayName = 'formArray') {
1080
+ const fieldControl = this.baseForm.get(arrayName).get([arrayIndex]).get(field);
1081
+ return this.getErrorMessageForField(fieldControl, filedTranslationKey);
1082
+ }
1083
+ getErrorMessage(field, filedTranslationKey, formGroup = null) {
1084
+ const fg = this.getFromGroup(formGroup);
1085
+ return this.getErrorMessageForField(fg.get(field), filedTranslationKey);
1086
+ }
1087
+ getErrorMessageForField(fieldControl, filedTranslationKey) {
1088
+ const error = fieldControl.errors;
1089
+ const fieldLabel = this.translate.instant(filedTranslationKey);
1090
+ let rvalue = '';
1091
+ if (error !== null) {
1092
+ if (error['required'] === true) {
1093
+ rvalue = this.translate.instant('General.Field.Required', { field: fieldLabel });
1094
+ }
1095
+ if (error['minlength']) {
1096
+ rvalue = this.translate.instant('General.Field.MinLength', { field: fieldLabel, requiredLength: error.minlength.requiredLength });
1097
+ }
1098
+ if (error['email'] === true) {
1099
+ rvalue = this.translate.instant('General.Field.InvalidEmail');
1100
+ }
1101
+ if (error['url'] === true) {
1102
+ rvalue = this.translate.instant('General.Field.InvalidUrl');
1103
+ }
1104
+ if (error['serverError']) {
1105
+ rvalue = error['serverError'];
1106
+ }
1107
+ if (rvalue === '') {
1108
+ rvalue = this.getCustomErrorMessage(error, fieldLabel);
1109
+ }
1110
+ }
1111
+ return rvalue;
1112
+ }
1113
+ }
1114
+ BaseFormEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseFormEditComponent, deps: [{ token: i2.FormBuilder }, { token: i2$1.Router }, { token: i2$1.ActivatedRoute }, { token: BaseService }, { token: DialogService }, { token: i1$1.TranslateService }, { token: i3$1.Location }], target: i0.ɵɵFactoryTarget.Component });
1115
+ BaseFormEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: BaseFormEditComponent, selector: "app-base.form.edit", ngImport: i0, template: '', isInline: true });
1116
+ __decorate([
1117
+ BlockUI()
1118
+ ], BaseFormEditComponent.prototype, "blockUI", void 0);
1119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseFormEditComponent, decorators: [{
1120
+ type: Component,
1121
+ args: [{
1122
+ selector: 'app-base.form.edit',
1123
+ template: ''
1124
+ }]
1125
+ }], ctorParameters: function () { return [{ type: i2.FormBuilder }, { type: i2$1.Router }, { type: i2$1.ActivatedRoute }, { type: BaseService }, { type: DialogService }, { type: i1$1.TranslateService }, { type: i3$1.Location }]; }, propDecorators: { blockUI: [] } });
1126
+
1127
+ var GridLayoutFormat;
1128
+ (function (GridLayoutFormat) {
1129
+ GridLayoutFormat[GridLayoutFormat["none"] = 0] = "none";
1130
+ GridLayoutFormat[GridLayoutFormat["date"] = 1] = "date";
1131
+ GridLayoutFormat[GridLayoutFormat["number"] = 2] = "number";
1132
+ GridLayoutFormat[GridLayoutFormat["percent"] = 3] = "percent";
1133
+ GridLayoutFormat[GridLayoutFormat["picture"] = 4] = "picture";
1134
+ })(GridLayoutFormat || (GridLayoutFormat = {}));
1135
+ var CellTextAlign;
1136
+ (function (CellTextAlign) {
1137
+ CellTextAlign["left"] = "left";
1138
+ CellTextAlign["center"] = "center";
1139
+ CellTextAlign["right"] = "right";
1140
+ })(CellTextAlign || (CellTextAlign = {}));
1141
+
1142
+ class GenericTableComponent {
1143
+ // ruleEngineService: RuleEngineService<T>;
1144
+ constructor(dialogService, router, datePipe, numberPipe, percentPipe, renderer) {
1145
+ this.dialogService = dialogService;
1146
+ this.router = router;
1147
+ this.datePipe = datePipe;
1148
+ this.numberPipe = numberPipe;
1149
+ this.percentPipe = percentPipe;
1150
+ this.renderer = renderer;
1151
+ this.defaultSort = null;
1152
+ this.defaultSortDirection = null;
1153
+ this.deletePropertyName = 'name';
1154
+ this.stickyColumns = null;
1155
+ this.editOnClick = false;
1156
+ this.editOnDblClick = false;
1157
+ this.allowEdit = true;
1158
+ this.popupEdit = false;
1159
+ this.customInclude = null;
1160
+ this.infiniteScroll = false;
1161
+ this.dataSource = new MatTableDataSource();
1162
+ this.resultsLength = 0;
1163
+ this.isLoadingResults = true;
1164
+ this.isRateLimitReached = false;
1165
+ this.filterChanged = new Subject();
1166
+ this.selectedObject = new EventEmitter();
1167
+ this.click = new EventEmitter();
1168
+ this.editModel = new EventEmitter();
1169
+ }
1170
+ ngOnChanges() {
1171
+ if (this.baseService !== undefined || this.baseService !== null) {
1172
+ if (this.gridLayoutService != null) {
1173
+ this.gridLayout = this.gridLayoutService.getGridLayout();
1174
+ }
1175
+ else {
1176
+ const model = this.baseService.newModel();
1177
+ this.gridLayout = model.getGridLayout();
1178
+ }
1179
+ this.displayedColumns = [];
1180
+ if (this.allowReorderItems) {
1181
+ this.displayedColumns.push('position');
1182
+ }
1183
+ this.displayedColumns.push.apply(this.displayedColumns, this.gridLayout.map(x => x.propertyName));
1184
+ if (!this.editOnClick && !this.editOnDblClick && this.allowEdit) {
1185
+ this.displayedColumns.push('delete');
1186
+ }
1187
+ }
1188
+ }
1189
+ ngOnInit() {
1190
+ this.filterChangedSubscription = this.filterChanged
1191
+ .pipe(debounceTime(300), distinctUntilChanged())
1192
+ .subscribe(newText => {
1193
+ if (newText.length >= 3 || newText.length == 0) {
1194
+ this.filterValue = newText;
1195
+ this.paginator.pageIndex = 0;
1196
+ this.refreshForm();
1197
+ }
1198
+ });
1199
+ // this.getGridLayout();
1200
+ this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0);
1201
+ this.paginator.pageSize = 15;
1202
+ if (this.defaultSort) {
1203
+ this.sort.active = this.defaultSort;
1204
+ if (this.defaultSortDirection) {
1205
+ this.sort.direction = this.defaultSortDirection;
1206
+ }
1207
+ else {
1208
+ this.sort.direction = 'asc';
1209
+ }
1210
+ }
1211
+ // this.dataSource.paginator = this.paginator;
1212
+ merge(this.sort.sortChange, this.paginator.page)
1213
+ .pipe(startWith({}), switchMap(() => {
1214
+ this.isLoadingResults = true;
1215
+ return this.getData();
1216
+ }), map(data => {
1217
+ // Flip flag to show that loading has finished.
1218
+ this.isLoadingResults = false;
1219
+ this.isRateLimitReached = false;
1220
+ if (data) {
1221
+ this.resultsLength = data.getMeta().meta.count;
1222
+ return data.getModels();
1223
+ }
1224
+ else {
1225
+ this.resultsLength = 0;
1226
+ return [];
1227
+ }
1228
+ }), catchError(() => {
1229
+ this.isLoadingResults = false;
1230
+ // Catch if the GitHub API has reached its rate limit. Return empty data.
1231
+ this.isRateLimitReached = true;
1232
+ return of([]);
1233
+ })).subscribe(data => {
1234
+ // if (this.infiniteScroll) {
1235
+ // let oldData = this.dataSource.data ?? null;
1236
+ // // if (oldData.length === 0) {
1237
+ // // oldData = data;
1238
+ // // } else {
1239
+ // oldData=oldData.concat(data);
1240
+ // // }
1241
+ // this.dataSource.data = oldData;
1242
+ // }
1243
+ // else {
1244
+ this.dataSource.data = data;
1245
+ // }
1246
+ });
1247
+ // this.paginator.nextPage()
1248
+ }
1249
+ getData() {
1250
+ this.isLoadingResults = true;
1251
+ const pageIndex = (this.paginator.pageIndex || 0) + 1;
1252
+ const pageSize = this.paginator.pageSize || 20;
1253
+ const filters = [];
1254
+ let sorts = '';
1255
+ if (this.sort.active) {
1256
+ if (this.sort.direction === 'desc') {
1257
+ sorts = '-' + this.sort.active;
1258
+ }
1259
+ else {
1260
+ sorts = this.sort.active;
1261
+ }
1262
+ }
1263
+ if (this.hasSearch) {
1264
+ if (this.filterValue) {
1265
+ // const filtersArr = this.searchFields.split(",");
1266
+ // filtersArr.forEach(element => {
1267
+ // filters.push(element + '@=*' + this.filterValue);
1268
+ // });
1269
+ const y = '(' + this.searchFields.replace(',', '|') + ')';
1270
+ filters.push(y + '@=*' + this.filterValue);
1271
+ }
1272
+ }
1273
+ if (this.defaultFilter) {
1274
+ filters.push(this.defaultFilter);
1275
+ }
1276
+ const filtersValue = filters.join(', ');
1277
+ return this.baseService.getAll(pageIndex, pageSize, sorts, filtersValue, this.customInclude);
1278
+ }
1279
+ refreshForm() {
1280
+ this.getData().subscribe(data => {
1281
+ if (data) {
1282
+ this.isLoadingResults = false;
1283
+ this.isRateLimitReached = false;
1284
+ this.resultsLength = data.getMeta().meta.count;
1285
+ this.dataSource.data = data.getModels();
1286
+ }
1287
+ else {
1288
+ this.isLoadingResults = false;
1289
+ this.isRateLimitReached = false;
1290
+ this.resultsLength = 0;
1291
+ this.dataSource.data = [];
1292
+ }
1293
+ });
1294
+ }
1295
+ highlight(element) {
1296
+ if (this.selectedItem) {
1297
+ this.selectedItem.highlighted = element.highlighted;
1298
+ }
1299
+ this.selectedItem = null;
1300
+ element.highlighted = !element.highlighted;
1301
+ if (element.highlighted) {
1302
+ this.selectedItem = element;
1303
+ this.selectedObject.emit(element);
1304
+ }
1305
+ else {
1306
+ this.selectedObject.emit(null);
1307
+ }
1308
+ }
1309
+ deleteObject(model) {
1310
+ const msg = 'Do you want to delete ' + model[this.deletePropertyName] + '?';
1311
+ this.dialogService.confirm(msg).subscribe((response) => {
1312
+ if (response) {
1313
+ this.baseService.delete(model.id).subscribe(() => {
1314
+ const tempData = [];
1315
+ this.selectedObject.emit(null);
1316
+ this.dataSource.data.map((item) => {
1317
+ if (item.id !== model.id) {
1318
+ tempData.push(item);
1319
+ }
1320
+ });
1321
+ this.dataSource.data = tempData;
1322
+ });
1323
+ }
1324
+ });
1325
+ }
1326
+ editObject(model) {
1327
+ if (!this.popupEdit) {
1328
+ const id = model.id;
1329
+ this.router.navigate([this.editLink, id]);
1330
+ }
1331
+ else {
1332
+ this.editModel.emit(model);
1333
+ }
1334
+ }
1335
+ getFlexStyle(column) {
1336
+ if (column.width) {
1337
+ const style = column.grow + ' ' + column.shrink + ' ' + column.width + 'px';
1338
+ return style;
1339
+ }
1340
+ return null;
1341
+ }
1342
+ getCellTextAlign(column) {
1343
+ return column.textAlign ?? CellTextAlign.left;
1344
+ }
1345
+ showPictureCell(column) {
1346
+ return (column?.formating ?? GridLayoutFormat.none) === GridLayoutFormat.picture;
1347
+ }
1348
+ deleteDisabled(model) {
1349
+ if (this.deleteDisableRule) {
1350
+ return this.evaluateRule(this.deleteDisableRule, model);
1351
+ }
1352
+ else {
1353
+ return false;
1354
+ }
1355
+ }
1356
+ cellClick(model, propertyName) {
1357
+ this.click.emit({ propertyName, model });
1358
+ }
1359
+ evaluateRule(rules, model) {
1360
+ let result = true;
1361
+ rules.forEach(rule => {
1362
+ let jsonRule;
1363
+ if (typeof rule.rule === 'string') {
1364
+ jsonRule = JSON.parse(rule.rule);
1365
+ }
1366
+ else {
1367
+ jsonRule = rule.rule;
1368
+ }
1369
+ if (rule.parameters) {
1370
+ const data = '{' + rule.parameters.map((item) => {
1371
+ return '"' + item + '":"' + model[item] + '"';
1372
+ }).join(',') + '}';
1373
+ result = jsonLogic.apply(jsonRule, JSON.parse(data));
1374
+ }
1375
+ else {
1376
+ result = jsonLogic.apply(jsonRule);
1377
+ }
1378
+ });
1379
+ return result;
1380
+ }
1381
+ getCelValue(row, propertyName) {
1382
+ if (!row)
1383
+ return "";
1384
+ // if (propertyName == 'kompetenzenStdev')
1385
+ // console.log(propertyName);
1386
+ if (propertyName.indexOf('.') === -1) {
1387
+ var gridLayout = this.gridLayout.find(f => f.propertyName.indexOf(propertyName) > -1);
1388
+ return this.getFormatedValue(gridLayout, row[propertyName]);
1389
+ }
1390
+ else {
1391
+ const prop = propertyName.split('.')[0];
1392
+ const subProp = propertyName.replace(prop + '.', '');
1393
+ return this.getCelValue(row[prop], subProp);
1394
+ }
1395
+ }
1396
+ getFormatedValue(gridLayout, value) {
1397
+ if (gridLayout) {
1398
+ switch (gridLayout.formating) {
1399
+ case GridLayoutFormat.date:
1400
+ return this.datePipe.transform(value, gridLayout.format);
1401
+ break;
1402
+ case GridLayoutFormat.number:
1403
+ return this.numberPipe.transform(value, gridLayout.format);
1404
+ case GridLayoutFormat.percent:
1405
+ const valuePrc = value / 100;
1406
+ return this.percentPipe.transform(valuePrc, gridLayout.format);
1407
+ default:
1408
+ return value;
1409
+ break;
1410
+ }
1411
+ }
1412
+ return value;
1413
+ }
1414
+ applyFilter(event) {
1415
+ }
1416
+ dropTable(event) {
1417
+ if (this.changeItemPosition) {
1418
+ const prevItem = this.dataSource.data[event.previousIndex];
1419
+ const currentItem = this.dataSource.data[event.currentIndex];
1420
+ if (this.changeItemPosition(prevItem, currentItem)) {
1421
+ const prevIndex = this.dataSource.data.findIndex((d) => d === event.item.data);
1422
+ moveItemInArray(this.dataSource.data, prevIndex, event.currentIndex);
1423
+ this.table.renderRows();
1424
+ }
1425
+ }
1426
+ }
1427
+ isColumnSticky(name) {
1428
+ if (this.stickyColumns) {
1429
+ const filtersArr = this.stickyColumns.split(",");
1430
+ return filtersArr.findIndex(f => f == name) !== -1;
1431
+ }
1432
+ return false;
1433
+ }
1434
+ updateElement(model) {
1435
+ //Find if element exist
1436
+ var currentElement = this.dataSource.data.find(f => f.id === model.id);
1437
+ if (currentElement !== null) {
1438
+ const index = this.dataSource.data.indexOf(currentElement);
1439
+ this.dataSource.data[index] = model;
1440
+ }
1441
+ else {
1442
+ this.dataSource.data.push(model);
1443
+ }
1444
+ const newData = [...this.dataSource.data];
1445
+ this.dataSource.data = newData;
1446
+ this.dataSource._updateChangeSubscription();
1447
+ }
1448
+ ngAfterViewInit() {
1449
+ fromEvent(this.matTableRef.nativeElement, 'scroll')
1450
+ .pipe(debounceTime(700))
1451
+ .subscribe((e) => this.onTableScroll(e));
1452
+ }
1453
+ onTableScroll(e) {
1454
+ const tableViewHeight = e.target.offsetHeight; // viewport: ~500px
1455
+ const tableScrollHeight = e.target.scrollHeight; // length of all table
1456
+ const scrollLocation = e.target.scrollTop; // how far user scrolled
1457
+ // If the user has scrolled within 200px of the bottom, add more data
1458
+ const scrollThreshold = 200;
1459
+ const scrollUpLimit = scrollThreshold;
1460
+ if (scrollLocation < scrollUpLimit && this.paginator.pageIndex > 0) {
1461
+ // this.firstPage--;
1462
+ console.log(`onTableScroll() UP: firstPage decreased to ${this.paginator.pageIndex}. Now fetching data...`);
1463
+ // this.fetchData();
1464
+ this.scrollTo(tableScrollHeight / 2 - 2 * tableViewHeight);
1465
+ }
1466
+ const scrollDownLimit = tableScrollHeight - tableViewHeight - scrollThreshold;
1467
+ if (scrollLocation > scrollDownLimit && this.paginator.pageIndex < this.paginator.getNumberOfPages()) {
1468
+ // this.firstPage++;
1469
+ console.log(`onTableScroll(): firstPage increased to ${this.paginator.pageIndex}. Now fetching data...`);
1470
+ this.paginator.nextPage();
1471
+ // this.scrollTo(tableScrollHeight / 2 + tableViewHeight);
1472
+ }
1473
+ }
1474
+ scrollTo(position) {
1475
+ this.renderer.setProperty(this.matTableRef.nativeElement, 'scrollTop', position);
1476
+ }
1477
+ getCellClass(model, property) {
1478
+ return model.getCellClass(property);
1479
+ }
1480
+ }
1481
+ GenericTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: GenericTableComponent, deps: [{ token: DialogService }, { token: i2$1.Router }, { token: i3$1.DatePipe }, { token: i3$1.DecimalPipe }, { token: i3$1.PercentPipe }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
1482
+ GenericTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: GenericTableComponent, selector: "rsl-generic-table", inputs: { modelType: "modelType", baseService: "baseService", gridLayoutService: "gridLayoutService", editLink: "editLink", defaultSort: "defaultSort", defaultSortDirection: "defaultSortDirection", deleteDisableRule: "deleteDisableRule", deletePropertyName: "deletePropertyName", hasSearch: "hasSearch", searchFields: "searchFields", defaultFilter: "defaultFilter", allowReorderItems: "allowReorderItems", stickyColumns: "stickyColumns", editOnClick: "editOnClick", editOnDblClick: "editOnDblClick", allowEdit: "allowEdit", popupEdit: "popupEdit", customInclude: "customInclude", changeItemPosition: "changeItemPosition", infiniteScroll: "infiniteScroll" }, outputs: { selectedObject: "selectedObject", click: "click", editModel: "editModel" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }, { propertyName: "filter", first: true, predicate: ElementRef, descendants: true }, { propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "matTableRef", first: true, predicate: ["table"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"containerX\" *ngIf=\"hasSearch\">\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" fxLayout.sm=\"column\" fxFlexFill>\r\n <mat-form-field fxFlex>\r\n <mat-label>Filter</mat-label>\r\n <input matInput [ngModel]='filterValue' (ngModelChange)='filterChanged.next($event)' #filter>\r\n </mat-form-field>\r\n </div>\r\n</div>\r\n\r\n<div class=\"table-container\">\r\n <div class=\"mat-elevation-z2\">\r\n <!-- #applicationsContainer -->\r\n <div class=\"example-loading-shade\" *ngIf=\"isLoadingResults || isRateLimitReached\">\r\n <mat-spinner *ngIf=\"isLoadingResults\"></mat-spinner>\r\n <div class=\"example-rate-limit-reached\" *ngIf=\"isRateLimitReached\">\r\n {{'General.LoadingData' | translate}}\r\n </div>\r\n </div>\r\n\r\n\r\n <mat-table fxFlex #table [dataSource]=\"dataSource\" id=\"tempalte-forms-table\" matSort matSortDisableClear\r\n matSortDirection=\"asc\" cdkDropList [cdkDropListData]=\"dataSource\" (cdkDropListDropped)=\"dropTable($event)\">\r\n <!-- (scroll)=\"onTableScroll($event)\" -->\r\n\r\n\r\n <ng-container matColumnDef=\"position\">\r\n <mat-header-cell *matHeaderCellDef disableClear=\"true\">\r\n <!-- {{'General.Order' | translate}} -->\r\n </mat-header-cell>\r\n <mat-cell fxFlex *matCellDef=\"let element;\">\r\n <mat-icon cdkDragHandle>reorder</mat-icon>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngFor=\"let column of gridLayout\" [matColumnDef]=\"column.propertyName\"\r\n [sticky]=\"isColumnSticky(column.propertyName)\">\r\n <mat-header-cell mat-sort-header disableClear [style.flex]=\"getFlexStyle(column)\" *matHeaderCellDef>\r\n {{column.translateKey | translate}}\r\n </mat-header-cell>\r\n <mat-cell matTooltip={{getCelValue(row,column.propertyName)}} [style.flex]=\"getFlexStyle(column)\"\r\n [style.text-align]=\"getCellTextAlign(column)\" *matCellDef=\"let row\" (click)=\"cellClick(row,column.propertyName)\">\r\n <div [ngClass]=\"getCellClass(row,column.propertyName)\" *ngIf=\"!showPictureCell(column)\">\r\n {{getCelValue(row,column.propertyName)}}\r\n </div>\r\n <img [ngClass]=\"getCellClass(row,column.propertyName)\" *ngIf=\"showPictureCell(column)\">\r\n </mat-cell>\r\n </ng-container>\r\n\r\n\r\n <ng-container matColumnDef=\"delete\" stickyEnd *ngIf=\"!editOnClick && !editOnDblClick\">\r\n <mat-header-cell *matHeaderCellDef disableClear=\"true\">\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let row\">\r\n <button class=\"btn btn-green btn-fill btn-wd btn-just-icon\" (click)=\"editObject(row)\"\r\n matTooltip=\"{{'General.Edit' | translate}}\">\r\n <!-- <mat-icon>edit</mat-icon> -->\r\n <i class=\"material-icons\">edit</i>\r\n <div class=\"ripple-container\"></div>\r\n </button>\r\n <button class=\"btn btn-red btn-fill btn-wd btn-just-icon\" (click)=\"deleteObject(row)\"\r\n [disabled]=\"deleteDisabled(row)\" matTooltip=\"{{'General.Delete' | translate}}\">\r\n <i class=\"material-icons\">delete</i>\r\n <div class=\"ripple-container\"></div>\r\n </button>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-header-row *matHeaderRowDef=\"displayedColumns;sticky: true\"></mat-header-row>\r\n\r\n <ng-container *ngIf=\"!editOnClick && !editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (click)=\"highlight(row)\"\r\n (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\">\r\n </mat-row>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editOnClick && !editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (click)=\"editObject(row)\"\r\n (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\" style=\"cursor: pointer;\"></mat-row>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!editOnClick && editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (dblclick)=\"editObject(row)\"\r\n (click)=\"highlight(row)\" (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\"\r\n style=\"cursor: pointer;\"></mat-row>\r\n </ng-container>\r\n\r\n <!-- [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\"\r\n (click)=\"highlight(row)\" (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\" -->\r\n </mat-table>\r\n <mat-paginator #paginator [hidden]=\"infiniteScroll\" [length]=\"resultsLength\" [pageSize]=\"15\"\r\n [pageSizeOptions]=\"[15, 30, 100]\" [showFirstLastButtons]=\"true\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".mat-column-delete{flex:0 0 90px;padding-right:30px}.mat-sort-header-button{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-column-position{flex:0 0 60px!important}.mat-table{overflow-x:auto}[hidden]{display:none!important}\n"], components: [{ type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i5$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i6$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i8$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { type: i6$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i6$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i9.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.MatLabel, selector: "mat-label" }, { type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8$1.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i12.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i6$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i6$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i6$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i6$1.MatCellDef, selector: "[matCellDef]" }, { type: i6$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i12.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i6$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { type: i12.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }], pipes: { "translate": i1$1.TranslatePipe }, encapsulation: i0.ViewEncapsulation.None });
1483
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: GenericTableComponent, decorators: [{
1484
+ type: Component,
1485
+ args: [{ selector: 'rsl-generic-table', encapsulation: ViewEncapsulation.None, template: "<div class=\"containerX\" *ngIf=\"hasSearch\">\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" fxLayout.sm=\"column\" fxFlexFill>\r\n <mat-form-field fxFlex>\r\n <mat-label>Filter</mat-label>\r\n <input matInput [ngModel]='filterValue' (ngModelChange)='filterChanged.next($event)' #filter>\r\n </mat-form-field>\r\n </div>\r\n</div>\r\n\r\n<div class=\"table-container\">\r\n <div class=\"mat-elevation-z2\">\r\n <!-- #applicationsContainer -->\r\n <div class=\"example-loading-shade\" *ngIf=\"isLoadingResults || isRateLimitReached\">\r\n <mat-spinner *ngIf=\"isLoadingResults\"></mat-spinner>\r\n <div class=\"example-rate-limit-reached\" *ngIf=\"isRateLimitReached\">\r\n {{'General.LoadingData' | translate}}\r\n </div>\r\n </div>\r\n\r\n\r\n <mat-table fxFlex #table [dataSource]=\"dataSource\" id=\"tempalte-forms-table\" matSort matSortDisableClear\r\n matSortDirection=\"asc\" cdkDropList [cdkDropListData]=\"dataSource\" (cdkDropListDropped)=\"dropTable($event)\">\r\n <!-- (scroll)=\"onTableScroll($event)\" -->\r\n\r\n\r\n <ng-container matColumnDef=\"position\">\r\n <mat-header-cell *matHeaderCellDef disableClear=\"true\">\r\n <!-- {{'General.Order' | translate}} -->\r\n </mat-header-cell>\r\n <mat-cell fxFlex *matCellDef=\"let element;\">\r\n <mat-icon cdkDragHandle>reorder</mat-icon>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngFor=\"let column of gridLayout\" [matColumnDef]=\"column.propertyName\"\r\n [sticky]=\"isColumnSticky(column.propertyName)\">\r\n <mat-header-cell mat-sort-header disableClear [style.flex]=\"getFlexStyle(column)\" *matHeaderCellDef>\r\n {{column.translateKey | translate}}\r\n </mat-header-cell>\r\n <mat-cell matTooltip={{getCelValue(row,column.propertyName)}} [style.flex]=\"getFlexStyle(column)\"\r\n [style.text-align]=\"getCellTextAlign(column)\" *matCellDef=\"let row\" (click)=\"cellClick(row,column.propertyName)\">\r\n <div [ngClass]=\"getCellClass(row,column.propertyName)\" *ngIf=\"!showPictureCell(column)\">\r\n {{getCelValue(row,column.propertyName)}}\r\n </div>\r\n <img [ngClass]=\"getCellClass(row,column.propertyName)\" *ngIf=\"showPictureCell(column)\">\r\n </mat-cell>\r\n </ng-container>\r\n\r\n\r\n <ng-container matColumnDef=\"delete\" stickyEnd *ngIf=\"!editOnClick && !editOnDblClick\">\r\n <mat-header-cell *matHeaderCellDef disableClear=\"true\">\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let row\">\r\n <button class=\"btn btn-green btn-fill btn-wd btn-just-icon\" (click)=\"editObject(row)\"\r\n matTooltip=\"{{'General.Edit' | translate}}\">\r\n <!-- <mat-icon>edit</mat-icon> -->\r\n <i class=\"material-icons\">edit</i>\r\n <div class=\"ripple-container\"></div>\r\n </button>\r\n <button class=\"btn btn-red btn-fill btn-wd btn-just-icon\" (click)=\"deleteObject(row)\"\r\n [disabled]=\"deleteDisabled(row)\" matTooltip=\"{{'General.Delete' | translate}}\">\r\n <i class=\"material-icons\">delete</i>\r\n <div class=\"ripple-container\"></div>\r\n </button>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-header-row *matHeaderRowDef=\"displayedColumns;sticky: true\"></mat-header-row>\r\n\r\n <ng-container *ngIf=\"!editOnClick && !editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (click)=\"highlight(row)\"\r\n (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\">\r\n </mat-row>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editOnClick && !editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (click)=\"editObject(row)\"\r\n (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\" style=\"cursor: pointer;\"></mat-row>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!editOnClick && editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (dblclick)=\"editObject(row)\"\r\n (click)=\"highlight(row)\" (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\"\r\n style=\"cursor: pointer;\"></mat-row>\r\n </ng-container>\r\n\r\n <!-- [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\"\r\n (click)=\"highlight(row)\" (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\" -->\r\n </mat-table>\r\n <mat-paginator #paginator [hidden]=\"infiniteScroll\" [length]=\"resultsLength\" [pageSize]=\"15\"\r\n [pageSizeOptions]=\"[15, 30, 100]\" [showFirstLastButtons]=\"true\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".mat-column-delete{flex:0 0 90px;padding-right:30px}.mat-sort-header-button{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-column-position{flex:0 0 60px!important}.mat-table{overflow-x:auto}[hidden]{display:none!important}\n"] }]
1486
+ }], ctorParameters: function () { return [{ type: DialogService }, { type: i2$1.Router }, { type: i3$1.DatePipe }, { type: i3$1.DecimalPipe }, { type: i3$1.PercentPipe }, { type: i0.Renderer2 }]; }, propDecorators: { modelType: [{
1487
+ type: Input
1488
+ }], baseService: [{
1489
+ type: Input
1490
+ }], gridLayoutService: [{
1491
+ type: Input
1492
+ }], editLink: [{
1493
+ type: Input
1494
+ }], defaultSort: [{
1495
+ type: Input
1496
+ }], defaultSortDirection: [{
1497
+ type: Input
1498
+ }], deleteDisableRule: [{
1499
+ type: Input
1500
+ }], deletePropertyName: [{
1501
+ type: Input
1502
+ }], hasSearch: [{
1503
+ type: Input
1504
+ }], searchFields: [{
1505
+ type: Input
1506
+ }], defaultFilter: [{
1507
+ type: Input
1508
+ }], allowReorderItems: [{
1509
+ type: Input
1510
+ }], stickyColumns: [{
1511
+ type: Input
1512
+ }], editOnClick: [{
1513
+ type: Input
1514
+ }], editOnDblClick: [{
1515
+ type: Input
1516
+ }], allowEdit: [{
1517
+ type: Input
1518
+ }], popupEdit: [{
1519
+ type: Input
1520
+ }], customInclude: [{
1521
+ type: Input
1522
+ }], changeItemPosition: [{
1523
+ type: Input
1524
+ }], infiniteScroll: [{
1525
+ type: Input
1526
+ }], paginator: [{
1527
+ type: ViewChild,
1528
+ args: [MatPaginator, { static: true }]
1529
+ }], sort: [{
1530
+ type: ViewChild,
1531
+ args: [MatSort, { static: true }]
1532
+ }], filter: [{
1533
+ type: ViewChild,
1534
+ args: [ElementRef, { static: false }]
1535
+ }], table: [{
1536
+ type: ViewChild,
1537
+ args: ['table']
1538
+ }], matTableRef: [{
1539
+ type: ViewChild,
1540
+ args: ['table', { read: ElementRef }]
1541
+ }], selectedObject: [{
1542
+ type: Output
1543
+ }], click: [{
1544
+ type: Output
1545
+ }], editModel: [{
1546
+ type: Output
1547
+ }] } });
1548
+
1549
+ // tslint:disable-next-line:variable-name
1550
+ const AttributeMetadata = Symbol('AttributeMetadata');
1551
+
1552
+ class DateConverter {
1553
+ mask(value) {
1554
+ const d = parseISO(value);
1555
+ return d;
1556
+ }
1557
+ unmask(value) {
1558
+ // const result = format(value, 'YYYY-MM-DDTHH:mm:ssZ');
1559
+ return value;
1560
+ }
1561
+ }
1562
+
1563
+ function Attribute(options = {}) {
1564
+ return (target, propertyName) => {
1565
+ const converter = (dataType, value, forSerialisation = false) => {
1566
+ let attrConverter;
1567
+ if (dataType) {
1568
+ if (options.converter) {
1569
+ attrConverter = options.converter;
1570
+ }
1571
+ else if (dataType === Date) {
1572
+ attrConverter = new DateConverter();
1573
+ }
1574
+ else {
1575
+ const datatype = new dataType();
1576
+ if (datatype.mask && datatype.unmask) {
1577
+ attrConverter = datatype;
1578
+ }
1579
+ }
1580
+ if (attrConverter) {
1581
+ if (!forSerialisation) {
1582
+ return attrConverter.mask(value);
1583
+ }
1584
+ return attrConverter.unmask(value);
1585
+ }
1586
+ }
1587
+ return value;
1588
+ };
1589
+ const saveAnnotations = () => {
1590
+ const metadata = Reflect.getMetadata('Attribute', target) || {};
1591
+ metadata[propertyName] = {
1592
+ marked: true
1593
+ };
1594
+ Reflect.defineMetadata('Attribute', metadata, target);
1595
+ const mappingMetadata = Reflect.getMetadata('AttributeMapping', target) || {};
1596
+ const serializedPropertyName = options.serializedName !== undefined ? options.serializedName : propertyName;
1597
+ mappingMetadata[serializedPropertyName] = propertyName;
1598
+ Reflect.defineMetadata('AttributeMapping', mappingMetadata, target);
1599
+ const requiredMetadata = Reflect.getMetadata('AttributeRequired', target) || {};
1600
+ requiredMetadata[serializedPropertyName] = options.required !== undefined ? options.required : false;
1601
+ Reflect.defineMetadata('AttributeRequired', requiredMetadata, target);
1602
+ const defaultMetadata = Reflect.getMetadata('AttributedefaultValue', target) || {};
1603
+ defaultMetadata[serializedPropertyName] = options.defaultValue !== undefined ? options.defaultValue : null;
1604
+ Reflect.defineMetadata('AttributedefaultValue', defaultMetadata, target);
1605
+ const formSubGroupMetadata = Reflect.getMetadata('AttributeformSubGroup', target) || {};
1606
+ formSubGroupMetadata[serializedPropertyName] = options.formSubGroup !== undefined ? options.formSubGroup : null;
1607
+ Reflect.defineMetadata('AttributeformSubGroup', formSubGroupMetadata, target);
1608
+ };
1609
+ const setMetadata = (hasDirtyAttributes, instance, oldValue, newValue, isNew) => {
1610
+ const targetType = Reflect.getMetadata('design:type', target, propertyName);
1611
+ if (!instance[AttributeMetadata]) {
1612
+ instance[AttributeMetadata] = {};
1613
+ }
1614
+ const propertyHasDirtyAttributes = typeof oldValue === 'undefined' && !isNew ? false : hasDirtyAttributes;
1615
+ instance[AttributeMetadata][propertyName] = {
1616
+ newValue,
1617
+ oldValue,
1618
+ serializedName: options.serializedName,
1619
+ hasDirtyAttributes: propertyHasDirtyAttributes,
1620
+ serialisationValue: converter(targetType, newValue, true)
1621
+ };
1622
+ };
1623
+ const getter = function () {
1624
+ return this['_' + propertyName];
1625
+ };
1626
+ const setter = function (newVal) {
1627
+ const targetType = Reflect.getMetadata('design:type', target, propertyName);
1628
+ const convertedValue = converter(targetType, newVal);
1629
+ if (convertedValue !== this['_' + propertyName]) {
1630
+ setMetadata(true, this, this['_' + propertyName], newVal, !this.id);
1631
+ this['_' + propertyName] = convertedValue;
1632
+ }
1633
+ };
1634
+ if (delete target[propertyName]) {
1635
+ saveAnnotations();
1636
+ Object.defineProperty(target, propertyName, {
1637
+ get: getter,
1638
+ set: setter,
1639
+ enumerable: true,
1640
+ configurable: true
1641
+ });
1642
+ }
1643
+ };
1644
+ }
1645
+
1646
+ function BaseDatastoreConfig(config = {}) {
1647
+ // tslint:disable-next-line:only-arrow-functions
1648
+ return (target) => {
1649
+ Reflect.defineMetadata('BaseDatastoreConfig', config, target);
1650
+ };
1651
+ }
1652
+
1653
+ class BaseMetaModel {
1654
+ constructor(response) {
1655
+ this.links = response.links || [];
1656
+ this.meta = response.meta;
1657
+ }
1658
+ }
1659
+
1660
+ function BaseModelConfig(config = {}) {
1661
+ return (target) => {
1662
+ if (typeof config['meta'] === 'undefined' || config['meta'] == null) {
1663
+ config['meta'] = BaseMetaModel;
1664
+ }
1665
+ Reflect.defineMetadata('BaseModelConfig', config, target);
1666
+ };
1667
+ }
1668
+
1669
+ function CustomType(config = {}) {
1670
+ return (target, propertyName) => {
1671
+ const annotations = Reflect.getMetadata('CustomType', target) || [];
1672
+ annotations.push({
1673
+ propertyName,
1674
+ relationship: config.key || propertyName
1675
+ });
1676
+ Reflect.defineMetadata('CustomType', annotations, target);
1677
+ };
1678
+ }
1679
+
1680
+ function GridLayout(translateKey, width, grow = 0, shrink = 0, subProperty, formating = GridLayoutFormat.none, format = '', order = 0, textAlign = CellTextAlign.left) {
1681
+ return (target, propertyName) => {
1682
+ const annotations = Reflect.getMetadata('GridLayout', target) || [];
1683
+ let propName = propertyName;
1684
+ if (subProperty) {
1685
+ propName = propertyName.toString() + '.' + subProperty;
1686
+ }
1687
+ annotations.push({
1688
+ propertyName: propName,
1689
+ translateKey,
1690
+ width,
1691
+ grow,
1692
+ shrink,
1693
+ formating,
1694
+ format,
1695
+ order,
1696
+ textAlign
1697
+ });
1698
+ Reflect.defineMetadata('GridLayout', annotations, target);
1699
+ };
1700
+ }
1701
+
1702
+ class TranslatedElementDirective {
1703
+ constructor(viewRef, templateRef) {
1704
+ this.viewRef = viewRef;
1705
+ this.templateRef = templateRef;
1706
+ }
1707
+ }
1708
+ TranslatedElementDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: TranslatedElementDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
1709
+ TranslatedElementDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: TranslatedElementDirective, selector: "[translatedElement]", inputs: { elementKey: ["translatedElement", "elementKey"] }, ngImport: i0 });
1710
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: TranslatedElementDirective, decorators: [{
1711
+ type: Directive,
1712
+ args: [{
1713
+ selector: '[translatedElement]',
1714
+ }]
1715
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { elementKey: [{
1716
+ type: Input,
1717
+ args: ['translatedElement']
1718
+ }] } });
1719
+
1720
+ const TOKEN_START_DEMARC = '{{';
1721
+ const TOKEN_END_DEMARC = '}}';
1722
+ // adapted from @kasperlauge's solution in https://github.com/ngx-translate/core/issues/223
1723
+ class TranslatedContentDirective {
1724
+ constructor(viewRef, renderer, translateService, changeDetectorRef) {
1725
+ this.viewRef = viewRef;
1726
+ this.renderer = renderer;
1727
+ this.translateService = translateService;
1728
+ this.changeDetectorRef = changeDetectorRef;
1729
+ this.subs = [];
1730
+ }
1731
+ ngOnInit() {
1732
+ this.rawTranslation = merge(this.translateService.get(this.translationKey), this.translateService.onLangChange.asObservable().pipe(switchMap(() => this.translateService.get(this.translationKey))));
1733
+ }
1734
+ ngAfterContentInit() {
1735
+ // QueryList.changes doesn't re-emit after its initial value, which we have by now
1736
+ // BehaviorSubjects re-emit their initial value on subscription, so we get what we need by merging
1737
+ // the BehaviorSubject and the QueryList.changes observable
1738
+ const elementsSubject = new BehaviorSubject(this.elements.toArray());
1739
+ const elementsChanges = merge(elementsSubject, this.elements.changes);
1740
+ this.translationData = combineLatest(this.rawTranslation, elementsChanges)
1741
+ .pipe(map(([rawTranslation]) => {
1742
+ return {
1743
+ elements: this.elements.toArray(),
1744
+ rawTranslation,
1745
+ };
1746
+ }));
1747
+ this.subs.push(this.translationData.subscribe(this.render.bind(this)));
1748
+ }
1749
+ render(translationData) {
1750
+ if (!translationData.rawTranslation || translationData.rawTranslation === this.translationKey) {
1751
+ throw new Error(`No resource matching the key '${this.translationKey}'`);
1752
+ }
1753
+ while (this.viewRef.element.nativeElement.firstChild) {
1754
+ this.renderer.removeChild(this.viewRef.element.nativeElement, this.viewRef.element.nativeElement.firstChild);
1755
+ }
1756
+ let lastTokenEnd = 0;
1757
+ while (lastTokenEnd < translationData.rawTranslation.length) {
1758
+ const tokenStartDemarc = translationData.rawTranslation.indexOf(TOKEN_START_DEMARC, lastTokenEnd);
1759
+ if (tokenStartDemarc < 0) {
1760
+ break;
1761
+ }
1762
+ const tokenStart = tokenStartDemarc + TOKEN_START_DEMARC.length;
1763
+ const tokenEnd = translationData.rawTranslation.indexOf(TOKEN_END_DEMARC, tokenStart);
1764
+ if (tokenEnd < 0) {
1765
+ throw new Error(`Encountered unterminated token in translation string '${this.translationKey}'`);
1766
+ }
1767
+ const tokenEndDemarc = tokenEnd + TOKEN_END_DEMARC.length;
1768
+ const precedingText = translationData.rawTranslation.substring(lastTokenEnd, tokenStartDemarc);
1769
+ const precedingTextElement = this.renderer.createText(precedingText);
1770
+ this.renderer.appendChild(this.viewRef.element.nativeElement, precedingTextElement);
1771
+ const elementKey = translationData.rawTranslation.substring(tokenStart, tokenEnd);
1772
+ const embeddedElementTemplate = translationData.elements.find(element => element.elementKey === elementKey);
1773
+ if (embeddedElementTemplate) {
1774
+ const embeddedElementView = embeddedElementTemplate.viewRef.createEmbeddedView(embeddedElementTemplate.templateRef);
1775
+ this.renderer.appendChild(this.viewRef.element.nativeElement, embeddedElementView.rootNodes[0]);
1776
+ }
1777
+ else {
1778
+ const missingTokenText = translationData.rawTranslation.substring(tokenStartDemarc, tokenEndDemarc);
1779
+ const missingTokenElement = this.renderer.createText(missingTokenText);
1780
+ this.renderer.appendChild(this.viewRef.element.nativeElement, missingTokenElement);
1781
+ }
1782
+ lastTokenEnd = tokenEndDemarc;
1783
+ }
1784
+ const trailingText = translationData.rawTranslation.substring(lastTokenEnd);
1785
+ const trailingTextElement = this.renderer.createText(trailingText);
1786
+ this.renderer.appendChild(this.viewRef.element.nativeElement, trailingTextElement);
1787
+ // in case the rendering happens outside of a change detection event, this ensures that any translations in the
1788
+ // embedded elements are rendered
1789
+ this.changeDetectorRef.detectChanges();
1790
+ }
1791
+ ngOnDestroy() {
1792
+ this.subs.forEach(sub => sub.unsubscribe());
1793
+ }
1794
+ }
1795
+ TranslatedContentDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: TranslatedContentDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.Renderer2 }, { token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
1796
+ TranslatedContentDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: TranslatedContentDirective, selector: "[appTranslatedContent]", inputs: { translationKey: ["appTranslatedContent", "translationKey"] }, queries: [{ propertyName: "elements", predicate: TranslatedElementDirective }], ngImport: i0 });
1797
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: TranslatedContentDirective, decorators: [{
1798
+ type: Directive,
1799
+ args: [{
1800
+ selector: '[appTranslatedContent]',
1801
+ }]
1802
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.Renderer2 }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { translationKey: [{
1803
+ type: Input,
1804
+ args: ['appTranslatedContent']
1805
+ }], elements: [{
1806
+ type: ContentChildren,
1807
+ args: [TranslatedElementDirective]
1808
+ }] } });
1809
+
1810
+ class GridLayoutModel {
1811
+ constructor(propertyName, translateKey = null, width = null, grow = 0, shrink = 0, formating = GridLayoutFormat.none, format = '', order = 0, textAlign = CellTextAlign.left) {
1812
+ this.formating = GridLayoutFormat.none;
1813
+ this.order = 0;
1814
+ this.textAlign = CellTextAlign.left;
1815
+ this.propertyName = propertyName;
1816
+ this.translateKey = translateKey;
1817
+ this.width = width;
1818
+ this.grow = grow;
1819
+ this.shrink = shrink;
1820
+ this.formating = formating;
1821
+ this.format = format;
1822
+ this.order = order;
1823
+ this.textAlign = textAlign;
1824
+ }
1825
+ }
1826
+
1827
+ class BaseModel {
1828
+ // tslint:disable-next-line:variable-name
1829
+ constructor(_datastore, data) {
1830
+ this._datastore = _datastore;
1831
+ if (data) {
1832
+ if (data.id) {
1833
+ this.id = data.id;
1834
+ }
1835
+ Object.assign(this, data);
1836
+ }
1837
+ }
1838
+ save(params, headers, customUrl, customBody) {
1839
+ const attributesMetadata = this[AttributeMetadata];
1840
+ return this._datastore.saveRecord(attributesMetadata, this, params, headers, customUrl, customBody);
1841
+ }
1842
+ patch(origModel, params, headers, customUrl) {
1843
+ const attributesMetadata = this[AttributeMetadata];
1844
+ return this._datastore.patchRecord(attributesMetadata, this, origModel, params, headers, customUrl);
1845
+ }
1846
+ replace(params, headers, customUrl, customBody) {
1847
+ const attributesMetadata = this[AttributeMetadata];
1848
+ return this._datastore.replaceRecord(attributesMetadata, this, params, headers, customUrl, customBody);
1849
+ }
1850
+ get attributeMetadata() {
1851
+ const attributesMetadata = this[AttributeMetadata];
1852
+ return attributesMetadata;
1853
+ }
1854
+ set attributeMetadata(val) {
1855
+ this[AttributeMetadata] = val;
1856
+ }
1857
+ get hasDirtyAttributes() {
1858
+ const attributesMetadata = this[AttributeMetadata];
1859
+ let hasDirtyAttributes = false;
1860
+ for (const propertyName in attributesMetadata) {
1861
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
1862
+ const metadata = attributesMetadata[propertyName];
1863
+ if (metadata.hasDirtyAttributes) {
1864
+ hasDirtyAttributes = true;
1865
+ break;
1866
+ }
1867
+ }
1868
+ }
1869
+ return hasDirtyAttributes;
1870
+ }
1871
+ rollbackAttributes() {
1872
+ const attributesMetadata = this[AttributeMetadata];
1873
+ let metadata;
1874
+ for (const propertyName in attributesMetadata) {
1875
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
1876
+ if (attributesMetadata[propertyName].hasDirtyAttributes) {
1877
+ this[propertyName] = attributesMetadata[propertyName].oldValue;
1878
+ metadata = {
1879
+ hasDirtyAttributes: false,
1880
+ newValue: attributesMetadata[propertyName].oldValue,
1881
+ oldValue: undefined
1882
+ };
1883
+ attributesMetadata[propertyName] = metadata;
1884
+ }
1885
+ }
1886
+ }
1887
+ this[AttributeMetadata] = attributesMetadata;
1888
+ }
1889
+ get modelConfig() {
1890
+ return Reflect.getMetadata('BaseModelConfig', this.constructor);
1891
+ }
1892
+ deserializeModel(modelType, data) {
1893
+ data = this.transformSerializedNamesToPropertyNames(modelType, data);
1894
+ return new modelType(this._datastore, data);
1895
+ }
1896
+ transformSerializedNamesToPropertyNames(modelType, attributes) {
1897
+ const serializedNameToPropertyName = this.getModelPropertyNames(modelType.prototype);
1898
+ const properties = {};
1899
+ Object.keys(serializedNameToPropertyName).forEach((serializedName) => {
1900
+ if (attributes[serializedName] !== null && attributes[serializedName] !== undefined) {
1901
+ properties[serializedNameToPropertyName[serializedName]] = attributes[serializedName];
1902
+ }
1903
+ });
1904
+ return properties;
1905
+ }
1906
+ getModelPropertyNames(model) {
1907
+ return Reflect.getMetadata('AttributeMapping', model);
1908
+ }
1909
+ getModelRequiredPropertyNames(model) {
1910
+ return Reflect.getMetadata('AttributeRequired', model);
1911
+ }
1912
+ getModelDefaultPropertyValues(model) {
1913
+ return Reflect.getMetadata('AttributedefaultValue', model);
1914
+ }
1915
+ getModelSubGroupPropertyNames(model) {
1916
+ return Reflect.getMetadata('AttributeformSubGroup', model);
1917
+ }
1918
+ getFromGroup(fb) {
1919
+ const props = Object.keys(this.getModelPropertyNames(this));
1920
+ const requiredProps = this.getModelRequiredPropertyNames(this);
1921
+ const defaultValues = this.getModelDefaultPropertyValues(this);
1922
+ const formSubGroupsValues = this.getModelSubGroupPropertyNames(this);
1923
+ const controlsConfig = {};
1924
+ const that = this;
1925
+ if (props) {
1926
+ props.forEach(property => {
1927
+ const value = that[property] !== undefined ? that[property] : defaultValues[property];
1928
+ const formSubGroup = formSubGroupsValues[property] ?? null;
1929
+ if (requiredProps[property]) {
1930
+ if (formSubGroup)
1931
+ this.getSubFromGroup(fb, controlsConfig, formSubGroup).addControl(property, fb.control(value, Validators.required));
1932
+ else
1933
+ controlsConfig[property] = [value, Validators.required];
1934
+ }
1935
+ else {
1936
+ if (formSubGroup)
1937
+ this.getSubFromGroup(fb, controlsConfig, formSubGroup).addControl(property, fb.control(value));
1938
+ else
1939
+ controlsConfig[property] = value;
1940
+ }
1941
+ });
1942
+ }
1943
+ return fb.group(controlsConfig);
1944
+ }
1945
+ getSubFromGroup(fb, controlsConfig, subGroup) {
1946
+ if (!controlsConfig[subGroup])
1947
+ controlsConfig[subGroup] = fb.group({});
1948
+ return controlsConfig[subGroup];
1949
+ }
1950
+ getModelFromFormGroup(formGroup, id) {
1951
+ const props = Object.keys(this.getModelPropertyNames(this));
1952
+ const formSubGroupsValues = this.getModelSubGroupPropertyNames(this);
1953
+ const data = {};
1954
+ if (id) {
1955
+ data.id = id;
1956
+ }
1957
+ const that = this;
1958
+ if (props) {
1959
+ props.forEach(property => {
1960
+ const formSubGroup = formSubGroupsValues[property] ?? null;
1961
+ if (!formSubGroup)
1962
+ data[property] = formGroup.controls[property].value ?? null;
1963
+ else
1964
+ data[property] = formGroup.controls[formSubGroup].controls[property].value ?? null;
1965
+ });
1966
+ }
1967
+ if (data) {
1968
+ if (id) {
1969
+ this.id = id;
1970
+ }
1971
+ Object.assign(this, data);
1972
+ }
1973
+ }
1974
+ getGridLayout() {
1975
+ const result = Array();
1976
+ const gridLayout = Reflect.getMetadata('GridLayout', this);
1977
+ if (gridLayout) {
1978
+ for (const layout of gridLayout) {
1979
+ const data = new GridLayoutModel(layout.propertyName, layout.translateKey, layout.width, layout.shrink, layout.grow, layout.formating, layout.format, layout.order, layout.textAlign);
1980
+ result.push(data);
1981
+ }
1982
+ }
1983
+ return result.sort(function (a, b) { return a.order - b.order; });
1984
+ //result;
1985
+ }
1986
+ getSerializedModel() {
1987
+ const attributesMetadata = this[AttributeMetadata];
1988
+ return this._datastore.modelToEntity(this, attributesMetadata, true);
1989
+ }
1990
+ getCellClass(property) {
1991
+ return '';
1992
+ }
1993
+ }
1994
+
1995
+ class ErrorResponse {
1996
+ constructor(errors) {
1997
+ this.errors = [];
1998
+ if (errors) {
1999
+ this.errors = errors;
2000
+ }
2001
+ }
2002
+ }
2003
+
2004
+ class Rule {
2005
+ constructor() {
2006
+ this.parameters = [];
2007
+ }
2008
+ }
2009
+
2010
+ class MaterialModule {
2011
+ }
2012
+ MaterialModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: MaterialModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2013
+ MaterialModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: MaterialModule, imports: [MatAutocompleteModule, MatButtonModule, MatButtonToggleModule, MatCardModule, MatCheckboxModule, MatChipsModule, MatDatepickerModule,
2014
+ MatDialogModule, MatExpansionModule, MatGridListModule, MatIconModule,
2015
+ MatInputModule, MatListModule, MatMenuModule, MatNativeDateModule,
2016
+ MatPaginatorModule, MatProgressBarModule, MatProgressSpinnerModule, MatRadioModule, MatRippleModule, MatSelectModule, MatSidenavModule,
2017
+ MatSliderModule, MatSlideToggleModule, MatSnackBarModule, MatSortModule, MatTableModule, MatTabsModule, MatToolbarModule,
2018
+ MatTooltipModule, MatOptionModule, DragDropModule, MatDividerModule, PortalModule, MatTreeModule, MatBadgeModule, MatStepperModule,
2019
+ CdkStepperModule], exports: [MatAutocompleteModule, MatButtonModule, MatButtonToggleModule, MatCardModule, MatCheckboxModule, MatChipsModule, MatDatepickerModule,
2020
+ MatDialogModule, MatExpansionModule, MatGridListModule, MatIconModule,
2021
+ MatInputModule, MatListModule, MatMenuModule, MatNativeDateModule,
2022
+ MatPaginatorModule, MatProgressBarModule, MatProgressSpinnerModule, MatRadioModule, MatRippleModule, MatSelectModule, MatSidenavModule,
2023
+ MatSliderModule, MatSlideToggleModule, MatSnackBarModule, MatSortModule, MatTableModule, MatTabsModule, MatToolbarModule,
2024
+ MatTooltipModule, MatOptionModule, DragDropModule, MatDividerModule, PortalModule, MatTreeModule, MatBadgeModule, MatStepperModule,
2025
+ CdkStepperModule] });
2026
+ MaterialModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: MaterialModule, imports: [[
2027
+ MatAutocompleteModule, MatButtonModule, MatButtonToggleModule, MatCardModule, MatCheckboxModule, MatChipsModule, MatDatepickerModule,
2028
+ MatDialogModule, MatExpansionModule, MatGridListModule, MatIconModule,
2029
+ MatInputModule, MatListModule, MatMenuModule, MatNativeDateModule,
2030
+ MatPaginatorModule, MatProgressBarModule, MatProgressSpinnerModule, MatRadioModule, MatRippleModule, MatSelectModule, MatSidenavModule,
2031
+ MatSliderModule, MatSlideToggleModule, MatSnackBarModule, MatSortModule, MatTableModule, MatTabsModule, MatToolbarModule,
2032
+ MatTooltipModule, MatOptionModule, DragDropModule, MatDividerModule, PortalModule, MatTreeModule, MatBadgeModule, MatStepperModule,
2033
+ CdkStepperModule
2034
+ ], MatAutocompleteModule, MatButtonModule, MatButtonToggleModule, MatCardModule, MatCheckboxModule, MatChipsModule, MatDatepickerModule,
2035
+ MatDialogModule, MatExpansionModule, MatGridListModule, MatIconModule,
2036
+ MatInputModule, MatListModule, MatMenuModule, MatNativeDateModule,
2037
+ MatPaginatorModule, MatProgressBarModule, MatProgressSpinnerModule, MatRadioModule, MatRippleModule, MatSelectModule, MatSidenavModule,
2038
+ MatSliderModule, MatSlideToggleModule, MatSnackBarModule, MatSortModule, MatTableModule, MatTabsModule, MatToolbarModule,
2039
+ MatTooltipModule, MatOptionModule, DragDropModule, MatDividerModule, PortalModule, MatTreeModule, MatBadgeModule, MatStepperModule,
2040
+ CdkStepperModule] });
2041
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: MaterialModule, decorators: [{
2042
+ type: NgModule,
2043
+ args: [{
2044
+ imports: [
2045
+ MatAutocompleteModule, MatButtonModule, MatButtonToggleModule, MatCardModule, MatCheckboxModule, MatChipsModule, MatDatepickerModule,
2046
+ MatDialogModule, MatExpansionModule, MatGridListModule, MatIconModule,
2047
+ MatInputModule, MatListModule, MatMenuModule, MatNativeDateModule,
2048
+ MatPaginatorModule, MatProgressBarModule, MatProgressSpinnerModule, MatRadioModule, MatRippleModule, MatSelectModule, MatSidenavModule,
2049
+ MatSliderModule, MatSlideToggleModule, MatSnackBarModule, MatSortModule, MatTableModule, MatTabsModule, MatToolbarModule,
2050
+ MatTooltipModule, MatOptionModule, DragDropModule, MatDividerModule, PortalModule, MatTreeModule, MatBadgeModule, MatStepperModule,
2051
+ CdkStepperModule
2052
+ ],
2053
+ exports: [
2054
+ MatAutocompleteModule, MatButtonModule, MatButtonToggleModule, MatCardModule, MatCheckboxModule, MatChipsModule, MatDatepickerModule,
2055
+ MatDialogModule, MatExpansionModule, MatGridListModule, MatIconModule,
2056
+ MatInputModule, MatListModule, MatMenuModule, MatNativeDateModule,
2057
+ MatPaginatorModule, MatProgressBarModule, MatProgressSpinnerModule, MatRadioModule, MatRippleModule, MatSelectModule, MatSidenavModule,
2058
+ MatSliderModule, MatSlideToggleModule, MatSnackBarModule, MatSortModule, MatTableModule, MatTabsModule, MatToolbarModule,
2059
+ MatTooltipModule, MatOptionModule, DragDropModule, MatDividerModule, PortalModule, MatTreeModule, MatBadgeModule, MatStepperModule,
2060
+ CdkStepperModule
2061
+ ],
2062
+ }]
2063
+ }] });
2064
+
2065
+ class GridLayoutService {
2066
+ constructor(baseService) {
2067
+ this.baseService = baseService;
2068
+ }
2069
+ getGridLayout() {
2070
+ var model = this.baseService.newModel();
2071
+ return model.getGridLayout();
2072
+ }
2073
+ }
2074
+ GridLayoutService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: GridLayoutService, deps: [{ token: BaseService }], target: i0.ɵɵFactoryTarget.Injectable });
2075
+ GridLayoutService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: GridLayoutService, providedIn: 'root' });
2076
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: GridLayoutService, decorators: [{
2077
+ type: Injectable,
2078
+ args: [{
2079
+ providedIn: 'root'
2080
+ }]
2081
+ }], ctorParameters: function () { return [{ type: BaseService }]; } });
2082
+
2083
+ const PROVIDERS = [
2084
+ BaseDatastore,
2085
+ DatePipe,
2086
+ DecimalPipe,
2087
+ PercentPipe,
2088
+ ];
2089
+
2090
+ class RslBaseModule {
2091
+ }
2092
+ RslBaseModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: RslBaseModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2093
+ RslBaseModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: RslBaseModule, declarations: [GenericTableComponent,
2094
+ SearchableDropdownComponent], imports: [CommonModule, i1$1.TranslateModule, MaterialModule,
2095
+ ReactiveFormsModule, i2$2.BlockUIModule], exports: [HttpClientModule,
2096
+ GenericTableComponent,
2097
+ SearchableDropdownComponent] });
2098
+ RslBaseModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: RslBaseModule, providers: [
2099
+ PROVIDERS
2100
+ ], imports: [[
2101
+ CommonModule,
2102
+ TranslateModule.forChild({}),
2103
+ MaterialModule,
2104
+ ReactiveFormsModule,
2105
+ BlockUIModule.forRoot(),
2106
+ ], HttpClientModule] });
2107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: RslBaseModule, decorators: [{
2108
+ type: NgModule,
2109
+ args: [{
2110
+ declarations: [
2111
+ GenericTableComponent,
2112
+ SearchableDropdownComponent
2113
+ ],
2114
+ imports: [
2115
+ CommonModule,
2116
+ TranslateModule.forChild({}),
2117
+ MaterialModule,
2118
+ ReactiveFormsModule,
2119
+ BlockUIModule.forRoot(),
2120
+ ],
2121
+ providers: [
2122
+ PROVIDERS
2123
+ ],
2124
+ exports: [
2125
+ HttpClientModule,
2126
+ GenericTableComponent,
2127
+ SearchableDropdownComponent
2128
+ ]
2129
+ }]
2130
+ }] });
2131
+
2132
+ class InputErrorPipe {
2133
+ constructor(translate) {
2134
+ this.translate = translate;
2135
+ }
2136
+ transform(value, filedTranslationKey) {
2137
+ let rvalue = '';
2138
+ if (value !== null) {
2139
+ if (value['invalid'] === true) {
2140
+ rvalue = 'ERROR.INVALID';
2141
+ }
2142
+ if (value['mustMatch'] === true) {
2143
+ rvalue = 'Account.Password.MustMach';
2144
+ }
2145
+ if (value['required'] === true) {
2146
+ const field = this.translate.instant(filedTranslationKey.field);
2147
+ rvalue = this.translate.instant('General.Field.Required', { field });
2148
+ }
2149
+ if (value['minlength']) {
2150
+ const field = this.translate.instant(filedTranslationKey.field);
2151
+ rvalue = this.translate.instant('General.Field.MinLength', { field, requiredLength: value.minlength.requiredLength });
2152
+ }
2153
+ }
2154
+ return rvalue;
2155
+ }
2156
+ }
2157
+ InputErrorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: InputErrorPipe, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe });
2158
+ InputErrorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: InputErrorPipe, name: "inputError" });
2159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: InputErrorPipe, decorators: [{
2160
+ type: Pipe,
2161
+ args: [{
2162
+ name: 'inputError'
2163
+ }]
2164
+ }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
2165
+
2166
+ class Nl2brPipe {
2167
+ transform(value, args) {
2168
+ // return value.replace(/\n/g, '<br />');
2169
+ if (value) {
2170
+ value = value.replace(/(?:\r\n\r\n|\r\r|\n\n)/g, '</p><p>');
2171
+ return '<p>' + value.replace(/(?:\r\n|\r|\n)/g, '<br>') + '</p>';
2172
+ }
2173
+ return value;
2174
+ }
2175
+ }
2176
+ Nl2brPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: Nl2brPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
2177
+ Nl2brPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: Nl2brPipe, name: "nl2br" });
2178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: Nl2brPipe, decorators: [{
2179
+ type: Pipe,
2180
+ args: [{
2181
+ name: 'nl2br'
2182
+ }]
2183
+ }] });
2184
+
2185
+ class CustomValidators {
2186
+ static patternValidator(regex, error) {
2187
+ return (control) => {
2188
+ if (!control.value) {
2189
+ // if control is empty return no error
2190
+ return null;
2191
+ }
2192
+ // test the value of the control against the regexp supplied
2193
+ const valid = regex.test(control.value);
2194
+ // if true, return no error (no error), else return error passed in the second parameter
2195
+ return valid ? null : error;
2196
+ };
2197
+ }
2198
+ }
2199
+
2200
+ /*
2201
+ * Public API Surface of core
2202
+ */
2203
+ // export * from './lib/services/base-datastore.service';
2204
+
2205
+ /**
2206
+ * Generated bundle index. Do not edit.
2207
+ */
2208
+
2209
+ export { Attribute, BaseDatastore, BaseDatastoreConfig, BaseFormEditComponent, BaseMetaModel, BaseModel, BaseModelConfig, BaseQueryData, BaseService, CellTextAlign, CustomType, CustomValidators, DialogService, ErrorResponse, FieldErrorDisplayComponent, GenericTableComponent, GridLayout, GridLayoutFormat, GridLayoutModel, GridLayoutService, InputErrorPipe, MaterialModule, Nl2brPipe, PROVIDERS, PageNotFoundComponent, RslBaseModule, Rule, SearchableDropdownComponent, TranslatedContentDirective, TranslatedElementDirective, UnderConstructionComponent };
2210
+ //# sourceMappingURL=rosoftlab-core.mjs.map