@sumaris-net/ngx-components 1.23.8 → 1.23.11

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 (29) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +530 -492
  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 +63 -54
  13. package/esm2015/src/app/core/table/testing/table.testing.js +3 -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 +76 -33
  18. package/esm2015/src/app/shared/services/startable-service.class.js +21 -13
  19. package/fesm2015/sumaris-net.ngx-components.js +438 -397
  20. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  21. package/package.json +3 -3
  22. package/src/app/core/form/editor.class.d.ts +2 -1
  23. package/src/app/core/services/network.service.d.ts +1 -1
  24. package/src/app/core/table/table.class.d.ts +2 -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 -7
  27. package/src/app/shared/services/startable-service.class.d.ts +4 -2
  28. package/src/theme/_ngx-components.scss +5 -0
  29. 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
  ];
@@ -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,37 @@ class InMemoryEntitiesService extends EntitiesService {
18186
18171
  get value() {
18187
18172
  return this.dataSubject.getValue();
18188
18173
  }
18189
- ngOnDestroy() {
18190
- if (this.debug)
18191
- console.debug('[memory-data-service] Destroying...');
18192
- this.dataSubject.complete();
18193
- this.dataSubject.unsubscribe();
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
+ });
18194
18196
  }
18195
18197
  setValue(data) {
18196
18198
  if (this.dataSubject.value !== data) {
18199
+ if (!this.started)
18200
+ this.start();
18197
18201
  this._hiddenData = [];
18198
18202
  this.dataSubject.next(data);
18199
18203
  }
18200
- this.dirty = false;
18204
+ this.markAsPristine();
18201
18205
  }
18202
18206
  loadAll(offset, size, sortBy, sortDirection, filter, opts) {
18203
18207
  return __awaiter(this, void 0, void 0, function* () {
@@ -18207,9 +18211,8 @@ class InMemoryEntitiesService extends EntitiesService {
18207
18211
  if (isNil(originalData)) {
18208
18212
  console.warn('[memory-data-service] Cannot load all: no value set. Will return empty result');
18209
18213
  }
18210
- // Wait end of saving
18211
- if (this._saving)
18212
- yield waitFor(() => !this._saving);
18214
+ // Wait while idle
18215
+ yield this.waitWhileSaving();
18213
18216
  const excludedDataByFilter = [];
18214
18217
  let excludedDataByPagination;
18215
18218
  try {
@@ -18291,9 +18294,9 @@ class InMemoryEntitiesService extends EntitiesService {
18291
18294
  offset = offset >= 0 ? offset : 0;
18292
18295
  size = size >= 0 ? size : -1;
18293
18296
  return this.dataSubject
18294
- .pipe(
18297
+ .pipe(takeUntil(this.stopSubject),
18295
18298
  // 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)));
18299
+ 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
18300
  }
18298
18301
  saveAll(data, options) {
18299
18302
  return __awaiter(this, void 0, void 0, function* () {
@@ -18309,7 +18312,7 @@ class InMemoryEntitiesService extends EntitiesService {
18309
18312
  data = ((res instanceof Promise)) ? yield res : res;
18310
18313
  }
18311
18314
  this.dataSubject.next(data);
18312
- this.dirty = true;
18315
+ this.markAsDirty();
18313
18316
  return data;
18314
18317
  }
18315
18318
  finally {
@@ -18322,16 +18325,22 @@ class InMemoryEntitiesService extends EntitiesService {
18322
18325
  let data = this.dataSubject.value;
18323
18326
  if (!data)
18324
18327
  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);
18328
+ this.markAsSaving();
18329
+ try {
18330
+ // Remove deleted item, from data
18331
+ const updatedData = data.filter(entity => {
18332
+ const removed = dataToRemove.findIndex(entityToRemove => this.equals(entityToRemove, entity)) !== -1;
18333
+ return !removed;
18334
+ });
18335
+ const deleteCount = data.length - updatedData.length;
18336
+ if (deleteCount > 0) {
18337
+ data = updatedData;
18338
+ this.dataSubject.next(data);
18339
+ this.markAsDirty();
18340
+ }
18341
+ }
18342
+ finally {
18343
+ this.markAsSaved();
18335
18344
  }
18336
18345
  });
18337
18346
  }
@@ -18388,11 +18397,30 @@ class InMemoryEntitiesService extends EntitiesService {
18388
18397
  return { data, total };
18389
18398
  }));
18390
18399
  }
18400
+ waitWhileSaving(opts) {
18401
+ if (!this.saving)
18402
+ return;
18403
+ return firstFalsePromise(this.savingSubject, Object.assign({ stop: (opts === null || opts === void 0 ? void 0 : opts.stop) || merge(this.stopSubject, this.dataSubject) }, opts));
18404
+ }
18391
18405
  markAsSaving() {
18392
- this._saving = true;
18406
+ if (!this.savingSubject.value) {
18407
+ this.savingSubject.next(true);
18408
+ }
18393
18409
  }
18394
18410
  markAsSaved() {
18395
- this._saving = false;
18411
+ if (this.savingSubject.value) {
18412
+ this.savingSubject.next(false);
18413
+ }
18414
+ }
18415
+ markAsDirty() {
18416
+ if (!this.dirtySubject.value) {
18417
+ this.dirtySubject.next(true);
18418
+ }
18419
+ }
18420
+ markAsPristine() {
18421
+ if (this.dirtySubject.value) {
18422
+ this.dirtySubject.next(false);
18423
+ }
18396
18424
  }
18397
18425
  }
18398
18426
  InMemoryEntitiesService.decorators = [
@@ -18716,7 +18744,7 @@ function state2side(state) {
18716
18744
  return 1;
18717
18745
  }
18718
18746
  }
18719
- const ɵ0$1 = (defaultStateSize) => [
18747
+ const ɵ0$b = (defaultStateSize) => [
18720
18748
  Math.round((rgbArrayMap.red[0] - 50) / defaultStateSize),
18721
18749
  Math.round((255 - rgbArrayMap.red[1]) / defaultStateSize),
18722
18750
  Math.round((255 - rgbArrayMap.red[2]) / defaultStateSize)
@@ -18724,7 +18752,7 @@ const ɵ0$1 = (defaultStateSize) => [
18724
18752
  const SCALE_OPTIONS_DEFAULT = {
18725
18753
  startColor: rgbArrayMap.red,
18726
18754
  startStates: [0, 2, 3],
18727
- startStepsFn: ɵ0$1
18755
+ startStepsFn: ɵ0$b
18728
18756
  };
18729
18757
  /**
18730
18758
  * Internal function, that create a colors scale, using iteration
@@ -19531,7 +19559,7 @@ class UserSettingsValidatorService extends AppValidatorService {
19531
19559
  });
19532
19560
  }
19533
19561
  }
19534
- UserSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
19562
+ UserSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function UserSettingsValidatorService_Factory() { return new UserSettingsValidatorService(ɵɵinject(FormBuilder)); }, token: UserSettingsValidatorService, providedIn: "root" });
19535
19563
  UserSettingsValidatorService.decorators = [
19536
19564
  { type: Injectable, args: [{ providedIn: 'root' },] }
19537
19565
  ];
@@ -19575,7 +19603,7 @@ class AccountValidatorService extends AppValidatorService {
19575
19603
  return validatorFns.length ? Validators.compose(validatorFns) : validatorFns.length === 1 ? validatorFns[0] : undefined;
19576
19604
  }
19577
19605
  }
19578
- AccountValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
19606
+ AccountValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function AccountValidatorService_Factory() { return new AccountValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountService)); }, token: AccountValidatorService, providedIn: "root" });
19579
19607
  AccountValidatorService.decorators = [
19580
19608
  { type: Injectable, args: [{ providedIn: 'root' },] }
19581
19609
  ];
@@ -19869,7 +19897,7 @@ class MenuService {
19869
19897
  this._$opened.next(false);
19870
19898
  }
19871
19899
  }
19872
- MenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
19900
+ MenuService.ɵprov = ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(); }, token: MenuService, providedIn: "root" });
19873
19901
  MenuService.decorators = [
19874
19902
  { type: Injectable, args: [{
19875
19903
  providedIn: 'root'
@@ -20205,7 +20233,7 @@ class LocalSettingsValidatorService extends AppValidatorService {
20205
20233
  });
20206
20234
  }
20207
20235
  }
20208
- LocalSettingsValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
20236
+ LocalSettingsValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function LocalSettingsValidatorService_Factory() { return new LocalSettingsValidatorService(ɵɵinject(FormBuilder), ɵɵinject(NetworkService)); }, token: LocalSettingsValidatorService, providedIn: "root" });
20209
20237
  LocalSettingsValidatorService.decorators = [
20210
20238
  { type: Injectable, args: [{ providedIn: 'root' },] }
20211
20239
  ];
@@ -20824,7 +20852,7 @@ class IsOnFieldModePipe {
20824
20852
  return value === 'FIELD';
20825
20853
  }
20826
20854
  }
20827
- IsOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20855
+ IsOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsOnFieldModePipe_Factory() { return new IsOnFieldModePipe(); }, token: IsOnFieldModePipe, providedIn: "root" });
20828
20856
  IsOnFieldModePipe.decorators = [
20829
20857
  { type: Pipe, args: [{
20830
20858
  name: 'isOnField'
@@ -20836,7 +20864,7 @@ class IsNotOnFieldModePipe {
20836
20864
  return value !== 'FIELD';
20837
20865
  }
20838
20866
  }
20839
- IsNotOnFieldModePipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20867
+ IsNotOnFieldModePipe.ɵprov = ɵɵdefineInjectable({ factory: function IsNotOnFieldModePipe_Factory() { return new IsNotOnFieldModePipe(); }, token: IsNotOnFieldModePipe, providedIn: "root" });
20840
20868
  IsNotOnFieldModePipe.decorators = [
20841
20869
  { type: Pipe, args: [{
20842
20870
  name: 'isNotOnField'
@@ -20851,7 +20879,7 @@ class PersonToStringPipe {
20851
20879
  return PersonUtils.personToString(value);
20852
20880
  }
20853
20881
  }
20854
- PersonToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20882
+ PersonToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function PersonToStringPipe_Factory() { return new PersonToStringPipe(); }, token: PersonToStringPipe, providedIn: "root" });
20855
20883
  PersonToStringPipe.decorators = [
20856
20884
  { type: Pipe, args: [{
20857
20885
  name: 'personToString'
@@ -21204,7 +21232,7 @@ class IsLoginAccountPipe {
21204
21232
  return value && value.pubkey && true;
21205
21233
  }
21206
21234
  }
21207
- IsLoginAccountPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
21235
+ IsLoginAccountPipe.ɵprov = ɵɵdefineInjectable({ factory: function IsLoginAccountPipe_Factory() { return new IsLoginAccountPipe(); }, token: IsLoginAccountPipe, providedIn: "root" });
21208
21236
  IsLoginAccountPipe.decorators = [
21209
21237
  { type: Pipe, args: [{
21210
21238
  name: 'isLogin'
@@ -21216,7 +21244,7 @@ class AccountToStringPipe {
21216
21244
  return accountToString(value);
21217
21245
  }
21218
21246
  }
21219
- AccountToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
21247
+ AccountToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function AccountToStringPipe_Factory() { return new AccountToStringPipe(); }, token: AccountToStringPipe, providedIn: "root" });
21220
21248
  AccountToStringPipe.decorators = [
21221
21249
  { type: Pipe, args: [{
21222
21250
  name: 'accountToString'
@@ -21231,7 +21259,7 @@ class DepartmentToStringPipe {
21231
21259
  return departmentToString(value);
21232
21260
  }
21233
21261
  }
21234
- DepartmentToStringPipe.ɵprov = i0.ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
21262
+ DepartmentToStringPipe.ɵprov = ɵɵdefineInjectable({ factory: function DepartmentToStringPipe_Factory() { return new DepartmentToStringPipe(); }, token: DepartmentToStringPipe, providedIn: "root" });
21235
21263
  DepartmentToStringPipe.decorators = [
21236
21264
  { type: Pipe, args: [{
21237
21265
  name: 'departmentToString'
@@ -21866,7 +21894,7 @@ class AuthGuardService {
21866
21894
  }));
21867
21895
  }
21868
21896
  }
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" });
21897
+ AuthGuardService.ɵprov = ɵɵdefineInjectable({ factory: function AuthGuardService_Factory() { return new AuthGuardService(ɵɵinject(AccountService), ɵɵinject(ModalController), ɵɵinject(Router), ɵɵinject(ENVIRONMENT)); }, token: AuthGuardService, providedIn: "root" });
21870
21898
  AuthGuardService.decorators = [
21871
21899
  { type: Injectable, args: [{ providedIn: 'root' },] }
21872
21900
  ];
@@ -22615,7 +22643,7 @@ class EntitiesTableDataSource extends TableDataSource {
22615
22643
  this.handleServiceError(err);
22616
22644
  }
22617
22645
  finally {
22618
- this.loadingSubject.next(false);
22646
+ this.markAsLoaded();
22619
22647
  }
22620
22648
  });
22621
22649
  }
@@ -23064,42 +23092,11 @@ class AppTable {
23064
23092
  this.listenDatasourceLoading(this._dataSource);
23065
23093
  }
23066
23094
  ngAfterViewInit() {
23067
- if (this.debug) {
23068
- // Warn if table not exists
23069
- if (!this.table) {
23070
- setTimeout(() => {
23071
- if (!this.table) {
23072
- console.warn(`[table] Missing <mat-table> in the HTML template (after waiting 500ms)! Component: ${this.constructor.name}`);
23073
- }
23074
- }, 500);
23075
- }
23076
- if (!this.displayedColumns)
23077
- console.warn(`[table] Missing 'displayedColumns'. Did you call super.ngOnInit() in component ${this.constructor.name} ?`);
23078
- }
23079
- merge(
23080
- // Listen sort events
23081
- this.sort && this.sort.sortChange
23082
- .pipe(filter(() => !this.sort.disabled), mergeMap(() => __awaiter(this, void 0, void 0, function* () { return this.saveBeforeAction('sort'); })), filter(res => res === true),
23083
- // Save sort in settings
23084
- tap(() => {
23085
- const value = [this.sort.active, this.sort.direction || 'asc'].join(':');
23086
- this.settings.savePageSetting(this.settingsId, value, SETTINGS_SORTED_COLUMN);
23087
- }))
23088
- || EMPTY,
23089
- // Listen paginator events
23090
- this.paginator && this.paginator.page
23091
- .pipe(mergeMap(() => __awaiter(this, void 0, void 0, function* () { return this.saveBeforeAction('sort'); })), filter(res => res === true),
23092
- // Save page size
23093
- tap(() => this.settings.savePageSetting(this.settingsId, this.paginator.pageSize, SETTINGS_PAGE_SIZE))) || EMPTY).subscribe(value => {
23094
- this.onSort.emit();
23095
- this.onRefresh.emit(value);
23096
- });
23097
- // If the user changes the sort order, reset back to the first page.
23098
- if (this.sort && this.paginator) {
23099
- this.registerSubscription(this.sort.sortChange
23100
- .pipe(filter(() => !this.sort.disabled))
23101
- .subscribe(() => this.paginator.pageIndex = 0));
23102
- }
23095
+ // Detect when super.ngOnInit() not call
23096
+ if (this.debug && !this.displayedColumns)
23097
+ console.warn(`[table] Missing 'displayedColumns'. Did you call super.ngOnInit() in component ${this.constructor.name} ?`);
23098
+ // Start listening sort and paginator events
23099
+ this.listenSortAndPaginationEvents();
23103
23100
  }
23104
23101
  ngOnDestroy() {
23105
23102
  var _a;
@@ -23235,19 +23232,6 @@ class AppTable {
23235
23232
  this.editRowById(event, row.id + 1, { focusColumn: this.firstUserColumn });
23236
23233
  return true;
23237
23234
  }
23238
- editRowById(event, id, opts) {
23239
- return __awaiter(this, void 0, void 0, function* () {
23240
- if (id < 0)
23241
- return;
23242
- if (id >= this.visibleRowCount) {
23243
- this.addRow(event, undefined, Object.assign(Object.assign({}, opts), { editing: true }));
23244
- }
23245
- else {
23246
- const row = yield this.dataSource.getRow(id);
23247
- this.editRow(event, row, opts);
23248
- }
23249
- });
23250
- }
23251
23235
  /**
23252
23236
  * Confirm the creation of the given row, or if not specified the currently edited row
23253
23237
  *
@@ -23262,6 +23246,7 @@ class AppTable {
23262
23246
  // Stop event
23263
23247
  event === null || event === void 0 ? void 0 : event.stopPropagation();
23264
23248
  // Confirmation edition or creation
23249
+ // TODO: add await ?
23265
23250
  const confirmed = row.confirmEditCreate();
23266
23251
  if (confirmed) {
23267
23252
  // If edit finished, forget edited row
@@ -23280,6 +23265,7 @@ class AppTable {
23280
23265
  }
23281
23266
  if (row.validator) {
23282
23267
  // If pending: Wait end of validation, then loop
23268
+ // TODO: remove when using async isValid() function
23283
23269
  if (row.validator.pending) {
23284
23270
  AppFormUtils.waitWhilePending(row.validator).then(() => this.confirmEditCreate(event, row));
23285
23271
  return false;
@@ -23430,7 +23416,7 @@ class AppTable {
23430
23416
  this.selection.clear();
23431
23417
  }
23432
23418
  else {
23433
- const rows = yield this._dataSource.getRows();
23419
+ const rows = this._dataSource.getRows();
23434
23420
  rows.forEach(row => this.selection.select(row));
23435
23421
  }
23436
23422
  });
@@ -23569,7 +23555,7 @@ class AppTable {
23569
23555
  if (data === undefined)
23570
23556
  return Promise.resolve(false);
23571
23557
  yield this.waitIdle();
23572
- const row = ((yield this.dataSource.getRows()) || [])
23558
+ const row = this.dataSource.getRows()
23573
23559
  .find(row => this.equals(row.currentData, data));
23574
23560
  if (!row)
23575
23561
  return false;
@@ -23796,7 +23782,7 @@ class AppTable {
23796
23782
  canCancelRows(rows, opts) {
23797
23783
  return __awaiter(this, void 0, void 0, function* () {
23798
23784
  // Get dirty rows
23799
- rows = rows || (yield this.dataSource.getRows()).filter(row => { var _a; return (_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty; });
23785
+ rows = rows || this.dataSource.getRows().filter(row => { var _a; return (_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty; });
23800
23786
  if (isEmptyArray(rows))
23801
23787
  return true; // No dirty: OK
23802
23788
  // Check using emitter
@@ -24123,6 +24109,57 @@ class AppTable {
24123
24109
  this.markAsDirty(opts);
24124
24110
  }
24125
24111
  /* -- private method -- */
24112
+ listenSortAndPaginationEvents() {
24113
+ return __awaiter(this, void 0, void 0, function* () {
24114
+ if (!this.table) {
24115
+ // DEBUG only -- alert user that table not found in template
24116
+ if (this.debug) {
24117
+ setTimeout(() => !this.table && console.warn(`[table] Missing <mat-table> in the HTML template (after waiting 500ms)! Component: ${this.constructor.name}`), 500);
24118
+ }
24119
+ // Make sure to wait the table
24120
+ yield waitFor(() => !!this.table, { stop: this.destroySubject });
24121
+ }
24122
+ this.registerSubscription(merge(
24123
+ // Listen sort events
24124
+ this.sort && this.sort.sortChange
24125
+ .pipe(filter(() => !this.sort.disabled), mergeMap(() => __awaiter(this, void 0, void 0, function* () { return this.saveBeforeAction('sort'); })), filter(res => res === true),
24126
+ // Save sort in settings
24127
+ tap(() => {
24128
+ const value = [this.sort.active, this.sort.direction || 'asc'].join(':');
24129
+ this.settings.savePageSetting(this.settingsId, value, SETTINGS_SORTED_COLUMN);
24130
+ }))
24131
+ || EMPTY,
24132
+ // Listen paginator events
24133
+ this.paginator && this.paginator.page
24134
+ .pipe(mergeMap((event) => __awaiter(this, void 0, void 0, function* () { return this.saveBeforeAction('sort'); })), filter(res => res === true),
24135
+ // Save page size in settings
24136
+ tap(() => this.settings.savePageSetting(this.settingsId, this.paginator.pageSize, SETTINGS_PAGE_SIZE))) || EMPTY)
24137
+ // Refresh on any sort or paginator events
24138
+ .subscribe(value => {
24139
+ this.onSort.emit(value);
24140
+ this.onRefresh.emit(value);
24141
+ }));
24142
+ // If the user changes the sort order, reset back to the first page.
24143
+ if (this.sort && this.paginator) {
24144
+ this.registerSubscription(this.sort.sortChange
24145
+ .pipe(filter(() => !this.sort.disabled))
24146
+ .subscribe(() => this.paginator.pageIndex = 0));
24147
+ }
24148
+ });
24149
+ }
24150
+ editRowById(event, id, opts) {
24151
+ return __awaiter(this, void 0, void 0, function* () {
24152
+ if (id < 0)
24153
+ return;
24154
+ if (id >= this.visibleRowCount) {
24155
+ this.addRow(event, undefined, Object.assign(Object.assign({}, opts), { editing: true }));
24156
+ }
24157
+ else {
24158
+ const row = yield this.dataSource.getRow(id);
24159
+ this.editRow(event, row, opts);
24160
+ }
24161
+ });
24162
+ }
24126
24163
  setLoading(value, opts) {
24127
24164
  if (this.loadingSubject.value !== value) {
24128
24165
  this.loadingSubject.next(value);
@@ -24525,13 +24562,14 @@ class AppEditor {
24525
24562
  }
24526
24563
  }
24527
24564
  markAsLoaded(opts) {
24528
- var _a;
24565
+ var _a, _b;
24529
24566
  if (this.loadingSubject.value) {
24530
24567
  this.loadingSubject.next(false);
24531
24568
  if (!opts || opts.onlySelf !== true) {
24532
- // Emit to children forms
24533
- // Tables should be changed by parent
24534
- (_a = this.forms) === null || _a === void 0 ? void 0 : _a.forEach(c => c.markAsLoaded(opts));
24569
+ // Emit to children forms and editors
24570
+ // note: tables should be changed by parent
24571
+ (_a = this.forms) === null || _a === void 0 ? void 0 : _a.forEach(f => f.markAsLoaded(opts));
24572
+ (_b = this.editors) === null || _b === void 0 ? void 0 : _b.forEach(e => e.markAsLoaded(opts));
24535
24573
  }
24536
24574
  if (!opts || opts.emitEvent !== false) {
24537
24575
  this.markForCheck();
@@ -24669,39 +24707,41 @@ class AppEditor {
24669
24707
  return __awaiter(this, void 0, void 0, function* () {
24670
24708
  if (!this.dirty)
24671
24709
  return true;
24672
- let confirm = false;
24673
- let cancel = false;
24674
- const translations = this.translate.instant(['COMMON.BTN_SAVE', 'COMMON.BTN_CANCEL', 'COMMON.BTN_ABORT_CHANGES', 'CONFIRM.SAVE', 'CONFIRM.ALERT_HEADER']);
24675
- const alert = yield this.alertCtrl.create({
24676
- header: translations['CONFIRM.ALERT_HEADER'],
24677
- message: translations['CONFIRM.SAVE'],
24678
- buttons: [
24679
- {
24680
- text: translations['COMMON.BTN_CANCEL'],
24681
- role: 'cancel',
24682
- cssClass: 'secondary',
24683
- handler: () => {
24684
- cancel = true;
24685
- }
24686
- },
24687
- {
24688
- text: translations['COMMON.BTN_ABORT_CHANGES'],
24689
- cssClass: 'secondary',
24690
- handler: () => {
24691
- }
24692
- },
24693
- {
24694
- text: translations['COMMON.BTN_SAVE'],
24695
- handler: () => {
24696
- confirm = true; // update upper value
24710
+ let confirmed = (opts === null || opts === void 0 ? void 0 : opts.confirmed) || false;
24711
+ if (!confirmed) {
24712
+ let cancel = false;
24713
+ const translations = this.translate.instant(['COMMON.BTN_SAVE', 'COMMON.BTN_CANCEL', 'COMMON.BTN_ABORT_CHANGES', 'CONFIRM.SAVE', 'CONFIRM.ALERT_HEADER']);
24714
+ const alert = yield this.alertCtrl.create({
24715
+ header: translations['CONFIRM.ALERT_HEADER'],
24716
+ message: translations['CONFIRM.SAVE'],
24717
+ buttons: [
24718
+ {
24719
+ text: translations['COMMON.BTN_CANCEL'],
24720
+ role: 'cancel',
24721
+ cssClass: 'secondary',
24722
+ handler: () => {
24723
+ cancel = true;
24724
+ }
24725
+ },
24726
+ {
24727
+ text: translations['COMMON.BTN_ABORT_CHANGES'],
24728
+ cssClass: 'secondary',
24729
+ handler: () => {
24730
+ }
24731
+ },
24732
+ {
24733
+ text: translations['COMMON.BTN_SAVE'],
24734
+ handler: () => {
24735
+ confirmed = true; // update upper value
24736
+ }
24697
24737
  }
24698
- }
24699
- ]
24700
- });
24701
- yield alert.present();
24702
- yield alert.onDidDismiss();
24703
- if (!confirm) {
24704
- return !cancel;
24738
+ ]
24739
+ });
24740
+ yield alert.present();
24741
+ yield alert.onDidDismiss();
24742
+ if (!confirmed) {
24743
+ return !cancel;
24744
+ }
24705
24745
  }
24706
24746
  return yield this.save(event, opts);
24707
24747
  });
@@ -26097,7 +26137,7 @@ const SocialErrorCodes = {
26097
26137
  SUBSCRIBE_JOB_PROGRESSION_ERROR: 50010
26098
26138
  };
26099
26139
 
26100
- const moment$4 = momentImported;
26140
+ const moment$6 = momentImported;
26101
26141
  const USER_EVENT_SERVICE = new InjectionToken('UserEventService');
26102
26142
  class AbstractUserEventService extends BaseGraphqlService {
26103
26143
  constructor(graphql, accountService, network, translate, options) {
@@ -26463,7 +26503,7 @@ class AbstractUserEventService extends BaseGraphqlService {
26463
26503
  }
26464
26504
  resetCount() {
26465
26505
  this._countSubject.next(undefined);
26466
- this.resetCountDate = moment$4();
26506
+ this.resetCountDate = moment$6();
26467
26507
  // restart listening count changes
26468
26508
  this.startListenCountChanges();
26469
26509
  }
@@ -26523,7 +26563,7 @@ class AbstractUserEventService extends BaseGraphqlService {
26523
26563
  if (!userEvents.length)
26524
26564
  return;
26525
26565
  // set read date
26526
- userEvents.forEach(userEvent => userEvent.readDate = moment$4());
26566
+ userEvents.forEach(userEvent => userEvent.readDate = moment$6());
26527
26567
  // split local/remote entities
26528
26568
  const localEntities = userEvents.filter(userEvent => !userEvent.id || userEvent.id < 0);
26529
26569
  const remoteEntities = userEvents.filter(userEvent => userEvent.id > 0);
@@ -27498,7 +27538,7 @@ class MessageService extends BaseGraphqlService {
27498
27538
  });
27499
27539
  }
27500
27540
  }
27501
- 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" });
27541
+ MessageService.ɵprov = ɵɵdefineInjectable({ factory: function MessageService_Factory() { return new MessageService(ɵɵinject(GraphqlService), ɵɵinject(TranslateService), ɵɵinject(ToastController), ɵɵinject(ENVIRONMENT, 8)); }, token: MessageService, providedIn: "root" });
27502
27542
  MessageService.decorators = [
27503
27543
  { type: Injectable, args: [{ providedIn: 'root' },] }
27504
27544
  ];
@@ -27707,7 +27747,7 @@ class PersonService extends BaseEntityService {
27707
27747
  return target;
27708
27748
  }
27709
27749
  }
27710
- 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" });
27750
+ PersonService.ɵprov = ɵɵdefineInjectable({ factory: function PersonService_Factory() { return new PersonService(ɵɵinject(GraphqlService), ɵɵinject(PlatformService), ɵɵinject(NetworkService), ɵɵinject(EntitiesStorage)); }, token: PersonService, providedIn: "root" });
27711
27751
  PersonService.decorators = [
27712
27752
  { type: Injectable, args: [{ providedIn: 'root' },] }
27713
27753
  ];
@@ -27738,7 +27778,7 @@ class PersonValidatorService {
27738
27778
  return this.formBuilder.group(formConfig);
27739
27779
  }
27740
27780
  }
27741
- PersonValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(i0.ɵɵinject(i1$6.FormBuilder), i0.ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
27781
+ PersonValidatorService.ɵprov = ɵɵdefineInjectable({ factory: function PersonValidatorService_Factory() { return new PersonValidatorService(ɵɵinject(FormBuilder), ɵɵinject(AccountValidatorService)); }, token: PersonValidatorService, providedIn: "root" });
27742
27782
  PersonValidatorService.decorators = [
27743
27783
  { type: Injectable, args: [{ providedIn: 'root' },] }
27744
27784
  ];
@@ -27916,7 +27956,7 @@ class UsersPage extends AppTable {
27916
27956
  UsersPage.decorators = [
27917
27957
  { type: Component, args: [{
27918
27958
  selector: 'app-users-table',
27919
- 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",
27959
+ 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",
27920
27960
  providers: [
27921
27961
  { provide: ValidatorService, useExisting: PersonValidatorService }
27922
27962
  ],
@@ -27967,17 +28007,17 @@ AdminModule.decorators = [
27967
28007
  ];
27968
28008
  AdminModule.ctorParameters = () => [];
27969
28009
 
27970
- const ɵ0 = {
28010
+ const ɵ0$c = {
27971
28011
  profile: 'ADMIN'
27972
28012
  };
27973
- const routes$6 = [
28013
+ const routes = [
27974
28014
  {
27975
28015
  path: 'users',
27976
28016
  pathMatch: 'full',
27977
28017
  component: UsersPage,
27978
28018
  canActivate: [AuthGuardService],
27979
28019
  canDeactivate: [ComponentDirtyGuard],
27980
- data: ɵ0
28020
+ data: ɵ0$c
27981
28021
  }
27982
28022
  ];
27983
28023
  class AdminRoutingModule {
@@ -27987,27 +28027,27 @@ AdminRoutingModule.decorators = [
27987
28027
  imports: [
27988
28028
  SharedRoutingModule,
27989
28029
  AdminModule,
27990
- RouterModule.forChild(routes$6)
28030
+ RouterModule.forChild(routes)
27991
28031
  ],
27992
28032
  exports: [RouterModule]
27993
28033
  },] }
27994
28034
  ];
27995
28035
 
27996
- class EntityTestClass$1 {
28036
+ class EntityTestClass {
27997
28037
  }
27998
- const FAKE_ENTITIES$1 = [
28038
+ const FAKE_ENTITIES = [
27999
28039
  { id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments... again for A' },
28000
28040
  { id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments... again for B' },
28001
28041
  { id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments... again for C' }
28002
28042
  ];
28003
- function deepCopy$1(values, size) {
28043
+ function deepCopy(values, size) {
28004
28044
  if (isNil(size)) {
28005
- return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
28045
+ return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
28006
28046
  }
28007
28047
  let result = [];
28008
28048
  let i = 1;
28009
28049
  while (result.length < size) {
28010
- result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
28050
+ result = result.concat((values || FAKE_ENTITIES).map(entity => {
28011
28051
  const name = entity.name + ' #' + i;
28012
28052
  return Object.assign(Object.assign({}, entity), { id: i++, name });
28013
28053
  }));
@@ -28017,7 +28057,7 @@ function deepCopy$1(values, size) {
28017
28057
  class AutocompleteTestPage {
28018
28058
  constructor(formBuilder) {
28019
28059
  this.formBuilder = formBuilder;
28020
- this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
28060
+ this._items = deepCopy(FAKE_ENTITIES, 100);
28021
28061
  this._$items = new BehaviorSubject(undefined);
28022
28062
  this.autocompleteFields = new MatAutocompleteConfigHolder();
28023
28063
  this.memoryHide = false;
@@ -28062,7 +28102,7 @@ class AutocompleteTestPage {
28062
28102
  });
28063
28103
  // From items
28064
28104
  this.autocompleteFields.add('entity-items-large', {
28065
- items: FAKE_ENTITIES$1.slice(),
28105
+ items: FAKE_ENTITIES.slice(),
28066
28106
  attributes: ['label', 'name', 'description', 'comments'],
28067
28107
  displayWith: this.entityToString
28068
28108
  });
@@ -28094,14 +28134,14 @@ class AutocompleteTestPage {
28094
28134
  loadData() {
28095
28135
  return __awaiter(this, void 0, void 0, function* () {
28096
28136
  const data = {
28097
- entity: deepCopy$1(FAKE_ENTITIES$1)[0],
28098
- farEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
28137
+ entity: deepCopy(FAKE_ENTITIES)[0],
28138
+ farEntity: deepCopy(FAKE_ENTITIES)[2],
28099
28139
  // This item is NOT in the items list => i should be displayed anyway
28100
28140
  missingEntity: {
28101
28141
  id: -1, label: '??', name: 'Missing item'
28102
28142
  },
28103
- disableEntity: deepCopy$1(FAKE_ENTITIES$1)[2],
28104
- entities: deepCopy$1(FAKE_ENTITIES$1)
28143
+ disableEntity: deepCopy(FAKE_ENTITIES)[2],
28144
+ entities: deepCopy(FAKE_ENTITIES)
28105
28145
  };
28106
28146
  this.form.setValue(data);
28107
28147
  // Load observables
@@ -28251,13 +28291,13 @@ LatLongTestPage.ctorParameters = () => [
28251
28291
  { type: FormBuilder }
28252
28292
  ];
28253
28293
 
28254
- const moment$3 = momentImported;
28294
+ const moment$7 = momentImported;
28255
28295
  class SwipeTestPage {
28256
28296
  constructor(formBuilder, dateFormatPipe) {
28257
28297
  this.formBuilder = formBuilder;
28258
28298
  this.dateFormatPipe = dateFormatPipe;
28259
28299
  this.$dates = new BehaviorSubject(undefined);
28260
- this._today = moment$3().startOf('day');
28300
+ this._today = moment$7().startOf('day');
28261
28301
  this.form = formBuilder.group({
28262
28302
  empty: [null, Validators.required],
28263
28303
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -28270,7 +28310,7 @@ class SwipeTestPage {
28270
28310
  ngOnInit() {
28271
28311
  const dates = [];
28272
28312
  for (let d = 0; d < 7; d++) {
28273
- dates[d] = moment$3(this._today).add(d - 3, 'day');
28313
+ dates[d] = moment$7(this._today).add(d - 3, 'day');
28274
28314
  }
28275
28315
  this.$dates.next(dates);
28276
28316
  this.loadData();
@@ -28311,7 +28351,7 @@ SwipeTestPage.ctorParameters = () => [
28311
28351
  { type: DateFormatPipe }
28312
28352
  ];
28313
28353
 
28314
- const moment$2 = momentImported;
28354
+ const moment$8 = momentImported;
28315
28355
  class DateTimeTestPage {
28316
28356
  constructor(platform, formBuilder, cd) {
28317
28357
  this.platform = platform;
@@ -28345,7 +28385,7 @@ class DateTimeTestPage {
28345
28385
  // Load the form with data
28346
28386
  loadData() {
28347
28387
  return __awaiter(this, void 0, void 0, function* () {
28348
- const now = moment$2();
28388
+ const now = moment$8();
28349
28389
  const data = {
28350
28390
  empty: null,
28351
28391
  emptyRequired: null,
@@ -28411,9 +28451,9 @@ DateTimeTestPage.ctorParameters = () => [
28411
28451
  { type: ChangeDetectorRef }
28412
28452
  ];
28413
28453
 
28414
- class EntityTestClass {
28454
+ class EntityTestClass$1 {
28415
28455
  }
28416
- const FAKE_ENTITIES = [
28456
+ const FAKE_ENTITIES$1 = [
28417
28457
  { id: 1, label: 'AAA', name: 'Item A' },
28418
28458
  { id: 2, label: 'BBB', name: 'Item B' },
28419
28459
  { id: 3, label: 'CCC', name: 'Item C' },
@@ -28422,14 +28462,14 @@ const FAKE_ENTITIES = [
28422
28462
  { id: 6, label: 'FFF', name: 'Item F' },
28423
28463
  { id: 7, label: 'GGG', name: 'Item G' }
28424
28464
  ];
28425
- function deepCopy(values, size) {
28465
+ function deepCopy$1(values, size) {
28426
28466
  if (isNil(size)) {
28427
- return (values || FAKE_ENTITIES).map(entity => Object.assign({}, entity));
28467
+ return (values || FAKE_ENTITIES$1).map(entity => Object.assign({}, entity));
28428
28468
  }
28429
28469
  let result = [];
28430
28470
  let i = 1;
28431
28471
  while (result.length < size) {
28432
- result = result.concat((values || FAKE_ENTITIES).map(entity => {
28472
+ result = result.concat((values || FAKE_ENTITIES$1).map(entity => {
28433
28473
  const name = entity.name + ' #' + i;
28434
28474
  return Object.assign(Object.assign({}, entity), { id: i++, name });
28435
28475
  }));
@@ -28439,7 +28479,7 @@ function deepCopy(values, size) {
28439
28479
  class ChipsTestPage {
28440
28480
  constructor(formBuilder) {
28441
28481
  this.formBuilder = formBuilder;
28442
- this._items = deepCopy(FAKE_ENTITIES, 100);
28482
+ this._items = deepCopy$1(FAKE_ENTITIES$1, 100);
28443
28483
  this._$items = new BehaviorSubject(undefined);
28444
28484
  this.autocompleteFields = new MatAutocompleteConfigHolder();
28445
28485
  this.appearance = 'legacy';
@@ -28479,7 +28519,7 @@ class ChipsTestPage {
28479
28519
  // Load the form with data
28480
28520
  loadData() {
28481
28521
  return __awaiter(this, void 0, void 0, function* () {
28482
- const items = deepCopy(FAKE_ENTITIES);
28522
+ const items = deepCopy$1(FAKE_ENTITIES$1);
28483
28523
  const data = {
28484
28524
  entity: items.slice(0, 1),
28485
28525
  entityInitial: items.slice(1, 2),
@@ -28595,7 +28635,7 @@ NumpadTestPage.ctorParameters = () => [
28595
28635
  { type: FormBuilder }
28596
28636
  ];
28597
28637
 
28598
- const moment$1 = momentImported;
28638
+ const moment$9 = momentImported;
28599
28639
  class DateTestPage {
28600
28640
  constructor(formBuilder, cd) {
28601
28641
  this.formBuilder = formBuilder;
@@ -28628,7 +28668,7 @@ class DateTestPage {
28628
28668
  // Load the form with data
28629
28669
  loadData() {
28630
28670
  return __awaiter(this, void 0, void 0, function* () {
28631
- const now = moment$1();
28671
+ const now = moment$9();
28632
28672
  const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
28633
28673
  const data = {
28634
28674
  empty: null,
@@ -28706,7 +28746,7 @@ const SHARED_MATERIAL_TESTING_PAGES = [
28706
28746
  { label: 'Shared directives', divider: true },
28707
28747
  { label: 'Badge icon directive', page: '/testing/shared/badge-icon' }
28708
28748
  ];
28709
- const routes$5 = [
28749
+ const routes$1 = [
28710
28750
  {
28711
28751
  path: '',
28712
28752
  pathMatch: 'full',
@@ -28763,7 +28803,7 @@ MaterialTestingModule.decorators = [
28763
28803
  ReactiveFormsModule,
28764
28804
  SharedMaterialModule,
28765
28805
  TranslateModule.forChild(),
28766
- RouterModule.forChild(routes$5)
28806
+ RouterModule.forChild(routes$1)
28767
28807
  ],
28768
28808
  declarations: [
28769
28809
  DateTimeTestPage,
@@ -28824,7 +28864,7 @@ ToastTestingPage.ctorParameters = () => [
28824
28864
  { type: TranslateService }
28825
28865
  ];
28826
28866
 
28827
- const routes$4 = [
28867
+ const routes$2 = [
28828
28868
  {
28829
28869
  path: 'toast',
28830
28870
  pathMatch: 'full',
@@ -28839,7 +28879,7 @@ ToastTestingModule.decorators = [
28839
28879
  CommonModule,
28840
28880
  IonicModule,
28841
28881
  TranslateModule.forChild(),
28842
- RouterModule.forChild(routes$4)
28882
+ RouterModule.forChild(routes$2)
28843
28883
  ],
28844
28884
  declarations: [
28845
28885
  ToastTestingPage
@@ -29103,7 +29143,7 @@ class TableTestPage extends AppTable {
29103
29143
  console.debug('[test-table] Destroying table...');
29104
29144
  super.ngOnDestroy();
29105
29145
  this.stopTimer();
29106
- this.dataService.ngOnDestroy();
29146
+ this.dataService.stop();
29107
29147
  }
29108
29148
  restoreFilter() {
29109
29149
  const json = this.settings.getPageSettings(this.settingsId, 'filter');
@@ -29129,6 +29169,7 @@ class TableTestPage extends AppTable {
29129
29169
  this.data = this.generateData(0, TableTestPage.maxRowCount);
29130
29170
  }
29131
29171
  this.dataService.value = this.data;
29172
+ this.onRefresh.emit();
29132
29173
  }
29133
29174
  fetchMore(event) {
29134
29175
  return __awaiter(this, void 0, void 0, function* () {
@@ -29293,7 +29334,7 @@ TextPopoverTestingPage.ctorParameters = () => [
29293
29334
  { type: PopoverController }
29294
29335
  ];
29295
29336
 
29296
- const routes$2 = [
29337
+ const routes$4 = [
29297
29338
  {
29298
29339
  path: 'text-popover',
29299
29340
  pathMatch: 'full',
@@ -29308,7 +29349,7 @@ TextPopoverTestingModule.decorators = [
29308
29349
  CommonModule,
29309
29350
  IonicModule,
29310
29351
  TranslateModule.forChild(),
29311
- RouterModule.forChild(routes$2)
29352
+ RouterModule.forChild(routes$4)
29312
29353
  ],
29313
29354
  declarations: [
29314
29355
  TextPopoverTestingPage
@@ -29325,7 +29366,7 @@ const CORE_TESTING_PAGES = [
29325
29366
  { label: 'Table', page: '/testing/core/table' },
29326
29367
  { label: 'Text popover', page: '/testing/core/text-popover' }
29327
29368
  ];
29328
- const routes$1 = [
29369
+ const routes$5 = [
29329
29370
  {
29330
29371
  path: '',
29331
29372
  pathMatch: 'full',
@@ -29349,7 +29390,7 @@ CoreTestingModule.decorators = [
29349
29390
  imports: [
29350
29391
  CommonModule,
29351
29392
  TranslateModule.forChild(),
29352
- RouterModule.forChild(routes$1),
29393
+ RouterModule.forChild(routes$5),
29353
29394
  // Sub modules
29354
29395
  TableTestingModule,
29355
29396
  TextPopoverTestingModule
@@ -29652,7 +29693,7 @@ UserEventTestService.ctorParameters = () => [
29652
29693
  { type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
29653
29694
  ];
29654
29695
 
29655
- const moment = momentImported;
29696
+ const moment$a = momentImported;
29656
29697
  class UserEventTestingPage {
29657
29698
  constructor(userEventService, router, alertController, translateService) {
29658
29699
  this.userEventService = userEventService;
@@ -29713,7 +29754,7 @@ class UserEventTestingPage {
29713
29754
  type: 'message',
29714
29755
  level: 'INFO',
29715
29756
  message: 'message test message test message test message test message test message test message test message test',
29716
- creationDate: moment(),
29757
+ creationDate: moment$a(),
29717
29758
  }));
29718
29759
  }
29719
29760
  addError() {
@@ -29723,7 +29764,7 @@ class UserEventTestingPage {
29723
29764
  type: 'upload',
29724
29765
  level: 'ERROR',
29725
29766
  message: 'message error',
29726
- creationDate: moment(),
29767
+ creationDate: moment$a(),
29727
29768
  }));
29728
29769
  }
29729
29770
  addWarning() {
@@ -29733,7 +29774,7 @@ class UserEventTestingPage {
29733
29774
  type: 'download',
29734
29775
  level: 'WARNING',
29735
29776
  message: 'message warning',
29736
- creationDate: moment(),
29777
+ creationDate: moment$a(),
29737
29778
  }));
29738
29779
  }
29739
29780
  addDebug() {
@@ -29743,7 +29784,7 @@ class UserEventTestingPage {
29743
29784
  type: 'debug',
29744
29785
  level: 'DEBUG',
29745
29786
  message: 'message DEBUG',
29746
- creationDate: moment(),
29787
+ creationDate: moment$a(),
29747
29788
  }));
29748
29789
  }
29749
29790
  addNotificationWithLink() {
@@ -29753,7 +29794,7 @@ class UserEventTestingPage {
29753
29794
  type: 'message',
29754
29795
  level: 'INFO',
29755
29796
  message: 'message with link',
29756
- creationDate: moment(),
29797
+ creationDate: moment$a(),
29757
29798
  actions: [{
29758
29799
  name: 'click here',
29759
29800
  iconRef: {
@@ -29770,7 +29811,7 @@ class UserEventTestingPage {
29770
29811
  type: 'message',
29771
29812
  level: 'INFO',
29772
29813
  message: 'message with action',
29773
- creationDate: moment(),
29814
+ creationDate: moment$a(),
29774
29815
  actions: [
29775
29816
  {
29776
29817
  name: 'click here',
@@ -29842,7 +29883,7 @@ class UserEventTestingPage {
29842
29883
  type: 'message',
29843
29884
  level: 'INFO',
29844
29885
  message: 'message with action',
29845
- creationDate: moment(),
29886
+ creationDate: moment$a(),
29846
29887
  actions: [
29847
29888
  {
29848
29889
  default: true,
@@ -29896,7 +29937,7 @@ const SOCIAL_TESTING_PAGES = [
29896
29937
  { label: 'User event', page: '/testing/social/user-event' },
29897
29938
  { label: 'Job progression', page: '/testing/social/job-progression' }
29898
29939
  ];
29899
- const routes = [
29940
+ const routes$6 = [
29900
29941
  {
29901
29942
  path: 'job-progression',
29902
29943
  pathMatch: 'full',
@@ -29915,7 +29956,7 @@ SocialTestingModule.decorators = [
29915
29956
  imports: [
29916
29957
  CommonModule,
29917
29958
  TranslateModule.forChild(),
29918
- RouterModule.forChild(routes),
29959
+ RouterModule.forChild(routes$6),
29919
29960
  JobTestingModule,
29920
29961
  UserEventTestingModule
29921
29962
  ],
@@ -29928,5 +29969,5 @@ SocialTestingModule.decorators = [
29928
29969
  * Generated bundle index. Do not edit.
29929
29970
  */
29930
29971
 
29931
- 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 };
29972
+ 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 };
29932
29973
  //# sourceMappingURL=sumaris-net.ngx-components.js.map