@sumaris-net/ngx-components 1.23.9 → 1.23.12

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 (28) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +453 -430
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/doc/changelog.md +8 -0
  6. package/esm2015/src/app/admin/users/list/users.js +2 -2
  7. package/esm2015/src/app/core/form/editor.class.js +40 -37
  8. package/esm2015/src/app/core/services/account.service.js +2 -2
  9. package/esm2015/src/app/core/services/config.service.js +2 -2
  10. package/esm2015/src/app/core/services/network.service.js +6 -6
  11. package/esm2015/src/app/core/table/entities-table-datasource.class.js +2 -2
  12. package/esm2015/src/app/core/table/table.class.js +6 -4
  13. package/esm2015/src/app/core/table/testing/table.testing.js +2 -2
  14. package/esm2015/src/app/shared/directives/autofocus.directive.js +1 -1
  15. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +2 -2
  16. package/esm2015/src/app/shared/services/entity-service.class.js +1 -10
  17. package/esm2015/src/app/shared/services/memory-entity-service.class.js +78 -32
  18. package/esm2015/src/app/shared/services/startable-service.class.js +21 -13
  19. package/esm2015/src/app/shared/upload-file/upload-file.component.js +1 -1
  20. package/fesm2015/sumaris-net.ngx-components.js +384 -348
  21. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  22. package/package.json +3 -3
  23. package/src/app/core/form/editor.class.d.ts +2 -1
  24. package/src/app/core/services/network.service.d.ts +1 -1
  25. package/src/app/shared/services/entity-service.class.d.ts +0 -8
  26. package/src/app/shared/services/memory-entity-service.class.d.ts +14 -5
  27. package/src/app/shared/services/startable-service.class.d.ts +4 -2
  28. package/sumaris-net.ngx-components.metadata.json +1 -1
@@ -1,12 +1,9 @@
1
- import * as i0 from '@angular/core';
2
- import { InjectionToken, EventEmitter, Component, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, Output, ViewChild, Pipe, Injectable, Directive, Inject, NgModule, ElementRef, TemplateRef, ViewContainerRef, HostBinding, HostListener, ViewChildren, ComponentFactoryResolver, ApplicationRef, Injector, Renderer2, ViewEncapsulation } from '@angular/core';
3
- import * as i1$3 from '@angular/common';
1
+ import { InjectionToken, EventEmitter, Component, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Optional, Input, Output, ViewChild, ɵɵdefineInjectable, ɵɵinject, Pipe, Injectable, Directive, Inject, NgModule, ElementRef, TemplateRef, ViewContainerRef, HostBinding, HostListener, ViewChildren, ComponentFactoryResolver, ApplicationRef, INJECTOR, Injector, Renderer2, ViewEncapsulation } from '@angular/core';
4
2
  import { CommonModule, DOCUMENT, Location } from '@angular/common';
5
3
  import { CdkTableModule } from '@angular/cdk/table';
6
4
  import { A11yModule } from '@angular/cdk/a11y';
7
5
  import { OverlayModule, OverlayContainer, FullscreenOverlayContainer, Overlay } from '@angular/cdk/overlay';
8
6
  import { ScrollingModule } from '@angular/cdk/scrolling';
9
- import * as i1$2 from '@angular/material/core';
10
7
  import { DateAdapter, MatCommonModule, MatRippleModule } from '@angular/material/core';
11
8
  import { MatTableModule, MatColumnDef, MatTable } from '@angular/material/table';
12
9
  import { MatSortModule, MatSort } from '@angular/material/sort';
@@ -30,22 +27,17 @@ import { MatProgressBarModule } from '@angular/material/progress-bar';
30
27
  import { MatRadioModule } from '@angular/material/radio';
31
28
  import { MatBadgeModule } from '@angular/material/badge';
32
29
  import { MatSlideToggleModule } from '@angular/material/slide-toggle';
33
- import * as i2$1 from '@angular/material/dialog';
34
30
  import { MatDialogModule, MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';
35
31
  import { MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteModule, MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MAT_AUTOCOMPLETE_DEFAULT_OPTIONS } from '@angular/material/autocomplete';
36
32
  import { __awaiter, __decorate } from 'tslib';
37
- import * as i1$6 from '@angular/forms';
38
33
  import { Validators, NG_VALUE_ACCESSOR, FormGroupDirective, AbstractControl, FormGroup, FormArray, FormControl, ReactiveFormsModule, FormBuilder } from '@angular/forms';
39
34
  import { timer, merge, fromEvent, BehaviorSubject, Subscription, Subject, isObservable, from, of, noop as noop$9, Observable, defer, forkJoin, interval, combineLatest, EMPTY } from 'rxjs';
40
35
  import { filter, takeUntil, map, first, switchMap, tap, debounceTime, startWith, distinctUntilChanged, mergeMap, catchError, throttleTime, skip, bufferWhen, take } from 'rxjs/operators';
41
36
  import { trigger, transition, style, animate, state } from '@angular/animations';
42
- import * as i1$1 from '@ngx-translate/core';
43
37
  import { TranslateService, TranslateModule } from '@ngx-translate/core';
44
- import * as i1$4 from '@ionic/angular';
45
38
  import { IonicModule, Platform, IonRouterOutlet, ModalController, PopoverController, IonicSafeString, createAnimation, ToastController, AlertController, IonicRouteStrategy, NavParams, MenuController, IonContent, IonItem, IonInfiniteScroll } from '@ionic/angular';
46
39
  import * as momentImported from 'moment';
47
40
  import { isMoment } from 'moment';
48
- import * as i1 from '@angular/material-moment-adapter';
49
41
  import { MomentDateAdapter, MatMomentDateModule } from '@angular/material-moment-adapter';
50
42
  import { Keyboard } from '@ionic-native/keyboard/ngx';
51
43
  import { TextMaskModule } from 'angular2-text-mask';
@@ -54,38 +46,32 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
54
46
  import { MatDividerModule } from '@angular/material/divider';
55
47
  import { MatTooltipModule } from '@angular/material/tooltip';
56
48
  import { MatChipsModule } from '@angular/material/chips';
57
- import * as i3$3 from '@angular/router';
58
49
  import { ActivatedRoute, Router, RouterModule, RouteReuseStrategy } from '@angular/router';
59
- import * as i1$5 from '@angular/platform-browser';
60
50
  import { HammerGestureConfig, EventManager } from '@angular/platform-browser';
61
- import * as i2$2 from '@angular/common/http';
62
51
  import { HttpResponse, HttpEventType, HttpClient, HttpHeaders, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
63
52
  import { ColorPickerModule } from 'ngx-color-picker';
64
- import { NativeAudio } from '@ionic-native/native-audio/ngx';
65
- import { Vibration } from '@ionic-native/vibration/ngx';
53
+ import { NativeAudio as NativeAudio$1 } from '@ionic-native/native-audio/ngx';
54
+ import { Vibration as Vibration$1 } from '@ionic-native/vibration/ngx';
66
55
  import { AudioManagement } from '@ionic-native/audio-management/ngx';
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';
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';
70
59
  import * as uuidv4Imported from 'uuid/v4';
71
60
  import { DragDropModule } from '@angular/cdk/drag-drop';
72
61
  import { MarkdownModule } from 'ngx-markdown';
73
62
  import { sign, box, hash, verify } from 'tweetnacl';
74
- import * as i3$1 from '@ionic/storage';
75
63
  import { Storage, IonicStorageModule } from '@ionic/storage';
76
64
  import 'zone.js/dist/zone-error';
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';
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';
85
72
  import { Platform as Platform$1 } from '@angular/cdk/platform';
86
- import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
73
+ import { InAppBrowser as InAppBrowser$1 } from '@ionic-native/in-app-browser/ngx';
87
74
  import { ApolloLink, NetworkStatus, InMemoryCache, ApolloClient, gql } from '@apollo/client/core';
88
- import * as i2$3 from 'apollo-angular';
89
75
  import { Apollo } from 'apollo-angular';
90
76
  import { WebSocketLink } from '@apollo/client/link/ws';
91
77
  import { getMainDefinition } from '@apollo/client/utilities';
@@ -93,14 +79,13 @@ import { RetryLink } from '@apollo/client/link/retry';
93
79
  import QueueLink from 'apollo-link-queue';
94
80
  import SerializingLink from 'apollo-link-serialize';
95
81
  import loggerLink from 'apollo-link-logger';
96
- import * as i3$2 from 'apollo-angular/http';
97
82
  import { HttpLink } from 'apollo-angular/http';
98
83
  import { IonicStorageWrapper, persistCache } from 'apollo3-cache-persist';
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';
84
+ import { NotificationVisibility, Downloader as Downloader$1 } from '@ionic-native/downloader/ngx';
85
+ import { StatusBar } from '@ionic-native/status-bar/ngx/index';
86
+ import { Keyboard as Keyboard$1 } from '@ionic-native/keyboard/ngx/index';
87
+ import { InAppBrowser } from '@ionic-native/in-app-browser/ngx/index';
88
+ import { Downloader } from '@ionic-native/downloader/ngx/index';
104
89
  import { CdkTextareaAutosize } from '@angular/cdk/text-field';
105
90
  import { ValidatorService, TableDataSource } from '@e-is/ngx-material-table';
106
91
  import { SelectionModel } from '@angular/cdk/collections';
@@ -1055,7 +1040,7 @@ const isIpad = (win) => {
1055
1040
  }
1056
1041
  return false;
1057
1042
  };
1058
- const ɵ0$c = isIpad;
1043
+ const ɵ0 = isIpad;
1059
1044
  const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
1060
1045
  const isAndroid = (win) => testUserAgent(win, /android|sink/i);
1061
1046
  const isCordova = (win) => {
@@ -1187,14 +1172,14 @@ class MatAutocompleteFieldUtils {
1187
1172
  return isNotNil(o1 === null || o1 === void 0 ? void 0 : o1.id) && o1.id === (o2 === null || o2 === void 0 ? void 0 : o2.id);
1188
1173
  }
1189
1174
  }
1190
- const noop$8 = (_) => { };
1191
- const ɵ0$b = noop$8;
1175
+ const noop = (_) => { };
1176
+ const ɵ0$1 = noop;
1192
1177
  class MatAutocompleteField {
1193
1178
  constructor(cd, formGroupDir) {
1194
1179
  this.cd = cd;
1195
1180
  this.formGroupDir = formGroupDir;
1196
- this._onChangeCallback = noop$8;
1197
- this._onTouchedCallback = noop$8;
1181
+ this._onChangeCallback = noop;
1182
+ this._onTouchedCallback = noop;
1198
1183
  this.logPrefix = '[mat-autocomplete] ';
1199
1184
  this.formControlName = null;
1200
1185
  this.required = false;
@@ -1877,7 +1862,7 @@ MatAutocompleteField.decorators = [
1877
1862
  { type: Component, args: [{
1878
1863
  // eslint-disable-next-line @angular-eslint/component-selector
1879
1864
  selector: 'mat-autocomplete-field',
1880
- template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [title]=\"displayValue\"\n class=\"mat-form-field-disabled\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\" >\n <ion-text>{{displayWith(value)}}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n\n <ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Mobile or Multiple (use <mat-select>) -->\n <mat-select #matSelect\n *ngIf=\"mobile || multiple; else desktopTemplate\"\n [disableRipple]=\"true\"\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)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- Search bar -->\n <mat-option class=\"mat-select-searchbar\" *ngIf=\"showSearchBar\"\n [class.mat-select-searchbar-sticky]=\"stickySearchBar\"\n disabled>\n <ion-searchbar #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"true\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"markAsLoading()\"\n (ionChange)=\"ionSearchBarChanged($event, $event.detail.value)\"\n [placeholder]=\"'COMMON.BTN_SEARCH'|translate\"\n ></ion-searchbar>\n </mat-option>\n\n <!-- Headers -->\n <ion-row class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [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 && !multiple && !clearable\" 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 as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></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 [innerHTML]=\"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\n <!-- footer -->\n <mat-option *ngIf=\"itemCount as count\" class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </mat-option>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | 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-select>\n\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 #desktopTemplate>\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)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowdown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- Options -->\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></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=\"(displayValue | 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\n <!-- footer -->\n <ion-row *ngIf=\"itemCount; let count\" class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text 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 </mat-autocomplete>\n\n </ng-template>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\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 </ng-template>\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</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"!mobile && !multiple\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</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 select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #headers>\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n</ng-template>\n\n",
1865
+ template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [title]=\"displayValue\"\n class=\"mat-form-field-disabled\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\" >\n <ion-text>{{displayWith(value)}}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n\n <ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Mobile or Multiple (use <mat-select>) -->\n <mat-select #matSelect\n *ngIf=\"mobile || multiple; else desktopTemplate\"\n [disableRipple]=\"true\"\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)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- Search bar -->\n <mat-option class=\"mat-select-searchbar\" *ngIf=\"showSearchBar\"\n [class.mat-select-searchbar-sticky]=\"stickySearchBar\"\n disabled>\n <ion-searchbar #ionSearchbar\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"true\"\n showClearButton=\"true\"\n [debounce]=\"debounceTime\"\n (ionClear)=\"markAsLoading()\"\n (ionInput)=\"markAsLoading()\"\n (ionChange)=\"ionSearchBarChanged($event, $event.detail.value)\"\n [placeholder]=\"'COMMON.BTN_SEARCH'|translate\"\n ></ion-searchbar>\n </mat-option>\n\n <!-- Headers -->\n <ion-row class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [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 && !multiple && !clearable\" 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 as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></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 [innerHTML]=\"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\n <!-- footer -->\n <mat-option *ngIf=\"itemCount as count\" class=\"mat-option-footer mat-autocomplete-footer ion-no-padding\" disabled>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </mat-option>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | 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-select>\n\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 #desktopTemplate>\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)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowdown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- Options -->\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></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 [title]=\"text.innerText\">\n <ion-text><span #text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></span></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=\"(displayValue | 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\n <!-- footer -->\n <ion-row *ngIf=\"itemCount; let count\" class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text 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 </mat-autocomplete>\n\n </ng-template>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\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 </ng-template>\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</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"!mobile && !multiple\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</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 select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #headers>\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n</ng-template>\n\n",
1881
1866
  providers: [{
1882
1867
  provide: NG_VALUE_ACCESSOR,
1883
1868
  multi: true,
@@ -1967,7 +1952,7 @@ class DateFormatPipe {
1967
1952
  return isMoment(value) ? value : this.dateAdapter.parse(value, parseFormat || DATE_ISO_PATTERN);
1968
1953
  }
1969
1954
  }
1970
- DateFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(i0.ɵɵinject(i1.MomentDateAdapter), i0.ɵɵinject(i1$1.TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1955
+ DateFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFormatPipe_Factory() { return new DateFormatPipe(ɵɵinject(MomentDateAdapter), ɵɵinject(TranslateService)); }, token: DateFormatPipe, providedIn: "root" });
1971
1956
  DateFormatPipe.decorators = [
1972
1957
  { type: Pipe, args: [{
1973
1958
  name: 'dateFormat'
@@ -1979,7 +1964,7 @@ DateFormatPipe.ctorParameters = () => [
1979
1964
  { type: TranslateService }
1980
1965
  ];
1981
1966
 
1982
- const moment$a = momentImported;
1967
+ const moment = momentImported;
1983
1968
  class DateDiffDurationPipe {
1984
1969
  constructor(dateAdapter, translate) {
1985
1970
  this.dateAdapter = dateAdapter;
@@ -1995,11 +1980,11 @@ class DateDiffDurationPipe {
1995
1980
  return this.format(startDate, endDate, args);
1996
1981
  }
1997
1982
  format(startDate, endDate, args) {
1998
- const duration = moment$a.duration(endDate.diff(startDate));
1983
+ const duration = moment.duration(endDate.diff(startDate));
1999
1984
  if (duration.asMinutes() < 0)
2000
1985
  return '';
2001
1986
  const withSeconds = args === null || args === void 0 ? void 0 : args.seconds;
2002
- const timeDuration = moment$a(0)
1987
+ const timeDuration = moment(0)
2003
1988
  .hour(duration.hours())
2004
1989
  .minute(duration.minutes());
2005
1990
  if (withSeconds) {
@@ -2009,7 +1994,7 @@ class DateDiffDurationPipe {
2009
1994
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + timeDuration.format(withSeconds ? 'HH:mm:ss' : 'HH:mm');
2010
1995
  }
2011
1996
  }
2012
- 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" });
1997
+ DateDiffDurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateDiffDurationPipe_Factory() { return new DateDiffDurationPipe(ɵɵinject(DateAdapter), ɵɵinject(TranslateService)); }, token: DateDiffDurationPipe, providedIn: "root" });
2013
1998
  DateDiffDurationPipe.decorators = [
2014
1999
  { type: Pipe, args: [{
2015
2000
  name: 'dateDiffDuration'
@@ -2030,7 +2015,7 @@ class DateFromNowPipe {
2030
2015
  return date ? date.fromNow(args && args.withoutSuffix) : '';
2031
2016
  }
2032
2017
  }
2033
- DateFromNowPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(i0.ɵɵinject(i1.MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
2018
+ DateFromNowPipe.ɵprov = ɵɵdefineInjectable({ factory: function DateFromNowPipe_Factory() { return new DateFromNowPipe(ɵɵinject(MomentDateAdapter)); }, token: DateFromNowPipe, providedIn: "root" });
2034
2019
  DateFromNowPipe.decorators = [
2035
2020
  { type: Pipe, args: [{
2036
2021
  name: 'dateFromNow'
@@ -2099,7 +2084,7 @@ function formatToDD(value, opts) {
2099
2084
  value *= -1;
2100
2085
  }
2101
2086
  }
2102
- let degrees = roundFloat$1(value, opts.maxDecimals).toString();
2087
+ let degrees = roundFloat(value, opts.maxDecimals).toString();
2103
2088
  // Add sign
2104
2089
  let sign = negative ? '-' : '+';
2105
2090
  if (opts.placeholderChar) {
@@ -2150,7 +2135,7 @@ function formatToDDMMSS(value, opts) {
2150
2135
  }
2151
2136
  let degrees = Math.trunc(value);
2152
2137
  let minutes = Math.trunc((value - degrees) * 60);
2153
- let seconds = roundFloat$1(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
2138
+ let seconds = roundFloat(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals);
2154
2139
  while (seconds >= 60) {
2155
2140
  seconds -= 60;
2156
2141
  minutes += 1;
@@ -2218,7 +2203,7 @@ function formatToDDMM(value, opts) {
2218
2203
  }
2219
2204
  }
2220
2205
  let degrees = Math.trunc(value);
2221
- let minutes = roundFloat$1((value - degrees) * 60, opts.maxDecimals);
2206
+ let minutes = roundFloat((value - degrees) * 60, opts.maxDecimals);
2222
2207
  while (minutes >= 60) {
2223
2208
  minutes -= 60;
2224
2209
  degrees += 1;
@@ -2269,15 +2254,15 @@ function parseLatitudeOrLongitude(input, pattern, maxDecimals, placeholderChar)
2269
2254
  return NaN;
2270
2255
  }
2271
2256
  if (pattern === 'DD')
2272
- return roundFloat$1(degrees, maxDecimals);
2257
+ return roundFloat(degrees, maxDecimals);
2273
2258
  const minutes = (pattern === 'DDMMSS' || pattern === 'DDMM') && parts[1] && parseFloat(parts[1].replace(/,/g, '.')) || 0;
2274
2259
  const seconds = (pattern === 'DDMMSS') && parts[2] && parseFloat(parts[2].replace(/,/g, '.')) || 0;
2275
2260
  const direction = ((pattern === 'DDMMSS') && parts[3]) || ((pattern === 'DDMM') && parts[2]) || undefined;
2276
2261
  const sign = (direction && (direction === 's' || direction === 'S' || direction === 'w' || direction === 'W')) ? -1 : 1;
2277
2262
  degrees = sign * (degrees + minutes / 60 + seconds / (60 * 60));
2278
- return roundFloat$1(degrees, maxDecimals);
2263
+ return roundFloat(degrees, maxDecimals);
2279
2264
  }
2280
- function roundFloat$1(input, maxDecimals) {
2265
+ function roundFloat(input, maxDecimals) {
2281
2266
  if (maxDecimals > 0) {
2282
2267
  const powDecimal = Math.pow(10, maxDecimals);
2283
2268
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -2338,7 +2323,7 @@ class NumberFormatPipe {
2338
2323
  }
2339
2324
  }
2340
2325
  }
2341
- NumberFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2326
+ NumberFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function NumberFormatPipe_Factory() { return new NumberFormatPipe(); }, token: NumberFormatPipe, providedIn: "root" });
2342
2327
  NumberFormatPipe.decorators = [
2343
2328
  { type: Pipe, args: [{
2344
2329
  name: 'numberFormat'
@@ -2378,7 +2363,7 @@ class HighlightPipe {
2378
2363
  }
2379
2364
  }
2380
2365
  }
2381
- HighlightPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2366
+ HighlightPipe.ɵprov = ɵɵdefineInjectable({ factory: function HighlightPipe_Factory() { return new HighlightPipe(); }, token: HighlightPipe, providedIn: "root" });
2382
2367
  HighlightPipe.decorators = [
2383
2368
  { type: Pipe, args: [{
2384
2369
  name: 'highlight'
@@ -2443,7 +2428,7 @@ FileSizePipe.decorators = [
2443
2428
  { type: Pipe, args: [{ name: 'fileSize' },] }
2444
2429
  ];
2445
2430
 
2446
- const moment$9 = momentImported;
2431
+ const moment$1 = momentImported;
2447
2432
  const DATE_UNIX_TIMESTAMP = 'X';
2448
2433
  const DATE_UNIX_MS_TIMESTAMP = 'x';
2449
2434
  const MOMENT_NO_TIME_PROPERTY = '_hasNoTime';
@@ -2532,37 +2517,37 @@ function fromDateISOString(value) {
2532
2517
  return value;
2533
2518
  if (typeof value === 'string' && value.length === 10) {
2534
2519
  // Parse the input value, as a date only
2535
- const dateOnly = moment$9(value, DATE_PATTERN);
2520
+ const dateOnly = moment$1(value, DATE_PATTERN);
2536
2521
  if (dateOnly.isValid())
2537
2522
  return DateUtils.markNoTime(dateOnly);
2538
2523
  }
2539
2524
  // Parse the input value, as a ISO date time
2540
- const date = moment$9(value, DATE_ISO_PATTERN);
2525
+ const date = moment$1(value, DATE_ISO_PATTERN);
2541
2526
  if (date.isValid())
2542
2527
  return date;
2543
2528
  // Not valid: trying to convert from unix timestamp
2544
2529
  if (typeof value === 'string') {
2545
2530
  console.warn('Wrong date format - Trying to convert from local time: ' + value);
2546
2531
  if (value.length === 10) {
2547
- return moment$9(value, DATE_UNIX_TIMESTAMP);
2532
+ return moment$1(value, DATE_UNIX_TIMESTAMP);
2548
2533
  }
2549
2534
  else if (value.length === 13) {
2550
- return moment$9(value, DATE_UNIX_MS_TIMESTAMP);
2535
+ return moment$1(value, DATE_UNIX_MS_TIMESTAMP);
2551
2536
  }
2552
2537
  }
2553
2538
  console.warn('Unable to parse date: ' + value);
2554
2539
  return undefined;
2555
2540
  }
2556
2541
  function fromUnixTimestamp(timeInSec) {
2557
- return moment$9(timeInSec, DATE_UNIX_TIMESTAMP);
2542
+ return moment$1(timeInSec, DATE_UNIX_TIMESTAMP);
2558
2543
  }
2559
2544
  function fromUnixMsTimestamp(timeInMs) {
2560
- return moment$9(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2545
+ return moment$1(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2561
2546
  }
2562
2547
  function toDuration(value, unit) {
2563
2548
  if (!value)
2564
2549
  return undefined;
2565
- const duration = moment$9.duration(value, unit);
2550
+ const duration = moment$1.duration(value, unit);
2566
2551
  // fix 990+ ms
2567
2552
  if (duration.milliseconds() >= 990) {
2568
2553
  duration.add(1000 - duration.milliseconds(), 'ms');
@@ -2591,7 +2576,7 @@ class DurationPipe {
2591
2576
  return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + hour + ':' + minute;
2592
2577
  }
2593
2578
  }
2594
- DurationPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(i0.ɵɵinject(i1$1.TranslateService)); }, token: DurationPipe, providedIn: "root" });
2579
+ DurationPipe.ɵprov = ɵɵdefineInjectable({ factory: function DurationPipe_Factory() { return new DurationPipe(ɵɵinject(TranslateService)); }, token: DurationPipe, providedIn: "root" });
2595
2580
  DurationPipe.decorators = [
2596
2581
  { type: Pipe, args: [{
2597
2582
  name: 'duration'
@@ -2612,7 +2597,7 @@ class MathAbsPipe {
2612
2597
  }
2613
2598
  }
2614
2599
  }
2615
- MathAbsPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2600
+ MathAbsPipe.ɵprov = ɵɵdefineInjectable({ factory: function MathAbsPipe_Factory() { return new MathAbsPipe(); }, token: MathAbsPipe, providedIn: "root" });
2616
2601
  MathAbsPipe.decorators = [
2617
2602
  { type: Pipe, args: [{
2618
2603
  name: 'mathAbs'
@@ -2624,7 +2609,7 @@ class EvenPipe {
2624
2609
  return val % 2 === 0;
2625
2610
  }
2626
2611
  }
2627
- EvenPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2612
+ EvenPipe.ɵprov = ɵɵdefineInjectable({ factory: function EvenPipe_Factory() { return new EvenPipe(); }, token: EvenPipe, providedIn: "root" });
2628
2613
  EvenPipe.decorators = [
2629
2614
  { type: Pipe, args: [{
2630
2615
  name: 'even'
@@ -2636,7 +2621,7 @@ class OddPipe {
2636
2621
  return val % 2 !== 0;
2637
2622
  }
2638
2623
  }
2639
- OddPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2624
+ OddPipe.ɵprov = ɵɵdefineInjectable({ factory: function OddPipe_Factory() { return new OddPipe(); }, token: OddPipe, providedIn: "root" });
2640
2625
  OddPipe.decorators = [
2641
2626
  { type: Pipe, args: [{
2642
2627
  name: 'odd'
@@ -2744,7 +2729,7 @@ class MapGetPipe {
2744
2729
  return val[key];
2745
2730
  }
2746
2731
  }
2747
- MapGetPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2732
+ MapGetPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapGetPipe_Factory() { return new MapGetPipe(); }, token: MapGetPipe, providedIn: "root" });
2748
2733
  MapGetPipe.decorators = [
2749
2734
  { type: Pipe, args: [{
2750
2735
  name: 'mapGet'
@@ -2758,7 +2743,7 @@ class MapKeysPipe {
2758
2743
  return Object.keys(map);
2759
2744
  }
2760
2745
  }
2761
- MapKeysPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2746
+ MapKeysPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapKeysPipe_Factory() { return new MapKeysPipe(); }, token: MapKeysPipe, providedIn: "root" });
2762
2747
  MapKeysPipe.decorators = [
2763
2748
  { type: Pipe, args: [{
2764
2749
  name: 'mapKeys'
@@ -2772,7 +2757,7 @@ class MapValuesPipe {
2772
2757
  return Object.values(map);
2773
2758
  }
2774
2759
  }
2775
- MapValuesPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2760
+ MapValuesPipe.ɵprov = ɵɵdefineInjectable({ factory: function MapValuesPipe_Factory() { return new MapValuesPipe(); }, token: MapValuesPipe, providedIn: "root" });
2776
2761
  MapValuesPipe.decorators = [
2777
2762
  { type: Pipe, args: [{
2778
2763
  name: 'mapValues'
@@ -2900,7 +2885,7 @@ class TranslateContextService {
2900
2885
  return translations[keys[keys.length - 1]]; // Return the last keys translation
2901
2886
  }
2902
2887
  }
2903
- TranslateContextService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(i0.ɵɵinject(i1$1.TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2888
+ TranslateContextService.ɵprov = ɵɵdefineInjectable({ factory: function TranslateContextService_Factory() { return new TranslateContextService(ɵɵinject(TranslateService)); }, token: TranslateContextService, providedIn: "root" });
2904
2889
  TranslateContextService.decorators = [
2905
2890
  { type: Injectable, args: [{ providedIn: 'root' },] }
2906
2891
  ];
@@ -2958,7 +2943,7 @@ NgInitDirective.propDecorators = {
2958
2943
  ngInit: [{ type: Output }]
2959
2944
  };
2960
2945
 
2961
- const moment$8 = momentImported;
2946
+ const moment$2 = momentImported;
2962
2947
  // @dynamic
2963
2948
  class SharedValidators {
2964
2949
  static getDoubleRegexp(maxDecimals) {
@@ -3039,7 +3024,7 @@ class SharedValidators {
3039
3024
  }
3040
3025
  static validDate(control) {
3041
3026
  const value = control.value;
3042
- const date = !value || moment$8.isMoment(value) ? value : moment$8(value, DATE_ISO_PATTERN);
3027
+ const date = !value || moment$2.isMoment(value) ? value : moment$2(value, DATE_ISO_PATTERN);
3043
3028
  if (date && (!date.isValid() || date.year() < 1970)) {
3044
3029
  return { validDate: true };
3045
3030
  }
@@ -4164,7 +4149,7 @@ class FormErrorTranslator {
4164
4149
  return errorKey;
4165
4150
  }
4166
4151
  }
4167
- FormErrorTranslator.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormErrorTranslator_Factory() { return new FormErrorTranslator(i0.ɵɵinject(i1$1.TranslateService), i0.ɵɵinject(APP_FORM_ERROR_I18N_KEYS, 8)); }, token: FormErrorTranslator, providedIn: "root" });
4152
+ FormErrorTranslator.ɵprov = ɵɵdefineInjectable({ factory: function FormErrorTranslator_Factory() { return new FormErrorTranslator(ɵɵinject(TranslateService), ɵɵinject(APP_FORM_ERROR_I18N_KEYS, 8)); }, token: FormErrorTranslator, providedIn: "root" });
4168
4153
  FormErrorTranslator.decorators = [
4169
4154
  { type: Injectable, args: [{ providedIn: 'root' },] }
4170
4155
  ];
@@ -4426,7 +4411,7 @@ class PropertyFormatPipe {
4426
4411
  return this._i18nNo;
4427
4412
  }
4428
4413
  }
4429
- PropertyFormatPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PropertyFormatPipe_Factory() { return new PropertyFormatPipe(i0.ɵɵinject(DateFormatPipe), i0.ɵɵinject(i1$1.TranslateService)); }, token: PropertyFormatPipe, providedIn: "root" });
4414
+ PropertyFormatPipe.ɵprov = ɵɵdefineInjectable({ factory: function PropertyFormatPipe_Factory() { return new PropertyFormatPipe(ɵɵinject(DateFormatPipe), ɵɵinject(TranslateService)); }, token: PropertyFormatPipe, providedIn: "root" });
4430
4415
  PropertyFormatPipe.decorators = [
4431
4416
  { type: Pipe, args: [{
4432
4417
  name: 'propertyFormat'
@@ -4792,9 +4777,9 @@ function parseDuration(input, maxDecimals, placeholderChar) {
4792
4777
  const hour = parseInt(durationParts[0] || '0');
4793
4778
  const minute = parseInt(durationParts[1] || '0');
4794
4779
  const value = hour + (minute + 0.5) / 60;
4795
- return roundFloat(value, maxDecimals);
4780
+ return roundFloat$1(value, maxDecimals);
4796
4781
  }
4797
- function roundFloat(input, maxDecimals) {
4782
+ function roundFloat$1(input, maxDecimals) {
4798
4783
  if (maxDecimals > 0) {
4799
4784
  const powDecimal = Math.pow(10, maxDecimals);
4800
4785
  return Math.trunc(input * powDecimal + 0.5) / powDecimal;
@@ -4818,16 +4803,16 @@ const MASKS = {
4818
4803
  DD: [/[+-]/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '°']
4819
4804
  }
4820
4805
  };
4821
- const noop$7 = () => {
4806
+ const noop$1 = () => {
4822
4807
  };
4823
- const ɵ0$a = noop$7;
4808
+ const ɵ0$2 = noop$1;
4824
4809
  class MatLatLongField {
4825
4810
  constructor(formBuilder, cd, formGroupDir) {
4826
4811
  this.formBuilder = formBuilder;
4827
4812
  this.cd = cd;
4828
4813
  this.formGroupDir = formGroupDir;
4829
- this._onChangeCallback = noop$7;
4830
- this._onTouchedCallback = noop$7;
4814
+ this._onChangeCallback = noop$1;
4815
+ this._onTouchedCallback = noop$1;
4831
4816
  this._subscription = new Subscription();
4832
4817
  this._disabling = false;
4833
4818
  this._writing = false;
@@ -5172,14 +5157,14 @@ SharedMatLatLongModule.decorators = [
5172
5157
  },] }
5173
5158
  ];
5174
5159
 
5175
- const DEFAULT_VALUE_ACCESSOR$5 = {
5160
+ const DEFAULT_VALUE_ACCESSOR = {
5176
5161
  provide: NG_VALUE_ACCESSOR,
5177
5162
  useExisting: forwardRef(() => MatDate),
5178
5163
  multi: true
5179
5164
  };
5180
5165
  const TEXT_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5181
- const noop$6 = () => { };
5182
- const ɵ0$9 = noop$6;
5166
+ const noop$2 = () => { };
5167
+ const ɵ0$3 = noop$2;
5183
5168
  class MatDate {
5184
5169
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5185
5170
  this.dateAdapter = dateAdapter;
@@ -5188,8 +5173,8 @@ class MatDate {
5188
5173
  this.cd = cd;
5189
5174
  this.keyboard = keyboard;
5190
5175
  this.formGroupDir = formGroupDir;
5191
- this._onChangeCallback = noop$6;
5192
- this._onTouchedCallback = noop$6;
5176
+ this._onChangeCallback = noop$2;
5177
+ this._onTouchedCallback = noop$2;
5193
5178
  this._subscription = new Subscription();
5194
5179
  this._writing = true;
5195
5180
  this._disabling = false;
@@ -5495,7 +5480,7 @@ MatDate.decorators = [
5495
5480
  selector: 'mat-date-field',
5496
5481
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: datePattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: mask, 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]=\"textControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\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)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\" [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\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 </mat-form-field>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"\n ></mat-datepicker>\n\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\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
5497
5482
  providers: [
5498
- DEFAULT_VALUE_ACCESSOR$5,
5483
+ DEFAULT_VALUE_ACCESSOR,
5499
5484
  ],
5500
5485
  changeDetection: ChangeDetectionStrategy.OnPush,
5501
5486
  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%}"]
@@ -5530,16 +5515,16 @@ MatDate.propDecorators = {
5530
5515
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5531
5516
  };
5532
5517
 
5533
- const DEFAULT_VALUE_ACCESSOR$4 = {
5518
+ const DEFAULT_VALUE_ACCESSOR$1 = {
5534
5519
  provide: NG_VALUE_ACCESSOR,
5535
5520
  useExisting: forwardRef(() => MatDateTime),
5536
5521
  multi: true
5537
5522
  };
5538
- const DAY_MASK$1 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5523
+ const DAY_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5539
5524
  const HOUR_REGEXP = /^[012][0-9][:][012345][0-9]$/;
5540
- const HOUR_MASK$1 = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5541
- const noop$5 = () => { };
5542
- const ɵ0$8 = noop$5;
5525
+ const HOUR_MASK = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5526
+ const noop$3 = () => { };
5527
+ const ɵ0$4 = noop$3;
5543
5528
  class MatDateTime {
5544
5529
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5545
5530
  this.dateAdapter = dateAdapter;
@@ -5548,14 +5533,14 @@ class MatDateTime {
5548
5533
  this.cd = cd;
5549
5534
  this.keyboard = keyboard;
5550
5535
  this.formGroupDir = formGroupDir;
5551
- this._onChangeCallback = noop$5;
5552
- this._onTouchedCallback = noop$5;
5536
+ this._onChangeCallback = noop$3;
5537
+ this._onTouchedCallback = noop$3;
5553
5538
  this._subscription = new Subscription();
5554
5539
  this._writing = true;
5555
5540
  this._disabling = false;
5556
5541
  this._readonly = false;
5557
- this.dayMask = DAY_MASK$1;
5558
- this.hourMask = HOUR_MASK$1;
5542
+ this.dayMask = DAY_MASK;
5543
+ this.hourMask = HOUR_MASK;
5559
5544
  this.floatLabel = 'auto';
5560
5545
  this.compact = false;
5561
5546
  this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
@@ -5876,7 +5861,7 @@ MatDateTime.decorators = [
5876
5861
  selector: 'mat-date-time-field',
5877
5862
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\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 mat-form-field-{{appearance}}\">\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 [appearance]=\"appearance\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </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 input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\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)=\"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=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</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 [appearance]=\"appearance\"\n [class.mat-form-field-invalid]=\"formControl.touched && (hourControl.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]=\"hourControl\"\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]=\"hourControl\"\n (click)=\"openTimePickerIfMobile($event)\"\n readonly>\n\n <input matInput type=\"text\"\n [formControl]=\"hourControl\"\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\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
5878
5863
  providers: [
5879
- DEFAULT_VALUE_ACCESSOR$4,
5864
+ DEFAULT_VALUE_ACCESSOR$1,
5880
5865
  ],
5881
5866
  changeDetection: ChangeDetectionStrategy.OnPush,
5882
5867
  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}.mat-form-field-outline ion-col.day{min-width:153px}.mat-form-field-outline ion-col.hour{min-width:100px;max-width:110px}.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%}"]
@@ -5911,15 +5896,15 @@ MatDateTime.propDecorators = {
5911
5896
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5912
5897
  };
5913
5898
 
5914
- const DEFAULT_VALUE_ACCESSOR$3 = {
5899
+ const DEFAULT_VALUE_ACCESSOR$2 = {
5915
5900
  provide: NG_VALUE_ACCESSOR,
5916
5901
  useExisting: forwardRef(() => MatDateShort),
5917
5902
  multi: true
5918
5903
  };
5919
- const DAY_MASK = [/\d/, /\d/, /\d/, /\d/];
5904
+ const DAY_MASK$1 = [/\d/, /\d/, /\d/, /\d/];
5920
5905
  const noop$4 = () => {
5921
5906
  };
5922
- const ɵ0$7 = noop$4;
5907
+ const ɵ0$5 = noop$4;
5923
5908
  class MatDateShort {
5924
5909
  constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5925
5910
  this.dateAdapter = dateAdapter;
@@ -5932,7 +5917,7 @@ class MatDateShort {
5932
5917
  this._onTouchedCallback = noop$4;
5933
5918
  this.writing = true;
5934
5919
  this.disabling = false;
5935
- this.dayMask = DAY_MASK;
5920
+ this.dayMask = DAY_MASK$1;
5936
5921
  this.disabled = false;
5937
5922
  this.floatLabel = 'auto';
5938
5923
  this.readonly = false;
@@ -6177,7 +6162,7 @@ MatDateShort.decorators = [
6177
6162
  selector: 'mat-date-short-field',
6178
6163
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\">\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_YEAR_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker1)\"\n (keyup.escape)=\"preventEvent($event)\"\n (click)=\"matInput.select()\"\n [required]=\"required\"\n [tabindex]=\"tabindex\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker1)\"\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]=\"datePicker1\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n (click)=\"openDatePicker($event, datePicker1)\"\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.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\" [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <mat-datepicker #datePicker1\n startView=\"multi-year\"\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n (yearSelected)=\"closeDatePicker($event, datePicker1)\"\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<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
6179
6164
  providers: [
6180
- DEFAULT_VALUE_ACCESSOR$3,
6165
+ DEFAULT_VALUE_ACCESSOR$2,
6181
6166
  ],
6182
6167
  changeDetection: ChangeDetectionStrategy.OnPush,
6183
6168
  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%}"]
@@ -6246,16 +6231,16 @@ SharedMatDateTimeModule.decorators = [
6246
6231
  },] }
6247
6232
  ];
6248
6233
 
6249
- const DEFAULT_VALUE_ACCESSOR$2 = {
6234
+ const DEFAULT_VALUE_ACCESSOR$3 = {
6250
6235
  provide: NG_VALUE_ACCESSOR,
6251
6236
  useExisting: forwardRef(() => MatDuration),
6252
6237
  multi: true
6253
6238
  };
6254
6239
  const HOUR_TIME_PATTERN = /[0-9]\d\d:[0-5]\d/;
6255
- const HOUR_MASK = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
6256
- const noop$3 = () => {
6240
+ const HOUR_MASK$1 = [/\d/, /\d/, /\d/, ':', /[0-5]/, /\d/];
6241
+ const noop$5 = () => {
6257
6242
  };
6258
- const ɵ0$6 = noop$3;
6243
+ const ɵ0$6 = noop$5;
6259
6244
  class MatDuration {
6260
6245
  constructor(platform, dateAdapter, translate, formBuilder, cd, formGroupDir) {
6261
6246
  this.dateAdapter = dateAdapter;
@@ -6264,11 +6249,11 @@ class MatDuration {
6264
6249
  this.cd = cd;
6265
6250
  this.formGroupDir = formGroupDir;
6266
6251
  this._subscription = new Subscription();
6267
- this._onChangeCallback = noop$3;
6268
- this._onTouchedCallback = noop$3;
6252
+ this._onChangeCallback = noop$5;
6253
+ this._onTouchedCallback = noop$5;
6269
6254
  this.writing = true;
6270
6255
  this.disabling = false;
6271
- this.hourMask = HOUR_MASK;
6256
+ this.hourMask = HOUR_MASK$1;
6272
6257
  this.disabled = false;
6273
6258
  this.floatLabel = 'auto';
6274
6259
  this.readonly = false;
@@ -6448,7 +6433,7 @@ MatDuration.decorators = [
6448
6433
  selector: 'mat-duration-field',
6449
6434
  template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\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 [appearance]=\"appearance\"\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",
6450
6435
  providers: [
6451
- DEFAULT_VALUE_ACCESSOR$2,
6436
+ DEFAULT_VALUE_ACCESSOR$3,
6452
6437
  ],
6453
6438
  changeDetection: ChangeDetectionStrategy.OnPush,
6454
6439
  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%}"]
@@ -6506,22 +6491,22 @@ SharedMatDurationModule.decorators = [
6506
6491
  },] }
6507
6492
  ];
6508
6493
 
6509
- const DEFAULT_VALUE_ACCESSOR$1 = {
6494
+ const DEFAULT_VALUE_ACCESSOR$4 = {
6510
6495
  provide: NG_VALUE_ACCESSOR,
6511
6496
  useExisting: forwardRef(() => MatBooleanField),
6512
6497
  multi: true
6513
6498
  };
6514
- const noop$2 = () => {
6499
+ const noop$6 = () => {
6515
6500
  };
6516
- const ɵ0$5 = noop$2;
6501
+ const ɵ0$7 = noop$6;
6517
6502
  class MatBooleanField {
6518
6503
  constructor(translate, formBuilder, cd, formGroupDir) {
6519
6504
  this.translate = translate;
6520
6505
  this.formBuilder = formBuilder;
6521
6506
  this.cd = cd;
6522
6507
  this.formGroupDir = formGroupDir;
6523
- this._onChangeCallback = noop$2;
6524
- this._onTouchedCallback = noop$2;
6508
+ this._onChangeCallback = noop$6;
6509
+ this._onTouchedCallback = noop$6;
6525
6510
  this._writing = false;
6526
6511
  this.showRadio = false;
6527
6512
  this.disabled = false;
@@ -6684,7 +6669,7 @@ MatBooleanField.decorators = [
6684
6669
  selector: 'mat-boolean-field',
6685
6670
  template: "<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{(value == null ? 'COMMON.EMPTY_OPTION' : (value === true ? yesLabel : noLabel)) | translate }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\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 [appearance]=\"appearance\"\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 <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\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 <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Checkbox -->\n <mat-form-field *ngSwitchCase=\"'checkbox'\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{classList}}\">\n <mat-label *ngIf=\"placeholder && !showRadio\">\n {{placeholder}}\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\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===null\"\n [hidden]=\"!showRadio\"\n [tabindex]=\"tabindex\">\n </mat-checkbox>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Buttons -->\n <mat-form-field *ngSwitchCase=\"'button'\"\n [floatLabel]=\"floatLabel === 'never' ? 'never' : 'always'\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-button {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\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 <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n </ng-container>\n\n</ng-template>\n\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
6686
6671
  providers: [
6687
- DEFAULT_VALUE_ACCESSOR$1
6672
+ DEFAULT_VALUE_ACCESSOR$4
6688
6673
  ],
6689
6674
  changeDetection: ChangeDetectionStrategy.OnPush,
6690
6675
  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}"]
@@ -6931,7 +6916,7 @@ class MatNumpadDomService {
6931
6916
  this.appRef.detachView(this.componentRef.hostView);
6932
6917
  }
6933
6918
  }
6934
- 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" });
6919
+ MatNumpadDomService.ɵprov = ɵɵdefineInjectable({ factory: function MatNumpadDomService_Factory() { return new MatNumpadDomService(ɵɵinject(ComponentFactoryResolver), ɵɵinject(ApplicationRef), ɵɵinject(INJECTOR), ɵɵinject(DOCUMENT, 8)); }, token: MatNumpadDomService, providedIn: "root" });
6935
6920
  MatNumpadDomService.decorators = [
6936
6921
  { type: Injectable, args: [{
6937
6922
  providedIn: 'root'
@@ -7295,7 +7280,7 @@ SharedMatNumpadModule.decorators = [
7295
7280
  },] }
7296
7281
  ];
7297
7282
 
7298
- const DEFAULT_VALUE_ACCESSOR = {
7283
+ const DEFAULT_VALUE_ACCESSOR$5 = {
7299
7284
  provide: NG_VALUE_ACCESSOR,
7300
7285
  useExisting: forwardRef(() => MatSwipeField),
7301
7286
  multi: true
@@ -7558,7 +7543,7 @@ MatSwipeField.decorators = [
7558
7543
  { type: Component, args: [{
7559
7544
  selector: 'mat-swipe-field',
7560
7545
  template: "<mat-form-field [floatLabel]=\"showSlides && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n [appearance]=\"appearance\"\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",
7561
- providers: [DEFAULT_VALUE_ACCESSOR],
7546
+ providers: [DEFAULT_VALUE_ACCESSOR$5],
7562
7547
  changeDetection: ChangeDetectionStrategy.OnPush,
7563
7548
  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}"]
7564
7549
  },] }
@@ -7617,14 +7602,14 @@ SharedMatSwipeModule.decorators = [
7617
7602
  },] }
7618
7603
  ];
7619
7604
 
7620
- const noop$1 = () => { };
7621
- const ɵ0$4 = noop$1;
7605
+ const noop$7 = () => { };
7606
+ const ɵ0$8 = noop$7;
7622
7607
  class MatChipsField {
7623
7608
  constructor(cd, formGroupDir) {
7624
7609
  this.cd = cd;
7625
7610
  this.formGroupDir = formGroupDir;
7626
- this._onChangeCallback = noop$1;
7627
- this._onTouchedCallback = noop$1;
7611
+ this._onChangeCallback = noop$7;
7612
+ this._onTouchedCallback = noop$7;
7628
7613
  this.logPrefix = '[mat-chips] ';
7629
7614
  this.formControlName = null;
7630
7615
  this.required = false;
@@ -8496,7 +8481,7 @@ class ProgressBarService {
8496
8481
  }
8497
8482
  }
8498
8483
  }
8499
- ProgressBarService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8484
+ ProgressBarService.ɵprov = ɵɵdefineInjectable({ factory: function ProgressBarService_Factory() { return new ProgressBarService(); }, token: ProgressBarService, providedIn: "root" });
8500
8485
  ProgressBarService.decorators = [
8501
8486
  { type: Injectable, args: [{ providedIn: 'root' },] }
8502
8487
  ];
@@ -8540,7 +8525,7 @@ class AppGestureConfig extends HammerGestureConfig {
8540
8525
  return mc;
8541
8526
  }
8542
8527
  }
8543
- AppGestureConfig.ɵprov = i0.ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8528
+ AppGestureConfig.ɵprov = ɵɵdefineInjectable({ factory: function AppGestureConfig_Factory() { return new AppGestureConfig(); }, token: AppGestureConfig, providedIn: "root" });
8544
8529
  AppGestureConfig.decorators = [
8545
8530
  { type: Injectable, args: [{ providedIn: 'root' },] }
8546
8531
  ];
@@ -8781,7 +8766,7 @@ class MatPaginatorI18n extends MatPaginatorIntl {
8781
8766
  this.previousPageLabel = this.translate.instant('COMMON.PAGINATOR.PREVIOUS_PAGE');
8782
8767
  }
8783
8768
  }
8784
- MatPaginatorI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8769
+ MatPaginatorI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatPaginatorI18n_Factory() { return new MatPaginatorI18n(ɵɵinject(TranslateService)); }, token: MatPaginatorI18n, providedIn: "root" });
8785
8770
  MatPaginatorI18n.decorators = [
8786
8771
  { type: Injectable, args: [{ providedIn: 'root' },] }
8787
8772
  ];
@@ -8871,17 +8856,17 @@ function getColorContrast(color, bw) {
8871
8856
  return rgbArrayToHex(rgb.map(v => 255 - v));
8872
8857
  }
8873
8858
 
8874
- const noop = () => {
8859
+ const noop$8 = () => {
8875
8860
  };
8876
- const ɵ0$3 = noop;
8861
+ const ɵ0$9 = noop$8;
8877
8862
  class AppFormField {
8878
8863
  constructor(translate, cd, injector, formGroupDir) {
8879
8864
  this.translate = translate;
8880
8865
  this.cd = cd;
8881
8866
  this.injector = injector;
8882
8867
  this.formGroupDir = formGroupDir;
8883
- this._onChangeCallback = noop;
8884
- this._onTouchedCallback = noop;
8868
+ this._onChangeCallback = noop$8;
8869
+ this._onTouchedCallback = noop$8;
8885
8870
  this.readonly = false;
8886
8871
  this.compact = false;
8887
8872
  this.floatLabel = 'auto';
@@ -9071,7 +9056,8 @@ AppFormField.propDecorators = {
9071
9056
 
9072
9057
  class StartableService {
9073
9058
  constructor(prerequisiteService) {
9074
- this.onStart = new Subject();
9059
+ this.startSubject = new Subject();
9060
+ this.stopSubject = new Subject();
9075
9061
  this._debug = false;
9076
9062
  this._startByReadyFunction = true; // should start when calling ready() ?
9077
9063
  this._data = null;
@@ -9094,7 +9080,7 @@ class StartableService {
9094
9080
  this._data = data;
9095
9081
  this._started = true;
9096
9082
  this._startPromise = undefined;
9097
- this.onStart.next(this._data);
9083
+ this.startSubject.next(this._data);
9098
9084
  return this._data;
9099
9085
  })
9100
9086
  .catch(err => {
@@ -9108,17 +9094,18 @@ class StartableService {
9108
9094
  stop() {
9109
9095
  return __awaiter(this, void 0, void 0, function* () {
9110
9096
  try {
9111
- if (this._subscription) {
9112
- this._subscription.unsubscribe();
9113
- this._subscription = null;
9114
- }
9097
+ this.unsubscribe();
9115
9098
  yield this.ngOnStop();
9116
- this._started = false;
9117
- this._startPromise = undefined;
9118
9099
  }
9119
9100
  catch (err) {
9120
9101
  console.error('Failed to stop a service: ' + (err && err.message || err), err);
9121
9102
  }
9103
+ finally {
9104
+ this.stopSubject.next();
9105
+ this._data = null;
9106
+ this._started = false;
9107
+ this._startPromise = undefined;
9108
+ }
9122
9109
  });
9123
9110
  }
9124
9111
  restart() {
@@ -9143,8 +9130,9 @@ class StartableService {
9143
9130
  return this._startPromise;
9144
9131
  if (this._startByReadyFunction)
9145
9132
  return this.start();
9146
- return waitFor(() => this._started)
9147
- .then(() => this._data);
9133
+ return this.startSubject
9134
+ .pipe(takeUntil(this.stopSubject))
9135
+ .toPromise();
9148
9136
  }
9149
9137
  registerSubscription(sub) {
9150
9138
  this._subscription = this._subscription || new Subscription();
@@ -9153,9 +9141,14 @@ class StartableService {
9153
9141
  unregisterSubscription(sub) {
9154
9142
  this._subscription.remove(sub);
9155
9143
  }
9144
+ unsubscribe() {
9145
+ var _a;
9146
+ (_a = this._subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
9147
+ this._subscription = null;
9148
+ }
9156
9149
  ngOnStop() {
9157
9150
  return __awaiter(this, void 0, void 0, function* () {
9158
- // Can be override by subclasses
9151
+ // Can be overwritten by subclasses
9159
9152
  });
9160
9153
  }
9161
9154
  }
@@ -9317,14 +9310,14 @@ class AudioProvider extends StartableService {
9317
9310
  });
9318
9311
  }
9319
9312
  }
9320
- 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" });
9313
+ 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" });
9321
9314
  AudioProvider.decorators = [
9322
9315
  { type: Injectable, args: [{ providedIn: 'root' },] }
9323
9316
  ];
9324
9317
  AudioProvider.ctorParameters = () => [
9325
9318
  { type: Platform },
9326
- { type: NativeAudio, decorators: [{ type: Optional }] },
9327
- { type: Vibration, decorators: [{ type: Optional }] },
9319
+ { type: NativeAudio$1, decorators: [{ type: Optional }] },
9320
+ { type: Vibration$1, decorators: [{ type: Optional }] },
9328
9321
  { type: AudioManagement, decorators: [{ type: Optional }] }
9329
9322
  ];
9330
9323
 
@@ -9409,7 +9402,7 @@ class Hotkeys {
9409
9402
  });
9410
9403
  }
9411
9404
  }
9412
- 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), i0.ɵɵinject(i1$4.PopoverController)); }, token: Hotkeys, providedIn: "root" });
9405
+ Hotkeys.ɵprov = ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(ɵɵinject(EventManager), ɵɵinject(MatDialog), ɵɵinject(DOCUMENT), ɵɵinject(ModalController), ɵɵinject(PopoverController)); }, token: Hotkeys, providedIn: "root" });
9413
9406
  Hotkeys.decorators = [
9414
9407
  { type: Injectable, args: [{
9415
9408
  providedIn: 'root'
@@ -9623,7 +9616,7 @@ class ImagesUtils {
9623
9616
  }
9624
9617
  }
9625
9618
 
9626
- const uuidv4$1 = uuidv4Imported;
9619
+ const uuidv4 = uuidv4Imported;
9627
9620
  class FileService {
9628
9621
  constructor(platform,
9629
9622
  //private transfer: FileTransfer,
@@ -9660,7 +9653,7 @@ class FileService {
9660
9653
  const lastSlashIndex = fileUrl.lastIndexOf('/');
9661
9654
  if (lastSlashIndex === -1)
9662
9655
  throw new Error('Invalid URL: ' + fileUrl);
9663
- const fileName = lastSlashIndex < (fileUrl.length - 1) && fileUrl.substring(lastSlashIndex + 1) || uuidv4$1();
9656
+ const fileName = lastSlashIndex < (fileUrl.length - 1) && fileUrl.substring(lastSlashIndex + 1) || uuidv4();
9664
9657
  // Download into the file system
9665
9658
  if (outputType === 'fileUrl' && this.canUseFileSystem) {
9666
9659
  console.warn(`WARN: [file] Downloading image {${fileUrl}} in local filesystem...`);
@@ -9716,7 +9709,7 @@ class FileService {
9716
9709
  this._started = true;
9717
9710
  }
9718
9711
  }
9719
- 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" });
9712
+ FileService.ɵprov = ɵɵdefineInjectable({ factory: function FileService_Factory() { return new FileService(ɵɵinject(Platform), ɵɵinject(HttpClient), ɵɵinject(ENVIRONMENT)); }, token: FileService, providedIn: "root" });
9720
9713
  FileService.decorators = [
9721
9714
  { type: Injectable, args: [{
9722
9715
  providedIn: 'root',
@@ -9882,7 +9875,7 @@ class Base58 {
9882
9875
  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
9883
9876
 
9884
9877
  const scrypt = require('scrypt-async');
9885
- const sha256$1 = require('hash.js/lib/hash/sha/256');
9878
+ const sha256 = require('hash.js/lib/hash/sha/256');
9886
9879
  const sha512 = require('hash.js/lib/hash/sha/512');
9887
9880
  const nacl = {
9888
9881
  sign,
@@ -9986,7 +9979,7 @@ class CryptoService {
9986
9979
  * Hash (using SHA256) a message
9987
9980
  */
9988
9981
  sha256(message) {
9989
- return sha256$1().update(message).digest('hex');
9982
+ return sha256().update(message).digest('hex');
9990
9983
  }
9991
9984
  /**
9992
9985
  * Hash (using SHA512) a message
@@ -9999,7 +9992,7 @@ class CryptoService {
9999
9992
  return nacl.util.encodeBase64(m);
10000
9993
  }
10001
9994
  }
10002
- CryptoService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
9995
+ CryptoService.ɵprov = ɵɵdefineInjectable({ factory: function CryptoService_Factory() { return new CryptoService(); }, token: CryptoService, providedIn: "root" });
10003
9996
  CryptoService.decorators = [
10004
9997
  { type: Injectable, args: [{ providedIn: 'root' },] }
10005
9998
  ];
@@ -10761,7 +10754,7 @@ SelectPeerModal.propDecorators = {
10761
10754
  onRefresh: [{ type: Input }]
10762
10755
  };
10763
10756
 
10764
- const moment$7 = momentImported;
10757
+ const moment$3 = momentImported;
10765
10758
  const SETTINGS_STORAGE_KEY = 'settings';
10766
10759
  const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
10767
10760
  // fixme: this constant points to static environment
@@ -11004,11 +10997,11 @@ class LocalSettingsService extends StartableService {
11004
10997
  if (!feature) {
11005
10998
  feature = {
11006
10999
  name: featureName.toLowerCase(),
11007
- lastSyncDate: moment$7().toISOString()
11000
+ lastSyncDate: moment$3().toISOString()
11008
11001
  };
11009
11002
  }
11010
11003
  else {
11011
- feature.lastSyncDate = moment$7().toISOString();
11004
+ feature.lastSyncDate = moment$3().toISOString();
11012
11005
  }
11013
11006
  this.saveOfflineFeature(feature);
11014
11007
  }
@@ -11169,7 +11162,7 @@ class LocalSettingsService extends StartableService {
11169
11162
  if (!page || !page.title || !page.path)
11170
11163
  throw Error('Missing required argument \'page\', \'page.path\' or \'page.title\'');
11171
11164
  // Set time
11172
- page.time = page.time || moment$7();
11165
+ page.time = page.time || moment$3();
11173
11166
  // Clean the title (remove <small> tags)
11174
11167
  if (!opts || opts.removeTitleSmallTag !== false) {
11175
11168
  const tagIndex = page.title.indexOf('</small>');
@@ -11185,7 +11178,7 @@ class LocalSettingsService extends StartableService {
11185
11178
  return page;
11186
11179
  }
11187
11180
  }
11188
- 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" });
11181
+ 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" });
11189
11182
  LocalSettingsService.decorators = [
11190
11183
  { type: Injectable, args: [{
11191
11184
  providedIn: 'root'
@@ -11361,7 +11354,7 @@ class NetworkService extends StartableService {
11361
11354
  this.splashScreen = splashScreen;
11362
11355
  this.translate = translate;
11363
11356
  this.toastController = toastController;
11364
- this.onPeerChanges = this.onStart.pipe(map(peer => peer && peer.url), filter(isNotNilOrBlank), distinctUntilChanged());
11357
+ this.onPeerChanges = this.startSubject.pipe(map(peer => peer && peer.url), filter(isNotNilOrBlank), distinctUntilChanged());
11365
11358
  this.onNetworkStatusChanges = new BehaviorSubject(null);
11366
11359
  this.onResetNetworkCache = new EventEmitter(true);
11367
11360
  this._listeners = {};
@@ -11375,7 +11368,7 @@ class NetworkService extends StartableService {
11375
11368
  this._timerRefreshCondition = () => true; // Always check
11376
11369
  }
11377
11370
  this.resetData();
11378
- this.onStart.subscribe(() => this.ngOnAfterStart());
11371
+ this.startSubject.subscribe(() => this.ngOnAfterStart());
11379
11372
  // For DEV only
11380
11373
  this._debug = !environment.production;
11381
11374
  }
@@ -11407,7 +11400,7 @@ class NetworkService extends StartableService {
11407
11400
  on(eventType, callback) {
11408
11401
  switch (eventType) {
11409
11402
  case 'start':
11410
- return this.onStart.subscribe(() => callback());
11403
+ return this.startSubject.subscribe(() => callback());
11411
11404
  case 'peerChanged':
11412
11405
  return this.onPeerChanges.subscribe(() => callback());
11413
11406
  case 'statusChanged':
@@ -11587,11 +11580,11 @@ class NetworkService extends StartableService {
11587
11580
  }
11588
11581
  });
11589
11582
  }
11590
- getAppVersion(peer, opts) {
11583
+ getAppVersion(peer, opts = { nocache: true }) {
11591
11584
  return __awaiter(this, void 0, void 0, function* () {
11592
11585
  try {
11593
11586
  let path = this.computePeerPath(peer, 'version.appup');
11594
- if (opts === null || opts === void 0 ? void 0 : opts.nocache) {
11587
+ if (opts.nocache) {
11595
11588
  path += '?t=' + Date.now();
11596
11589
  }
11597
11590
  const appVersion = yield this.getText(path, opts);
@@ -11902,7 +11895,7 @@ class NetworkService extends StartableService {
11902
11895
  });
11903
11896
  }
11904
11897
  }
11905
- 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" });
11898
+ 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" });
11906
11899
  NetworkService.decorators = [
11907
11900
  { type: Injectable, args: [{ providedIn: 'root' },] }
11908
11901
  ];
@@ -11913,11 +11906,11 @@ NetworkService.ctorParameters = () => [
11913
11906
  { type: CryptoService },
11914
11907
  { type: Storage },
11915
11908
  { type: LocalSettingsService },
11916
- { type: CacheService },
11909
+ { type: CacheService$1 },
11917
11910
  { type: HttpClient },
11918
11911
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
11919
- { type: Network, decorators: [{ type: Optional }] },
11920
- { type: SplashScreen, decorators: [{ type: Optional }] },
11912
+ { type: Network$1, decorators: [{ type: Optional }] },
11913
+ { type: SplashScreen$1, decorators: [{ type: Optional }] },
11921
11914
  { type: TranslateService, decorators: [{ type: Optional }] },
11922
11915
  { type: ToastController, decorators: [{ type: Optional }] }
11923
11916
  ];
@@ -12848,7 +12841,7 @@ class EntitiesStorage extends StartableService {
12848
12841
  }
12849
12842
  EntitiesStorage.TRASH_PREFIX = 'Trash#';
12850
12843
  EntitiesStorage.REMOTE_PREFIX = 'Remote#';
12851
- 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" });
12844
+ 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" });
12852
12845
  EntitiesStorage.decorators = [
12853
12846
  { type: Injectable, args: [{ providedIn: 'root' },] }
12854
12847
  ];
@@ -12985,10 +12978,10 @@ function referentialToString(obj, properties) {
12985
12978
  function referentialsToString(values, properties, separator) {
12986
12979
  return (values || []).map(v => referentialToString(v, properties)).join(separator || ', ');
12987
12980
  }
12988
- const ɵ0$2 = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12981
+ const ɵ0$a = StatusIds.ENABLE, ɵ1 = StatusIds.DISABLE, ɵ2 = StatusIds.TEMPORARY;
12989
12982
  const StatusList = Object.freeze([
12990
12983
  {
12991
- id: ɵ0$2,
12984
+ id: ɵ0$a,
12992
12985
  icon: 'checkmark',
12993
12986
  label: 'REFERENTIAL.STATUS_ENUM.ENABLE'
12994
12987
  },
@@ -13263,7 +13256,7 @@ function accountToString(data) {
13263
13256
  (data.lastName || '')) || '';
13264
13257
  }
13265
13258
 
13266
- const uuidv4 = uuidv4Imported;
13259
+ const uuidv4$1 = uuidv4Imported;
13267
13260
  const _global = typeof global !== 'undefined' ? global : (typeof window !== 'undefined' ? window : {});
13268
13261
  const NativeWebSocket = _global.WebSocket || _global.MozWebSocket;
13269
13262
  /**
@@ -13307,7 +13300,7 @@ function createTrackerLink(opts) {
13307
13300
  // Skip if not tracked
13308
13301
  if (!context || !context.tracked)
13309
13302
  return forward(operation);
13310
- const id = context.serializationKey || uuidv4();
13303
+ const id = context.serializationKey || uuidv4$1();
13311
13304
  console.debug(`[apollo-tracker-link] Watching tracked query {${operation.operationName}#${id}}`);
13312
13305
  // Clean context, before calling JSON.stringify (remove unused attributes)
13313
13306
  const cleanContext = Object.assign(Object.assign({}, context), { optimisticResponse: null, cache: null });
@@ -14047,7 +14040,7 @@ class GraphqlService extends StartableService {
14047
14040
  return undefined;
14048
14041
  }
14049
14042
  }
14050
- 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" });
14043
+ 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" });
14051
14044
  GraphqlService.decorators = [
14052
14045
  { type: Injectable, args: [{
14053
14046
  providedIn: 'root'
@@ -14064,7 +14057,7 @@ GraphqlService.ctorParameters = () => [
14064
14057
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_GRAPHQL_TYPE_POLICIES,] }] }
14065
14058
  ];
14066
14059
 
14067
- const sha256 = require('hash.js/lib/hash/sha/256');
14060
+ const sha256$1 = require('hash.js/lib/hash/sha/256');
14068
14061
  class BaseGraphqlServiceOptions {
14069
14062
  }
14070
14063
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
@@ -14215,8 +14208,8 @@ class BaseGraphqlService extends StartableService {
14215
14208
  }
14216
14209
  /* -- protected methods -- */
14217
14210
  computeMutableWatchQueryId(opts) {
14218
- const queryName = opts.queryName || sha256().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
14219
- const variablesKey = opts.variables && sha256().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
14211
+ const queryName = opts.queryName || sha256$1().update(JSON.stringify(opts.query)).digest('hex').substring(0, 8);
14212
+ const variablesKey = opts.variables && sha256$1().update(JSON.stringify(opts.variables)).digest('hex').substring(0, 8) || '';
14220
14213
  return [queryName, opts.arrayFieldName, variablesKey].join('|');
14221
14214
  }
14222
14215
  findMutableWatchQueries(opts) {
@@ -14286,7 +14279,7 @@ const DEFAULT_AVATAR_IMAGE = 'assets/img/person.png';
14286
14279
  /* ------------------------------------
14287
14280
  * GraphQL queries
14288
14281
  * ------------------------------------*/
14289
- const Fragments$1 = {
14282
+ const Fragments = {
14290
14283
  account: gql `
14291
14284
  fragment AccountFragment on AccountVO {
14292
14285
  id
@@ -14321,14 +14314,14 @@ const Fragments$1 = {
14321
14314
  }`
14322
14315
  };
14323
14316
  // Load account query
14324
- const LoadQuery$1 = gql `
14317
+ const LoadQuery = gql `
14325
14318
  query Account {
14326
14319
  data: account {
14327
14320
  ...AccountFragment
14328
14321
  }
14329
14322
  }
14330
- ${Fragments$1.account}
14331
- ${Fragments$1.settings}
14323
+ ${Fragments.account}
14324
+ ${Fragments.settings}
14332
14325
  `;
14333
14326
  // Check email query
14334
14327
  const IsEmailExistsQuery = gql `
@@ -14343,21 +14336,21 @@ const AccountMutations = {
14343
14336
  ...AccountFragment
14344
14337
  }
14345
14338
  }
14346
- ${Fragments$1.account}
14347
- ${Fragments$1.settings}`,
14339
+ ${Fragments.account}
14340
+ ${Fragments.settings}`,
14348
14341
  create: gql `mutation CreateAccount($data:AccountVOInput){
14349
14342
  data: createAccount(account: $data){
14350
14343
  ...AccountFragment
14351
14344
  }
14352
14345
  }
14353
- ${Fragments$1.account}
14354
- ${Fragments$1.settings}`,
14346
+ ${Fragments.account}
14347
+ ${Fragments.settings}`,
14355
14348
  saveSettings: gql `mutation SaveSettings($data:UserSettingsVOInput){
14356
14349
  data: saveSettings(settings: $data){
14357
14350
  ...UserSettingsFragment
14358
14351
  }
14359
14352
  }
14360
- ${Fragments$1.settings}`
14353
+ ${Fragments.settings}`
14361
14354
  };
14362
14355
  // Sent confirmation email
14363
14356
  const SendConfirmEmailMutation = gql `
@@ -14482,7 +14475,7 @@ class AccountService extends BaseGraphqlService {
14482
14475
  firstNotNilPromise(this._tokenType$)
14483
14476
  ]);
14484
14477
  // Listen graphql start (or restart)
14485
- this.registerSubscription(this.graphql.onStart.subscribe(() => {
14478
+ this.registerSubscription(this.graphql.stopSubject.subscribe(() => {
14486
14479
  if (this.started && this.isLogin()) {
14487
14480
  console.debug('[account] Restarting, to retry to authenticate...');
14488
14481
  this.restart();
@@ -14868,7 +14861,7 @@ class AccountService extends BaseGraphqlService {
14868
14861
  // Load remotely
14869
14862
  else {
14870
14863
  const { data } = yield this.graphql.query({
14871
- query: LoadQuery$1,
14864
+ query: LoadQuery,
14872
14865
  error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
14873
14866
  fetchPolicy: opts && opts.fetchPolicy || 'no-cache' || undefined
14874
14867
  });
@@ -15391,7 +15384,7 @@ class AccountService extends BaseGraphqlService {
15391
15384
  return Toasts.show(this.toastController, this.translate, opts);
15392
15385
  }
15393
15386
  }
15394
- 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(i1$1.TranslateService, 8), i0.ɵɵinject(i1$4.ToastController, 8), i0.ɵɵinject(ENVIRONMENT)); }, token: AccountService, providedIn: "root" });
15387
+ AccountService.ɵprov = ɵɵdefineInjectable({ factory: function AccountService_Factory() { return new AccountService(ɵɵinject(CryptoService), ɵɵinject(NetworkService), ɵɵinject(GraphqlService), ɵɵinject(LocalSettingsService), ɵɵinject(Storage), ɵɵinject(FileService), ɵɵinject(TranslateService, 8), ɵɵinject(ToastController, 8), ɵɵinject(ENVIRONMENT)); }, token: AccountService, providedIn: "root" });
15395
15388
  AccountService.decorators = [
15396
15389
  { type: Injectable, args: [{ providedIn: 'root', deps: [ENVIRONMENT] },] }
15397
15390
  ];
@@ -15659,7 +15652,7 @@ const CONFIGURATION_STORAGE_KEY = 'configuration';
15659
15652
  /* ------------------------------------
15660
15653
  * GraphQL queries
15661
15654
  * ------------------------------------*/
15662
- const Fragments = {
15655
+ const Fragments$1 = {
15663
15656
  config: gql `
15664
15657
  fragment ConfigFragment on ConfigurationVO {
15665
15658
  id
@@ -15686,13 +15679,13 @@ const Fragments = {
15686
15679
  }
15687
15680
  `
15688
15681
  };
15689
- const LoadQuery = gql `
15682
+ const LoadQuery$1 = gql `
15690
15683
  query Configuration{
15691
15684
  data: configuration{
15692
15685
  ...ConfigFragment
15693
15686
  }
15694
15687
  }
15695
- ${Fragments.config}
15688
+ ${Fragments$1.config}
15696
15689
  `;
15697
15690
  // Save (create or update) account mutation
15698
15691
  const SaveMutation = gql `
@@ -15701,7 +15694,7 @@ const SaveMutation = gql `
15701
15694
  ...ConfigFragment
15702
15695
  }
15703
15696
  }
15704
- ${Fragments.config}
15697
+ ${Fragments$1.config}
15705
15698
  `;
15706
15699
  const ClearCache = gql `
15707
15700
  query ClearCache($name: String) {
@@ -15744,7 +15737,7 @@ class ConfigService extends BaseGraphqlService {
15744
15737
  const data = yield this.loadOrRestoreLocally();
15745
15738
  this.$data.next(data);
15746
15739
  // Restart if graphql service restart
15747
- this.registerSubscription(this.graphql.onStart.subscribe(() => this.restart()));
15740
+ this.registerSubscription(this.graphql.stopSubject.subscribe(() => this.restart()));
15748
15741
  return data;
15749
15742
  });
15750
15743
  }
@@ -15752,7 +15745,7 @@ class ConfigService extends BaseGraphqlService {
15752
15745
  return __awaiter(this, void 0, void 0, function* () {
15753
15746
  const now = Date.now();
15754
15747
  console.debug('[config] Loading Pod configuration...');
15755
- const query = opts && opts.query || LoadQuery;
15748
+ const query = opts && opts.query || LoadQuery$1;
15756
15749
  const variables = opts && opts.variables || undefined;
15757
15750
  const res = yield this.graphql.query({
15758
15751
  query,
@@ -15991,7 +15984,7 @@ class ConfigService extends BaseGraphqlService {
15991
15984
  });
15992
15985
  }
15993
15986
  }
15994
- 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(AccountService), i0.ɵɵinject(ENVIRONMENT), i0.ɵɵinject(APP_CONFIG_OPTIONS, 8)); }, token: ConfigService, providedIn: "root" });
15987
+ 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(AccountService), ɵɵinject(ENVIRONMENT), ɵɵinject(APP_CONFIG_OPTIONS, 8)); }, token: ConfigService, providedIn: "root" });
15995
15988
  ConfigService.decorators = [
15996
15989
  { type: Injectable, args: [{
15997
15990
  providedIn: 'root',
@@ -16237,7 +16230,7 @@ class UriUtils {
16237
16230
  }
16238
16231
  }
16239
16232
 
16240
- const moment$6 = momentImported;
16233
+ const moment$4 = momentImported;
16241
16234
  const AndroidOsEnvironment = Object.freeze({
16242
16235
  DIRECTORY_DOWNLOADS: 'Download',
16243
16236
  DIRECTORY_DOWNLOADS_OLD: 'Downloads',
@@ -16500,16 +16493,16 @@ class PlatformService extends StartableService {
16500
16493
  }
16501
16494
  // config moment lib
16502
16495
  try {
16503
- moment$6.locale(event.lang);
16496
+ moment$4.locale(event.lang);
16504
16497
  console.debug('[platform] Use locale {' + event.lang + '}');
16505
16498
  }
16506
16499
  // If error, fallback to en
16507
16500
  catch (err) {
16508
- moment$6.locale('en');
16501
+ moment$4.locale('en');
16509
16502
  console.warn('[platform] Unknown local for moment lib. Using default [en]');
16510
16503
  }
16511
16504
  // Config date adapter
16512
- this.dateAdapter.setLocale(moment$6.locale());
16505
+ this.dateAdapter.setLocale(moment$4.locale());
16513
16506
  }
16514
16507
  });
16515
16508
  this.settings.onChange.subscribe(data => {
@@ -16709,7 +16702,7 @@ class PlatformService extends StartableService {
16709
16702
  });
16710
16703
  }
16711
16704
  }
16712
- 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" });
16705
+ 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), ɵɵinject(Downloader, 8)); }, token: PlatformService, providedIn: "root" });
16713
16706
  PlatformService.decorators = [
16714
16707
  { type: Injectable, args: [{ providedIn: 'root' },] }
16715
16708
  ];
@@ -16724,15 +16717,15 @@ PlatformService.ctorParameters = () => [
16724
16717
  { type: NetworkService },
16725
16718
  { type: AccountService },
16726
16719
  { type: ConfigService },
16727
- { type: CacheService },
16720
+ { type: CacheService$1 },
16728
16721
  { type: Storage },
16729
16722
  { type: AudioProvider },
16730
16723
  { type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] },
16731
- { type: StatusBar, decorators: [{ type: Optional }] },
16724
+ { type: StatusBar$1, decorators: [{ type: Optional }] },
16732
16725
  { type: Keyboard, decorators: [{ type: Optional }] },
16733
- { type: SplashScreen, decorators: [{ type: Optional }] },
16734
- { type: InAppBrowser, decorators: [{ type: Optional }] },
16735
- { type: Downloader, decorators: [{ type: Optional }] }
16726
+ { type: SplashScreen$1, decorators: [{ type: Optional }] },
16727
+ { type: InAppBrowser$1, decorators: [{ type: Optional }] },
16728
+ { type: Downloader$1, decorators: [{ type: Optional }] }
16736
16729
  ];
16737
16730
 
16738
16731
  class AppHelpModal {
@@ -16797,7 +16790,7 @@ class MatStepperI18n extends MatStepperIntl {
16797
16790
  this.optionalLabel = this.translate.instant('COMMON.OPTIONAL');
16798
16791
  }
16799
16792
  }
16800
- MatStepperI18n.ɵprov = i0.ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(i0.ɵɵinject(i1$1.TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16793
+ MatStepperI18n.ɵprov = ɵɵdefineInjectable({ factory: function MatStepperI18n_Factory() { return new MatStepperI18n(ɵɵinject(TranslateService)); }, token: MatStepperI18n, providedIn: "root" });
16801
16794
  MatStepperI18n.decorators = [
16802
16795
  { type: Injectable, args: [{ providedIn: 'root' },] }
16803
16796
  ];
@@ -16982,7 +16975,7 @@ UploadFileComponent.decorators = [
16982
16975
  { type: Component, args: [{
16983
16976
  selector: 'app-upload-file',
16984
16977
  template: "<div *ngIf=\"!uniqueFile || files.length === 0\"\n class=\"container\"\n appDragAndDrop (fileDropped)=\"onFileDropped($event)\">\n <input\n type=\"file\"\n #fileDropRef\n id=\"fileDropRef\"\n multiple\n [accept]=\"fileExtension\"\n (change)=\"fileBrowseHandler($any($event.target).files)\"\n />\n <mat-icon style=\"font-size: xx-large\" color=\"accent\">file_upload</mat-icon>\n <ion-label\n [innerHTML]=\"\n 'FILE.UPLOAD.DRAG_AND_DROP' | translate: { extension: !fileExtension ? '' : ' (' + fileExtension + ')' }\n \"\n ></ion-label>\n <ion-button>{{ 'FILE.UPLOAD.BROWSE' | translate }}</ion-button>\n</div>\n<div class=\"files-list\">\n <div *ngFor=\"let file of files; index as i\"\n class=\"single-file\"\n [class.deleting]=\"file.deleting\">\n <mat-icon>description</mat-icon>\n <div class=\"info\">\n <h4 class=\"name\">\n {{ file.name }}\n </h4>\n <p class=\"size\">\n {{ file.size | fileSize }}\n </p>\n <ion-progress-bar *ngIf=\"!file.error\"\n [value]=\"file.progress||0\"\n [type]=\"(file.deleting || file.progress === -1) ? 'indeterminate' : 'determinate'\"></ion-progress-bar>\n <ion-label *ngIf=\"file.error\" color=\"danger\" [innerHTML]=\"file.error | translate\"></ion-label>\n </div>\n <!-- remote from list (before importation) -->\n <button *ngIf=\"!(file.progress) || file.error\" mat-icon-button (click)=\"deleteFile(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n <!-- delete file (remotely - after importation) -->\n <button *ngIf=\"file.progress === 1 && !!deleteFn && !file.deleting\" mat-icon-button (click)=\"deleteFile(i)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n</div>\n",
16985
- styles: [".container{width:calc(100% - 3rem);min-height:200px;padding:2rem;text-align:center;border:1px dashed #979797;position:relative;margin:1.5rem}.container input{opacity:0;position:absolute;z-index:2;width:100%;height:100%;top:0;left:0;cursor:pointer}.container ion-label{display:block;font-size:20px;font-weight:600;color:#38424c}.container label{display:inline-block;color:#fff;width:183px;height:44px;border-radius:21.5px;background-color:#db202f;padding:8px 16px}.fileover{-webkit-animation:shake 1s;animation:shake 1s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.files-list{max-height:300px;overflow:auto}.files-list .single-file{display:flex;flex-grow:1;padding:.5rem;justify-content:space-between;align-items:center;border:1px dashed #979797;margin-bottom:1rem}.files-list .single-file.deleting .name{color:grey!important;font-style:italic!important}.files-list .single-file .name{font-size:14px;font-weight:500;color:#353f4a;margin:0}.files-list .single-file .size{font-size:12px;font-weight:500;color:#a4a4a4;margin:0 0 .25rem}.files-list .single-file .info{width:100%}@-webkit-keyframes shake{0%{transform:translate(1px,1px) rotate(0deg)}10%{transform:translate(-1px,-2px) rotate(-1deg)}20%{transform:translate(-3px) rotate(1deg)}30%{transform:translate(3px,2px) rotate(0deg)}40%{transform:translate(1px,-1px) rotate(1deg)}50%{transform:translate(-1px,2px) rotate(-1deg)}60%{transform:translate(-3px,1px) rotate(0deg)}70%{transform:translate(3px,1px) rotate(-1deg)}80%{transform:translate(-1px,-1px) rotate(1deg)}90%{transform:translate(1px,2px) rotate(0deg)}to{transform:translate(1px,-2px) rotate(-1deg)}}@keyframes shake{0%{transform:translate(1px,1px) rotate(0deg)}10%{transform:translate(-1px,-2px) rotate(-1deg)}20%{transform:translate(-3px) rotate(1deg)}30%{transform:translate(3px,2px) rotate(0deg)}40%{transform:translate(1px,-1px) rotate(1deg)}50%{transform:translate(-1px,2px) rotate(-1deg)}60%{transform:translate(-3px,1px) rotate(0deg)}70%{transform:translate(3px,1px) rotate(-1deg)}80%{transform:translate(-1px,-1px) rotate(1deg)}90%{transform:translate(1px,2px) rotate(0deg)}to{transform:translate(1px,-2px) rotate(-1deg)}}"]
16978
+ styles: [".container{width:calc(100% - 3rem);min-height:200px;padding:2rem;text-align:center;border:1px dashed #979797;position:relative;margin:1.5rem}.container input{opacity:0;position:absolute;z-index:2;width:100%;height:100%;top:0;left:0;cursor:pointer}.container ion-label{display:block;font-size:20px;font-weight:600;color:#38424c}.container label{display:inline-block;color:#fff;width:183px;height:44px;border-radius:21.5px;background-color:#db202f;padding:8px 16px}.fileover{animation:shake 1s;animation-iteration-count:infinite}.files-list{max-height:300px;overflow:auto}.files-list .single-file{display:flex;flex-grow:1;padding:.5rem;justify-content:space-between;align-items:center;border:1px dashed #979797;margin-bottom:1rem}.files-list .single-file.deleting .name{color:grey!important;font-style:italic!important}.files-list .single-file .name{font-size:14px;font-weight:500;color:#353f4a;margin:0}.files-list .single-file .size{font-size:12px;font-weight:500;color:#a4a4a4;margin:0 0 .25rem}.files-list .single-file .info{width:100%}@keyframes shake{0%{transform:translate(1px,1px) rotate(0deg)}10%{transform:translate(-1px,-2px) rotate(-1deg)}20%{transform:translate(-3px) rotate(1deg)}30%{transform:translate(3px,2px) rotate(0deg)}40%{transform:translate(1px,-1px) rotate(1deg)}50%{transform:translate(-1px,2px) rotate(-1deg)}60%{transform:translate(-3px,1px) rotate(0deg)}70%{transform:translate(3px,1px) rotate(-1deg)}80%{transform:translate(-1px,-1px) rotate(1deg)}90%{transform:translate(1px,2px) rotate(0deg)}to{transform:translate(1px,-2px) rotate(-1deg)}}"]
16986
16979
  },] }
16987
16980
  ];
16988
16981
  UploadFileComponent.ctorParameters = () => [
@@ -18078,14 +18071,6 @@ function mergeLoadResult(res1, res2) {
18078
18071
  total: ((res1.total || ((_a = res1.data) === null || _a === void 0 ? void 0 : _a.length) || 0) + (res2.total || ((_b = res2.data) === null || _b === void 0 ? void 0 : _b.length) || 0))
18079
18072
  };
18080
18073
  }
18081
- class EntitiesService {
18082
- ngOnDestroy() {
18083
- // Can be override by subclasses
18084
- }
18085
- }
18086
- EntitiesService.decorators = [
18087
- { type: Directive }
18088
- ];
18089
18074
 
18090
18075
  class EntityFilter extends Entity {
18091
18076
  constructor(__typename) {
@@ -18155,15 +18140,15 @@ class EntityFilterUtils {
18155
18140
 
18156
18141
  // @dynamic
18157
18142
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
18158
- class InMemoryEntitiesService extends EntitiesService {
18143
+ class InMemoryEntitiesService extends StartableService {
18159
18144
  constructor(dataType, filterType, options) {
18160
- super();
18145
+ super(null);
18161
18146
  this.dataType = dataType;
18162
18147
  this.filterType = filterType;
18163
18148
  this.debug = false;
18164
- this.dirty = false;
18165
- this._saving = false;
18166
18149
  this.dataSubject = new BehaviorSubject(null);
18150
+ this.dirtySubject = new BehaviorSubject(false);
18151
+ this.savingSubject = new BehaviorSubject(false);
18167
18152
  options = Object.assign({ onSort: this.sort }, options);
18168
18153
  this._sortFn = options.onSort;
18169
18154
  this._onLoad = options.onLoad;
@@ -18186,18 +18171,40 @@ class InMemoryEntitiesService extends EntitiesService {
18186
18171
  get value() {
18187
18172
  return this.dataSubject.getValue();
18188
18173
  }
18174
+ get saving() {
18175
+ return this.savingSubject.value;
18176
+ }
18177
+ get dirty() {
18178
+ return this.dirtySubject.value;
18179
+ }
18180
+ ngOnStart() {
18181
+ return __awaiter(this, void 0, void 0, function* () {
18182
+ if (this.debug)
18183
+ console.debug('[memory-data-service] Starting...');
18184
+ return firstNotNilPromise(this.dataSubject, { stop: this.stopSubject });
18185
+ });
18186
+ }
18187
+ ngOnStop() {
18188
+ return __awaiter(this, void 0, void 0, function* () {
18189
+ if (this.debug)
18190
+ console.debug('[memory-data-service] Stopping...');
18191
+ this.savingSubject.next(false);
18192
+ this.dirtySubject.next(false);
18193
+ this.dataSubject.complete();
18194
+ this.dataSubject = new BehaviorSubject(null);
18195
+ });
18196
+ }
18189
18197
  ngOnDestroy() {
18190
- if (this.debug)
18191
- console.debug('[memory-data-service] Destroying...');
18192
- this.dataSubject.complete();
18193
- this.dataSubject.unsubscribe();
18198
+ this.stop();
18194
18199
  }
18195
18200
  setValue(data) {
18196
18201
  if (this.dataSubject.value !== data) {
18202
+ if (!this.started)
18203
+ this.start();
18197
18204
  this._hiddenData = [];
18198
18205
  this.dataSubject.next(data);
18199
18206
  }
18200
- this.dirty = false;
18207
+ this.markAsPristine();
18201
18208
  }
18202
18209
  loadAll(offset, size, sortBy, sortDirection, filter, opts) {
18203
18210
  return __awaiter(this, void 0, void 0, function* () {
@@ -18207,9 +18214,8 @@ class InMemoryEntitiesService extends EntitiesService {
18207
18214
  if (isNil(originalData)) {
18208
18215
  console.warn('[memory-data-service] Cannot load all: no value set. Will return empty result');
18209
18216
  }
18210
- // Wait end of saving
18211
- if (this._saving)
18212
- yield waitFor(() => !this._saving);
18217
+ // Wait while idle
18218
+ yield this.waitWhileSaving();
18213
18219
  const excludedDataByFilter = [];
18214
18220
  let excludedDataByPagination;
18215
18221
  try {
@@ -18291,9 +18297,9 @@ class InMemoryEntitiesService extends EntitiesService {
18291
18297
  offset = offset >= 0 ? offset : 0;
18292
18298
  size = size >= 0 ? size : -1;
18293
18299
  return this.dataSubject
18294
- .pipe(
18300
+ .pipe(takeUntil(this.stopSubject),
18295
18301
  // Warn if waiting value to be set
18296
- tap((data) => !data && console.warn('[memory-data-service] Waiting value to be set...')), filter(isNotNil), mergeMap(_ => this.loadAll(offset, size, sortBy, sortDirection, filterData, options)));
18302
+ tap((data) => !data && console.debug('[memory-data-service] Waiting value to be set...')), filter(isNotNil), mergeMap(_ => this.loadAll(offset, size, sortBy, sortDirection, filterData, options)));
18297
18303
  }
18298
18304
  saveAll(data, options) {
18299
18305
  return __awaiter(this, void 0, void 0, function* () {
@@ -18309,7 +18315,7 @@ class InMemoryEntitiesService extends EntitiesService {
18309
18315
  data = ((res instanceof Promise)) ? yield res : res;
18310
18316
  }
18311
18317
  this.dataSubject.next(data);
18312
- this.dirty = true;
18318
+ this.markAsDirty();
18313
18319
  return data;
18314
18320
  }
18315
18321
  finally {
@@ -18322,16 +18328,22 @@ class InMemoryEntitiesService extends EntitiesService {
18322
18328
  let data = this.dataSubject.value;
18323
18329
  if (!data)
18324
18330
  throw new Error('[memory-service] Could not delete, because value not set');
18325
- // Remove deleted item, from data
18326
- const updatedData = data.filter(entity => {
18327
- const removed = dataToRemove.findIndex(entityToRemove => this.equals(entityToRemove, entity)) !== -1;
18328
- return !removed;
18329
- });
18330
- const deleteCount = data.length - updatedData.length;
18331
- if (deleteCount > 0) {
18332
- data = updatedData;
18333
- this.dirty = true;
18334
- this.dataSubject.next(data);
18331
+ this.markAsSaving();
18332
+ try {
18333
+ // Remove deleted item, from data
18334
+ const updatedData = data.filter(entity => {
18335
+ const removed = dataToRemove.findIndex(entityToRemove => this.equals(entityToRemove, entity)) !== -1;
18336
+ return !removed;
18337
+ });
18338
+ const deleteCount = data.length - updatedData.length;
18339
+ if (deleteCount > 0) {
18340
+ data = updatedData;
18341
+ this.dataSubject.next(data);
18342
+ this.markAsDirty();
18343
+ }
18344
+ }
18345
+ finally {
18346
+ this.markAsSaved();
18335
18347
  }
18336
18348
  });
18337
18349
  }
@@ -18388,11 +18400,30 @@ class InMemoryEntitiesService extends EntitiesService {
18388
18400
  return { data, total };
18389
18401
  }));
18390
18402
  }
18403
+ waitWhileSaving(opts) {
18404
+ if (!this.saving)
18405
+ return;
18406
+ return firstFalsePromise(this.savingSubject, Object.assign({ stop: (opts === null || opts === void 0 ? void 0 : opts.stop) || merge(this.stopSubject, this.dataSubject) }, opts));
18407
+ }
18391
18408
  markAsSaving() {
18392
- this._saving = true;
18409
+ if (!this.savingSubject.value) {
18410
+ this.savingSubject.next(true);
18411
+ }
18393
18412
  }
18394
18413
  markAsSaved() {
18395
- this._saving = false;
18414
+ if (this.savingSubject.value) {
18415
+ this.savingSubject.next(false);
18416
+ }
18417
+ }
18418
+ markAsDirty() {
18419
+ if (!this.dirtySubject.value) {
18420
+ this.dirtySubject.next(true);
18421
+ }
18422
+ }
18423
+ markAsPristine() {
18424
+ if (this.dirtySubject.value) {
18425
+ this.dirtySubject.next(false);
18426
+ }
18396
18427
  }
18397
18428
  }
18398
18429
  InMemoryEntitiesService.decorators = [
@@ -18716,7 +18747,7 @@ function state2side(state) {
18716
18747
  return 1;
18717
18748
  }
18718
18749
  }
18719
- const ɵ0$1 = (defaultStateSize) => [
18750
+ const ɵ0$b = (defaultStateSize) => [
18720
18751
  Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
18721
18752
  Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
18722
18753
  Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
@@ -18724,7 +18755,7 @@ const ɵ0$1 = (defaultStateSize) => [
18724
18755
  const SCALE_OPTIONS_DEFAULT = {
18725
18756
  startColor: rgbArrayMap.red,
18726
18757
  startStates: [0, 2, 3],
18727
- startStepsFn: ɵ0$1
18758
+ startStepsFn: ɵ0$b
18728
18759
  };
18729
18760
  /**
18730
18761
  * Internal function, that create a colors scale, using iteration
@@ -19531,7 +19562,7 @@ class UserSettingsValidatorService extends AppValidatorService {
19531
19562
  });
19532
19563
  }
19533
19564
  }
19534
- UserSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
19565
+ UserSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(ɵɵinject(FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
19535
19566
  UserSettingsValidatorService.decorators = [
19536
19567
  { type: Injectable, args: [{ providedIn: 'root' },] }
19537
19568
  ];
@@ -19575,7 +19606,7 @@ class AccountValidatorService extends AppValidatorService {
19575
19606
  return validatorFns.length ? Validators.compose(validatorFns) : validatorFns.length === 1 ? validatorFns[0] : undefined;
19576
19607
  }
19577
19608
  }
19578
- AccountValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
19609
+ AccountValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
19579
19610
  AccountValidatorService.decorators = [
19580
19611
  { type: Injectable, args: [{ providedIn: 'root' },] }
19581
19612
  ];
@@ -19869,7 +19900,7 @@ class MenuService {
19869
19900
  this._$opened.next(false);
19870
19901
  }
19871
19902
  }
19872
- MenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
19903
+ MenuService.ɵprov = ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
19873
19904
  MenuService.decorators = [
19874
19905
  { type: Injectable, args: [{
19875
19906
  providedIn: 'root'
@@ -20205,7 +20236,7 @@ class LocalSettingsValidatorService extends AppValidatorService {
20205
20236
  });
20206
20237
  }
20207
20238
  }
20208
- LocalSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
20239
+ LocalSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(ɵɵinject(FormBuilder), ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
20209
20240
  LocalSettingsValidatorService.decorators = [
20210
20241
  { type: Injectable, args: [{ providedIn: 'root' },] }
20211
20242
  ];
@@ -20824,7 +20855,7 @@ class IsOnFieldModePipe {
20824
20855
  return value === 'FIELD';
20825
20856
  }
20826
20857
  }
20827
- IsOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20858
+ IsOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20828
20859
  IsOnFieldModePipe.decorators = [
20829
20860
  { type: Pipe, args: [{
20830
20861
  name: 'isOnField'
@@ -20836,7 +20867,7 @@ class IsNotOnFieldModePipe {
20836
20867
  return value !== 'FIELD';
20837
20868
  }
20838
20869
  }
20839
- IsNotOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20870
+ IsNotOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20840
20871
  IsNotOnFieldModePipe.decorators = [
20841
20872
  { type: Pipe, args: [{
20842
20873
  name: 'isNotOnField'
@@ -20851,7 +20882,7 @@ class PersonToStringPipe {
20851
20882
  return PersonUtils.personToString(value);
20852
20883
  }
20853
20884
  }
20854
- PersonToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20885
+ PersonToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20855
20886
  PersonToStringPipe.decorators = [
20856
20887
  { type: Pipe, args: [{
20857
20888
  name: 'personToString'
@@ -21204,7 +21235,7 @@ class IsLoginAccountPipe {
21204
21235
  return value && value.pubkey && true;
21205
21236
  }
21206
21237
  }
21207
- IsLoginAccountPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
21238
+ IsLoginAccountPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
21208
21239
  IsLoginAccountPipe.decorators = [
21209
21240
  { type: Pipe, args: [{
21210
21241
  name: 'isLogin'
@@ -21216,7 +21247,7 @@ class AccountToStringPipe {
21216
21247
  return accountToString(value);
21217
21248
  }
21218
21249
  }
21219
- AccountToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
21250
+ AccountToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
21220
21251
  AccountToStringPipe.decorators = [
21221
21252
  { type: Pipe, args: [{
21222
21253
  name: 'accountToString'
@@ -21231,7 +21262,7 @@ class DepartmentToStringPipe {
21231
21262
  return departmentToString(value);
21232
21263
  }
21233
21264
  }
21234
- DepartmentToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
21265
+ DepartmentToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
21235
21266
  DepartmentToStringPipe.decorators = [
21236
21267
  { type: Pipe, args: [{
21237
21268
  name: 'departmentToString'
@@ -21866,7 +21897,7 @@ class AuthGuardService {
21866
21897
  }));
21867
21898
  }
21868
21899
  }
21869
- 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" });
21900
+ AuthGuardService.ɵprov = ɵɵdefineInjectable({ factory: function AuthGuardService_Factory() { return new AuthGuardService(ɵɵinject(AccountService), ɵɵinject(ModalController), ɵɵinject(Router), ɵɵinject(ENVIRONMENT)); }, token: AuthGuardService, providedIn: "root" });
21870
21901
  AuthGuardService.decorators = [
21871
21902
  { type: Injectable, args: [{ providedIn: 'root' },] }
21872
21903
  ];
@@ -22615,7 +22646,7 @@ class EntitiesTableDataSource extends TableDataSource {
22615
22646
  this.handleServiceError(err);
22616
22647
  }
22617
22648
  finally {
22618
- this.loadingSubject.next(false);
22649
+ this.markAsLoaded();
22619
22650
  }
22620
22651
  });
22621
22652
  }
@@ -23218,6 +23249,7 @@ class AppTable {
23218
23249
  // Stop event
23219
23250
  event === null || event === void 0 ? void 0 : event.stopPropagation();
23220
23251
  // Confirmation edition or creation
23252
+ // TODO: add await ?
23221
23253
  const confirmed = row.confirmEditCreate();
23222
23254
  if (confirmed) {
23223
23255
  // If edit finished, forget edited row
@@ -23236,6 +23268,7 @@ class AppTable {
23236
23268
  }
23237
23269
  if (row.validator) {
23238
23270
  // If pending: Wait end of validation, then loop
23271
+ // TODO: remove when using async isValid() function
23239
23272
  if (row.validator.pending) {
23240
23273
  AppFormUtils.waitWhilePending(row.validator).then(() => this.confirmEditCreate(event, row));
23241
23274
  return false;
@@ -23386,7 +23419,7 @@ class AppTable {
23386
23419
  this.selection.clear();
23387
23420
  }
23388
23421
  else {
23389
- const rows = yield this._dataSource.getRows();
23422
+ const rows = this._dataSource.getRows();
23390
23423
  rows.forEach(row => this.selection.select(row));
23391
23424
  }
23392
23425
  });
@@ -23525,7 +23558,7 @@ class AppTable {
23525
23558
  if (data === undefined)
23526
23559
  return Promise.resolve(false);
23527
23560
  yield this.waitIdle();
23528
- const row = ((yield this.dataSource.getRows()) || [])
23561
+ const row = this.dataSource.getRows()
23529
23562
  .find(row => this.equals(row.currentData, data));
23530
23563
  if (!row)
23531
23564
  return false;
@@ -23752,7 +23785,7 @@ class AppTable {
23752
23785
  canCancelRows(rows, opts) {
23753
23786
  return __awaiter(this, void 0, void 0, function* () {
23754
23787
  // Get dirty rows
23755
- rows = rows || (yield this.dataSource.getRows()).filter(row => { var _a; return (_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty; });
23788
+ rows = rows || this.dataSource.getRows().filter(row => { var _a; return (_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty; });
23756
23789
  if (isEmptyArray(rows))
23757
23790
  return true; // No dirty: OK
23758
23791
  // Check using emitter
@@ -24532,13 +24565,14 @@ class AppEditor {
24532
24565
  }
24533
24566
  }
24534
24567
  markAsLoaded(opts) {
24535
- var _a;
24568
+ var _a, _b;
24536
24569
  if (this.loadingSubject.value) {
24537
24570
  this.loadingSubject.next(false);
24538
24571
  if (!opts || opts.onlySelf !== true) {
24539
- // Emit to children forms
24540
- // Tables should be changed by parent
24541
- (_a = this.forms) === null || _a === void 0 ? void 0 : _a.forEach(c => c.markAsLoaded(opts));
24572
+ // Emit to children forms and editors
24573
+ // note: tables should be changed by parent
24574
+ (_a = this.forms) === null || _a === void 0 ? void 0 : _a.forEach(f => f.markAsLoaded(opts));
24575
+ (_b = this.editors) === null || _b === void 0 ? void 0 : _b.forEach(e => e.markAsLoaded(opts));
24542
24576
  }
24543
24577
  if (!opts || opts.emitEvent !== false) {
24544
24578
  this.markForCheck();
@@ -24676,39 +24710,41 @@ class AppEditor {
24676
24710
  return __awaiter(this, void 0, void 0, function* () {
24677
24711
  if (!this.dirty)
24678
24712
  return true;
24679
- let confirm = false;
24680
- let cancel = false;
24681
- const translations = this.translate.instant(['COMMON.BTN_SAVE', 'COMMON.BTN_CANCEL', 'COMMON.BTN_ABORT_CHANGES', 'CONFIRM.SAVE', 'CONFIRM.ALERT_HEADER']);
24682
- const alert = yield this.alertCtrl.create({
24683
- header: translations['CONFIRM.ALERT_HEADER'],
24684
- message: translations['CONFIRM.SAVE'],
24685
- buttons: [
24686
- {
24687
- text: translations['COMMON.BTN_CANCEL'],
24688
- role: 'cancel',
24689
- cssClass: 'secondary',
24690
- handler: () => {
24691
- cancel = true;
24692
- }
24693
- },
24694
- {
24695
- text: translations['COMMON.BTN_ABORT_CHANGES'],
24696
- cssClass: 'secondary',
24697
- handler: () => {
24698
- }
24699
- },
24700
- {
24701
- text: translations['COMMON.BTN_SAVE'],
24702
- handler: () => {
24703
- confirm = true; // update upper value
24713
+ let confirmed = (opts === null || opts === void 0 ? void 0 : opts.confirmed) || false;
24714
+ if (!confirmed) {
24715
+ let cancel = false;
24716
+ const translations = this.translate.instant(['COMMON.BTN_SAVE', 'COMMON.BTN_CANCEL', 'COMMON.BTN_ABORT_CHANGES', 'CONFIRM.SAVE', 'CONFIRM.ALERT_HEADER']);
24717
+ const alert = yield this.alertCtrl.create({
24718
+ header: translations['CONFIRM.ALERT_HEADER'],
24719
+ message: translations['CONFIRM.SAVE'],
24720
+ buttons: [
24721
+ {
24722
+ text: translations['COMMON.BTN_CANCEL'],
24723
+ role: 'cancel',
24724
+ cssClass: 'secondary',
24725
+ handler: () => {
24726
+ cancel = true;
24727
+ }
24728
+ },
24729
+ {
24730
+ text: translations['COMMON.BTN_ABORT_CHANGES'],
24731
+ cssClass: 'secondary',
24732
+ handler: () => {
24733
+ }
24734
+ },
24735
+ {
24736
+ text: translations['COMMON.BTN_SAVE'],
24737
+ handler: () => {
24738
+ confirmed = true; // update upper value
24739
+ }
24704
24740
  }
24705
- }
24706
- ]
24707
- });
24708
- yield alert.present();
24709
- yield alert.onDidDismiss();
24710
- if (!confirm) {
24711
- return !cancel;
24741
+ ]
24742
+ });
24743
+ yield alert.present();
24744
+ yield alert.onDidDismiss();
24745
+ if (!confirmed) {
24746
+ return !cancel;
24747
+ }
24712
24748
  }
24713
24749
  return yield this.save(event, opts);
24714
24750
  });
@@ -26104,7 +26140,7 @@ const SocialErrorCodes = {
26104
26140
  SUBSCRIBE_JOB_PROGRESSION_ERROR: 50010
26105
26141
  };
26106
26142
 
26107
- const moment$4 = momentImported;
26143
+ const moment$6 = momentImported;
26108
26144
  const USER_EVENT_SERVICE = new InjectionToken('UserEventService');
26109
26145
  class AbstractUserEventService extends BaseGraphqlService {
26110
26146
  constructor(graphql, accountService, network, translate, options) {
@@ -26470,7 +26506,7 @@ class AbstractUserEventService extends BaseGraphqlService {
26470
26506
  }
26471
26507
  resetCount() {
26472
26508
  this._countSubject.next(undefined);
26473
- this.resetCountDate = moment$4();
26509
+ this.resetCountDate = moment$6();
26474
26510
  // restart listening count changes
26475
26511
  this.startListenCountChanges();
26476
26512
  }
@@ -26530,7 +26566,7 @@ class AbstractUserEventService extends BaseGraphqlService {
26530
26566
  if (!userEvents.length)
26531
26567
  return;
26532
26568
  // set read date
26533
- userEvents.forEach(userEvent => userEvent.readDate = moment$4());
26569
+ userEvents.forEach(userEvent => userEvent.readDate = moment$6());
26534
26570
  // split local/remote entities
26535
26571
  const localEntities = userEvents.filter(userEvent => !userEvent.id || userEvent.id < 0);
26536
26572
  const remoteEntities = userEvents.filter(userEvent => userEvent.id > 0);
@@ -27505,7 +27541,7 @@ class MessageService extends BaseGraphqlService {
27505
27541
  });
27506
27542
  }
27507
27543
  }
27508
- MessageService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(i0.ɵɵinject(GraphqlService), i0.ɵɵinject(i1$1.TranslateService), i0.ɵɵinject(i1$4.ToastController), i0.ɵɵinject(ENVIRONMENT, 8)); }, token: MessageService, providedIn: "root" });
27544
+ MessageService.ɵprov = ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(ɵɵinject(GraphqlService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT, 8)); }, token: MessageService, providedIn: "root" });
27509
27545
  MessageService.decorators = [
27510
27546
  { type: Injectable, args: [{ providedIn: 'root' },] }
27511
27547
  ];
@@ -27714,7 +27750,7 @@ class PersonService extends BaseEntityService {
27714
27750
  return target;
27715
27751
  }
27716
27752
  }
27717
- 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" });
27753
+ PersonService.ɵprov = ɵɵdefineInjectable({ factory: function PersonService_Factory() { return new PersonService(ɵɵinject(GraphqlService), ɵɵinject(PlatformService), ɵɵinject(NetworkService), ɵɵinject(EntitiesStorage)); }, token: PersonService, providedIn: "root" });
27718
27754
  PersonService.decorators = [
27719
27755
  { type: Injectable, args: [{ providedIn: 'root' },] }
27720
27756
  ];
@@ -27745,7 +27781,7 @@ class PersonValidatorService {
27745
27781
  return this.formBuilder.group(formConfig);
27746
27782
  }
27747
27783
  }
27748
- PersonValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
27784
+ PersonValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
27749
27785
  PersonValidatorService.decorators = [
27750
27786
  { type: Injectable, args: [{ providedIn: 'root' },] }
27751
27787
  ];
@@ -27923,7 +27959,7 @@ class UsersPage extends AppTable {
27923
27959
  UsersPage.decorators = [
27924
27960
  { type: Component, args: [{
27925
27961
  selector: 'app-users-table',
27926
- template: "<app-toolbar [title]=\"'USER.LIST.TITLE'|translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\">\n <ion-buttons slot=\"end\">\n\n <!-- Compose message -->\n <button mat-icon-button *ngIf=\"canSendMessage\"\n [title]=\"'USER.LIST.BTN_SEND_MESSAGE'|translate\"\n (click)=\"openComposeMessageModal($event)\">\n <ion-icon name=\"mail\" slot=\"icon-only\"></ion-icon>\n </button>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n </ng-container>\n\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.LIST.FILTER.SEARCH'|translate\" formControlName=\"searchText\">\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-select formControlName=\"statusId\" [placeholder]=\"'USER.STATUS'|translate\">\n <mat-option [value]=\"null\"><i><span translate>COMMON.EMPTY_OPTION</span></i></mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" visible-xs visible-sm visible-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"table-container\">\n <table #table mat-table matSort\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\" [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"avatar\" *ngIf=\"row.currentData.avatar; else generateIcon\"\n [ngStyle]=\"{'background-image':'url('+row.currentData.avatar+')'}\"></div>\n <ng-template #generateIcon>\n <div class=\"avatar\">\n <svg width=\"38\" width=\"38\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </div>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='lastName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='lastName'\">\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n </td>\n\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n\n (click)=\"focusColumn='firstName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='firstName'\">\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='email'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='email'\">\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{definition.label|translate}}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn=definition.key\">\n <app-form-field floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn===definition.ke\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='profile'\">\n <mat-form-field floatLabel=\"never\">\n <mat-select [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE'|translate\">\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ ('USER.PROFILE_ENUM.' + item) | uppercase |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='status'\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value &gt;=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value &gt;=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='username'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='username'\">\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='usernameExtranet'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='usernameExtranet'\">\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [title]=\"row.validator.controls.pubkey.valueChanges|async\"\n (click)=\"focusColumn='pubkey'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['pubkey']\" [placeholder]=\"'USER.PUBKEY'|translate\"\n [readonly]=\"!row.editing\" autocomplete=\"off\">\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-footer>\n <mat-paginator class=\"mat-paginator-footer\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"!mobile && inlineEdition\"\n (onCancel)=\"onRefresh.emit()\" (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\"></app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n",
27962
+ template: "<app-toolbar [title]=\"'USER.LIST.TITLE'|translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"!(loadingSubject|async) && dirty\"\n (onValidate)=\"save()\">\n <ion-buttons slot=\"end\">\n\n <!-- Compose message -->\n <button mat-icon-button *ngIf=\"canSendMessage\"\n [title]=\"'USER.LIST.BTN_SEND_MESSAGE'|translate\"\n (click)=\"openComposeMessageModal($event)\">\n <ion-icon name=\"mail\" slot=\"icon-only\"></ion-icon>\n </button>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\"\n *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold;\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\">filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n </ng-container>\n\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"errorSubject|async ; let error\" lines=\"none\" @slideUpDownAnimation>\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.LIST.FILTER.SEARCH'|translate\" formControlName=\"searchText\">\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-select formControlName=\"statusId\" [placeholder]=\"'USER.STATUS'|translate\">\n <mat-option [value]=\"null\"><i><span translate>COMMON.EMPTY_OPTION</span></i></mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n\n <button mat-icon-button matSuffix tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label [hidden]=\"(loadingSubject|async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\">\n {{ (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT') | translate: {\n count: (totalRowCount |\n numberFormat)\n } }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject|async\">\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" visible-xs visible-sm visible-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"table-container\">\n <table #table mat-table matSort\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\" [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <div class=\"avatar\" *ngIf=\"row.currentData.avatar; else generateIcon\"\n [ngStyle]=\"{'background-image':'url('+row.currentData.avatar+')'}\"></div>\n <ng-template #generateIcon>\n <div class=\"avatar\">\n <svg width=\"38\" width=\"38\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </div>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='lastName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='lastName'\">\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='firstName'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='firstName'\">\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn='email'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='email'\">\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{definition.label|translate}}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn=definition.key\">\n <app-form-field floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn===definition.key\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='profile'\">\n <mat-form-field floatLabel=\"never\">\n <mat-select [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE'|translate\">\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ ('USER.PROFILE_ENUM.' + item) | uppercase |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='status'\">\n <mat-form-field floatLabel=\"never\">\n <ion-icon matPrefix *ngIf=\"row.validator.controls['statusId'].value &gt;=0\" [name]=\"statusById[row.validator.controls['statusId'].value]?.icon\"></ion-icon>\n\n <mat-select [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS'|translate\">\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value &gt;=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate}}</span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label |translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='username'\">\n <mat-form-field floatLabel=\"never\" >\n <input matInput [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='username'\">\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n (click)=\"focusColumn='usernameExtranet'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET'|translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn==='usernameExtranet'\">\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [title]=\"row.validator.controls.pubkey.valueChanges|async\"\n (click)=\"focusColumn='pubkey'\">\n <mat-form-field floatLabel=\"never\">\n <input matInput [formControl]=\"row.validator.controls['pubkey']\" [placeholder]=\"'USER.PUBKEY'|translate\"\n [readonly]=\"!row.editing\" autocomplete=\"off\">\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-footer>\n <mat-paginator class=\"mat-paginator-footer\"\n [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n\n <app-form-buttons-bar *ngIf=\"!mobile && inlineEdition\"\n (onCancel)=\"onRefresh.emit()\" (onSave)=\"save()\" [disabled]=\"(loadingSubject|async) || !dirty\"></app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n",
27927
27963
  providers: [
27928
27964
  { provide: ValidatorService, useExisting: PersonValidatorService }
27929
27965
  ],
@@ -27974,17 +28010,17 @@ AdminModule.decorators = [
27974
28010
  ];
27975
28011
  AdminModule.ctorParameters = () => [];
27976
28012
 
27977
- const ɵ0 = {
28013
+ const ɵ0$c = {
27978
28014
  profile: 'ADMIN'
27979
28015
  };
27980
- const routes$6 = [
28016
+ const routes = [
27981
28017
  {
27982
28018
  path: 'users',
27983
28019
  pathMatch: 'full',
27984
28020
  component: UsersPage,
27985
28021
  canActivate: [AuthGuardService],
27986
28022
  canDeactivate: [ComponentDirtyGuard],
27987
- data: ɵ0
28023
+ data: ɵ0$c
27988
28024
  }
27989
28025
  ];
27990
28026
  class AdminRoutingModule {
@@ -27994,27 +28030,27 @@ AdminRoutingModule.decorators = [
27994
28030
  imports: [
27995
28031
  SharedRoutingModule,
27996
28032
  AdminModule,
27997
- RouterModule.forChild(routes$6)
28033
+ RouterModule.forChild(routes)
27998
28034
  ],
27999
28035
  exports: [RouterModule]
28000
28036
  },] }
28001
28037
  ];
28002
28038
 
28003
- class EntityTestClass$1 {
28039
+ class EntityTestClass {
28004
28040
  }
28005
- const FAKE_ENTITIES$1 = [
28041
+ const FAKE_ENTITIES = [
28006
28042
  { id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments... again for A' },
28007
28043
  { id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments... again for B' },
28008
28044
  { id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments... again for C' }
28009
28045
  ];
28010
- function deepCopy$1(values, size) {
28046
+ function deepCopy(values, size) {
28011
28047
  if (isNil(size)) {
28012
- return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
28048
+ return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
28013
28049
  }
28014
28050
  let result = [];
28015
28051
  let i = 1;
28016
28052
  while (result.length < size) {
28017
- result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
28053
+ result = result.concat((values || FAKE_ENTITIES).map(entity => {
28018
28054
  const name = entity.name + ' #' + i;
28019
28055
  return Object.assign(Object.assign({}, entity), { id: i++, name });
28020
28056
  }));
@@ -28024,7 +28060,7 @@ function deepCopy$1(values, size) {
28024
28060
  class AutocompleteTestPage {
28025
28061
  constructor(formBuilder) {
28026
28062
  this.formBuilder = formBuilder;
28027
- this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
28063
+ this._items = deepCopy(FAKE_ENTITIES, 100);
28028
28064
  this._$items = new BehaviorSubject(undefined);
28029
28065
  this.autocompleteFields = new MatAutocompleteConfigHolder();
28030
28066
  this.memoryHide = false;
@@ -28069,7 +28105,7 @@ class AutocompleteTestPage {
28069
28105
  });
28070
28106
  // From items
28071
28107
  this.autocompleteFields.add('entity-items-large', {
28072
- items: FAKE_ENTITIES$1.slice(),
28108
+ items: FAKE_ENTITIES.slice(),
28073
28109
  attributes: ['label', 'name', 'description', 'comments'],
28074
28110
  displayWith: this.entityToString
28075
28111
  });
@@ -28101,14 +28137,14 @@ class AutocompleteTestPage {
28101
28137
  loadData() {
28102
28138
  return __awaiter(this, void 0, void 0, function* () {
28103
28139
  const data = {
28104
- entity: deepCopy$1(FAKE_ENTITIES$1)[0],
28105
- farEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
28140
+ entity: deepCopy(FAKE_ENTITIES)[0],
28141
+ farEntity: deepCopy(FAKE_ENTITIES)[2],
28106
28142
  // This item is NOT in the items list => i should be displayed anyway
28107
28143
  missingEntity: {
28108
28144
  id: -1, label: '??', name: 'Missing item'
28109
28145
  },
28110
- disableEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
28111
- entities: deepCopy$1(FAKE_ENTITIES$1)
28146
+ disableEntity: deepCopy(FAKE_ENTITIES)[2],
28147
+ entities: deepCopy(FAKE_ENTITIES)
28112
28148
  };
28113
28149
  this.form.setValue(data);
28114
28150
  // Load observables
@@ -28258,13 +28294,13 @@ LatLongTestPage.ctorParameters = () => [
28258
28294
  { type: FormBuilder }
28259
28295
  ];
28260
28296
 
28261
- const moment$3 = momentImported;
28297
+ const moment$7 = momentImported;
28262
28298
  class SwipeTestPage {
28263
28299
  constructor(formBuilder, dateFormatPipe) {
28264
28300
  this.formBuilder = formBuilder;
28265
28301
  this.dateFormatPipe = dateFormatPipe;
28266
28302
  this.$dates = new BehaviorSubject(undefined);
28267
- this._today = moment$3().startOf('day');
28303
+ this._today = moment$7().startOf('day');
28268
28304
  this.form = formBuilder.group({
28269
28305
  empty: [null, Validators.required],
28270
28306
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -28277,7 +28313,7 @@ class SwipeTestPage {
28277
28313
  ngOnInit() {
28278
28314
  const dates = [];
28279
28315
  for (let d = 0; d < 7; d++) {
28280
- dates[d] = moment$3(this._today).add(d - 3, 'day');
28316
+ dates[d] = moment$7(this._today).add(d - 3, 'day');
28281
28317
  }
28282
28318
  this.$dates.next(dates);
28283
28319
  this.loadData();
@@ -28318,7 +28354,7 @@ SwipeTestPage.ctorParameters = () => [
28318
28354
  { type: DateFormatPipe }
28319
28355
  ];
28320
28356
 
28321
- const moment$2 = momentImported;
28357
+ const moment$8 = momentImported;
28322
28358
  class DateTimeTestPage {
28323
28359
  constructor(platform, formBuilder, cd) {
28324
28360
  this.platform = platform;
@@ -28352,7 +28388,7 @@ class DateTimeTestPage {
28352
28388
  // Load the form with data
28353
28389
  loadData() {
28354
28390
  return __awaiter(this, void 0, void 0, function* () {
28355
- const now = moment$2();
28391
+ const now = moment$8();
28356
28392
  const data = {
28357
28393
  empty: null,
28358
28394
  emptyRequired: null,
@@ -28418,9 +28454,9 @@ DateTimeTestPage.ctorParameters = () => [
28418
28454
  { type: ChangeDetectorRef }
28419
28455
  ];
28420
28456
 
28421
- class EntityTestClass {
28457
+ class EntityTestClass$1 {
28422
28458
  }
28423
- const FAKE_ENTITIES = [
28459
+ const FAKE_ENTITIES$1 = [
28424
28460
  { id: 1, label: 'AAA', name: 'Item A' },
28425
28461
  { id: 2, label: 'BBB', name: 'Item B' },
28426
28462
  { id: 3, label: 'CCC', name: 'Item C' },
@@ -28429,14 +28465,14 @@ const FAKE_ENTITIES = [
28429
28465
  { id: 6, label: 'FFF', name: 'Item F' },
28430
28466
  { id: 7, label: 'GGG', name: 'Item G' }
28431
28467
  ];
28432
- function deepCopy(values, size) {
28468
+ function deepCopy$1(values, size) {
28433
28469
  if (isNil(size)) {
28434
- return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
28470
+ return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
28435
28471
  }
28436
28472
  let result = [];
28437
28473
  let i = 1;
28438
28474
  while (result.length < size) {
28439
- result = result.concat((values || FAKE_ENTITIES).map(entity => {
28475
+ result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
28440
28476
  const name = entity.name + ' #' + i;
28441
28477
  return Object.assign(Object.assign({}, entity), { id: i++, name });
28442
28478
  }));
@@ -28446,7 +28482,7 @@ function deepCopy(values, size) {
28446
28482
  class ChipsTestPage {
28447
28483
  constructor(formBuilder) {
28448
28484
  this.formBuilder = formBuilder;
28449
- this._items = deepCopy(FAKE_ENTITIES, 100);
28485
+ this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
28450
28486
  this._$items = new BehaviorSubject(undefined);
28451
28487
  this.autocompleteFields = new MatAutocompleteConfigHolder();
28452
28488
  this.appearance = 'legacy';
@@ -28486,7 +28522,7 @@ class ChipsTestPage {
28486
28522
  // Load the form with data
28487
28523
  loadData() {
28488
28524
  return __awaiter(this, void 0, void 0, function* () {
28489
- const items = deepCopy(FAKE_ENTITIES);
28525
+ const items = deepCopy$1(FAKE_ENTITIES$1);
28490
28526
  const data = {
28491
28527
  entity: items.slice(0, 1),
28492
28528
  entityInitial: items.slice(1, 2),
@@ -28602,7 +28638,7 @@ NumpadTestPage.ctorParameters = () => [
28602
28638
  { type: FormBuilder }
28603
28639
  ];
28604
28640
 
28605
- const moment$1 = momentImported;
28641
+ const moment$9 = momentImported;
28606
28642
  class DateTestPage {
28607
28643
  constructor(formBuilder, cd) {
28608
28644
  this.formBuilder = formBuilder;
@@ -28635,7 +28671,7 @@ class DateTestPage {
28635
28671
  // Load the form with data
28636
28672
  loadData() {
28637
28673
  return __awaiter(this, void 0, void 0, function* () {
28638
- const now = moment$1();
28674
+ const now = moment$9();
28639
28675
  const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
28640
28676
  const data = {
28641
28677
  empty: null,
@@ -28713,7 +28749,7 @@ const SHARED_MATERIAL_TESTING_PAGES = [
28713
28749
  { label: 'Shared directives', divider: true },
28714
28750
  { label: 'Badge icon directive', page: '/testing/shared/badge-icon' }
28715
28751
  ];
28716
- const routes$5 = [
28752
+ const routes$1 = [
28717
28753
  {
28718
28754
  path: '',
28719
28755
  pathMatch: 'full',
@@ -28770,7 +28806,7 @@ MaterialTestingModule.decorators = [
28770
28806
  ReactiveFormsModule,
28771
28807
  SharedMaterialModule,
28772
28808
  TranslateModule.forChild(),
28773
- RouterModule.forChild(routes$5)
28809
+ RouterModule.forChild(routes$1)
28774
28810
  ],
28775
28811
  declarations: [
28776
28812
  DateTimeTestPage,
@@ -28831,7 +28867,7 @@ ToastTestingPage.ctorParameters = () => [
28831
28867
  { type: TranslateService }
28832
28868
  ];
28833
28869
 
28834
- const routes$4 = [
28870
+ const routes$2 = [
28835
28871
  {
28836
28872
  path: 'toast',
28837
28873
  pathMatch: 'full',
@@ -28846,7 +28882,7 @@ ToastTestingModule.decorators = [
28846
28882
  CommonModule,
28847
28883
  IonicModule,
28848
28884
  TranslateModule.forChild(),
28849
- RouterModule.forChild(routes$4)
28885
+ RouterModule.forChild(routes$2)
28850
28886
  ],
28851
28887
  declarations: [
28852
28888
  ToastTestingPage
@@ -29110,7 +29146,7 @@ class TableTestPage extends AppTable {
29110
29146
  console.debug('[test-table] Destroying table...');
29111
29147
  super.ngOnDestroy();
29112
29148
  this.stopTimer();
29113
- this.dataService.ngOnDestroy();
29149
+ this.dataService.stop();
29114
29150
  }
29115
29151
  restoreFilter() {
29116
29152
  const json = this.settings.getPageSettings(this.settingsId, 'filter');
@@ -29301,7 +29337,7 @@ TextPopoverTestingPage.ctorParameters = () => [
29301
29337
  { type: PopoverController }
29302
29338
  ];
29303
29339
 
29304
- const routes$2 = [
29340
+ const routes$4 = [
29305
29341
  {
29306
29342
  path: 'text-popover',
29307
29343
  pathMatch: 'full',
@@ -29316,7 +29352,7 @@ TextPopoverTestingModule.decorators = [
29316
29352
  CommonModule,
29317
29353
  IonicModule,
29318
29354
  TranslateModule.forChild(),
29319
- RouterModule.forChild(routes$2)
29355
+ RouterModule.forChild(routes$4)
29320
29356
  ],
29321
29357
  declarations: [
29322
29358
  TextPopoverTestingPage
@@ -29333,7 +29369,7 @@ const CORE_TESTING_PAGES = [
29333
29369
  { label: 'Table', page: '/testing/core/table' },
29334
29370
  { label: 'Text popover', page: '/testing/core/text-popover' }
29335
29371
  ];
29336
- const routes$1 = [
29372
+ const routes$5 = [
29337
29373
  {
29338
29374
  path: '',
29339
29375
  pathMatch: 'full',
@@ -29357,7 +29393,7 @@ CoreTestingModule.decorators = [
29357
29393
  imports: [
29358
29394
  CommonModule,
29359
29395
  TranslateModule.forChild(),
29360
- RouterModule.forChild(routes$1),
29396
+ RouterModule.forChild(routes$5),
29361
29397
  // Sub modules
29362
29398
  TableTestingModule,
29363
29399
  TextPopoverTestingModule
@@ -29660,7 +29696,7 @@ UserEventTestService.ctorParameters = () => [
29660
29696
  { type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
29661
29697
  ];
29662
29698
 
29663
- const moment = momentImported;
29699
+ const moment$a = momentImported;
29664
29700
  class UserEventTestingPage {
29665
29701
  constructor(userEventService, router, alertController, translateService) {
29666
29702
  this.userEventService = userEventService;
@@ -29721,7 +29757,7 @@ class UserEventTestingPage {
29721
29757
  type: 'message',
29722
29758
  level: 'INFO',
29723
29759
  message: 'message test message test message test message test message test message test message test message test',
29724
- creationDate: moment(),
29760
+ creationDate: moment$a(),
29725
29761
  }));
29726
29762
  }
29727
29763
  addError() {
@@ -29731,7 +29767,7 @@ class UserEventTestingPage {
29731
29767
  type: 'upload',
29732
29768
  level: 'ERROR',
29733
29769
  message: 'message error',
29734
- creationDate: moment(),
29770
+ creationDate: moment$a(),
29735
29771
  }));
29736
29772
  }
29737
29773
  addWarning() {
@@ -29741,7 +29777,7 @@ class UserEventTestingPage {
29741
29777
  type: 'download',
29742
29778
  level: 'WARNING',
29743
29779
  message: 'message warning',
29744
- creationDate: moment(),
29780
+ creationDate: moment$a(),
29745
29781
  }));
29746
29782
  }
29747
29783
  addDebug() {
@@ -29751,7 +29787,7 @@ class UserEventTestingPage {
29751
29787
  type: 'debug',
29752
29788
  level: 'DEBUG',
29753
29789
  message: 'message DEBUG',
29754
- creationDate: moment(),
29790
+ creationDate: moment$a(),
29755
29791
  }));
29756
29792
  }
29757
29793
  addNotificationWithLink() {
@@ -29761,7 +29797,7 @@ class UserEventTestingPage {
29761
29797
  type: 'message',
29762
29798
  level: 'INFO',
29763
29799
  message: 'message with link',
29764
- creationDate: moment(),
29800
+ creationDate: moment$a(),
29765
29801
  actions: [{
29766
29802
  name: 'click here',
29767
29803
  iconRef: {
@@ -29778,7 +29814,7 @@ class UserEventTestingPage {
29778
29814
  type: 'message',
29779
29815
  level: 'INFO',
29780
29816
  message: 'message with action',
29781
- creationDate: moment(),
29817
+ creationDate: moment$a(),
29782
29818
  actions: [
29783
29819
  {
29784
29820
  name: 'click here',
@@ -29850,7 +29886,7 @@ class UserEventTestingPage {
29850
29886
  type: 'message',
29851
29887
  level: 'INFO',
29852
29888
  message: 'message with action',
29853
- creationDate: moment(),
29889
+ creationDate: moment$a(),
29854
29890
  actions: [
29855
29891
  {
29856
29892
  default: true,
@@ -29904,7 +29940,7 @@ const SOCIAL_TESTING_PAGES = [
29904
29940
  { label: 'User event', page: '/testing/social/user-event' },
29905
29941
  { label: 'Job progression', page: '/testing/social/job-progression' }
29906
29942
  ];
29907
- const routes = [
29943
+ const routes$6 = [
29908
29944
  {
29909
29945
  path: 'job-progression',
29910
29946
  pathMatch: 'full',
@@ -29923,7 +29959,7 @@ SocialTestingModule.decorators = [
29923
29959
  imports: [
29924
29960
  CommonModule,
29925
29961
  TranslateModule.forChild(),
29926
- RouterModule.forChild(routes),
29962
+ RouterModule.forChild(routes$6),
29927
29963
  JobTestingModule,
29928
29964
  UserEventTestingModule
29929
29965
  ],
@@ -29936,5 +29972,5 @@ SocialTestingModule.decorators = [
29936
29972
  * Generated bundle index. Do not edit.
29937
29973
  */
29938
29974
 
29939
- export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, 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_MENU_OPTIONS, APP_TESTING_PAGES, AboutModal, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppIconComponent, AppIconModule, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableUtils, AppUserEventNotificationIcon, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, ImagesUtils, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, Job, JobModule, JobProgression, JobProgressionComponent, JobProgressionService, JobProgressionServiceToken, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, 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, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuOptions, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, ResizableComponent, ResizableDirective, ResizableModule, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, USER_EVENT_SERVICE, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UserEventModule, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, 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, isAndroid, isBlankString, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moment$5 as moment, 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, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, tz, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending, ɵ0$c 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, AppUpdateOfflineModeCard as ɵi, UserEventNotificationList as ɵj, JobProgressionList as ɵk, DateTestPage as ɵl, NumpadTestPage as ɵm, MatBadgeIconTestPage as ɵn, ToastTestingModule as ɵo, ToastTestingPage as ɵp };
29975
+ export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, 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_MENU_OPTIONS, APP_TESTING_PAGES, AboutModal, AbstractUserEventService, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppEntityEditorModal, AppEntityEditorModalOptions, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppIconComponent, AppIconModule, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableUtils, AppUserEventNotificationIcon, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutoTitleDirective, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, CsvUtils, DATE_ISO_PATTERN, DATE_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_MENU_SHOW_WHEN, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, FormGetValuePipe, Fragments$1 as Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, IMAGE_DEFAULTS, ImagesUtils, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, Job, JobModule, JobProgression, JobProgressionComponent, JobProgressionService, JobProgressionServiceToken, JobProgressionTestService, JobProgressionTestingPage, JobTestingModule, 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, MOMENT_NO_TIME_PROPERTY, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuOptions, MenuService, Message, MessageFilter, MessageForm, MessageModal, MessageModule, MessageService, MessageTypeList, MessageTypes, MimeTypes, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyFormatPipe, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, ResizableComponent, ResizableDirective, ResizableModule, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SOCIAL_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, ServerErrorCodes, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialErrorCodes, SocialModule, SocialModuleOptionsToken, SocialTestingModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, USER_EVENT_SERVICE, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UriUtils, UserEventModule, UserEventTestService, UserEventTestingModule, UserEventTestingPage, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, escapeRegExp, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, 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, isAndroid, isBlankString, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilBoolean, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moment$5 as moment, 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, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, tz, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForFalse, waitForTrue, waitIdle, waitWhilePending, ɵ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, AppUpdateOfflineModeCard as ɵi, UserEventNotificationList as ɵj, JobProgressionList as ɵk, DateTestPage as ɵl, NumpadTestPage as ɵm, MatBadgeIconTestPage as ɵn, ToastTestingModule as ɵo, ToastTestingPage as ɵp };
29940
29976
  //# sourceMappingURL=sumaris-net.ngx-components.js.map