@sumaris-net/ngx-components 0.23.2 → 0.24.3

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 (31) hide show
  1. package/bundles/{ngx-sumaris-components.umd.js → sumaris-net.ngx-components.umd.js} +347 -296
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -0
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +25 -0
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -0
  5. package/esm2015/src/app/admin/services/filter/person.filter.js +4 -2
  6. package/esm2015/src/app/admin/services/person.service.js +4 -3
  7. package/esm2015/src/app/core/graphql/graphql.service.js +3 -2
  8. package/esm2015/src/app/core/graphql/graphql.utils.js +1 -1
  9. package/esm2015/src/app/core/install/install-upgrade-card.component.js +20 -14
  10. package/esm2015/src/app/core/services/network.service.js +3 -3
  11. package/esm2015/src/app/core/services/platform.service.js +28 -8
  12. package/esm2015/src/app/shared/functions.js +6 -7
  13. package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +2 -2
  14. package/esm2015/sumaris-net.ngx-components.js +13 -0
  15. package/fesm2015/{ngx-sumaris-components.js → sumaris-net.ngx-components.js} +329 -285
  16. package/fesm2015/sumaris-net.ngx-components.js.map +1 -0
  17. package/package.json +13 -9
  18. package/src/app/admin/services/filter/person.filter.d.ts +1 -0
  19. package/src/app/admin/services/person.service.d.ts +1 -1
  20. package/src/app/core/graphql/graphql.utils.d.ts +2 -1
  21. package/src/app/core/install/install-upgrade-card.component.d.ts +8 -5
  22. package/src/app/core/services/platform.service.d.ts +10 -1
  23. package/src/app/shared/functions.d.ts +1 -1
  24. package/{ngx-sumaris-components.d.ts → sumaris-net.ngx-components.d.ts} +0 -0
  25. package/sumaris-net.ngx-components.metadata.json +1 -0
  26. package/bundles/ngx-sumaris-components.umd.js.map +0 -1
  27. package/bundles/ngx-sumaris-components.umd.min.js +0 -25
  28. package/bundles/ngx-sumaris-components.umd.min.js.map +0 -1
  29. package/esm2015/ngx-sumaris-components.js +0 -13
  30. package/fesm2015/ngx-sumaris-components.js.map +0 -1
  31. package/ngx-sumaris-components.metadata.json +0 -1
@@ -1,9 +1,12 @@
1
- import { InjectionToken, EventEmitter, forwardRef, Component, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, HostBinding, Output, ViewChild, ɵɵdefineInjectable, ɵɵinject, Pipe, Injectable, Directive, NgModule, ElementRef, ViewChildren, HostListener, ComponentFactoryResolver, ApplicationRef, INJECTOR, Injector, Inject, Renderer2 } from '@angular/core';
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, EventEmitter, forwardRef, Component, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, HostBinding, Output, ViewChild, Pipe, Injectable, Directive, NgModule, ElementRef, ViewChildren, HostListener, ComponentFactoryResolver, ApplicationRef, Injector, Inject, Renderer2 } from '@angular/core';
3
+ import * as i1$3 from '@angular/common';
2
4
  import { CommonModule, DOCUMENT, Location } from '@angular/common';
3
5
  import { CdkTableModule } from '@angular/cdk/table';
4
6
  import { A11yModule } from '@angular/cdk/a11y';
5
7
  import { OverlayModule, OverlayContainer, FullscreenOverlayContainer, Overlay } from '@angular/cdk/overlay';
6
8
  import { ScrollingModule } from '@angular/cdk/scrolling';
9
+ import * as i1$2 from '@angular/material/core';
7
10
  import { DateAdapter, MatCommonModule, MatRippleModule } from '@angular/material/core';
8
11
  import { MatTableModule, MatTable, MatColumnDef } from '@angular/material/table';
9
12
  import { MatSortModule, MatSort } from '@angular/material/sort';
@@ -27,16 +30,21 @@ import { MatProgressBarModule } from '@angular/material/progress-bar';
27
30
  import { MatRadioModule } from '@angular/material/radio';
28
31
  import { MatBadgeModule } from '@angular/material/badge';
29
32
  import { MatSlideToggleModule } from '@angular/material/slide-toggle';
33
+ import * as i2$1 from '@angular/material/dialog';
30
34
  import { MatDialogModule, MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';
31
35
  import { MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteModule, MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MAT_AUTOCOMPLETE_DEFAULT_OPTIONS } from '@angular/material/autocomplete';
32
36
  import { __awaiter, __decorate } from 'tslib';
37
+ import * as i1$6 from '@angular/forms';
33
38
  import { NG_VALUE_ACCESSOR, FormGroupDirective, ReactiveFormsModule, AbstractControl, Validators, FormBuilder, FormControl, FormGroup, FormArray } from '@angular/forms';
34
39
  import { timer, merge, fromEvent, Subscription, BehaviorSubject, Subject, isObservable, of, noop as noop$8, Observable, defer, concat, combineLatest, EMPTY } from 'rxjs';
35
40
  import { filter, first, map, takeUntil, startWith, debounceTime, takeWhile, switchMap, tap, distinctUntilChanged, mergeMap, catchError, throttleTime } from 'rxjs/operators';
41
+ import * as i1$1 from '@ngx-translate/core';
36
42
  import { TranslateService, TranslateModule } from '@ngx-translate/core';
43
+ import * as i1$4 from '@ionic/angular';
37
44
  import { IonicModule, Platform, IonRouterOutlet, ModalController, IonicSafeString, createAnimation, ToastController, AlertController, IonicRouteStrategy, NavParams, MenuController, IonContent } from '@ionic/angular';
38
45
  import * as momentImported from 'moment';
39
46
  import { isMoment } from 'moment';
47
+ import * as i1 from '@angular/material-moment-adapter';
40
48
  import { MomentDateAdapter, MatMomentDateModule } from '@angular/material-moment-adapter';
41
49
  import { Keyboard } from '@ionic-native/keyboard/ngx';
42
50
  import { TextMaskModule } from 'angular2-text-mask';
@@ -46,32 +54,38 @@ import { trigger, state, style, transition, animate } from '@angular/animations'
46
54
  import { MatDividerModule } from '@angular/material/divider';
47
55
  import { MatTooltipModule } from '@angular/material/tooltip';
48
56
  import { MatChipsModule } from '@angular/material/chips';
57
+ import * as i3$3 from '@angular/router';
49
58
  import { Router, RouterModule, RouteReuseStrategy, ActivatedRoute } from '@angular/router';
59
+ import * as i1$5 from '@angular/platform-browser';
50
60
  import { HammerGestureConfig, EventManager } from '@angular/platform-browser';
61
+ import * as i2$2 from '@angular/common/http';
51
62
  import { HttpResponse, HttpClient, HttpHeaders, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
52
63
  import { ColorPickerModule } from 'ngx-color-picker';
53
- import { NativeAudio as NativeAudio$1 } from '@ionic-native/native-audio/ngx';
54
- import { Vibration as Vibration$1 } from '@ionic-native/vibration/ngx';
64
+ import { NativeAudio } from '@ionic-native/native-audio/ngx';
65
+ import { Vibration } from '@ionic-native/vibration/ngx';
55
66
  import { AudioManagement } from '@ionic-native/audio-management/ngx';
56
- import { NativeAudio } from '@ionic-native/native-audio/ngx/index';
57
- import { Vibration } from '@ionic-native/vibration/ngx/index';
58
- import { AudioManagement as AudioManagement$1 } from '@ionic-native/audio-management/ngx/index';
67
+ import * as i2 from '@ionic-native/native-audio/ngx/index';
68
+ import * as i3 from '@ionic-native/vibration/ngx/index';
69
+ import * as i4 from '@ionic-native/audio-management/ngx/index';
59
70
  import * as uuidv4Imported from 'uuid/v4';
60
71
  import { DragDropModule } from '@angular/cdk/drag-drop';
61
72
  import { MarkdownModule } from 'ngx-markdown';
62
73
  import { sign, box, hash, verify } from 'tweetnacl';
74
+ import * as i3$1 from '@ionic/storage';
63
75
  import { Storage, IonicStorageModule } from '@ionic/storage';
64
76
  import 'zone.js/dist/zone-error';
65
- import { SplashScreen as SplashScreen$1 } from '@ionic-native/splash-screen/ngx';
66
- import { Connection, Network as Network$1 } from '@ionic-native/network/ngx';
67
- import { CacheService as CacheService$1, CacheModule } from 'ionic-cache';
68
- import { CacheService } from 'ionic-cache/dist/cache.service';
69
- import { Network } from '@ionic-native/network/ngx/index';
70
- import { SplashScreen } from '@ionic-native/splash-screen/ngx/index';
71
- import { StatusBar as StatusBar$1 } from '@ionic-native/status-bar/ngx';
77
+ import { SplashScreen } from '@ionic-native/splash-screen/ngx';
78
+ import { Connection, Network } from '@ionic-native/network/ngx';
79
+ import { CacheService, CacheModule } from 'ionic-cache';
80
+ import * as i6 from 'ionic-cache/dist/cache.service';
81
+ import * as i9 from '@ionic-native/network/ngx/index';
82
+ import * as i10 from '@ionic-native/splash-screen/ngx/index';
83
+ import { StatusBar } from '@ionic-native/status-bar/ngx';
84
+ import * as i2$4 from '@angular/cdk/platform';
72
85
  import { Platform as Platform$1 } from '@angular/cdk/platform';
73
- import { InAppBrowser as InAppBrowser$1 } from '@ionic-native/in-app-browser/ngx';
86
+ import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
74
87
  import { ApolloLink, NetworkStatus, InMemoryCache, ApolloClient, gql } from '@apollo/client/core';
88
+ import * as i2$3 from 'apollo-angular';
75
89
  import { Apollo } from 'apollo-angular';
76
90
  import { WebSocketLink } from '@apollo/client/link/ws';
77
91
  import { getMainDefinition } from '@apollo/client/utilities';
@@ -79,11 +93,14 @@ import { RetryLink } from '@apollo/client/link/retry';
79
93
  import QueueLink from 'apollo-link-queue';
80
94
  import SerializingLink from 'apollo-link-serialize';
81
95
  import loggerLink from 'apollo-link-logger';
96
+ import * as i3$2 from 'apollo-angular/http';
82
97
  import { HttpLink } from 'apollo-angular/http';
83
98
  import { IonicStorageWrapper, persistCache } from 'apollo3-cache-persist';
84
- import { StatusBar } from '@ionic-native/status-bar/ngx/index';
85
- import { Keyboard as Keyboard$1 } from '@ionic-native/keyboard/ngx/index';
86
- import { InAppBrowser } from '@ionic-native/in-app-browser/ngx/index';
99
+ import { NotificationVisibility, Downloader } from '@ionic-native/downloader/ngx';
100
+ import * as i14 from '@ionic-native/status-bar/ngx/index';
101
+ import * as i15 from '@ionic-native/keyboard/ngx/index';
102
+ import * as i17 from '@ionic-native/in-app-browser/ngx/index';
103
+ import * as i18 from '@ionic-native/downloader/ngx/index';
87
104
  import { ValidatorService, TableDataSource } from '@e-is/ngx-material-table';
88
105
  import { SelectionModel } from '@angular/cdk/collections';
89
106
  import { NgxJdenticonModule } from 'ngx-jdenticon';
@@ -320,16 +337,15 @@ function propertiesPathComparator(keys, defaultValues) {
320
337
  // Stop if not equals, otherwise continue with the next key
321
338
  .find(res => res !== 0) || 0;
322
339
  }
323
- function sort(array, attribute) {
340
+ function sort(array, attribute, opts) {
324
341
  if (isEmptyArray(array))
325
342
  return array;
343
+ const compareFn = opts
344
+ ? new Intl.Collator(undefined, opts).compare
345
+ : (v1, v2) => v1 === v2 ? 0 : v1 > v2 ? 1 : -1;
326
346
  return array
327
347
  .slice() // copy
328
- .sort((a, b) => {
329
- const valueA = a[attribute];
330
- const valueB = b[attribute];
331
- return valueA === valueB ? 0 : (valueA > valueB ? 1 : -1);
332
- });
348
+ .sort((a, b) => compareFn(a[attribute], b[attribute]));
333
349
  }
334
350
  const INTEGER_REGEXP = /^[-]?\d+$/;
335
351
  function isInt(value) {
@@ -869,19 +885,19 @@ class MatAutocompleteConfigHolder {
869
885
  return this.fields[fieldName] || this.add(fieldName);
870
886
  }
871
887
  }
872
- const DEFAULT_VALUE_ACCESSOR = {
888
+ const DEFAULT_VALUE_ACCESSOR$6 = {
873
889
  provide: NG_VALUE_ACCESSOR,
874
890
  useExisting: forwardRef(() => MatAutocompleteField),
875
891
  multi: true
876
892
  };
877
- const noop = () => { };
878
- const ɵ0 = noop;
893
+ const noop$7 = () => { };
894
+ const ɵ0$a = noop$7;
879
895
  class MatAutocompleteField {
880
896
  constructor(cd, formGroupDir) {
881
897
  this.cd = cd;
882
898
  this.formGroupDir = formGroupDir;
883
- this._onChangeCallback = noop;
884
- this._onTouchedCallback = noop;
899
+ this._onChangeCallback = noop$7;
900
+ this._onTouchedCallback = noop$7;
885
901
  this._subscription = new Subscription();
886
902
  this._filter$ = new BehaviorSubject(undefined);
887
903
  this._reload$ = new Subject();
@@ -1468,7 +1484,7 @@ MatAutocompleteField.decorators = [
1468
1484
  // eslint-disable-next-line @angular-eslint/component-selector
1469
1485
  selector: 'mat-autocomplete-field',
1470
1486
  template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <!-- readonly -->\n <ng-container *ngIf=\"_readonly; else writable\">\n <input matInput hidden type=\"text\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\" readonly>\n <ion-text>{{displayWith(value)}}</ion-text>\n </ng-container>\n\n <ng-template #writable>\n\n <!-- Basic select -->\n <mat-select #matSelect\n *ngIf=\"!searchable; else searchableTemplate\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"classList\"\n [style.width]=\"panelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"onKeydownEscape.emit($event)\"\n [compareWith]=\"compareWith\"\n [multiple]=\"multiple\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- header -->\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i; last as isLast\" [size]=\"displayColumnSizes[i]\" >\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- None option -->\n <mat-option *ngIf=\"!required\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <ng-container *ngIf=\"$filteredItems | async; let items\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label>{{noResultMessage | translate}}</ion-label>\n </mat-option>\n\n <!-- options -->\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text>{{item | propertyGet: path }}</ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initMatSelectInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n </mat-select>\n </ng-template>\n\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <ng-template #searchableTemplate>\n <input matInput #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"onClick.emit($event)\"\n (focus)=\"filterInputTextFocusInEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"onKeydownEscape.emit($event)\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n (keyup.arrowdown)=\"!autocomplete.opened && onDropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [class.cdk-visually-hidden]=\"!searchable\"\n [panelWidth]=\"panelWidth\">\n\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i; last as last\" [size]=\"displayColumnSizes[i]\" >\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n <ion-text color=\"light\" *ngIf=\"last && itemCount; let count \" class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n <ng-container *ngIf=\"$filteredItems | async; else loadingTemplate; let items\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label>{{noResultMessage | translate}}</ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\" >\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(matInputText.value | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n\n </ng-template>\n\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"searchable\"\n (click)=\"onDropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button matSuffix type=\"button\" mat-icon-button tabindex=\"-1\"\n *ngIf=\"enabled && mobile && !searchable && !multiple\"\n [title]=\"'COMMON.BTN_SEARCH'|translate\"\n (click)=\"toggleSearch($event)\">\n <mat-icon>search</mat-icon>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content matSuffix select=\"[matSuffix]\"></ng-content>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-align-self-center\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n\n</ion-grid>\n",
1471
- providers: [DEFAULT_VALUE_ACCESSOR],
1487
+ providers: [DEFAULT_VALUE_ACCESSOR$6],
1472
1488
  changeDetection: ChangeDetectionStrategy.OnPush,
1473
1489
  styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button[hidden]{display:none}mat-icon.select-arrow{color:rgba(0,0,0,.47);font-size:150%}.fact-scroll-viewport{height:100%;width:100%}.fact-item{height:54px;display:flex}.fact-item .fact-date{min-width:100px;text-align:center;font-size:24pt}.fact-item .fact-date,.fact-item .fact-text{height:100%;align-items:center;justify-content:center;display:flex}.fact-item .fact-text{border-radius:10px}cdk-virtual-scroll-viewport{border:1px solid #000}cdk-virtual-scroll-viewport li{list-style:none}"]
1474
1490
  },] }
@@ -1545,7 +1561,7 @@ class DateFormatPipe {
1545
1561
  return this.dateAdapter.format(date, displayFormat);
1546
1562
  }
1547
1563
  }
1548
- DateFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(ɵɵinject(MomentDateAdapter), ɵɵinject(TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1564
+ DateFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(i0.ɵɵinject(i1.MomentDateAdapter), i0.ɵɵinject(i1$1.TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1549
1565
  DateFormatPipe.decorators = [
1550
1566
  { type: Pipe, args: [{
1551
1567
  name: 'dateFormat'
@@ -1557,7 +1573,7 @@ DateFormatPipe.ctorParameters = () => [
1557
1573
  { type: TranslateService }
1558
1574
  ];
1559
1575
 
1560
- const moment = momentImported;
1576
+ const moment$6 = momentImported;
1561
1577
  class DateDiffDurationPipe {
1562
1578
  constructor(dateAdapter, translate) {
1563
1579
  this.dateAdapter = dateAdapter;
@@ -1573,17 +1589,17 @@ class DateDiffDurationPipe {
1573
1589
  return this.format(startDate, endDate);
1574
1590
  }
1575
1591
  format(startDate, endDate) {
1576
- const duration = moment.duration(endDate.diff(startDate));
1592
+ const duration = moment$6.duration(endDate.diff(startDate));
1577
1593
  if (duration.asMinutes() < 0)
1578
1594
  return '';
1579
- const timeDuration = moment(0)
1595
+ const timeDuration = moment$6(0)
1580
1596
  .hour(duration.hours())
1581
1597
  .minute(duration.minutes());
1582
1598
  const days = Math.floor(duration.asDays());
1583
1599
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + timeDuration.format('HH:mm');
1584
1600
  }
1585
1601
  }
1586
- DateDiffDurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateDiffDurationPipe_Factory() { return new DateDiffDurationPipe(ɵɵinject(DateAdapter), ɵɵinject(TranslateService)); }, token: DateDiffDurationPipe, providedIn: "root" });
1602
+ DateDiffDurationPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateDiffDurationPipe_Factory() { return new DateDiffDurationPipe(i0.ɵɵinject(i1$2.DateAdapter), i0.ɵɵinject(i1$1.TranslateService)); }, token: DateDiffDurationPipe, providedIn: "root" });
1587
1603
  DateDiffDurationPipe.decorators = [
1588
1604
  { type: Pipe, args: [{
1589
1605
  name: 'dateDiffDuration'
@@ -1604,7 +1620,7 @@ class DateFromNowPipe {
1604
1620
  return date ? date.fromNow(args && args.withoutSuffix) : '';
1605
1621
  }
1606
1622
  }
1607
- DateFromNowPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(ɵɵinject(MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
1623
+ DateFromNowPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(i0.ɵɵinject(i1.MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
1608
1624
  DateFromNowPipe.decorators = [
1609
1625
  { type: Pipe, args: [{
1610
1626
  name: 'dateFromNow'
@@ -1673,7 +1689,7 @@ function formatToDD(value, opts) {
1673
1689
  value *= -1;
1674
1690
  }
1675
1691
  }
1676
- let degrees = roundFloat(value, opts.maxDecimals).toString();
1692
+ let degrees = roundFloat$1(value, opts.maxDecimals).toString();
1677
1693
  // Add sign
1678
1694
  let sign = negative ? '-' : '+';
1679
1695
  if (opts.placeholderChar) {
@@ -1724,7 +1740,7 @@ function formatToDDMMSS(value, opts) {
1724
1740
  }
1725
1741
  let degrees = Math.trunc(value);
1726
1742
  let minutes = Math.trunc((value - degrees) * 60);
1727
- let seconds = roundFloat(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
1743
+ let seconds = roundFloat$1(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
1728
1744
  while (seconds >= 60) {
1729
1745
  seconds -= 60;
1730
1746
  minutes += 1;
@@ -1792,7 +1808,7 @@ function formatToDDMM(value, opts) {
1792
1808
  }
1793
1809
  }
1794
1810
  let degrees = Math.trunc(value);
1795
- let minutes = roundFloat((value - degrees) * 60, opts.maxDecimals);
1811
+ let minutes = roundFloat$1((value - degrees) * 60, opts.maxDecimals);
1796
1812
  while (minutes >= 60) {
1797
1813
  minutes -= 60;
1798
1814
  degrees += 1;
@@ -1843,15 +1859,15 @@ function parseLatitudeOrLongitude(input, pattern, maxDecimals, placeholderChar)
1843
1859
  return NaN;
1844
1860
  }
1845
1861
  if (pattern === 'DD')
1846
- return roundFloat(degrees, maxDecimals);
1862
+ return roundFloat$1(degrees, maxDecimals);
1847
1863
  const minutes = (pattern === 'DDMMSS' || pattern === 'DDMM') && parts[1] && parseFloat(parts[1].replace(/,/g, '.')) || 0;
1848
1864
  const seconds = (pattern === 'DDMMSS') && parts[2] && parseFloat(parts[2].replace(/,/g, '.')) || 0;
1849
1865
  const direction = ((pattern === 'DDMMSS') && parts[3]) || ((pattern === 'DDMM') && parts[2]) || undefined;
1850
1866
  const sign = (direction && (direction === 's' || direction === 'S' || direction === 'w' || direction === 'W')) ? -1 : 1;
1851
1867
  degrees = sign * (degrees + minutes / 60 + seconds / (60 * 60));
1852
- return roundFloat(degrees, maxDecimals);
1868
+ return roundFloat$1(degrees, maxDecimals);
1853
1869
  }
1854
- function roundFloat(input, maxDecimals) {
1870
+ function roundFloat$1(input, maxDecimals) {
1855
1871
  if (maxDecimals > 0) {
1856
1872
  const powDecimal = Math.pow(10, maxDecimals);
1857
1873
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -1871,7 +1887,7 @@ class LatLongFormatPipe {
1871
1887
  return ((!args.type || args.type !== 'latitude') ? formatLongitude : formatLatitude)(value, args);
1872
1888
  }
1873
1889
  }
1874
- LatLongFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LatLongFormatPipe_Factory() { return new LatLongFormatPipe(); }, token: LatLongFormatPipe, providedIn: "root" });
1890
+ LatLongFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function LatLongFormatPipe_Factory() { return new LatLongFormatPipe(); }, token: LatLongFormatPipe, providedIn: "root" });
1875
1891
  LatLongFormatPipe.decorators = [
1876
1892
  { type: Pipe, args: [{
1877
1893
  name: 'latLongFormat'
@@ -1883,7 +1899,7 @@ class LatitudeFormatPipe {
1883
1899
  this.transform = formatLatitude;
1884
1900
  }
1885
1901
  }
1886
- LatitudeFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LatitudeFormatPipe_Factory() { return new LatitudeFormatPipe(); }, token: LatitudeFormatPipe, providedIn: "root" });
1902
+ LatitudeFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function LatitudeFormatPipe_Factory() { return new LatitudeFormatPipe(); }, token: LatitudeFormatPipe, providedIn: "root" });
1887
1903
  LatitudeFormatPipe.decorators = [
1888
1904
  { type: Pipe, args: [{
1889
1905
  name: 'latitudeFormat'
@@ -1895,7 +1911,7 @@ class LongitudeFormatPipe {
1895
1911
  this.transform = formatLongitude;
1896
1912
  }
1897
1913
  }
1898
- LongitudeFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function LongitudeFormatPipe_Factory() { return new LongitudeFormatPipe(); }, token: LongitudeFormatPipe, providedIn: "root" });
1914
+ LongitudeFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function LongitudeFormatPipe_Factory() { return new LongitudeFormatPipe(); }, token: LongitudeFormatPipe, providedIn: "root" });
1899
1915
  LongitudeFormatPipe.decorators = [
1900
1916
  { type: Pipe, args: [{
1901
1917
  name: 'longitudeFormat'
@@ -1915,7 +1931,7 @@ class NumberFormatPipe {
1915
1931
  }
1916
1932
  }
1917
1933
  }
1918
- NumberFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
1934
+ NumberFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
1919
1935
  NumberFormatPipe.decorators = [
1920
1936
  { type: Pipe, args: [{
1921
1937
  name: 'numberFormat'
@@ -1955,7 +1971,7 @@ class HighlightPipe {
1955
1971
  }
1956
1972
  }
1957
1973
  }
1958
- HighlightPipe.ɵprov = ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
1974
+ HighlightPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
1959
1975
  HighlightPipe.decorators = [
1960
1976
  { type: Pipe, args: [{
1961
1977
  name: 'highlight'
@@ -2020,7 +2036,7 @@ FileSizePipe.decorators = [
2020
2036
  { type: Pipe, args: [{ name: 'fileSize' },] }
2021
2037
  ];
2022
2038
 
2023
- const moment$1 = momentImported;
2039
+ const moment$5 = momentImported;
2024
2040
  const DATE_UNIX_TIMESTAMP = 'X';
2025
2041
  const DATE_UNIX_MS_TIMESTAMP = 'x';
2026
2042
  class DateUtils {
@@ -2054,32 +2070,32 @@ function fromDateISOString(value) {
2054
2070
  if (!value || isMoment(value))
2055
2071
  return value;
2056
2072
  // Parse the input value, as a ISO date time
2057
- const date = moment$1(value, DATE_ISO_PATTERN);
2073
+ const date = moment$5(value, DATE_ISO_PATTERN);
2058
2074
  if (date.isValid())
2059
2075
  return date;
2060
2076
  // Not valid: trying to convert from unix timestamp
2061
2077
  if (typeof value === 'string') {
2062
2078
  console.warn('Wrong date format - Trying to convert from local time: ' + value);
2063
2079
  if (value.length === 10) {
2064
- return moment$1(value, DATE_UNIX_TIMESTAMP);
2080
+ return moment$5(value, DATE_UNIX_TIMESTAMP);
2065
2081
  }
2066
2082
  else if (value.length === 13) {
2067
- return moment$1(value, DATE_UNIX_MS_TIMESTAMP);
2083
+ return moment$5(value, DATE_UNIX_MS_TIMESTAMP);
2068
2084
  }
2069
2085
  }
2070
2086
  console.warn('Unable to parse date: ' + value);
2071
2087
  return undefined;
2072
2088
  }
2073
2089
  function fromUnixTimestamp(timeInSec) {
2074
- return moment$1(timeInSec, DATE_UNIX_TIMESTAMP);
2090
+ return moment$5(timeInSec, DATE_UNIX_TIMESTAMP);
2075
2091
  }
2076
2092
  function fromUnixMsTimestamp(timeInMs) {
2077
- return moment$1(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2093
+ return moment$5(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2078
2094
  }
2079
2095
  function toDuration(value, unit) {
2080
2096
  if (!value)
2081
2097
  return undefined;
2082
- const duration = moment$1.duration(value, unit);
2098
+ const duration = moment$5.duration(value, unit);
2083
2099
  // fix 990+ ms
2084
2100
  if (duration.milliseconds() >= 990) {
2085
2101
  duration.add(1000 - duration.milliseconds(), 'ms');
@@ -2108,7 +2124,7 @@ class DurationPipe {
2108
2124
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + hour + ':' + minute;
2109
2125
  }
2110
2126
  }
2111
- DurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(ɵɵinject(TranslateService)); }, token: DurationPipe, providedIn: "root" });
2127
+ DurationPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(i0.ɵɵinject(i1$1.TranslateService)); }, token: DurationPipe, providedIn: "root" });
2112
2128
  DurationPipe.decorators = [
2113
2129
  { type: Pipe, args: [{
2114
2130
  name: 'duration'
@@ -2129,7 +2145,7 @@ class MathAbsPipe {
2129
2145
  }
2130
2146
  }
2131
2147
  }
2132
- MathAbsPipe.ɵprov = ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2148
+ MathAbsPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2133
2149
  MathAbsPipe.decorators = [
2134
2150
  { type: Pipe, args: [{
2135
2151
  name: 'mathAbs'
@@ -2141,7 +2157,7 @@ class EvenPipe {
2141
2157
  return val % 2 === 0;
2142
2158
  }
2143
2159
  }
2144
- EvenPipe.ɵprov = ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2160
+ EvenPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2145
2161
  EvenPipe.decorators = [
2146
2162
  { type: Pipe, args: [{
2147
2163
  name: 'even'
@@ -2153,7 +2169,7 @@ class OddPipe {
2153
2169
  return val % 2 !== 0;
2154
2170
  }
2155
2171
  }
2156
- OddPipe.ɵprov = ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2172
+ OddPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2157
2173
  OddPipe.decorators = [
2158
2174
  { type: Pipe, args: [{
2159
2175
  name: 'odd'
@@ -2261,7 +2277,7 @@ class MapGetPipe {
2261
2277
  return val[key];
2262
2278
  }
2263
2279
  }
2264
- MapGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2280
+ MapGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2265
2281
  MapGetPipe.decorators = [
2266
2282
  { type: Pipe, args: [{
2267
2283
  name: 'mapGet'
@@ -2275,7 +2291,7 @@ class MapKeysPipe {
2275
2291
  return Object.keys(map);
2276
2292
  }
2277
2293
  }
2278
- MapKeysPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2294
+ MapKeysPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2279
2295
  MapKeysPipe.decorators = [
2280
2296
  { type: Pipe, args: [{
2281
2297
  name: 'mapKeys'
@@ -2289,7 +2305,7 @@ class MapValuesPipe {
2289
2305
  return Object.values(map);
2290
2306
  }
2291
2307
  }
2292
- MapValuesPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2308
+ MapValuesPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2293
2309
  MapValuesPipe.decorators = [
2294
2310
  { type: Pipe, args: [{
2295
2311
  name: 'mapValues'
@@ -2302,7 +2318,7 @@ class IsNotNilOrBlankPipe {
2302
2318
  return isNotNilOrBlank(value);
2303
2319
  }
2304
2320
  }
2305
- IsNotNilOrBlankPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotNilOrBlankPipe_Factory() { return new IsNotNilOrBlankPipe(); }, token: IsNotNilOrBlankPipe, providedIn: "root" });
2321
+ IsNotNilOrBlankPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotNilOrBlankPipe_Factory() { return new IsNotNilOrBlankPipe(); }, token: IsNotNilOrBlankPipe, providedIn: "root" });
2306
2322
  IsNotNilOrBlankPipe.decorators = [
2307
2323
  { type: Pipe, args: [{
2308
2324
  name: 'isNotNilOrBlank'
@@ -2314,7 +2330,7 @@ class IsNilOrBlankPipe {
2314
2330
  return isNilOrBlank(value);
2315
2331
  }
2316
2332
  }
2317
- IsNilOrBlankPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNilOrBlankPipe_Factory() { return new IsNilOrBlankPipe(); }, token: IsNilOrBlankPipe, providedIn: "root" });
2333
+ IsNilOrBlankPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNilOrBlankPipe_Factory() { return new IsNilOrBlankPipe(); }, token: IsNilOrBlankPipe, providedIn: "root" });
2318
2334
  IsNilOrBlankPipe.decorators = [
2319
2335
  { type: Pipe, args: [{
2320
2336
  name: 'isNilOrBlank'
@@ -2326,7 +2342,7 @@ class ToStringPipe {
2326
2342
  return (value !== null && value !== undefined) ? value.toString() : '';
2327
2343
  }
2328
2344
  }
2329
- ToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function ToStringPipe_Factory() { return new ToStringPipe(); }, token: ToStringPipe, providedIn: "root" });
2345
+ ToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function ToStringPipe_Factory() { return new ToStringPipe(); }, token: ToStringPipe, providedIn: "root" });
2330
2346
  ToStringPipe.decorators = [
2331
2347
  { type: Pipe, args: [{
2332
2348
  name: 'toString'
@@ -2338,7 +2354,7 @@ class StrLengthPipe {
2338
2354
  return value && value.length || 0;
2339
2355
  }
2340
2356
  }
2341
- StrLengthPipe.ɵprov = ɵɵdefineInjectable({ factory: function StrLengthPipe_Factory() { return new StrLengthPipe(); }, token: StrLengthPipe, providedIn: "root" });
2357
+ StrLengthPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function StrLengthPipe_Factory() { return new StrLengthPipe(); }, token: StrLengthPipe, providedIn: "root" });
2342
2358
  StrLengthPipe.decorators = [
2343
2359
  { type: Pipe, args: [{
2344
2360
  name: 'strLength'
@@ -2389,7 +2405,7 @@ class TranslateContextService {
2389
2405
  : parts.slice(0, parts.length - 1).concat(context + parts[parts.length - 1]).join('.');
2390
2406
  }
2391
2407
  }
2392
- TranslateContextService.ɵprov = ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(ɵɵinject(TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2408
+ TranslateContextService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(i0.ɵɵinject(i1$1.TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2393
2409
  TranslateContextService.decorators = [
2394
2410
  { type: Injectable, args: [{ providedIn: 'root' },] }
2395
2411
  ];
@@ -2405,7 +2421,7 @@ class TranslateContextPipe {
2405
2421
  return this.translateContext.instant(key, context);
2406
2422
  }
2407
2423
  }
2408
- TranslateContextPipe.ɵprov = ɵɵdefineInjectable({ factory: function TranslateContextPipe_Factory() { return new TranslateContextPipe(ɵɵinject(TranslateContextService)); }, token: TranslateContextPipe, providedIn: "root" });
2424
+ TranslateContextPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslateContextPipe_Factory() { return new TranslateContextPipe(i0.ɵɵinject(TranslateContextService)); }, token: TranslateContextPipe, providedIn: "root" });
2409
2425
  TranslateContextPipe.decorators = [
2410
2426
  { type: Pipe, args: [{
2411
2427
  name: 'translateContext'
@@ -2422,7 +2438,7 @@ class TranslatablePipe {
2422
2438
  return (_a = changeCaseToUnderscore(value)) === null || _a === void 0 ? void 0 : _a.toUpperCase();
2423
2439
  }
2424
2440
  }
2425
- TranslatablePipe.ɵprov = ɵɵdefineInjectable({ factory: function TranslatablePipe_Factory() { return new TranslatablePipe(); }, token: TranslatablePipe, providedIn: "root" });
2441
+ TranslatablePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslatablePipe_Factory() { return new TranslatablePipe(); }, token: TranslatablePipe, providedIn: "root" });
2426
2442
  TranslatablePipe.decorators = [
2427
2443
  { type: Pipe, args: [{
2428
2444
  name: 'translatable'
@@ -2439,7 +2455,7 @@ class PropertyGetPipe {
2439
2455
  args && args.defaultValue);
2440
2456
  }
2441
2457
  }
2442
- PropertyGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function PropertyGetPipe_Factory() { return new PropertyGetPipe(); }, token: PropertyGetPipe, providedIn: "root" });
2458
+ PropertyGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PropertyGetPipe_Factory() { return new PropertyGetPipe(); }, token: PropertyGetPipe, providedIn: "root" });
2443
2459
  PropertyGetPipe.decorators = [
2444
2460
  { type: Pipe, args: [{
2445
2461
  name: 'propertyGet'
@@ -2683,12 +2699,12 @@ SharedMatAutocompleteModule.decorators = [
2683
2699
  },] }
2684
2700
  ];
2685
2701
 
2686
- const moment$2 = momentImported;
2702
+ const moment$4 = momentImported;
2687
2703
  // @dynamic
2688
2704
  class SharedValidators {
2689
2705
  static validDate(control) {
2690
2706
  const value = control.value;
2691
- const date = !value || moment$2.isMoment(value) ? value : moment$2(control.value, DATE_ISO_PATTERN);
2707
+ const date = !value || moment$4.isMoment(value) ? value : moment$4(control.value, DATE_ISO_PATTERN);
2692
2708
  if (date && (!date.isValid() || date.year() < 1970)) {
2693
2709
  return { validDate: true };
2694
2710
  }
@@ -3130,9 +3146,9 @@ function parseDuration(input, maxDecimals, placeholderChar) {
3130
3146
  const hour = parseInt(durationParts[0] || '0');
3131
3147
  const minute = parseInt(durationParts[1] || '0');
3132
3148
  const value = hour + (minute + 0.5) / 60;
3133
- return roundFloat$1(value, maxDecimals);
3149
+ return roundFloat(value, maxDecimals);
3134
3150
  }
3135
- function roundFloat$1(input, maxDecimals) {
3151
+ function roundFloat(input, maxDecimals) {
3136
3152
  if (maxDecimals > 0) {
3137
3153
  const powDecimal = Math.pow(10, maxDecimals);
3138
3154
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -3156,9 +3172,9 @@ const MASKS = {
3156
3172
  DD: [/[+-]/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '°']
3157
3173
  }
3158
3174
  };
3159
- const noop$1 = () => {
3175
+ const noop$6 = () => {
3160
3176
  };
3161
- const ɵ0$1 = noop$1;
3177
+ const ɵ0$9 = noop$6;
3162
3178
  class MatLatLongField {
3163
3179
  constructor(platform, translate, formBuilder, cd, formGroupDir) {
3164
3180
  this.platform = platform;
@@ -3166,8 +3182,8 @@ class MatLatLongField {
3166
3182
  this.formBuilder = formBuilder;
3167
3183
  this.cd = cd;
3168
3184
  this.formGroupDir = formGroupDir;
3169
- this._onChangeCallback = noop$1;
3170
- this._onTouchedCallback = noop$1;
3185
+ this._onChangeCallback = noop$6;
3186
+ this._onTouchedCallback = noop$6;
3171
3187
  this._subscription = new Subscription();
3172
3188
  this.disabling = false;
3173
3189
  this.writing = false;
@@ -3508,14 +3524,14 @@ SharedMatLatLongModule.decorators = [
3508
3524
  },] }
3509
3525
  ];
3510
3526
 
3511
- const DEFAULT_VALUE_ACCESSOR$1 = {
3527
+ const DEFAULT_VALUE_ACCESSOR$5 = {
3512
3528
  provide: NG_VALUE_ACCESSOR,
3513
3529
  useExisting: forwardRef(() => MatDate),
3514
3530
  multi: true
3515
3531
  };
3516
- const DAY_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
3517
- const noop$2 = () => { };
3518
- const ɵ0$2 = noop$2;
3532
+ const DAY_MASK$2 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
3533
+ const noop$5 = () => { };
3534
+ const ɵ0$8 = noop$5;
3519
3535
  class MatDate {
3520
3536
  constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
3521
3537
  this.dateAdapter = dateAdapter;
@@ -3524,12 +3540,12 @@ class MatDate {
3524
3540
  this.cd = cd;
3525
3541
  this.keyboard = keyboard;
3526
3542
  this.formGroupDir = formGroupDir;
3527
- this._onChangeCallback = noop$2;
3528
- this._onTouchedCallback = noop$2;
3543
+ this._onChangeCallback = noop$5;
3544
+ this._onTouchedCallback = noop$5;
3529
3545
  this._subscription = new Subscription();
3530
3546
  this.writing = true;
3531
3547
  this.disabling = false;
3532
- this.dayMask = DAY_MASK;
3548
+ this.dayMask = DAY_MASK$2;
3533
3549
  this.disabled = false;
3534
3550
  this.floatLabel = 'auto';
3535
3551
  this.readonly = false;
@@ -3766,7 +3782,7 @@ MatDate.decorators = [
3766
3782
  selector: 'mat-date-field',
3767
3783
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final control -->\n <input matInput type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"writeValue(null)\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('validDate')\" translate>ERROR.FIELD_NOT_VALID_DATE</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateIsAfter')\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateRange')\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMaxDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMinDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngIf=\"formControl.hasError('msg')\">{{formControl.errors.msg}}</mat-error>\n </mat-form-field>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"></mat-datepicker>\n\n <ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n </ng-template>\n\n <ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n </ng-template>\n\n</ng-template>\n\n",
3768
3784
  providers: [
3769
- DEFAULT_VALUE_ACCESSOR$1,
3785
+ DEFAULT_VALUE_ACCESSOR$5,
3770
3786
  ],
3771
3787
  changeDetection: ChangeDetectionStrategy.OnPush,
3772
3788
  styles: [":host{display:inline-block;width:100%;position:relative}:host [no-padding]{--ion-grid-column-padding:0}:host [nowrap]{flex-wrap:nowrap}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field .datetime-md,mat-form-field ion-datetime{padding:0!important}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field input[type=text],ion-col.hour mat-form-field mat-label{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}"]
@@ -3799,17 +3815,17 @@ MatDate.propDecorators = {
3799
3815
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
3800
3816
  };
3801
3817
 
3802
- const DEFAULT_VALUE_ACCESSOR$2 = {
3818
+ const DEFAULT_VALUE_ACCESSOR$4 = {
3803
3819
  provide: NG_VALUE_ACCESSOR,
3804
3820
  useExisting: forwardRef(() => MatDateTime),
3805
3821
  multi: true
3806
3822
  };
3807
3823
  const DAY_MASK$1 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
3808
3824
  const HOUR_REGEXP = /^[012][0-9][:][012345][0-9]$/;
3809
- const HOUR_MASK = [/[012]/, /\d/, ':', /[012345]/, /\d/];
3810
- const noop$3 = () => {
3825
+ const HOUR_MASK$1 = [/[012]/, /\d/, ':', /[012345]/, /\d/];
3826
+ const noop$4 = () => {
3811
3827
  };
3812
- const ɵ0$3 = noop$3;
3828
+ const ɵ0$7 = noop$4;
3813
3829
  class MatDateTime {
3814
3830
  constructor(platform, dateAdapter, translate, formBuilder, keyboard, cd, formGroupDir) {
3815
3831
  this.platform = platform;
@@ -3819,14 +3835,14 @@ class MatDateTime {
3819
3835
  this.keyboard = keyboard;
3820
3836
  this.cd = cd;
3821
3837
  this.formGroupDir = formGroupDir;
3822
- this._onChangeCallback = noop$3;
3823
- this._onTouchedCallback = noop$3;
3838
+ this._onChangeCallback = noop$4;
3839
+ this._onTouchedCallback = noop$4;
3824
3840
  this._subscription = new Subscription();
3825
3841
  this.writing = true;
3826
3842
  this.disabling = false;
3827
3843
  this._onDestroy = new EventEmitter();
3828
3844
  this.dayMask = DAY_MASK$1;
3829
- this.hourMask = HOUR_MASK;
3845
+ this.hourMask = HOUR_MASK$1;
3830
3846
  this.floatLabel = 'auto';
3831
3847
  this.readonly = false;
3832
3848
  this.compact = false;
@@ -4132,7 +4148,7 @@ MatDateTime.decorators = [
4132
4148
  selector: 'mat-date-time-field',
4133
4149
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable + time -->\n<ng-template #writable >\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding no-wrap\" nowrap>\n\n <!-- day -->\n <ion-col class=\"day ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dateFormControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dateFormControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix #datePickerButton2 (click)=\"openDatePicker($event, datePicker)\" [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"></mat-datepicker>\n <div class=\"mat-form-field-subscript mat-form-field-subscript-wrapper\" >\n <!-- errors -->\n <ng-container [ngSwitch]=\"formControl.touched && formControl.errors|mapKeys|arrayFirst\">\n <mat-error *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</mat-error>\n </ng-container>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </div>\n\n </ion-col>\n\n <!-- hour -->\n <ion-col class=\"hour ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && (timeFormControl.invalid || formControl.invalid)\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n <input matInput #matInput type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"timeFormControl\"\n autocomplete=\"off\"\n min=\"0\" max=\"23\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.TIME_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keyup.arrowdown)=\"openTimePicker($event)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n <input matInput #matInput type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"timeFormControl\"\n (click)=\"openTimePickerIfMobile($event)\"\n readonly>\n\n <input matInput type=\"text\"\n [formControl]=\"timeFormControl\"\n hidden\n [ngxTimepicker]=\"timePicker\"\n [format]=\"24\">\n\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && !mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePicker($event)\" >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePickerIfMobile($event)\">\n <mat-icon>access_time</mat-icon>\n </button>\n\n <ngx-material-timepicker #timePicker [@.disabled]=\"true\"\n (timeSet)=\"onTimePickerChange($event)\"\n [ESC]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"false\"\n [disableAnimation]=\"true\">\n <!-- cancel button -->\n <ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n </ng-template>\n\n <!-- confirm button -->\n <ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ng-template>\n\n </ngx-material-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n",
4134
4150
  providers: [
4135
- DEFAULT_VALUE_ACCESSOR$2,
4151
+ DEFAULT_VALUE_ACCESSOR$4,
4136
4152
  ],
4137
4153
  changeDetection: ChangeDetectionStrategy.OnPush,
4138
4154
  styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field .datetime-md{padding:0!important}ion-row.no-wrap{flex-wrap:nowrap}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field input[type=text],ion-col.hour mat-form-field mat-label{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}"]
@@ -4171,10 +4187,10 @@ const DEFAULT_VALUE_ACCESSOR$3 = {
4171
4187
  useExisting: forwardRef(() => MatDateShort),
4172
4188
  multi: true
4173
4189
  };
4174
- const DAY_MASK$2 = [/\d/, /\d/, /\d/, /\d/];
4175
- const noop$4 = () => {
4190
+ const DAY_MASK = [/\d/, /\d/, /\d/, /\d/];
4191
+ const noop$3 = () => {
4176
4192
  };
4177
- const ɵ0$4 = noop$4;
4193
+ const ɵ0$6 = noop$3;
4178
4194
  class MatDateShort {
4179
4195
  constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
4180
4196
  this.dateAdapter = dateAdapter;
@@ -4183,11 +4199,11 @@ class MatDateShort {
4183
4199
  this.cd = cd;
4184
4200
  this.keyboard = keyboard;
4185
4201
  this.formGroupDir = formGroupDir;
4186
- this._onChangeCallback = noop$4;
4187
- this._onTouchedCallback = noop$4;
4202
+ this._onChangeCallback = noop$3;
4203
+ this._onTouchedCallback = noop$3;
4188
4204
  this.writing = true;
4189
4205
  this.disabling = false;
4190
- this.dayMask = DAY_MASK$2;
4206
+ this.dayMask = DAY_MASK;
4191
4207
  this.disabled = false;
4192
4208
  this.floatLabel = 'auto';
4193
4209
  this.readonly = false;
@@ -4500,16 +4516,16 @@ SharedMatDateTimeModule.decorators = [
4500
4516
  },] }
4501
4517
  ];
4502
4518
 
4503
- const DEFAULT_VALUE_ACCESSOR$4 = {
4519
+ const DEFAULT_VALUE_ACCESSOR$2 = {
4504
4520
  provide: NG_VALUE_ACCESSOR,
4505
4521
  useExisting: forwardRef(() => MatDuration),
4506
4522
  multi: true
4507
4523
  };
4508
4524
  const HOUR_TIME_PATTERN = /[0-9]\d\d:[0-5]\d/;
4509
- const HOUR_MASK$1 = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
4510
- const noop$5 = () => {
4525
+ const HOUR_MASK = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
4526
+ const noop$2 = () => {
4511
4527
  };
4512
- const ɵ0$5 = noop$5;
4528
+ const ɵ0$5 = noop$2;
4513
4529
  class MatDuration {
4514
4530
  constructor(platform, dateAdapter, translate, formBuilder, cd, formGroupDir) {
4515
4531
  this.dateAdapter = dateAdapter;
@@ -4518,11 +4534,11 @@ class MatDuration {
4518
4534
  this.cd = cd;
4519
4535
  this.formGroupDir = formGroupDir;
4520
4536
  this._subscription = new Subscription();
4521
- this._onChangeCallback = noop$5;
4522
- this._onTouchedCallback = noop$5;
4537
+ this._onChangeCallback = noop$2;
4538
+ this._onTouchedCallback = noop$2;
4523
4539
  this.writing = true;
4524
4540
  this.disabling = false;
4525
- this.hourMask = HOUR_MASK$1;
4541
+ this.hourMask = HOUR_MASK;
4526
4542
  this.disabled = false;
4527
4543
  this.floatLabel = 'auto';
4528
4544
  this.readonly = false;
@@ -4702,7 +4718,7 @@ MatDuration.decorators = [
4702
4718
  selector: 'mat-duration-field',
4703
4719
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{ formControl.value|duration }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"formControl.disabled\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n\n <input matInput #matInput type=\"text\"\n autocomplete=\"off\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.DURATION_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keydown.tab)=\"moveCaretToSeparator($event, true)\"\n (keydown.shift.tab)=\"moveCaretToSeparator($event, false)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n\n <!-- errors -->\n <mat-error *ngIf=\"!formControl.hasError('required') && textControl.hasError('pattern')\" translate>ERROR.FIELD_NOT_VALID_PATTERN</mat-error>\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{(compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate:formControl.errors.min }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{(compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate:formControl.errors.max }}</mat-error>\n\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n</ng-template>\n\n",
4704
4720
  providers: [
4705
- DEFAULT_VALUE_ACCESSOR$4,
4721
+ DEFAULT_VALUE_ACCESSOR$2,
4706
4722
  ],
4707
4723
  changeDetection: ChangeDetectionStrategy.OnPush,
4708
4724
  styles: [":host{display:inline-block;min-width:140px;position:relative;--ion-grid-column-padding:0}:host,mat-form-field{width:100%}mat-form-field .mat-form-field-subscript-wrapper{overflow:visible;top:100%}mat-form-field .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}mat-form-field .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}mat-error{text-align:right;width:100%}"]
@@ -4759,22 +4775,22 @@ SharedMatDurationModule.decorators = [
4759
4775
  },] }
4760
4776
  ];
4761
4777
 
4762
- const DEFAULT_VALUE_ACCESSOR$5 = {
4778
+ const DEFAULT_VALUE_ACCESSOR$1 = {
4763
4779
  provide: NG_VALUE_ACCESSOR,
4764
4780
  useExisting: forwardRef(() => MatBooleanField),
4765
4781
  multi: true
4766
4782
  };
4767
- const noop$6 = () => {
4783
+ const noop$1 = () => {
4768
4784
  };
4769
- const ɵ0$6 = noop$6;
4785
+ const ɵ0$4 = noop$1;
4770
4786
  class MatBooleanField {
4771
4787
  constructor(translate, formBuilder, cd, formGroupDir) {
4772
4788
  this.translate = translate;
4773
4789
  this.formBuilder = formBuilder;
4774
4790
  this.cd = cd;
4775
4791
  this.formGroupDir = formGroupDir;
4776
- this._onChangeCallback = noop$6;
4777
- this._onTouchedCallback = noop$6;
4792
+ this._onChangeCallback = noop$1;
4793
+ this._onTouchedCallback = noop$1;
4778
4794
  this._writing = false;
4779
4795
  this.showRadio = false;
4780
4796
  this.disabled = false;
@@ -4947,7 +4963,7 @@ MatBooleanField.decorators = [
4947
4963
  selector: 'mat-boolean-field',
4948
4964
  template: "<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled {{classList}}\">\n <input matInput hidden type=\"text\" readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{(formControl.value == null && 'COMMON.EMPTY_OPTION' || (formControl.value === true && yesLabel) || noLabel) | translate }}</ion-text>\n</mat-form-field>\n\n<ng-template #writable>\n <ng-container [ngSwitch]=\"style\">\n\n <!-- Radio -->\n <mat-form-field *ngSwitchCase=\"'radio'\"\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-radio {{classList}}\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n <span [hidden]=\"showRadio\">({{yesLabel|translate}}/{{'COMMON.NO'|translate}})</span>\n </mat-label>\n\n <input matInput #fakeInput type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <!-- radio button -->\n <mat-radio-group [hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\">\n <mat-radio-button #yesButton [value]=\"true\">\n <span>{{yesLabel|translate}}</span>\n </mat-radio-button>&nbsp;\n <mat-radio-button #noButton [value]=\"false\">\n <span>{{noLabel|translate}}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n <div matSuffix #injectMatSuffix></div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n\n <!-- Checkbox -->\n <mat-form-field *ngSwitchCase=\"'checkbox'\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{classList}}\">\n <mat-label *ngIf=\"placeholder && !showRadio\">\n {{placeholder}}\n </mat-label>\n\n <input matInput #matInput\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <ion-label>&nbsp;</ion-label>\n\n <!-- checkbox, when compact -->\n <mat-checkbox #checkboxButton\n [formControl]=\"formControl\"\n (change)=\"onCheckboxValueChanged($event)\"\n [indeterminate]=\"value===undefined\"\n [hidden]=\"!showRadio\"\n [tabindex]=\"tabindex\">\n </mat-checkbox>\n\n <div matSuffix #injectMatSuffix></div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n\n <!-- Buttons -->\n <mat-form-field *ngSwitchCase=\"'button'\"\n [floatLabel]=\"floatLabel === 'never' ? 'never' : 'always'\"\n class=\"mat-boolean-field mat-boolean-field-button {{classList}}\">\n <input matInput type=\"text\" hidden\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\">\n <div class=\"mat-form-field-buttons\"\n [style.--buttons-col-count]=\"buttonsColCount\"\n *ngIf=\"!formControl.disabled; else disabledLabel\">\n <!-- yes -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === true) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && yesIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{yesLabel|translate}}\n </ion-button>\n\n <!-- No button -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex !== undefined ? (_tabindex + 1) : undefined\"\n (click)=\"writeValue(false, $event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === false) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && noIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{noLabel|translate}}\n </ion-button>\n </div>\n <ng-template #disabledLabel>\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ng-template>\n\n <div matSuffix #injectMatSuffix></div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </ng-container>\n\n <div class=\"cdk-visually-hidden\">\n <div #suffix><ng-content select=\"[matSuffix]\"></ng-content></div>\n </div>\n\n</ng-template>\n\n\n",
4949
4965
  providers: [
4950
- DEFAULT_VALUE_ACCESSOR$5
4966
+ DEFAULT_VALUE_ACCESSOR$1
4951
4967
  ],
4952
4968
  changeDetection: ChangeDetectionStrategy.OnPush,
4953
4969
  styles: [":host{width:100%}.mat-form-field.mat-boolean-field-radio{margin-top:-2px}.mat-form-field.mat-boolean-field-button{margin-top:-4px}.mat-form-field .mat-form-field-buttons{width:100%;display:flex;flex-flow:row wrap;justify-content:flex-start;align-items:center}.mat-form-field .mat-form-field-buttons .mat-form-field-button{--flex-basis:calc(100% / var(--buttons-col-count, 2));flex:0 1 var(--flex-basis);max-width:min(var(--flex-basis),150px);white-space:normal;padding:0 2px;height:40px}"]
@@ -5195,7 +5211,7 @@ class MatNumpadDomService {
5195
5211
  this.appRef.detachView(this.componentRef.hostView);
5196
5212
  }
5197
5213
  }
5198
- MatNumpadDomService.ɵprov = ɵɵdefineInjectable({ factory: function MatNumpadDomService_Factory() { return new MatNumpadDomService(ɵɵinject(ComponentFactoryResolver), ɵɵinject(ApplicationRef), ɵɵinject(INJECTOR), ɵɵinject(DOCUMENT, 8)); }, token: MatNumpadDomService, providedIn: "root" });
5214
+ MatNumpadDomService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatNumpadDomService_Factory() { return new MatNumpadDomService(i0.ɵɵinject(i0.ComponentFactoryResolver), i0.ɵɵinject(i0.ApplicationRef), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1$3.DOCUMENT, 8)); }, token: MatNumpadDomService, providedIn: "root" });
5199
5215
  MatNumpadDomService.decorators = [
5200
5216
  { type: Injectable, args: [{
5201
5217
  providedIn: 'root'
@@ -5559,7 +5575,7 @@ SharedMatNumpadModule.decorators = [
5559
5575
  },] }
5560
5576
  ];
5561
5577
 
5562
- const DEFAULT_VALUE_ACCESSOR$6 = {
5578
+ const DEFAULT_VALUE_ACCESSOR = {
5563
5579
  provide: NG_VALUE_ACCESSOR,
5564
5580
  useExisting: forwardRef(() => MatSwipeField),
5565
5581
  multi: true
@@ -5822,7 +5838,7 @@ MatSwipeField.decorators = [
5822
5838
  { type: Component, args: [{
5823
5839
  selector: 'mat-swipe-field',
5824
5840
  template: "<mat-form-field [floatLabel]=\"showSlides && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n [class]=\"classList\"\n [class.mat-form-field-disabled]=\"disabled\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n </mat-label>\n <input matInput #fakeInput type=\"text\"\n [formControl]=\"formControl\"\n [readonly]=\"true\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showSlides\"\n [tabindex]=\"tabindex\">\n\n <div class=\"slides-container\" [class.hidden]=\"!showSlides\">\n <ion-slides #slides\n [options]=\"slidesOptions\"\n (ionSlidesDidLoad)=\"slidesLoaded()\"\n (ionSlideReachStart)=\"reachStart(true)\"\n (ionSlideReachEnd)=\"reachEnd(true)\"\n (ionSlideNextEnd)=\"reachStart(false)\"\n (ionSlidePrevEnd)=\"reachEnd(false)\"\n (ionSlideDidChange)=\"slideChanged()\"\n >\n <ion-slide *ngFor=\"let item of $items | async\">\n <ion-label>{{ displayWith(item) }}</ion-label>\n </ion-slide>\n\n </ion-slides>\n </div>\n\n <button #prevButton\n mat-icon-button\n type=\"button\"\n class=\"button-prev\"\n [hidden]=\"!showSlides\"\n [disabled]=\"previousDisabled\"\n (click)=\"previous()\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button #nextButton\n mat-icon-button\n type=\"button\"\n class=\"button-next\"\n [hidden]=\"!showSlides\"\n [disabled]=\"nextDisabled\"\n (click)=\"next()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n\n</mat-form-field>\n",
5825
- providers: [DEFAULT_VALUE_ACCESSOR$6],
5841
+ providers: [DEFAULT_VALUE_ACCESSOR],
5826
5842
  changeDetection: ChangeDetectionStrategy.OnPush,
5827
5843
  styles: [":host{display:inline-block;width:100%;position:relative}input.hidden{display:none}.slides-container .swiper-slide{font-size:16px!important}.slides-container.hidden{visibility:hidden;height:0!important}.button-next,.button-prev{position:absolute;top:calc(50% - 20px);z-index:10}.button-prev{left:0;right:auto}.button-next{left:auto;right:0}"]
5828
5844
  },] }
@@ -6317,7 +6333,7 @@ class ProgressBarService {
6317
6333
  }
6318
6334
  }
6319
6335
  }
6320
- ProgressBarService.ɵprov = ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
6336
+ ProgressBarService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
6321
6337
  ProgressBarService.decorators = [
6322
6338
  { type: Injectable, args: [{ providedIn: 'root' },] }
6323
6339
  ];
@@ -6361,7 +6377,7 @@ class AppGestureConfig extends HammerGestureConfig {
6361
6377
  return mc;
6362
6378
  }
6363
6379
  }
6364
- AppGestureConfig.ɵprov = ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
6380
+ AppGestureConfig.ɵprov = i0.ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
6365
6381
  AppGestureConfig.decorators = [
6366
6382
  { type: Injectable, args: [{ providedIn: 'root' },] }
6367
6383
  ];
@@ -6584,7 +6600,7 @@ class MatPaginatorI18n extends MatPaginatorIntl {
6584
6600
  this.previousPageLabel = this.translate.instant('COMMON.PAGINATOR.PREVIOUS_PAGE');
6585
6601
  }
6586
6602
  }
6587
- MatPaginatorI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(ɵɵinject(TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
6603
+ MatPaginatorI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
6588
6604
  MatPaginatorI18n.decorators = [
6589
6605
  { type: Injectable, args: [{ providedIn: 'root' },] }
6590
6606
  ];
@@ -6674,17 +6690,17 @@ function getColorContrast(color, bw) {
6674
6690
  return rgbArrayToHex(rgb.map(v => 255 - v));
6675
6691
  }
6676
6692
 
6677
- const noop$7 = () => {
6693
+ const noop = () => {
6678
6694
  };
6679
- const ɵ0$7 = noop$7;
6695
+ const ɵ0$3 = noop;
6680
6696
  class AppFormField {
6681
6697
  constructor(translate, cd, injector, formGroupDir) {
6682
6698
  this.translate = translate;
6683
6699
  this.cd = cd;
6684
6700
  this.injector = injector;
6685
6701
  this.formGroupDir = formGroupDir;
6686
- this._onChangeCallback = noop$7;
6687
- this._onTouchedCallback = noop$7;
6702
+ this._onChangeCallback = noop;
6703
+ this._onTouchedCallback = noop;
6688
6704
  this.readonly = false;
6689
6705
  this.compact = false;
6690
6706
  this.floatLabel = 'auto';
@@ -7055,14 +7071,14 @@ class AudioProvider {
7055
7071
  });
7056
7072
  }
7057
7073
  }
7058
- AudioProvider.ɵprov = ɵɵdefineInjectable({ factory: function AudioProvider_Factory() { return new AudioProvider(ɵɵinject(Platform), ɵɵinject(NativeAudio, 8), ɵɵinject(Vibration, 8), ɵɵinject(AudioManagement$1, 8)); }, token: AudioProvider, providedIn: "root" });
7074
+ AudioProvider.ɵprov = i0.ɵɵdefineInjectable({ factory: function AudioProvider_Factory() { return new AudioProvider(i0.ɵɵinject(i1$4.Platform), i0.ɵɵinject(i2.NativeAudio, 8), i0.ɵɵinject(i3.Vibration, 8), i0.ɵɵinject(i4.AudioManagement, 8)); }, token: AudioProvider, providedIn: "root" });
7059
7075
  AudioProvider.decorators = [
7060
7076
  { type: Injectable, args: [{ providedIn: 'root' },] }
7061
7077
  ];
7062
7078
  AudioProvider.ctorParameters = () => [
7063
7079
  { type: Platform },
7064
- { type: NativeAudio$1, decorators: [{ type: Optional }] },
7065
- { type: Vibration$1, decorators: [{ type: Optional }] },
7080
+ { type: NativeAudio, decorators: [{ type: Optional }] },
7081
+ { type: Vibration, decorators: [{ type: Optional }] },
7066
7082
  { type: AudioManagement, decorators: [{ type: Optional }] }
7067
7083
  ];
7068
7084
 
@@ -7144,7 +7160,7 @@ class Hotkeys {
7144
7160
  });
7145
7161
  }
7146
7162
  }
7147
- Hotkeys.ɵprov = ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(ɵɵinject(EventManager), ɵɵinject(MatDialog), ɵɵinject(DOCUMENT), ɵɵinject(ModalController)); }, token: Hotkeys, providedIn: "root" });
7163
+ Hotkeys.ɵprov = i0.ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(i0.ɵɵinject(i1$5.EventManager), i0.ɵɵinject(i2$1.MatDialog), i0.ɵɵinject(i1$3.DOCUMENT), i0.ɵɵinject(i1$4.ModalController)); }, token: Hotkeys, providedIn: "root" });
7148
7164
  Hotkeys.decorators = [
7149
7165
  { type: Injectable, args: [{
7150
7166
  providedIn: 'root'
@@ -7318,7 +7334,7 @@ class Base64ImageReader {
7318
7334
  }
7319
7335
  }
7320
7336
 
7321
- const uuidv4 = uuidv4Imported;
7337
+ const uuidv4$1 = uuidv4Imported;
7322
7338
  class FileService {
7323
7339
  constructor(platform,
7324
7340
  //private transfer: FileTransfer,
@@ -7355,7 +7371,7 @@ class FileService {
7355
7371
  const lastSlashIndex = source.lastIndexOf('/');
7356
7372
  if (lastSlashIndex === -1)
7357
7373
  throw new Error('Invalid URL: ' + source);
7358
- const fileName = lastSlashIndex < (source.length - 1) && source.substring(lastSlashIndex + 1) || uuidv4();
7374
+ const fileName = lastSlashIndex < (source.length - 1) && source.substring(lastSlashIndex + 1) || uuidv4$1();
7359
7375
  // Download into the file system
7360
7376
  if (responseType === 'file' && this.canUseFileSystem) {
7361
7377
  console.warn(`WARN: [file] Fetching image {${source}} in local file...`);
@@ -7411,7 +7427,7 @@ class FileService {
7411
7427
  this._started = true;
7412
7428
  }
7413
7429
  }
7414
- FileService.ɵprov = ɵɵdefineInjectable({ factory: function FileService_Factory() { return new FileService(ɵɵinject(Platform), ɵɵinject(HttpClient), ɵɵinject(ENVIRONMENT)); }, token: FileService, providedIn: "root" });
7430
+ FileService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FileService_Factory() { return new FileService(i0.ɵɵinject(i1$4.Platform), i0.ɵɵinject(i2$2.HttpClient), i0.ɵɵinject(ENVIRONMENT)); }, token: FileService, providedIn: "root" });
7415
7431
  FileService.decorators = [
7416
7432
  { type: Injectable, args: [{
7417
7433
  providedIn: 'root',
@@ -7573,7 +7589,7 @@ class Base58 {
7573
7589
  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
7574
7590
 
7575
7591
  const scrypt = require('scrypt-async');
7576
- const sha256 = require('hash.js/lib/hash/sha/256');
7592
+ const sha256$1 = require('hash.js/lib/hash/sha/256');
7577
7593
  const sha512 = require('hash.js/lib/hash/sha/512');
7578
7594
  const nacl = {
7579
7595
  sign,
@@ -7677,7 +7693,7 @@ class CryptoService {
7677
7693
  * Hash (using SHA256) a message
7678
7694
  */
7679
7695
  sha256(message) {
7680
- return sha256().update(message).digest('hex');
7696
+ return sha256$1().update(message).digest('hex');
7681
7697
  }
7682
7698
  /**
7683
7699
  * Hash (using SHA512) a message
@@ -7690,7 +7706,7 @@ class CryptoService {
7690
7706
  return nacl.util.encodeBase64(m);
7691
7707
  }
7692
7708
  }
7693
- CryptoService.ɵprov = ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
7709
+ CryptoService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
7694
7710
  CryptoService.decorators = [
7695
7711
  { type: Injectable, args: [{ providedIn: 'root' },] }
7696
7712
  ];
@@ -8910,7 +8926,7 @@ class LocalSettingsService {
8910
8926
  return page;
8911
8927
  }
8912
8928
  }
8913
- LocalSettingsService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsService_Factory() { return new LocalSettingsService(ɵɵinject(TranslateService), ɵɵinject(Platform), ɵɵinject(Storage), ɵɵinject(ENVIRONMENT), ɵɵinject(APP_LOCAL_SETTINGS, 8), ɵɵinject(APP_LOCAL_SETTINGS_OPTIONS, 8)); }, token: LocalSettingsService, providedIn: "root" });
8929
+ LocalSettingsService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocalSettingsService_Factory() { return new LocalSettingsService(i0.ɵɵinject(i1$1.TranslateService), i0.ɵɵinject(i1$4.Platform), i0.ɵɵinject(i3$1.Storage), i0.ɵɵinject(ENVIRONMENT), i0.ɵɵinject(APP_LOCAL_SETTINGS, 8), i0.ɵɵinject(APP_LOCAL_SETTINGS_OPTIONS, 8)); }, token: LocalSettingsService, providedIn: "root" });
8914
8930
  LocalSettingsService.decorators = [
8915
8931
  { type: Injectable, args: [{
8916
8932
  providedIn: 'root',
@@ -9046,6 +9062,8 @@ function getConnectionType(type) {
9046
9062
  switch (type) {
9047
9063
  case Connection.NONE:
9048
9064
  return 'none';
9065
+ case Connection.ETHERNET:
9066
+ return 'ethernet';
9049
9067
  case Connection.WIFI:
9050
9068
  return 'wifi';
9051
9069
  case Connection.CELL:
@@ -9053,8 +9071,6 @@ function getConnectionType(type) {
9053
9071
  case Connection.CELL_3G:
9054
9072
  case Connection.CELL_4G:
9055
9073
  return 'cell';
9056
- case Connection.ETHERNET:
9057
- return 'ethernet';
9058
9074
  case Connection.UNKNOWN:
9059
9075
  return 'unknown';
9060
9076
  default:
@@ -9606,7 +9622,7 @@ class NetworkService {
9606
9622
  });
9607
9623
  }
9608
9624
  }
9609
- NetworkService.ɵprov = ɵɵdefineInjectable({ factory: function NetworkService_Factory() { return new NetworkService(ɵɵinject(DOCUMENT), ɵɵinject(Platform), ɵɵinject(ModalController), ɵɵinject(CryptoService), ɵɵinject(Storage), ɵɵinject(LocalSettingsService), ɵɵinject(CacheService), ɵɵinject(HttpClient), ɵɵinject(ENVIRONMENT), ɵɵinject(Network, 8), ɵɵinject(SplashScreen, 8), ɵɵinject(TranslateService, 8), ɵɵinject(ToastController, 8)); }, token: NetworkService, providedIn: "root" });
9625
+ NetworkService.ɵprov = i0.ɵɵdefineInjectable({ factory: function NetworkService_Factory() { return new NetworkService(i0.ɵɵinject(i1$3.DOCUMENT), i0.ɵɵinject(i1$4.Platform), i0.ɵɵinject(i1$4.ModalController), i0.ɵɵinject(CryptoService), i0.ɵɵinject(i3$1.Storage), i0.ɵɵinject(LocalSettingsService), i0.ɵɵinject(i6.CacheService), i0.ɵɵinject(i2$2.HttpClient), i0.ɵɵinject(ENVIRONMENT), i0.ɵɵinject(i9.Network, 8), i0.ɵɵinject(i10.SplashScreen, 8), i0.ɵɵinject(i1$1.TranslateService, 8), i0.ɵɵinject(i1$4.ToastController, 8)); }, token: NetworkService, providedIn: "root" });
9610
9626
  NetworkService.decorators = [
9611
9627
  { type: Injectable, args: [{ providedIn: 'root' },] }
9612
9628
  ];
@@ -9617,16 +9633,16 @@ NetworkService.ctorParameters = () => [
9617
9633
  { type: CryptoService },
9618
9634
  { type: Storage },
9619
9635
  { type: LocalSettingsService },
9620
- { type: CacheService$1 },
9636
+ { type: CacheService },
9621
9637
  { type: HttpClient },
9622
9638
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
9623
- { type: Network$1, decorators: [{ type: Optional }] },
9624
- { type: SplashScreen$1, decorators: [{ type: Optional }] },
9639
+ { type: Network, decorators: [{ type: Optional }] },
9640
+ { type: SplashScreen, decorators: [{ type: Optional }] },
9625
9641
  { type: TranslateService, decorators: [{ type: Optional }] },
9626
9642
  { type: ToastController, decorators: [{ type: Optional }] }
9627
9643
  ];
9628
9644
 
9629
- const ErrorCodes = {
9645
+ const ErrorCodes$2 = {
9630
9646
  UNKNOWN_ERROR: 0,
9631
9647
  LOAD_ACCOUNT_ERROR: 1,
9632
9648
  BAD_PASSWORD: 2,
@@ -9973,7 +9989,7 @@ class EntityStore {
9973
9989
  }
9974
9990
  catch (err) {
9975
9991
  console.error(err);
9976
- throw { code: ErrorCodes.ENTITY_STORAGE_MIGRATION_FAILED, message: 'ERROR.ENTITY_STORAGE_MIGRATION_FAILED', details: err };
9992
+ throw { code: ErrorCodes$2.ENTITY_STORAGE_MIGRATION_FAILED, message: 'ERROR.ENTITY_STORAGE_MIGRATION_FAILED', details: err };
9977
9993
  }
9978
9994
  }
9979
9995
  // Emit update event
@@ -10550,7 +10566,7 @@ class EntitiesStorage {
10550
10566
  }
10551
10567
  EntitiesStorage.TRASH_PREFIX = 'Trash#';
10552
10568
  EntitiesStorage.REMOTE_PREFIX = 'Remote#';
10553
- EntitiesStorage.ɵprov = ɵɵdefineInjectable({ factory: function EntitiesStorage_Factory() { return new EntitiesStorage(ɵɵinject(Platform), ɵɵinject(ProgressBarService), ɵɵinject(Storage), ɵɵinject(ENVIRONMENT), ɵɵinject(APP_LOCAL_STORAGE_TYPE_POLICIES, 8)); }, token: EntitiesStorage, providedIn: "root" });
10569
+ EntitiesStorage.ɵprov = i0.ɵɵdefineInjectable({ factory: function EntitiesStorage_Factory() { return new EntitiesStorage(i0.ɵɵinject(i1$4.Platform), i0.ɵɵinject(ProgressBarService), i0.ɵɵinject(i3$1.Storage), i0.ɵɵinject(ENVIRONMENT), i0.ɵɵinject(APP_LOCAL_STORAGE_TYPE_POLICIES, 8)); }, token: EntitiesStorage, providedIn: "root" });
10554
10570
  EntitiesStorage.decorators = [
10555
10571
  { type: Injectable, args: [{ providedIn: 'root' },] }
10556
10572
  ];
@@ -10650,10 +10666,10 @@ function referentialToString(obj, properties) {
10650
10666
  function referentialsToString(values, properties, separator) {
10651
10667
  return (values || []).map(v => referentialToString(v, properties)).join(separator || ', ');
10652
10668
  }
10653
- const ɵ0$8 = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
10669
+ const ɵ0$2 = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
10654
10670
  const StatusList = Object.freeze([
10655
10671
  {
10656
- id: ɵ0$8,
10672
+ id: ɵ0$2,
10657
10673
  icon: 'checkmark',
10658
10674
  label: 'REFERENTIAL.STATUS_ENUM.ENABLE'
10659
10675
  },
@@ -10928,7 +10944,7 @@ function accountToString(data) {
10928
10944
  (data.lastName || '')) || '';
10929
10945
  }
10930
10946
 
10931
- const uuidv4$1 = uuidv4Imported;
10947
+ const uuidv4 = uuidv4Imported;
10932
10948
  const _global = typeof global !== 'undefined' ? global : (typeof window !== 'undefined' ? window : {});
10933
10949
  const NativeWebSocket = _global.WebSocket || _global.MozWebSocket;
10934
10950
  /**
@@ -10972,7 +10988,7 @@ function createTrackerLink(opts) {
10972
10988
  // Skip if not tracked
10973
10989
  if (!context || !context.tracked)
10974
10990
  return forward(operation);
10975
- const id = context.serializationKey || uuidv4$1();
10991
+ const id = context.serializationKey || uuidv4();
10976
10992
  console.debug(`[apollo-tracker-link] Watching tracked query {${operation.operationName}#${id}}`);
10977
10993
  // Clean context, before calling JSON.stringify (remove unused attributes)
10978
10994
  const cleanContext = Object.assign(Object.assign({}, context), { optimisticResponse: null, cache: null });
@@ -11578,8 +11594,9 @@ class GraphqlService {
11578
11594
  const queueLink = new QueueLink();
11579
11595
  this._subscription.add(this._networkStatusChanged$
11580
11596
  .subscribe(type => {
11597
+ const offline = type === 'none';
11581
11598
  // Network is offline: start buffering into queue
11582
- if (type === 'none') {
11599
+ if (offline) {
11583
11600
  console.info('[graphql] offline mode: enable mutations buffer');
11584
11601
  queueLink.close();
11585
11602
  }
@@ -11680,7 +11697,7 @@ class GraphqlService {
11680
11697
  (err.networkError && ((err.networkError.error && this.toAppError(err.networkError.error))
11681
11698
  || this.toAppError(err.networkError)
11682
11699
  || (err.networkError.error && this.createAppErrorByCode(err.networkError.error.status))
11683
- || this.createAppErrorByCode(ErrorCodes.UNKNOWN_NETWORK_ERROR)))
11700
+ || this.createAppErrorByCode(ErrorCodes$2.UNKNOWN_NETWORK_ERROR)))
11684
11701
  // If graphQL: try to convert the first error found
11685
11702
  || (err.graphQLErrors && err.graphQLErrors.length && this.toAppError(err.graphQLErrors[0]))
11686
11703
  || this.toAppError(err)
@@ -11688,7 +11705,7 @@ class GraphqlService {
11688
11705
  || (err.graphQLErrors && err.graphQLErrors[0])
11689
11706
  || err;
11690
11707
  console.error('[graphql] ' + (error && error.message || error), error.stack || '');
11691
- if (error && error.code === ErrorCodes.UNKNOWN_NETWORK_ERROR && err.networkError && err.networkError.message) {
11708
+ if (error && error.code === ErrorCodes$2.UNKNOWN_NETWORK_ERROR && err.networkError && err.networkError.message) {
11692
11709
  console.error('[graphql] original error: ' + err.networkError.message);
11693
11710
  this.onNetworkError.next(error);
11694
11711
  }
@@ -11724,7 +11741,7 @@ class GraphqlService {
11724
11741
  return 'ERROR.UNAUTHORIZED';
11725
11742
  case ServerErrorCodes.FORBIDDEN:
11726
11743
  return 'ERROR.FORBIDDEN';
11727
- case ErrorCodes.UNKNOWN_NETWORK_ERROR:
11744
+ case ErrorCodes$2.UNKNOWN_NETWORK_ERROR:
11728
11745
  return 'ERROR.UNKNOWN_NETWORK_ERROR';
11729
11746
  case ServerErrorCodes.BAD_UPDATE_DATE:
11730
11747
  return 'ERROR.BAD_UPDATE_DATE';
@@ -11761,7 +11778,7 @@ class GraphqlService {
11761
11778
  });
11762
11779
  }
11763
11780
  }
11764
- GraphqlService.ɵprov = ɵɵdefineInjectable({ factory: function GraphqlService_Factory() { return new GraphqlService(ɵɵinject(Platform), ɵɵinject(Apollo), ɵɵinject(HttpLink), ɵɵinject(NetworkService), ɵɵinject(Storage), ɵɵinject(CryptoService), ɵɵinject(ENVIRONMENT), ɵɵinject(APP_GRAPHQL_TYPE_POLICIES, 8)); }, token: GraphqlService, providedIn: "root" });
11781
+ GraphqlService.ɵprov = i0.ɵɵdefineInjectable({ factory: function GraphqlService_Factory() { return new GraphqlService(i0.ɵɵinject(i1$4.Platform), i0.ɵɵinject(i2$3.Apollo), i0.ɵɵinject(i3$2.HttpLink), i0.ɵɵinject(NetworkService), i0.ɵɵinject(i3$1.Storage), i0.ɵɵinject(CryptoService), i0.ɵɵinject(ENVIRONMENT), i0.ɵɵinject(APP_GRAPHQL_TYPE_POLICIES, 8)); }, token: GraphqlService, providedIn: "root" });
11765
11782
  GraphqlService.decorators = [
11766
11783
  { type: Injectable, args: [{
11767
11784
  providedIn: 'root'
@@ -11778,7 +11795,7 @@ GraphqlService.ctorParameters = () => [
11778
11795
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_GRAPHQL_TYPE_POLICIES,] }] }
11779
11796
  ];
11780
11797
 
11781
- const sha256$1 = require('hash.js/lib/hash/sha/256');
11798
+ const sha256 = require('hash.js/lib/hash/sha/256');
11782
11799
  class BaseGraphqlServiceOptions {
11783
11800
  }
11784
11801
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
@@ -11928,8 +11945,8 @@ class BaseGraphqlService {
11928
11945
  }
11929
11946
  /* -- protected methods -- */
11930
11947
  computeMutableWatchQueryId(opts) {
11931
- const queryName = opts.queryName || sha256$1().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
11932
- const variablesKey = opts.variables && sha256$1().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
11948
+ const queryName = opts.queryName || sha256().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
11949
+ const variablesKey = opts.variables && sha256().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
11933
11950
  return [queryName, opts.arrayFieldName, variablesKey].join('|');
11934
11951
  }
11935
11952
  findMutableWatchQueries(opts) {
@@ -11992,7 +12009,7 @@ const DEFAULT_AVATAR_IMAGE = 'assets/img/person.png';
11992
12009
  /* ------------------------------------
11993
12010
  * GraphQL queries
11994
12011
  * ------------------------------------*/
11995
- const Fragments = {
12012
+ const Fragments$1 = {
11996
12013
  account: gql `
11997
12014
  fragment AccountFragment on AccountVO {
11998
12015
  id
@@ -12025,13 +12042,13 @@ const Fragments = {
12025
12042
  `
12026
12043
  };
12027
12044
  // Load account query
12028
- const LoadQuery = gql `
12045
+ const LoadQuery$1 = gql `
12029
12046
  query Account {
12030
12047
  data: account {
12031
12048
  ...AccountFragment
12032
12049
  }
12033
12050
  }
12034
- ${Fragments.account}
12051
+ ${Fragments$1.account}
12035
12052
  `;
12036
12053
  // Check email query
12037
12054
  const IsEmailExistsQuery = gql `
@@ -12040,13 +12057,13 @@ const IsEmailExistsQuery = gql `
12040
12057
  }
12041
12058
  `;
12042
12059
  // Save (create or update) account mutation
12043
- const SaveMutation = gql `
12060
+ const SaveMutation$1 = gql `
12044
12061
  mutation SaveAccount($data:AccountVOInput){
12045
12062
  data: saveAccount(account: $data){
12046
12063
  ...AccountFragment
12047
12064
  }
12048
12065
  }
12049
- ${Fragments.account}
12066
+ ${Fragments$1.account}
12050
12067
  `;
12051
12068
  // Create account mutation
12052
12069
  const CreateMutation = gql `
@@ -12055,7 +12072,7 @@ const CreateMutation = gql `
12055
12072
  ...AccountFragment
12056
12073
  }
12057
12074
  }
12058
- ${Fragments.account}
12075
+ ${Fragments$1.account}
12059
12076
  `;
12060
12077
  // Sent confirmation email
12061
12078
  const SendConfirmEmailMutation = gql `
@@ -12403,7 +12420,7 @@ class AccountService extends BaseGraphqlService {
12403
12420
  catch (error) {
12404
12421
  console.error(error);
12405
12422
  this.resetData();
12406
- throw { code: ErrorCodes.UNKNOWN_ERROR, message: 'ERROR.SCRYPT_ERROR' };
12423
+ throw { code: ErrorCodes$2.UNKNOWN_ERROR, message: 'ERROR.SCRYPT_ERROR' };
12407
12424
  }
12408
12425
  // Store pubkey+keypair
12409
12426
  this.data.pubkey = Base58.encode(keypair.publicKey);
@@ -12437,7 +12454,7 @@ class AccountService extends BaseGraphqlService {
12437
12454
  }
12438
12455
  catch (err) {
12439
12456
  // If account not found, check if email is valid
12440
- if (err && +(err.code) === ErrorCodes.LOAD_ACCOUNT_ERROR) {
12457
+ if (err && +(err.code) === ErrorCodes$2.LOAD_ACCOUNT_ERROR) {
12441
12458
  // Check email exists
12442
12459
  if (data.username.indexOf('@') !== -1) {
12443
12460
  let isEmailExists;
@@ -12449,11 +12466,11 @@ class AccountService extends BaseGraphqlService {
12449
12466
  }
12450
12467
  // Email not exists (no account)
12451
12468
  if (!isEmailExists) {
12452
- throw { code: ErrorCodes.UNKNOWN_ACCOUNT_EMAIL, message: 'ERROR.UNKNOWN_ACCOUNT_EMAIL' };
12469
+ throw { code: ErrorCodes$2.UNKNOWN_ACCOUNT_EMAIL, message: 'ERROR.UNKNOWN_ACCOUNT_EMAIL' };
12453
12470
  }
12454
12471
  }
12455
12472
  // Email exists, so error = 'bad password'
12456
- throw { code: ErrorCodes.BAD_PASSWORD, message: 'ERROR.BAD_PASSWORD' };
12473
+ throw { code: ErrorCodes$2.BAD_PASSWORD, message: 'ERROR.BAD_PASSWORD' };
12457
12474
  }
12458
12475
  throw err; // resend the first error
12459
12476
  }
@@ -12578,8 +12595,8 @@ class AccountService extends BaseGraphqlService {
12578
12595
  // Load remotely
12579
12596
  else {
12580
12597
  const { data } = yield this.graphql.query({
12581
- query: LoadQuery,
12582
- error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
12598
+ query: LoadQuery$1,
12599
+ error: { code: ErrorCodes$2.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
12583
12600
  fetchPolicy: opts && opts.fetchPolicy || 'no-cache' || undefined
12584
12601
  });
12585
12602
  json = data;
@@ -12606,7 +12623,7 @@ class AccountService extends BaseGraphqlService {
12606
12623
  return __awaiter(this, void 0, void 0, function* () {
12607
12624
  const isEmailExists = yield this.isEmailExists(email);
12608
12625
  if (isEmailExists) {
12609
- throw { code: ErrorCodes.EMAIL_ALREADY_REGISTERED, message: 'ERROR.EMAIL_ALREADY_REGISTERED' };
12626
+ throw { code: ErrorCodes$2.EMAIL_ALREADY_REGISTERED, message: 'ERROR.EMAIL_ALREADY_REGISTERED' };
12610
12627
  }
12611
12628
  });
12612
12629
  }
@@ -12642,7 +12659,7 @@ class AccountService extends BaseGraphqlService {
12642
12659
  locale
12643
12660
  },
12644
12661
  error: {
12645
- code: ErrorCodes.SENT_CONFIRMATION_EMAIL_FAILED,
12662
+ code: ErrorCodes$2.SENT_CONFIRMATION_EMAIL_FAILED,
12646
12663
  message: 'ERROR.SENT_ACCOUNT_CONFIRMATION_EMAIL_FAILED'
12647
12664
  }
12648
12665
  });
@@ -12658,7 +12675,7 @@ class AccountService extends BaseGraphqlService {
12658
12675
  code
12659
12676
  },
12660
12677
  error: {
12661
- code: ErrorCodes.CONFIRM_EMAIL_FAILED,
12678
+ code: ErrorCodes$2.CONFIRM_EMAIL_FAILED,
12662
12679
  message: 'ERROR.CONFIRM_ACCOUNT_EMAIL_FAILED'
12663
12680
  }
12664
12681
  });
@@ -12676,7 +12693,7 @@ class AccountService extends BaseGraphqlService {
12676
12693
  interval: 10
12677
12694
  },
12678
12695
  error: {
12679
- code: ErrorCodes.SUBSCRIBE_ACCOUNT_ERROR,
12696
+ code: ErrorCodes$2.SUBSCRIBE_ACCOUNT_ERROR,
12680
12697
  message: 'ERROR.ACCOUNT.SUBSCRIBE_ACCOUNT_ERROR'
12681
12698
  }
12682
12699
  }).subscribe({
@@ -12778,7 +12795,7 @@ class AccountService extends BaseGraphqlService {
12778
12795
  throw error;
12779
12796
  console.error(error);
12780
12797
  throw {
12781
- code: ErrorCodes.LOAD_ACCOUNT_ERROR,
12798
+ code: ErrorCodes$2.LOAD_ACCOUNT_ERROR,
12782
12799
  message: 'ERROR.LOAD_ACCOUNT_ERROR'
12783
12800
  };
12784
12801
  }
@@ -12923,7 +12940,7 @@ class AccountService extends BaseGraphqlService {
12923
12940
  if (!isNew) {
12924
12941
  const existingAccount = yield this.load({ fetchPolicy: 'network-only' });
12925
12942
  if (!existingAccount || !existingAccount.updateDate) {
12926
- throw { code: ErrorCodes.ACCOUNT_NOT_EXISTS, message: 'ERROR.ACCOUNT_NOT_EXISTS' };
12943
+ throw { code: ErrorCodes$2.ACCOUNT_NOT_EXISTS, message: 'ERROR.ACCOUNT_NOT_EXISTS' };
12927
12944
  }
12928
12945
  this.copyIdAndUpdateDate(existingAccount, account);
12929
12946
  }
@@ -12932,10 +12949,10 @@ class AccountService extends BaseGraphqlService {
12932
12949
  delete json.profiles;
12933
12950
  // Execute mutation
12934
12951
  const { data } = yield this.graphql.mutate({
12935
- mutation: isNew ? CreateMutation : SaveMutation,
12952
+ mutation: isNew ? CreateMutation : SaveMutation$1,
12936
12953
  variables: { data: json },
12937
12954
  error: {
12938
- code: ErrorCodes.SAVE_ACCOUNT_ERROR,
12955
+ code: ErrorCodes$2.SAVE_ACCOUNT_ERROR,
12939
12956
  message: 'ERROR.SAVE_ACCOUNT_ERROR'
12940
12957
  }
12941
12958
  });
@@ -12955,7 +12972,7 @@ class AccountService extends BaseGraphqlService {
12955
12972
  if (counter > 4) {
12956
12973
  if (this._debug)
12957
12974
  console.debug(`[account] Failed to authentication on pod (after ${counter} attempts)`);
12958
- throw { code: ErrorCodes.AUTH_SERVER_ERROR, message: 'ERROR.AUTH_SERVER_ERROR' };
12975
+ throw { code: ErrorCodes$2.AUTH_SERVER_ERROR, message: 'ERROR.AUTH_SERVER_ERROR' };
12959
12976
  }
12960
12977
  // Check if valid
12961
12978
  if (token) {
@@ -12965,7 +12982,7 @@ class AccountService extends BaseGraphqlService {
12965
12982
  token
12966
12983
  },
12967
12984
  error: {
12968
- code: ErrorCodes.UNAUTHORIZED,
12985
+ code: ErrorCodes$2.UNAUTHORIZED,
12969
12986
  message: 'ERROR.UNAUTHORIZED'
12970
12987
  },
12971
12988
  fetchPolicy: 'no-cache'
@@ -12981,7 +12998,7 @@ class AccountService extends BaseGraphqlService {
12981
12998
  }
12982
12999
  // Generate a new token
12983
13000
  const challengeError = {
12984
- code: ErrorCodes.AUTH_CHALLENGE_ERROR,
13001
+ code: ErrorCodes$2.AUTH_CHALLENGE_ERROR,
12985
13002
  message: 'ERROR.AUTH_CHALLENGE_ERROR'
12986
13003
  };
12987
13004
  const data = yield this.graphql.query({
@@ -13015,7 +13032,7 @@ class AccountService extends BaseGraphqlService {
13015
13032
  target.settings.updateDate = source.settings && source.settings.updateDate || target.settings.updateDate;
13016
13033
  }
13017
13034
  }
13018
- AccountService.ɵprov = ɵɵdefineInjectable({ factory: function AccountService_Factory() { return new AccountService(ɵɵinject(CryptoService), ɵɵinject(NetworkService), ɵɵinject(GraphqlService), ɵɵinject(LocalSettingsService), ɵɵinject(Storage), ɵɵinject(FileService), ɵɵinject(ENVIRONMENT)); }, token: AccountService, providedIn: "root" });
13035
+ AccountService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountService_Factory() { return new AccountService(i0.ɵɵinject(CryptoService), i0.ɵɵinject(NetworkService), i0.ɵɵinject(GraphqlService), i0.ɵɵinject(LocalSettingsService), i0.ɵɵinject(i3$1.Storage), i0.ɵɵinject(FileService), i0.ɵɵinject(ENVIRONMENT)); }, token: AccountService, providedIn: "root" });
13019
13036
  AccountService.decorators = [
13020
13037
  { type: Injectable, args: [{ providedIn: 'root' },] }
13021
13038
  ];
@@ -13275,7 +13292,7 @@ const CONFIGURATION_STORAGE_KEY = 'configuration';
13275
13292
  /* ------------------------------------
13276
13293
  * GraphQL queries
13277
13294
  * ------------------------------------*/
13278
- const Fragments$1 = {
13295
+ const Fragments = {
13279
13296
  config: gql `
13280
13297
  fragment ConfigFragment on ConfigurationVO {
13281
13298
  id
@@ -13302,22 +13319,22 @@ const Fragments$1 = {
13302
13319
  }
13303
13320
  `
13304
13321
  };
13305
- const LoadQuery$1 = gql `
13322
+ const LoadQuery = gql `
13306
13323
  query Configuration{
13307
13324
  data: configuration{
13308
13325
  ...ConfigFragment
13309
13326
  }
13310
13327
  }
13311
- ${Fragments$1.config}
13328
+ ${Fragments.config}
13312
13329
  `;
13313
13330
  // Save (create or update) account mutation
13314
- const SaveMutation$1 = gql `
13331
+ const SaveMutation = gql `
13315
13332
  mutation SaveConfiguration($data: ConfigurationVOInput){
13316
13333
  data: saveConfiguration(config: $data){
13317
13334
  ...ConfigFragment
13318
13335
  }
13319
13336
  }
13320
- ${Fragments$1.config}
13337
+ ${Fragments.config}
13321
13338
  `;
13322
13339
  const ClearCache = gql `
13323
13340
  query ClearCache($name: String) {
@@ -13405,12 +13422,12 @@ class ConfigService extends BaseGraphqlService {
13405
13422
  return __awaiter(this, void 0, void 0, function* () {
13406
13423
  const now = Date.now();
13407
13424
  console.debug('[config] Loading Pod configuration...');
13408
- const query = opts && opts.query || LoadQuery$1;
13425
+ const query = opts && opts.query || LoadQuery;
13409
13426
  const variables = opts && opts.variables || undefined;
13410
13427
  const res = yield this.graphql.query({
13411
13428
  query,
13412
13429
  variables,
13413
- error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
13430
+ error: { code: ErrorCodes$2.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
13414
13431
  fetchPolicy: opts && opts.fetchPolicy || undefined /*default*/
13415
13432
  });
13416
13433
  const data = res && res.data ? Configuration.fromObject(res.data) : undefined;
@@ -13435,12 +13452,12 @@ class ConfigService extends BaseGraphqlService {
13435
13452
  const json = config.asObject();
13436
13453
  // Execute mutation
13437
13454
  const res = yield this.graphql.mutate({
13438
- mutation: SaveMutation$1,
13455
+ mutation: SaveMutation,
13439
13456
  variables: {
13440
13457
  data: json
13441
13458
  },
13442
13459
  error: {
13443
- code: ErrorCodes.SAVE_CONFIG_ERROR,
13460
+ code: ErrorCodes$2.SAVE_CONFIG_ERROR,
13444
13461
  message: 'ERROR.SAVE_CONFIG_ERROR'
13445
13462
  }
13446
13463
  });
@@ -13466,7 +13483,7 @@ class ConfigService extends BaseGraphqlService {
13466
13483
  const res = yield this.graphql.query({
13467
13484
  query: CacheStatistics,
13468
13485
  variables: null,
13469
- error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
13486
+ error: { code: ErrorCodes$2.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
13470
13487
  fetchPolicy: 'network-only'
13471
13488
  });
13472
13489
  const data = res && res.cacheStatistics || undefined;
@@ -13482,7 +13499,7 @@ class ConfigService extends BaseGraphqlService {
13482
13499
  const res = yield this.graphql.query({
13483
13500
  query: ClearCache,
13484
13501
  variables,
13485
- error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
13502
+ error: { code: ErrorCodes$2.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },
13486
13503
  fetchPolicy: 'network-only'
13487
13504
  });
13488
13505
  const data = res && res.clearCache || undefined;
@@ -13641,7 +13658,7 @@ class ConfigService extends BaseGraphqlService {
13641
13658
  });
13642
13659
  }
13643
13660
  }
13644
- ConfigService.ɵprov = ɵɵdefineInjectable({ factory: function ConfigService_Factory() { return new ConfigService(ɵɵinject(Platform), ɵɵinject(GraphqlService), ɵɵinject(Storage), ɵɵinject(NetworkService), ɵɵinject(FileService), ɵɵinject(ToastController), ɵɵinject(TranslateService), ɵɵinject(ENVIRONMENT), ɵɵinject(APP_CONFIG_OPTIONS, 8)); }, token: ConfigService, providedIn: "root" });
13661
+ ConfigService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ConfigService_Factory() { return new ConfigService(i0.ɵɵinject(i1$4.Platform), i0.ɵɵinject(GraphqlService), i0.ɵɵinject(i3$1.Storage), i0.ɵɵinject(NetworkService), i0.ɵɵinject(FileService), i0.ɵɵinject(i1$4.ToastController), i0.ɵɵinject(i1$1.TranslateService), i0.ɵɵinject(ENVIRONMENT), i0.ɵɵinject(APP_CONFIG_OPTIONS, 8)); }, token: ConfigService, providedIn: "root" });
13645
13662
  ConfigService.decorators = [
13646
13663
  { type: Injectable, args: [{
13647
13664
  providedIn: 'root',
@@ -13660,9 +13677,9 @@ ConfigService.ctorParameters = () => [
13660
13677
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_CONFIG_OPTIONS,] }] }
13661
13678
  ];
13662
13679
 
13663
- const moment$4 = momentImported;
13680
+ const moment$2 = momentImported;
13664
13681
  class PlatformService {
13665
- constructor(platform, cdkPlatform, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, storage, audioProvider, environment, statusBar, keyboard, splashScreen, browser) {
13682
+ constructor(platform, cdkPlatform, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, storage, audioProvider, environment, statusBar, keyboard, splashScreen, browser, downloader) {
13666
13683
  this.platform = platform;
13667
13684
  this.cdkPlatform = cdkPlatform;
13668
13685
  this.toastController = toastController;
@@ -13681,6 +13698,7 @@ class PlatformService {
13681
13698
  this.keyboard = keyboard;
13682
13699
  this.splashScreen = splashScreen;
13683
13700
  this.browser = browser;
13701
+ this.downloader = downloader;
13684
13702
  this._started = false;
13685
13703
  this._debug = !environment.production;
13686
13704
  if (this._debug)
@@ -13703,6 +13721,9 @@ class PlatformService {
13703
13721
  isWebOrDesktop() {
13704
13722
  return !this.platform.is('mobile') || this.platform.is('mobileweb');
13705
13723
  }
13724
+ isAndroidCordova() {
13725
+ return this._android && this._cordova;
13726
+ }
13706
13727
  width() {
13707
13728
  return this.platform.width();
13708
13729
  }
@@ -13721,6 +13742,8 @@ class PlatformService {
13721
13742
  this._startPromise = this.platform.ready()
13722
13743
  .then(() => {
13723
13744
  this._mobile = this.platform.is('mobile');
13745
+ this._cordova = this.platform.is('cordova');
13746
+ this._android = this.platform.is('android');
13724
13747
  this.configureCordovaPlugins(this._mobile);
13725
13748
  this.touchUi = this._mobile || this.platform.is('tablet') || this.platform.is('phablet');
13726
13749
  // Force mobile in settings
@@ -13781,6 +13804,7 @@ class PlatformService {
13781
13804
  filter(() => this._started), first()).toPromise();
13782
13805
  }
13783
13806
  open(url, target, features, replace) {
13807
+ console.info(`[platform] Opening link: ${url}`);
13784
13808
  if (this.browser && this._mobile) {
13785
13809
  this.browser.create(url, target, features).show();
13786
13810
  }
@@ -13788,10 +13812,20 @@ class PlatformService {
13788
13812
  window.open(url, target, features, replace);
13789
13813
  }
13790
13814
  }
13791
- /*
13792
- chooseFile(): Promise<> {
13793
-
13794
- }*/
13815
+ download(request) {
13816
+ if (!request || !request.uri)
13817
+ throw new Error('Missing argument \'request\' or \'request.uri\'');
13818
+ if (this._android && this._cordova) {
13819
+ request = Object.assign(Object.assign({ visibleInDownloadsUi: true, notificationVisibility: NotificationVisibility.VisibleNotifyCompleted, title: request.filename || '' }, request), { destinationInExternalFilesDir: Object.assign({ dirType: 'Downloads', subPath: request.filename || request.title || '' }, request.destinationInExternalFilesDir) });
13820
+ this.downloader.download(request)
13821
+ .then((location) => console.info('[platform] File successfully downloaded at:' + location))
13822
+ .catch((error) => console.error(error));
13823
+ }
13824
+ // Web mode: open URI using the browser
13825
+ else {
13826
+ this.open(request.uri, '_system', 'location=yes');
13827
+ }
13828
+ }
13795
13829
  /* -- protected methods -- */
13796
13830
  configureCordovaPlugins(mobile) {
13797
13831
  console.info('[platform] Configuring Cordova plugins...');
@@ -13825,16 +13859,16 @@ class PlatformService {
13825
13859
  }
13826
13860
  // config moment lib
13827
13861
  try {
13828
- moment$4.locale(event.lang);
13862
+ moment$2.locale(event.lang);
13829
13863
  console.debug('[platform] Use locale {' + event.lang + '}');
13830
13864
  }
13831
13865
  // If error, fallback to en
13832
13866
  catch (err) {
13833
- moment$4.locale('en');
13867
+ moment$2.locale('en');
13834
13868
  console.warn('[platform] Unknown local for moment lib. Using default [en]');
13835
13869
  }
13836
13870
  // Config date adapter
13837
- this.dateAdapter.setLocale(moment$4.locale());
13871
+ this.dateAdapter.setLocale(moment$2.locale());
13838
13872
  }
13839
13873
  });
13840
13874
  this.settings.onChange.subscribe(data => {
@@ -13971,7 +14005,7 @@ class PlatformService {
13971
14005
  });
13972
14006
  }
13973
14007
  }
13974
- PlatformService.ɵprov = ɵɵdefineInjectable({ factory: function PlatformService_Factory() { return new PlatformService(ɵɵinject(Platform), ɵɵinject(Platform$1), ɵɵinject(ToastController), ɵɵinject(TranslateService), ɵɵinject(MomentDateAdapter), ɵɵinject(EntitiesStorage), ɵɵinject(LocalSettingsService), ɵɵinject(NetworkService), ɵɵinject(AccountService), ɵɵinject(ConfigService), ɵɵinject(CacheService), ɵɵinject(Storage), ɵɵinject(AudioProvider), ɵɵinject(ENVIRONMENT), ɵɵinject(StatusBar, 8), ɵɵinject(Keyboard$1, 8), ɵɵinject(SplashScreen, 8), ɵɵinject(InAppBrowser, 8)); }, token: PlatformService, providedIn: "root" });
14008
+ PlatformService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PlatformService_Factory() { return new PlatformService(i0.ɵɵinject(i1$4.Platform), i0.ɵɵinject(i2$4.Platform), i0.ɵɵinject(i1$4.ToastController), i0.ɵɵinject(i1$1.TranslateService), i0.ɵɵinject(i1.MomentDateAdapter), i0.ɵɵinject(EntitiesStorage), i0.ɵɵinject(LocalSettingsService), i0.ɵɵinject(NetworkService), i0.ɵɵinject(AccountService), i0.ɵɵinject(ConfigService), i0.ɵɵinject(i6.CacheService), i0.ɵɵinject(i3$1.Storage), i0.ɵɵinject(AudioProvider), i0.ɵɵinject(ENVIRONMENT), i0.ɵɵinject(i14.StatusBar, 8), i0.ɵɵinject(i15.Keyboard, 8), i0.ɵɵinject(i10.SplashScreen, 8), i0.ɵɵinject(i17.InAppBrowser, 8), i0.ɵɵinject(i18.Downloader, 8)); }, token: PlatformService, providedIn: "root" });
13975
14009
  PlatformService.decorators = [
13976
14010
  { type: Injectable, args: [{ providedIn: 'root' },] }
13977
14011
  ];
@@ -13986,14 +14020,15 @@ PlatformService.ctorParameters = () => [
13986
14020
  { type: NetworkService },
13987
14021
  { type: AccountService },
13988
14022
  { type: ConfigService },
13989
- { type: CacheService$1 },
14023
+ { type: CacheService },
13990
14024
  { type: Storage },
13991
14025
  { type: AudioProvider },
13992
14026
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
13993
- { type: StatusBar$1, decorators: [{ type: Optional }] },
14027
+ { type: StatusBar, decorators: [{ type: Optional }] },
13994
14028
  { type: Keyboard, decorators: [{ type: Optional }] },
13995
- { type: SplashScreen$1, decorators: [{ type: Optional }] },
13996
- { type: InAppBrowser$1, decorators: [{ type: Optional }] }
14029
+ { type: SplashScreen, decorators: [{ type: Optional }] },
14030
+ { type: InAppBrowser, decorators: [{ type: Optional }] },
14031
+ { type: Downloader, decorators: [{ type: Optional }] }
13997
14032
  ];
13998
14033
 
13999
14034
  class AppHelpModal {
@@ -14057,7 +14092,7 @@ class MatStepperI18n extends MatStepperIntl {
14057
14092
  this.optionalLabel = this.translate.instant('COMMON.OPTIONAL');
14058
14093
  }
14059
14094
  }
14060
- MatStepperI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(ɵɵinject(TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
14095
+ MatStepperI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
14061
14096
  MatStepperI18n.decorators = [
14062
14097
  { type: Injectable, args: [{ providedIn: 'root' },] }
14063
14098
  ];
@@ -15049,7 +15084,7 @@ function state2side(state) {
15049
15084
  return 1;
15050
15085
  }
15051
15086
  }
15052
- const ɵ0$9 = (defaultStateSize) => [
15087
+ const ɵ0$1 = (defaultStateSize) => [
15053
15088
  Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
15054
15089
  Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
15055
15090
  Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
@@ -15057,7 +15092,7 @@ const ɵ0$9 = (defaultStateSize) => [
15057
15092
  const SCALE_OPTIONS_DEFAULT = {
15058
15093
  startColor: rgbArrayMap.red,
15059
15094
  startStates: [0, 2, 3],
15060
- startStepsFn: ɵ0$9
15095
+ startStepsFn: ɵ0$1
15061
15096
  };
15062
15097
  /**
15063
15098
  * Internal function, that create a colors scale, using iteration
@@ -15149,21 +15184,21 @@ function linearColorGradient(count, options) {
15149
15184
  return result;
15150
15185
  }
15151
15186
 
15152
- class EntityTestClass {
15187
+ class EntityTestClass$1 {
15153
15188
  }
15154
- const FAKE_ENTITIES = [
15189
+ const FAKE_ENTITIES$1 = [
15155
15190
  { id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments... again for A' },
15156
15191
  { id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments... again for B' },
15157
15192
  { id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments... again for C' }
15158
15193
  ];
15159
- function deepCopy(values, size) {
15194
+ function deepCopy$1(values, size) {
15160
15195
  if (isNil(size)) {
15161
- return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
15196
+ return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
15162
15197
  }
15163
15198
  let result = [];
15164
15199
  let i = 1;
15165
15200
  while (result.length < size) {
15166
- result = result.concat((values || FAKE_ENTITIES).map(entity => {
15201
+ result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
15167
15202
  const name = entity.name + ' #' + i;
15168
15203
  return Object.assign(Object.assign({}, entity), { id: i++, name });
15169
15204
  }));
@@ -15173,7 +15208,7 @@ function deepCopy(values, size) {
15173
15208
  class AutocompleteTestPage {
15174
15209
  constructor(formBuilder) {
15175
15210
  this.formBuilder = formBuilder;
15176
- this._items = deepCopy(FAKE_ENTITIES, 100);
15211
+ this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
15177
15212
  this.$items = new BehaviorSubject(undefined);
15178
15213
  this.autocompleteFields = new MatAutocompleteConfigHolder();
15179
15214
  this.memoryHide = false;
@@ -15217,7 +15252,7 @@ class AutocompleteTestPage {
15217
15252
  });
15218
15253
  // From items
15219
15254
  this.autocompleteFields.add('entity-items-large', {
15220
- items: FAKE_ENTITIES.slice(),
15255
+ items: FAKE_ENTITIES$1.slice(),
15221
15256
  attributes: ['label', 'name', 'description', 'comments'],
15222
15257
  displayWith: this.entityToString
15223
15258
  });
@@ -15227,12 +15262,12 @@ class AutocompleteTestPage {
15227
15262
  loadData() {
15228
15263
  return __awaiter(this, void 0, void 0, function* () {
15229
15264
  const data = {
15230
- entity: deepCopy(FAKE_ENTITIES)[0],
15265
+ entity: deepCopy$1(FAKE_ENTITIES$1)[0],
15231
15266
  // This item is NOT in the items list => i should be displayed anyway
15232
15267
  missingEntity: {
15233
15268
  id: -1, label: '??', name: 'Missing item'
15234
15269
  },
15235
- disableEntity: deepCopy(FAKE_ENTITIES)[2]
15270
+ disableEntity: deepCopy$1(FAKE_ENTITIES$1)[2]
15236
15271
  };
15237
15272
  this.form.setValue(data);
15238
15273
  // Load observables
@@ -15302,7 +15337,7 @@ class AutocompleteTestPage {
15302
15337
  AutocompleteTestPage.decorators = [
15303
15338
  { type: Component, args: [{
15304
15339
  selector: 'app-autocomplete-test',
15305
- template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Autocomplete field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <!-- Tab nav - mobile/desktop mode -->\n <nav mat-tab-nav-bar>\n <a mat-tab-link\n [active]=\"mode==='mobile'\"\n (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='desktop'\"\n (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='memory'\"\n (click)=\"toggleMode('memory')\">\n <mat-label>Memory leak debug</mat-label>\n </a>\n <a mat-tab-link\n [active]=\"mode==='temp'\"\n (click)=\"toggleMode('temp')\">\n <mat-label>Temporary</mat-label>\n </a>\n </nav>\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <!--<ion-grid *ngIf=\"mode === 'temp'\">\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n </ion-row>\n\n\n </ion-grid>-->\n\n\n <ion-grid *ngIf=\"mode === 'memory'\">\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"always\">\n <input matInput type=\"text\" hidden placeholder=\"Items type\">\n <mat-select (selectionChange)=\"memoryAutocompleteFieldName=$event.value\" [value]=\"memoryAutocompleteFieldName\">\n <mat-option value=\"entity-$items\">Observable</mat-option>\n <mat-option value=\"entity-suggestFn\">Suggest function</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"1\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"always\" >\n <input matInput type=\"text\" hidden placeholder=\"Mobile ?\">\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [checked]=\"memoryMobile\">\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\" color=\"tertiary\">Start</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\" color=\"tertiary\">Stop</ion-button>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n *ngIf=\"!memoryHide && memoryAutocompleteFieldName\"\n [config]=\"autocompleteFields.get(memoryAutocompleteFieldName)\"\n [mobile]=\"memoryMobile\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-memory-leak]'\">\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n <!-- Mobile mode -->\n <ion-grid *ngIf=\"mode === 'mobile'\">\n\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Suggest() function\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, suggestFn: (searchText, filter) =&gt; any[]</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-suggestFn')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-1]'\"\n [required]=\"true\"\n placeholder=\"Suggest field\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Items is an Observable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-observable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Change filter\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre></pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <ion-button (click)=\"updateFilter('entity-items-filter')\">Filter on: {{autocompleteFields.get('entity-items-filter').filter?.searchAttribute }}</ion-button>\n </ion-col>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-filter]'\"\n ></mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class=\"min-width-large\"</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"true\"\n class=\"min-width-large\"\n panelWidth=\"400px\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Desktop mode -->\n <ion-grid *ngIf=\"mode === 'desktop'\">\n <ion-row>\n <ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col>\n </ion-row>\n <ion-row>\n\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n items from suggest function\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>suggest: (value, filter) => LoadResult&lt;any&gt;\nsuggestLengthThreshold: '3'</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n suggestLengthThreshold=\"3\"\n [logPrefix]=\"'[combo-desktop-suggest]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an array\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: [], value: {{stringify(form.controls.entity.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items')\"\n [logPrefix]=\"'[combo-desktop-array-1]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-missing]'\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size panel\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class: 'mat-autocomplete-panel-full-size'</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [class]=\"'mat-autocomplete-panel-full-size'\"\n [compareWith]=\"compareWithFn\"\n [matAutocompletePosition]=\"'above'\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-disable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\" >\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class=\"mat-autocomplete-panel-full-size\"</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n class=\"mat-autocomplete-panel-full-size\"\n panelWidth=\"100vw\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\" >\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>panelWidth: string</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n panelWidth=\"400px\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n\n\n\n </ion-grid>\n\n </form>\n\n</ion-content>\n"
15340
+ template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Autocomplete field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n\n <!-- Tab nav - mobile/desktop mode -->\n <nav mat-tab-nav-bar>\n <a mat-tab-link\n [active]=\"mode==='mobile'\"\n (click)=\"toggleMode('mobile')\">\n <mat-label>Mobile</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='desktop'\"\n (click)=\"toggleMode('desktop')\">\n <mat-label>Desktop</mat-label>\n </a>\n <a mat-tab-link [active]=\"mode==='memory'\"\n (click)=\"toggleMode('memory')\">\n <mat-label>Memory leak debug</mat-label>\n </a>\n <a mat-tab-link\n [active]=\"mode==='temp'\"\n (click)=\"toggleMode('temp')\">\n <mat-label>Temporary</mat-label>\n </a>\n </nav>\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <!--<ion-grid *ngIf=\"mode === 'temp'\">\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n </ion-row>\n\n\n </ion-grid>-->\n\n\n <ion-grid *ngIf=\"mode === 'memory'\">\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"always\">\n <input matInput type=\"text\" hidden placeholder=\"Items type\">\n <mat-select (selectionChange)=\"memoryAutocompleteFieldName=$event.value\" [value]=\"memoryAutocompleteFieldName\">\n <mat-option value=\"entity-$items\">Observable</mat-option>\n <mat-option value=\"entity-suggestFn\">Suggest function</mat-option>\n </mat-select>\n </mat-form-field>\n </ion-col>\n <ion-col size=\"1\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"always\" >\n <input matInput type=\"text\" hidden placeholder=\"Mobile ?\">\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [checked]=\"memoryMobile\">\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\" color=\"tertiary\">Start</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\" color=\"tertiary\">Stop</ion-button>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n *ngIf=\"!memoryHide && memoryAutocompleteFieldName\"\n [config]=\"autocompleteFields.get(memoryAutocompleteFieldName)\"\n [mobile]=\"memoryMobile\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-memory-leak]'\">\n </mat-autocomplete-field>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n <!-- Mobile mode -->\n <ion-grid *ngIf=\"mode === 'mobile'\">\n\n <ion-row>\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Suggest() function\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, suggestFn: (searchText, filter) =&gt; any[]</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-suggestFn')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-1]'\"\n [required]=\"true\"\n placeholder=\"Suggest field\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Items is an Observable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-observable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>mobile: true, items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-2]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Change filter\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre></pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <ion-button (click)=\"updateFilter('entity-items-filter')\">Filter on: {{autocompleteFields.get('entity-items-filter').filter?.searchAttribute }}</ion-button>\n </ion-col>\n <ion-col>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [mobile]=\"true\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-filter]'\"\n ></mat-autocomplete-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class=\"min-width-large\"</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"true\"\n class=\"min-width-large\"\n panelWidth=\"400px\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-mobile-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Desktop mode -->\n <ion-grid *ngIf=\"mode === 'desktop'\">\n <ion-row>\n <ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col>\n </ion-row>\n <ion-row>\n\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n items from suggest function\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>suggest: (value, filter) => LoadResult&lt;any&gt;\nsuggestLengthThreshold: '3'</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n suggestLengthThreshold=\"3\"\n [logPrefix]=\"'[combo-desktop-suggest]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an array\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: [], value: {{stringify(form.controls.entity.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items')\"\n [logPrefix]=\"'[combo-desktop-array-1]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Items is an Observable\n </ion-text>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [logPrefix]=\"'[combo-desktop-2]'\"\n [compareWith]=\"compareWithFn\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Control value if missing in items\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>items: Observable&lt;any[]&gt;</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"missingEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-missing]'\"\n [mobile]=\"false\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size panel\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class: 'mat-autocomplete-panel-full-size'</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [class]=\"'mat-autocomplete-panel-full-size'\"\n [compareWith]=\"compareWithFn\"\n [matAutocompletePosition]=\"'above'\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disabled control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"disableEntity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-disable]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly control\n </ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-$items')\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n <ion-row>\n <ion-col size=\"9\" >\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Full size combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>class=\"mat-autocomplete-panel-full-size\"</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n class=\"mat-autocomplete-panel-full-size\"\n panelWidth=\"100vw\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-full-size]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-col size=\"3\" >\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Large combo\n </ion-label>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>panelWidth: string</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-autocomplete-field formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-large')\"\n [mobile]=\"false\"\n panelWidth=\"400px\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-large]'\"\n ></mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n\n <ion-col size=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-text color=\"primary\">\n Readonly toggle\n </ion-text>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n </mat-checkbox>\n\n <mat-autocomplete-field #readonlyField formControlName=\"entity\"\n [config]=\"autocompleteFields.get('entity-items-filter')\"\n [placeholder]=\"'Entity'\"\n [mobile]=\"false\"\n [compareWith]=\"compareWithFn\"\n [logPrefix]=\"'[combo-desktop-readonly]'\"\n [readonly]=\"true\">\n </mat-autocomplete-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </form>\n\n</ion-content>\n"
15306
15341
  },] }
15307
15342
  ];
15308
15343
  AutocompleteTestPage.ctorParameters = () => [
@@ -15405,13 +15440,13 @@ MaterialTestingPage.ctorParameters = () => [
15405
15440
  { type: Array, decorators: [{ type: Optional }, { type: Inject, args: [APP_TESTING_PAGES,] }] }
15406
15441
  ];
15407
15442
 
15408
- const moment$5 = momentImported;
15443
+ const moment$1 = momentImported;
15409
15444
  class SwipeTestPage {
15410
15445
  constructor(formBuilder, dateFormatPipe) {
15411
15446
  this.formBuilder = formBuilder;
15412
15447
  this.dateFormatPipe = dateFormatPipe;
15413
15448
  this.$dates = new BehaviorSubject(undefined);
15414
- this._today = moment$5().startOf('day');
15449
+ this._today = moment$1().startOf('day');
15415
15450
  this.form = formBuilder.group({
15416
15451
  empty: [null, Validators.required],
15417
15452
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -15424,7 +15459,7 @@ class SwipeTestPage {
15424
15459
  ngOnInit() {
15425
15460
  const dates = [];
15426
15461
  for (let d = 0; d < 7; d++) {
15427
- dates[d] = moment$5(this._today).add(d - 3, 'day');
15462
+ dates[d] = moment$1(this._today).add(d - 3, 'day');
15428
15463
  }
15429
15464
  this.$dates.next(dates);
15430
15465
  this.loadData();
@@ -16041,7 +16076,7 @@ class FormArrayHelper {
16041
16076
  }
16042
16077
  }
16043
16078
 
16044
- const moment$6 = momentImported;
16079
+ const moment = momentImported;
16045
16080
  class DateTimeTestPage {
16046
16081
  constructor(platform, formBuilder, cd) {
16047
16082
  this.platform = platform;
@@ -16072,7 +16107,7 @@ class DateTimeTestPage {
16072
16107
  // Load the form with data
16073
16108
  loadData() {
16074
16109
  return __awaiter(this, void 0, void 0, function* () {
16075
- const now = moment$6();
16110
+ const now = moment();
16076
16111
  const data = {
16077
16112
  empty: toDateISOString(now.clone().add(2, 'hours')),
16078
16113
  enable: toDateISOString(now),
@@ -16132,20 +16167,20 @@ DateTimeTestPage.ctorParameters = () => [
16132
16167
  { type: ChangeDetectorRef }
16133
16168
  ];
16134
16169
 
16135
- class EntityTestClass$1 {
16170
+ class EntityTestClass {
16136
16171
  }
16137
- const FAKE_ENTITIES$1 = [
16172
+ const FAKE_ENTITIES = [
16138
16173
  { id: 1, label: 'AAA', name: 'Item A' },
16139
16174
  { id: 2, label: 'BBB', name: 'Item B' },
16140
16175
  { id: 3, label: 'CCC', name: 'Item C' }
16141
16176
  ];
16142
- function deepCopy$1(values) {
16143
- return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
16177
+ function deepCopy(values) {
16178
+ return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
16144
16179
  }
16145
16180
  class ChipsTestPage {
16146
16181
  constructor(formBuilder) {
16147
16182
  this.formBuilder = formBuilder;
16148
- this._items = deepCopy$1(FAKE_ENTITIES$1);
16183
+ this._items = deepCopy(FAKE_ENTITIES);
16149
16184
  this._$items = new BehaviorSubject(undefined);
16150
16185
  this.autocompleteFields = new MatAutocompleteConfigHolder();
16151
16186
  this.form = formBuilder.group({
@@ -16164,7 +16199,7 @@ class ChipsTestPage {
16164
16199
  });
16165
16200
  // From items
16166
16201
  this.autocompleteFields.add('entity-items', {
16167
- items: FAKE_ENTITIES$1.slice(),
16202
+ items: FAKE_ENTITIES.slice(),
16168
16203
  attributes: ['label', 'name'],
16169
16204
  displayWith: this.entityToString
16170
16205
  });
@@ -16185,15 +16220,15 @@ class ChipsTestPage {
16185
16220
  const data = {
16186
16221
  entity: [],
16187
16222
  // THis item is NOT in the items list => i should be displayed anyway
16188
- entityInitial: FAKE_ENTITIES$1.slice(1, 2),
16189
- disableEntity: FAKE_ENTITIES$1.slice(1, 2)
16223
+ entityInitial: FAKE_ENTITIES.slice(1, 2),
16224
+ disableEntity: FAKE_ENTITIES.slice(1, 2)
16190
16225
  };
16191
16226
  this.form.setValue(data);
16192
16227
  });
16193
16228
  }
16194
16229
  loadItems() {
16195
16230
  return __awaiter(this, void 0, void 0, function* () {
16196
- this._$items.next(deepCopy$1(FAKE_ENTITIES$1));
16231
+ this._$items.next(deepCopy(FAKE_ENTITIES));
16197
16232
  });
16198
16233
  }
16199
16234
  entityToString(item) {
@@ -16225,7 +16260,7 @@ ChipsTestPage.ctorParameters = () => [
16225
16260
  { type: FormBuilder }
16226
16261
  ];
16227
16262
 
16228
- const routes = [
16263
+ const routes$1 = [
16229
16264
  {
16230
16265
  path: '',
16231
16266
  pathMatch: 'full',
@@ -16272,7 +16307,7 @@ MaterialTestingModule.decorators = [
16272
16307
  ReactiveFormsModule,
16273
16308
  SharedMaterialModule,
16274
16309
  TranslateModule.forChild(),
16275
- RouterModule.forChild(routes)
16310
+ RouterModule.forChild(routes$1)
16276
16311
  ],
16277
16312
  declarations: [
16278
16313
  MaterialTestingPage,
@@ -17215,7 +17250,7 @@ class UserSettingsValidatorService extends AppValidatorService {
17215
17250
  });
17216
17251
  }
17217
17252
  }
17218
- UserSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(ɵɵinject(FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
17253
+ UserSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
17219
17254
  UserSettingsValidatorService.decorators = [
17220
17255
  { type: Injectable, args: [{ providedIn: 'root' },] }
17221
17256
  ];
@@ -17259,7 +17294,7 @@ class AccountValidatorService extends AppValidatorService {
17259
17294
  return validatorFns.length ? Validators.compose(validatorFns) : validatorFns.length === 1 ? validatorFns[0] : undefined;
17260
17295
  }
17261
17296
  }
17262
- AccountValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
17297
+ AccountValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
17263
17298
  AccountValidatorService.decorators = [
17264
17299
  { type: Injectable, args: [{ providedIn: 'root' },] }
17265
17300
  ];
@@ -17793,7 +17828,7 @@ class LocalSettingsValidatorService extends AppValidatorService {
17793
17828
  });
17794
17829
  }
17795
17830
  }
17796
- LocalSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(ɵɵinject(FormBuilder), ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
17831
+ LocalSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
17797
17832
  LocalSettingsValidatorService.decorators = [
17798
17833
  { type: Injectable, args: [{ providedIn: 'root' },] }
17799
17834
  ];
@@ -18413,7 +18448,7 @@ class IsOnFieldModePipe {
18413
18448
  return value === 'FIELD';
18414
18449
  }
18415
18450
  }
18416
- IsOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
18451
+ IsOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
18417
18452
  IsOnFieldModePipe.decorators = [
18418
18453
  { type: Pipe, args: [{
18419
18454
  name: 'isOnField'
@@ -18425,7 +18460,7 @@ class IsNotOnFieldModePipe {
18425
18460
  return value !== 'FIELD';
18426
18461
  }
18427
18462
  }
18428
- IsNotOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
18463
+ IsNotOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
18429
18464
  IsNotOnFieldModePipe.decorators = [
18430
18465
  { type: Pipe, args: [{
18431
18466
  name: 'isNotOnField'
@@ -18440,7 +18475,7 @@ class PersonToStringPipe {
18440
18475
  return PersonUtils.personToString(value);
18441
18476
  }
18442
18477
  }
18443
- PersonToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
18478
+ PersonToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
18444
18479
  PersonToStringPipe.decorators = [
18445
18480
  { type: Pipe, args: [{
18446
18481
  name: 'personToString'
@@ -18448,6 +18483,9 @@ PersonToStringPipe.decorators = [
18448
18483
  { type: Injectable, args: [{ providedIn: 'root' },] }
18449
18484
  ];
18450
18485
 
18486
+ const MimeTypes = Object.freeze({
18487
+ ANDROID_APK: 'application/vnd.android.package-archive'
18488
+ });
18451
18489
  class AppInstallUpgradeCard {
18452
18490
  constructor(modalCtrl, configService, platform, cd, network, environment) {
18453
18491
  this.modalCtrl = modalCtrl;
@@ -18464,6 +18502,7 @@ class AppInstallUpgradeCard {
18464
18502
  this.showOfflineWarning = true;
18465
18503
  this.showInstallButton = false;
18466
18504
  this.onUpdateOfflineModeClick = new EventEmitter();
18505
+ this.isAndroidCordova = platform.isAndroidCordova();
18467
18506
  }
18468
18507
  set showUpdateOfflineFeature(value) {
18469
18508
  if (value === this._showUpdateOfflineFeature)
@@ -18507,15 +18546,14 @@ class AppInstallUpgradeCard {
18507
18546
  ngOnDestroy() {
18508
18547
  this._subscription.unsubscribe();
18509
18548
  }
18510
- openDownloadLink(event, url) {
18511
- if (!url)
18549
+ downloadLink(event, link) {
18550
+ if (!link || !link.url)
18512
18551
  return; // Skip
18513
- if (event) {
18514
- event.preventDefault();
18515
- }
18516
- console.info(`[install] Opening App download link: ${url}`);
18517
- this.platform.open(url, '_system', 'location=yes');
18518
- return false;
18552
+ this.platform.download({
18553
+ uri: link.url,
18554
+ filename: link.downloadFilename,
18555
+ mimeType: link.mimeType
18556
+ });
18519
18557
  }
18520
18558
  tryOnline() {
18521
18559
  this.waitingNetwork = true;
@@ -18540,10 +18578,10 @@ class AppInstallUpgradeCard {
18540
18578
  return '';
18541
18579
  }
18542
18580
  }
18543
- getAppFileName() {
18544
- return;
18581
+ asLink(value) {
18582
+ return value;
18545
18583
  }
18546
- /* -- protected method -- */
18584
+ /* -- private method -- */
18547
18585
  getCompatibleInstallLinks(installLinks) {
18548
18586
  // Cordova already running: not need to install
18549
18587
  if (this.platform.is('cordova'))
@@ -18580,11 +18618,14 @@ class AppInstallUpgradeCard {
18580
18618
  if (url) {
18581
18619
  let downloadFilename;
18582
18620
  let version;
18621
+ let mimeType;
18583
18622
  // Get file name
18584
18623
  const filename = this.getFilename(url);
18585
18624
  version = config.getProperty(CORE_CONFIG_OPTIONS.APP_MIN_VERSION);
18586
18625
  // OK, this is a downloadable APK file (e.g. NOT a link to a playstore)
18587
18626
  if (filename === null || filename === void 0 ? void 0 : filename.endsWith('.apk')) {
18627
+ // Define mime type
18628
+ mimeType = MimeTypes.ANDROID_APK;
18588
18629
  // Get the file version (if any)
18589
18630
  const versionMatches = /-v([1-9][0-9]*\.[0-9]+\.(:?(:?alpha|beta|rc)?[0-9]*))/i.exec(filename);
18590
18631
  version = versionMatches && versionMatches[1] || version;
@@ -18601,7 +18642,7 @@ class AppInstallUpgradeCard {
18601
18642
  }
18602
18643
  }
18603
18644
  }
18604
- result.push({ name, url, platform: 'android', version, downloadFilename });
18645
+ result.push({ name, url, platform: 'android', version, downloadFilename, mimeType });
18605
18646
  }
18606
18647
  }
18607
18648
  // iOS - TODO
@@ -18629,7 +18670,7 @@ class AppInstallUpgradeCard {
18629
18670
  AppInstallUpgradeCard.decorators = [
18630
18671
  { type: Component, args: [{
18631
18672
  selector: 'app-install-upgrade-card',
18632
- template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n <!-- Waiting spinner -->\n <ng-template #waitingSpinner>\n <ion-spinner *ngIf=\"waitingNetwork\" color=\"light\"></ion-spinner>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card *ngIf=\"showUpgradeWarning && !loading && !offline && updateLinks\"\n color=\"accent\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of updateLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3>\n <span *ngIf=\"link.version\" [innerHTML]=\"'INFO.UPDATE_APP_TO_VERSION'| translate: link\"></span>\n <span *ngIf=\"!link.version\" [innerHTML]=\"'INFO.UPDATE_APP'| translate: link\"></span>\n </h3>\n <h4>\n <small *ngIf=\"last\" [innerHTML]=\"'INFO.UPDATE_APP_HELP'|translate\"></small>\n </h4>\n </ion-text>\n </ion-col>\n\n <ion-col size=\"auto\">\n\n <!-- Download button -->\n <ion-button *ngIf=\"link.downloadFilename; else redirectButton\"\n [download]=\"link.downloadFilename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n\n <!-- Redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Install links -->\n<ion-card *ngIf=\"showInstallButton && !loading && !offline && installLinks\"\n color=\"secondary\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of installLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3 [innerHTML]=\"'INFO.DOWNLOAD_APP_TITLE'| translate: {name: link.name, platform: getPlatformName(link.platform) }\"></h3>\n <h4><small *ngIf=\"last\" [innerHTML]=\"'INFO.DOWNLOAD_APP_HELP'|translate\"></small></h4>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Download button -->\n <ion-button *ngIf=\"link.downloadFilename; else redirectButton\"\n [download]=\"link.downloadFilename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n\n <!-- Redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Update offline feature card-->\n<ion-card *ngIf=\"showUpdateOfflineFeature && !loading && !offline\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h4>\n <b [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE'| translate\"></b>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"onUpdateOfflineModeClick.emit($event)\">\n <span translate>NETWORK.BTN_UPDATE</span>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n",
18673
+ template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n <!-- Waiting spinner -->\n <ng-template #waitingSpinner>\n <ion-spinner *ngIf=\"waitingNetwork\" color=\"light\"></ion-spinner>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card *ngIf=\"showUpgradeWarning && !loading && !offline && updateLinks\"\n color=\"accent\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of updateLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3>\n <span *ngIf=\"link.version\" [innerHTML]=\"'INFO.UPDATE_APP_TO_VERSION'| translate: link\"></span>\n <span *ngIf=\"!link.version\" [innerHTML]=\"'INFO.UPDATE_APP'| translate: link\"></span>\n </h3>\n <h4>\n <small *ngIf=\"last\" [innerHTML]=\"'INFO.UPDATE_APP_HELP'|translate\"></small>\n </h4>\n </ion-text>\n </ion-col>\n\n <ion-col size=\"auto\">\n\n <!-- Download button -->\n <ion-button *ngIf=\"link.downloadFilename; else redirectButton\"\n [download]=\"link.downloadFilename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n\n <!-- Redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Install links -->\n<ion-card *ngIf=\"showInstallButton && !loading && !offline && installLinks\"\n color=\"secondary\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of installLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3 [innerHTML]=\"'INFO.DOWNLOAD_APP_TITLE'| translate: {name: link.name, platform: getPlatformName(link.platform) }\"></h3>\n <h4><small *ngIf=\"last\" [innerHTML]=\"'INFO.DOWNLOAD_APP_HELP'|translate\"></small></h4>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Update offline feature card-->\n<ion-card *ngIf=\"showUpdateOfflineFeature && !loading && !offline\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h4>\n <b [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE'| translate\"></b>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"onUpdateOfflineModeClick.emit($event)\">\n <span translate>NETWORK.BTN_UPDATE</span>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Display a download button, depending on the link URL, and the device platform -->\n<ng-template #downloadButton let-link>\n\n <ng-container *ngIf=\"link.downloadFilename; else redirectButton\">\n\n <!-- Cordova download button -->\n <ion-button *ngIf=\"isAndroidCordova; else webDownloadButton\"\n (click)=\"downloadLink($event, asLink(link))\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n\n <!-- Web download button -->\n <ng-template #webDownloadButton>\n <ion-button [download]=\"link.downloadFilename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-template>\n </ng-container>\n\n <!-- Web redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n</ng-template>\n",
18633
18674
  changeDetection: ChangeDetectionStrategy.OnPush,
18634
18675
  animations: [slideUpDownAnimation],
18635
18676
  styles: ["ion-text small{font-size:85%}"]
@@ -18657,7 +18698,7 @@ class IsLoginAccountPipe {
18657
18698
  return value && value.pubkey && true;
18658
18699
  }
18659
18700
  }
18660
- IsLoginAccountPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
18701
+ IsLoginAccountPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
18661
18702
  IsLoginAccountPipe.decorators = [
18662
18703
  { type: Pipe, args: [{
18663
18704
  name: 'isLogin'
@@ -18669,7 +18710,7 @@ class AccountToStringPipe {
18669
18710
  return accountToString(value);
18670
18711
  }
18671
18712
  }
18672
- AccountToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
18713
+ AccountToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
18673
18714
  AccountToStringPipe.decorators = [
18674
18715
  { type: Pipe, args: [{
18675
18716
  name: 'accountToString'
@@ -18684,7 +18725,7 @@ class DepartmentToStringPipe {
18684
18725
  return departmentToString(value);
18685
18726
  }
18686
18727
  }
18687
- DepartmentToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
18728
+ DepartmentToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
18688
18729
  DepartmentToStringPipe.decorators = [
18689
18730
  { type: Pipe, args: [{
18690
18731
  name: 'departmentToString'
@@ -18710,7 +18751,7 @@ class MenuService {
18710
18751
  this._visibleSubject.next(value);
18711
18752
  }
18712
18753
  }
18713
- MenuService.ɵprov = ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
18754
+ MenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
18714
18755
  MenuService.decorators = [
18715
18756
  { type: Injectable, args: [{
18716
18757
  providedIn: 'root'
@@ -19204,7 +19245,7 @@ class AuthGuardService {
19204
19245
  }));
19205
19246
  }
19206
19247
  }
19207
- AuthGuardService.ɵprov = ɵɵdefineInjectable({ factory: function AuthGuardService_Factory() { return new AuthGuardService(ɵɵinject(AccountService), ɵɵinject(ModalController), ɵɵinject(Router), ɵɵinject(ENVIRONMENT)); }, token: AuthGuardService, providedIn: "root" });
19248
+ AuthGuardService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AuthGuardService_Factory() { return new AuthGuardService(i0.ɵɵinject(AccountService), i0.ɵɵinject(i1$4.ModalController), i0.ɵɵinject(i3$3.Router), i0.ɵɵinject(ENVIRONMENT)); }, token: AuthGuardService, providedIn: "root" });
19208
19249
  AuthGuardService.decorators = [
19209
19250
  { type: Injectable, args: [{ providedIn: 'root' },] }
19210
19251
  ];
@@ -19252,7 +19293,7 @@ class BaseEntityService extends BaseGraphqlService {
19252
19293
  query,
19253
19294
  variables: { id },
19254
19295
  fetchPolicy: opts && opts.fetchPolicy || undefined,
19255
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
19296
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
19256
19297
  })
19257
19298
  .pipe(map(({ data }) => (!opts || opts.toEntity !== false)
19258
19299
  ? (data && this.fromObject(data))
@@ -19267,7 +19308,7 @@ class BaseEntityService extends BaseGraphqlService {
19267
19308
  query,
19268
19309
  variables: { id },
19269
19310
  fetchPolicy: opts && opts.fetchPolicy || undefined,
19270
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
19311
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' }
19271
19312
  });
19272
19313
  // Convert to entity
19273
19314
  return (!opts || opts.toEntity !== false)
@@ -19298,7 +19339,7 @@ class BaseEntityService extends BaseGraphqlService {
19298
19339
  totalFieldName: withTotal ? 'total' : undefined,
19299
19340
  insertFilterFn: filter && filter.asFilterFn(),
19300
19341
  variables,
19301
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' },
19342
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'REFERENTIAL.ERROR.LOAD_DATA_ERROR' },
19302
19343
  fetchPolicy: opts && opts.fetchPolicy || undefined
19303
19344
  })
19304
19345
  .pipe(map(({ data, total }) => {
@@ -19334,7 +19375,7 @@ class BaseEntityService extends BaseGraphqlService {
19334
19375
  const { data, total } = yield this.graphql.query({
19335
19376
  query,
19336
19377
  variables,
19337
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },
19378
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },
19338
19379
  fetchPolicy: opts && opts.fetchPolicy || 'network-only'
19339
19380
  });
19340
19381
  const entities = (!opts || opts.toEntity !== false) ?
@@ -19373,7 +19414,7 @@ class BaseEntityService extends BaseGraphqlService {
19373
19414
  variables: {
19374
19415
  filter: filter && filter.asPodObject()
19375
19416
  },
19376
- error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.COUNT_DATA_ERROR' },
19417
+ error: { code: ErrorCodes$2.LOAD_DATA_ERROR, message: 'ERROR.COUNT_DATA_ERROR' },
19377
19418
  fetchPolicy: opts && opts.fetchPolicy || 'network-only'
19378
19419
  });
19379
19420
  return res.total;
@@ -19406,7 +19447,7 @@ class BaseEntityService extends BaseGraphqlService {
19406
19447
  variables: {
19407
19448
  data: json
19408
19449
  },
19409
- error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
19450
+ error: { code: ErrorCodes$2.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
19410
19451
  update: (proxy, { data }) => {
19411
19452
  const savedEntities = data && data.data;
19412
19453
  if (savedEntities) {
@@ -19462,7 +19503,7 @@ class BaseEntityService extends BaseGraphqlService {
19462
19503
  variables: {
19463
19504
  data: json
19464
19505
  },
19465
- error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
19506
+ error: { code: ErrorCodes$2.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },
19466
19507
  update: (cache, { data }) => {
19467
19508
  // Update entity
19468
19509
  const savedEntity = data && data.data;
@@ -19510,7 +19551,7 @@ class BaseEntityService extends BaseGraphqlService {
19510
19551
  refetchQueries: this.getRefetchQueriesForMutation(opts),
19511
19552
  awaitRefetchQueries: opts && opts.awaitRefetchQueries,
19512
19553
  variables: { ids },
19513
- error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
19554
+ error: { code: ErrorCodes$2.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
19514
19555
  update: (cache, res) => {
19515
19556
  // Remove from cache
19516
19557
  if (this.watchQueriesUpdatePolicy === 'update-cache') {
@@ -19551,7 +19592,7 @@ class BaseEntityService extends BaseGraphqlService {
19551
19592
  refetchQueries: this.getRefetchQueriesForMutation(opts),
19552
19593
  awaitRefetchQueries: opts && opts.awaitRefetchQueries,
19553
19594
  variables: { id },
19554
- error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
19595
+ error: { code: ErrorCodes$2.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },
19555
19596
  update: (proxy, res) => {
19556
19597
  // Remove from cache
19557
19598
  if (this.watchQueriesUpdatePolicy === 'update-cache') {
@@ -19584,7 +19625,7 @@ class BaseEntityService extends BaseGraphqlService {
19584
19625
  query: opts && opts.query || this.subscriptions.listenChanges,
19585
19626
  variables,
19586
19627
  error: {
19587
- code: ErrorCodes.SUBSCRIBE_DATA_ERROR,
19628
+ code: ErrorCodes$2.SUBSCRIBE_DATA_ERROR,
19588
19629
  message: 'ERROR.SUBSCRIBE_DATA_ERROR'
19589
19630
  }
19590
19631
  })
@@ -19759,7 +19800,7 @@ class EntitiesTableDataSource extends TableDataSource {
19759
19800
  if (this._debug)
19760
19801
  invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._logTypeName} row #${row.id}`));
19761
19802
  // Stop with an error
19762
- throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
19803
+ throw { code: ErrorCodes$2.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
19763
19804
  }
19764
19805
  this._editingRowCount = 0;
19765
19806
  let data;
@@ -20581,14 +20622,14 @@ class AppTable {
20581
20622
  return __awaiter(this, void 0, void 0, function* () {
20582
20623
  opts = Object.assign({ keepEditing: this.keepEditedRowOnSave }, opts);
20583
20624
  if (this.readOnly) {
20584
- throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
20625
+ throw { code: ErrorCodes$2.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
20585
20626
  }
20586
20627
  this.resetError();
20587
20628
  // Keep edited row id (should be done BEFORE confirmEditCreate() )
20588
20629
  this.previouslyEditedRowId = opts.keepEditing && ((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.editing) ? this.editedRow.id : undefined;
20589
20630
  const previouslyEditedData = isNotNil(this.previouslyEditedRowId) && this.editedRow.currentData || ((_b = this.singleSelectedRow) === null || _b === void 0 ? void 0 : _b.currentData);
20590
20631
  if (!this.confirmEditCreate()) {
20591
- throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
20632
+ throw { code: ErrorCodes$2.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
20592
20633
  }
20593
20634
  // Mark as saving
20594
20635
  this.markAsSaving();
@@ -20704,7 +20745,7 @@ class AppTable {
20704
20745
  deleteRows(event, rows, opts) {
20705
20746
  return __awaiter(this, void 0, void 0, function* () {
20706
20747
  if (this.readOnly) {
20707
- throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
20748
+ throw { code: ErrorCodes$2.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
20708
20749
  }
20709
20750
  if (event === null || event === void 0 ? void 0 : event.defaultPrevented)
20710
20751
  return 0; // SKip
@@ -22135,7 +22176,7 @@ class AppEntityEditor extends AppTabEditor {
22135
22176
  try {
22136
22177
  const data = yield this.dataService.load(id, opts);
22137
22178
  if (!data)
22138
- throw { code: ErrorCodes.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
22179
+ throw { code: ErrorCodes$2.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
22139
22180
  this._usageMode = this.computeUsageMode(data);
22140
22181
  yield this.onEntityLoaded(data, opts);
22141
22182
  yield this.updateView(data, opts);
@@ -23028,7 +23069,7 @@ class UserEventService extends BaseGraphqlService {
23028
23069
  EntityUtils.copyIdAndUpdateDate(source, target);
23029
23070
  }
23030
23071
  }
23031
- UserEventService.ɵprov = ɵɵdefineInjectable({ factory: function UserEventService_Factory() { return new UserEventService(ɵɵinject(GraphqlService), ɵɵinject(AccountService), ɵɵinject(NetworkService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT)); }, token: UserEventService, providedIn: "root" });
23072
+ UserEventService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserEventService_Factory() { return new UserEventService(i0.ɵɵinject(GraphqlService), i0.ɵɵinject(AccountService), i0.ɵɵinject(NetworkService), i0.ɵɵinject(i1$1.TranslateService), i0.ɵɵinject(i1$4.ToastController), i0.ɵɵinject(ENVIRONMENT)); }, token: UserEventService, providedIn: "root" });
23032
23073
  UserEventService.decorators = [
23033
23074
  { type: Injectable, args: [{ providedIn: 'root' },] }
23034
23075
  ];
@@ -23230,6 +23271,7 @@ let PersonFilter = PersonFilter_1 = class PersonFilter extends EntityFilter {
23230
23271
  this.userProfiles = source.userProfiles;
23231
23272
  this.excludedIds = source.excludedIds;
23232
23273
  this.searchAttribute = source.searchAttribute;
23274
+ this.searchAttributes = source.searchAttributes;
23233
23275
  }
23234
23276
  asObject(opts) {
23235
23277
  const target = super.asObject(opts);
@@ -23240,6 +23282,7 @@ let PersonFilter = PersonFilter_1 = class PersonFilter extends EntityFilter {
23240
23282
  target.userProfiles = this.userProfiles;
23241
23283
  target.excludedIds = this.excludedIds;
23242
23284
  target.searchAttribute = this.searchAttribute;
23285
+ target.searchAttributes = this.searchAttributes;
23243
23286
  return target;
23244
23287
  }
23245
23288
  buildFilter() {
@@ -23253,7 +23296,7 @@ let PersonFilter = PersonFilter_1 = class PersonFilter extends EntityFilter {
23253
23296
  filterFns.push(e => isNil(e.id) || !this.excludedIds.includes(e.id));
23254
23297
  }
23255
23298
  // Search text
23256
- const searchTextFilter = EntityUtils.searchTextFilter(this.searchAttribute || ['lastName', 'firstName', 'department.name'], this.searchText);
23299
+ const searchTextFilter = EntityUtils.searchTextFilter(this.searchAttribute || this.searchAttributes || ['lastName', 'firstName', 'department.name'], this.searchText);
23257
23300
  if (searchTextFilter)
23258
23301
  filterFns.push(searchTextFilter);
23259
23302
  return filterFns;
@@ -23365,12 +23408,13 @@ class PersonService extends BaseEntityService {
23365
23408
  };
23366
23409
  });
23367
23410
  }
23368
- suggest(value, filter) {
23411
+ suggest(value, filter, sortBy, sortDirection) {
23369
23412
  return __awaiter(this, void 0, void 0, function* () {
23370
23413
  if (ReferentialUtils.isNotEmpty(value))
23371
23414
  return { data: [value] };
23372
23415
  value = (typeof value === 'string' && value !== '*') && value || undefined;
23373
- return this.loadAll(0, !value ? 30 : 10, undefined, undefined, Object.assign(Object.assign({}, filter), { searchText: value, statusIds: filter && filter.statusIds || [StatusIds.ENABLE], userProfiles: filter && filter.userProfiles }), { withTotal: true /* need by autocomplete */ });
23416
+ sortBy = sortBy || filter.searchAttribute || (filter.searchAttributes && filter.searchAttributes[0]);
23417
+ return this.loadAll(0, !value ? 30 : 10, sortBy, sortDirection, Object.assign(Object.assign({}, filter), { searchText: value, statusIds: filter && filter.statusIds || [StatusIds.ENABLE], userProfiles: filter && filter.userProfiles }), { withTotal: true /* need by autocomplete */ });
23374
23418
  });
23375
23419
  }
23376
23420
  executeImport(progression, opts) {
@@ -23410,7 +23454,7 @@ class PersonService extends BaseEntityService {
23410
23454
  return target;
23411
23455
  }
23412
23456
  }
23413
- PersonService.ɵprov = ɵɵdefineInjectable({ factory: function PersonService_Factory() { return new PersonService(ɵɵinject(GraphqlService), ɵɵinject(PlatformService), ɵɵinject(NetworkService), ɵɵinject(EntitiesStorage)); }, token: PersonService, providedIn: "root" });
23457
+ PersonService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonService_Factory() { return new PersonService(i0.ɵɵinject(GraphqlService), i0.ɵɵinject(PlatformService), i0.ɵɵinject(NetworkService), i0.ɵɵinject(EntitiesStorage)); }, token: PersonService, providedIn: "root" });
23414
23458
  PersonService.decorators = [
23415
23459
  { type: Injectable, args: [{ providedIn: 'root' },] }
23416
23460
  ];
@@ -23441,7 +23485,7 @@ class PersonValidatorService {
23441
23485
  return this.formBuilder.group(formConfig);
23442
23486
  }
23443
23487
  }
23444
- PersonValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
23488
+ PersonValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
23445
23489
  PersonValidatorService.decorators = [
23446
23490
  { type: Injectable, args: [{ providedIn: 'root' },] }
23447
23491
  ];
@@ -23645,16 +23689,16 @@ AdminModule.decorators = [
23645
23689
  ];
23646
23690
  AdminModule.ctorParameters = () => [];
23647
23691
 
23648
- const ɵ0$a = {
23692
+ const ɵ0 = {
23649
23693
  profile: 'ADMIN'
23650
23694
  };
23651
- const routes$1 = [
23695
+ const routes = [
23652
23696
  {
23653
23697
  path: 'users',
23654
23698
  pathMatch: 'full',
23655
23699
  component: UsersPage,
23656
23700
  canActivate: [AuthGuardService],
23657
- data: ɵ0$a
23701
+ data: ɵ0
23658
23702
  }
23659
23703
  ];
23660
23704
  class AdminRoutingModule {
@@ -23664,13 +23708,13 @@ AdminRoutingModule.decorators = [
23664
23708
  imports: [
23665
23709
  SharedRoutingModule,
23666
23710
  AdminModule,
23667
- RouterModule.forChild(routes$1)
23711
+ RouterModule.forChild(routes)
23668
23712
  ],
23669
23713
  exports: [RouterModule]
23670
23714
  },] }
23671
23715
  ];
23672
23716
 
23673
- const ErrorCodes$2 = {
23717
+ const ErrorCodes = {
23674
23718
  LOAD_PERSONS_ERROR: 100,
23675
23719
  SAVE_PERSONS_ERROR: 101,
23676
23720
  DELETE_PERSONS_ERROR: 102,
@@ -23682,5 +23726,5 @@ const ErrorCodes$2 = {
23682
23726
  * Generated bundle index. Do not edit.
23683
23727
  */
23684
23728
 
23685
- export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AnimationState, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes$2 as ErrorCodes, EvenPipe, FileService, FileSizePipe, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormFieldValuesHolder, Fragments$1 as Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialChipsModule, MaterialTestingModule, MaterialTestingPage, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialRef, ReferentialUtils, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedValidators, SocialModule, Software, StatusById, StatusIds, StatusList, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isControlHasInput, isEmptyArray, isInputElement, isInstanceOf, isInt, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitIdle, waitWhilePending, ɵ0$5 as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh };
23686
- //# sourceMappingURL=ngx-sumaris-components.js.map
23729
+ export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AnimationState, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileService, FileSizePipe, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormFieldValuesHolder, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialChipsModule, MaterialTestingModule, MaterialTestingPage, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialRef, ReferentialUtils, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBooleanModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedValidators, SocialModule, Software, StatusById, StatusIds, StatusList, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isControlHasInput, isEmptyArray, isInputElement, isInstanceOf, isInt, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitIdle, waitWhilePending, ɵ0$5 as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh };
23730
+ //# sourceMappingURL=sumaris-net.ngx-components.js.map